week 3 jonghun - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

JAVA

Java8์˜ heap ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š” ๊ทธ๋ฆฌ๊ณ  ํž™์˜์—ญ๊ณผ ์Šคํƒ์˜์—ญ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

  • stack, method( c๋กœ ์น˜๋ฉด data + static ), heap
  • method์˜์—ญ์€ ์‹คํ–‰์‹œ์ ์— ์†Œ์Šค์ฝ”๋“œ๋‚˜ static๋ณ€์ˆ˜๋“ค์ด ํ• ๋‹น
  • heap์˜์—ญ์€ ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋“ค์ด ํ• ๋‹น
  • stack์˜์—ญ์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ ์ง€์—ญ๋ณ€์ˆ˜๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น

memory

์ž๋ฐ”8์—์„œ ์†Œ๊ฐœ๋œ ๋žŒ๋‹ค์‹๊ณผ ๋ฉ”์†Œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์„ค๋ช…ํ•˜๋ผ.

๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” 1ํšŒ์šฉ ์ต๋ช… ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ > ํ•˜์ง€๋งŒ ์ž๋ฐ”๋Š” ๋…๋ฆฝ์ ์ธ ๋ฉ”์†Œ๋“œ๋งŒ์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ต๋ช…๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ ๋‹ค.
๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์‹(expression)์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ
๋ฉ”์„œ๋“œ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๊ณผ ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์–ด์ง€๋ฏ€๋กœ ๋žŒ๋‹ค์‹์„ ์ต๋ช…ํ•จ์ˆ˜(anonymous function)๋ผ๊ณ ๋„ ํ•œ๋‹ค.

๋žŒ๋‹ค์‹ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
๋ฉ”์„œ๋“œ์—์„œ ์ด๋ฆ„๊ณผ ๋ฐ˜ํ™˜ํƒ€์ž… ์ œ๊ฑฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€์™€ ๋ชธํ†ต{} ์‚ฌ์ด์— -> ์ถ”๊ฐ€ //๊ธฐ์กด ๋ฐ˜ํ™˜ํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๋ฆ„ (๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ) { ... }

//๋žŒ๋‹ค์‹ (๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ) -> { ... } ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” return ๋Œ€์‹  ์‹(expression)์œผ๋กœ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.(์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ’์ด ๋˜๊ณ  ; ์ƒ๋žต) ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์€ ์ถ”๋ก ๊ฐ€๋Šฅํ•˜๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ (๋Œ€๋ถ€๋ถ„ ์ƒ๋žต ๊ฐ€๋Šฅ) ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ฉด ๊ด„ํ˜ธ() ์ƒ๋žต ๊ฐ€๋Šฅ ์ค‘๊ด„ํ˜ธ{} ์•ˆ์˜ ๋ฌธ์žฅ์ด ํ•˜๋‚˜์ผ ๋•Œ๋Š” ์ค‘๊ด„ํ˜ธ{} ์ƒ๋žต ๊ฐ€๋Šฅ (๋ฌธ์žฅ ๋์— ; ์ƒ๋žต) ์ค‘๊ด„ํ˜ธ{} ์•ˆ์˜ ๋ฌธ์žฅ์ด return๋ฌธ์ผ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ{} ์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ //๊ธฐ์กด int max(int a, int b) { return a > b ? a : b; }

//๋žŒ๋‹ค์‹ (int a, int b) -> { return a > b ? a : b; }

//return๋ฌธ ๋Œ€์‹  expression ์‚ฌ์šฉ (int a, int b) -> a > b ? a: b

//๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์ƒ๋žต (a, b) -> a > b ? a : b

//๋งค๊ฐœ๋ณ€์ˆ˜ 1๊ฐœ์ผ ๊ฒฝ์šฐ ๊ด„ํ˜ธ ์ƒ๋žต a -> aa //OK int a -> aa //์—๋Ÿฌ

//๋ณธ๋ฌธ ๋ฌธ์žฅ 1๊ฐœ์ผ ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ ์ƒ๋žต (String name, int i) -> System.out.println(name+"="+i)

checked-exception VS unchecked-exception ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

exception

Checked Exception์€

