여러개의 Member 가 Team 에 소속될 수 있도록 설계했습니다.
Member 와 Team 은 다대일 (N:1) 관계이며,
Team 과 Member 는 일대다 (1:N) 관계입니다.
DB에서는 FK 가 다(N) 에 들어가야 합니다. 그래서 Member 안에 team_id(FK) 를 가지고 있죠.
@Entity
@Getter
@Setter //...2
@NoArgsConstructor(access = AccessLevel.PROTECTED) //...3
@ToString(of = {"id", "username", "age"}) //...4
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id") //...1
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
public Member(String username) {
this(username, 0);
}
public Member(String username, int age) {
this(username, age, null);
}
public Member(String username, int age, Team team) {
this.username = username;
this.age = age;
if (team != null) {
changeTeam(team);
}
}
public void changeTeam(Team team) { //...5
this.team = team;
team.getMembers().add(this);
}
}
@Column
@Column(name = "member_id")
으로 Member 객체의 id 를 테이블의 PK인 member_id 와 맵핑했습니다.
이렇게 하는 이유는 객체는 Member 라는 타입이 있어서 필드명을 id로 바로 써도 괜찮지만 테이블은 관리상 member_id 로 사용하는게 좋기 때문입니다.
@Setter 는 실무에서 가급적 Setter는 사용하지 않는게 좋습니다. → 참고
@NoArgsConstructor(access = AccessLevel.PROTECTED)
→ 자세히
@ToString은 가급적 내부 필드만(연관관계 없는 필드만) 적용하는게 좋습니다.
changeTeam()
→ 자세히