Skip to content

Commit 2556caa

Browse files
Darren4641kooscodarren
authored
staging -> main merge commit
* chore: spotless plugin 추가 * feat: build, format make 명령어 추가 * chore: makefile PHONY에 stop 명령어 추가 * chore: jpa, flyway 의존성 추가 * fix: make run, start SPRING_PROFILES 인자 추가 * feat: clear-h2 명령어 추가 * chore: app url, version 설정 추가 * chore: swagger config 추가 * feat: test용 controller 추가 * chore : swagger 메서드 파라미터 오타 수정 * Revert "feat: test용 controller 추가" This reverts commit 7efaebe. * Revert "chore : swagger 메서드 파라미터 오타 수정" This reverts commit bf91a99. * Revert "feat: test용 controller 추가" * chore: jdbc 의존성 제거 및 r2dbc 의존성 추가 * chore: local 개발용 postgres docker compose 추가 * chore: make h2-clear 명령어 삭제 * infra : terraform s3 module 추가 * infra : terraform aws provider 추가 * infra : terraform staging workspace 추가 * feat/#9 -> staging: Squash Merge * feat: User Entity 생성 및 UserPrincipal 세팅 * feat: ExceptionHandler 및 BaseResponse 세팅 * feat: Swagger 403/500 이슈 해결 및 auth 패키지 분리 * fix: spotlessApply * fix: @repository 제거 * fix: security 관련 설정 user 패키지로 이동 * fix: User Entity 및 repository 관련 파일 user 패키지로 이동 * fix: spotless 적용 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix: Referer 보안 이슈 방지를 위해 Ip 기반 조건 설정 * apply code formatter * fix: s3 private preset versioning 비활성화 * fix: S3 public access 제거 * feat: transactionRunner 추가 * chore: S3 의존성 추가 * chore: local s3 test용 local stack container 추가 * feat: image storage 인터페이스 추가 * feat: S3 storage 구현체 추가 * feat: Cors 설정 추가 * test: local test용 object CRD API 추가 * fix: S3 초기화 로그 제거 * ref: cors 중복 설정 제거 * chore: api 계층으로 cors 설정 이동 * chore: code quality check pipeline 추가 * feat: 폴더, 포토 이미지 엔티티 추가 * feat: Jpa Auditing 설정 추가 * feat: Usecase 식별용 annotation 추가 * feat: jpa folder 영속성 Port 추가 * feat: folder 기본 API * docs: file API swagger schema 추가 * feat/#14 -> staging mrege commit * feat: User Entity 생성 및 UserPrincipal 세팅 * feat: ExceptionHandler 및 BaseResponse 세팅 * feat: Swagger 403/500 이슈 해결 및 auth 패키지 분리 * fix: spotlessApply * fix: @repository 제거 * fix: security 관련 설정 user 패키지로 이동 * fix: User Entity 및 repository 관련 파일 user 패키지로 이동 * fix: spotless 적용 * feat: Jasypt 설정 추가 * fix: application jasypt 적용 * fix: 암호화 알고리즘 변경 및 JasyptUtil 클래스 제거 * fix: spotlessApply --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * feat: 로컬 회원가입 api * fix: UserPrincipal 사용자 id 추가 * feat: PasswordEncoder config * chore: SecurityConfig 네이밍 변경 * feat: 로그인, 토큰 발급 api * feat: folder api converter 추가 * chore: 폴더명 변경 photobooth -> photo * apply spotless * feat: E2E Test용 Base 클래스 * feat: Folder E2E Test용 Base 클래스 * fix: test jasypt 설정 제거 * feat: test Media 구현체 추가 * ref: application layer에 맞게 Folder Port 메서드 시그니처 수정 * fix: 폴더 생성 중복 검사 로직 * fix: 폴더명 변경 중복 검사 * fix: 폴더 목록 조회 메서드 시그니처 변경 * fix: 폴더 목록 삭제 원자성 검증 * fix: 폴더 생성 응답 추가 * fix: 폴더 jpa 조회 메서드 추가 * fix: 일관성을 위해 ExceptionDto code 변수명 resultCode로 변경 * test: Folder API E2E Test 추가 * feat: 폴더 conflict code 추가 * fix: JasyptTest Spring 의존성 제거 * fix: r2dbc 설정 제거 * fix: jasypt 환경변수를 생성자 주입으로 변경 * chore: Media Aggregate 분리 * fix: DeleteFolder n+1 문제 해결 * fix: RequiresSecurity class Target 추가 * fix: Media 엔티티 추가 * Feat/#7 (#18) * feat: User Entity 생성 및 UserPrincipal 세팅 * feat: ExceptionHandler 및 BaseResponse 세팅 * feat: Swagger 403/500 이슈 해결 및 auth 패키지 분리 * fix: spotlessApply * fix: @repository 제거 * fix: security 관련 설정 user 패키지로 이동 * fix: User Entity 및 repository 관련 파일 user 패키지로 이동 * fix: spotless 적용 * feat: Jasypt 설정 추가 * feat: kakao oauth idToken 발급 로직 추가 (테스트용) * fix: UseCase 어노테이션 추가 및 디렉토리 구조 변경 * feat: kakao oauth oidc 추출 * feat: k3s 배포를 위한 Dockerfile 생성 * feat: 카카오 OIDC 회원가입 기능 구현 * feat: 예외 addMessage 메서드 제거 * refactor: signup -> register 네이밍 변경 * fix: transactionRunner 추가 * fix: spotless 적용 * fix: login 기능 구현 1차 * fix: refreshToken 발행 추가 * fix: refreshToken을 통해 accessToken 갱신 API 추가 * fix: JasyptConfig profile 지정 * feat: CustomerUserDetailService 제거 (불필요) * feat: spotless 적용 * feat: converter 적용 * feat: E2E TEST 코드 추가 * feat: E2E TEST 코드 추가 * fix: JasyptTest 테스트코드 yml 의존성 제거 * feat: ci discord 알림 추가 * ci: 빌드 최적화 * ci: k3s 강제 재시작 적용 * fix: kakao oauth nativeID로 변경 * ci: 배포후 downtime 0로 변경 (health check 추가) * fix: app.version 공통 application.yaml로 이동 * fix: JasyptUtil 파일 제거 * fix: RestClientConfig 파일 infra 디렉토리로 이동 * fix: OIDCPublicKeysResponse 변수 var -> val 변경 * fix: KakaoClientResponse 주석 제거 * fix: Valid 어노테이션 @field로 변경 * fix: contract 디렉토리 생성 후 response 이동 * fix: ci yaml staging 브랜치로 변경 * fix: spotlessApply 적용 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix: oauth로그인 정책 변경 * fix: login관련 e2e 테스트코드 제거 * fix: spotless 적용 * fix: test코드 임시 제거 * test: HttpStatus 변경 * fix: acceess, refresh Token 만료 시간 변경 * chore: querydsl 설정 * chore: flyway 비활성화 * Feat/#23 (#24) * chore: logstach encoder 의존성 * chore: logback 설정 * feat: 요청 MDC Filter * feat: 인증 MDC Filter * chore: SecurityFilterChain MDC Filter 추가 * fix: RequestMdcFilter가 가장 먼저 오도록 순서 보장 * fix: AuthMdcFilter name 대신 userId 로깅 * fix: 로그에 Ip 정보 추가 * fix: 로그에 Ip 정보 삭제 * Fix/#44 카카오 OIDC 공개키 캐싱 처리 (#46) * fix: 카카오 OIDC PublicKey Cache 적용 * fix: spotless 적용 * fix: Cache 관련 클래스 Adapter 적용 * fix: spotless 적용 * refactor: cachePort 도메인 하위 infra 레이어로 이동 * fix: spotless 적용 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix: AuthFilter Authentication type 변경, 테스트 수정 * feat/#28 -> staging merge commit * feat: base time entity * feat: photo domain entity 추가 * feat: jpa auditing config 추가 * feat: PhotoImage UseCase 추가 * feat: PhotoImage persist jpa 구현체 추가 * feat: Local Media Client 구현체 추가 * feat: Media UseCase 추가 * feat: Media infra 계층 구현체 추가 * feat: RequiresSecurity class level target 추가 * feat: file upload fail result code 추가 * feat: usecase 애노테이션 추가 * feat: folder, photo, media flyway schema * chore: S3 구현체를 infra/storage/s3로 분리 * fix: jasypt config test profile 비활성화 * test: test profile 지정 * fix: S3 presigned 만료시간, contentType 추가 * test: PhotoImage E2E Test 추가 * fix: PhotoController bean validation 추가 * test: PhotoImageE2ETestBase 추가 * chore: rest assured 의존성 추가 * fix: AuthTokenProvider jwt에 providerType String을 저장하도록 수정 * feat: FakeMediaStorage 구현체 추가 * feat: JpaPhotoImage 목록 조회 구현 * fix: Jwt 검증 실패시에도 계속 진행되도록 수정 * fix: mediaId null이 0으로 casting되는 오류 수정 * docs: media swagger 추가 * chore: GenerateUploadTicketUseCase 불필요 주석 삭제 * fix: DeleteMediaUseCase cache 무효화 로직 추가 * ref: DeleteFolder 검증 로직 개선 * fix: testcode resultCode 수정 * fix: 401 E2ETest 삭제 * fix: memo 추가 * apply spotless * chore: 사용하지 않는 메서드 제거 * fix: UploadPhotoE2ETest memo 추가 * feat: photoImage Patch API * ref: 사진 목록 조회 paging 처리 * ref: Folder 삭제 query를 querydsl로 변경 * chore: 사용하지 않는 메서드 정리 * ref: photo domain contract 파일 분리 * feat: PhotoImage dynamic update 추가 * fix: 사진 등록 후 INITIAL media를 포함하여 조회 * test: 사진 업로드 e2e test * fix: 사진 extension이 저장되지 않는 문제 수정 * fix: photo 저장 실패시 롤백 * chore: staging S3 bucket 변경 * fix: 이미지 조회 contentType 필드 추가 * feat/#47 -> staging merge commit * feat: Apple OIDC 로그인 추가 * fix: staging merge * fix: 스웨거 주석 수정 * fix: oidc 검증 로직 Port로 분리 * fix: Port 제거 후 infra Layer에서 interface로 타입 통일 * fix: User엔티티 email Unique 제거 * fix: BaseResponse 공통 규격화 * fix: oauth 최초 로그인시만 DB저장 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * test: e2e 테스트 코드 BaseResponse success 체킹 제거 * feat/#56 -> staging merge commit * docs: CLAUDE.md 추가 * docs: TESTING.md 추가 * chore: 사용하지 않는 문서 제거 * feat/#59 -> staging merge commit * fix: AppProperties를 common 패키지로 이동 * fix: photo image 조회시 url을 내려주도록 수정 * feat: 이미지 조회 endpoint 추가 * test: 이미지 조회 endpoint 테스트 * chore: 클로드가 하위 문서를 반드시 읽도록 CLAUDE.md 수정 * fix/#29 -> staging merge commit fix: 폴더명 validation 적용 * feat/#43 -> merge commit * fix: 카카오맵 기반 위경도 수집 API 1차 개발 완료 (리펙토링 전) * fix: 애플로그인으로 인핸 oid Type String 으로 변경 * fix: 그리드방식으로 좌표 수집 * fix: Port, Adapter 적용 * fix: API 제한을 방지한 Delay 코드 추가 * fix: 내 위치기준 부스 조회, 다각형 내 부스 조회 개발 (브랜드 필터링은 추후 추가) * fix: 부스 위치 조회(다각형, 내위치) brandId 별 필터링 추가 * feat: Brand 조회 API 추가 * test: E2E Test 코드 추가 * fix: spotless 적용 * fix: 클래스명 변경 KakaoApiClient -> MapApiClient * fix: media queryDsl 제거 * fix: MediaType LOGO 추가 * fix: collectPhotoBooths API 컨벤션 * fix: collectPhotoBooths API Hidden 처리 * fix: 메서드명 변경 kakaoSearchByKeyword -> searchByKeyword * fix: SQL code formatter 적용 * fix: MapApiClient 구조 Clean Architecture 적용 * fix: postgis docker-compose 실행 추가 * fix: MapContract 클래스 Kakao 네이밍 hidden 처리 * fix: 한국 위경도 domain layer vo로 이동 * fix: CollectPhotoBoothLocationUseCase 트랜잭션 분리 * refactor: CollectPhotoBoothLocationUseCase 로직 분리 * refactor: 이미지 경로 Converter 수행 * fix: MediaClientPort 추가 * refactor: VO 클래스 수정 * refactor: MapVo 리펙토링 * refactor: 클래스명 명확화 * fix: KakaoApiRateLimitConfig -> KakaoApiRateLimitProperties 클래스명 수정 * fix: 부스 조회 API Coordinate 타입으로 변경 * fix: spotless 적용 * fix: 네이밍에 VO 키워드 제거 * fix: jasyptGeneratTest -> jasyptGenerateTest 오타 수정 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * feat/#35 -> staging merge commit * feat: 즐겨찾기 기능 및 페이징/정렬 구현 - 사진 즐겨찾기 추가/삭제/조회 API 구현 - 사진 목록 페이징 처리 - 정렬 순서(ASC/DESC) 지원 - E2E 테스트 추가 * fix: CLAUDE.md success 필드 삭제 * feat: 즐겨찾기 summary API 추가 * fix: 사진 삭제시 즐겨찾기 사진도 함께 삭제 * docs: CLAUDE.md batch delete에 대한 지침 추가 * docs: test base와 tear down 지침 추가 * fix: photo image command 페이징 기본값 삭제 * fix: 즐겨찾기 중복 저장 멱등성 로직 수정 * chore: apply spotlessApp * chore/#63 -> staging merge commit fix: entity 테이블명 대문자로 변경 * fix/#66 -> staging merge commit * fix: 부스 위치 조회 Paging 삭제 * fix: getPhotoBoothsByPoint API 좌표 nullable 기본값=강남역 * fix: 지도 응답 변수명 수정 brandId -> brandName, name -> branchName * fix: test 코드 Page 관련 변수 제거 * fix: Native Query 테이블명 대문자로 수정 * fix: getPhotoBoothsByPoint API Default 값 Converter에서 수행 * feat/#58 -> staging merge commit * ref: Media api Dto 파일 통합 * test : 사진 여러 장 업로드 테스트 * feat : Media application dto * ref : presigned upload ticket api 통합 * ref : UploadTicket 계약을 별도 파일로 분리 * test : 벌크 presigned e2e test 단일 테스트로 통합 * ref : PhotoImage 생성 로직 통합 (개별 + 벌크) * fix : UploadTicket test 변수명 동기화 * fix : 사진 생성시 하나의 folderId만 받도록 수정 * ref : 통합된 UploadTicket 결과 반환 방식 수정 * refactor : media upload 엔드포인트 수정 * ref : ConfirmMediaUploadedUseCase 벌크 처리로 수정 * ref : GenerateUploadTicketUseCase.kt transactional 애노테이션 추가 * chore: github-ci 추가, deploy 단계 test 제거 * feat/#74 -> staging merge commit * feat: 사진 상세 조회 API * fix : 이미지 목록 조회 folderId 삭제 * ref : 사진 목록 조회 쿼리 개선 * chore: code formatter * chore: 즐겨찾기용 조회 dto 추가 * feat: PhotoMediaClient 미디어 단건 조회 메서드 추가 * fix: 사진 상세 순환 호출 문제 수정 * test : 사진 상세 조회 api e2e test 추가 * ref : PhotoImageQueryRepository.kt query 개선 * fix : 사진 업로드 시 폴더 소유권 검사 * fix/#65 -> staging merge commit * ref/#69-> staging merge commit * fix: Json 날짜 포맷 통일 * ref: 사진 삭제 API 통합 (단건, 다중) * ref: 폴더 삭제 API 통합 (단건, 다중) * fix : 사용하지 않는 folder delete 관련 메서드 제거 * fix : folder 삭제시 image의 folder_id null 처리 * fix : photo 도메인 usecase 이름을 복수형으로 수정 * docs : 사용하지 않는 DeleteMediaUseCase.kt 주석 추가 * docs/#71 -> staging merge commit * docs: Swagger 공통 예외 문구 수정 * docs: Swagger 공통 예외 문구 수정 (500 Code 문서 제거) * fix: Response 값 @Schema 어노테이션 추가 * fix: Response 값 @Schema 어노테이션 추가 * fix: Spotless 적용 * fix: 토큰 MISSING 예외 처리 및 EntryPoint 컴포넌트 클래스 생성, ObjectMapper 사용하여 Error메시지 반환 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix/#77 -> staging merge commit * fix: Validate 검증 활성화를 위해 Request 객체 ? 인자 추가 * fix: security handler 추가 * fix: TestCode 수정사항 반영 * fix: TestCode 수정사항 반영 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix/#83 -> staging merge commit * chore: UpdatePhotoFavoriteRequest.kt 파일 통합 * fix : 폴더 목록 API에 사진 개수, 커버 사진 포함 * fix : 사진 삭제, 생성 시 폴더 커버 사진 업데이트 * chore : 폴더 커버 flyway schema 반영 * fix : 사진 목록 조회시 폴더 조건 추가 * ref : 폴더 목록 조회 쿼리 개선 * test : 폴더 커버 갱신 test 추가 * docs: presigned url 주석의 api endpoint 수정 * fix: folder 커버 이미지 생성 시간 제거 * fix: 조회 시점에 앨범 커버 이미지를 조인하도록 수정 * fix: 사용하지 않는 메서드 제거 * fix: 즐겨찾기 이미지 url을 usecase에서 분리 * fix: Folder storageKey 변수명 통일 * fix: PhotoImageQueryRepository.kt 미사용 코드 제거 * fix/#82-> staging merge commit * feat: Pose 업로드 (ADMIN 권한 체크) * feat: MediaType POSE 항목 추가 * feat: 포즈 목록 API 개발 * feat: 인원수 필터링 추가 * fix: 이미지 업로드 시 userId 필수로 설정 * feat: 포즈 스크랩 기능 개발 * feat: 포즈 스크랩 기능 개발 Swagger desc 추가 * feat: 포즈 상세보기 기능 개발 * feat: 랜덤 포즈 기능 개발 * refactor: rollbackIfFailed private method 분리 * test: 포즈 관련 E2E 테스트 코드 작성 * feature: 개발 admin cors 추가 * fix: ScrapPoseController 주석 name 변경 * fix: 변수명 수정 isScrap -> isScraped * fix: PoseMediaClient 주석 이름 수정 * fix: Pose 어그거트에서 사용할 Media Contract 생생 * fix: flyway TB_SCRAP_POSE DDL 쿼리 추가 * fix: UseCase Random추출 메서드 분리 * fix: Pose DTO 파일명 수정 GetPoseResponse * fix: upload만 admin 권한 * fix: toGetPoseResponse 객체 재사용 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix/#92 -> staging merge commit * fix: 즐겨찾기 요약이 즐겨찾기한 최근 사진을 조회하도록 수정 * ref: 폴더 목록 조회 쿼리 개선 * ref: 폴더 목록 조회 쿼리 롤백 * feat/#84 -> staging merge commit * chore: UpdatePhotoFavoriteRequest.kt 파일 통합 * fix : 폴더 목록 API에 사진 개수, 커버 사진 포함 * fix : 사진 삭제, 생성 시 폴더 커버 사진 업데이트 * chore : 폴더 커버 flyway schema 반영 * fix : 사진 목록 조회시 폴더 조건 추가 * ref : 폴더 목록 조회 쿼리 개선 * test : 폴더 커버 갱신 test 추가 * docs: presigned url 주석의 api endpoint 수정 * fix: folder 커버 이미지 생성 시간 제거 * feat: 폴더에서 사진 제외 기능 추가 * fix: 사용하지 않는 메서드 제거 * test: 사진 삭제 후 조회 시점에서 커버 사진을 확인하도록 테스트 수정 * ref: 폴더 삭제시 사진을 삭제하지 않는 경우 분기 처리 * feat/#89 -> staging merge commit * feat: 앱 버전 관리 API 기능 개발 * feat: 클래스 주석 추가 * fix: spotless 적용 * feat/#93 -> staging merge commit * fix: 포즈 추천시 인원수 필터링 * test: test 코드 수정 * feat: 1차 작업 * fix: 포즈 스크랩 오동작 수정 및 포즈 스크랩 목록 조회 개발 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * feat/#85 -> staging merge commit * chore: user domain dto 패키지명 통일 * feat: media domain 이미지 조회 후 업로드 usecase 추가 * feat: 사용자 정보 갱신 API * feat: 회원가입시 임의 닉네임 생성 * fix: 이미지 업로드 제거 * fix: 사용자 정보 조회 API 프로필 이미지 포함 * docs: user 도메인 swagger 스키마 추가 * fix: 사용자 프로필 이미지 검증 로직 추가 * fix: 사용자 프로필 이미지가 storageKey를 사용하게 수정 * fix: 기본 프로필 이미지 설정 추가 * docs: 사용자 정보 갱신 swagger docs 수정 * feat#/97 -> staging merge commit * feat#/96 -> staging merge commit * feat: application-prod.yaml 생성 및 flyway 싱크 * fix: user 테이블 email, oid nullable flyway 적용 및 code formmater 적용 * fix/#100 -> staging merge commit * chore: local profile kakak api key 추가 * chore: user domain request 파일 병합 * chore: 사용하지 않는 메서드, 파일 삭제 * fix: 사용자 정보 수정, 프로필 이미지 수정 API 분리 * fix: 사용자 프로필 기본 이미지 설정 로직 추가 * fix: 사용자 프로필 수정 멱등성 반영 * test: 사용자 프로필 변경 테스트 추가 * fix/#102 -> staging merge commit * fix: 소셜로그인 providerType 타입 String으로 변경 (대소문자 모두 허용을 위해) * fix: enum클래스 from 메서드 추가 * fix: staging flyway 활성화 * fix/#106 -> staging merge commit * fix: 카카오 로그인 시 platform 파람 추가 할당 * fix: 프론트 검증을 위해 임시 배포 * fix: spotless 적용 * fix: 엑세스, 리프레쉬 토큰 expiry 변경 * fix: deploy-staging.yml fix/#106 브랜치 제거 * fix: auth Platform enum으로 타입 세이프 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix/#109 -> staging merge commit fix: Brand 목록조회 id 오름차순으로 변경 * chore/#104 -> staging merge commit * chore: Prod 환경 자동화 배포 추가 * chore: 프로메테우스 적용 * feat: cors 추가 * fix: deploy-prod.yml chore/#104 브런치 제거 * fix: healchcheck 인증된 사용자만 상세 정보 확인 * fix: actuator 사용하는 경로만 허용 * fix: deploy-prod.yml chore/#104 브랜치 제거 * fix/#105 -> staging merge commit * fix: 사용자 닉네임 최대 글자 수정 * fix: 사용자 닉네임 제약 조건 추가 * fix: 닉네임 제약 조건 메시지 수정 * chore: 닉네임 flyway 제약 조건 버전 추가 * feat: 포즈목록 조회시 scrap 여부 반환 * fix/#116 -> staging merge commit * feat: 약관 목록 및 약관 동의 개발 * fix: 약관 목록 조회시 버전 컬럼 제거 * fix: Gemini 성능 개선 반영 * fix: 중복 정렬 코드 제거 * fix/#119 -> staging merge commit * fix: 랜덤포즈 조회시 excludeIds 추가 * fix: 랜덤포즈 조회할 포즈 없을 시 문구 수정 * test: 테스트 코드 수정 * chore/#122 -> staging merge commit Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix/#125 -> staging merge commit * fix: media 생성시 width, height 입력 받기 * fix: 포즈 상세 및 랜덤포즈 오동작 문제 해결 (관리자 계정만 동작했었음) --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local> * fix/#128 -> staging merge commit fix: : presignedURL 업로드 시 media 엔티티 size 추가 저장 (#129) * chore/#130 -> staging merge commit chore: iOS 개발/상용 키 분리 (#131) * feat/#120 -> staging merge commit * feat: 이미지 조회를 위한 분산락 추가 * feat: redis media 캐시 어댑터 추가 * ref: 메서드 시그니처 변경에 따른 media fake 구현체 메서드 수정 * chore: 사용하지 않는 클래스 제거 * feat: media 조회 usecase 분산락 추가 * feat: redis binary template 추가 * feat: async config 추가 * fix: Redis 분산락 test profile 추가 * fix: media S3 fallback 후 cache 재확인 * fix: RedisMediaBinaryCacheAdapter nullable type 수정 * fix: media 캐시 ttl 만료 전 expire로 갱신하도록 수정 * fix: async 설정 제거 * fix: media type별 캐시 ttl 적용 * fix: 분산락 single-flight 제거 * fix/#127 -> staging merge commit * fix: 폴더 목록 limit 추가 * fix: 이미지 추가에 따른 폴더 정렬 * fix: 폴더 목록 bean validation 추가 * fix/#138 -> staging merge commit fix: photo 업로드 멱등성 * fix/#135 -> staging merge commit * fix: 폴더명 글자수 제한 10자로 수정 * fix: bean validation 메시지 수정 * chore: 폴더명 제약 flyway schema에 추가 * fix/#139 -> staging merge commit fix: 사진 등록 즐겨찾기 필드 추가 * fix/#141 -> staging merge commit * fix: android 개발/상용 키 분리 * fix: 버전 1.0.0 * fix/#145 -> staging merge commit * chore/#147 -> staging merge commit * chore: archunit 의존성 추가 * test: 계층간 의존 관계 설정 * chore: claude code spotless, test hook 추가 * chore: infra 계층 dto 네이밍을 payload로 통일 * ref: 중복되는 테스트 parameterized test로 통합 * fix/#150 -> staging merge commit fix: 네컷사진 삭제 시 Soft Delete 로 변경 --------- Co-authored-by: Koo <koosco136@gmail.com> Co-authored-by: Teahyung Koo <150074724+koosco@users.noreply.github.com> Co-authored-by: darren <darren@darrenui-MacBookPro.local>
1 parent 57de43f commit 2556caa

