
[JPA] Cascade(영속성 전이)에 관해
2022. 11. 27. 00:01
스프링/JPA
Cascade JPA에서는 엔티티끼리 다대일, 일대일 등의 연관관계를 맺어줄 수 있다. [학생 - 학급] 테이블이 양방향 다대일 관계를 이루고 있다고 가정해보자. 만약, 학급을 만들면서 이 학급에 속하는 학생들을 만들고 싶다면 보통의 경우 아래 순서로 이루어질 것이다. 1. 학급 테이블 생성 및 값 세팅 2. 학생 테이블 생성 및 값 세팅 3. 학급 테이블의 학생 속성에 학생 객체를 리스트로 저장 4. 학급 테이블 저장 5. 학생 테이블의 학급 속성에 학급 객체를 저장 6. 학생 테이블 저장 3번 과정에 주목하자. 여기서 우리는 이미 학급 클래스에 학생 객체를 저장한 상태이다. 이것은 학생의 입장에서 자신에게 학급이 배정되었다고도 말할 수 있다. 하지만 엄밀히 따지면 학생 클래스에는 학급 객체가 저장되지..

[JPA] dataSourceScriptDatabaseInitializer 빈 생성 오류
2022. 11. 15. 17:51
스프링/JPA
강의듣다가 해당 오류 발생.. 공식 문서 내용 Hibernate and data.sql By default, data.sql scripts are now run before Hibernate is initialized. This aligns the behavior of basic script-based initialization with that of Flyway and Liquibase. If you want to use data.sql to populate a schema created by Hibernate, set spring.jpa.defer-datasource-initialization to true. While mixing database initialization technologies i..

[Spring Data JPA] EntityGraph 사용해서 쿼리 조회 최적화
2022. 9. 26. 21:15
스프링/JPA
EntityGraph 지연로딩 간단 개념 엔티티를 설계할 때 연관관계 매핑에서 FetchType을 보통 LAZY로 설정해주는 게 일반적이다. 지연로딩이라고 흔히 부르는 이 설정은 다양한 연관관계로 매핑되어 있는 엔티티를 호출할 때 셀렉트 쿼리의 최적화를 위해 다른 엔티티를 프록시 객체로 생성하는 것을 말한다. ex) Member와 Team이 N:1(다대일) 관계일 때 Member 엔티티를 호출하면 Team 엔티티는 프록시 객체로 생성되고 Member에만 select 쿼리를 날린다. 쿼리 최적화를 위해 지연로딩 설정을 해주지만 오히려 이런 설정이 최적화에 불리할 때가 있다. Member(N) : Team(1) 엔티티 관계를 예로 들겠다. Member를 생성하면 Team은 프록시 객체다. 그렇기에 Team ..

[Spring Data JPA] 사용자 정의 레파지토리 생성
2022. 9. 26. 20:40
스프링/JPA
레파지토리에 구현한 메서드만으로 해결이 어려운 복잡한 쿼리, 동적 쿼리 등은 보통 사용자 정의 레파지토리를 만들어서 해결한다. 그리고 핵심 비즈니스 로직이 담긴 쿼리와 그 외 특정 용도로 만든 쿼리를 분리해주는게 베스트 인 것도 이유가 된다. 바로 알아보겠다. 사용자 정의 레파지토리 생성 public interface MemberRepositoryCustom { List findMemberCustom(); } 사용자 정의 레파지토리를 생성한다. 일반적인 인터페이스로 생성하면 되며, 별도의 어노테이션은 기본적으로 없어도 된다. 임의의 클래스 만들어서 사용자 정의 레파지토리 상속받기 @RequiredArgsConstructor public class MemberRepositoryImpl implements ..

[Spring Data JPA] Update 쿼리 사용해서 Bulk로 수정하기.
2022. 9. 21. 17:48
스프링/JPA
변경감지 vs Bulk업데이트 JPA에는 변경감지 기능이 있다. 영속성 컨텍스트에서 불러온 엔티티의 값을 Setter 등의 메서드로 수정해주면 그 값이 영속성 컨텍스트에 반영되는 것을 말한다. 그런데 만약 엔티티들에 일괄적으로 동일한 값을 추가하거나 삭제하는 등의 수정이 필요할 때, 변경감지로 인한 값 수정은 최선이 아닐 수 있다. 해당 엔티티들을 개별적으로 전부 영속성 컨텍스트에서 꺼내와서 하나씩 변경된 값을 반영해야 하기 때문이다. 그렇기에 우리는 직접 쿼리를 작성해서 한번에 값을 수정해볼 것이다. public interface MemberRepository extends JpaRepository { @Modifying(clearAutomatically = true) @Query("update Mem..

[Spring Data JPA] 페이징 메서드 구현 - Page 타입
2022. 9. 20. 21:07
스프링/JPA
public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age " + "order by m.userName desc", Member.class) .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } 순수 JPA로 페이징을 한다면 위와 같이 메서드를 만들고 JPQL을 작성해야 했다. Spring Data JPA는 이 과정을 훨씬 쉽게 구현할 수 있게 해줄 뿐 아니라, 여러 가지 기능도 갖고 있어 코드 작성을 수월하게 도와준다. 페이징을 위해서는..

[Spring Data JPA] @NamedQuery 없이 레파지토리에 직접 쿼리 작성하기
2022. 9. 19. 22:30
스프링/JPA
지난번 엔티티에 @NamedQuery를 이용해 JPQL을 작성 후 값을 조회하는 방법을 알아보았다. https://imcoding.tistory.com/60 [Spring Data JPA] NamedQuery 사용하기 NamedQuery Spring Data Jpa는 기본적으로 findAll, saveAll과 같이 CRUD를 포함한 기본적인 공통 메서드를 인터페이스로 제공한다. 그런데 만약, 단순히 전체 값을 조회하거나 키 값을 기준으로 조회하는 것 imcoding.tistory.com 하지만 실제로 위 방법은 실무에서 많이 쓰이지 않는다. 엔티티에 쿼리문을 작성하는 방식 자체가 속성값만을 유일하게 갖는 게 베스트인 엔티티 취지에 맞지 않기 때문이다. 오히려 쿼리문은 레파지토리에 직접 작성하는 게 더 어..

[Spring Data JPA] NamedQuery 사용하기
2022. 9. 19. 20:47
스프링/JPA
NamedQuery Spring Data Jpa는 기본적으로 findAll, saveAll과 같이 CRUD를 포함한 기본적인 공통 메서드를 인터페이스로 제공한다. 그런데 만약, 단순히 전체 값을 조회하거나 키 값을 기준으로 조회하는 것 외에 특성 조건에 따른 값을 조회하고자 한다면 어떻게 해야할까? 물론 엔티티 매니저가 제공하는 createQuery 메서드를 사용해 JPQL문으로 DB에서 값을 조회할 수 있다. 하지만 만약 JPQL문의 컬럼명이 잘못 되었어도 해당 메서드를 호출하기 전에는 에러가 발생하지 않아 알아차리기 힘들다. 메서드 이름으로 쿼리를 생성해주기도 하지만, 조건이 많아질수록 메서드 이름이 길어진다는 단점이 있다. (findByAgeLessThan, findByUserNameAndAgeGr..

[JPA] 일대다 연관 관계 매핑
2022. 9. 13. 20:30
스프링/JPA
Entity 일대다 연관 관계 매핑 읽기 전에 참고하면 좋은 글 더보기 https://imcoding.tistory.com/56 [JPA] 엔티티 연관관계의 주인 연관관계의 주인 개념 외래키를 관리할 객체를 말한다. 엔티티의 연관관계는 테이블에서와 객체에서 각각 존재한다. 테이블에서는 사실 연관관계의 주인이 누구건간에 테이블 구조는 똑같다. imcoding.tistory.com https://imcoding.tistory.com/57 [JPA] 다대일 연관 관계 매핑 Entity 다대일 연관 관계 매핑 연관관계의 주인? 연관관계의 주인에 대한 개념이 없다면 아래 글을 먼저 읽고 오시길 권장드립니다. https://imcoding.tistory.com/56 [JPA] 엔티티 연관관계의 주인 연관관계 imc..

[JPA] 다대일 연관 관계 매핑
2022. 9. 13. 18:27
스프링/JPA
Entity 다대일 연관 관계 매핑 연관관계의 주인? 연관관계의 주인에 대한 개념이 없다면 아래 글을 먼저 읽고 오시길 권장드립니다. https://imcoding.tistory.com/56 [JPA] 엔티티 연관관계의 주인 연관관계의 주인 개념 외래키를 관리할 객체를 말한다. 엔티티의 연관관계는 테이블에서와 객체에서 각각 존재한다. 테이블에서는 사실 연관관계의 주인이 누구건간에 테이블 구조는 똑같다. imcoding.tistory.com 다대일(N : 1) 연관 관계 매핑 1. 멤버와 팀이 N : 1 관계로 있다. 2. 멤버는 하나의 팀에만 소속될 수 있고, 한 팀당 여러명의 멤버가 있을 수 있다. 이해를 돕기 위해 위 구조를 가지고 설명을 시작하겠다. 우선, 외래키는 멤버(N) 테이블에 존재한다. (..

[JPA] 엔티티 연관관계의 주인
2022. 9. 13. 18:26
스프링/JPA
Entity 연관관계의 주인 개념 외래키를 관리할 객체를 말한다. 엔티티의 연관관계는 테이블에서와 객체에서 각각 존재한다. 테이블에서는 사실 연관관계의 주인이 누구건간에 테이블 구조는 똑같다. 두 테이블 중 외래키를 갖고 있는 곳은 한 곳이며, 이 외래키 하나로 양쪽 테이블이 서로 조인하여 데이터를 가져올 수 있다. 하지만, 객체에서는 다르다. 두 테이블 A와 B가 N : 1로 연관관계가 매핑되어 있다면 A에는 B를 객체로 생성할 수 있고, B에서도 A를 List에 넣어 관리할 수 있다. 1 : 1 혹은 N : N으로 매핑되어 있다고 가정해도, 동일하게 양 쪽 모두에서 서로를 객체로 생성하여 관리할 수 있다. 이런 차이 때문에 두 객체 중 한 곳에서 외래키를 관리할 수 있도록 연관관계의 주인을 정해줘야 ..

[JPA] @MappedSuperclass 핵심 개념
2022. 9. 9. 20:25
스프링/JPA
MappedSuperclass 개념 핵심부터 말하자면, 객체는 상속관계에 있으나 테이블은 상속관계 매핑이 아닐 때 사용한다. 논리적으로 상속 관계에 있는 엔티티 클래스 간에 매핑 관계를 만드는게 아니라, 단순히 공통된 매핑 컬럼을 하나의 부모 객체 안에 몰아넣고자 할 때 사용하는 어노테이션이다. Member와 Seller 테이블이 있다. 이 두 테이블은 공통적으로 id와 name을 공통 속성으로 갖는다. 우리는 이 두 속성을 부모 객체에 할당하고자 하는거다. 지금은 두 테이블밖에 없지만 만약 테이블이 수십개가 넘어간다고 가정해보자. 그리고 공통된 속성은 id와 name에서 그치는 것이 아니라 등록일자, 수정일자, 등록한 사람, 수정한 사람 등등 점점 늘어난다고 가정하자. 그때마다 모든 엔티티 클래스에 가..