작심삼일 다이어리 서비스 api 서버 개발
- 개발 기간 : 22.12.8 ~ 23.02.12
- Version
- Java 11
- Spring boot 2.5.3
- Mongodb 4.2
- 주요 기능
- Spring security, JWT를 이용한 회원 인증 관리
- 회원, 일기, 토큰 데이터 관리
- Redis를 이용한 Remote 캐시 적용
- Openfeign을 이용한 외부 API 호출
- OpenAPI를 이용한 api 문서화 및 테스트
- Exception Handler를 이용한 통합 및 개별 예외처리
- Spring-boot-validation을 이용한 데이터 검증처리
- JUnit을 이용한 단위 테스트
- Spring-boot-test-starter를 이용한 통합 테스트
[development]
- Spring-boot
- spring-boot-starter-web
- spring-boot-starter-validation:3.0.1
- spring-boot-starter-security
- spring-boot-devtools
- spring-boot-maven-plugin
- spring-boot-starter-actuator
- spring-boot-starter-aop
- Spring-security
- spring-security-test
- Spring-cloud
- spring-cloud-openfeign:3.0.3
- Springdoc
- springdoc-openapi:1.6.14
- lombok
- Serialization
- jackson-databind
- jackson-modules-java8
- gson:2.10
- json-simple:1.1.1
- JWT
- jjwt-api:0.11.5
- jjwt-impl:0.11.5
- jjwt-jackson:0.11.5
- datasource
- spring-boot-starter-data-elasticsearch
- spring-boot-starter-data-mongodb
- spring-boot-starter-data-redis
- de.flapdoodle.embed.mongo
- embedded-redis:0.7.2
[test]
- Spring-boot-starter-test
- sonar-maven-plugin:3.4.0
- jacoco-maven-plugin:0.8.5
- junit
- mockito-inline
📦jaksim31-backend-main
┣ 📂.github // 깃허브 액션 워크플로우
┃ ┗ 📂workflows
┣ 📂.mvn
┃ ┗ 📂wrapper
┣ 📂jaksim31-properties
┣ 📂scripts
┣ 📂src
┃ ┣ 📂main
┃ ┃ ┗ 📂java
┃ ┃ ┃ ┗ 📂com
┃ ┃ ┃ ┃ ┗ 📂sweep
┃ ┃ ┃ ┃ ┃ ┗ 📂jaksim31
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂adapter
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂cache // 캐시 Adapter 및 Serializer 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂aop // aop 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂auth // jwt 인증 관련 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂config // 설정 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂cache // 캐시 설정 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller // 컨트롤러 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂feign // 외부 api요청을 위한 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂config // api 요청 관련 설정 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂domain // 엔티티 & 레포지토리 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂auth // 인증 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂diary // 다이어리 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂members // 회원정보 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂token // 토큰 관련
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto // DTO 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂diary // 다이어리 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂extractkeyword // 키워드 추출 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂validator // 다이어리 데이터 Validator
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂login // 로그인 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂validator // 로그인 데이터 Validator
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂member // 회원 관련
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂validator // 회원 데이터 Validator
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂tokakao // 카카오 api 관련
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂enums // enum 모음
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂exception // exception 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂handler // exception handler
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂service // Service 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂impl // Service 구현 클래스
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂utils // 유틸 클래스
┃ ┗ 📂test
┃ ┃ ┗ 📂java
┃ ┃ ┃ ┗ 📂com
┃ ┃ ┃ ┃ ┗ 📂sweep
┃ ┃ ┃ ┃ ┃ ┗ 📂jaksim31
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂auth // 토큰 관련 통합 테스트
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂config // 테스트 환경 설정
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller // 컨트롤러 단위 테스트
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂domain // 레포지터리 단위 테스트
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂diary
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂members
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂token
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂integration // 통합테스트
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂service // 서비스 단위 테스트
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂impl
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂util // 테스트 시간 측정을 위한 유틸
┣ 📜.gitignore
┣ 📜.gitmodules // git submodule 정보
┣ 📜Dockerfile
┣ 📜LICENSE
┣ 📜README.md
┣ 📜docker-compose.yml
┣ 📜lombok.config
┣ 📜mvnw
┣ 📜mvnw.cmd
┗ 📜pom.xml
- local
./mvnw clean install -dspring.profiles.active=local -P local # 빌드
java -jar -Dspring.profiles.active=local -Duser.timezone=Asia/Seoul ./target/jaksim31-0.0.1.jar # 구동
- production
./mvnw clean install -dspring.profiles.active=prod -P prod # 빌드
java -jar -Dspring.profiles.active=prod -Duser.timezone=Asia/Seoul ./target/jaksim31-0.0.1.jar # 구동
-
커스텀한 보안 설정을 위해
SecurityFilterChain
Bean 생성 -
OncePerRequestFilter
를 상속받아 커스텀 filter 생성- 모든 요청에 대해 filter를 거치도록 설정
- Spring validator 사용하여 모든 Request body에 대해 검증 로직 구현
- Write/Update에 비해 Read 작업이 많이 발생할 것 같은 데이터에 대해 캐싱 적용, 각 캐시 데이터에 Expire time 적용
- Write/Update/Delete에 작업 발생 시 캐시 삭제, Read 작업 발생 시 캐시 조회
-
환경별 레디스 아키텍처에 따른 캐시 설정 메소드 작성 (Local -
Standalone
, Prod-Master/Slave
) -
Cache 작업을 위한 CacheAdapter 작성
- 캐시 데이터 별 작성
adapter/cache/DiaryPagingCacheAdapter.java
- put: 데이터 삽입 및 갱신
- get: 데이터 조회
- delete: 데이터 삭제
- findAndDelete: 해당 key를 포함하는 데이터를 찾은 후 삭제 (작업 시간 고려하여 10개씩 끊어서 스캔하도록 설정)
-
서비스 로직에 캐시 적용
- 필요한 기능에 따라 Annotation 또는 RedisTemplate 사용
service/DiaryServiceImple.java 일부 발췌
- spring.data.mongodb 라이브러리 사용
- Spring-boot-elasticsearch 라이브러리 사용
-
Elastic Search와 연동
config/ElasticSearchConfig.java
-
검색 조건 설정 및 elastic search 검색 api 호출
검색어
,날짜
,감정
에 대한 조건 설정
domain/diary/DiarySearchQueryRepository.java