22/05/10 TIL -Boot의 기본기공부

김석진·2022년 5월 10일
0

다시 초심으로

목록 보기
10/19

Spring Boot Properties

스프링 부트의 기본 기능 전체를 튜닝하는 부트 전용 설정 프로퍼티이다.
주로 apllciation.properties 나 application.yml으로 제어를 한다. Spring이 Stratup할때 해당 파일을 찾아서 읽어낸다!

Spring Boot Properties는 부트의 기능 거의 대부분을 제어 가능하며 기본값이 세팅되어 있어서 심지어 아무 것도 쓰지않아도 동작한다.

Core Properties: Logging

로깅작업을 할때 유용하게 쓰일 기능들을 제공한다.

  • debug
  • trace
  • logging.level.원하는패키지이름

Cache Properties

Spring Cache를 사용할때 Properties를 이용해 세세한 기능을 동작가능하게 한다.

JSON Properties

Jackson이나 GSon을 이용할때 JSON을 어떻게 다룰지 세세한 기능을 제공한다.

Data Properties


Data Migration Properties

이것들 밖에 웹설정을하거나, 템플릿 엔진설정, 서버설정, 시큐리티 설정, Actuator설정, Devtools설정, Testing 설정등에 Spring boot properties를 이용해 설정을 세팅하는데 지원한다.

필요할때마다 필요한 Properties를 찾아가면서 적용해 가는게 좋다고 말씀을 해주셨다.

@SpringBootApplication

스프링 부트 애플리케이션의 시작점이다

안에 @Configuration,@EnableAutoConfiguration,@ComponentScan이 담겨있는 애노테이션이다.

  • @SpringBootConfiguartion은 스프링부트용 @Configuration
  • @EnableAutoConfiguration은 사전에 정의한 라이브러리 빈을 등록하는 역할을한다
  • @ComponentScan은 각종 스프링 빈 애노테이션을 베이스 패키지에서부터 스캔하여 스프링 빈으로 스프링 IoC컨테이너에 등록한다.

@SpringBootApplication은 자체로도 속성들을 가지고있다.

  • exclude (autoConfiguaration을 꺼준다)
  • excludeName (exclude는 class로 Configuration을 꺼주지만 이것은 풀 패키지 명으로 autoConfiguration을 꺼준다)
    • scanBasePackages (컴포넌트 스캔의 기능을 밖으로 들어나겠끔 옵션을 꺼내놓음)
    • scanBasePackageClasses (클래스로도 해당 컴포넌트 스캔 기능을 사용)
    • nameGenerator
    • proxyBeanMethods

Spring Application 고급설정 추가하기

SpringApplication 인스턴스를 만들어서 run()전에 각종 설정 가능하다.

이렇게하면 콘솔창에서 Spring 배너가 꺼지게 된다.

@Component vs @Configuration

@Component

이것은 커스텀 빈이다.

컴포넌트는 클래스에 붙어서 커스텀 빈으로 만들어준다.
기본적인 사용흐름은
1. @ComponentScan을 통해서 base package부터 모든 @Component를 검색한다.
2. 인스턴스화:필요한 의존성을 모두 주입
3. 스프링컨테이너에 등록: 필요한곳에 주입

빈을 만드는 방법 2+1가지

@Component로 만드는 빈을 만드는 방법과 @Bean애노테이션으로 빈을 만드는 방법이 있는데 둘이 성격이다르다.

1. @Component
2. @Bean(in @Configuration)
3. @Bean(in @Component) :Lite Mode(경량모드)
기본적으로 Spring 생성되는 빈들은 Proxy bean으로 생성되어 나중에 Proxy로 사용되게 되는데 Lite Mode는 Proxy bean을 만들지 않고 그대로 New를 한다 그러나 proxy가 제공하는 AOP 프로그래밍을 사용할 수 없다.

@Component vs @Bean?

@Component

클래스레벨의 애노테이션이다.(Class-level annotation)-> 클래스에 붙이는 애노테이션
등록하려는 빈의 클래스 소스가 편집 가능한 경우에 사용한다.
auto-detection에 걸린다(Spring boot application이 ComponentScan을 할때 걸리게된다)

@Bean

메소드 레벨의 에노테이션이다.( method-level annotation) -> 메소드에 붙이는 에노테이션
네임이 Bean이어서 좀더 읽기 쉽다.
인스턴스화 하는 코드가 수동으로 작성된다. 메소드안에 new로 인스턴스화하는 코드가 드러난다.
빈의 인스턴스 코드와 클래스 정의가 분리된 구조
따라서 외부 라이브러리, 써드 파티 클래스도 빈으로 등록 가능하다.

@Component:Streotype Annotation

