3주차 실습을 진행하며 다음과 같이 Board Entity를 만들고 Member Entity와 연관관계도 매핑했다. 그런데 연관관계를 매핑하는 부분에서 의문점이 생겼다.
@Entity
@Table(name = "board")
public class Board extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(columnDefinition = "longtext")
private String contents;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
}
나는 Memebr Entity를 구현하면서 아이디(PK) 필드명을 member_id
가 아닌 id
로 했기 때문에 @JoinColumn(name = "member_id")
이 부분에서 내가 강의를 보며 빠뜨린 부분이 있나 싶었다.
결론부터 말하자면 제대로 적은 것이 맞다.
찾아보니 @JoinColumn(name = "member_id")
의 name
속성은 외래 키 컬럼의 이름을 지정하는 것이어서 반드시 Member Entity의 아이디 필드명과 같을 필요가 없다는 것을 알게 되었다.
JPA는 Member Entity의 기본 키(PK)값을 찾아서 매핑해준다. 따라서 필드명이 member_id이든, id이든, userId이든 상관없이 찾아준다는 것이다.
강의를 참고해 비밀번호 수정 기능을 구현하면서 왜 Setter를 사용하지않고 다음과 같이 굳이 updatePassword()
메서드를 만들어 수정하는지 궁금했다.
public void updatePassword(String password) {
this.password = password;
}
Member 엔티티에서 아래와 같이 @Setter
를 password 필드 위에 추가하면 안되는 것일까?
@Setter
@Column(nullable = false)
private String password;
찾아보니 Setter의 사용을 지양하는 이유는 여러가지가 있었다.
setPassword()
만으로는 이 메서드가 비밀번호를 처음 저장하는 용도인지, 변경하는 용도인지 알 수 없다. 또한, 비밀번호 변경 시 기존 비밀번호 검증 같은 추가 로직이 필요할 수도 있다. 따라서, updatePassword()
처럼 역할이 명확한 메서드를 제공하는 것이 더 바람직하다.
오늘은 3주차 강의 실습에 모든 시간을 쏟아부었다...🫠 아침에 세운 공부 계획을 다 완수하기가 어렵다. 어떻게 하면 더 효율적으로 공부할 수 있을지 고민이다.