컨트롤러 (Controller)
스프링 프레임워크에서 컨트롤러(Controller)는 웹 애플리케이션에서 사용자의 요청을 처리한다.
비즈니스 로직을 수행한 후, 적절한 응답을 생성하는 역할을 담당하는 구성 요소이다.
스프링 프레임워크에서 컨트롤러의 역할은 다음과 같다.
- 요청 처리: 사용자가 브라우저를 통해 보낸 요청을 받아들이고, 해당 요청을 처리할 메서드를 결정한다.
- 비즈니스 로직 실행: 필요한 경우 서비스 계층(Service Layer)과 협력하여 비즈니스 로직을 수행한다.
- 모델 데이터 준비: 요청을 처리하는 동안 생성되거나 조회된 데이터를 모델 객체에 담아 전달한다.
- 뷰 선택 및 반환: 요청 처리 결과를 사용자가 볼 수 있는 형식(HTML, JSON 등)으로 변환하여 반환한다.
Controller 구현
스프링에서 컨트롤러는 일반적으로 @Controller 또는 @RestController 어노테이션을 사용하여 클래스에 정의된다.
@Controller | 주로 HTML 뷰를 반환하는 컨트롤러를 정의할 때 사용된다. |
뷰 리졸버를 통해 JSP와 같은 뷰 템플릿 엔진을 사용하여 응답을 생성한다. | |
@RestController | JSON, XML 등의 데이터 형식으로 직접 응답을 반환할 때 사용된다. |
@Controller와 달리 @ResponseBody 어노테이션이 자동으로 적용된다. |
Controller 주요 어노테이션
컨트롤러에서 자주 사용하는 어노테이션은 다음과 같다.
@Controller | 스프링 프레임워크에서 이 클래스를 컨트롤러로 사용하겠다고 선언 |
@Slf4j | 로깅 라이브러리인 SLF4J를 사용하겠다고 선언 > log 객체 사용하여 로그 출력 가능 |
@GetMapping | HTTP GET 요청을 통해 특정 메서드에 매핑 |
@PostMapping | HTTP POST 요청을 통해 특정 메서드에 매핑 |
@RequestMapping | HTTP GET 또는 POST 요청을 통해 특정 메서드에 매핑 |
@RequestParam | 요청 파라미터를 메서드 파라미터로 바인딩 |
@ RequestMapping
@Controller 어노테이션은 추가 속성을 지정할 수 없지만, @RequestMapping은 몇 가지 속성을 추가할 수 있다.
// SampleController.java
// 현재 클래스의 모든 메서드들의 기본적인 URL 경로로 설정
// 예를 들어 '/sample/aaa', '/sample/bbb' 같은 URL은 모두 SampleController에서 처리
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleControler {
// @RequestMapping 어노테이션은 클래스 선언과 메서드 선언에 사용 가능
@RequestMapping("")
public void basic() {
log.info("basic ...");
}
// GET, POST 방식 모두 지원해야 하는 경우 배열로 처리해서 지정
@RequestMapping(value = "/basic", method = {RequestMethod.GET, RequestMethod.POST})
public void basicGet() {
log.info("basic get ...");
}
}
@ RequestParam
컨트롤러를 작성할 때 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능이다.
이 기능을 이용하면 매번 request.getParameter()을 이용하는 불편함을 없앨 수 있다.
@RequestParam은 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우 유용하게 사용된다.
// SampleDTO.java
// @Data 어노테이션을 이용하면 getter/setter, equals(), toString() 등의 메서드 자동 생성
@Data
public class SampleDTO {
private String name;
private int age;
}
// SampleController.java
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
...
// SampleDTO를 파라미터로 ㅏ용하게 되면 자동으로 setter 메서드 동작하면서 파라미터 수집
// '/sample/ex01?name=AAA&age=10'과 같은 형태로 호출 가능
@GetMapping("/ex01")
public String ex01(SampleDTO dte) {
log.info("" + dto);
return "ex01";
}
@GetMapping("/ex02")
public String ex02(@RequestParam("name") String name, @RequestParam("age") int age) {
log.info("name : " + name);
log.info("age : " + age);
return "ex02";
}
// 동일한 이름의 파라미터가 여러 개 전달되는 경우 ArrayList<> 등을 이용해서 처리 가능
@GetMapping("/ex02List")
public String ex02List(@RequestParam("ids")ArrayList<String> ids) {
log.info("ids : " + ids);
return "ex02List";
}
// 배열도 동일하게 처리 가능
@GetMapping("/ex02Array")
public String ex02Array(@RequestParam("ids") String[] ids) {
log.info("array ids : " + Arrays.toString(ids);
return "ex02Array";
}
}
Model
컨트롤러의 메서드를 작성할 때는 Model 이라는 타입을 파라미터로 지정할 수 있다.
Model 객체를 이용해서 JSP와 같은 뷰로 전달해야 하는 데이터를 담아서 보낼 수 있다.
메서드의 파라미터를 Model 타입으로 선언하게 되면 자동으로 스프링 MVC에서 Model 타입의 객체가 생성된다.
때문에 개발자 입장에서는 필요한 데이터를 담아 주는 작업만으로 모든 작업이 완료된다.
Model 객체는 주로 컨트롤러에 전달된 데이터를 이용해서 추가적인 데이터를 가져와야 하는 상황에서 사용된다.
Controller 리턴 타입
Controller 메서드가 사용할 수 있는 리턴 타입은 주로 다음과 같다.
String | 반환된 문자열은 뷰의 이름으로 해석 |
void | 명시적으로 뷰 이름을 지정하지 않고 URL 패턴을 뷰 이름으로 사용 |
객체 (VO, DTO) | 객체를 리턴하는 경우, JSON이나 XML 형식으로 자동 변환 |
ResponseEntity | HTTP 응답의 상태 코드, 헤더, 바디 모두 제어 가능 |
Model, ModelAndView | 모델과 뷰를 함께 반환 |
// String 타입
// 'welcome'이라는 문자열을 반환하고, 스프링은 이를 뷰의 이름으로 사용하여 'welcome.jsp' 뷰 템플릿 렌더링
@GetMapping("/returnString")
public String returnString(Model model) {
model.addAttribute("message", "Welcome to Spring MVC");
return "welcome";
}
// void 타입
// 요청 매핑 경로인 'returnVoid'를 사용하여 'returnVoid' 렌더링
@GetMapping("/returnVoid")
public void returnVoid() {
model.addAttribute("message", "Welcome to Spring MVC");
}
// 객체 타입
// SampleDTO 객체를 리턴하면 메시지 컨버터를 사용하여 JSON 형식으로 변환 {"name":"홍길동", "age":10}
@GetMapping("/returnEntity")
public @responseBody SampleDTO returnEntity() {
SampleDTO dto = new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto
}
// ResponseEntity 타입
// ResponseEntity.ok() 메서드를 통해 HTTP 200 상태 코드와 응답 바디로 'Sample Data' 반환
@GetMapping("/returnResponseEntity")
public ResponseEntity<String> returnResponseEntity() {
return ResponseEntity.ok("Sample Data");
}
// ModelAndView 타입
// 반환된 ModelAndView 객체를 사용하여 지정된 뷰를 렌더링하고, 모델 데이터를 함께 전달
@GetMapping("/returnModelAndView")
public ModelAndView returnModelAndView() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewNAme("greeting"); // 뷰 이름 설정
modelAndView.addObject("message", "Hello"); // 모델 데이터 추가
return modelAndView;
}
'Framework > Spring' 카테고리의 다른 글
[Spring] 11. 스프링(Spring) MVC 어노테이션 (0) | 2024.09.03 |
---|---|
[Spring] 10. 스프링(Spring) 실습 Ⅰ (0) | 2024.09.03 |
[Spring] 08. 빈(Bean) 설정하기 (0) | 2024.09.02 |
[Spring] 07. 스프링(Spring) MVC2 (1) | 2024.08.28 |
[Spring] 06. 스프링(Spring) MVC (0) | 2024.08.21 |