JPA(11)
-
[JPA] 프록시와 지연 로딩
프록시와 연관관계 관리 객체가 DB에 저장되어 있으므로 연관된 객체를 자유롭게 탑색하기 어렵습니다. JPA 구현체들은 이 문제를 해결하기 위해 프록시라는 기술을 사용합니다. 프록시를 사용하면 연관된 객체를 처음부터 DB에서 조회하는 것이 아니라, 실제 사용하는 시점에 조회할 수 있습니다. 하지만 자주 함께 사용되는 객체들은 조인을 사용해서 함께 조회하는 것이 효과적입니다. JPA는 즉시 로딩과 지연 로딩이라는 방법으로 둘을 모두 지원합니다. 지연 로딩 Member 객체가 Team 객체를 @ManyToOne으로 참조하고 있을 때, Member 객체가 Team 객체와 관련된 정보를 사용하지 않는다면 연관된 Team 엔티티까지 함께 조회하는 것은 효율적이지 않습니다. 이런 문제를 해결하기 위해 엔티티가 실제 ..
2023.04.09 -
[JPA] 지연로딩과 성능 최적화 - 1
지연로딩과 성능 최적화 - 1 지연 로딩 때문에 발생하는 성능 이슈를 해결하기 위한 방법을 알아봅니다. 첫번째 강의는 지연 로딩과 엔티티로 데이터를 전달할 때 발생하는 오류에 대해 알아봤습니다. 지연 로딩 지연 로딩은 객체를 실제 사용하는 시점에 로딩하는 방식입니다. 지연 로딩을 사용하면 객체를 실제 사용하는 시점에 로딩하기 때문에 객체를 사용하지 않는 경우에는 로딩하지 않습니다. 지연 로딩은 처음 엔티티를 가져올 때 연관 객체까지 가져오지 않습니다. 이 때 Hibernate는 연관 객체를 상속한 프록시 객체를 생성해서 엔티티에 넣어둡니다.(보통 프록시를 초기화 한다고 얘기합니다.) 프록시 객체를 쓸 때 byteBuddy라는 라이브러리를 많이 쓰기 때문에 간혹 에러 로그에서 proxy, byteBuddy..
2023.04.08 -
[JPA] 생성키 전략
생성키 전략 IDENTITY는 auto increment를 뜻하는데, mysql 외 DB 벤더들은 이를 지원하지 않기 때문에 SEQUENCE를 사용합니다. Identity sequencing DB에 있는 IDENTITY 컬럼을 이용해 객체에 자동으로 id를 부여하는 방법입니다. MySQL, Postgres에서 지원하며, Oracle은 지원하지 않습니다. 장점만 있는 것은 아니며, DB에 insert 되기 전에 id가 부여되지 않기 때문에 flush가 돼야만 id를 획득할 수 있습니다. Sequence objects DB 객체들을 사용해 id를 생성합니다. Oracle, Postgres에서 지원합니다. INCREMENT를 DB의 시퀀스 객체에 설정해놓기 때문에 id 선할당(preallocation)이 가능..
2022.06.01 -
[ORM 표준 JPA] 14장 컬렉션과 부가기능
컬렉션 persist, 엔티티를 영속성 상태로 변경하면 하이버네이트가 제공하는 PersistentBag로 전환됩니다. 컬렉션 종류 Collection, List Set: 중복 허용 X equals() + hashcode()로 검증합니다. Set은 엔티티를 추가할 때 중복 엔티티가 있는지 확인해야하기 때문에 지연 로딩된 컬렉션을 초기화 합니다. List + @OrderColumn List로 받을 때 순서가 정해진 상태로 리턴됩니다. 하지만 @OrderColumn은 연관 엔티티 중 FK가 있는 엔티티에만 종속적이고 제한적인 부분이 있기 때문에 @OrderBy를 권장합니다. @Converter 컨버터를 사용하면 엔티티의 데이터 타입을 변환해서 테이블에 저장할 수 있습니다. 그 반대도 가능합니다. 글로벌 설정 ..
2021.08.30 -
[ORM 표준 JPA] 15장 프록시 심화
어느새 스터디가 한 주를 남기고 있습니다. 넥스트 스텝 교육을 병행하기가 이렇게 힘들줄은 생각못한 자신에게 반성시키고 싶지만 그래도 고생한만큼 마무리까지 잘하도록 하겠습니다. JPA 프록시 심화 우선 프록시는 실제 DB에 접근하지 않아도 된다는 성능에 있어 강점을 가진 엔티티 호출 방식입니다. JPA는 지연 로딩을 통해 원본 엔티티 대신 프록시를 참조하며 프록시는 원본 엔티티를 상속받아 객체의 참조를 보관하고 있습니다. 때문에 메서드 호출을 프록시로 할 경우 프록시는 실제 엔티티에 호출을 전달하게 됩니다. 프록시 테스트 중 member 엔티티에서 Spring Data JPA 프록시 호출 메서드인 getById를 사용해도 프록시가 생성되지 않는 오류가 있었는데 원인은 엔티티 구조상 있는 것으로 보여서 찾고..
2021.08.30 -
[실무 JPA] 엔티티 생성
회사 어드민 서버가 C# .NET으로 이루어져 있는데 이번에 범용성이 넓고 저한테 익숙한 Java Spring으로 이전하는 작업을 맡게 되었습니다. 그리고 SQL 처리를 MyBatis가 아닌 JPA를 사용하기로 했습니다. :) 소스코드 파악이 어느정도 되면 이관하는 작업을 진행하려 했습니다. 다만 Spring으로 이루어진 앱 서버의 DB는 파악하고 있기 때문에 우선 엔티티 이전 작업을 시작했습니다. 그 후 API 단위로 Controller, Service 단의 코드를 이전하려 합니다. JPA 엔티티 생성 IntelliJ의 Database Tool을 사용하면 IDE에서 DB 데이터를 볼 수 있어 편합니다. 엔티티 생성도 Database 연결 POJO Groovy 사용해 엔티티 생성 설정값 지정 Genera..
2021.08.04