티스토리 뷰
Controller(Handler)
#Presentation Layer: 요청을 받고 응답하는 역할을 한다.
#DispatcherServlet의 설정파일(#WebMvcContextConfiguration)에서 @ComponentScan을 통해 빈으로 등록되었다.
Controller(Handler) 클래스 작성하기
클래스 위에 @Controller를 붙인다. #ComponentScan
매핑을 위해 클래스나 메소드 위에 @RequestMapping을 붙인다. #HandlerMapping
1
2
3
4
5
6
7
8
9
10
|
@Controller
public class myController {
@GetMapping("/success") // 1. /success URL 요청이 발생하면 success() 메소드 실행
public String success(ModelMap modelMap
/*2. success 메소드 실행 후 view에서 활용되는 데이터를 담고 있는 객체*/ ) {
modelMap.addAttribute("value1", value1);
return "success"; //3. view로 사용되는 jsp 파일 이름
}
}
|
cs |
line4: @RequestMapping
- Http요청과 이를 다루기 위한 Controller의 메소드를 연결하는 어노테이션
- HttpMethod
- 스프링 4.3 부터: @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
- @PostMapping("/success") = @RequestMapping(value = "/sucess", method = RequestMethod.POST)
- Http 특정 헤더와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, headers = "content-type=application/json") - Http Parameter 와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, params = "type=raw") - Content-Type Header 와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, consumes = "application/json") - Accept Header 와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, produces = "application/json")
https://galid1.tistory.com/556
Controller 파라미터 타입
1. 어노테이션 사용
2. 서블릿 API 직접 사용
1. 어노테이션 사용
@RequestParam
요청 파라미터를 가져오는 어노테이션
1
2
3
4
5
6
7
8
9
10
11
|
@Controller
public class SampleController {
@GetMapping("/sample")
public String sample(@RequestParam(name = "id", required = true) String id) {
System.out.println("id:" + id);
}
}
//요청
/sample?id=100
|
cs |
- 요청 파라미터가 없을 경우 400에러 발생
- required 속성을 이용해 필수여부 설정
- defaultValue 속성을 이용해 파라미터가 없을 경우 기본값 설정
<공통>
- @RequestParam(name = "사용자가 입력하는 parameter key값") 개발자가 원하는 매개변수 이름
- = @RequestParam("id") String id
- 둘이 동일하면 String id로 생략 가능
@PathVariable
파라미터를 URL 경로에 포함시키는 방법
/account?id=100 보다는 /account/100처럼 id를 url 경로에 포함시키면 더 좋은 url을 만들 수 있다.
1
2
3
4
5
6
7
8
9
10
11
|
@Controller
public class SampleController {
@GetMapping("/sample/{id}/{name}")
public void sample(@PathVariable int id, @PathVariable String name) {
System.out.println("id=" + id + ", name=" + name);
}
}
//요청
/sample/100/hoge
|
cs |
@ModelAttribute
RequestParam: 파라미터와 1:1 대응 / ModelAttribute: 도메인 모델, DTO 같은 모델을 받는 타입
1
2
3
4
5
6
7
8
|
@Controller
public class SampleController {
@GetMapping("/sample")
public String hello(@ModelAttribute Account account) {
System.out.println(account);
}
}
|
cs |
- 요청 파라미터가 많을 경우 모델로 받는게 가독성이나 코드효율 상 좋다.
- 어노테이션 생략되었을 경우, 원시타입(String, int, long)은 @RequestParam으로 판단, 객체타입은 @ModelAttribute로 판단한다.
@CookieValue
쿠키 정보를 가져오는 어노테이션
1
2
3
4
5
6
7
8
|
@Controller
public class SampleController {
@GetMapping("/sample")
public String hello(@CookieValue(value = "auth", defaultValue = "0") String auth) {
System.out.println("auth 쿠키:" + auth);
}
}
|
cs |
- 쿠키가 존재하지 않으면 500 에러 발생
- required 속성을 이용해 필수여부 설정
- defaultValue 속성을 이용해 기본값 설정
@RequestHeader
헤더 정보를 가져오는 어노테이션
1
2
3
4
5
6
7
8
|
@Controller
public class SampleController {
@GetMapping("/sample")
public String hello(@RequestHeader("host") String host) {
System.out.println("host:" + host);
}
}
|
cs |
- 헤더가 존재하지 않으면 500 에러 발생
- required 속성 값을 이용해 필수여부 설정
- defaultValue 속성 값을 이용해 기본 값 설정
@RequestBody
HTTP 요청 Body를 자바 객체로 전달받을 수 있다
1
2
3
4
5
6
7
8
|
@Controller
public class SampleController {
@PostMapping("/sample")
public String hello(@RequestBody Account account) {
return "hello";
}
}
|
cs |
https://devbox.tistory.com/entry/Spring-RequestBody-어노테이션과-ReponseBody-어노테이션의-사용
- 프론트엔드의 AJAX요청은 대부분 JSON으로 되어 있고, 이에 맞춰 백엔드에서도 JSON 형태로 응답을 해주는 방식을 취하게 된다.
- 스프링 MVC도 클라이언트에서 전송한 XML, JSON, 기타 데이터를 컨트롤러에서 DOM 객체나 자바 객체로 변환해서 받을 수있는 기능(수신) / 자바 객체를 XML이나 JSON 또는 기타 형식으로 변환해서 전송할 수 있는 기능(송신)을 제공하고 있다.
- 당연히 PostMapping을 사용해야 파라미터를 받을 수 있음
- 스프링 4.x 부터 @ResponseBody 대신 @RestController 사용 #RestController
https://snoopy81.tistory.com/306
2.서블릿 API 직접 사용
https://snoopy81.tistory.com/307
@RequestMapping 어노테이션이 적용된 메소드는 다섯 가지 타입의 파라미터를 전달받을 수 있음
- javax.servlet.http.HttpServletRequest / javax.servlet.ServletRequest
- javax.servlet.http.HttpServletResponse / javax.servlet.ServletResponse
- javax.servlet.http.HttpSession
기본적으로 스프링 MVC가 제공하는 어노테이션을 이용해 다양한 파라미터 정보에 접근할 수 있기 때문에 서블릿 API를 직접 사용하는 경우는 드물지만, 아래와 같은 경우 서블릿 API를 사용하는 것이 더 편함
- HttpSession의 생성을 직접 제어해야 하는 경우
- 컨트롤러에서 쿠키를 생성해야 하는 경우
- 서블릿 API 사용을 선호하는 경우
HttpServletRequest, HttpServletResponse
각각의 상위타입인 ServletRequest, ServletResponse를 사용해도 된다
1
2
3
4
5
6
7
8
9
|
@Controller
public class SampleController {
@GetMapping("/sample")
public String hello(HttpServletRequest request, HttpServletResponse response){
String path = request.getServicePath();
System.out.println(path);
}
}
|
cs |
WebRequest
HttpServletRequest의 요청정보를 거의 대부분 그대로 갖고 있는 API지만, Servlet과 의존성이 없다.
HttpSession
HttpServletRequest 에서 세션 관련한 것들만 있음
차이점: HttpServletRequest request → request.getSession() / HttpSession session → session
1
2
3
4
5
6
7
8
|
@Controller
public class SampleController {
@GetMapping("/sample")
public String hello(HttpSession session){
System.out.println("session: " + session);
}
}
|
cs |
MultipartRequest
파일 업로드 시 사용
하위 타입인 MultipartHttpServletRequest를 사용해도 된다.
1
2
3
4
5
6
7
8
9
|
@Controller
public class SampleController {
@PostMapping("/sample")
public String hello(MultipartRequest request){
String number = request.getParameter("number");
System.out.println("number: " + number);
}
}
|
cs |
https://devbox.tistory.com/entry/Spring-파일업로드-처리
https://www.edwith.org/boostcourse-web/lecture/16764/
http://wonwoo.ml/index.php/post/1834
https://sjh836.tistory.com/143
'JAVA > Spring' 카테고리의 다른 글
[Spring] RowMapper (0) | 2019.10.12 |
---|---|
[Spring] Connection Pool / Spring JDBC (0) | 2019.10.10 |
[Spring] [Config] WebMvcContextConfiguration (0) | 2019.10.08 |
[Spring] Spring MVC / Layered Architecture (0) | 2019.10.06 |
[Spring] [Config] DBConfig (0) | 2019.10.06 |