개발/[Spring] 블로그 만들기

[코드로 배우는 스프링 웹 프로젝트] 6강. 스프링 MVC의 Controller 1 (어노테이션, @RequestMapping 활용, 파라미터 수집)

ee2ee2 2021. 12. 11. 00:33
728x90
반응형

해당 프로젝트는 코드로 배우는 스프링 웹 프로젝트(개정판)을 기반으로 진행됩니다.


스프링 MVC를 이용하는 경우 작성되는 Controller는 아래와 같은 특징이 있다.

-. HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
-. 다양한 타입의 파라미터 / 리턴 타입 사용 가능
-. GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
-. 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능

 

스프링 MVC는 어노테이션이 많이 쓰이고, 구성되기 때문에 어노테이션의 의미를 확실히 알아두자.


1. @Controller, @RequestMapping

org.zerock.controller 내 SampleController라는 클래스를 생성하여 위 어노테이션을 적용해보자.

SampleController.java

@Controller
@RequestMapping("/sample/*")
public class SampleController {
	
}

SampleController의 클래스 선언부에 @Controller라는 어노테이션을 적용하였다. 이는 자동으로 스프링의 객체(Bean)로 등록되는데 servlet-context.xml을 보면 이유를 알 수 있다.

servlet-context.xml 일부

	<context:component-scan base-package="org.zerock.controller" />
	
</beans:beans>

<context:component-scan> 이라는 태그를 통해 지정된 패키지를 스캔한다. 스프링에서 객체(Bean) 설정에 사용되는 어노테이션들을 가진 클래스들을 파악하고, 필요하면 이를 객체로 생성해 관리한다.

servlet-context.xml 의 Bean Graph

 

 

@RequestMapping현재 클래스의 모든 메소드들의 기본적인 URL 경로가 된다.

위 같은 경우를 예를 들면, /sample/aaa, /sample/bbb가 포함된다.

예) SampleController.java

package org.zerock.controller;

...import문 생략

@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
	
	@RequestMapping("")
	public void basic() {
		log.info("basic.......................");
	}
	
	@RequestMapping(value = "/basic", method = {RequestMethod.GET, RequestMethod.POST})
	public void basicGet() {
		log.info("basic get.......................");
	}
	
	@GetMapping(value = "/basicOnlyGet")
	public void basicGet2() {
		log.info("basic get only get.......................");
	}
    
  }

 

결과

: jsp 파일은 아직 구성 전이기에 404에러가 뜨는 것은 정상이다. 로그만 확인하면 된다.

http://localhost:8080/sample/ 입력시, 

함수 호출 성공

 

http://localhost:8080/sample/basic 입력시, 

 

http://localhost:8080/sample/basicOnlyGet  입력시, 

 


 

2) @RequestMapping의 변화

@RequestMapping의 경우 추가 속성을 지정할 수 있다.

대표적으로 method 속성 (GET, POST 방식)을 구분해서 이용할 수 있다.

SampleController.java 일부

	@RequestMapping(value = "/basic", method = {RequestMethod.GET, RequestMethod.POST})
	public void basicGet() {
		log.info("basic get.......................");
	}
	
	@GetMapping(value = "/basicOnlyGet")
	public void basicGet2() {
		log.info("basic get only get.......................");
	}

스프링 4.3 버전부터는 @GetMappiing, @PostMapping과 같이 축약하여 사용 가능하다! 

 


 

3) Controller의 파라미터 수집

DTO(Data Transfer Object)를 통해 파라미터 수집을 자동으로 진행해보자.

DTO(Data Transfer Object)란? 
프로세스 간에 데이터를 전달하는 객체

org.zerock.domain 패키지를 생성하고, SampleDTO 클래스를 작성하자.

SampleDTO.java

package org.zerock.domain;

import lombok.Data;

@Data
public class SampleDTO {
	private String name;
	private int age;
}

Lombok의 @Data 어노테이션은 getter/setter, equals(), toString() 등 메소드를 자동으로 생성한다.

SampleController.java

package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.zerock.domain.SampleDTO;

import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
	
	... 생략
	
	@GetMapping("/ex01")
	public String ex01(SampleDTO dto) {
		log.info("" + dto);
		
		return "ex01";
	}
    
  }

 

결과

http://localhost:8080/sample/ex01?name=AAA&age=20 (GET 방식) 입력

정상 전송 성공

 

기본 경로를 변경해주고 진행한 예제 입니다.

 


3-1) 파라미터 수집과 변환

: Controller가 파라미터를 수집하는 방식은 파라미터 삽입에 따라 자동으로 변환하는 방식을 이용한다.

 

1. 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우

SampleController.java 추가

	@GetMapping("/ex02")
	public String ex02(@RequestParam("name") String name, @RequestParam("age") int age) {
		log.info("name : " + name);
		log.info("age : " + age);
		
		return "ex02";
	}

@RequestParam은 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 사용하면 된다!

 

결과 (http://localhost:8080/sample/ex02?name=AAA&age=123 호출)


2. 리스트, 배열 처리

SampleController.java 추가

	@GetMapping("/ex02List")
	public String ex02List(@RequestParam("ids") ArrayList<String> ids) {
		log.info("ids : " + ids);
		
		return "ex02List";
	}
	
	@GetMapping("/ex02Array")
	public String ex02Array(@RequestParam("ids") ArrayList<String> ids) {
		log.info("ids : " + ids);
		
		return "ex02Array";
	}

결과

http://localhost:8080/sample/ex02List?ids=111&ids=222&ids=333 

http://localhost:8080/sample/ex02Array?ids=111&ids=222&ids=333 


3. 객체 리스트 처리

: 전달하는 데이터가 SampleDTO와 같이 객체 타입이고, 여러개를 처리하는 경우에는 SampleDTO의 리스트를 포함하는 SampleDTOList 클래스를 생성하여 처리한다.

SampleDTOList.java

package org.zerock.domain;

import java.util.ArrayList;
import java.util.List;

import lombok.Data;

@Data
public class SampleDTOList {
	private List<SampleDTO> list;
	
	public SampleDTOList() {
		list = new ArrayList<SampleDTO>();
	}
}

SampleController.java 추가

	@GetMapping("/ex02Bean")
	public String ex02Bean(SampleDTOList list) {
		log.info("list dots : " + list);
		
		return "ex02Bean";
	}

 

결과

전송하고자 하는 URL : http://localhost:8080/sample/ex02Bean?list[0].name=AAA&list[1].name=BBB&list[0]age=33&list[2].name=CCC

실제 입력값 : http://localhost:8080/sample/ex02Bean?list%5B0%5D.name=AAA&list%5B1%5D.name=BBB&list%5B0%5D.age=33&list%5B2%5D.name=CCC 

(Tomcat 버전에 따라 '[',']' 특수문자 인식이 불가한 경우가 있어 '%5B', '%5D'로 변경하여 입력함)

 

다음 글에 Controller의 Return, Exception 등 이어서 작성하겠다!