Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

우당탕탕 개발자 되기

Spring MVC -Controller 본문

Spring

Spring MVC -Controller

KimMINHun 2021. 2. 9. 00:34

스프링 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