인프런 올인원 자바 스프링 강의를 학습 목적으로 정리하여 포스팅합니다.
section5. 책 요구사항 구현하기
5. JPA 연관관계에 대한 추가적인 기능들
연관 관계
1:1 관계
한 사람은 한 개의 실거주 주소만을 가지고 있다.
위와 같은 N:1 관계를 JPA 어노테이션에서는
- @OneToOne
으로 포현한다.
N:1 관계
학생과 교실 관계를 보면 학생 여러 명이 교실에 들어갈 수 있다.
즉, 학생 N : 교실 1 관계이다.
위와 같은 N:1 관계를 JPA 어노테이션에서는
- @ManyToOne
- @OneToMany
으로 포현한다.
한쪽에만 어노테이션을 붙여도 된다.
N:M 관계
위와 같은 N:1 관계를 JPA 어노테이션에서는
- @ManyToMany
으로 포현한다.
구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용을 비추천한다.
1:N 관계를 여러 개 설정하는 것을 추천한다.
옵션
- cascade : 한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능. ex) cascade = CascadeType.ALL
- orphanRemoval : 객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션. ex) orphanRemoval = true
연관관계의 주인
Table을 보았을 때 누가 관계의 주도권을 갖는지 설정해야 한다.
연관관계의 주인의 값이 설정되어야만 진정한 데이터가 저장된다.
즉, 객체가 연결되는 기준이 된다.
예를 들어 사용자 테이블과 책 대출 테이블이 있을 때
책 대출 테이블은 사용자의 id를 가지고 있으므로 책 대출 테이블이 주인이다.
주인이 아닌 쪽 어노테이션에 mappedBy = "주인이 아닌 쪽 이름" 을 작성해준다.
연관 관계의 주인 효과
- 상대 테이블을 참조하고 있으면 연관관계의 주인
- 연관관계의 주인이 아니면 mappedBy를 사용
- 연관관계의 주인의 setter가 사용되어야만 테이블 연결
@JoinColumn
연관관계의 주인이 활용할 수 있는 어노테이션이다.
필드의 이름이나 null 여부, 유일성 여부, 업데이트 여부 등을 지정한다.
* 주인일 경우 @Column 대신 사용한다.
6. 책 대출/반납 기능 리팩토링과 지연 로딩
4번째 영속성 컨텍스트
지연 로딩 (Lazy Loading)
: 연결되어 있는 객체를 꼭 필요한 순간에만 가져온다.
@OneToMany 속 fetch 속성에 들어있다.
연관관계 사용 시 장점
- 각자의 역할에 집중하게 된다. (응집성)
- 새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.
- 테스트 코드 작성이 쉬워진다.
지나치게 사용하면
성능상의 문제가 생길 수도 있고
도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.
'JAVA > [인프런] 스프링 강의들' 카테고리의 다른 글
[서버 개발 올인원 패키지] 7. 생애 최초 배포하기 (0) | 2023.04.16 |
---|---|
[ 서버 개발 올인원 패키지] 6. 생애 최초 배포 준비하기 (0) | 2023.03.09 |
[ 서버 개발 올인원 패키지] 4. 생애 최초 JPA 사용하기 (0) | 2023.02.24 |
[ 서버 개발 올인원 패키지] 3. 역할의 분리와 스프링 컨테이너 (0) | 2023.02.22 |
[ 서버 개발 올인원 패키지] 2. 생애 최초 Database 조작하기 (0) | 2023.02.22 |