Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Device Token 등록/수정/삭제 API #51

Merged
merged 62 commits into from
Apr 18, 2024
Merged

Conversation

psychology50
Copy link
Member

작업 이유

  • 사용자의 Device 정보와 Device Token 저장 API 구현
  • 사용자의 Device 정보를 제거 API 구현

작업 사항

📝 Device 정보 등록 플로우

{
    "originToken": "",
    "newToken": "",
    "model": "",
    "os": ""
}
  1. Client에 캐싱된 token이 없는 경우
    • originToken == newToken 요청을 보낸다.
    • 서버는 요청자의 Device로 해당 device 정보를 갱신한다.
  2. Client에 캐싱된 token이 존재하여 수정을 요청하는 경우
    • 서버는 userId에 매핑된 originToken 정보를 탐색한다. (없으면 NOT FOUND)
    • Device 정보를 찾았으나, 모델 정보가 다른 경우 업데이트
    • Device Token을 newToken으로 갱신
    • Device Token이 비활성화 상태라면 활성화 상태로 전환

❓ 예상 질문 답변 모음

  1. Device Token이 unique 필드가 아닌 이유
    • 여러 사람이 하나의 기기로 로그인 했을 경우, 서로 다른 User에게 같은 device token 정보가 등록될 수 있기 때문입니다.
  2. 기기 정보가 바뀌었을 때, NOT_MATCH 에러가 아니라 정보를 수정하는 이유
    • 모델명이 바뀔 일은 잘 모르겠지만, OS는 분명히 달라질 수 있기 때문입니다.
  3. 토큰을 삭제하지 않고, 활성화/비활성화 컬럼을 추가한 이유
    • 현재 저희 정책은 Client 측에서도 토큰 유효성 검사를 수행하면서, 추후 Server에서도 토큰 관리를 위한 스케줄러를 구현하게 됩니다.
    • 만약 Client가 Device Token을 발급받아 서버에 저장한 후, 한 달 정도 앱을 실행하지 않은 경우 서버의 스케줄러가 해당 토큰을 비활성화 했을 확률이 높습니다.
    • 이 경우 Client는 수정 요청을 보냈으나, Server는 originToken을 식별하지 못 해 요청에 실패하게 됩니다.
    • 따라서 만료된 토큰은 비활성화 처리하여, Client의 수정 요청에 대응하도록 합니다.
  4. 토큰 저장 요청(originToken == newToken, 예상 질문 4번) 시, 토큰 존재 여부를 먼저 검사하는 이유
    • Server에는 활성/비활성 토큰이 존재하지만, 사용자가 app의 데이터를 제거해버린 경우 발생합니다.
    • 사용자가 앱 데이터를 삭제하고 실행할 때마다 활성화 토큰이 계속해서 저장될 가능성이 있어, 이미 존재하는 경우 model, os 버전만 변경 사항을 반영합니다.

🟢 테스트 케이스

1️⃣ Controller Unit Test


2️⃣ Service Unit Test


🤔 test에 fixture, supporter...양재서 너 이 자식, 또 PR 관심사 분리 실패냐?

📢 진정하고 제 이야기를 들어보십시오.

🚨 문제 상황 발생

  • Controller Unit Test 시, isAuthenticated() 인가 조건에 의해 @WithMockUser를 사용했으나 에러 발생

  • @AuthenticationPrincipal 어노테이션이 SecurityUserDetails를 알지 못 하기 때문에 생기는 이슈

💡 해결 방법

@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithCustomMockUserSecurityContextFactory.class)
public @interface WithSecurityMockUser {
    String userId() default "1";
}
  • @WithMockUser 대신, 제가 만든 커스텀 어노테이션 @WithSecurityMockUser를 사용하면 됩니다.
  • @WithMockUseruserId를 값을 지정하지 않으면, 언제나 userId는 1입니다.
  • 통합 테스트 환경에선 애초에 MockUser를 사용할 이유가 없으므로, 인가 권한이 isAuthenticate()인 Controller Unit Test에만 사용하면 됩니다.
  • 해당 블로그에 잘 정리되어 있습니다.

🔪 Fixture는 뭔데?

  • 반쯤 재미삼아 사용해봤습니다...이 블로그를 참고하시면 돼요.
  • 다만, 디렉토리 경로를 매우 무신경하게 정했기 때문에 재조정이 필요합니다. (애초에 테스트 Convention이 너무 없는 상태)
  • 뭔가 편한데 생각보다 사용이 까다로워서, 일단 이번 테스트에만 적용해보고 반응을 보고 싶었습니다.

리뷰어가 중점적으로 확인해야 하는 부분

  1. 비지니스 로직을 담당하는 DeviceRegisterService이 설계 원칙을 준수하고 있다고 보는지? (이름, 내부 메서드 등)
  2. 시나리오에 문제점이 있거나, 잘못된 테스트 케이스가 있는지?
  3. 발견한 이슈 (2)번 꼭 확인해주세요!!

발견한 이슈

  1. 현재 서버가 스케줄링을 통해 비활성화 한 토큰을 Client 측에서 제거해버린 경우에 대응하지 못 함. (쓰레기 데이터 누적)
    • 관리 정책을 수립하여 제거할 지, 로직을 수정할 지 모르겠음..
  2. 현재 토큰이 바뀌지 않았음에도 Device 정보가 수정되면 updated_at 필드가 수정되는 현상이 발생합니다. 이로 인해 FCM 관리 정책이 무의미해질 수 있습니다.
    • 해당 시나리오는 사용자가 app 데이터를 제거하고 디바이스 업데이트 후, 앱을 다시 실행했을 때 발생 가능합니다. (Server에는 여전히 유효한 token이 존재하므로)
    • Table을 분리할 지, 제 설계 상 문제가 있는지 고민해봐야 할 문제입니다.

@psychology50 psychology50 added the enhancement New feature or request label Apr 18, 2024
@psychology50 psychology50 self-assigned this Apr 18, 2024
Copy link
Member

@jinlee1703 jinlee1703 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 PR은 작업량이 많네요.. 고생하셨습니다!!

  • PR 내용대로 디바이스 토큰 관리 정책에 대해 한번 더 이야기해봐도 좋을 것 같습니다.
  • 저도 이야기했던대로 Mapper보다는 상위 서비스 개념으로 xxxService(ex: DeviceRegisterService)로 명명하는 것이 보다 직관적이라고 생각합니다!
  • 디바이스 토큰 관리 로직의 경우에는 현재 전체적인 구조가 헷갈려서, 제가 문서를 보고 따로 생각을 정리해본 후 모르는 부분에 대해 질문하겠습니다.

@psychology50
Copy link
Member Author

  • PR 내용대로 디바이스 토큰 관리 정책에 대해 한번 더 이야기해봐도 좋을 것 같습니다.

해당 시나리오는 이슈로 추가 등록해두겠습니다!

  • 저도 이야기했던대로 Mapper보다는 상위 서비스 개념으로 xxxService(ex: DeviceRegisterService)로 명명하는 것이 보다 직관적이라고 생각합니다!

앗, 이건 다소 오해가 있는 것 같습니다.
제가 이전에 Mapper를 사용했던 방식은 직관적이거나 하는 것과 무관하게 그냥 틀린 방식이라 여깁니다.

전 단순히 Mapper를 여러 DB에서 정보를 가져온 후 가공하는 중간 단계라 여기고 작업하다보니, Service를 써야 할 지 Mapper를 써야 할 지 혼동하고 있었던 건데,
이번에 작업하면서 느낀 것은 Mapper는 data에 관심을 가지고 있고, (application 모듈의)Service는 핵심 비지니스 로직을 담아야 한다고 생각합니다.

즉, Helper와 Mapper는 비지니스 로직을 위한 클래스가 아닌 것 같더라구요.
기존 코드는 모두 리팩토링할 예정입니다.

  • 디바이스 토큰 관리 로직의 경우에는 현재 전체적인 구조가 헷갈려서, 제가 문서를 보고 따로 생각을 정리해본 후 모르는 부분에 대해 질문하겠습니다.

저도 정리해두려고 했는데 블록체인 수업 들으러 가느라 잊어먹었네요.
내일 정리해서 공유하겠습니다!

@psychology50 psychology50 merged commit bffb3b6 into dev Apr 18, 2024
1 check passed
@psychology50 psychology50 deleted the feat/PW-222-device-token branch April 18, 2024 16:05
psychology50 added a commit that referenced this pull request Aug 27, 2024
* chore: init project

* feat: 멀티 모듈화

* feat: common-공통 어노테이션 정의

* docs: 프로젝트 설명 및 모듈 별 Convention과 디렉토리 구조 임시 작성

* docs: 프로젝트 readme 재작성

* docs: 프로젝트 소개 README 오탈자 수정

* docs: PULL_REQUEST_TEMPLATE.md 작성

Co-authored-by: jinlee1703 <jinlee1703@gmail.com>

* fix: 템플릿 경로 수정

* feat: 7-bit error code enum 및 interface 정의 && causedBy record 정의

* rename: 공통 예외 클래스 및 인터페이스 주석 추가

* feat: CausedBy 검증 로직 추가 && rename: CausedBy 메서드별 주석 추가

* rename: Domain Code 주석 수정

* rename: Field Code 주석 수정

* rename: CausedBy 정적 팩토리 메서드명 valueOf -> of로 수정

* fix: CausedBy code 자릿수 검증 로직 수정 && test: CausedBy 객체 6가지 테스트 케이스 작성

* rename: CausedBy 정적 팩토리 메서드 주석 수정

