๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Legacy

2022.03.15์˜ ๊ธฐ๋ก

by GroovyArea 2022. 3. 15.

โ–ถ ์˜ค๋Š˜ ๊ณ„ํš

=>  ๊ณต๋ถ€ ๊ด€๋ จ

1) ์ˆ˜์—… ๋‚ด์šฉ ๋ณต์Šต

2) MVC ๊ฐ์ฒด์ง€ํ–ฅ ๋ฆฌํŒฉํ† ๋ง

3) ์Šคํ”„๋ง ๊ฐ•์˜ ์ˆ˜๊ฐ• ๋ชฉํ‘œ 8,9๊ฐ•

์ค‘๊ธ‰ํŽธ ๋นจ๋ฆฌ ๊ฐ€์ž..!

 


โ–ถ ๋ฌธ์ œ ์ •๋ฆฌ

โ— MVC ๋ฆฌํŒฉํ† ๋ง โ—

1. enum๋„ view์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

public class Controller {

	// ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•„๋“œ
	private Result result;

	// play ๋ฉ”์„œ๋“œ
	public void playRsp(Rsp playerRsp) throws RspException {

		// ์‚ฌ์šฉ์ž ๊ฐ์ฒด ์ƒ์„ฑ
		final Player player = new Player(playerRsp);
		
		// ๊ฒŒ์ž„๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๊ฐ’์„ ํ•„๋“œ์— ์ €์žฅ
		this.result = player.play();
		
		// ๊ฐ€์œ„๋ฐ”์œ„๋ณด ์ƒํƒœ ๊ฐ’ ์ถœ๋ ฅ
		ViewOutput.whatYouInput(player.getRsp(), player.getComputer().getComRsp());
		
		gameCount(); 
		resultChange(); 
	}

	// ์Šน๋ฆฌ ๋ฌด์Šน๋ถ€ ์นด์šดํŠธ ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ
	public void gameCount() {
		Result.gameCount(result);
	}

	// viewOutput ๊ฒฐ๊ณผ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ
	public void resultChange() {
		if (result == Result.WIN)
			ViewOutput.singleGameResult(PrintGameResult.of(result));
		if (result == Result.DRAW)
			ViewOutput.singleGameResult(PrintGameResult.of(result));
		if (result == Result.LOSE)
			ViewOutput.singleGameResult(PrintGameResult.of(result));
	}

	// ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
	public Result gameResult() {
		return result;
	}
}

=> ์ปจํŠธ๋กค๋Ÿฌ์— ๋กœ์ง์„ ์ด๊ด€ ํ›„ view๋กœ ํ•ด๊ฒฐ

 

public static PrintGameResult of(Result result) {

		switch (result) {
		case WIN:
			return WIN_RESULT;
		case DRAW:
			return DRAW_RESULT;
		default:
			return LOSE_RESULT;
		}

	}

=> ๋กœ์ง ๋Œ€์‹  ์ƒ์ˆ˜ ๋ฐ˜ํ™˜ of ๋ฉ”์„œ๋“œ๋กœ ํ•ด๊ฒฐ

 

 

2. ๋ชจ๋ธ๋ผ๋ฆฌ์˜ ์˜์กด์„ ํ•˜์ง€๋ง๊ณ  ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์‹œ์ผœ๋ผ (์˜์กด ๊ด€๊ณ„ ใ„ดใ„ดใ„ด)

// setter ๋Œ€์‹  ์ƒ์„ฑ์ž๋กœ ๋Œ€์ž…์‹œ์ผœ์„œ ํ•ด๊ฒฐ
	// ์ปดํ“จํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ์‹œ ์ž๋™ ์ˆซ์ž(๊ฐ€์œ„๋ฐ”์œ„๋ณด) ์ €์žฅ
	public Computer(final int comRsp) {
		this.comRsp = comRsp;
	}

=> ์™ธ๋ถ€์—์„œ ์ปดํ“จํ„ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์ž๋™์ˆซ์ž ๊ฐ€์œ„๋ฐ”์œ„๋ณด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž๋™ ์ธ์ ์…˜

 

			// ๊ฒŒ์ž„ ์‹คํ–‰!
			controller.playRsp(ViewInput.inputPlayerRsp(), new Computer(new ComputerNumber().getComputerNumber()));

=> ์š”๊ฒŒ ์ปดํ„ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ธ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ์ฒด ๋„ฃ์Œ

 

