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
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 커스터마이징
+ 환경 변수 이용
※ -D : 프로퍼티를 System에 주입할때(우선 순위 9위)
15) YAML 설정 파일
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.external-config.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으로 등록하는 방법
- 저장할 객체에서는 생성자를 사용하지 말고 getter, setter만 사용하면 된다.
- 설정 파일 프로퍼티를 객체로 저장할 때, 형변환을 커스터마이징할 수 있다. + 시간, 용량 클래스 형변환
- 설정 파일 프로퍼티를 객체로 저장할 때, @NotNull, @Min, @Max와 같이 Validation을 적용할 수도 있다.
18) @Bean을 사용하여 등록하려면 해당 클래스를 @Configuration으로 등록해야 함
19) @ConfigurationProperties의 완화된 바인딩
@ConfigurationProperties(prefix="acme.my-project.person")에서 이름을 acme.my-project.person으로 설정했어도, 설정 파일의 property명을 다음(링크 참고)과 같이 다르게 작성할 수도 있다.
prefix값은 반드시 소문자, - 의 조합으로 해야 한다.
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 요청
'Spring Series > Document' 카테고리의 다른 글
[SpringBoot] 공식 문서 요약(6) - Security, OAuth2 (0) | 2021.11.27 |
---|---|
[SpringBoot] 공식 문서 요약(5) - 내장 서블릿 컨테이너 (0) | 2021.11.25 |
[SpringBoot] 공식 문서 요약(4) - Spring WebFlux (0) | 2021.11.15 |
[SpringBoot] 공식 문서 요약(3) - Testing (0) | 2021.11.03 |
[SpringBoot] 공식 문서 요약(2) - Spring Web MVC (0) | 2021.10.04 |
댓글