우아한테크캠프 Pro 2주차 JPA
미션을 진행한 내용과 후기를 정리해본다.
이번 미션의 목표
- TDD 기반으로 프로그래밍하는 경험
- 메서드 분리 + 클래스를 분리하는 리팩터링 경험
- 점진적으로 리팩토링하는 경험
- 효율적으로 JPA를 사용하는 방법
경험할 객체지향 생활 체조 원칙
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 5: 줄여쓰지 않는다. (축약 금지)
- 규칙 8: 일급 콜렉션을 쓴다.
- 규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.
저장소 및 PR
- 저장소: https://github.com/jsyang-dev/jwp-qna
- 1단계 PR: https://github.com/next-step/jwp-qna/pull/202
- 2단계 PR: https://github.com/next-step/jwp-qna/pull/204
- 3단계 PR: https://github.com/next-step/jwp-qna/pull/236
내 코드 피드백
요구사항의 힌트에 코드가 있었다.
Question question = findQuestionById(questionId);
List<Answer> answers = answerRepository.findByQuestionIdAndDeletedFalse(questionId);
questionId로 answer 리스트를 조회하는 것을 봤을 때 1대다 관계가 맞았다. 미션을 시작하기 전에 요구사항을 꼼꼼히 확인해봐야겠다.
양방향 연관관계를 설정하게 되면 @ToString()
나 직렬화 과정에서 순환 참조로 인한 StackOverFlow에 유의해야 한다.
양방향 연관관계를 설정하게 된다면 연관관계 편의 메서드를 추가해서 양방향 관계가 잘 유지되도록 해야 한다.
양방향 연관관계는 필요시에만 만드는 것이 좋고, 필요에 의해 설정하게 된다면 연관관계 편의 메서드를 상황에 맞게 추가해줘야 한다. (리뷰어님은 연관관계의 주인 쪽에 만드는 것을 추천해주셨다)
요구사항을 명확히 구분해내지 못하다 보니 TDD 과정에서 몇가지 요구사항에 대한 테스트가 누락되었다. 요구사항을 명확히 파악하는 것이 무엇보다도 중요하다.
내가 작성한 코드에는 질문 삭제와 질문 삭제 내역을 별도의 기능으로 제공하고, service에서 삭제 메서드를 호출하고 삭제 내역을 생성해서 저장하도록 구현했었다. 두 가지 기능이 동시에 이루어지는 도메인 기능으로 제공하는 것이 더 안전한 코드인 것 같다.
상태를 갖는 Entity나 Value Object 등은 동등성이 보장되어야 한다. 그러기 위해서는 equals()
와 hashCode()
를 재정의해야 한다.
개발을 하면서 이름을 정하는 일은 항상 어려운 것 같다.
컬렉션을 getter로 반환하게 될 경우 사이트 이펙트를 유의해야 한다. 의도하지 않은 변경이 발생하지 않도록 새로운 컬렉션을 만들어서 반환하거나 불변 컬렉션으로 반환하는 것을 고려해야 될 것 같다.
느낀 점
- JPA에서 연관관계를 설정할 때는 어떤 연관관계를 설정할지, 방향은 어떻게 설정하는 것이 좋을지 고민인 필요하다.(무조건적인 양방향 지양)
- 요구사항을 명확히 파악하고 이를 TDD로 개발하는 것이 생각보다 쉽지 않았다. 지속적인 연습이 필요해 보인다.
- getter를 사용하지 않으려는 노력이 객체지향적인 개발을 하는데 도움이 되는 것을 경험했다.
'우아한테크캠프 Pro' 카테고리의 다른 글
우아한테크캠프 Pro 7주차 미션 후기 (0) | 2021.12.28 |
---|---|
우아한테크캠프 Pro 5주차 미션 후기 (0) | 2021.12.26 |
우아한테크캠프 Pro 4주차 미션 후기 (0) | 2021.12.26 |
우아한테크캠프 Pro 3주차 미션 후기 (0) | 2021.12.26 |
우아한테크캠프 Pro 1주차 미션 후기 (0) | 2021.12.24 |
댓글