@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]
- true 필수 : 필수입력의 파라미터 없으면 에러 발생 null (400 Bad Request)
- 생략 의미 동일 : 메서드명(타입 매개변수)
주의사항
필수 입력 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 로깅 설정
- 패키지 별로 로그 레벨 존재
- root 로거보다 낮은 우선순위(미만)이면 root 에 잘려 콘솔에 못감.Name Priority
OFF[see note] 0 FATAL 100 ERROR 200 WARN 300 INFO 400 DEBUG 500 TRACE 600 가장 자세한 로그 출력 ALL[see note] Integer.MAX_VALUE http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd>">
- <logger name="org.springframework.web"> <level value="trace" /> </logger>
- root 로거보다 낮은 우선순위(미만)이면 root 에 잘려 콘솔에 못감.Name Priority
코드 줄이기
URL과 매핑된 메서드의 입력 값이 많을 경우,
모두 매개변수에 나열하기 보다 새로운 클래스를 정의하여 객체 주소를 전달하면 코드 간결
[ 추가 실습 ]✅어떤? 객체의 인스턴스 변수값과 Map의 값을 연결해주는 작업 🟥 실습
https://github.com/castello/spring_basic/blob/main/ch2/SetterCall.java
톰캣이 사용자가 URL에 입력한 값을 자동으로 객체로 생성하는 원리
@ModelAttribute
@ModelAttribute
정의
- 애너테이션으로 지정한 변수를 model의 속성으로 자동 저장
적용 대상 -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 매개변수에 붙을 수 있는 애너테이션 ⭕암기 (추가 정리 예정
- @RequestParam 기본형 , String 인 매개변수일 때 생략
- model에 저장할 필요 X - view에서 바로 사용 가능 ${param.파라미터이름} ✅param
- @ModelAttribute 참조형 매개변수일 때 생략
- @RequestParam 참조형 불가 - 여러 값이 바인딩
[ 참고 ] Implicit Objects (The Java EE 5 Tutorial)
WebDataBinder
WebDataBinder
정의
- 브라우저를 통해 요청 받은 값이 실제 객체에 바인딩 될 때 중간 역할
기능 -2
- 타입 변환
- 데이터 검증 (Validation)
- 1≤ month ≤12 , 1 ≤ day ≤ 31
공통점 : 각 단계에서 Binding Result에 변환 결과 혹은 에러 저장
과정
- 쿼리 스트링 데이터가 컨트롤러 메서드의 매개변수에 전달을 위해 <name,value> Map 에 저장됨.
- 컨트롤러 메서드의 타입에 맞게 변환 후 value가 저장됨
- 타입 변환과 데이터 검증이 완료되면 Binding Result 에서 컨트롤러에 넘겨줌
- 컨트롤러가 작업 결과에 데이터 활용
주의 사항
- BindingResult 객체는 바인딩할 객체 뒤에 매개 변수 위치해야함.
→ 변환과 요청