JPA/개념

    final Class는 왜 JPA Entity가 될 수 없을까?

    final class는 JPA Entity Class가 될 수 없다. 왜 그럴까? JPA는 DB에서 데이터를 조회한 후 엔티티를 생성할 때 지연 로딩이라는 방식을 사용한다. 지연 로딩이란? 해당 엔티티(테이블)와 관계(join)를 맺고 있는 엔티티(테이블)들에 대한 정보는 그 즉시 로딩되지 않고 getter 메소드가 호출되는 등 실제 사용될 때 로딩된다. 이러한 방식을 지연 로딩이라 한다. 지연 로딩 방식을 이용해 데이터를 조회하기 위해서, JPA는 프록시 객체라는 것을 생성한다. 프록시 객체는 간단히 말해서 엔티티를 상속해서 확장한 클래스이다. 하지만 final class는 상속될 수 없기 때문에 JPA는 final class를 확장해서 프록시 객체로 사용할 수가 없다. 따라서 JPA Entity로 사..

    [JPA] 트랜잭션 전파 , 중첩된 트랜잭션(Transaction Propagation)

    트랜잭션 전파에 대해 간단하게 정리해보려고 한다. 트랜잭션의 전파에 대해 알아보기 전에 우선 스프링의 트랜잭션에 대해 간단하게 정리하면 다음과 같다. @Transaction? @Transaction은 스프링의 AOP를 이용하여 개발자가 편하게 DB 관련 작업을 할 수 있도록 도와준다. JPA, Mybatis 등을 사용하지 않을 때, 만약 Datasource를 이용해서 개발할 경우 getConnection(), close()를 하나하나 처리해줘야 한다. 대략 아래와 같은 코드다. public class QueryExam { private static final String QUERY = "select count(*) from ANIMAL"; private DataSource dataSource; publi..

    [JPA] N+1 문제 원인 및 해결방법

    JPA를 사용하면 자주 만나게 되는 것이 N + 1 문제이다. N + 1 문제는 성능에 큰 영향을 줄 수 있기 때문에 N + 1 문제가 무엇이고 어떤 상황에 발생되는지, 어떻게 해결하면 되는지에 대해 알아보고자 한다. N+1 문제란? 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 즉, 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것이다. 이를 N+1 문제라고 한다. When 언제 발생하는가? JPA Repository를 활용해 인터페이스 메소드를 호출할 때(Read 시) Who 누가 발생시키는가? 1:N 또는 N:1 관계를 가진 엔티티를 조회할 때 발생 H..

    [JPA] 영속성 컨텍스트(Persistence Context)란?

    엔티티 매니저 팩토리 & 엔티티 매니저 영속성 컨텍스트에 대해 알아보기 전에 엔티티 매니저 팩토리와 엔티티 매니저에 대해서 알아보고자 한다. 웹 어플리케이션이 구동하는 시점에 엔티티 매니저 팩토리가 생성되며 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 들어올 때마다 엔티티 매니저를 생성한다. 엔티티 매니저는 DB 연결이 필요한 시점(보통 트랜잭션이 시작되는 경우)에 커넥션 풀에 있는 connection을 얻어 DB를 핸들링하게 된다. 엔티티 매니저 팩토리가 엔티티 매니저를 사용하는 이유 엔티티 매니저 팩토리는 생성되는 시점에 DB 커넥션 풀을 생성하기에 생성 비용이 매우 크다. 그러나 엔티티 매니저의 생성 비용은 거의 들지 않으므로, 엔티티 매니저 팩토리는 필요에 따라 앤티티 매니저를 생성하여 사용한..

    [JPA] JPA vs JDBC

    신규프로젝트 회의 중에 팀장님이 이렇게 말씀하셨다고 가정해보자. JPA를 사용하면 비즈니스 로직이 복잡해져서 사용하지 않을거예요 그럼 이때 JPA에 대한 개념을 모른다면 그 회의는 저 단어를 시작으로 멍 때리게 될것이다... JPA와 JDBC에 들어가기에 앞서.... Spring은 DB에 접근하기 위해 자바의 API를 사용한다. 웹 서비스에 필요한 기능들이 추상화돼서 Spring이 만들어졌듯이, DB에 접근하는 기술들도 일종의 추상화 과정을 거치며 진화해 나갔다. 이 부분을 처음 공부하는 사람 입장에서는, 비슷해 보이면서 다른 단어들 때문에 개념이 굉장히 헷갈린다. JPA를 검색했는데 뜬금없이 Hibernate에 관한 포스팅만 쏟아지기도 한다. 이 참에 한번 정리를 해보자!!! (각 개념에 그림과 코드를..