[우테코 Lv2] 레벨2 미션3 방탈출 예약 대기 회고

2025. 6. 2. 04:07·후기 or 회고/우아한테크코스

그럼 난 리듬타 ~ 🎶

 

나와 같은 2호선 통학러들을 위한 꿀팁을 공개하겠다. 매일 아침 지나가는 잠실역 2호선 지하에 있는 자판기다. 이걸 볼 때마다 속으로 ✨그럼 전 리듬 탈게요~✨라고 하면 기분이 좋아지는 마법이 있다.  잠실역 지하쇼핑센터 내려가는 계단 옆에 있으니 참고하자 💃

🏃‍♂️ 미션 3: 방탈출 예약 대기

레벨 2 세 번째 미션은 "방탈출 예약 대기"이다. 드디어 그 유명한 JPA를 도입하게 되는, 그런 미션이었다. JPA는 공부하면 할수록 정말 방대한 내용이 뒤에 존재한다고 느껴졌다. 그래서 주변 크루들을 보면 관심을 가지거나 집중해서 공부하는 부분들이 조금씩 달랐던 것 같다.

 

나는 레벨 2 시작할 때 정했던 기준에 따라 공부 방향을 잡았다. 우테코에서 제시하는 자료들과 리뷰어와의 티키타카를 통해 공부의 우선순위를 잡고, 깊게 파보지 못한 부분은 주변 크루들의 도움을 많이 받을 수 있었다. 그래서 2주 동안 아주 많은 것을 배웠다고 느꼈던 미션이었다. 다만, 위에서 썼듯이 JPA는 공부하면 할수록 내용이 방대하다는 느낌이 든다. 방학에 빡 공부해보고 싶은데 가능할는지?!

미션 소개

이번 미션은 별도의 미션 소개글이 없었다.

PR

STEP1: 1단계 ~ 2단계

1단계 - JPA 전환 / 2단계 - 내 예약 목록 조회 기능

페어 하루와 진행했던 1~2단계는 JDBC를 사용하던 기존의 영속성 계층을 JPA로 전환하는 것이 주 과제였다. 기능적으로 새롭게 추가된 것은 많지 않았다. JPA 학습에 집중하라는 의도였던 것 같다.

 

하루, 히포, 머랭과 함께 그룹을 지어 학습 테스트를 공부했다. 가볍게 공부를 하면서 서로 궁금한 점이나 이해가 안 되는 것들을 물어보면서 학습했다. 주어진 시간이 많지 않았기 때문에 딥다이브를 하기보단 학습테스트에 주어진 내용을 미션에 적용할 수 있을 만큼만 학습했다. 이후 리뷰어 로키의 리뷰를 통해 공부해야 할 포인트들을 잡고 공부했다. 또 이 미션에서 강의대장에 참여해 학습테스트를 주제로 잡고 학습테스트 딥다이브도 했다. 아 또 이번 미션에서 하루와 함께 TDD를 했다. 저번 미션에서는 바텀업 방식을 썼고, 이번 미션에서는 탑다운 방식을 쓰면서 두 방식의 차이점을 비교해 볼 수 있었다.

 

STEP2: 3단계 ~ 4단계

3단계 - 예약 대기 기능 / 4단계 - 예약 대기 관리

3~4단계에서 "예약 대기"와 관련된 요구사항을 처리해야 했다. 예약 대기 기능은 이전 미션의 요구사항들과 달리 참고해야 할 테이블 스키마가 주어지지 않았다. 또한 단순히 CRD를 구현하던 이전의 요구사항보다는 약간 더 복잡한 기능을 요구했기 때문에 크루들마다 제각각의 설계를 적용했다.