Exception์ฒ˜๋ฆฌ์ฝ”๋“œ ์—ฌ๋ถ€๋ฅผ compiler๊ฐ€ check

  • ์—†์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ!!

=> ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ๋ฆ„์ƒ ์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์žˆ๋Š” ์ƒํ™ฉ์„ ํ‘œํ˜„.(๋กœ์ง์ƒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ)

=> Code์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์‹คํ–‰์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐœ์ƒ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ์˜ˆ์™ธ.

=> ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„ ํ๋ฆ„์ƒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ.

Unchecked Exception์€

๋จผ์ €, RuntimeException์„ ์‚ดํŽด๋ณด์ž.

RuntimeException์€ ๋‹ค์‹œ๋งํ•˜๋ฉด, Unchecked Exception์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™์€ ์˜ˆ์™ธ๋ฅผ ์ฒดํฌํ•ด์ฃผ์ง€ ์•Š์•„์„œ

(์ฆ‰, ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋กœ์ธํ•ด์„œ) ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

=> Code๋ฅผ ์ž˜๋ชป ๋งŒ๋“ค์–ด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ.

=> ์—…๋ฌด์˜ ํ๋ฆ„๋ณด๋‹ค๋Š” core(๊ธฐ๋ณธ)์ ์ธ ๋ถ€๋ถ„์˜ ์—๋Ÿฌ.

=> ์ปดํŒŒ์ผ ํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ.


SPRING

@Service, @Component์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€?

component

@Component๋Š” ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ๋ฐ˜์ ์ธ ์Šคํ…Œ๋ ˆ์˜ค ํƒ€์ž…์ด๋‹ค.
๋˜ํ•œ Spring(IOC) Container์— Bean์„ ๋“ฑ๋กํ•˜๋„๋ก ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ž…ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
์„ค์ • ํด๋ž˜์Šค์— @ComponentScan์„ ๋ถ™์—ฌ์ฃผ๋ฉด @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋“ค์„ ํƒ์ƒ‰ํ•ด ๋นˆ์œผ๋กœ ๋“ฑ๋ก์„ ํ•ด์ค€๋‹ค.
scan-auto-detection๊ณผ dependency injection์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
์ข€๋” ์„ธ๋ถ€์ ์ธ ์œ ์Šค ์ผ€์ด๋“ค์„ ์œ„ํ•˜์—ฌ @Component์˜ ๊ตฌ์ฒดํ™”๋œ ํ˜•ํƒœ๋กœ @Repository, @Service, @Controller๋“ค์ด ์žˆ๋‹ค.

context:component-scan๋Š” @Component ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ
@Controller, @Service, @Repository๋ฅผ ์ฐพ์ง€ ์•Š๋Š”๋‹ค.
ํ•˜์ง€๋งŒ @Component๋กœ ์ฃผ์„์ด ๋ถ™์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค์บ”๋œ๋‹ค!!!
ex)

@Component
public @interface Service {  
    โ€ฆ.  
}  

@Controller : Presentation Layer(ํด๋ผ์ด์–ธํŠธ์™€์˜ ์ ‘์ ์ด๋ฉฐ ๋ฐ์ดํ„ฐ์˜ ์ž…์ถœ๋ ฅ์ด ์ผ์–ด๋‚จ)์—์„œ Contoller๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
=> @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ‘์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

@Repository : Persistence Layer(DB์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ณ„์ธต)์—์„œ DAO๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
=> ํ”Œ๋žซํผ ๋ณ„ ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ Spring์˜ ํ†ตํ•ฉ ๊ฒ€์‚ฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ ์ค‘ ํ•˜๋‚˜๋กœ ๋‹ค์‹œ ๋˜์ง„๋‹ค.

@Service : Business Layer(์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐ)์—์„œ Service๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ => @Component์™€ ๋ณ„ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ ์ถ”ํ›„์— ์Šคํ”„๋ง์—์„œ ์ถ”๊ฐ€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋ถ™์—ฌ์ค€๋‹ค.

@Component : ๊ทธ ์™ธ์— ์ž๋™์œผ๋กœ ์Šค์บ”ํ•ด์„œ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ๋“ค์„ ์œ„ํ•ด ์‚ฌ์šฉ