File tree

328 files changed

+1813
-1580
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

328 files changed

+1813
-1580
lines changed

.claude/CLAUDE.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ docker compose down # Stop containers
2020

2121
## Project Overview
2222

23-
**Yapp** is a photo booth platform API server providing:
23+
**Neki** is a photo booth platform API server providing:
2424
- **Photo Poses**: Users share photo booth pose recommendations
2525
- **Photo Archiving**: Store and organize photos in folders
2626
- **Booth Location Search**: Map-based search across multiple photo booth brands
@@ -112,8 +112,8 @@ Load additional context as needed using `@` references:
112112

113113
| Component | Location |
114114
|-----------|----------|
115-
| UseCase annotation | `src/main/kotlin/com/yapp2app/common/annotation/UseCase.kt` |
116-
| Base response | `src/main/kotlin/com/yapp2app/common/api/dto/BaseResponse.kt` |
117-
| Result codes | `src/main/kotlin/com/yapp2app/common/api/dto/ResultCode.kt` |
118-
| Business exception | `src/main/kotlin/com/yapp2app/common/exception/BusinessException.kt` |
119-
| E2E test base | `src/test/kotlin/com/yapp2app/e2e/E2ETestBase.kt` |
115+
| UseCase annotation | `src/main/kotlin/com/neki/common/annotation/UseCase.kt` |
116+
| Base response | `src/main/kotlin/com/neki/common/api/dto/BaseResponse.kt` |
117+
| Result codes | `src/main/kotlin/com/neki/common/api/dto/ResultCode.kt` |
118+
| Business exception | `src/main/kotlin/com/neki/common/exception/BusinessException.kt` |
119+
| E2E test base | `src/test/kotlin/com/neki/e2e/E2ETestBase.kt` |

