티스토리 뷰

JAVA/Spring

[Spring] Controller(Handler)

stdbc 2019. 10. 9. 00:11

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 = trueString 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

http://www.devkuma.com/books/pages/470

https://elfinlas.github.io/2018/02/18/spring-parameter/

'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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함