Controller 란?
스프링 MVC에서 컨트롤러(Controller)는 웹 애플리케이션의 핵심 요소 중 하나로, 클라이언트로부터의 HTTP 요청을 처리하고 응답을 관리하는 구성 요소입니다. MVC(Model-View-Controller) 아키텍처의 일부로서, 컨트롤러는 사용자 인터페이스와 비즈니스 로직을 연결하는 중간자 역할을 수행합니다.
스프링 MVC 패턴에서 컨트롤러는 사용자의 요청을 받아 처리한 후 적절한 응답을 반환합니다. 스프링에서는 @Controller와 @RestController 어노테이션을 통해 이러한 컨트롤러를 정의합니다. @Controller는 전통적인 웹 페이지 기반의 컨트롤러를 정의하는 반면, @RestController는 RESTful 웹 서비스를 위한 JSON이나 XML 형태의 데이터를 반환하는 컨트롤러를 만듭니다.
Controller 의 역할
스프링 MVC 프레임워크에서 컨트롤러(Controller)는 HTTP 요청을 받고, 요청에 대한 처리 로직을 실행한 후 결과를 뷰에 전달합니다. 이 과정에서 컨트롤러는 요청 데이터를 파싱하고, 필요한 서비스나 컴포넌트를 호출하며, 데이터 모델을 조작할 수 있습니다. 적절한 뷰를 선택하고 뷰에 모델 데이터를 전달하는 것도 컨트롤러의 책임입니다.
- HTTP 요청 수신: 컨트롤러는 클라이언트로부터 오는 HTTP 요청을 받습니다. 각 요청은 URL, HTTP 메서드(예: GET, POST), 그리고 필요에 따라 요청 매개변수 또는 본문을 포함합니다.
- 요청 매핑: 스프링의 @RequestMapping 어노테이션 또는 그와 유사한 어노테이션(@GetMapping, @PostMapping 등)을 사용하여 특정 HTTP 요청을 컨트롤러의 특정 메서드에 매핑합니다. 이렇게 함으로써 어떤 URL과 HTTP 메서드가 어떤 메서드에 의해 처리되는지 정의합니다.
- 요청 파라미터 처리: 컨트롤러는 HTTP 요청의 파라미터를 추출하고, 이들을 메서드의 매개변수로 바인딩합니다. @RequestParam, @PathVariable, @RequestBody 등의 어노테이션을 사용하여 요청 데이터를 메서드의 매개변수에 매핑할 수 있습니다.
- 비즈니스 로직 실행: 요청을 처리한 후, 컨트롤러는 필요한 비즈니스 로직을 실행하기 위해 서비스 레이어나 비즈니스 로직을 호출합니다. 이는 데이터를 처리하고, 데이터베이스와 상호 작용하며, 필요한 계산이나 처리를 수행하는 데 사용됩니다.
- 모델 데이터 설정: 컨트롤러는 뷰에 전달할 데이터를 모델 객체에 설정합니다. 스프링은 컨트롤러에서 반환된 모델 객체를 뷰에 전달하여 사용자에게 최종 결과를 표시할 수 있게 합니다.
- 뷰 선택 및 응답 반환: 컨트롤러는 처리 결과를 표시할 뷰를 결정합니다. 이는 JSP, HTML, PDF, JSON 등 다양한 형태의 응답을 생성할 수 있습니다. RESTful API를 구축하는 경우, 컨트롤러는 보통 JSON이나 XML 형식의 데이터를 직접 HTTP 응답으로 반환합니다.
- 예외 처리: 컨트롤러 내에서 발생하는 예외는 @ExceptionHandler 어노테이션을 사용한 메서드로 처리할 수 있습니다. 이를 통해 예외 상황을 적절히 관리하고 사용자에게 의미 있는 응답을 제공할 수 있습니다.
Controller 주요 어노테이션
어노테이션 | 설명 |
---|---|
@Controller | 이 어노테이션은 클래스가 스프링 MVC의 컨트롤러 역할을 함을 나타냅니다. 이를 통해 클래스는 웹 요청을 처리하는 데 사용될 수 있으며, 일반적으로 뷰를 반환합니다. |
@RestController | @Controller와 @ResponseBody의 조합으로, 클래스가 RESTful 웹 서비스의 컨트롤러임을 나타냅니다. 이 어노테이션을 사용하면 메서드에서 반환하는 데이터가 바로 응답 본문으로 사용됩니다. |
@RequestMapping | 특정 HTTP 요청(URL, HTTP 메서드)을 클래스 또는 메서드에 매핑합니다. 이를 통해 해당 요청이 매핑된 메서드에 의해 처리됩니다. |
@GetMapping | @RequestMapping의 특수 형태로, GET 요청을 처리하기 위해 사용됩니다. 보다 간결한 구문으로 GET 요청에 응답하는 메서드를 지정합니다. |
@PostMapping | @RequestMapping의 특수 형태로, POST 요청을 처리하기 위해 사용됩니다. 주로 데이터를 제출할 때 사용됩니다. |
@PutMapping | @RequestMapping의 특수 형태로, PUT 요청을 처리합니다. 주로 데이터를 업데이트할 때 사용됩니다. |
@DeleteMapping | @RequestMapping의 특수 형태로, DELETE 요청을 처리합니다. 리소스를 삭제할 때 주로 사용됩니다. |
@PathVariable | 메서드 매개변수를 URL 경로의 일부로 사용하도록 합니다. 동적인 URL 경로에서 데이터를 캡처하는 데 유용합니다. |
@RequestParam | 요청 파라미터를 메서드의 매개변수로 바인딩합니다. 주로 쿼리 매개변수 또는 폼 데이터를 처리할 때 사용됩니다. |
@RequestBody | HTTP 요청의 본문을 Java 객체로 매핑합니다. 주로 POST 또는 PUT 요청에서 JSON 또는 XML 데이터를 받을 때 사용됩니다. |
@ResponseBody | 메서드에서 반환되는 객체를 HTTP 응답 본문으로 직접 매핑합니다. 주로 JSON 또는 XML 형식의 데이터를 반환할 때 사용됩니다. |
@RequestHeader | HTTP 요청 헤더를 메소드의 파라미터로 바인딩합니다. 특정 헤더 정보를 필요로 할 때 사용합니다. |
@ModelAttribute | 요청 파라미터를 객체로 바인딩합니다. 주로 POST 요청에서 폼 데이터를 객체로 매핑할 때 사용됩니다. |
@SessionAttributes | 모델 속성을 HTTP 세션에 저장합니다. 여러 요청에 걸쳐 모델 속성을 유지해야 할 때 사용합니다. |
@CookieValue | 요청에 포함된 쿠키 값을 메소드의 파라미터로 바인딩합니다. 쿠키 데이터를 읽을 때 사용합니다. |
@ExceptionHandler | 컨트롤러 내에서 발생하는 예외를 처리합니다. 특정 예외 유형에 대한 처리 로직을 정의할 때 사용됩니다. |
Controller 작성 예시
스프링 MVC에서 컨트롤러를 작성하는 방법에 대해 설명하겠습니다. 스프링 MVC는 Model-View-Controller 아키텍처를 기반으로 하는 웹 프레임워크입니다. 여기서 컨트롤러는 웹 요청을 받아 처리하고, 결과를 뷰에 전달하는 역할을 합니다.
스프링 MVC 컨트롤러 생성
클래스에 @Controller 어노테이션 추가: 클래스를 스프링의 컨트롤러로 정의합니다.
@Controller
public class MyController {
// 메소드 정의
}
Java핸들러 메소드 정의: 각 웹 요청을 처리할 메소드를 정의합니다. 이 메소드들은 일반적으로 @RequestMapping 또는 그와 유사한 어노테이션(@GetMapping, @PostMapping 등)을 사용하여 특정 HTTP 요청에 매핑됩니다.
@GetMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", "Hello from Spring MVC");
return "hello"; // 뷰 이름 반환
}
Java요청 매핑
- URI와 메소드 연결: @RequestMapping을 사용하여 URI와 메소드를 연결합니다. @GetMapping, @PostMapping 등은 @RequestMapping의 특화된 형태입니다.
- 경로 변수 사용: @PathVariable을 사용하여 URL의 일부를 메소드 파라미터로 추출할 수 있습니다.
- 요청 파라미터 접근: @RequestParam으로 요청 파라미터에 접근할 수 있습니다.
데이터 전달 및 뷰 렌더링
- 모델을 통한 데이터 전달: 메소드의 파라미터로 Model을 사용하여 뷰에 데이터를 전달합니다.
- 뷰 선택: 메소드가 반환하는 문자열은 보통 뷰의 이름을 나타냅니다. 스프링은 이 이름을 사용해 뷰를 찾고 렌더링합니다.
폼 데이터 처리
- 폼 제출 처리: @PostMapping을 사용하여 폼 제출을 처리할 수 있습니다.
- 데이터 바인딩: @ModelAttribute를 사용하여 요청 파라미터를 객체에 바인딩할 수 있습니다.
예외 처리
- 예외 핸들링: @ExceptionHandler를 사용하여 컨트롤러 내의 특정 예외를 처리할 수 있습니다.
예시 코드
@Controller
public class MyController {
@GetMapping("/greeting")
public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting"; // 뷰 이름
}
@PostMapping("/submitForm")
public String submitForm(@ModelAttribute UserForm userForm, Model model) {
// 폼 데이터 처리
model.addAttribute("user", userForm);
return "formResult";
}
@ExceptionHandler(Exception.class)
public String handleException() {
// 예외 처리 로직
return "error";
}
}
Java이렇게 스프링 MVC에서 컨트롤러를 작성하면, HTTP 요청을 효과적으로 처리하고 응답을 구성할 수 있습니다. 실제 사용 시에는 프로젝트의 요구 사항과 구조에 따라 약간의 변형이 필요할 수 있습니다.
결론
스프링 MVC에서 컨트롤러(Controller)는 웹 애플리케이션의 중추적인 구성 요소로서, 클라이언트로부터의 HTTP 요청을 받아 해당 요청에 맞는 비즈니스 로직을 수행하고, 그 결과를 뷰에 전달하는 역할을 수행합니다. 이 과정에서 컨트롤러는 요청 매핑, 요청 파라미터 처리, 모델 데이터 설정, 뷰 선택 및 응답 반환, 그리고 예외 처리와 같은 다양한 작업을 합니다.
스프링 프레임워크는 @Controller와 @RestController 어노테이션을 통해 다양한 유형의 컨트롤러를 지원합니다. @Controller는 주로 뷰를 반환하는 웹 페이지 기반 컨트롤러를 정의하는 데 사용되고, @RestController는 RESTful API를 구축하는 데 적합하며 주로 JSON이나 XML 같은 데이터 형식을 HTTP 응답으로 직접 반환합니다.
컨트롤러의 핵심 작업은 다음과 같습니다.
- HTTP 요청 수신 및 매핑: URL과 HTTP 메소드에 기반한 요청을 적절한 메소드에 매핑합니다.
- 요청 파라미터 처리: @RequestParam, @PathVariable, @RequestBody 등을 사용하여 요청 데이터를 처리합니다.
- 비즈니스 로직 실행: 필요한 서비스나 컴포넌트를 호출하여 비즈니스 로직을 수행합니다.
- 모델 데이터 설정 및 뷰 반환: 처리 결과를 모델 객체에 설정하고, 적절한 뷰를 선택하여 응답을 반환합니다.
- 예외 처리: @ExceptionHandler를 사용하여 예외 상황을 적절히 관리합니다.
스프링 MVC의 컨트롤러를 효과적으로 사용하면, 웹 애플리케이션의 요청 처리와 응답 구성을 유연하고 효율적으로 관리할 수 있습니다.