• 카테고리

    질문 & 답변
  • 세부 분야

    웹 개발

  • 해결 여부

    미해결

강사님 rest, http api 설계에 대해 궁금한점이 있습니다!

21.04.07 05:14 작성 조회수 617

0

안녕하세요 김영한 강사님!! 이렇게 또 질문을 올리게 되었습니다..!

토이프로젝트로 api를 설계할때마다 너무나도 궁금한점들이 있었습니다.

간단한 예제로 회원 정보 api 설계로 예를 들어보겠습니다!

.

 회원 조회 api 설계라고 하면 보통 /members/{id} 이런식으로 알고 있습니다.

.

Spring Security를 이용해 jwt나 세션을 사용하면 Principal 객체에 회원 데이터가 들어있어서

이를 이용해  /members/me -> 이런 api 설계도 가능했었습니다

(jwt decode 된 정보나 세션 정보를 확인해서 정보조회)

.

클라이언트 입장에선

로그인 후 회원 정보를 보고싶으면 회원조회를 요청하는 uri 주소를 띄워줘야 하는데 회원 리소스의 식별 값을 알아야지 조회가능 하지 않나? 라는 생각이 들었습니다.

.

Admin 페이지에서의 예를 들어보면

회원들 관리를 위해 전체 회원 목록 조회를 하면 회원 entity들을 dto로 반환하고 hateoas를 이용해 각각의 회원 정보를 조회하는 uri를 PagedResourcesAssembler를 이용해 각 회원마다 만들어 주었었습니다.

(예시를 들자면 회원 목록 조회후 @Id 값들로 회원 조회, 게시판 글 목록 조회 후 @Id 값들로 게시판 글 조회, 주문 목록 조회후 @Id 값들로 주문 조회 이런식입니다!)

ex) 

"id": 1,
"username": member1,
"links":[
{
"rel": "회원 정보",
"href": "http://localhost:8080/members/1"
}
]
"id": 2,
"username": member2,
"links":[
{
"rel": "회원 정보",
"href": "http://localhost:8080/members/2"
}]
.....

하지만 로그인한 일반 유저 입장에선

-그냥 세션을 이용한다면 세션에 setAttribute한 값을 가져와서 회원을 조회해서 정보를 나타내주면 되고

-jwt를 이용한다면 decode된 정보를 바탕으로 회원을 조회해서 정보를 나타내주면 되는데

/members/{id} 로 api 설계를 하고 api 문서를 적어놨다고 하였을때 클라이언트 쪽에선 어떻게 개발을 하는지 궁금합니다.

(보통 실무에선 restful을 지키기가 힘들기 때문에 보통 지켜지지 않으며 개발이 된다고 하신 답글을 보았었습니다!)

.

- /members/1 이라고 했을때 1번인걸 클라이언트가 어떻게 알고 회원 정보를 보는 페이지로 가는 uri를 적는걸까?

-> 서버로 로그인 요청을 보내면 서버에서 1 응답을 줘서 클라이언트에 따로 저장시켜놓는건가?

.

이런 생각들입니다..! 제가 이부분에선 잘못 생각하고 있을수도 있지만 이상하게 헷갈리는 부분은 꼭 알고 가고싶어서 여쭤보게되었습니다.

구글에 찾아봐도 설계만 딱 있을뿐 저에게 답이 되는 부분은 찾지 못하였습니다..ㅜ

.

그래서 정리하자면

1.  /members/me -> Principal 에 저장된 정보로 회원조회 하는 설계랑

/members/{id} -> @PathVariable id 값으로 회원 조회 하는 설계가 명확히 어떤 측면에서 장단점들이 있고 제가 앞에서 말씀드린 내용의 대한 것과 제가 어떤 부분을 잘못 알고있는지 궁급합니다!

2. 보통 rest가 아닌 실무에서의 http api 설계를 할때 해당 페이지에서 이동 가능한 link 까지 포함해서 응답을 주는지 궁금합니다!

(회원 정보 페이지 라고 한다면 회원 정보 페이지에선 회원 수정, 회원 탈퇴 의 링크가 있다면 이걸 포함시켜서 응답을 해야하는지)

답변 1

답변을 작성해보세요.

2

안녕하세요. BeomJun Lee님

1. 이미 세션을 사용하고, 세션에 관련 정보가 있기 때문에 꼭 사용자의 id를 URL에 사용하지 않아도 됩니다. 실무에서는 세션을 사용하는 경우 세션과 관련된 정보는 URL에서 주로 숨기는 편입니다.

예를 들어서 주문내역이라고 하면 다음과 같이 설계하는 것이 아니라, 

/users/{userId}/orders/{orderId}

이미 인증 정보가 있어서 사용자를 식별할 수 있기 때문에 다음과 같이 단순하게 설계합니다.

/orders/{orderId}

2. 어쩌면 Restful에서 가장 지키기 어려운 내용인데요. ㅎㅎ 실무에서는 거의 링크를 포함하지 않습니다. 이게 막상 해보면 생각보다 번거로운 점이 많고, 고민할 점들이 많습니다. 그리고 들어가는 투입 대비 얻는 이득이 적습니다. 또한 웹의 경우 대부분 클라이언트와 서버를 동시에 수정가능하기 때문에 큰 메리트가 없습니다.

앱과 개발하는 경우에는 앱 배포가 한번 나가면 과거 버전을 수정하기 어렵기 때문에 부분적으로 이런 방식을 적용하는 것이 도움이 되기도 합니다.(페이징 처리 등등)

그래도 개념을 알아두면 도움이 되기 때문에 공부해두시는 것은 좋습니다.

감사합니다.