콘서트 티켓팅 서비스


📌 3~5주차 서버 구축

3~5주차 과제 문서.md

3주차

주어진 요구사항을 분석하고 마일스톤, 시퀀스 다이어그램, ERD 다이어그램, API 명세서 등 설계와 개발 계획 수립에 있어 주요 문서들을 작성했다.

취업 전에 한창 회사를 알아볼 때, "개발자인데 문서 작업을 더 많이 해요," 라고 불만있어 하는 글을 많이 봤었다.
직접 작성해보기 전까지는 나도 개발자가 문서 작업을 왜 해야하는 지 이해하지 못했었다.
하지만 마일스톤을 작성하면서 얼추 언제 얼마만큼의 개발을 해야겠다는 계획이 러프하게 세워졌고,
분석한 요구사항을 바탕으로 시퀀스 다이어그램을 그려보며 개발 방향이 명확해졌으며,
ERD 다이어그램, API 명세서를 작성하면서 각각 DB와 API의 윤곽을 잡을 수 있었다.
또한 피어리뷰 시간에 느낀 건데, 작성해둔 문서를 보고 설명하는 것이 코드를 바탕으로 설명하는 것보다 훨씬 쉬웠다.

4주차

Swagger 문서 작성 및 TDD 기반으로 주요 API의 Business/Infrastructure 로직을 완성했다.

프론트엔드 개발을 하면서 백엔드 개발자 분과 협업을 할 때, 간혹 API 쪽에서 넘어오는 에러를 어떻게 처리해주어야 할 지 알 수 없을 때가 있다.
어떻게 처리해야 하는 지 요청해도 답변이 바로 오는 것이 아니니, 빠르게 개발해야 하는 입장에선 답답할 때도 부지기수.
그래서 API를 개발하면서 발생할 수 있는 에러들을 최대한 처리하고 그것을 명시하는 Swqgger 문서를 작성했다.
이 과정에서 에러가 이렇게나 다양하다는 것을 새삼 깨달았다. (최대한 옳다고 생각하는 에러를 지정했는데 인텔리제이가 계속 다른 걸 추천해주었다...)
다음에 예외처리 할 때는 커스텀 Exception으로 처리를 해봐야겠다.

5주차

미흡한 점을 리팩토링하고, 필요한 Filter와 Intercepter, 예외처리, 로깅 등의 기능 구현을 넣어 서버 구축을 마무리했다.

클린아키텍처를 추구한다는 큰 틀은 있지만, 코치님들 사이에서도 저마다 방법이 조금씩은 다르셨다.
같이 수업 듣는 동기들 깃헙을 뒤져봐도 저마다 조금씩 달라서 클린아키텍처를 처음 배운 2주차에는 멘붕도 그런 멘붕이 없었다.
그래서 서버 구축을 마무리하며 5주차의 목표는 "클린아키텍처 하나는 확실히 구현하자," 에 더해 "각 로직이 어떤 책임을 가져가야 할 지 고민하며 개발하기," 였다.
리팩토링 할 코드가 아주 많았다.
예를 들어 예약 도메인은 비즈니스 로직인데 유저도 부르고 좌석도 부르고 좌석 상태 변경하고 예약 만들고 아주 바쁜 녀석이었다.
그래서 이런 복잡한 조립의 역할은 파사드에 맡기고 도메인에는 saveReservation 이름에 어울리는 예약 저장하는 책임만 주었다.
예약 상태를 변경하고 예약을 만드는 역할은 엔티티에 맡김으로써 응집도를 높이고 보다 객체지향적인 코드를 지향할 수 있게 되었다.
이런 노력이 보람되게도 그 주에 명예의 전당에 올랐다

📌 6~9주차 대용량 트래픽 & 데이터 처리

6주차

내 시나리오에서 동시성 문제가 발생할 수 있는 부분을 파악하고 동시성 제어 방법을 도입해보았다.

동시성 테스트 보고서.md