* ✨ JwtProvider 인터페이스 및 AT, RT Provider 구현체 정의 (#6)

* chore: common 모듈에 spring-core 의존성 주입 && infra 모듈에 jwt 의존성 주입

* feat: Auth 상수 설정

* feat: JwtProvider 인터페이스 정의

* feat: domain & field zero 상수 작성

* feat: Jwt 예외 상수 설정

* feat: Jwt 예외 클래스

* fix: ReasonCode Zero bit 추가

* feat: JwtErrorCodeUtil 작성

* chore: application.yml profile 분리

* feat: AT, RT Qualifier 목적 커스텀 어노테이션 작성

* chore: jwt secret key & expiration time 환경변수 주입

* rename: provider annotation 네이밍 변경 -> 전략

* feat: common 모듈에 DateUtil 추가

* feat: access token claim dto && provider 작성

* test: AccessTokenProvider test 작성

* fix: test given절 축약

* refactor: AT Claims key 상수값으로 명시적 필드 지정

* feat: refresh token dto && payload key 상수화

* feat: refresh token provider 작성

* test: 서명 조작 토큰 에러 검증

* rename: getSubInfoFromToken -> getJwtClaimsFromToken 메서드명 변경

* rename: JwtProvider 주석 수정 및 메서드 순서 변경

* fix: 토큰 만료시 예외 핸들링

* test: 토큰 만료 시, true 반환 검사 테스트 코드 추가

* fix: isTokenExpired() 메서드 예외 핸들링 로직 수정 : 테스트 성공

* ✨ JDBC & JPA & QueryDsl Configuration 설정 (#7)

* chore: mysql & jpa & queryDsl gradle 의존성 추가

* chore: queryDsl generated 디렉토리 git 추적 제거

* chore: jdbc, jpa application.yml 설정 추가

* chore: extenal-api 모듈 application.yml 그룹 추가

* chore: jpa 설정 profile 분리 && profile 그룹 추가

* chore: infra 모듈 application.yml 그룹 추가

* feat: Jpa config

* feat: QueryDsl config

* chore: EnalbeJpaAuditing auditorAwareRef 설정 제거

* fix: config 디렉토리 수정

* Conventional Commit을 위한 Git Hooks 설정 (#8)

* chore: commit-lint 관련 패키지 설치

* chore: .gitignore에 node_modules 추가

* chore: commit convention 등록

* chore: commit-lint 적용

* ✨ Redis Configuration 설정 (#9)

* chore: infra 모듈 내 redis 의존성 주입 (api)

* chore: domain 모듈 내 redis 의존성 주입 (implementation)

* chore: redis 환경변수 설정

* feat: Domain Redis Connection Bean Qualify Annotation 생성

* feat: Domain Redis CacheManager Qualify Annotation 생성

* feat: Domain Redis Template Qualify Annotation 생성

* chore: domain 모듈 redis config 작성

* feat: Infra Redis CacheManager Qualify Annotation 생성

* feat: SecurityUser Redis CacheManager Qualify Annotation 생성

* feat: Oidc Redis CacheManager Qualify Annotation 생성

* chore: infra 모듈 cache config 설정

* ✨ OpenAPI Swagger config 설정 (#10)

* chore: external-api 모듈 springdoc-openapi 2.4.0 의존성 주입

* chore: external-api 모듈 내 openapi 설정 추가

* chore: swagger config 작성

* fix: application profile prod -> dev

* ✏️ Reason Code Zero bit 제거 → 500번대 Zero bit 상수 추가 (#11)

* fix: reason code zero bit 제거 && 500번대 0번 bit 상수 추가

* test: caused-by-test 예상 에러코드 수정 (통과 확인)

* fix: jwt-error-code 변경된 reason code로 수정

* Swagger 관련 환경 변수 오타 수정 (#12)

* ✨ 응답 공통화 및 전역 예외 처리 (#14)

* chore: test api directory .gitignore 경로 추가

* feat: 성공 응답 클래스 정의

* feat: error-response 공통 응답 클래스 작성

* fix: success 응답 nocontent() 응답 null -> empty object

* feat: method argument not valid 전역 예외 처리

* fix: reason 422 error type mismatch 코드 추가

* feat: missing request header 전역 예외 처리

* feat: request json parsing 실패 전역 예외 처리

* feat: missing request parameter 전역 예외 처리

* feat: 존재하지 않는 url 요청 전역 예외 처리

* feat: 500 internal server error 전역 예외 처리

* feat: npe & exception 전역 예외 처리

* fix: response status annotation 처리

* style: intellij code convention setting 추가하여 reformat

* ✨ User Domain 설정 (#15)

* feat: db, application 타입 형변환 인터페이스 생성

* feat: code <-> enum 변환 util 작성

* feat: custom converter 구현을 위한 추상 클래스 작성

* style: api & domain package 경로 수정

* feat: create, update auditable 추상 클래스 작성

* feat: role type enum & conveter 정의

* feat: visibility type enum & conveter 정의

* rename: visibility to profile-visibility 클래스명 수정

* fix: converter 생성자 수정

* feat: user entity 생성

* feat: user jpa data repository 생성

* fix: 에러 체계 7자리 수 -> 4자리 수

* test: 4자리수 에러 체계 기반 테스트 코드 수정

* fix: reason code 400번대 4번 invalid request 추가

* feat: user error code & exception 정의

* feat: user domain service 작성

* feat: user domain service create 메서드 추가

* feat: user domain service exists 메서드 추가

* fix: jwt error code 내에서 domain, field code 제거

* chore: query-dsl generated 경로 .gitignore

* fix: profile-visibility converter 오주입 수정

* fix: test api 삭제

* chore: 패키지 경로 수정으로 인한 test 패키지 경로 수정

* rename: caused by '7자리 에러코드' 주석 수정

* ✨️ 회원가입 API (#16)

* feat: white space validator 작성

* rename: not-white space 주석 추가

* feat: 전화번호 인증 요청 dto 작성

* rename: cerification -> verification 단어 수정

* feat: refresh token redis entity 작성

* feat: refresh token repository 작성

* fix: refresh token ttl time unit seconds -> milliseconds

* feat: refresh token service 구현

* feat: 이모지 유효성 검증 어노테이션 작성

* feat: 패스워드 유효성 검증 어노테이션 작성

* feat: 일반 회원가입 dto 작성

* fix: 일반 회원가입 dto code 필드 추가

* feat: jwt tokens 편의 dto 클래스 생성

* fix: refresh token ttl timeunit milliseconde -> seconds

* feat: jwts 생성 mapper 정의

* fix: refresh token provider primary bean 제거

* feat: cookie util 작성

* style: jwts dto 클래스 패키지 경로 수정

* fix: jwt auth mapper 토큰 생성 로직 수정

* feat: 회원가입 usecase 구현(인증번호 미확인)

* feat: auth controller sign up api 개방

* style: test 모듈 내 경로 수정

* rename: sign-up dto 전화번호 예시 문자 수정

* fix: phone pattern \n 제거

* fix: not empty -> not blank validation check 변경

* fix: cookie util max age int -> long

* fix: auth controller cookie util 의존성 주입

* test: auth controller 7가지 시나리오 유효성 검사

* test: 필드 누락 시나리오 추가 && cookie 헤더 검증 수정

* fix: jwt mapper에서 rt provider에 access claim -> refresh claim 수정

* Dockfile 작성 (#17)

* chore: .gitignore에 .env 파일 경로 추가

* feat: dockerfile 작성

* fix: dockerfile의 profile을 local에서 dev로 수정

* ✨ 일반 회원가입 전화번호 인증 API (#18)

* feat: 인증번호 송신 dto 작성

* feat: 인증번호 전송 & 검증 API 설계

* chore: domain 모듈 redis unit test 목적 embedded-redis 의존성 추가

* chore: redis test 라이브러리 embedded -> container

* test: redis container config 작성

* chore: domain 모듈 test application.yml 작성

* chore: redis template bean primary 추가

* feat: phone validation code(회원가입, 아이디/비밀번호 찾기) 상수 지정

* test: phone validation repository 테스트 작성

* feat: phone validation repository 작성

* test: phone validation repository 삭제 테스트 케이스 추가

* feat: phone verification service 작성

* feat: validation code converter 작성

* feat: web config 설정

* feat: 전화번호 인증/검증 dto codetype 필드 추가

* fix: phone verification repository save 시, expires_at 반환

* fix: phone verification service create 메서드, expires_at 반환

* rename: read by phone error log 문구 수정

* feat: phone verification 에러 코드 정의

* feat: phone verification 에러 클래스 정의

* feat: sns dto 클래스 선언

* feat: sms provider 인터페이스 정의

* rename: request time -> request at 변수명 수정

* feat: infra module component scan 목적의 application 클래스 작성

* feat: aws sms provider mock 구현체 작성

* style: infra 상위 패키지 pennyway 추가 -> 디렉토리 이동

* rename: code -> phone-verificatio-code 클래스명 수정

* fix: 사용자에게 code type 입력받는 필드 & converter 제거

* fix: 인증번호 검증 dto내 code 필드 복구

* feat: phone verification mapper 클래스 정의

* feat: 코드 불일치 시 error 반환하도록 수정

* rename: saveCode -> sendCode

* feat: 인증번호 검증 응답 dto 작성

* rename: of -> value of

* feat: auth use case 전화번호 인증 추가

* fix: global exception handler내 global error exception status 삽입 메서드 수정

* rename: send_time, expire_time -> send_at, expires_at 필드명 수정

* fix: 성공 응답 상태코드 2000000 -> 2000 수정

* fix: hash table -> value && ttl 적용

* feat: user find by phone 메서드 추가

* fix: 인증번호 검증 시 oauth user 여부 확인 필드 추가

* fix: user notify 필드 feed-comment-notify -> chat-notify 수정

* feat: user 계정 연동 helper class 정의

* feat: 전화번호 인증 성공 시 ttl rollback 메서드 추가

* fix: transaction 내 exception 발생 시 rollback -> sync helper의 transaction 어노테이션 제거

* fix: user auth use case 의존성 주입 및 분기 처리 로직 추가

* test: auth controller validation test 경로 수정

* rename: phone verification mapper 메서드 주석 추가

* test: user sync helper 클래스 test 작성

* fix: 이미 회원가입한 유저인 경우, 인증 코드 cache 제거

* fix: verify-code-res 기존 사용자 존재할 시 반환 필드 추가

* fix: user-sync-helper에서 oauth 계정 있으면 username 반환

* fix: auth user case 일반 회원가입 이력 없고, oauth 계정 있으면 username 반환

* rename: phone verification repository remove() -> delete()

* rename: phone-verification-code -> phone-verification-type

* fix: web config 제거

* CI/CD 파이프라인 구축 (#19)

* feat: ci workflow 작성

* feat: cd workflow 작성

* fix: mysql actions step 삭제

* fix: docker image 태그 제거

* fix: cd 파이프라인 trigger 브랜치명 수정(develop->dev)

* CD Workflow 수정 (#21)

* feat: ci workflow 작성

* feat: cd workflow 작성

* fix: mysql actions step 삭제

* fix: docker image 태그 제거

* fix: cd 파이프라인 trigger 브랜치명 수정(develop->dev)

* fix: gradle build 과정 추가

* fix: gradle build 과정 추가

* fix: cd 파이프라인 임시 수정

* fix: cd 파이프라인 임시 수정 사항 삭제

* fix: gradlew 권한 수정

* fix: 테스트 실패 오류 해결

* ✨ Spring Security 초기 설정 (+ Test case 에러 관련) (#22)

* chore: external-api 모듈 spring boot starter security 의존성 주입

* chore: security config 설정

* chore: method security config 설정

* fix: 기존 api 인가 권한 is-anonymous로 제한

* fix: security config 인증, 인가 예외 필터 제거 (로그인 작업 시 추가)

* fix: user sync helper oauth 반환 수정

* test: user sync helper 메서드 반환 타입 수정

* test: username 반환 검증 추가

* fix: pennyway infra application @spring boot application 어노테이션 제거

* test: 성공 응답 객체 code 값 2000으로 수정

* chore: spring security test 의존성 주입

* test: auth controller 성공 응답 set cookie 헤더 존재 여부 판단으로 수정

* chore: sub project test 블럭 추가

* feat: security user details & service 정의

* chore: local 환경 내 logging level 정보 추가

* fix: user sync helper transaction 제거

* ✨ 로그인 API (#23)

* feat: 일반 로그인 요청 dto 작성

* feat: user repository find-by-username 메서드 추가

* feat: user service read-user-by-username 메서드 구현

* feat: 유저 비밀번호 예외 추가

* feat: user sync helper read-user-if-valid 메서드

* feat: auth user case내 sign in 메서드 추가

* feat: sign in api 추가

* test: sign in test case 추가

* fix: sign in dto 정규표현식 검사 제거

* ✏️ 회원가입 API 개선 (+ Domain Service Runtime 예외 발생 제거) (#24)

* feat: sign up dto -> phone verification dto from 메서드 추가

* fix: helper 클래스 책임과 역할 분리

* rename: user sync helper 메서드명 명시적으로 수정

* fix: sign up dto password 암호화 후 entity 생성

* fix: 일반 회원가입, 로그인 시나리오 helper 클래스 분리

* fix: 일반 회원가입, oauth 계정 연동 시나리오에 맞게 dto 분리 후 info 클래스로 통합

* fix: oauth 연동 dto -> phone, code 필드 추가

* fix: sign up api 회원가입 요청 인자 수정

* fix: 서명 헬퍼 클래스 매개변수 수정

* feat: user domain 비밀번호 업데이트 메서드 추가

* fix: dto에서 유저 생성 시, password update at 갱신

* feat: 일반 회원가입 도우미 메서드 분기 처리

* rename: helper, mapper 클래스 재지정

* fix: 전화번호 요청 코드 정적 메서드 매개변수 타입 변경

* rename: user general sign mapper 메서드 create -> save(생성 혹은 수정 기능)

* fix: sync with oauth dto의 to info 메서드 인자 제거

* feat: 기존 소셜 계정 연동 api 추가 && 인증 응답 생성 도우미 메서드 분리

* feat: 회원가입 시나리오 개선

* test: user sync mapper test 변경 사항 반영

* test: auth controller validation test 변경 사항 반영

* test: user general sign mapper test 분리

* fix: domain service layer 예외 처리 제거

* refactor: user sync mapper 예외 처리 로직 수정

* refactor: user details service imple 예외 처리 로직 수정

* refactor: user general sign mapper 예외 처리 로직 수정

* refactor: user sync mapper에서 비검사 예외 발생 제거

* fix: user sync mapper 선언적 transaction 추가

* refactor: auth use case 비검사 예외 핸들링 제거

* test: test optional 반환 적용

* rename: user sync mapper 주석 수정

* ✨ Jwt 인증 필터 (#25)

* feat: 403 에러 핸들러 작성

* feat: 401 에러 핸들러 작성

* feat: security config에 인증, 인가 필터 bean 등록

* fix: 인증, 인가 필터 로그 레벨 조정 error -> warn

* feat: jwt 예외 필터 작성

* feat: forbedden token entity 정의

* feat: forbedden token repository 작성

* feat: forbidden token service 작성

* feat: jwt 인증 필터 추가

* fix: user details service 구현제 주입 -> 인터페이스 주입

* chore: security filter config 설정

* chore: jwt security config 설정

* chore: security config 커스텀 예외 핸들러 설정

* feat: security user to string() 재정의

* chore: security config 설정

* fix: access denied exception import 경로 수정

* fix: token 파싱 에러 해결

* style: 예외 로그 위치 수정

* feat: global exception handler no-resource-found-exception 핸들링

* fix: security config 불필요한 의존성 주입 제거

* feat: refresh api 개방

* fix: refresh token annotaion 빈 이름 수정

* feat: refresh token 탈취 예외 추가

* fix: refresh token 탈취 시나리오 핸들링

* fix: taken way token reason code 403의 이유 코드로 변경

* fix: jwt 인증 필터 내 메서드 명시적 final 매개변수 제거

* 📑 Readme v0.0.2 (#26)

* docs: erd 추가

* docs: 라이브러리 버전 수정

* docs: version 관리 설명 추가

* ✏️ Swagger + Security 수정 (#30)

* rename: 로그인 요청 dto @schema 추가

* chore: server domain 환경 설정 external-api -> infra

* chore: server domain property bean 등록

* chore: application-infra server 블럭 수정

* fix: swagger server url 환경변수 경로 수정

* chore: cors 설정 추가

* refactor: cors 설정 파일 분리

* rename: jwt security config -> security adpater config

* chore: bcryptpasswordencoder -> passwordencoder

* fix: 동일한 클래스명의 DTO @Schema name 속성 설정

* refactor: 운영 환경 별 security filter chain 설정 분리

* chore: external api 모듈 내 jackson nullable module 종속성 추가

* refactor: security auth config 분리

* refactor: security config swagger endpoint 프로필 별 설정 분리

* feat: simple granted authority 역직렬화 이슈로 custom granted authority 클래스 선언

* chore: external-api 내 jackson config 설정

* fix: security user details 역직렬화 문제 해결

* fix: security config 개발 환경 옵션 수정

* fix: custom granted authority equals 수정

* chore: docker hub 경로 수정

* ✨ 닉네임 중복검사 API (#31)

* rename: auth controller '일반 회원 가입' 전화번호 인증 swagger 문서 상 명시

* feat: 닉네임 중복 검사 domain service 메서드 추가

* feat: username 중복 검사 api 개방

* fix: 중복 검사 체크 url을 anonymous endpoints에 추가

* fix: swagger endpoints와 read only public endpoints 분리

* fix: 닉네임 중복 검사 인가 기준 permit-all로 변경

* rename: is-exist-nickname -> is-exist-username

* rename: auth check controller 매개변수명 username으로 수정

* ✨ OIDC 기능 인터페이스화 (+ component scan에 대한 고찰) (#32)

* chore: infra 모듈 내 feign 의존성 주입

* feat: oidc dto 정의

* feat: oidc public key response 객체 정의

* feat: oauth oidc client 인터페이스 정의

* feat: oidc token parsing provider 정의

* feat: oidc provider 환경 변수 정보를 가져올 인터페이스 정의

* rename: oidc 카멜케이스로 변경

* chore: provider 별 jwks-uri 및 secret 환경변수 주입

* feat: apple, google, kakao oidc 환경 변수 주입

* feat: oidc configuration properties config 세팅

* feat: default feign config 설정

* feat: common module 내 map utils 작성

* rename: oidc cache manager 빈 이름 오타 수정

* fix: oidc properties 필드 final 변경

* fix: infra properties 설정 api 모듈로 이전

* feat: provider 별 feign interface 정의

* chore: infra application 패키지 경로 수정

* chore: cache config @configuration 어노테이션 재삽입

* chore: infra config -> api 모듈에서 사용할 infra 모듈의 properties 명시

* feat: infra config maker 인터페이스 및 열거 타입 생성

* feat: infra 모듈 confg import selector 정의

* feat: infra를 의존하는 모듈에서 동적으로 인프라 구성을 명시적으로 선택하기 위한 어노테이션 작성

* feat: oidc 도우미 클래스 작성

* fix: cache config 클래스 마커 인터페이스 구현 제거

* fix: client-secret -> secret 필드 변경

* chore: feign config 설정

* fix: cache config @configuration 어노테이션 복구

* ✨ OAuth OIDC 회원가입 및 로그인 API (#33)

* feat: provider enum 클래스 정의

* feat: provider converter 정의

* feat: oauth domain 정의

* feat: provider exception 정의

* feat: provider request converter 정의

* feat: web config에 provider converter 등록

* chore: infra 모듈 httpclient 라이브러리 의존성 추가

* feat: oauth 로그인&회원가입 dto 정의

* rename: getter 메서드명 중 oidc 소문자화

* fix: oauth 로그인 시 oauth id 필드 추가

* fix: oauth oidc helper 메서드 추가

* rename: provider exception -> oauth exception

* feat: oauth id 불일치 예외 추가

* feat: oauth repository 정의

* feat: oauth repository 소셜 아이디 & 제공자 탐색 메서드 선언

* feat: oauth domain service 정의

* rename: provider converter 예외 이름 수정

* rename: oauth service get -> read

* style: oauth exception api 모듈 -> domain 모듈 이전

* rename: oauth error code 주석 포맷 변경

* feat: oauth 매퍼클래스 - 로그인 분기처리

* feat: oauth 로그인 use case 구현

* feat: oauth 로그인 컨트롤러 정의

* fix: cache config 내 불필요한 설정 추가 제거

* chore: infra 모듈 redis 환경 변수 주입

* rename: oauth controller 스웨거 문서 설명 추가

* feat: oauth API 설계

* fix: 전화번호 인증 oauth provider 구분

* fix: 전화 번호 인증 열거 타입 oauth provider 추론 메서드 static으로 변경

* fix: 전화번호 인증 코드 응답 객체 general, oauth 정적 팩토리 분리

* fix: oauth 분기 시나리오에 따른 dto 구분

* fix: oauth api 설계 수정

* fix: aouth use case의 verify code 메서드 반환 타입 verify code res로 수정

* rename: 인증 코드 검증 dto 생성 메서드 변경

* feat: oauth provider signup된 정보 존재 시 반환하는 에러코드 추가

* feat: 사용자 아이디 & provider 기반 데이터 존재 여부 검증 도메인 서비스 메서드 추가

* feat: oauth 회원가입 요청을 phone 검증 dto로 변환하는 정적 팩토리 메서드 추가

* fix: 소셜 회원가입 시 phone, code 필수 입력 필드 추가

* feat: user sync mapper 클래스 내 oauth 회원가입 분기 결정 메서드 추가

* feat: oauth use case 메서드 작성

* feat: 소셜 회원가입 분기 등록 로직 구현

* feat: 소셜 회원가입 Use case 작성

* rename: oauth controller 주석 제거

* rename: oauth api 1, 3번 상세한 설명을 위한 swagger 어노테이션 추가

* style: 프로그래밍 코드와 문서 주석 분리

* docs: 인증 코드 검증 예외 문서 수정

* fix: 휴대폰 만료 혹은 미등록 예외 reason code 401->404 변경

* docs: 전화번호 인증 응답 포맷 수정

* ✨ External-api 모듈 통합 테스트 환경 구축 (#34)

* chore: test profile yml 작성

* chore: external-api test 패키지 logback-test.xml 추가

* chore: testcontainer + redis, mysql 의존성 주입

* chore: 통합 테스트 db 컨테이너 환경 정의

* chore: api 통합 테스트 프로필 resolver 정의

* chore: common 패키지 application 클래스 정의

* chore: api 통합 테스트 base package classes 정의

* chore: api 통합 테스트 어노테이션 정의

* rename: api test application.yml -> application-test.yml

* test: auth api 유효성 검사 profile locat -> test

* test: api 통합 테스트 실행 테스트

* test: 통합 테스트 어노테이션에 profile=test 추가

* chore: test application 파일 제거

* chore: 환경변수 기본값 정의

* test: api 테스트 프로필 test -> local

* chore: test ci gradlew test --peraller 옵션 추가

* chore: external api db config @container 제거

* chore: application 파일 내 test 프로필 추가

* test: api 통합 테스트 프로필 local -> test

* test: 회원가입 유저 시나리오 통합 테스트 (동작 확인용)

* 🐛 OIDC signature 검증없이 header, payload 추출 로직 수정 (#35)

* rename: oauth oidc provider imple 에러 메서드 명시

* fix: token header, payload 추출 메서드 jjwt 라이브러리 의존 제거

* rename: get oidc token body 메서드 내 aud 로그 제거

* fix: oidc provider log 제거 및 get unsignedtoken() token 마지막에 . 제거

* ✨ 인증코드 SMS 전송 (#37)

* chore: infra 모듈 내 aws sdk, sns 의존성 주입

* chore: aws sns 환경변수 설정

* chore: aws sns config 설정

* feat: sms dto에서 sms 전송을 위한 전화번호 파싱 메서드 추가

* rename: pheon 파싱 메서드명 수정

* fix: sms request record 제거

* fix: sms dto response 객체 제거 및 불필요한 필드 정보 제거

* feat: phone 인증 event 등록

* fix: sms dto to 레코드명 변경 및 code 필드 추가

* rename: phone verification event -> push code event

* feat: push code 이벤트 핸들러 등록

* rename: event명 변경으로 인한 수정

* fix: 인증 코드 생성 로직 sms provider -> mapper로 변경

* chore: infra 환경 설정 기본값 null 제거 -> 더미값 주입

* 📝 Swagger 예외 응답 문서 개선 (#39)

* rename: oauth 전화번호 인증 시, existUser -> existsUser

* rename: 인증번호 검증 phone 필드 example에 하이픈 추가

* feat: json view에 적용할 구분용 클래스 생성

* rename: error response 응답 코드 설명 수정

* fix: 공통 예외 핸들러 주석 & 순서 수정 및 400 예외 핸들러 추가

* fix: auth api 문서 주석 분리 및 상세 내용 추가

* rename: 일반 회원가입 인증번호 검증에서 성공 응답 여부에 따른 분기 이동지점 명시

* 🐛 Google id token issuer mismatch 이슈 해결 (#40)

* fix: 공개키 서명 검증 메서드에서 token 로그 출력 제거

* fix: oauth oidc client properties 인터페이스 get issuer 메서드 추가

* chore: infra 모듈 provider issuer 환경 변수 추가

* fix: apple, kakao 환경 get issuer 메서드 수정

* chore: kakao, apple issuer 제거

* fix: iss 인자에 get_jwks() -> get_issuer() 메서드로 삽입

* ✏️ User name 필드 유효성 검사 기준 변경 (#44)

* feat: get_unsigned_token_claims 500 error -> 401 error 변환

* fix: oauth_usecase 내 payload 로그 레벨 info -> debug

* fix: name 필드 정규 표현식 변경 (한글 6자, 영어 10자)

* fix: name 필드 정규 표현식 변경 (한글 & 영어 소문자 8자)

* fix: name 필드 한글, 영문 소문자 2~8자로 제한

* test: 인증 시 name 예외 문구 수정

* ✨ User, Oauth Entity Soft Delete 반영 (#43)

* feat: user domain soft delete와 where 추가

* feat: oauth domain soft delete와 where 추가

* chore: domain module 내 mysql testcontainer 의존성 추가

* test: domain 모듈 mysql container 환경 설정

* chore: logback 설정 수정

* feat: user domain tostring 재정의

* feat: user domain service delete 메서드 추가

* test: soft delete 확인 테스트

* fix: oauth domain sql delete 쿼리 수정

* test: user soft delete test case 추가

* ✏️ OAuth 계정 연동 실패 해결 및 테스트 케이스 추가 (#45)

* rename: user sync mapper 불필요한 주석 제거

* feat: oauth service create 메서드 추가

* feat: oauth sign mapper 내에서 entity 생성 메서드 호출

* rename: auth api 일반 회원가입 이력 존재 시 예외 문서 추가

* rename: oauth api 소셜 로그인 이력 존재 시 예외 문서 추가

* test: [2] 소셜 로그인 이력이 있는 경우, 200 ok를 반환하고 oauth 필드가 true고 username 필드가 존재

* rename: 소셜인증 회원가입, 계정 연동 시 성공 응답 반환 문서 추가

* test: [3-1] 일반 회원가입 테스트

* test: [3-2] 소셜 계정 연동 회원가입 테스트

* test: 일반 회원가입 전화 검증 api 예외 테스트 케이스 추가

* test: url별로 inner 클래스로 테스트 분리

* test: auth test order 지정

* chore: test 환경에서 sql log 출력 옵션 true로 변경

* test: oauth controller 통합 테스트 내부 클래스 구분

* chore: wiremock 의존성 추가

* test: feign mock test 적용 (실제로 사용은 안 함)

* test: [1] 소셜 로그인 통합 테스트

* fix: oauth link 시, 기존 계정 없는 경우 예외 처리

* test: [4-1] 소셜 회원가입 계정 연동

* feat: oauth entity tostring 재정의

* fix: oauth 회원가입 시, 기존 계정이 하나라도 존재하면 예외 처리

* test: [4-2] 소셜 회원가입

* test: 저장된 oauth 정보 조회 추가

* ✏️ 인증번호 전송 api 통합 (#46)

* feat: 전화번호 인증 타입 정의

* feat: sms 인증코드 전송 api 분리

* feat: security config anonymous url에 /v1/phone 추가

* docs: sms api swagger 작성

* fix: send code param value 지정

* feat: phone verification error code 400 두 가지 경우 추가

* feat: send code 시, type == oauth이면 provider null일 때 예외 처리

* feat: verification type converter 추가

* docs: 인증코드 swagger 상 type의 value 수정

* feat: verification type converter web config 등록

* docs: 예시 전화번호 수정

* docs: 인증, 소셜 인증 api deprecated 처리

* 📝 모듈 별 README.md 추가 (#47)

* chore: readme.md .gitignore 제거

* docs: external api readme 추가

* docs: external api 패키지 경로 수정

* docs: infra 모듈 readme 추가

* docs: domain 모듈 readme 추가

* docs: common 모듈 readme 추가

* ✨ 로그아웃 API (#49)

* feat: sign out use case 구현

* feat: sign out api 개방

* docs: user auth api swagger 문서에 sign out 추가

* feat: sign out pre authorize 추가

* fix: authorization header 파싱 추가

* test: 유효한 access token, 유효한 refresh token 시나리오 검증

* test: 3가지 테스트 시나리오 추가 작성(유효한 access token, 유효하지 않은 refresh token 시나리오 실패)

* fix: authorization header 파싱 controller에서 수행

* refactor: 로그아웃 세부로직 jwt auth helper로 이동

* test: 유효한 access token을 가진 사용자가 다른 사용자의 유효한 refresh token을 전송할 시 실패

* feat: 소유권 없는 토큰 예외 추가

* fix: 다른 사용자의 유효한 refresh token 삭제 요청 시 예외 처리

* rename: jwt auth helper의 remove_access_token_and_refresh_token 메서드 주석 수정

* test: refresh token ttl 변환 로직 수정

* docs: sign out swagger 예외 응답 추가

* docs: sign out API 상세 설명 추가

* refactor: jwt auth helper 메서드 분리

* test: with_mock_user 어노테이션 제거

* fix: cookie 제거 응답 헤더 추가

* fix: 인증 필터 내 refresh token 체크 제거

* fix: cookie util delete cookie 메서드 수정 & 응답 헤더에 쿠키 제거용 헤더 추가

* test: refresh token 탈취 시나리오와 refresh 이전 token 전송 시나리오 추가

* test: scenario 2-3 pre-condition 수정

* fix: sign out api에서 sevlet request, response param 제거

* ✨ Device Token 등록/수정/삭제 API (#51)

* feat: device token entity 정의

* feat: user entity 내 device entity 역방향 관계 지정

* feat: device entity 연관관계 도우미 메서드 추가

* feat: device repository 정의

* fix: device repoistory 상속 대상을 cure -> list crud로 변경

* feat: read_all_by_user_id() 메서드 repository 내 선언

* feat: device domain service 추가

* feat: user account controller 설계 및 코드 작성

* rename: controller -> api 네이밍 수정

* feat: device dto 정의

* fix: user account api에 device dto import

* fix: user account controller 내 use case import

* fix: device entity 생성자에 user 추가, 연관관계 도우미 메서드 제거, 토큰 업데이트 메서드 추가

* fix: device dto to_entity 파라미터에 user 추가

* fix: device service save 메서드 반환값 void -> device

* feat: device 등록 use case 추가

* refactor: device 등록 usecase 내, flag 변수 제거 후 optional로 분기 제어

* feat: device domain service에서 user_id와 token으로 device 조회 메서드 추가

* feat: use case 내 임시 unregister_device 메서드 정의

* test: 신규 디바이스 등록 테스트

* test: 결과값으로 도출된 device에서 매핑 결과 확인

* refactor: register_device() 리턴값 long -> dto 객체

* feat: device custom exception 클래스 추가

* fix: 기존 디바이스 토큰 갱신 시, 기기 정보 불일치 예외 처리

* rename: 예외 상황 로그 수정

* test: 기존에 등록된 디바이스 토큰이 있는 경우, 디바이스 토큰을 갱신한다

* test: 서버에서 토큰을 비활성화 처리하여 존재하지 않는데, 클라이언트가 변경 요청을 보낸 경우 newToken으로 신규 디바이스를 등록한다

* test: 사용자가 유효한 토큰을 가지고 있지만 모델명이나 OS가 다른 경우 DEVICE_NOT_MATCH 에러를 반환한다

* feat: device entity 활성화 여부 필드 추가 && 정적 팩토리 메서드 추가

* fix: device 생성자 -> 정적 팩토리 메서드로 수정

* fix: device 생성자 private로 접근 제한

* feat: device not found error code 추가

* test: 활성화 필드 시나리오로 테스트 변경

* feat: device entity 활성화 여부 메서드 추가

* feat: device entity 활성화 메서드 추가

* fix: 활성화 필드 존재 이후 시나리오로 usecase 수정

* test: 토큰 비활성화 쿼리문 수정

* refactor: use case 추상화 수준을 위해 하위 service layer 추가

* style: 매개변수 순서 변경

* test: device_register_service 테스트 케이스 빈 등록

* rename: device request dto is_same_token() -> is_init_request()

* refactor: 디바이스 생성 로직 구현

* test: 사용자 ID와 origin token에 매칭되는 활성 디바이스가 존재하는 경우 디바이스를 삭제한다

* fix: device token id 대신 device token 자체를 쿼리 파라미터로 받도록 수정

* fix: 디바이스 정보 제거 시, 매칭되는 디바이스가 없을 때 예외 종류 수정

* test: 디바이스 삭제 실패 테스트

* docs: device token api 스웨거 응답 문서 작성

* docs: 디바이스 등록 요청 dto의 함수가 필드에 포함되는 현상 제거

* test: 유효한 토큰 & 디바이스 정보가 다를 경우 디바이스 정보를 업데이트

* feat: device entity 내 model, os 정보 수정 메서드 추가

* fix: 사용자 기기 변경 시, 비지니스 로직 수정

* docs: 디바이스 장치 정보 미스 예외 제거

* fix: 디바이스 토큰 활성 여부 조건문 변경

* fix: not_match_device 에러 코드 제거

* feat: test용 user 상수 클래스

* feat: @authentication_principal 타입 변환을 위한 테스트용 어노테이션 작성

* test: user 디바이스 저장 요청 시, 성공 응답 포맷 테스트

* test: originToken에 대한 디바이스가 이미 존재하는 경우, 디바이스 정보 변경 사항만 업데이트하고 기존 디바이스 정보를 반환한다

* fix: device 저장 시, 매칭 디바이스 부재 여부 판단 로직 추가

* rename: 테스트 [1-1] display name 수정

* test: device fixture으로 변경

* style: device register service 메서드 순서 변경

* fix: oauth entity 내 provider converter 정의 (#52)

* ✨ 문의하기 API (#36)

* feat: question 엔티티, repository 작성

* feat: mail 발송 로직 임시 작성

* fix: http 메서드 수정

* feat: question 예외 작성

* feat: question service 작성

* feat: 문의 발송 api 작성

* fix: 문의 발송 내용 수정

* feat: 필요한 환경변수 설정

* docs: swagger 문서 작성 및 분리

* fix: 라이브러리 버전 명시

* docs: swagger parameter 제거 및 schema 내용 수정

* fix: 컨벤션에 따른 uri 수정

* fix: controller 메소드 인가 권한 수정

* fix: dto 필드별 schema 작성

* fix: dto email 필드 유효성 검사 추가

* fix: category(enum) 필드 유효성 검사 처리

* fix: restful 원칙에 따른 request uri 수정

* fix: dto inner class 제거

* fix: transactional 어노테이션 변경

* fix: email_error 오탈자 수정

* fix: 공통 허용 endpoint 선언

* fix: createddate 를 사용하기 위한 entitylistners 추가

* fix: domainservice 연결

* fix: swagger schema 오탈자 수정 및 enum 설명 제거

* fix: transactional 어노테이션 추가

* fix: @schema 어노테이션 제거

* fix: questioncategory enum converter 적용

* fix: sendquestion 응답 nocontent로 변경

* refactor: starter-mail 의존성 이동

* refactor: starter-mail 의존성 구성 속성 변수 이동

* refactor: 메일발송 로직 infra 모듈 이전

* fix: 임시 로그 제거

* refactor: 의존성 주입을 위한 mailconfig 수정

* refactor: transactionaleventlistener를 활용한 메일발송 이벤트처리

* test: 테스트 작성

* fix: mockbean 누락 오류 수정

* fix: 테스팅간 로직 임시 주석처리 복구

* fix: 불필요한 getter 제거

* fix: main핸들링 log 수준 변경

* feat: admin_address 환경변수 기본값 추가

* fix: 메일 발송 이벤트 실패시 로그 레벨 변경

* feat: swagger 성공 응답 명시

* 🔧 인증 기능 리팩토링 (#53)

* rename: user_general_sign_mapper -> service

* refactor: is_sign_up_allowed() 메서드 general sign service로 이동

* rename: user_oauth_sign_mapper -> service

* refactor: is_sign_up_allowed() 메서드 oauth sign service로 이동

* fix: user sign mapper 제거

* refactor: 일반 회원가입 서비스 조건문 메서드로 분리

* fix: 일반 회원가입 시 log 추가

* refactor: user 생성 코드를 dto로 이동

* fix: oauth 회원가입 시 log 추가

* fix: log 정보 수정

* refactor: oauth 매핑 메서드 분리

* rename: 도메인 phone verification -> phone code

* rename: phone_verification_mapper -> service

* refactor: sms controller에서 service가 아닌 usecase를 의존하도록 수정

* style: 회원가입 시 인증 코드 확인 -> 인증 코드 제거 -> 자원 접근 순으로 변경

* style: 소셜 회원가입 시 인증 코드 확인 -> 인증 코드 제거 -> 자원 접근 순으로 변경

* refactor: 소셜 회원가입 시 조건문 메서드 명시적으로 변경

* feat: 사용자 sync 목적 dto 클래스 정의

* rename: user sync dto 주석 추가

* feat: user sync dto 편의용 도우미 메서드 생성

* refactor: oauth_sign_service 내 pair -> dto로 변환

* refactor: general_sign_service 내 pair -> dto로 변환

* rename: user sync dto의 is sign up allowed 필드 주석 추가

* refactor: auth_use_case pair -> dto

* refactor: oauth_use_case pair -> dto

* refactor: oauth signup 유효성 검사 리팩토링

* test: test에서 pair -> user_sync_dto 응답으로 변경

* rename: user_oauth_sign_service is_sign_up_allowed() 로그 추가

* fix: pk로 user select 하도록 하여 query 횟수 절약

* ✨ 사용자 본인 프로필 조회 API (#55)

* feat: get_my_account api 작성

* feat: user_profile_dto 정의

* feat: get_my_account() use case 추가

* rename: account_api requirement_security 주석 제거

* fix: local time serializaer format 추가

* fix: profile_visibility @jsonvalue 메서드 수정

* fix: 소셜 계정인 경우 password_updated_at 필드 직렬화 제외

* docs: 사용자 계정 조회 성공 응답 swagger 문서화

* docs: localdatetime 응답 포맷 수정

* feat: 사용자 응답 fe 편의용 필드 is_oauth_account 추가

* ✨ 로그인 상태 확인 API (#56)

* feat: user token 검증 api 설계

* style: user_auth_controller & usecase & test 모두 auth 패키지로 이전

* test: user_auth_usecase test 생성

* test: pre-condition 설정

* test: 토큰 유효성 검사 api 4가지 시나리오 작성

* fix: get_auth_state에서 authorization 헤더 매개변수 추가 및 예외 처리

* test: controller에서 넘겨주는 데이터에 맞게 given 수정

* fix: auth_header가 비었거나 bearer로 시작하지 않을 시, 예외 처리 -> 비로그인 유저 응답

* feat: is_sign_in 구현

* rename: is_signed_in() -> is_sign_in()

* refactor: auth_header 추출 로직 controller -> usecase로 이전

* test: token 접두사 bearer 추가

* test: access token을 보낸 의도가 확실할 때는 검증 실패 시 예외처리

* fix: is_token_expired() -> get_jwt_claims() 예외 핸들링 로직 수정

* fix: /v1/auth url 인가 권한 permit_all로 수정

* docs: get_auth_state() swagger 주석 추가

* feat: sigin state record 정의

* fix: state dto 분리

* test: is_sign_in 반환 타입 dto로 수정

* feat: jwt_claims value를 얻기 위한 편의용 메서드 추가

* fix: is_sign_in() 반환 타입 dto로 변경

* test: given() 인자 내에 any()로 수정

* rename: get_claim_value() 주석 추가

* docs: 성공 응답 schema로 수정

* fix: 사용자 로그인 여부 인가 권한 is_authenticated()로 수정

* fix: auth_state_dto is_sign_in 필드 제거

* fix: controller authorization 헤더 필수값으로 수정

* fix: usecase 내 is_sign_in false 처리 로직 제거

* test: jwt_auth_helper mock -> 실제 객체 생성

* docs: auth state dto id 필드 설명 수정

* test: security filter에서 걸러지는 테스트 케이스 제거

* fix: is_sign_in log 레벨 debug -> info

* style: web_sucurity 인증/인가 경로 상수 클래스 분리

* fix: /v1/auth 인가 권한 authenticated로 변경

* test: jwt_auth_helper 실제 인스턴스 주입

* fix: get_claims_value 로직 수정

* �일반 회원 아이디 찾기 API 구현 (#48)

* refactor: auth-check-controller request-mapping값 변경

* refactor: auth-check controller와 api 분리

* feat: 아이디 찾기 api 생성

* feat: 아이디 찾기 api 전체 허용

* feat: 아이디 찾기 api 구현

* fix: sysout 제거

* fix: 아이디 찾기 api 접근 권한 변경

* feat: 아이디 찾기 api 응답 객체 수정 및 dto 정의

* fix: auth-find-mapper 클래스 정의 및 존재하지 않는 번호 예외 처리

* feat: 존재하지 않는 아이디 error-code 정의

* feat: 계정 찾기 관련 커스텀 에러 정의

* fix: 일반 회원이 아닌 휴대폰 번호 조회 시 not-found 예외 처리

* test: 아이디 찾기 시 존재하지 않는 휴대폰 번호 예외 처리 케이스 작성

* test: 아이디 찾기 시 oauth 사용자 휴대폰 번호 예외 처리 케이스 작성

* test: 아이디 찾기 시 휴대폰 번호 조회 성공 케이스 작성

* test: 아이디 api 성공 테스트 케이스 작성

* test: 아이디 api 요청 실패 테스트 케이스 작성

* rename: auth-find-error-code의 존재하지 않는 휴대폰에 대한 상수 변경

* rename: 아이디 찾기 api 테스트명 수정

* docs: 아이디 찾기 api swagger 문서 구체화

* fix: 아이디 찾기 api의 휴대폰 번호 not-null 설정

* fix: 아이디 찾기 시 처리 예외를 user-error-exception으로 변경

* rename: auth-find-mapper에서 auth-find-service로 변경

* fix: 아이디 찾기 endpoint security 수정

* fix: 아이디 찾기 flow 수정

* fix: auth-check-controller의 테스트 단위 변경에 따른 어노테이션 수정

* fix: oauth entity 내 provider converter 정의 (#52)

* fix: 아이디 찾기 api에서 phone param을 not-blank로 변경

* fix: 아이디 찾기 실패에 따른 예외 로그 레벨 및 서비스 패키지 변경

* fix: auth-find-service 어노테이션을 service로 수정

* fix: 아이디 찾기 시 인증 코드 검증 및 캐시 제거 로직 추가

* fix: 아이디 찾기 시 인증 코드 검증 및 캐시 제거 로직 추가

* docs: 아이디 찾기 로직 주석 및 api response 추가

* fix: 아이디 찾기 api query에 code 추가

* feat: phone-verification-dto의 verify-code-req에 of 메서드 추가

* refactor: 아이디 찾기 로직의 코드 검증 및 삭제 로직을 usecase로 이동

* test: 아이디 찾기 api의 query에 code 추가에 따른 테스트 코드 변경

* test: 아이디 찾기 api의 query에 code 추가에 따른 result-actions 객체 매개변수 추가

* refactor: 인증코드 관련 패키지 및 클래스명 변경에 따른 수정

* fix: required-args-constructor import문 추가

---------

Co-authored-by: JaeSeo Yang <96044622+psychology50@users.noreply.github.com>

* ✏️ 인증번호 전송 API 통합에 따른 Deprecated API 삭제 (#57)

* docs: 로그인 상태 확인 api swagger 문서 수정

* fix: auth_controller send code api 제거

* fix: oauth_controller send code api 제거

* ✨ OIDC 정책에서 id token에 nonce 필드 추가 (#58)

* docs: 로그인 상태 확인 api swagger 문서 수정

* fix: auth_controller send code api 제거

* fix: oauth_controller send code api 제거

* fix: oauth_oidc_provider nonce 검증 구문 추가

* fix: oauth 로그인/회원가입 요청 시 nonce 필드 추가

* fix: service 로직 내 nonce 인자 전달

* fix: sign_up_req oauth_info dto에 nonce 필드 추가

* test: oauth controller 테스트 nonce 수정

* fix: oauth_use_case 영속화 실패 -> @transactional 추가

* fix: send_code api 통합 pr에서 제거하지 않은 use case 내 send code 메서드 제거

* ✨ 사용자 아이디/이름 수정 API (#59)

* test: 사용자 계정 api 내부 클래스로 분리

* test: 사용자 이름 수정 controller unit pre-condition 작성

* test: 이름 수정 요청 controller unit test case 작성

* fix: 일반 회원가입 계정이 아닌 예외 상수 추가 : 4004

* feat: 이름 변경 요청 dto 정의

* feat: put_name() controller 메서드 추가

* feat: update_name() usecase 추가 및 void 타입에 맞게 테스트 코드 given 수정

* test: 422 예상 에러 코드 수정

* test: 사용자 계정 usecase 기존 test 내부 클래스로 분리

* test: 일반 회원가입 유저 pre-condition 제거

* test: 이름 수정 usecase test case 작성

* feat: 사용자 이름 수정 로직 구현

* feat: user 도메인 이름 수정 메서드 추가

* test: user_account_use_case_test 순서 지정

* fix: 디바이스 비활성화 em.create_query() -> 메서드 호출 (기존 방식 에러 발생)

* test: 사용자 닉네임 수정 controller unit test 작성

* feat: 사용자 아이디 변경 요청 dto 작성

* feat: 사용자 아이디 변경 요청 api 작성

* feat: 사용자 아이디 변경 요청 usecase 작성

* feat: 사용자 아이디 변경 service 로직 구현

* test: nickname -> username

* test: 테스트 코드에서 entitymanager 주입 제거

* refactor: user account use case 사용자 조회 메서드 분리

* fix: 이름 및 아이디 수정 요청 메서드 put -> patch

* test: put 요청 patch로 변경

* ✨ 사용자 알림 설정 API (#60)

* feat: notify setting update 메서드 추가

* feat: notification 활성화 api 추가

* feat: notification 비활성화 api 추가

* feat: notification 활성화/비활성화 usecase 추가

* refactor: user account use case 사용자 조회 메서드 분리

* rename: notify -> flag

* feat: 사용자 알림 설정 service 로직 구현

* feat: 사용자 알림 설정 응답 dto 정의

* feat: use case 응답에 dto 반영

* feat: notify type converter 정의

* feat: web_config에 notify_type_converter 등록

* fix: invalid_notify_type 400 -> 422 변경

* docs: notify api 응답 swagger 문서 작성

* test: user_account_use_case_test 빈 등록

* fix: 알림 설정 api 메서드 변경 put -> patch

* 🐛 아이디 찾기 API 요청 시 휴대폰 번호 및 인증 코드를 입력하지 않을 경우 INTERNAL_SERVER_ERROR 해결 (#61)

* test: 아이디 찾기 api 요청 시 휴대폰 번호 및 코드를 입력하지 않은 케이스 추가

* fix: 아이디 찾기 api의 query-string 유효성 검증을 위한 인자 수정

* fix: 아이디 찾기 api 인자값 변경에 따른 usecase 및 service 메서드 인자 수정

* fix: of 메서드 삭제

* ✨ 비밀번호 검증/변경 API (#62)

* test: 현재 비밀번호 검증 api 구현

* feat: 일반 회원가입 없는 유저 예외 코드 추가

* feat: 비밀번호 검증 요청 dto 정의

* fix: 미회원가입 계정 오류 400 -> 403

* feat: 비밀번호 검증 controller 정의

* test: use case 임시 구현 및 테스트 통과 확인

* test: 비밀번호 검증 use case 테스트 케이스 작성

* feat: 패스워드 암호화 helper 클래스 정의

* feat: use case에 패스워드 helper class 의존성 주입

* test: 패스워드 헬퍼 클래스 의존성 주입

* feat: mock -> mockbean 수정

* fix: password_encoder final 한정자 추가

* test: 사용자 비밀번호 수정 controller unit test 작성

* feat: reason coe 400번대 5번 비트 client_error 추가

* feat: 동일한 비밀번호 변경 요청 에러 코드 추가

* feat: 비밀번호 변경 요청 dto 정의

* feat: 비밀번호 수정 controller 구현

* feat: 임시 비밀번호 변경 usecase 작성 && controller unit test 통과 확인

* feat: 비밀번호 수정 usecase 및 service 구현

* feat: password encoder helper 클래스의 문자열 인코딩 검증 메서드 제거

* test: 비밀번호 변경 usecase unit test 작성

* feat: use case 예외 로그 추가

* test: 동일 비밀번호 요청 시 given 절 추가

* test: given 사용자 생성 @before_each 통합

* fix: 기존과 동일한 비밀번호 검증 조건식 수정

* test: 정상 유저 비밀번호 변경 요청 given(is_same_password) 조건 분리

* ✨ External Api Controller 로깅을 위한 AOP 구현 (#64)

* feat: external-api-log-aspect 구현

* fix: authorization && set-cookie && cookie 헤더는 debug 모드로 로깅

* fix: request argument가 null인 경우 제외

* feat: request header log 어노테이션 작성

* fix: cookie, authorization 문자열 의존 제거

* fix: request header log 어노테이션 인증 헤더 제거

* fix: controller의 request header log default value 제거

* 🐛 RTR 오동작 검증 (아무 문제 없었다..) (#66)

* feat: redis 단위 테스트 편의용 어노테이션 작성

* test: refresh token service 단위 테스트 작성

* test: refresh token service 테스트에 불필요한 의존성 제거

* fix: jwt_auth_helper claims 추출 메서드 사용하도록 변경 && 로그 갱신

* test: jwt_auth_helper refresh 테스트

* test: refresh token service 단위 테스트 탈취 시나리오 통과 확인

* test: jwt_auth_helper 단위 테스트 탈취 시나리오 통과 확인

* refactor: refresh token 생성이 통과되면 access token 생성하도록 수정

* test: 탈취 시나리오 테스트 given 수정

* docs: refresh api 스웨거 에러 응답 개선

* ✨ 인증된 사용자의 소셜 계정 연동 API (#67)

* feat: 소셜 계정 연동 api 정의

* fix: request param 추가 dto 정의 -> sign_in_req.oauth dto 활용

* docs: 소셜 계정 연동 api 상세 설명 스웨거 추가

* feat: 소셜 계정 연동 usecase 작성

* feat: user_oauth_sign_server 조건부 user 조회 메서드 추가

* fix: user_oauth_sign_server 조건부 user 조회 메서드 -> user_sync_dto 반환 메서드로 수정

* fix: 소셜 계정 연동 usecase 불필요 의존성 제거

* test: user_auth_user_case 단위 테스트 추가 의존성 주입

* fix: already_signup_oauth error code 400 -> 409

* docs: 409 에러 응답 swagger 반영

* fix: already_signup error code 400 -> 409

* docs: 일반 회원가입 전화번호 인증 409 에러 응답 swagger 반영

* test: 인증된 사용자의 소셜 계정 연동 api 통합 테스트

* docs: 소셜 계정 연동 api 스웨거 409 예외 추가

* test: 기존 already_sign_up 400 에러 예상 응답 409로 수정

* style: user_oauth_sign_service is_link_allowed() 메서드 순서 변경

* fix: like-oauth api post -> put 요청으로 수정

* fix: oauth entity @sql_restriction 어노테이션 제거

* feat: user_id와 provider로 oauth 조회 메서드 추가

* fix: user_sync_dto 연동하기 위한 oauth 정보를 추가로 받는 내부 record 추가

* fix: 사용자 연동 dto user entity -> 직접 필드를 파라미터 주입하도록 수정

* fix: 회원가입 이력 가능 user_sync_dto 생성용 편의 메서드 추가

* feat: oauth entity soft deleted 여부 확인 메서드 추가

* feat: oauth entity soft delete 취소 메서드 추가

* fix: oauth sync dto 팩터리 메서드 내 oauth null 처리 로직 추가

* feat: user_sync_dto 기존 oauth 정보 존재여부 판단용 메서드 추가

* feat: oauth_service id로 oauth 조회 메서드 추가

* feat: oauth_error_code not_found 추가

* fix: soft delete된 oauth 존재 시나리오 반영하여 oauth sign service 수정

* refactor: oauth sign service 클래스 save_user 분기 처리 중첩 if문 제거

* fix: general_sign_service user_sync_dto 인자 추가

* feat: oauth domain service delete 메서드 추가

* feat: soft delete된 oauth 등록 테스트 케이스 추가

* feat: soft delete된 oauth 재활성화 시, oauth_id 필드 given 절 수정

* fix: oauth entity revert_delete 상태 조건문 수정

* fix: oauth revert 시, 사용자가 전송한 oauth_id로 업데이트

* 🐛 OAuth 로그인/회원가입 시 Soft Delete 정책 반영 검사 (#69)

* test: 같은 provider로 Oauth 로그인 이력이 soft delete 되었으면 성공 응답을 반환한다

* test: 소셜 회원가입 시 soft delete된 oauth 업데이트 여부 테스트 추가

* fix: 소셜 회원가입 dto 필드로 oauth_id 추가

* fix: oauth_oidc_helper oauth_id 메개변수 추가

* fix: get_payload() 사용하던 usecase에서 oauth_id 인자 전달

* test: get_payload() 사용하던 test에서 oauth_id 인자 전달

* test: user auth controller 통합 테스트에서 soft delete 테스트 시 expected_oauth_id 수정

* ✨ 인증된 사용자의 OAuth 연동 해지 API (#70)

* feat: 소셜 로그인 연동 해제 api 정의

* feat: user oauth sign service & usecase 로직 구현

* feat: oauth_error_code cannot_unlink_oauth 에러 코드 추가

* feat: user가 연동한 oauth 모든 정보 조회 목적 domain service 메서드 추가

* test: oauth 연동 해제 테스트 케이스 작성

* test: 인가 권한을 위해 @with_security_mock_user 어노테이션으로 수정

* refactor: service의 unlink() -> read_oauth_for_unlink()로 수정

* docs: 소셜 계정 연동 해제 409 에러 응답 문서 추가

* test: 테스트 케이스 위치 이관

* ✏️ 마이 프로필 조회 시, 소셜 계정 연동 정보 추가 (#72)

* feat: 유저 조회 usecase에서 delete되지 않은 oauth 계정 정보 조회 추가

* feat: oauth account 정보를 담을 dto 정의

* feat: dto binding을 위한 user_profile_mapper 생성

* test: user_account_use_case_test oauth_service mock bean 주입

* fix: user_profile_dto oauth_account 필드 nullable 제거

* fix: is_oauth_user 필드 -> is_general_sign_up 필드로 수정

* ✨ 사용자 계정 삭제 API  (#73)

* feat: 계정 삭제 controller 단위 테스트

* feat: 사용자 계정 삭제 controller 구현

* feat: 유저 삭제 use case -> 컴파일 에러 해결 목적 임시 구현

* test: oauth_service mock bean -> autowired

* feat: oauth repository 벌크 연산 삭제 메서드 추가

* feat: oauth service 사용자 아이디로 연관 관계의 oauth 정보 제거 메서드 추가

* feat: 사용자 삭제 서비스 추가

* test: user delete service 빈 추가

* feat: user domain 벌크 연산 삭제 메서드 추가

* fix: user 영속화 제거

* fix: delete 시, 영속화 된 user -> user_id 기반으로 제거

* fix: 컨트롤러 @delete_mapping 추가

* docs: 계정 삭제 api 주의 사항 추가

* ✨ 비밀번호 찾기 API (#71)

* feat: 비밀번호 변경 경로 설계

* feat: 비밀번호 내부로직 작성

* fix: @operation 오탈자 수정

* fix: dto 구조 변경

* docs: service 주석 작성

* docs: authcheckapi 작성

* fix: 변경된 멤버변수 반영 및 테스트파일명 변경

* fix: 동일 비밀번호 입력시 요청실패 수정

* feat: 비밀번호 인증 api 분리

* feat: 테스트코드 작성

* docs: swagger 예외응답 작성

* fix: 테스트코드 userfixture 사용 및 log.debug사용

* fix: preauthorize 및 @validated 누락 반영

* feat: 번호 인증 후 code 캐시 ttl 연장

* docs: swagger 404 에러코드 수정

* fix: service 로직 메서드 분리

* fix: authfindservicetest에 변경된 메서드명 반영

* ✨ 지출 관리 영역 Domain 정의 (#74)

* feat: 소비 아이콘 타입 정의

* feat: 지출 아이콘 컨버터 정의

* fix: ledger -> spending 패키지명 수정

* feat: 지출 entity 정의

* feat: 지출 카테고리 entity 정의

* feat: 지출 entity와 지출 카테고리 entity 연관관계 매핑

* rename: spending_category -> spending_custom_category 수정

* feat: 지출 및 지출 카테고리 repository 인터페이스 생성

* feat: 지출 domain service 생성

* feat: 지출 커스텀 카테고리 domain service 생성

* feat: 지출 목표 금액 entity, repository, domain service 정의

* rename: spending icon -> spending category

* rename: package 이름 amount -> target

* 🐛 사용자 삭제 시나리오 개선 (#75)

* test: 사용자 삭제 시, 디바이스 정보는 CASCADE로 삭제되어야 한다

* test: 테스트 display name 설명 수정

* ✨ QueryDsl 확장 Repository 및 Util 정의 (#76)

* feat: query dsl extended repository 인터페이스 선언

* feat: jpa query를 전달하기 위한 함수형 인터페이스 추가

* docs: @see 추가

* feat: query dsl extended repository 인터페이스 구현체 정의

* feat: extended repository를 적용하기 위한 factory 정의

* chore: extended bean repository factory config 등록

* feat: query dsl util 추가

* refactor: repository 내부 메서드를 query dsl util에서 수행

* feat: slice 유틸 추가

* docs: util 클래스 범위 주석 추가

* rename: extended repository -> query dsl repository

* feat: extended repository 통합 인터페이스 선언

* rename: query dsl repository factory -> extended repository factory

* fix: user repository 상속 jpa repository -> extended repository

* test: extended repository 사용법 공유를 위한 테스트 케이스

* docs: query_dsl_search_repository sort 사용법 수정

* fix: query dsl util 내 cast_to_query_dsl 중복 정의 제거

* rename: query_dsl_util null handling 메서드 설명 수정

* rename: query_dsl_search_repository_impl 클래스 레벨 주석 제거 && query_dsl_util 주석 수정

* ✨ 당월 목표 금액 설정 API (#77)

* docs: 당월 목표 금액 등록/수정 swagger 작성

* test: 쿼리 파라미터 유효성 검사 에러 응답 테스트 케이스 작성

* test: param 유효성 검사 테스트 케이스 추가

* test: param null인 경우 400 테스트 추가

* feat: handler_method_validation_exception 전역 예외 핸들러 추가

* feat: target_amount_usecase 클래스 생성

* feat: target amount domain delete 쿼리 수정 및 delete_at 필드 제거, amount 수정 메서드 추가

* fix: amount 타입 wrapper -> primitive 타입으로 수정

* refactor: @request_param -> dto로 리팩토링

* test: expected 400 -> 422 에러로 수정

* docs: update_param_req swagger 문서 작성

* feat: target amount 에러 코드 및 예외 작성

* test: 당월에 해당하는 요청인지 검증하는 테스트 추가

* feat: 당월이 아닐 시 예외처리

* feat: 당월 목표 금액 조회 domain service 메서드 추가

* rename: domain service와 repository 메서드 명 수정

* rename: save -> create

* test: 당월 목표 금액 등록 통합 테스트 작성

* refactor: target_amount_save_service 분리

* test: displayname 400 -> 422 에러로 수정

* rename: 패키지명 ledge -> ledger

* fix: put mapping value 추가

* style: if문 중괄호 추가

* ✨ 월별 사용자 지출 내역 조회 API (#78)

* docs: 지출 내역 조회 스웨거 문서 작성

* feat: 지출(spending) 컨트롤러 작성

* fix: 패키지명 ledge -> ledger

* rename: at_month -> at_year_and_month 메서드명 수정

* feat: spending entity get_day() 메서드 추가

* feat: 지출 내역 조회 dto 정의

* feat: 월별 지출 내역 조회 usecase 구현

* rename: save -> create_spending()

* fix: 지출내역 jpa repository -> extended repository

* feat: spending domain service 내 read_spendings() 추가

* chore: querydsl-core 의존성 api로 수정

* chore: querydsl-jpa 의존성 api로 수정

* fix: spending 조회 시 query dsl 메서드 사용

* test: 지출 내역 테스트를 위한 batch fixture 정의

* test: 월별 지출 내역 조회 통합 테스트 작성

* fix: spending_fixture query 수정

* fix: spending_fixture query category 랜덤 수정

* fix: dto validation 추가

* refactor: spending search service 분리

* refactor: spending mapper 분리

* refactor: spending_mapper 내부 메서드 분리

* rename: spending mapper calculate 메서드 주석 추가

* docs: spending search res dto 스웨거 문서 작성

* docs: 지출 내역 조회 api 스웨거 문서 200 응답 포맷 추가

* test: 월별 지출 내역 조회 수행 시간 측정

* feat: 지출 entity sql_restriction 추가

* ✨ 사용자 커스텀 지출 카테고리 등록 API (#79)

* feat: 공통된 카테고리 정보를 반환하기 위한 dto

* feat: spending entity get_category() 분기 처리 메서드 추가

* fix: get_category type에 맞추어 기존 코드 타입 변환

* fix: custom category인 경우를 핸들링 하기 위한 is_custom 필드 추가

* fix: 사용자 정의/서비스 제공 카테고리에 따른 dto 정보 수정

* fix: category icon 필드 타입 spending_category로 수정

* docs: api 스웨거 문서 작성

* feat: 지출 카테고리 dto 정의

* refactor: spending category api 분리

* feat: 지출 카테고리 추가 use case 작성

* test: 유효하지 않은 카테고리명을 입력하면 422 Unprocessable Entity 에러 응답을 반환한다

* fix: name 쿼리 파라미터 @not_empty -> @not_blank

* test: controller unit test 유효성 검사 추가

* feat: icon other 값 예외 처리

* feat: spending exception 정의 && other 아이콘 예외 처리

* test: other icon 입력 예외처리 테스트

* rename: save -> create_spending_custom_category

* fix: spending_custom_category 테이블명 수정

* docs: param query object 스웨거 상에서 안 보이도록 처리

* docs: 성공 응답 스키마 추가

* docs: 지출 카테고리 응답 icon 필드 예시 수정 && 응답 key값 추가

* ✨ 지출 내역 등록 API (#81)

* test: 소비 내역 등록 controller unit test

* feat: 지출 등록 dto 생성

* feat: dto 내 to_entity() 메서드 정의

* test: given() 추가 및 mockmvc csrf 처리

* test: 101자리 랜덤 문자열 생성 방법 수정

* feat: 요청 icon이 other이면서, category_id가 -1인 경우 예외 처리

* fix: to_spending_search_res_individual private -> public

* feat: 동작하도록 usecase 지출 생성 코드 작성

* feat: 지출 entity 내 커스텀 카테고리 매핑 메서드 및 생성자 유효성 검사 추가

* feat: custom_category not_found 예외 추가

* feat: spending_custom_category 조회 domain service 메서드 추가

* rename: 에러 응답 상세화

* fix: category_info 정적 팩토리 메서드 내 is_custom 판단 스니펫 수정

* test: request의 categoryId가 -1인 경우, spendingCustomCategory가 null인 Spending을 생성한다

* test: request의 categoryId가 -1이 아닌 경우, spendingCustomCategory를 참조하는 Spending을 생성한다

* test: 기존 카테고리에 등록하는 경우, icon 정보를 other로 수정

* fix: category 정보 상세한 응답으로 변경

* feat: request의 category_id, icon 조합 검증

* fix: 서비스/사용자 카테고리에 따른 to_entity() 분리

* refactor: spending_save_service 분리

* refactor: 직관적인 코드를 위해 request 내 custom_category 요청 여부를 판단하는 메서드 추가

* test: 자원 검증 시나리오 테스트 추가

* fix: is_custom_category 논리 부정 연산 추가

* feat: 커스텀 카테고리 자원 접근 관리 매니저 생성

* feat: 사용자 id와 커스텀 id가 일치하는 커스텀 지출 카테고리 검사 메서드 추가

* feat: 자원 검증 인가 로직 controller 반영

* docs: 지출 내역 추가 api 문서 작성

* docs: swagger 예외 응답 추가

* test: usecase에 대한 테스트로 수정

* ✨ 사용자 정의 지출 카테고리 조회 API (#82)

* feat: 지출 카테고리 조회 controller 메서드 추가

* feat: 지출 카테고리 조회 usecase 작성

* feat: 지출 카테고리 조회 domain service 추가

* fix: 상태 검사를 위한 조건문 생성자로 이동

* rename: icon -> category

* feat: category converter 필드에 정의

* docs: 지출 카테고리 조회 swagger 문서 작성

* ✏️ QueryDsl 확장 Repository의 Dto 불변성 보장을 위한 분기 처리 (#84)

* feat: query dsl extended repository dto 불변식 유지를 위해 linked_hash_map 자료 구조 분기 처리

* test: hash map 테스트 케이스 추가

* rename: query_handler 사용 목적을 담은 주석 수정

* test: 테스트용 dto @to_string() 작성

* docs: 전체 보기 그룹 추가 (#87)

* 🐛 사용자 계정 삭제 후 동일한 OAuth 회원가입 이후 로그인 에러 해결  (#85)

* fix: oauth_id, provider로 oauth 조회 시, deleted_at is null 조건 where 절 추가

* rename: 메서드에 deleted_at이 null인 경우만 조회함을 주석으로 명시

* fix: user_oauth_sign_service read_user 시 is_deleted 체크 제거

* test: domain service deleted_at 처리 대응 -> assert_true 대신 assert_null

* test: oauth repository query 정상 동작 확인

* ✏️ 테스트 작성 시 `@AuthenticatePrincipal` 어노테이션 대응 (#86)

* feat: 인증 필터에서 token 파싱 후 id값 로깅

* feat: @with_security_mock_user 대신 .with(user())로 사용자 인증 대체

* fix: security_user_details get_password() 비검사 예외 발생 제거 -> null 반환

* test: user_auth_controller 통합 테스트 메서드 순서 및 seucurity mock user 어노테이션 제거

* refactor: 통합테스트 패키지를 controller -> integration으로 수정

* test: 테스트 메서드 순서 지정 어노테이션 제거

* ✨ 사용자 년/월 별 지출 총합 및 목표 금액 조회 API (#88)

* feat: 목표 금액 조회 요청 파라미터 dto 추가

* feat: 목표 금액 조회 응답 dto 정의

* fix: date 쿼리 validation 추가

* feat: controller 단일 및 전체 내역 조회

* feat: domain module 사용자 년/월 별 총 지출 금액을 반환하는 dto 정의

* feat: spending custom repository 정의 && 사용자의 특정 년/월 총 지출 금액 조회 메서드 추가

* feat: 사용자 년/월 지출 금액 조회 usecas 반영

* fix: target_amount_usecase 목표 금액 리스트 조회 및 매퍼 클래스 사용

* feat: domain service 내 user_id로 목표 금액 설정 이력 조회

* fix: 목표 금액 및 총 지출 금액 조회 dto 이름 및 필드 수정

* fix: 전체 소비 금액 조회 optional ㅊ처리

* feat: 목표 금액 상세 정보를 위한 내부 dto 정의

* fix: dto null guard 구문 추가

* feat: to_with_total_spending_res mapper 메서드 추가

* feat: to_with_total_spendings_res mapper 메서드 추가

* fix: 날짜 범위 계산식 수정

* feat: target_amount entity to_string() 정의

* refactor: entity -> dto 매핑을 위해 자료구조를 list -> map으로 변경

* refactor: target_amount_mapper 함수 분리 및 메서드 명 일부 수정

* rename: target_amount_info dto 정적 팩토리 메서드 주석 추가

* rename: with_total_spending_res diff_amount 필드 notnull 조건 추가

* feat: view type 열거 타입 정의

* feat: view_type_converter 정의 및 web_config 등록

* fix: 단일 조회 시 path_parameter로 date 받도록 수정

* fix: view_type 제거

* docs: controller 스웨거 문서 작성

* fix: use_case 내 불필요한 종속성 제거

* test: user_fixture 사용자 가입일 지정하여 저장하는 메서드 추가

* fix: spending_fixture 소비일 랜덤 생성 로직 수정

* test: target_amount fixture 정의

* test: user created_at 필드를 업데이트하는 메서드로 수정

* test: 사용자 임의의 년/월 지출 총합 및 목표 금액 조회 테스트

* fix: 임의의 년/월 조회 시 group by 절 추가

* fix: 모든 기록 조회 쿼리에서 sort 조건 수정

* chore: domain.yml 테스트 환경에서 jdbc 로그 debug로 설정

* test: month 길이 계산 로직 수정

* fix: mapper 내에서 month_length 길이 계산 로직 수정

* test: user_account_use_case_test jpa_query_factory mock bean 주입

* chore: jpa_query_factory 테스트 환경 설정용 빈 등록

* test: jpa_query_factory 빈 주입

* fix: target_amount_mapper @required_args_contstructor 제거

* ✨ 당월 목표 금액 삭제 API (#90)

* feat: target_amount delete controller 정의

* feat: target_amount 404 에러 코드 추가

* feat: target_amount 삭제 usecase 추가

* feat: target_amount 삭제 domain service 메서드 추가

* refactor: target amount 조회 로직 수정

* docs: 삭제 api swagger 작성

* fix: is_allocated_amount 논리 부정 제거

* docs: 스웨거 파라미터 주석 추가

* fix: parameter in import 추가

* ✨ 지출 내역 상세 조회 API (#89)

* feat: 상세조회 controller 작성

* feat: 존재하지 않는 지출 내역 에러코드 추가

* feat: 접근할 수 없는 지출 내역 에러코드 추가

* feat: 지출내역 개별 조회 메소드 추가

* feat: spendingsearchservice 작성

* feat: usecase 작성

* docs: swagger 문서 작성

* fix: 컨벤션에 맞추어 응답 key 수정

* feat: 인가 처리를 위한 spendingmanager 작성

* refactor: 기존 usecase의 인가 로직 제거

* refactor: searchservice 로직 usecase로 이동

* fix: 오탈자 및 잘못된 파라미터 순서 수정

* fix: 잘못된 로그 제거

* fix: 403 에러 문서 및 코드 삭제

---------

Co-authored-by: JaeSeo Yang <96044622+psychology50@users.noreply.github.com>

* 🐛 지출 내역 조회 응답 및 스웨거 버그 픽스 (#92)

* docs: 지출 내역 조회 @parameter type header -> query && 지출내역 상세 조회 @parameter 추가

* fix: 소비 내역 조회 시, 월 소비 금액 총합 데이터 제거

* fix: 응답 키 spendings -> spending

* ✨ Firebase Cloud Messaging 기본 설정 (#94)

* chore: firebase build 종속성 추가

* chore: fcm_config import selector group 설정

* chore: external-api infra_config에서 fcm_config 빈 스캔

* chore: firebase admin key 환경변수 등록

* feat: fcm_config 정의

* chore: firebase admin-key .gitignore 등록

* fix: fcm_config 실행 환경에서 test 제거

* rename: fcm config @profile todo 주석 추가

* chore: cd pipeline 내 fcm admin sdk json 파일 생성 step 추가

* chore: cd pipeline json 삽입 동작 확인

* chore: json name, dir 속성 분리

* chore: resource firebase 디렉토리 .gitkeep 생성 및 .gitignore 범위 수정

* chore: feature 브랜치 cd 감지 제거

* ✨ 사용자 로그인 로그를 위한 Interceptor 및 환경 구축  (#95)

* feat: 로그인 로그 redis entity 정의

* feat: 로그 redis repository 작성

* fix: sign event log repository crud -> list_crud 상속으로 변경

* feat: sign_event_log_service 정의. cr 작업만 수행

* feat: sign_in_log 복합키 클래스 설정

* feat: sign_in_log entity 정의

* feat: sign_in_log repo & service 클래스 생성

* feat: web_mvc_config sign_event_log_interceptor 등록

* refactor: jwt_claims_parser_util 분리

* feat: ip_address_header type 정의

* feat: ip_address_header converter 정의

* feat: sign_in_log entity에 app_version, ip_address_header 필드 추가

* fix: sign_event_log app_version, ip_addr_header 필드 추가

* feat: sign_event interceptor 정의

* fix: sign_in_log_id 클래스 직렬화 구현

* fix: sign_in_log entity에 @entity 선언

* test: web_mvc_config 내 service 의존성 문제로 인한 controller unit test 실패 해결

* fix: interceptor response auth header 존재 여부 검증 추가

* ✨ S3 정적 파일 업로드를 위한 Presigned-URL 발급 API 구현 (#97)

* chore: s3 관련 의존성 추가

* feat: s3-client 빈 생성을 위한 s3-config 클래스 선언

* feat: s3-presigner 빈 선언

* feat: s3 presigned-url 발급을 위한 provider 선언 및 발급 메서드 선언

* fix: s3 접근을 위한 credentials 선언 및 적용

* feat: s3 presigned-url 발급을 위한 api 명세 정의

* feat: s3의 object key 생성을 위한 uuid util 클래스 정의

* feat: presigned-url 발급을 위한 dto 선언 및 api 수정

* feat: object-key 생성을 위한 템플릿 및 타입 선언

* fix: s3-bucket-name 환경 변수 추가 및 관련 로직 수정

* feat: presigned-url 발급을 위한 service 및 usecase 정의

* fix: storage-usecase 패키지 이동

* fix: storage-controller 접근 권한 수정

* fix: storage 관련 예외 및 에러 코드 선언 및 예외 처리 로직 수정

* test: presigned-url 발급을 위한 api 테스트 로직 작성

* chore: presgined-url response-dto description 삭제

* fix: user error-code와 중복된 코드 제거

* fix: presgined-url 발급 요청 시 chat-id 속성 삭제 및 aws-s3-provider 주석 구체화

* docs: swagger 응답 구체화

* refactor: object-key 생성을 위한 url-generator 정의

* refactor: object-key 생성을 위한 url-generator 적용

* docs: aws-s3-provider 메서드들의 매개변수 관련 설명 추가

* fix: s3 관련 예외 위치 수정

* fix: presigned-url 발급 api swagger 응답에서 코드 제거

* fix: presigned-url 발급을 위한 dto명 변경

* test: storage-controller 테스트 profile 수정

* fix: presigned-url 발급을 위한 dto명 변경

* fix: presigned-url 발급을 위한 dto명 변경

* test: 테스트를 위한 user 설정 변경

* test: exclude-filters 추가

* ✨ 지출 내역 삭제 API (#96)

* feat: 삭제 api 작성

* docs: swagger 문서 작성

* fix: 인증 처리 이동에 의한 파라미터수정

* docs: 지출 삭제 swagger 403 예외 추가

* test: 삭제 테스트코드 작성

* feat: fixture 메소드 추가 및 삭제 테스트코드 assertion 추가

* feat: fixturefixture 상수 변경

* ✨ 지출 내역 수정 API (#93)

* fix: usecase단의 필요없는 파라미터 제거

* feat: 지출내역 수정 controller 작성

* feat: usecase 작성

* feat: spending 업데이트 메소드 작성 및 service 작성

* feat: swagger docs 작성

* feat: spending.update 메소드를 customcategory 포함해 업데이트 하도록 수정

* docs: 지출 내역 생성과 중복된 에러응답 제거

* feat: 커스텀 카테고리 여부 분기 로직 고려해 로직 재작성

* refactor: 불필요한 user필드 제거를 위해 req dto toentity 메소드 오버로딩 후 리팩토링

* test: spendingupdateservice 테스트 작성

* test: 지출내역 상세 조회 및 수정 통합테스트 작성

* fix: 잘못 작성된 fixture메소드 제거

* test: spendingfixture 상수값으로 변경

* feat: 통합테스트 피드백 반영

* fix: 충돌 resolve 후 에러 수정

* ✨ Redisson을 활용한 분산 락(Distributed Lock) 환경 구축 및 테스트 (#98)

* chore: domain 모듈 내 redission 의존성 추가

* feat: redisson config 설정

* feat: 분산락 커스텀 어노테이션 생성

* feat: spring spel 커스텀 파서 유틸 클래스 생성

* fix: 분산락 커스텀 어노테이션 need_same_transaction 필드 추가

* rename: need_same_transaction 주석 추가

* feat: transaction propagation 레벨 지정 추상 팩토리 작성

* rename: need_same_transaction -> new 수정

* fix: redisson_call_new_transaction timout 및 주석 수정

* rename: unit -> timeunit 이름 수정

* feat: 분산락 aop 클래스 구현

* fix: redis_connection_factory & redis_cache_manager 빈 @primary 등록

* test: redisson 설정을 위한 test container redis password 설정 추가

* test: test container domain 모듈 redis password 추가

* test: domain 모듈 db & redis testcontainer config 설정

* test: 분산 락 테스트용 더미 entity 정의

* test: 분산 락 테스트용 더미 service 구현

* test: 분산락 테스트 작성

* fix: return null 수정

* rename: 락 해제 시점 로그 추가

* test: aop unit test 적용

* fix: test_jpa_config query_dsl bean conditional 옵션 적용

* test: 도메인 모듈 통합 테스트 어노테이션 생성

* fix: redis_config scan 경로 지정

* chore: could not safely identify store assignment for repository 이슈 제거

* test: @domain_integration_test 환경 추가

* test: test_coupon_repository 적용

* test: test_coupone service & repository profile test 지정

* test: 분산 락이 없는 테스트 케이스 추가

* test: jwt_auth_helper @redis_unit_test 어노테이션 제거

* test: test_jpa_config_conditional_on_missing_bean 메서드에 @bean 추가

* fix: query_dsl_config @primary 지정

* fix: lock 획득 대기시간 연장

* Batch: ✨ Batch 기초 세팅 및 CD 파이프라인 수정 (수정될 PR 컨벤션 관련 내용 포함) (#99)

* chore: batch module 생성

* chore: batch 모듈 application 클래스 생성

* chore: batch 라이브러리 추가

* chore: external-api docker script 위치 수정

* chore: batch docker script 생성

* chore: java build 시 비블로킹 방식으로 수정

* chore: api cd gradlew parallel 옵션 추가 && 파일명 수정

* chore: cd 스크립트 external-api docker 경로 수정

* chore: batch cd 스크립트 추가

* fix: batch application 클래스 main 함수 추가

* chore: tag & release 자동화 actions 스크립트 작성

* chore: docker image 경로 수정

* chore: batch module 생성

* chore: batch 모듈 application 클래스 생성

* chore: batch 라이브러리 추가

* chore: external-api docker script 위치 수정

* chore: batch docker script 생성

* chore: java build 시 비블로킹 방식으로 수정

* chore: api cd gradlew parallel 옵션 추가 && 파일명 수정

* chore: cd 스크립트 external-api docker 경로 수정

* chore: batch cd 스크립트 추가

* fix: batch application 클래스 main 함수 추가

* chore: tag & release 자동화 actions 스크립트 작성

* chore: docker image 경로 수정

* rename: 태그 및 릴리즈 자동화 파이프라인 주석 추가

* chore: cd 파이프라인 버전 정보 추출 step 추가

* release: api v1.0.0 출동

* release: api-v1.0.0 (#100)

* fix: 배포 파이프라인 이미지 빌드 버전 추가

* Api: 🐛 태그 생성 & 릴리즈 자동화 파이프라인 후 배포 workflows call (#101)

* fix: 배포 파이프라인 이미지 빌드 버전 추가

* rename: run 이름 call-external-api-deploy로 변경

* chore: api & batch 모듈 workflow_call trigger 추가

* chore: tag 정보 inputs.tags로 수정

* test: 태그 생성 트리거 opened 추가

* test: merged 조건식 임시 제거

* fix: call 인자 전달 시 version -> tag 수정

* rename: batch cd 파이프라인 이름 수정

* chore: workflow_dispatch 제거

* chore: reuse workflow 호출 시 secret key 상속 옵션 추가

* chore: pr 병합 조건문 추가

* Api: 🐛 object-key의 depth 수정을 위한 템플릿 수정 (#102)

* Api: ✏️ 목표 금액 플로우 변경에 따른 API 스펙 변경 (#103)

* fix: 배포 파이프라인 이미지 빌드 버전 추가

* fix: target_amount entity is_read 필드 추가

* fix: target_amount 409 예외 코드 추가

* fix: target-amount is_exists 메서드 추가 및 query_dsl impl 구현

* rename: exists 오타 수정 & tx read_only 옵션 추가

* fix: target_amount id & user_id 조건문 탐색 메서드 추가

* fix: target_amount id, user_id exists 메서드 추가

* rename: 매개변수 순서 변경

* fix: target_amount dto query param을 위한 클래스명, 필드 정보, 문서 수정

* docs: target amount api spec 수정

* fix: api 스펙에 맞게 controller 수정 및 자원 검증 로직 추가

* fix: target_amount_info dto is_read 필드 추가

* fix: target-amount 생성 use case 분리

* fix: find_by_id 시 user_id 조건문 제거

* fix: target_amount update 반환 값 수정 및 date 기반 탐색 -> target_amount_id 기반 탐색으로 수정

* fix: authenticated_principal 주입 필요없는 곳에서 제거

* fix: target_amount_save_service 제거

* fix: target_amount 생성 시 분산 락 적용

* style: distributed_lock 어노테이션 위치 수정

* fix: 분산락 prefix 문자열 관리 클래스 분리

* style: update_target_amount 할당문 추가

* docs: target_amount patch 응답 데이터 수정

* fix: lock prefix 수정

* test: target-amount 통합 테스트 파일 통일 및 jdbc bulk query 수정

* fix: target_amount entity 당월 데이터 확인 메서드 추가

* fix: update, delete 시 당월 데이터 여부 검증 로직 추가

* fix: target_amount to_string() year, month 정보 추가

* test: target_amount 날짜 변경 후 cache 제거

* test: 목표 금액 생성 요청 테스트

* fix: target_amount 분산 락 키 spel 문법에 맞게 수정

* test: target_amount 삭제 테스트 케이스 작성

* rename: target_amount 데이터 생성 시 로그 제거

* rename: json 내부 target_amount 필드명 -> target_amount_detail 수정

* fix: target_amount 생성 요청에서 당월 요청 판단 로직 수정

* test: put -> patch 이름 수정

* test: target_amount controller unit test 수정

* fix: success response key 상수처리

* fix: use case 내 불필요한 create 호출 제거

* rename: date_param dto schema 오타 수정

* test: 특정 년/월에 대한 target_amount가 존재하지 않는 경우 404 not found 에러 응답을 반환한다

* fix: target_amount use case not found 시 예외 처리

* docs: target api 조회 시 404 예외 문서화

* docs: target_amount 수정 및 삭제 문서 작성

* fix: lock key의 date에서 day 인자 제거

* fix: 문의하기 응답속도 개선을 위한 이벤트 핸들러 비동기 처리 (#106)

* docs: 📝 Readme-v0.0.3 (#108)

* fix: 배포 파이프라인 이미지 빌드 버전 추가

* docs: root readme 수정

* docs: external-api 모듈 docs 수정

* feat: ✨ 사용자 프로필 이미지 등록 요청 API 구현 (#105)

* feat: 사용자 프로필 이미지 등록 요청 dto 정의

* feat: 사용자 프로필 이미지 등록 요청 api 설계

* feat: user entity에 profile-image-url 수정 로직 추가

* feat: 사용자 프로필 이미지 등록을 위한 usecase 정의

* feat: s3 파일 존재 여부 반환 로직 구현

* feat: storage 저장 실패 시 에러코드 정의

* feat: s3 파일 복사 로직 구현

* feat: 사용자 프로필 이미지 저장 api 구현

* feat: 사용자 프로필 이미지 원본 저장 시 storage-class 적용

* fix: 이미지 리사이징을 위한 storage-class 수정

* docs: 프로필 이미지 등록 swagger 응답 케이스 추가

* test: 사용자 프로필 이미지 등록 api 테스트 코드 작성

* test: user-account-usecase에 aws-s3-provider mockbean 적용

* fix: 프로필 이미지 등록 메서드 put으로 변경

* docs: 프로필 이미지 등록 성공 시 예시 응답 제거

* docs: 프로필 이미지 등록 swagger parameter 제거

* fix: request dto validate 어노테이션 추가 및 tab-character 제거

* rename: s3 파일 존재 여부 메서드명 수정

* fix: 프로필 이미지 dto에 regex 패턴 검증 로직 추가

* test: 테스트 케이스 이미지 경로 수정

* fix: 프로필 이미지 등록 요청 dto 정적 팩토리 메서드 삭제

* refactor: 사용자 프로필 이미지 경로 prefix 환경변수 처리

* refactor: s3 object-key regex 상수로 분리

* feat: s3 object-key regex 클래스 분리 및 정적 변수로 선언

* fix: ✏️ 사용자 로그 관리 정책 변경에 따른 Device API 수정 (#104)

* fix: 배포 파이프라인 이미지 빌드 버전 추가

* fix: device entity os & model 필드 제거

* fix: device token dto model, os 필드 제거

* fix: device_dto to_entity() 메서드 복구

* fix: device update 메서드 호출 시, activate 상태로 변경

* fix: device 등록 비지니스 로직 수정

* test: device controller unit test에서 model, os 제거

* fix: device_fixture model, os 필드 제거

* rename: fixture token 변경 상수명 수정

* fix: device entity 조회 시 활성화 조건 추가

* fix: device usecase 테스트 시나리오 수정

* fix: device 쿼리 자동 조건문 수정

* test: origin_token에 대한 정보가 없는 경우 new_token 등록

* fix: @sql_restriction 제거

* test: 수정 요청 & 기존 토큰 없을 시, 수정 토큰으로 신규 등록 테스트

* fix: device_register_service 로직 수정

* fix: device_dto new_token 필드 제거

* test: device controller unit test 수정

* fix: device 응답 객체 생성 시 요청 토큰이 아닌 서버 토큰을 응답으로 사용

* fix: device_register_service 제거 && 로직 단순화

* fix: 사용자가 보낸 토큰이 서버에서 비활성화 상태일 때 예외처리

* test: test case 요청 수정

* rename: device -> device_token으로 수정

* rename: device_token entity to_string 수정

* rename: device token put 요청 응답 key 수정

* docs: device put api 스웨거 수정

* fix: device controller 경로 수정

* test: device_token controller unit test 변경된 url 및 응답 포맷 반영

* test: device_fixture -> device_token_fixture

* test: 단일 token에 대한 시나리오로 테스트 수정 및 비활성화 토큰 요청 에러 케이스 추가

* fix: register_device_token 파사드 패턴 적용

* fix: device_token_unregister 파사드 패턴 적용

* test: device token 단위 테스트 분리

* test: device_token_unregister_service_test 분리

* fix: user_account_use_case 파사드 패턴 적용

* test: user_account_usecase unit test 분리

* fix: device entity os & model 필드 제거

* fix: device token dto model, os 필드 제거

* fix: device_dto to_entity() 메서드 복구

* fix: device update 메서드 호출 시, activate 상태로 변경

* fix: device 등록 비지니스 로직 수정

* test: device controller unit test에서 model, os 제거

* fix: device_fixture model, os 필드 제거

* rename: fixture token 변경 상수명 수정

* fix: device entity 조회 시 활성화 조건 추가

* fix: device usecase 테스트 시나리오 수정

* fix: device 쿼리 자동 조건문 수정

* test: origin_token에 대한 정보가 없는 경우 new_token 등록

* fix: @sql_restriction 제거

* test: 수정 요청 & 기존 토큰 없을 시, 수정 토큰으로 신규 등록 테스트

* fix: device_register_service 로직 수정

* fix: device_dto new_token 필드 제거

* test: device controller unit test 수정

* fix: device 응답 객체 생성 시 요청 토큰이 아닌 서버 토큰을 응답으로 사용

* fix: device_register_service 제거 && 로직 단순화

* fix: 사용자가 보낸 토큰이 서버에서 비활성화 상태일 때 예외처리

* test: test case 요청 수정

* rename: device -> device_token으로 수정

* rename: device_token entity to_string 수정

* rename: device token put 요청 응답 key 수정

* docs: device put api 스웨거 수정

* fix: device controller 경로 수정

* test: device_token controller unit test 변경된 url 및 응답 포맷 반영

* test: device_fixture -> device_token_fixture

* test: 단일 token에 대한 시나리오로 테스트 수정 및 비활성화 토큰 요청 에러 케이스 추가

* fix: register_device_token 파사드 패턴 적용

* fix: device_token_unregister 파사드 패턴 적용

* test: device token 단위 테스트 분리

* test: device_token_unregister_service_test 분리

* fix: user_account_use_case 파사드 패턴 적용

* test: user_account_usecase unit test 분리

* fix: user_profile_update_dto merge conflict

* fix: ✏️ 사용자 정의 지출 카테고리 `⋯` 아이콘 반영 (#107)

* rename: 커스텀 카테고리 상수 0->custom, 12->other 수정

* style: spending key 상수화

* docs: spending category api 예시 요청 파라미터 other 추가

* fix: spending_controller ...아이콘 validation 체크

* fix: spending_category_dto validation 추가

* fix: spending entity 생성자 validation 추가

* fix: spending_category_dto validation 추가

* test: spending category 등록 시 other -> custom 거…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants