본문 바로가기
개발관련/Spring

spring boot(스프링 부트) - 프로젝트 구조 및 사용 방법

by joa-yo 2020. 6. 18.
반응형

공식페이지의 내용을 정리하였습니다.

 

 

3.2. Structuring Your Code

- spring boot의 일반적인 구조

스프링 부트의 일반적인 구조
Application.java

이 구조의 루트 패키지는 com.example.myapplication이다. 루트 패키지 하위에 Application자바파일과 customer, order같은 패키지가 있다. Application.java파일은 루트 패키지에 존재한다고 할 수 있는데, 왜 이렇게 설정했는지 알아보자.

 

Application파일은 구조가 매우 간단한데, @SpringBootApplication 어노테이션과 main 메소드가 있다. main메소드를 가지고 있어서 이 프로젝트의 진입점으로 이용가능하다. 일반적인 MVC 웹 프로젝트에서도 이러한 main메소드를 이용하는데, 그 이유는 tomcat을 내장하고 있어 진입점을 지정해 줄 필요가 있기 때문이다. 또한 @SpringBootApplication을 사용하면 componentScan의 범위를 지정해줄 필요가 없다. 이 하위에 있는 Entity들을 모두 스캔하여 bean으로 등록해주기 때문이다.

 

이 어노테이션을 사용하고 싶지 않다면 @EnableAutoConfiguration and @ComponentScan을 사용하는 것과 동일하다.

 

 

 

3.3. Configuration Classes

spring에서는 XML과 @Configuration을 사용하여 설정을 했다. 하지만 spring boot에서는 프로그램 진입점인 main메소드에서 모든 설정을 하기를 권장하고 있다. 

 

- 추가적인 설정파일을 불러오기

 @Import를 사용해서 설정파일을 추가해줄 수 있다. 기존 방식대로 @ComponentScan을 사용하면 모든 빈들을 스캔하면서 @Configuration 클래스들도 불러올 수 있다.

 

- XML파일 설정파일 불러오기

@Configuration 클래스를 생성하여 @ImportResource어노테이션으로 XML 설정을 로드할 수 있다.

 

 

3.4. Auto-configuration / 자동 설정

추가한 jar dependencies를 이용하여 스프링부트는 자동설정을 시도한다. 예를들어 HSQLDB가 클래스패스에 있다면, 데이터베이스 연결관련 설정이 없더라고, 스프링부트가 메모리 데이터베이스 자동생성을 해준다.

 

하나 또는 주요한 @Configuration 클래스에 @EnableAutoConfiguration 이나 @SpringBootApplication 어노테이션을 추가해주어야 자동설정이 가능하다.

 

3.4.1. Gradually Replacing Auto-configuration

자동설정은 비침투적인 방법이다. 어느 부분이든지, 자동설정 중 일부분을 다른 설정파일으로 대신 할 수 있다.

 

자동설정이 어떻게, 왜 적용되었는지 아려면 --debug 스위치와 함께 어플리케이션을 시작하라. 이렇게 하면 선택한 코어 로그에 대한 디버그 로그가 활성화되고 그 내용이 콘솔에 기록된다.

 

3.4.2. Disabling Specific Auto-configuration Classes

원하지 않는 자동설정파일이 적용된다면, @SpringBootApplication의 exclude속성을 이용하여 제외 처리를 할수 있다.

 

If the class is not on the classpath, you can use the excludeName attribute of the annotation and specify the fully qualified name instead. If you prefer to use @EnableAutoConfiguration rather than @SpringBootApplication, exclude and excludeName are also available. Finally, you can also control the list of auto-configuration classes to exclude by using the spring.autoconfigure.exclude property.

 

 

3.5. Spring Beans and Dependency Injection

빈을 정의 하거나 dependencies를 주입할 때 기본적인 스프링프레임워크의 기술을 사용할 수 있다. @ComponentScan과 @Autowired를 통해서 주입할 수 있다는 의미이다.

 

만약 위에서 제시한대로 루트 패키지에 application class를 놓았다면, @ComponentScan을 놓을 수 있다. 모든 컴포넌트들( @Component, @Service, @Repository, @Controller 등등)은 자동적으로 스프링빈으로 등록될 것이다.

 

 

3.6. Using the @SpringBootApplication Annotation

SpringBootApplication은 세가지 기능을 활성화한다.

 

- @EnableAutoConfiguration : 자동설정 매커니즘을 가능케 한다.

- @ComponentScan : 어플리케이션 내에 위치한 컴포넌트들을 모두 스캔한다.

- @Configuration : 컨텍스트에 있는 추가적인 빈들을 정의하고,추가적인 설정 클래스들을 import한다.

 

 

3.7. Running Your Application

jar파일패키징과 내장된 http 서버를 사용하는 것의 가장 큰 이점은 다른 어플리케이션처럼 실행할 수 있다는 것이다. IDE에도 추가적인 플러그인이 필요하지 않다. 만약 war 파일 패키징을 사용한다면 서버설정이 필요하다.

 

3.7.1. Running from an IDE

Spring Boot Application은 java application처럼 실행 가능하다. 

 

3.7.5 Hot Swapping

Spring Boot Application은 순수 자바로 이루어진 어플리케이션이기 때문에, JVM hot-swapping은 즉시 이루어진다. 더 완전한 솔루션을 원한다면 JRebel을 사용할 수 있다. 

 

spring-boot-devtools 모듈은 어플리케이션이 빠르게 재시작하는 것을 지원한다. 다음 section에서 자세한 설명을 하겠다.

 

3.8 Developer Tools

