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

Spring/Spring Quick Start

(45)
ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์„ ์ด์šฉํ•œ Spring JDBC JDBC๋ž€? JDBC๋Š” ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•œ DB ์—ฐ๋™ ๊ธฐ์ˆ ์ด๋‹ค. JDBC ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ๋‹ค. ์Šคํ”„๋ง์€ JDBC ๊ธฐ๋ฐ˜์˜ DB ์—ฐ๋™ ํ”„๋กœ๊ทธ๋žจ์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก JDBCTemplate ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” DB ์—ฐ๋™ ๋กœ์ง์€ JDBCTemplate ํด๋ž˜์Šค์˜ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณตํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ๋‹ฌ๋ผ์ง€๋Š” SQL ๊ตฌ๋ฌธ๊ณผ ์„ค์ •๊ฐ’๋งŒ ์‹ ๊ฒฝ์“ฐ๋ฉด ๋œ๋‹ค. ์Šคํ”„๋ง JDBC ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• 1. pom.xml์—์„œ JDBC์™€ DBCP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. org.springframework spring-jdbc ${org.springframework-version} commons-dbcp commons-dbcp 1.4 โ€‹ 2. ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ DataSour..
Annotation ๊ธฐ๋ฐ˜ AOP ์ ์šฉ AOP๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด, ๊ฐ€์žฅ ๋จผ์ € ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ๋งŒ ์„ค์ •ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” AOP ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ์ธ์‹ํ•˜๊ณ  ์šฉ๋„์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. @Pointcut package com.springbook.biz.common; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class PointcutCommon { @Pointcut("execution(* com.springbook.biz..*Impl.*(..))") public void allPointcut() { } @Pointcut("execution(* com.springb..
JointPoint ๋ฉ”์†Œ๋“œ JointPoint ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JointPoint๋ฅผ ์–ด๋“œ๋ฐ”์ด์Šค ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ JointPoint ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ JointPoint ๊ฐ์ฒด์— ์ €์žฅํ•˜์—ฌ ์–ด๋“œ๋ฐ”์ด์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€๋‹ค. 1. Before ์–ด๋“œ๋ฐ”์ด์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ ๊ฐ’๋“ค์„ JoinPoint๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค. JoinPoint ๊ฐ์ฒด์˜ getSignature() ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” Signature ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉด, ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. getName(), getLongString() ๋“ฑ์ด ์žˆ๋‹ค. getArgs() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋Š” ์ธ์ž ๋ชฉ๋ก์„ Object ..
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๋ฅผ ์“ฐ๊ณ ์žˆ๋‹ค๋ฉด ๋ถ„๋ช… ๋นจ๊ฐ„ ์ค„๋กœ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๊ณ  ์žˆ์„ํ…Œ๋‹ค.
IntelliJ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(xmlns) ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• eclipse์˜ ๊ฒฝ์šฐ sts๋กœ ์‰ฝ๊ฒŒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace)๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, intelliJ์—์„œ๋Š” ์‰ฝ๊ฒŒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•ด์„œ ํ•œ์ฐธ์„ ํ—ค๋งธ์—ˆ๋‹ค. ํ•œ๊ธ€ ๊ฒ€์ƒ‰์œผ๋กœ๋Š” ์ฐพ์„ ์ˆ˜ ์—†์–ด์„œ ์˜์–ด๋กœ ๊ฒ€์ƒ‰ํ•œ ํ›„์— ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ณ„๋„์˜ ์ฐฝ ์—†์ด ์ผ๋‹จ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์“ฐ๊ณ  ์žˆ์œผ๋ฉด intelliJ๊ฐ€ ์ถ”์ฒœ์„ ํ•ด์ฃผ๊ณ  ํ™”์‚ดํ‘œ ๋ฐ‘์œผ๋กœ ์ด๋™ํ•ด์„œ ์—”ํ„ฐ๋ฅผ ์น˜๋ฉด ๋ฐ”๋กœ ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค. ์˜ˆ์‹œ๋กœ ์— ๊ด€ํ•œ xmlns:context๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์•˜๋‹ค. ํˆด์ด ์ง„์งœ ๋˜‘๋˜‘ํ•˜๋‹ค.
๋น„์ฆˆ๋‹ˆ์Šค ์ปดํฌ๋„ŒํŠธ ์‹ค์Šต Spring Quick Start(์ฑ…)์˜ Day1 class06~07 ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ธฐ๋กํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์‹ค์Šต ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MySQL๋กœ db๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ ๊ธฐ์กด ์ฑ…์˜ ์‹ค์Šต์—์„œ ๋ณ€๊ฒฝํ•œ ๋ถ€๋ถ„ dependency mysql mysql-connector-java ${mysql.version} table ์ƒ์„ฑ CREATE TABLE BOARD ( SEQ INTEGER(5) PRIMARY KEY, TITLE VARCHAR(200), WRITER VARCHAR(20), CONTENT VARCHAR(2000), REGDATE datetime default CURRENT_TIMESTAMP, CNT INTEGER(5) default 0 ); SQL๋ฌธ private final String BOARD_I..
@Service, @Repository, @Controller์˜ ๊ฐ„๋žตํ•œ ์„ค๋ช… @Service, @Repository, @Controller๋Š” @Component๋ฅผ ์ƒ์†๋ฐ›๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ถ„ํ™”๋œ ์ด์œ ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฅ˜ํ•ด์„œ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๊ฐ๊ฐ์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•ด๋‹น ํด๋ž˜์Šค์— ๋งž๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค. @Service๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์—, @Repository๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์—, @Controller๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ œ์–ดํ•˜๋Š” ํด๋ž˜์Šค์— ๋ถ™์ธ๋‹ค.
DI ์–ด๋…ธํ…Œ์ด์…˜; @Autowired, @Inject, @Qualifier, @Resource ์Šคํ”„๋ง์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ง€์›ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ๋Š” @Autowired, @Inject, @Qualifier, @Resource๊ฐ€ ์žˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜ ์„ค๋ช… @Autowired ์ฃผ๋กœ ๋ณ€์ˆ˜ ์œ„์— ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค. @Qualifier ํŠน์ • ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ์˜์กด์„ฑ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. @Inject @Autowired์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. @Resource @Autowired์™€ @Qualifier์˜ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. 1. @Autowired ์ƒ์„ฑ์ž๋‚˜ ๋ฉ”์†Œ๋“œ, ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์œ„์— ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅ ์–ด๋””์— ์‚ฌ์šฉํ•˜๋“  ๊ฒฐ๊ณผ๋Š” ๊ฐ™์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์œ„์— ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์œ„์— ๋ถ™์€ @Autowired๋ฅผ ํ™•์ธํ•˜๋Š” ์ˆœ๊ฐ„ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ฒดํฌํ•˜๊ณ ..
@Component ์‚ฌ์šฉ๋ฒ• ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํด๋ž˜์Šค ํŒจ์Šค์— ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ์Šค์บ”ํ•˜์—ฌ @Component๊ฐ€ ์„ค์ •๋œ ํด๋ž˜์Šค๋“ค์„ ์ž๋™์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑํ•œ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• 1. Context ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”๊ฐ€ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. 2. ์ปดํฌ๋„ŒํŠธ ์Šค์บ”(component-scan) ์„ค์ • ์—˜๋ฆฌ๋จผํŠธ์˜ base-package๋กœ ์ง€์ •ํ•œ ํŒจํ‚ค์ง€๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ์Šค์บ” ๋Œ€์ƒ์— ํฌํ•จ๋œ๋‹ค. 3. ๊ฐ์ฒด ์ƒ์„ฑ์„ ์›Œํ•˜๋Š” ํด๋ž˜์Šค์— @Component์œผ๋กœ ์ง€์ • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. package polymorphism; import org.springframework.stereotype.Component; @Component public class LgTV implements TV { public L..
์ปฌ๋ ‰์…˜ ๊ฐ์ฒด ์„ค์ • ์ข…๋ฅ˜ java.util.List ๋ฆฌ์ŠคํŠธ1 ๋ฆฌ์ŠคํŠธ2 java.util.Set: ์ค‘๋ณต๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ ๊ฐ์ฒด Lovegame 0415 I'm in love java.util.Map: ํŠน์ • key๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‚ฌ์šฉ ์•„์ด์œ  ๋ถ„ํ™์‹  ์—”์‹œํ‹ฐ BOSS java.util.Properties: key-value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ 2020.12.30 2020๋…„ ๋Œ๋ ค๋‚ด
Setter ์ธ์ ์…˜ ์ด์šฉํ•˜๊ธฐ (p ๋„ค์ž„์ŠคํŽ˜์ด์Šค) ๋จผ์ € ์ƒ์„ฑ์ž ๋Œ€์‹  setter ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. public class SamsungTV { private Speaker speaker; private int price; public void SamsungTV(){ } // ์ƒ์„ฑ์ž ๋Œ€์‹  setter ๋ฉ”์†Œ๋“œ public setSpeaker (Speaker speaker){ this.speaker = speaker; } public void setPrice(int price){ this.price = price; } } Setter ์ธ์ ์…˜์„ ์ด์šฉํ•˜๋ ค๋ฉด ๋Œ€์‹  ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ name ์†์„ฑ๊ฐ’์ด ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด๋‹ค. name="speaker"์ด๋ฉด setSpeaker()๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  name="addressList"์ด๋ฉด setAddressList()..
์ƒ์„ฑ์ž ์ธ์ ์…˜(Constructor Injection) ์ด์šฉํ•˜๊ธฐ 1. ๊ธฐ๋ณธ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” XML ์„ค์ • ํŒŒ์ผ์— ๋“ฑ๋ก๋œ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„์„œ ๊ฐ์ฒด ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์ƒ์„ฑ์ž๋Š” ๋ฐ”๋กœ ์ƒ์„ฑ์ž ์ธ์ ์…˜(Constructor Injection)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. public class SamsungTV { private SonySpeaker speaker; private int price; public SamsungTV(){ } public SamsungTV(SonySpeaker speaker){ this.speaker = speaker; } public SamsungTV(SonySpeaker speaker, int price){ this.speaker = speaker; this.price = price; } } ์Šค..
์Šคํ”„๋ง ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• Dependency Lookup: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰(Lookup)ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹ Dependency Injection: ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์— ๋“ฑ๋ก๋œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹. ๋Œ€๋ถ€๋ถ„ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. Constructor Injection: ์ƒ์„ฑ์ž ๊ธฐ๋ฐ˜ Setter Injection: Setter ๋ฉ”์†Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐธ๊ณ ๋กœ, ์˜์กด์„ฑ ๊ด€๊ณ„๋ž€ ๊ฐ์ฒด์™€ ๊ฐ์ฒด์˜ ๊ฒฐํ•ฉ ๊ด€๊ณ„๋ฅผ ๋งํ•œ๋‹ค. ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ์ด ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๊ฐ ์˜์กด์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋‹ค๋ค„๋ณผ ๊ฒƒ์ด๋‹ค.
์Šคํ”„๋ง XML ์„ค์ • ํŒŒ์ผ์˜ <import>, <bean> ์—˜๋ฆฌ๋จผํŠธ ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ ์—˜๋ฆฌ๋จผํŠธ ์‹œ์ž‘ ํƒœ๊ทธ์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋น„๋กฏํ•œ XML ์Šคํ‚ค๋งˆ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ์„ค์ •๋œ๋‹ค. ํŒŒ์ผ์ด ์ž๋™์„ ์ƒ์„ฑ๋  ๋•Œ, beans ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉฐ, spring-beans.xsd ์Šคํ‚ค๋งˆ ๋ฌธ์„œ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค. , , , ๋“ฑ ๋„ค ๊ฐœ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—˜๋ฆฌ๋จผํŠธ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ํฌํ•จํ•จ์œผ๋กœ์จ ํ•œ ํŒŒ์ผ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•œ ์„ค์ • ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์—˜๋ฆฌ๋จผํŠธ ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์— ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. class ์†์„ฑ์€ ํ•„์ˆ˜์ด๋‹ค. ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋œ ์ „์ฒด ํด๋ž˜์Šค ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. id ์†์„ฑ์€ ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์†์„ฑ๊ฐ’์—๋Š” CamelCase๋ฅผ ์‚ฌ์šฉ..