public class Controller {

	// ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•„๋“œ
	private Result result;

	// play ๋ฉ”์„œ๋“œ
	public void playRsp(Rsp playerRsp, Computer computer) throws RspException {

		// ์‚ฌ์šฉ์ž ๊ฐ์ฒด ์ƒ์„ฑ
		final Player player = new Player(playerRsp);
		
		// ๊ฒŒ์ž„๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๊ฐ’์„ ํ•„๋“œ์— ์ €์žฅ
		this.result = gameOf(player, computer);
		
		// ๊ฐ€์œ„๋ฐ”์œ„๋ณด ์ƒํƒœ ๊ฐ’ ์ถœ๋ ฅ
		ViewOutput.whatYouInput(player.getRsp(), computer.getComRsp());
		
		gameCount(); 
		resultChange(); 
	}

	// ์Šน๋ฆฌ ๋ฌด์Šน๋ถ€ ์นด์šดํŠธ ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ
	public void gameCount() {
		Result.gameCount(result);
	}

	// viewOutput ๊ฒฐ๊ณผ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ
	public void resultChange() {
		if (result == Result.WIN)
			ViewOutput.singleGameResult(PrintGameResult.of(result));
		if (result == Result.DRAW)
			ViewOutput.singleGameResult(PrintGameResult.of(result));
		if (result == Result.LOSE)
			ViewOutput.singleGameResult(PrintGameResult.of(result));
	}

	// ๊ฒฐ๊ณผ ์–ป์–ด์˜ค๋Š” ๋ฉ”์„œ๋“œ
	public Result gameOf(Player player, Computer computer) throws RspException {
		return Result.getGameResult(player.getRsp(), computer.getComRsp());
	}
	
	// ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
	public Result gameResult() {
		return result;
	}

=> ์ปจํŠธ๋กค๋Ÿฌ ์ˆ˜์ •๋ณธ


โ–ถ ๊ฐœ์ธ ๊ณต๋ถ€

โ— ๊ธฐ์„ ๋‹˜ ๊ฐ•์˜ ์ •๋ฆฌ โ—

1. ์ œ์–ด์˜ ์—ญ์ „

 

⇒ ์ƒ์„ฑ์ž๋กœ์„œ ์˜์กด ์ฃผ์ž…, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณด๋Š” IOC์˜ ์—ญํ•  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณด๋Š” IOC์˜ ์—ญํ•  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

 

 

2. ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ

 

⇒ ๋…น์ƒ‰ ์ฝฉ์ด ์ปจํ…Œ์ด๋„ˆ์— Bean์œผ๋กœ ๋“ฑ๋ก๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

 

IOC ๊ฐ€ ํƒ€์ž…์„ ์ฐพ์•„์„œ bean์„ ์ฃผ์ž…ํ•œ๋‹ค.

⇒ ์˜์กด์„ฑ ์ฃผ์ž…์€ bean๋ผ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋“ฑ๋ก๋œ ๋†ˆ๋“ค๋งŒ ๊ฐ€๋Šฅํ•จ!

 

applicationContext๋กœ ์ง์ ‘ ๊ฐ€์ ธ์˜จ bean๊ฐ์ฒด์™€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฃผ์ž…ํ•ด์ค€ ๊ฐ์ฒด์˜ ๋น„๊ต๋Š” ๊ฐ’์ด ๊ฐ™๋‹ค. ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋‚˜ ์ฃผ์ž…ํ•ด์ค€๊ฑฐ๋‚˜ ๊ฒฐ๊ตญ ๊ฐ™์€ ๋†ˆ์ž„.

 

⇒ ๋‘ ์ธ์Šคํ„ด์Šค์˜ ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’์ด ๊ฐ™์Œ.

 

3. ์Šคํ”„๋ง ๋นˆ(Bean)

 

⇒ ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†์–ด๋„ ๋นˆ ๋“ฑ๋ก์ด ๋˜๋Š” ๊ฒฝ์šฐ / JPA์˜ ๊ธฐ๋Šฅ์œผ๋กœ ํŠน์ •ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„์„œ ๊ตฌํ˜„์ฒด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋นˆ ๋“ฑ๋ก์ด ์ผ์–ด๋‚จ.
⇒ ์ง์ ‘ Bean์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ bean ๋“ฑ๋ก์ด ๋จ!

 

⇒ ๊ตณ์ด ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…์„ ํ•˜์ง€ ์•Š์•„๋„ AutoWired๋กœ ๊ฐ™์€ ํƒ€์ž… ์ž๋™ ์ฃผ์ž…

 

4. ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)

 

