Hibernate/JPA(EntityManager)

[Spring Data JPA] 연관관계 매핑 LeftJOIN / InnerJOIN , @ManyToOne / @OneToOne , 단방향 / 양방향

유혁스쿨 2022. 11. 18. 00:28
728x90
반응형

Master : board (PK - id / FK - userid)

Detail : member (PK - id)

board 테이블의 userid컬럼은 member테이블의 id 컬럼을 참조합니다.

 

아래와 같이 Entity 클래스를 구현합니다.

@Entity
@Table(name="board")
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    @Column
    private String content;

    /* Join - member Entity의 userid와 연결되어있다.
    * member테이블과 함께 조회할때 사용.
    * 어떤 회원이 쓴 게시글인지 확인하기 위해서 사용. */
    @ManyToOne
    @JoinColumn(name="userid") //fk userid이다 Member테이블의 id를 참조한다.
    private Member member;

    public Member getMember() { //핵심
        return member;
    }
    // ...이하 setter/getter 및 toString 생략
}
@Entity
@Table(name="member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // 아이디를 디비에서 자동으로 만들어주는 전략을 설정한다.
    private String name;
    private String phone;
    private String email;
    private String address;
    // ...이하 setter/getter 및 toString 생략
}

 

 

LEFT JOIN

핵심코드는 아래와 같습니다.

    @ManyToOne
    @JoinColumn(name="userid") //fk userid이다 Member테이블의 id를 참조한다.
    private Member member;

    public Member getMember() { //핵심
        return member;
    }

member 엔티티로부터 다대일 관계를 갖도록 지정해주고 (다시말해 board엔티티로 부터 member엔티티는 일대다관계)

조인컬럼을 설정한 후 엔티티객체의 getter를 선언하면 자동으로 LeftOuterJoin이 실행됩니다.

 

왜 다대일인지 설명하겠습니다.

한명의 회원 id로 작성된 여러개의 게시글이 존재할수 있습니다.

한명의 Member는 여러개의 Board를 갖는다 라고 정의할 수 있으며,

따라서 Member 입장에서 봤을 때 한명의 회원은 여러개의 게시글을 갖게되는 일대 다 관계가 되며,

역으로 Board입장에서 본다면 한명의 회원에 속하게 되므로 다대일 관계 - Many to one이 됩니다.

 

INNER JOIN

@ManyToOne(option = false)

위와 같이 @ManyToOne Annotation의 option속성을 false로 설정한다면, member가 null인 값을 허용하지 않게된다.

그 결과는 innerJoin이고 콘솔창에 출력되는 쿼리문의 LeftOuterJoin이 InnerJoin으로 변경되서 출력된다.

 

추후 정리 예정입니다.

728x90
반응형