참고
외부설정 읽기
NOTE
스프링 부트는 외부 설정을 통해 동일한 애플리케이션 코드를 다양한 환경(개발, 테스트, 프로덕션 )에서 사용할 수 있게 해줍니다. 외부 설정들은 스프링이 제공하는 다양한 방식으로 조회가 가능합니다.
스프링부트에서 사용가능한 외부 설정값을 읽는 방법은 다음과 같은 방식으로 이루어집니다.
Environment로 4가지 방식을 공통적으로 사용할 수 있음!
•
@Environment
•
@Value
•
@ConfigurationProperties
Environment
NOTE
스프링은 Environment 인터페이스를 사용하여 설정값을 읽을 수 있습니다.
build:
version: "3.0"
accounts:
message: "계정 메시지"
contactDetails:
name: "이름"
email: "이메일"
onCallSupport:
- (555) 555-1234
- (555) 523-1345
YAML
복사
application.yml
@SpringBootTest
@ContextConfiguration(classes = SpringStudyApplication.class)
public class ConfigTest {
//
private final Environment env;
@Autowired
public ConfigTest(Environment env) {
this.env = env;
}
@Test
void envTest(){
String buildVersion = env.getProperty("build.version");
System.out.println("buildVersion = " + buildVersion);
}
@Test
void envTest2(){
String accounts = env.getProperty("accounts");
String accountsMessage = env.getProperty("accounts.message");
System.out.println("accounts = " + accounts); // null
System.out.println("accountsMessage = " + accountsMessage); // 계정 메시지
}
}
Java
복사
@Value
NOTE
@Value 방식은 개별 설정 값을 간단하게 주입받을 수 있는 방법입니다.
build:
version: "3.0"
accounts:
message: "계정 메시지"
contactDetails:
name: "이름"
email: "이메일"
onCallSupport:
- (555) 555-1234
- (555) 523-1345
YAML
복사
application.yml
@SpringBootTest
@ContextConfiguration(classes = SpringStudyApplication.class)
public class ConfigTest {
@Value("${build.version}")
private String buildVersion;
//@Value("${accounts}")
//private String accounts; // 에러발생(accounts의 내용은 String으로 담지못함)
@Value("${accounts.message}")
private String accountsMessage;
@Test
void valueTest(){
System.out.println("buildVersion = " + buildVersion);
}
@Test
void valueTest2(){
// System.out.println("accounts = " + accounts);
System.out.println("accountsMessage = " + accountsMessage); // 계정 메시지
}
}
Java
복사
Controller
•
@Value로 하나하나 외부 설정의 키 값을 입력받고, 주입받는게 번거롭다.
•
설정데이터가 하나하나 분리되어 있는게 아니라, 정보의 묶음으로 되어있다.
◦
여기서는 my.datasource부분으로 묶여잇다.
◦
이런 부분을 객체로 변환해서 사용하면 더 좋을 것!
@ConfigurationProperties
NOTE
@ConfigurationProperties는 스프링 부트에서 애플리케이션 설정 값을 객체에 바인딩 할 때 사용하며, 타입 안전성을 보장하고 유지보수성을 높여줍니다.
accounts:
message: "계정 메시지"
contactDetails:
name: "이름"
email: "이메일"
onCallSupport:
- (555) 555-1234
- (555) 523-1345
YAML
복사
application.yml
@ConfigurationProperties를 통해 accounts의 설정값을 바인딩하면서 타입이 어긋나는 경우 예외를 발생시킵니다.
@Getter
@RequiredArgsConstructor
@ConfigurationProperties(prefix = "accounts")
public class AccountsProperties {
private final String message;
private final ContactDetails contactDetails;
private final List<String> onCallSupport;
@RequiredArgsConstructor
@Getter
public static class ContactDetails {
private final String name;
private final String email;
}
}
Java
복사
@EnableConfigurationProperties는 스프링 부트에 @ConfigurationProperties로 정의된 클래스를 등록하여 사용할 수 있게 해줍니다. 이를 통해 해당 클래스가 스프링 컨테이너 Bean에 등록되고, 외부 설정값이 해당 클래스의 필드에 바인딩 됩니다.
@SpringBootApplication
@EnableConfigurationProperties(AccountsProperties.class)
public class SpringStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringStudyApplication.class, args);
}
}
Java
복사
@Test
void ConfigurationPropertiesTest(){
System.out.println("Message: " + accountsProperties.getMessage());
System.out.println("Contact Name: " + accountsProperties.getContactDetails().getName());
System.out.println("Contact Email: " + accountsProperties.getContactDetails().getEmail());
System.out.println("On Call Support: " + accountsProperties.getOnCallSupport());
}
Java
복사
실제 코드
@ConfigurationPropertiesScan
NOTE
@ConfigurationPropertiesScan는 @ConfigurationProperties 애노테이션이 붙은 클래스를 자동으로 스캔하여 스프링 컨텍스트에 등록합니다.
@SpringBootApplication
@ConfigurationPropertiesScan // 하위 패키지 검색
public class MyApplication {}
Java
복사
@SpringBootApplication
@ConfigurationPropertiesScan({ "com.example.app", "com.example.another" }) // 특정 패키지 검색
public class MyApplication {}
Java
복사
@ConfigurationProperties 검증
NOTE
자바에서는 자바 빈 검증기(java bean validation)라는 표준 검증기가 제공된다!
implementation 'org.springframework.boot:spring-boot-starter-validation'
Groovy
복사
build.gradle에 추가
accounts:
message: "계정 메시지"
contactDetails:
name: "이름"
email: "이메일"
onCallSupport:
- (555) 555-1234
- (555) 523-1345
YAML
복사
application.yml
@Getter
@ConfigurationProperties(prefix= "accounts")
@Validated
@RequiredArgsConstructor
public class AccountsProperties {
@NotEmpty(message = "메시지를 입력해야 합니다")
private final String message;
@Valid
private final ContactDetails contactDetails;
@NotEmpty(message = "긴급 연락처 목록을 입력해야 합니다")
private final List<@NotEmpty @Size(min = 10, max = 20, message = "전화번호는 10자에서 20자 사이여야 합니다") String> onCallSupport;
@RequiredArgsConstructor
@Getter
public static class ContactDetails {
@NotEmpty(message = "이름을 입력해야 합니다")
private final String name;
@Email(message = "유효한 이메일을 입력해야 합니다")
@NotEmpty(message = "이메일을 입력해야 합니다")
private final String email;
}
}
Java
복사
검증 적용
@SpringBootTest(classes = SpringStudyApplication.class)
public class ConfigTest {
@Autowired
private AccountsProperties accountsProperties;
@Test
void ConfigurationPropertiesTest(){
System.out.println("Message: " + accountsProperties.getMessage());
System.out.println("Contact Name: " + accountsProperties.getContactDetails().getName());
System.out.println("Contact Email: " + accountsProperties.getContactDetails().getEmail());
System.out.println("On Call Support: " + accountsProperties.getOnCallSupport());
}
}
Java
복사
Validation 적용