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
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
}
group ='hello'
version ='0.0.1-SNAPSHOT'
sourceCompatibility ='17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'//test lombok 사용
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
tasks.named('test') {
useJUnitPlatform()
}
스프링 부트에서 다음 라이브러리를 선택했다.
Lombok
테스트 코드에서 lombok을 사용할 수 있도록 설정을 추가했다.
실행
ExternalReadApplication.main()을 실행해서 해당 메인 메서드가 실행되고, 정상 종료되면 성공이다.
외부 설정 사용 - Environment
다음과 같은 외부 설정들은 스프링이 제공하는 Environment를 통해서 일관된 방식으로 조회할 수 있다.
외부 설정
설정 데이터(application.properties)
OS 환경변수
자바 시스템 속성
커맨드 라인 옵션 인수
다양한 외부 설정 읽기
스프링은 Environment는 물론이고 Environment를 활용해서 더 편리하게 외부 설정을 읽는 방법들을 제공한다.
스프링이 지원하는 다양한 외부 설정 조회 방법
Environment
@Value - 값 주입
@ConfigurationProperties - 타입 안전한 설정 속성
이번 시간에는 조금 복잡한 예제를 가지고 외부 설정을 읽어서 활용하는 다양한 방법들을 학습해보자.
예제에서는 가상의 데이터소스를 하나 만들고, 여기에 필요한 속성들을 외부 설정값으로 채운 다음 스프링 빈으로 등록할 것이다. 이 예제는 외부 설정값을 어떤식으로 활용하는지 이해를 돕기 위해 만들었고, 실제 DB에 접근하지는 않는다.
예제에서는 @Import로 설정 정보를 계속 변경할 예정이므로, 설정 정보를 바꾸면서 사용하기 위해 hello.config의 위치를 피해서 컴포넌트 스캔 위치를 설정했다.
scanBasePackages 설정을 하지 않으면 현재 위치인 hello 패키지부터 그 하위가 모두 컴포넌트 스캔이 된다. 따라서 @Configuration을 포함하고 있는 MyDataSourceEnvConfig이 항상 컴포넌트 스캔의 대상이 된다.
실행 결과
정리
application.properties에 필요한 외부 설정을 추가하고, Environment를 통해서 해당 값들을 읽어서, MyDataSource를 만들었다. 향후 외부 설정 방식이 달라져도, 예를 들어서 설정 데이터 (application.properties)를 사용하다가 커맨드 라인 옵션 인수나 자바 시스템 속성으로 변경해도 애플리케이션 코드를 그대로 유지할 수 있다.
단점
이 방식의 단점은 Environment 를 직접 주입받고, env.getProperty(key)를 통해서 값을 꺼내는 과정을 반복해야 한다는 점이다. 스프링은 @Value를 통해서 외부 설정값을 주입 받는 더욱 편리한 기능을 제공한다.
application.properties에 필요한 외부 설정을 추가하고, @Value 를 통해서 해당 값들을 읽어서, MyDataSource를 만들었다.
단점
@Value를 사용하는 방식도 좋지만, @Value로 하나하나 외부 설정 정보의 키 값을 입력받고, 주입 받아와야 하는 부분이 번거롭다. 그리고 설정 데이터를 보면 하나하나 분리되어 있는 것이 아니라 정보의 묶음으로 되어 있다. 여기서는 my.datasource 부분으로 묶여있다. 이런 부분을 객체로 변환해서 사용할 수 있다면 더 편리하고 더 좋을 것이다.
스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공한다. 이것을 타입 안전한 설정 속성이라 한다. 객체를 사용하면 타입을 사용할 수 있다. 따라서 실수로 잘못된 타입이 들어오는 문제도 방지할 수 있고, 객체를 통해서 활용할 수 있는 부분들이 많아진다. 쉽게 이야기해서 외부 설정을 자바 코드로 관리할 수 있는 것이다. 그리고 설정 정보 그 자체도 타입을 가지게 된다.
ConfigurationProperties를 사용하면 타입 안전한 설정 속성을 사용할 수 있다. maxConnection=abc로 입력하고 실행해보자.
실행 결과
실행 결과를 보면 숫자가 들어와야 하는데 문자가 들어와서 오류가 발생한 것을 확인할 수 있다. 타입이 다르면 오류가 발생하는 것이다. 실수로 숫자를 입력하는 곳에 문자를 입력하는 문제를 방지해준다. 그래서 타입 안전한 설정 속성이라고 한다. ConfigurationProperties로 만든 외부 데이터는 타입에 대해서 믿고 사용할 수 있다.
정리
maxConnection은 표기법이 서로 다르다. 스프링은 캐밥 표기법을 자바 낙타 표기법으로 중간에서 자동
으로 변환해준다.
application.properties에서는 max-connection
자바 코드에서는 maxConnection
@ConfigurationPropertiesScan
@ConfigurationProperties를 하나하나 직접 등록할 때는 @EnableConfigurationProperties
를 사용한다.
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.
-
build.gradle 확인plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } group = 'hello' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { useJUnitPlatform() }Lombok실행
ExternalReadApplication.main()을 실행해서 해당 메인 메서드가 실행되고, 정상 종료되면 성공이다.외부 설정 사용 - Environment
다음과 같은 외부 설정들은 스프링이 제공하는
Environment를 통해서 일관된 방식으로 조회할 수 있다.외부 설정
application.properties)다양한 외부 설정 읽기
스프링은
Environment는 물론이고Environment를 활용해서 더 편리하게 외부 설정을 읽는 방법들을 제공한다.스프링이 지원하는 다양한 외부 설정 조회 방법
Environment@Value- 값 주입@ConfigurationProperties- 타입 안전한 설정 속성이번 시간에는 조금 복잡한 예제를 가지고 외부 설정을 읽어서 활용하는 다양한 방법들을 학습해보자.
예제에서는 가상의 데이터소스를 하나 만들고, 여기에 필요한 속성들을 외부 설정값으로 채운 다음 스프링 빈으로 등록할 것이다. 이 예제는 외부 설정값을 어떤식으로 활용하는지 이해를 돕기 위해 만들었고, 실제 DB에 접근하지는 않는다.
MyDataSource
url,username,password: 접속 url, 이름, 비밀번호maxConnection: 최대 연결 수timeout: 응답 지연시 타임아웃options: 연결시 사용하는 기타 옵션들@PostConstruct에서 확인을 위해 설정된 값을 출력한다appliation.properties)를 사용한다.이제 외부 속성을 읽어서 앞서 만든
MyDataSource에 값을 설정하고 스프링 빈으로 등록해보자.MyDataSourceEnvConfigMyDataSource를 스프링 빈으로 등록하는 자바 설정이다.Environment를 사용하면 외부 설정의 종류와 관계없이 코드 안에서 일관성 있게 외부 설정을 조회할 수 있다.Environment.getProperty(key, Type)를 호출할 때 타입 정보를 주면 해당 타입으로 변환해준다. (스프링 내부 변환기가 작동한다.)env.getProperty("my.datasource.etc.max-connection", Integer.class): 문자 ⇒ 숫자로 변환env.getProperty("my.datasource.etc.timeout", Duration.class): 문자 ⇒ Duration(기간) 변환env.getProperty("my.datasource.etc.options", List.class): 문자 ⇒ List 변환 (A,B⇒[A,B])스프링은 다양한 타입들에 대해서 기본 변환 기능을 제공한다.
ExternalReadApplication- 수정@Import(MyDataSourceEnvConfig.class)를 추가했다.@SpringBootApplication(scanBasePackages = "hello.datasource")@Import로 설정 정보를 계속 변경할 예정이므로, 설정 정보를 바꾸면서 사용하기 위해hello.config의 위치를 피해서 컴포넌트 스캔 위치를 설정했다.scanBasePackages설정을 하지 않으면 현재 위치인hello패키지부터 그 하위가 모두 컴포넌트 스캔이 된다. 따라서@Configuration을 포함하고 있는MyDataSourceEnvConfig이 항상 컴포넌트 스캔의 대상이 된다.실행 결과
정리
application.properties에 필요한 외부 설정을 추가하고,Environment를 통해서 해당 값들을 읽어서,MyDataSource를 만들었다. 향후 외부 설정 방식이 달라져도, 예를 들어서 설정 데이터 (application.properties)를 사용하다가 커맨드 라인 옵션 인수나 자바 시스템 속성으로 변경해도 애플리케이션 코드를 그대로 유지할 수 있다.단점
이 방식의 단점은
Environment를 직접 주입받고,env.getProperty(key)를 통해서 값을 꺼내는 과정을 반복해야 한다는 점이다. 스프링은@Value를 통해서 외부 설정값을 주입 받는 더욱 편리한 기능을 제공한다.외부설정 사용 - @value
@Value를 사용하면 외부 설정값을 편리하게 주입받을 수 있다.참고로
@Value도 내부에서는Environment를 사용한다.MyDataSourceValueConfig
@Value에${}를 사용해서 외부 설정의 키 값을 주면 원하는 값을 주입 받을 수 있다.@Value는 필드에 사용할 수도 있고, 파라미터에 사용할 수도 있다.myDataSource1()은 필드에 주입 받은 설정값을 사용한다.myDataSource2()는 파라미터를 통해서 설정 값을 주입 받는다.기본값
만약 키를 찾지 못할 경우 코드에서 기본값을 사용하려면 다음과 같이
:뒤에 기본값을 적어주면 된다.@Value("${my.datasource.etc.max-connection:1}"):key가 없는 경우1을 사용한다.ExternalReadApplication- 수정실행 결과
스프링 빈을 2개 등록해서 같은 실행 결과가 두 번 나온다.
정리
application.properties에 필요한 외부 설정을 추가하고,@Value를 통해서 해당 값들을 읽어서,MyDataSource를 만들었다.단점
@Value를 사용하는 방식도 좋지만,@Value로 하나하나 외부 설정 정보의 키 값을 입력받고, 주입 받아와야 하는 부분이 번거롭다. 그리고 설정 데이터를 보면 하나하나 분리되어 있는 것이 아니라 정보의 묶음으로 되어 있다. 여기서는my.datasource부분으로 묶여있다. 이런 부분을 객체로 변환해서 사용할 수 있다면 더 편리하고 더 좋을 것이다.외부설정 사용 - @ConfigurationProperties 시작
Type-safe Configuration Properties
스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공한다. 이것을 타입 안전한 설정 속성이라 한다. 객체를 사용하면 타입을 사용할 수 있다. 따라서 실수로 잘못된 타입이 들어오는 문제도 방지할 수 있고, 객체를 통해서 활용할 수 있는 부분들이 많아진다. 쉽게 이야기해서 외부 설정을 자바 코드로 관리할 수 있는 것이다. 그리고 설정 정보 그 자체도 타입을 가지게 된다.
MyDataSourcePropertiesV1
@ConfigurationProperties이 있으면 외부 설정을 주입 받는 객체라는 뜻이다. 여기에 외부 설정KEY의 묶음 시작점인my.datasource를 적어준다.Getter,Setter가 필요하다. (롬복의 @DaTa에 의해 자동 생성된다.)설정 속성을 실제 어떻게 사용하는지 확인해보자.
MyDataSourceConfigV1
ExternalReadApplication - 수정
@Import(MyDataSourceValueConfig.class)를 주석처리 한다.@Import(MyDataSourceConfigV1.class)를 추가 한다.실행 결과
타입 안전
ConfigurationProperties를 사용하면 타입 안전한 설정 속성을 사용할 수 있다.maxConnection=abc로 입력하고 실행해보자.실행 결과
실행 결과를 보면 숫자가 들어와야 하는데 문자가 들어와서 오류가 발생한 것을 확인할 수 있다. 타입이 다르면 오류가 발생하는 것이다. 실수로 숫자를 입력하는 곳에 문자를 입력하는 문제를 방지해준다. 그래서 타입 안전한 설정 속성이라고 한다.
ConfigurationProperties로 만든 외부 데이터는 타입에 대해서 믿고 사용할 수 있다.정리
으로 변환해준다.
@ConfigurationPropertiesScan
@ConfigurationProperties를 하나하나 직접 등록할 때는@EnableConfigurationProperties를 사용한다.
@EnableConfigurationProperties(MyDataSourcePropertiesV1.class)@ConfigurationProperties를 특정 범위로 자동 등록할 때는@ConfigurationPropertiesScan을 사용하면 된다.Beta Was this translation helpful? Give feedback.
All reactions