Programming/Spring Boot

내장 웹 서버와 응용 (스프링 부트 원리 - 2)

흠냐아뤼 2020. 3. 8. 20:29
728x90

 

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

 

HTTPS와 SSL 인증서 - 생활코딩

HTTPS VS HTTP HTTP는 Hypertext Transfer Protocol의 약자다. 즉 Hypertext 인 HTML을 전송하기 위한 통신규약을 의미한다. HTTPS에서 마지막의 S는 Over Secure Socket Layer의 약자로 Secure라는 말을 통해서 알 수 있듯이 보안이 강화된 HTTP라는 것을 짐작할 수 있다. HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메시지를 감청하는 것이

opentutorials.org

 

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보다 성능이 개선된 프로토콜,

아래의 웹 사이트에서 성능을 비교할 수 있다.

https://www.httpvshttps.com

 

HTTP vs HTTPS Test

Encrypted websites protect our privacy and are significantly faster. Run this test and prepare to be amazed. #HttpsEverywhere

www.httpvshttps.com

 

 

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