JPA(16)
-
도메인 주도 설계 - 리포지토리의 조회 기능
이 장에서 다룰 내용 스펙 동적 인스턴스와 @Subselect 검색을 위한 스펙 애그리거트를 찾을 때 식별자를 이용하는 것이 기본. 다양한 검색 조건으로 애그리거트를 찾아야한다면? 스펙 1 2 3 public interface Specification { boolean isSatisfiedBy(T agg); } Colored by Color Scripter cs 스펙은 애그리거트가 특정 조건을 충족하는지 여부를 검사하는 것. 애그리거트가 조건에 맞으면 true를, 틀리면 false를 리턴합니다. 예) OrdererSpec - 스펙 정의 1 2 3 4 5 6 7 8 9 10 11 12 public class OrdererSpec implements Specification { private String o..
2022.05.09 -
OSIV(OPEN SESSTION IN VIEW)란?
OSIV OSIV는 세션(JPA에서는 엔티티매니저)의 생명 주기를 설정할 수 있는 옵션이다. 엔티티 매니저는 데이터베이스 커넥션의 생명 주기를 같이 가지고 있어 엔티티 매니저가 생성될때 데이터 베이스 커넥션을 생성하여 엔티티 매니저가 사라질때 데이터 베이스의 커넥션은 반환된다. 엔티티 매니저는 트랜잭션 시작시 생성된다. spring.jpa.open-in-view: true (기본값) 데이터 베이스 커넥션, 엔티티 매니저가 트랜잭션 시작시 생성되고 컨트롤러에서 응답될때 데이터 베이스 커넥션 반환, 엔티티 매니저가 사라진다. 장점: 컨트롤러에서 지연로딩이 가능하다. (코딩이 편하다) 단점: 커넥션을 물고 있는 주기가 길어지고 커넥션을 빨리 반환하지 않으면 커넥션풀로 인해 장애로 이어질 수 있다. spring..
2021.02.04 -
컬렌션(일대다) SELECT 시, 주의점과 성능 최적화
컬렉션 조회의 문제점 일대다 관계의 컬렉션을 조회하게 될때 데이터는 기준 데이터(루트)보다 훨씬 많은 양의 데이터가 조회될 수 있다. 데이터 양도 문제지만 루트를 기준으로 페이징을 해야할때 데이터가 더 많아지기때문에 페이징이 불가능해진다. 컬렉션 조회 개선점 1. N+1 문제를 해결하기 위해 fetch조인을 고려하자 일대다 관계는 지연로딩을 기본으로 두고 있다. 루트를 조회하고 그 결과 개수에 따라 데이터를 가져오기 위해 프록시를 강제 초기화를 N번 수행하게 된다. 루트의 결과 데이터 개수에 따라 DB와의 커넥션 작업이 많아지게 되고 성능을 악화시키기 때문에 fetch 조인을 사용하여 한번의 쿼리로 데이터를 엔티티에 바인딩해주는 방법을 고려해보자. 일대다 관계이기 때문에 루트 데이터를 기준으로 엔티티를 ..
2021.02.04 -
엔티티에 setter를 사용하면 안되는 이유와 대체방안
엔티티에 setter를 열어두면 어떻게 될까? 보통 스프링은 여러가지 클래스 종류로 나눌수 있지만 대표적으로 Controller, Service, Repository, Domain 등 으로 분류할 수 있다. 엔티티는 도메인에 해당하며 여기서 만약 setter를 열어뒀다고 가정해보자. 엔티티에 setter로 필드 상태를 변경하고 트랜잭션이 종료되면 변경감지에 의해 update문이 나가게 된다. 그런데 Controller에서도 Entity를 생성하여 setter를 호출하고,,, Service에서도 호출하고,, 시스템이 복잡하다면 운영시 해당 Update문이 어디서 누구에 의해 발생했는지 추적하기가 굉장히 어려워진다. 그럼 setter를 열어두지 않고 어떻게 필드 상태를 업데이트 할 수 있을까? setter를..
2021.01.29 -
준영속상태의 엔티티를 변경할 때 변경감지와 merge()
준영속 상태의 엔티티를 업데이트할때, 두 가지 방법이 존재한다. 여기서 준영속 상태의 엔티티란 예전에 영속성 상태가 되었고 DB에 저장되었던 식별자가 존재하는 엔티티이지만 현재 영속성 상태가 아닌 상태를 말한다. 변경감지 변경감지는 flush 시점에 영속성 컨텍스트가 관리하는 엔티티의 변경 내용을 체크하여 알아서 SQL 쿼리 생성 및 DB에 전달하는 기능이다. 변경감지 프로세스에 대해 정리를 해보면.. 엔티티가 영속 상태가 된다.(persist나 find하여 DB에서 가져오는 경우) 영속성 컨텍스트는 스냅샷을 찍어 초기 상태를 저장해둔다. 엔티티의 필드에 값이 변경된다. 그리고 flush()가 호출된다.(커밋 시점이나 강제 flush) 영속성 컨텍스트는 스냅샷의 상태와 현재 상태가 다른(변경된) 데이터를..
2021.01.29 -
임베디드 타입, @Embeddable, @Embedded
임베디드 타입 새로운 값 타입을 직접 정의해서 만든 값타입. 여러가지 값타입을 모아서 만들 수 있음. 임베디드 타입을 사용하기 전과 후에 매핑되는 테이블은 변하는게 없다. 임베디드 타입 사용법 @Embeddable: 값 타입을 정의하는 곳에 표시 @Embedded: 값 타입을 사용하는 곳에 표시 기본 생성자 필수 한 엔티티에서 같은 값 타입을 사용할 경우 컬럼명이 중복되는것을 피하기 위해 @AttributeOverrides, @AttributeOverride를 사용해서 컬러 명 속성을 재정의 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null 임베디드 타입은 객체 타입이기 때문에 = 연산자를 사용할 경우 공유 참조가 된다. 따라서 불변 객체로 설계하여 사용해야한다. (생성자로만 값을 세팅하..
2021.01.21