Using Spring boot
해당 문서는 Spring boot 공식 문서를 읽고 공부한 내용입니다 원본은 아래의 링크를 클릭 !
Using Spring Boot
Build Systems
의존성을 관리하고, MavenCentral 같은 중앙 저장소에서 이 종속성들을 publish 할 수 있는 빌드도구를 적극적으로 추천한다.
Maven 과 Gradle 을 사용하는 것을 추천하며, Ant 를 사용할 수 있긴 하다.
스프링은 서로 호환성이 좋은 라이브러리의 세트를 제공한다.
또한 이 라이브러리들이 어떤 버전을 사용하면 좋은지 미리 모두 정의해두었다.
빌드도구들은 이 정보들을 쉽게 가져오게 도와주는데, 어떻게 도와주는지 알아보자.
Maven
Spring Boot Maven Plugin Documentation
- Spring-boot-starter-parent 를 들어가보면, spring-dependencies 가 있고 그 안에서 현재 스프링부트 버전에 최적화된 버전을 모두 명시해두었다.
- 빌드 도구는 그 부분에 명시된 버전의 라이브러리를 자동으로 다운로드해준다.
- 라이브러리가 현재 스프링 버전과 호환되는 버전을 찾는 것 자체가 일이고 노동인데 이를 도와준다.
Gradle
Spring Boot Gradle Plugin Reference Guide
- gradle 에서는 plugin 을 통해 이를 도와준다.
id 'org.springframework.boot' version '2.4.3'
플러그인은 프로젝트를 본격적으로 설정하는 플러그인은 아니지만, 이후의 플러그인들이 들어오는 것을 감지하는 역할을 한다.- 예를 들어 아래의 플러그인들은 자동으로 생성되며, 위의 플러그인이 감지하고 실행한다.
apply plugin: 'java' apply plugin: 'io.spring.dependency-management'
- apply plugin: 'io.spring.dependency-management' 는 maven 의 starter-parent 와 같은 역할을 한다.
- 스프링 부트에서 제공하는 라이브러리 버전 정의 를 자동으로 한다.
- 이를 통해 버전을 명시하지 않고 의존성을 관리할 수 있다.
starter
starter 는
의존성 모음
이다.예를들어 spring boot 로 web 개발을 진행하고 싶다면, tomcat 부터 시작해서 thymeleaf 등등 여러가지 의존성 라이브러리가 필요하다.
하지만
'org.springframework.boot:spring-boot-starter-web'
의존성 관리는 그 안에 필요한 모든 것을 한번에 다운받도록 도와준다.spring-boot-starter-*
의 이름 패턴을 가진다. (검색하기 쉽게 이름 패턴을 고정시켰다고 한다.)여기 서 현재 버전의 스프링부트가 제공하는 starter 들을 볼 수 있다.
spring-boot-starter-actuator
- 에플리케이션을 모니터링하고 관리하는데 필요한 라이브러리셋을 제공한다.
- 이 정보를 이용하여 UI 적으로 보기 쉽게 만든 오픈소스 프로젝트가 있는데, spring boot admin 이라고 한다.
- Spring Boot Admin Github
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.4</version> </dependency>
- Spring Boot Admin Github
Structuring Your Code
스프링 부트에서는 정해진 코드의 구조는 없다. 하지만 다음의 사항들은 권장되고 있다.
- default 패키지 사용은 지양한다.
- default 패키지란 패키지를 지정하지 않는 기본 설정이다.
- root 디렉토리이다.
- @ComponentScan, @EntityScan 등 특정 에너테이션에서 문제가 발생할 수 있다.
- 기본 애플리케이션 클래스 즉, @SpringBootApplication 에너테이션이 붙은 클래스는 Root 패키지에 속하는 것이 좋다.
- @SpringBootApplication 의 위치는, @ComponentScan, @EntityScan 등 검색이 필요한 에너테이션들의 검색 패키지 위치를 정의한다.
- 예를 들어, JPA 애플리케이션을 작성하는 경우 @SpringBootApplication 이 달린 클래스 의 패키지가 @Entity 을 검색하는 데 사용된다.
@SpringbootApplication 에너테이션에 대해서는 이후에 자세히 다룬다.
Configuration Classes
Spring boot 이전에는 빈을 등록하기 위해 xml 을 사용했다. Spring boot 에서도 여전히 XML 을 사용하여 빈을 등록할 수 있지만, @Configuration 어노테이션이 붙은 클래스를 이용하는 것을 추천한다.
@Configuration
@Configuration 이 붙은 클래스는 내부에 @Bean 에너테이션이 붙은 메서드들을 실행하여 빈을 등록시킨다.
@Configuration public class AppConfig { @Bean public MyBean getBeanName(){ return new MyBeanImpl(); } }
@Configuration 자신이 붙은 클래스도 빈으로 등록시킨다.
@Test void Configuration_에너테이션은_빈으로_등록되는가() { ApplicationContext ac = new AnnotationConfigApplicationContext(SpringbootDocsApplication.class); Object bean = ac.getBean(SpringbootDocsApplication.class); Assertions.assertThat(bean).isInstanceOf(SpringbootDocsApplication.class); }
@Import
@Import({Config1.class, Config2.class})
와 같이 다른 클래스를 가져올 수 있다.가져올 클래스에 @Configuration 이 붙어있지 않더라도, 가져온 클래스에 붙어있으면 적용된다.
- 상속과 비슷하다.
- 상속에 비해 위 구문처럼 여러개를 불러올 수 있고, 에너테이션 클래스도 선언가능하는 등 유연성이 더 좋다.
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import({Config1.class, Config2.class}) public @interface EnableConfig { boolean show() default true; }
이런 식으로 에너테이션에도 붙일 수 있어서, 기능이 추가된 설정파일을 만들 수 있다.
Auto-configuration
Spring Boot 자동 구성은 build.gradle 또는 pom.xml 에 사용자가 정의한 jar 의존성들을 기반으로 에플리케이션을 자동구성한다.
- @EnableAutoConfiguration 또는 이 에너테이션이 포함된 @SpringBootApplication 둘 중 하나가 붙은 클래스를 사용해야한다.
자동 구성 라이브러리 알아보기
현재의 자동 구성 라이브러리를 알기 위해서는 --debug
옵션을 활성화 시키고 프로그램을 실행시킨다.
debug 옵션을 활성화 시키는 방
// application.properties debug=true // yaml debug: true
명령줄에서 디버그 모드로 실행시키기
java -jar [패키지된 파일이름].jar --debug
--debug 모드로 실행시키면 콘솔창의 결과
CONDITIONS EVALUATION REPORT ============================
Positive matches:
AopAutoConfiguration matched:
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
AopAutoConfiguration.ClassProxyingConfiguration matched:
- @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
DispatcherServletAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)
- found 'session' scope (OnWebApplicationCondition)
...
```
자동 구성한 설정 제외하기
위의 과정을 통해 어떤 라이브러리가 자동구성되는지 알았다. 만약 특정 자동구성을 사용하고 싶지 않으면 아래의 3가지 방법으로 할 수 있다.
- @SpringBootApplication 의 exclude 옵션으로 제외할 클래스이름 적용
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
- classpath 에 없다면 excludeName 옵션을 통해 풀네임을 지정할 수 있음
@SpringBootApplication(excludeName = "org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration")
- yaml, properties 에서
spring.autoconfigure.exclude
옵션을 통해 조절하는 방법.
이 방법들은 @SpringBootApplication 에 지정할 수 있으며, @EnableAutoConfiguration 에도 가능하다.
'Spring Boot Reference' 카테고리의 다른 글
Getting Started (0) | 2021.04.13 |
---|