?key=value형식으로 URL 끝에 데이터를 추가하는 방식이다.&로 연결이 가능하다. (?category=laptop?sort=asc&page=2).예제
https://example.com/products?category=laptop&sort=asc&page=2
이 처럼, Query String은 서버로 데이터를 전달하는 간단한 방법이다!
| 특징 | 설명 |
|---|---|
| 키-값 형식 (key=value) | ?name=John&age=25 |
| 다중 값 전달 가능 | ?tags=aspnet&tags=dotnet (배열 형식) |
| 공백( )과 특수 문자 (&, =)는 인코딩 필요 | ?query=C%23%20web (C# web → URL 인코딩) |
| 보안에 취약함 | URL에 데이터가 노출됨 (비밀번호, 민감한 정보 X) |
1. HttpContext.Request.Query 사용 (미들웨어 또는 app.MapGet())
ASP.NET Core에서는 [FromQuery]를 사용하면, Query String데이터를 컨트롤러 매개변수로 자동 바인딩 할 수 있다.
app.MapGet("/search", async (HttpContext context) =>
{
var query = context.Request.Query["query"];
var page = context.Request.Query["page"];
await context.Response.WriteAsync($"Query: {query}, Page: {page}");
});
// 요청: GET /search?query=aspnet&page=2
// 응답: Query: aspnet, Page: 2
2. [FromQuery] 사용 (MVC 컨트롤러)
ASP.NET Core에서는 [FromQuery]를 사용하면 Query String 데이터를 컨트롤러 매개변수로 자동 바인딩할 수 있다.
[HttpGet("products")]
public IActionResult GetProducts([FromQuery] string category, [FromQuery] int page = 1)
{
return Ok(new { Category = category, Page = page });
}
// 요청 : GET /products?category=laptop&page=3
응답을 아래와 같다.
{
"Category": "laptop",
"Page": 3
}
3. Query String에서 다중 값(배열) 전달하기
여러 개의 동일한 키를 사용하여, 다중의 값을 받을 때 사용한다.
GET /api/tags?tags=aspnet&tags=dotnet&tags=csharp
위 요청은 tags에 여러 value가 매칭되어 있는데, 이럴 때는 아래와 같이 Controller에서 배열로 받으면 된다.
[HttpGet("tags")]
public IActionResult GetTags([FromQuery] List<string> tags)
{
return Ok(tags);
}
// 응답 ["aspnet", "dotnet", "csharp"]
| 비교 항목 | Query String (?key=value) | Route Parameter (/{value}) |
|---|---|---|
| 형식 | URL 끝에 추가 (?category=laptop&page=2) | URL 경로 일부로 포함 (/users/123) |
| 용도 | 선택적 데이터 전달 (검색, 필터링, 정렬) | 필수 데이터 (리소스 식별) |
| RESTful API 적용 | ❌ URL이 명확하지 않음 | ✅ URL이 RESTful하고 직관적 |
| 순서 영향 | 없음 (?a=1&b=2 == ?b=2&a=1) | 있음 (/users/{id}/orders/{orderId}) |
[FromQuery] 특징 및 사용법| 속성 | 역할 | 사용 예시 |
|---|---|---|
[FromQuery] | Query String 데이터 자동 바인딩 | GET /products?category=laptop&page=3 |
[FromRoute] | URL 경로에서 값 바인딩 | GET /users/123 |
[FromBody] | HTTP 요청 본문에서 데이터 받기 (JSON) | POST /users { "name": "John" } |
즉, Query String 데이터는 [FromQuery], URL 경로 데이터는 [FromRoute], 요청 본문 데이터는 [FromBody] 를 사용한다!
[FromQuery]의 주요 기능1. 객체(Query String을 객체로 받기)
GET /users?name=John&age=30
위 요청을 아래 컨트롤러에 보낸 뒤, 객체로 받을 수 있다.
public class UserFilter
{
public string Name { get; set; }
public int Age { get; set; }
}
[HttpGet("users")]
public IActionResult GetUsers([FromQuery] UserFilter filter)
{
return Ok(filter);
}
{
"Name": "John",
"Age": 30
}
[FromQuery]를 사용하면 Query String을 C# 객체로 쉽게 매핑할 수 있다!
GET /users/123/orders?status=pending&page=2
[HttpGet("users/{id}/orders")]
public IActionResult GetUserOrders([FromRoute] int id, [FromQuery] string status, [FromQuery] int page = 1)
{
return Ok(new { UserId = id, OrderStatus = status, Page = page });
}
{
"UserId": 123,
"OrderStatus": "pending",
"Page": 2
}
주요 리소스는 Route Parameter, 선택적 필터링은 Query String으로 사용 가능하다.
?key=value 형식으로 데이터를 전달하는 방식이다.context.Request.Query["key"] 또는 [FromQuery]로 쉽게 가져올 수 있다.Route Parameter, 선택적 데이터 전달에는 Query String 사용한다[FromQuery]를 사용하면 Query String 데이터를 컨트롤러에서 쉽게 바인딩 가능하다.