DB에 락을 걸어 동시성 이슈를 제어할 때 어떤 방법을 쓸 지는, 시각에 따라 다양하게 나왔다.
예를 들어 좌석을 예약할 때 동시성 이슈가 많이 발생한다는 점에 초점을 두면 비관적 락이 고려되었고,
누군가 락을 획득하면 다른 사람들은 예매를 할 수 없으므로 빠르게 다른 좌석을 예매할 수 있도록 하는 사용자 경험에 초점을 두면 낙관적 락이 고려되었다.
또 비관적 락을 걸면서도 사람들이 오래 기다리지 않도록 부러 예외를 발생시키거나 다른 방법을 사용할 수도 있다고 한다.
6주차 과제를 하면서 어떤 락이 어울릴 지 조원들과 많은 얘기를 나눠서 결정했었는데,
현업에서는 어떤 경우에 어떤 식으로 사용하는 지가 너무 궁금해지면서 6주차를 마무리했다.

7주차

자주 사용되지만 빈번하게 바뀌지 않는 데이터에 대해 캐싱 전략을 적용하여 성능을 향상시켜 보았다.

기존에 DB로 구현했던 대기열을 레디스 대기열로 바꿔보았다.

캐싱 전략 보고서.md

한 번 등록되면 빈번하게 바뀌지 않을 콘서트 목록과 콘서트 옵션을 CacheAside 전략으로 캐싱하고,
Expiration로 만료시간을 설정하는 대신 CacheEvict로 원하는 시점에 캐싱된 데이터를 지울 수 있도록 하였다.
캐싱 전후의 차이는 10배나 났다.

레디스 대기열 구현 PR

조회에서 예약까지 하나의 유저플로우에서 소요되는 시간과 1분동안 처리 가능한 사용자 수를 계산하여,
1분에 한 번씩 계산된 수만큼 waiting 토큰을 active 토큰으로 바꿔주는 로직을 구현하였다.
(10주 간의 일정 중에서 캐싱으로 성능을 향상시키고 레디스 대기열을 구현해서 유량 제어를 하는 7주가 가장 재밌었기 때문에, 대기열을 다루는 서비스가 있는 현업으로 이직하고 싶다.)

8주차

인덱싱을 추가하여 쿼리의 성능개선을 도모했다.

콘서트 티켓팅 서비스를 마이크로서비스 아키텍처(MSA)로 전환 시 그에 따른 트랜잭션 문제점을 분석하고 해결방안에 대해 보고서를 작성해보았다.

인덱싱 성능 개선 전략.md

기존에 slow 쿼리로 의심되는 쿼리들에 Explain Analyze를 실행하여 분석하고 인덱스 생성 전략에 따라 적절한 인덱스를 추가했다.
하지만 인덱싱 적용 전후를 비교했을 때 예상 시간이 오히려 증가해서 당황스러웠다.
원인을 추측만하다가 Explain Analyze를 사용하지 않고 쿼리 실행 시간 자체를 비교했다.
Explain Analyze로 분석했던 결과와 달리 실제 실행 시간은 인덱싱 적용 후가 더 빨랐다.
좀 더 알아보니 Explain Analyze는 단순히 쿼리를 실행하는 것과 달리 실행 계획과 실제 성능 데이터를 수집하고 이를 출력하기 위한 작업을 수행한다고 한다.
인덱싱을 적용하면서 이 작업이 더 복잡해졌고, 때문에 예상 시간이 더 증가한 결과가 나온 것으로 보인다.

콘서트 티켓팅 시스템 MSA 전환에 따른 트랜잭션 문제점 분석.md

내 시나리오 상의 유즈케이스 별로 서비스 간의 상호작용을 분석했다.
이어 서로 상호작용하는 서비스들을 분리했을 때 발생할 수 있는 문제점과 해결 방안을 보고서로 작성했다.
또한 서비스 분리 상황을 가정하고 이벤트 메시지 발행 기능을 추가했다.

9주차

Docker를 이용해 Kafka를 설치 및 실행하고, 기존의 이벤트 메시지 발행 기능을 카프카로 대체했다.

사실 카프카는 아직 어렴풋하게만 이해를 했다...

📌 10주차 장애 대응

10주차

부하 테스트 대상을 선정하여 시나리오를 세우고 이를 테스트하여 보고서로 작성했다.

또한 위 테스트를 바탕으로 가상 장애 대응 문서를 작성했다.

