Skip to content

[INFRA] 1차 배포#99

Merged
hey-sung merged 22 commits intomainfrom
release/v1.0
Apr 9, 2025
Merged

[INFRA] 1차 배포#99
hey-sung merged 22 commits intomainfrom
release/v1.0

Conversation

@hey-sung
Copy link
Collaborator

@hey-sung hey-sung commented Apr 8, 2025

PR 타입

☑ 기능 추가
□ 기능 삭제
□ 리팩터링
□ 버그 리포트
□ 버그 수정
□ 의존성, 환경 변수, 빌드 관련 코드 업데이트

반영 브랜치

release/v1.0 -> production


🛠️ 변경 사항

ex) 로그인 시, 구글 소셜 로그인 기능을 추가했습니다.

✅ 작업 상세 내용

  • todo

🧪 테스트 결과

ex) 베이스 브랜치에 포함되기 위한 코드는 모두 정상적으로 동작해야 합니다. 결과물에 대한 스크린샷, GIF, 혹은 라이브 데모가 가능하도록 샘플API를 첨부할 수도 있습니다.


📚 연관된 이슈

ex) #이슈번호, #이슈번호


🤔 리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?

hey-sung added 2 commits April 8, 2025 09:17
- Dockerfile, docker compose 파일 작성
- docker compose up 명령어를 통해 mysql, redis, spring 서버를 띄울 수 있도록 설정
- 로컬에서 테스트 완료
- git submodule 업데이트
- production 브랜치에 CI/CD 워크플로우 작성
- 테스트 목적으로 pull request 요청 시에도 실행되도록 설정
- docker hub 레포지토리에 올라가는지 테스트하
@hey-sung hey-sung added the 📡 infra 인프라 관련 작업 label Apr 8, 2025
@hey-sung hey-sung self-assigned this Apr 8, 2025
@github-actions
Copy link

github-actions bot commented Apr 8, 2025

Test Results

124 tests   124 ✅  3s ⏱️
 53 suites    0 💤
 53 files      0 ❌

Results for commit c1f3845.

♻️ This comment has been updated with latest results.

@hey-sung hey-sung closed this Apr 8, 2025
@hey-sung hey-sung reopened this Apr 8, 2025
@hey-sung hey-sung changed the base branch from production to main April 9, 2025 04:08
@hey-sung hey-sung linked an issue Apr 9, 2025 that may be closed by this pull request
1 task
@hey-sung hey-sung merged commit 8c781d7 into main Apr 9, 2025
2 checks passed
hey-sung added a commit that referenced this pull request Apr 9, 2025
* docs: issue template 생성

- 이슈 템플릿 생성
- feature, refactor, bug report, fix 템플릿 생성

* �docs: PR template 생성

* init: gitignore 파일 설정

* docs: PR 템플릿 수정

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

- 모든 응답 클래스가 상속받을 공통 응답 클래스 작성
- code(ex: CREATED), resultCode(ex: 201) 데이터 포함

* feat: 리스트(목록) 응답 클래스 작성

- CommonResponse 클래스 상속
- Generic을 이용하여 List 형식의 응답을 할 수 있도록 변수 추가
- 응답의 개수를 확인할 수 있는 count 변수 추가

* feat: 단일 응답 클래스 작성

- CommonResponse 상속
- Generic을 사용하여 여러 타입의 응답을 할 수 있도록 설정

* feat: 페이징 관련 응답 클래스 작성

- CommonResponse 클래스 상속
- Paging, Slicing 응답 클래스 작성

* feat: 특정 브랜치로 PR 요청 시 실행할 워크플로우 파일 작성

- main, production 브랜치로 PR 요청 시, 실행할 워크 플로우 파일 작성

* feat: 예외 발생 시 사용할 응답 클래스 작성

- CommonResponse 클래스 상속
- 비지니스 예외 발생 시 사용할 응답 클래스 작성

