본문 바로가기

전체 글

(133)
[JPA] 객체지향 쿼리 언어 | 실습 - JPQL N+1 문제(페치 조인 사용) 📌 학습 목차1. 실습 사항   1.1 실습 내용 및 결과 요약   1.2 실습 예제2. 즉시 로딩 설정   2.1 EntityManager.find()   2.2 JPQL(N+1 문제 발생)3. 지연 로딩 설정   3.1 JPQL(N+1 문제 발생)   3.2 페치 조인 JPQL(N+1 문제 해결)1. 실습 사항1.1 실습 내용 및 결과 요약   1. 즉시 로딩 - EntityManager.find()와 JPQL를 사용한 결과를 비교함   2. 즉시 로딩 & 지연 로딩 - JPQL을 사용할 때 발생하는 N+1 문제를 파악함   3. 지연 로딩 - 글로벌 페치 전략으로 지연 로딩이 적절한 이유를 파악한 후, 페치 조인을 사용해 N+1 문제를 해결함  1.2 실습 예제•멤버(N)와 팀(1) 엔티티는 다대..
[JPA] 영속성 관리 | 실습 - 준영속 엔티티 수정(병합과 변경 감지 비교) 📌 학습 목차1. 실습 사항2. 결과 요약 2.1. 동작 방식 비교 2.2 권장 수정 방법3. 준영속 엔티티 수정(병합) 3.1 사용 예제 3.2 주요 동작 방식 3.3 null 업데이트 문제4. 준영속 엔티티 수정(변경 감지) 4.1 사용 예제 4.2 주요 동작 방식1. 실습 사항1.1 실습 내용•식별자 값을 가진 준영속 엔티티를 수정하기 위해 병합과 변경 감지 기능을 사용함 이때 두 기능의 주요 동작 방식을 이해한 후, 수정 방법으로 변경 감지가 적절한 이유를 파악함 1.2 참고 정보•본 실습은 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의 예제를 기준으로 작성했으며, 리팩토링은 고려하지 않음•실습 예제는 사용자가 상품 수정 폼 화면에서 상품명(ite..
[JPA] 객체지향 쿼리 언어 - 엔티티 페치 조인 / 컬렉션 페치 조인(distinct) 📌 학습 목차1. 엔티티 페치 조인 1.1 페치 조인 사용 1.2 사용 결과2. 컬렉션 페치 조인 2.1 페치 조인 사용 2.2 사용 결과1. 엔티티 페치 조인•페치 조인(fetch join)은 SQL 조인 종류가 아닌 JPQL에서 성능 최적화를 위해 제공하는 기능임•페치 조인은 SQL 조인을 사용해 페치 조인 대상인 엔티티나 컬렉션을 함께 조회함 이에 한 번의 SQL로 객체 그래프를 조회함에 따라 SQL 실행 횟수를 줄여 성능을 최적화 할 수 있음•페치 조인은 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선시됨 1.1 페치 조인 사용•@ManyToOne(fetch = FetchType.LAZY): 멤버와 팀 엔티티가 다대일(N:1) 양방향 연관관계일 때, 멤버 엔티티와 연관된 ..
[JPA] 객체지향 쿼리 언어 - JPQL의 필요성과 개념 / JPQL 조인 📌 학습 목차1. JPQL의 이해   1.1 JPQL의 필요성과 개념   1.2 JPQL 사용2. JPQL 조인   2.1 내부 조인   2.2 외부 조인   2.3 세타 조인   2.4 JOIN ON 절1. JPQL의 이해1.1 JPQL의 필요성과 개념•EntityManager.find()와 객체 그래프 탐색은 가장 단순한 엔티티 조회 방법에 해당함   하지만 이처럼 단순한 조회 방법으로는 애플리케이션 개발에 필요한 데이터를 얻을 수 없음•JPA를 사용해 엔티티 객체를 중심으로 개발함에 따라 DB 테이블이 아닌 엔티티 객체를 대상으로 쿼리할 수 있는 방법이 필요함   또한 DB에서 애플리케이션 개발에 필요한 데이터만 불러올 수 있도록 검색 조건이 포함된 SQL이 필요함   이때 JPA는 객체지향 SQ..
[JPA] 프록시와 연관관계 관리 - 영속성 전이 / 고아 객체 / 생명주기 관리 📌 학습 목차1. 영속성 전이   1.1 CascadeType.PERSIST   1.2 CascadeType.REMOVE2. 고아 객체   2.1 자식 참조 제거   2.2 부모 삭제3. 영속성 전이 & 고아 객체(생명주기 관리)  3.1 부모를 통한 자식 저장  3.2 부모를 통한 자식 삭제1. 영속성 전이•JPA는 엔티티를 저장 및 삭제할 때 연관된 엔티티도 함께 저장 및 삭제할 수 있는 영속성 전이(transitive persistence) 기능을 제공함•영속성 전이를 활성화하는 CASCADE 옵션은 ALL, PERSIST, REMOVE 등이 있음•PERSIST 또는 REMOVE 옵션을 설정할 경우, 영속성 컨텍스트를 플러시하는 시점에 영속성 전이가 발생함 1.1 CascadeType.PERSIS..
[JPA] 프록시와 연관관계 관리 - 즉시 로딩 & 지연 로딩 / 즉시 로딩 주의점 📌 학습 목차1. 즉시 로딩과 지연 로딩   1.1 즉시 로딩 - EntityManager.find()   1.2 지연 로딩 - EntityManager.find()2. 즉시 로딩 주의점   2.1 즉시 로딩 - JPQL   2.2.1 지연 로딩 - JPQL   2.2.2 지연 로딩 - 페치 조인 JPQL1. 즉시 로딩과 지연 로딩•JPA는 개발자가 연관된 엔티티를 조회하는 시점을 선택할 수 있도록 즉시 로딩과 지연 로딩 방법을 제공함   1. 즉시 로딩(FetchType.EAGER): 엔티티를 조회할 때 연관된 엔티티도 함께 조회하는 방법   2. 지연 로딩(FetchType.LAZY): 연관된 엔티티를 실제 사용할 때 조회하는 방법•JPA의 기본 fetch 전략은 연관된 엔티티가 하나면 즉시 로딩,..
[JPA] 프록시와 연관관계 관리 - 프록시의 이해 및 특징 / 프록시 초기화 📌 학습 목차1. 프록시의 이해 1.1. 프록시와 지연 로딩 1.2. 프록시 조회 1.3. 프록시 구조2. 프록시 초기화3. 프록시 특징1. 프록시의 이해 1.1. 프록시와 지연 로딩•특정 엔티티를 조회할 때 사용하지 않는 연관 엔티티까지 DB에서 함께 조회하는 것은 비효율적임 이에 JPA는 엔티티가 실제 사용될 때까지 DB 조회를 지연하는 방법으로 지연 로딩(lazy loading)을 제공함•JPA 표준 명세는 지연 로딩 구현 방법을 JPA 구현체에 위임함 이때 JPA 구현체 중 가장 대중적인 하이버네이트는 프록시를 사용한 지연 로딩 방법을 제공함•프록시는 실제 엔티티를 대신해 DB 조회를 지연할 수 있는 가짜 객체에 해당함 이에 프록시를 사용한 지연 로딩은 연관된 엔티티를 프록..
[JPA] 다양한 연관관계 매핑 - 다대다 [N:N] 단방향 & 양방향 / 연결 엔티티 사용 📌 학습 목차1. 다대다 [N:N] - @ManyToMany 사용 1.1 단방향 연관관계 매핑 1.2 양방향 연관관계 매핑2. 다대다 [N:N] - 연결 엔티티 사용 2.1 다대다 관계 매핑의 한계와 극복 2.2 연결 엔티티 추가1. 다대다 [N:N] - @ManyToMany 사용•객체는 컬렉션을 사용해 객체 2개로 다대다 관계를 만들 수 있음 반면 관계형 DB는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음 이에 다대다 관계는 연결 테이블을 추가해 다대다를 일대다 다대일 관계로 풀어내야 함 1.1 단방향 연관관계 매핑•@ManyToMany: 멤버와 프로덕트 엔티티의 다대다(N:N) 관계를 나타냄•@JoinTable: 멤버와 프로덕트 테이블의 연결 테이블을 지정함 @Ent..
[JPA] 다양한 연관관계 매핑 - 일대일 [1:1] 단방향 & 양방향 📌 학습 목차1. 일대일 [1:1] - 주 테이블에 외래 키가 있는 경우 1.1 단방향 연관관계 매핑 1.2 양방향 연관관계 매핑2. 일대일 [1:1] - 대상 테이블에 외래 키가 있는 경우 2.1 단방향 연관관계 매핑 2.2 양방향 연관관계 매핑1. 일대일 [1:1] - 주 테이블에 외래 키가 있는 경우•DB 테이블의 일(1)과 다(N) 관계에서 외래 키는 다 쪽 테이블에 있음 이때 일대일 관계는 두 테이블 중 어느 곳에서나 외래 키를 가질 수 있으므로 주 테이블과 대상 테이블로 구분하여 어떤 테이블에 외래 키를 둘지 선택해야 함 •주 테이블에 외래 키가 있는 경우, 객체의 참조처럼 주 테이블의 외래 키로 대상 테이블을 참조할 수 있음 또한 주 테이블만 확인해도 대상 테이블과..
[JPA] 다양한 연관관계 매핑 - 일대다 단방향 [1:N] & 양방향 [1:N, N:1] 📌 학습 목차1. 일대다 단방향 [1:N]   1.1. 단방향 연관관계 매핑   1.2 단방향 연관관계 매핑의 단점2. 일대다 양방향 [1:N, N:1]1. 일대다 단방향 [1:N]1.1 단방향 연관관계 매핑•하나의 팀(1)에 여러 멤버(N)가 속할 수 있고, 팀은 멤버를 참조하지만 멤버는 팀을 참조하지 않음   이에 팀과 멤버 엔티티는 일대다 단방향 연관관계에 해당함•DB 테이블의 일(1)과 다(N) 관계에서 외래 키는 다 쪽 테이블에 있음   이에 일대다 단방향 연관관계는 팀 엔티티의 members 필드가   반대편 멤버 테이블의 TEAM_ID 외래 키를 관리하는 특이한 구조가 나타남  •@OneToMany: 팀과 멤버 엔티티의 일대다(1:N) 관계를 나타냄•@JoinColumn(name = "TE..
[JPA] 다양한 연관관계 매핑 - 다대일 단방향 [N:1] & 양방향 [N:1, 1:N] 📌 학습 목차1. 다대일 단방향 [N:1]2. 다대일 양방향 [N:1, 1:N]   2.1 객체와 테이블의 양방향 연관관계 차이   2.2 연관관계 주인의 이해   2.3 양방향 연관관계의 이해1. 다대일 단방향 [N:1]•여러 멤버(N)가 하나의 팀(1)에 속할 수 있고, 멤버는 팀을 참조하지만 팀은 멤버를 참조하지 않음   이때 멤버와 팀 엔티티는 다대일 단방향 연관관계에 해당함  •@ManyToOne: 멤버와 팀 엔티티의 다대일(N:1) 관계를 나타냄•@JoinColumn(name = "TEAM_ID"): 멤버 엔티티의 team 필드와 멤버 테이블의 TEAM_ID 외래 키를 매핑함   1. 멤버 엔티티의 team 필드로 멤버 테이블의 TEAM_ID 외래 키를 관리함을 나타냄   2. name 속성..
[JPA] 연관관계 매핑 기초 - 양방향 연관관계 매핑 주의점 / 연관관계 편의 메서드 📌 학습 목차1. 양방향 연관관계 매핑 주의점 - 문제 발생2. 양방향 연관관계 매핑 주의점 - 문제 해결   2.1 연관관계 주인을 통한 연관관계 설정   2.2.1 양방향 연관관계 설정   2.2.2 연관관계 편의 메서드1. 양방향 연관관계 매핑 주의점 - 문제 발생•JPA는 외래 키를 관리할 때 연관관계의 주인만을 사용함   이에 양방향 연관관계 매핑 시 연관관계의 주인이 아닌 쪽에만 값을 입력해 연관관계를 설정할 경우,    테이블에 외래 키 값이 정상적으로 저장되지 않는 문제가 발생함 Member member1 = new Member("memberA");em.persist(member1);Member member2 = new Member("memberB");em.persist(member2);..
[JPA] 연관관계 매핑 기초 - 양방향 연관관계 매핑 / 연관관계의 주인 📌 학습 목차1. 양방향 연관관계 매핑 규칙: 연관관계의 주인 1.1 객체와 테이블의 양방향 연관관계 차이 1.2 연관관계 주인의 이해 1.3 양방향 연관관계의 이해2. 양방향 연관관계 매핑3. 양방향 연관관계 사용1. 양방향 연관관계 매핑 규칙: 연관관계의 주인•멤버와 팀 엔티티가 서로 참조하는 양방향 연관관계로 매핑하기 위해 멤버가 팀을 참조하는 단방향 연관관계에 팀이 멤버를 참조하는 단방향 연관관계를 추가하고자 함 1.1 객체와 테이블의 양방향 연관관계 차이•참조를 사용하는 객체의 연관관계는 단방향에 해당함 이에 객체를 양방향 연관관계로 매핑할 경우, 서로 다른 단방향 연관관계를 2개를 만들어 애플리케이션 로직으로 연결해야 함 예시) 멤버 → 팀 연관관계(단방향) & 팀 → ..
[JPA] 영속성 관리 - 준영속 상태 / 준영속 엔티티 수정(병합) 📌 학습 목차1. 준영속 상태   1.1 개념 및 특징   1.2 상태 변화2. 준영속 엔티티 수정(병합)   2.1 개념 및 특징   2.2 동작 방식1. 준영속 상태1.1 개념 및 특징•영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트로부터 분리된 것을 준영속 상태라고 함•준영속 상태의 엔티티는 더 이상 영속성 컨텍스트에 의해 관리되지 않음   이에 영속성 컨텍스트가 제공하는 기능(변경 감지, 지연 로딩 등)을 사용할 수 없음•이미 한 번 영속 상태였던 준영속 상태의 엔티티는 반드시 식별자 값을 가지고 있음 1.2 상태 변화•영속 상태의 엔티티를 준영속 상태로 만드는 방법은 크게 다음 3가지로 구분됨   이때 영속 상태의 엔티티는 주로 영속성 컨텍스트가 종료됨에 따라 준영속 상태가 됨..
[JPA] 영속성 관리 | 엔티티 수정 - 변경 감지 & 플러시 / 엔티티 삭제 📌 학습 목차1. 엔티티 수정 - 변경 감지 1.1. 개념 및 특징 1.2. 동작 방식2. 플러시 2.1. 실행 흐름 2.2. 호출 방법 2.3. 옵션3. 엔티티 삭제1. 엔티티 수정 - 변경 감지1.1. 개념 및 특징•JPA는 엔티티의 변경 사항을 DB에 자동으로 반영하는 변경 감지(dirty checking) 기능을 제공함 이에 em.update()와 같은 엔티티 수정 메서드가 존재하지 않으며, 수정할 엔티티를 조회해 데이터만 변경하면 해당 엔티티의 변경 사항이 DB에 자동으로 반영됨•JPA는 엔티티를 영속성 컨텍스트에 보관할 때 엔티티의 최초 상태를 복사해 스냅샷(snapshot)으로 저장함 이에 영속성 컨텍스트를 플러시하는 시점에 엔티티와 스냅샷을 비교하여 변경된 엔..
[JPA] 영속성 관리 | 엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연 📌 학습 목차1. 트랜잭션을 지원하는 쓰기 지연2. 엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연 2.1. 엔티티 영속화 2.2. 트랜잭션 커밋1. 트랜잭션을 지원하는 쓰기 지연•엔티티 매니저는 트랜잭션을 커밋하기 직전까지 영속성 컨텍스트의 쓰기 지연 SQL 저장소에 쿼리를 모아두고, 트랜잭션을 커밋할 때 모인 쿼리를 DB에 보냄 이때 트랜잭션 커밋할 때까지 쓰기 지연 SQL 저장소에 모인 쿼리를 DB에 보내는 작업을 지연시키는 것을 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)이라고 함 •같은 트랜잭션 범위 내에서 여러 엔티티를 저장할 경우, 다음 두 로직의 실행 결과는 동일함 로직1) 엔티티를 저장할 때마다 등록 쿼리를 즉시 DB에 보낸 후 ..
[JPA] 영속성 관리 | 엔티티 조회 - 1차 캐시 / 영속 엔티티의 동일성 보장 📌 학습 목차1. 1차 캐시 1.1. 엔티티 조회 - 1차 캐시 조회 1.2. 엔티티 조회 - DB 조회2. 영속 엔티티의 동일성 보장1. 1차 캐시•영속성 컨텍스트는 내부에 Map 형식의 1차 캐시를 가지고 있으며, 영속 상태의 엔티티는 해당 캐시에 저장됨 이때 1차 캐시의 key는 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)이고, value는 엔티티 인스턴스에 해당함•em.find()로 엔티티를 조회할 경우, 먼저 메모리에 있는 1차 캐시에서 조회할 엔티티의 식별자 값으로 엔티티를 찾음 이때 1차 캐시에서 엔티티를 바로 조회할 경우, DB를 조회하지 않아 성능상 일부 이점을 가질 수 있음 1.1. 엔티티 조회 - 1차 캐시 조회•1차 캐시에 찾는 엔티티가 있을 경우, DB를 조..
[JPA] 영속성 관리 | JPA / 엔티티 매니저 / 영속성 컨텍스트 / 엔티티 생명주기 📌 학습 목차1. JPA 1.1. 개념 및 특징 1.2. 사용 - 엔티티 매니저2. 영속성 컨텍스트3. 엔티티 생명주기 3.1. 비영속(new/transient) 3.2. 영속(managed) 3.3. 준영속(detached) 3.4. 삭제(removed)1. JPA1.1. 개념 및 특징ORM(Object-Relational Mapping): 객체와 관계형 DB를 매핑하는 기술•ORM 프레임워크는 객체와 관계형 DB를 매핑해 패러다임 불일치 문제를 개발자 대신 해결함 이에 개발자가 ORM 프레임워크에 매핑 정보(애노테이션)만 제공하면 데이터 중심인 관계형 DB를 사용하더라도 객체지향 애플리케이션 개발에 집중할 수 있음 JPA(Java Persistence API): 자바 ..
[Spring DB] 트랜잭션 AOP 주의 사항 - 프록시 내부 호출 문제 파악 및 해결 📌 학습 목차1. 프록시 방식 AOP의 한계2-1. 프록시를 통한 실제 객체 호출2-2. 내부 호출을 통한 실제 객체 호출3. 클래스 분리를 통한 해결1. 프록시 방식 AOP의 한계•트랜잭션 처리가 필요한 위치에 @Transactional 애노테이션을 사용할 경우,    스프링의 트랜잭션 AOP가 적용되고 트랜잭션 AOP는 프록시를 통해 트랜잭션을 적용함   이에 프록시를 거치지 않고 내부 호출로 실제 객체(Target)를 직접 호출할 경우, 프록시가 적용되지 않아 트랜잭션 또한 적용되지 않음2-1. 프록시를 통한 실제 객체 호출 •CallService의 internal()에 @Transactional 애노테이션을 사용함에 따라 스프링의 트랜잭션 AOP가 적용됨   이에 스프링은 실제 객체(Target..
[Spring DB] 트랜잭션 AOP 적용 흐름 📌 학습 목차1. 트랜잭션 AOP 적용 - 설정 정보2. 트랜잭션 AOP 적용 흐름1. 트랜잭션 AOP 적용 - 설정 정보•트랜잭션 AOP를 적용하기 위한 데이터 소스(DriverManagerDataSource)와    트랜잭션 매니저(DataSourceTransactionManager)를 직접 스프링 빈으로 등록함 spring.datasource.url=jdbc:h2:tcp://localhost/~/testspring.datasource.username=saspring.datasource.password= @TestConfigurationstatic class TestConfig { @Bean DataSource dataSource() { return new DriverMana..