Skip to content

Commit 2a390ff

Browse files
gunwoong1630HwuanPagejohnhuh619garusitellCopilot
authored
release (#118)
* git initialize * feature/swagger-03-gunwoong (#5) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feat: swagger 추가 * feat: swagger 추가 * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/OpenAPI Test/02-HwuanPage * feature/OpenAPI Test/02-HwuanPage * Update SurfingForecastApiClient.java * feature/APICallTest-02-HwuanPage * feature/EntityInit-13-HwuanPage * feature/EntityInit-13-HwuanPage * feature/JellyfishEntityInit-13-HwuanPage * Update FishingType.java * feature/EntityInitialize-13-HwuanPage * feat: entity, repositor 구현 * feat: 예상 dto 구현 * chore: 의존성 추가 * feat: 로그인 구현 & 이후 토큰 발급 로직 구현 * fix: AuthCotnroller 수정 * fix: 클라이언트에서 카카오에서 코드를 받아 서버로 post 하게 수정 * feat: 토큰 검증 * feat: refresh token 블랙리스트 처리 로직 구현 * feat: refresh 토큰 블랙리스트 처리 & 재발급 로직 구현 * feat: SecurityFilterChain 엔드 포인트 허용 * feat: refresh 토큰 블랙리스트 검증 로직 구현 * feat: redis에서 refreshToken 블랙리스트 검증 * refactor: controller에 강하게 결합 되어 있던 로직들 분리 * test: member 관련 테스트 * chore: 하드코딩한 중요 값 Intellij IDEA 환경변수로 설정 * refactor: state 관리를 위해 세션 추가 * feat: member 정보 조회하는 서비스 로직 구현 * feat: member 정보 조회하는 서비스 로직 구현 * format: naver formatter로 포매팅 * chore: application-dev * fix: customException 처리 * Feat/meeting interface (#19) * feat : MeetingService 인터페이스 구현 * feat : ParticipantResponse * feat : MeetingListResponse 구현 * feat : MeetingDetailResponse구현 * feat : MeetingDetailAndMemberResponse 구현 * feat : ListSpot 구현 * feat : DetailSpot 구현 * feat : CreateMeetingRequest 구현 * feat : Tag 구현 * feat : Long -> long 변경 서비스와 Entity내에서 null값이 절대 나오지 않는다고 판단하는 값을 long으로 변경하였습니다. * feat : MeetingService.java -> 무한페이지로딩형식으로 바꾸었습니다. * Update src/main/java/sevenstar/marineleisure/meeting/Dto/Response/MeetingDetailResponse.java Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]> * Feature/FavoritesAndAlertInterface-16-HwuanPage * feature/FavoritesAndAlertInterface-16-HwuanPage * Update AlertMapper.java * Update JellyfishRegionDensityRepository.java * Update AlertController.java * Update FavoriteController.java * Update FavoriteRepository.java * Update AlertController.java * Update JellyfishSpieces.java * Update JellyfishRegion.java * Update JellyfishRegion.java * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * Feature/api scheduler 15 gunwoong (#28) * feat: api * feat: api 스케줄링 * feat: spot service inteface * test: remove legacy test * feat: apply open meteo * test: apply api test * feat: spot service (#34) * feat: spot service * feat: spot service 고도화 및 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * hotfix: duplicated controller method * feature/FavoriteCRUD-33-HwuanPage * DELETE COMPLETE * UPDATE COMPLETE * search COMPLETE * Before gunwoong * FavoriteCRUD create * feat/domain test * FavoriteSpotServiceTest * FavoriteSpotServiceTest * feature/FavoriteCURD-33-HwuanPage * add some description on service * Update FavoriteServiceImpl.java * Feature/spot preview 40 gunwoong (#41) * feat: spot preview & 리팩토링 * feat: spot preview & 리팩토링 * hotfix: jpa metamodel fix * fix: error fix * fix: 소셜 로그인 재시도 시 닉네임 UNIQUE 제약 위반 오류 발생 (#42) * fix: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 하던 버그 수정 * refactor: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 수정 사항 리팩토링 * test: 변경사항에 따른 테스트 코드 수정 * hofix: bug fix * Feature/Alert-22-HwuanPage * Create Pdf Parser * Web crawler run perpectly,but pdfparser do not work well * PDF parse to stack DB complete with OPENAI * CallAlert Complete * JellyFish PDF parsing work well * feature/ControllerTest Complete * feature/JellyfishAlert-26-HwuanPage * feat: 즐겨찾기 추가 및 리팩토링 (#49) * feat: 즐겨찾기 추가 및 리팩토링 * refactor: 리팩토링 * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 코드 적용이 필요합니다. * `createMeeting(Long memberId, CreateMeetingRequest request)`: * 목적: 새로운 모임을 생성합니다. 호스트를 참여자로 자동 등록하고 태그 정보를 저장합니다. * `updateMeeting(Long meetingId, Long memberId, UpdateMeetingRequest request)`: * 목적: 기존 모임의 정보를 수정합니다. 호스트만 수정할 수 있도록 검증합니다. * `deleteMeeting(Member member, Long meetingId)`: * 목적: 모임을 삭제합니다. * 개선 예정: 물리적 삭제 대신 논리적 삭제(Soft Delete) 방식 도입을 고려 중입니다. * feat : MeetingValidate.java,MemberValidate.java,ParticipantValidate,SpotValidate,TagValidate.java 검증로직을 추가하였습니다. * feat : MemberError.java , ParticipantRepository 기능을 추가하였습니다. --------- Co-authored-by: Hwang Seong Cheol a.k.a Hwuan Page <[email protected]> * Feature/integration init (#54) * feature/IntegrationSet(test&Build)-52-HwuanPage * data.sql unique update * image build needs * ignore dev.yml * remove dev.yml tracking and ignore it * prod * proded * Feature/activities 17 audwls239 (#56) * feature: 컨트롤러, 서비스 생성 * feature: 활동별 지수 조회(위치 기반) * feature: DTO 추가 * feature: 활동별 지수 조회(글로벌) 추가, 컨트롤러 수정 * feature: 활동별 지수 상세 조회(미완성) * feature: 해양 정보 조회 * feature: 활동 상세 조회 --------- Co-authored-by: Gunwoong cho <[email protected]> * feat : ParticipantError 입니다. * hotfix: error fix * fix : Directory 수정사항입니다. (#57) * hotfix: error fix * feat: member delete (#58) * fix: 멤버 삭제 구현 * feat: 멤버 삭제, 위/경도 수정 구현 * test: 테스트 수정 * Delete src/main/java/sevenstar/marineleisure/meeting/repository/MemberRepository.java * Delete src/main/java/sevenstar/marineleisure/meeting/repository/OutdoorSpotSpotRepository.java * Delete src/main/resources/test.http --------- Co-authored-by: LEESUNBIN <[email protected]> Co-authored-by: Gunwoong cho <[email protected]> * fix : ParticipantRepository (#59) existsByMeetingIdAndUserId 로 수정하였습니다. * fix : ParticipantRepository (#60) memberId -> userId로 수정하였습니다. * fix: token (#61) * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 # Conflicts: # src/main/java/sevenstar/marineleisure/global/exception/enums/CommonErrorCode.java # src/main/java/sevenstar/marineleisure/global/swagger/SwaggerController.java * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 코드 적용이 필요합니다. * `createMeeting(Long memberId, CreateMeetingRequest request)`: * 목적: 새로운 모임을 생성합니다. 호스트를 참여자로 자동 등록하고 태그 정보를 저장합니다. * `updateMeeting(Long meetingId, Long memberId, UpdateMeetingRequest request)`: * 목적: 기존 모임의 정보를 수정합니다. 호스트만 수정할 수 있도록 검증합니다. * `deleteMeeting(Member member, Long meetingId)`: * 목적: 모임을 삭제합니다. * 개선 예정: 물리적 삭제 대신 논리적 삭제(Soft Delete) 방식 도입을 고려 중입니다. * feat : MeetingValidate.java,MemberValidate.java,ParticipantValidate,SpotValidate,TagValidate.java 검증로직을 추가하였습니다. * feat : MemberError.java , ParticipantRepository 기능을 추가하였습니다. --------- Co-authored-by: Hwang Seong Cheol a.k.a Hwuan Page <[email protected]> * feat: 테스트용 액세스 토큰 생성 * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * Feature/api scheduler 15 gunwoong (#28) * feat: api * feat: api 스케줄링 * feat: spot service inteface * test: remove legacy test * feat: apply open meteo * test: apply api test * feature/FavoriteCRUD-33-HwuanPage * DELETE COMPLETE * UPDATE COMPLETE * search COMPLETE * Before gunwoong * FavoriteCRUD create * feat/domain test * FavoriteSpotServiceTest * FavoriteSpotServiceTest * feature/FavoriteCURD-33-HwuanPage * add some description on service * Update FavoriteServiceImpl.java * fix: error fix * fix: 소셜 로그인 재시도 시 닉네임 UNIQUE 제약 위반 오류 발생 (#42) * fix: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 하던 버그 수정 * refactor: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 수정 사항 리팩토링 * test: 변경사항에 따른 테스트 코드 수정 * hofix: bug fix * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 # Conflicts: # src/main/java/sevenstar/marineleisure/global/exception/enums/CommonErrorCode.java # src/main/java/sevenstar/marineleisure/global/swagger/SwaggerController.java * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 코드 적용이 필요합니다. * `createMeeting(Long memberId, CreateMeetingRequest request)`: * 목적: 새로운 모임을 생성합니다. 호스트를 참여자로 자동 등록하고 태그 정보를 저장합니다. * `updateMeeting(Long meetingId, Long memberId, UpdateMeetingRequest request)`: * 목적: 기존 모임의 정보를 수정합니다. 호스트만 수정할 수 있도록 검증합니다. * `deleteMeeting(Member member, Long meetingId)`: * 목적: 모임을 삭제합니다. * 개선 예정: 물리적 삭제 대신 논리적 삭제(Soft Delete) 방식 도입을 고려 중입니다. * feat : MeetingValidate.java,MemberValidate.java,ParticipantValidate,SpotValidate,TagValidate.java 검증로직을 추가하였습니다. * feat : MemberError.java , ParticipantRepository 기능을 추가하였습니다. --------- Co-authored-by: Hwang Seong Cheol a.k.a Hwuan Page <[email protected]> * fix : jellyfish 부분 * fix: activity 부분 * fix: member 부분 * fix: member 부분 * fix: spot 부분 * fix: forecast 부분 * fix: favorite 부분 * fix: alert 부분 * fix: meeting 부분 --------- Co-authored-by: Gunwoong cho <[email protected]> Co-authored-by: Hwang Seong Cheol a.k.a Hwuan Page <[email protected]> Co-authored-by: MyungJin <[email protected]> Co-authored-by: LEESUNBIN <[email protected]> Co-authored-by: gunwoong <[email protected]> * hotfix/fix-alert&favorites-62-HwuanPage * fix(hotfix/Meeting) : rebase로 인한 코드 누락 수정 (#65) * hotfix: 코드 누락 해결 (#67) * Fix/fix 70 gunwoong (#71) * hotfix: fix * hotfix: fix * hotfix: fix * fix: application-prod.yml에서 쿠키를 쓸지 말지 결정할 수 있게 수정 (#69) * fix: application-prod.yml에서 쿠키를 쓸지 말지 결정할 수 있게 수정 * test: 테스트 코드 작성 * fix: activities 시큐리티 엔드포인트 허용. redirecturi 수정 * Chore/docker set andvariable-68-hwuanPage * chore/ReadytoDeployv1.0.0-68-HuwanPage * chore/ReadytoDeploymentv1.0.0-68-HuwanPage * remove etc * prod * refactor: blacklist 엔티티의 jti에 인덱스를 건다. (#74) * Feat/meeting test 75 (#77) * feat : Meetingtest 를 위한 Util 파일입니니다. * feat : Meetingtest 를 위한 Util 파일입니니다. * feat : MeetingServiceImplTest 단위테스트입니다. * feat : MeetingControllerTest 통합테스트입니다. * feat : Build Lombok을 테스트를 위한 수정입니다. * feat : Tag 엔티티 Tag List<String> content 를 변환하기 위한 파일입니다. * feat : MeetingServiceImpl * feat : MeetingServiceImpl에서 수정하는 응답을 수정 , 매퍼를 수정하였습니다. * feat : Meeting에서 필요한 url을 열어뒀습니다. * space prob solve * stack-trace-DEBUG * hotfix/data.sql deprecate-HwuanPage (#79) * hotfix/data.sql deprecate-HwuanPage * portnum fix * Xtest * test X * workflow fix * add id * fix docker-compose-image-root * release/v1-marineleisure * fix: blacklist 엔티티의 jti에 인덱스를 건다. (#83) * fix: cors 프론트엔드 배포 도메인 추가 (#84) * fix: blacklist 엔티티의 jti에 인덱스를 건다. * fix: cors 프로트엔드 도메인 추가 * hotfix/method_allowed_patch-HwuanPage (#86) * Refactor/exception hwuan page (#87) * refacotr/favorite-Exception-update * fix kakao_redirect_uri * Feature/map service refactoring 76 gunwoong (#85) * feat: mapServiceRefactoring * refactoring: spot detail refactoring * refactoring: GeoUtils refactoring * test: repository test disable for prod * fix: apply flyway to yml * fix: disable test * refactor: khoa refactoring * fix: bug * fix: sql * fix: yml 환경변수 추가 * fix: detail field name 수정 * feature: 스케줄링 비동기 구현 (#91) * refactor: cacheable (#103) * Fix/meeting urland role (#100) * fix : MeetingServiceImpl getStatusMeetings -> getStatusMeeting_role : Guest 인지 host 인지 판단하는 로직을 추가 * fix : MeetingRepository getStatusMeetings -> getStatusMeeting_role : Guest 인지 host 인지 판단하는 로직을 추가 * fix : MeetingError MEETING_MEMBER_NOT_FOUND 에러를 추가하였습니다. 미팅에서 맴버를 확인할 수 없는 에러입니다. * fix : MeetingController MeetingController 에서 role 을 확인하여 추가 확인할 수 있도록 하였습니다. * fix : MeetingServiceImplTest, MeetingControllerTest.java URL 개선에 의한 새로운 테스트 입니다. * fix : MeetingServiceImplTest, MeetingControllerTest.java @disabled 추가 하였습니다. * feat: 회원 탈퇴 시 카카오 연결 끊기도 수행하게 구현한다. (#98) * feat: member 삭제 시 kakao 연결 끊기 로직도 수행하게 구현 * test: 변경 사항 test * feat : Meeting의 커서방식에서 매핑을 하였습니다. (#94) * feat: 카카오 로그인 과정에서 pkce를 통해 보안 관점에서 개선 (#106) * feat: 보안 인증 과정에서 PKCE 추가하여 구현 * test: 변경 사항 test 추가 * feat: PKCE 기반 보안 기능 코드 구조 변경 * test: PKCE 기반 보안 기능 test * refactor: PKCE 생성을 클라이언트 에게 넘긴다. * test: pkce test 플로우 변경에 따라 변경 * fix: member entity의 nickname 중복을 허용한다 * fix: 테스트를 위해 SchedulerService.java 의 @RequiredArgsConstrucor 지운 부분 복구 * fix: 테스트를 위해 SchedulerService.java 의 @RequiredArgsConstrucor 지운 부분 복구 * refactor: open-meteo 서비스 관련 리팩토링 (#95) * refactor: RichDomain으로 변경 내역입니다. (#105) * Fix: login redirect (#107) * fix: 로그인 요청때의 리다이렉트 uri를 토큰 교환시에도 사용 * test: test * fix: fallback 상황에서 리다이렉트 uri 찾는 로직 추가 * Refactor/meeting rich domain (#110) * refactor: RichDomain으로 변경 내역입니다. * refactor: 누락 프로젝트 파일이 있어 첨부합니다. * build: caffenine 적용 * relase (#111) (#112) * git initialize * feature/swagger-03-gunwoong (#5) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feat: swagger 추가 * feat: swagger 추가 * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/OpenAPI Test/02-HwuanPage * feature/OpenAPI Test/02-HwuanPage * Update SurfingForecastApiClient.java * feature/APICallTest-02-HwuanPage * feature/EntityInit-13-HwuanPage * feature/EntityInit-13-HwuanPage * feature/JellyfishEntityInit-13-HwuanPage * Update FishingType.java * feature/EntityInitialize-13-HwuanPage * feat: entity, repositor 구현 * feat: 예상 dto 구현 * chore: 의존성 추가 * feat: 로그인 구현 & 이후 토큰 발급 로직 구현 * fix: AuthCotnroller 수정 * fix: 클라이언트에서 카카오에서 코드를 받아 서버로 post 하게 수정 * feat: 토큰 검증 * feat: refresh token 블랙리스트 처리 로직 구현 * feat: refresh 토큰 블랙리스트 처리 & 재발급 로직 구현 * feat: SecurityFilterChain 엔드 포인트 허용 * feat: refresh 토큰 블랙리스트 검증 로직 구현 * feat: redis에서 refreshToken 블랙리스트 검증 * refactor: controller에 강하게 결합 되어 있던 로직들 분리 * test: member 관련 테스트 * chore: 하드코딩한 중요 값 Intellij IDEA 환경변수로 설정 * refactor: state 관리를 위해 세션 추가 * feat: member 정보 조회하는 서비스 로직 구현 * feat: member 정보 조회하는 서비스 로직 구현 * format: naver formatter로 포매팅 * chore: application-dev * fix: customException 처리 * Feat/meeting interface (#19) * feat : MeetingService 인터페이스 구현 * feat : ParticipantResponse * feat : MeetingListResponse 구현 * feat : MeetingDetailResponse구현 * feat : MeetingDetailAndMemberResponse 구현 * feat : ListSpot 구현 * feat : DetailSpot 구현 * feat : CreateMeetingRequest 구현 * feat : Tag 구현 * feat : Long -> long 변경 서비스와 Entity내에서 null값이 절대 나오지 않는다고 판단하는 값을 long으로 변경하였습니다. * feat : MeetingService.java -> 무한페이지로딩형식으로 바꾸었습니다. * Update src/main/java/sevenstar/marineleisure/meeting/Dto/Response/MeetingDetailResponse.java --------- * Feature/FavoritesAndAlertInterface-16-HwuanPage * feature/FavoritesAndAlertInterface-16-HwuanPage * Update AlertMapper.java * Update JellyfishRegionDensityRepository.java * Update AlertController.java * Update FavoriteController.java * Update FavoriteRepository.java * Update AlertController.java * Update JellyfishSpieces.java * Update JellyfishRegion.java * Update JellyfishRegion.java * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * Feature/api scheduler 15 gunwoong (#28) * feat: api * feat: api 스케줄링 * feat: spot service inteface * test: remove legacy test * feat: apply open meteo * test: apply api test * feat: spot service (#34) * feat: spot service * feat: spot service 고도화 및 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * hotfix: duplicated controller method * feature/FavoriteCRUD-33-HwuanPage * DELETE COMPLETE * UPDATE COMPLETE * search COMPLETE * Before gunwoong * FavoriteCRUD create * feat/domain test * FavoriteSpotServiceTest * FavoriteSpotServiceTest * feature/FavoriteCURD-33-HwuanPage * add some description on service * Update FavoriteServiceImpl.java * Feature/spot preview 40 gunwoong (#41) * feat: spot preview & 리팩토링 * feat: spot preview & 리팩토링 * hotfix: jpa metamodel fix * fix: error fix * fix: 소셜 로그인 재시도 시 닉네임 UNIQUE 제약 위반 오류 발생 (#42) * fix: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 하던 버그 수정 * refactor: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 수정 사항 리팩토링 * test: 변경사항에 따른 테스트 코드 수정 * hofix: bug fix * Feature/Alert-22-HwuanPage * Create Pdf Parser * Web crawler run perpectly,but pdfparser do not work well * PDF parse to stack DB complete with OPENAI * CallAlert Complete * JellyFish PDF parsing work well * feature/ControllerTest Complete * feature/JellyfishAlert-26-HwuanPage * feat: 즐겨찾기 추가 및 리팩토링 (#49) * feat: 즐겨찾기 추가 및 리팩토링 * refactor: 리팩토링 * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 코드 적용이 필요합니다. * `createMeeting(Long memberId, CreateMeetingRequest request)`: * 목적: 새로운 모임을 생성합니다. 호스트를 참여자로 자동 등록하고 태그 정보를 저장합니다. * `updateMeeting(Long meetingId, Long memberId, UpdateMeetingRequest request)`: * 목적: 기존 모임의 정보를 수정합니다. 호스트만 수정할 수 있도록 검증합니다. * `deleteMeeting(Member member, Long meetingId)`: * 목적: 모임을 삭제합니다. * 개선 예정: 물리적 삭제 대신 논리적 삭제(Soft Delete) 방식 도입을 고려 중입니다. * feat : MeetingValidate.java,MemberValidate.java,ParticipantValidate,SpotValidate,TagValidate.java 검증로직을 추가하였습니다. * feat : MemberError.java , ParticipantRepository 기능을 추가하였습니다. --------- * Feature/integration init (#54) * feature/IntegrationSet(test&Build)-52-HwuanPage * data.sql unique update * image build needs * ignore dev.yml * remove dev.yml tracking and ignore it * prod * proded * Feature/activities 17 audwls239 (#56) * feature: 컨트롤러, 서비스 생성 * feature: 활동별 지수 조회(위치 기반) * feature: DTO 추가 * feature: 활동별 지수 조회(글로벌) 추가, 컨트롤러 수정 * feature: 활동별 지수 상세 조회(미완성) * feature: 해양 정보 조회 * feature: 활동 상세 조회 --------- * feat : ParticipantError 입니다. * hotfix: error fix * fix : Directory 수정사항입니다. (#57) * hotfix: error fix * feat: member delete (#58) * fix: 멤버 삭제 구현 * feat: 멤버 삭제, 위/경도 수정 구현 * test: 테스트 수정 * Delete src/main/java/sevenstar/marineleisure/meeting/repository/MemberRepository.java * Delete src/main/java/sevenstar/marineleisure/meeting/repository/OutdoorSpotSpotRepository.java * Delete src/main/resources/test.http --------- * fix : ParticipantRepository (#59) existsByMeetingIdAndUserId 로 수정하였습니다. * fix : ParticipantRepository (#60) memberId -> userId로 수정하였습니다. * fix: token (#61) * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 # Conflicts: # src/main/java/sevenstar/marineleisure/global/exception/enums/CommonErrorCode.java # src/main/java/sevenstar/marineleisure/global/swagger/SwaggerController.java * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 코드 적용이 필요합니다. * `createMeeting(Long memberId, CreateMeetingRequest request)`: * 목적: 새로운 모임을 생성합니다. 호스트를 참여자로 자동 등록하고 태그 정보를 저장합니다. * `updateMeeting(Long meetingId, Long memberId, UpdateMeetingRequest request)`: * 목적: 기존 모임의 정보를 수정합니다. 호스트만 수정할 수 있도록 검증합니다. * `deleteMeeting(Member member, Long meetingId)`: * 목적: 모임을 삭제합니다. * 개선 예정: 물리적 삭제 대신 논리적 삭제(Soft Delete) 방식 도입을 고려 중입니다. * feat : MeetingValidate.java,MemberValidate.java,ParticipantValidate,SpotValidate,TagValidate.java 검증로직을 추가하였습니다. * feat : MemberError.java , ParticipantRepository 기능을 추가하였습니다. --------- * feat: 테스트용 액세스 토큰 생성 * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * Feature/api scheduler 15 gunwoong (#28) * feat: api * feat: api 스케줄링 * feat: spot service inteface * test: remove legacy test * feat: apply open meteo * test: apply api test * feature/FavoriteCRUD-33-HwuanPage * DELETE COMPLETE * UPDATE COMPLETE * search COMPLETE * Before gunwoong * FavoriteCRUD create * feat/domain test * FavoriteSpotServiceTest * FavoriteSpotServiceTest * feature/FavoriteCURD-33-HwuanPage * add some description on service * Update FavoriteServiceImpl.java * fix: error fix * fix: 소셜 로그인 재시도 시 닉네임 UNIQUE 제약 위반 오류 발생 (#42) * fix: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 하던 버그 수정 * refactor: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 수정 사항 리팩토링 * test: 변경사항에 따른 테스트 코드 수정 * hofix: bug fix * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 # Conflicts: # src/main/java/sevenstar/marineleisure/global/exception/enums/CommonErrorCode.java # src/main/java/sevenstar/marineleisure/global/swagger/SwaggerController.java * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 코드 적용이 필요합니다. * `createMeeting(Long memberId, CreateMeetingRequest request)`: * 목적: 새로운 모임을 생성합니다. 호스트를 참여자로 자동 등록하고 태그 정보를 저장합니다. * `updateMeeting(Long meetingId, Long memberId, UpdateMeetingRequest request)`: * 목적: 기존 모임의 정보를 수정합니다. 호스트만 수정할 수 있도록 검증합니다. * `deleteMeeting(Member member, Long meetingId)`: * 목적: 모임을 삭제합니다. * 개선 예정: 물리적 삭제 대신 논리적 삭제(Soft Delete) 방식 도입을 고려 중입니다. * feat : MeetingValidate.java,MemberValidate.java,ParticipantValidate,SpotValidate,TagValidate.java 검증로직을 추가하였습니다. * feat : MemberError.java , ParticipantRepository 기능을 추가하였습니다. --------- * fix : jellyfish 부분 * fix: activity 부분 * fix: member 부분 * fix: member 부분 * fix: spot 부분 * fix: forecast 부분 * fix: favorite 부분 * fix: alert 부분 * fix: meeting 부분 --------- * hotfix/fix-alert&favorites-62-HwuanPage * fix(hotfix/Meeting) : rebase로 인한 코드 누락 수정 (#65) * hotfix: 코드 누락 해결 (#67) * Fix/fix 70 gunwoong (#71) * hotfix: fix * hotfix: fix * hotfix: fix * fix: application-prod.yml에서 쿠키를 쓸지 말지 결정할 수 있게 수정 (#69) * fix: application-prod.yml에서 쿠키를 쓸지 말지 결정할 수 있게 수정 * test: 테스트 코드 작성 * fix: activities 시큐리티 엔드포인트 허용. redirecturi 수정 * Chore/docker set andvariable-68-hwuanPage * chore/ReadytoDeployv1.0.0-68-HuwanPage * chore/ReadytoDeploymentv1.0.0-68-HuwanPage * remove etc * prod * refactor: blacklist 엔티티의 jti에 인덱스를 건다. (#74) * Feat/meeting test 75 (#77) * feat : Meetingtest 를 위한 Util 파일입니니다. * feat : Meetingtest 를 위한 Util 파일입니니다. * feat : MeetingServiceImplTest 단위테스트입니다. * feat : MeetingControllerTest 통합테스트입니다. * feat : Build Lombok을 테스트를 위한 수정입니다. * feat : Tag 엔티티 Tag List<String> content 를 변환하기 위한 파일입니다. * feat : MeetingServiceImpl * feat : MeetingServiceImpl에서 수정하는 응답을 수정 , 매퍼를 수정하였습니다. * feat : Meeting에서 필요한 url을 열어뒀습니다. * space prob solve * stack-trace-DEBUG * hotfix/data.sql deprecate-HwuanPage (#79) * hotfix/data.sql deprecate-HwuanPage * portnum fix * Xtest * test X * workflow fix * add id * fix docker-compose-image-root * release/v1-marineleisure * fix: blacklist 엔티티의 jti에 인덱스를 건다. (#83) * fix: cors 프론트엔드 배포 도메인 추가 (#84) * fix: blacklist 엔티티의 jti에 인덱스를 건다. * fix: cors 프로트엔드 도메인 추가 * hotfix/method_allowed_patch-HwuanPage (#86) * Refactor/exception hwuan page (#87) * refacotr/favorite-Exception-update * fix kakao_redirect_uri * Feature/map service refactoring 76 gunwoong (#85) * feat: mapServiceRefactoring * refactoring: spot detail refactoring * refactoring: GeoUtils refactoring * test: repository test disable for prod * fix: apply flyway to yml * fix: disable test * refactor: khoa refactoring * fix: bug * fix: sql * fix: yml 환경변수 추가 * fix: detail field name 수정 * feature: 스케줄링 비동기 구현 (#91) * refactor: cacheable (#103) * Fix/meeting urland role (#100) * fix : MeetingServiceImpl getStatusMeetings -> getStatusMeeting_role : Guest 인지 host 인지 판단하는 로직을 추가 * fix : MeetingRepository getStatusMeetings -> getStatusMeeting_role : Guest 인지 host 인지 판단하는 로직을 추가 * fix : MeetingError MEETING_MEMBER_NOT_FOUND 에러를 추가하였습니다. 미팅에서 맴버를 확인할 수 없는 에러입니다. * fix : MeetingController MeetingController 에서 role 을 확인하여 추가 확인할 수 있도록 하였습니다. * fix : MeetingServiceImplTest, MeetingControllerTest.java URL 개선에 의한 새로운 테스트 입니다. * fix : MeetingServiceImplTest, MeetingControllerTest.java @disabled 추가 하였습니다. * feat: 회원 탈퇴 시 카카오 연결 끊기도 수행하게 구현한다. (#98) * feat: member 삭제 시 kakao 연결 끊기 로직도 수행하게 구현 * test: 변경 사항 test * feat : Meeting의 커서방식에서 매핑을 하였습니다. (#94) * feat: 카카오 로그인 과정에서 pkce를 통해 보안 관점에서 개선 (#106) * feat: 보안 인증 과정에서 PKCE 추가하여 구현 * test: 변경 사항 test 추가 * feat: PKCE 기반 보안 기능 코드 구조 변경 * test: PKCE 기반 보안 기능 test * refactor: PKCE 생성을 클라이언트 에게 넘긴다. * test: pkce test 플로우 변경에 따라 변경 * fix: member entity의 nickname 중복을 허용한다 * fix: 테스트를 위해 SchedulerService.java 의 @RequiredArgsConstrucor 지운 부분 복구 * fix: 테스트를 위해 SchedulerService.java 의 @RequiredArgsConstrucor 지운 부분 복구 * refactor: open-meteo 서비스 관련 리팩토링 (#95) * refactor: RichDomain으로 변경 내역입니다. (#105) * Fix: login redirect (#107) * fix: 로그인 요청때의 리다이렉트 uri를 토큰 교환시에도 사용 * test: test * fix: fallback 상황에서 리다이렉트 uri 찾는 로직 추가 * Refactor/meeting rich domain (#110) * refactor: RichDomain으로 변경 내역입니다. * refactor: 누락 프로젝트 파일이 있어 첨부합니다. * build: caffenine 적용 --------- Co-authored-by: HwuanPage <[email protected]> Co-authored-by: JaeoneHeo <[email protected]> Co-authored-by: LEESUNBIN <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: MyungJin <[email protected]> Co-authored-by: iseonbin <[email protected]> * fix: fallback 상황에서 리다이렉트 uri 찾는 로직 추가 (#113) * release (#114) (#115) * git initialize * feature/swagger-03-gunwoong (#5) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feat: swagger 추가 * feat: swagger 추가 * feature/base domain 04 gunwoong (#6) * feat: 공통 도메인 구현 * feat: 메인 어플리케이션에 추가 * feature/OpenAPI Test/02-HwuanPage * feature/OpenAPI Test/02-HwuanPage * Update SurfingForecastApiClient.java * feature/APICallTest-02-HwuanPage * feature/EntityInit-13-HwuanPage * feature/EntityInit-13-HwuanPage * feature/JellyfishEntityInit-13-HwuanPage * Update FishingType.java * feature/EntityInitialize-13-HwuanPage * feat: entity, repositor 구현 * feat: 예상 dto 구현 * chore: 의존성 추가 * feat: 로그인 구현 & 이후 토큰 발급 로직 구현 * fix: AuthCotnroller 수정 * fix: 클라이언트에서 카카오에서 코드를 받아 서버로 post 하게 수정 * feat: 토큰 검증 * feat: refresh token 블랙리스트 처리 로직 구현 * feat: refresh 토큰 블랙리스트 처리 & 재발급 로직 구현 * feat: SecurityFilterChain 엔드 포인트 허용 * feat: refresh 토큰 블랙리스트 검증 로직 구현 * feat: redis에서 refreshToken 블랙리스트 검증 * refactor: controller에 강하게 결합 되어 있던 로직들 분리 * test: member 관련 테스트 * chore: 하드코딩한 중요 값 Intellij IDEA 환경변수로 설정 * refactor: state 관리를 위해 세션 추가 * feat: member 정보 조회하는 서비스 로직 구현 * feat: member 정보 조회하는 서비스 로직 구현 * format: naver formatter로 포매팅 * chore: application-dev * fix: customException 처리 * Feat/meeting interface (#19) * feat : MeetingService 인터페이스 구현 * feat : ParticipantResponse * feat : MeetingListResponse 구현 * feat : MeetingDetailResponse구현 * feat : MeetingDetailAndMemberResponse 구현 * feat : ListSpot 구현 * feat : DetailSpot 구현 * feat : CreateMeetingRequest 구현 * feat : Tag 구현 * feat : Long -> long 변경 서비스와 Entity내에서 null값이 절대 나오지 않는다고 판단하는 값을 long으로 변경하였습니다. * feat : MeetingService.java -> 무한페이지로딩형식으로 바꾸었습니다. * Update src/main/java/sevenstar/marineleisure/meeting/Dto/Response/MeetingDetailResponse.java --------- * Feature/FavoritesAndAlertInterface-16-HwuanPage * feature/FavoritesAndAlertInterface-16-HwuanPage * Update AlertMapper.java * Update JellyfishRegionDensityRepository.java * Update AlertController.java * Update FavoriteController.java * Update FavoriteRepository.java * Update AlertController.java * Update JellyfishSpieces.java * Update JellyfishRegion.java * Update JellyfishRegion.java * feature/CustomExceptionInit-22-HwuanPage * feature/CustomExceptionInit-22-HwuanPage * Errorcode interface Change * Refactor application.yml 환경변수 설정 (#25) * refactor: application.yml 환경변수 설정 * Rename: 오타 수정 * Feature/spot service interface 29 gunwoong (#30) * feat: api * feat: api 스케줄링 * feat: spot service inteface * Feature/api scheduler 15 gunwoong (#28) * feat: api * feat: api 스케줄링 * feat: spot service inteface * test: remove legacy test * feat: apply open meteo * test: apply api test * feat: spot service (#34) * feat: spot service * feat: spot service 고도화 및 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * feat: 조회도 관련 서비스 추가 * hotfix: duplicated controller method * feature/FavoriteCRUD-33-HwuanPage * DELETE COMPLETE * UPDATE COMPLETE * search COMPLETE * Before gunwoong * FavoriteCRUD create * feat/domain test * FavoriteSpotServiceTest * FavoriteSpotServiceTest * feature/FavoriteCURD-33-HwuanPage * add some description on service * Update FavoriteServiceImpl.java * Feature/spot preview 40 gunwoong (#41) * feat: spot preview & 리팩토링 * feat: spot preview & 리팩토링 * hotfix: jpa metamodel fix * fix: error fix * fix: 소셜 로그인 재시도 시 닉네임 UNIQUE 제약 위반 오류 발생 (#42) * fix: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 하던 버그 수정 * refactor: 로그아웃 후 재로그인 시 동일 정보로 db에 insert 수정 사항 리팩토링 * test: 변경사항에 따른 테스트 코드 수정 * hofix: bug fix * Feature/Alert-22-HwuanPage * Create Pdf Parser * Web crawler run perpectly,but pdfparser do not work well * PDF parse to stack DB complete with OPENAI * CallAlert Complete * JellyFish PDF parsing work well * feature/ControllerTest Complete * feature/JellyfishAlert-26-HwuanPage * feat: 즐겨찾기 추가 및 리팩토링 (#49) * feat: 즐겨찾기 추가 및 리팩토링 * refactor: 리팩토링 * feat: 카카오 로그인을 stateless 하게 변경한다 (#51) * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경 * refactor: 기존 state 사용 방식 -> stateless 방식으로 변경으로 인해 필요 없는 엔드 포인트 삭제 * test: 변경사항 test 수정 * feat: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 코드 구현 * test: 카카오 측에서 인증 실패시에 반환 하는 에러 처리하는 테스트 추가 * fix: 주석 제거 * fix: exception 변경 * Feat/meeting service (#46) * WIP: Rebase를 위한 임시 저장 * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * feat : Meeting.java -> Meeting 엔터티 @builder 를 상위 어노테이션에 일단 추가시켰습니다. * Delete MeetingServiceImplReview.md * Delete MeetingServiceUserFlow.md * feat : 패키지명 변경 이슈 -> 패키지 명을 컨벤션에 따른 이름으로 변경했습니다. * feat : MeetingController.java long participantCount = participantRepository.countMeetingIdMember -> long participantCount = participantRepository.countMeetingId로 수정하였습니다. * feat : MeetingError.java MeetingError.java 를 추가하였습니다. * feat : MeetingMapper MeetingServiceImpl에서 사용중이었던 Mapper를 분리하였습니다. * feat : MeetingService.java 패키지 명 수정으로 인해서 수정사항이 있었습니다. * feat : MeetingServiceImpl.java 트랜잭션 관리 명확화 하였습니다. validate 패키지를 개선하였습니다. joinMeeting 중복 참여 제한 로직을 강화하였습니다. * `getAllMeetings(Long cursorId, int size)`: * 목적: 모든 모임 목록을 페이징 처리하여 조회합니다. cursorId를 사용하여 무한 스크롤과 같은 커서 기반 페이징을 지원합니다. * 특징: @transactional(readOnly = true)를 통해 읽기 전용 트랜잭션으로 최적화되었습니다. * `getMeetingDetails(Long meetingId)`: * 목적: 특정 모임의 상세 정보를 조회합니다. 호스트, 장소, 태그 등 연관된 정보를 함께 가져옵니다. * 개선 예정: 현재 N+1 문제가 발생할 수 있어, 향후 Fetch Join을 통한 성능 최적화가 필요합니다. * `getStatusMyMeetings(Long memberId, Long cursorId, int size, MeetingStatus meetingStatus)`: * 목적: 특정 회원의 상태별(예: 모집 중, 완료) 모임 목록을 페이징 처리하여 조회합니다. * `getMeetingDetailAndMember(Long memberId, Long meetingId)`: * 목적: 호스트가 자신의 모임 상세 정보와 참여자 목록을 조회합니다. 참여자들의 닉네임을 함께 제공합니다. * `countMeetings(Long memberId)`: * 목적: 특정 회원이 참여한 모임의 총 개수를 반환합니다. * `joinMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 특정 모임에 참여합니다. * 주요 개선: 모임 상태 검증(verifyRecruiting), 중복 참여 검증(`verifyNotAlreadyParticipant`), 모임 정원 초과 검증(verifyMeetingCount) 로직이 강화되었습니다. * 개선 예정: 동시성 문제(Race Condition) 해결을 위한 비관적 락(Pessimistic Lock) 적용이 필요합니다. * `leaveMeeting(Long meetingId, Long memberId)`: * 목적: 회원이 모임에서 탈퇴합니다. * 주요 개선: 호스트 탈퇴 방지(verifyNotHost), 모임 상태에 따른 탈퇴 가능 여부 검증(verifyLeave) 로직이 추가되었습니다. * 개선 예정: MEETING_NOT_FOUND 대신 CANNOT_LEAVE_COMPLETED_MEETING과 같은 더 구체적인 에러 …
1 parent 85b7e06 commit 2a390ff

File tree

11 files changed

+136
-49
lines changed

11 files changed

+136
-49
lines changed

src/main/java/sevenstar/marineleisure/global/api/kakao/service/PresetSchedulerService.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class PresetSchedulerService {
2323
@Transactional
2424
public void updateRegionApi() {
2525
LocalDate now = LocalDate.now();
26-
BestSpot emptySpot = new BestSpot(-1L, "없는 지역입니다", TotalIndex.NONE);
26+
BestSpot emptySpot = new BestSpot(-1L, "없는 지역입니다", TotalIndex.NONE, 0, 0);
2727
for (Region region : Region.getAllKoreaRegion()) {
2828
evictRegionCache(region);
2929
BestSpot bestSpotInFishing = outdoorSpotRepository.findBestSpotInFishing(region.getLatitude(),
@@ -36,10 +36,14 @@ public void updateRegionApi() {
3636
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
3737

3838
spotPresetRepository.upsert(region.name(), bestSpotInFishing.getSpotId(), bestSpotInFishing.getName(),
39-
bestSpotInFishing.getTotalIndex().name(), bestSpotInMudflat.getSpotId(), bestSpotInMudflat.getName(),
40-
bestSpotInMudflat.getTotalIndex().name(), bestSpotInScuba.getSpotId(), bestSpotInScuba.getName(),
41-
bestSpotInScuba.getTotalIndex().name(), bestSpotInSurfing.getSpotId(), bestSpotInSurfing.getName(),
42-
bestSpotInSurfing.getTotalIndex().name());
39+
bestSpotInFishing.getTotalIndex().name(), bestSpotInFishing.getMonthView(),
40+
bestSpotInFishing.getWeekView(), bestSpotInMudflat.getSpotId(), bestSpotInMudflat.getName(),
41+
bestSpotInMudflat.getTotalIndex().name(), bestSpotInMudflat.getMonthView(),
42+
bestSpotInMudflat.getWeekView(), bestSpotInScuba.getSpotId(), bestSpotInScuba.getName(),
43+
bestSpotInScuba.getTotalIndex().name(), bestSpotInScuba.getMonthView(), bestSpotInScuba.getWeekView(),
44+
bestSpotInSurfing.getSpotId(), bestSpotInSurfing.getName(),
45+
bestSpotInSurfing.getTotalIndex().name(), bestSpotInSurfing.getMonthView(),
46+
bestSpotInSurfing.getWeekView());
4347
}
4448
}
4549

src/main/java/sevenstar/marineleisure/member/service/OauthService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import jakarta.transaction.Transactional;
2323
import lombok.RequiredArgsConstructor;
2424
import lombok.extern.slf4j.Slf4j;
25-
import sevenstar.marineleisure.global.util.PkceUtil;
25+
import sevenstar.marineleisure.global.enums.MemberStatus;
2626
import sevenstar.marineleisure.global.util.StateEncryptionUtil;
2727
import sevenstar.marineleisure.member.domain.Member;
2828
import sevenstar.marineleisure.member.dto.KakaoTokenResponse;
@@ -36,7 +36,6 @@ public class OauthService {
3636
private final MemberRepository memberRepository;
3737
private final WebClient webClient;
3838
private final StateEncryptionUtil stateEncryptionUtil;
39-
private final PkceUtil pkceUtil;
4039

4140
@Value("${kakao.login.api_key}")
4241
private String apiKey;
@@ -208,6 +207,7 @@ private Member saveOrUpdateKakaoUser(Map<String, Object> memberAttributes) {
208207
.longitude(BigDecimal.ZERO)
209208
.build());
210209
member.updateNickname(nickname);
210+
member.updateStatus(MemberStatus.ACTIVE); // 재가입 시 상태를 ACTIVE로 변경
211211

212212
return memberRepository.save(member);
213213
}

src/main/java/sevenstar/marineleisure/spot/domain/BestSpot.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,22 @@ public class BestSpot {
1717
private String name;
1818
@Enumerated(EnumType.STRING)
1919
private TotalIndex totalIndex;
20+
private Integer monthView;
21+
private Integer weekView;
2022

21-
public BestSpot(Long spotId, String name, TotalIndex totalIndex) {
23+
public BestSpot(Long spotId, String name, TotalIndex totalIndex, Integer monthView, Integer weekView) {
2224
this.spotId = spotId;
2325
this.name = name;
2426
this.totalIndex = totalIndex;
27+
this.monthView = monthView;
28+
this.weekView = weekView;
2529
}
2630

2731
public BestSpot(BestSpotProjection bestSpotProjection) {
2832
this.spotId = bestSpotProjection.getId();
2933
this.name = bestSpotProjection.getName();
3034
this.totalIndex = bestSpotProjection.getTotalIndex();
35+
this.monthView = bestSpotProjection.getMonthView();
36+
this.weekView = bestSpotProjection.getWeekView();
3137
}
3238
}

src/main/java/sevenstar/marineleisure/spot/domain/SpotPreset.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,39 @@ public class SpotPreset {
2727
@AttributeOverrides({
2828
@AttributeOverride(name = "spotId",column = @Column(name = "fishing_spot_id")),
2929
@AttributeOverride(name = "name",column = @Column(name = "fishing_name")),
30-
@AttributeOverride(name = "totalIndex",column = @Column(name = "fishing_total_index"))
30+
@AttributeOverride(name = "totalIndex",column = @Column(name = "fishing_total_index")),
31+
@AttributeOverride(name = "monthView",column = @Column(name = "fishing_monthView")),
32+
@AttributeOverride(name = "weekView",column = @Column(name = "fishing_weekView"))
3133
})
3234
private BestSpot fishing;
3335

3436
@Embedded
3537
@AttributeOverrides({
3638
@AttributeOverride(name = "spotId",column = @Column(name = "mudflat_spot_id")),
3739
@AttributeOverride(name = "name",column = @Column(name = "mudflat_name")),
38-
@AttributeOverride(name = "totalIndex",column = @Column(name = "mudflat_total_index"))
40+
@AttributeOverride(name = "totalIndex",column = @Column(name = "mudflat_total_index")),
41+
@AttributeOverride(name = "monthView",column = @Column(name = "mudflat_monthView")),
42+
@AttributeOverride(name = "weekView",column = @Column(name = "mudflat_weekView"))
3943
})
4044
private BestSpot mudflat;
4145

4246
@Embedded
4347
@AttributeOverrides({
4448
@AttributeOverride(name = "spotId",column = @Column(name = "scuba_spot_id")),
4549
@AttributeOverride(name = "name",column = @Column(name = "scuba_name")),
46-
@AttributeOverride(name = "totalIndex",column = @Column(name = "scuba_total_index"))
50+
@AttributeOverride(name = "totalIndex",column = @Column(name = "scuba_total_index")),
51+
@AttributeOverride(name = "monthView",column = @Column(name = "scuba_monthView")),
52+
@AttributeOverride(name = "weekView",column = @Column(name = "scuba_weekView"))
4753
})
4854
private BestSpot scuba;
4955

5056
@Embedded
5157
@AttributeOverrides({
5258
@AttributeOverride(name = "spotId",column = @Column(name = "surfing_spot_id")),
5359
@AttributeOverride(name = "name",column = @Column(name = "surfing_name")),
54-
@AttributeOverride(name = "totalIndex",column = @Column(name = "surfing_total_index"))
60+
@AttributeOverride(name = "totalIndex",column = @Column(name = "surfing_total_index")),
61+
@AttributeOverride(name = "monthView",column = @Column(name = "surfing_monthView")),
62+
@AttributeOverride(name = "weekView",column = @Column(name = "surfing_weekView"))
5563
})
5664
private BestSpot surfing;
5765

src/main/java/sevenstar/marineleisure/spot/dto/projection/BestSpotProjection.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ public interface BestSpotProjection {
66
Long getId();
77
String getName();
88
TotalIndex getTotalIndex();
9+
Integer getMonthView();
10+
Integer getWeekView();
911
}

src/main/java/sevenstar/marineleisure/spot/mapper/SpotMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static SpotReadResponse.SpotInfo toDto(SpotDistanceProjection spotDistanc
2020
return new SpotReadResponse.SpotInfo(spotDistanceProjection.getId(), spotDistanceProjection.getName(),
2121
ActivityCategory.parse(spotDistanceProjection.getCategory()),
2222
spotDistanceProjection.getLatitude().floatValue(), spotDistanceProjection.getLongitude().floatValue(),
23-
spotDistanceProjection.getDistance().floatValue(), totalIndex, spotViewQuartile.getMonthQuartile(),
23+
spotDistanceProjection.getDistance().floatValue() / 1000f, totalIndex, spotViewQuartile.getMonthQuartile(),
2424
spotViewQuartile.getWeekQuartile(), isFavorite);
2525
}
2626

src/main/java/sevenstar/marineleisure/spot/repository/OutdoorSpotRepository.java

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,20 @@ List<SpotDistanceProjection> findSpots(@Param("latitude") Float latitude, @Param
3131

3232
// Fishing Forecast
3333
@Query(value = """
34-
SELECT os.id AS id, os.name AS name, f.total_index AS totalIndex
34+
SELECT os.id AS id, os.name AS name, f.total_index AS totalIndex,
35+
COALESCE((
36+
SELECT SUM(svs.view_count)
37+
FROM spot_view_stats svs
38+
WHERE svs.spot_id = os.id
39+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 6 DAY AND :forecastDate
40+
), 0) AS weekView,
41+
42+
COALESCE((
43+
SELECT SUM(svs.view_count)
44+
FROM spot_view_stats svs
45+
WHERE svs.spot_id = os.id
46+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 29 DAY AND :forecastDate
47+
), 0) AS monthView
3548
FROM outdoor_spots os
3649
JOIN fishing_forecast f ON os.id = f.spot_id
3750
WHERE f.forecast_date = :forecastDate
@@ -53,7 +66,20 @@ Optional<BestSpotProjection> findBestSpotInFishing(@Param("latitude") double lat
5366

5467
// Mudflat Forecast
5568
@Query(value = """
56-
SELECT os.id AS id, os.name AS name, m.total_index AS totalIndex
69+
SELECT os.id AS id, os.name AS name, m.total_index AS totalIndex,
70+
COALESCE((
71+
SELECT SUM(svs.view_count)
72+
FROM spot_view_stats svs
73+
WHERE svs.spot_id = os.id
74+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 6 DAY AND :forecastDate
75+
), 0) AS weekView,
76+
77+
COALESCE((
78+
SELECT SUM(svs.view_count)
79+
FROM spot_view_stats svs
80+
WHERE svs.spot_id = os.id
81+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 29 DAY AND :forecastDate
82+
), 0) AS monthView
5783
FROM outdoor_spots os
5884
JOIN mudflat_forecast m ON os.id = m.spot_id
5985
WHERE m.forecast_date = :forecastDate
@@ -75,7 +101,20 @@ Optional<BestSpotProjection> findBestSpotInMudflat(@Param("latitude") double lat
75101

76102
// Surfing Forecast
77103
@Query(value = """
78-
SELECT os.id AS id, os.name AS name, s.total_index AS totalIndex
104+
SELECT os.id AS id, os.name AS name, s.total_index AS totalIndex,
105+
COALESCE((
106+
SELECT SUM(svs.view_count)
107+
FROM spot_view_stats svs
108+
WHERE svs.spot_id = os.id
109+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 6 DAY AND :forecastDate
110+
), 0) AS weekView,
111+
112+
COALESCE((
113+
SELECT SUM(svs.view_count)
114+
FROM spot_view_stats svs
115+
WHERE svs.spot_id = os.id
116+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 29 DAY AND :forecastDate
117+
), 0) AS monthView
79118
FROM outdoor_spots os
80119
JOIN surfing_forecast s ON os.id = s.spot_id
81120
WHERE s.forecast_date = :forecastDate
@@ -97,7 +136,20 @@ Optional<BestSpotProjection> findBestSpotInSurfing(@Param("latitude") double lat
97136

98137
// Scuba Forecast
99138
@Query(value = """
100-
SELECT os.id AS id, os.name AS name, s.total_index AS totalIndex
139+
SELECT os.id AS id, os.name AS name, s.total_index AS totalIndex,
140+
COALESCE((
141+
SELECT SUM(svs.view_count)
142+
FROM spot_view_stats svs
143+
WHERE svs.spot_id = os.id
144+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 6 DAY AND :forecastDate
145+
), 0) AS weekView,
146+
147+
COALESCE((
148+
SELECT SUM(svs.view_count)
149+
FROM spot_view_stats svs
150+
WHERE svs.spot_id = os.id
151+
AND svs.view_date BETWEEN :forecastDate - INTERVAL 29 DAY AND :forecastDate
152+
), 0) AS monthView
101153
FROM outdoor_spots os
102154
JOIN scuba_forecast s ON os.id = s.spot_id
103155
WHERE s.forecast_date = :forecastDate

src/main/java/sevenstar/marineleisure/spot/repository/SpotPresetRepository.java

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,52 +12,68 @@
1212
public interface SpotPresetRepository extends JpaRepository<SpotPreset, Region> {
1313
@Modifying
1414
@Query(value = """
15-
INSERT INTO spot_preset (
16-
region,
17-
fishing_spot_id, fishing_name, fishing_total_index,
18-
mudflat_spot_id, mudflat_name, mudflat_total_index,
19-
scuba_spot_id, scuba_name, scuba_total_index,
20-
surfing_spot_id, surfing_name, surfing_total_index
21-
)
22-
VALUES (
23-
:region,
24-
:fishingId, :fishingName, :fishingTotalIndex,
25-
:mudflatId, :mudflatName, :mudflatTotalIndex,
26-
:scubaId, :scubaName, :scubaTotalIndex,
27-
:surfingId, :surfingName, :surfingTotalIndex
28-
)
29-
ON DUPLICATE KEY UPDATE
30-
fishing_spot_id = VALUES(fishing_spot_id),
31-
fishing_name = VALUES(fishing_name),
32-
fishing_total_index = VALUES(fishing_total_index),
33-
mudflat_spot_id = VALUES(mudflat_spot_id),
34-
mudflat_name = VALUES(mudflat_name),
35-
mudflat_total_index = VALUES(mudflat_total_index),
36-
scuba_spot_id = VALUES(scuba_spot_id),
37-
scuba_name = VALUES(scuba_name),
38-
scuba_total_index = VALUES(scuba_total_index),
39-
surfing_spot_id = VALUES(surfing_spot_id),
40-
surfing_name = VALUES(surfing_name),
41-
surfing_total_index = VALUES(surfing_total_index)
42-
""", nativeQuery = true)
15+
INSERT INTO spot_preset (
16+
region,
17+
fishing_spot_id, fishing_name, fishing_total_index, fishing_month_view, fishing_week_view,
18+
mudflat_spot_id, mudflat_name, mudflat_total_index, mudflat_month_view, mudflat_week_view,
19+
scuba_spot_id, scuba_name, scuba_total_index, scuba_month_view, scuba_week_view,
20+
surfing_spot_id, surfing_name, surfing_total_index, surfing_month_view, surfing_week_view
21+
)
22+
VALUES (
23+
:region,
24+
:fishingId, :fishingName, :fishingTotalIndex,:fishingMonthView, :fishingWeekView,
25+
:mudflatId, :mudflatName, :mudflatTotalIndex,:mudflatMonthView, :mudflatWeekView,
26+
:scubaId, :scubaName, :scubaTotalIndex,:scubaMonthView, :scubaWeekView,
27+
:surfingId, :surfingName, :surfingTotalIndex,:surfingMonthView, :surfingWeekView
28+
)
29+
ON DUPLICATE KEY UPDATE
30+
fishing_spot_id = VALUES(fishing_spot_id),
31+
fishing_name = VALUES(fishing_name),
32+
fishing_total_index = VALUES(fishing_total_index),
33+
fishing_month_view= VALUES(fishing_month_view),
34+
fishing_week_view=VALUES(fishing_week_view),
35+
mudflat_spot_id = VALUES(mudflat_spot_id),
36+
mudflat_name = VALUES(mudflat_name),
37+
mudflat_total_index = VALUES(mudflat_total_index),
38+
mudflat_month_view = VALUES(mudflat_month_view),
39+
mudflat_week_view = VALUES(mudflat_week_view),
40+
scuba_spot_id = VALUES(scuba_spot_id),
41+
scuba_name = VALUES(scuba_name),
42+
scuba_total_index = VALUES(scuba_total_index),
43+
scuba_month_view = VALUES(scuba_month_view),
44+
scuba_week_view = VALUES(scuba_week_view),
45+
surfing_spot_id = VALUES(surfing_spot_id),
46+
surfing_name = VALUES(surfing_name),
47+
surfing_total_index = VALUES(surfing_total_index),
48+
surfing_month_view = VALUES(surfing_month_view),
49+
surfing_week_view = VALUES(surfing_week_view)
50+
""", nativeQuery = true)
4351
void upsert(
4452
@Param("region") String region,
4553

4654
@Param("fishingId") Long fishingId,
4755
@Param("fishingName") String fishingName,
4856
@Param("fishingTotalIndex") String fishingTotalIndex,
57+
@Param("fishingMonthView") Integer fishingMonthView,
58+
@Param("fishingWeekView") Integer fishingWeekView,
4959

5060
@Param("mudflatId") Long mudflatId,
5161
@Param("mudflatName") String mudflatName,
5262
@Param("mudflatTotalIndex") String mudflatTotalIndex,
63+
@Param("mudflatMonthView") Integer mudflatMonthView,
64+
@Param("mudflatWeekView") Integer mudflatWeekView,
5365

5466
@Param("scubaId") Long scubaId,
5567
@Param("scubaName") String scubaName,
5668
@Param("scubaTotalIndex") String scubaTotalIndex,
69+
@Param("scubaMonthView") Integer scubaMonthView,
70+
@Param("scubaWeekView") Integer scubaWeekView,
5771

5872
@Param("surfingId") Long surfingId,
5973
@Param("surfingName") String surfingName,
60-
@Param("surfingTotalIndex") String surfingTotalIndex
74+
@Param("surfingTotalIndex") String surfingTotalIndex,
75+
@Param("surfingMonthView") Integer surfingMonthView,
76+
@Param("surfingWeekView") Integer surfingWeekView
6177
);
6278

6379
}

src/main/java/sevenstar/marineleisure/spot/repository/SpotViewStatsRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,4 @@ INSERT INTO spot_view_stats (spot_id, view_date, view_count)
1818
VALUES (:spotId,:viewDate,1) ON DUPLICATE KEY UPDATE view_count = view_count + 1
1919
""", nativeQuery = true)
2020
void upsertViewStats(@Param("spotId") Long spotId, @Param("viewDate") LocalDate viewDate);
21-
2221
}

src/main/java/sevenstar/marineleisure/spot/service/SpotServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public SpotPreviewReadResponse preview(float latitude, float longitude) {
114114
Region region = geoUtils.searchRegion(latitude, longitude);
115115
if (region == Region.OCEAN) {
116116
LocalDate now = LocalDate.now();
117-
BestSpot emptySpot = new BestSpot(-1L, "없는 지역입니다", null);
117+
BestSpot emptySpot = new BestSpot(-1L, "없는 지역입니다", null,0,0);
118118
double radius = 500_000;
119119
BestSpot bestSpotInFishing = outdoorSpotRepository.findBestSpotInFishing(region.getLatitude(),
120120
region.getLongitude(), now, radius).map(BestSpot::new).orElse(emptySpot);

0 commit comments

Comments
 (0)