나 또한 예약 대기 설계에 대해 많은 고민을 했다. 예약 대기 설계 토론 시간에 링크, 리원, 줄리와 함께 토론조가 되어서 각자의 설계에 대해 이야기를 나눴다. 이 토론 시간은 정말 재밌었고, 많이 배울 수 있었던 시간이었다. 나와 같은 설계를 한 크루는 없어서 다양한 의견을 들을 수 있었다. 심도 깊은 논의를 통해 모두가 만족한 제3의 구조를 만들었는데, 그 최종 구조가 너무 마음에 들었고 뭔가 큰 것을 깨우친 것 같아서 기분이 좋았다. 이런 논의를 통해 JPA에 도움을 받아 객체지향적으로 사고하는 것이 어떤 느낌인지 간접적으로 체험한 것 같다.

✏️ 무엇을 배웠나

학습 목표

  1. JDBC를 JPA로 전환할 수 있다. ⚠️
    • 엔티티 클래스를 정의하고, JPA 어노테이션을 사용하여 매핑할 수 있다. ✅
    • Spring Data JPA 리포지터리 인터페이스를 생성하여 기본적인 CRUD 연산을 수행할 수 있다. ✅
    • JPQL 또는 Query Methods를 사용하여 커스텀 쿼리를 정의할 수 있다. ⚠️
  2. 복잡한 도메인 모델 다루기 ✅
    • 연관 관계 매핑(예: @OneToMany, @ManyToOne)을 이해하고 적용할 수 있다. ✅
    • 연관 관계가 있는 엔티티 간의 CRUD 작업을 수행할 수 있다. ✅
  3. Spring에서 단위 테스트 작성하기 ⚠️
    • Spring Boot에서 단위 테스트를 작성하는 방법을 이해하고 적용할 수 있다. ⚠️
    • @DataJpaTest, @WebMvcTest 등을 사용하여 특정 계층의 테스트를 수행할 수 있다. ❌

앗.. 아쉽게도 이번 학습 목표 달성은 좀 미비하군..ㅎ

JPA 쿼리 메서드들은 많이 사용했지만 아직 JPQL을 잘 활용한다고 보기는 어려운 것 같다. 그냥 예시 코드를 따라 하는 수준 정도로만 사용해 봤다.

테스트 부분에서 새로운 부분을 학습하지 못한 점은 많이 아쉽다 🥲 구현을 할 때 단위 테스트보다는 통합 테스트를 위주로 작성했다. 구현할 API의 주요 시나리오(성공/실패)를 정의하고, 해당 시나리오에 맞게 @SpringBootTest & RestAssured를 활용해 테스트를 작성했다. 통합테스트를 통해 한번에 모든 계층을 검증할 수 있다는 점에서 통합 테스트를 최우선으로 작성했다. 단위 테스트는 구현 후 작성하려고 했지만 시간이 부족해 진행하지 못했다.

JPA 관련 학습 내용

우선, 이번 미션의 핵심이었던 JPA에 대해 무엇을 공부했는지 돌아보자. 하나하나 다 정리하려면 양이 많을 것 같은데.. TIL에 작성했던 내용들 위주로 싹 긁어모아봤다. 주제 하나하나 정리하고 싶은 내용이 많지만.. 시간 관계상 개괄식으로 정리했다 🤸‍♀️

용어 정리

  • JPA: Jakarta Persistence API, 영속성 관리를 위한 API 명세
  • Spring Data JPA: JPA 기반 리포지터리 제공 + 데이터 엑세스 기술
  • Hibernate: JPA 구현체

JPA 엔티티 매핑

  • JPA DDL vs schema.sql: JPA Entity와 schema.sql 파일이 둘 다 존재할 때, 실제 DB는 어떻게 만들어질까?
  • @GenerationType: IDENTITY vs SEQUENCE
  • @Embedded / @Embeddable: 값 객체를 다루는 방법. 값 객체 내부 필드명과, 엔티티에서 정의한 값 객체의 필드명이 다를 때 주의할 점
  • 엔티티에 기본 생성자가 필요한 이유 & 엔티티 기본 생성자를 private으로 설정할 수 없는 이유

JPA 연관관계 매핑

  • 일대일, 일대다, 다대다
  • 단방향, 양방향, mappedBy
  • FetchType: EAGER vs LAZY

