핸들러 메서드(Handler Method)는 스프링 MVC에서 HTTP 요청을 처리하는 메서드를 의미합니다. 클라이언트가 특정 URL로 요청을 보내면, 해당 요청을 처리하기 위해 컨트롤러에서 작성한 메서드가 실행되며, 이 메서드를 핸들러 메서드라고 부릅니다.
핸들러 메서드는 클라이언트의 요청을 받아, 비즈니스 로직을 처리한 후 그 결과를 뷰(HTML)나 데이터(JSON, XML 등) 형태로 클라이언트에게 응답하는 역할을 합니다. 스프링 MVC에서는 컨트롤러 클래스의 메서드가 핸들러 메서드가 되며, 각 메서드는 특정 HTTP 요청에 매핑됩니다.
핸들러 메서드의 역할
- 요청 처리: 클라이언트가 서버로 보낸 HTTP 요청(GET, POST, PUT, DELETE 등)을 처리합니다.
- 데이터 처리: 요청 데이터를 기반으로 비즈니스 로직을 수행하고, 필요 시 데이터를 조회하거나 수정합니다.
- 응답 반환: 처리 결과를 뷰나 데이터(JSON, XML)로 변환하여 클라이언트에게 반환합니다.
핸들러 메서드의 구성 요소
- 요청 매핑: 핸들러 메서드는 특정 URL 경로 및 HTTP 메서드(GET, POST 등)에 매핑되어 요청을 처리합니다. 이를 위해
@RequestMapping
,@GetMapping
,@PostMapping
같은 애노테이션이 사용됩니다. - 매개변수(아규먼트): 핸들러 메서드는 요청 파라미터, URL 경로 변수, 요청 본문 등을 매개변수로 받아 처리합니다. 스프링 MVC는 다양한 방법으로 요청 데이터를 메서드 파라미터에 바인딩할 수 있습니다.
- 반환 값: 핸들러 메서드는 처리 후 뷰 이름(HTML 페이지) 또는 데이터(JSON, XML 등)를 반환합니다.
예시: 핸들러 메서드
아래는 스프링 MVC에서 @Controller
를 사용한 핸들러 메서드의 예시입니다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.ui.Model;
@Controller
public class GreetingController {
// GET 요청을 처리하는 핸들러 메서드
@GetMapping("/greet")
public String greet(@RequestParam String name, Model model) {
// 요청에서 name 파라미터를 받아 모델에 추가
model.addAttribute("name", name);
// 뷰 이름을 반환 (greet.html이 렌더링됨)
return "greeting";
}
}
핸들러 메서드의 주요 특징
- 애노테이션을 통한 매핑:
@RequestMapping
,@GetMapping
,@PostMapping
등의 애노테이션을 사용하여 특정 URL과 HTTP 메서드에 매핑됩니다.- 예를 들어,
/greet
경로에 대한 GET 요청을 처리하기 위해@GetMapping("/greet")
을 사용합니다.
- 매개변수 바인딩:
- 핸들러 메서드는 다양한 방식으로 요청 데이터를 매개변수로 받을 수 있습니다. 예를 들어, URL의 쿼리 스트링, 폼 데이터, 요청 본문, 쿠키, 헤더 등을 받을 수 있습니다.
@RequestParam
,@PathVariable
,@RequestBody
등의 애노테이션을 사용하여 매개변수에 데이터를 바인딩합니다.
- 반환 값:
- 핸들러 메서드는 뷰 이름을 반환하거나 JSON 등 데이터를 반환할 수 있습니다. 뷰 이름을 반환하면 뷰 리졸버(View Resolver)가 해당 뷰를 찾아 렌더링합니다.
@RestController
와 함께 사용하면 핸들러 메서드가 JSON 데이터를 바로 반환할 수 있습니다.
다양한 핸들러 메서드 예시
@RequestParam
을 사용한 쿼리 파라미터 처리:- 클라이언트 요청:
/users?name=John
name
파라미터가 메서드 매개변수로 전달됨.
- 클라이언트 요청:
@GetMapping("/users") public String getUser(@RequestParam String name, Model model) { model.addAttribute("name", name); return "userProfile"; }
@PathVariable
을 사용한 경로 변수 처리:- 클라이언트 요청:
/users/123
id
가123
으로 매핑되어 메서드에서 사용됨.
- 클라이언트 요청:
@GetMapping("/users/{id}") public String getUserById(@PathVariable Long id, Model model) { model.addAttribute("id", id); return "userProfile"; }
@PostMapping
을 사용한 폼 데이터 처리:@PostMapping("/users") public String createUser(@RequestParam String name, @RequestParam String email, Model model) { model.addAttribute("name", name); model.addAttribute("email", email); return "userProfile"; }
@RequestBody
를 사용한 JSON 요청 처리:- 클라이언트 요청 본문:
{ "name": "John Doe", "email": "john@example.com" }
- JSON 본문이
User
객체로 자동 변환되어 매개변수로 전달됨.
@PostMapping("/users") public String createUser(@RequestBody User user) { // 요청 본문에서 JSON 데이터를 User 객체로 매핑 return "User created: " + user.getName(); }
@RestController
와 함께 JSON 응답 반환:- 클라이언트가
/users/123
요청 시, JSON 형식으로 사용자 정보가 반환됩니다. - 응답 본문:
{ "id": 123, "name": "John Doe", "email": "john@example.com" }
- 클라이언트가
@RestController public class UserController { @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { return new User(id, "John Doe", "john@example.com"); } }
핸들러 메서드의 응답 방식
핸들러 메서드는 여러 방식으로 클라이언트에 응답할 수 있습니다.
- 뷰 이름 반환:
- 컨트롤러에서 문자열로 뷰 이름을 반환하면, 스프링은 해당 뷰를 찾아 렌더링합니다.
return "home"; // home.html 또는 home.jsp 파일이 렌더링됨
- 데이터(JSON, XML) 반환:
@RestController
를 사용하거나@ResponseBody
를 붙이면, 데이터를 바로 클라이언트에게 반환할 수 있습니다.
@GetMapping("/api/user") public User getUser() { return new User("John", "Doe"); }
- 리다이렉트:
- 다른 URL로 리다이렉트할 때는
redirect:
접두어를 사용합니다.
return "redirect:/login";
- 다른 URL로 리다이렉트할 때는
요약
- 핸들러 메서드는 스프링 MVC에서 클라이언트의 요청을 처리하는 메서드입니다.
- HTTP 요청(예: GET, POST 등)에 대한 처리를 수행하고, 그 결과를 뷰나 데이터로 응답합니다.
@RequestMapping
,@GetMapping
,@PostMapping
등의 애노테이션을 사용하여 URL과 HTTP 메서드에 매핑됩니다.- 다양한 방식으로 요청 데이터를 메서드 매개변수로 전달할 수 있으며, 처리 후 뷰 또는 데이터를 반환합니다.
핸들러 메서드는 컨트롤러의 핵심 기능을 담당하며, 클라이언트의 요청에 맞춰 비즈니스 로직을 수행하고 적절한 응답을 생성하는 중요한 역할을 합니다.
'Spring Study' 카테고리의 다른 글
Redirect(리다이렉트) (0) | 2024.10.10 |
---|---|
리플렉션 (1) | 2024.10.08 |
어노테이션 기반의 Spring 컨테이너 구성 (0) | 2024.09.04 |
Java Instrument API vs ASM(Abstract Syntax Manipulation) (0) | 2024.09.03 |
Mixin Pattern (자바에선 다중상속 허용X -> 믹스인디자인패턴으로 흉내) (0) | 2024.08.28 |