본문 바로가기
우아한테크캠프pro

[우아한테크캠프pro] 3주차 미션 JPA 후기, 코드리뷰 (자바 백엔드, NextStep, 우아한형제들, 우테캠pro, 우테캠프로)

by 개발하는 지토 2020. 12. 25.

3주 차 미션 : JPA

저장소 : github.com/jhhj424/jwp-jpa/tree/jhhj424

JPA 1차 리뷰 : github.com/next-step/jwp-jpa/pull/15

JPA 2차 리뷰 : github.com/next-step/jwp-jpa/pull/47

JPA 3차 리뷰 : github.com/next-step/jwp-jpa/pull/63


후기

  • JPA로 엔티티를 매핑할 수 있게 되었다.
  • 지금까지 해왔던 RDB에 맞춘 설계에서 벗어나게 되었다.
  • 처음에는 ManyToMany의 관계를 풀어내는 거나, 요구사항에 맞춘 도메인 설계가 쉽지 않았다.
  • JPA와 친해진 것 같다.

 

이번 과정의 목표

  • JPA 엔티티 매핑
  • JPA 연관 관계 매핑
  • JPA 다대다 연관 관계 리팩터링

내 코드 피드백

BaseEntity는 단독으로 사용하지 않기 때문에 abstract 추상 클래스로 만들었다.

JPA를 사용하면 기본적으로 프록시 객체를 위한 기본 생성자를 필수적으로 가지게 되는데, 이때 접근제어자는 public, protected 중에 지정할 수 있다. 객체 지향적인 설계를 위해서 더 안전한 protected로 선언했다.

지금까지 아무 생각 없이 주석으로 남겨놓은 수많은 코드들이 머릿속을 스쳐 지나간다....

다음부터는 코드 흐름에 도움이 되지 않는 단순한 코드 주석은 지양해야겠다.

JPA 엔티티 매핑을 할 때는 되도록이면 nullable 하지 않는 프리미티브 타입을 사용하자!

적절하게 `빌더 패턴` 과 `정적 팩토리 메서드` 를 활용하여 코드를 작성하면 좋을 것 같다.

!! 정적 팩토리 메서드

 

이전 리뷰어분의 의견&피드백도 들을 수 있었다.

이번 과제 리뷰어 분께는 `빌더 패턴`, `정적 팩토리 메서드`, `플라이 웨이트 패턴` 등을 언급&설명받았다.

복기해서 잊지 말고 앞으로 코드 작성 시 유념해야겠다.

굳이 중복되는 명명은 제거하는 편이 좋을 듯싶다👍

@ManyToMany는 김영한 님의 강의를 들었다면 당연히 사용하지 않는 게 좋다는 건 알고 있을 거다, 학습을 진행하면서 그렇게 배웠지만 직접 사용해보고 느껴보기 위한 시도였는데 리뷰어분께서도 좋은 의도로 바라봐주셔서 감사했다.

다음 리팩터링에서 1:N M:1로 변경했지만 말이다.. ㅎㅎ

 

결론적으로 @ManyToMany는 중간 테이블에 값(필드)을 추가&삭제할 수 없기 때문에 제약사항들이 존재한다.

일반적으로는 일대다, 다대일로 풀어서 사용한다.

코드를 작성하다 보니 또,, 객체지향 생활체조 원칙을 까먹었다!! 잘 지켜보자👊

단순히 중복된다고 생각해서 id를 BaseEntity로 뺐었는데, 생각하지 못한 문제들이 기다리고 있었다 ㅎㅎ

이후에 id값은 각 엔티티에서 어떻게 사용될지 모르기 때문에 각 엔티티에서 선언하도록 변경했다.

유니크 제약 조건이 걸려있는 Station이었는데, 생각하지 않은 사항이었다.

이후에 해당 조건을 catch 하여 exception을 throw 하도록 변경했다.

빌더 패턴을 고려할 수 있는 예시를 제시해주셨다.👍👍

반복되는 코드는, 미리 static메서드로 빼둘 수 도 있고, @BeforeEach 등의 어노테이션을 통해 테스트 코드 실행 전에 미리 실행되도록 공통으로 선언할 수 있을 것 같다.

@OneToOne 관계를 매핑할 때는 기본 fetch 방식이 `즉시 로딩` 방식이기 때문에 `지연 로딩`으로 설정했다.

그 이유는, 단순한 관계들을 가지는 엔티티들이면 크게 상관없겠지만, 추후에라도 복잡해지게 되면 `즉시 로딩` 방식으로는 굉장히 복잡한 쿼리가 나가거나, 성능상 좋지 않게 될 수 있기 때문에, @XXToOne 관계에서는 `지연 로딩` 방식을 선택하는 편이 좋겠다.

단순하게 이전 역만을 생각해서 oldStation이라고 명명했었는데, 생각해보니 지하철은 양방향으로 움직이기 때문에 `이전 역`, `다음 역`을 모두 만족할 수 있는 변수명을 지었어야 했다 😅😅

이것도 위와 같은 관점이었는데, 첫 시작 역은 이전 역이 없다고 생각했었다..(단방향의 지하철을 생각) 

이런! ㅋㅋㅋㅋ 좋은 코드를 작성하는 능력도 중요하지만, 비즈니스 요구사항에 대한 정확한 분석을 전재로 해야 할 것 같다. 좀 더 꼼꼼하게 요구사항을 분석하도록 하자!


끝으로...

이번 3주 차 미션에서는 JPA에 대한 기본적인 내용과 사용법을 익혔다, 사실 다음에 진행하게 될 ATDD(인수 테스트)를 위한 목적성이 있는 미션이라고도 볼 수 있을 것 같다.

 

크게 어려운 미션은 아니었지만, 기존에 JPA를 사용하지 않았던 내 입장에서는 많은 학습을 필요로 하는 일주일이었다.

여러 가지 자료들과, 특히나 인프런의 김영한 님 강의 도움을 많이 받았다.

 

앞으로 JPA에 대해서는 좀 더 많은 내용들에 대해서 학습을 필요로 할 것이다. 꾸준히 그리고 자주 사용&연습하면서 익히도록 해야겠다.

 

그리고 이번 과제 동안은 편안하고 익숙한 것에서 벗어나는 조금의 노력으로 롬복을 사용하지 않았다.

덕분에 빌더 패턴에 대해 더 확실하게 학습할 수 있어서 좋았던 것 같다.

 

가끔은 스스로 컴포트 존을 벗어나기 위해 노력해보는 것도 좋을 듯하다.

 - 리뷰어 JS님께서 얘기 중에 해주셨던 말 - 😉

댓글