기타..  Spring Data JPA Reporitory / OSIV / 영속성 컨텍스트 / 트랜잭션 등

  • JPA의 동일성 보장
  • 프록시 객체를 고려한 엔티티의 equals 정의하기
  • OSIV로 인해, @Transacitonal의 명시적 정의 없이도 더티체킹이 가능한 특수한 현상

위 내용 중에 꿀잼인 게 많은데 여기 다 못쓰는 게 아쉽다 🤡

미리미리 글 써볼 껄껄껄

서비스 계층

구현해야 할 기능들이 많아지면서, 서비스 계층이 뚱뚱해지는 현상이 발생했다. 특히 다른 테이블과 연관 관계가 많은 Reservation의 경우 ReservationRepository, ReservationTimeRepository, ThemeRepository, MemberRepository, WaitingRepository 이렇게 무려 5개의 레포지터리를 필드로 가지고 있는 부분이 마음에 들지 않았다.

 

이때쯤 다른 크루들이 서비스가 다른 서비스를 의존하는 구조를 사용하는 것을 봤었다. 하지만 내 구조에서는 서비스가 서비스를 의존하도록 설계하고 싶지 않았다. 여러 가지 이유가 있었지만, 가장 큰 이유는 서비스가 서비스를 의존하는 순간 뷰와 비즈니스 로직이 결합된다고 생각했기 때문이다. 내 코드에서 서비스는 API 요청 본문 DTO를 그대로 인자로 받고, API 응답 본문 DTO를 만들어서 반환한다. 서비스가 다른 서비스를 이용하면 이 DTO를 통해 소통해야 한다는 점이 치명적인 약점이라고 생각했다.

 

이런 구조는 어떨까

 

위 그림과 같은 구조도 고려를 했었다. 수직적 계층 구조를 유지하면서, 공통적인 기능을 따로 분리하기 위해 서비스끼리 의존하는 방법이 아닌, 서비스와 레포지터리 사이에 추가적인 계층을 추가하는 방식이다. 이 구조는 O'Reily Layered Architecture 아티클의 Open Layer 개념을 참고했다. 추가적인 계층을 뭐라고 명명하면 좋을지 모르겠다.. 아직도 고민 중이다. "공통 서비스", "서비스의 서비스"와 같이 이야기하면 이해하기 편할 것 같다. 기존의 서비스 계층은 API 요청/응답 DTO로 소통한다. 공통 서비스 계층은 컨트롤러와 직접 소통할 수 없다. 서비스 계층은 공통 서비스 계층을 의존할 수도 있고, 레포지터리 계층을 직접 의존할 수도 있다. 물론 이게 답이라는 것은 아니다. 그냥 하나의 아이디어?

 

이에 대한 고민을 리뷰어 로키에게도 이야기했고, 완전 새로운 방향의 힌트를 얻을 수 있었다. 이 미션에서는 결국 Command-Query 서비스로 쪼겠다. 아직 이 부분에서 명확한 답은 내리지 못한 것 같다.

예약 대기 설계

위에서도 잠깐 언급했듯이, 예약 대기 설계 토론을 통해서 다양한 생각을 할 수 있었다. 또한 이 과정에서 값 객체(VO)와 엔티티의 차이에 대해서도 깊게 고민해 볼 수 있었다. 설계에 대해 고민했던 내용들은 프롤로그에 잘 정리를 해놨기 때문에 프롤로그 링크를 첨부한다!

👇👇👇

https://prolog.techcourse.co.kr/studylogs/4400

 

또한 이 과정을 통해 객체 중심 설계에 대해서 다시 한번 생각해 볼 수 있었다. 이와 관련해서는 리뷰어 로키와 나눈 대화를 첨부한다.

👩‍🏫 미니 피드백 강의 대장 - 학습 테스트 완전 정복하기

