편의점에서 담배 재고를 쉽게 검수하기 위해 제작된 웹 서비스입니다.
매장 별로 '담배 목록'을 만들 수 있고 이를 편집함으로서 담배를 검수합니다.
담배 목록은 다른 사람들과 공유가 가능한데, 각 목록 생성자가 접근 권한을 관리하며, 소켓 통신을 활용해 실시간 공동 편집을 지원합니다.
- 담배 목록
- 담배 목록 생성/수정/삭제
- 담배 추가/수정/삭제
- 담배 순서 조정
- 담배 목록 내 검색
- 동시 편집
- 담배 목록 실시간 동시 편집 (구글 스프레드시트와 유사)
- 목록 접근 권한 관리 (요청/허가/비허가/관리자 권한 인계)
- 그 외 기능
- 로그인, 비밀번호 찾기
- 알림 (Pageable 조회)
- 설정 (개인정보 수정)
- 업무 꿀팁 컨텐츠
- 실제 서비스 가능한 완성도로 서버-클라이언트 구현(API, UI, 통신 규약, 기능성)
- 소켓 통신을 통한 동시 편집 구현
- 캐시, DB 통신 최소화를 통한 성능 최적화
- 서버 확장, 대용량 트래픽과 운영을 고려한 방식
- 성능테스트를 통한 튜닝
- 로직이 잘 보이고 확장, 유지보수하기 좋은 코드
- Spring Boot
- Spring Data JPA
- MySQL
- Redis
- nginx
- Stomp
- Docker
- Jenkins
- Naver Cloud Platform
- Naver Cloud Platform의 서버로 구성되어 있습니다.
- github hook을 받아 Jenkins에서 CI/CD를 진행합니다.
- Jenkins측에서 Dockerhub에 이미지를 push하고, 앱서버 측에서 이미지를 pull합니다.
- Blue-green 방식으로 무중단 배포됩니다.
- 사용자의 요청은 nginx에 의해 프론트엔드 리소스와 api요청을 분기 처리됩니다.
- WAS는 3개 서버로 운용됩니다.
- DB는 Primary-Slave 구조의 2개 서버로 운용됩니다.
🔗 서버 Scale-out에 대비해, 세션 정보를 DB에 중앙화해 저장함으로써 Stateless하게 유지
🔗 Jenkins와 Docker, nginx를 이용한 Blue-Green 무중단 배포 🔥
🔗 로드밸런서 적용하면서 CORS, hop-by-hop 헤더, 정적리소스 반환 문제 해결
🔗 성능테스트를 통한 서버 튜닝으로 핵심 요청 TPS 239 -> 4292 (스케일업 아웃, 커넥션풀, 스레드풀, 레플리케이션) 🔥
🔗 Redis hash 자료구조를 이용해 탐색시간 줄이기
🔗 간편하게 캐시와 DB를 연계 활용하는 캐시 모듈 제작 🔥
🔗 원자성을 위해 Redis에 @Transactional 적용하기
🔗 Redis Pipeline으로 Bulk Insert 시 네트워크 병목 개선
🔗 캐시에 저장-로드할 때 리플렉션으로 DTO-Entity 변환
🔗 캐시와 세션별로 Redis 서버 분리 및 eviction, maxmeory 최적화
🔗 코드 수준의 동적 스케줄러로 캐시에서 DB로 Write-Back
🔗 DB 락 최소화를 위한 @Transational 최소화
🔗 실시간 공동 편집을 이벤트 기반의 STOMP 소켓통신으로 구현
🔗 서비스 코드가 통신 방식에 종속되지 않도록 DTO Wrapping
- Wrapper 구조를 이용해 HTTP, 소켓 통신에서의 예외를 일관되게 처리
- 비지니스 예외 발생 시 소켓 연결 유지하며 예외 메시지 발송
- 권한검사 인터셉터 예외 처리
- 트리구조의 런타임 예외 상속 적극 활용
- ControllerAdvice, ExceptionHandler 활용
- 성공, 실패 모두 일정한 HTTP 응답 형태
UI는 실사용 시 마주할 수 있는 다양한 시나리오에 대응하면서, 다양한 해상도에서 일관되게 작동되도록 구현되었습니다.