⇒ Spring Framework Reference์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ์ž ์ฃผ์ž…!

⇒ ์ƒ์„ฑ์ž ์ฃผ์ž…์˜ ๋ฌธ์ œ : ์ˆœํ™˜ ์ฐธ์กฐ( a→ b →c ์ฐธ์กฐ....) → ์ด ๊ฒฝ์šฐ๋Š” Setter or ํ•„๋“œ ์ธ์ ์…˜

5. ์Šคํ”„๋ง AOP

 

⇒ stopWatch ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋“ค.

 

6. ํ”„๋ก์‹œ ํŒจํ„ด

 

⇒ ํ”„๋ก์‹œ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•„์ˆ˜!

 

์Šคํ”„๋ง์€ ๋นˆ ๋“ฑ๋ก ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์ž๋™์œผ๋กœ ํ”„๋ก์‹œ ํŒจํ„ด์ด ์ ์šฉ๋œ๋‹ค.

๋”ฅํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์€ ํ† ๋น„์˜ ์Šคํ”„๋ง3 ์ถ”์ฒœ!

 


โ–ถ ์ˆ˜์—… ๋‚ด์šฉ

Spring MVC

ServletContext.xml

component-scan

  • Spring Annotation์„ ์‚ฌ์šฉํ•œ ํด๋ž˜์Šค๊ฐ€ ์ž‘์„ฑ๋œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์—˜๋ฆฌ๋จผํŠธ
  • ⇒ ํŒจํ‚ค์ง€์— ์ž‘์„ฑ๋œ ํด๋ž˜์Šค์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ Spring Container๊ฐ€ ์ฒ˜๋ฆฌ
  • base-package ์†์„ฑ : ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •

Annotation

@Controller

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Controller ํด๋ž˜์Šค๋ฅผ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ ํด๋ž˜์Šค๋ช…์ด beanName์œผ๋กœ ๋“ฑ๋ก๋˜๋ฉฐ value ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ beanName ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ⇒ Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š์•„๋„ Controller ํด๋ž˜์Šค๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ⇒ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค์ˆ˜์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ - @RequestMappint ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

@RequestMapping

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ @GetMapping, @PostMapping, @PutMapping, @DeleteMapping ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • value ์†์„ฑ : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ •๋ณด(URL)์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
  • ⇒ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ •๋ณด์— ์˜ํ•ด Front Controller(Dispatcher Servlet)๊ฐ€ Controller ํด๋ž˜์Šค์˜ ์š”์ฒญ
  • ⇒ ๋‹ค๋ฅธ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’๋งŒ ์„ค์ • ๊ฐ€๋Šฅ
  • ⇒ ๋‹ค๋ฅธ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์— ๊ฐ™์€ ์ด๋ฆ„์˜ ์š”์ฒญ ์ •๋ณด๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ WAS ์‹คํ–‰ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ - ์ค‘๋ณต ๊ธˆ์ง€
  • method ์†์„ฑ : ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ๋ฐฉ์‹์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
  • ⇒ RequestMethod ์ž๋ฃŒํ˜• (Enum)์˜ ์ƒ์ˆ˜๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
  • ์š”์ฒญ ๋ฐฉ์‹์— ๋”ฐ๋ผ @GetMapping, @PostMapping ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ์„ค์ • ๊ฐ€๋Šฅ

@RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์˜ ์š”์ฒญ URL ์ฃผ์†Œ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ (get, post...)

  • ์š”์ฒญ url์„ ๊ฐ™๊ฒŒ ํ•˜๋ฉด ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ•  ๋•Œ ํŽธํ•จ
  • ์š”์ฒญ ๋ฐฉ์‹ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋„ ํ•„์š” ์—†์Œ

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์„œ๋ฒ„ ๋ฆฌ์Šคํƒ€ํŠธ ํ›„ ์—๋Ÿฌ ์œ ๋ฌด ํ™•์ธ