부하테스트 분석 보고서.md

순간적인 부하를 견뎌야 하는 대기열 시스템에 스파이크 테스트를 진행했다.
초당 1000명씩 만 명에 대한 테스트와 초당 2000명씩 5만 명에 대한 테스트를 진행해보고,
성능 저하와 불안정한 응답 시간이 관찰됨에 따라 메모리 증량 후 동일 조건으로 테스트를 진행했다.
이를 통해 메모리 증량이 성능 안정화에 도움이 된다는 결론을 얻었다.

단순히 개별 api만 테스트 시에는 어느 시점에 부하가 걸리는 지 알기 어렵다고 판단하여 예약은 유저플로우에 대한 스트레스 테스트를 진행했다.
여러 데이터를 불러올 때, 테스트 1은 모든 데이터를 개별적으로 불러오는 상황으로 테스트하고, 테스트 2는 조인쿼리를 사용하여 테스트했다.
두 테스트를 비교했을 때는 테스트 1의 개별 API 호출이 시스템 리소스를 더 많이 요구해서 부하를 일으킨다는 결론이 나왔다.
이어서 테스트 2의 환경에서 초당 유입되는 사람 수를 두 배로 늘려봤다.
7주차에 계산한 분당 처리 가능한 사용자 수가 기준인데, 이미 분당 유입되는 사람이 나가지 못하고 쌓임에 따라 병목현상이 일어나고 있었기 때문에,
사용자를 늘리자 더욱 병목 현상이 두드러졌다.

7주차 테스트 때도 분당 420명씩 들어갈 때 점차 시스템에 부하가 심해질 것이라 예상했는데,
10주차의 테스트에서 예견했던 문제점이 그대로 발생하였다.
다만 정확히 어떤 지점에서 병목현상이 발생한 것인지는 추가적으로 테스트가 필요하다.

장애 분석 및 대응 보고서.md

테스트에서 발생했던 병목현상을 실제 장애 상황으로 가정하고 장애 분석 및 대응 보고서를 작성했다.

📌 마무리

대규모 트래픽을 경험하기 위한 콘서트 티켓팅 서비스 시나리오가 8주를 거쳐 완성되었다.
매주 새로운 것들을 배우고 그것을 적용시켜 보느라 많이 힘들었지만,
이런 게 바로 스프린트 개발인가! 피어리뷰로 다른 사람들의 코드 보는 거 재밌다! 하면서 오랜만에 즐겁게 개발하는 시간이었다.
또 이론을 공부하는 데 많은 시간을 쏟는 병이 있는데, 빠른 주기의 개발을 경험하면서 일단 적용시켜보면서 배우는 게 더 효율적이란 것을 깨닫는 시간이기도 했다.
728x90

'항해99 플러스' 카테고리의 다른 글

6주차 회고록  (0) 2024.07.27
1년차 주니어 개발자의 항해 플러스 백엔드 5주차 회고록  (0) 2024.07.20
3주차 회고록  (0) 2024.07.06
2주차 회고록  (0) 2024.06.29
1주차 회고록  (0) 2024.06.22

여긴 어디... 나는 누구...

 

 

1 ~ 5주차는 6주차 이후의 과정을 위해 토대를 쌓는 과정이었다면, 6주차부터는 동시성 문제와 트래픽 제어를 위한 과정이다.

즉, 완전 새로운 주제로의 전환이다.

마치 1주차로 돌아간 기분...

무슨 말이냐면, 하나도 모르겠다^^

 

우선 레디스를 하나도 몰라서 강의를 구매해서 들었다.

완전 기초 강의여서 일수도 있고, 코치님 말씀대로 레디스 자체가 어려운 건 아니라서 그럴 수도 있고, 여튼 이틀동안은 스무스하게 공부했다.

 

락은 콘서트 대기열의 유즈케이스별로 좌석예약, 포인트 충전/결제에 구현하기로 했다.

코치님과의 멘토링을 통해 하기대로 락을 적용했다.

좌석 예약 시도 후 좌석 선택이 불가능할 경우 빠르게 응답 처리하기 위해 낙관적락을 적용했고,

