Skip to content

Commit 9a3563f

Browse files
HwuanPagegunwoong1630johnhuh619garusitellCopilot
authored
V1.0.16
* 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 <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * 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 <gigolopage@gmail.com> * 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 <80460636+gunwoong1630@users.noreply.github.com> * 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 <45359953+garusitell@users.noreply.github.com> Co-authored-by: Gunwoong cho <80460636+gunwoong1630@users.noreply.github.com> * 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 <gigolopage@gmail.com> * 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 <gigolopage@gmail.com> * fix : jellyfish 부분 * fix: activity 부분 * fix: member 부분 * fix: member 부분 * fix: spot 부분 * fix: forecast 부분 * fix: favorite 부분 * fix: alert 부분 * fix: meeting 부분 --------- Co-authored-by: Gunwoong cho <80460636+gunwoong1630@users.noreply.github.com> Co-authored-by: Hwang Seong Cheol a.k.a Hwuan Page <gigolopage@gmail.com> Co-authored-by: MyungJin <77625332+audwls239@users.noreply.github.com> Co-authored-by: LEESUNBIN <45359953+garusitell@users.noreply.github.com> Co-authored-by: gunwoong <gunwoong1630@gmail.com> * 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 환경변수 추가 --------- Co-authored-by: Gunwoong cho <80460636+gunwoong1630@users.noreply.github.com> Co-authored-by: JaeoneHeo <jaewonheo666@gmail.com> Co-authored-by: LEESUNBIN <45359953+garusitell@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: MyungJin <77625332+audwls239@users.noreply.github.com> Co-authored-by: gunwoong <gunwoong1630@gmail.com> Co-authored-by: iseonbin <twinkey0201@gmail.com>
1 parent 74386de commit 9a3563f

52 files changed

Lines changed: 1385 additions & 591 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ dependencies {
7474

7575
// pdf parsing
7676
implementation 'org.apache.pdfbox:pdfbox:3.0.5'
77+
78+
// db migration
79+
implementation 'org.flywaydb:flyway-core'
80+
implementation 'org.flywaydb:flyway-mysql'
81+
7782
}
7883

