-
내장 웹 서버와 응용 (스프링 부트 원리 - 2)Programming/Spring Boot 2020. 3. 8. 20:29728x90
1. 내장 웹 서버 이해
Spring Boot는 서버가 아니다!
내장 Servlet 컨테이너(톰켓)를 쉽게 사용해 줄 수 있는 툴!
톰켓, 제티, 네티, 언더토우 등이 서버임
톰켓이 만들어지고 실행되는 것도 자동 설정의 일부임 (서블릿 컨테이너를 만들고 서블릿을 등록하는 일이 나누어져 실행됨)
2. 컨테이너와 서버 포트
-다른 서블릿 컨테이너(제티)로 변경
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> </dependencies>
- 프로퍼티 설정으로 웹 서버 사용 유무, 포트 변경가능(server.port)
- 웹 서버가 생성(초기화)되면 포트 번호를 로그에 출력하는 예제
@Component public class PortListener implements ApplicationListener<ServletWebServerInitializedEvent> { @Override public void onApplicationEvent(ServletWebServerInitializedEvent servletWebServerInitializedEvent) { ServletWebServerApplicationContext applicationContext = servletWebServerInitializedEvent.getApplicationContext(); System.out.println(applicationContext.getWebServer().getPort()); } }
3. HTTPS 와 HTTP2
- HTTPS
HTTP 프로토콜 + SSL 프로토콜. 보안 기능이 더해짐.
https://opentutorials.org/course/228/4894
1) Keystore 생성
keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
2) application.properties 에 설정 추가
server.ssl.key-store=keystore.p12 // classpath:keystore.p12 (클래스패스라면) server.ssl.key-store-password=123456 server.ssl.key-store-type=PKCS12 server.ssl.key-alias=spring
위와 같이 하면,
스프링 부트 톰켓에는 하나의 커넥터만 존재하는데
그 커넥터에 ssl을 적용해줌 -> 모든 요청은 https로 해야 함 (http를 받는 커넥터가 없음)
서버가 브라우저에 인증서를 전송하는데,
공인된 인증서는 브라우저가 알고 있지만, 로컬에서 만든 인증서이기 때문에 경고 화면이 표시됨
(https이긴 하지만 공식적인 인증서가 아니기 때문에 무슨 웹사이트인지 모름)
하나의 커넥터에 ssl이 적용되어서, http 요청을 받으려면 커넥터를 추가해야 함
@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; }
- HTTP2
HTTP보다 성능이 개선된 프로토콜,
아래의 웹 사이트에서 성능을 비교할 수 있다.
Tomcat 9.0.x
JDK 9
톰켓의 경우 위의 버전을 사용해야 별도 설정 없이 HTTP2 설정 가능
(undertow는 아무 버전이나 가능)
HTTPS가 적용되어 있는 상황에서 다음을 프로퍼티에 추가
server.http2.enabled=true
4. 독립적으로 실행 가능한 JAR
spring boot 보다는 spring boot maven plugin에 관한 내용
mvn package
위의 터미널 명령으로 프로젝트를 빌드할 수 있음 (다른 곳에 베포, 도커 이미지 파일 등..)
이후 /target/*.jar 파일이 생성되는데,
이 jar file 실행만으로 스프링 프로젝트 실행이 가능
어떻게?
의존성이 있는 모든 JAR를 함께 넣음.
하지만 기본적으로 자바에는 내장 JAR를 로딩하는 표준적인 방법이 없음
따라서 어플리케이션 클래스와 라이브러리 위치를 구분하고, 내부적으로 내장 JAR를 읽는 클래스가 존재
인프런 백기선님 '스프링 부트’ 강의를 듣고 정리한 내용입니다.
728x90'Programming > Spring Boot' 카테고리의 다른 글
스프링 웹 MVC - 2 (스프링 부트 활용 - 6) (0) 2020.03.10 스프링 웹 MVC - 1 (스프링 부트 활용 - 5) (0) 2020.03.10 로깅, 테스트, Devtools (스프링 부트 활용 - 4) (0) 2020.03.09 외부 설정과 프로파일 (스프링 부트 활용 - 3) (0) 2020.03.09 의존성 관리와 자동설정 (스프링 부트 원리 - 1) (0) 2020.03.06