티스토리 뷰

WEB/Spring

[Spring] MVC의 Controller

Happyoon ~ 2021. 12. 20. 00:26
728x90
반응형

MVC의 Controller의 특징

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

Controller의 파라미터 수집

Controller를 작성할 때 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능이다. 이 기능을 이용하면 매번 request.getParameter()를 이용하는 불편함을 없앨 수 있다.

 

예를 들어, SampleDto에 @Data 어노테이션을 작성하면, getter/setter, equals(), to String() 등의 메소드가 자동으로 생성되므로, SampleController의 메소드가 SampleDto를 파라미터로 사용하면, 자동으로 setter 메소드가 동작하며 파라미터를 수집한다. 


SampleDto.java

@Data
public class SampleDto{
	private String name;
    private ing age;
}

 

 

SampleController.java

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

localhost:8080/sample/ex01?name=AAA&age=10 을 주소창에 입력하면, dto의 name과 age에 각각 AAA와 10이 들어감을 확인할 수 있다.


파라미터의 수집과 변환

 

Controller는 파라미터 타입에 따라 자동으로 변환하는 방식으로 파라미터를 수집한다.

만약, SampleDto의 age가 int 타입으로 선언되어 있다면, 자동으로 숫자로 변환된다. 

다음과 같은 방법으로 기본 자료형 혹은 문자열 사용 시 파라미터 타입만을 맞게 선언할 수 있다.

 

@GetMapping("/ex02")
public String ex02((@RequestParam("name") String name, @RequestParam("age") int age)){
	return "ex02";
}

 

이 외에도, ArrayList, array등을 사용할 수 있다.


Model이라는 데이터 전달자

 

Controller의 메소드를 작성할 때, Model 타입을 파라미터로 지정할 수 있다. Model 객체는 JSP에 컨틀롤러에서 생성된 데이터를 담아 전달하는 역할을 한다. 이를 이용해, JSP와 같은 뷰에 전달해야 하는 데이터를 담아 보낼 수 있다.

메소드의 파라미터에 Model 타입이 지정된 경우, 스프링은 Model타입의 객체를 만들어 메소드에 주입한다. 

 

Model은 request.setAttribute()와 유사한 역할을 한다. 


Servlet에서 데이터를 전달하는 방식

request.setAttribute("serveerTime", new java.util.Date());
RequestDispatcher dispatcher = request.getReuquestDispatcher("/WEB/INF/jsp/home.jsp");
dispatcher.forrward(request,response);

 

스프링 MVC에서 Model을 이용한 데이터 전달

public String home(Model model){
	model.addAttribute("serverTime",new java.util.Date());
    return "home";
}

 

개발자의 입장에서, 스프링 MVC가 Model 타입 객체를 만들어주므로, 필요한 데이터를 담아주는 작업만으로 모든 작업이 완료된다. Model을 사용해야하는 경우는 주로 Controller에 전달된 데이터를 이용해 추가적인 데이터를 가져와야 하는 상황이다. 


@ModelAttribute

Model은 파라미터로 전달된 데이터는 존재하지 않지만, 화면에서 필요한 데이터를 전달하기 위해 사용한다.

Spring MVC의 컨트롤러는 기본적으로 Java Beans(생성자가 없거나 비었으며, getter/setter를 가진 클래스의 객체) 규칙에 맞는 객체는 다시 화면으로 객체를 전달한다. 즉, 앞의 SampleDto는 Java Bean의 규칙에 맞으므로 자동으로 다시 화면까지 전달된다. 전달될 때에는 클래스명의 앞글자는 소문자로 처리된다.

하지만, 기본 자료형은, 파라미터로 선언하더라도 화면까지 전달되지 않는다. 따라서, 파라미터로 선언한 기본 자료형을 화면까지 전달하고 싶을 때 model을 사용한다.


예시

SampleController에 추가

@GetMapping("/ex04")
public String ex04(SampleDto dto, int page){
	log.info("dto:" +dto);
    log.info("page:"+page);
    
    return "/sample/ex04";
}

 

 

/sample/ex04.jsp

<h2>SampleDto ${sampleDto}</h2>
<h2> Page ${page}</h2>