@ModelAttribute

  • @ModelAttribute ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฉ”์„œ๋“œ์— ์„ ์–ธํ•œ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’(๊ฐ์ฒด)์„ ํ˜„์žฌ Controller ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ๋ชจ๋“  ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ทฐํŽ˜์ด์ง€์—๊ฒŒ ์‚ฌ์šฉ๋˜๋„๋ก ์†์„ฑ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  • value(name) ์†์„ฑ : ๋ทฐํŽ˜์ด์ง€์—์„œ ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ๋ช…์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
  • ⇒ ๋‹ค๋ฅธ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’๋งŒ ์„ค์ • ๊ฐ€๋Šฅ

@RequestParam

  • ์ „๋‹ฌ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ์ „๋‹ฌ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ 400 ์—๋Ÿฌ ๋ฐœ์ƒ
  • ⇒ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌ๊ฐ’์ด ์ €์žฅ๋˜๋„๋ก ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  • value ์†์„ฑ : ์ „๋‹ฌ๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌ๊ฐ’ ์ €์žฅ ๊ฐ€๋Šฅ
  • ⇒ ๋‹ค๋ฅธ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’๋งŒ ์„ค์ • ๊ฐ€๋Šฅ
  • required ์†์„ฑ : false ๋˜๋Š” true ์ค‘ ํ•˜๋‚˜๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
  • ⇒ false : ์ „๋‹ฌ๊ฐ’ ๋ฏธํ•„์ˆ˜, true : ์ „๋‹ฌ๊ฐ’ ํ•„์ˆ˜ - ๊ธฐ๋ณธ
  • defaultValue ์†์„ฑ : ์ „๋‹ฌ๊ฐ’์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜ ์ „๋‹ฌ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๊ฐ’์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ • - ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ์‹œ ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ๊ฐ’!
@RequestMapping(value = "/param", method = RequestMethod.POST)
	public String form(@RequestParam(value =  "username", defaultValue = "์ž„๊บฝ์ •") String name, Model model) {
		model.addAttribute("name", name);
		return "param_display";
	}

Controller

์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ Front Controller(DispatcherServlet)์—๊ฒŒ ViewName์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ⇒ Front Controller๋Š” ์ œ๊ณต๋ฐ›์€ ViewName์„ ViewResolver ๊ฐ์ฒด์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ JSP ํŒŒ์ผ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„ ํฌ์›Œ๋“œ ์ด๋™ํ•˜์—ฌ ์‘๋‹ต ์ฒ˜๋ฆฌ
  1. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์„ void ์ž๋ฃŒํ˜•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ช…์„ ViewName์œผ๋กœ ์ œ๊ณต
  2. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์„ String ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ˜ํ™˜๊ฐ’(๋ฌธ์ž์—ด)์„ ViewName์œผ๋กœ ์ œ๊ณต → ๋ณดํŽธ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ
  3. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์„ ModelAndView ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ModelAndView ๊ฐ์ฒด๋กœ ViewName์„ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต

์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ทฐํŽ˜์ด์ง€(JSP)์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ModelAndView ๊ฐ์ฒด์— ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต
    • ⇒ ๋ทฐํŽ˜์ด์ง€(JSP)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ - RequestScope
  2. ModelAndView.addObject(String attributeName, @Nullable Object attributeValue)
  3. HttpServletRequest ๊ฐ์ฒด์— ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต
    • => ๋ทฐํŽ˜์ด์ง€(JSP)์—์„œ ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก HttpServletRequest ๊ฐ์ฒด์— ์†์„ฑ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  4. HttpServletRequest.setAttribute(String attributeName, Object attributeValue)
  5. Model ๊ฐ์ฒด์— ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต
    • Model.addAttribute(String attributeName, Object attributeValue)
    • => ๋ทฐํŽ˜์ด์ง€(JSP)์—์„œ ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Model ๊ฐ์ฒด์— ์†์„ฑ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  6. Model : ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋Ÿฌ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด

์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด Spring Container๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ Spring Bean ๊ฐ์ฒด๋ฅผ ์ œ๊ณต๋ฐ›์•„ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ž๋™ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต

Redirect Controller

ํฌ์›Œ๋“œ ์ด๋™

  • ์„œ๋ฒ„ ์ธก์—์„œ ๋‹ค๋ฅธ ์›นํ”„๋กœ๊ทธ๋žจ(JSP)์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์ด๋™ํ•˜์—ฌ ์‘๋‹ต ์ฒ˜๋ฆฌ
  • ⇒ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ URL ์ฃผ์†Œ ๋ฏธ๋ณ€๊ฒฝ, Request Scope๋กœ ์ œ๊ณต๋˜๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋ฐ˜ํ™˜๋˜๋Š” ViewName ์•ž์— redirect ์ ‘๋‘์‚ฌ(nameSpace)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ด๋™

