@RequestParam과 @ModelAttribute

SOLEE_DEV·2023년 2월 22일
0

Spring

목록 보기
1/8

1-1. @RequestParam

  • 요청의 파라미터를 연결할 매개변수에 붙이는 애너테이션 (파라미터 - 매개변수)
// pulbic String main2(@RequestParam(name="year" required=false String year) 아래와 동일
pulbic String main2(String year)
  • required가 true면 앞에 어노테이션 들어감!
// pulbic String main2(@RequestParam(name="year" required=true String year) 아래와 동일
pulbic String main2(@RequestParam String year) // 안넘어오면 클라이언트 잘못!
  • required가 false일 때 처리
    - 기본 값을 부여해줘야 함 (defaultValue로)
pulbic String main2(@RequestParam (required=false, defaultValue="1") String year) // 안넘어오면 클라이언트 잘못!
  • required가 true일 때 처리
    - 반드시 예외처리를 해주어야 함
pulbic String main2(@RequestParam (required=true) String year) // 안넘어오면 클라이언트 잘못!

1-2. @ExceptionHandler(Exception.class)

  • 괄호 안에 있는 예외가 발생했을 때 아래 핸들러가 호출이 됨
@ExceptionHandler(Exception.class)
public String catcher(Exception ex) {
	return "yoilError";
}

2. @ModelAttribute

  • 적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션
  • 반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능

1) 매개변수에 적용한 예제

@RequestMapping("/getYoilMVC5")
// public String main(@ModelAttribute ("myDate") MyDate date, Model M) {
public String main(@ModelAttribute MyDate date, Model m) { // 위와 동일!
	char yoil = getYoil(date);
    
    // m.addModelAttribute("myDate", date);
    // -> 이걸 안써줘도 Model에 자동 적재! (@ModelAttribute 어노테이션을 썼으니까!)
    // 첫번째 객체에 소문자로 된 key값으로 적재 "myDate"
   
    m.addModelAttribute("yoil", yoil);
    
    return "yoil";
}

2) 반환 타입에 적용한 예제

  • 함수의 호출 결과를 모델에 저장! (key : "yoil", value : return 값)
private @ModelAttribute("yoil") char getYoil(Mydate date) {
	return getYoil(date.getYear(), date.getMonth(), date.getDay());
}
  • 참조형 매개변수 앞에 ModelAttribute를 붙여서 표현할 수도 있지만 생략도 가능함!

3) 컨트롤러 매개변수에 붙을 수 있는 어노테이션

  • @RequestParam : type이 기본형 / String 일 때는 생략!
    ㄴ 기본형 / String일 때는 모델에 저장할 필요 x (param에서 꺼내쓰면 되니까!)
    ${param.파라미터명}
  • @ModelAttribute : type이 참조형일 때는 생략!

3. WebDataBinder

  • 컨트롤러의 메소드가 선언되어있을 때, 메소드를 호출했을시 메소드의 파라미터를
    참조형 객체의 타입에 맞게 1) 타입을 변환해주고 2) 데이터를 검증해주는 역할을 수행

  • 브라우저를 통해서 요청받은 값이 실제 객체에 바인딩될 때 중간 역할을 수행

  • 과정
    1) 타입 변환시, 결과&오류를 BindingResult에 저장
    2) 타입 변환 후, 데이터 검증 (Validation) 결과&오류를 BindingResult에 저장
    3) 바인딩 결과를 담아서 컨트롤러에 넘겨주어 컨트롤러가 결과값을 확인
    4) 이 때, BindingResult는 Binding할 객체의 바로 뒤에 와야 함
    ex) MyDate date, BindingResult result

	@ExceptionHandler(Exception.class)
	public String catcher(Exception ex, BindingResult result) {
		System.out.println("result : " + result);
		FieldError error = result.getFieldError();
		// method의 반환값이 field error임

		System.out.println("code : " + error.getCode());
		System.out.println("field : " + error.getField());
		System.out.println("message : " + error.getDefaultMessage());

		ex.printStackTrace();
		return "yoilError";
	}

4. 실습

  • 설정파일 경로 : src/main/WEB-INF/spring
    1) root-context.xml : non-web 관련 설정파일
    2) servlet-context.xml : web 관련 설정파일
  • ascii가 아닌 것들은 URL인코딩 된 값이 넘어가짐

5. JSTL 문법

  • <c:url>
    1) context root 자동 추가
    2) session id 자동 추가
  • action="<c:url value="/register/save"/>"
    => 이렇게 쓰면 컨택스트 루트 안써도 됨 ('/ch2/' 생략가능)

6. GetMapping / PostMapping

  • servlet-context.xml
    <view-controller path="/register/add" view-name="registerForm" />
  • jsp 페이지 - URL 간의 화면연결을 도움
  • 접두어 생략 가능한 경우 (MVC일 경우~)

1) @RequestMapping

  • @RequestMapping("/register")
  • 맵핑될 URL의 공통 부분을 @RequestMapping으로 클래스에 적용

2) @GetMapping

  • @GetMapping("/add")

3) @PostMapping

  • @PostMapping("/add")
  • 메소드가 다르면 충돌이 안남, 요청이 메소드로 구분되기 때문!

4) @RequestMappnig의 URL패턴

  • ?는 한 글자, *는 여러 글자, **는 하위 경로 포함
    ex) /login/* (경로 맵핑), *.do (확장자 맵핑)

7. URL인코딩 - 퍼센트 인코딩

  • URL에 포함된 non-ASCII문자를 문자 코드(16진수) 문자열로 변환
    -> 문자를 숫자로!
    ex)
    남궁성 URLEncoder.encode() -> "%EB%82%A8%"
  • URL인코딩 =/= Base64 : 6bit씩 끊어서 A-Z, a-z 문자들로 변환!
  • Base64 : 바이너리 데이터를 Text로 변환!
  • URL인코딩 : 브라우저가 자동으로 인코딩해서 서버가 받음
    -> 서버가 받은 URL을 디코딩해줌 (UTF-8)

8. doFilterInternel

  • in pom.xml
request.setCharacterEncoding(encoding);

filterChain.doFilter(request, response);
// -> DispatcherServlet으로 보내기 전에 전처리 작업
// 필터가 하는 일 : DS로 가기 전 응답 - 요청을 거치는 구간!
  • .m2 : repository 한꺼번에 날리고 리프레쉬! (메이븐 업데이트 / 꼬였을 때 이거 삭제하면 됨)
profile
Front-End Developer

0개의 댓글