ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Entity 연관관계, @OneToOne
    스파르타 강의 정리 2023. 11. 10. 20:18

     

    4주차 Entity 연관관계에 대한 강의를 들으며 메모한 내용을 정리

     

    참고로 예시는 모두 Food Entity와 User Entity를 사용하였음.

     

    또한 모든 연관관계에서 FK의 주인은 Food 라고 가정

     

     

     

    데이터베이스에서는 단방향, 양방향의 관계가 의미없다.

    어느 테이블을 기준으로 Join해도 같은 결과가 나오기 때문

     

    하지만 JPA로 오면 방향의 개념이 생기게 된다.

    DB에서는 방향의 개념이 없었지만 

     

    Entity는 객체형태이기 때문에 서로 참조하기 위해 상대 엔티티의 타입을 필드로 가지고 있어야 한다.

    참조할만한 필드가 없다면 연관관계를 맺을 수가 없어  조회가 불가능하기 때문에 

    조회가 가능한 한쪽이 일방적으로 조회하게 된다.

    이 경우 단방향관계가 되며,  단방향, 양방향이라는 개념이 생기게 된다.

     

     

     


     

     

     

    @OneToOne

    이 애너테이션은 1대1관계를 맺어주는 역할을 한다.

     

    단방향관계

    엔티티에서 외래키의 주인은 일반적으로 다(N)의 관계인 엔티티이지만 

    1대1 관계에서는 외래키의 주인을 직접 지정해야한다.

    -> 외래키 주인만이 왜리키, 등록, 수정, 삭제가 가능하며  주인이 아닌  경우 읽기만 가능하다. 

    Food Entity가 FK의 주인인 경우
    
    @OneToOne
    @JoinColumn (name="user_id")   // 상대 엔티티(user)의 id 라서 user_id로 명명
    private User user;

     

    @JoinColumn() 

    - 외래키의 주인이 활용하는 애너테이션이다.

    - 컬럼 명, null 여부, 유니크 여부 등을 지정할 수 있다.

     

     

     

     

    양방향관계

    양방향관계는 서로 엔티티를 가지고 있다.

    그래서 @JoinColumn이 달려있는 쪽이 주인이라고 우리는 "유추"가능하지만

    JPA는 "유추"를 할 수 없기 때문에  FK의 주인이 누구인지 확실하게 알려줘야한다.

     

    그래서 우리는 mapped by라는 옵션을 사용하여 FK의 주인이 누구인지 알려준다

     

    @OneToOne(mappedBy="user")   
    private Food food;
    
    
    // mappedBy의 user는 User 클래스를 의미하는게 아니라  Food 엔티티에 있는 user를 의미한다.

     

    mappedBy의 속성값은 FK의 주인 엔티티에 있는 필드명을 의미한다. 

    절대 mappedBy를 적는 클래스의 해당 클래스명을 적는것이 아니다!

     

     

     

    그리고 1대1 관계에서는 @JoinColumn을 생략가능하다.

    생략하더라도 디폴트옵션이 적용되기 때문.

    그러나 1대다 관계에서는 생략할 경우 JPA가 FK를 저장할 컬럼을 파악할 수 없어서 중간테이블을 생성해버린다.

    그렇기 때문에 1대1에서도 생략하지 않고 써주는것이 좋다.

     

     

     

     

    '스파르타 강의 정리' 카테고리의 다른 글

    스프링 2주차 복습  (1) 2023.11.14
    스프링 1주차 복습  (0) 2023.11.13
    회원가입 구현 및 Filter  (0) 2023.11.08
    3-5, 3-6 JWT  (0) 2023.11.07
    3-3, 3-4 인증과 인가 / 쿠키와 세션  (0) 2023.11.07
Designed by Tistory.