mappedBy를 사용하지 않고 조인을 할 수도 있습니다. mappedBy를 사용하지 않는 경우, 양방향 관계가 아닌 단방향 관계가 됩니다. 이 경우, 한 엔티티에서만 다른 엔티티를 참조하게 됩니다.
예를 들어, Post와 Comment 엔티티가 있고, 각 Comment는 한 Post에 속할 수 있다고 가정해 보겠습니다. 이 경우 Post 엔티티에서 Comment 엔티티를 참조하는 단방향 관계를 생성할 수 있습니다.
위의 코드에서 @OneToMany 어노테이션과 함께 @JoinColumn 어노테이션을 사용하여 Post와 Comment 엔티티 사이의 단방향 관계를 정의하고 있습니다. 이렇게 하면, Post 엔티티에서 Comment 엔티티로의 참조는 가능하지만, Comment 엔티티에서 Post 엔티티로의 참조는 불가능합니다.
단방향 관계는 간단하고 명확하지만, 양방향 관계에서처럼 엔티티 간의 참조가 양쪽으로 이루어지지 않아 일부 상황에서 불편할 수 있습니다. 따라서 도메인 모델과 애플리케이션의 요구 사항을 고려하여 양방향 관계를 사용할지 단방향 관계를 사용할지 결정해야 합니다.
위 답변에서 언급한 단방향 관계에서는 Comment 엔티티에서 Post 엔티티로의 참조가 불가능하다는 의미입니다. 그러나 이는 Comment 엔티티 내에서 Post 엔티티에 직접적으로 접근할 수 없음을 의미하며, CommentRepository를 사용하여 간접적으로 Post 엔티티를 찾는 것은 여전히 가능합니다.
예를 들어, Comment 엔티티의 특정 조건에 해당하는 Post 엔티티를 찾고 싶다면, CommentRepository에서 쿼리 메소드를 정의하여 이를 수행할 수 있습니다.
의 코드에서 CommentRepository는 findByPostTitle이라는 쿼리 메소드를 정의하고 있으며, 이 메소드를 사용하면 Post 엔티티의 제목이 특정 조건을 만족하는 Comment 엔티티를 찾을 수 있습니다.
따라서, CommentRepository를 통해 간접적으로 Post 엔티티를 찾는 것은 가능합니다. 그러나 이러한 방식은 Comment와 Post 사이의 직접적인 연결이 없기 때문에 불편할 수 있으며, 이 경우에는 양방향 관계를 사용하는 것이 더 효율적일 수 있습니다.
@JoinColumn(name = "post_id")를 사용하는 이유는 Post 엔티티와 Comment 엔티티 간의 관계를 나타내기 위해 Comment 테이블에 외래키를 생성하려고 합니다. 이 경우, 외래키 컬럼의 이름을 post_id로 지정하고 있습니다.
@OneToMany 관계에서 @JoinColumn 어노테이션을 사용하면, 다음과 같은 결과를 얻을 수 있습니다.
Post 테이블과 Comment 테이블이 생성되며, Comment 테이블에는 post_id라는 외래키 컬럼이 생성됩니다.
외래키 컬럼 post_id는 Post 테이블의 id 컬럼을 참조합니다.
이렇게 설정하면, Post 엔티티에서 해당 Post에 속하는 Comment 엔티티들을 참조할 수 있습니다.
즉, @JoinColumn(name = "post_id")는 Comment 테이블에서 Post 테이블을 참조하는 외래키 컬럼의 이름을 지정하는 것입니다. 이렇게 함으로써 Post 엔티티와 Comment 엔티티 사이의 관계가 설정되며, 연관된 엔티티들을 쉽게 참조할 수 있습니다.
반적으로 @JoinColumn 어노테이션은 다대일 관계에서 참조하는 엔티티의 필드 위에 작성합니다. 이렇게 하면 외래키 컬럼이 해당 엔티티의 테이블에 생성됩니다.
예를 들어, Comment 엔티티에 Post를 참조하는 필드가 있을 때 @JoinColumn을 사용하는 것이 일반적입니다:
하지만 Post 엔티티에서 @OneToMany와 함께 @JoinColumn을 사용하면, Post 엔티티와 Comment 엔티티 사이의 관계를 설정하는 동시에 Comment 테이블에 외래키 컬럼을 생성하는 효과를 얻을 수 있습니다. 이렇게 하면 양방향 관계가 아닌 단방향 관계를 설정할 수 있습니다.
러나 이 방식은 일반적이지 않고, 보통 Comment 엔티티에 외래키를 생성하도록 작성하는 것이 더 좋은 방법입니다. 이렇게 하면 엔티티 간의 관계 설정이 더 명확하게 표현되고, 단방향 혹은 양방향 관계를 설정하는 데 편리합니다.
Comment 엔티티에서 Post 엔티티를 참조하는 단방향 코드는 다음과 같이 작성할 수 있습니다.
이렇게 수정하면 Comment 엔티티에서 Post 엔티티를 참조하는 단방향 관계가 설정됩니다. 이 경우, @ManyToOne 어노테이션을 사용하여 다대일 관계를 설정하고, @JoinColumn 어노테이션으로 외래키를 지정합니다.
@JoinColumn을 사용하지 않으면 JPA가 기본적으로 중간 테이블을 사용하여 Post와 Comment 엔티티 간의 관계를 관리합니다. 이 중간 테이블은 외래키를 사용하여 각 엔티티를 참조합니다.
@JoinColumn을 사용하지 않은 Post 엔티티는 다음과 같습니다.
이 경우 JPA가 다음과 같은 중간 테이블을 생성합니다.
이렇게 중간 테이블을 사용하면 관계를 관리하는 데 더 많은 작업이 필요하고, 성능상의 이슈가 발생할 수 있습니다. 따라서 @JoinColumn을 사용하여 관계를 직접 설정하는 것이 더 간단하고 효율적인 방법입니다.
그러나 중간 테이블을 사용하는 것이 적합한 상황도 있습니다. 예를 들어, Post와 Comment 엔티티 간의 관계에 추가 정보가 필요한 경우 중간 테이블을 사용하여 이를 처리할 수 있습니다. 이렇게 하면 별도의 엔티티를 사용하여 관계를 관리하는 것이 가능합니다. 하지만 대부분의 경우, @JoinColumn을 사용하여 관계를 설정하는 것이 더 좋은 방법입니다.
OneToMany에 mappedBy="post" 를 써주고 Comment 에는 POST컬럼을 안만들면 이것도 단방향이라고 할수있나?
아니요, mappedBy="post"를 사용하면 양방향 관계가 설정됩니다. mappedBy 속성을 사용하면 해당 필드가 관계의 주인이 아님을 나타냅니다. 이 경우, Comment 엔티티의 post 필드가 관계의 주인이 됩니다.
Post 엔티티에서 @OneToMany(mappedBy="post")를 사용하려면, Comment 엔티티에도 Post를 참조하는 필드를 추가해야 합니다.
이렇게 설정하면, Post 엔티티와 Comment 엔티티 사이에 양방향 관계가 설정됩니다. 이 경우, Comment 엔티티의 post 필드가 관계의 주인이며, 외래키를 관리합니다.
따라서 @OneToMany(mappedBy="post")를 사용하면 단방향 관계가 아닌 양방향 관계가 설정되며, 이를 통해 Post와 Comment 엔티티 간의 상호 참조가 가능합니다.
'Spring' 카테고리의 다른 글
List<OrderInfo> findAllByMember_MemberIdOrderByOrderDateDesc(Long memberId); (0) | 2023.04.26 |
---|---|
@OneToMany(mappedBy = (0) | 2023.04.26 |
CascadeType.DETACH (0) | 2023.04.26 |
CascadeType.REFRESH (0) | 2023.04.26 |
CascadeType.PERSIST와 CascadeType.MERGE 차이 (0) | 2023.04.26 |