1. POJO์™€ Spring Framework
  2. Spring MVC์™€ Java Servlet
  3. Filter์™€ Interceptor
  4. Spring Application ๊ตฌ๋™ ๋ฐฉ์‹
  5. ์ƒ์„ฑ์ž ์ฃผ์ž…
  6. Spring Web MVC์˜ Controller ๊ด€๋ฆฌ
  7. AOP ๊ฐœ๋…

1. POJO์™€ Spring Framework

POJO (Plain Old Java Object)

  • ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข…์†๋˜์ง€ ์•Š์€ ์ˆœ์ˆ˜ํ•œ Java ๊ฐ์ฒด
  • extends, implements๋ฅผ ํ†ตํ•ด ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค
  • getter, setter, constructure, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง
  • ํŠน์ • ๊ธฐ์ˆ ์— ์˜์กดํ•˜์ง€ ์•Š์Œ
  • ๋‹จ์ˆœํ•˜๊ณ , ๊ฐ€๋…์„ฑ์ด ์ข‹์Œ
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ๊ณ  ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
  • ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„๋ฅผ ์ œํ•œ์—†์ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

Spring framework์™€ POJO

  • Spring Framework๋Š” POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋‹ค๋ฅธ ํ™˜๊ฒฝ์ด๋‚˜ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก IoC/DI, AOP๋“ฑ ์ง€์›
  • POJO๋Š” Spring์—์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋  ์ˆ˜ ์žˆ์Œ

2. Spring MVC์™€ Java Servlet

Java Servlet

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ API
  • Http ์š”์ฒญ์ด servlet ์ปจํ…Œ์ด๋„ˆ(tomcat)์— ๋„๋‹ฌํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋Š” ์š”์ฒญ์„ ํŠน์ • servlet์— ๋งคํ•‘ํ•˜๊ณ  servlet์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‘๋‹ต ๋ฐ˜ํ™˜
  • http ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ง์ ‘ ๋‹ค๋ฃธ
  • ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ, ๊ธฐ๋ณธ์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ ํ•ฉ
  • ์š”์ฒญ ๋งคํ•‘, ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋“ฑ์„ ์ˆ˜์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
  • ์ˆ˜์ž‘์—…์ด๋ผ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋งŒ ๋ณต์žกํ•ด์ง€๊ณ , ํ™•์žฅ์„ฑ์ด ๋ถ€์กฑํ•ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€

Spring MVC

  • Model-View-Controller ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐํ™”
  • Java Servlet์˜ ์ƒ์œ„ ์ถ”์ƒํ™” ๊ณ„์ธต
  • Servlet์˜ ๋ณต์žกํ•œ ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์คŒ
  • DispatcherServlet : ๋ชจ๋“  http ์š”์ฒญ์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌ, ์ปจํŠธ๋กค๋Ÿฌ์— ์š”์ฒญ ์œ„์ž„
  • Annotation : @Controller, @RequestMapping๋“ฑ์œผ๋กœ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • ๋‹ค์–‘ํ•œ ๋ทฐ ํ…œํ”Œ๋ฆฟ (thymeleaf, JSP)๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํ™•์žฅ์„ฑ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ง€์›
  • Dispatcher servlet์„ ํ†ตํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์„œ ์œ„์ž„ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ํ˜•ํƒœ

Question

Spring MVC์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ?

Dispatcher servlet์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ๋Š” Handler Mapping, Handler Adapter, View Resolver๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Question

Java Servlet๊ณผ MVC์˜ ์ฐจ์ด์ 

Java Servlet์€ Http ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ €์ˆ˜์ค€ API๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์š”์ฒญ์„ ํŒŒ์‹ฑํ•˜๊ณ  ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ณ , ์„ค์ •์„ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Spring MVC๋Š” ์ด๋Ÿฌํ•œ servlet๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด Request Mapping์„ ํ†ตํ•ด URL ๋งคํ•‘์„ ์ง€์›ํ•˜๊ณ , ์‘๋‹ต์€ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Spring MVC๋Š” DI์™€ AOP๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

Question

Spring MVC์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•?

Exception Handler๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ Controller Advice๋ฅผ ์‚ฌ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Question

Servlet ํ•„ํ„ฐ์™€ Spring Interceptor ์ฐจ์ด์ 

Servlet ํ•„ํ„ฐ๋Š” Java์˜ ํ‘œ์ค€ ๊ธฐ๋Šฅ์œผ๋กœ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜๋ฉฐ, Spring Interceptor๋Š” Spring MVC ์š”์ฒญ์—์„œ Dispatcher servlet ์ดํ›„์™€ ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „ํ›„์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

3. Filter์™€ Interceptor

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณตํ†ต์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ

Filter

  • ์š”์ฒญ์ด Dispatcher Servlet์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์‘๋‹ต์ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ
  • ์ „์ฒด ์š”์ฒญ/์‘๋‹ต์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ
  • ์ฃผ๋กœ ์š”์ฒญ ์ „์ฒ˜๋ฆฌ, ์‘๋‹ต ํ›„์ฒ˜๋ฆฌ, ๋ณด์•ˆ, ๋กœ๊น…๋“ฑ์„ ์ฒ˜๋ฆฌ

Interceptor

  • ์š”์ฒญ์ด Dispatcher servlet์— ๋„๋‹ฌํ•œ ํ›„์—, ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „ํ›„์— ์‹คํ–‰
  • Spring MVC์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„์— ๋งž์ถฐ ์‚ฌ์šฉ
  • ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „ํ›„ ์ถ”๊ฐ€์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

Question

Filter์™€ Interceptor์˜ ์ฐจ์ด์ 

filter์™€ interceptor๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ณตํ†ต์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. filter๋Š” ์š”์ฒญ์ด dispatcher servlet์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊ณผ ์‘๋‹ต์ด ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋˜๋ฉฐ ์ „์ฒด์ ์ธ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Interceptor๋Š” ์š”์ฒญ์ด Dispathcer servlet์— ๋„๋‹ฌํ•œ ํ›„ ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „ํ›„์— ์‹คํ–‰๋˜์–ด Spring MVC์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„์— ๋งž์ถฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. filter๋Š” ์ฃผ๋กœ ๋ณด์•ˆ์ด๋‚˜ ๋กœ๊น…, ์š”์ฒญ ํ•„ํ„ฐ๋ง์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ interceptor๋Š” ๊ถŒํ•œ ์ฒดํฌ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ ์ „ํ›„์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

5. ์ƒ์„ฑ์ž ์ฃผ์ž…

์˜์กด์„ฑ๊ณผ ์„ค์ •๊ฐ’์„ ์ƒ์„ฑ์ž ์ธ์ž๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ

  • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ๋ถˆ๋ณ€ ์ƒํƒœ๋กœ ์œ ์ง€ ๊ฐ€๋Šฅ
  • final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ์‹œ์—๋งŒ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ดํ›„์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ
  • ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ ๋†’์ž„

์˜์กด์„ฑ ์ฃผ์ž…์˜ ๋ช…์‹œํ™”

  • ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์˜์กด์„ฑ์— ์˜์กดํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์คŒ
  • ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ฌ

ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ

  • ํ…Œ์ŠคํŠธ ์‹œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง

๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ, ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€ ๋“ฑ๋“ฑ

Question

Spring์—์„œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ?

์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์˜์กด์„ฑ์„ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๋ฉฐ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์‹œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

6. Spring Web MVC์˜ Controller ๊ด€๋ฆฌ

Controller

  • Http ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• 
  • @Controller, @RestController๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Spring Bean์œผ๋กœ ์ •์˜
  • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” @RequestMapping, @GetMapping, @PostMapping๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ๋งคํ•‘

Question

Spring Web MVC์—์„œ Controller์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

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

Question

Spring MVC์—์„œ Controller ์ฒ˜๋ฆฌ ๋ฐฉ์‹

Dispatcher Servlet์ด ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ ํ•ฉํ•œ Controller๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ Controller๋Š” ์š”์ฒญ์— ๋งž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์— ๋‹ด์•„ View๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. View๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Question

@Controlle์™€ @RestController์ฐจ์ด

@Controller๋Š” ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต JSP๋‚˜ Thymeleaf๋ฅผ ํ†ตํ•ด HTML ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. @RestController๋Š” @Controller์™€ @ResponseBody๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ๋กœ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ JSON์ด๋‚˜ XML ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Question

@RequestMapping, @GetMapping, @PostMapping์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

@RequestMapping : ๋ฉ”์„œ๋“œ์™€ ์š”์ฒญ URL์„ ๋งคํ•‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ @GetMapping : Http GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉ, ์ฃผ๋กœ ์กฐํšŒ์— ์‚ฌ์šฉ๋จ @PostMapping : Http POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉ, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•  ๋•Œ ์‚ฌ์šฉ

Controller Singleton Scope

  • Controller๊ฐ์ฒด๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ Controller ๊ฐ์ฒด๋ฅผ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๊ณ , ์ดํ›„ ๋ชจ๋“  Http ์š”์ฒญ์€ ๋™์ผํ•œ Controller ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉ
  • ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ
  • Controller๋Š” ์š”์ฒญ๋งˆ๋‹ค ๊ณต์œ ๋˜์ง€๋งŒ ๊ฐ๊ฐ์˜ ์š”์ฒญ์€ ๋…๋ฆฝ์ ์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด ์ƒํƒœ๊ฐ€ ๊ณต์œ ๋˜์ง€ ์•Š์Œ

