본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] Entity 클래스 간의 관계

by mmm- 2023. 11. 20.

외래키의 주인 정하기

  • 외래키의 주인 ➡️ 등록, 수정, 삭제 가능 (관리)
    외래키 주인 X ➡️ 읽기만 가능. 
  • @JoinColumn() : 외래키의 주인이 활용하는 annotation으로, 컬럼명, null 여부, unique 여부 등을 지정

 

1) 1 대 1 관계

 

@OneToOne : Entity 간의 1대1 관계일 때 맺어주는 역할 수행

1-1. 단방향 관계

  • 단방향 관계는 상대 entity 따로 필드가 없어 조회 불가능

 

1-2. 양방향 관계

  • 양방향 관계는 서로가 상대 entity를 가지고 있음.
  • mappedBy : 외래키의 주인을 지정해줄 때 사용하는 옵션.
    • 외래키의 주인이 아닌 쪽에서 주인 지정
    • mappedBy의 속성값은 상대 entity(외래키의 주인)에 있는 외래키 필드명을 의미

2) N 대 1 관계

  • 외래키의 주인(N의 관계)은 @JoinColumn

1-1. 단방향 관계

  • 단방향 관계는 상대 entity 따로 필드가 없어 조회 불가능

 

1-2. 양방향 관계

외래키 주인

  • @ManyToOne : Entity 간의 N대1 관계일 때 맺어주는 역할 수행
  • @JoinColumn

 

외래키의 주인 X

  • @OneToMany : Entity 간의 1대N 관계일 때 맺어주는 역할 수행
  • mappedBy 옵션 사용
  • 1쪽에서 N쪽을 참조하려다 보니 List의 형태로 관리

3) 1 대 N 관계

1-1. 단방향 관계

  • 외래키를 관리하는 주인이 아닌쪽에서 외래키를 가짐.
  • N관계의 테이블이 외래키를 가질 수 있지만, 주인은 현재 1의 관계의 쪽이므로 외래키는 주인이 아닌 쪽에서 가지고, 외래키의 주인은 상대 entity를 리스트형태로 가지고 관리.
  • @JoinColumn(), @OneToMany
    @Entity
    @Table(name = "food")
    public class Food {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private double price;
    
        @OneToMany
        @JoinColumn(name = "food_id") // users 테이블에 food_id 컬럼
        private List<User> userList = new ArrayList<>();
    }​
    insert 한 번으로 해결할 수 있는 것을 1대N 단방향 관계에서는 update가 추가적으로 발생된다는 한계점이 존재.

 

1-2. 양방향 관계

  • 1:N 관계에서는 양방향관계 존재 X
  • @ManyToOne annotation에서는 mappedBy 속성 제공 X
    (1:N 관계 양방향을 JPA자체가 지원하지 않음.)

3) N 대 M 관계

  • N:M관계를 풀어내기 위해 중간 테이블을 생성하여 사용
    • 중간테이블에서는 다른 두 테이블의 id를 가짐.
  • 생성되는 중간 테이블을 컨트롤하기 어렵기 때문에 추후에 중간 테이블 변경이 발생할 경우, 문제 발생 가능성 존재.

 

1-1. 단방향 관계

 

외래키의 주인

  • @JoinTable을 이용해 중간 테이블 생성
  • @JoinColumn을 이용해 반대, 중간 테이블로 조인한 컬럼을 각각 설정
  • @ManyToMany
  • 외래키 주인X Entity 리스트로 참조

 

1-2. 양방향 관계

외래키의 주인 

  • @JoinTable을 이용해 중간 테이블 생성
  • @JoinColumn을 이용해 반대, 중간 테이블로 조인한 컬럼을 각각 설정
  • @ManyToMany
  • 외래키 주인X Entity 리스트로 참조

 

외래키의 주인 X

  • @ManyToMany(mappedBy = "")
  • 외래키 주인 Entity 리스트로 참조

'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글

[Spring] Entity 연관관계  (1) 2023.11.14
[Spring] RestTemplate  (0) 2023.11.10
[Spring] Spring Security / Validation  (1) 2023.11.09
[Spring] Filter  (0) 2023.11.09
[Spring] JWT / 패스워드 암호화  (0) 2023.11.08