Skip to content

#115 ~ #150 반영해 운영 서버 배포#151

Merged
soonduck-dreams merged 25 commits into
mainfrom
develop
Aug 20, 2025
Merged

#115 ~ #150 반영해 운영 서버 배포#151
soonduck-dreams merged 25 commits into
mainfrom
develop

Conversation

@soonduck-dreams

Copy link
Copy Markdown
Contributor

No description provided.

pizzazoa and others added 25 commits July 19, 2025 19:44
* feat: 동정 의견 엔티티/리포지토리

* perf: BirdIdSuggestionRepo 수정

동정의견에 포함된 Bird 썸네일도 한번에 가져오게 하여 N+1 문제 방지

* feat: BirdIdSuggestionQueryService 추가

* feat: 컬렉션 동정 의견 목록 조회에 학명 추가

* feat: BirdIdSuggestionCommandService 추가

* fix: collectionIds가 빈 경우에 대비한 guard 추가

* fix: 쿼리 오류 수정

ORDER BY에 s.bird.id를 넣었다면, GROUP BY절에도 포함시켜야 함

* feat: BirdIdSuggestionController 추가

* feat: 컬렉션에 칼럼 추가 - bird_id_suggestion_requested_at

해당 컬렉션이 "언제 동정 의견을 요청했는지". bird_id가 null로 갱신될 때 bird_id_suggestion_requested_at도 갱신됨

* feat: 동정 의견 기다리는 컬렉션 목록 조회 순서를 birdIdSuggestionRequestedAt DESC로 수정

* feat: 동정 의견 기다리는 컬렉션 응답에 동정 의견 요청 시각 필드 추가

* test: 서비스/리포지토리 테스트 추가
* feat(coll): 컬렉션 신고 엔티티 구현

* feat(coll): 컬렉션 신고 API 구현

* docs(db): 컬렉션 신고 테이블 V33로 변경
* feat(coll): 동정 의견 API 분리 및 추가

동정 제안과 동의, 비동의 API를 분리하고, 동의와 비동의는 토글로 구현

* feat(coll): 동정 의견 도메인에 type 필드 추가

* feat(coll): 바뀐 API에 맞게 서비스 로직 수정

* test(coll): 테스트 수정
* feat(user): 프로필 사진 엔티티 구현

* feat(user): 프로필 사진 도메인 기능 구현

* feat(user): 회원가입 시 기본 프로필 사진 배정 기능 추가

* feat(user): 기본 프로필 사진 랜덤화

* feat(db): 기존 유저들에 기본 프로필 배정 마이그레이션 추가

* feat(coll): 컬렉션 조회 응답 dto들에 프로필 사진 포함

* feat(infra): 기본 프로필사진 s3에 업로드하는 컴포넌트 추가

* test(user): 유저 프로필 사진 테스트 구현

* test: 테스트 수정

프로필 사진 추가로 인한 도메인의 변경사항들 반영

* test: 실패한 테스트 수정

* refactor: user_profile_image 테이블 수정 등

user_profile_image 테이블은 User Custom 프사를 관리하는 역할로 축소. 기본 프사 관리는 users 테이블의 variant 칼럼으로.

* refactor: 임시 프사 삭제 API 삭제

* refactor: 기본 프로필 이미지 상수를 YAML 설정으로 분리하여 관리

* refactor: UserProfileImageCommandService에서 S3 직접 의존 제거하고 ImageService로 위임

* refactor: 프로필 이미지 관리 로직 통합 및 서비스 구조 단순화

UserProfileImageCommandService 제거, 관련 로직을 UserCommandService와 UserProfileUpdateService로 통합

* refactor: 프로필 이미지 변경 시 S3 삭제를 트랜잭션 커밋 후로 이관

트랜잭션 유틸 추가 및 afterCommit 실행으로 S3 삭제 안전성 강화

* docs: 프로필 이미지 경로 및 API 문서 예시를 user-profile-images로 변경

