You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
섹션 8. 외부 설정과 프로필 2
외부 설정 사용 - Environment
스프링은 Environemnt는 물론이고 Environment를 활용해서 더 편리하게 외부 설정을 읽는 방법을 제공함
스프링이 지원하는 외부 설정 조회 방법은 다음과 같음
위의 설정값에 대한 application.properties
properties 캐밥 표기법
properties는 자바의 낙타 표기법이 아니라 소문자와 -(dash)를 사용하는 케밥 표기법을 주로 사용함
Environment를 사용하면 외부 설정의 종류와 관계없이 코드 안에서 일관성 있게 외부 설정을 조회할 수 있음
Environment.getProperty(key, Type)를 호출할때 타입 정보를 주면 해당 타입으로 변환해줌(스프링 내부 변환기)
getProperty를 호출할때 타입 정보를 주면 해당 타입으로 스프링 내부 변환기를 통해 변환해줌
설정 정보를 빈으로 등록하기 위해서
@Import(MyDataSourceEnvConfig.class)를 추가함@SpringBootApplication(scanBasePackage = "hello.datasource")
@import를 통해서 설정 정보를 계속 변경하기에 config 위치를 피해서 컴포넌트 스캔 위치를 설정함
scanBasePackages를 설정하지 않으면 hello 패키지 하위가 모두 컴포넌트 대상이 됨
따라서 @configuration을 포함하고 있는 MyDataSourceEnvConfig이 항상 컴포넌트 스캔의 대상이 됨
외부 설정 사용 - @value
application.properties파일에 configuration properties를 정의하며, 해당 설정 값들은 스프링 어플리에키션의 DB 커넥션 및 로그 설정 및 기타 custom configuration에 필요한 값들을 정의해서 사용한다.어플리케이션 내에서 application.properties파일의 값에 접근하기 위해서는
@Value어노테이션을 사용하거나 스프링이 제공하는Environment객체를 사용할 수 있다.@value 사용 예시
Value 어노테이션은 property 값을 주입해서 사용하게 된다.
Environment 객체 사용 예시
Environment객체는 컴포넌트 클래스 내에서 Autowired되어 값을 가진다. 해당 필드의 getter를 통해서 application.properties값을 가져온다.
외부설정 사용 - @ConfigurationProperties
Type-safe Configuration Properties
스프링은 외부 설정의 묶음 정보를 개체로 변환하는 기능을 제공함.
객체를 사용해서 타입을 사용하고, 잘못된 타입이 들어오는 문제를 방지함
외부 설정을 주입 받을 객체를 생성함. 각 필드들 외부 설정의 키 값에 맞추어 설정함
@ConfiguartionProperties가 있으면 외부 설정을 주입 받는 개체임을 뜻함.
외부 설정 Key의 묶음 시발점인 my.datasource으로 명시함
기본 주입 방식은 자바 빈 프로퍼티 방식이며, Getter/Setter를 필요로 함
@EnableConfigurationProperties(MyDataSourceProperties.class)스프링에 적용할 @ConfigurationProperties를 지정해줘야함. 이를 통해 해당 클래스는 스프링 빈으로 등록되고, 필요한 곳에서 주입받아 사용함
@ConfigurationPropertiesScan
위의 방식에서는 Properties와 Enable 어노테이션을 각각 선언해줘야했다. @ConfigurationProperties를 특정 범위로 자동 등록할때는 @ConfigurationPropertiesScan을 사용한다
문제!
MyDataSourceProperties는 스프링 빈으로 등록되는데, setter를 가지고 있어서 값이 변경될 가능성이 열려있다. 따라서 생성자를 통해 최초로 생성되는 초기에만 설정되고 이후에는 변경이 되지않도록 막는다.
외부설정 사용 - @ConfigurationProperties 생성자
@ConfigurationProperties는 getter/setter 외에 생성자를 통한 객체 생성 방식도 지원함
@DefaultValue는 해당 값을 찾을 수 없는 경우 기본값을 사용함
@DefaultValue Etc etcetc를 찾을 수 없는 경우, Etc 객체를 생성하고 내부에 들어가는 값은 비워둔다.
@DefaultValue(”DEFAULT”) List<String> optionsoptions를 찾을 수 없는 경우, DEFAULT라는 기본 값을 사용함
💡스프링 3.0 이전의 @ConstructorBinding
스프링 3.0 이전에는 생성자 바인딩 시 @ConstructorBinding 애노테이션이 필수였음
3.0 이후에는 생성자가 1개일때는 생략 가능
외부설정 사용 - @ConfigurationProperties 검증
@ConfigurationProperties를 통해서 숫자가 들어가야 하는 부분에 문자가 입력되는 경우 타입이 맞지 않는 데이터를 입력하는 문제를 예방할 수 있었다. 그러나 숫자의 범위나 문자의 길이는 검증이 어렵다
자바에는 빈 검증기(java bean validation)이라는 표준 검증기가 제공됨
@ConfigurationProperties는 자바 객체이기에 스프링이 빈 검증기를 사용하도록 지원함
→ spring-boot-starter-validation 의존성이 필요함
jakarta.validation.constraints.Max
패키지 이름에 jakarta.validation으로 시작하는 것은 자바 표준 검증기에서 지원하는 기능임.
org.hibernate.validator.constraints.time.DurationMax
패키지 이름에 org.hibernate.validator로 시작하는 것은 자바 표준 검증기에서 아직 표준화된 기능이 아니며, 하이버네이트 검증기라는 표준 검증기 구현체에서 직접 제공하는 기능임. 대부분 하이버네이트 검증기를 사용함으로 이 부분이 크게 문제가 되진 않음
YAML
[application.properties](http://application.properties) 뿐 만 아니라 application.yml을 지원함
YAML(YAML Ain’t Markup Language)은 사람이 읽기 좋은 데이터 구조를 목표로 함.
확장자는 yaml, yml이며 주로 yml을 사용함
YAML의 가장 큰 특징은 가독성이다. space(공백)으로 계층 구조를 만들고, 보통 2칸의 공백을 사용함.
구분자로 : 를 사용함
yml은 ---(dash 3개)를 통해 논리 파일을 구분함
spring.config.active.on-profile 을 사용해서 프로필을 적용할 수 있음
주의 사항
application.properties와 application.yml을 동시에 사용하면 application.properties가 우선권을 가짐.
@Profile
프로필과 외부 설정을 사용해서 각 환경마다 설정값을 다르게 적용해보았다.
설정값이 다른 정도가 아니라 아예 다른 빈을 등록해야한다면?
프로필이 없으면 default 프로필이 사용됨
default 프로필이면 LocalPayClient가 빈으로 등록되며,
prod 프로필인 경우, ProdPayClient가 빈으로 등록됨
@Profile은 특정 조건에 따라서 해당 빈을 등록할지 선택한다. 내부적으로
@Conditional(ProfileCondition.class)를 사용한다.Beta Was this translation helpful? Give feedback.
All reactions