.claude/docs/API_PATTERNS.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fun getAllFolders(): BaseResponse<GetAllFolderResponse> {
2626
}
2727
```
2828

29-
Reference: `src/main/kotlin/com/yapp2app/common/api/dto/BaseResponse.kt`
29+
Reference: `src/main/kotlin/com/neki/common/api/dto/BaseResponse.kt`
3030

3131
---
3232

@@ -95,9 +95,9 @@ enum class ResultCode(val code: String, val message: String) {
9595
```
9696

9797
Key files:
98-
- `src/main/kotlin/com/yapp2app/common/exception/BusinessException.kt`
99-
- `src/main/kotlin/com/yapp2app/common/api/dto/ResultCode.kt`
100-
- `src/main/kotlin/com/yapp2app/common/exception/handler/ExceptionHandler.kt`
98+
- `src/main/kotlin/com/neki/common/exception/BusinessException.kt`
99+
- `src/main/kotlin/com/neki/common/api/dto/ResultCode.kt`
100+
- `src/main/kotlin/com/neki/common/exception/handler/ExceptionHandler.kt`
101101

102102
---
103103

@@ -144,7 +144,7 @@ Protected endpoints use `@RequiresSecurity`:
144144
class FolderController
145145
```
146146

147-
Reference: `src/main/kotlin/com/yapp2app/common/api/document/SwaggerConfig.kt`
147+
Reference: `src/main/kotlin/com/neki/common/api/document/SwaggerConfig.kt`
148148

149149
---
150150

.claude/docs/ARCHITECTURE.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ Load this context when designing features, creating new domains, or refactoring.
4848
## Domain Module Structure
4949

5050
```
51-
src/main/kotlin/com/yapp2app/
51+
src/main/kotlin/com/neki/
5252
├── auth/ # Authentication domain
5353
│ ├── api/ # Controllers, DTOs
5454
│ ├── application/ # UseCases, Commands, Ports
@@ -90,7 +90,7 @@ src/main/kotlin/com/yapp2app/
9090
**Wrong**:
9191
```kotlin
9292
// In photo domain
93-
import com.yapp2app.user.domain.entity.User // Direct import!
93+
import com.neki.user.domain.entity.User // Direct import!
9494
```
9595