컴포넌트에 해당하는 스테레오 타입 애노테이션들
• @Controller
• @Service
• @Repository
이것들은 다 @Component 애노테이션이 붙어있다.

@Component는 결론적으로 빈이다.

@Configuration

"이 클래스는 각종 빈 설정을 담고 있다."

  1. @SpirngBootApplication 이 컴포넌트 스캔을 통해 @Configuration을 찾아냄
  2. 안의 빈 설정(메소드)을 읽어서 스프링 컨테이너에 등록
  3. 필요한 곳에 주입
  4. 또는 각종 스프링 인터페이스의 구현에 함께 활용

@Configuration:스프링 설정 인터페이스 설정

결론

애노테이션이 의도에 맞게 사용되었는지 잘봐주기

빈설정은 @Configuration, 클래스 빈등록은 @Component
• 정확한 목적을 모르고 쓰면 "잘 모르겠는데 어쨌든 돌아가요" 운영의 시한폭탄
• IDE 가 노란 줄 그어주면
• 응 돌아는 간다는 거지 (X)
• 내 사전에 노란 줄이란 있을 수 없다 (O)

Configuration Properties

Externalized Configuration

각종 설정값을 외부로 분리해낸것
서로다른 환경에서도 사용할 수 있다
애플리케이션을 새로 컴파일 하지않고 설정값을 바꿀수 있다.

종류

  • Java properties file
  • YAML
  • environment variable(환경변수)
  • command-line argument

외부설정의 우선순위

외부설정을 넣는 방법이 많고 이를 위해 외부설정을 읽어드리는 순서가 있다
아래 설정이 위에서 읽은것을 덮어씀
1.디폴트 프로퍼티
2.@Configuration 클래스에 @PropertySource 로 정의된 것
3.설정 파일: application.properties
4.RandomValuePropertySource
5.OS 환경변수
6.자바 시스템 프로퍼티: System.getProperties()
7.JNDI 속성: java:comp/env
8.ServletContext - 초기 파라미터
9.ServletConfig - 초기 파라미터
10.SPRING_APPLICATION_JSON 안의 프로퍼티들
11.Command-line arguments
12.테스트에 사용된 프로퍼티들
13.@TestPropertySource
14.Devtools 글로벌 세팅: $HOME/.config/spring-boot

설정파일(Config data)의 우선순위

1.JAR 패키지 안의 application.properties, application.yaml
2.JAR 패키지 안의, 프로파일이 지정된 파일: application-{profile}.properties
3.JAR 패키지 밖의 파일
4.JAR 패키지 밖의, 프로파일이 지정된 파일

설정 파일(Config data) 의 위치

1.classpath
1.1.classpath:/
1.2.classpath:/config
2.현재 디렉토리
2.1../
2.2../config
2.3../config/child

설정 파일 (Config data)을 읽는방법

• @value
• Environment 클래스를 직접 사용하는 방법
• @ConfigurationProperties

@Value

application.properties에 value값을 미리 세팅을 해두고 사용할 수 있다.
• SpEL 로 프로퍼티명을 표현
• type-safe 하지 않음
• 인스턴스화 이후에 주입하므로, final 쓸 수 없음
• 생성자 안에서 보이지 않음 (대안: @PostConstruct)

  • 생성자 주입 방식이 가능
    • 프로퍼티 Relaxed binding 지원 (kebab-case only)
    • meta-data 없음 (javadoc은 적용 가능)

생성자 주입방식을 이용해서 final도 세팅할수있다.

Environment

Environment는 getProperty를 이용해서 값을 가져온다.

• 애플리케이션 컨텍스트에서 꺼내오는 방법
• Environment 빈을 가져오는 방법
• 눈에 잘 안 들어옴

@ConfigurationProperties

• 자바 클래스로 매핑하므로 type-safe
• 각 프로퍼티에 대응하는 meta-data 작성 가능
• Relaxed binding 지원
• 작성 방법
• 기본
• @Configuration 생략
• @Bean 메소드
• @ConstructorBinding

ConfigurationProperties-기본

ConfigurationProperties- @Configuration생략


기본형에서 @Configuration을 생략하면
Main에서 @ConfigurationPropertiesScan을 붙여서 @Component를 스캔하겠다 라고 지정을 해줘야한다.

ConfigurationProperties -@Bean메소드

ConfigurationProperties - @ConstructorBinding


필드주입(setter)를 쓰징낳고 생성자를 만들어서 immutable한 프로퍼티를 구현할 수있다( 추천)

결론

• @ConfigurationProperties 를 이용해서
• 상수처럼, immutable 하고 type-safe 하고 명확한 프로퍼티를 만들어 사용하자

profile
주니어 개발자 되고싶어요

0개의 댓글