본문 바로가기
카테고리 없음

Spring Controller 어노테이션과 파라미터 타입

by am6:00 2019. 9. 4.

@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

 

[Spring] Spring Annotation의 종류와 그 역할 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

2. 출처: https://ismydream.tistory.com/140 [창조적고찰]

 

@ResponseBody 이해하기

@ResponseBody 이해하기 메소드에 @ResponseBody 로 어노테이션이 되어 있다면 메소드에서 리턴되는 값은 View 를 통해서 출력되지 않고 HTTP Response Body 에 직접 쓰여지게 됩니다. 이때 쓰여지기 전에 리턴되..

ismydream.tistory.com