http://localhost:8080/sample/ex04?name=aaa&age=11&page=9

와 같이 호출하면, 화면에 SampleDto만 전달된 것을 확인할 수 있다. 

(SampleDto(name=aaa, age=11)만이 출력됨)

 

@ModelAttribute강제로 전달받은 파라미터를 모델에 담아 전달하도록 할 때 필요한 어노테이션이다. 

@ModelAttribute가 걸린 파라미터는 타입과 관계없이 무조건 Model에 담겨 전달되므로, 파라미터로 전달된 데이터를 다시 화면에서 사용할 경우 유용하다.

 

따라서, 위 코드에 @ModelAttribute를 추가하면 다음과 같다.

@GetMapping("/ex04")
public String ex04(SampleDto dto, @ModelAttribute("page") int page){
	log.info("dto:" +dto);
    log.info("page:"+page);
    
    return "/sample/ex04";
}

기본 자료형에 @ModelAttribute를 적용할 경우 반드시 @ModelAttribute("page")와 같이 value를 지정해야 한다.


@RedirectAttributes

 

일회성으로 데이터를 전달하는 용도로 사용된다.

기존 서블릿에서 response,sendRedirect()를 사용할 때와 동일한 용도로 사용된다. 


스프링 MVC에서 redirect 처리

rttr.addFlashAttribute("name","AAA");
rttr.addFrashAttribute("age",10);

return "redirect:/";

 

RedirectAttributes는 Model과 같이 파라미터로 선언할 수도 있고, 화면에 한 번만 사용되고 다음에는 사용되지 않을 데이터를 전달할 것이라면 addFrashAttribute메소드를 사용할 수도 있다.


Controller의 리턴 타입

 

1. String

void와 더불어 가장 많이 사용하는 타입이다.

상황에 따라 다른 화면을 보여줄 필요가 있을 경우 if문 등을 사용하여 유용하게 사용된다.

일반적으로 Stirng 타입은 현재 프로젝트일 경우, JSP 파일의 이름을 의미한다. 

예를 들어, return "home";을 하였을 경우, 경로는 '/WEB-INF/views/home.jsp'가 된다.

 

String 타입에는 다음의 특별한 키워드를 붙여 사용할 수 있다.

 

  • redirect: 리다이렉트 방식으로 처리하는 경우
  • forward: 포워드 방식으로 처리하는 경우

2. void

리턴 타입이 void일 경우, 해당 URL의 경로를 그대로 jsp 파일의 이름으로 사용한다.

 

예시

SampleController

@GetMapping("/ex05")
public void ex05(){
	log.info("/ex05..");
}

경로는 /WEB-INF/views/sample/ex05.jsp이다.

 


3. 객체 타입 (DTO, VO)

VO, DTO등 객체 타입으로 리턴 타입을 지정했을 경우, 주로 JSON 데이터를 만들어 내는 용도로 사용한다.

이를 위해서는 pom.xml에 jacson-databind 라이브러리를 추가해야 한다.

 

SampleController

@GetMapping("/ex06")
public @ResponseBody SampleDTO ex06(){
	SampleDto dto = new SampleDTO();
	dto.setAge(10);
    dto.setName("홍길동");
    
    return dto;
}

 

주소창에 localhost:8080/sample/ex06 입력 시

 

출력

{name:"홍길동", "age":10}

4. ResponseEntity 타입

HTTP 프로토콜의 헤더를 다루는 경우 ResponseEntity를 통해 원하는 헤더 정보나 데이터를 전달할 수 있다.

 

 

SampleController

@GetMapping("/ex07")
public ResponseEntity<String> ex07{
	String msg = "{\"name\": \"홍길동\"}";
    HttpHeaders header = new HttpHeaders();
    header.add("Content-Type", "application/json;charset=UTF-8");
    
 
    return new ResponseEntity<>(msg,header,HttpStatus.OK);
}

 

위의 예제는 브라우저에 JSON 타입이라는 헤더 메시지와 200 OK라는 상태 코드를 전송한다.


출처: 코드로 배우는 스프링 웹 프로젝트

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함