Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat#32] 안건 삭제 개발 #33

Merged
merged 2 commits into from
Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import org.dnd.timeet.meeting.domain.MeetingRepository;
import org.dnd.timeet.member.domain.Member;
import org.dnd.timeet.participant.domain.ParticipantRepository;
import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -72,4 +71,13 @@ public Agenda changeAgendaStatus(Long meetingId, Long agendaId, AgendaActionRequ

return agendaRepository.save(agenda); // 변경된 안건 상태로 응답 객체 생성 및 반환
}

public void cancelAgenda(Long meetingId, Long agendaId) {
Agenda agenda = agendaRepository.findByIdAndMeetingId(agendaId, meetingId)
.orElseThrow(() -> new NotFoundError(ErrorCode.RESOURCE_NOT_FOUND,
Collections.singletonMap("AgendaId", "Agenda not found")));
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Starlight258
다음과 같은 경우에 meetingId 값을 찾지 못하여도, Agenda not found가 출력 되게 됩니다.

해당 경우에 findByIdAndMeetingId 메서드를 활용하면서 에러 메시지를 좀 더 의미 있게 어떻게 출력할 수 있을지 궁금합니다 ☺️

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findByIdAndMeetingId 메서드를 사용한다면 에러 메세지로는 Meeting or Agenda not found 가 더 명확할 것 같습니다!
그런데 그렇게 메세지를 전달하면 Meeting이 존재하지 않은건지 Agenda가 존재하지 않은 건지 응답자 입장에서 모호할 것 같아요! 🧐

코드가 좀 길더라도 각각을 repository에서 조회하고 각 경우에 대해 에러 메세지를 출력하는 코드는 어떻게 생각하세요?
이렇게 작성하면 덜 모호할 것 같아요!

public void cancelAgenda(Long meetingId, Long agendaId) {
    Meeting meeting = meetingRepository.findById(meetingId)
        .orElseThrow(() -> new NotFoundError(ErrorCode.RESOURCE_NOT_FOUND,
            Collections.singletonMap("MeetingId", "Meeting not found")));

    Agenda agenda = agendaRepository.findByIdAndMeetingId(agendaId, meetingId)
        .orElseThrow(() -> new NotFoundError(ErrorCode.RESOURCE_NOT_FOUND,
            Collections.singletonMap("AgendaId", "Agenda not found")));
}

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Starlight258
좋은 의견 감사합니다 👍
말씀해주신 방법대로 하면 MeetingId와 AgendaId 중에 어디서 에러가 발생했는지 사용자 입장에서 더욱 명확할 것 같습니다.
다만 걱정되는 점은, repository를 중복으로 두 번 조회함으로써 불필요한 리소스 사용이 없을지 궁금해요!

Copy link
Collaborator

@Starlight258 Starlight258 Feb 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생각해볼 좋은 질문인것 같아요! 아무래도 단일 조회 메서드는 JPA가 내부적으로 하나의 쿼리를 생성하는데 비해
제안한 코드는 2개의 쿼리를 각각 날리니까요!
메세지를 명확하게 제공하고 싶다면 두번 조회를, 성능을 중요하게 생각한다면 단일 조회 메서드를 선택하는게 좋아보여요!

개인적으로, 두번 조회단일 조회가 성능적으로 아주 큰 차이는 없을 것 같아서 전자가 좋을 것 같은데, 어떻게 생각하시나요?

agenda.delete();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand Down Expand Up @@ -59,13 +60,13 @@ public ResponseEntity getAgendas(
}

/*
* @MessageMapping : 클라이언트에서 해당 url로 메세지를 보내면 요청을 처리한다.
* @SendTo : 브로커에게 메세지를 보낸다.
* 과정
* 1. 클라이언트에서 /app/meeting/{meetingId}/agendas/{agendaId}/action 으로 메세지를 보낸다.
* 2. 핸들러가 메세지를 처리한다.
* 3. 그 결과를 /topic/meeting/{meetingId}/agendas/{agendaId}/status 주소로 브로커에게 보낸다.
* 4. 브로커는 해당 주소를 구독하고 있는 클라이언트에게 메세지를 전달한다.
* @MessageMapping : 클라이언트에서 해당 url로 메세지를 보내면 요청을 처리한다.
* @SendTo : 브로커에게 메세지를 보낸다.
* 과정
* 1. 클라이언트에서 /app/meeting/{meetingId}/agendas/{agendaId}/action 으로 메세지를 보낸다.
* 2. 핸들러가 메세지를 처리한다.
* 3. 그 결과를 /topic/meeting/{meetingId}/agendas/{agendaId}/status 주소로 브로커에게 보낸다.
* 4. 브로커는 해당 주소를 구독하고 있는 클라이언트에게 메세지를 전달한다.
*/
@Operation(summary = "안건 제어 및 갱신", description = "해당 안건을 제어 및 갱신한다.")
@MessageMapping("/meeting/{meeting-id}/agendas/{agenda-id}/action")
Expand All @@ -78,4 +79,14 @@ public AgendaActionResponse handleAgendaAction(@DestinationVariable Long meeting
// 변경된 안건 상태로 응답 객체 생성 및 반환
return new AgendaActionResponse(agenda.getId(), agenda.getStatus());
}

@DeleteMapping("/{meeting-id}/agendas/{agenda-id}")
@Operation(summary = "안건 삭제", description = "지정된 ID에 해당하는 안건을 삭제한다.")
public ResponseEntity deleteAgenda(
@PathVariable("meeting-id") Long meetingId,
@PathVariable("agenda-id") Long agendaId) {
agendaService.cancelAgenda(meetingId, agendaId);

return ResponseEntity.noContent().build();
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/dnd/timeet/agenda/domain/Agenda.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,5 +120,10 @@ private LocalTime calculateActualDuration() {
return this.estimatedDuration;
}

public void cancelAgenda() {
this.status = AgendaStatus.CANCELED;
this.delete();
}

}

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package org.dnd.timeet.agenda.domain;

public enum AgendaStatus {
PENDING, INPROGRESS, PAUSED, COMPLETED
PENDING, INPROGRESS, PAUSED, COMPLETED, CANCELED
Starlight258 marked this conversation as resolved.
Show resolved Hide resolved
}
Loading