핏터링은 체형 분석을 쉽게 하고, 나의 체형에 fit한 옷을 추천해주는 쇼핑몰 서비스입니다.
fittering-BE는 핏터링 서비스의 백엔드 코드를 관리하는 레포지토리입니다.
- 2023.06 ~ 2023.11
다음은 fittering-BE 구조입니다.
MVC 패턴에 맞게 디렉토리를 분리했으며, 각 레벨에서 DTO를 관리하도록 구성했습니다.
src
├─ main
│ ├─ java
│ │ └─ fittering
│ │ └─ mall
│ │ ├─ config
│ │ │ ├─ auth
│ │ │ │ └─ domain
│ │ │ ├─ cache
│ │ │ ├─ jwt
│ │ │ └─ kafka
│ │ │ └─ domain
│ │ │ └─ dto
│ │ ├─ controller
│ │ │ └─ dto
│ │ │ ├─ request
│ │ │ └─ response
│ │ ├─ domain
│ │ │ ├─ collection
│ │ │ ├─ entity
│ │ │ └─ mapper
│ │ ├─ repository
│ │ │ ├─ dto
│ │ │ └─ querydsl
│ │ ├─ scheduler
│ │ │ └─ dto
│ │ └─ service
│ │ └─ dto
│ └─ resources
└─ test
collection
: 일급 컬렉션 관리mapper
: MapStruct Mapper 인터페이스 관리test
: Service 내 각 함수에 대한 JUnit 테스트 코드 관리
핏터링 서비스는 다음과 같은 아키텍처로 구성되어 있습니다.
핏터링 서비스의 백엔드는 다음과 같은 아키텍처로 구성되어 있습니다.
다음은 각 기술을 사용한 이유와 블로그에 기록한 📄 기술 적용기, ➰ 관련 PR입니다.
- Spring Data JPA, Querydsl
- 개발 생산성 향상을 위해 적용
- 📄
- Redis
- API 응답 속도 향상을 위한 캐싱 적용 및
Spring scheduler
와 함께 배치 업데이트에 활용 - 📄
- ➰ Redis 캐시 : 조회수 배치 업데이트 설정 #39
- API 응답 속도 향상을 위한 캐싱 적용 및
- JWT + OAuth2
- 사용자 인증/인가 처리 수단으로
JWT
활용 및 소셜 로그인 기능 지원 - 📄
- ➰
- 사용자 인증/인가 처리 수단으로
- Grafana + Prometheus
- 서버 자원 정보 수집 및 모니터링
- 📄 [Spring] Grafana + Prometheus 연동해서 모니터링 하기
- ➰ Grafana + Prometheus 적용 및 추천 기능 수정 #4
- ELK (Logstash + Elasticsearch + Kibana)
- 서버에서 발생하는 로그 수집 및 모니터링
- 📄 [Spring] 스프링 부트에 ELK 적용하기
- ➰ ELK 설정 : 로그 분석 및 시각화 #78
- Kafka
- 운영 DB와 크롤링 DB 간 데이터 동기화 수행
- 📄
- ➰
- Docker
Redis
,Grafana
,Prometheus
,ELK
를 컨테이너 환경에서 관리
- GitHub Actions
- 프로젝트 자동화 배포를 위해 CI/CD 적용
- 📄 [Spring] Github Actions로 EC2에 자동화 배포 적용
- ➰
팀 내 API 문서 공유를 위해 Swagger를 적용했습니다.
아래는 문서 내용 일부로, 전체 문서는 여기에서 확인하실 수 있습니다.
- URI에
/auth
이 포함된 API는 사용 시 권한이 필요함을 의미 - 📄 [Swagger] API 문서 만들기
- ➰ 테이블 등록, 로그인/회원가입 구현, API 문서화 #1
- 생성 날짜
created_at
, 최종 수정 날짜updated_at
은 모든 엔티티의 공통 필드
- IntelliJ IDEA Ultimate 2023.1.3
- Java 17
- Spring Boot 3.1.1
- Spring Security 6.1.1
- Gradle 7.6.1
- MySQL 8.0.33
- ELK 7.6.2
- [Spring Security] There is no PasswordEncoder mapped for the id “null”
- [Spring] ClassNotFoundException: javax.xml.bind.DatatypeConverter
- [Spring] cannot deserialize from Object value
- [Prometheus] Get “http://host.docker.internal:8080/login”: stopped after 10 redirects
- [OAuth2] This class supports client_secret_basic, client_secret_post, and none by default
- [Spring] TransientPropertyValueException: object references an unsaved transient instance
- [Spring] Cannot construct instance of org.springframework.data.domain.PageImpl
- [Spring] java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree
- [Spring] java.lang.UnsupportedOperationException
- [Spring] actual and formal argument lists differ in length
- [Spring] JWT를 적용하면서 발생한 에러 정리
- [Spring] IllegalStateException: Ambiguous handler methods
- [Spring] multipart.MultipartException: Current request is not a multipart request
- more details...