프로젝트 기간 : 2024.02.07. ~ 2024.03.28
스프링 부트와 클라우드 서비스를 활용한 온라인 도서 쇼핑몰 프로젝트입니다.
- Intellij IDEA - Ultimate
- Maven
- Spring Framework : 5.x
- Spring Boot : 2.7.18
- Spring Cloud Config, Gateway, Netflix Eureka
- Spring Data JPA, Querydsl
- Spring Security
- Spring Rest Docs
- Spring Batch
- Junit5
- AssertJ
- Mockito
- SonarQube
- MySQL : 8.x
- Redis
- Elastic Search : 7.x
- ERDCloud
- Instance
- Secure Key Manager
- Object Storage
- Load Balancer
- Dooray Hook Sender
- Toast UI
CKIN ERD : https://www.erdcloud.com/d/9aZQ5oDB87BGD2v8k
ERDCloud
활용
Github에서 제공하는
Projects
를 활용하여 프로젝트 관리
- 주마다 Scurm Master를 변경하는 방식으로 진행
- 매일 진행 예정 사항과 특이사항을 정리하여 체계적인 프로젝트 진행
- Road Map, Kanban 활용
- 일정 관리 및 진행 사항 공유
- 정적 코드 분석 도구인
SonarQube
를 활용하였습니다. - 목표 : Coverage 80%
Coupon : https://www.ckin.store/coupon-docs
CKIN Study Materials : https://github.com/nhnacademy-be4-ckin/study-materials
- 프로젝트를 진행하면서 학습 내용 공유 저장소를 이용하여 습득한 기술을 공유하였습니다.
- 또한,
Issue
,Discussion
을 통해 해결하기 어려운 문제, 버그를 고친 방법 등을 팀원들과 공유하였습니다.
- 회원/비회원 주문 처리
- 회원 주문
- 포인트, 쿠폰 사용 가능
- 적용할 수 있는 쿠폰
- 포장 가능한 도서인 경우 포장지 선택 가능
- 배송지 입력 (Daum Postcode API)
- 주문 상세 내역 조회
- 주문 배송 상태가
배송 중(IN_PROGRESS)
인 경우에만 주문 취소 가능 - 결제 완료된 주문
- Toss Payment API를 통한 결제 취소
- 회원 주문 취소
- 사용 포인트, 적립금 고려하여 처리
관련 PR : 토스 페이먼츠 API 연동 | 결제 - 생성
- 주문 완료 후 Toss Payment API를 통한 결제 진행
- 결제 성공/실패에 따른 처리
- 결제 완료 시 API 서버에 결제 정보 저장
- 또한, 결제 완료된 주문의 결제 상태를 완료(PAID)로 변경
@Transactional의 propagation
옵션을 통해 트랜잭션 처리
관련 Discussion : 결제 완료시 포인트 적립 처리를 어떻게 해야될까?
- 회원 가입 시 포인트 적립 정책에 따른 포인트 적립
- 주문시 사용한 포인트 차감 및 포인트 내역 생성
- 결제시 회원 등급에 따른 포인트 적립
- 회원의 포인트 적립/차감 내역 조회
관련 기술 공유 내용 : Spring Cloud Netflix Eureka 도입 + 무중단 배포
Spring Cloud Netflix Eureka
- 서비스 디스커버리 및 로드밸런싱
- API Server 무중단 배포 구축
- NHN Cloud Load Balancer
- Front Server 무중단 배포 구축
- Spring AOP 활용 -
@Member
어노테이션을 통한 Model 객체에 회원 정보 주입 @ExceptionHandler
를 통한 전역 예외 처리- 배송비 정책 관리
- 포인트 적립 정책 관리
- 포장 정책 관리
관련 Issue : 장바구니 커스텀 알럿 추가 | 상품 수량 조작 시 검증 안되는 버그 | [BUG] RedirectAttributes의 addFlashAttribute 사용시 주의
- 장바구니 데이터 Redis 저장 및 분리
Interceptor
를 이용한 Key(CART_ID(UUID)
) 기존 DB 및 사용자 쿠키에 저장- 로그인시 회원 장바구니 불러오는 기능 구현
- 회원/비회원에 따른 쿠키 유효기간 설정
- 회원 - Access token 유효기간과 동일하게 유지 및 갱신, 로그아웃 시 삭제
- 비회원 - 2일 (정책)
- 주문할 도서 담기 담기, 수량 조절 및 삭제 처리
- 검증 및 상품이 이미 존재하는 경우 예외 처리
- MSA 에 따른 주문 시 주문 페이지로 정보 전달 로직 구현
- (Front) 선택 주문, 총 합계 금액 등 JS를 통한 동적 스크립트 작성 및 구현
관련 PR : 검색 필터링 기능 추가(검색 대상)
Elasticsearch
기술 사용, 검색 기능 구현- 검색 우선순위에 따른 가중치 설정
- 필드의 특성을 고려한 인덱스 구성(analyzer, filter, tokenizer)
Dictionary
사용한 동의어/유의어 검색 처리
- 검색 필터링 기능으로 검색된 도서 필터링
- 검색 필터(책 제목, 저자, 출판사, 도서 설명), 카테고리 필터 적용
Logstash
기술 사용, 추가 및 변경된 도서 특정 시점에elasticsearch
에 저장- 일대다 속성들(
Category, Author, Tag
)에 따른 적절한 집계 쿼리 작성 @EntityListeners
사용하여Book
Entity 추가 및 수정 시점에modifiedAt
컬럼 최신화
- 일대다 속성들(
Kibana
기술 사용, 검색 관련 정보 시각화
- 관리자 페이지에서 태그 관리(CRUD)
- 한 도서에 여러개의 태그 추가 가능
관련 기술 공유 내용 : Spring Cloud Gateway | Secure Key Manager
-
Spring Cloud Gateway
- 마이크로서비스 기반 API Gateway 환경 구현
-
Secure Key Manager
- Cloud 기반 Secure Key Manager 환경 구현
- 암호화 필요한 데이터 관리 및 인증서 관리
-
Spring Rest Docs
- 환경 설정 및 기술 공유
-
중복 로직 및 응답 공통화
Pagination
관련 응답 PagedResponse 로 공통화(front, backend)- Exception 발생시 Response 공통화
- 커스텀 Alert 유틸 로직 공통화(front)
Spring Security
- 회원의 권한에 따른 페이지 인가
- 로그인/로그아웃
- 페이코 연동을 이용하여 소셜 로그인
JWT
를 이용하여 자격증명 및 서버통신Redis
를 이용하여 매핑된 회원 정보 조회- Gateway에서 Backend과 통신하기 전, 인증/인가
- 인증된 정보를 이용하여
JWT
발급/재발급 (CKIN-Auth)
- 회원가입
- 계정 중복검사 및 비밀번호 유효성 검사
- Dooray Hook을 이용한 SMS 인증
- 마이페이지를 통하여 회원 정보 조회, 수정, 탈퇴
- DAUM 주소 API를 사용하여 회원의 주소 등록
- 마이페이지를 통하여 회원의 주소 관리 (CRUD)
- 관리자페이지에서 등급 관리 (CRUD)
- 마이페이지에서 회원의 등급 조회 및 등급 정책 확인
- 관리자 페이지에서 상품 등록, 수정, 삭제
- 상품 등록 시 editor 적용(toast ui)
- 썸네일 수정 기능
- 저자 등록, 수정, 삭제
- 카테고리 생성, 수정, 조회
- 부모 카테고리, 자식 카테고리로 이뤄진 3depth 형태
- 메인페이지의 카테고리 캐싱(Redis)
- Object Storage 저장
- 마이페이지에서 해당 유저가 작성한 리뷰 조회 및 수정
- 생일쿠폰, 웰컴쿠폰, 도서쿠폰, 카테고리쿠폰 발급
- 쿠폰 정책, 쿠폰 템플릿, 쿠폰 생성, 조회, 수정, 삭제
- 회원가입시 웰컴쿠폰 자동 지급
- 웰컴쿠폰 지급이 실패해도 회원가입은 성공하도록 처리
- JPA(Hibernate), JDBC Templates, MyBatis 중 bulk insert가 가능하고 기본키 전략을 사용하지 않는 Mybatis 선택
MyBatisPagingItemReader
사용
- 리뷰 등록
- 리뷰 이미지 다중화를 통해 한 리뷰에 여러 이미지를 등록할 수 있도록 처리
- 주문한 도서에 대해서만 리뷰를 작성할 수 있도록 처리
- 사용기술 : Spring Data JPA, Query DSL, Thymeleaf, javascript 등
- 접속 빈도가 높은 메인페이지의 도서를 Redis에 저장
- 만료시간을 하루로 설정하고 갱신하여 처리
- 사용기술: Redis
- JUnit5를 활용한 테스트 코드 작성
Spring Rest Docs
를 활용한 API 문서화- CI/CD 환경 구성 (
Jenkins
,GitHub Actions
) SonarQube
를 통한 정적 코드 분석