Helmi

구) 기초적인 컨트롤러 생성 실습 (WAS) 본문

Spring

구) 기초적인 컨트롤러 생성 실습 (WAS)

Helmi 2023. 4. 6. 16:43

1. void 리턴 타입 경우

org.zerock.web.SmapleController

package org.zerock.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SampleController {
	private static final Logger logger = 
			LoggerFactory.getLogger(SampleController.class);
	
	@RequestMapping("doA")
	public void doA() {
		logger.info("doA called.......");
	}
	
	@RequestMapping("doB")
	public void doB() {
		logger.info("doB called........");
	}
}

@Controller : 이 클래스를 컨트롤러로 설정하게 함

@RequestMapping : 특정 URI 경로에 해당하면 메소드 실행 됨

 

현재 메소드 리턴 타입이 void인 경우, 스프링 MVC는 현재 경로에 해당하는 JSP 파일 실행


2. String이 리턴타입인 경우

만약 컨트롤러에서 메소드 리턴 타입이 문자열일 경우, 결과는 '문자열 + .jsp' 파일 찾아 실행

org.zerock.web.SmapleController2

package org.zerock.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SampleController2 {
	
	private static final Logger logger = 
			LoggerFactory.getLogger(SampleController2.class);
	
	@RequestMapping("doC")
	public String doC( @ModelAttribute("msg")String msg) {
	
			logger.info("doC called........");

			return "result";
		}
	}

@RequestMapping : URI가 '/doC'인 경우 동작

@ModelAttribute("msg") : 요청(request)시, 'msg' 이름의 파라미터를 문자열로 처리, 뷰에 전달되도록 함. 자동으로 이뤄지는 작업 (개발자 별도 코드 작성 필요X) 

 

doC() 메소드 리턴 값으로 사용된 'result'는 결과적으로 /WEB-INF/views/result.jsp 파일 찾아 실행

 

 /WEB-INF/views/result.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//w3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<span> Hello${msg}</span>

</body>
</html>

<span>태그 : JSP의 EL사용해 ${msg} 출력 부분 보임.

스프링 MVC의 @ModelAttribute는 자동으로 해당 객체 뷰까지 전달

 

불러올 때 : ex) localhost8080/doC?msg=Helmi

결과 : HelloHelmi

예시


3. 만들어진 결과 데이터를 전달해야 하는 경우

컨트롤러 제작하며 가장 많이 하는 작업 - 다른 객체 도움 받아 만들어진 데이터를 뷰로 전달하는 일.

이때는 스프링 MVC의 Model 객체 사용해 간편히 처리 가능

 

org.zerock.domain.ProductVO

package org.zerock.domain;

public class ProductVO {

	private String name;
	private double price;
	
	public ProductVO(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}
	public String getName() {
		return name;
	}
	public double getPrice() {
		return price;
	}
	@Override
	public String toString() {
		return "ProductVO [name=" + name + ", price=" + price + "]";
	}
}

org.zerock.web.SmapleController3

package org.zerock.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.domain.ProductVO;

@Controller
public class SampleController3 {
	
	private static final Logger logger = 
			LoggerFactory.getLogger(SampleController3.class);
	
	@RequestMapping("doD")
	public String doD(Model model) {
	
		//make sample data
		ProductVO product = new ProductVO("Sample Product", 10000);
		
			logger.info("doD");

			model.addAttribute(product);
			
			return "productDetail";
		}
	}

Model : 스프링 MVC에서 기본적으로 제공하는 클래스(import org.springframework.ui.Model; 참고).

용도 -  뷰에 원하는 데이터 전달 ,컨테이너/상자 같은 역할 (필요 데이터 담은 후, 뷰(jsp)로 전달)

 

ProductVO 클래스 객체 생성 이후 addAttribute() 메소드 이용해 ProductVO 객체 보관

 

addAttribute() 사용

1. addAttribte("이름", 객체): 객체에 특별한 이름 부여해 뷰에서 이름값 이용해 객체 처리 

2. addAttribte(객체): 이름 지정 않는 경우, 자동으로 저장되는 객체의 클래스명 앞글자 소문자로 처리한 클래스명을 이름으로 간주

 

/WEB-INF/views/productDetail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<Span> ${productVO.name }</Span>
<Span> ${productVO.price }</Span>
</body>
</html>

<span> 태그 내용 보면 productVO.name, productVO.price 이용. 이때 productVO 변수 이름이 어떻게 만들어진 것인지 알고 있어야 함. 

컨트롤러 호출 결과


4. 리다이렉트 해야하는 경우

특정 컨트롤러 로직 처리 시 다른 경로 호출해야 하는 경우, 'redirect:' 사용

RedirectAttributes라는 클래스를 파라미터로 같이 사용하게되면 리다이렉트 시점에 원하는 데이터를 임시로 추가해 넘기는 작업이 가능.

 

org.zerock.web.SampleController4

package org.zerock.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class SampleController4 {

	private static final Logger logger = 
			LoggerFactory.getLogger(SampleController4.class);

	@RequestMapping("/doE")
	public String doE(RedirectAttributes rttr) {
		logger.info("doE called but redirect to /doF...........");

		rttr.addFlashAttribute("msg", "This is the Message!! with redirected");

		return "redirect:/doF";
	}

	@RequestMapping("/doF")
	public void doF(@ModelAttribute String msg) {
		logger.info("doF called............."+msg);
	}
}

SampleController4 코드 내 doE() 메소드의 URI는 '/doE'. 외부에서 호출하도록 되어있음. (메소드의 파라미터 선언에 RedirectAttributes를 파라미터로 사용하는 점 주목)

 

doE() 메소드의 결과로 리다이렉트 시점에 문자열 정보 하나 더 전달 위해 'msg' 데이터 추가함.

이때 addFlashAttribute()임시 데이터 전달

 

마지막 반환 리턴값은 'redirect:...'로 시작하는 문자열 반환하므로 스프링 MVC는 브라우저에 다시 '/doF' 호출

 

RedirectAttributes 이용 경우, URI에 보이지 않게 데이터 전달

 

이외에 'forward:...' 역시 지원 함.

호출시 콘솔창 결과


5. JSON 데이터 생성하는 경우

스프링 MVC는 JSON (JavaScript Object Notation) 데이터 처리 간단히 처리 가능

이를 위해 pom.xml에 jackson-databind 라이브러리 추가

 

pom.xml

		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.14.1</version>
		</dependency>

 

JSON 데이터 생성 위해 사용자는 적절한 객체 반환해주고, @ResponseBody 어노테이션 추가해주는 작업만 해주면 됨

 

org.zerock.web.SampleController5

package org.zerock.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.zerock.domain.ProductVO;

@Controller
public class SampleController5 {

	@RequestMapping("/doJSON")
	public @ResponseBody ProductVO doJSON() {

		ProductVO vo = new ProductVO("샘플상품", 30000);

		return vo;
	}
}

- @ResponseBody

- 리턴타입 일반 객체

→ JSON 처리 끝

결과

* 위 URI 실행 시 반드시 STS 내에 내장된 브라우저 아닌 일반 브라우저로 확인해야 함.

STS 내장 브라우저는 JSON 데이터 처리 불가. *