포인트 충전은 여러 번 충전 시도 시 해당 시도를 모두 처리시켜준다는 가정 하에 비관적락을 적용했다.

포인트 결제는 여러 번 시도 하더라도 최초의 한 번에 대해서만 처리시켜주기 위해 낙관적락을 적용했다.

 

사실 구현하면서도 이 유즈케이스에 이 락을 사용하는 것이 맞나에 대한 의문이 들었다.

하지만 락을 사용하는 것에 정답은 없고, 비관적락을 구현하더라도 무조건 대기시키는 게아니라 다른 방법을 적용해서 처리 할 수도 있다는 얘기를 들으면서, 많이 공부해야겠다는 생각을 했다.

알맞은 락이나 락이 아닌 다른 방법(메세지큐?라든가?)을 적용하기 위해서는 내가 그 방법들에 대해 잘 알고 또 내 유즈케이스에 대해 잘 파악하고 있어야 할 테니까.

 

락에 대해 더 공부하고 싶은데 어떻게 해야할까?

티스토리, 블로그 등의 글은 불확실한 정보가 너무 많다

 

 

회고로 돌아와서...

어디선가 계속 낙관적락이 걸려 풀리지 않는 둥 에러가 많이 발생해서 에러 해결에 시간이 많이 걸렸고,

유즈케이스별로 다른 락도 적용해서 비교해보려던 계획과 레디스의 분산락을 적용해보려는 계획이 망가졌다.

 

겨우 좌석예약에만 비관적락과 낙관적락을 적용해서 테스트를 통해 비교해봤는데,

풀이 적어선지 시간 차이가 많이 나지 않았다.

 

또 테스트 시간도 300ms가 넘게 걸렸는데 테스트 풀이 10개 밖에 없었다는 것을 고려하면 어딘가 로직이 잘못되어 있거나 테스트가 잘못된 게 아닐까 하는 생각이 든다.

 

여기서 말하자면 이번 주차의 가장 어려웠던 점은 락이나 레디스에 대한 공부보다 테스트였다.

내가 하는 테스트가 맞는 것인지에 대한 불확실함이 너무 컸다........

 

지난주 받은 따봉 반납합니다.

 

 

일단 주말에 조금 더 고쳐보고...

화이팅.........

멘탈이 약간 터져있어서 회고록 양식에 맞춰서 못 쓰겠다^0^

 

 

 

728x90
항해 플러스 백엔드 3주 ~ 5주 간 진행했던 서버 구현 챕터가 끝났다.

총 10주차의 과정 중 반이 지나왔다.

1년차 주니어 개발자로서 역략을 더 키울 필요를 느껴서 큰맘 먹고 시작한 항해 플러스 백엔드 코스였는데 어땠을까?

 


다른 얘기지만 얼리버드로 했으면 조금 더 싸게 했을 텐데 추천인 코드 할인만 받구 시작했다ㅠ

만약 내가 해야겠다 마음 먹었으면 얼리버드로 등록을 추천한다.

금액도 금액이고 코스 시작 전에 미리 같은 기수분들과 스터디도 할 수 있어서 좋은 것 같다.

지금 모집 중 ⬇️

https://hhplus-hub.oopy.io/

추천인 코드 있으면 20만원 더 할인되니 개이득

추천인 코드 : NVuyra

 


 

다시 회고로 돌아가 보자.

 

오티 때 저연차가 많다고 하는데 주변에 물어보면 3년차 분들이 꽤 많으셨다.

우리 조 분들도 대부분 3년차.

그래서 나는 종종 저분들이 무슨 얘기를 하는 걸까 하고 검색해 본적이 많다. (물론 지금도)

개발자로 일하고 있음에도 많이 무지했던 것이다.

 

 

 

지금 나는 항해 플러스 백엔드 코스를 시작하면서 내 무지에 대해 많이 깨닫게 되었고,
매주 새로운 기술을 적용해보며 조금씩 성장하는 중이다.

 

좌충우돌 TDD & 클린아키텍처 챕터가 끝나고 서버 구축 챕터를 시작하면서,