레벨 2에서 새롭게 도입된 학습 활동인 "미니 피드백 강의 대장"에 참여했다. 강의 대장은 주어진 미션에 대해서 "내가 생각하는 이번 미션의 핵심"을 주제로 15분 정도 미니 피드백 강의를 진행한다.

 

두 번의 강의 대장 활동이 있었고, 나는 두 번 다 참여했다. 첫 번째 미션에서는 "레벨 2 공부법 찾기"를 주제로 미니 피드백 강의를 준비했다. 블로그에 정리해서 올리려고 했는데 아직 못했다ㅎ 사실 첫 번째 강의 대장 때 매우 간단한 내용을 했음에도 꽤 힘들게 준비했었다. 그래서 두 번째 강의 대장 신청이 올라왔을 때 참여를 망설였다. 강의 대장 전 주말에 또 약속이 있어서 시간이 많이 부족할 것이 뻔했다.

 

고민 끝에 결국 나의 학습을 위해 강의 대장을 활용하자는 마인드로 강의 대장을 신청했다...! STEP1 페어 미션을 하고 JPA 학습 테스트를 다시 복습하고 싶었기 때문에 복습할 겸 해당 내용을 미니 피드백 강의의 주제로 삼았다. 꼭꼭 복습해야겠다고 생각했기 때문에 미니 피드백 강의를 통해 내 학습을 강제시키는 전략을 선택했던 것이다.

 

그런데 예상했던 것보다 훨씬 더 시간이 부족했다... 😇 주말에 전혀 공부를 하지 못하고 바로 전 날에 벼락치기로 학습 테스트를 공부했다. 또 공부하는데 허투루 하고 싶지 않아서 학습 테스트 복습하고, 정리하는데만 대부분의 시간을 투자했다. 월요일 새벽을 꼬박 새우고 새벽 4~5시까지 학습 테스트 보다가, 1~2시간 정도 투자해서 강의에서 전달하고자 하는 내용의 뼈대를 잡았다. 그리고 진짜로.. 1시간 소파에서 딱 눈 붙이고.. 등교하는 지하철에서 수업 내용 정리하고 캠퍼스 일찍 도착해서 페어룸에서 마지막 수정하고..ㅋㅋㅋㅋ 정말 난리도 아니었다.

 

이 미니 피드백 강의의 가장 큰 난관은 배정받은 인원이었다. 첫 번째 미니 피드백 강의는 6인을 배정받아서 소규모 스터디 느낌으로 진행했었다. 두 번째는 가장 많은 인원인 17명을 배정받았다. 강의장도 잠실 캠퍼스에서 가장 넓은 굿샷 강의장을 배정받았다. 코치 직업 체험을 한 기분이었다.. 🤣

 

결과는 꽤 성공적이었다. 학습 테스트 완벽 정복하기를 주제로 미니 피드백 강의를 준비했다. 학습 테스트에 있는 내용의 범위가 방대했기 때문에 3가지 내용에 포커스를 맞췄다. [GenerationType.IDENTITY vs SEQUENCE], [mappedBy 사용 여부에 따른 DDL 차이], [LAZY vs EAGER 로딩의 쿼리 결과 비교] 이렇게 3가지를 메인으로 선정했다. 17명을 대상으로 짧은 시간에 몰입할 만한 강의를 제공하기 위해 개념보다는 실제 코드를 위주로 강의 자료를 준비했다. 속도 조절을 위해 중간중간 상품을 걸고 퀴즈도 준비했다. 열심히 참여해 준 크루들에게 감사 인사를 전하고 싶다 👍

 

보고서 하루 종일 기분이 좋았던 강의 대장 피드백들!! 다시 한번 감사합니다😎

준비 과정은 힘들었지만 끝나고 피드백을 들으니 다시 뿌듯해져서 힘들었던 기억들이 모두 미화됐다ㅎ

