[우아한테크캠프pro] 2주차 미션 후기 및 코드리뷰 정리 (JPA)
👉 저장소 링크
https://github.com/jennie267/jwp-qna
👉 코드리뷰 링크
✔ 후기
JPA 미션. 아직 극악이라는 리팩토링 미션에 들어가기도 전에 나를 멘붕케했던 미션.. (근데 그 뒤 미션들도 계속 JPA로 진행된다. ㅎㅎ 3주차부터는 JPA는 기본으로 깔고 미션진행! 그니까 2주차 JPA미션은 정말 맛보기였고 별거아니었다...)
JPA를 사용해야하는데 써본적은 없고! 시간은 없고! 미션은 해야하고!
정말 이것저것 잡다한 오류를 많이 만난 미션이었다. 예를 들면, 무한루프와 ConcurrentModificationException의 늪에 빠졌다던가..... 😫
구글링을 제일 많이했던 미션이었다. 그때 그때 필요한거 구글링해서 개념을 깨우치고 (깊게 깨우칠시간도없다) 바로 적용해보고 또 다음꺼 구글링해서 개념 깨우쳐서 적용하고 의 반복 😂
다른 미션들은 설계와 개발에대한 고민을 많이했다면 JPA미션은 미션내내 새로움의 연속? 근데 재밌고 편했다 JPA....
우테캠 끝나기만해봐라 내가 이거 깊게 공부할거야ㅠㅠ라고 다짐했는데 바빠서 아직 책을 펴보지도 못했다. 어떻게 이렇게 우테캠 끝나자마자 얕게 알게된 지식들은 금방 날아가버리는지..
2022년은 우테캠에서 배운걸 내껄로 만드는 한해로 보내야겠다.
개인적으로 회사소스에 JPA를 도입하고싶은데, 회사 시스템이 JPA는 커녕 Mybatis로조차 되어있지않아서.. 모든 화면과 1대1 매핑되는 DTO로 움직인다. 그래서 최근에 혼자서 프로토타입으로 하나 잡고 엔티티로 바꿔보는데 우리 시스템이 너무 크고 DB 설계도 엔티티에 적합하지않다보니 잘 안된다..
조금씩 조금씩 모듈화해서 JPA를 도입하고싶다. 💪
✔ 목표
- JPA를 알아보자
- 양방향 연관관계로 객체를 만들지 않기 (순환참조 조심)
- 서비스를 만들어가면서 JPA로 실제 도메인 모델을 어떻게 구성하고 객체와 테이블을 어떻게 매핑해야 하는지 깨우치기
✔ 노력한 점
- 적절한 역할과 책임
- indent depth 2를 넘지 않도록 구현한다. 1까지만 허용 (예를 들어 while문 안에 if문이 있으면 indent depth 2)
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다
- 함수(메서드) 길이는 10라인이 넘어가지 않도록 구현한다
- 객체지향 생활 체조 원칙 지키기
- 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만 한다.
- 규칙 2: else 예약어를 쓰지 않는다.
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 5: 줄여쓰지 않는다(축약 금지).
- 규칙 8: 일급 콜렉션을 쓴다.
✔ 배운 점
1. 엔티티 생성자 Protected로 설정
엔티티의 생성자는 protected로!
@Lob (Large Object) - BLOB, CLOB 타입을 사용할때 매핑
중복 Entity가 있으면 하나로 묶어서 중복 코드를 제거하는게 좋다. 생성시간, 수정시간같은 엔티티들에서 많이 사용하는것은 묶어주는게 좋은듯?
기존 소스를 수정시에는 불필요한 소스가 남지않도록 꼼꼼히 정리하자 !!
@Enumerated - 자바 Enum 타입을 사용할때 지정한다.
- EnumType.STRING : Enum 이름을 DB에 저장한다
- EnumType.ORDINAL : Enum 순서 값을 DB에 저장한다
@CreatedDate : 스프링 프레임워크 제공
@CreationTimestamp : 하이버네이트 제공
김영한님은 @CreatedDate를 더 선호하신다고.. (기능상 크게 차이가 없고 하이버네이트 애노테이션을 점점 사용하지 않는 추세라고한다)
아무 생각없이 toString을 사용했다.. 이 리뷰로 이 다음미션부터는 toString을 사용할때 늘 생각하고 필요한것만 toString에 넣어주었다.
JPA를 사용해본적이 없다보니 기본전략도 몰랐다. FetchType.LAZY를 지정해야 불필요한 로딩을 막을 수 있다.
final 잊지말자.
적절한 책임은 우테캠 미션 기간내내 고민했던건데 리팩토링을 하다보면 그 책임이 이동되기때문에 수정해줘야하는걸 놓치기쉽다. 조심해야지
이부분은 디미터 법칙(Law of Demeter)에서도 말하는 부분인데..! Don't Talk To Strangers.
Collections.unmodifiableList();를 사용하면 불변객체로 만들수있다.
이 뒤로도 계속 테스트 코드를 짜다보니까 이제는 너무나도 당연해진 given when then 패턴.
초반에는 테스트 코드 자체도 낯설다보니 익숙치않았다
cascade, 고아객체는 나중에 따로 공부해서 포스팅해야겠다. 이부분에대해 초반에 잘모르다보니 시행착오를 많이 겪었다.
리뷰어님이 추천해주신 책과 강의 😎
[책] 자바 ORM 표준 JPA 프로그래밍 => 바로 샀당ㅎㅎㅎㅎㅎㅎㅎ
[인프런] 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의