챕터 2를 하는 3주 간의 목표는 클린 아키텍처에 익숙해지는 것 + 객체지향적인 코드를 짜는 것이다.
(절차지향적인 코드라고 피드백 받아서 슬프다)
그리고 아고라나 DM을 적어도 한 번은 사용해보는 것이 목표다.
내 지식이 많이 부족하다고 느껴 오히려 아고라나 DM으로 코치님께 물어보기가 어렵다.

 

이런 목표를 세웠었다.

 

부끄러워서 아고라나 DM 활용은 못했지만 대신 멘토링 시간을 적극 활용했다.

잘 모르다 보니 질문을 엉성하게 드릴 때가 많은데, 코치님들이 훌륭하셔서 찰떡같이 설명해주신다.

덕분에 매주 조금씩 깨달음을 얻어 성장하고 있다.

또 매주 과제에 대해 부족한 부분을 리뷰로 달아주시는데 덕분에 어떤 부분을 고쳐야 할 지 알 수 있어 그뤠잇!

 

첫 번째 목표였던 클린 아키텍처 익숙해지기랑 객체지향적인 코드 짜기는 한 70% 이룬 것 같다.

첫 주차 과제 결과
5주차 명예의 전당

aka. 첫 주차 fail 받았던 내가 5주차엔 명예의 전당?!

죄송... 오늘 받은 결과라 좀 신났다.

 

레이어드 아키텍처를 어떻게 하면 좋은 구조로 가져갈 수 있을까에 대해 많이 익숙해졌고,

객체지향적 사고는 아직 많이 어설프지만 책도 읽고 코치님께 조언을 들으며 노력 중이다.

(엔티티에 비즈니스 로직을 작성함으로써 응집도를 높여 객체지향적 코드를 짤 수 있게 된다는 것도 이번에 알게 되었다!)

또 도메인들을 분리하고 서비스와 파사드를 분리해서 작성해 보면서 어디에 어떤 책임을 줄까에 대해서도 고민해 보게 되었다.

 

 

 

6주차부터는 동시성 문제와 트래픽 관리 등을 하게된다

 

오늘 발제를 들었는데(DB 락에 관한 이야기였다) 무슨 이야기인지 1도 모르겠더라...

나 SQLD도 땄는데...?

 

매우 심히 걱정이 된다...

다음 챕터 목표는 작게 잡아서 Fail 안 받기로 해야겠다. 흑흑.

 

다음 챕터 동안 강화할 내 장점

밤 새는 능력

멘토링 시간에 과감히 물어보기 + 요점정리

 

다음 챕터 동안 가장 개선할 점

chat GPT 의존도 좀 줄이기

 

다음 챕터도 화이팅! 잘 버텨보자

728x90

'항해99 플러스' 카테고리의 다른 글

항해플러스99 10주차 마무리하며(콘서트 티켓팅 서비스 정리)  (2) 2024.08.31
6주차 회고록  (0) 2024.07.27
3주차 회고록  (0) 2024.07.06
2주차 회고록  (0) 2024.06.29
1주차 회고록  (0) 2024.06.22

콘서트 예약 서비스

💡 아래 명세를 잘 읽어보고, 서버를 구현합니다.

Description

  • 콘서트 예약 서비스를 구현해 봅니다.
  • 대기열 시스템을 구축하고, 예약 서비스는 작업가능한 유저만 수행할 수 있도록 해야합니다.
  • 사용자는 좌석예약 시에 미리 충전한 잔액을 이용합니다.
  • 좌석 예약 요청시에, 결제가 이루어지지 않더라도 일정 시간동안 다른 유저가 해당 좌석에 접근할 수 없도록 합니다.

Requirements

  • 아래 5가지 API 를 구현합니다.
    • 유저 토큰 발급 API
    • 예약 가능 날짜 / 좌석 API
    • 좌석 예약 요청 API
    • 잔액 충전 / 조회 API
    • 결제 API
  • 각 기능 및 제약사항에 대해 단위 테스트를 반드시 하나 이상 작성하도록 합니다.
  • 다수의 인스턴스로 어플리케이션이 동작하더라도 기능에 문제가 없도록 작성하도록 합니다.
  • 동시성 이슈를 고려하여 구현합니다.
  • 대기열 개념을 고려해 구현합니다.

