๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ (135) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ @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๋ฅผ ์ฌ์ฉ.. ์คํ๋ง ์ปจํ ์ด๋์ ์ข ๋ฅ BeanFactory ์คํ๋ง ์ค์ ํ์ผ์ ๋ฑ๋ก๋ Bean ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ค. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ํด์ Bean ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๋ ์์ (Lazy Loading) ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์คํ๋ง ํ๋ก์ ํธ์์๋ ์ฌ์ฉ๋ ์ผ์ด ์๋ค! BeanFactory๋ฅผ ์์ํ ApplicationContext Bean ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ด๋ฆฌ, ํธ๋์ญ์ ๊ด๋ฆฌ, ๋ฉ์์ง ๊ธฐ๋ฐ์ ๋ค๊ตญ์ด ์ฒ๋ฆฌ, AOP ์ฒ๋ฆฌ, ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ง์ ๋ฑ ๋ง์ ๋ถ๋ถ์ ์ง์ํ๊ณ ์๋ค. ์ปจํ ์ด๋๊ฐ ๊ตฌ๋๋๋ ์์ ์ ๊ฐ์ฒด๋ค์ ์์ฑํ๋ Pre-Loading ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ApplicationContext์ ๊ตฌํ ํด๋์ค๋ ๋งค์ฐ ๋ค์ํ๋ฐ ๋ฐ์ ๋ ํด๋์ค๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค. GenericXmlApplicationnCont.. IoC, ๋ฎ์ ๊ฒฐํฉ๋ ํ๋ก๊ทธ๋๋ฐ ์ดํดํ๊ธฐ IoC(Inversion of Control): ์ ์ด์ ์ญํ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ฐ์ฒด ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ์์ค์ฝ๋๋ก ์ฒ๋ฆฌํ์ง ์๊ณ ์ปจํ ์ด๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค. IoC๋ฅผ ์ด์ฉํ๋ฉด ๋ฎ์ ๊ฒฐํฉ๋์ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ ์ ์๋ค. ๊ฒฐํฉ๋๊ฐ ๋์ ํ๋ก๊ทธ๋จ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค. ๋ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์ ํ๋ก๊ทธ๋จ์ ์์ด๋ค. public class LgTV { public void turnOn() { System.out.println("LgTV---์ ์ ์ผ ๋ค."); } public void turnOff() { System.out.println("LgTV---์ ์ ๋๋ค."); } public void soundUp() { System.out.println("LgTV---์๋ฆฌ ์ฌ๋ฆฐ๋ค."); } public voi.. ํ๋ ์์ํฌ๋? ์คํ๋ง ํ๋ ์์ํฌ๋? ํ๋ ์์ํฌ ๊ฐ๋ ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ์์ ๊ธฐ๋ณธ์ด ๋๋ ๋ผ๋๋ ํ์ ์ ๊ณตํ๋ค. ๊ฐ๋ฐ์๋ ๋ผ๋์ ์ด์ ๋ถ์ด๋ ์์ ์ ํ๋ ๊ฒ์ด๋ค. ์ฅ์ ๋น ๋ฅธ ๊ตฌํ ์๊ฐ ์ฌ์ด ๊ด๋ฆฌ ๊ฐ๋ฐ์๋ค์ ์ญ๋ ํ์ผํ ๊ฒ์ฆ๋ ์ํคํ ์ฒ์ ์ฌ์ฌ์ฉ๊ณผ ์ผ๊ด์ ์ ์ง ์คํ๋ง ํ๋ ์์ํฌ ์คํ๋ง ํ๋ ์์ํฌ๋ ๋ก๋ ์กด์จ์ด 2004๋ ์ ๋ง๋ ์คํ์์ค ํ๋ ์์ํฌ์ด๋ค. ์คํ๋ง์ ํ ์ค๋ก "IoC์ AOP๋ฅผ ์ง์ํ๋ ๊ฒฝ๋์ ์ปจํ ์ด๋ ํ๋ ์์ํฌ"๋ผ๊ณ ํ ์ ์๋ค. ๊ฒฝ๋(Lightweight) ์คํ๋ง์ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋๋ก ๊ตฌ์ฑ๋์ด์์ผ๋ฉฐ, ๊ฐ ๋ชจ๋์ ํ๋ ์ด์์ JAR ํ์ผ๋ก ๊ตฌ์ฑ๋จ. ๋ช ๊ฐ์ JAR ํ์ผ๋ง ์์ผ๋ฉด ๊ฐ๋ฐ๊ณผ ์คํ์ด ๊ฐ๋ฅํ๋ค. ์คํ๋ง ํ๋ ์์ํฌ๊ฐ POJO(Plain Old Java Object)ํํ์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค. (POJO๋ ํด๋์ค๋ฅผ ๊ตฌํํ๋๋ฐ ํน๋ณํ ๊ท.. InTelliJ๋ก ์คํ๋ง ํ๋ก์ ํธ ์์ํ๊ธฐ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ ์ฑ ์์๋ Eclipse, Tomcat ์๋ฒ, H2 database๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง ๋๋ ๊ธฐ์กด์ eclipse๋ก Spring ๊ฐ๋ฐ์ ํ๋ค๊ฐ ๋๋ฌด ํ๋๋ ์ผ์ด ๋ง์๋ค... ๊ทธ๋์ jetbrains์ฌ์ intelliJ๋ก ์ค์ต์ ์งํํ ์์ ์ด๋ค. ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ญ์ SQL๋ฌธ์ ์ด๋ฏธ ์๊ณ ์๋ MySQL๋ก ๋ฐ๊ฟ์ ์งํํ ์์ ์ด๋ค. ๋์ ์ค์ต ํ๊ฒฝ์ intelliJ + Tomcat ์๋ฒ + MySQL์ด๋ค. Spring ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ๋ณต์กํ๋ค. ์ธํ๋ฐ์ "์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ IntelliJ IDEA ์ค์ " ๋ฌด๋ฃ ๊ฐ์๋ฅผ ํตํด ๋์์ ๋ฐ์๋ค. ๊ฐ์์ ๋ง๋ถ์ด์๋ฉด, ๋ํ์ ์ ๋ถ์ด๋ผ๋ฉด intelliJ์ ultimate(์ ๋ฃํ)์ ๋ฌด๋ฃ๋ก ์ฝ๊ฒ ๋ค์ด ๋ฐ์ ์ธ ์ ์๋ค. ์ค์ต ํ๋ก.. ๐ซ Spring Quick Start ๐ซ ์ฑ ์ ๋ณด 2020.12.24-2020.12.28 ์๋ ๐ซ ์๋ก Spring์ ๊ณต๋ถํด๋ณธ ์ด๋ ฅ์ ์์ผ๋ ๊ทผ๋ณธ์ ์ธ ๊ฐ๋ ์ ์ฌ์ ํ ์ ๋ชจ๋ฅธ๋ค๊ณ ํ๋จํ๋ค. ๊ทธ๋์ Spring์ ๋ํ ๋๋ ค์์ด ๋ง์๋ ์ฐฐ๋, ์ ๋ฐฐ๋์ ์ถ์ฒ์ ํตํด ์ฑ ์ ๊ตฌ๋งคํด์ ๊ฐ๋ณ๊ฒ ์ฝ์ด๋ณด์๋ค. ํญ์ ๊ฐ์๋ฅผ ํตํด ๊ณต๋ถํ์๋๋ฐ, ๊ฐ๋ ๋ค์ด ์ ๋๋ ๋ง๋ก ์ ๋ฆฌ๋์ด ์์ด์ ์ดํด๊ฐ ํจ์ฌ ์ ๋์๋ค. ์๋ ๋ถ๋ถ์ ๋น ๋ฅด๊ฒ ์ง๋๊ฐ๊ณ , ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๊ฒ์ํ๋ฉด์ ์ด์ฌํ ์ฝ์๋ค. ๋๋ถ์ ๋๋ฌด ํจ์จ์ ์ผ๋ก ๊ณต๋ถํ ์ ์์๋ค. java ๊ฐ๋ฐ์๊ฐ ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์๊ฐ์ด ์ง๋๋ฉด์ ๊น๋จน๋ ๊ฒ ์๊น๊ธฐ๋ ํ๊ณ ๊ธฐ๋กํ๋ฉด์ ๋น ๋ฅด๊ฒ 2ํ๋ ํ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํด์ ์ ๋ฆฌ ๋ ธํธ๋ฅผ ์ฝ๋์ ํจ๊ป ์์ฑํ๋ ค ํ๋ค. ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด ๋ ํฌ์งํ ๋ฆฌ์ ๋ชฉ์ ์ด๋ผ ํ ์ ์๊ฒ ๋ค. ์ .. 2020๋ 12์์ ์ผ๊ธฐ์ฅ โ์ ๊ตฌ์ ๊ตฌ ๐12.05 2-2ํ๊ธฐ๊ฐ ๋ค ๋๋์ง ์์์ง๋ง ์ ๋ฒ ํ๊ธฐ๋ณด๋ค ๋ ๋ฐฐ ์ด์ ์๊ฐ์ด ๋น ๋ฅด๊ฒ ํ๋ฅธ ๊ฒ ๊ฐ๋ค. ์ ๋ฒ ํ๊ธฐ ๋ด๋ด ๋2๋ณ์ ์ฌํ๊ฒ ์์๋๋ฐ ์ฝ๋ก๋ ๋๋ฌธ์ ๋๋์ฑ ์ ์ ์ ์ผ๋ก ํ๋ค๊ณ ์ฐ์ธํ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฒ ํ๊ธฐ๋ ์ ๋ฒ ํ๊ธฐ์ ๋นํด ๊ณต๋ถ๋์ ์ต์ 2๋ฐฐ ์ด์์ผ๋ก ๋์๊ณ ๊ฑฐ์ ๋์ง๋ ๋ชปํ ๊ฒ ๊ฐ์๋ฐ ์คํธ๋ ์ค๋ฅผ ๋ง์ด ๋ฐ์ง ์์๋ ๊ฒ ๊ฐ๋ค. ์ข ์์ด๋ฌ๋ํ๋ฐ, ๊ฐ๋ฐ ์ฝ๋ฉ์ ์ ํ์ง ๋ชปํ์ง๋ง ๊ฐ๋ฐ ๊ณต๋ถ๋ฅผ ํ๋ ๊ฒ ์์ฒด๋ ์ ์ฑ์ ๊ต์ฅํ ์ ๋ง๋ ๋ฏํ๋ค. ๊ธฐ๋ง๊ณ ์ฌ ๊ณต๋ถํ๋ค๊ฐ ๋๋ฌด ํ๊ธฐ ์ซ์ด์ ์ผ๊ธฐ๋ฅผ ์ฐ๊ณ ์๋ค. ํ์ ์ ์ค์ํ๊ฒ ์๊ฐํ๊ณ ๋ณดํต์ ์ด์ฌํ ๊ณต๋ถํ๋๋ฐ ์ด๋ฒ ํ๊ธฐ๋ ์๋ฌด ์์์ด ์๊ฐ๋ค. ๋๋ ต๋ค. ํ์... ๋ค์ ํ๊ธฐ๋ถํด ์ ๋ 18ํ์ ์ด์ ๋ด์ง ๋ง์^^; ๊ณ์ฐํด๋ณด๋ ๋ณต์ ๋ ์ํ๊ณ ์ฌ์๊ฐํ ๊ณผ๋ชฉ๋ ์์ผ.. 2020๋ 11์์ ์ผ๊ธฐ์ฅ ์ ๊ตฌ์ ๊ตฌ ์์ฆ์ ์ง์ง๋ก ๊ณต๋ถ๋ก ๊ฐ๋ฆฌ๋ ์ถ์ด๋ค. ์ฌ๋ฏธ๋ ์๋๋ฐ ์ง์ง ์ผ์์ด ๋ฌ๋ ค์ผํ๋ ๋ถ๋ถ์์ ์ง์น๋ค. ๊ทธ๋๋ ํฌ๊ฒ ์ซ๊ธฐ๊ฑฐ๋ ๋ง์ ์ธ ์ผ๋ ์๊ณ ๋ถ์ํ ์๊ฐ๋ ์ ํ ์์ด์ ์ข๋ค. ๋ง์ ํธํ๊ฒ ๋จน๊ณ ํ ์ ์๋ ๋งํผ, ํ์ด ๋ฟ๋ ๊ณณ๊น์ง ํด๋ณด๋ ค ํ๋ค. ๋ด๊ฐ ์ ์ผ ์ซ์ดํ๋ ๊ฒ ์ด๋์ ๋ ์๋๊ฒ, ์ด์ค๊ฐํ๊ฒ ํ ์ฒ ํ๋ ๊ฑฐ๋ค. ๐ ์ ๋นํ ์์ฌ๋ถ๋ฆฌ๋ฉด์ ์ฃผ์ด์ง ์ผ๋ค ๋ง๋ฌด๋ฆฌํด๋ณด๊ธฐ๋ฅผ ๋ฐ๋๋ค. ์ฝ๋ก๋๊ฐ ๋๋ฌด ์ฌํด์ ธ์ ๋๋ฌด ์ฌํ๋ค. ๋๊ธฐ๋ค๊ณผ ์ฒซ ํ๋ก์ ํธ๋ฅผ ํด๋ณด๋ ์ค์ธ๋ฐ ๋ง๋์ ๋ชจ๊ฐ์ฝํ๋ฉด ์ข์์ํ ๋ฐ ์์ฆ ์ ์ด๋, ํ๊ต๋ ๋๋ฌด ์ํํ๋ค ใ ,ใ ๋๋ ์ง์ฌ์ผ๋ก ๊ฐ๋ฐ์๋ค์ด ์ด๋ค ์ถ์ ์ฌ๋์ง ๊ถ๊ธํ๋ค. ๊ฐ๋ฐ์์ ์ผ์ ์ด์ผ๊ธฐ๋ ๊ณต๋ถํ๋ ์ด์ผ๊ธฐ๋ ์ด๊ฒ ์ ๊ฒ ๋ค์ด๋ณด๊ณ ์ถ๋ค. ๊ฐ์ฐ ๊ฐ์ ๊ฑด ์๋ฐฉํฅ์ ์ํต์ด ์๋๋ผ ๊ทธ๋ฐ์ง, ๋๋ถ๋ถ ์จ๋ผ์ธ ํ๋์ด.. 5.1 ์ํ์ ์ง๊ธฐ์ - Cookie & Session 1) ์ํ์ ๋ณด๋? ์น์์์ ์ํ ์ ์ง ๊ธฐ์ HTTPํ๋กํ ์ฝ์ ์ํ ์ ์ง๊ฐ ์๋๋ ํ๋กํ ์ฝ์ ๋๋ค. - ์ด์ ์ ๋ฌด์์ ํ๊ณ , ์ง๊ธ ๋ฌด์์ ํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ง ์์ต๋๋ค. - ์น ๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)์ ์์ฒญ์ ๋ํ ์๋ต์ ํ๊ณ ๋๋ฉด ํด๋น ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ์ง์ํ์ง ์์ต๋๋ค. ์ํ ์ ์ง๋ฅผ ์ํด Cookie์ Session๊ธฐ์ ์ด ๋ฑ์ฅํฉ๋๋ค. ์ฟ ํค(Cookie)์ ์ธ์ (Session) ์ฟ ํค - ์ฌ์ฉ์ ์ปดํจํฐ์ ์ ์ฅ - ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋ค๋ฅธ ์ฌ๋ ๋๋ ์์คํ ์ด ๋ณผ ์ ์๋ ๋จ์ - ์ ํจ์๊ฐ์ด ์ง๋๋ฉด ์ฌ๋ผ์ง ์ธ์ - ์๋ฒ์ ์ ์ฅ - ์๋ฒ๊ฐ ์ข ๋ฃ๋๊ฑฐ๋ ์ ํจ์๊ฐ์ด ์ง๋๋ฉด ์ฌ๋ผ์ง๋๋ค. ์ฟ ํค(Cookie) ๋์ ์ดํด ์ธ์ ์ ๋์ ์ดํด HttpSession์ด๋ผ๋ ๊ฐ์ฒด: ์ธ์ ์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํด ์์ฑ๋๋ ๊ฐ์ฒด 2) .. 4.5 Swagger 1) Swagger ๊ฐ์ 1. ์ค์จ๊ฑฐ(Swagger)๋? ์ค์จ๊ฑฐ๋ Web API ๋ฌธ์ํ๋ฅผ ์ํ ๋๊ตฌ์ ๋๋ค. ์ค์จ๊ฑฐ ํํ์ด์ง(https://swagger.io)์์๋ ์ค์จ๊ฑฐ๋ฅผ OAS(Open API Specification)์ด๋ผ๊ณ ์๊ฐํ๊ณ ์์ต๋๋ค. ๋ง๊ทธ๋๋ก API๋ค์ด ๊ฐ์ง๋ ๋ช ์ธ(Spec)์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ๋ก์ ํธ๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. Web API๋ฅผ ์๋์ผ๋ก ๋ฌธ์ํ ํ๋ ๊ฒ์ ๊ต์ฅํ ํ๋ ์์ ์ ๋๋ค. Web API์ ์คํ์ด ๋ณ๊ฒฝ๋์์ ๋ ๋ฌธ์ ์ญ์ ๋ณ๊ฒฝ์ด ๋์ผ ํ๋๋ฐ ์ด๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ฝ์ง๊ฐ ์์ต๋๋ค. Swagger๋ฅผ ์ฌ์ฉํ๋ฉด Web API๊ฐ ์์ ๋๋๋ผ๋ ์๊ด ์์ต๋๋ค. ๋ฌธ์๊ฐ ์๋์ผ๋ก ๊ฐฑ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. 2. ์ค์จ๊ฑฐ์ ๊ธฐ๋ฅ ์ค์จ๊ฑฐ ํํ์ด์ง๋ฅผ ๊ฐ๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. 1) API .. 4.4 Controller 1) RestController๋? Spring MVC์์ ์ ๊ณตํ๋ RestController @RestController Spring 4 ์์ Rest API ๋๋ Web API๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ์ด๋ ธํ ์ด์ ํฉ๋๋ค. ์ด์ ๋ฒ์ ์ @Controller์ @ResponseBody๋ฅผ ํฌํจํฉ๋๋ค. MessageConvertor ์๋ฐ ๊ฐ์ฒด์ HTTP ์์ฒญ / ์๋ต ๋ฐ๋๋ฅผ ๋ณํํ๋ ์ญํ @ResponseBody, @RequestBody @EnableWebMvc ๋ก ์ธํ ๊ธฐ๋ณธ ์ค์ WebMvcConfigurationSupport ๋ฅผ ์ฌ์ฉํ์ฌ Spring MVC ๊ตฌํ Default MessageConvertor ๋ฅผ ์ ๊ณต ๋งํฌ ๋ฐ๋ก๊ฐ๊ธฐ์ addDefaultHttpMessageConverters๋ฉ์๋ ํญ๋ชฉ ์ฐธ์กฐ M.. 4.3 WEB API 1) Rest API๋? HTTP ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ๋๋๋งํ์ฌ ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋ฉ๋๋ค. HTTP์ ์ด๋ฐ ํน์ง์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉํ ์ ์์๊น? ๋ผ๋ ๊ณ ๋ฏผ์ ๊ฐ๋ฐ์๋ค์ ํ๊ฒ ๋์์ต๋๋ค. ์ฆ, ์๋๋ก์ด๋ ์ฑ, ๋ชจ๋ฐ์ผ ์ฑ, Javascript ๋ฑ์์ HTTP๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์์๊น? ํ๋ ์๊ฐ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ถ์์ ๋ฒ์ค ์ดํ ์๊ฐํ๋ฅผ ์ ๊ณตํ๋ค๊ณ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ ๋ถ์์๋ 300๋ฒ ๋ฒ์ค์ ๋ํ ์๊ฐํ๋ฅผ ์ ๊ณตํ๋ URL์ ์๋์ ๊ฐ์ ํํ๋ก ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. http://ip์ฃผ์/api/buses/300 ์์ ๊ฐ์ URL์ ํธ์ถ ํ๊ฒ ๋์์ ๋ ์๊ฐํ ์ ๋ณด๋ฅผ ํน์ ํ ํํ๋ก ์ ๊ณตํ๋ค๋ฉด, ๊ทธ ์ ๋ณด๋ฅผ ๋ค์ํ.. 4.2 Layered Architecture 1) ๋ ์ด์ด๋ ์ํคํ ์ฒ๋? Controller์์ ์ค๋ณต๋๋ ๋ถ๋ถ์ ์ฒ๋ฆฌํ๋ ค๋ฉด? ๋ณ๋์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋ณ๋์ ๋ฉ์๋๋ก ๋ถ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ผํ๋ชฐ์์ ๊ฒ์ํ์์๋ ํ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ํ ๋ชฉ๋ก ๋ณด๊ธฐ์์๋ ํ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค๋ฉด ํ์ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๋ ์ฝ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ปจํธ๋กค๋ฌ์ ์๋น์ค ๋น์ง๋์ค ๋ฉ์๋๋ฅผ ๋ณ๋์ Service๊ฐ์ฒด์์ ๊ตฌํํ๋๋ก ํ๊ณ ์ปจํธ๋กค๋ฌ๋ Service๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. ์๋น์ค(Service)๊ฐ์ฒด๋? ๋น์ง๋์ค ๋ก์ง(Business logic)์ ์ํํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์๋น์ค ๊ฐ์ฒด๋ผ๊ณ ํฉ๋๋ค. ๋ณดํต ํ๋์ ๋น์ง๋์ค ๋ก์ง์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋์ํฉ๋๋ค. ํธ๋์ญ์ (Transaction)์ด๋? ํธ๋์ญ์ ์ ํน์ง์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์์์ฑ (.. ์ด์ 1 ยทยทยท 3 4 5 6 7 ๋ค์