์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค๋“ค์— @Component๋ฅผ ๋ถ™์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,
@Repository, @Service, @Controller๋ฅผ ๋ถ™์ธ๋‹ค๋ฉด ๋„๊ตฌ๋“ค์ด ํด๋ž˜์Šค๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋” ์ ํ•ฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ณ 
๊ตฌ์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ๋ถ€๋ถ„์— ์“ฐ์ด๋Š”์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ํŒ๋‹จํ•˜๊ธฐ ํŽธํ•˜๋‹ค. ๋˜ํ•œ, ๊ด€์ (aspects)์— ๋” ์—ฐ๊ด€์„ฑ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. - AOP๋ฅผ ํ†ตํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šคํ”„๋ง MVC ์›น ์š”์ฒญ ์ฒ˜๋ฆฌ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค

mvcFlow

์Šคํ”„๋ง MVC์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  • DispatcherServlet : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ , ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฆฌํ„ดํ•œ ๊ฒฐ๊ณผ ๊ฐ’์„
    View์— ์ „๋‹ฌํ•˜์—ฌ ์•Œ๋งž์€ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋„๋ก ํ•จ(์Šคํ”„๋ง ์ œ๊ณต)
  • HandlerMapping : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ URL์„ ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ๊ฒฐ์ •(์Šคํ”„๋ง ์ œ๊ณต)
  • Controller : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ DispatcherServlet์— ์•Œ๋ ค ์ค€๋‹ค.(์‹ค์ œ ๋กœ์ง์„ ๋‹ด๋‹น)
  • ModelAndView : ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ์ •๋ณด ๋ฐ ๋ทฐ ์„ ํƒ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
  • ViewResolver : ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ๋ทฐ๋ฅผ ๊ฒฐ์ •(์Šคํ”„๋ง ์ œ๊ณต)
  • View : ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ํ™”๋ฉด์„ ์ƒ์„ฑ
  1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด DispatcherServlet์— ์ „๋‹ฌ
  2. DispatcherServlet์€ HandlerMapping์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๊ตฌํ•จ
  3. DispatcherServlet์€ ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด์˜ handleRequest() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  4. ์ปจํŠธ๋กค๋Ÿฌ์˜ handlerRequest() ๋ฉ”์„œ๋“œ๋Š” ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์ •๋ณด๋ฅผ ๋‹ด์€ ModelAndView ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด
  5. DispatcherServlet์€ ViewResolver๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ๋ทฐ ๊ฐ์ฒด๋ฅผ ๊ตฌํ•จ
  6. ๋ทฐ๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•  ์‘๋‹ต์„ ์ƒ์„ฑ

์Šคํ”„๋ง MVC์—์„œ ๋ชจ๋“  ์š”์ฒญ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š”๊ฑด DispatcherServlet
** DispatcherServlet์€ ์ „๋‹ฌ๋ฐ›์€ ์„ค์ • ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

1 ๋‹จ๊ณ„ : DispatcherServlet ์„ค์ • ๋ฐ ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ ์„ค์ •

์ž๋ฐ” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ • ํŒŒ์ผ์ธ web.xml์— ๋‹ค์Œ์˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›์„ DispatcherServlet ์„ค์ •
  • ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ์„ค์ • DispatcherServlet์˜ ์„ค์ •์€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ /WEB-INF/web.xmlํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ.

2 ๋‹จ๊ณ„ : ์„ค์ • ํŒŒ์ผ์— HandlerMapping ์„ค์ • ์ถ”๊ฐ€ HandlerMapping์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์–ด๋–ค Controller๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณต

3 ๋‹จ๊ณ„ : Controller ๊ตฌํ˜„ ๋ฐ ์„ค์ • ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋จ(๋‹ค์–‘ํ•œ Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต)

4 ๋‹จ๊ณ„ : ์„ค์ • ํŒŒ์ผ์— ViewResolver ์„ค์ • ์ถ”๊ฐ€ Controller๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ModelAndView๋Š” ๋ทฐ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ.

5 ๋‹จ๊ณ„ : ๋ทฐ ์ฝ”๋“œ ๊ตฌํ˜„ JSP์™€ ๊ฐ™์€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์›์„ ์ด์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ์ƒ์„ฑ

@EnableWebMvc ๋Š” ์–ด๋””์— ํ•„์š”ํ•œ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค

@Retention(RetentionPolicy.RUNTIME)
@Import(DelegatingWebMvcConfiguration.class)
@Target(ElementType.TYPE)
public @interface EnableWebMvc {
}

์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ Spring MVC๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ํŽธ๋ฆฌํ•œ ์›น MVC ๊ธฐ๋ณธ ์„ค์ • ๋ฐฉ๋ฒ•
@Enable๋กœ ์‹œ์ž‘ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์€ ์ž๋ฐ” ์„ค์ •์—์„œ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋„์ž…๋˜์—ˆ๋‹ค.
@EnableWebMvc ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉ์‹œํ‚ค๋ฉด ๋Œ€๋ถ€๋ถ„ Spring Web์— ํ•„์š”ํ•œ ๋นˆ๋“ค์€ ์ž๋™์œผ๋กœ ์„ค์ • ํ•ด์ค€๋‹ค.
WebMvcConfigurationSupport ์—์„œ ๊ตฌ์„ฑํ•œ ์Šคํ”„๋ง MVC๊ตฌ์„ฑ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
=> WebMvcConfigurationSupport MVC ์ž๋ฐ” ์„ค์ •์—์„œ ๊ธฐ๋ณธ ์„ค์ •์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์ธ ํด๋ž˜์Šค์ด๋‹ค. ์ฃผ๋กœ @EnableWebMvc๋ฅผ ํ†ตํ•ด์„œ ์ž„ํฌํŠธ๋œ๋‹ค.
(๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์ด ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ DelegatingWebMvcConfiguration๊ฐ€ ์ž„ํฌํŠธ๋œ๋‹ค.)
์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค๋ฉด WebMvcConfigurationSupport ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด์„œ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด๋„๋œ๋‹ค.

springContainer

DispatcherServlet๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„  ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” ์„ค์ • ํด๋ž˜์Šค์—๋Š”
HandlerMapping ๋นˆ๊ณผ HandlerAdapter ๋นˆ์ด ๋“ฑ๋ก๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์„ค์ • ํด๋ž˜์Šค์— @EnableWebMvc ์• ๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ํ•ด๋‹น ๋นˆ์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ ํ•ด์ค€๋‹ค.

๋ฐ‘์˜ ๋‘ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!!

o.s.w.servlet.mvc.method.annotation.RequestMappingHandlerMapping. 
o.s.w.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. 

Spring Java Config ์„ค์ •
Spring MVC ์„ค์ •
๋ฌด์—‡์„ ์„ค์ •ํ•˜๋Š”๊ฐ€? => MVC์™€ ๊ด€๋ จ๋œ ์„ค์ •๋“ค.

1.HandlerMapping
2.HandlerAdapter
3.ViewResolver์— ๊ด€๋ จ๋œ ์„ค์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.
๋งŽ์€ ์„ค์ •์„ ํ•ด์•ผํ•˜์ง€๋งŒ @EnableWebMvc ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉ์‹œํ‚ค๋ฉด ๋Œ€๋ถ€๋ถ„ Spring Web์— ํ•„์š”ํ•œ ๋นˆ๋“ค์€ ์ž๋™์œผ๋กœ ์„ค์ • ํ•ด์ค€๋‹ค.

๋‚˜๋จธ์ง€, ์ถ”๊ฐ€์ ์ธ ์„ค์ •์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด spring 5 ๋ฒ„์ „๋ถ€ํ„ฐ WebMvcConfigurer ๊ฐ€์ƒ ๊ฐ์ฒด ์ƒ์†์‹œ์ผœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ๊ณ ์ณ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค. ==> WebMvcConfigurer WebMvcConfigurer ์ธํ„ฐํŽ˜์ด์Šค๋Š” MVC ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ์„ค์ •๊ณผ ๋™์ผํ•œ ์„ค์ •์„ ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.
Spring MVC๋ฅผ ์ž๋ฐ” ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
ex) HttpMessageConverter๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ WebMvcConfigurer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ
@Configuration ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , configureMessageConverters ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

if) ์Šคํ”„๋ง MVC๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด -> @Configuration + @EnableWebMvc


Infra/์šด์˜

heap dump๋ฅผ ํŠœ๋‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