API Specs

1️⃣ 주요 유저 대기열 토큰 기능

  • 서비스를 이용할 토큰을 발급받는 API를 작성합니다.
  • 토큰은 유저의 UUID 와 해당 유저의 대기열을 관리할 수 있는 정보 ( 대기 순서 or 잔여 시간 등 ) 를 포함합니다.
  • 이후 모든 API 는 위 토큰을 이용해 대기열 검증을 통과해야 이용 가능합니다.

기본적으로 폴링으로 본인의 대기열을 확인한다고 가정하며, 다른 방안 또한 고려해보고 구현해 볼 수 있습니다.

2️⃣ 기본 예약 가능 날짜 / 좌석 API

  • 예약가능한 날짜와 해당 날짜의 좌석을 조회하는 API 를 각각 작성합니다.
  • 예약 가능한 날짜 목록을 조회할 수 있습니다.
  • 날짜 정보를 입력받아 예약가능한 좌석정보를 조회할 수 있습니다.

좌석 정보는 1 ~ 50 까지의 좌석번호로 관리됩니다.

3️⃣ 주요 좌석 예약 요청 API

  • 날짜와 좌석 정보를 입력받아 좌석을 예약 처리하는 API 를 작성합니다.
  • 좌석 예약과 동시에 해당 좌석은 그 유저에게 약 5분간 임시 배정됩니다. ( 시간은 정책에 따라 자율적으로 정의합니다. )
  • 만약 배정 시간 내에 결제가 완료되지 않는다면 좌석에 대한 임시 배정은 해제되어야 하며 다른 사용자는 예약할 수 없어야 한다.

4️⃣ 기본 잔액 충전 / 조회 API

  • 결제에 사용될 금액을 API 를 통해 충전하는 API 를 작성합니다.
  • 사용자 식별자 및 충전할 금액을 받아 잔액을 충전합니다.
  • 사용자 식별자를 통해 해당 사용자의 잔액을 조회합니다.

5️⃣ 주요 결제 API

  • 결제 처리하고 결제 내역을 생성하는 API 를 작성합니다.
  • 결제가 완료되면 해당 좌석의 소유권을 유저에게 배정하고 대기열 토큰을 만료시킵니다.

💡 **KEY POINT**

  • 유저간 대기열을 요청 순서대로 정확하게 제공할 방법을 고민해 봅니다.
  • 동시에 여러 사용자가 예약 요청을 했을 때, 좌석이 중복으로 배정 가능하지 않도록 합니다.

 


 

1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제)

 

이번 주차 과제는 문서작성 위주였다.
요구사항을 분석하고 마일스톤, 시퀀스 다이어그램, ERD, API Spec을 작성하고 MOCK API까지 만들면 됐다.
그래서 이번 주는 조금 여유롭겠구나~ 했다.

하지만 그거슨 경기도 오산이었...(문서 작업 뚝딱 해내시는 팀장님 리스펙트...)

앞선 주차에 비해 분석해야 할 요구사항이 늘어났고, 생각해야 하는 부분이 많았다.
예를 들면, 유저와 토큰의 관계는 어떻게 맺을 것인가, 대기열 검증은 어디까지 적용할 것인가 등등등.
또한 가장 큰 핵심 문제.
폴링으로 대기열을 확인한다
이게 대체 무슨 말인지 도통 이해가 가지 않았다.
그래서 이 분석에 시간이 가장 많이 걸려서 문서 작업 시작이 늦었다.
만약 팀원들끼리 나눠서 작성하지 않았다면 시간 내에 못 했을 거야...

 

2. 시도

폴링을 처음 들어봐서 구글링을 해보았다.
폴링이 일정주기를 갖고 서버와 응답을 주고받는 방식을 일컫는다는 것을 깨달았다.
대기열은 큐로 만들면 되는 것이 아닌가 막연하게 생각했다.
그렇다면 이 폴링으로 대기열을 확인하는 방법이 대체 뭐지?
이 부분은 팀원들과 얘기를 해보아도 도통 알 수가 없었다.

 

3. 해결

