반응형

우선, JPA의 관계 매핑을 알아보기 전에 객체의 연관 관계와 테이블의 연관 관계의 차이를 알아봅시다.

 

테이블 : 외래키로 조인하여 연관된 테이블을 찾습니다.

객체 : 객체를 참조하여 연관된 객체를 찾습니다.

 

테이블은 조인을 통해 양방향 연관 관계 설정이 가능하지만 객체에는 양방향 연관 관계 설정이 없으므로 다른 두 객체에 각각 단방향 연관 관계를 설정해야 합니다.

 

게시판 예제를 통해 확인해봅시다.

 

Article

@Entity
public class Article {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String title;
    
    private String content;

    ...
}

Member

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String memberId;

    private String memberPass;
    
    ...
}

 

게시판 객체와 회원 객체가 있을 때 게시판 객체에서는 회원 정보를 얻고 반대로 회원 객체에서는 회원이 작성한 모든 글을 가지고 오고 싶습니다.

 

@ManyToOne과 OneToMany

두 객체를 연결하기 위해 Article 객체 필드에 Member 객체를 만들었고, Member 객체 필드에는 List 타입의 Articles라는 필드를 만든 후 각각 @ManyToOne과 @OneToMany를 붙여줬습니다.

 

@ManyToOne : 다대일, 한 명의 회원이 여러 게시글을 작성할 수 있으므로 게시글(Article) 기준으로 @ManyToOne을 선언합니다.

@OneToMany : 일대다, 회원 한 명이 게시글을 여러 개 작성할 수 있으므로 회원(Member) 기준으로 @OneToMany를 선언합니다.

 

@Entity
public class Article {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String title;
    
    private String content;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    ...
}


@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String memberId;

    private String memberPass;
    
    @OneToMany(mappedby = "member")
    private List<Article> articles = new ArrayList<Article>();
    
    ...
}

 

@ManyToOne(fetch = FetchType.LAZY) : fetch로 로딩 전략을 설정합니다. FetchType.LAZY는 지연 로딩을 의미합니다.

@OneToMany(mappedby = "member") : 일대다 관계를 연결할 상대 객체의 @JoinColumn이 선언된 필드값을 적습니다.

 

mappedby란?

JPA로 연관 관계를 설정할 때 가장 혼동하기 쉬운 부분인데 mappedby는 연관 관계 객체의 반대 객체에 선언합니다.

 

연관 관계 주인 : 외래키가 있는 객체

* 예시에서는 외래키가 Article에 있으므로 Article이 연관 관계의 주인

 

즉, 위 예시에서는 Article과 Member 중에서 Article이 외래키 member_id 라는 컬럼에 해당하는 member를 갖고 있으므로 Article이 연관 관계의 주인입니다.

 

따라서 연관 관계 주인 Article과 연관 관계로 설정된 Member 객체의 articles 필드 위 @OneToMany 안에 (mappedby를 넣고 연관 관계 주인 객체의 연결 필드명 "member"를 넣어주시면 됩니다.

 

처음 해보시면 되게 혼란스러우실 수 있는데 우리나라 JPA 최고 권위자이신 김영한 선생님의 강의 영상 첨부하니 확인해보세요!

 

반응형

'Java Web > JPA' 카테고리의 다른 글

[JPA] persistence.xml 작성 예시  (0) 2022.03.02
[JPA] 연관 관계 편의 메소드  (0) 2022.02.28
[JPA] Auditing 정리  (0) 2022.02.14
[JPA] findAll 정렬  (0) 2021.07.23
[JPA] JPA란?  (0) 2021.05.13

+ Recent posts