AnTaeWook/e-voting

안건 관리 기능 구현 - [merged]

Closed this issue · 15 comments

Merges feature/#3-agenda-admin -> main

관리자가 수행할 수 있는 안건에 대한 동작을 구현하였음.

  • 투표가 종료된 안건 확인에 대해서는 추후 투표 기능을 구현한 후 이어서 구현 예정.

Closes #3

@mentor/mentor_2023.01

In GitLab by @charlie on Jan 10, 2023, 14:46

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/controller/AgendaController.java line 46

  • 대표적인 HTTP 메서드에는 무엇이 있나요? GET 메서드가 이 API 를 나타내기에 적합한지 생각보시기 바랍니다.
  • URL 을 /agendas/{id}/terminate 로 설계한 근거를 설명하실 수 있을까요?

In GitLab by @charlie on Jan 10, 2023, 14:49

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/dto/agenda/MyDateTime.java line 5

MyDateTime 을 별도로 정의해 사용하는 이유는 무엇인가요?

안건을 종료 시킨다는 점에서 종료에 관련된 Method가 없으므로 불가피하게 url에 action을 담아
/agendas/{id}/terminate로 설계하였습니다.

하지만 실제 동작은 안건의 종료 시간을 현재 시간으로 변경하는 방식으로 동작하니
method는 Patch가 더 적합했다고 생각합니다..

의견 감사드립니다!
@charlie

클라이언트로부터 시작 시간과 종료 시간을 받기 위해 해당 클래스를 정의하였는데,

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime startsAt;

방식으로 정확한 타입의 시간을 입력 받는 것이 더 적합한 것 같습니다.

감사합니다!
@charlie

In GitLab by @project_18_bot on Jan 10, 2023, 15:34

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/controller/AgendaController.java line 46

changed this line in version 2 of the diff

In GitLab by @project_18_bot on Jan 10, 2023, 15:34

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/dto/agenda/MyDateTime.java line 5

changed this line in version 2 of the diff

In GitLab by @project_18_bot on Jan 10, 2023, 15:34

added 2 commits

  • 2180c75 - #3 - 안건 종료 메서드 수정
  • bf4403b - #3 - 안건 생성 요청 요소 타입 변경

Compare with previous version

mentioned in commit 39d0585

In GitLab by @charlie on Jan 10, 2023, 16:07

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/controller/AgendaController.java line 46

이미 머지가 됐네요.

두번째 질문은 URL 경로에 대한 질문이었습니다. 설계만 봤을 땐 agenda 를 리소스로 보는 것 같은데, 다음 엔드포인트에 대해서 어떤 차이가 있는지 생각해보시면 좋을 것 같습니다. (옳고 그름이 있는 건 아니고, 설계 기준을 잡는 게 중요합니다)

PUT /agendas/{id}
PATCH /agendas/{id}
PATCH /agendas/{id}/terminate

In GitLab by @charlie on Jan 10, 2023, 16:08

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/dto/agenda/MyDateTime.java line 5

이 부분은 단순히 의도가 궁금해서 올린 스레드였습니다. 우선은 수정하신 부분 확인했습니다.

저는 아래의 Gists 문서를 참고하여 url 경로를 설정하였습니다!
https://developer.github.com/v3/gists/#star-a-gist

아니면 혹시
POST /agendas/{id} url에

RequestBody를
{
"action": "terminate"
}
로 받는 것은 어떻게 생각하시는지 궁금합니다!

@charlie

In GitLab by @charlie on Jan 10, 2023, 17:08

Commented on voting-server/voting-server/src/main/java/gabia/votingserver/controller/AgendaController.java line 46

어떤 부분을 참고하신 건지는 잘 모르겠지만, Github 에서는 다음과 같이 기준을 잡고 있네요.

PUT /gists/{gist_id}/starGists/{gist_id} 라는 리소스가 가진 star 라는 리소스를 교체한다는 의미로 디자인한 걸로 보입니다.

https://docs.github.com/rest/overview/resources-in-the-rest-api#http-verbs

HTTP verbs

Where possible, the GitHub REST API strives to use appropriate HTTP verbs for each action. Note that HTTP verbs are case-sensitive.
Verb	Description
HEAD	Can be issued against any resource to get just the HTTP header info.
GET	Used for retrieving resources.
POST	Used for creating resources.
PATCH	Used for updating resources with partial JSON data. For instance, an Issue resource has title and body attributes. A PATCH request may accept one or more of the attributes to update the resource.
PUT	Used for replacing resources or collections. For PUT requests with no body attribute, be sure to set the Content-Length header to zero.
DELETE	Used for deleting resources.

제가 궁금했던 건 Github 이 위와 같이 메서드별로 정의를 내린 것처럼, @AnTaeWook 께서 어떤 기준을 가지고 Endpoint 를 설계했는지였습니다.


여기서부터는 주관이니까 참고만 하세요...

저는 agenda 를 하나의 리소스로 보고, 리소스(JSON)의 일부를 변경(PATCH)한다는 의미로 다음과 같이 엔드포인트를 정했을 것 같습니다.

PATCH /agendas/{id}

body
{
  "status": "terminated"
}

(저는 URL 에 행동을 명시하는 건 가급적 지양하는 편이지만) 값 변경으로 표현하기에 적합하지 않거나, 다른 작업들이 크게 연관돼 있다면 @AnTaeWook 께서 제시한 방식과 유사하게 작성했을 겁니다.

PUT /agendas/{id}/terminate
or
PATCH /agendas/{id}/terminate

만일 API 를 하나의 작업을 생성하는 요청이라 본다면 다음과 같은 방식도 유효하겠죠.

POST /jobs
{
  "resource": "agendas/{id}",
  "action": "terminate"
}

관점에 따라 전혀 다른 API 를 디자인할 수 있기 때문에, 명확한 기준을 잡는 게 중요합니다.

구체적인 의견 제시 감사드립니다😊

항상 기본적인 CRUD 외 액션이 요구되는 요청의 URL은 위와 같이 작성하곤 했는데,
깊이 생각해보지 못한 부분이 많이 있는 것 같습니다..

현재 제 생각에는 Agendastatus 필드가 존재하지 않으므로

PUT /agendas/{id}/terminate
or
PATCH /agendas/{id}/terminate

방식으로 우선 작성하고 지속적으로 해당 문제에 대해 고민해보겠습니다!

In GitLab by @charlie on Jan 10, 2023, 17:24

resolved all threads

In GitLab by @django on Jan 10, 2023, 17:24

resolved all threads