: 현재 클래스의 모든 메서드들의 기본적인 URL경로를 지정해준다.
: 클래스 선언과 메서드선언 둘 다 가능하다.
: @Controller는 추가적인 속성을 지정할 수 없지만, @RequestMapping은 속성을 지정할 수 있다.
: method 속성을 지정하여, POST, GET방식을 구분해서 사용할 수 있다.
: GET방식을 이용할 땐, 주소창에 '?name=aaa&age=10'과 같은 형태로 입력을 할 수 있다.
@RequestMapping(value="/basic", method= {RequestMethod.GET, RequestMethod.POST})
public void basicGet() { // get, post 방식 둘 다 지원가능
log.info("basic get.................");
}
: Controller의 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능이 있다.
: 이 기능을 위해 DTO 클래스를 만들어 이용한다.
: Lombok의 @Date 기능을 사용하면 getter/setter을 만들지 않아도 자동으로 처리가 된다.
import lombok.Data;
@Data
public class SampleDTO {
private String name;
private int age;
}
: Controller가 파라미터를 수집하는 방식은 파라미터 타입에 따라 자동으로 변환하는 방식을 이용한다. 예를 들어 int age를 자동으로 숫자로 변화되는 것을 볼 수 있다.
:@RequestParam이란, 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 유용하게 사용된다.
@GetMapping("/ex02") // @RequestParam : 파라미터 변수의 이름과, 전달되는 파라미터의 이름이 다른 경우에 쓰인다.
public String ex02 (@RequestParam("name") String name, @RequestParam("age") int age) {
log.info("name: "+name);
log.info("age: "+age);
return "ex02";
}
@GetMapping("/ex02List") // List타입으로 자동 생성되어 여러 개의 파라미터가 넘어와도 하나의 리스트에 다 담긴다.
public String ex02List(@RequestParam("ids")ArrayList<String> ids) {
log.info("ids: "+ids);
return "ex02List";
}
: 리스트 타입의 파라미터를 지정해놓으면, 위의 코드에서 ids 값을 여러 개를 입력을 하도 하나의 리스트에 묶어서 출력이 된다.
@GetMapping("/ex02Array") //배열타입도 List와 같은 결과.
public String ex02Array(@RequestParam("ids") String[] ids) {
log.info("array ids: "+Arrays.toString(ids));
return "ex02Array";
}
: 배열도 리스트 타입과 마찬가지로 동일하게 처리가 가능하다.
@Data
public class SampleDTOList {
private List<SampleDTO> list;
public SampleDTOList() {
list = new ArrayList<>();
}
}
@GetMapping("/ex02Bean") // 여러 개의 객체를 만들고 싶을 때 사용한다.
public String ex02Bean(SampleDTOList list) {
log.info("list dtos: "+list);
return "ex02Bean";
}
: 위 코드는 객체 리스트를 사용하여, 여러 개의 객체를 한번에 처리해야 할 때 사용한다.
: SampleDTOList 타입을 파라미터로 사용하는 메서드를 작성하여 주소창에 '?list[0].name=aaa&list[1].name=bbb' 형식으로 입력을 하면, 각각의 객체 형식으로 호출이 가능하다.
: 입력을 할 때, 오류가 발생한다면, '['=%5B, ']'=%5D로 변경하도록 한다.
: 파라미터 수집을 다른 용어로는 'binding'이라고 한다. 경우에 따라서는 파라미터를 변환해서 처리해야 하는 경우도 존재한다.
: 예를 들어, 주소창에 날짜를 입력할 때, 문자열을 Date형식으로 변환할 때 사용이 가능하다.
@InitBinder // 날짜 같은 문자열을 Date 타입으로 변환해주는 어노테이션
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(dataFormat, false));
}
: 주소창에 '?dueDate=2022-10-15'과 같이 호출했다면 서버에서는 정상적으로 파라미터를 수집해서 처리한다.
: @InitBinder 말고도 @DateTimeFormat을 이용해서 날짜 문자열을 Date타입으로 변환이 가능하다.
@Data
public class TodoDTO {
private String title;
@DateTimeFormat(pattern = "yyyy/MM/dd") //@InitBinder 대신 쓸 수 있다. 대신 binder어노테이션은 죽여야 된다.
private Date dueDate;
}
: 주소창에 '?dueDate=2022/10/15'과 같이 호출했자면 서버에서는 정상적으로 파라미터를 수집해서 처리한다.
: 단, 이 어노테이션을 사용할 때는 @InitBinder은 죽여야한다.
: Model 객체는 JSP에 컨트롤러에서 생성ㅇ된 데이터를 담아서 전달하는 역할을 하는 존재이다.
:리스트 페이지 번호를 파라미터로 전달받고, 실제 데이터를 View로 전달해야 하는 경우, 파라미터들에 대한 처리 후 결과를 전달해야 하는 경우에 많이 쓰인다.
: @ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션이다.
: int형식의 데이터는 화면까지 전달되지 않으므로, 이 어노테이션을 사용하여 출력이 가능하도록 도와준다.
@GetMapping("/ex04") // @ModelAttribute : int타입의 테이터를 화면까지 전달해주는 어노테이션
// 기본 자료형을 사용할 땐 반드시 붙여주어야 한다.
public String ex04(SampleDTO dto, @ModelAttribute("page") int page) {
log.info("dto: "+dto);
log.info("page: "+page);
return "/sample/ex04";
}