하이버네이트 썸네일형 리스트형 [kotlin] JPA 14: Spring Boot에서 프록시와 예외처리 들어가기알아두면 도움이되는 프록시, 그리고 예외에 대해서 살펴보자.작성자: ospace114@empal.com, http://ospace.tistory.com/프록시JPA에서는 프록시는 엔티티를 로딩하지 않고 이를 대신하는 객체로 사용된다. 그리고 실제 사용 시점에 엔티티를 로딩하는 역할을 한다. 이는 지연 로딩을 위한 기능으로 성능 최적화 용도로 사용된다. 프록시 구현 방식은 엔티티 클래스를 상속해서 프록시 클래스를 구현한다. 이때 사용하는 프록시 클래스는 단순 객체이면 org.hibernate.proxy.HibernateProxy을 사용하고 리스트 객체이면 org.hibernate.collection.spi.PersistentBag을 사용한다. 이런 프록시를 통해 원본 엔티티의 지연 로딩 같은 기능을.. 더보기 [kotlin] JPA 13: Spring Boot에서 최적화 들어가기최적화 관련해서 N+1 문제, 읽기 전용, 페이징 처리에 대한 추가내용을 다룰려고 한다. 이미 앞에서 성능 관련해서 1차와 2차 캐시에 대해서 어느정도 다루었고 데이터 조회 성능 관련해서도 살펴보았다. 이번에서는 최적화 관련해서 잡스러운 부분을 조금더 다룰려고 한다.작성자: http://ospace.tistory.com/ (ospace114@empal.com)N+1 문제N+1문제는 조회 쿼리를 실행할 때 연관 데이터가 N가 있는 경우 모든 데이터를 가져오기위해 N+1 개만큼 조회하는 상황으로 대표적인 성능 이슈이다. 이런 상황은 연관관계에 의해서 한 엔티티가 연관된 여러 엔티티 객체를 로딩하는 경우로 자신 엔티티를 로딩하고 연관관계 속성을 확인하고 연관된 엔티티 들을 로딩하게 된다. 더욱이 목록형.. 더보기 [kotlin] JPA 12: Spring Boot에서 2차 캐시 들어가기JPA에서 캐시는 2단계를 걸쳐서 동작한다. 1차 캐시는 영속 컨텍스에 해당하며 세션이 유지될때까지 현재 세션의 모든 엔티티는 영속 컨텍스트 내에서 캐싱된다. 영속 컨텍스트는 트랜잭션 범위에서 유효한데 보통 트랜잭션이 종료되면 영속 컨텍스트도 같이 종료된다. 그렇기 때문에 세션과 영속 컨텍스트의 생명이 동일하다고 할 수 있다. 세션이 종료된 경우 1차 캐시가 사라지기 때문에 애플리케이션 전체에서 보면 동일한 요청을 할 경우 새로 캐싱해서 처리하기 때문에 효율적이지 않다. 결국, 세션에 상관 없이 캐시를 유지 관리하는 2차 캐시가 필요하다. 2차 캐시에 대해서 살펴보자.작성자: http://ospace.tistory.com/ (ospace114@empal.com)2차 캐시애플리케이션 라이프타임에.. 더보기 [kotlin] JPA 11: Spring Boot에서 트랜잭션과 락 들어가기트랜잭션은 단순해보이면서도 복잡하다. 이는 단지 한개 처리만 다루는게 아니라 여러 처리가 동시에 발생할 경우를 다루기 때문이다. 데이터베이스에서도 이를 해결하기 위한 기능을 제공하고 있지만 JPA에서 트랜잰션을 다룰 다양한 기능을 제공하고 있다. 하나씩 살펴보자.작성자: http://ospace.tistory.com/ (ospace114@empal.com)트랜잭션트랜잭션은 ACID를 보장하기 위한 기술이다. ACID는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 약자이다. 만약, 여러 트랜잭션이 실행될 경우 다른 트랜잭션에서 대한 액세스 권한을 제어 해야한다. 이를 위해 ANSI에서는 트랜잭션 격리 수준 4단계로 나누어서 .. 더보기 [kotlin] JPA 10: Spring Boot에서 엔티티 그래프 들어가기JPA에서는 성능을 위한 다양한 기능을 제공하고 있다. 엔티티 그래프도 그 중에 하나이다. 엔티티에서 성능 최적화를 위해서 내부 속성에 대해 즉시 로딩과 지연 로딩을 지원한다. 이런 기능은 컴파일 타임에 설정되어 변경할 수 없다. 엔티티 그래프를 사용할 경우 런타임에 제어할 수 있다. 엔티티 그래프 사용하는 방법을 간단하게 살펴보자.작성자: http://ospace.tistory.com/ (ospace114@empal.com)엔티티 그래프란?엔티티 그래프는 JPA 2.1에서 소개되었다. 엔티티 그래프는 로딩 성능 관련해 좀 더 세밀하게 제어하는 기능을 제공한다. 엔티티 내의 관련 영속 속성들을 그룹핑한 템플릿을 정의하고 런타임에 이를 선택적으로 적용할 수 있다. 엔티티 그래프가 n+1 조회 이슈를.. 더보기 [kotlin] JPA 9: Spring Boot에서 엔티티 이벤트 리스너 들어가기엔티티 이벤트 리스너에 대해서 다룰려고 한다. 여기서 이벤트는 엔티티와 관련된 이벤트로 로딩, 변경, 추가 등이 있다. 이벤트 처리 방식은 비동기 방식에서 자주 사용하는 방식으로 현재 실행 중인 메인 로직에 영향을 주지 않으면서 처리 중인 작업과 연관되서 실행하는 경우에 매우 유용하다. 여기서 사용한 환경은 Spring Data JPA을 사용했고 데이터베이스는 H2를 사용했다.작성자: http://ospace.tistory.com/ (ospace114@empal.com)이벤트 어노테이션JPA에서 엔티티의 생명주기 동안에 여러가지 이벤트를 발생한다. 이를 적절한 핸들러도 처리할 수 있도록 어노테이션을 사용해서 설정할 수 있다. 엔티티에서 발생하는 이벤트에 대해 다음과 같은 어노테이션을 사용해서 실.. 더보기 [kotlin] JPA 8: Spring Boot에서 엔티티 매니저와 Criteria 쿼리 들어가기JPQL 작성을 도와주는 API로 Criteria Query와 QueryDSL이 있다. Criteria Query는 표준이지만 QueryDSL은 표준은 아니다. 사용에 있어서는 QueryDSL이 더 좋기 때문에 알아두면 좋다. 여기는 JPA 표준인 Criteria Query에 대해서 다룰려고한다. 쿼리에 대한 자세한 설명이 이전 글을 참고하시기 바란다. 여기서는 Criteria Query 작성에 집중했다.작성자: http://ospace.tistory.com/ (ospace114@empal.com)Entity Manager 사용Criteria Query를 사용하기 위해 기존 리포지토리를 확장해서 엔티티 매니저(EntityManager)를 가져와야 한다. 엔티티 매니저는 엔티티 객체를 영속 컨텍스트.. 더보기 [kotlin] JPA 7: Spring Boot에서 JPQL과 @Query 들어가기Repository를 사용해 쿼리 메소드로 어느정도 데이터 처리하는데 문제는 없지만 정교하고 복잡한 처리를 할 경우 한계가 있다. 이런 한계를 JPQL을 사용해서 다양한 쿼리를 실행할 수 있다. Spring Data에서 @Query을 사용해서 쉽게 JPQL을 사용할 수 있도록 만들어준다. 사전에 Ansi SQL 학습을 권장한다.작성자: http://ospace.tistory.com/ (ospace114@empal.com)환경 구성앞으로 사용할 엔티티는 총 3개로 아래와 같이 구성된다.아래는 데이터베이스에서 사용할 초기 데이터이다.insert into member(name, likes) values ('bar', 1);insert into member(name, likes) values ('fox'.. 더보기 이전 1 2 다음