framework/spring mvc

[springMVC] 6. Front Controller์— ์˜ํ•ด JSP ๋ฌธ์„œ๋กœ ํฌ์›Œ๋“œ ์ด๋™ํ•˜์—ฌ ์‘๋‹ต๋˜๋„๋ก ๋ทฐ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ• @RequestMapping

jeri 2024. 8. 4. 09:09
๋ฐ˜์‘ํ˜•

[๐Ÿ–คModel] HelloController.java
package xyz.itwill10.controller;

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

//@Controller : ์š”์ฒญ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค๋ฅผ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
// => ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ Spring Bean์˜ ์‹๋ณ„์ž(beanName)๋กœ ์ž๋™ ์„ค์ • - ์ฒซ๋ฌธ์ž๋Š” ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
// => value ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Spring Bean์˜ ์‹๋ณ„์ž(beanName) ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
// => Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š์•„๋„ ์š”์ฒญ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค๋กœ ์ฒ˜๋ฆฌ
// => @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋‹ค์ˆ˜์˜ ์š”์ฒญ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
// => ์ฆ‰ command Pattern(ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ)์ด ์•„๋‹˜
// => ์š”์ฒญ์ฒ˜๋ฆฌ๋ฉ”์†Œ๋“œ (handleRequest(request, response))๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์Œ
@Controller
public class HelloController { //๋ชจ๋ธ(Model) ์—ญํ• ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค - ์š”์ฒญ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค



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



	//์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋Š” Front Controller์—๊ฒŒ ๋ฐ˜๋“œ์‹œ ๋ทฐ์ด๋ฆ„(ViewName) ์ œ๊ณต
	// => Front Controller๋Š” ์ œ๊ณต๋ฐ›์€ ๋ทฐ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ์‘๋‹ต๊ด€๋ จ ์ •๋ณด๋กœ ๋ณ€ํ™˜(ViewResolver)ํ•˜์—ฌ ์‘๋‹ต ์ฒ˜๋ฆฌ

	//๐Ÿ–คFront Controller์— ์˜ํ•ด JSP ๋ฌธ์„œ๋กœ ํฌ์›Œ๋“œ ์ด๋™ํ•˜์—ฌ ์‘๋‹ต๋˜๋„๋ก ๋ทฐ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•
	// => JSP ๋ฌธ์„œ๋กœ ์‘๋‹ต ์ฒ˜๋ฆฌ ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์„ Model ๋˜๋Š” Map์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ 
	// => ex)REST ํ”„๋กœ๊ทธ๋žจ์—์„œ JSP ๋ฌธ์„œ๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š์„ ๋•Œ
	// => JSP ๋ฌธ์„œ๋กœ ์‘๋‹ต ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์„ Model ๋˜๋Š” Map์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์•ˆ๋จ
    
	//1. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ [๋ฐ˜ํ™˜ํ˜•์„ void]๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ Front Controller์—๊ฒŒ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ๋ทฐ์ด๋ฆ„(ViewName)์œผ๋กœ ์ œ๊ณต
	//2. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ [๋ฐ˜ํ™˜ํ˜•์„ String]์œผ๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ Front Controller์—๊ฒŒ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ทฐ์ด๋ฆ„(ViewName)์œผ๋กœ ์ œ๊ณต - ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
	//3. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ [๋ฐ˜ํ™˜ํ˜•์„ ModelAndView]๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ Front Controller์—๊ฒŒ ๋ฐ˜ํ™˜๋˜๋Š” ModelAndView ๊ฐ์ฒด์— ๋ทฐ์ด๋ฆ„(ViewName)์„ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต


	//๐Ÿ–ค@RequestMapping : ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
	// => ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ "๋ชจ๋“  ์š”์ฒญ๋ฐฉ์‹"(Method - GET, POST, PUT, PATCH, DELETE ๋“ฑ)์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
	// => ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๋ฐฉ์‹์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ
	// => @GetMapping , @PostMapping,[@PutMapping, @PatchMapping, @DeleteMapping - REST์„œ๋น„์Šค ๋งŒ๋“ค ๋•Œ] ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    
	//๐Ÿ–ค์ผ๋ฐ˜์ ์ธ ์›น ํ”„๋กœ๊ทธ๋žจ - @RequestMapping์ด ํšจ์œจ์ 
	//๐Ÿ–คREST ํ”„๋กœ๊ทธ๋žจ -  ์š”์ฒญ๋ฐฉ์‹์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋กํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ํšจ์œจ์ 
    
