미션3에 대한 기억이 벌써 기억이 휘발됐다.. 마지막 미션 회고는 미리미리 쓰자 💦
👥 페어 프로그래밍
미션3에서는 처음 만나는 크루였던 부기와 페어가 됐다! 부기는 JPA를 잘 사용할 줄 아는 크루였고, 부기 덕분에 헤매지 않고 빠르게 배울 수 있었다.
부기는 호기심이 많은 크루였다. 이번 미션에 롬복을 적용했는데, 롬복 라이브러리를 뜯어보면서 어떤 애노테이션이 있는지 직접 확인하고 적용하기도 했다.
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Reservation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@EqualsAndHashCode.Include
private Long id;
이런 애노테이션을 붙이면 id만 이용해서 equals()와 hashcode()를 구현해준다!
부기한테 미안했던게.. 데블스플랜을 보느라 잠을 조금밖에 못 잔 날이 있었는데, 이 날 머리가 너무 안 돌아가는 느낌이었다. 협업 할 때는 잠도 잘 자야 한다는 것을 깨달았고, 이 경험을 기반으로 미션4 페어 주간에는 수면시간을 충분히 확보하려고 노력했다.
테코톡 준비와 겹쳐서 많이 피곤했을텐데 페어 프로그래밍에 끝까지 최선을 다해준 부기에게 감사함을 전하고 싶다. 👏
📚 JPA
미션3에서 배운 가장 거대한 키워드는 JPA이다. (처음 배우는거라 겁 많이 먹었었다..)
이전 미션에서는 db에 데이터를 저장하기 위해 직접 쿼리를 작성하고 자바 객체를 어떻게 db 테이블에 저장할지, 혹은 db에서 얻어온 데이터를 어떻게 자바 객체로 만들어줄건지 직접 정의했다. 그런데 JPA를 사용하니까 객체에만 집중할 수 있었다. 객체를 어떻게 저장하고 가져오는지는 JPA 기술에 맡기고, 나는 자바 객체만 신경쓰면 된다! 👍
Spring Data JPA를 도입하니 DAO가 아주 깔끔하게 사라지는 것을 보고 놀라웠다. 게다가 update를 명시적으로 처리해주지 않아도, Dirty Checking에 의해 자동으로 update 쿼리가 날아가 db에 반영된다는 것을 알게 됐을때 너무너무 신기했다..
편리함을 제공하는 기술인만큼 잘 알고 사용해야겠다는 생각이 들었다.
✏️ 영속성 컨텍스트
엔티티의 영속성을 영속성 컨텍스트에서 관리한다. 영속, 준영속, 비영속, 삭제 상태로 존재할 수 있다.
..
이것에 대해서는. .. 추가적인 게시물을 작성하도록 하겠습니다 🕺🏿
✏️ Mockito
미션2에서는 Dao를 fake로 구현해 service를 테스트했다. 그런데 JPA를 도입하고 Service는 JpaRepository를 확장한 repository 인터페이스에 의존하게 됐고, 이를 대체하기 위해 Mockito를 사용했다.
Mockito를 사용하니 원하는 Service 로직을 쉽게 테스트할 수 있었다. repository를 Mock 객체로 만들고, 테스트하길 원하는 기능에서 사용하는 메서드만 given()으로 stubing했다. 이렇게 하니 의존하는 부분에 대해 결과를 원하는대로 조작할 수 있어서 편했다.
아직 테스트 대역에 대해 아직 잘 몰라서 헤매긴 했지만, 페어였던 부기가 사용법을 잘 알고 있어서 빠르게 배울 수 있었다.
Mockito는 단위 테스트를 훨씬 수월하게 만들어주는 좋은 라이브러리였다!
✏️ 테스트 가독성
테스트에서 반복적으로 stubbing해주는 코드가 있었고, 단순히 중복코드 줄여야지~ 라는 생각으로, @BeforeEach에서 stubbing 해주도록 했다. 그런데 아래와 같은 리뷰를 받았다.