9696
**Correct** - Use ports for cross-domain communication:
@@ -144,7 +144,7 @@ class CreateFolderUseCase(
144144
}
145145
```
146146

147-
Reference: `src/main/kotlin/com/yapp2app/common/annotation/UseCase.kt`
147+
Reference: `src/main/kotlin/com/neki/common/annotation/UseCase.kt`
148148

149149
---
150150

@@ -153,7 +153,7 @@ Reference: `src/main/kotlin/com/yapp2app/common/annotation/UseCase.kt`
153153
### Port (Interface in Application Layer)
154154

155155
```kotlin
156-
// src/main/kotlin/com/yapp2app/photo/application/port/FolderRepositoryPort.kt
156+
// src/main/kotlin/com/neki/photo/application/port/FolderRepositoryPort.kt
157157
interface FolderRepositoryPort {
158158
fun save(folder: Folder): Folder
159159
fun findById(id: Long): Folder?
@@ -166,7 +166,7 @@ interface FolderRepositoryPort {
166166
### Adapter (Implementation in Infrastructure Layer)
167167

168168
```kotlin
169-
// src/main/kotlin/com/yapp2app/photo/infra/persist/FolderRepositoryAdapter.kt
169+
// src/main/kotlin/com/neki/photo/infra/persist/FolderRepositoryAdapter.kt
170170
@Repository
171171
class FolderRepositoryAdapter(
172172
private val jpaRepository: JpaFolderRepository
@@ -187,7 +187,7 @@ class FolderRepositoryAdapter(
187187
### JPA Repository
188188

189189
```kotlin
190-
// src/main/kotlin/com/yapp2app/photo/infra/persist/jpa/JpaFolderRepository.kt
190+
// src/main/kotlin/com/neki/photo/infra/persist/jpa/JpaFolderRepository.kt
191191
interface JpaFolderRepository : JpaRepository<Folder, Long> {
192192
fun findAllByUserId(userId: Long): List<Folder>
193193
fun existsByUserIdAndName(userId: Long, name: String): Boolean
@@ -215,7 +215,7 @@ Use consistent verb names across all ports:
215215
### Command (Input)
216216

217217
```kotlin
218-
// src/main/kotlin/com/yapp2app/photo/application/command/FolderCommand.kt
218+
// src/main/kotlin/com/neki/photo/application/command/FolderCommand.kt
219219
data class CreateFolderCommand(
220220
val userId: Long,
221221
val name: String,
@@ -230,7 +230,7 @@ data class DeleteFolderCommand(
230230
### Result (Output)
231231

232232
```kotlin
233-
// src/main/kotlin/com/yapp2app/photo/application/result/FolderResult.kt
233+
// src/main/kotlin/com/neki/photo/application/result/FolderResult.kt
234234
data class CreateFolderResult(
235235
val folderId: Long,
236236
)
@@ -342,6 +342,6 @@ class DeletePhotoUseCase(
342342

343343
| Component | Location |
344344
|-----------|----------|
345-
| UseCase annotation | `src/main/kotlin/com/yapp2app/common/annotation/UseCase.kt` |
346-
| Base entity | `src/main/kotlin/com/yapp2app/common/domain/BaseTimeEntity.kt` |
347-
| Transaction runner | `src/main/kotlin/com/yapp2app/common/transaction/TransactionRunner.kt` |
345+
| UseCase annotation | `src/main/kotlin/com/neki/common/annotation/UseCase.kt` |
346+
| Base entity | `src/main/kotlin/com/neki/common/domain/BaseTimeEntity.kt` |
347+
| Transaction runner | `src/main/kotlin/com/neki/common/transaction/TransactionRunner.kt` |

.claude/docs/CONFIGURATION.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ spring:
4242
Use the test utility:
4343
4444
```kotlin
45-
// src/test/kotlin/com/yapp2app/JasyptTest.kt
45+
// src/test/kotlin/com/neki/JasyptTest.kt
4646
@Test
4747
fun jasyptGeneratTest() {
4848
val text = "my_secret_value"
@@ -54,7 +54,7 @@ fun jasyptGeneratTest() {
5454
### Jasypt Configuration
5555

5656
```kotlin
57-
// src/main/kotlin/com/yapp2app/common/config/JasyptConfig.kt
57+
// src/main/kotlin/com/neki/common/config/JasyptConfig.kt
5858
@Configuration
5959
class JasyptConfig {
6060
// Encryption settings:
@@ -71,9 +71,9 @@ class JasyptConfig {
7171
|------|----------|
7272
| Application settings | `src/main/resources/application.yml` |
7373
| Profile-specific | `src/main/resources/application-{profile}.yml` |
74-
| Infrastructure configs | `src/main/kotlin/com/yapp2app/common/infra/config/` |
75-
| Security configs | `src/main/kotlin/com/yapp2app/auth/infra/security/` |
76-
| Swagger config | `src/main/kotlin/com/yapp2app/common/api/document/SwaggerConfig.kt` |
74+
| Infrastructure configs | `src/main/kotlin/com/neki/common/infra/config/` |
75+
| Security configs | `src/main/kotlin/com/neki/auth/infra/security/` |
76+
| Swagger config | `src/main/kotlin/com/neki/common/api/document/SwaggerConfig.kt` |
7777

7878
---
7979

@@ -82,12 +82,12 @@ class JasyptConfig {
8282
### JPA & QueryDSL
8383

8484
```kotlin
85-
// src/main/kotlin/com/yapp2app/common/infra/config/JpaAuditingConfig.kt
85+
// src/main/kotlin/com/neki/common/infra/config/JpaAuditingConfig.kt
8686
@Configuration
8787
@EnableJpaAuditing
8888
class JpaAuditingConfig
8989

90-
// src/main/kotlin/com/yapp2app/common/infra/config/QueryDslConfig.kt
90+
// src/main/kotlin/com/neki/common/infra/config/QueryDslConfig.kt
9191
@Configuration
9292
class QueryDslConfig {
9393
@Bean
@@ -98,7 +98,7 @@ class QueryDslConfig {
9898
### Redis Cache
9999

100100
```kotlin
101-
// src/main/kotlin/com/yapp2app/common/config/RedisCacheConfig.kt
101+
// src/main/kotlin/com/neki/common/config/RedisCacheConfig.kt
102102
@Configuration
103103
@EnableCaching
104104
class RedisCacheConfig {
@@ -110,7 +110,7 @@ class RedisCacheConfig {
110110
### REST Client
111111

112112
```kotlin
113-
// src/main/kotlin/com/yapp2app/common/infra/config/RestClientConfig.kt
113+
// src/main/kotlin/com/neki/common/infra/config/RestClientConfig.kt
114114
@Configuration
115115
class RestClientConfig {
116116
// HTTP client for external APIs
@@ -122,14 +122,14 @@ class RestClientConfig {
122122
## S3 Configuration
123123

124124
```kotlin
125-
// src/main/kotlin/com/yapp2app/media/infra/s3/S3Properties.kt
125+
// src/main/kotlin/com/neki/media/infra/s3/S3Properties.kt
126126
@ConfigurationProperties(prefix = "cloud.aws.s3")
127127
data class S3Properties(
128128
val bucket: String,
129129
val region: String,
130130
)
131131

132-
// src/main/kotlin/com/yapp2app/media/infra/s3/S3MediaStorageConfig.kt
132+
// src/main/kotlin/com/neki/media/infra/s3/S3MediaStorageConfig.kt
133133
@Configuration
134134
class S3MediaStorageConfig {
135135
// S3 client bean configuration
@@ -143,7 +143,7 @@ class S3MediaStorageConfig {
143143
### OAuth Properties
144144

145145
```kotlin
146-
// src/main/kotlin/com/yapp2app/auth/infra/security/properties/OauthProperties.kt
146+
// src/main/kotlin/com/neki/auth/infra/security/properties/OauthProperties.kt
147147
@ConfigurationProperties(prefix = "oauth")
148148
data class OauthProperties(
149149
val kakao: KakaoProperties,
@@ -154,7 +154,7 @@ data class OauthProperties(
154154
### JWT Settings
155155

156156
```kotlin
157-
// src/main/kotlin/com/yapp2app/auth/infra/security/properties/AppProperties.kt
157+
// src/main/kotlin/com/neki/auth/infra/security/properties/AppProperties.kt
158158
@ConfigurationProperties(prefix = "app")
159159
data class AppProperties(
160160
val auth: AuthProperties,

.claude/docs/OBSERVABILITY.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Load this context when adding logging, metrics, or monitoring.
1111
Request tracking with correlation IDs:
1212

1313
```kotlin
14-
// src/main/kotlin/com/yapp2app/common/filter/RequestMdcFilter.kt
14+
// src/main/kotlin/com/neki/common/filter/RequestMdcFilter.kt
1515
class RequestMdcFilter : OncePerRequestFilter() {
1616
override fun doFilterInternal(...) {
1717
MDC.put("requestId", UUID.randomUUID().toString())
@@ -26,7 +26,7 @@ class RequestMdcFilter : OncePerRequestFilter() {
2626
User context in logs:
2727

2828
```kotlin
29-
// src/main/kotlin/com/yapp2app/auth/infra/security/filter/AuthMdcFilter.kt
29+
// src/main/kotlin/com/neki/auth/infra/security/filter/AuthMdcFilter.kt
3030
class AuthMdcFilter : OncePerRequestFilter() {
3131
override fun doFilterInternal(...) {
3232
MDC.put("userId", authentication.id)

.claude/docs/TESTING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ abstract class E2ETestBase {
4242
}
4343
```
4444

45-
Reference: `src/test/kotlin/com/yapp2app/e2e/E2ETestBase.kt`
45+
Reference: `src/test/kotlin/com/neki/e2e/E2ETestBase.kt`
4646

4747
### Domain-Specific Base Classes
4848

@@ -61,7 +61,7 @@ class CreateFolderE2ETest : FolderE2ETestBase() {
6161
## Test Directory Structure
6262

6363
```
64-
src/test/kotlin/com/yapp2app/
64+
src/test/kotlin/com/neki/
6565
├── e2e/ # E2E tests (organized by domain)
6666
│ ├── E2ETestBase.kt # Base class for all E2E tests
6767
│ ├── auth/
@@ -165,7 +165,7 @@ class MyE2ETest : E2ETestBase() {
165165
Encrypt sensitive values for configuration:
166166

167167
```kotlin
168-
// src/test/kotlin/com/yapp2app/JasyptTest.kt
168+
// src/test/kotlin/com/neki/JasyptTest.kt
169169
@Test
170170
fun jasyptGeneratTest() {
171171
val text = "value_to_encrypt"

.claude/settings.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"hooks": {
3+
"Stop": [
4+
{
5+
"hooks": [
6+
{
7+
"type": "command",
8+
"command": "cd \"$CLAUDE_PROJECT_DIR\" && ./gradlew spotlessApply",
9+
"timeout": 120
10+
},
11+
{
12+
"type": "command",
13+
"command": "cd \"$CLAUDE_PROJECT_DIR\" && ./gradlew test",
14+
"timeout": 300
15+
}
16+
]
17+
}
18+
]
19+
}
20+
}

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ RED := \033[0;31m
1818
NC := \033[0m
1919

2020
help: ## Show available commands
21-
@echo "$(GREEN)Yapp API Server - Available Commands$(NC)"
21+
@echo "$(GREEN)Neki API Server - Available Commands$(NC)"
2222
@echo ""
2323
@echo "$(YELLOW)Usage:$(NC) make <target> SPRING_PROFILES=<profile>"
2424
@echo "$(YELLOW)Default profile:$(NC) $(SPRING_PROFILES)"

build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ val kotestVersion = "5.9.1"
2828
val kotestExtensionsVersion = "1.3.0"
2929
val mockkVersion = "1.13.10"
3030
val ktlintVersion = "1.5.0"
31+
val archunitVersion = "1.3.0"
3132

32-
group = "com.yapp2app"
33+
group = "com.neki"
3334
version = "1.0.0"
3435

3536
java {
@@ -111,6 +112,7 @@ dependencies {
111112
testImplementation("io.mockk:mockk:$mockkVersion")
112113
testRuntimeOnly("com.h2database:h2")
113114
testImplementation("io.rest-assured:rest-assured")
115+
testImplementation("com.tngtech.archunit:archunit-junit5:$archunitVersion")
114116
}
115117

116118
spotless {

infra/terraform/aws/modules/s3/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ module "public_images" {
4848
]
4949
5050
tags = {
51-
Project = "YAPP"
51+
Project = "Neki"
5252
Purpose = "Public Image Storage"
5353
}
5454
}
@@ -86,7 +86,7 @@ module "private_files" {
8686
})
8787
8888
tags = {
89-
Project = "YAPP"
89+
Project = "Neki"
9090
Purpose = "Private File Storage"
9191
}
9292
}
@@ -105,7 +105,7 @@ module "archive_storage" {
105105
preset = "archive"
106106
107107
tags = {
108-
Project = "YAPP"
108+
Project = "Neki"
109109
Purpose = "Long-term Archive Storage"
110110
}
111111
}
@@ -144,7 +144,7 @@ module "custom_public" {
144144
]
145145
146146
tags = {
147-
Project = "YAPP"
147+
Project = "Neki"
148148
Purpose = "Custom Configuration"
149149
}
150150
}
@@ -170,7 +170,7 @@ module "public_images" {
170170
})
171171
172172
tags = {
173-
Project = "YAPP"
173+
Project = "Neki"
174174
Purpose = "Now Private Image Storage"
175175
}
176176
}

0 commit comments

Comments
 (0)