	// value ์†์„ฑ : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ URL ์ฃผ์†Œ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
	// => Front Controller์— ์˜ํ•ด ๋“ฑ๋ก๋œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ URL ์ฃผ์†Œ(์‹๋ณ„์ž)๋กœ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž๋™ ํ˜ธ์ถœ๋˜์–ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•จ
	// => ๋‚ด๋ถ€์ ์œผ๋กœ HandlerMapping๋˜์–ด ์ž๋™ ๋“ฑ๋ก๋จ - ๋‹ค๋ฅธ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’๋งŒ ์„ค์ • ๊ฐ€๋Šฅ
	// => ๋‹ค๋ฅธ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ value ์†์„ฑ๊ฐ’๊ณผ ์š”์ฒญ URL ์ฃผ์†Œ๊ฐ€ ์ค‘๋ณต๋  ๊ฒฝ์šฐ WAS ์‹คํ–‰ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

[๋ฐฉ๋ฒ•1] ๋ฐ˜ํ™˜ํ˜• void

	//@GetMapping(value = "/hello") //๋ฌด์กฐ๊ฑด GET ๋ฐฉ์‹์˜ ์š”์ฒญ๋งŒ ๊ฐ€๋Šฅ
	@RequestMapping(value = "/hello") //ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ตœ์ƒ์œ„ ํด๋”์— ์žˆ๋Š” hello๋ผ๋Š” ์›นํ”„๋กœ๊ทธ๋žจ์„ ์š”์ฒญํ–ˆ๋‹ค๋ฉด?
	public void hello() {//์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ
		//์š”์ฒญ ์ฒ˜๋ฆฌ ๋ช…๋ น ์ž‘์„ฑ - Service ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
		logger.info("[/hello] ํŽ˜์ด์ง€ ์š”์ฒญ : HelloController ํด๋ž˜์Šค์˜ hello() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ");
	}

[๋ฐฉ๋ฒ•2] ๋ฐ˜ํ™˜ํ˜• String - ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ

	//ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ตœ์ƒ์œ„ ํด๋”์— ์žˆ๋Š” hellViewName๋ผ๋Š” ์›นํ”„๋กœ๊ทธ๋žจ์„ ์š”์ฒญ!
	@RequestMapping(value = "/helloViewName")
	public String helloViewName() {
		logger.info("[/helloViewName] ํŽ˜์ด์ง€ ์š”์ฒญ : HelloController ํด๋ž˜์Šค์˜ helloViewName() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ");
		return "hello";
	}

[๋ฐฉ๋ฒ•3] ๋ฐ˜ํ™˜ํ˜• ModelAndView

	//ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ตœ์ƒ์œ„ ํด๋”์— ์žˆ๋Š” helloModelAndView๋ผ๋Š” ์›นํ”„๋กœ๊ทธ๋žจ์„ ์š”์ฒญ!
	@RequestMapping(value = "/helloModelAndView")
	public ModelAndView helloModelAndView() {
		logger.info("[/helloModelAndView] ํŽ˜์ด์ง€ ์š”์ฒญ : HelloController ํด๋ž˜์Šค์˜ helloModelAndView() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ");

		//ModelAndView ๊ฐ์ฒด : ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋ทฐ์ด๋ฆ„์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
		//ModelAndView modelAndView = new ModelAndView();
		//modelAndView.setViewName("hello"); //Setter ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ทฐ์ด๋ฆ„(ViewName) ๋ณ€๊ฒฝ

		ModelAndView modelAndView = new ModelAndView("hello"); //์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ทฐ์ด๋ฆ„(ViewName) ๋ณ€๊ฒฝ

		return modelAndView;
	}
}
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
	<h1>hello, Spring!!!</h1>
	<hr>
</body>
</html>

๋ฐ˜์‘ํ˜•