[TIL] 2022.12.03

rara_kimยท2022๋…„ 12์›” 3์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
23/25

๐Ÿ’ก์˜ค๋Š˜์˜ ํ‚ค์›Œ๋“œ

DIP:Dependency Inversion Principle

์˜์กด์„ฑ ์—ญ์ „ ์›์น™, ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ.

  • ์ž์‹ ๋ณด๋‹ค ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์— ์˜์กดํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
  • ํ•˜์œ„ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์ด ์ƒ์œ„ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•˜๋Š” ์˜์กด์„ฑ์„ ๋Š์–ด๋‚ด์•ผ ํ•œ๋‹ค.

์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด...

๊ฒฐ์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, A์‚ฌ์˜ ๊ฒฐ์ œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

//๊ฒฐ์ œ ์„œ๋น„์Šค
public class A {
	public int payByCash(int amount) {
    	return money -amount;
    }
}

public class PayAService {
	private A payA;
    
    public int payByCash(int amount) {
    	return payA.payByCash(amount);
    }
}

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ตฌํ˜„์„ ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•œ๋‹ค.

  • ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค.
    • ์˜จ์ „ํžˆ PayAService๋งŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๋‹ค. A๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ๋™์ž‘ํ•ด์•ผ๋งŒ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ™•์žฅ ๋ฐ ๋ณ€๊ฒฝ์ด ์–ด๋ ต๋‹ค.
    • ๋งŒ์•ฝ B์‚ฌ์˜ ์„œ๋น„์Šค๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์„œ๋น„์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ DIP๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


DIP ์ ์šฉ

๊ธฐ๋Šฅ์„ ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ๊ณผ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

  • ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ : ์•Œ๋ฆผ
  • ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ : A์‚ฌ์˜ ์•Œ๋ฆผ ์„œ๋น„์Šค, B์‚ฌ์˜ ์•Œ๋ฆผ ์„œ๋น„์Šค

์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์€ ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, DIP๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ถ”์ƒ ํƒ€์ž…(ex. ์ธํ„ฐํŽ˜์ด์Šค, ์ถ”์ƒ ํด๋ž˜์Šค)์ด๋‹ค.

public interface PayService {
	int payByCash(int amount);
}


//A์‚ฌ ๊ฒฐ์ œ ์„œ๋น„์Šค
public class PayAService implements PayService {
	@Override
    public int payByCash(int amount) {
    	return money - amount;
    }
}


//B์‚ฌ ๊ฒฐ์ œ ์„œ๋น„์Šค
public class PayBService implements PayService {
	@Override
    public int payByCash(int amount) {
    	return money - amount;
    }
}

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด PayService๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ํšŒ์‚ฌ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ์ผ์ด ์—†์–ด์ง„๋‹ค.

Servlet

์„œ๋ธ”๋ฆฟ์€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•˜๋Š” Servlet ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ ๊ทœ์น™์„ ์ง€ํ‚จ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

์ด์ „์˜ ์›น ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŽ˜์ด์ง€๋ฅผ ๋„˜๊ฒจ ์ฃผ์—ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” ๋™์ ์ธ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์›น ์„œ๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์— ๋„์›€์„ ์š”์ฒญํ•œ ํ›„ ๊ฐ€๊ณต๋œ ํŽ˜์ด์ง€๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋œ๋‹ค.
์ด๋•Œ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.


Spring Container

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” Bean ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
Bean์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด IoC๊ฐ€ ์ด์šฉ๋˜๋ฉฐ BeanFactor ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ IoC ์ปจํ…Œ์ด๋„ˆ(=DI ์ปจํ…Œ์ด๋„ˆ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ)์— ํ•ด๋‹น๋˜๋ฉฐ, ์ด IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์†ํ•˜๋ฉด์„œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ApplicationContext์ด๋‹ค.

Spring MVC ์—ญ์‹œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฑฐ๋Œ€ํ•œ ์„œ๋ธ”๋ฆฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ์„œ๋ธ”๋ฆฟ ์—†์ด Spring MVC๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ Spring์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ง€, ์„œ๋ธ”๋ฆฟ์ด ํ•„์š” ์—†๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์™€ ๋…๋ฆฝ์ ์ธ ์กด์žฌ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Spring Bean์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

DispatcherServlet

DispatcherServlet์€ ํ‘œํ˜„ ๊ณ„์ธต ์ „๋ฉด์—์„œ HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.
Spring MVC์˜ ํ•ต์‹ฌ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.
์ดํ›„ ๊ณตํ†ต ์ž‘์—…์„ DipatcherServlet์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด์™ธ ์ž‘์—…์€ ์ ์ ˆํ•œ ์„ธ๋ถ€ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์œ„์ž„ํ•œ๋‹ค.

1๏ธโƒฃDispatcherServlet์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์›น ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค.
2๏ธโƒฃ์›น ์š”์ฒญ์„ Handler Mapping์— ์œ„์ž„ํ•˜์—ฌ ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Handler(Controller)๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
3๏ธโƒฃ์ฐพ์€ Handler๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” HandlerAdapter๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
4๏ธโƒฃ์ฐพ์€ Handler Adapter๋ฅผ ์‚ฌ์šฉํ•ด์„œ Handler์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
5๏ธโƒฃHandler์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ Model๊ณผ View์ด๋‹ค.
6๏ธโƒฃView ์ด๋ฆ„์„ ViewResolver์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ViewResolver๋Š” ํ•ด๋‹นํ•˜๋Š” View ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
7๏ธโƒฃDispatcherServlet์€ View์—๊ฒŒ Model์„ ์ „๋‹ฌํ•˜๊ณ  ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
8๏ธโƒฃ์ด๋•Œ, Model์ด null์ด๋ฉด View๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด View์— Model ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
9๏ธโƒฃ์ตœ์ข…์ ์œผ๋กœ DispatcherServlet์€ View ๊ฒฐ๊ณผ(HttpServletResponse)๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์œ„์˜ ์‚ฌ์ง„์€ @Controller๊ธฐ์ค€์ด๋ฉฐ, @RestController์˜ ๊ฒฝ์šฐ 6๋ฒˆ๊ณผ 7๋ฒˆ ๊ณผ์ •์ด ์ƒ๋žต๋œ๋‹ค.
์ฆ‰, @RestController์€ ViewResolver๋ฅผ ํƒ€์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ ๊ฐ’์— ์•Œ๋งž๋Š” MessageConverter๋ฅผ ์ฐพ์•„ ์‘๋‹ต ๋ณธ๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค.


๐Ÿ“š์ฐธ๊ณ 
[Spring] Servlet, Servlet Container, Spring MVC ์ •๋ฆฌ

profile
๋Š๋ฆฌ๋”๋ผ๋„ ๊พธ์ค€ํ•˜๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€