더 나은 개발환경을 위한 툴을 springBoot는 갖고 있다. spring-boot-devtools 모듈은 어느 프로젝트에나 사용될 수 있다.

 

- 위처럼 maven에서는 optional,  gradle에서는 developmentOnly를 설정하여 개발시에만 필요한 모듈임을 설정해준다.

 

 

 

3.8.1. Property Defaults

어플리케이션의 속도를 빠르게하기위하여 Caching을 사용한다. 하지만 개발모드에서는 캐싱을 비활성화하여 변화가 즉각 나타날 수 있도록 한다.

 

웹서비스 개발시에 필요한 정보는 web 로깅 그룹의 디버그 로그로 확인 가능하다. request와 response 정보를 자세히 표시하며, 이것을 표시하기 위해서는 spring.mvc.log-request-details 또는 spring.codec.log-request-details를 설정 속성에 추가하면 된다.

If you don’t want property defaults to be applied you can set spring.devtools.add-properties to false in your application.properties.
개발도구에 적용될 수 있는 속성들을 보고 싶다면, 이곳에서 확인하세요.

https://github.com/spring-projects/spring-boot/blob/v2.3.1.RELEASE/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java

 

 

3.8.2. Automatic Restart

spring-boot-devtools를 사용하는 어플리케이션은 파일이나 클래스패스가 변경되면 자동으로 재시작한다. 

 

 

4. Spring Boot Features

스프링 부트의 주요사항 알아보기.

 

 

4.1. SpringApplication

SpringApplication 클래스는 메인 메소드에서 Spring Application을 실행하기 위한 방법을 제공하고 있다.

 

public static void main(String[] args) {
    SpringApplication.run(MySpringConfiguration.class, args);
}

 

정상적으로 실행된 경우

 

실행오류가 발생한 경우

spring boot는 jsp가 아닌 thymleaf를 공식적으로 지원하고 있음. jsp를 쓸 경우 관련 라이브러리 추가가 필요함.

 

 

 

 

작성중 입니다.

4.1.6 Application Availability

 

Liveness state

"Liveness state"는 내부적으로 정상 작동하며 오작동시 자가회복을 한다는 의미이다. 이 상태가 깨지면 어플리케이션은 자가회복을 할 수 없어 재실행된다.

 

스프링부트 어플리케이션의 내부 상태는 대부분 Spring ApplicationContext를 나타낸다. 어플리케이션 컨텍스트가 성공적으로 실행되면, 스프링부트는 어플리케이션이 사용가능한 상태라고 판단한다. 

 

Readiness State

이 상태는 트래픽을 관리하기위한 준비(Ready)가 되었음을 나타낸다. faling "Readiness" state는 플랫폼이 어플리케이션으로 트래픽을 라우트처리 할 수 없음을 나타낸다. 이것은 일반적으로 시작단계에서 CommandLineRunner와 ApplicationRunner 컴포넌트가 처리되거나 처리량이 많아 추가적인 트래픽을 감당할 수 없을 때 발생한다.

 

시작되는 동안 실행되어야 하는 작업은 @PostConstruct와 같이 spring의 컴포넌트 생명주기 콜백을 사용하는 것을 대신해서 CommandLineRunner와 ApplicationRunner를 통해서 실행되어야한다.

 

Managing the Application Availability State

어플리케이션 컴포넌트들은 ApplicationAvailability인터페이스를 inject받고 메소드를 불러 현재 사용가능한 상태인지를 언제든지 확인할 수있다. 어플리케이션은 더 자주 업데이트 한 상태를 확인하기를 원하거나, 어플리케이션의 상태를 업데이트 하기를 원할 수 있다.

 

예를 들어서 Readiness상태를 파일로 생성하여 Kubernetes의 "exec Probe"가 이 파일을 찾도록 할 수 있다.

또한 어플리케이션이 멈춰서 회복 불가능한 경우 어플리케이션의 상태를 업데이트 해줄 수 있다.

 

 

4.7 Developing Web Applications

스프링 부트는 웹어플리케이션을 개발에 적합하다. Tomcat, Jetty, Undertow 또는 Netty가 내장되어 있어 HTTP서버가 내장된 어플리케이션을 만들 수 있다. 

 

4.7.4 Customizing Embeded Servlet Containers

일반적인 서블렛 컨테이너는 spring Enviroment properties로 설정할 수 있다.

 

 

properties로 설정하기

- server.port : http요청이 들어오는 포트번호

- server.address : 바인딩 될 주소

- server.servlet.session.timeout : 세션타임아웃

- server.error.path : 에러페이지 경로

- SSL 설정

- HTTP compression

 

ServerProperties를 참고하여 위와같은 서버 환경을 설정할 수 있다.

자세한 정보는 오른쪽의 링크를 참고하세요. ServerProperties

 

Programmtic Customization

java로 설정할 수 있는 방법이다. ConfigurableServletWebServerFactory에 접근 가능할 수 있도록 도와주는 WebServerFactoryCustomizer를 implements으면 서버 세팅을 할 수 있다.

 

아래는 서버 포트를 설정하는 방법이다.

 

 

 

스프링을 간단히 이해하기 위해 필요한 자료들만 정리했다.

 

https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#using-boot-structuring-your-code

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

http://millky.com/@origoni/post/1100

 

[블로그개발_01] STS로 Spring Boot 웹 프로젝트 시작하기

밀키 스프링 블로그를 오픈소스화 하기로 하였다. 지금 밀키는 크고(?) 너저분 해서 블로그의 기본기능만 심플하게 옮길 생각이다. 개발 툴을 뭘로 할까 고민을 하다가 집에있는 컴터에서도 개��

millky.com

 

반응형

댓글