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

์ „์ฒด ๊ธ€

(135)
Advice ๋™์ž‘ ์‹œ์  ์Šคํ”„๋ง์—์„œ๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€์˜ ๋™์ž‘ ์‹œ์ ์„ ์ œ๊ณตํ•œ๋‹ค. ์–ด๋“œ๋ฐ”์ด์Šค ๋ฉ”์†Œ๋“œ์˜ ๋™์ž‘ ์‹œ์ ์€ ์—˜๋ฆฌ๋จผํŠธ ํ•˜์œ„์— ๊ฐ๊ฐ , , , , ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง€์ •ํ•œ๋‹ค. 1. ํฌ์ธํŠธ์ปท์œผ๋กœ ์ง€์ •๋œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌํ•  ๋‚ด์šฉ๋“ค์„ ๊ธฐ์ˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. package com.springbook.biz.common; public class BeforeAdvice { public void beforeLog(){ System.out.println("[์‚ฌ์ „ ์ฒ˜๋ฆฌ] ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ ์ „ ๋™์ž‘"); } } 2. ํฌ์ธํŠธ์ปท์œผ๋กœ ์ง€์ •๋œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ๋‚˜์„œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌํ›„ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. package com.springbook.biz.common; public clas..
ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹ 1) ๋ฆฌํ„ดํƒ€์ž… ์ง€์ • ๋ฆฌํ„ดํƒ€์ž… ์ง€์ •์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ '*'์บ๋ฆญํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค. ํ‘œํ˜„์‹ ์„ค๋ช… * ๋ชจ๋“  ๋ฆฌํ„ดํƒ€์ž… ํ—ˆ์šฉ void ๋ฆฌํ„ดํƒ€์ž…์ด void์ธ ๋ฉ”์†Œ๋“œ ์„ ํƒ !void ๋ฆฌํ„ดํƒ€์ž…์ด void๊ฐ€ ์•„๋‹Œ ๋ฉ”์†Œ๋“œ ์„ ํƒ 2) ํŒจํ‚ค์ง€ ์ง€์ • ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ๋•Œ๋Š” '*', '..'์บ๋ฆญํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค. ํ‘œํ˜„์‹ ์„ค๋ช… com.springbook.biz ์ •ํ™•ํ•˜๊ฒŒ com.springbook.biz ํŒจํ‚ค์ง€๋งŒ ์„ ํƒ com.springbook.biz.. com.springbook.biz ํŒจํ‚ค์ง€๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€ ์„ ํƒ com.springbook..impl com.springbook ํŒจํ‚ค์ง€๋กœ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋งˆ์ง€๋ง‰ ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด impl๋กœ ๋๋‚˜๋Š” ํŒจํ‚ค์ง€ ์„ ํƒ 3) ํด๋ž˜์Šค ์ง€์ • ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ๋Š” '*', '+' ์บ๋ฆญํ„ฐ๋ฅผ ์ง€..
AOP ์—˜๋ฆฌ๋จผํŠธ : AOP ์„ค์ •์˜ ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ. ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋กœ , ๊ฐ€ ์žˆ๋‹ค. : ํฌ์ธํŠธ์ปท์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ฐ๊ฐ ์œ ์ผํ•œ ์•„์ด๋””๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค. : ํ•ต์‹ฌ ๊ด€์‹ฌ์— ํ•ด๋‹นํ•˜๋Š” ํฌ์ธํŠธ์ปท ๋ฉ”์†Œ๋“œ์™€ ํšก๋‹จ ๊ด€์‹ฌ์— ํ•ด๋‹นํ•˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. public class LogAdvice{ public void printLog(){ System.out.println("[๊ณตํ†ต ๋กœ๊ทธ] ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ ์ „ ๋™์ž‘"); } } ์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋ฉด, getPointcut์œผ๋กœ ์„ค์ •ํ•œ ํฌ์ธํŠธ์ปท ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ log๋ผ๋Š” ์–ด๋“œ๋ฐ”์ด์Šค ๊ฐ์ฒด์˜ printLog()๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ด๋•Œ printLog() ๋ฉ”์†Œ๋“œ ๋™์ž‘ ์‹œ์ ์ด ๋ผ๋Š” ๋‚ด์šฉ์˜ ์„ค์ •์ด๋‹ค. : aspect์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜, Advi..
AOP ์šฉ์–ด 1. Joinpoint ์กฐ์ธ ํฌ์ธํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค method๋กœ์„œ, BoardServiceImpl์ด๋‚˜ UserServiceImpl ํด๋ž˜์Šค์˜ ๋ชจ๋“  method๋ฅผ ์กฐ์ธํฌ์ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 2. Pointcut ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค method๊ฐ€ ์กฐ์ธํฌ์ธํŠธ๋ผ๋ฉด, ํฌ์ธํŠธ์ปท์€ ํ•„ํ„ฐ๋ง๋œ ์กฐ์ธํฌ์ธํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 3. Advice ํšก๋‹จ ๊ด€์‹ฌ์— ํ•ด๋‹นํ•˜๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋…๋ฆฝ๋œ ํด๋ž˜์Šค์˜ method๋กœ ์ž‘์„ฑ๋œ๋‹ค. ์–ด๋“œ๋ฐ”์ด์Šค๋กœ ๊ตฌํ˜„๋œ method๊ฐ€ ์–ธ์ œ ๋™์ž‘ํ• ์ง€ ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์ž‘ ์‹œ์ ์€ 5๊ฐ€์ง€๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. before after after-returning after-throwing around 4. Weaving ํฌ์ธํŠธ์ปท์œผ๋กœ ์ง€..
AOP ์„ค์ •ํ•˜๊ธฐ 1. pom.xml ์ค‘ AOP ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ org.aspectj aspectjrt ${org.aspectj-version} org.aspectj aspectjweaver 1.8.8 2. applicationContext.xml์— aop ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”๊ฐ€
AOP๋ž€? AOP: Aspect Oriented Programming; ๋น„์ฆˆ๋‹ˆ์Šค ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‘ ๊ฐ€์ง€ ์›์น™์€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ๋†’์€ ์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. IoC๋Š” ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์ด๊ณ , AOP๋Š” ์‘์ง‘๋„์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์ด๋‹ค. AOP๋Š” ๋ถ€๊ฐ€์ ์ธ ๊ณตํ†ต ์ฝ”๋“œ๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ฃผ๋ชฉํ•œ๋‹ค. ์Šคํ”„๋ง์˜ AOP๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ต์‹ฌ ๊ด€์‹ฌ์— ํ•ด๋‹นํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ํšก๋‹จ ๊ด€์‹ฌ์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‹คํ–‰ํžˆ์ค€๋‹ค. ์ด๋•Œ, ํ•ต์‹ฌ ๊ด€์‹ฌ ๋ฉ”์†Œ๋“œ์™€ ํšก๋‹จ ๊ด€์‹ฌ ๋ฉ”์†Œ๋“œ ์‚ฌ์ด์—์„œ ์†Œ์Šค์ƒ์˜ ๊ฒฐํ•ฉ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
[์—๋Ÿฌ] "useSSL" ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ';' ๊ตฌ๋ถ„์ž๋กœ ๋๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—๋Ÿฌ๋ฅผ ๊ณ ์น˜๋ ค๋ฉด & ๊ธฐํ˜ธ๋ฅผ &๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค. intelliJ๋ฅผ ์“ฐ๊ณ ์žˆ๋‹ค๋ฉด ๋ถ„๋ช… ๋นจ๊ฐ„ ์ค„๋กœ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๊ณ  ์žˆ์„ํ…Œ๋‹ค.
SpringApplication Spring Initializr๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” Application ํด๋ž˜์Šค @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋กœ์ปฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. SpringApplication app = new SpringApplication(Application.class); @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication app..
์Šคํ”„๋ง๋ถ€ํŠธ, ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR “๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜”์ด ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์ฃผ์š”ํ•œ ๋ชฉ์  ์ค‘ ํ•˜๋‚˜์ด๋‹ค. org.springframework.boot spring-boot-maven-plugin pom.xml์˜ spring-boot-maven-plugin์ด ํ•ด์ฃผ๋Š” ์ผ์ด ๋ฐ”๋กœ ํŒจํ‚ค์ง•์ด๋‹ค. jar ์•ˆ์— jar ํŒŒ์ผ๋“ค์„ ๊ทธ๋Œ€๋กœ ๋ฌถ์–ด๋‘˜ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์„œ ํ•˜๋‚˜์˜ jar ํŒŒ์ผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํŒจํ‚ค์ง•ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  mvn ๋ช…๋ น์–ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค. ์•„๋ž˜๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ์“ฐ์ด๋Š” ๋ช…๋ น์–ด๋“ค์ด๋‹ค. mvn clean mvn package ใ…ก> ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR ํŒŒ์ผ “ํ•˜๋‚˜๊ฐ€" ์ƒ์„ฑ๋œ๋‹ค. mvn clean package ใ…ก> ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. mvn package -DskipTests ใ…ก> test๋Š” ๊ฑด๋„ˆ๋›ด๋‹ค. jav..
์Šคํ”„๋ง ๋ถ€ํŠธ ํฌํŠธ ๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๋žœ๋คํฌํŠธ, ํฌํŠธ ๋ฒˆํ˜ธ ํ™•์ธํ•˜๊ธฐ ํฌํŠธ ๋ฒˆํ˜ธ ๋ณ€๊ฒฝํ•˜๊ธฐ server.port=7070 ๋žœ๋ค ํฌํŠธ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ server.port=0 eventListener๋กœ ํฌํŠธ ๋ฒˆํ˜ธ ํ™•์ธํ•˜๊ธฐ ServletWebServerInitializedEvent๋Š” ์›น์„œ๋ฒ„๊ฐ€ ์ดˆ๊ธฐํ™”, ์ƒ์„ฑ์ด ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” eventListener์ด๋‹ค. ์„œ๋ธ”๋ฆฟ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ใ…ก> ์›น ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์›น ์„œ๋ฒ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. package com.jueun.demo; import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent; i..