ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @OneToMany와 @ManyToOne으로 Entity 객체가 서로를 볼 수 있게 하기
    카테고리 없음 2022. 10. 31. 20:54


    이틀 전에 til로 작성했던 JPA 환경 하에서 @ManyToMany 관계를 갖는 모델 정의를 지양하게 됨에 따라 객체 간의 관계를 나타내기 위해 간단하게만 살펴보았던 @OneToMany, @ManyToOne 사용법을 다시 살펴보게 되었다.

    @OneToMany와 @ManyToOne은 Entity 객체들끼리 서로의 개별 id를 통해 서로의 인스턴스를 참조할 수 있게 하는 어노테이션이다. 한 쪽 객체에서 @OneToMany나 @ManyToOne 어노테이션만을 부여하여 한쪽에서만 반대편을 참조할 수 있는 단방향 참조가 있고, 두 객체가 @OneToMany와 @ManyToOne으로 서로를 바라볼 수 있는 양방향 참조가 있다.

     

    @ManyToOne (단방향)

    @ManyToOne이 선언되는 Entity 객체 여럿이 다른 하나의 Entity 객체를 참조해야 할 때 부여하는 어노테이션이다. 즉 자기자신이 여럿 있고 하나의 상대방 객체에게 종속되야 할 때 사용된다.

    자신이 바라볼 Entity 객체를 멤버로 선언하고 @ManyToOne과 함께 @JoinColumn(name = "컬럼명")을 붙인다. 새로운 컬럼은 자신의 Entity 객체의 테이블에 생성된다. 컬럼명은 보통 바라보는 Entity 객체의 id를 나타내는 명칭을 사용한다. 바라보는 Entity 객체의 id 값을 갖는 인스턴스를 멤버 변수에 부여할 수 있다. 바라봐지는 대상 Entity에는 별다른 소스코드는 작성하지 않는다.

    다음 예시는 다수의 게시글이 하나의 사용자 필드를 바라보는 경우를 나타낸 것이다.

     


    구성될 데이터 필드는 다음과 같다.

     

    이름이 미묘하게 다르다.


    Service Layer에서 다음의 메서드를 실행하고, Controller로 반환되는 List<Post>를 오버라이딩한 toString으로 각각 변환하여 콘솔에 내용을 출력하도록 했다.

     

    결과는 다음과 같다.

     

     

    @OneToMany (단방향)

    @OneToMany는 @ManyToOne과는 반대로 Entity 객체 '단 하나'가 Entity 객체 인스턴스 여럿을 참조해야 할 때 부여하는 어노테이션이다. 즉 상대방 객체 인스턴스 여럿이 자기자신 하나에게 종속되야 할 때 사용된다.

    자신이 바라볼 Entity 객체를 컬렉션 멤버로 선언하고 @ManyToOne과 함께 @JoinColumn(name = "컬럼명")을 붙인다. 이때 새로운 컬럼은 바라보는 Entity 객체의 테이블에 생성된다. 바라보는 Entity 객체 쪽에서 자신의 id 값을 갖는 인스턴스들은 모두 자신의 컬렉션 객체의 멤버에 포함된다. 마찬가지로 바라봐지는 대상 Entity에는 별다른 소스코드는 작성하지 않는다.

    다음 예시는 사용자 한 명이 여러 게시글에 참가하는 (사용자 한 명이 여러 게시글들을 바라보는) 경우를 나타낸 것이다.

     


    데이터 필드는 @ManyToOne의 예시와 동일한 필드를 사용했다.

    마찬가지로 Service Layer에서 다음의 메서드를 실행하고, Controller로 반환되는 List<User>를 오버라이딩한 toString으로 각각 변환하여 콘솔에 내용을 출력하도록 했다.

     

    결과는 다음과 같다.

     

     

    양방향 @OneToMany, @ManyToOne

    두 객체가 @OneToMany와 @ManyToOne으로 서로를 바라볼 수 있다. 한쪽에만 @OneToMany나 @ManyToOne이 있는 경우에는 어노테이션이 달린 쪽에서만 상대 Entity를 알 수 있었지만, 양방향 참조의 경우에는 서로가 서로를 참조할 수 있다. 이때 @OneToMany 어노테이션에는 (mappedBy = "@ManyToOne이 붙은 필드명")을 붙여주도록 한다.

    다음의 예시와 같이 사용자가 자신이 작성한 게시글들을 참조하고 있고, 여러 게시글들이 작성자로 특정 사용자를 참조하고 있는 경우를 생각해볼 수 있다.

     


    테이블 구조가 다음과 같이 살짝 변경되었다.

     


    Service Layer에서 호출하는 메서드는 단방향 @OneToMany, @ManyToOne에서 사용하는 메서드와 동일하다. 마찬가지로 콘솔에 내용을 각각 출력하도록 했다.

    findAllUsers()를 실행한 결과는 다음과 같다.

     


    findAllPosts()를 실행한 결과는 다음과 같다.

     

     

     

     

     

    Process

    - https://www.notion.so/JPA-a4670c1e8c5f411ab02cd07c6e17e60e

    References

    - https://soojong.tistory.com/entry/JPA-ManyToOne-OneToMany-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
    - https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rorean&logNo=221592394228

     

     

     

     

    댓글

Designed by Tistory.