@Controller
컨트롤러 클래스에 @Controller 어노테이션을 작성합니다. 해당 어노테이션이 적용된 클래스는 "Controller"임을 나타나고, bean으로 등록되며 해당 클래스가 Controller로 사용됨을 Spring Framework에 알립니다.
@RequestMapping
해당 어노테이션이 선언된 클래스의 모든 메소드가 하나의 요청에 대한 처리를 할경우 사용한다. 예를들어, "/student" 요청에 대해 공통적으로 처리해야될 클래스라는 것을 의미합니다. 또한, 요청 url에 대해 해당 메소드에서 처리해야 되는 경우에도 사용됩니다. 이러한 @RequestMapping에 대한 모든 매핑 정보는 Spring에서 제공하는 HandlerMapping Class가 가지고 있습니다.
@Controller
@RequestMapping(path="/student")
public class StudentApiController {
@Autowired
private studentService studentService;
@GetMapping
public String getStudentInfo(@RequestParam int studentId, ModelMap model) {
Student studentInfo = studentService.getStudentInfoByStudentId(studentId);
model.addAttribute("studentInfo", studentInfo);
return "list";
}
}
@Controller 어노테이션을 통해 해당 클래스가 컨트롤러 클래스임을 spring framework에 전달하고, "/student" 라고 들어오는 공통 요청 url중 get 방식으로 들어오는 url을 처리하는 메소드가 선언되어있는 예제.
@RestController
@Controller + @ResponseBody 이며, 메소드의 return(반환 결과값)을 문자열(JSON) 형태로 반환합니다. view가 필요없는 API만 지원하는 클래스에 사용되며, json 이나 xml 과 같은 문자열의 return이 주목적입니다.
@ResponseBody
메소드에 @ResponseBody 로 어노테이션이 되어 있다면 메소드에서 리턴되는 값은 View 를 통해서 출력되지 않고 HTTP Response Body 에 직접 쓰여지게 됩니다. 이때 쓰여지기 전에 리턴되는 데이터 타입에 따라 MessageConverter 에서 변환이 이뤄진 후 쓰여지게 됩니다.
@RestController
@RequestMapping(path="/student")
public class StudentApiController {
@Autowired
private StudentService studentService;
@PostMapping
public Student saveStudentInfo(@RequestBody Student param) {
Student saveInfo = studentService.setStudentInfo(param);
return saveInfo;
}
}
@Controller 어노테이션이 아닌, @RestController 로 선언되어 리턴을 view 페이지 대신 saveInfo 라는 객체를 JSON 형태로 변환한 데이터를 반환합니다.
@Controller 와 @RestController 의 차이
@Controller | @RestController |
API와 View 리턴을 동시에 사용하는경우에 사용. API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환 |
view 가 필요없는 API 만 지원시 사용. @RestController = @Controller + @ResponseBody |
view 화면 return | data(json, xml 등) return |
Spring Controller 파라미터 타입
Spring에서 Controller로 받을 수 있는 파라미터들이 다양한 타입들이 존재하는데 어노테이션등으로 선언하면 자동으로 Spring이 그에 맞게 변환해줍니다.
@RequestParam
속성값
name | type | 설명 |
value | String | 파라미터 명 |
required | boolean | 파라미터가 필수값인지 여부. 기본값은 true |
HTTP GET 방식으로 전달되는 URL 의 parameter 값을 가져올때 사용되며, 변수 앞에 작성해주면 됩니다.
http://localhost:8080/student?studentId=1
이러한 URL을 받고, studentId의 값을 받고싶다면,
@GetMapping("/student")
public String getStudentId(@RequestParam("studentId") int id) {
return "list";
}
@RequestParam 어노테이션의 괄호 안의 문자열이 전달 인자 이름(실제 값을 표시) 하며, 해당 메소드에서 studentId의 값은 id라는 변수명으로 사용됨을 의미합니다.
@GetMapping("/student")
public String getStudentId(@RequestParam(name="studentId", required=false, defaultValue="0") int id) {
return "list";
}
RequestParam에 속성값을 위와 같이 설정하게되면, required=false로 인해 studentId값이 필수값이 아니게됩니다. 또한, studentId값이 넘어오지 않을 경우 defaultValue에 지정된 값인 0이 id값에 할당됩니다.
@PathVariable
PathVariable는 파라미터를 URL 경로에 포함시키는 방법이며, REST API에서 값을 호출할 때 주로 많이 사용합니다. 주로 uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용합니다.
http://localhost:8080/student/1
위와 같은 url로 요청이 들어올때,
@RestController
public class StudentController {
@GetMapping("/student/{studentId}")
public String hello(@PathVariable("studentId") int id) {
return "list";
}
}
{ }를 이용해 매핑되는 url 경로에 작성해주면 해당 @PathVariable 어노테이션이 작성된 파라미터에 자동으로 매핑됩니다.
@RequestBody
HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매칭하며, RequestData를 바로 Model이나 클래스로 매핑합니다. 이를테면 JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용합니다. 또한 이 어노테이션은 생략하면 안되는데 그 이유는 모델로 받는 것인지 Message(본문)으로 받는 것인지 알 수가 없어 모델로 간주해 실제로 ModelAttribute로 변환하려해 빈 모델이 담겨올수 있기 때문입니다. Rest API 컨트롤러에 자주 사용되는 어노테이션입니다.
@RestController
public class StudentController {
@PostMapping("/student")
public String hello(@RequestBody Student student) {
return "list";
}
}
HTTP POST 요청에의해 함께 넘어오는 Student JSON 값을 Student 객체 값으로 받을수 있습니다.
Map, Model, ModelMap
해당 클래스들은 요청으로 넘어온 파라미터를 받아 처리하는 것이 아닌, 모델 정보를 담는데 사용됩니다.
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/student")
public String getStudentId(@RequestParam("studentId") String id, ModelMap model) {
model.addAttribute("studentId", id);
return "list";
}
}
model객체에 "studentId"라는 값을 추가한후 list view 로 전달하여 사용할수있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>학생 ID : ${studentId}</h1>
</body>
</html>
출처
1. https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html
2. 출처: https://ismydream.tistory.com/140 [창조적고찰]