🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃
Environment
- ApplicationContext는 Environment 객체를 통해 애플리케이션의 환경 정보를 관리
- Environment는 애플리케이션의 설정 정보를 제공하고, 프로퍼티(속성) 값을 읽어올 수 있음
public class MyApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Environment environment = context.getEnvironment();
String databaseUrl = environment.getProperty("database.url");
String databaseUsername = environment.getProperty("database.username");
String databasePassword = environment.getProperty("database.password");
System.out.println("Database URL: " + databaseUrl);
System.out.println("Database Username: " + databaseUsername);
System.out.println("Database Password: " + databasePassword);
}
}
@Configuration
class AppConfig {
}
properties
database.url=jdbc:mysql://localhost:3306/mydb
database.username=admin
database.password=secret
- 키-값 쌍으로 구성된 간단한 설정 파일 형식
- .properties 확장자를 가지며, 텍스트 기반으로 작성
- 키와 값은 = 또는 :으로 구분
- 주석은 #으로 표시
- @value를 통해 프로퍼티스에 작성한 내용을 필드에서 사용
- :default 를 통해 값이 없을 경우 키 이름을 반환하는 문제 방지
- 파라미터에서도 사용 가능
- @value("${JAVA_HOME}")같이 시스템 환경변수의 값도 가져올 수 있음
yaml
database:
url: jdbc:mysql://localhost:3306/mydb
username: admin
password: secret
- YAML(YAML Ain't Markup Language)은 데이터 직렬화 형식
- .yml 또는 .yaml 확장자를 가지며, 들여쓰기로 구조를 표현
- 키와 값은 콜론(:)으로 구분되고, 배열과 객체를 사용하여 복잡한 데이터 구조를 표현 가능
- 주석은 #으로 표시
- @value를 통해 프로퍼티스에 작성한 내용을 필드에서 사용
- :default 를 통해 값이 없을 경우 키 이름을 반환하는 문제 방지
- 파라미터에서도 사용 가능
- @value("${JAVA_HOME}")같이 시스템 환경변수의 값도 가져올 수 있음
properties, yaml 정보 사용 예시
public class MyApp {
@Value("${database.url:기본URL}")
private String databaseUrl;
@Value("${database.username:기본이름}")
private String databaseUsername;
@Value("${database.password:기본암호}")
private String databasePassword;
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyApp app = context.getBean(MyApp.class);
app.printValues();
}
public void printValues() {
System.out.println("Database URL: " + databaseUrl);
System.out.println("Database Username: " + databaseUsername);
System.out.println("Database Password: " + databasePassword);
}
}
@ConfigurationProperties
- 스프링 프레임워크에서 제공하는 기능으로, 클래스에 속성 값을 바인딩하는 데 사용
- 이를 통해 YAML, Properties 등의 설정 파일의 값을 자동으로 클래스 필드에 매핑할 수 있음
- 설정 파일에서 매핑할 속성의 공통 프리픽스(prefix)를 설정
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "database")
public class DatabaseConfig {
private String url;
private String username;
private String password;
public void printValues() {
System.out.println("Database URL: " + url);
System.out.println("Database Username: " + username);
System.out.println("Database Password: " + password);
}
}
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(MyApp.class, args);
DatabaseConfig databaseConfig = context.getBean(DatabaseConfig.class);
databaseConfig.printValues();
}
}
Profile
- 스프링 프로파일은 애플리케이션의 환경에 따라 구성 요소를 분리하고 선택적으로 로드하기 위해 사용되는 기능
- 특정 프로파일이 활성화되었을 때만 해당 프로파일에 속한 빈들이 로드됨
@Configuration
public class AppConfig {
@Bean
@Profile("dev")
public DataService devDataService() {
return new DevDataService();
}
@Bean
@Profile("prod")
public DataService prodDataService() {
return new ProdDataService();
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("dev");
context.register(AppConfig.class);
context.refresh();
DataService dataService = context.getBean(DataService.class);
dataService.loadData();
}
}
interface DataService {
void loadData();
}
class DevDataService implements DataService {
@Override
public void loadData() {
System.out.println("Loading data from dev environment");
}
}
class ProdDataService implements DataService {
@Override
public void loadData() {
System.out.println("Loading data from prod environment");
}
}
Resource
- 스프링에서 Resource는 클래스 경로, 파일 시스템, URL 등과 같은 다양한 소스로부터 리소스를 읽고 쓰기 위한 인터페이스
- 리소스를 읽고 쓰는 기능을 제공
- 스프링 컨텍스트에서 리소스를 로딩하고 관리할 수 있음
public class ResourceExample {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Resource resource1 = context.getResource("application.yaml");
Resource resource2 = context.getResource("classpath:application.yaml");
Resource resource3 = context.getResource("file:/path");
Resource resource4 = context.getResource("https://stackoverflow.com");
}
}