Spring

Query Parameter, Path Variable은 무엇이고 언제 사용할까?

teo_99 2023. 5. 7. 03:13

최근 Spring을 통해 개발을 진행하고 있는데요, Query Parameter, Path Variable 사용에 대한 저만의 기준이 잡혀 있지 않아 API를 설계하면서 대부분의 요청을 JSON으로 받았더라구요. 따라서 이번 아티클을 통해 Query Parameter,  Path Variable은 무엇인지, 그리고 언제 사용할 수 있는지를 알아보면서 저만의 기준을 잡아가고자 합니다.


query parameter란?

다음과 같은 주소가 있다고 해봅시다.

/foo?name=teo&age=25

물음표 뒤를 보면 key=value 형식으로 이루어져 있는데요, 여기서 key-value 쌍 하나를 query parameter라고 합니다. 그리고 이런 query parameter가 여러 개 있는 경우 &기호를 통해 구분합니다. 보통 query string이라는 용어와 혼재되기 쉬운데, query string은 물음표를 기준으로 뒤에 위치하는 모든 문자열을 의미합니다. 즉 위 예시에서는 name=teo&age=25 부분이 쿼리스트링이라고 할 수 있겠네요. 

 

이런 query parameter는 언제 사용될 수 있을까요? key - value 쌍으로 이루어져 있으니, "이런 속성을 갖고 있는 자원에 접근하고 싶어!" 라고 하고 싶을 때 사용할 수 있지 않을까요?

 

맞습니다. 많은 개발자들이 query parameter를 자원을 정렬(sort)하거나 필터링(filter)하는 용도로 사용합니다. 만약 게시판에서 이름이 "teo"인 사람의 게시물을 필터링해 보고 싶다면, query parameter를 사용해볼 수 있습니다. 아래와 같이요.

/board?name=teo
// teo가 작성한 게시물을 필터링해서 볼래!

Path variable이란?

path variable이란 query parameter와 어느정도 비슷한 면이 있는데요, 다음과 같은 구조입니다.

// path variable 형식
/board/name/teo

// query parameter 형식
/board?name=teo

query parameter와의 차이점이 보이시나요? 둘 다 같은 정보를 제공할 수는 있지만, 사용되는 형식이 다릅니다. 앞서서 query parameter의 경우 "자원을 정렬하거나 필터링하는 경우" 자주 사용된다고 학습했습니다. 그럼 path variable은 어떨까요? 결론부터 말씀드리면, path variable은 "해당 식별자를 가진 자원을 원하는 경우"에 사용됩니다.

 

즉, 위 예시에서는 각각이 다음과 같은 의미를 가집니다.

// path variable 형식
// 나는 이름이 teo인 유저를 원해!
/users/name/teo


// query parameter 형식
// 나는 유저들 중에서, 이름이 teo인 유저만 원해! 
/users?name=teo

뉘앙스의 차이가 느껴지시나요? path variable은 자원에 초점을, query parameter는 속성에 초점을 맞춥니다. path variable을 사용하는 경우, 해당 자원에 대해 고유 식별자가 있는 것이나 마찬가지입니다. 반면 query parameter는 고유 식별자를 가진 자원 중 필터링 된 일부를 나타내는 데에 주로 사용됩니다.

 

잘 와닿지 않으니 또 다른 예시를 들어봅시다. 배달의민족 서비스를 만들고 있다고 해보죠. 저희의 배달의민족 서비스는 굉장히 간단해서, 1. 음식 카테고리 별 매장 보기, 2. 매장 정보 접근하기 기능을 가집니다. 그러면 path를 어떻게 구성해볼 수 있을까요?

 

앞서서 path variable은 자원에 초점을, query parameter는 속성에 초점을 맞춘다고 했습니다. 

 

따라서 저는 다음과 같이 선택할 것 같습니다.

 

  • 매장 정보 접근하기 기능 : /store/매장ID 형식으로 path variable 사용
  • 음식 카테고리 별 매장 보기 기능 : /store?category=카테고리ID 형식으로 query parameter 사용
/store/2 // 개별 매장 정보 접근 기능은 이렇게! 
/store?category=asian // 음식 카테고리 별 매장 보기 기능은 이렇게!

마무리

query parameter와 path variable에 대해 정리해보는 시간을 가졌습니다.

이렇게 사용하는 건 하나의 best practice이고, 널리 알려져 있기에 따르는 것이 일반적으로 좋아보이나, 꼭 따라야 한다는 규칙도 없습니다. 따라서 팀 규칙이나 다양한 상황을 고려해서 결정하면 좋을 것 같다는 생각이 듭니다.

 

잘못된 내용이나 지적 사항은 꼭 알려주세요!

 


참고 자료

https://medium.com/@fullsour/when-should-you-use-path-variable-and-query-parameter-a346790e8a6d