1. Environment
- 스프링은 설정 파일에 대한 접근을 추상화한
Environment
를 제공한다. ApplicationContext
는EnvironmentCapable
인터페이스를 상속받아Environment
에 접근할 수 있는 방법을 제공한다.applicationContext.getEnvironment()
로Environment
인스턴스를 얻어와environment.getProperty(key)
를 통해서 값을 조회할 수 있다.- Environment는 빈으로 등록되어 있기 때문에 스프링 컨테이너로부터 직접 주입받을 수 있다.
Environment
를 통해 특정 외부 설정에 종속되지 않고, 일관성 있게 key=value 형식의 외부 설정에 접근할 수 있다.@Configuration public class EnvConfig { private final Environment env; public EnvConfig(Environment env) { this.env = env; } }
Environment env = applicationContext.getEnvironment(); env.getProperty(key);
2. Properties
- 스프링은
application.properties
라는 이름의 설정 파일을 통해서 실행 환경에 따라 서로 다른 속성을 읽어들이도록 구성할 수 있다. - 스프링은 다양한 외부 설정을 입력받기 위한 방법을 추상화하여 인터페이스로 제공한다. 개발자가
application.properties
를 자바를 실행하는 위치에 만들어두면 스프링은 해당 파일을 읽어 사용할 수 있는 구현체를 제공한다. - 스프링은 다양한 properties를 미리 정의해두었다. 만일 우리가 새로운 설정 정보를 구성하고자 한다면
key=value
형태로 작성할 수 있다. - 스프링 프레임워크에서
application.properties
를 사용하기 위해서@PropertySource
를 이용해서application.properties
의 위치를 지정해준다.@Configuration @PropertySource(value = "application.properties") public class AppConfig { }
- @PropertySource
- 이후
Environment
인스턴스를 얻어와 외부 설정을 조회할 수 있다. - 스프링 부트는
resource
디렉터리 아래application.properties
파일을 자동으로 로드하기 때문에 추가적인 properties를 등록하고자 할 때 사용하면 된다. - 이러한 설정 파일의 정보를 코드에서 이용하기 위한 다양한 방법이 있다.
- Environment
Environment
를 이용하면 외부의 설정의 종류와 관계 없이 코드 안에서 일관성 있게 외부 설정 조회가 가능하다.env.getProperty(key, type)
을 통해 호출시 타입 정보를 인수로 전달하면 해당 타입으로 변환해준다.@Configuration public class EnvConfig { private final Environment env; public EnvConfig(Environment env) { this.env = env; } @Bean public EnvProvider envProvider() { String version = env.getProperty("version"); String url = env.getProperty("spring.datasource.url"); return new EnvProvider(version, url); } }
@Value
@Value("${key}")
를 통해 외부 설정의 키 값을 주어 원하는 값을 주입 받을 수 있다.- 필드에도 사용가능하고 파라미터에도 사용할 수 있다.
- 만일 존재하지 않는 key 값을 전달하면 해당 key 자체를 문자열로 해당 필드에 주입한다.
@Value("${key:defaultValue}")
와 같이 외부 설정에서 해당하는 키 값을 찾지 못할 경우 :(콜론) 뒤에 기본값을 줄 수 있다.- 해당 어노테이션을 이용하여 환경 변수의 값도 가져올 수 있다. 만일 properties의 key 값과 충돌하는 경우 환경 변수 값을 우선해서 가져온다.
@Configuration public class EnvConfig { @Value("${version}") private String version; @Value("${spring.datasource.url}") private String url; @Bean public EnvProvider envProvider() { return new EnvProvider(version, url); } //또는 @Bean public EnvProvider envProvider( @Value("${version}") String version, @Value("${spring.datasource.url}") String url) { return new EnvProvider(version, url); } }
@ConfigurationProperties
- properties를 사용하는 클래스에서 직접 주입받아 사용할 수도 있다.
- 기본 주입 방식은 자바빈 프로퍼티 방식으로 Getter, Setter가 필요하다. 대신 생성자 주입 방식도 이용할 수 있다.
- 이 방식을 사용하는 경우 자바 빈 밸리데이션을 통해 검증을 수행할 수도 있다.
- 외부 설정을 자바 코드로 관리함으로써 타입 안전한 설정 속성을 가진다.
@ConfigurationProperties("spring.datasource") public class DataProperties { private String url; private String username; private String password; public DataProperties(String url, String username, String password) { this.url = url; this.username = username; this.password = password; } }
@Getter @Settter @ConfigurationProperties("spring.datasource") public class DataProperties { private String url; private String username; private String password; }
3. Profile
- 스프링은 프로파일을 미리 정의해놓고 원하는 프로파일을 선택하여 애플리케이션을 기동할 수 있는 방법을 제공한다.
@Bean
등록 시 프로파일을 지정하거나@Component
로 등록시@Profile
어노테이션을 이용하여 프로파일을 구분할 수 있다.@Configuration public class AppConfig { @Bean @Profile("dev") public DevBean devBean() { return new DevBean(); } @Bean @Profile({"local", "default"}) public LocalBean localBean() { return new LocalBean(); } }
@Repository @Profile("local") public class LocalRepository() { }
- 또한 properties 설정 파일도 프로파일에 따른 구분이 가능하다.
- properties의 경우 #--- 또는 !--- yml의 경우 --- 를 이용하여 각 프로파일의 영역을 구분한다.
- 각 영역은
spring.config.activate.on-profile
에 value를 지정하여 프로파일을 지정할 수 있다. 만일 프로파일을 지정하지 않는다면 기본값으로 사용된다.url=local.com username=local_sa password=local_pw #--- spring.config.activate.on-profile=dev url=dev.com username=dev_sa password=dev_pw
- application.properties
- 스프링 부트를 사용하는 경우 각 프로파일에 따른 실행을 위해서 인텔리제이에서는
Edit Configuration -> Active profiled
로 간단하게 프로필의 변경이 가능하다. - jar 파일로 실행하는 경우
spring.profiles.active=profile
을 인수로 전달하면 원하는 프로파일로 실행이 가능하다.
4. Resource
- 스프링은 이미지, 텍스트 파일, 웹 등을 읽어들이기 위한
Resource
와ResourceLoader
인터페이스를 제공한다. ApplicationContext
가DefaultResourceLoader
를 상속하고 있기 때문에applicationContext
로부터 리소스를 받아올 수 있다.- 리소스를 받아오기 위해서는
applicationContext.getResource(location)
에 파일의 위치를 전달하여야 한다. - 받아온 리소스로부터
resource.getFile()
을 통해 실제 파일 객체를 가져올 수 있다.Resource resource = ac.getResource("file:src/main/resources/text.txt"); File file = resource.getFile();
- 스프링은 원하는 리소스의 경로를 지정할 때 스키마를 전달할 수 있다. 이를 통해 우리는 리소스의 특정 구현체를 알 필요 없이 인터페이스를 통해 가져올 수 있는 일관된 방법을 제공한다.
'공부방' 카테고리의 다른 글
[TIL 06/26] 테스트 (0) | 2023.06.29 |
---|---|
[TIL 06/23] Logging, Logback (0) | 2023.06.23 |
[TIL 06/21] 컴포넌트 스캔, 빈 스코프, 빈 라이프사이클 (0) | 2023.06.21 |
[TIL 06/20] IoC, DI, ApplicationContext (0) | 2023.06.20 |
[TIL 06/19] (0) | 2023.06.19 |