๐Ÿผ ๋ฐฑ์•ค๋“œ/Spring

์Šคํ”„๋ง ๊ฐœ๋…์žก๊ธฐ

๊ณ„๋ž€์†Œ๋…„ 2023. 9. 1. 19:41

์Šคํ”„๋ง์€ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค

ํ”„๋ ˆ์ž„์›Œํฌ:ํ‹€ ์•ˆ์—์„œ ๋™์ž‘. ํ‹€์„ ๋งž์ถฐ์ค„ํ…Œ๋‹ˆ ํ‹€์— ๋งž์ถฐ์„œ ๊ฐœ๋ฐœํ•ด๋ผ

 

์Šคํ”„๋ง์€ ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค

๋‚ด๋ถ€๋ฅผ ๋œฏ์–ด๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค. + ๋ฌด๋ฃŒ

 

์Šคํ”„๋ง์€ IoC(Inversion of Controller = ์ œ์–ด์˜ ์—ญ์ „) ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์Šคํ”„๋ง์— ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

์ฃผ๋„๊ถŒ์ด ์Šคํ”„๋ง์— ์žˆ๋‹ค. 

ํด๋ž˜์Šค: ์„ค๊ณ„๋„

์˜ค๋ธŒ์ ํŠธ: ์‹ค์ฒดํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ

์ธ์Šคํ„ด์Šค: ์‹ค์ฒดํ™” ๋œ ๊ฒƒ

๊ฐ€๊ตฌ(ํด๋ž˜์Šค-์ถ”์ƒ์ ) - ์˜์ž,์นจ๋Œ€(์˜ค๋ธŒ์ ํŠธ) - ์ธ์Šคํ„ด์Šค

 

์˜ค๋ธŒ์ ํŠธ๋ฅผ new๋กœ ํ•ด์„œ heap ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค. 

์˜์ž s = new ์˜์ž();

s๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๊ฐ€ ๋˜๊ณ , s๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ๋งŒ ์‚ฌ์šฉ๋จ.  ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ์ด ์˜์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด,

์˜์ž s = new ์˜์ž(); ์ด๊ฑฐ๋ฅผ  ๋˜ ์น˜๋ฉด ์ƒˆ๋กœ์šด ์˜์ž๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ.  ๊ฐ™์€ ์˜์ž๋กœ ์‚ฌ์šฉ์ด ์•ˆ๋จ.

 

์Šคํ”„๋ง์€ ์ฝ์–ด์™€์„œ ์ž๊ธฐ๊ฐ€ ์ด ๊ฐ์ฒด๋“ค์„ ์•Œ์•„์„œ ์ง์ ‘ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๋„์šด๋‹ค.

์ด๊ฑธ IoC

 

์Šคํ”„๋ง์€ DI(Dependency Injection - ์˜์กด์„ฑ ์ฃผ์ž…)๋ฅผ ์ง€์›ํ•œ๋‹ค.

์›๋ž˜๋Š” ๋‚ด๊ฐ€ newํ•ด์„œ ๊ทธ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋‚ด๊ฐ€ ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ, ์ด์ œ๋Š” ์Šคํ”„๋ง์ด ์Šค์บ”ํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋„์›€.(=Ioc, ์ œ์–ด์˜ ์—ญ์ „)

์Šคํ”„๋ง์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด๋“ค์„ ์กฐ๋ฆฝํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์—์„œ ์ด ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๊ฒŒ ๋‹ค ๊ฐ™์€๊ฒƒ: ์‹ฑ๊ธ€ํ†ค= ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ๊ณณ์—์„œ ์ด ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

์Šค์บ”ํ•˜๋ฉด ์ด ์˜์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฑ ํ•œ๋ฒˆ ๋œจ๊ณ , ์ด ์˜์ž๋ฅผ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•„์š”ํ•œ ๊ณณ์—์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๋Š” ๊ฒƒ์„ DI๋ผ๊ณ  ํ•œ๋‹ค.

 

 

์Šคํ”Œ๋ง์€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ•„ํ„ฐ= ๋ฌธ์ง€๊ธฐ!! ๊ถŒํ•œ ์žˆ์œผ๋ฉด ๋“ค์–ด์˜ค๊ณ , ์•„๋‹ˆ๋ฉด ๋ชป๋“ค์–ด์˜จ๋‹ค.

ํ†ฐ์ผ“์€ ๋‚˜๋ผ! ์™•์˜ ์ง‘์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

A๋‚˜๋ผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฌธ:ํ†ฐ์ผ“ filter (web.xml)

์™•์˜ ์ง‘์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฌธ: ์ธํ„ฐ์…‰ํ„ฐ(AOP)

 

 

์Šคํ”„๋ง์€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(๋ฆฌํ”Œ๋ ‰์…˜, ์ปดํŒŒ์ผ์ฒดํ‚น)

์–ด๋…ธํ…Œ์ด์…˜(์ฃผ์„+ํžŒํŠธ) - ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

// (์ฃผ์„) - ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์‹œ

Animal(){
	run()
}
Dog extends Animal{
    @override
    run();
    fly(); //์ปดํŒŒ์ผ์ฒดํ‚น ์‹œ ์—๋Ÿฌ
}

 

์Šคํ”„๋ง ->์–ด๋…ธํ…Œ์ด์…˜ ๊ฐ์ฒด ์ƒ์„ฑ

@component(ํด๋ž˜์Šค ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ), @Autowired(์˜์กด์„ฑ์ฃผ์ž…,๋กœ๋”ฉ๋œ ๊ฐ์ฒด๋ฅผ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ง‘์–ด ๋„ฃ์–ด)

์ด๋Ÿฌํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค๊ณ , ์—ญํ• ์„ ๋ฏธ๋ฆฌ ์•ฝ์†

@Component

class A{

}

์Šคํ”„๋ง์—์„œ๋Š” IoC๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์„œ, ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— A๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•œ๋‹ค.

Bํด๋ž˜์Šค์—์„œ A๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด

class B{
    @Autowired
    A a
}

๋ผ๊ณ  ๋งŒํ•˜๋ฉด๋จ.

์Šคํ”„๋ง์ด Bํด๋ž˜์Šค๋ฅผ ์ฝ์„๋•Œ, Bํด๋ž˜์Šค ๋‚ด๋ถ€์— ์–ด๋–ค ์• ๊ฐ€ ์žˆ๋Š”์ง€ ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋ฆฌํ”Œ๋ ‰์…˜์ด๋ผ๊ณ  ํ•˜๊ณ ,

์ด๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ๋ฉ”์„œ๋“œ,ํ•„๋“œ,์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒŒ ์žˆ๋‹ค๋ฉด ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ํ•ด๋ผ๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฆฌํ”Œ๋ ‰์…˜์€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์—์„œ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง์€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์–ด๋…ธํ…Œ์ด์…˜์„ ์Šค์บ”ํ•˜๊ณ  ๋นˆ์„ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉฐ, ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@Autowired(๋กœ๋”ฉ๋œ ๊ฐ์ฒด๋ฅผ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ง‘์–ด ๋„ฃ์–ด) ์ด๋ฏ€๋กœ ์Šคํ”„๋ง์ด ์ง์ ‘ ์ง‘์–ด ๋„ฃ์€ ๊ฐ์ฒด ์ค‘ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ํž™์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ

์—†์œผ๋ฉด  a๋Š” null์ด ๋˜๊ณ , ์žˆ์œผ๋ฉด a์—  ๋ฉ”๋ชจ๋ฆฌ์˜ Aํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ ์ด๋ฅผ DI๋ผ๊ณ  ํ•œ๋‹ค.

 

์–ด๋…ธํ…Œ์ด์…˜=์ฃผ์„+ํžŒํŠธ

๋ฆฌํ”Œ๋ ‰์…˜=๋ถ„์„ํ•˜๋Š” ๊ธฐ๋ฒ•->๋Ÿฐํƒ€์ž„์‹œ ๋ถ„์„

 

 

์Šคํ”„๋ง์€ MessageConverter๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ํ˜„์žฌ Json์ด๋‹ค.

์˜๊ตญ์ธ๊ณผ ํ•œ๊ตญ์ธ์ด ๋Œ€ํ™”๋ฅผ ํ•˜๋Š”๋ฐ, ์„œ๋กœ ์–ธ์–ด๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๋ฒˆ์—ญ์ด ํ•„์š”ํ•˜๋‹ค.

ํ•œ๊ตญ์–ด๋กœ ํ•˜๋ฉด ์˜๊ตญ์ธ์ด ํž˜๋“ค๊ณ , ์˜์–ด๋กœ ํ•˜๋ฉด ํ•œ๊ตญ์ธ์ด ํž˜๋“ค๋‹ค.

์ด๋•Œ, ์ค‘๊ฐ„๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ฆ‰, ํ•œ๊ตญ์ธ๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ , ์˜๊ตญ์ธ๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ

์ค‘๊ฐ„์–ธ์–ด:JSON 

์ž๋ฐ” Object์™€ ํŒŒ์ด์ฌ Object๋Š” ์ƒ๊ธด๊ฒŒ ๋‹ค๋ฅด๋‹ค.

์ž๋ฐ” Object -> JSON -> ํŒŒ์ด์ฌ Object๋กœ ๋ฐ”๋€๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด

Class Animal{
    int num = 10;
    String name = "์‚ฌ์ž";
}

Json์€

{"num":10,"name":"์‚ฌ์ž"}

์ค‘๊ฐ„๋ฐ์ดํ„ฐ์ธ JSON์œผ๋กœ ์ž๋™์œผ๋กœ ์ปจ๋ฒ„ํŒ… ํ•ด์ฃผ๋Š”๊ฒŒ MessageConverter์ด๋‹ค. 

์š”์ฒญ ํ•  ๋•Œ, ์‘๋‹ต ๋ฐ›์„ ๋•Œ ๋ชจ๋‘ ํ•ด์ค€๋‹ค. 

 

์ž๋ฐ” Object๋ฅผ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์— request(์š”์ฒญ)ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋ฐ”๊พธ๋Š”๋ฐ, ์ด ์—ญํ• ์„ MessageConverter๊ฐ€ ํ•ด์ฃผ๊ณ , ์ด๋Š” Jackson์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๋‹ค.

 

์Šคํ”„๋ง์€ BufferedReader์™€ BufferedWriter๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ ํ†ต์‹ ์—์„œ๋Š” ๋ฐ”์ดํŠธ(byte) ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ๋Š” 0๊ณผ 1๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋ฌธ

์ž๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๋ฐ”์ดํŠธ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, 8๋น„ํŠธ(1๋ฐ”์ดํŠธ)๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ InputStream์œผ๋กœ ์ฝ๋Š”๋ฐ, ์ด ๋ฐ”์ดํŠธ๋ฅผ ๋ฌธ์ž๋กœ ์บ์ŠคํŒ…ํ•ด์•ผํ•˜๋Š”๋ฐ,

์ด ํด๋ž˜์Šค๋ฅผ InputStreamReader๋ผ๋Š” ํด๋ž˜์Šค๋กœ ๋ฐ”์ดํŠธ๋ฅผ ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์„œ ๋ฌธ์ž๋กœ ์ค€๋‹ค.

๋ฐฐ์—ด์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋ฐ›๋Š”๋ฐ ๋ฐฐ์—ด์€ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ์•ผ ํ•œ๋‹ค.  ํฌ๊ฒŒ ์ •ํ•ด๋„ ๋ฌธ์ œ, ์ ๊ฒŒ ์ •ํ•ด๋„ ๋ฌธ์ œ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด BufferedReader๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”๋ฐ ์ด๋Š” ๊ฐ€๋ณ€๊ธธ์ด์˜ ๋ฌธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

ํ†ต์‹ ์€ Byte Stream์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ, ์ „์†ก๋‹จ์œ„๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค

์ด๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด

๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” @ResponseBody๋ฅผ ํ•˜๋ฉด Buffered writer๊ฐ€ ๋™์ž‘ํ•˜๊ณ ,

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ๋Š” @RequestBody๋ฅผ ํ•˜๋ฉด BufferedReader๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

 

์Šคํ”„๋ง์€ ๊ณ„์† ๋ฐœ์ „์ค‘์ด๋‹ค.