본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Document

[SpringBoot] 공식 문서 요약(1) - 개요/로그/설정파일

by 김코더 김주역 2021. 9. 3.
반응형

SpringBoot Document Review 1

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/

 

1) Starter

- 자주 사용할만한 라이브러리들을 묶어 Spring Boot에서 제공해주는 것

- Spring Boot에서는 spring-boot-starter-*의 이름으로 제공해주는데, 제 3자가 만든 Starter은 [Own Project]-spring-boot-starter-*의 이름으로 작명되어야 한다.

 

2) Optional dependency

- 의존성 정보를 다른 패키지에 넘기고 싶지 않을 때 사용함

<dependency>
	...
    <optional>true</optional>
</dependency>

 

3) autoconfigure 모듈

- 자동 설정에 필요한 모든 요소(@ConfigurationProperties 등)과 라이브러리를 갖고 있음

- dependency에 optional을 걸어두는 것이 좋음

- starter 내에 autoconfigure을 정의해서 배포하는 경우도 있음.

 

4) XML 설정 vs JAVA 설정

이제는 JAVA 설정이 권장된다. Java 설정이 메인이면 Java 설정에서 xml 설정파일을 끌어올 수도 있다.

@Configuration 클래스(어노테이션)을 이용하여 설정할 수 있다.

@Import({A.class, B.class, ...}) 어노테이션으로 특정 @Configuration 클래스가 적용된 컴포넌트들을 명시할 수 있으며, @ComponentScan 어노테이션은 @Configuration 클래스가 적용된 모든 컴포넌트들을 읽어들일 수 있다.

 

5) 스테레오타입 어노테이션

@Component : Spring에서 관리되는 bean 오브젝트임을 표시하기 위해 사용하는 기본적인 어노테이션. @Component의 구체화된 형태로 아래 3개의 어노테이션이 있는 것.

@Service : 비즈니스 로직에 사용

@Repository : 외부 I/O처리 혹은 데이터베이스에 접근하는 DAO 계층에 사용

@Controller : Spring MVC에 사용

 

6) @SpringBootApplication

@SpringBootApplication = @SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan

 

7) spring-boot-devtools

* classpath를 모니터링 하여, classpath가 업데이트되면 자동으로 restart해줌

단, spring-boot, spring-boot-devtools, spring-boot-autoconfigure, spring-boot-actuator, spring-boot-starter 프로젝트는 restart하지 않는다.

classpath를 업데이트하는 방법은 IDE에 따라 다른데, eclipse는 편집된 파일을 저장할때이고, Intellij는 [Build -> Build Project]를 했을 때이다. build project : 프로젝트 리로딩 없이 서버 on상태를 유지하면서 프로젝트 내용 업데이트가능.

DevTools는 ResourceLoader를 customize해야함.

 

8) restart vs reload

restart : 2개의 classloader를 사용하는데, 제 3자의 jar파일안에 있는 클래스들처럼 변하지 않는 클래스들은 base classloader에 저장되고, 개발중인 클래스들은 restart classloader에 저장된다. 애플리케이션이 restart되면 기존의 restart classloader는 사라지고 새로운 restart classloader가 생성된다. base classloader은 유지된다.

cold start : base classloader까지 다시 가져오는 방식

reload : 설정 파일만 다시 읽어들이는 방식

 

9) Chrome LiveReload

프로젝트 내의 변경된 파일을 Build/Restart 하면 자동으로 Reload 해주는 기능이다.

https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei?hl=ko 

 

LiveReload

Provides Chrome browser integration for the official LiveReload apps (Mac & Windows) and third-parties like guard-livereload and…

chrome.google.com

 

10) 로깅 레벨

Spring 설정 파일(application.properties 등)에 logging.level.<logger-name>=<level> 형식으로 로깅 레벨을 설정할 수 있으며, logging.level.root는 root(기본 로거)의 로깅 레벨을 설정할 수 있다.

level의 종류로는 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF가 있다.

 

11) SpringApplication 커스터마이징

기본 형태

SpringApplication.run(DemoApplication.class, args);

커스터마이징 형태 : SpringApplication에 대한 객체를 생성해서 예를 들어 다음과 같이 별도의 설정을 부여할 수 있다.

SpringApplication app = new SpringApplication(DemoApplication.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);

 

12) 리스너는 Bean으로 등록될 수 없음

이유 : 어플리케이션 생성 전에 발생하는 이벤트가 있을 수도 있어서

리스너는 SpringApplication.addListener(리스너 클래스)로 등록해도 되고, 설정파일을 이용해도 된다.

(org.springframework.context.ApplicationListener 인터페이스를 참조한 리스너 클래스 혹은 설정 파일 속성)

 

13) args 사용하기

@Autowired
ApplicationArguments arguments;

List<String> helloValues = arguments.getOptionValues("hello");
//또는
@Value("${hello}") // @Value로 bean, 설정 파일에 있는 프로퍼티도 가져올 수 있음
String[] helloValues;

args는 commend line으로 부여하는 방법도 있다.

java -jar [jar경로] --hello=Hello --hello=World

 

14) Property 우선 순위

+ json 이용 + application.properties 파일의 위치에 따른 우선순위 + application.properties 커스터마이징