Question

Spring Web MVC์—์„œ ์š”์ฒญ ๋งˆ๋‹ค Thread๊ฐ€ ์ƒ์„ฑ๋˜์–ด Controller๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ• ํ…๋ฐ, ์–ด๋–ป๊ฒŒ 1๊ฐœ์˜ Controller๋งŒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

Controller๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜์–ด์„œ ๊ฐ ์š”์ฒญ์€ ๋™์ผํ•œ Controller ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์š”์ฒญ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด ์ƒํƒœ๊ฐ€ ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

7. AOP

Aspect-Oriented Programming

  • ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๊ณตํ†ต์ ์ธ ๊ด€์‹ฌ์‚ฌ(๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ณด์•ˆ, ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง)๋ฅผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌ

  • ๋กœ์ง์„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์˜ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋ณด๊ณ  ๊ฐ๊ฐ์„ ๋ชจ๋“ˆํ™” ํ•˜๋Š”๊ฒƒ

  • ์‡ผํ•‘๋ชฐ๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ƒํ’ˆ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ณ , ๊ฒฐ์ œํ•˜๋Š” ๋ถ€๋ถ„์€ ํ•ต์‹ฌ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์œ ์ €๋ณ„๋กœ ํ™ˆํŽ˜์ด์ง€์— ์ฒด๋ฅ˜ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์— ํ•ด๋‹น

  • Join point : Aspect๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์‹œ์ 

    • @Around : ํ•ต์‹ฌ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ ์ „๊ณผ ํ›„์— ์–ด๋“œ๋ฐ”์ด์Šค ๊ธฐ๋Šฅ ์ˆ˜ํ–‰
    • @Before : ํ•ต์‹ฌ๊ธฐ๋Šฅ ํ˜ธ์ถœ ์ „์— ์ˆ˜ํ–‰
    • @After : ํ•ต์‹ฌ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์–ธ์ œ๋‚˜ ๋™์ž‘
    • @AfterReturning : ํ•ต์‹ฌ๊ธฐ๋Šฅ ํ˜ธ์ถœ ์„ฑ๊ณต ์‹œ ์ˆ˜ํ–‰
    • @AfterThrowing : ํ•ต์‹ฌ๊ธฐ๋Šฅ ํ˜ธ์ถœ ์‹คํŒจ ์‹œ ์ˆ˜ํ–‰
  • Advice : Aspect์˜ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ ๊ฒƒ

  • Point cut : Advice๋ฅผ ์ ์šฉํ•  ๋ฉ”์†Œ๋“œ ๋ฒ”์œ„ ์ง€์ •

Spring์—์„œ์˜ AOP

  • ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ AOP
  • ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ
  • @Aspect ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

์žฅ๋‹จ์ 

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ
  • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
  • ๋ณต์žก๋„ ์ฆ๊ฐ€
  • ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›€

Question

AOP๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

AOP๋ž€ ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ, ๋กœ์ง์„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์˜ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ชจ๋“ˆํ™”ํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํ’ˆ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ณ , ๊ฒฐ์ œํ•˜๋Š” ๋ถ€๋ถ„์€ ํ•ต์‹ฌ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์œ ์ €๋ณ„๋กœ ํ™ˆํŽ˜์ด์ง€์— ์ฒด๋ฅ˜ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

Question

Spring AOP์˜ ํ•ต์‹ฌ ๊ฐœ๋…

๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™”ํ•œ Aspect, AOP๊ฐ€ ์‚ฌ์šฉ๋  ์ง€์ ์„ ์ •์˜ํ•˜๋Š” Join Point, ์‹ค์ œ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” Advice, Advice๊ฐ€ ์ ์šฉ๋  ์กฐ๊ฑด์„ ์ •์˜ํ•˜๋Š” Point Cut ์ž…๋‹ˆ๋‹ค.

Question

Aspect์™€ Advice์˜ ์ฐจ์ด์ 

Aspect๋Š” ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•œ ํด๋ž˜์Šค๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Advice๋Š” ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•  ํ–‰๋™์„ ์ •์˜ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„ ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Question

AOP์—์„œ์˜ Join Point์™€ Pointcut์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Join Point๋Š” AOP๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ง€์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”์„œ๋“œ ์‹คํ–‰, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์ž…๋‹ˆ๋‹ค. Pointcut์€ Join Point์—์„œ Advice๊ฐ€ ์ ์šฉ๋  ์กฐ๊ฑด์„ ์ •์˜ํ•˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด Advice๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.