7984
dependencyManagement {

src/main/java/sevenstar/marineleisure/favorite/service/FavoriteServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import sevenstar.marineleisure.favorite.repository.FavoriteRepository;
1717
import sevenstar.marineleisure.global.exception.CustomException;
1818
import sevenstar.marineleisure.global.exception.enums.FavoriteErrorCode;
19+
import sevenstar.marineleisure.global.exception.enums.SpotErrorCode;
1920
import sevenstar.marineleisure.spot.domain.OutdoorSpot;
2021
import sevenstar.marineleisure.spot.repository.OutdoorSpotRepository;
2122

@@ -45,9 +46,8 @@ public FavoriteSpot searchFavoriteById(Long id) {
4546
@Transactional
4647
public Long createFavorite(Long id) {
4748
Long currentMemberId = getCurrentUserId();
48-
// 우선 즐겨찾기를 못찾았다고 넣었지만, 나중에 Spot에러코드 추가되면 그걸로 교체 예정입니다.
4949
OutdoorSpot outdoorSpot = spotRepository.findById(id)
50-
.orElseThrow(() -> new CustomException(FavoriteErrorCode.FAVORITE_NOT_FOUND));
50+
.orElseThrow(() -> new CustomException(SpotErrorCode.SPOT_NOT_FOUND));
5151

5252
FavoriteSpot createdFavoriteSpot = FavoriteSpot.builder()
5353
.memberId(currentMemberId)
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
11
package sevenstar.marineleisure.global.api.config;
22

3+
import org.springframework.beans.factory.annotation.Qualifier;
4+
import org.springframework.beans.factory.annotation.Value;
35
import org.springframework.context.annotation.Bean;
46
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.http.client.ClientHttpRequestInterceptor;
58
import org.springframework.web.client.RestTemplate;
69

710
@Configuration
811
public class RestTemplateConfig {
12+
@Value("${kakao.login.api_key}")
13+
private String kakaoRestApiKey;
914

1015
@Bean
11-
public RestTemplate restTemplate() {
16+
public RestTemplate apiRestTemplate() {
1217
return new RestTemplate();
1318
}
19+
20+
@Bean
21+
public RestTemplate kakaoRestTemplate() {
22+
RestTemplate restTemplate = new RestTemplate();
23+
24+
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
25+
request.getHeaders().add("Authorization", String.format("KakaoAK %s", kakaoRestApiKey));
26+
return execution.execute(request, body);
27+
};
28+
29+
restTemplate.getInterceptors().add(interceptor);
30+
return restTemplate;
31+
}
1432
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package sevenstar.marineleisure.global.api.kakao;
2+
3+
import java.net.URI;
4+
5+
import org.springframework.beans.factory.annotation.Qualifier;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.http.HttpMethod;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.util.LinkedMultiValueMap;
11+
import org.springframework.util.MultiValueMap;
12+
import org.springframework.web.client.RestTemplate;
13+
14+
import lombok.RequiredArgsConstructor;
15+
import sevenstar.marineleisure.global.api.kakao.dto.RegionResponse;
16+
import sevenstar.marineleisure.global.utils.UriBuilder;
17+
18+
@Component
19+
@RequiredArgsConstructor
20+
public class KakaoApiClient {
21+
@Value("${kakao.map.uri}")
22+
private String kakaoMapUri;
23+
24+
private final RestTemplate kakaoRestTemplate;
25+
26+
public ResponseEntity<RegionResponse> get(float latitude, float longitude) {
27+
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
28+
params.add("y", String.valueOf(latitude));
29+
params.add("x", String.valueOf(longitude));
30+
31+
URI uri = UriBuilder.buildQueryParameter(kakaoMapUri, params);
32+
33+
return kakaoRestTemplate.exchange(uri, HttpMethod.GET, null, RegionResponse.class);
34+
}
35+
36+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package sevenstar.marineleisure.global.api.kakao.dto;
2+
3+
import java.util.List;
4+
5+
import lombok.Data;
6+
7+
@Data
8+
public class RegionResponse {
9+
private Meta meta;
10+
private List<Document> documents;
11+
12+
@Data
13+
public static class Meta {
14+
private int total_count;
15+
}
16+
17+
@Data
18+
public static class Document {
19+
private String region_type;
20+
private String code;
21+
private String address_name;
22+
private String region_1depth_name;
23+
private String region_2depth_name;
24+
private String region_3depth_name;
25+
private String region_4depth_name;
26+
private double x;
27+
private double y;
28+
}
29+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package sevenstar.marineleisure.global.api.kakao.service;
2+
3+
import java.time.LocalDate;
4+
5+
import org.springframework.stereotype.Service;
6+
7+
import lombok.RequiredArgsConstructor;
8+
import sevenstar.marineleisure.global.enums.Region;
9+
import sevenstar.marineleisure.global.enums.TotalIndex;
10+
import sevenstar.marineleisure.spot.domain.BestSpot;
11+
import sevenstar.marineleisure.spot.repository.OutdoorSpotRepository;
12+
import sevenstar.marineleisure.spot.repository.SpotPresetRepository;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class PresetSchedulerService {
17+
private static final double PRESET_RADIUS = 200_000;
18+
private final OutdoorSpotRepository outdoorSpotRepository;
19+
private final SpotPresetRepository spotPresetRepository;
20+
21+
public void updateRegionApi() {
22+
LocalDate now = LocalDate.now();
23+
BestSpot emptySpot = new BestSpot(-1L, "없는 지역입니다", TotalIndex.NONE);
24+
for (Region region : Region.getAllKoreaRegion()) {
25+
BestSpot bestSpotInFishing = outdoorSpotRepository.findBestSpotInFishing(region.getLatitude(),
26+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
27+
BestSpot bestSpotInMudflat = outdoorSpotRepository.findBestSpotInMudflat(region.getLatitude(),
28+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
29+
BestSpot bestSpotInScuba = outdoorSpotRepository.findBestSpotInScuba(region.getLatitude(),
30+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
31+
BestSpot bestSpotInSurfing = outdoorSpotRepository.findBestSpotInSurfing(region.getLatitude(),
32+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
33+
34+
spotPresetRepository.upsert(region.name(), bestSpotInFishing.getSpotId(), bestSpotInFishing.getName(),
35+
bestSpotInFishing.getTotalIndex().name(), bestSpotInMudflat.getSpotId(), bestSpotInMudflat.getName(),
36+
bestSpotInMudflat.getTotalIndex().name(), bestSpotInScuba.getSpotId(), bestSpotInScuba.getName(),
37+
bestSpotInScuba.getTotalIndex().name(), bestSpotInSurfing.getSpotId(), bestSpotInSurfing.getName(),
38+
bestSpotInSurfing.getTotalIndex().name());
39+
}
40+
}
41+
}

src/main/java/sevenstar/marineleisure/global/api/khoa/KhoaApiClient.java

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
import lombok.RequiredArgsConstructor;
1313
import sevenstar.marineleisure.global.api.config.properties.KhoaProperties;
14-
import sevenstar.marineleisure.global.api.khoa.dto.common.ApiResponse;
15-
import sevenstar.marineleisure.global.api.khoa.dto.item.FishingItem;
1614
import sevenstar.marineleisure.global.enums.ActivityCategory;
1715
import sevenstar.marineleisure.global.enums.FishingType;
1816
import sevenstar.marineleisure.global.utils.DateUtils;
@@ -21,11 +19,11 @@
2119
@Component
2220
@RequiredArgsConstructor
2321
public class KhoaApiClient {
24-
private final RestTemplate restTemplate;
22+
private final RestTemplate apiRestTemplate;
2523
private final KhoaProperties khoaProperties;
2624

2725
/**
28-
* khoa api get 요청(갯벌체험, 서핑, 스쿠버다이빙)
26+
* khoa api get 요청(낚시, 갯벌체험, 서핑, 스쿠버다이빙)
2927
* @param responseType response 타입
3028
* @param reqDate 요청 일자
3129
* @param page
@@ -35,31 +33,16 @@ public class KhoaApiClient {
3533
* @param <T>
3634
*/
3735
public <T> ResponseEntity<T> get(ParameterizedTypeReference<T> responseType, LocalDate reqDate, int page, int size,
38-
ActivityCategory category) {
36+
ActivityCategory category, FishingType gubun) {
37+
URI uri;
3938
if (category == ActivityCategory.FISHING) {
40-
// TODO : handling exception
41-
// throw new IllegalAccessException();
39+
uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(),
40+
khoaProperties.getPath(ActivityCategory.FISHING),
41+
khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size, gubun.getDescription()));
42+
} else {
43+
uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(), khoaProperties.getPath(category),
44+
khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size));
4245
}
43-
URI uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(), khoaProperties.getPath(category),
44-
khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size));
45-
return restTemplate.exchange(uri, HttpMethod.GET, null, responseType);
46+
return apiRestTemplate.exchange(uri, HttpMethod.GET, null, responseType);
4647
}
47-
48-
/**
49-
* khoa api get 요청(낚시)
50-
* @param responseType response 타입
51-
* @param reqDate 요청 일자
52-
* @param page
53-
* @param size
54-
* @param gubun 선상 / 갯바위 중 하나
55-
* @return response
56-
*/
57-
public ResponseEntity<ApiResponse<FishingItem>> get(
58-
ParameterizedTypeReference<ApiResponse<FishingItem>> responseType, LocalDate reqDate, int page, int size,
59-
FishingType gubun) {
60-
URI uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(),
61-
khoaProperties.getPath(ActivityCategory.FISHING), khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size, gubun.getDescription()));
62-
return restTemplate.exchange(uri, HttpMethod.GET, null, responseType);
63-
}
64-
6548
}

src/main/java/sevenstar/marineleisure/global/api/khoa/dto/item/FishingItem.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import java.time.LocalDate;
55

66
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
78
import sevenstar.marineleisure.global.enums.ActivityCategory;
89
import sevenstar.marineleisure.global.utils.DateUtils;
910

1011
@Getter
12+
@NoArgsConstructor
1113
public class FishingItem implements KhoaItem {
1214
private String seafsPstnNm;
1315
private double lat;

src/main/java/sevenstar/marineleisure/global/api/khoa/dto/item/MudflatItem.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import java.time.LocalDate;
55

66
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
78
import sevenstar.marineleisure.global.enums.ActivityCategory;
89
import sevenstar.marineleisure.global.utils.DateUtils;
910

1011
@Getter
12+
@NoArgsConstructor
1113
public class MudflatItem implements KhoaItem {
1214
private String mdftExpcnVlgNm; // 마을 이름
1315
private double lat; // 위도

src/main/java/sevenstar/marineleisure/global/api/khoa/dto/item/ScubaItem.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import java.time.LocalDate;
55

66
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
78
import sevenstar.marineleisure.global.enums.ActivityCategory;
89
import sevenstar.marineleisure.global.utils.DateUtils;
910

1011
@Getter
12+
@NoArgsConstructor
1113
public class ScubaItem implements KhoaItem {
1214
private String skscExpcnRgnNm; // 체험 지역명
1315
private double lat; // 위도

0 commit comments

Comments
 (0)