REST API에서 Search 기능을 구현하는 방법에 대해 설명합니다 .
[Route("api/[controller]")] [ApiController] public class EmployeesController : ControllerBase { private readonly IEmployeeRepository employeeRepository; public EmployeesController(IEmployeeRepository employeeRepository) { this.employeeRepository = employeeRepository; } [HttpGet("{search}")] public async Task<ActionResult<IEnumerable<Employee>>> Search(string name, Gender? gender) { try { var result = await employeeRepository.Search(name, gender); if (result.Any()) { return Ok(result); } return NotFound(); } catch (Exception) { return StatusCode(StatusCodes.Status500InternalServerError, "Error retrieving data from the database"); } } }
코드 설명
EmployeesController 의 [ Route ] 속성 에 따라 이 컨트롤러에 접근하는 경로는 /api/employees 입니다.
[Route("api/[controller]")] [ApiController] public class EmployeesController : ControllerBase { }
다음 [HttpGet] 특성은 기본 경로 /api/employees 에 대해 고정입니다. 따라서 이 Search() 메서드에 접근하는 경로는 /api/employees/search 입니다 . 메서드의 두 매개 변수의 값은 URL의 쿼리 문자열에서 가져옵니다.
[HttpGet("{search}")] public async Task<ActionResult<IEnumerable<Employee>>> Search(string name, Gender? gender) { }
쿼리 문자열 대신 검색어 (이름 및 성별) 를 경로 매개 변수로 포함하려면 아래와 같이 HttpGet 특성의 경로 템플릿을 변경합니다. 그러나 검색 매개변수가 많은 경우에는 이 방법을 사용하지 않는 것이 좋습니다.
[HttpGet("{search}/{name}/{gender?}")] public async Task<ActionResult<IEnumerable<Employee>>> Search(string name, Gender? gender) { }
경로 매개변수와 메소드 매개변수는 이름으로 매핑되기 때문에 순서가 일치하지 않더라도 여전히 올바르게 매핑됩니다. 즉, URL 매개변수 이름은 메소드 매개변수 이름에 매핑되고 성별 URL 매개변수는 성별 메서드 매개변수에 매핑됩니다.
[HttpGet("{search}/{name}/{gender?}")] public async Task<ActionResult<IEnumerable<Employee>>> Search(Gender? gender, string name) { }
IEmployeeRepository Interface 구성
public interface IEmployeeRepository { Task<IEnumerable<Employee>> Search(string name, Gender? gender); }
EmployeeRepository 에서 코드 처리
public class EmployeeRepository : IEmployeeRepository { private readonly AppDbContext appDbContext; public EmployeeRepository(AppDbContext appDbContext) { this.appDbContext = appDbContext; } public async Task<IEnumerable<Employee>> Search(string name, Gender? gender) { IQueryable<Employee> query = appDbContext.Employees; if (!string.IsNullOrEmpty(name)) { query = query.Where(e => e.FirstName.Contains(name) || e.LastName.Contains(name)); } if(gender != null) { query = query.Where(e => e.Gender == gender); } return await query.ToListAsync(); } }
인자로 받은 내용으로 검색하여 결과를 반환합니다.