JPA - @JoinColumn, mappedBy
DDD에서 @ManyToOne과 같은 애노테이션으로 외래키를 통해 연관관계를 맺는 것을 지양합니다. 더 상세히 말하면 다른 도메인의 엔티티와 의존 관계를 맺는 것을 지양합니다.
여튼 이런 이유로 인해 위 애노테이션을 잘 찾지 않게 되었습니다. 오랜만에 위 애노테이션에 대해 정리하려고 합니다.
목차
1. @JoinColumn
2. mappedBy 옵션
@JoinColumn
이 애노테이션을 이해하기 위해서는 먼저 알아야할 것들이 있습니다.
1. JPA의 연관관계 애노테이션은 외래키를 통해 테이블을 연결한다.
2. 외래키가 어디에 속할지 명시하지 않으면 연결테이블이 생성될 수도 있다. 예를 들면 @OneToMany만 사용할 경우
2. 외래키를 특정 엔티티에 보관한다면 Many쪽에 보관할 수 밖에 없다.(고민을 조금 해보면 이해하실 내용일 것 같습니다.)
JoinColumn은 즉, Join을 위한, 외래키와 관련된 애노테이션입니다. 다음은 @JoinColumn 애노테이션에 대한 설명입니다.

외래키를 분명하게 명시하는 용도로 사용하는 애노테이션입니다. 해당 애노테이션을 명시하면 아래와 같이 외래키가 설정됩니다.

2번 항목을 설명하며 JoinColumn의 기능을 알아보겠습니다. 단반향 OneToMany를 이용할 경우에는 타겟 엔티티에 외래키가 속하게 된다. 여기서 말하는 타깃 엔티티는 외래키를 보유할 엔티티를 말합니다.

한번 위와 같이 JoinColumn을 생략해보도록 하겠습니다.

외래키인 TEAM 테이블의 기본키가 어떤 테이블에 속하는게 아니라 연결테이블에 속하게 되어버립니다. 그럼 이제 @JoinColumn을 명시해보겠습니다. 단방향 OneToMany의 경우, 타겟 엔티티에 외래키가 속하게 된다고 했습니다.


@JoinColumn 정리하면 테이블을 연결하는 외래키와 관련된 설정을 하는 에노테이션라고 정리할 수 있습니다.
참고로 JoinColumn을 명시해야만 테이블 내부에 외래키가 지정되는 것은 아닙니다. @ManyToOne을 사용할 경우에는 @JoinColumn을 통해 명시하지 않아도 됩니다.
mappedBy

@OneToOne, @OneToMany처럼 연관관계의 주인이 될 수 없는 엔티티에서 사용할 수 있는 애노테이션인데요.
연관관계를 양방향으로 구현할 때 필수 속성입니다.
그럼 mappedBy에 들어가야하는 값은 무엇일까요? 이건 한 번 아무 값이나 줘서 컴파일 에러를 마주하는게 이해하기 가장 쉬운 것 같습니다.
아래와 같이 mappedBy 값을 주고 빌드를 하겠습니다.

타깃 엔티티(Member)에 team123 필드가 존재하지 않는다.


아 이제 조금 알았습니다. 여기서 말하는 필드가 객체의 필드였군요! mappedBy에는 타깃 엔티티 내부에 해당 관계를 소유하고 있는 필드를 명시하면 됩니다.