Merged
Conversation
- 이슈 템플릿 생성 - feature, refactor, bug report, fix 템플릿 생성
- 모든 응답 클래스가 상속받을 공통 응답 클래스 작성 - code(ex: CREATED), resultCode(ex: 201) 데이터 포함
- CommonResponse 클래스 상속 - Generic을 이용하여 List 형식의 응답을 할 수 있도록 변수 추가 - 응답의 개수를 확인할 수 있는 count 변수 추가
- CommonResponse 상속 - Generic을 사용하여 여러 타입의 응답을 할 수 있도록 설정
- CommonResponse 클래스 상속 - Paging, Slicing 응답 클래스 작성
- main, production 브랜치로 PR 요청 시, 실행할 워크 플로우 파일 작성
- CommonResponse 클래스 상속 - 비지니스 예외 발생 시 사용할 응답 클래스 작성
…flow [FEAT] PR 테스트 자동화 워크플로우 작성
[FEAT] 공통 응답 클래스 작성
* refactor: 응답 클래스 구조 변경 - HttpStatus Code(ex: 201, 404)가 먼저 나오도록 변경 - ExceptionResponse에서 예외 메세지를 담는 변수의 이름을 message로 변경 * feat: 비지니스 예외 클래스 및 핸들러 생성 - 비지니스 예외를 담을 BusinessException 클래스 작성 - BusinessException이 발생했을 때 이를 처리할 BusinessExceptionHandler 클래스 생성 - 비지니스 예외 정보를 담을 ErrorCode enum 클래스 생성 * feat: 미처 처리하지 못한 예외를 핸들링 할 클래스 생성 - 비지니스 로직에서 미처 처리하지 못한 예외를 핸들링 할 GlobalExceptionHandler 클래스 작성
- yml 파일 관리를 위한 git submodule 설정
- submodule 설정에 따라 Github Actions에서 서브 모듈에 접근할 수 있도록 token 설정
* 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
* 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 클래스 작성 - #13 - DB Schema에 따라 entity 클래스 작성 - 특정 필드(LocalDateTime)에 auditing 적용 필요 * feat: auditing 추가 - #13 - BaseTimeEntity 클래스 작성 (생성일자, 마지막 수정일자) - Crew, ChatMessage, Moment, Location, MomentMember, Notice에 적용 * feat: FileHolder 인터페이스 적용 - #13 - 파일 엔티티와 연관관계를 맺는 엔티티에 FileHolder 인터페이스 구현
* 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
* chore: swagger 의존성 추가 * feat: swagger 관련 설정 - SecurityConfig에 swagger 관련 링크는 filterChain을 거치지 않도록 설정 - spring boot 버전 변경 (swagger와 충돌로 인해) - Configuration 클래스 작성 * feat: DTO에 swagger 어노테이션 추가 - DTO에 @Schema 어노테이션을 통해 swagger에서 보여질 정보 추가 * docs: swagger 어노테이션 추가 - 컨트롤러에 swagger 정보 등록을 위해 별도의 interface 생성 및 정보 등록
* refactor: code 내용 변경 - code에 HttpStatus의 이름이 아닌, ErrorCode 코드명이 들어가도록 변경 * chore: 패키지 분리 * fix: 예외 응답 본문이 제대로 나오지 않는 버그 픽스
* 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가 실행되도록 설정
* test: TokenRepository 테스트 코드 작성 - Embedded에서 TestContainers로 방식 변경 - DCI 패턴을 적용하여 테스트 코드 작성 - 테스트 코드에서 사용할 Fixture 클래스 작성 * test: TokenService 테스트 코드 작성 - Mockito를 활용한 단위 테스트로 진행 * test: JwtFacade 테스트 코드 작성 - Mockito를 사용하여 단위 테스트 진행 - DCI 패턴을 적용하여 계층적인 테스트 코드 작성 * test: UserService 테스트 코드 작성 - Mockito를 활용하여 단위 테스트 코드 작성 * test: UserRepository 테스트 코드 작성 * test: UserFacade 테스트 코드 작성 - mockito를 활용해 단위 테스트 작성 - UserFixture에 정적 팩토리 메서드 추가
* fix: NOT_REGISTERED 상태에서 JWT를 발급할 수 있는 버그 픽스 - JwtFacade에 발급 조건을 확인하는 verifyIssueCondition 메서드 추가 - AuthController에서 해당 메서드 호출 - 테스트 코드 작성 * refactor: access/refresh 토큰 발급 로직에 검사하도록 변경 - access, refresh 토큰 발급 로직에 사용자의 상태가 JWT를 발급받을 수 있는 상태인지 확인하도록 변경
- 크루 참여 시 참여 인원이 증가하지 않는 버그 픽스 - 크루 내보내기 이후에도 크루가 남아있는 버그 픽스
* 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 개발 - 크루에 대한 나의 정보(닉네임, 크루 권한) 조회 API 개발 * docs: swagger 어노테이션 잘못된 부분 수정 * docs: 크루에 대한 나의 정보 조회 swagger 정보 입력 * test: 크루에 대한 나의 정보 조회 테스트 코드 작성
- DB mariaDB에서 MySQL로 변경 - git submodule 업데이트 -build.gradle에 mysql 의존성 추가, mariadb 의존성 삭제
- CrewMemeber 리스트를 받아온 후, CrewMember의 연관관계로 설정되어 있는 User 엔티티를 조회하는 과정에서 N+1 problem 발생 - join, DTO 조회를 통해 N+1 problem 해결 - CrewMemberQueryRepository에서 진행
* 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: 모먼트에 참여한 사용자 목록 조회 시 페이징으로 반환하게끔 변경 - 모먼트에 참여한 사용자 목록 조회 시, 리스트로 반환하던 기존 방식에서 무한스크롤로 반환하도록 설정 * test: MomentFacade 테스트 코드 작성
- 특정 크루 내에 속한 모먼트 리스트 조회 `GET /api/moment/crew/{crewId}`
- N+1 문제 해결을 위해 3단계 쿼리 적용 (Moment -> MomentMember -> Location 차례로 조회)
- swagger 정보 입력
* refactor: 참여 중인 크루 페이지네이션 기본 사이즈 값 변경 - 페이지네이션 사이즈 기본 값을 10 -> 20으로 변경 * feat: 다가오는 모먼트 조회 API 개발 - 다가오는 모먼트 조회 API 개발 `GET /api/moment` - N+1 문제를 해결하기 위해 다단계 쿼리 방법 사용 - 제일 가까운 순서대로 조회하지 않고 있는 버그 픽스 필요 * fix: 제일 가까운 순서대로 조회하지 않고 있는 버그 픽스 - 초기에 MomentMember 조회 시 Moment 테이블 JOIN해서 조회하는 방식으로 버그 픽스 - swagger 정보 입력 필요 * docs: swagger 정보 입력
- 크루 초대를 통한 참여 시, 최대 인원(500명)이 이미 차있을 때 INVALID_CREW_CAPACITY 예외 발생 - 모먼트 생성 시, request body로 보낸 capacity가 500명 초과일 때 INVALID_MOMENT_CAPACITY 예외 발생 - Crew, Moment 엔티티의 컬럼에 최대 값(500) 설정
- 다가오는 모먼트 응답 필드가 crew 식별자(PK) 값 추가
* refactor: 모먼트 상세 조회 응답에 필드 변경 - MomentResponse의 isJoined 필드를 참여 정보를 나타내는 ParticipantStatus 값으로 변경 (참여중, 마감, 참여가능 중 1개 반환) - 비지니스 로직 변경으로 인해 테스트 코드 변경 * test: 테스트 코드 수정 - 응답 필드 변경으로 인해 테스트 코드 수정
* refactor: 모먼트 상세 조회 응답 필드 변경 - status 항목을 isJoined, isClosed 항목으로 분리 - isClosed 항목 처리를 위해 매개변수에 LocalDateTime 추가 - 비지니스 로직 변경으로 인해 테스트 코드 수정 * refactor: 크루 내 모먼트 조회 응답 필드 변경 - 크루 내 모먼트 조회 DTO `MomentPreviewResponse` 필드 변경 - ParticipantStatus는 사용하지 않아 삭제 처리
* 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 정보 추가
* refactor: 장소 등록 API 스펙 변경 - 장소 등록 요청 시, request body에 등록할 index를 더 이상 전달하지 않아도 됨 - 비지니스 로직 내에서 index 알아서 처리 - 재시도 로직 추가 필요 * feat: 재시도 로직 분리 및 장소 추가 API에 적용 - 재시도 로직을 별도의 클래스로 분리 (RetryHandler, RetryableOperation) - 장소 추가 API에 재시도 로직 적용 * feat: 모먼트 참여자가 아닌 경우 예외 발생 - 장소 추가 API 요청 시, 모먼트 참여자가 아닌 경우 MOMENT_PARTICIPATION_NOT_FOUND 예외 발생하도록 처리 - 예외 메세지를 더 명확하게 변경
* 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 클래스의 가독성 향상
- 장소 삭제/순서 수정 API 요청 시 만남 장소에 대해서도 처리되는 버그 픽스 - 요청 인덱스 유효성 확인 조건문에 인덱스의 값을 "1 미만"에서 "1 이하"로 변경 - 에러 코드 메세지 수정
* 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: 빌드 관련 업데이트
Test Results124 tests 124 ✅ 3s ⏱️ Results for commit 8c781d7. |
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.
1차 배포
반영 브랜치
main->production🛠️ 개발 사항
1. 소셜 로그인 & 회원가입 기능 개발
2. 파일 시스템 개발
type으로 profile, crew, moment 중 하나 선택3. CREW 관련 API 개발
UUID 토큰(크루 초대 토큰) 생성 후 Redis에 저장
4. 모먼트 관련 API 개발
4. 장소 관련 API 개발