HeapDump๋Š” Memory ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” TroubleShooting ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
ThreadDump์—์„œ ํ™•์ธํ•œ Application์˜ ์ƒ์„ธ Stack์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์•  ์ง„๋‹จ์— ๋งค์šฐ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ผ ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Heap์ด๋ž€ Java์—์„œ ์‚ฌ์šฉํ•˜๋Š” object๋“ค์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Heap์—๋Š” java object ์ •๋ณด๋งŒ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ๋ฉ”ํƒ€ ์ •๋ณด ๋ฐ ๊ฐ object๋“ค์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ •๋ณด๋„ ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค. Heap ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  object๋Š” Root ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ parent/child ํ˜•์‹์˜ tree ๊ตฌ์กฐ๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ tree ๊ตฌ์กฐ๋Š” ๊ฐ object๋“ค์˜ ์ฐธ์กฐ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. tree ๊ตฌ์กฐ๊ฐ€ ๊ผญ ์ •ํ˜•ํ™”๋œ top/down ๋ฐฉ์‹์˜ ๊ตฌ์กฐ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ  ๊ฐ„ํ˜น ์—ญ ์ฐธ์กฐ์— ์˜ํ•ด ์ƒํ˜ธ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Heap์˜ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์€ java์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ(๊ฐ์ข… OutOfMemoryError ๋ฌธ์ œ๋“ค)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

Heap dump ์ƒ์„ฑ ๋ฐฉ๋ฒ• 1.HPROF ์˜ต์…˜๊ณผ ํ•จ๊ป˜ JVM์„ ๊ธฐ๋™ํ•œ ๊ฒฝ์šฐ
2.HeapDumpOnOutOfMemoryError ์˜ต์…˜๊ณผ ํ•จ๊ป˜ JVM์„ ๊ธฐ๋™ํ•œ ๊ฒฝ์šฐ
3.HeapDumpOnCtrlBreak ์˜ต์…˜๊ณผ ํ•จ๊ป˜ JVM์„ ๊ธฐ๋™ํ•œ ๊ฒฝ์šฐ

java

===> heap dump ํŠœ๋‹?? ==> heap dump ๋Š” jvm ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•??

๋ ˆ๋””์Šค ์บ์‹œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•˜๋‚˜?

Redis

๋ ˆ๋””์Šค(Redis)๋Š” Remote Dictionary Server์˜ ์•ฝ์ž๋กœ์„œ โ€˜ํ‚ค-๊ฐ’โ€™ ๊ตฌ์กฐ์˜ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ NoSQL์˜ ์ผ์ข…์ด๋‹ค.

Redis์˜ ๊ธฐ๋Šฅ.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ˜ธ์ถœํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ž๋‹จ์—์„œ ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ

  • Pub/Sub ๊ตฌ์กฐ์˜ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ํ˜น์€ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”์‹œ์ง€ ํ, ๋Œ€๊ธฐ์—ด

  • ์‚ฌ์šฉ์ž ์ธ์ฆ ํ† ํฐ, ์„ธ์…˜ ์ƒํƒœ ๋“ฑ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์„ธ์…˜ ์Šคํ† ์–ด

์ด ์ค‘์—์„œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ(In-Memory Cache)์ž…๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœํŒ€์€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๊ฒฐ๊ด๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์˜€๋‹ค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋‹ฌํ•ด์ฃผ๊ณ , ๊ฒฐ๊ด๊ฐ’์ด ์บ์‹ฑ์— ์—†๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋‹ฌ ํ›„ ์บ์‹œ ํ•ฉ๋‹ˆ๋‹ค.

Cache? Cache๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

Cache? ํ•œ๋ฒˆ ์ฝ์€(์ฒ˜๋ฆฌํ•œ) ๋ฐ์ดํƒ€๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ „์†ก,๊ฐฑ์‹ ,์‚ญ์ œํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ๋ณดํ†ต์€ ๋ฐ์ดํƒ€์˜ ๋ณด๊ด€์žฅ์†Œ๋กœ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ์—์„œ ์ •๋ณด๋ฅผ ์–ป์–ด์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ I/O์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๊ฑฐ๋‚˜ ์žฌ๋ถ€ํŒ…๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ๋ผ์ง€๋Š” ์„ฑ๊ฒฉ์˜ ํœ˜๋ฐœ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด
์˜์†์ ์œผ๋กœ ๋ณด๊ด€ํ•  ์ˆ˜ ์—†๋Š”, ๋ง ๊ทธ๋Œ€๋กœ ์ž„์‹œ์ ์œผ๋กœ ๋ณด๊ด€ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ทธ ์ •๋ณด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

