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๋ฅผ ์ฌ์ฉ.. ์ด์ 1 2 3 ๋ค์