상세 컨텐츠

본문 제목

[nestJS] 왜 @Param보다 @query를 써야하는가?

카테고리 없음

by esoesmio 2024. 5. 17. 15:42

본문

쿼리 파라미터(`@Query`)를 사용하여 데이터를 조회하는 방식과 경로 변수(`@Param`)를 사용하는 방식은 각각의 사용 케이스에 따라 장단점이 있습니다. `/blocked-users` 엔드포인트에서 쿼리 파라미터를 사용하는 접근 방식을 채택하는 것은 다음과 같은 장점이 있습니다:

### 1. 유연성
쿼리 파라미터를 사용하는 방식은 호출하는 URL에 따라 동적으로 여러 필터를 적용할 수 있도록 해줍니다. 사용자가 하나 또는 두 필터(`seller`, `customer`) 중 어떤 것을 제공할지, 혹은 둘 다 제공할지 선택할 수 있으므로, 같은 엔드포인트를 통해 다양한 검색 결과를 얻을 수 있습니다.

### 2. 선택적 필터링
쿼리 파라미터는 선택적으로 제공될 수 있습니다. 이는 사용자가 필요에 따라 특정 데이터를 필터링할 수 있도록 해줍니다. 예를 들어, `seller` 파라미터만 제공하여 특정 셀러에 의해 차단된 사용자 목록을 얻거나, `customer` 파라미터만 제공하여 특정 고객이 차단당한 셀러 목록을 조회할 수 있습니다. 두 파라미터를 모두 제공하지 않는 경우 전체 리스트를 조회할 수도 있습니다.

### 3. RESTful 원칙에 부합
RESTful API 설계 원칙에서는 리소스의 상태를 변경하는 동작을 제외하고 데이터를 검색하거나 필터링할 때 쿼리 파라미터를 사용하는 것이 권장됩니다. 이는 API의 읽기 동작을 명시적으로 표현할 수 있게 하며, URL 자체가 자원을 나타내고, 쿼리 파라미터가 해당 자원을 어떻게 조작할지를 정의합니다.

### 4. 쉬운 캐싱 및 로깅
쿼리 파라미터로 데이터를 필터링하는 방식은 HTTP GET 요청을 사용하기 때문에, 결과를 캐싱하는 것이 더 쉽습니다. 또한, 로깅 시에도 해당 요청의 URL만으로 필요한 모든 정보를 추적할 수 있어 유용합니다.

### 경로 변수(`@Param`) 대비 장점
경로 변수를 사용할 경우, 각 필터링 옵션을 별도의 API 경로로 처리해야 할 수 있습니다. 예를 들어, `GET /sellers/{sellerId}/blocked-users`와 `GET /customers/{customerId}/blocked-users` 같이 두 가지 엔드포인트를 구성해야 하며, 각각의 경우에 대해 별도의 로직을 구현해야 할 수 있습니다. 이는 엔드포인트의 수를 증가시키고, 유지보수의 복잡성을 높일 수 있습니다. 반면, 쿼리 파라미터를 사용하면 하나의 엔드포인트로 모든 필터링 옵션을 간편하게 처리할 수 있습니다.

 

 

 

좋은 질문입니다! 쿼리 파라미터(`@Query`)와 경로 변수(`@Param`) 사용의 차이는 주로 요청의 목적과 RESTful API 설계 원칙에 따라 결정됩니다. 각각은 서로 다른 상황에 더 적합할 수 있으며, 선택은 API의 구조, 사용성, 그리고 의도에 따라 달라집니다.

### 쿼리 파라미터(`@Query`) 사용 이유:

1. **유연성**: 쿼리 파라미터는 필터링, 정렬, 검색 같은 옵션을 제공할 때 유연성을 제공합니다. 같은 엔드포인트를 사용하여 다양한 형태의 데이터를 검색하거나 반환할 수 있습니다. 예를 들어, `/sellers?search=JohnDoe`와 `/sellers?search=1234567890`는 동일한 엔드포인트에서 두 가지 유형의 검색을 수행할 수 있게 해줍니다.

2. **선택적 파라미터**: 쿼리 파라미터는 선택적으로 처리될 수 있습니다. 이는 사용자가 특정 정보만을 제공할 수 있도록 하여 API의 사용을 더 간편하게 만듭니다. 필수가 아닌 선택적인 정보를 요청할 때 쿼리 파라미터를 자주 사용합니다.

3. **RESTful 원칙**: RESTful 설계에서 URL은 리소스를 표현해야 합니다. 쿼리 파라미터를 사용하면 리소스의 상태나 세부 사항을 변경하지 않고, 해당 리소스에 대한 다양한 뷰(view) 또는 표현(representation)을 제공할 수 있습니다. 예를 들어, 같은 `sellers` 리소스에 대한 여러 검색 요청을 처리할 수 있습니다.

### 경로 변수(`@Param`) 사용 시 고려사항:

1. **특정 리소스 접근**: 경로 변수는 특정 리소스나 리소스의 특정 인스턴스에 접근할 때 사용됩니다. 예를 들어, `/sellers/123`는 ID가 123인 `seller` 리소스를 직접 참조합니다.

2. **필수 파라미터**: 경로 변수는 URL의 필수 부분입니다. 따라서 경로 변수를 통해 데이터를 받는 경우, 해당 데이터는 요청에 반드시 포함되어야 합니다. 이는 사용자가 어떤 특정한 리소스를 명시적으로 요청했다는 것을 의미합니다.

### 결론:

`@Query`를 사용하는 것이 이 경우에 더 적합한 이유는, 단일 `sellers` 엔드포인트를 통해 다양한 유형의 검색을 유연하게 처리할 수 있기 때문입니다. 사용자가 입력하는 검색 조건(닉네임이든, 전화번호이든)에 따라 적절한 서비스를 호출하며, 이는 선택적인 검색 기능을 제공합니다. 만약 경로 변수(`@Param`)를 사용하면, 검색어를 URL 경로의 일부로 만들어야 하며, 이는 일반적으로 필수 값이 되어 API의 유연성을 제한할 수 있습니다. 게다가 검색어가 URL에 포함되면 다양한 형식의 입력 처리가 더 복잡해질 수 있습니다.

댓글 영역