다행히 우리에겐 멘토링 시간이 있었다.🙌
한 시간의 멘토링 시간 거의 대부분을 대기열에 관한 설명을 들었다.
상세하게 설명해주신 이석범 코치님께 감사드림다.

 

4. 알게된 것

폴링을 백단에서 어떻게 구현하는 것인가라고 계속 고민했던 것이 무색하게 폴링은 그냥 클라이언트 쪽에서 요청하는 것이었다.

(생각해보니 당연한 게 서버 안에서 데이터를 계속 확인하는 거면 그냥 배치 돌리면 됐...)

즉, 처음 대기열을 위한 토큰을 발급 받은 후 페이지에 대기하면서 몇 초마다 요청을 보내도록 프론트 에서 구현하고, 에서는 요청이 들어왔을 때 토큰이 없다면 토큰을 발급하고 대기열에 넣어준 뒤 같은 요청이 들어왔을 때 토큰이 있다면 대기열의 순서를 확인하는 로직을 짜면 됐던 것이다. 그리고 순서 확인 시 토큰이 유효하다면 다음 페이지로 넘어갈 수 있도록 하고.(아마도)
또한 대기열 쪽은 일정 기간 마다 토큰의 만료 여부를 체크하는 스케쥴러를 만들면 오케이

 


 

Keep : 현재 만족하고 계속 유지할 부분

 

지난주에 DM과 아고라를 더 적극 활용해야겠다 생각했는데, 우선 팀원들과의 대화 및 멘토링으로 해결되는 부분이 있어 아고라까지는 활용을 하지 않았다.
이번주도 더 활발한 의견 교환을 할 예정

 

Problem : 개선이 필요하다고 생각하는 문제점

지식 부족과 정립되지 않은 생각들로 머릿속이 혼돈의 카오스인 점?
때문에 과제 진행이 더디다.

 

Try : 문제점을 해결하기 위해 시도해야 할 것

이거슨 더 공부를 하고 더 많이 물어보는 수 밖에...🥲

728x90

'항해99 플러스' 카테고리의 다른 글

6주차 회고록  (0) 2024.07.27
1년차 주니어 개발자의 항해 플러스 백엔드 5주차 회고록  (0) 2024.07.20
2주차 회고록  (0) 2024.06.29
1주차 회고록  (0) 2024.06.22
시작하는 마음  (2) 2024.06.15

💡 아래 명세를 잘 읽어보고, 서버를 구현합니다.

Description

  • 특강 신청 서비스를 구현해 봅니다.
  • 항해 플러스 토요일 특강을 신청할 수 있는 서비스를 개발합니다.
  • 특강 신청 및 신청자 목록 관리를 RDBMS를 이용해 관리할 방법을 고민합니다.

Requirements

  • 아래 2가지 API 를 구현합니다.
    • 특강 신청 API
    • 특강 신청 여부 조회 API
  • 각 기능 및 제약 사항에 대해 단위 테스트를 반드시 하나 이상 작성하도록 합니다.
  • 다수의 인스턴스로 어플리케이션이 동작하더라도 기능에 문제가 없도록 작성하도록 합니다.
  • 동시성 이슈를 고려하여 구현합니다.

API Specs

1️⃣ (핵심) 특강 신청 API POST /lectures/apply

  • 특정 userId 로 선착순으로 제공되는 특강을 신청하는 API 를 작성합니다.
  • 동일한 신청자는 한 번의 수강 신청만 성공할 수 있습니다.
  • 각 강의는 선착순 30명만 신청 가능합니다.
  • 이미 신청자가 30명이 초과되면 이후 신청자는 요청을 실패합니다.
  • 어떤 유저가 특강을 신청했는지 히스토리를 저장해야한다.

2️⃣ (기본) 특강 목록 API GET /lectures

  • 단 한번의 특강을 위한 것이 아닌 날짜별로 특강이 존재할 수 있는 범용적인 서비스로 변화시켜 봅니다.
  • 이를 수용하기 위해, 특강 엔티티의 경우 기본 과제 SPEC 을 만족하는 설계에서 변경되어야 할 수 있습니다.
    • 수강신청 API 요청 및 응답 또한 이를 잘 수용할 수 있는 구조로 변경되어야 할 것입니다.
  • 특강의 정원은 30명으로 고정이며, 사용자는 각 특강에 신청하기전 목록을 조회해볼 수 있어야 합니다.
    • 추가로 정원이 특강마다 다르다면 어떻게 처리할것인가..? 고민해 보셔라~

