우아한 테크 캠프 pro

[우아한테크캠프pro] 2주차 미션 후기 및 코드리뷰 정리 (JPA)

뚜키 💻 2022. 3. 31. 23:40
반응형

[우아한테크캠프pro] 2주차 미션 후기 및 코드리뷰 정리 (JPA)

 

👉 저장소 링크

https://github.com/jennie267/jwp-qna

 

GitHub - jennie267/jwp-qna: QnA 서비스

QnA 서비스. Contribute to jennie267/jwp-qna development by creating an account on GitHub.

github.com

 

👉 코드리뷰 링크

 

✔ 후기

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를 더 선호하신다고.. (기능상 크게 차이가 없고 하이버네이트 애노테이션을 점점 사용하지 않는 추세라고한다)

링크

 

@CreationTimestamp와 @CreatedDate의 선택 - 인프런 | 질문 & 답변

저는 평소에 실무에서 @CreationTimestamp를 썼는데요. 이게 하이버네이트에서 제공하는 건줄도 모르고 그냥 막 사용했는데, 이번에 영한님 강의에서 @CreatedDate를 알게되어 둘을 비교해보니 @CreationTim

www.inflearn.com

 

 

아무 생각없이 toString을 사용했다.. 이 리뷰로 이 다음미션부터는 toString을 사용할때 늘 생각하고 필요한것만 toString에 넣어주었다.

 

 

JPA를 사용해본적이 없다보니 기본전략도 몰랐다. FetchType.LAZY를 지정해야 불필요한 로딩을 막을 수 있다.

 

 

final 잊지말자.

 

적절한 책임은 우테캠 미션 기간내내 고민했던건데 리팩토링을 하다보면 그 책임이 이동되기때문에 수정해줘야하는걸 놓치기쉽다. 조심해야지

 

이부분은 디미터 법칙(Law of Demeter)에서도 말하는 부분인데..! Don't Talk To Strangers.

 

Collections.unmodifiableList();를 사용하면 불변객체로 만들수있다. 

 

이 뒤로도 계속 테스트 코드를 짜다보니까 이제는 너무나도 당연해진 given when then 패턴.

초반에는 테스트 코드 자체도 낯설다보니 익숙치않았다

링크

 

[번역] Given When Then - martin fowler

이 글은 Martin Fowler의 GivenWhenThen 내용을 번역한 글 입니다. Given-When-Then은 SpecificationByExample을 사용한 시스템 행동방식을 구체화한 테스트를 대표하는 스타일이다. (이 방법을 옹호하는 사람이 그

velog.io

 

 

cascade, 고아객체는 나중에 따로 공부해서 포스팅해야겠다. 이부분에대해 초반에 잘모르다보니 시행착오를 많이 겪었다.

 

링크

 

JPA 연관관계 매핑 6. 영속성 전이(CASCADE)와 고아 객체

영속성 전이(CASCADE) 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들 때 사용하는 방법 부모 엔티티를 저장할 때 자식 엔티티를 저장하거나 , 부모 엔티티를 저장할

sun-22.tistory.com

 

 

 


 

리뷰어님이 추천해주신 책과 강의 😎

[책] 자바 ORM 표준 JPA 프로그래밍  => 바로 샀당ㅎㅎㅎㅎㅎㅎㅎ

[인프런] 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의

 

김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵 - 인프런 | 로드맵

[사진][사진] 현역 개발 팀장이 전해주는진짜 실무 노하우. 실무에서 스프링 부트와 JPA를 재대로 알고 사용하는 것은 매우 중요합니다. 조 단위의 거래 금액을 처리하는 주문, 결제, 정산 같은 핵

www.inflearn.com

 

 

 

반응형