[내배캠/30일차] TIL - JPA CRUD 구현

euphony·2025년 2월 7일
0

내일배움캠프

목록 보기
45/66

✅오늘의 한 일

  • 숙련 Spring 3주차 완료
  • 베이직반 8회차 강의(IoC/DI) 듣기
  • 자바 중급 2편 섹션 11 정리

💻오늘의 학습

Spring 숙련 과제 - 일정 관리 앱(develop)

@JoinColumn으로 연관관계 매핑 시 외래 키 이름

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 대신 명확한 도메인 메서드 사용하기

강의를 참고해 비밀번호 수정 기능을 구현하면서 왜 Setter를 사용하지않고 다음과 같이 굳이 updatePassword() 메서드를 만들어 수정하는지 궁금했다.

public void updatePassword(String password) {
    this.password = password;
}

Member 엔티티에서 아래와 같이 @Setter를 password 필드 위에 추가하면 안되는 것일까?

@Setter
@Column(nullable = false)
private String password;

찾아보니 Setter의 사용을 지양하는 이유는 여러가지가 있었다.

  • 값을 변경한 의도를 파악하기 힘들다.
    • 단순히 이름이 setter인 메서드들이 나열되어있다면 어떤 의도로 해당 데이터를 변경하는지 알 수 없다.
  • 객체의 일관성을 유지하기 어렵다.
    • setter를 적용하면 어디서든 값을 변경할 수 있어 위험할 수 있다.
  • 비즈니스 로직을 통제하기 어렵다.
  • 유지보수가 어렵다.

setPassword()만으로는 이 메서드가 비밀번호를 처음 저장하는 용도인지, 변경하는 용도인지 알 수 없다. 또한, 비밀번호 변경 시 기존 비밀번호 검증 같은 추가 로직이 필요할 수도 있다. 따라서, updatePassword()처럼 역할이 명확한 메서드를 제공하는 것이 더 바람직하다.

📝오늘의 회고

오늘은 3주차 강의 실습에 모든 시간을 쏟아부었다...🫠 아침에 세운 공부 계획을 다 완수하기가 어렵다. 어떻게 하면 더 효율적으로 공부할 수 있을지 고민이다.

📌내일의 할 일

  • Spring 숙련 과제
  • 자바 중급 2편 정리 끝내기
  • 베이직반 JPA CRUD 강의 듣기
  • 트러블 슈팅 작성

0개의 댓글

관련 채용 정보