<aside>
📌
대면 피드백 전 기재 사항
</aside>
<aside>
📜 프로젝트 정보
- 서비스명: Give Me The Ticket
- 서비스 기획 의도:
- 일반적인 중고 거래 티켓은 암표 형태로 진행됨
- 그래서 가격의 상한선이 존재하지 않고 사기 당할 위험도 사용자가 부담해야 함
- 하지만 이 서비스를 사용하면 티켓을 예매한 곳에서 중고 거래를 하여 안전하고 알맞은 가격에 거래가 가능함
- 프로젝트 한 줄 설명: 공연 예매와 예매한 티켓의 중고 거래를 한 곳에서 지원하는 서비스
- 최종 MVP 스펙:
- Front-End: HTML, CSS, JavaScript, EJS
- Back-End: TypeScript, Node.js, Nest.js
- DataBase: MySQL, TypeORM, AWS RDS
- Deploy: Gibhub Actions, AWS EC2, ALB, ACM
- 팀 노션 URL :
- (선택)서비스 배포 URL :
</aside>
<aside>
📜
트러블 슈팅
- CI/CD
- 발생 문제 1: CD workfolw 멈춤 현상 (1)
- 발생 문제 2: CD workflow 멈춤 현상 (2)
- Portone 결제 기능
- 오류 발생 과정
- 발생 문제 1: 유효하지 않은 merchant_uid
- 발생 문제 2: 충전 금액
- 발생 문제 3: 포인트 이중 충전 문제
- Elasticsearch
- 발생 문제 1
- 발생 문제 2
- 발생 문제 3
- 발생 문제 4
</aside>
<aside>
📜
기술적 의사결정
요구 사항 |
선택한 기술 |
선택지 목록 |
선택한 이유 |
언어 |
TypeScript |
- TypeScript |
|
- JavaScript | - 타입 안전성을 제공해서 런타임 상에서 오류를 줄일 수 있음
- 기존 JavaScript 코드와 호환되기 때문에 쉽게 마이그레이션할 수 있음
- 모듈화로 코드 구조화 및 유지보수성을 높일 수 있음 |
| 프레임워크 | Nest.js | - Nest.js
- Express.js | - TypeScript를 지원하여 타입 안전성을 향상시킴
- Nest.js에서 제공하는 의존성 주입 기능을 통해서 코드의 재사용성과 유지 보수성을 향상 시킬 수 있음
- 데코레이터, 메서드, 클래스 등 다양한 기능을 내장하여 여러 요구 사항에 유연하게 대응할 수 있음
- 기본적인 문법이나 구조는 잘 정리된 공식 문서를 통해서 학습이 가능함 |
| 데이터베이스 | MySQL | - MySQL
- NoSQL
- MongoDB | - 관계형 데이터베이스를 사용해서 공연, 사용자, 예매 등 복잡한 관계를 관리할 수 있음
- ACID 트랜잭션을 지원하기 때문에 예매 과정에서 발생할 수 있는 오류나 충돌을 방지할 수 있음
- 다양한 도구와 라이브러리가 지원되기 때문에 개발 및 운영 시 편의성을 제공 받을 수 있음
- 대량의 데이터를 처리할 때 인덱싱, 로우 쿼리 사용 등을 통해서 데이터베이스의 성능을 극대화할 수 있는 방법이 많음 |
| ORM | TypeORM | - TypeORM
- Prisma
- Mongoose | - TypeORM은 TypeScript로 작성되기 때문에 타입 안전성을 제공함
- MySQL과 같은 관계형 데이터베이스와 호환성이 좋음
- 쿼리 빌더를 제공하기 때문에 복잡한 데이터베이스 쿼리를 로우 쿼리와 유사항 형태로 쉽게 작성할 수 있게 도와줌
- 잘 정리된 공식 문서를 가지고 있고, 검색 시 다양한 자료에 접근이 가능함 |
| CI/CD | Github Actions | - Github Actions
- GitHub Actions + Docker
- Jenkins | - Github 저장소와 연결되어 있기 때문에, 코드 Push, Merge, PR 등 다양한 이벤트에 대해 CI/CD 파이프라인을 설정할 수 있음
- YAML 기반의 구성 파일을 이용해서 CI/CD 진행 과정을 쉽게 설정할 수 있음
- 코드 형태로 관리되기 때문에 버전 관리가 가능하고 협업에도 용이함
- Github에서 GUI 형태로 CI/CD workflow에서 발생하는 오류나 경고를 실시간으로 확인할 수 있어서 신속하게 문제를 발견하고 해결할 수 있음
- 무엇보다 간편함과 통합된 환경 때문에 선택함
- Docker를 결합한 방식은 시간 부족으로 사용하지 못함 |
| 프론트엔드
| EJS | - EJS
- React
- Bubble.io
- handlebars
- pug | - EJS는 기존에 알고 있는 html를 사용할 수 있고, 자바스크립트를 자유롭게 사용할 수 있음.
- React는 유연성 및 커스터마이징이 가능하고 우수한 성능을 보이나, 학습의 어려움이 있음.
- Bubble.io는 사용이 쉽지만, 백엔드에서 반환된 값을 가져와서 저장하는 등 데이터 활용이 어렵고 공동 작업을 하려면 과금이 필요함
- pug는 지금까지 알고 있었던 다른 형태의 html 템플릿임 |
| 프론트엔드 API 호출 방식 | Axios | - Axios
- Fetch | - Axios는 직관적인 API를 제공하기 때문에 HTTP 요청을 훨씬 간단하게 수행할 수 있음
- 서버에서 받은 응답을 자동으로 JSON 형태로 변환해 줌
- IE와 같은 구형 브라우저에서도 잘 동작함
- HTTP 오류 코드가 반환될 시 자동으로 오류를 발생시켜서 try ~ catch 문으로 예외 처리가 가능함 |
| 동시성 처리 | BullMQ + Redis | - BullMQ + Redis
- rabbit queue
- active queue
- 분산 Locks(RedLock) | - 티켓 예매는 여러 사용자가 동시에 요청하는 경우가 많고 이 경우에는 요청을 한 순서가 굉장히 중요하기 때문에 Queue를 사용함
- BullMQ의 우선순위 기능을 통해서 공정한 예매 환경을 조성할 수 있음
- Nest.js 공식 문서에서 기본적인 구조와 사용법을 제공하고 있기 때문에 학습이 용이함
- TypeScript로 작성되어 있어, 타입 안전성을 제공할 수 있음
- rabbit Queue는 복잡한 애플리케이션에 필요하고, 학습에 어려움이 있음.
- activemq는 사용이 용이하지만, 보안에 취약한 서비스 버전이 있어서 보안 관련 이슈가 있음. |
| 동시성 테스트 도구 | Apache JMeter
| - Apache JMeter
- Locust | - jmeter는 다양한 기능과 프로토콜을 지원함.(https 배포를 지원함.)
- locust는 테스트를 쉽게 확장하나 https 지원이 되지 않는 단점이 있음. |
| 공연 검색 | ElasticSearch | - ElasticSearch
- TypeORM %Like% | - DB-Engines Ranking에서 3위를 차지할 만큼, 많은 사람이 사용하기 때문에 문제 발생 시 해결 방법도 많이 있고 참고 자료가 다양함
- Lucene를 기반으로 한 오픈소스 검색 엔진
- 전문 검색 가능
- 역색인 구조를 통해 단어가 포함된 특정 문서의 위치를 알아내서 빠르게 결과를 찾을 수 있음 |
| 공연 목록 조회 | Pagination | | - 전체 데이터를 가져오는 것보다 페이지 당 데이터를 정해서 가져오니까 검색 속도가 빠름
- 사용자 의도에 맞게 페이지를 넘기기 가능 (사용자가 원하는 페이지 클릭)
- 원하는 항목의 위치를 확인 가능 (어떤 공연이 몇 페이지에 있었다는 것을 알 수 있음) |
</aside>
<aside>
📌
대면 피드백 후 기재 사항
</aside>
<aside>
📜
피드백 기록
- 스트레스 테스트 진행 필요
- 엘라스틱 서치를 통한 검색 기능의 개선 정도 보여주기
- 레디스를 캐싱 용도로 사용한다면 어떤 데이터를 캐싱하는지 알려주는 게 좋음
- sentry로 에러 추적, 로그 수집도 가능함
- 비관적 락도 서버가 여러 개일 때 정상적으로 동작하지 않을 수 있음
- 트러블 슈팅2는 트러블 슈팅보다는 운영 영역에 가까움
- 먼저 큰 그림을 보여주고 세세한 기능을 설명하면 더 이해가 잘 될 듯함
- MVP 중간 발표 이후의 일정을 간트 차트로 표현하면 좋을 것 같음
- 서비스 주제에 대한 기능들이 더욱 돋보일 필요가 있음
- 새로운 기술을 사용하는 것은 좋으나, 너무 학습에 몰두하여 다른 기능에 소홀해지면 안 됨
</aside>
<aside>
📜
중간 발표 후 회고
1️⃣ 구현되지 않은 MVP 기능
2️⃣ 추가하거나 개선해야 하는 기능 및 그 이유
- 분산 락: 서버가 여러 개 일 때 정상적으로 작동할 수 있게 만들기 위함
- 중고 거래 목록 조회 페이지네이션 기능: 페이지를 깔끔하게 보여주기 위함
- 공연 정보 페이지: 개선 예정
- 랭킹으로 인기 공연 조회: 추가 예정
- Jmeter를 이용한 스트레스 테스트
- 포인트 내역 조회 고도화(필터링) 및 공연 조회 캐싱: 개선 예정
3️⃣ 추가하거나 개선할 기능을 어떻게 구현할지
- 공연 정보 페이지:
- 중고거래 티켓 구매 및 공연 티켓 구매
- 인기 공연 조회: redis에서 제공하는 랭킹 기능으로 인기 공연을 조회할 예정
- 포인트 내역 조회 고도화(필터링) 및 공연 조회 캐싱: redis의 캐싱 기능을 이용할 예정
</aside>