재밌어요 ㅋㅋ 학습테스트를 대충 했는데, 조금 더 깊게 봐야겠다는 생각이 들었어요
노랑의 발표 능력이 엄청나다. 청중의 집중을 위해 질문도 하시고 간식도 나눠주시고 최고다.
이러면 뭐가 남나요..
어디서 들어본 내용들이 학습 테스트에 모두 있었습니다. 잘 읽고 활용해 보면 좋을 것 같습니다.
학습 테스트를 하나하나 뜯어보는 노랑의 학습법이 정말 좋은 것 같아요. 어떤 이유로 인해 이 개념이 나왔는지, 실행 결과와 과정을 매치하고, BreakPoint를 달아 하나하나 타고 들어가며 정확한 개념을 잡아 내려는 집요함이 인상 깊었습니다!
주변에서 이야기하는 것들이 사실은 학습테스트에서 제공하는 것들을 꼼꼼히 따라가다 보면 모두 학습할 수 있었다는 내용이 기억에 남습니다.

💃 방탈출 예약 대기를 마무리하며

이렇게 정리를 해보니 방탈출 예약 대기 미션은 참 많은 것을 배운 미션이었다. 또 그만큼 더 공부하고 싶은 것들이 잔뜩 생겨난 미션이기도 하다. 이런 것들을 다 매우지 못하고 레벨 2를 끝내도 되나 하는 생각이 든다. 하지만 평생 공부를 하면서 살 수는 없으니, 적당히 매듭짓고 레벨 3을 준비해야겠다.

 

회고글을 쓰고 있는 지금 네 번째 미션을 하는 중이고, 반성을 하고 있다. 이렇게 세 번째 미션을 바쁘게 보냈으면서, 이번 미션에서 잠깐 여유가 생겼다고 주말을 펑펑 놀았다. 그 업보로 밤늦게까지 회고글을 쓰는 중이다.. 😇ㅎ 남은 2주 알차게 보내고, 후회하지 말자~~ 이 글을 보는 모든 사람들 파이팅!

 

💃 🪩 🤸 🪩 🕺

'후기 or 회고 > 우아한테크코스' 카테고리의 다른 글

[우테코 Lv3] 레벨3 회고 (1) - 기획과 프로토타입  (3) 2025.09.08
[우테코 Lv2] 레벨2 미션4 방탈출 결제 / 배포 회고  (7) 2025.06.17
[우테코 Lv2] 레벨2 미션2 방탈출 사용자 예약 회고  (6) 2025.05.19
[우테코 Lv2] 레벨2 미션1 방탈출 예약 관리 회고  (4) 2025.05.04
[우테코 Lv1] 레벨1 중간(?) 회고  (2) 2025.03.17
'후기 or 회고/우아한테크코스' 카테고리의 다른 글
  • [우테코 Lv3] 레벨3 회고 (1) - 기획과 프로토타입
  • [우테코 Lv2] 레벨2 미션4 방탈출 결제 / 배포 회고
  • [우테코 Lv2] 레벨2 미션2 방탈출 사용자 예약 회고
  • [우테코 Lv2] 레벨2 미션1 방탈출 예약 관리 회고
yesjuhee
yesjuhee
Dopamine Driven Developer
  • yesjuhee
    나랑 노랑
    yesjuhee
  • 전체
    오늘
    어제
    • 분류 전체보기 (29)
      • 개발 (11)
        • DevOps (2)
        • Java & Spring (4)
        • AI (1)
        • DB (1)
        • 기타 (3)
      • 후기 or 회고 (15)
        • 우아한테크코스 (11)
        • 기타 (4)
      • 독서 (2)
      • 기타 (1)
      • 초록 스터디 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    초록 밋업
    우아콘
    Ai
    후기
    claude code
    SCG
    레벨2
    독서
    레벨4
    coderabbit
    초록 스터디
    우테코
    모아온
    바킹독
    spring
    mysql
    DispatcherServlet
    레벨3
    소프티어 부트캠프
    QueryDSL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
yesjuhee
[우테코 Lv2] 레벨2 미션3 방탈출 예약 대기 회고
상단으로

티스토리툴바