Web/Spring

[Spring] Ch02.Spring MVC (17) @RequestParam과 @ModelAttribute

OptimizerStart 2025. 6. 1. 16:58

[Spring] Ch02.Spring MVC (17) @RequestParam과 @ModelAttribute

 

@RequestParam

 

@RequestParam

 

정의

  • 서버에 요청할 파라미터를 매개변수에 붙여 연결해주는 애너테이션

표현

메서드명(@RequestParam(name=”변수명” required=bool값) 타입 매개변수명)
  • required 매개변수 필수 입력 여부
    • 필요할 때 명시적으로 작성
    • URL에 매개변수명 작성 O & 값 작성 X : “” 빈문자열 저장
    • URL에 매개변수명 작성 X ⭕ 비교
      • true 필수 : 필수입력의 파라미터 없으면 에러 발생 null (400 Bad Request)
        • 예외처리 해야함 (사용자의 올바른 값 입력 유도)
         Required request parameter 'year' for method parameter type String is not present
        
      • false 선택 : null 저장 → 에러 발생 시 서버 책임 (500 서버 에러 )
        • defaultValue 줘야함
        // 필수 400 BadRequest , 선택 에러 X
        <http://localhost:8080/ch2/requestParam2>  // ?year=null 값 전달 
        // 정상
        <http://localhost:8080/ch2/requestParam2?year> // ?year="" 빈 문자열 전달
        
        • 필수 입력이 아니기 때문. null 들어오면 int 형변환 불가능
        • 기본 값을 줘야함 defaultValue= “값”
        • 기본값 설정 & 사용자 입력 없는 경우 (null)
          • 브라우저 출력 null, 서버 콘솔 defaultValue (”2025”)값 출력
          public String main8(@RequestParam(required=false, defaultValue ="2025") int year) 
          // /ch2/requestParam8 -- [Wed May 28 12:39:30 KST 2025]year=[2025]
          // /ch2/requestParam8?year -- [Wed May 28 12:39:30 KST 2025]year=[2025]
          
  • 생략 의미 동일 : 메서드명(타입 매개변수)

주의사항

필수 입력 X 경우 → 기본값 기록

  • null을 전달 받은 경우
    • 서버가 필수입력 지정 안했으므로 전달받은 값이 null 일떄, 형변환 에러는 → 서버 에러 ✅
  • “” 빈 문자열 전달 받은 경우
    • 클라이언트가 제공한 값으로 인식 에러 발생 시 → 클라이언트 책임

특징

  • 애너테이션 생략 가능
  • 매개변수 이름과 URL의 쿼리 스트링의 name이 동일하면 자동 매핑됨. 단 required=false가 되며, defaultValue는 지정되지 않음.
  • 제어가 필요(required, defaultValue)한 매개변수마다 애너테이션 붙여야함.
  • 필수 입력을 지정했을 때 발생하는 에러는 클라이언트 책임 (4XX)

*@ExceptionHandler*(Exception.class)

괄호안 예외가 발생했을 때, 아래 메서드 호출하고 cathcer 메서드가 예외 처리.

@ExceptionHandler(Exception.class) // 괄호안 예외가 발생했을 때, 아래 메서드 호출
public String catcher(Exception ex) {
	return "yoilError";
}

예외가 발생해도 console에 예외 정보가 출력 안되는 경우

/src/main/resources/lo4j.xml 로깅 설정

 

 

 

 

코드 줄이기

URL과 매핑된 메서드의 입력 값이 많을 경우,

모두 매개변수에 나열하기 보다 새로운 클래스를 정의하여 객체 주소를 전달하면 코드 간결

 

[ 추가 실습 ]✅어떤? 객체의 인스턴스 변수값과 Map의 값을 연결해주는 작업 🟥 실습 

https://github.com/castello/spring_basic/blob/main/ch2/SetterCall.java

톰캣이 사용자가 URL에 입력한 값을 자동으로 객체로 생성하는 원리

 

 

@ModelAttribute

@ModelAttribute

정의

  • 애너테이션으로 지정한 변수를 model의 속성으로 자동 저장

적용 대상 -2

  1. 컨트롤러 메서드 매개변수
  2. 메서드 반환타입

표현

1. 매개변수 @ModelAttribute(”key이름”)

  • key이름 생략 시, key이름 = 타입의 첫글자를 소문자로 한 것

ex. model.addAttribute(”key”, value) 코드 제거 

public String main(@ModelAttribute MyDate date, Model m) {..}

2. 반환타입 @ModelAttribute(”key이름”) 반환타입 메서드명

  • 메서드의 호출 결과를 model에 value로 저장
  • key이름 필수

ex. char yoil = getYoil(date); 코드 제거

private @ModelAttribute("yoil") char getYoil(Mydate date) {...}

 

원리

  • @ModelAttribute 가 붙은 컨트롤러 메서드를 호출하고 model 객체에 key, value 저장.

특징

  • 참조형 매개변수는 @ModelAttribute 생략 가능

장점

  • 코드 제거 (호출, 저장)

 

Controller 매개변수에 붙을 수 있는 애너테이션 ⭕암기 (추가 정리  예정

  1. @RequestParam 기본형 , String 인 매개변수일 때 생략
    1. model에 저장할 필요 X - view에서 바로 사용 가능 ${param.파라미터이름} ✅param
  2. @ModelAttribute 참조형 매개변수일 때 생략
    1. @RequestParam 참조형 불가 - 여러 값이 바인딩

[ 참고 ] Implicit Objects (The Java EE 5 Tutorial)

 

WebDataBinder

WebDataBinder

정의

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

기능 -2

  1. 타입 변환
  2. 데이터 검증 (Validation)
    • 1≤ month ≤12 , 1 ≤ day ≤ 31

공통점 : 각 단계에서 Binding Result에 변환 결과 혹은 에러 저장

 

과정

  • 쿼리 스트링 데이터가 컨트롤러 메서드의 매개변수에 전달을 위해 <name,value> Map 에 저장됨.
  • 컨트롤러 메서드의 타입에 맞게 변환 후 value가 저장됨
  • 타입 변환과 데이터 검증이 완료되면 Binding Result 에서 컨트롤러에 넘겨줌
  • 컨트롤러가 작업 결과에 데이터 활용

주의 사항

  • BindingResult 객체는 바인딩할 객체 뒤에 매개 변수 위치해야함.

→ 변환과 요청

    •