-
2022-08-10 : SpringBoot의 원리 및 활용TIL ( Today I Learned ) 2022. 8. 10. 14:23
SpringBoot의 원리 - 의존성 관리, 자동 설정
1. 의존성 관리
2. Auto COnfiguration
- 여러 설정을 일으키며 내장된 톰캣 서버에서 Web Application이 실행될 수 있는 이유 중에 하나는 Auto Configuration 때문이다.
- 스프링부트에서는 @EnableAutoConfiguration 또는 @SpringBootApplication 중 하나만 사용하면 자동 환경설정이 가능
- @SpringBootApplication 어노테이션을 사용하는 것은 다음의 세 어노테이션을 사용하는 것과 같다.
1. @SpringBootConfiguration
: 스프링부트 설정을 나타내는 어노테이션이다. 스프링의 @Configuration을 대체
2. @ComponentScan
: basePackages 프로퍼티 값에 별도의 경로를 설정하지 않으면 해당 어노테이션이 위치한 패키지가 루트 경로가 된다. 하위 루트까지 쭉 가면서 Bean을 등록한다.
ㆍ@Component가 붙어있는 클래스를 찾아가서 모든 인스턴스를 생성해 빈으로 등록한다
ㆍ@Component, @Configuraiton, @Repository, @Service, @Controller, @RestController
3. @EnableAutoConfiguration
: 미리 정의된 Bean을 가져와서 등록해준다
ㆍ외부 라이브러리 중 Spring-boot-autoconfigure에 META-INF 디렉토리 하위 spring.factories에 자동으로 가져올 Bean들이 등록되어있다
자동설정 만들기
1. application.properties
- 스프링부트는 application.properties 파일을 통해 설정을 제공한다. 이 파일에는 부트가 제공하는 프로퍼티 뿐 아니라 커스텀 프로퍼티를 추가할 수 있다.
2. @ConfigurationProperties: 자동 설정 클래스 내의 스프링 빈을 property파일을 통해 재정의 하고자 할 때는 이 어노테이션을 사용
- dependency 추가
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
3. @EnableConfigurationProperties
: 이 어노테이션을 통해 클래스를 프로퍼티 파일 정보를 담고 있는 클래스로 자동 등록
4. @ConditionalOnMissingBean
: 이 어노테이션은 스프링 부트 프로젝트 상에서 같은 이름의 스프링 빈이 있을 때에는 그 스프링 빈을 상요하고, 만약 없다면 자동 등록한 빈을 쓰게끔 유도
SpringBoot의 원리 - 내장 서버 ( 컨테이너와 포트 )
- 스프링 부트의 특징 중 하나는 톰캣 서버가 내장되어 있다는 것
- 톰캣 내장 서버가 자동 설정의 일부, 스프링 부트에서는 톰캣과 서블릿 서버가 자동으로 설정되어있다.
1. 스프링 부트 자동 설정 ( 내장 서버 )
- auto configure의 spring.factories에 자동설정 파일들이 있다
- ServletWebServerFactoryAutoConfiguration
ㆍ서블릿 웹 서버 생성 설정 파일
ㆍTomcatServletWebServerFactoryCustomizer
º 서버 커스팅마이징
- DispatcherServletAutoConfiguration
ㆍDispatcher 서블릿 만들고 등록 설정 파일
2. 내장 서블릿 컨테이너 응용
서블릿
: javax.servlet package에 정의된 인터페이스
- 클라이언트의 요청을 처리하고 그 겨롸를 다시 클라이언트에게 응답하는 Servlet클래스의 구현 규칙을 지킨 자바 프로그램
- 서블릿 Life Cycle을 위한 세 가지 메소드
ㆍinit() - 초기화
ㆍservice() - 요청
ㆍdestroy() - 파괴
서블릿 컨테이너
: 서블릿 컨테이너란 서블릿들을 위한 상자(Container)이다.
- 클라이언트의 Request를 받아주고 Response를 보내주며 정적인 웹 페이지 생성을 위해 존재한다.
- 서블릿의 생명주기를 관리(생성, 초기화, 전달)해준다.
- 다른 말로는 웹 컨테이너, 웹 애플리케이션 서버(WAS)라고도 불리며 대표적인 Servlet Container는 Tomcat이다.
1. Tomcat이 아닌 다른 서블릿 컨테이너 변경
2. 웹서버 사용하지 않기 - properties 이용
3. ApplicationListner으로 포트 정보 알아내ㅣ
스프링부트 원리 - 내장 서버(HTTPS와 HTTP2)
HTTPS vs HTTP
- HTTP(Hypertext Transfer Protocol)은 Hypertext인 HTML을 전송하기 위한 통신 규약
- HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 주고받은 메시지를 변조시키거나 가로채기 쉽다
- HTTPS의 S는 Over Secure Socket Layer의 약자로 보안이 강화된 HTTP를 말한다
HTTPS와 SSL
- HTTPS와 SSL은 동일한 의미로 쓰이기도 한다. HTTPS는 SSL 프로토콜 위에서 돌아가는 프로토콜이다.
1. HTTPS 사용하기
(1) keystore 생성
- HTTPS(SSL)을 사용하려면 keystore를 만들어야 한다.
- application.properties
server.ssl.key-store=keystore.p12 server.key-store-stype=PKCS12 server.ssl.key-store-password=123456 server.ssl.key-alias=spring
(2) 실행하기
- Spring Boot는 기본적으로 Tomcat이 사용하는 Connector를 하나만 등록해준다.
- 위와 같은 적용 시 Connector에서 SSL 적용
2. HTTP, HTTPS 둘 다 받기 ( HTTP 커넥터 설정 )
(1) 톰캣 Connector 생성
@Bean public ServletWebServerFactory serverFactory() { TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory(); tomcatServletWebServerFactory.addAdditionalTomcatConnectors(createStandardConnector()); return tomcatServletWebServerFactory; } private Connector createStandardConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(8080); return connector; }
- 새로운 Connector을 추가한 후 그 Connector의 포트를 8080으로 설정해두면 http로 8080포트 접속이 가능
(2) 기존 Connector port 설정
- application.properties
server.port=8443
(3) curl 테스트
3. HTTP2
- HTTP1은 기본적으로 Connection당 하나의 요청을 처리하기 떄문에 동시 전송이 불가능하고 요처와 응답이 순차적으로 이루어진다.
- 그렇기에, HOL(Head Of Line) Blocking-특정응답지연, RTT(Round Trip Time) 증가, 헤비한 Header 구조라는 문제점들을 갖고 있다
- HTTP2는 HTTP1에 비해 성능뿐 아니라 속도면에서 월등
ㆍMultiplexed Streams : 한 커넥션에 여러개의 메세지를 동시에 주고 받을 수 있음
ㆍStream Prioritization : 요청 리소스간 의존관계를 설정
ㆍServer Push : HTML문서상에 필요한 리소스를 클라이언트 요청없이 보내줄 수 있음
ㆍHeader Compression : Header 정보를 HPACK압축방식을 이용하여 압축 전송
- application.properties
server.http2.enable=true
스프링부트 활용 - 기능 소개, Spring Application
1. Log Level 설정
2. FailureAnalyzer
3. Banner
ㆍ배너란 스프링부트 애플리케이션 실행화면에 나오는 Spring이라는 글자
ㆍsrc - main - resources에 Banner.txt 생성
ㆍ다른 위치에 Banenr를 만들고 싶다면 application.properties 설정
spring.banner.location=classpath:디렉토리\banner.txt
º 기본 인코딩이 UTF-8이라 시스템 콘솔의 인코딩도 확인
ㆍapplication 파일에서 코딩으로 배너 추가도 가능
4. ApplicationEvent
- Spring Boot에서는 기본적으로 제공해주는 다양한 시점의 이벤트 존재
- ApplicationEvent 등록할 때 해당 이벤트가 Application Context 생성 이전의 이벤트인지, 또는 이후의 이벤트인지가 가장 중요
5. WebApplicationType 설정
1. SERVLET
ㆍSpring MVC가 있다면 기본적으로 SERVLET으로 작동
2. REACTIVE
ㆍSpring WebFlux가 있다면 기본적으로 REACTIVE으로 자동
3. NONE
ㆍ둘 다 없다면 NONE으로 동작
- Type 적용 순서
ㆍWebApplication의 Type은 SERVLET → REACTIVE → NONE 순서로 적용
6. 애플리케이션 아규먼트 사용
- 애플리케이션 아규먼트란 위 Program arguments에서 --로 들어오는 아규먼트를 말한다
- JVM 아규먼트는 -D로 들어오는 아규먼트이다
- 자세한 예제는 참고자료 확인
'TIL ( Today I Learned )' 카테고리의 다른 글
2022-08-23 : JAVA (0) 2022.08.23 2022-08-18 : JAVA (0) 2022.08.18 2022-08-09 : Spring (0) 2022.08.09 2022-08-05 : JS (0) 2022.08.05 2022-08-03 : Spring (0) 2022.08.03