Backend/JPA(Java Persistence API)
-
[JPA] 엔티티에 Enum 컬렉션 담기Backend/JPA(Java Persistence API) 2022. 5. 23. 18:20
최근에 프로젝트를 하면서 Enum 타입의 List를 엔티티에 갖게 하고 싶었는데, 관계형 데이터베이스는 컬렉션 타입을 지원하지 않기 때문에 해결방법을 찾아야 했다. 내가 생각해 본 방법은 크게 두 가지이다. 1. Enum 타입을 포기하고 String으로 처리한다. 2. 새로운 테이블( 엔티티 )을 만든다. 일급 컬렉션도 생각해봤었는데, 결국 컬렉션이 들어있기 때문에 당연히 안된다.. ! 나는 1번의 방법으로 처리했다. 1번의 방법은 다음과 같이 처리하는 것이다. 기존에 VegetarianType 이라는 Enum 타입을 포기하고 String으로 변수를 받아서 밖으로 값을 넘겨줄 때 ( dto나 response 로 ) 문자열 처리해서 넘겨주는 방식이다 밑의 코드를 참고하면 된다. 2번의 방법은 새로운 테이블..
-
[JPA] 페치조인 ( Fetch Join )Backend/JPA(Java Persistence API) 2022. 4. 2. 04:43
이전 포스팅에서 즉시 로딩의 사용은 권장하지 않는다고 했었다. https://yanglet.tistory.com/10 [JPA] 지연로딩과 즉시로딩 오늘은 지연로딩과 즉시로딩에 대해 정리해보겠다 즉시로딩이란? 즉시로딩은 엔티티를 조회할 때, 연관된 엔티티까지 한번에 조회하는 것을 말한다. 연관관계에 fetch = FetchType.EAGAR 로 설정을 해 yanglet.tistory.com 하지만 연관된 엔티티까지 한 번에 조회해 오고 싶을 수 있다. 그때 사용할 수 있는 것 중 하나가 JPQL의 페치조인이다. ( JPQL은 JPA에서 제공하는 객체 지향 쿼리 언어이다. ) 페치조인이란? 페치조인은 연관된 엔티티나 컬렉션을 SQL 한 번에 조회하는 기능이다. ( 즉시 로딩의 기능 ) 객체 그래프를 SQL..
-
[JPA] 지연로딩과 즉시로딩Backend/JPA(Java Persistence API) 2022. 3. 26. 00:59
오늘은 지연 로딩과 즉시 로딩에 대해 정리해보겠다 즉시 로딩이란? 즉시 로딩은 엔티티를 조회할 때, 연관된 엔티티까지 한 번에 조회하는 것을 말한다. 연관관계에 fetch = FetchType.EAGAR 로 설정을 해주면 된다. ( @xxxToOne 관계는 default가 즉시 로딩이다. ) 참고로 실무에서 ** 즉시 로딩은 권장하지 않는다. ** 예상하지 못한 쿼리가 나갈 수 있고, N+1 문제가 발생할 수 있음 " 엔티티 조회하면 당연히 엔티티에 있는 애들 다 가져오는 게 당연한 거 아니야? " 라고 할 수 있지만 연관된 엔티티를 사용하지 않을 때는 굳이 다른 엔티티까지 조회해 올 필요가 없다. ( 최적화를 하고 싶다! ) 이때 사용하는 것이 지연 로딩이다. 지연 로딩을 이해하기 위해서는 프록시에 대..
-
[최적화] readOnly조회 @QueryHint vs @TransactionalBackend/JPA(Java Persistence API) 2022. 3. 8. 01:07
성능 향상의 목적으로 읽기 전용으로 데이터를 불러올 때 1. @QueryHint의 readOnly 2. @Transactional( readOnly = true ) 이 두 가지 방법을 생각할 수 있다. (스칼라 타입으로 조회는 생략하도록 하자) 이 방법들이 어떤 차이가 있는지 궁금해서 구글링을 해보았는데 대부분의 개발자분들이 정리한 것을 보면 1번의 @QueryHint는 엔티티를 읽기 전용으로 조회하여 영속성 컨텍스트가 스냅샷을 보관하지 않으므로 메모리를 아낀다고 하고 ( Drity Checking이 일어나지 않음 ) 2번의 @Transactional( readOnly = true ) 이 방식은 Hibernate Session의 Flush 모드가 Manual로 설정되어 커밋 시점에 플러쉬가 일어나지 않으..