Merged
Conversation
- Dockerfile, docker compose 파일 작성 - docker compose up 명령어를 통해 mysql, redis, spring 서버를 띄울 수 있도록 설정 - 로컬에서 테스트 완료 - git submodule 업데이트
- production 브랜치에 CI/CD 워크플로우 작성 - 테스트 목적으로 pull request 요청 시에도 실행되도록 설정 - docker hub 레포지토리에 올라가는지 테스트하
Test Results124 tests 124 ✅ 3s ⏱️ Results for commit c1f3845. ♻️ This comment has been updated with latest results. |
Closed
1 task
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: 빌드 관련 업데이트
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR 타입
☑ 기능 추가
□ 기능 삭제
□ 리팩터링
□ 버그 리포트
□ 버그 수정
□ 의존성, 환경 변수, 빌드 관련 코드 업데이트
반영 브랜치
release/v1.0->production🛠️ 변경 사항
ex) 로그인 시, 구글 소셜 로그인 기능을 추가했습니다.
✅ 작업 상세 내용
🧪 테스트 결과
ex) 베이스 브랜치에 포함되기 위한 코드는 모두 정상적으로 동작해야 합니다. 결과물에 대한 스크린샷, GIF, 혹은 라이브 데모가 가능하도록 샘플API를 첨부할 수도 있습니다.
📚 연관된 이슈
ex) #이슈번호, #이슈번호
🤔 리뷰 요구사항(선택)