@Transactional 과 Test code 고찰 - 개발자들의 생각 모음

Spring/DB, Cache 연동 2024. 4. 22. 22:01

@Transactional 을 Test code 에서 사용할 때, 개발자 간에 논란이 좀 있다.. 개발자들의 생각을 알아보자.. 향로님 테스트 데이터 초기화에 @Transactional 사용하는 것에 대한 생각 https://jojoldu.tistory.com/761 테스트 데이터 초기화에 @Transactional 사용하는 것에 대한 생각 얼마 전에 2개의 핫한 컨텐츠가 공유되었다. 존경하는 재민님의 유튜브 - 테스트에서 @Transactional 을 사용해야 할까? 존경하는 토비님의 페이스북 2개의 컨텐츠에서 테스트 데이터 초기화에 @Transa jojoldu.tistory.com 토비님 테스트가 관리하는 트랜잭션 - 향로 님의 @Transactional 글을 읽고 https://toby.epril...

Spring Data JPA (Hibernate), N + 1 Query Problem

Spring/DB, Cache 연동 2024. 2. 20. 22:18

N + 1 문제가 일어나는 모든 경우의 수에 대해 알아보고.. 한번 정리를 해보겠다. N + 1 Query problem ? 어떤 엔티티를 조회하기 위해 쿼리(1)를 수행했는데 예상치 못한 쿼리들(N)이 추가로 수행되는 상황을 말한다. 주로 일대다, 다대일 관계에서 발생한다. 이번 포스팅에서 사용할 DB 다이어그램이다. Team 이 여러 Member 를 가지는 관계이다. N + 1 조회 문제가 일어나는 케이스를 살펴보겠다. 글로벌 페치 전략이 즉시 로딩(Eager loading) 인 경우 JPQL 을 이용하여 어떤 엔티티를 조회 할 경우 발생한다. -> 글로벌 페치 전략이 즉시 로딩이지만, 사용자의 쿼리(JPQL) 가 우선이기 때문에 JPQL 을 충실히 수행후, 글로벌 페치 전략에 의해 연관관계에 있는 ..

Article Thumbnail
Spring 과 JPA

Spring/DB, Cache 연동 2024. 2. 14. 22:24

J2EE 컨테이너 환경의 대표격인 Spring 에서 JPA 를 사용할 경우 알아야할 중요한 개념을 나열해보겠다. 순수하게 J2SE 환경에서 JPA 를 사용하면 개발자가 직접 EntityManager 를 생성해야하며, Transaction 도 관리해야한다. J2EE 환경에서 JPA 를 사용하면 트랜잭션 범위의 영속성 컨텍스트 전략이 기본으로 채택된다. Spring 에서 트랜잭션 범위와 영속성 컨텍스트 생존 범위가 동일한 전략을 따르면, 트랜잭션 AOP 를 활용한다. 트랜잭션 범위와 영속성 컨텍스트 생존 범위가 동일한 전략 해당 전략에서는 트랜잭션을 시작할 때, entityManager 를 생성하고 트랜잭션이 종료 될 때, entityManager 도 닫힌다. 트랜잭션이 같으면 동일한 EntityMana..

JPA 등록, 기본 키 생성 전략

Spring/DB, Cache 연동 2023. 6. 19. 13:07

이번엔 JPA 의 등록 과정에 대해 알아보겠다. JPA 의 등록 과정은 크게 2단계를 따른다. 1. 영속성 컨텍스트에 엔티티 등록 -> 엔티티를 영속 상태로 변경 2. 플러시 과정을 거쳐 영속성 컨텍스트에 존재하는 엔티티를 DB 에 반영 -> 쓰기 지연 SQL 저장소의 SQL 을 DB 에 보낸다. 이제 자세하게 알아보겠다.. 먼저 위 사진을 한번 보자.. persist 메서드를 호출하면 해당 엔티티에 대해서.. insert 문이 생성되어 쓰기 지연 SQL 저장소에 저장되고 1차 캐시에 저장되는 두개의 작업이 이루어진다 코드를 통해 이해해보자.. addMember 메서드를 호출하면 어떤일이 발생하는지 알아보겠다. 1. @Transactional 어노테이션이 적용된 메서드이므로 수동 커밋 모드로 진행되며....

Article Thumbnail
JPA 변경 감지와 플러시

Spring/DB, Cache 연동 2023. 6. 15. 22:06

JPA 의 변경 감지와 플러시에 대해 알아보자. 변경 감지엔티티의 변경사항을 데이터베이스에 자동으로 반영하는 기능을 변경 감지(Dirty Checking) 이라 한다. 플러시영속성 컨텍스트의 변경 내용을 데이터 베이스에 반영(동기화)한다. 위 그림을 한번 봐주고.. 코드를 통해 이해 해보자. 엔티티 Member 를 생성 후, 추가하는 addMember 메서드 findById 를 통해 한번 조회 하고, 닉네임을 변경하고, 다시 조회하는 test 메서드 실행은 다음과 같이 진행 하였다. test 메서드를 수행하면 내부적으로 어떤 일이 발생하는지 알아보겠다. 1. test 메서드는 하나의 트랜잭션으로 묶여있어서 메서드 내에서는 동일한 영속성 컨텍스트를 이용하게 된다. 2. (29 line) 최초에는 영속성 컨..

Article Thumbnail
JPA Entity Default Constructor

Spring/DB, Cache 연동 2023. 6. 7. 23:57

JPA 의 공식 문서 JSR 338, Java Persistence API 를 보면.. 이런말이 나온다. 2.2 version https://download.oracle.com/otn-pub/jcp/persistence-2_2-mrel-spec/JavaPersistence.pdf?AuthParam=1686147162_93e6225ea2a6979ada32934da41475b1 즉, 엔티티 클래스는 Default 생성자를 반드시 가져야한다. (생성자의 접근지정자는 public or protected) 물론 표준 스팩일 뿐이므로 JPA 의 구현체 마다 다를 수 있다. 오늘은 이 부분에 대해 알아보자.. JPA 의 Entity 생성 방식 DB 에서 데이터를 읽고 Entity 를 반환해주려면.. JPA Entit..

Article Thumbnail