From ca8833af44163d08d68bf2d75eb7768b5d4dbaac Mon Sep 17 00:00:00 2001 From: Somin Lee <81960250+purin48@users.noreply.github.com> Date: Wed, 15 May 2024 16:13:07 +0900 Subject: [PATCH] =?UTF-8?q?[Refactor]=20=EB=8F=99=EC=8B=9C=EC=84=B1=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20(#82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat : 동시성 처리 * fix : 알람 읽지 않은 목록만 보여주기로 수정 --- .../service/VotingScheduleService.java | 11 ++++++++--- .../java/today/meevote/response/FailureInfo.java | 1 + src/main/resources/mapper/notifyMapper.xml | 1 + src/main/resources/sql/sql_0515 | 12 ++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/sql/sql_0515 diff --git a/src/main/java/today/meevote/domain/voting_schedule/service/VotingScheduleService.java b/src/main/java/today/meevote/domain/voting_schedule/service/VotingScheduleService.java index 9eb5283..ab5ecc7 100644 --- a/src/main/java/today/meevote/domain/voting_schedule/service/VotingScheduleService.java +++ b/src/main/java/today/meevote/domain/voting_schedule/service/VotingScheduleService.java @@ -1,6 +1,7 @@ package today.meevote.domain.voting_schedule.service; import lombok.RequiredArgsConstructor; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import today.meevote.contextholder.MemberContextHolder; @@ -11,6 +12,7 @@ import today.meevote.exception.rest.RestException; import today.meevote.response.FailureInfo; +import java.sql.SQLException; import java.util.List; @Service @@ -57,10 +59,13 @@ public void addPlaceToVote(long scheduleId, CreatePlaceDto addPlaceToVoteDto) { if(!votingScheduleDao.isExistMemberSchedule(email, scheduleId)) throw new RestException(FailureInfo.NOT_EXIST_MEMBER_SCHEDULE); - if(votingScheduleDao.isDuplicatePlaceToVote(scheduleId, addPlaceToVoteDto)) + // SQLException - 동시성 제어 / 유니크 키 제약 조건 위반 처리 + try { + votingScheduleDao.addPlaceToVote(scheduleId, addPlaceToVoteDto); + } catch (DuplicateKeyException e) { + // ORA-00001: unique 키 위배 throw new RestException(FailureInfo.ALREADY_EXIST_PLACE_TO_VOTE); - - votingScheduleDao.addPlaceToVote(scheduleId, addPlaceToVoteDto); + } } public void toggleVotePlace(long placeToVoteId) { diff --git a/src/main/java/today/meevote/response/FailureInfo.java b/src/main/java/today/meevote/response/FailureInfo.java index d206ecb..3b4fc33 100644 --- a/src/main/java/today/meevote/response/FailureInfo.java +++ b/src/main/java/today/meevote/response/FailureInfo.java @@ -32,6 +32,7 @@ public enum FailureInfo { NOT_EXIST_SCHEDULE("S02", "존재하지 않는 일정입니다."), NOT_EXIST_DELETE_SCHEDULE("S03", "삭제가 불가능한 일정입니다. 확인 후 다시 시도해주세요."), NOT_OUT_MEMBER_SCHEDULE("S04", "나가기가 불가능한 일정입니다. 확인 후 다시 시도해주세요."), + ALREADY_EXIST_GROUP_MEMBER("S05", "이미 존재하는 그룹일정입니다."), NOT_SCHEDULE_OWNER("S98", "해당 일정의 소유자가 아닙니다."), NOT_EXIST_MEMBER_SCHEDULE("S99", "해당 일정의 멤버가 아닙니다."), diff --git a/src/main/resources/mapper/notifyMapper.xml b/src/main/resources/mapper/notifyMapper.xml index 7fd8a3d..0fc6df9 100644 --- a/src/main/resources/mapper/notifyMapper.xml +++ b/src/main/resources/mapper/notifyMapper.xml @@ -35,6 +35,7 @@ LEFT JOIN schedule_place sp ON n.schedule_id = sp.schedule_id WHERE n.email = #{email} + AND n.is_read = 0 ORDER BY n.is_read ASC, n.notify_id DESC diff --git a/src/main/resources/sql/sql_0515 b/src/main/resources/sql/sql_0515 new file mode 100644 index 0000000..12f47ec --- /dev/null +++ b/src/main/resources/sql/sql_0515 @@ -0,0 +1,12 @@ +-- 컬럼 길이 줄이기 +ALTER TABLE place_to_vote MODIFY place_name NVARCHAR2(1000); +ALTER TABLE place_to_vote MODIFY lat NVARCHAR2(1000); +ALTER TABLE place_to_vote MODIFY lng NVARCHAR2(1000); + +-- 복합 유니크 인덱스 생성 +CREATE UNIQUE INDEX uq_place_to_vote +ON place_to_vote (schedule_id, lat, lng); + +-- place_to_vote 테이블에 새로운 유니크 제약 조건을 추가 +ALTER TABLE place_to_vote +ADD CONSTRAINT uq_place_to_vote UNIQUE (schedule_id, lat, lng); \ No newline at end of file