본문 바로가기

Language/Spring

(29)
[실무 - JPA] DB 다중화 연결 프로젝트 중 운영 DB와 통계 DB 두 개가 있는데, 운영 DB의 데이터를 분기(3개월)마다 통계 DB로 이관하여 Freezing을 해야하는 과업이 있었다.현재 프로젝트에서는 운영 DB는 JPA와 Mybatis 두 개가 셋팅이 되어 있었으며, 통계 DB는 Mybatis만 셋팅이 되어있었고 운영 DB에서 JPA 또는 Mybatis로 Select를 하여 통계 DB에 Mybatis로 Insert를 해서 처리할 수도 있었지만, Mybatis에서 select를 할 때 resultType을 통계 DB의 Entity로 반환하여 JPA로 saveAll(조회데이터)를 하면 좀 더 수월할 것 같기도 하고, 이러한 설정을 경험해보는 것도 좋은 경험이 될 것 같다고 과장님이 제안을 해주셔서 흔쾌히 시작을 하게 되었다. 국지비..
[SQL Mapper] Mybatis의 태그 [association, collection, sql, include] association과 collection 태그두 개의 태그는 객체의 연관 관계를 나타날 때 사용association (연계, 제휴)제휴는 1:1로 맺는 것이기 때문에 객체 간의 연관 관계가 1:1 관계일 때 사용collection (무리, 더미)무리, 더미는 여러 가지가 모인 것이기 때문에 객체 간의 연관 관계가 1:N 관계일 때 사용 association, collection 태그의 속성property (필수)연관된 객체의 속성명을 지정연관된 객체를 매핑할 대상의 필드명과 일치해야 함예시 설명 : customer는 Order 객체 내의 필드명이고, 이 필드는 Customer 객체와 연관 관계를 맺음 column (필수)SQL 쿼리에서 사용되는 컬럼명을 지정연관된 객체를 매핑할 때 어떤 기준으로 삼을 ..
[SQL Mapper] Mybatis의 ResultMap과 ResultType ResultMap과 ResultType두 개 모두 SQL문 수행 결과의 반환형이라는 공통점을 가짐ResultMap개발자가 xml에 임의로 정의한 형식으로 반환을 하는 것복잡한 매핑이 필요할 때 사용 → 여러 개의 테이블을 조인, null 처리 및 특별한 변환 로직이 필요한 경우 resultMap을 사용하여 정밀한 매핑 가능ResultTypeJava의 클래스 형식으로 반환을 하는 것→ 개발자가 생성한 클래스인 VO, DAO 등이 될 수도 있고, 자바에서 기본적으로 제공하는 Collection의 List, Map 등이 될 수도 있음단순한 매핑을 할 때 사용 컬럼명이 자바 객체의 필드명과 일치할 때 resultType을 사용하면 간편하고 효율적ResultMap 태그id 속성 : 해당 resultMap의 참조할..
[STS] JSP 사용법 pom.xml - dependency 추가 jakarta.servlet jakarta.servlet-api provided jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api org.glassfish.web jakarta.servlet.jsp.jstl org.apache.tomcat.embed tomcat-embed-jasper  프로젝트 구조Spring Boot의 경우 src/main/resources/static 또는 src/main/resources/templates 폴더에 배치하는..
[SQL Mapper] Mybatis 개념 및 구조 MybatisSQL Mapper로 SQL 중심의 프로젝트에 적합 → 객체 중심의 설계라면 JPA(Hibernate)가 더 적합객체와 SQL 쿼리 사이의 매핑을 처리하는 도구ORM처럼 객체를 자동으로 매핑하지 않고, 개발자가 직접 SQL 쿼리를 작성하고 SQL 결과를 자바 객체와 수동으로 매핑하는 방식을 사용→ 수동이긴 하지만 객체와 데이터베이스 테이블 간의 매핑을 다룬다는 점에서 마치 ORM 처럼 사용되긴 하지만 실질적으로는 SQL MapperSQL 쿼리의 세밀한 제어가 필요할 때 유용하고, SQL의 최적화와 복잡한 쿼리 작성에서 강점을 보임Mybatis 등장 배경 복잡한 SQL 쿼리 관리의 어려움 기존의 JDBC를 사용했을 때는 개발자가 직접 SQL 쿼리를 작성하고, 쿼리 실행 결과를 Java 객체로 ..
[JPA] N+1 문제 N+1 문제란?ORM 기술에서 특정 객체를 대상으로 수행한 쿼리가 해당 객체가 가지고 있는 연관관계 엔티티를 조회하게 되면서 N번의 추가적인 쿼리가 발생하는 문제 N+1 문제 발생 상황 예시Owner Entity : 고양이 집사는 여러 마리의 고양이를 키움Cat Entity : 고양이는 한 명의 집사에게 종속@Entity@Getter@Setter@NoArgsConstructorpublic class Owner { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String name; @OneToMany(mappedBy = "owner", fetch = FetchType.EAGER) ..
[JPA] 엔티티 관계의 로딩 전략 - 즉시 로딩 / 지연 로딩 즉시 로딩 (Eager Loading)정의연관된 엔티티를 함께 로딩하는 방식기본 엔티티를 조회할 때 연관된 엔티티도 즉시 데이터베이스에서 조회동작 원리엔티티 조회 시 연관된 엔티티도 함께 쿼리를 실행JPQL 또는 SQL에서 JOIN을 사용하여 데이터를 한 번에 가져옴장점연관된 데이터를 미리 로딩하므로 추가적인 데이터베이스 호출을 방지Lazy Loading의 LazyInitializationException과 같은 문제를 방지단점연관된 엔티티를 항상 로딩하므로 불필요한 데이터가 로드되어 메모리와 성능에 영향을 줄 수 있음복잡한 관계에서는 쿼리가 비대해지고 성능이 저하될 수 있음사용 사례연관된 엔티티를 자주 사용하거나 함께 필요한 경우Ex) User와 UserProfile 관계에서 사용자 정보와 프로필 정보..
[Spring] Controller와 Rest Controller 차이 Controller의 역할 및 특징 역할뷰(View)를 반환하는 컨트롤러.주요 특징주로 HTML, JSP 같은 뷰 페이지를 반환@RequestMapping 또는 @GetMapping, @PostMapping 등의 어노테이션을 사용해 HTTP 요청을 매핑Model 객체를 이용하여 데이터와 뷰를 연결반환값이 문자열(String)일 경우 기본적으로 ViewResolver가 실행되어 해당 문자열을 뷰 이름(view name)으로 간주하고, 뷰를 렌더링@Controllerpublic class ExampleController { @GetMapping("/hello") public String hello(Model model) { model.addAttribute("message", "Hel..