Spring MVC (어노테이션)

ikyeong·2023년 5월 20일
1

Spring-Study

목록 보기
5/9

01. @RequestParam

요청의 파라미터를 연결할 매개변수에 사용

//@RequestParam 어노테이션을 붙이지 않은 경우
@RequestMapping("/requestParam")
//public String main(@RequestParam(name="year", required=false) String year) { //아래와 같음 
public String main(String year) { // year의 값이 없어도 됨
	//http://localhost/ch2/requestParam -> year = null
    //http://localhost/ch2/requestParam?year -> year = ""
    ...
}

//@RequestParam만 붙인 경우
@RequestMapping("/requestParam")
//public String main(@RequestParam(name="year", required=true) String year) { //아래와 같음 
public String main(@RequesetParam String year) { // year가 필수적으로 있어야됨
	//http://localhost/ch2/requestParam -> 400 Bad Request!!
    //http://localhost/ch2/requestParam?year -> year = ""
    ...
}

//@RequestParam(required=false)
@RequestMapping("/requestParam")
public String main(@RequesetParam(required=false) int year) { 
	//http://localhost/ch2/requestParam -> 500 IllegalStateException 
    //null값이 들어오는데 그걸 int로 변환하지 못해 발생하는 서버 오류
    //http://localhost/ch2/requestParam?year -> 400 Bad Request 
    //year의 값을 정수로 변환이 불가능한 empty string으로 전달해 발생
    ...
}

//@RequesetParam(required=true)
@RequestMapping("/requestParam")
public String main(@RequesetParam(required=true) int year) { 
	//http://localhost/ch2/requestParam -> 400 Bad Request  
    //http://localhost/ch2/requestParam?year -> 400 Bad Request 
    ...
}

//@RequesetParam(required=false, defaultValue="1")
@RequestMapping("/requestParam")
public String main(@RequesetParam(required=false, defaultValue="1") int year) { 
	//http://localhost/ch2/requestParam -> year = 1  
    //http://localhost/ch2/requestParam?year -> year = 1
    ...
}

💡 컨트롤러 메서드의 매개변수가 기본형이라면 앞에 @RequestParam이 생략된 것


📌 예외처리

잘못된 요청이 들어왔을때 에러메세지를 그대로 띄우는건 적절치 못함 -> @ExceptionHandler 를 통해 처리

@ExceptionHandler(Exception.class)
public String catcher(Exception ex){
	return "yoilError";
}

📌 참조형 매개변수

public String main(int year, int month, int day, Model model)
public String main(MyDate date, Model model) 로 변환해 매개변수를 받아올 수 있다!

💡 해당 클래스 내에 멤버변수의 이름과 parameter의 이름이 일치해야되고 setter가 존재해야된다

setter를 통해 값을 저장되기 때문에 setter가 없다면 매개변수 저장 불가

💡 매개변수를 하나의 클래스에서 처리할 수 있어 매개변수가 추가되어도 코드를 바꿀 필요가 없다.


02. @ModelAttribute

적용 대상을 Model의 속성으로 자동 추가
반환 타입이나 메서드의 매개변수에 적용 가능

@RequestMapping("/getYoil")
//public String main(@ModelAttribute("myDate") MyDate date, Model m) { // 아래와 동일
public String main(@ModelAttribute MyDate date, Model m) {
	...
    char yoil = getYoil(date);
    
    //m.addAttribute("myDate",date); 어노테이션에 의해 이미 수행됨
    m.addAttribute("yoil",yoil);
   
    ...

💡 참조형 매개변수에서는 @ModelAttribute 어노테이션을 붙이지 않아도 자동적으로 attribute에 추가된다

컨트롤러 매개변수가 참조형이라면 앞에 @ModelAttribute가 생략된 것


03. @GetMapping, @PostMapping

Spring 4.3 이후 버전부터 사용 가능

//	@RequestMapping(value="/register/add", method=RequestMethod.GET)
	@GetMapping("/ergiser/add") //위와 동일
	public String register() {
		return "registerForm";
	}
    
//	@RequestMapping(value="register/save", method=RequestMethod.POST)
	@PostMapping("register/save") //위와 동일
	public String save() {
		return "registerInfo";
	}

💡 단순히 화면만 보여주는 GetMapping 메서드?

servlet-context.xml에 <view-controller path="..." view-name="..." /> 태그를 추가해 대체 가능 (GetMethod만 지원)


📌 클래스에 붙이는 @RequestMapping

한 클래스 내에서 매서드에 매핑되는 URL의 공통 부분을 @RequestMapping 으로 클래스에 적용

@Controller
@RequestMapping("/register") //공통 부분을 클래스에 어노테이션으로 적용
public class RegisterController {
	@GetMapping("/add") 
    public String register(){
    	...
    }
    @PostMapping("/add")
    public String save(User user, Model m) throws Exception{
    	...
    }
}

📌 @RequestMapping의 URL 패턴

종류URL pattern매핑 URL
exact mapping/login/hello.dohttp://localhost/ch2/login/hello.d
path mapping/login/*http://localhost/ch2/login/에 속한 모든 URL
extension mapping*.dodo 확장자로 모든 끝나는 경로

💡 ?는 한글자, *는 여러 글자, **는 하위 경로 포함

💡 @WebServlet의 URL 패턴과 비슷

0개의 댓글