- Spring์ ํตํด ์น ์ดํ๋ฆฌ์ผ์ด์ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ๊ฐ์ง ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- Spring์ ํ๋ก์ ํธ ๋ณ๋ก ํ์ ํ๋ก์ ํธ(๋ชจ๋)์ ๊ฐ์ง๊ณ ์๋ค.
Spring Data
๋ผ๋ ํ๋ก์ ํธ์Spring Data JDBC
,Spring Data JPA
๋ฑ์ ํ์ ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ์ํด์Spring Framework
๋ผ๋ ํ๋ก์ ํธ๊ฐ ํ์ํ๋ค
- ๐
Spring Framework
ํ๋ก์ ํธ๋ ์คํ๋ง์ ๊ฐ์ฅ ํต์ฌ ํ๋ก์ ํธ์ด๋ค.
- ๐ ์ฌ๋ฌ Spring ํ๋ก์ ํธ๋ค ์ค ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํ๋ก์ ํธ๋
Spring Framework
,Spring Boot
ํ๋ก์ ํธ์ด๋ค.
- ๐ Spring Framework๋ ๊ฐ์ฒด ์งํฅ์ ํน์ง์ ์ ํ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ ํต์ฌ ๋น์ง๋์ค ๋ก์ง ๊ตฌํ์๋ง ์ง์คํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ์ด๋ค.
- ๐ข
์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํธ๋์ญ์ ์ด ๋์์ ์ฌ๋ฌ ์ฌ์ฉ์๋ก๋ถํฐ ํํด์ง๋ ํฐ ๊ท๋ชจ์ ํ๊ฒฝ์ ๋งํ๋ค.
- ๐ขSpring Framework์ ๊ธฐ๋ณธ ์ ๋ต
๋น์ง๋์ค ๋ก์ง์ ๋ด๋ ์ฝ๋
์์ํฐํ๋ผ์ด์ฆ ๊ธฐ์ ์ ์ฒ๋ฆฌํ๋ ์ฝ๋
๋ฅผ ๋ถ๋ฆฌ์ํค๋ ๊ฒ
- ๐ ๊ทธ๋ ๊ฒ ๋๋ฉด, ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ์งํฅ์ ์ค๊ณ์๋ง ์ด์ ์ ๋ง์ถ ์ ์๊ฒ๋๋ค.
DI
,IoC
๊ธฐ๋ฅ์ ํตํด ๊ฐ์ฒด ์งํฅ์ ํน์ง์ค "๋คํ์ฑ"์ ๊ทน๋ํ ์ํจ๋ค
- ๐ ์ด๋ฅผ ํตํด, ์ฌ์ฌ์ฉ๊ณผ ์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋์ด ํ์ฅ ๊ฐ๋ฅํ๊ณ , ๋์จํ๊ฒ ๊ฒฐํฉ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๊ฒ ๋๋ค.
- Spring Boot๋ Spring ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํด์ค๋ค.
- ์๋ก์ด ๊ธฐ์ ์ด ๋ง๋ค์ด์ง๋ฉด์ ๊ฐ๋ฐ์๊ฐ ์ฒ๋ฆฌํด์ผํ ์ค์ ์ด ๋ง์์ง๊ณ ๋ณต์กํด์ง
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด,
Spring Boot
๋ผ๋ ์๋ธ ํ๋ก์ ํธ๊ฐ ์งํ๋จ.Spring Framework
๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ ๐จ๋๊ตฌ์ผ ๋ฟ์ด๋ค.
- Spring๊ณผ Spring Boot์ ๋ชฉ์ ์ด ์๋ก ๋ค๋ฅด๋ค
- ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ์ด ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํค๊ณ , ๋จ์ ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์๊ฒ ํด์ค๋ค.
- ๋ฐ๋ณต๋๋ ์ฝ๋๋ค์ ์ ๊ฑฐํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์๋๋ก ํด์ค๋ค.
- Mockito์ ๊ฐ์ ๋ค๋ฅธ ํ๋ ์์ํฌ์ ํตํฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ธ์ ์ ๊ฒฝ์ธ ๋ถ๋ถ์ ์ค์ฌ์ค๋ค.
๐ข1. ์คํ๋ง ๊ธฐ๋ฅ์ ์ํ ์๋ ์ค์ ์ ์ง์ํ๋ค
- โSpring Boot๋ Bean์ ๋ ๋ฒ์ ๊ฑธ์ณ ๋ฑ๋กํ๋ค.
@ComponentScan
- Spring๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Component scan์ ํตํด Component๋ฅผ ์ฐพ๊ณ Bean ์์ฑ์ ์งํํ๋ค.
- ์ด ๊ณผ์ ์์ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ Bean๋ค์ด ์์ฑ๋๋ค.
@Controller, @RestController, @Service, @Repository
๋ฑ๊ณผ ๊ฐ์ด @component ์ด๋ ธํ ์ด์ ์ ์ ์ธํ ํด๋์ค๋ค โ@Configuration์ ๋ฑ๋กํ @Bean
๊ณผ ๊ฐ์ ์ค์ ๋ค
@EnableAutoConfiguration
- ์ถ๊ฐ์ ์ธ Bean๋ค์ ์ฝ์ด์ ๋ฑ๋กํ๋ค.
spring.factories
์์ ๋ค์ด์๋ ์๋ง์ ์๋ ์ค์ ๋ค์ด ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ฉ์ด ๋์ด ์ ๋ง์ Bean๋ค์ด ์์ฑ๋๋ค.- ๐
Component scan์ ํตํด์ ๋ชจ์ component๋ค์ ์ ๋ณด
์
spring.factories ํ์ผ์ ์ฌ์ ์ ์ํ auto-configuration ๋ด์ฉ
์ผ๋ก Bean ์์ฑ์ ์งํํ๋ค.
- โ
@SpringBootApplication
์ด๋ ธํ ์ด์
@SpringBootConfiguration
- Spring boot์ ์ค์ ์ ๋ํ๋ด๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, Spring์ @Configuration์ ๋์ฒดํ๋ค.
- Spring ์ ๊ณต ํ ์คํธ(@SpringBootTest, @WebMvcTest)์ ํด๋น ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํจํ๋ค.
@ComponentScan
- basePackages ํ๋กํผํฐ ๊ฐ์ ๋ณ๋์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด ํด๋น ์ด๋ ธํ ์ด์ ์ด ์์นํ ํจํค์ง๊ฐ ๋ฃจํธ ๊ฒฝ๋ก๊ฐ ๋์ด @Component๊ฐ ๋ถ์ ํด๋์ค๋ค์ ํ์ํ์ฌ Bean์ผ๋ก ๋ฑ๋ก์์ผ์ค๋ค.
@EnableAutoConfiguration
- ์๋ ์ค์ ์ ํต์ฌ ์ด๋ ธํ ์ด์ ์ผ๋ก, ํด๋์ค ๊ฒฝ๋ก์ ์ง์ ๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ์๋ํ๋ฅผ ์ํํ๋ค.
โ@EnableAutoConfiguration
๋ด๋ถ
- ๐
AutoConfigurationImportSelector.class
์selectImports()
๋ฉ์๋
- ๐
AutoConfigurationImportSelector.class
์getAutoConfigurationEntry()
๋ฉ์๋
- ๐
AutoConfigurationImportSelector.class
์getCandidateConfigurations()
๋ฉ์๋
- ๐
SpringFactoriesLoader.class
- ๐ข
SpringFactoriesLoader.class
์FACTORIES_RESOURCE_LOCATION
๋ณ์๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด,META-INF/spring.factories
ํ์ผ์ ์ ์๋ ์๋ ์ค์ ํ ํด๋์ค๋ค์ ๋จผ์ ๋ถ๋ฌ์ Bean์ผ๋ก ๋ฑ๋กํ๋ค.
spring.factories
ํ์ผ์ ๋ชจ๋ ํด๋์ค๊ฐ Bean์ผ๋ก ๋ฑ๋ก๋์ง ์๊ณ ,@ConditionalOnClass
์ด๋ ธํ ์ด์ ์ ์ต์ ์ ๋ง๋ ํด๋์ค๋ง Bean์ผ๋ก ๋ฑ๋ก๋๋ค.
- โ๊ฐ๋ฐ์๊ฐ ์ ์ํ Bean๊ณผ Spring Boot๊ฐ ์ ์ํ Bean์ด ์ค๋ณต๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ๊น โ ๐ NO
- getAutoConfigurationEntry()์์
removeDuplicates()
๋ฉ์๋๋ก ์ค๋ณต๋ ์ค์ ์ ์ ์ธ์ํค๊ณ ,
getExcludsions()
๋ฉ์๋๋ก ์ ์ธํ ์ค์ ์ ์ ์ธ์ํจ๋ค.
- Spring ์ฌ์ฉ์, datasource๋ฅผ Bean์ผ๋ก ๋ฑ๋กํด์ค์ผ ํ๋ค. (์ค๋ฅธ์ชฝ)
- Spring Boot ์ฌ์ฉ์, ํ๋ก์ ํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ถ๊ฐํด์ฃผ๋ฉด boot๊ฐ ์ถ๊ฐ๋ JAR ํ์ผ์ ์ธ์ํ์ฌ ๊ด๋ จ๋ ์คํ๋ง ์ค์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค
- ๋ณต์กํ ์ค์ ํ์์์ด, ํ์์ ๋ฐ๋ผ ์ค์ ๊ฐ๋ง ์์ ํด์ฃผ๋ฉด ๋๋ค. (์ผ์ชฝ)
application.yml
ํ์ผ ๊ฐ์ ์์ ํ๊ฒ ๋๋ฉด
spring-configuration-metadata.json
ํ์ผ (์ปดํ์ผ ํ์์ ์์ฑ๋๋ property ์ ์ ํ์ผ)์ ๋ฐ์๋๋ค.
๐ข2. starter ์์กด์ฑ์ ํตํด ๊ฐ๋จํ ์ค์ ํ ์ ์๋ค
- โstarter๋ ์์กด์ฑ๊ณผ ์ค์ ์ ์๋ํํด์ฃผ๋ ๋ชจ๋์ ์๋ฏธํ๋ค.
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.1.RELEASE'
- gradle์ spring-boot-starter-web ์์กด์ฑ์ ์ถ๊ฐํด์ฃผ๋ฉด
- ๊ด๋ จ ๋ชจ๋(jar)๋ค๋ ํจ๊ป ์๋์ผ๋ก classpath์ ์ถ๊ฐ๋๋ค.
- classpath์ ์ถ๊ฐ๋ jar ํ์ผ๋ค์ ์ํด spring.factories ํ์ผ์ ์๋ ๊ด๋ จ ์ค์ ์ด ์๋์ผ๋ก ์ํ๋๋ค.
๐ข1. Spring-boot-starter
Spring boot Starter
๋ฅผ ํตํด
์์กด์ฑ๋ค์ ์ผ์ผ์ด ์ฐพ๊ณ , ํธํ๋๋ ๋ฒ์ ์ ๋ง์ถฐ ์์กด์ฑ์ ์ถ๊ฐํ๋ ๋ฒ๊ฑฐ๋ก์์ ํด๊ฒฐํ์๋ค.compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.1.RELEASE'
spring-boot-starter-web
์ด ํ ์ค๋ง ์ ์ด์ฃผ๋ฉด
๐ web๊ณผ ๊ด๋ จ๋ ์์กด์ฑ๋ค(spring-web, spring-webmvc , jackson-databind)์ ์ถ๊ฐํ ์ ์๊ฒ ๋๋ค.
๐ข2. io.spring.dependency-management
- Spring Boot์ ์์กด์ฑ์ ๊ด๋ฆฌํด์ฃผ๋ ํ๋ฌ๊ทธ์ธ์ผ๋ก dependency manager๊ฐ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ๋ค์ ์์์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํด์ค๋ค.
๐ build ์ค์ ์ dependency์ ๋ํ ๋ฒ์ ์ ๋ช ์ํ ํ์๊ฐ ์๊ฒ๋๋ค.
(์ง์ ๋ฒ์ ์ ๋ช ์ํ๋ ๊ฒฝ์ฐ ํด๋น ๋ฒ์ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ๋๋ค)
๐ ๋จ ํ์ค์ ์์กด์ฑ์ผ๋ก ์ ๋ง์ ํ๋ก์ ํธ๋ค์ ๋ฒ์ ์ ์ถฉ๋ ์์ด ๊ด๋ฆฌํ ์ ์๊ฒ๋๋ค.
๐ข1. Spring์ ์ด์ฉํ ํ๋ก์ ํธ ๋ฐฐํฌ
๐
war(Web application ARchive) ํ์ผ (์น ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ถ๋ ํ์ผ)
๊ณผWAS (ํ๋ก๊ทธ๋จ์ ์คํ์ํฌ ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ)
๊ฐ ํ์
๐ข2. Spring Boot๋ฅผ ์ด์ฉํ ํ๋ก์ ํธ ๋ฐฐํฌ
๐ Tomcat์ด๋ Jetty๊ฐ์ ๋ด์ฅ ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
jar ํ์ผ
๋ง์ผ๋ก ๋ฐฐํฌํ ์ ์๋ค.
- Servlet Container์ ์ข ์๋๋ WebApplication์ด WebApplication์ Servlet Container์ด ์ข ์ํ ์ ์๊ฒ ๋จ
war
,jar
๋ฅผ ์ ํํ์ฌ ๋ฐฐํฌ ํ ์ ์๊ฒ ๋๋ค.- WAS๋ฅผ ์ ํํ ์ ์๋ค. (Tomcat, Jetty, Undertow)
- Spring Boot Actuator๋ Spring Boot Application์ ์ํ ์ ๋ณด(health, properties, beans, ๊ตฌ๋๋ AutoConfiguration ๋ชฉ๋ก ๋ฑ)๋ฅผ ๋ค๋ฃจ๋ Spring Boot์ ์์ฒด์ ์ธ ๊ธฐ๋ฅ์ด๋ค.
dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' }
๐ข Endpoint
{ "_links":{ "self":{"href":"http://localhost:8080/actuator"}, "auditevents":{"href":"http://localhost:8080/actuator/auditevents"}, "beans":{"href":"http://localhost:8080/actuator/beans"}, "health":{"href":"http://localhost:8080/actuator/health"}, "conditions":{"href":"http://localhost:8080/actuator/conditions"}, "configprops":{"href":"http://localhost:8080/actuator/configprops"}, "env":{"href":"http://localhost:8080/actuator/env"}, "env-toMatch":{"href":"http://localhost:8080/actuator/env/{toMatch}"}, "info":{"href":"http://localhost:8080/actuator/info"}, "loggers":{"href":"http://localhost:8080/actuator/loggers"}, "loggers-name":{"href":"http://localhost:8080/actuator/loggers/{name}"}, "heapdump":{"href":"http://localhost:8080/actuator/heapdump"}, "threaddump":{"href":"http://localhost:8080/actuator/threaddump"}, "metrics-requiredMetricName":{"href":"http://localhost:8080/actuator/metrics/{requiredMetricName}"}, "metrics":{"href":"http://localhost:8080/actuator/metrics"}, "scheduledtasks":{"href":"http://localhost:8080/actuator/scheduledtasks"}, "httptrace":{"href":"http://localhost:8080/actuator/httptrace"}, "mappings":{"href":"http://localhost:8080/actuator/mappings"}, "jolokia":{"href":"http://localhost:8080/actuator/jolokia"} } }
๐ข ์ฃผ์ํ ์
- actuator๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ง์ด ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด์ ์์๋ Spring Security ๋ฑ์ ์ด์ฉํ์ฌ ๋ณด์์ ์ ๊ฒฝ์จ์ผํ๋ค.
- WAS๋ฅผ ์ฌ์์ํ๋ฉด actuator์ ์ด์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค.