본문 바로가기
Develop/Spring˙Spring Boot

[Spring Boot] 구성을 사용자화하기

by 독서왕뼝아리 2023. 2. 3.
다루는 내용
- 자동 구성된 빈을 오버라이드 하는 방법
- 외부 프로퍼티를 이용하여 구성하는 방법

 

스프링 부트 자동 구성 오버라이드 하기

스프링 부트가 미리 구성한 빈을 명시적으로 오버라이드 하는 방법과 프로퍼티를 세밀하게 구성하는 방법을 알아본다. 대체로 자동 구성된 빈은 원하는 것을 정확하게 제공하므로 오버라이드할 필요가 없다. 하지만 자동 구성으로 원하는 기능이 잘 작동하지 않을 때도 있다. 예를 들어 보안 같은 경우 한 번에 완성할 수 없고 상세한 보안 요구 사항을 오버라이드해야 한다. 대표적으로 spring security 가 있다. 다양한 자동 구성을 커스텀하여 사용할 수 있다.

package readinglist;

import ... // 생략

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private ReaderRepository readerRepository;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
            .antMatchers("/").access("hasRole('READER')")
            .antMatchers("/**").permitAll()

         .and()

          .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error=true");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(new UserDetailsService() {
            @Override
            public UserDetails loadUserByUsername(String username)
                    throws UsernameNotFoundException {
                return readerRepository.findOne(username);
            }
        });
    }

}

 

 

프로퍼티를 이용하여 외부적으로 구성하기

서버 포트 번호나 로그 레벨처럼 부수적인 것을 수정하려고 자동 구성을 포기하는 것은 비효율적이다. 데이터베이스 URL을 설정할 대 DataSource 빈을 선언하는 것보다는 프로퍼티를 설정하는 편이 간단하다. 환경 변수나 자바 시스템 프로퍼티, JNDI, 명령줄 인자 등 300개가 넘는 프로퍼티를 이용한다. 

java -jar build/libs/readinglist-0.0.1-SHAPSHOT.jar --spring.main.show-banner=false

 

또 다른 방법으로 application.properties 파일을 이용해 생성하는 것이다. YAML을 선호한다면 application.yml 파일을 생성해도 된다. (현재 버전에선 show-banner 프로퍼티는 deprecated 되었다.)

# yaml 파일
spring:
    main:
        show-banner: false

 

프로퍼티 파일은 어디에나 배치할 수 있지만 다음과 같은 우선순위를 가진다. 우선순위가 낮은 파일이 우선순위 높은 파일 설정을 오버라이드한다. 또 .properties > .yml > 환경변수 > 커맨드 옵션 순으로 우선순위가 적용된다.

 

(LOW)

1. 외부적으로 애플리케이션이 작동하는 디렉터리의 /config 하위 디렉터리

2. 외부적으로 애플리케이션이 작동하는 디렉터리

3. 내부적으로 config 패키지

4. 내부적으로 클래스패스의 루트

(HIGH)

 

애플리케이션을 환경이 다른 런타임에 배포할 때 몇몇 세부 설정이 다르다. 스프링 3.1에서 프로필 기반 구성을 지원했다. 프로파일은 다른 빈이나 구성 클래스를 런타임에 활성화된 프로파일 기반으로 사용하거나 무시하는 조건부 구성 타입이다. Config 클래스에 @Profile 애너테이션을 붙여 사용할 수 있다.

 

// SecurityConfig.java
@Profile("production")
@Configuration
@EnableWebSecurity
public class SecurityConfig extnds WebSecurityConfigurerAdapter {
	...
}

 

아래와 같이 application.yml 내에서 설정을 하거나

# application.yml
spring:
    profiles:
        active: production

application-{profile}.yml profile에 해당하는 프로파일을 생성하면 자동으로 활성화 된다.

logging:
    level:
        root: INFO
        
---

spring:
	profiles: development
logging:
    level:
        root: DEBUG

---

spring:
	profiles: production
logging:
    level:
        root: WARN

하이픈 세 개로 분리하여 하나의 프로파일에서 여러 프로파일을 구성할 수 있다.

 

 

 

길벗 깃허브 : https://github.com/gilbutITbook/006859/tree/master/ch03/readinglist