[6/22 TIL] SPRING(Environment, properties, yaml, Profile, Resource)

yumyeonghan·2023년 6월 23일
0
post-custom-banner

🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃

Environment

  • ApplicationContext는 Environment 객체를 통해 애플리케이션의 환경 정보를 관리
  • Environment는 애플리케이션의 설정 정보를 제공하고, 프로퍼티(속성) 값을 읽어올 수 있음
public class MyApp {
    public static void main(String[] args) {
        // ApplicationContext 생성
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // Environment 객체 가져오기
        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 {
    // @Bean 설정
}

properties

#config.properties
database.url=jdbc:mysql://localhost:3306/mydb
database.username=admin
database.password=secret
  • 키-값 쌍으로 구성된 간단한 설정 파일 형식
  • .properties 확장자를 가지며, 텍스트 기반으로 작성
  • 키와 값은 = 또는 :으로 구분
  • 주석은 #으로 표시
  • @value를 통해 프로퍼티스에 작성한 내용을 필드에서 사용
    • :default 를 통해 값이 없을 경우 키 이름을 반환하는 문제 방지
    • 파라미터에서도 사용 가능
    • @value("${JAVA_HOME}")같이 시스템 환경변수의 값도 가져올 수 있음

yaml

#config.yml
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.getEnvironment().setActiveProfiles("prod"); // 프로파일 변경
        context.register(AppConfig.class); // context에 AppConfig 클래스 등록
        context.refresh(); // 컨테이너 새로고침(초기화)

        DataService dataService = context.getBean(DataService.class);
        dataService.loadData(); // 결과: "Loading data from dev environment" 출력
    }
}

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);
        
        // application.yaml 파일을 가져오는 예시
        Resource resource1 = context.getResource("application.yaml");
        
        // classpath에서 application.yaml 파일을 가져오는 예시
        Resource resource2 = context.getResource("classpath:application.yaml");
        
        // 파일 시스템에서 Working directory 또는 특정 경로의 파일을 가져오는 예시
        Resource resource3 = context.getResource("file:/path");
        
        // URL에서 리소스를 가져오는 예시
        Resource resource4 = context.getResource("https://stackoverflow.com");
	}     
}
profile
웹 개발에 관심 있습니다.
post-custom-banner

0개의 댓글