@Controller
해당 Class가 Controller임을 명시하기 위해 사용한다. Class 앞에 적는다.
@Controller // 1. 원격 호출가능한 프로그램으로 등록
public class Hello {
@RequestMapping("/hello") //2. URL와 메서드를 연결
public void main() {
System.out.println("Hello");
}
}
@RequestMapping
호출한 URI와 어노테이션의 값이 일치하면 해당 클래스나 메서드를 호출한다.
Class에 사용할 수도 있고, 메서드에 사용할 수도 있다. Get, Post 요청을 모두 처리하며, 병렬의 형태로 명시하여 여러 개의 요청을 받게 할 수도 있다.
@Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping(value = {"/login", "/login2"}) // /login/login & /login/login2 요청 시 호출
public String loginForm(){
return "loginForm";
}
@RequestMapping("/logout") // /login/logout 요청 시 호출
public String logout(HttpSession session){
//세션 종료 및 홈으로 이동
session.invalidate();
return "redirect:/";
}
}
@GetMapping
Get 방식의 요청만 처리할 수 있게 하는 어노테이션이다.
@Controller
public class RegisterController {
@GetMapping("/register/add")
public String register() {
return "registerForm";
}
}
@PostMapping
Post 방식의 요청만 처리할 수 있게 하는 어노테이션이다.
@Controller
public class RegisterController {
//@RequestMapping(value="/register/save", method=RequestMethod.POST)
@PostMapping("/register/save")
public String save(User user, Model m) throws UnsupportedEncodingException {
if(!isValid(user)) {
String msg = URLEncoder.encode("id를 잘못 입력하셨습니다.","utf-8");
return "forward:/register/add?msg="+msg;
}
return "registerInfo";
}
}
@RequestParam
요청의 파라미터를 연결할 매개변수에 붙이는 어노테이션이다.
required는 필수 입력 여부를 지정한다. 필수입력인 파라미터에 값을 넘기지 않으면 400번대 클라이언트 에러가 발생한다.
필수 입력이 아닌 경우에는 defaultValue 기본값을 주는 것이 500번대 서버 에러 발생을 예방할 수 있다.
@Controller
public class RequestParamTest {
@RequestMapping("/requestParam1")
public String main2(@RequestParam(name="year", required=false, defaultValue="1") String year) {
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
@RequestMapping("/requestParam2")
// public String main2(@RequestParam(name="year", required=false) String year) { // 아래와 동일
public String main2(String year) {
// http://localhost/ch2/requestParam2 ---->> year=null
// http://localhost/ch2/requestParam2?year ---->> year=""
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
@RequestMapping("/requestParam3")
// public String main3(@RequestParam(name="year", required=true) String year) { // 아래와 동일
public String main3(@RequestParam String year) {
// http://localhost/ch2/requestParam3 ---->> year=null 400 Bad Request. required=true라서
// http://localhost/ch2/requestParam3?year ---->> year=""
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
}
@ModelAttribute
적용 대상을 Medel의 속성으로 자동 추가 해주는 어노테이션이다.
반환 타입 또는 컨트롤러 메서드의 매개변수에 적용이 가능하다. 매개변수에 적용 시 key 값을 생략하면 해당 매개변수 명의 첫 글자를 소문자로 바꿔서 key값으로 사용한다.
@Controller
public class YoilTellerMVC6 {
@RequestMapping("/getYoilMVC5")
// public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
public String main(@ModelAttribute("myDate") MyDate date, Model model) throws IOException {
if(!isValid(date))
return "yoilError";
return "yoil";
//view 이름은 반환하지 않으면 mapping값에따라 view를 결정한다.
}
private boolean isValid(MyDate date) {
// TODO Auto-generated method stub
return isValid(date.getYear(), date.getMonth(), date.getDay());
}
private @ModelAttribute("yoil") char getYoil(MyDate date) {
// TODO Auto-generated method stub
return getYoil(date.getYear(), date.getMonth(), date.getDay());
}
}
@CookieValue
쿠키를 매개변수로 전달 받을 수 있게 하는 어노테이션이다.
@Controller
@RequestMapping("/login")
public class LoginController {
@PostMapping("/login")
public String login(@CookieValue("id") String cookieId, String id, String pwd, String toURL, boolean rememeberId, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException{
toURL = toURL == null || toURL.equals("") ? "/" : toURL;
return "redirect:"+toURL;
}
}
@ExceptionHandler
@Controller가 적용된 해당 클래스의 내에서 발생하는 예외를 처리해주는 기능을 한다. catch블록의 역할을 한다고 생각하면 된다.
@Controller
public class ExceptionController {
@ExceptionHandler(Exception.class) //catch 블럭의 역할
public String catcher2(Exception ex){
m.addAttribute("ex",ex);
return "error";
}
@RequestMapping("/ex")
public String main() throws Exception{
throw new Exception("예외가 발생했습니다.");
}
}
@ControllerAdvice
@Controller가 적용된 모든 곳에서의 예외를 처리하는 기능을 한다.
@ControllerAdvice
public class GlobalCatcher {
@ExceptionHandler(NullPointerException.class)
public String catcher2(Exception ex, Model m){
m.addAttribute("ex",ex);
return "error";
}
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, Model m){
m.addAttribute("ex",ex);
return "error";
}
}
@ResponseStatus
http 응답 상태 코드를 지정할 수있는 어노테이션이다. 에러 처리를 한 경우 http 응답 코드는 200을 반환하겠지만, 아래처럼 @ResponseStatus으로 응답 상태를 변경하면 해당 응답 코드를 반환한다.
@Controller
public class ExceptionController {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String catcher2(Exception ex){
return "error";
}
@RequestMapping("/ex")
public String main() throws Exception{
throw new Exception("예외가 발생했습니다.");
}
}
@InitBinder
해당 Controller로 들어오는 요청에 대해 추가적인 데이터 변환을 할 때 사용한다.
데이터 변환을 할 매개변수 바로 뒤에 BindingResult를 추가하여 @InitBinder를 실행하도록 설정한다.
해당 Controller 내에서만 사용이 가능하고, 데이터 타입으로 지정하거나, 타입 및 필드 이름으로 지정이 가능하다.
@Controller
public class RegisterController {
@InitBinder
public void toDate(WebDataBinder binder) {
SimpleDateFormat df = new SimpleDateFormat("yyyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(df, false)); //타입으로 지정
binder.registerCustomEditor(String[].class, "hobby", new StringArrayPropertyEditor("#")); //타입과 이름으로 지정
}
@PostMapping("/register/save")
public String save(User user, BindingResult result, Model m) throws UnsupportedEncodingException {
return "registerInfo";
}
}
@DateTimeFormat
날짜 타입을 직렬화하는 어노테이션이다.
매개변수를 받을때 @InitBinder를 사용하지 않고 간단하게 날짜 포맷을 변환할 때 사용한다.
public class User {
private String id;
private String pwd;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;
}
'WEB > spring' 카테고리의 다른 글
[Spring] @Transactional (0) | 2022.06.22 |
---|---|
[Spring] Controller, Service, DAO, DTO (0) | 2022.06.21 |
[Spring] AOP 개념 및 라이브러리 설치 (0) | 2022.06.17 |
[Spring] DI, 어노테이션 정리 (0) | 2022.06.16 |
[Spring] validate - 데이터 유효성 검증 (0) | 2022.05.26 |
댓글