테스트 메서드만 보고도 세계관을 파악할 수 있어야 한다는 것을 이제서야 인지할 수 있었다... 테스트 메서드 흐름을 파악하기 위해 beforeEach까지 타고 올라가야 한다는 것은 확실히 개선이 필요한 부분이었다.
그리고 mock 객체를 처음에만 만들고 재사용하고 있었는데, 테스트간 같은 mock 객체를 공유하면 원치 않았던 구현이 존재할 수도 있다.
그래서 @BeforeEach에서는 mock 객체를 생성하고, 각 메서드 내에서 stubbing해주도록 수정했다. -> 이후 step2에서는 매번 mock객체를 생성하지 않고 초기화하는 방법을 사용했다.
✏️ 스프링 테스트
지금까지 단위 테스트에 Junit, Assertj만 이용했었는데, 각 계층을 단위 테스트하기 위한 다양한 방법들을 적용해봤다. 이번에 사용했던 @DataJpaTest와 @WebMvcTest는 각 계층을 단위 테스트하는데 필요한 빈만 띄울 수 있는 유용한 방법들이다.
- @DataJpaTest
- Jpa와 관련된 persistance layer(repository)를 테스트할 때 사용한다.
- Jpa와 관련된 빈들(@Entity, dataSource, @Repository, entity manager 등)을 띄운다.
- @WebMvcTest
- web layer(controller)를 테스트할 때 사용한다.
- MockMvc와 함께 사용해서, 실제가 아닌 http요청, 응답을 기반으로 DispatcherServlet의 동작을 구현하기에, 컨텍스트를 띄우지 않는다.
- @ControllerAdvice, @Controller … 까지만 올라가고 @Service 등은 올라가지 않는다. 요청 / 응답에 대한 테스트를 하고싶을 때 사용한다
원래 controller 테스트도 RestAssured 대충 복사해서 사용했었는데, 확실히 속도가 많이 빨라졌다는 것을 느낄 수 있었다!
✏️ 예약 대기 설계
step2에서는 웨이팅 기능이 추가됐다. 처음에는 Waiting이 Reservation을 갖고 있도록 했는데, 예약과 웨이팅은 각각 독립적인 도메인 로직이 충분히 생길 수 있다고 생각해서 분리했다.
그리고 예약과 웨이팅은 모두 (날짜, 시간, 테마)를 기준으로 생성되기에, Schedule이라는 엔티티로 뺐다. VO로 만드는게 맞는지 고민했는데, 독자적인 생명 주기를 가진다고 결론을 내려서 엔티티로 유지했다. (현재 이런 기능은 존재하지 않지만) 관리자가 원하는 스케줄을 열어두고, 사용자들은 열려있는 스케줄에 대해 예약을 할 수 있어야 한다고 생각했다.
그리고 예약 대기 순번을 위해 Waiting에는 createdAt 필드를 추가했다. 원래 rank를 갖고있도록 하고 예약 혹은 앞 대기가 삭제될 때마다 update해줬었다. 이 방법을 쓰면 조회에 용이하긴 하지만 rank를 관리하는 것에 대한 유지보수 비용이 크다 생각해서, createdAt으로 조회할때마다 순번을 계산하도록 수정했다.
step2에서 기술보다 설계에 대한 고민을 가장 많이 했던 것 같다. 나는 내 생각에 대한 확신이 부족해서 주변에 휘둘리곤 했기에, 이번 미션만큼은 혼자 고민하려 했다. 처음부터 끝까지 혼자 고민하니까 토론 시간에 좀 더 내 의견을 확실히 말할 수 있었다.

☘️ 포비와의 원온원
미션3부터는 데일리 회고도 작성하지 않았더니 정말 기억이 안 난다.. 그래서 포비와 원온원을 통해 얻은 내용을 살짝 정리해보고자 한다.
- 나는 항상 정답이 있는 환경에 익숙하고, 거기서 잘 해왔다.
- 내가 우테코 와서 혼란스러운 이유는? 정답이 없는 곳이기 때문에 + 알아서 성장해야 하는 곳이기 때문에
- 그런데 사실 사회는 진짜로 정답이 없다.
- 그런 곳에서 살아남으려면? 나 자신을 믿기는 힘 기르기. 우테코는 그걸 연습하는 곳.
- 나를 어떻게 믿을 수 있을까?
- 다른 사람들과 다른 길을 걸어보고 달라도 괜찮다는걸 느끼기.
- 우테코 끝날 때, 달라도 괜찮다는 마인드셋을 갖고 졸업하자.
- 갈림길에 섰을 때, 메이라면 어떻게 했을까? 질문을 던져보자.
🌙 회고 마무리
미션3 기간동안은 칼퇴도 많이 하고 데블스플랜도 열심히 보고.. 많이 풀어졌던 것 같다. 뭘 배웠는지 이렇게 안 떠오를 수가....
멍구, 포라랑 초코하임 대결도 했다. 호기롭게 3박스씩 샀는데 1박스도 못 비워서 자존심 상한다... 아직 두박스 남았으니 누구나 저를 찾아오시면 초코하임 무료나눔 해드립니다 🤙🏽

반성하고 남은 레벨2 기간동안 최대한 열심히 해봐야겠다. JPA도 더 공부하고.. 빵꾸난 지식 방학동안 열심히 채워야지 ㅜㅜ
'우아한테크코스 7기 > 레벨2' 카테고리의 다른 글
| [우아한테크코스 7기] 레벨2 회고 (4) | 2025.06.21 |
|---|---|
| [우아한테크코스 7기] 레벨2 미션4(방탈출 결제 / 배포) 회고 (6) | 2025.06.16 |
| [우아한테크코스 7기] 레벨2 미션2(방탈출 사용자 예) 회고 (7) | 2025.05.19 |
| [우아한테크코스 7기] 레벨2 미션1(방탈출 예약 관리) 회고 (2) | 2025.05.04 |