- 23.11.13) TIL - 스프링 숙련주차 5일차2023년 11월 13일 20시 27분 55초에 업로드 된 글입니다.작성자: oneseel
오늘은 스프링 강의를 들었다.
오늘 배운 것
- Entity 연관 관계
- Fetch Type
- Cascade
- Orphan Removal
1. Entity 연간 관계
1) 1:1 관계 (OneToOne)
- 단방향 관계 : 주인 Entity가 외래 키를 소유하고, @JoinColumn 어노테이션을 사용하여 외래 키를 지정한다. 이 관계에서는 주인 Entity만이 외래 키를 관리하고, 관련된 다른 Entity는 해당 필드를 가지고 있지 않다.
- 양방향 관계 : 주인 Entity와 관계된 Entity모두가 서로를 참조할 수 있는 관계로,주인 Entity는 단방향 관계와 같이 @JoinColumn 어노테이션을 사용하여 외래 키를 지정하고, 관계된 Entity는 @OneToOne(mappedBy = "주인 Entity의 참조 필드명")와 같이 매핑된다. mappedBy 속성은 주인 Entity의 어떤 필드가 이 관계를 매핑하는지를 나타낸다.
2) N:1 관계 (ManyToOne)
- 단방향 관계 : 1:1 관계와 같다.
- 양방향 관계 : @OneToMany(mappedBy = "주인 Entity의 참조 필드명")을 사용하며, 필드로 List<주인 클래스>를 사용한다.
3) 1:N 관계 (OneToMany)
- 단방향 관계 : 다수의 상대 Entity를 담을 수 있는 List 필드를 가진다. 추가적인 업데이트가 발생한다는 단점이 있다.
- 양방향 관계 : @ManyToOne 어노테이션이 mappedBy를 지원하지 않는다.
4) N:M 관계 (ManyToMany)
- 단방향 관계 : 중간 테이블과 연결되며 @JoinColumn 어노테이션을 아래와 같이 연결해준다.
@ManyToMany @JoinTable(name = "중간 테이블", // 중간 테이블 생성 // 현재 위치인 주인 Entity 에서 중간 테이블로 조인할 컬럼 설정 joinColumns = @JoinColumn(name = "주인 id"), // 반대 위치인 상대 Entity 에서 중간 테이블로 조인할 컬럼 설정 inverseJoinColumns = @JoinColumn(name = "상대 id")) private List<상대 클래스> 상대List = new ArrayList<>();
- 양방향 관계 : 주인 Entity는 단방향과 같고, 상대 Entity에는 mappedBy를 사용한다.
5) 중간테이블
- 중간테이블을 직접 만들어서 사용하면 확장성이 좋다.
- 중간테이블이 생기면 아래와 같이 코드가 변경된다.
- 주인 Entity는 @OneToMany 어노테이션을 사용해서 중간 Entity와 연결된다.
@OneToMany(mappedBy = "주인 참조변수") private List<중간 클래스> 중간List = new ArrayList<>();
- 상대 Entity도 @OneToMany 어노테이션을 사용해서 중간 Entity와 연결된다.
@OneToMany(mappedBy = "상대 참조변수") private List<중간 클래스> 중간List = new ArrayList<>();
- 중간 Entity는 @ManyToOne 어노테이션으로 주인 Entity와 상대 Entity를 연결한다.
@ManyToOne @JoinColumn(name = "주인 id") private 주인클래스 주인참조변수; @ManyToOne @JoinColumn(name = "상대 id") private 상대클래스 상대참조변수;
2. Fetch Type
- JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있는데, 이를 Fetch Type이라고 한다. Fetch Type은 아래와 같이 2가지가 있다.
1) 즉시로딩 (Eager)
- @ManyToOne(fetch = FetchType.EAGER)
- 정보를 즉시 가져온다.
- 즉시 가져오긴 때문에 성능 저하 문제가 있을 가능성이 있다.
2) 지연로딩 (Lazy)
- @ManyToOne(fetch = FetchType.LAZY)
- 정보를 필요한 시점에 가져온다.
- Transaction이 열려있어서 필요한 시점에 데이터를 가져와야한다. 트랜잭션이 열려 있지 않으면 영속성 컨텍스트가 없거나 이미 닫혔을 것이므로, 지연로딩된 Entity를 사용할 때 해당 Entity를 영속성 컨텍스트에서 찾을 수 없게 된다.
3. Cascade
- 영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파되는 상황을 뜻한다.
- @ManyToOne(cascade = CascadeType.PERSIST)
1) All : 모든 연관된 작업을 전파합니다. 즉, 주인 Entity에 대한 모든 변경이 상대 Entity에 적용된다. 주의해서 사용해된다.
2) PERSIST : 주인 Entity가 저장될 때 상대 Entity도 저장된다. 새로운 객체를 생성하고 저장할 때 사용된다.
3) MERGE : 주인 Entity가 병합될 때 상대 Entity도 병합된다. 데이터베이스에서 이미 존재하는 엔터티와 관련이 있을 때 사용된다.
4) REMOVE : 주인 Entity가 삭제될 때 상대 Entity도 삭제된다. 조심해서 사용해야 하며, 연관된 Entity가 여러 곳에서 참조되고 있는지 확인해야 한다.
5)REFRESH : 주인 Entity가 새로고침될 때 상대 Entity도 새로고침된다. 데이터베이스에서 가장 최신의 정보로 업데이트할 때 사용됩니다.
4. Orphan Removal
- JPA에서는 주인 Entity에서 상대 Entity를 제거하더라도 데이터베이스에서 상대 Entity는 삭제되지 않고, 관계만 변경된다.
- 그러나 orphanRemoval을 true로 설정하면 주인 Entity에서 제거된 상대 Entity가 영속성 컨텍스트에서 제거되면서 데이터베이스에서도 삭제된다.
- @ManyToOne(orphanRemoval = true)
'TIL' 카테고리의 다른 글
23.11.15) TIL - 스프링 숙련 주차 7일차 (0) 2023.11.15 23.11.14) TIL - 스프링 숙련주차 6일차 (1) 2023.11.14 23.11.10) TIL - 스프링 숙련 주차 4일차 (0) 2023.11.10 23.11.09) TIL - 스프링 숙련 주차 3일차 (0) 2023.11.09 23.11.08)TIL - 스프링 숙련주차 2일차 (0) 2023.11.08 댓글