(๋ฌผ๋ก  ์ •๋ณด์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋ณ„๋„์˜ ๋””์Šคํฌ๋ฐฑ์—… ๋ฐ TTL๋“ฑ์˜ ์„ค์ •์œผ๋กœ ์˜๊ตฌ๋ณด๊ด€์ด๋‚˜ ์˜ค๋žœ๊ธฐ๊ฐ„ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ ์ด๋Ÿฐ ์„ค์ •๋“ค์ด ๊ผญ ํ•„์š”ํ•˜๋‹ค๋ฉด Cache๋ฅผ ์ ์šฉํ•˜๋Š”๊ฒŒ ๋งž๋Š”์ง€ ํ•œ ๋ฒˆ๋„ ํƒ€๋‹น์„ฑ์„ ๊ฒ€ํ† ํ•ด ๋ณด๋Š”๊ฒŒ ์ข‹๊ฒ ๋‹ค)

Cache๋ฅผ ์“ฐ๋Š” ๋ชฉ์ ์€ ๋‹จ์ˆœํ•˜๋‹ค.

์„œ๋ฒ„๊ฐ„ ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ ,
๊ทธ๋กœ ์ธํ•ด ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜ ๊ฐ์†Œ์‹œํ‚ค๊ณ ,
์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น ๋ฅธ ์ฒ˜๋ฆฌ์„ฑ๋Šฅ(์กฐํšŒ)์„ ํ™•๋ณดํ•ด์„œ ๊ถ๊ทน์ ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ฐ์—๊ฒŒ ์พŒ์ ํ•œ ์„œ๋น„์Šค๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Java์—์„œ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

์ถ”์ƒํ™”๋œ API์™€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณต
์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ๋งŒ์œผ๋กœ ์ผ๋ฐ˜ Service ๋ฉ”์„œ๋“œ๋ฅผ ์บ์‹œ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
SpringBoot์˜ Auto Configuration ์ ์šฉ์œผ๋กœ Cache์„œ๋ฒ„ ์„ค์ •์ด ๊ฐ„๊ฒฐ
Springboot Starter Kit์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•จ spring-boot-starter-data-redis

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ์Šคํ”„๋ง๋ถ€ํŠธ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€
    Redis CacheServer์„ค์ •
    ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ (Maven๊ธฐ์ค€) โ€” pom.xml์— ์ถ”๊ฐ€
org.springframework.boot spring-boot-starter-data-redis
  • Redis ์ปค๋„ฅ์…˜ ์ •๋ณด ์„ค์ • Redis ์„œ๋ฒ„์„ค์ • โ€” application.yml or application.properties ํŒŒ์ผ์— ์ถ”๊ฐ€
    spring.cache.type=redis
    spring.redis.host=localhost
    spring.redis.port=6379

  • SpringBoot ๋ฉ”์ธํด๋ž˜์Šค์— โ€˜์บ์‹œ์‚ฌ์šฉ' ์•Œ๋ ค์ฃผ๊ธฐ SpringBoot์— ์บ์‹œ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๊ธฐ โ€” Springboot Main Application Class์— @EnableCaching ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€
    @EnableCaching
    @SpringBootApplication
    public class RedisCacheApplication {
    public static void main(String[] args) {
    SpringApplication.run(RedisCacheApplication.class, args);
    }
    }

  • ์‚ฌ์šฉํ•  Method ( controller ๋ฉ”์„œ๋“œ or service ๋ฉ”์„œ๋“œ)์— ์–ด๋…ธํ…Œ์ด์…˜ ๋‹ฌ์•„์ฃผ๊ธฐ -> ์บ์‹œ์ „๋žต์—์„œ ์ •ํ•ด์ง„ โ€˜์„œ๋น„์Šค&์ •๋ณดโ€™ ์‚ฌ์šฉํ•  ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ์— ์–ด๋…ธํ…Œ์ด์…˜ ๋‹ฌ์•„์ฃผ๊ธฐ
    ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜
    @Cacheable @CachePut -> ์บ์‹œ๋“ฑ๋ก
    @Cacheble์€ ์บ์‹œ๊ฐ€ ์žˆ์œผ๋ฉด ์บ์‹œ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์—†์œผ๋ฉด ๋“ฑ๋กํ•œ๋‹ค.
    @CacehPut์€ ๋ฌด์กฐ๊ฑด ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.
    @CacheEvict -> ์บ์‹œ์‚ญ์ œ
    ์ด๋ ‡๊ฒŒ ํ•ด ์ฃผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ Cache๊ฐ€ ํ•„์š”ํ•œ API๋‚˜ ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ์— ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

