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
여기서는 별도의 프로필은 사용하지 않았다. 환경에 따라서 다른 설정값이 필요하다면 각 환경에 맞는 프로
필을 적용하면 된다.
참고 - properties 케밥 표기법
properties 는 자바의 낙타 표기법( maxConnection )이 아니라 소문자와 - (dash)를 사용하는 캐밥 표기법( max-connection )을 주로 사용한다. 참고로 이곳에 자바의 낙타 표기법을 사용한다고 해서 문제가 되는 것은 아니다. 스프링은 properties 에 캐밥 표기법을 권장한다.
이제 외부 속성을 읽어서 앞서 만든 MyDataSource에 값을 설정하고 스프링 빈으로 등록해보자.
예제에서는 @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 부분으로 묶여있다. 이런 부분을 객체로 변환해서 사용할 수 있다면 더 편리하고 더 좋을 것이다.
Type-safe Configuration Properties
스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공한다. 이것을 타입 안전한 설정 속성이라 한다.
객체를 사용하면 타입을 사용할 수 있다. 따라서 실수로 잘못된 타입이 들어오는 문제도 방지할 수 있고, 객체를 통해서활용할 수 있는 부분들이 많아진다. 쉽게 이야기해서 외부 설정을 자바 코드로 관리할 수 있는 것이다. 그리고 설정 정보 그 자체도 타입을 가지게 된다.
실행 결과를 보면 숫자가 들어와야 하는데 문자가 들어와서 오류가 발생한 것을 확인할 수 있다. 타입이 다르면 오류가발생하는 것이다. 실수로 숫자를 입력하는 곳에 문자를 입력하는 문제를 방지해준다. 그래서 타입 안전한 설정 속성이라고 한다. ConfigurationProperties 로 만든 외부 데이터는 타입에 대해서 믿고 사용할 수 있다.
정리
application.properties 에 필요한 외부 설정을 추가하고, @ConfigurationProperties 를 통해서MyDataSourcePropertiesV1 에 외부 설정의 값들을 설정했다. 그리고 해당 값들을 읽어서 MyDataSource 를 만들었다.
표기법 변환
maxConnection 은 표기법이 서로 다르다. 스프링은 캐밥 표기법을 자바 낙타 표기법으로 중간에서 자동으로 변환해준다.
문제
MyDataSourcePropertiesV1 은 스프링 빈으로 등록된다. 그런데 Setter 를 가지고 있기 때문에 누군가 실수로
값을 변경하는 문제가 발생할 수 있다. 여기에 있는 값들은 외부 설정값을 사용해서 초기에만 설정되고, 이후에는 변경하면 안된다. 이럴 때 Setter 를 제거하고 대신에 생성자를 사용하면 중간에 데이터를 변경하는 실수를 근본적으로 방지할 수 있다.
이런 문제가 없을 것 같지만, 한번 발생하면 정말 잡기 어려운 버그가 만들어진다.
대부분의 개발자가 MyDataSourcePropertiesV1 의 값은 변경하면 안된다고 인지하고 있지만, 어떤 개발자가 자
신의 문제를 해결하기 위해 setter 를 통해서 값을 변경하게 되면, 애플리케이션 전체에 심각한 버그를 유발할 수 있
다. 좋은 프로그램은 제약이 있는 프로그램이다.
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.
-
외부 설정 사용 - Environment
다음과 같은 외부 설정들은 스프링이 제공하는 Environment 를 통해서 일관된 방식으로 조회할 수 있다.
외부 설정
다양한 외부 설정 읽기
스프링은 Environment 는 물론이고 Environment 를 활용해서 더 편리하게 외부 설정을 읽는 방법들을 제공한다.
스프링이 지원하는 다양한 외부 설정 조회 방법
MyDataSource
@PostConstruct에서 확인을 위해 설정된 값을 출력한다.application.properties
필을 적용하면 된다.
참고 - properties 케밥 표기법
이제 외부 속성을 읽어서 앞서 만든 MyDataSource에 값을 설정하고 스프링 빈으로 등록해보자.
MyDataSourceEnvConfig
ExternalReadApplication - 수정
hello.config 의 위치를 피해서 컴포넌트 스캔 위치를 설정했다.
정리
application.properties 에 필요한 외부 설정을 추가하고, Environment 를 통해서 해당 값들을 읽어서, MyDataSource 를 만들었다. 향후 외부 설정 방식이 달라져도, 예를 들어서 설정 데이터(application.properties )를 사용하다가 커맨드 라인 옵션 인수나 자바 시스템 속성으로 변경해도 애플리케이
션 코드를 그대로 유지할 수 있다.
단점
이 방식의 단점은 Environment 를 직접 주입받고, env.getProperty(key) 를 통해서 값을 꺼내는 과정을 반복
해야 한다는 점이다. 스프링은 @value 를 통해서 외부 설정값을 주입 받는 더욱 편리한 기능을 제공한다.
외부설정 사용 - @value
MyDataSourceValueConfig
기본값
ExternalReadApplication - 수정
실행 결과

정리
application.properties 에 필요한 외부 설정을 추가하고, @value 를 통해서 해당 값들을 읽어서,
MyDataSource 를 만들었다.
단점
@value 를 사용하는 방식도 좋지만, @value 로 하나하나 외부 설정 정보의 키 값을 입력받고, 주입 받아와야 하는 부분이 번거롭다. 그리고 설정 데이터를 보면 하나하나 분리되어 있는 것이 아니라 정보의 묶음으로 되어 있다. 여기서는 my.datasource 부분으로 묶여있다. 이런 부분을 객체로 변환해서 사용할 수 있다면 더 편리하고 더 좋을 것이다.
외부설정 사용 - @ConfigurationProperties 시작
Type-safe Configuration Properties
스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공한다. 이것을 타입 안전한 설정 속성이라 한다.
객체를 사용하면 타입을 사용할 수 있다. 따라서 실수로 잘못된 타입이 들어오는 문제도 방지할 수 있고, 객체를 통해서활용할 수 있는 부분들이 많아진다. 쉽게 이야기해서 외부 설정을 자바 코드로 관리할 수 있는 것이다. 그리고 설정 정보 그 자체도 타입을 가지게 된다.
MyDataSourcePropertiesV1
MyDataSourceConfigV1
ExternalReadApplication - 수정
정리
표기법 변환
@ConfigurationPropertiesScan
@ConfigurationPropertiesScan 예시
빈을 직접 등록하는 것과 컴포넌트 스캔을 사용하는 차이와 비슷하다.
문제
MyDataSourcePropertiesV1 은 스프링 빈으로 등록된다. 그런데 Setter 를 가지고 있기 때문에 누군가 실수로
값을 변경하는 문제가 발생할 수 있다. 여기에 있는 값들은 외부 설정값을 사용해서 초기에만 설정되고, 이후에는 변경하면 안된다. 이럴 때 Setter 를 제거하고 대신에 생성자를 사용하면 중간에 데이터를 변경하는 실수를 근본적으로 방지할 수 있다.
이런 문제가 없을 것 같지만, 한번 발생하면 정말 잡기 어려운 버그가 만들어진다.
대부분의 개발자가 MyDataSourcePropertiesV1 의 값은 변경하면 안된다고 인지하고 있지만, 어떤 개발자가 자
신의 문제를 해결하기 위해 setter 를 통해서 값을 변경하게 되면, 애플리케이션 전체에 심각한 버그를 유발할 수 있
다. 좋은 프로그램은 제약이 있는 프로그램이다.
Beta Was this translation helpful? Give feedback.
All reactions