⇒ ViewName์— ์˜ํ•ด ๋ทฐํŽ˜์ด์ง€(JSP)๋กœ ์‘๋‹ตํ•˜๋Š” ๋Œ€์‹  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ URL ์ฃผ์†Œ ์ „๋‹ฌ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ด๋™

  • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ URL ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝ, Request Scope๋กœ ์ œ๊ณต๋˜๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

RedirectAttributes

  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ด๋™์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ทฐํŽ˜์ด์ง€์—๊ฒŒ ์†์„ฑ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
    • ⇒ ๋‹ค์ด๋ ‰ํŠธ ์ด๋™์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ทฐํŽ˜์ด์ง€์—๊ฒŒ ์†์„ฑ๊ฐ’์„ ์ €์žฅํ•˜๋ฉฐ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • RedirectAttributes.addFlashAttribute(String attributeName, Object attributeValue)

Method Controller

HttpServletRequest.setCharacterEncoding(String encoding)

  • POST ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•˜์—ฌ ์ „๋‹ฌ๋œ ๊ฐ’์— ๋Œ€ํ•œ ์บ๋ฆญํ„ฐ์…‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ - UnSupportedException ๋ฐœ์ƒ : ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

Param Controller

@RequestMapping(value = "/param", method = RequestMethod.POST)
	public String form(String name, Model model) {
		model.addAttribute("name", name);

		return "param_display";
	}

์ „๋‹ฌ๊ฐ’์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ String ์ž๋ฃŒํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด Front Controller์— ์˜ํ•ด ์ „๋‹ฌ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์ œ๊ณต

⇒ web.xml ํŒŒ์ผ์—์„œ EncodingFilter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ๊ฐ’์— ๋Œ€ํ•œ ์บ๋ฆญํ„ฐ์…‹ ์„ค์ • ๊ฐ€๋Šฅ

  • ์ „๋‹ฌ๊ฐ’์˜ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” NULL ์ €์žฅ
  • ์ „๋‹ฌ๊ฐ’์— ๋Œ€ํ•œ ์บ๋ฆญํ„ฐ์…‹์„ ๋ฏธ๋ฆฌ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด web.xml ํŒŒ์ผ์—์„œ CharacterEncodingFilter ํด๋ž˜์Šค๋ฅผ ํ•„ํ„ฐ๋กœ ๋“ฑ๋กํ•ด์•ผ๋งŒ ์ •์ƒ์ ์ธ ์ „๋‹ฌ ๊ฐ’์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ

web.xml

filter

  • ํ•„ํ„ฐ ํด๋ž˜์Šค๋ฅผ ํ•„ํ„ฐ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์—˜๋ฆฌ๋จผํŠธ

Filter ํด๋ž˜์Šค

  • Filter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ž‘์„ฑ๋œ ์ž์‹ํด๋ž˜์Šค
  • ⇒ ์›นํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ „ ๋˜๋Š” ํ›„์— ๋™์ž‘๋  ๋ช…๋ น์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค

CharacterEncodingFilter

  • Spring Framework์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•„ํ„ฐ ํด๋ž˜์Šค๋กœ ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „ ๋ฆฌํ€˜์ŠคํŠธ ๋ฉ”์‹œ์ง€์˜ ๋ฐ”๋””(Body)์— ์ €์žฅ๋˜์–ด ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์˜ ์บ๋ฆญํ„ฐ์…‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
  • ⇒ encoding ์ด๋ฆ„์œผ๋กœ ์บ๋ฆญํ„ฐ์…‹์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌ

filter-mapping

  • ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ URL ์ฃผ์†Œ์˜ ํŒจํ„ด์„ ์„ค์ •ํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ
๋ฐ˜์‘ํ˜•

'Legacy' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

2022.03.17์˜ ๊ธฐ๋ก  (2) 2022.03.17
2022.03.16์˜ ๊ธฐ๋ก  (0) 2022.03.16
2022.03.14์˜ ๊ธฐ๋ก  (0) 2022.03.14
2022.03.11~03.13์˜ ๊ธฐ๋ก  (2) 2022.03.12
2022.03.08~03.10 ์˜ ๊ธฐ๋ก  (0) 2022.03.09