Java/Spring

[Spring] ์Šคํ”„๋ง์˜ ์ •์„ (3) - Spring MVC

๋ฒผ๋ฆฌ01 2024. 1. 1. 14:49

http์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต

 

ํ”„๋กœํ† ์ฝœ(Protocol)

์„œ๋กœ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ์•ฝ์† ๋˜๋Š” ๊ทœ์น™. ์ฃผ๊ณ  ๋ฐ›์„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํ˜•์‹์„ ์ •์˜ํ•œ ๊ฒƒ. 

๋ณ„๋‹ค๋ฅธ ์„ค๋ช… ์—†์ด๋„ ๊ทœ์น™์„ ์ •ํ•ด๋†“๊ณ  ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•„๋“ค์„ ์ˆ˜ ์žˆ๋„๋ก ํ•จ. 

 

HTTP(Hyper Text Transfer Protocal)

ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ํ”„๋กœํ† ์ฝœ. ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค.(๋ฌด์ƒํƒœ. stateless) ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค.(๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Œ. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.) ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•ฝ์†๋งŒ ๋œ๋‹ค๋ฉด ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

์š”์ฒญ

์š”์ฒญ ๋ฌธ์„œ๋Š” ํ—ค๋”์™€ ๋ฐ”๋””๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. ํ—ค๋”์—๋Š” ๋ณธ๋ฌธ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๊ณ , ๋ฐ”๋””์—๋Š” ์‹ค์ œ ๋‚ด์šฉ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค. url์„ ์ž…๋ ฅํ•˜๋ฉด, ํ—ค๋”์™€ ๋ฐ”๋””๋กœ ์ž‘์„ฑ๋œ http ์š”์ฒญ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„๋Š” ํ•ด๋‹น http ๋ฌธ์„œ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌ ํ›„ http ์‘๋‹ต ๋ฌธ์„œ๋ฅผ ๋ณด๋‚ธ๋‹ค. 

 

์‘๋‹ต

์‘๋‹ต ๋ฌธ์„œ๋Š” ์ƒํƒœ ๋ผ์ธ, ํ—ค๋”, ๋ฐ”๋””๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํ—ค๋”๋Š” ์ค„๋ฐ”๊ฟˆ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ ํ—ค๋”์™€ ๋ฐ”๋””๋Š” ๋นˆ ์ค„๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. (๋นˆ ์ค„์ด ๋‚˜์˜ค๋ฉด ํ—ค๋”๊ฐ€ ๋๋‚ฌ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.)

์ฝ”๋“œ(์ƒํƒœ๋ผ์ธ)

100 information (ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„์˜ ์ •๋ณด ๊ตํ™˜)

200 success

300 redirect (๋‹ค๋ฅธ url๋กœ ์žฌ ์š”์ฒญํ•˜๋ผ)

400 client error (๊ฒฝ๋กœ ๋“ฑ์„ ์ž˜๋ชป ์ž…๋ ฅํ•จ. ex) 404 Not Found)

500 server error (ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ํ–ˆ์œผ๋‚˜ ์„œ๋ฒ„์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘ ํ”„๋กœ๊ทธ๋žจ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ)

 

 

http ์š”์ฒญ ๋ฐฉ์‹ - Get, Post

get

๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ๊ฒ€์ƒ‰ ๋‹จ์–ด ์ „์†ก ๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹. ์„œ๋ฒ„์—์„œ ์ •๋ณด๋ฅผ ์–ป์–ด์˜ด(read only). ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ํ•œ๋‹ค. url์— ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง(Query String)์œผ๋กœ ๋‚ด์šฉ์„ ์ ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ(์†Œ์šฉ๋Ÿ‰). ๋ฐ”๋””๊ฐ€ ์—†์Œ. url์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜๋ฏ€๋กœ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค. ๋ฐ์ดํ„ฐ ๊ณต์œ ์— ์œ ๋ฆฌํ•˜๋‹ค. 

post

๊ธ€์“ฐ๊ธฐ, ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ํŒŒ์ผ ์ฒจ๋ถ€ ๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹. ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ์„ค๊ณ„. ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ๋ฐ”๋””์— ๋‹ด์•„ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์†ก ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์˜ ์ œํ•œ์ด ์—†์Œ(๋Œ€์šฉ๋Ÿ‰). ๋ณด์•ˆ์— ์œ ๋ฆฌํ•˜๊ณ  ๊ณต์œ ์— ๋ถˆ๋ฆฌํ•˜๋‹ค.

 

 

get ๋ฐฉ์‹

 

 

 

post ๋ฐฉ์‹. ๋ฐ์ดํ„ฐ๊ฐ€ url ๋’ค์— ๋ถ™์ง€ ์•Š๊ณ  ๋ฐ”๋””์— ๋ถ™๋Š”๋‹ค.

 

 

MIME(Multipurpose Internet Mail Extension)

ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋จ. HTTP์˜ ํ—ค๋”์— ์‚ฌ์šฉ. ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•œ๋‹ค. 

`text` `image` `audio` `video` `application` ๋“ฑ์ด ์žˆ์Œ.

 

 

 

MVC ํŒจํ„ด - ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(Separation of Concerns)

"ํ•ด์•ผํ•  ์ž‘์—…"์˜ ๋ถ„๋ฆฌ. SRP(Single Responsibility Priciple): ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค. ๋ฉ”์„œ๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. 1. ๊ด€์‹ฌ์‚ฌ 2. ๋ณ€ํ•˜๋Š” ๊ฒƒ 3. ์ค‘๋ณต ์ฝ”๋“œ ์ด ์…‹์„ ์ž˜ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์„ ์ž˜ ์ง€ํ‚ค๋Š” ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„ˆ๋ฌด ์›์น™๋งŒ์„ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์›์น™์„ ์ƒ๊ฐํ•˜๋ฉฐ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ„๋‹ค.

 

Contoller : ์ฒ˜๋ฆฌ

Modal : ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด

View : ์ถœ๋ ฅ

 

@Controller์˜ @RequestMapping ์• ๋„ˆํ…Œ์ด์…˜์„ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ๋Š” Model ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ณ  Model ๊ฐ์ฒด์— ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ ๋’ค(model ๊ฐ์ฒด๋Š” ์ด๋ฏธ dispatcher๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ model ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Œ. ๊ฐ’๋งŒ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.) ๋ณด๋‚ด์ค€ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ view์˜ ์ด๋ฆ„์„ String์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 

// ๋…„ ์›” ์ผ์„ ์ž…๋ ฅํ•˜๋ฉด ์š”์ผ์„ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ
@Controller
public class YoilTellerMVC {

	@RequestMapping("/getYoilMVC")
	public String getYoilMVC(int year, int month, int day, Model model) throws IOException {

		if (!isValid(year, month, day)) {
			return "yoilError";
		}

		char yoil = getYoil(year, month, day);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);
		model.addAttribute("yoil", yoil);
		

		return "yoil";
	}

	private boolean isValid(int year, int month, int day) {
		// TODO Auto-generated method stub
		return true;
	}

	private char getYoil(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month - 1, day);

		int dayOfweek = cal.get(Calendar.DAY_OF_WEEK); // 1= ์ผ์š”์ผ 2=์›”์š”์ผ...
		return " ์ผ์›”ํ™”์ˆ˜๋ชฉ๊ธˆํ† ".charAt(dayOfweek);
	}
}

 

//	yoil.jsp

<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Yoil</title>
</head>
<body>

<P>  ${year}๋…„ ${month}์›” ${day}์ผ์€ ${yoil}์š”์ผ์ž…๋‹ˆ๋‹ค.</P>
</body>
</html>

 

 

 

 

 

`Class` ํด๋ž˜์Šค์˜ `forName()` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

`getDeclareMethod()` ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ `Method`ํƒ€์ž…์˜ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. `getParameters()`๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ํŒŒ๋ผ๋ฏธํ„ฐ(๋งค๊ฐœ๋ณ€์ˆ˜)๋ฅผ `Parameter` ํƒ€์ž…์˜ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” ํด๋ž˜์Šค ๋‚ด ์ •์˜๋œ ๋ฉ”์„œ๋“œ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ๋˜์—ˆ๋‹ค. 