* [FEAT] 비지니스 예외 클래스 및 핸들러 클래스 개발 (#7)

* refactor: 응답 클래스 구조 변경

- HttpStatus Code(ex: 201, 404)가 먼저 나오도록 변경
- ExceptionResponse에서 예외 메세지를 담는 변수의 이름을 message로 변경

* feat: 비지니스 예외 클래스 및 핸들러 생성

- 비지니스 예외를 담을 BusinessException 클래스 작성
- BusinessException이 발생했을 때 이를 처리할 BusinessExceptionHandler 클래스 생성
- 비지니스 예외 정보를 담을 ErrorCode enum 클래스 생성

* feat: 미처 처리하지 못한 예외를 핸들링 할 클래스 생성

- 비지니스 로직에서 미처 처리하지 못한 예외를 핸들링 할 GlobalExceptionHandler 클래스 작성

* chore: git submodule 설정

- yml 파일 관리를 위한 git submodule 설정

* chore: github actions workflow 설정

- submodule 설정에 따라 Github Actions에서 서브 모듈에 접근할 수 있도록 token 설정

* chore: Update git submodule

* [FEAT] 소셜로그인 기능 개발 (#8)

* feat: 유저 엔티티 작성 - #1

- User 엔티티 작성

* feat: CORS config 클래스 작성

- CORS 클래스 작성: frontend URL인 경우에만 허용하도록 설정

* feat: OAuth2에 필요한 파일 생성

- OAuth2에 필요한 Config 클래스/Handler/Service 생성

* feat: 소셜로그인의 정보를 담을 클래스 생성

- OAuth2UserInfo 추상 클래스를 통해 소셜로그인 성공 후, 필요한 정보들을 담을 수 있도록 설정
- Google, Naver, Kakao 구체 클래스 생성
- Factory 패턴 도입

* feat: 소셜로그인 구현

- oauth2 폴더 삭제 -> security 폴더로 이동
- Google, Naver, Kakao 소셜로그인 구현 완료
- 소셜로그인 완료 시 DB에 저장됨을 확인

* chore: github action 실행 시 yml 파일을 복사하도록 설정

* chore: Update application-test.yml

* chore: Update git submodule

* chore: Update git submodule

* chore: github actions workflow 수정

* chore: Update git submodule

* chore: github actions workflow 수정

* [FEAT] 파일 시스템 개발 (#12)

* feat: Files 엔티티 작성 - #11

- 파일의 정보를 담을 Files 엔티티 작성
- 파일 시스템의 환경 정보를 담고 있는 FileEnv enum class 작성
- 해당 파일이 어떤 정보를 담는 FileType enum class 작성

* chore: AWS S3 의존성 추가 - #11

* feat: 로컬 파일 저장소 구현 - #11

- 파일 업로드, 삭제, 갱신 기능 구현
- 파일 조회(Base64 encoded 문자열로 반환) 기능 구현
- 파일 관련 유틸 클래스 구현

* feat: Files 레포지토리 인터페이스 생성 - #11

* feat: AWS S3 파일 저장소 구현 - #11

- S3Config 클래스를 통해 S3에 필요한 값 설정
- FilesStorage에서 불필요한 메서드(validateFileExist()) 삭제
- BusinessException 생성자 추가 구현

* feat: FilesManager 클래스 구현

- 비지니스 로직을 담고 있는 Manager 클래스 구현
- FilesResponse 응답 클래스 구현

* feat: 파일 컨트롤러 작성 - #11

- 파일 등록/수정/삭제 API 구현
- 파일을 저장해야 하는 클래스에 대하여 FileHolder 인터페이스 구현

* fix: 파일 업데이트 버그 수정

- 저장한 사진에 대하여 사진 변경이 되지 않는 버그 수정
- FilesStorage에 parameter로 전달하는 FileDTO를 잘못 생성하고 있었음

* refactor: FilesStorage에 불필요한 코드 제거

* chore: yml 값 갱신 및 프로퍼티 위치 변경

* chore: yml 값 갱신 및 프로퍼티 위치 변경

* chore: Update git submodule

* chore: 필요없는 코드 삭제

* [FEAT] Entity 클래스 작성 (#14)

* feat: entity 클래스 작성 - #13

- DB Schema에 따라 entity 클래스 작성
- 특정 필드(LocalDateTime)에 auditing 적용 필요

* feat: auditing 추가 - #13

- BaseTimeEntity 클래스 작성 (생성일자, 마지막 수정일자)
- Crew, ChatMessage, Moment, Location, MomentMember, Notice에 적용

* feat: FileHolder 인터페이스 적용 - #13

- 파일 엔티티와 연관관계를 맺는 엔티티에 FileHolder 인터페이스 구현

* [FEAT] 회원가입 기능 개발 (#16)

* feat: CommonResponse에 정적 팩토리 메서드 작성

- OK(200), CREATED(201) 응답에 대하여 정적 팩토리 메서드 생성

* feat: 닉네임 중복 확인 API 개발

- SecurityConfig를 통해 특정 API의 경우 권한 획득이 필요없도록 설정
- 서비스 계층 분리를 위해 Facade 패턴 적용
- GET /auth/check-nickname?nickname=${닉네임}

* chore: 불필요한 코드 제거

* chore: 코드 스타일 수정

* fix: 로컬 버전 업로드 코드 수정

- 파일을 디렉토리로 인식하는 버그로 인한 코드 수정

* feat: 커스텀 MultipartFile 클래스 구현

- 소셜로그인을 통해 프로필 사진을 다운받아 저장할 클래스 구현

* chore: column 제약 조건 명시

* chore: API 주소 추가

* feat: 소셜로그인 성공 시 실행할 코드 작성

- 소셜로그인 성공 시 실행되는 SuccessHandler 작성
- 소셜로그인 과정에서 프로필 사진에 동의한 경우, 프로필 사진을 다운받아 Files 엔티티에 저장

* feat: 회원가입 API 개발

- POST /api/auth/signup 회원가입 API 구현
- 소셜로그인 성공 시, email이 아닌 user PK 전달하도록 변경(식별 목적)

* feat: 프로필 사진 정보를 받지 못했을 때 기본 프로필 이미지로 설정

- 회원가입 시 프로필 사진 동의 하지 않았을 때, 사용자의 프로필 사진을 기본 이미지로 설정하는 코드 추가
- Files가 null일 때 추가 처리 필요

* refactor: 회원가입 API 응답 구조 변경

- 사용자 PK, 닉네임, 프로필 사진 정보 전달하도록 변경

* feat: Files가 null일 때 더미데이터 전달하도록 변경

- 파일 정보를 가지고 있어야 하는 엔티티(User, Crew, Moment)에 대해 파일이 존재하지 않으면 더미 데이터를 전달하도록 변경
- Files 엔티티에 더미 데이터를 만드는 정적 팩토리 메서드 코드 작성

* feat: oauth2 실패 시 실행할 핸들러 클래스 구현

* feat: 프로필 사진 조회/수정 API 구현

* chore: Update git submodule

* [FEAT] swagger 설정 및 적용 (#17)

* chore: swagger 의존성 추가

* feat: swagger 관련 설정

- SecurityConfig에 swagger 관련 링크는 filterChain을 거치지 않도록 설정
- spring boot 버전 변경 (swagger와 충돌로 인해)
- Configuration 클래스 작성

* feat: DTO에 swagger 어노테이션 추가

- DTO에 @Schema 어노테이션을 통해 swagger에서 보여질 정보 추가

* docs: swagger 어노테이션 추가

- 컨트롤러에 swagger 정보 등록을 위해 별도의 interface 생성 및 정보 등록

* [REFACTOR] 공통 응답 구조 변경 (#20)

* refactor: code 내용 변경

- code에 HttpStatus의 이름이 아닌, ErrorCode 코드명이 들어가도록 변경

* chore: 패키지 분리

* fix: 예외 응답 본문이 제대로 나오지 않는 버그 픽스

* [FEAT] JWT를 통한 로그인 기능 개발 (#22)

* feat: JWT에 필요한 클래스 생성

* feat: jwt 생성 로직 구현

* feat: UserFacade에 메서드 추가

- PK를 통해 User 객체를 찾는 메서드 추가
- 인가 성공 시, 사용자의 정보를 전달하는 메서드 추가

* feat: header에서 JWT 추출하는 코드 추가

* feat: 인가 요청 API 개발

* fix: JWT prefix 버그 수정

* feat: JwtAuthenticationFilter 구현

- access-token, refresh-token 검증 로직 추가
- access-token 만료 시, refresh-token을 통해 재발급하는 로직 추가
- RTR 전략 적용 필요

* feat: 코드 가독성 개선

* chore: redis 의존성 추가

* feat: redis 설정 파일, 레포지토리, 도메인 설정

* feat: RTR 전략 적용

* test: redis embedded 설정 추가

* feat: JwtAuthenticationFilter 예외 처리 로직 추가

- AuthenticationExceptionFilter를 구현하여, 인가 과정에서 예외 발생 시 바로 예외 응답을 발생시키도록 설정

* refactor: Redis repository를 template 형식으로 변경

* feat: 토큰 재발급 시, 커스텀 헤더에 값 전달

* feat: logout 메서드 구현

- JwtFacade에 logout 메서드 구현
- TokenRepository에 userId(key)를 통해 토큰 정보를 삭제하는 메서드 구현

* feat: 토큰 탈취 감지 시 대응 로직 구현

- 토큰 탈취 감지 시 로그아웃 처리 (Cookie 삭제 & Redis에서 토큰 정보 삭제)
- 로그아웃 처리 이후 예외 발생 처리

* feat: 에러코드의 HttpStatus 수정

- JWT 관련 에러코드 중 일부를 UNAUTHORIZED로 변경
- 사용자 관련 에러 코드 중 일부를 CONFLICT로 변경
- 파일 관련 에러 코드 중 일부를 UNSUPPORTED_MEDIA_TYPE / INTERNAL_SERVER_ERROR로 변경

* fix: 커스텀 헤더가 제대로 동작하지 않는 버그 수정

- access-token 재발급 시에만 커스텀 헤더(X-Token-Reissued)에 true값 담아서 전달
- 그 외의 상황에는 false 값 전달

* chore: Update git submodule

* chore: Github Actions workflow에 redis 설정

- workflow에 github actions를 통한 테스트 실행 시 redis가 실행되도록 설정

* [FEAT] JWT 테스트 코드 작성 (#25)

* test: TokenRepository 테스트 코드 작성

- Embedded에서 TestContainers로 방식 변경
- DCI 패턴을 적용하여 테스트 코드 작성
- 테스트 코드에서 사용할 Fixture 클래스 작성

* test: TokenService 테스트 코드 작성

- Mockito를 활용한 단위 테스트로 진행

* test: JwtFacade 테스트 코드 작성

- Mockito를 사용하여 단위 테스트 진행
- DCI 패턴을 적용하여 계층적인 테스트 코드 작성

* test: UserService 테스트 코드 작성

- Mockito를 활용하여 단위 테스트 코드 작성

* test: UserRepository 테스트 코드 작성

* test: UserFacade 테스트 코드 작성

- mockito를 활용해 단위 테스트 작성
- UserFixture에 정적 팩토리 메서드 추가

* [FIX] 아직 회원가입을 하지 않은 상태에서도 JWT 발급이 가능한 버그 픽스 (#27)

* fix: NOT_REGISTERED 상태에서 JWT를 발급할 수 있는 버그 픽스

- JwtFacade에 발급 조건을 확인하는 verifyIssueCondition 메서드 추가
- AuthController에서 해당 메서드 호출
- 테스트 코드 작성

* refactor: access/refresh 토큰 발급 로직에 검사하도록 변경

- access, refresh 토큰 발급 로직에 사용자의 상태가 JWT를 발급받을 수 있는 상태인지 확인하도록 변경

* [FEAT] 크루 생성/수정/조회 기능 개발 (#30)

* feat: 크루 생성 API 개발

- 크루 생성 API 개발
- 크루를 생성한 유저는 자동으로 참여 처리
- CrewMember에 연관관계 편의 메서드 정의

* feat: 크루 수정 API 개발

- CrewFacade에 구현해야 할 메서드 추가
- CrewMemberRepository JPA Repository로 변경
- ErrorCode에 추가로 더 필요한 에러코드 추가
- 크루 정보를 수정할 수 있는 API 개발
- 사용자의 역할(CREW/LEADER) 확인 후, 리더가 아니면 예외를 발생시키도록 설정

* feat: 크루 참여 API 개발

- 크루 참여 API (POST /api/crew/{crewId} 개발
- 크루 수정 API endpoint 수정
PATCH /api/crew -> PATCH /api/crew/{crewId}
- CrewMemberRepository 잘못된 쿼리 수정

* feat: 크루 단일 조회 API 개발

- 특정 크루 단일 조회 API 개발 (GET /api/crew/{crewId}

* feat: 크루원 탭 조회 API 구현

- Pagination 형식으로 크루원 정보를 전달하는 API 구현
- 기본 size = 10, page = 0
- 최대로 요청할 수 있는 페이지의 크기를 20으로 설정

* feat: 크루 생성 DTO에 validation 추가

- CrewCreateRequest DTO의 name(이름)에 Validation 추가
- Validation에서 예외가 발생한 경우, 400번대 에러가 발생하도록 설정

* test: CrewFacade 테스트 코드 작성

- DCI 패턴으로 테스트 코드 작성
- 참여 로직은 추가적인 구현이 필요헤 테스트 코드에서는 제외

* feat: JacksonConfig 설정 (#32)

- JacksonConfig 클래스를 통해 LocalDate, LocalDateTime의 경우 yyyy.MM.dd HH:mm:ss 형태로 반환하도록 설정

* [DOCS] CrewController에 swagger 어노테이션 적용 (#33)

* docs: DTO에 대해 swagger 어노테이션 적용

* docs: CrewController에 swagger 어노테이션 적용

* [FIX] 회원가입 URL 변경을 통해 다른 사용자 회원가입 페이지에 접근할 수 있는 버그 픽스 (#34)

* feat: Registration Token 저장을 위해 구조 변경

- TokenType을 통해 어떤 종류의 토큰인지 구분 가능
- TokenRepository에 TokenType을 통해 각자 다른 종류의 토큰을 관리할 수 있도록 설정
- 메서드명 변경에 따라 테스트코드 수정

* feat: 회원가입 토큰을 관리하는 서비스 클래스 생성

- 회원가입 토큰을 관리하는 클래스는 RegistrationTokenService로 명명
- Refresh-token을 관리하는 클래스는 RefreshTokenService로 이름 변경
- 두 클래스를 security/service/token 으로 이동
- 소셜로그인 성공 시, 기존에 id 값을 담아 전달했던 방식에서 token(UUID)를 전달하는 방식으로 변경

* feat: 회원가입 시 토큰을 받아 처리하도록 변경

- 회원가입 API (POST /api/auth/signup)에서 request body에 userId 대신 token을 전달하도록 변경
- UUID를 통해 userId를 추출하도록 변경
- 회원가입이 완료되면 redis에서 token을 삭제하도록 변경

* test: Token 관련 레포지토리/서비스 레이어에 대해 테스트 코드 작성

- TokenRepository, RefreshTokenService, UserFacadeTest 테스트 코드 수정
- RegistrationTokenService 테스트 코드 추가
-TokenFixture에 RefreshToken, RegistrationToken 생성 메서드 분리

* chore: git submodule 업데이트

* feat: 참여 중인 크루 리스트 조회 API 개발 (#41)

- 참여 중인 크루 리스트 조회 API 개발 (GET /api/crew/my)
-  DTO 직접 조회를 통한 N+1 problem 해결

* [FEAT] 크루원 초대/가입 기능 개발 (#42)

* chore: JavaMailSender, Thymeleaf 의존성 추가

* feat: 크루 초대 메일 전송 기능 구현

- JavaMailSender, Thymeleaf를 통해 메일로 크루 초대 전송하는 기능 구현

* feat: 크루 초대, 가입 API 개발

- 크루 초대, 크루 가입 코드는 InvitationFacade로 분리
- 크루 초대 정보를 저장할 Invitation 엔티티 작성
- 초대 관련 에러 코드 추가(ALREADY_INVITED, INVITATION_NOT_FOUND, INVITATION_EXPIRED)
- 크루 초대, 가입 API 개발
- 예외 상황 테스트 필요
- 메일 전송 비동기 처리 필요

* test: InvitationFacade 테스트 코드 작성

- Mockito를 이용해 단위 테스트 작성
- 토큰의 유효기간을 확인하는 로직에 버그가 있어, 해당 로직 수정

* fix: 엔티티 영속화로 인한 버그 픽스

- 연관관계 설정으로 인해 엔티티 영속화가 바로 이루어져 발생하는 버그 픽스
- 에러코드 메세지 수정

* docs: swagger 정보 입력

* chore: git submodule 업데이트

* chore: git submodule 업데이트

* refactor: 메일 주소 yml 값으로 변경

* [FEAT] 크루 초대 API에 비동기 적용 (#45)

* feat: 비동기 관련 Config 클래스 작성

* feat: 크루 초대 메일 API에 비동기 적용

- JavaMailSender를 사용하는 MailManager에 비동기 처리 적용
- 메일 전송이 실패한 경우, 새로운 트랜잭션에서 Invitation(초대 정보) 삭제

* test: 크루 초대 메서드 테스트 코드 수정

- 크루 초대 메서드의 비지니스 로직 변경으로 인해 테스트 코드 수정

* [FEAT] 크루원 내보내기 기능 개발 (#46)

* feat: 크루에서 사용자 내보내기 API 구현

- 크루에서 사용자 내보내기 API 구현
DELETE /api/crew/{crewId}?nickname={nickname}
- CrewFacade에 사용자 내보내는 메서드 구현
- Crew 엔티티에 참여 인원 수를 갱신하는 비지니스 코드 추가
- 테스트 코드 작성 필요

* fix: 크루 생성 시 참여인원이 2로 설정되는 버그 수정

- 로직 중복으로 인해 크루 생성 시 참여인원이 2로 설정되는 버그 수정

* test: 크루 내보내기 메서드에 대해 테스트 코드 작성

- Mockito를 활용해 단위 테스트 코드 작성
- DCI 패턴으로 테스트 코드 작성
- 다양한 예외 케이스 작성

* docs: swagger 어노테이션 추가

- 크루 내보내기 API에 swagger 어노테이션 추가

* feat: 참여 인원 수 갱신 시, 데이터 정확성 확인

* [REFACTOR] 회원가입 프로필 조회/수정 API 스펙 변경 (#49)

* refactor: RegistrationTokenService 메서드 분리

- getUserIdFromToken()에서 delete() 메서드 분리
(하나의 메서드에서 두 개의 일을 하는것으로 판단하여 분리 진행)

* refactor: 프로필 조회/수정 API 요청 시 토큰을 전달하도록 변경

- 회원가입 프로필 조회/수정 API spec 변경
- /auth/profile/{id}에서 /auth/profile?token={token}으로 변경

* [REFACTOR] JWT 재발급 조건 변경 (#51)

* refactor: JWT 재발급 조건 변경

- JWT재발급 조건을 "AT 없음 & RT 유효"로 변경하면서 resolveAccessToken에 분기 추가
- verifyAccessToken에서 전달받은 토큰이 빈 문자열인 경우 NEED_CHECK_RT를 반환하도록 변경
- ErrorCode의 메세지 변경

* test: JwtFacade 테스트 코드 수정

- 재발급 변경 로직이 변경되면서 테스트 코드도 수정
- resolveAccessToken, verifyAccessToken에 대해 테스트 코드 수정

* [FEAT] 장소 검색 API 개발 (#53)

* feat: RestClient configutation 클래스 작성

- RestClient Bean으로 등록하여 싱글톤으로 동작하도록 설정
- 연결 타임아웃(Connect Timeout) & 읽기 타임아웃(Read Timeout) 설정

* feat: 키워드를 통한 장소 검색 기능 구현

- 키워드를 통한 장소 검색 API 구현 GET /api/search/location?keyword={keyword}
- location 하위 패키지로 search 생성

* docs: swagger 어노테이션 추가

- CrewApi, Place에 swagger 어노테이션 추가

* feat: LocalController에 LocalApi 상속

* feat: RestClient에 에러 헨들링 추가

* docs: git submodule 업데이트

* feat: 응답 객체에 kakao map url 포함

* refactor: 페이지 당 컨텐츠의 개수 기본값 조정

- Kakao REST API 중 키워드를 통한 장소 찾기의 페이지의 최대 사이즈 제한으로 인해 에러 코드 변경

* [FIX] 파일 등록 시, 크루/모먼트 타입을 인식하지 못하는 버그 픽스 (#55)

* fix: 파일 생성/조회 시 crew&moment가 조회되지 않는 버그 픽스

- FileHolderFinder에서 FileType을 찾을 때 PROFILE 외에 CREW, MOMENT 추가
- MomentRepository 인터페이스 작성
- ErrorCode에 Moment 엔티티 찾지 못했을 때 추가

* feat: 파일 업로드 API 로직 보강

- 파일 업로드 메서드에, 파일이 기존에 존재하는 경우 해당 저장소에서 파일을 삭제하는 로직 추가

* feat: crew 삭제 API 구현

- crew 삭제 API 구현 (DELETE /api/crew/{crewId})
- 크루 내보내기 API endpoint 변경 (DELETE /api/crew/{crewId}/members?nickname={nickname})
- crew 삭제 시 files 엔티티도 함께 삭제되며, 저장소에 저장된 파일도 같이 삭제 처리
- CrewApi에 swagger 정보 추가
- 테스트 코드 추가

* �[FIX] 닉네임 유효성 확인 로직 추가 (#56)

- 닉네임 유효성 검사 로직 추가 (2~20자 제한, 한글/영문자/숫자만 허용)
- 테스트 코드 추가 작성

* !HOTFIX: 파일 지원 확장자 추가

- 파일 지원 확장자에 webp 추가

* [FEAT] 모먼트 생성/수정 API 개발 (#64)

* feat: 모먼트 생성 API 구현

- `POST /api/moment` 모먼트 생성 API 구현
- 모먼트 생성 시 Crew & MomentMember & Location & Moment 엔티티 생성 및 연관관계 설정
- MomentCreateRequest의 유효성 확인 필요
- 테스트 코드 작성 필요

* feat: 모먼트 생성 요청 DTO 유효성 검사 로직 추가

- 모먼트 마감 날짜/시간, 만남 날짜/시간 유효성 검사 로직 추가
- 만남일자(meetAt)/마감일자(closedAt)는 오늘보다 나중이어야 하며, 만남일자가 마감일자보다 더 이후여야 함
- 모먼트 마감 인원이 2인 이상이 아니라면 예외 발생

* feat: 모먼트 수정 API 구현

- `PATCH /api/moment/{momentId}` 모먼트 수정 API 구현
- 모먼트 생성 API endpoint 변경 `POST /api/moment?crewId = {crewId}`
- DTO의 이름 MomentCreateRequest -> MomentRequest로 변경
- Location, moment 내용 갱신 메서드 추가
- 필요없는 주석 제거
- 테스트 코드 작성 필요

* fix: 모먼트 수정 body에 값이 들어오지 않았을 때 버그 픽스

- null 감지로 인해 발생하는 버그 픽스
- 해당 필드에 값이 들어오지 않아 null일 때에는 moment에 있던 값 사용
- 테스트 코드 작성 필요

* test: 모먼트 생성 테스트 코드 작성

- capacity, meetAt, closedAt에 입력값에 대해 유효성 검사
- moment, location 엔티티 값 검사

* test: 모먼트 수정 테스트 코드 작성

* [DOCS] 모먼트 생성/수정 API에 swagger 정보 추가 (#66)

* refactor: 만남 장소 정보가 존재하지 않을 때 처리 로직 추가

- 모먼트 수정 시 만남 장소 정보가 존재하지 않을 때, 수정 DTO를 통해 받은 정보를 바탕으로 엔티티를 생성하도록 변경

* docs: swagger 정보 추가

* feat: 모먼트 삭제 API 구현 (#68)

- 모먼트 삭제 API 개발 `DELETE /api/moment/{momentId}`
- swagger 정보 추가

* !HOTFIX: 크루 참여 응답에 crew PK 전달하도록 변경

* !HOTFIX: 크루 내보내기, 참여 버그 픽스

- 크루 참여 시 참여 인원이 증가하지 않는 버그 픽스
- 크루 내보내기 이후에도 크루가 남아있는 버그 픽스

* [FEAT] 만남 장소 등록 API 개발 (#69)

* feat: 장소 등록 API 구현

- LocalController -> LocationController로 이름 변경
- Place DTO에 @NotNull 어노테이션 추가
- Moment에 낙관적 락 적용

* feat: Location에 복합 유니크 제약 조건 추가

- location_index, moment_id 복합 유니크 제약 조건 추가

* feat: 낙관적 락 예외 발생 시 전달할 에러 코드 추가

* fix: 낙관적 락이 적용되지 않는 버그 픽스

- Moment 엔티티에 낙관적 락이 걸려있으나, 변경사항이 없어 낙관적 락이 적용되지 않는 문제 발생
- 낙관적 락을 통해 Moment 엔티티를 조회하고, modified_at 컬럼을 변경하게 하여 낙관적 락이 적용되도록 변경

* docs: LocationApi에 swagger 정보 추가

* [FEAT] 크루에 대한 나의 정보 조회 API 개발  (#71)

* feat: 크루에 대한 나의 정보 조회 API 개발

- 크루에 대한 나의 정보(닉네임, 크루 권한) 조회 API 개발

* docs: swagger 어노테이션 잘못된 부분 수정

* docs: 크루에 대한 나의 정보 조회 swagger 정보 입력

* test: 크루에 대한 나의 정보 조회 테스트 코드 작성

* chore: DB 변경 작업

- DB mariaDB에서 MySQL로 변경
- git submodule 업데이트
-build.gradle에 mysql 의존성 추가, mariadb 의존성 삭제

* [REFACTOR] 크루 내 크루원 정보 조회 쿼리문 리팩터링 (#73)

- CrewMemeber 리스트를 받아온 후, CrewMember의 연관관계로 설정되어 있는 User 엔티티를 조회하는 과정에서 N+1 problem 발생
- join, DTO 조회를 통해 N+1 problem 해결
- CrewMemberQueryRepository에서 진행

* !HOTFIX: 날짜 포맷팅 삭제

* [FEAT] 모먼트 상세 조회/참여&참여 취소/참여자 정보 조회 API 개발 (#76)

* feat: 장소 검색 결과에 장소 고유 ID 추가

* feat: 모먼트 상세 정보 조회 API 개발

- 모먼트 상세 탭에서 모먼트 상세 조회 API 개발 (GET /api/moment/{momentId}
- 테스트 코드 작성 필요

* feat: 최대 장소 등록 가능 개수 설정

- 모먼트 당 등록 가능한 장소의 최대 개수를 100으로 설정
- DB 레벨, 어플리케이션 레벨에서 예외 처리

* feat: 장소 정보 리스트 조회 API 개발

- `GET /api/location/{momentId}` 장소 정보 리스트 조회 API 개발
- swagger 정보 추가 필요
- 테스트 코드 작성 필요

* docs: swagger 정보 추가

* docs: swagger 정보 추가

* feat: 모먼트 참여, 참여 취소 API 개발

- 모먼트 참여`POST /api/moment/{momentId}/join`
- 모먼트 참여 시, 기존에 이미 참여한 경우 & 마감 기한이 지난 경우 & 최대 참여 가능 인원 다 찬 경우 예외 발생
- 모먼트 참여 취소 `DELETE /api/moment/{momentId}/join`
- 참여 정보가 있는 경우에만, 참여 정보 삭제 & 모먼트의 참여 인원 수 감소
- MomentFacade의 경우, 필요없다고 판단되는 접미사(moment) 제거
- swagger 정보 입력
- 테스트 코드 작성 필요

* feat: 모먼트에 참여한 사용자 조회 API 개발

- 모먼트에 참여한 사용자 조회 API개발
`GET /api/moment/{momentId}/members`
- swagger 정보 추가

* refactor: 쿼리문을 더 명시적으로 변경

- 모먼트에 참여하는 사용자 목록 조회 쿼리문에 JOIN문 명시적 작성

* feat: 모먼트 참여 검증 조건 추가

- 모먼트가 속한 크루에 참여하지 않은 사용자인 경우, 예외를 발생하도록 조건 추가

* [REFACTOR] 모먼트 참여자 목록 조회 API spec 변경 (#81)

* refactor: 모먼트에 참여한 사용자 목록 조회 시 페이징으로 반환하게끔 변경

- 모먼트에 참여한 사용자 목록 조회 시, 리스트로 반환하던 기존 방식에서 무한스크롤로 반환하도록 설정

* test: MomentFacade 테스트 코드 작성

* chore: git submodule 업데이트

* [FEAT] 모먼트 탭에서 리스트 조회 기능 (#82)

- 특정 크루 내에 속한 모먼트 리스트 조회 `GET /api/moment/crew/{crewId}`
- N+1 문제 해결을 위해 3단계 쿼리 적용 (Moment -> MomentMember -> Location 차례로 조회)
- swagger 정보 입력

* [FEAT] 다가오는 모먼트 조회 API 개발 (#84)

* refactor: 참여 중인 크루 페이지네이션 기본 사이즈 값 변경

- 페이지네이션 사이즈 기본 값을 10 -> 20으로 변경

* feat: 다가오는 모먼트 조회 API 개발

- 다가오는 모먼트 조회 API 개발 `GET /api/moment`
- N+1 문제를 해결하기 위해 다단계 쿼리 방법 사용
- 제일 가까운 순서대로 조회하지 않고 있는 버그 픽스 필요

* fix: 제일 가까운 순서대로 조회하지 않고 있는 버그 픽스

- 초기에 MomentMember 조회 시 Moment 테이블 JOIN해서 조회하는 방식으로 버그 픽스
- swagger 정보 입력 필요

* docs: swagger 정보 입력

* style: 코드 스타일 변경

* [FEAT] 크루/모먼트 최대 참여인원 설정 (#85)

- 크루 초대를 통한 참여 시, 최대 인원(500명)이 이미 차있을 때 INVALID_CREW_CAPACITY 예외 발생
- 모먼트 생성 시, request body로 보낸 capacity가 500명 초과일 때 INVALID_MOMENT_CAPACITY 예외 발생
- Crew, Moment 엔티티의 컬럼에 최대 값(500) 설정

* docs: swagger tag 정보 추가

* docs: API 이름 수정

* [REFACTOR] 다가오는 모먼트 응답 객체에 크루 식별자 추가

- 다가오는 모먼트 응답 필드가 crew 식별자(PK) 값 추가

* [REFACTOR] 모먼트 상세 조회의 응답 DTO 변경 (#90)

* refactor: 모먼트 상세 조회 응답에 필드 변경

- MomentResponse의 isJoined 필드를 참여 정보를 나타내는 ParticipantStatus 값으로 변경
(참여중, 마감, 참여가능 중 1개 반환)
- 비지니스 로직 변경으로 인해 테스트 코드 변경

* test: 테스트 코드 수정

- 응답 필드 변경으로 인해 테스트 코드 수정

* [REFACTOR] 모먼트 상세 조회, 크루 내 모먼트 조회 응답 DTO 변경 (#92)

* refactor: 모먼트 상세 조회 응답 필드 변경

- status 항목을 isJoined, isClosed 항목으로 분리
- isClosed 항목 처리를 위해  매개변수에 LocalDateTime 추가
- 비지니스 로직 변경으로 인해 테스트 코드 수정

* refactor: 크루 내 모먼트 조회 응답 필드 변경

- 크루 내 모먼트 조회 DTO `MomentPreviewResponse` 필드 변경
- ParticipantStatus는 사용하지 않아 삭제 처리

* [FEAT] 장소 삭제 API 개발 (#93)

* feat: 장소 삭제 API 구현

- 장소 삭제 API `DELETE /api/location/{momentId}?index={index}`
- 삭제하고자하는 장소가 없는 경우(momentId, index에 해당하는 Location이 없는 경우) LOCATION_NOT_FOUND 예외 발생
- 성능 이슈로 인해 다른 장소들의 인덱스 변경 시, UPDATE문을 통해 bulk 연산 수행
- @Modifying의 낙관적 락 우회 이슈로 인해, 쿼리에서 직접 moment 버전 확인하도록 변경
- swagger 정보 입력 필요

* fix: 장소 삭제 중 예외 발생 시 재시도 로직 추가

* feat: 재시도 조건 수정 및 예외 추가 처리

- 요청한 인덱스가 범위 내 인덱스 여부인지 판단 후, 아니라면 INVALID_LOCATION_INDEX 예외 발생
- 삭제하고자 하는 인덱스가 마지막 인덱스일 때에는 갱신된 rows 수 검사하는 로직 적용 X
- 인덱스 범위 검사 후, 인덱스를 찾을 수 없는 경우에는 동시성 문제이므로, CONCURRENT_MODIFICATION_EXCEPTION 예외를 발생시키도록 설정

* docs: swagger 정보 추가

* [FEAT] 장소 등록 API에 참여 사용자 검증 및 index 필드 자동화 구현 (#94)

* refactor: 장소 등록 API 스펙 변경

- 장소 등록 요청 시, request body에 등록할 index를 더 이상 전달하지 않아도 됨
- 비지니스 로직 내에서 index 알아서 처리
- 재시도 로직 추가 필요

* feat: 재시도 로직 분리 및 장소 추가 API에 적용

- 재시도 로직을 별도의 클래스로 분리 (RetryHandler, RetryableOperation)
- 장소 추가 API에 재시도 로직 적용

* feat: 모먼트 참여자가 아닌 경우 예외 발생

- 장소 추가 API 요청 시, 모먼트 참여자가 아닌 경우 MOMENT_PARTICIPATION_NOT_FOUND 예외 발생하도록 처리
- 예외 메세지를 더 명확하게 변경

* [FEAT] 만남 장소 순서 수정 API 개발 (#95)

* feat: 장소 순서 변경 API 개발

- 장소 순서 변경 API 개발 `PATCH /api/location/{momentId}`
- request body에 수정하고자 하는 인덱스(originalIndex), 바꾸고자하는 인덱스(newIndex)를 받음
- 모먼트 참여 정보가 없을 때, request body에 담긴 값이 유효하지 않을 떄 예외 발생
- (moment_id, location_index) 복합 유니크 제약 조건으로 인해, 인덱스를 음수로 변경한 후, 다시 양수로 변경하는 로직 적용
- curl을 이용한 동시성 테스트 필요
- swagger 정보 입력 필요

* chore: 메서드명 변경

- 메서드의 이름을 더 명확하게 변경

* docs: swagger 정보 입력

- 장소 순서 변경 API에 swagger 정보 입력

* chore: ExceptionHandler 패키지 생성

- exception 패키지 내에 handler 하위 패키지 생성 및 ExceptionHandler 클래스 위치 이동

* fix: 장소 삭제 요청 시 �발생하는 이슈 해결

- 장소 삭제 API 요청 시, row lock으로 인해 발생하는 deadlock & unique 제약 조건 이슈 해결
- 벌크 연산 시 unique 제약 조건으로 인해 데이터가 정상적으로 갱신되지 않는 문제 발생
- 변경 대상 행들의 location_index를 모두 음수로 변환 후, 다시 양수로 변환하는 방법을 이용하여 이슈 해결

* �chore: 코드 가독성 향상

- 여러 개 행의 인덱스를 한 번에 갱신하는 코드를 service 클래스에 통합하여 Facade 클래스의 가독성 향상

* [FIX] 장소 삭제/수정 시, 만남 장소에 대해서도 실행되는 버그 픽스 (#98)

- 장소 삭제/순서 수정 API 요청 시 만남 장소에 대해서도 처리되는 버그 픽스
- 요청 인덱스 유효성 확인 조건문에 인덱스의 값을 "1 미만"에서 "1 이하"로 변경
- 에러 코드 메세지 수정

* [INFRA] 1차 배포 (#99)

* chore: docker compose 빌드 파일 추가

- Dockerfile, docker compose 파일 작성
- docker compose up 명령어를 통해 mysql, redis, spring 서버를 띄울 수 있도록 설정
- 로컬에서 테스트 완료
- git submodule 업데이트

* chore: github actions 워크플로우 작성

- production 브랜치에 CI/CD 워크플로우 작성
- 테스트 목적으로 pull request 요청 시에도 실행되도록 설정
- docker hub 레포지토리에 올라가는지 테스트하

* chore: git submodule 갱신

* chore: 빌드 관련 업데이트
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📡 infra 인프라 관련 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[INFRA] 1차 배포 진행

1 participant