우당탕탕 개발자 되기
Spring MVC -Controller 본문
스프링 MVC를 이용하는 경우 작성되는 Controller의 특징( 스프링 MVC는 어노테이션을 중심으로 구성되기 때문에 각 어노테이션의 의미에 대해서 주의해가며 학습해야된다)
- HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
- 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용가능
- Get 방식, Post 방식 등 전송방식에 대한 처리를 어노테이션으로 처리 가능
- 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능
@RequestMapping의 변화
-@Controller 어노테이션은 추가적인 속성을 지정할수 없지만, @RequestMapping의 경우 몇 가지의 속성을 추가 할수있다. 이 중에서도 가장 많이 사용하는 속성이 method 속성
Method 속성은 GET방식 , POST 방식을 구분해서 사용할때 이용한다.
@RequestMapping(value="/basic", method= {RequestMethod.GET,RequestMethod.POST})
public void basicGet() {
log.info("basic.get.......................");
}
@GetMapping("/basicOnlyGet")
public void basicGet2() {
log.info("basic get only get..............");
}
Controller의 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능
이 기능을 이용하면 request.getParameter() 를 이용하는 불편함을 없앨 수 있다.
package org.zerock.domain;
import lombok.Data;
@Data
public class SampleDTO {
private String name;
private int age;
}
@Data 어노테이션을 이용해서 getter.setter, equals(), toString() 등의 메서드를 자동 생성한다.
@GetMapping("/ex02")
public String ex02(@RequestParam("name") String name, @RequestParam("age") int age) {
log.info("name:" +name);
log.info("age:" + age);
return "ex02";
ex02() 메서드는 파라미터에 @RequestParam 어노테이션을 사용해서 작성되었는데 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 유용하게 사용된다.
브라우저에 http://localhost:8080/sample/ex02?name=AAA&age=10 를 호출하면

데이터가 수집된 것을 볼수있다.
-리스트,배열 처리
@GetMapping("ex02List")
public String ex02List(@RequestParam("ids")ArrayList<String> ids) {
log.info("ids: "+ids);
return "ex02List";
}
동일한 이름의 파라미터가 여러 개 전달되는 경우에는 ArrayList<>를 이용해서 처리가 가능하다.
스프링은 파라미터의 타입을 보고 객체를 생성하므로 파라미터의 타입은 List<> 같이 인터페이스 타입이 아닌 실제적인 클래스 타입으로 지정.
배열의 경우도 동일하게 처리할수 있다.
-객체 리스트
만약 전달하는 데이터가 SampleDTO와 같이 객체 타입이고 여러 개를 처리해야 한다면 약간의 작업을 통해 한번에 처리할수있다. 리스트를 포함하는 클래스를 설계
package org.zerock.domain;
import java.util.List;
import java.util.ArrayList;
import lombok.Data;
@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%5B0%5D.name=aaa&list%5B1%5D.name=BBB&list%5B2%5D.name=CCC 호출하면 SampleDTO 객체를 생성하는 것을 볼수 있다.
-@InitBinder
파라미터의 수집을 다른 용어로는 Binding 이라고 한다. 변환이 가능한 데이터는 자동으로 변환되지만 경우에 따라서 파라미터를 변환해서 처리해야 하는경우도 존재한다. 스프링 Controller에서는 파라미터를 바인딩할 때 자동으로 호출되는 @InitBinder를 이용해서 이러한 변환을 처리할수 있다.
package org.zerock.domain;
import java.util.Date;
import lombok.Data;
@Data
public class TodoDTO {
private String title;
private Date duedate;
}
TodoDTO에는 특별하게 dueDate 변수의 타입이 java.util.Date 타입이다. 들어오는 데이터를 변환하고자 할 때 문제가 발생하게 된다. 이러한 문제의 해결책이 @InitBinder를 이용하는것이다.
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(java.util.Date.class,
new CustomDateEditor(dateFormat, false));
}
...중략...
@GetMapping("/ex03")
public String ex03(TodoDTO todo) {
log.info("todo:"+ todo);
return "ex03";
}
http://localhost:8080/sample/ex03?title=test&dueDate=2018-01-01 를 호출하면 서버에서는 정상적으로 파라미터를 수집해서 처리한다.
-@DateTimeFormat
@InitBinder를 이용해서 날짜를 변환할 수도 있지만, 파라미터를 사용되는 인스턴스 변수에 @DateTimeFormat를 적용해도 변환이 가능하다.
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date dueDate;
문자열로 'yyyy/MM/dd' 의 형식이 맞다면 자동으로 날짜타입으로 변환된다.
'Spring' 카테고리의 다른 글
| Spring MVC-Controller(3) (0) | 2021.02.10 |
|---|---|
| Spring MVC-Controller(2) (0) | 2021.02.09 |
| Spring MVC (0) | 2021.02.08 |
| 의존성 주입 테스트 -Setter (0) | 2021.02.04 |
| SpringFrame Work (0) | 2021.02.04 |