์›๋ž˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ๋ณ„๋กœ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ €์žฅํ•˜๋ ค๋ฉด ์ปดํŒŒ์ผ ์˜ต์…˜์—์„œ `-parameters` ๋ผ๋Š” ์˜ต์…˜์„ ์ค˜์•ผํ•œ๋‹ค.(JDK 1.8๋ถ€ํ„ฐ ๊ฐ€๋Šฅ) STS์—์„œ๋Š” windows - preferences(setting) - compiler - classfile generation ์—์„œ store information about method parameters(usable via reflection)์— ์ฒดํฌํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ €์žฅํ•˜๋„๋ก ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

package com.fastcampus.ch2;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

class ModelController {
	public String main(HashMap map) {
		
//		์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ map์— ์ €์žฅ 
		map.put("id", "asdf");
		map.put("pwd", "1111");
		
//		๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ 
		return "txtView2";
	}
}

public class MethodCall {
	public static void main(String[] args) throws Exception{
		HashMap<String, String> map = new HashMap<>();
		System.out.println("before:"+map);

		ModelController mc = new ModelController();
		String viewName = mc.main(map);
		
		System.out.println("after :"+map);
		
		render(map, viewName);
	}
	
	static void render(HashMap<String, String> map, String viewName) throws IOException {
		String result = "";
		
		// 1. ๋ทฐ์˜ ๋‚ด์šฉ์„ ํ•œ์ค„์”ฉ ์ฝ์–ด์„œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ ๋‹ค.
		Scanner sc = new Scanner(new File(viewName+".txt"));
		
		while(sc.hasNextLine())
			result += sc.nextLine()+ System.lineSeparator();
		
		// 2. map์— ๋‹ด๊ธด key๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ template์˜ ${key}๋ฅผ value๋ฐ”๊พผ๋‹ค.
		Iterator<String> it = map.keySet().iterator();
		
		while(it.hasNext()) {
			String key = (String)it.next();

			// 3. replace()๋กœ key๋ฅผ value ์น˜ํ™˜ํ•œ๋‹ค.
			result = result.replace("${"+key+"}", (String)map.get(key));
		}
		
		// 4.๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
		System.out.println(result);
	}
}

 

์œ„ ์ฝ”๋“œ์—์„œ `ModelController` ํด๋ž˜์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ `map`์„ ๋ฐ›์•„์™€์„œ `map`์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•  ๋ฟ map์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.(๊ทธ๋ƒฅ ๋ณด์—ฌ์ค„ view ์ด๋ฆ„๋งŒ String์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.) ์™œ๋ƒํ•˜๋ฉด `MethodCall` ํด๋ž˜์Šค์˜ ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์—์„œ `map`์„ ์ƒ์„ฑํ•˜์—ฌ ๋„˜๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์—๋Š” ์ด๋ฏธ `map`์ด ์กด์žฌํ•˜๋ฏ€๋กœ ๋„˜๊ธธ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋ฉด, ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ `ModelController`์—์„œ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์˜ `map`์— ๊ฐ’์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

//	String viewName = obj.main(2024, 1, 1, model);
//	Reflection API๋ฅผ ์ด์šฉํ•œ ํ˜ธ์ถœ
String viewName = (String)main.invoke(obj, new Object[] { 2024, 1, 1, model });

 

//	String viewName = obj.main(2024, 1, 1, model);
//	Reflection API๋ฅผ ์ด์šฉํ•œ ํ˜ธ์ถœ
//	String viewName = (String)main.invoke(obj, new Object[] { 2024, 1, 1, model });

//	ํ•˜๋“œ์ฝ”๋”ฉX ๋™์  ํ˜ธ์ถœ
Method main = clazz.getDeclaredMethod("main", int.class, int.class, int.class, Model.class);
				
