Spring DI, AOP

9. 외부 설정 사용하기 - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 2. 24. 16:26

1. 외부 설정 파일 - application.properties

  • 애플리케이션 속성의 기본 값을 바꿀 수 있는 설정 파일.

@Configuration
@Import({Config1.class, Config2.class})
//@Import(MyImportSelector.class)
//@EnableMyAutoConfiguration("test2")
class MainConfig{ @Bean Car car() {return new Car();} }

class Config1 { @Bean Car sportsCar() {return new SportsCar();} }
class Config2 { @Bean Car sportsCar() {return new SportsCar2();} }
  • 이름이 같은 @Bean sportsCar를 둘다 등록을 하고 
ApplicationContext ac = SpringApplication.run(Main.class, args);
  • 실행을 해주면...

  • 이미 있는 이름이고, 이름을 바꾸거나, setting을 바꿔주라고 나오는데...

  • application.properties에 overriding=true로 해주면...

  • 실행에 하였지만 overriding되어서 SportsCar2가 등록되었다.
  • 설정 등록 방법

  • MyProperties 클래스를 작성
@ConfigurationProperties(prefix="mysite")
public class MyProperties {

    private String domain;

    public String getDomain() {
        return domain;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    private String email;

}
  • Main클래스에 @EnableConfigurationProperties(MyProperties.class)를 붙여준다.
@EnableConfigurationProperties(MyProperties.class)
//@SpringBootApplication    // 은 아래의 3개 애너테이션을 붙인것과 동일
@SpringBootConfiguration    // @Configuration하고 동일
@EnableAutoConfiguration
@ComponentScan
public class Main {

    public static void main(String[] args) {
        ApplicationContext ac = SpringApplication.run(Main.class, args);
//        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class, Config1.class, Config2.class);   // 자바 설정을 이용하는 AC
//        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);   // 자바 설정을 이용하는 AC
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();

        System.out.println("ac = " + ac);

        Arrays.sort(beanDefinitionNames);   // 빈 목록이 담긴 배열을 정렬
        Arrays.stream(beanDefinitionNames)  // 배열을 스트림으로 변환
                .filter(b->!b.startsWith("org"))
                .filter(b -> !b.contains("Main"))
                .forEach(System.out::println);  // 스트림의 요소를 하나씩 꺼내서 출력

//        System.out.println("ac.getBean(\"sportsCar\") = " + ac.getBean("sportsCar"));
        MyProperties prop = ac.getBean(MyProperties.class);	// 수동 빈 검색 주입
        System.out.println("prop.getDomain() = " + prop.getDomain());
        System.out.println("prop.getEmail() = " + prop.getEmail());
    }

    @Bean
    MyBean myBean(){return new MyBean();}
}

  • application.properties에 등록한 domain과 email이 잘 나오는 모습...
@EnableConfigurationProperties(MyProperties.class)
//@SpringBootApplication    // 은 아래의 3개 애너테이션을 붙인것과 동일
@SpringBootConfiguration    // @Configuration하고 동일
@EnableAutoConfiguration
@ComponentScan
public class Main implements CommandLineRunner {

    @Autowired
    MyProperties prop;  // 인스턴스 변수라서 static main에서 쓸 수 없다. 자동 주입

    @Override
    public void run(String... args) throws Exception {
        System.out.println("prop.getDomain() = " + prop.getDomain());
        System.out.println("prop.getEmail() = " + prop.getEmail());
    }

    public static void main(String[] args) {
        ApplicationContext ac = SpringApplication.run(Main.class, args);
//        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class, Config1.class, Config2.class);   // 자바 설정을 이용하는 AC
//        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);   // 자바 설정을 이용하는 AC
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();

        System.out.println("ac = " + ac);

        Arrays.sort(beanDefinitionNames);   // 빈 목록이 담긴 배열을 정렬
        Arrays.stream(beanDefinitionNames)  // 배열을 스트림으로 변환
                .filter(b->!b.startsWith("org"))
                .filter(b -> !b.contains("Main"))
                .forEach(System.out::println);  // 스트림의 요소를 하나씩 꺼내서 출력

//        System.out.println("ac.getBean(\"sportsCar\") = " + ac.getBean("sportsCar"));
//        MyProperties prop = ac.getBean(MyProperties.class);
//        System.out.println("prop.getDomain() = " + prop.getDomain());
//        System.out.println("prop.getEmail() = " + prop.getEmail());
    }

    @Bean
    MyBean myBean(){return new MyBean();}
}
  • CommandLineRunner 인터페이스를 구현해서 인스턴스 변수를 사용
@EnableConfigurationProperties(MyProperties.class)
//@SpringBootApplication    // 은 아래의 3개 애너테이션을 붙인것과 동일
@SpringBootConfiguration    // @Configuration하고 동일
@EnableAutoConfiguration
@ComponentScan
public class Main implements CommandLineRunner {

    @Autowired
    MyProperties prop;  // 인스턴스 변수라서 static main에서 쓸 수 없다.

    @Autowired
    ApplicationContext ac;

    @Override
    public void run(String... args) throws Exception {

        String[] beanDefinitionNames = ac.getBeanDefinitionNames();

        Arrays.sort(beanDefinitionNames);   // 빈 목록이 담긴 배열을 정렬
        Arrays.stream(beanDefinitionNames)  // 배열을 스트림으로 변환
                .filter(b->!b.startsWith("org"))
                .filter(b -> !b.contains("Main"))
                .forEach(System.out::println);  // 스트림의 요소를 하나씩 꺼내서 출력


        System.out.println("prop.getDomain() = " + prop.getDomain());
        System.out.println("prop.getEmail() = " + prop.getEmail());
    }

    public static void main(String[] args) {
        ApplicationContext ac = SpringApplication.run(Main.class, args);
//        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class, Config1.class, Config2.class);   // 자바 설정을 이용하는 AC
//        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);   // 자바 설정을 이용하는 AC


//        System.out.println("ac = " + ac);


//        System.out.println("ac.getBean(\"sportsCar\") = " + ac.getBean("sportsCar"));
//        MyProperties prop = ac.getBean(MyProperties.class);
//        System.out.println("prop.getDomain() = " + prop.getDomain());
//        System.out.println("prop.getEmail() = " + prop.getEmail());
    }

    @Bean
    MyBean myBean(){return new MyBean();}
}
  • run 메서드에서 실행이 가능하다
  • 사용자 정의 속성 추가하기 - @ConfigurationProperties