인프런 커뮤니티 질문&답변

변지수23님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

web api 설계 (Post)

22.05.05 08:06 작성

·

397

0

안녕하세요 영한님. 올려주신 spring 강의부터 jpa까지 거의 다 듣고 배운것을 활용해서 토이 프로젝트 만들고 있습니다.

web api 설계시에 궁금한것이 있어 문의드립니다.

 

만약 parents 있고 children이 존재합니다. parent와 children은 1대N 관계입니다. 

제가 처음 백엔드 api 설계했을때 아래처럼 설계했습니다.

 

POST /parents : parents 리소스가 생성됩니다.

POST /parents/{id}/children : parent와 연관된 children 이 생성됩니다.

 

설계를 마치고 프론트엔드에서 해당 api를 이용해서 등록하려했습니다. 여기서 궁금한것이 생겼습니다.

아래 두 방식중 어떤것이 좋은것인지 잘모르겠습니다.

 

1. 프론트에서 한번의 Post 요청으로 parents와 childrens list를 모두 생성합니다.

request body 예시:

{

       parent: "..." 

       children:[

                "...",

                "..."

       ]

}

백엔드에서 parent정보로 parent 리소스를 만들고 만들어진 parent의 id와 body에 있는 children 리스트로 children 리소스를 생성합니다.

2. 프론트에서 POST /parent와 POST /parent/{id}/children을 각각 요청합니다.

먼저 POST /parents 요청을 보내고 응답값에서 parents id를 받아 children 갯수만큼 POST /parents/{id}/childrens 요청을 합니다.(이럴경우 요청수는 1+N이 겠네요).

 

1번과 2번 방식중에 어떤 방법이 나은지 잘 모르겠습니다. 

제가 생각한 각각의 장단점입니다.

 

1번의 장점 : 하나의 요청에 모든 정보가 들어있어 요청 처리중 에러 발생시 기존에 저장된 정보도 롤백이 가능하다는 장점이 있을것같습니다. 또한 request도 한번이면 됩니다.

1번의 단점 : api가 직관적이지 않은것같습니다. 클라이언트는 POST /parents를 사용하면 parents 리소스가 생길것으로 예상합니다. 하지만 해당 요청으로 children이 생길것이라는것은 문서를 봐야합니다. 또한 유연하지 않다고 생각합니다(클라이언트마다 구현방식이 다를것이므로)

 

2번의 장점 : api가 직관적입니다. 유연합니다. 클라이언트가 구현방식을 바꾸더라도 백엔드의 api를 바꾸지 않아도 될것같습니다.

2번의 단점 : 클라이언트쪽에서 여러번 api를 호출해야합니다. 요청 도중에 에러가 발생할 경우 parents는 등록되고 children은 등록이 안될수도 있습니다.

 

둘중에 어떤것 방식을 실무에서 사용하나요? 2번으로 마음이 좀 기울긴하는데, 위에 적히 단점들이 걸리네요..

 

그리고 클라이언트쪽에서 N개의 children를 모두 등록하고 싶을때 body에 list를 담아서 post /children 전부를 한번에 보내서 처리할수있게 api를 만드는게 좋은것인가요? (하나의 요청으로 여러개의 리소스 생성, 백엔드에서 리스트를 순회하면서 저장)

아니면 클라이언트쪽에서 list를 순회하면서 N번 post 요청 하게 만드는것이 좋은가요?( 하나의 요청으로 하나의 리소스생성, 대신 여러번 호출)

 

긴글 읽어주셔서 감사합니다. 

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

2022. 05. 08. 18:37

안녕하세요. 변지수님

생각하신 것 처럼 둘다 각각 장단점이 있는데요.

어떤 것이 더 나은지는 문제 상황에 따라서 다릅니다.

2번의 방법을 기본으로 하고, 추가로 필요하면 1번의 방법을 제공하는 것도 좋은 방안입니다.

감사합니다.