Parameter[] paramArr = main.getParameters();
Object[] argArr = new Object[main.getParameterCount()];
		
	for(int i=0;i<paramArr.length;i++) {
		String paramName = paramArr[i].getName();
		Class  paramType = paramArr[i].getType();
		Object value = map.get(paramName); // map์—์„œ ๋ชป์ฐพ์œผ๋ฉด value๋Š” null

		// paramType์ค‘์— Model์ด ์žˆ์œผ๋ฉด, ์ƒ์„ฑ & ์ €์žฅ 
		if(paramType==Model.class) {
			argArr[i] = model = new BindingAwareModelMap(); 
		} else if(value != null) {  // map์— paramName์ด ์žˆ์œผ๋ฉด,
			// value์™€ parameter์˜ ํƒ€์ž…์„ ๋น„๊ตํ•ด์„œ, ๋‹ค๋ฅด๋ฉด ๋ณ€ํ™˜ํ•ด์„œ ์ €์žฅ  
			argArr[i] = convertTo(value, paramType);				
		} 
	}

 

`Model`์€ ์ธํ„ฐํŽ˜์ด์Šค๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. model์˜ ์‹ค์ฒด ๊ตฌํ˜„ ๊ฐ์ฒด๋Š” `BindingAwareModelMap`์ด๋‹ค. 

 

 

JSP์™€ ์„œ๋ธ”๋ฆฟ์€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๋‹ค. ์„œ๋ธ”๋ฆฟ์„ ๋ฐœ์ „์‹œํ‚จ ๊ฒƒ์ด Spring์ด๋‹ค. 

1. servlet์€ ๋ฐ˜๋“œ์‹œ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ด `service()`์ด๋‹ค. (์˜ค๋ฒ„๋ผ์ด๋”ฉ)

2. `HttpServlet`์„ ์ƒ์†๋ฐ›์•„์•ผ ํ•œ๋‹ค. 

3. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ `HttpServletRequest`์™€ `HttpServletResponse`๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

4. ํด๋ž˜์Šค ๋งคํ•‘๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ์œ„์— `@WebServlet` ์• ํ„ฐ๋„ค์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

์„œ๋ธ”๋ฆฟ ์ƒ๋ช…์ฃผ๊ธฐ

Servlet Context์—๋Š” children์ด๋ž€ ๋งต์ด ์กด์žฌํ•œ๋‹ค. ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ childeren์— ํ•ด๋‹น ์„œ๋ธ”๋ฆฟ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด `init()` ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  `service()` ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ตํ•œ๋‹ค. ์„œ๋ธ”๋ฆฟ์ด ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜๋Š”๋ฐ, ์ด๋•Œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด `destroy()` ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์ด๋ฏธ ์„œ๋ธ”๋ฆฟ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด `init()`์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ `service()`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. 

์„œ๋ธ”๋ฆฟ์€ ์‹ฑ๊ธ€ํ†ค์ด๋‹ค. ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์žฌํ™œ์šฉํ•œ๋‹ค. ์Šคํ”„๋ง๋„ ๋งˆ์ฐฌ๊ฐ€์ง€!

 

์„œ๋ธ”๋ฆฟ์€ ์ง€์—ฐ๋œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.(lazy init)  ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. -๋ฏธ๋ฆฌ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ œ๊ณตํ•˜๊ธด ํ•จ.

์Šคํ”„๋ง์€ ์ด๋ฅธ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.(early init) ์š”์ฒญ์ด ๋“ค์–ด์˜ค์ง€ ์•Š์•„๋„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด๋‘”๋‹ค. 

 

URL ํŒจํ„ด

`@WebServlet`์œผ๋กœ url์„ ๋งตํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์กด์žฌํ•จ. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์—์„œ ๋งค์นญ์ด ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ์šฐ์„ ์ˆœ์œ„๋กœ ๋„˜์–ด๊ฐ€๊ณ  ๋ชจ๋‘ ๋งค์นญ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋””ํดํŠธ ๋งคํ•‘ํ•จ. Servlet Context์—๋Š” servletMapping์ด๋ผ๋Š” ๋งต์ด ์กด์žฌํ•œ๋‹ค. ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ๋งคํ•‘์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. 

* spring์—์„œ๋Š” seveltMapping์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ `DispatcherServlet`์ด ๋ฐ›์•„์„œ ๋‚ด๋ถ€์—์„œ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•œ๋‹ค(RequestMapping) 

 

EL(Expression Laguage)

<% ... &> ๋Œ€์‹ ์— ${...} ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