3️⃣ (기본) 특강 신청 완료 여부 조회 API GET /lectures/application/{userId}

  • 특정 userId 로 특강 신청 완료 여부를 조회하는 API 를 작성합니다.
  • 특강 신청에 성공한 사용자는 성공했음을, 특강 등록자 명단에 없는 사용자는 실패했음을 반환합니다. (true, false)

 💡 KEY POINT

  • 정확하게 30명의 사용자에게만 특강을 제공할 방법을 고민해 봅니다.
  • 같은 사용자에게 여러 번의 특강 슬롯이 제공되지 않도록 제한할 방법을 고민해 봅니다.

 

천방지축 어리둥절 빙글빙글 돌아가는 1주였다.

지난주보다는 시간분배도 잘했다고 생각했는데,

ERD 설계(랄 것도 사실 없지만...)부터 구현 및 테스트까지,

시간이 모자랐다.

 

하현우 코치님이 입이 닳도록 프로젝트 구조에 대해 설명하시는 거 들어서 구조 잘 짤 수 있다고 생각했는데,

컨트롤러 테스트 해서 컨트롤러 만드는 것까진 신나게 했는데,

Entity와 DTO를 나누고, 레파지토리를 추상화하는 과정에서 멘붕이 왔다.

 

DTO를 Entity로 바꾸어서 전달하고, 디비에서 받은 데이터를 다시 Entity에서 DTO로 바꿔서 던져주고 해야 한다고 머리는 이해하는데...

어느 위치에서 어떤 시점에 해야하는 거지...?

멘붕에 빠져서 시간을 엄청 잡아 먹었다.

레파지토리 추상화도 그냥 repository랑 impl로 나누면 되겠지 하고 있었는데,

JPA 레파지토리 추상화를 검색해 보니 갑자기 레파지토리커스텀이 등장하는 게 아닌가.

그래그래, 쿼리 커스텀해서 쓰니까 레파지토리커스텀을 써야하는구나.

근데 이건 또 어느 위치에서 어디에 참조해야하는 거지?

 

진짜 이 부분에서 모든 시간을 다 써버렸다.

그래서 선착순 30명 조건을 충족하기 위해 비관적 락을 적용하고 동시성 테스트 하는 코드는 날림으로 작성했다.

사실 동시성 테스트는 실패해서 다시 손봐야한다ㅠ


 

그래도 어찌어찌 2주 간의 챕터 1의 끝났다.

코드 실력은 상승했다고 보기 어렵겠지만 관념적인 시야는 조금 성장한 것 같다.

레이어드 아키텍처 기반의 클린 아키텍처는 어떻게 해야 하는가에 대해 조금은 익숙해졌고,

코드를 짤 때 이 기술을 왜 여기서 써야 하는지에 대해 생각하려 연습하고 있다.

 

챕터 2를 하는 3주 간의 목표는 클린 아키텍처에 익숙해지는 것 + 객체지향적인 코드를 짜는 것이다.

(절차지향적인 코드라고 피드백 받아서 슬프다)

그리고 아고라나 DM을 적어도 한 번은 사용해보는 것이 목표다.

내 지식이 많이 부족하다고 느껴 오히려 아고라나 DM으로 코치님께 물어보기가 어렵다.

 

Keep : 모르는 부분은 팀원들과 공유해서 해결하는 부분
Problem : 내가 모르는 것에 대해 말로 정리하기가 어렵다
Try : 아고라랑 DM도 활용해보자!
728x90

'항해99 플러스' 카테고리의 다른 글

6주차 회고록  (0) 2024.07.27
1년차 주니어 개발자의 항해 플러스 백엔드 5주차 회고록  (0) 2024.07.20
3주차 회고록  (0) 2024.07.06
1주차 회고록  (0) 2024.06.22
시작하는 마음  (2) 2024.06.15

+ Recent posts