* refactor: UserProfilePolicy를 NicknamePolicy로 명확화 및 이메일 검증 유틸 분리

닉네임 정책 클래스 명을 NicknamePolicy로 변경하고
이메일 검증 로직을 RegexMatchUtils로 분리

* refactor: 프로필 사진 URL 조회 로직을 공통 서비스로 추출

기존 각 QueryService에서 개별 구현하던
프로필 이미지 URL 조회를 UserProfileImageUrlService로
통합하여 중복 제거 및 기본 프사 fallback 로직 일원화

* test: 테스트 추가

* feat(db): user_profile_image 일부 칼럼 타입 변경

user_bird_collection_image의 형식을 따름

---------

Co-authored-by: soonduck-dreams <nederileni99heits@gmail.com>
* chore: ImageDomainService의 위치 변경 (util -> infra)

ImageDomainService의 역할과 책임을 고려했을 때, 유틸이라기보다는 인프라 서비스로 보는 것이 적절

* refactor(coll): S3 이미지 삭제 책임을 공용 서비스로 이전

컬렉션 전용 S3 삭제 클래스를 제거하고 공용 ImageService를 활용하도록 변경했어요

* refactor(coll): 이미지 삭제 로직을 트랜잭션 커밋 이후로 분리

컬렉션 이미지 S3 삭제를 runAfterCommitOrNow로 감싸 트랜잭션 무결성을 보장했어요

* refactor: S3 다중 삭제 로직에 예외 처리 및 재시도 로직 추가

실패 가능성에 선제 대응해 안정성과 오류 추적성 확보

* refactor(coll): S3 presign 및 삭제 로직을 ImageService로 위임

인프라 세부 구현 제거로 서비스 레이어의 추상화와 테스트 용이성 향상

* feat(coll): CollectionImageUrlService 도입

컬렉션을 받아 대표 이미지 URL로 변환하는 전용 서비스로써 책임 분리 및 재사용성 향상

* refactor(coll): 컬렉션 이미지 URL 조회 전용 서비스로 로직 이관
* fix: 회원 정보 수정 API 응답 수정

프로필 이미지 URL을 제대로 표시하도록

* fix: 사소한 테스트 수정
* chore: FCM 환경 설정

* feat: 푸시 알림을 위한 디바이스 토큰 엔티티 구현

* feat: 디바이스 토큰 관련 API 구현

* feat: 로컬 디바이스 토큰 API 구현

* feat: 푸시 알림 기능 구현

* feat(coll): 댓글, 좋아요, 동정의견에 푸쉬알림 호출 로직 추가

* test(coll): 푸쉬 알림 호출 로직 추가에 따른 테스트 코드 수정

* feat: 알림 설정 테이블 및 엔티티 추가

회의 내용을 기반으로 4가지 범주 enum으로 관리

* feat: 알림 설정과 관련된 API를 디바이스 토큰 컨트롤러와 분리

* chore: 디바이스 토큰 도메인에서 isActive 필드 삭제

알림 설정 도메인 분리에 따라 매커니즘 변경

* feat: 알림 설정 API 구현

단순 조립 로직은 서비스가 아닌 매퍼가 하도록 위임

* refactor: 기존 디바이스 토큰 도메인 서비스 수정

* refactor: 푸시 알림 서비스도 수정

* fix: 응답 dto에 필요한 정보가 누락된 걸 수정

* chore(db): 마이그레이션 버전 변경

* refactor: 안 쓰일 것 같은 API 삭제

* chore: 프로필 사진 브랜치 병합

* refactor: admin 관련 API 삭제

회의 결과 컨퍼런스 이후에나 만들 admin 기능을 신경 쓰면서 작업하기 번거로워서...

* feat: 알림 테이블 및 엔티티 생성

컨트롤러는 일단 스켈레톤으로 구현

