HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[New] 타일러팀
[New] 타일러팀
/
코코아 헤어샵
코코아 헤어샵
/
📜
프로젝트 회고
/
👥
팀
👥

팀

 
  1. 팀원들은 각자 혼자서 아래의 사항에 해당하는 내용을 회고에 활용하기로 한 온라인 툴에 조용히 적으세요.
      • Liked: 이번 프로젝트(스프린트)에서 팀원들과 함께 작업하며 좋았던 점
      • Learned: 이번 프로젝트(스프린트)에서 팀원들과 함께 작업하며 배운 점
      • Laked: 이번 프로젝트(스프린트)에서 팀원들과 함께 작업하며 아쉬웠던 점
      • Longed for: 이번 프로젝트(스프린트)에서 팀원들과 함께 작업할 때 “이랬으면 참 좋았겠다.” 싶은 점
 
  1. 각자가 적은 걸 한 곳에 모아놓고 살펴보면서 각자 적은 걸 서로에게 이야기하고, 서로의 이야기를 듣고 든 생각이나 감정을 다시 또 서로에게 해주세요.
 

기획 단계

  • 채택된 아이디어
    • 네이버 헤어샵 → 카카오 헤어샵
  • 이유
    • 헤어샵이란 도메인을 집중 할 수 있는 점이 가장 큰 메리트
  • 협업툴
    • JIRA → 스프린트 진행용
    • NOTION → 협업 문서 정리용
    • Slack → 커뮤니케이션 및 긴급이슈 알림용
 

설계 단계

  • 엔티티 구성 ( CRUD )
    • 사용자
    • 헤어샵
    • 디자이너
    • 메뉴
    • 예약
  • 스트레스 부하 테스트
    • 예약 조회 → 예약 조회에서 가장 부하가 걸릴 것으로 예상
 

개발 단계

기술 Trouble Shooting

  • JPA
    • 영속성 컨텍스트의 이해
      • 양방향 연관관계 편의 메서드
    • N+1 문제 ⇒ fetch Join을 통해 해결
  • database
    • @GeneratedValue(strategy = GenerationType.AUTO) 선언시 DeadLock 발생
      • Hibernate의 MySQL의 기본전략 이해 (Table)
      • auto Increment에 대한 이해
    • Indexing을 통해서 성능 개선
    • H2 예약어 문제
      • user → users
  • 깃 충돌 해결
    • 각각 브랜치를 판 다음 머지하는 과정에서 충돌이 발생
    • 충돌난 부분을 해결하는 과정에서 기존 코드가 날아가는 일이 발생…
    • 다행히 다른 브랜치에 해당 코드가 남아 있어서 복구
  • Test
    • 인증이 필요한 controller 테스트에서 매번 토큰발급을 함께 하기에 복잡
      • @WithUserDetails로 해결
    • Test 합치는 과정에서 각 도메인의 테스트들이 영향을 줌
      • 각 테스트들이 끝나면 DB정리하고, PK에 의존적이지 않은 코드짜기

테스트 단계

  • Jmeter ( 개선전 )
    • 정적 예약 조회
      • 예상대로면 예약이 50%이상된 상황에선 동적보다 빨라야 했지만 더 느렸다.
      • 리팩토링 진행(인덱싱을 이용)
    • 동적 예약 조회
      • 타임테이블에서 예약 비율이 높아질 수록 퍼포먼스가 낮아짐.
    • 예약 100% 채우는 과정에서 실제로 중복예약 경험
      • validation코드가 있으나 거기까지도 모두 동시에 들어가서 통과해버릴 것이라는 우려가 현실화
  • Jmeter ( 개선후 )
    • 정적 예약 조회
      • ?
    • 중복예약
      • Unique Key로 해결

성과

 

4Ls

  • Liked
    • 패키지 구조 전략을 세우고 시작하여 패키지 작성에 어려움이 없었다.
    • 사용할 기술 스택을 미리 생각한 뒤 정하고 시작하여 효율적이었다.
    • Notion을 사용하여 팀원들과 문서를 공유하면서 효율적으로 협업할 수 있었다.
    • 도메인 단위로 역할을 분담하여 효율적으로 협업할 수 있었던 것 같다.
    • 모든 팀원들이 각자의 역할을 열심히 수행했다.😁
    • 프로젝트 시작전에 기술적 이슈나 방향을 정하고 들어가서 의미있게 진행할 수 있었다. 👍
  • Learned
    • SpringSecurity의 인증로직을 직접 경험하고 배울 수 있었다.
    • Test에서 Mocking을 사용하는 법을 배웠다.
    • Test에서 인증부분을 간편하게 구현할 수 있는 @WithUserDetails에 대해 배울 수 있었다.
    • N+1 문제 발생 했을 때 fetch Join을 통해 해결하는 방법을 배웠다.
    • @GeneratedValue(strategy = GenerationType.AUTO) 선언시 DeadLock 발생하였다.
      • MySQL의 기본전략을 이해 (Table)하고 auto Increment로 수정을 통해 해결하였다.
    • Column들의 Indexing을 통해서 조회 성능을 개선하는 방법을 배웠다.
    • Jmeter를 사용하여 서로 다른 로직으로 구현한 방법들의 성능을 테스트하는 방법을 배웠다.
    • AsciiDoc을 사용하여 컨트롤러 테스트를 작성하면서 자동적으로 API 문서를 빌드하는 방법을 배웠다.
  • Laked
    • 엔터티를 작성하고 시작하지 않았기 때문에 도메인 별로 파트를 나눈 협업 방식에 어려움이 있었다. 😅
    • 코드 컨벤션을 자세히 정하지 않아 마지막에 의논 후 수정하는 어려움이 있었다.
    • GitHub로 팀 단위 형상 관리를 하면서 협업 중 필요한 파일이 삭제되는 등의 이슈가 발생하였다.
    • Jira를 사용하여 스프린트를 진행하고 Notion으로 문서 관리를 하기로 했지만, 압도적으로 Notion의 활용 비중이 높았고 Jira를 효율적으로 사용하지 못한 것 같다.
  • Longed for
    • 엔터티를 함께 혹은 팀원이 역할을 맡아 작성하고 프로젝트를 시작하면 좋을 것 같다.
    • git의 rebase를 활용하여 upstream과 싱크를 맞추고 PR하면 PR을 merge할 때 충돌을 잡는 방법보다 효율적일 것 같다.
    • 코드 컨벤션을 자세하게 정하고 프로젝트를 시작하면 더 정돈된 프로젝트가 될 수 있을 것 같다.
    • github에 issue를 잘 사용해봤다면 프로젝트 진행과정을 잘 남길 수 있었을 것 같다.