+ 환경 변수 이용

https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/boot-features-external-config.html

※ -D : 프로퍼티를 System에 주입할때(우선 순위 9위)

 

15) YAML 설정 파일

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.external-config.yaml

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-multi-profile-yaml

- 기본적으로 spring-boot-starter에서 제공함

- 프로퍼티를 계층적으로 설정

- "---" 구분자를 쓰면, 하나의 yml파일을 여러 Document로 나누어 조건별 설정(profile)을 둘 수 있음.

+) profiles:default -> default 처럼 동작 +) profile 적용법 -> https://sgc109.github.io/2020/07/06/spring-profiles/

+) Command Line -> "--Spring.profiles.active=dev,hsqldb"

- 리스트와 맵의 경우에는 이어서 추가되지 않고, 한 프로퍼티에 대해 한꺼번에 적용됨

- 설정 파일은 리스트나 맵을 Value 어노테이션으로 통째로 가져올 수 없음 -> Environment 객체에 통째로 등록이 안되기 때문. 이 경우에는 16)의 방법을 사용한 뒤에 Autowired 어노테이션으로 가져오는 것이 편함. Environment 객체에는 예를 들어 "user.arr[0].name"과 같이 저장이 되어있음

 

16) YAML, properties의 list 속성 예제 / @ConfigurationProperties + prefix의 의미

@ConfiguraionProperties, @Value는 모두 설정 파일에 있는 값을 가져오는 용도로 사용 가능하다.

 

17) 설정 파일에 있는 프로퍼티들을 객체로 저장하고, 이를 bean으로 등록하는 방법

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

- 저장할 객체에서는 생성자를 사용하지 말고 getter, setter만 사용하면 된다.

 

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding

- 설정 파일 프로퍼티를 객체로 저장할 때, 형변환을 커스터마이징할 수 있다. + 시간, 용량 클래스 형변환

 

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-validation

- 설정 파일 프로퍼티를 객체로 저장할 때, @NotNull, @Min, @Max와 같이 Validation을 적용할 수도 있다.

 

18) @Bean을 사용하여 등록하려면 해당 클래스를 @Configuration으로 등록해야 함

 

19) @ConfigurationProperties의 완화된 바인딩

 @ConfigurationProperties(prefix="acme.my-project.person")에서 이름을 acme.my-project.person으로 설정했어도, 설정 파일의 property명을 다음(링크 참고)과 같이 다르게 작성할 수도 있다.

prefix값은 반드시 소문자, - 의 조합으로 해야 한다.

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding

 

20) spEL

- #{...} 형태의 표현식

- @ConfigurationProperties와는 사용할 수 없고, @Value와 사용 가능함

 

21) Profiles 및 Profiles 추가

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-profiles.html

- Profiles도 우선순위가 높은 선언쪽으로 설정된다.

- 아래 형식처럼 Profile별 Bean을 모두 만들어두고, MyBean(Interface) 객체를 @Autowired로 주입 받을 수도 있다. 그러면 활성화된 Profile에 대한 Bean이 MyBean 객체에 자동으로 주입된다.

@Component
@Profile("prod")
public class ProdBean implements MyBean{
    @Override
    public String getMessage(){return "...";}
}

- spring.profiles.include : 활성화된 Profiles에 새 Profiles 추가

 

22) Log

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-logging.html

- SpringBoot는 기본 로그 도구로 LogBack을 사용하며, Process ID, Thread name, Logger name 등의 정보가 포함됨

- Debug 모드로 실행하려면 "java -jar [jar 파일] --debug" 또는 설정 파일에서 debug=true

- Debug 모드는 좀 더 많은 정보를 확인할 수 있음, Trace 모드는 매우 더 많은 정보를 확인할 수 있음

- 로그에 색도 입힐 수 있음 (spring.output.ansi.enabled=ALWAYS(or DETECT or NEVER) 

- 로그를 Console 뿐만 아니라, logging.file 또는 logging.path 속성으로 파일에 저장 가능함 (application.properties)

- 로깅 시스템은 애플리케이션 초반에 만들어지기 때문에 @PropertySource로 가져온 파일은 먹히지 않음

- Logger별 로깅 레벨을 설정할 수 있다. (logging-level.<logger-name>=<level>) 자세한 내용은 문서 26.4 참조

- logback-spring.xml 이나 logging.config 파일을 수정하면, 특정 주기로 자동 스캔하여 런타임시에도 적용해준다.

(단, Extensions(문서 26.7 참고)에서는 오류가 남)

- Logback 설정 파일에서 <springProperty> 태그를 쓰면, application.properties에 있는 설정값들을 사용할 수 있다.

(문서 26.7 참고)

 

23) 기본적으로 classpath root는 resources 디렉토리

 

24) placeholder

- 설정 파일에서 이미 설정된 값을 참조하는 것 - 예) ${app.name}

- 설정 파일, 매핑 어노테이션, Value 어노테이션 등에서 사용 가능

- 조건 부여 가능

${server.error.path:${error.path:/error}} : server.error.path 값이 없다면 error.path값을 사용하고, error.path값도 없다면 /error를 사용

※ @GetMapping("${index.path}") : 설정 파일에 설정한 index.path 값으로의 Get 요청

반응형

댓글