* refactor: 푸쉬 알림 생성 서비스를 코어 계층으로 이동

* refactor: 코어 계층 토큰 정리 로직 분리

* chore(): 최신 브랜치 병합

* feat: 알림 도메인 API 구현

* fix(db): sql 잘못된 구문 수정

* refactor: notification 도메인에서 과도한 커맨드 남용 줄임

* refactor: 응답 dto 래핑 구조 변경

컨벤션에 맞게

* test(coll): 테스트 수정

* refactor: createdAtOnly에 Getter 추가

* refactor: 푸쉬 메시지 생성 서비스 리팩토링

token을 메시지에 담아서 보내기 위해 배치 단위가 아닌 각 토큰에 메시지를 보내는 로직으로 리팩토링

* refactor: PushNotificationService의 계층 변경

core보다 application이 맞는 것 같아서..

* chore(db): 마이그레이션 넘버 변경

* refactor(infra): FCM key 환경변수 설정 및 Async 설정 변경

* style: 메서드 이름 명확히 하고, 불필요한 임포트 삭제

* refactor: 알림 설정 테이블 스키마 변경

차후 유지보수 및 확장성을 고려해 피드백대로 type 필드 생성

* refactor: 알림 설정 조회 dto 및 로직도 약간 변경

V41은 세미콜론 누락 수정...

* refactor: 디바이스 토큰 테이블 유니크 제약 변경

* refactor: APNs 배지 설정을 읽지 않은 알림 개수로 리팩토링

* refactor: 메시지 생성 관련 리팩토링

불필요한 필드를 제거하면서 중복되는 코드를 따로 메서드화 했습니다

* refactor: 이름 변경 리팩토링

* refactor: 컨트롤러 관련 자잘한 변경들

피드백들 반영한 변경점들입니다 (PUT -> PATCH 변경, 로그아웃 시 알림 삭제 제거 등)

* refactor: 디바이스 토큰 도메인 이름을 유저 디바이스로 변경

* refactor: 알림 설정 테이블의 참조 관계를 유저 디바이스 테이블 변경에 맞춰 수정

userDeviceId 대신 기존대로 userId와 deviceId로 둔 이유는 프론트에서 어차피 넘겨주는 값이 유저 정보와 디바이스 정보이고, 추가적으로 userDeviceId를
넘겨줘야 하는 수고를 덜기 위해서

* fix: 토큰 등록 시 알림 설정 생성 로직 변경

알림 설정 테이블이 유저 디바이스 id를 필요로 하게 되면서 생긴 영속성 컨텍스트 문제를 해결하기 위해 수정

* refactor: 비동기 메서드 분리

* fix: Transactional readonly 없앰

여기서 readonly 있으면 인앱 알림 저장 안 됨

---------

Co-authored-by: soonduck-dreams <nederileni99heits@gmail.com>
* refactor: 메서드 이름 변경과 에러 처리 추가

토큰뿐 아니라 사용자 디바이스 정보를 등록한다는 개념으로 확장

* refactor: 알림 발송 로직을 DSL 기반 NotificationPublisher로 통합

기존 서비스 클래스 제거 후 일관된 DSL 체인 방식으로 알림 처리 흐름 단순화

* refactor: 알림 도메인 디렉터리 구조 변경

* feat: FCM 전송 방식을 멀티캐스트로 변경

보내야 할 토큰이 여러 개일 경우, 한 번의 요청으로 전송 가능해 성능 향상

* feat: 푸시알림/인앱알림 분리

notification 테이블은 "인앱알림"이므로 title 제거
* feat: 알림설정 subject/action 구조 개편 및 기본값 백필·nested 응답 구현

알림설정 type 필드를 subject/action으로 변경하고, 누락 설정 자동 생성과 유연한 nested 응답 구조를 추가

* feat: 유저 디바이스 등록 시 기본 알림설정 초기화 방식 개선