SSL ํ•ธ๋“œ์‰์ดํ‚น ๊ณผ์ •์€?

ssl

SSL(Secure Sockets Layer)์€ Certificate Authority(CA)๋ผ ๋ถˆ๋ฆฌ๋Š” ์„œ๋“œ ํŒŒํ‹ฐ๋กœ๋ถ€ํ„ฐ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
์ฃผ๋กœ ์ „์†ก๊ณ„์ธต๊ณผ ์‘์šฉ๊ณ„์ธต ์‚ฌ์ด์—์„œ ๋ณด์•ˆ์กฐ์น˜๋ฅผ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
์šฐ๋ฆฌ๋“ค์ด ๋งŽ์ด ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” HTTPS://๋Š” SSL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

client Hello: client์—์„œ SSL๋ฒ„์ „ ์ •๋ณด์™€ ์ง€์›ํ•˜๋Š” ์•”ํ˜ธํ™” ๋ฐฉ์‹, ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด(์ดํ›„์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค)์ด ํฌํ•จ ๋˜์–ด ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ SSL handshake๋ฅผ ํ–ˆ์—ˆ๋‹ค๋ฉด ์„ธ์…˜์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
server Hello: ์ง€์›ํ•˜๋Š” ์•”ํ˜ธํ™” ๋ฐฉ์‹ ์ค‘ ์„œ๋ฒ„์—์„œ ์–ด๋–ค๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ง€, ์„ธ์…˜ ID, ์„œ๋ฒ„์ธก์—์„œ ์ƒ์„ฑํ•œ ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ธ์ฆ์„œ๋ฅผ ์š”๊ตฌํ•˜๊ฒŒ ๋˜๋ฉด SSL ์ธ์ฆ์„œ๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ธ์ฆ์„œ๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฐฉ์‹(์ธ์ฆ์„œ๊ฐ€ ์„œ๋ฒ„๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ• ๊นŒ?)๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ ์ธ์ง€ ํŒ๋‹จํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.์ด ๊ณผ์ •์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ๊ณต๊ฐœํ‚ค๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ดํ›„ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ๋งŒ๋“  ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด๊ณผ ์„œ๋ฒ„์ชฝ์—์„œ ์ „์†ก๋œ ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด์„ ์กฐํ•ฉํ•˜์—ฌ pre master secretํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ๋Œ€์นญํ‚ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด pre master secretํ‚ค๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ ์ธ์ฆ์„œ์—์„œ ๋ฐ›์•˜๋˜ ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฐœํ‚ค ๋ฐฉ์‹ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์ชฝ์œผ๋กœ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„์ชฝ์—์„œ๋Š” ์ˆ˜์‹ ํ•œ pre master secretํ‚ค๋ฅผ ๋น„๋ฐ€ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณตํ˜ธํ™” ํ•˜์—ฌ ์–ป๊ฒŒ๋œ๋‹ค.
server client ๋‘˜ ๋‹ค ์ผ๋ จ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ pre master secretํ‚ค๋ฅผ master key๋กœ ๋งŒ๋“ค๊ฒŒ ๋˜๊ณ  ์ด master key๋ฅผ ์ด์šฉํ•˜์—ฌ session key๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.
์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋–„ session key๋ฅผ ๋Œ€์นญํ‚ค ๋ฐฉ์‹์œผ๋กœ ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ํ†ต์‹ ์ด ๋๋‚˜๋ฉด ์„ธ์…˜ํ‚ค๋ฅผ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