본문 바로가기
개인공부/실전 스프링 부트 (Spring-Boot-In-Practice)

2장 스프링 부트 공통 작업

by 응가1414 2024. 3. 19.

2장 스프링 부트 공통 작업

2장에서 다루는 내용

  • 스프링 부트 애플리케이션 설정 관리
  • @ConfigurationProperties를 사용한 커스텀 설정 정보 생성
  • CommandLineRunner 인터페이스를 사용한 초기화 코드 실행
  • 스프링 부트 기본 로깅과 Log4j2 로깅 설정
  • 빈 밸리데이션을 사용한 사용자 입력 데이터 검증

  • 애플리 케이션 설정 관리, 커스텀 설정 정보 생성 같은 핵심 개념을 배운다.
  • 또한 스프링 부트 개발 과정에서 만나게 되는 다양한 고통 작업 처리 방법을 알아본다.

2.1 애플리케이션 설정 관리

  • 애플리케이션 설정 정보 관리는 중요하게 다뤄지는 요소이다.
  • 개발 프로젝트를 진행하는 방식에 따라 동일한 애플리케이션을 개발dev, 테스트test, 스테이징staging, 상용prod 환경 등 여러 환경에 배포해야 하는 경우도 있다.
  • 스프링 부트는 프로퍼티 파일, YAML 파일, 환경 변수, 명령행 인자등

2.1.1 SpringApplication 클래스 사용 / Property 지정 방법

  • 스프링 부트의 SpringApplication 클래스를 사용해서 애플리케이션 설정 정보를 정의할 수 있다.
  • 이클래스에는 java.util.Properties 또는 java.util.Map<String, Object>를 인자로 받는 setDefaultProperties() 메서드가 있는데
  • 설정 정보를 Properties나 Map<String, Object>에 넣어서 이 메서드를 호출하면 설정 정보가 애플리케이션에 적용된다.
  • 이 방식은 소스 코드로 정의하는 방식이므로 한번에 정의 하면 나중에 바뀌지 않는 경우에 적합하다.
  • application.properties 파일에서는 설정 정보를 포함하고 있는 다른 properties 파일이나. .yml 파일을 spring.config.import 프로퍼티를 통해 임포트 해서 사용할 수 있다.
  • application.properties 파일 안에 spring.config.import=classpath:additional-application.properties를 추가하면
  • 스프링 부트는 additional-application.properties 파일에 있는 설정 정보를 읽어서 사용할 수 있다.
  • 만약 additional-application.properties 파일이 클래스패스에 존재하지 않으면 스프링 부트는 ConfigDataLocationNotFoundException예외를 던진다.
  • 상황에 따라. 설정 파일이 없을 때 예외를 던지고 애플리 케이션 시동 작업을 종료하는 대신에
  • 해당 파일을 무시하고 애플리케이션 시동 작업을 계속 진행하게 만들어야 할 때도 있다.
  • 이럴 때는 spring.config.on-not-fountignore를 지정하면 된다.

예제 2.1 Spring Application 클래스의 setDefaultPropertes() 메서드 사용

@SpringBootApplication
public class SpringBootAppDemoApplication {

    public static void main(String[] args) {

        Properties properties = new Properties();
        // p48 특정 에러를 무시하는 방법
        // 파일이 없는 경우의 에러를 무시하는 방법
        properties.setProperty("spring.config.on-not-found", "ignore");

        SpringApplication application = new SpringApplication(SpringBootAppDemoApplication.class);
        application.setDefaultProperties(properties);
        application.run(args);
    }
}

application.properties 파일

# application.properties 파일에서는 설정 정보를 포함하는 고있는 다른 properties 파일이다 .yml파일을 임포트 하는 방법이다.
spring.config.import=classpath:additional-application.properties 

additional-application.properties 파일

management.endpoints.web.exposure.include=env

2.1.2 @PropertySource 사용

  • 프로퍼티 파일의 위치를 @PropertySource 에너테이션을 사용해서 지정할 수도 있다. 예제 2.2를 보면

예제 2.2 @PropertySource를 사용해서 프로퍼티 파일 위치 지정

package com.manning.sbip.ch02;

//`@Configuration`이 붙어 있는 스프링 환경 설정 클래스인 `DbConfiguration`에 `@PropertySource`에너테이션이 지정돼 있다.
//`src/main/resources` 디렉터리에 있는 파일은 실행 가능한 `JAR`로 패키징된 후 클래스 패스에 위치하게 되므로 이 디렉터리에 `dbConfig.properties` 파일을 작성한다.
@Configuration
// Properties 파일의 위치를 @PropertySource 에너테이션을 사용해서 지정
@PropertySource("classpath:dbConfig.properties")
public class DbConfiguration {

    // 스프링이 제공하는 `Environment` 인스턴스를 주입받으면 `dbConfig.properties` 파일에 지정된 설정 정보를 읽을 수 있다.
    @Autowired
    private Environment env;

    @Override
    public String toString() {
        // Environment env 을 이용해 값을 얻는다.
        return "User: "+env.getProperty("user") +", Password: "+env.getProperty("password");
    }

}
  • @Configuration이 붙어 있는 스프링 환경 설정 클래스인 DbConfiguration@PropertySource에너테이션이 지정돼 있다.
  • src/main/resources 디렉터리에 있는 파일은 실행 가능한 JAR로 패키징된 후 클래스 패스에 위치하게 되므로 이 디렉터리에 dbConfig.properties 파일을 작성한다.

예제 2.3 dbConfig.properties 파일

user=sa
password=p@sswOrd
  • 스프링이 제공하는 Environment 인스턴스를 주입받으면 dbConfig.properties 파일에 지정된 설정 정보를 읽을 수 있다.

예제 2.4 DbConfiguration 인스턴스 설정 정보 접근

package com.manning.sbip.ch02;

@SpringBootApplication
public class SpringBootAppDemoApplication {

    private static final Logger log = LoggerFactory.getLogger(SpringBootAppDemoApplication.class);

    public static void main(String[] args) {

        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringBootAppDemoApplication.class, args);
        // @PropertySource을 이용한 DbConfiguration의 클래스
        DbConfiguration dbConfiguration = applicationContext.getBean(DbConfiguration.class);
        log.info(dbConfiguration.toString());
    }
}