기존 하드코딩된 전체 초기화 로직을 제거하고, 누락된 항목만 생성하는 방식으로 변경

* chore: 안 쓰는 메서드 삭제

* chore: V43 변경 - INSERT문 id 명시

* fix: 유저 디바이스 등록 오류 해결

트랜잭션 쪽에 원인이 있었고, 이를 해결

* feat: notification 테이블에 subject/action 도입

* feat: sender를 actor로 변경

* docs: 시각 데이터 예시 수정

* fix: DTO 응답 시간 형식 수정

OffsetDateTime을 LocalDateTime으로 변환해서 줘야 함

* feat: 알림 설정을 type 기반으로 되돌리고, type명 수정

* feat: 알림을 type 기반으로 되돌림

* chore: 알림 내용 기획 명세에 맞추기

* chore: 메시지 렌더링 기준을 type으로 수정 및 테스트 수정

* chore: 메시지 수정
* feat: 알림 메시지 템플릿을 yml로 관리

* feat: 로컬에서 푸시 알림 시뮬레이션 추가

푸시 알림 내용이 의도대로 나가는지 로컬에서 쉽게 확인 가능

* chore: 불필요한 코드 삭제
* feat: 회원 탈퇴 흐름 설계 및 SocialRevoker 추가

SocialRevoker는 소셜 공급자 쪽에 연결된 사용자 내역을 연결 해제하는 책임을 진다

# Conflicts:
#	src/main/java/org/devkor/apu/saerok_server/domain/user/application/UserCommandService.java

* feat: 회원 탈퇴 API 구현

* feat: 탈퇴 후 재가입 시 프로비저닝 로직 구현

* feat: 회원 탈퇴 시 Hard Delete 로직 추상화

* test: 테스트 수정

* chore: 환경변수 추가에 따른 GitHub Action Flow 반영

* chore: 불필요 메서드 삭제

* feat: 로컬 테스트용 - 탈퇴한 더미 유저 재가입 API 추가

* feat: 알림을 받을 유저가 탈퇴한 경우 인앱알림/푸시알림 안 보내도록 함

* feat: 회원 탈퇴 시 알림 내역/알림 설정/유저 디바이스 정보 삭제

* chore: 불필요한 코드 삭제

* fix: 새로운 컬렉션 생성 시 birdIdSuggestionRequestedAt 제대로 초기화되지 않았던 문제 해결

동정 의견 기다리는 컬렉션 조회 API 요청 중 NPE 발생하여 버그 식별하였고, 원인 파악해 해결

* chore: 불필요한 코드 삭제

* docs: Swagger 문서 정리
* chore: 알림 목록 조회 API 응답에서 body 제거

* feat: notification 테이블에 payload 칼럼 추가

jsonb 타입으로 유연하게 메타데이터 관리

* feat: notification 테이블 related_id 칼럼 제거 및 payload에 collectionId, collectionImageUrl 주입

* feat: 알림 목록 조회 응답에 actorProfileImageUrl 추가

* test: 테스트 수정

* refactor: NotifyActionDsl이 외부 도메인에 직접 의존하지 않도록 수정

* test: 테스트 수정
* feat: 알림 읽음 처리 시 사일런트 푸쉬 발송 로직 추가

* revert: 다른 방향으로 수정하기 위해 일단 롤백

* feat: 사일런트 푸쉬를 위한 메서드 추가

* refactor: 메시지 타입 동사형 통일을 위한 수정

* fix: 리베이스 중 잘못한 거 수정

* chore: 불필요한 변경 사항 제거
클라이언트에서 쓰지 않음
* feat(coll): 컬렉션 상세에 내 컬렉션인지 여부 추가

* test(coll): 테스트 수정
@soonduck-dreams soonduck-dreams merged commit 2d59ae0 into main Aug 20, 2025
1 check passed
@soonduck-dreams soonduck-dreams added the release 운영 서버 배포 label Aug 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release 운영 서버 배포

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants