2. ์คํ๋ง ๋ถํธ ์๋ฆฌ
2. ์คํ๋ง ๋ถํธ ์๋ฆฌ ๊ด๋ จ
1. ์์กด์ฑ ๊ด๋ฆฌ ์ดํด
spring-boot-stater-*
์ ๋ถ๋ชจ์ธspring-boot-stater-parent
, ๊ทธ๋ฆฌ๊ณ ๋ค์ ๊ทธ parent์ ๋ถ๋ชจ์ธspring-boot-dependencies
์ ์ ์๋์ด ์๋pom.xml
์dependencyManegement
์์ญ ์์ ํด๋น ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์์ ๊ด๋ฆฌํ๋ ์์กด์ฑ๋ค์ด ์ ์ ๋์ด ์๋ค.- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ฐ ์คํํฐ์ ๋ฒ์ ์ ๋ช ์ํ์ง ์์๋ ๋๊ณ , parent๊ฐ ๊ด๋ฆฌํ๋ ๋ฒ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
- gradle์ ์ฌ์ฉํ๋ค๋ฉด intellij์
gradle
ํญ์์ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ ์์กด์ฑ๋ค์ ๋ฒ์ ๋ค๊ณผ ํ์ ์์กด์ฑ๋ค์ ์์ธ ๋ฒ์ ๊น์ง ํ์ธ ํ ์ ์๋ค.
2. ์์กด์ฑ ๊ด๋ฆฌ ์์ฉ
๋ฒ์ ๊ด๋ฆฌ ํด์ฃผ๋ ์์กด์ฑ ์ถ๊ฐ
์ฌ์ฉํ๊ณ ์ถ์ dependency stater ๋ฑ๋ก
dependencies {
// ...
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
// ...
}
๋ฒ์ ๊ด๋ฆฌ ์ํด์ฃผ๋ ์์กด์ฑ ์ถ๊ฐ
- ๋ณ๋๋ก ์ถ๊ฐํด์ผ ํ๋ ์์กด์ฑ๋ค์
https://mvnrepository.com
๋ฅผ ํตํด์ ๊ฒ์ํด์ ์ง์ ์ถ๊ฐํ๋ฉด ๋๋ค. ์คํํฐ์ parent์์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋์ง ์์ผ๋ฏ๋ก ์ง์ ๋ฒ์ ๊น์ง ๋ช ์ํด์ค์ผ ํ๋ค.
๊ธฐ์กด ์์กด์ฑ ๋ฒ์ ๋ณ๊ฒฝํ๊ธฐ
์ถ๊ฐ์ ์ผ๋ก ๋ถํธ์์ ๊ด๋ฆฌํ๊ณ ์๋ ์์กด์ฑ์ ๋ฒ์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ ํด์ ์ฌ์ฉํ ์ ์๋ค.
implementation("org.springframework.boot:spring-boot-starter-data-jpa:2.0.3.RELEASE")
3. ์๋ ์ค์ ์ดํด
@SpringBootApplication
์ด ์ ์ธ๋์ด ์๋ ๋ฉ์ธ ํด๋์ค์์ ์ ์ ๋ ธํ ์ด์ ์ ๋ฐ๋ผ ๋ค์ด๊ฐ๋ณด๋ฉด,@SpringBootConfiguration
,@EnableAutoConfiguration
,@ComponentScan
๋ฑ์ด ์ ์ธ๋์ด ์๋ค.- ์ ํ๋ฆฌ์ผ์ด์
์์ ๋น์ ์ฌ์ค ๋ ๋จ๊ณ๋ก ๋๋ ์ ์ฝํ๋ค.
- 1๋จ๊ณ:
@ComponentScan
- 2๋จ๊ณ:
@EnableAutoConfiguration
- 1๋จ๊ณ:
@ComponentScan
์์๋@Component
@Configuration
,@Repository
,@Service
,@Controller
,@RestController
- ์์ ์ ๋ ธํ ์ด์
@EnableAutoConfiguration
์์๋- spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration
@Configuration
@ConditionalOnXxxYyyZzz
- spring.factories
4. ์๋ ์ค์ ๋ง๋ค๊ธฐ 1๋ถ: Starter์ AutoConfigure
Xxx-Spring-Boot-Autoconfigure
๋ชจ๋: ์๋ ์ค์ Xxx-Spring-Boot-Starter
๋ชจ๋ : ํ์ํ ์์กด์ฑ ์ ์- ๊ทธ๋ฅ ํ๋๋ก ๋ง๋ค๊ณ ์ถ์ ๋๋?
Xxx-Spring-Boot-Starter
- ๋ณธ์ธ์ด ๋ง๋ ์์กด์ฑ์ ์ํด ๋ง๋ค์ด์ง๋ ๋น์ด
@ComponentScan์
์ํด์ ๋จผ์ ๋ง๋ค์ด์ง๊ณ , - 2๋ฒ์งธ ๋จ๊ณ์
@EnableAutoConfiguration
์ ์ํด@Configuration
์ผ๋ก ์ค์ ๋์ด์๋ ๋น์ด ์ด๊ฒ์ ๋ฎ์ด ์ฐ๋ ๊ฒฝ์ฐ๋ ์๊ธด๋ค.
5. ์๋ ์ค์ ๋ง๋ค๊ธฐ 2๋ถ: @ConfigurationProperties
- ์ ๋ฆฌํด์ ์ค๋ช
ํ์๋ฉด, ๋ณธ์ธ์ด ์ ํ๋ฆฌ์ผ์ด์
์์ ์ง์
@Bean
์ผ๋ก ์ ์ํ holoman ์ด๋ผ๋ ๋น์ด AutoConfigure๋ก ์ธํด ๋ง๋ค์ด์ง@Configuration
์ผ๋ก ์ ์ธ๋ ๋น์ผ๋ก ๋ฎ์ด์ฐ์ฌ์ง๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.@SpringBootApplication
์ด 1๋จ๊ณ, 2๋จ๊ณ๋ก ๋๋ ์ ๋น์ ์ค์บํ๊ธฐ ๋๋ฌธ์ด๋ค.- ์ด ๊ฒฝ์ฐ์๋
@AutoConfigure
๋ก ์ ์ธํ@Bean
์@ConditionalOnMissingBean
์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ฃผ๋ฉด, ํด๋น ํ์ ์ ๋น์ด ๋น์ด์์ ๊ฒฝ์ฐ์๋ง ์์ฑํ๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก 1๋จ๊ณ๋ก
@ComponentScan
์ด ์ด๋ฃจ์ด์ง๋ ๋น์ด ๋ง๋ค์ด์ก์ผ๋ฉด, 2๋จ๊ณ@EnableAutoConfiguration
์์๋ ๋ง๋ค์ด์ง์ง ์๋๋ค. - ๋ฐ๋ผ์, ๋ณธ์ธ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์ ์์ฑํ
@Bean
์ ์ฐ์ ์์๊ฐ ๋์์ง๊ฒ ๋๋ค.
- ์ด ๊ฒฝ์ฐ์๋
- ์ถ๊ฐ์ ์ผ๋ก
application.yaml
์ ์ค์ ํ ๊ฐ์@ConfigurationProperties
๋ฅผ ํตํด์ ๋น์ ์ฃผ์ ํ ์ ์๋ค.- ํด๋น ์ปค๋ฐ ๋ด์ฉ ์ฐธ์กฐ
- https://github.com/namjunemy/spring-boot-concept-and-utilization/commit/53b92ad92935a0568bb28c2a7d95298c995ebfdb
6. ๋ด์ฅ ์น ์๋ฒ ์ดํด
- ๋ถํธ๋ ์๋ฒ๊ฐ ์๋๋ค.
- ํฐ์บฃ ๊ฐ์ฒด ์์ฑ
- ํฌํธ ์ค์
- ํฐ์บฃ์ ์ปจํ ์คํธ ์ถ๊ฐ
- ์๋ธ๋ฆฟ ๋ง๋ค๊ธฐ
- ํฐ์บฃ์ ์๋ธ๋ฆฟ ์ถ๊ฐ
- ์ปจํ ์คํธ์ ์๋ธ๋ฆฟ ๋งตํ
- ํฐ์บฃ ์คํ ๋ฐ ๋๊ธฐ
- ์ด ๋ชจ๋ ๊ณผ์ ์ ๋ณด๋ค ์์ธํ ๋ ์ ์ฐํ๊ฒ ์ค์ ํ๊ณ ์คํํด์ฃผ๋๊ฒ ๋ฐ๋ก ์คํ๋ง ๋ถํธ์ ์๋ ์ค์
ServletWebServerFactoryAutoConfiguration
(์๋ธ๋ฆฟ ์น ์๋ฒ ์์ฑ)TomcatServletWebServerFactoryCustomizer
(์๋ฒ ์ปค์คํฐ๋ง์ด์ง)
DispatcherServletAutoConfiguration
- ์๋ธ๋ฆฟ ๋ง๋ค๊ณ ๋ฑ๋ก
๋ด์ฅ ์น ์๋ฒ ์์ฉ 1๋ถ: ์ปจํ ์ด๋์ ํฌํธ
spring-boot-starter-web
์ดspring-boot-starter-tomcat
์ ๊ฐ์ ธ์จ๋ค.- ๋ง์ฝ tomcat์ด ์๋, ๋ค๋ฅธ tomcat์ด ์๋ jetty๋ฅผ ๋ด์ฅ ์น์๋ฒ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด
gradle
์ค์ ํ์ผ์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
// ...
configurations {
compile.exclude module: 'spring-boot-starter-tomcat'
}
dependencies {
// ...
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.springframework.boot:spring-boot-starter-jetty')
// ...
}
๋ถํธ๋ฅผ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋์ฐ์ง ์์ผ๋ ค๋ฉด, ํ๋กํผํฐ ์ค์ ์ ํตํด์ ์ผ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์๋ฒ์ ํฌํธ๋ ๊ฐ๋จํ๊ฒ ์ค์ ํ ์ ์๋ค.
.
application.yaml
spring:
main:
web-application-type: none
server:
port: 9090
์๋ฒ ํฌํธ ์ ๋ณด๋ฅผ 0
์ผ๋ก ํ ๋นํ๋ฉด, ์ฌ์ฉ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ๋๋ค์ผ๋ก ์ ํํ๋ค.
server:
port: 0
์์ ๊ฐ์ด ํ ๋น๋ ํฌํธ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ฌ์ฉํ๋ best way๋ฅผ spring boot ๋ํ๋จผํธ์์ ์ค๋ช ํ๊ณ ์๋ค.
package io.namjune.springbootconceptandutilization;
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class PortListener implements ApplicationListener<ServletWebServerInitializedEvent> {
@Override
public void onApplicationEvent(
ServletWebServerInitializedEvent servletWebServerInitializedEvent) {
ServletWebServerApplicationContext applicationContext =
servletWebServerInitializedEvent.getApplicationContext();
System.out.println(applicationContext.getWebServer().getPort());
}
}
๋ด์ฅ ์น ์๋ฒ ์์ฉ 2๋ถ: HTTPS์ HTTP2
- Spring Boot SSL key generate
- ๋ช ๋ น์ด ์ํํ ์์น์ ํค์คํ ์ด๊ฐ ์์ฑ๋๋ค.
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
application.yaml
server:
ssl:
key-store: keystore.p12
key-store-type: PKCS12
key-store-password: 123456
key-alias: tomcat
์ด๋ ๊ฒ SSL ํค๋ฅผ ๋ฑ๋กํ๊ณ ์คํ๋ง๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด,
localhost:8080
์ผ๋ก ์ ๊ทผ์ด ๋ถ๊ฐํ๋ค. ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก์ ๋ชจ๋ ์ ๊ทผ์ https๋ก ํด์ผํ๋ค.์ถ๊ฐ์ ์ผ๋ก http ์ ๊ทผ๋ ๊ฐ๋ฅํ๊ฒ ์ค์ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ http ์์ฒญ์ ๋ฐ๊ธฐ ์ํ ์ปค๋ฅํฐ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ๋์
application.yaml
์์ https์ ํฌํธ๋ฅผ ๋ณ๊ฒฝํด์ค๋ค.
// ...
@Bean
public ServletWebServerFactory serverFactory() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createStandardConnector());
return tomcat;
}
private Connector createStandardConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(8080);
return connector;
}
// ...
๋ก๊ทธ ํ์ธ
# ...
# 2018-11-13 11:23:41.187 INFO 12432 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8443 (https) 8080 (http) with context path ''
# ...
- HTTP2 ์ค์ ์ SSL์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋์ด์๋ ์ํ์์
http2.enabled
๋ฅผtrue
๋ก ํ ๋นํด์ฃผ๋ฉด ๋๋ค.- ์ถ๊ฐ์ ์ผ๋ก ํด์ค์ผํ๋ ์์
์ ๊ฐ ์น์๋ฒ๋ง๋ค ๋ค๋ฅด๋ค(undertow๋ https ์ค์ ์ด ๋์ด์์ผ๋ฉด ์ถ๊ฐ์ ์ธ ์ค์ ์์ด http2 enable๋ง
true
๋ก ํ ๋นํ๋ฉด๋๊ณ , tomcat์ 9.X๋ฒ์ ๊ณผ JDK9 ์ด์์ ์ฐ๋ฉด ์ถ๊ฐ์ ์ธ ์ค์ ์์ด http2๋ฅผ ์ ์ฉํ ์ ์๋ค.)
- ์ถ๊ฐ์ ์ผ๋ก ํด์ค์ผํ๋ ์์
์ ๊ฐ ์น์๋ฒ๋ง๋ค ๋ค๋ฅด๋ค(undertow๋ https ์ค์ ์ด ๋์ด์์ผ๋ฉด ์ถ๊ฐ์ ์ธ ์ค์ ์์ด http2 enable๋ง
server:
http2:
enabled: true