개발강의정리/Spring

[스프링 부트 개념과 활용] 3-4. 자동 설정 만들기

nineDeveloper 2019. 10. 16.
728x90

스프링 부트 개념과 활용


3. 스프링 부트 원리

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/springboot-concept-uses/tree/chap03-04-01-starter

 

freespringlecture/springboot-concept-uses

백기선님의 스프링 부트 개념과 활용 강의 내용 정리. Contribute to freespringlecture/springboot-concept-uses development by creating an account on GitHub.

github.com

https://github.com/freespringlecture/springboot-concept-uses/tree/chap03-04-02-configurationproperties

 

freespringlecture/springboot-concept-uses

백기선님의 스프링 부트 개념과 활용 강의 내용 정리. Contribute to freespringlecture/springboot-concept-uses development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급 프레임워크 및 라이브러리 Spring Spring Boot 온라인 강의

www.inflearn.com

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

4. 자동 설정 만들기


SpringBoot 프로젝트 정의 패턴

  • Xxx-Spring-Boot-Autoconfigure 모듈: 자동 설정
  • Xxx-Spring-Boot-Starter 모듈: 필요한 의존성 정의

xxx-spring-boot-starter 프로젝트 생성

xxx-spring-boot-starter 예제 프로젝트는 위의 사항을 통합하여 진행
Java 버전은 1.8에서 동작함

  1. 의존성 추가

    <dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-autoconfigure</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-autoconfigure-processor</artifactId>
         <optional>true</optional>
     </dependency>
    </dependencies>
    <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-dependencies</artifactId>
             <version>2.1.2.RELEASE</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
    </dependencyManagement>
  2. Holoman model 클래스 생성

  3. @Configuration 파일 HolomanConfiguration 생성

  4. src/main/resource/META-INF에 spring.factories 파일 만들기

  5. spring.factories 안에 자동 설정 파일 추가

  6. mvn install or Intellij에서 Maven 텝에 Lifecycle - install 클릭

    다른 Maven 프로젝트에서도 쓸 수 있도록 Local Maven 저장소에 설치를 함

  7. 다른 프로젝트에서 생성된 프로젝트 의존성 추가

  8. Runner로 불러와서 사용

xxx-spring-boot-autoconfigure 프로젝트 생성

HolomanRunner 정의

@Component
public class HolomanRunner implements ApplicationRunner {

  @Autowired
  Holoman holoman;

  @Override
  public void run(ApplicationArguments args) throws Exception {
    System.out.println(holoman);
  }
}

Maven Repositories에 정의

stater 프로젝트를 install 해서 생성된 모듈을 dependency에 추가하면 autoconfigure로 자동 적용됨

<dependency>
    <groupId>me.freelife</groupId>
    <artifactId>springboot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

@ConfigurationProperties

  • 빈 재정의 문제점

@SpringBootApplication 에서 @ComponentScan으로 먼저 등록된 빈이 있으면 나중에 등록되는 빈은 무시됨

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
            SpringApplication application = new SpringApplication(Application.class);
            application.setWebApplicationType(WebApplicationType.NONE);
            application.run(args);
    }

    @Bean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setName("freelifeBlack");
        holoman.setHowLong(60);
        return holoman;
    }
}

덮어쓰기 방지하기

  • @ConditionalOnMissingBean

빈 재정의 수고 덜기

  • @ConfigurationProperties(“holoman”)
  • @EnableConfigurationProperties(HolomanProperties)

프로퍼티 키값 자동 완성

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

@ConditionalOnMissingBean

재정의 한 빈이 동작되도록 AutoConfiguration 프로젝트를 개선

xxx-spring-boot-starter 프로젝트에 빈 설정에 @ConditionalOnMissingBean 설정

@Configuration
public class HolomanConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setHowLong(5);
        holoman.setName("freelife");
        return holoman;
    }
}

application.properties에 정의 해서 쓰기

아래와 같이 설정하면 빈을 재정의 할 필요 없이 Properties만 재정의 하면됨
재정의된 빈이 있으면 재정의된 빈을 우선으로 적용함

xxx-spring-boot-starter 프로젝트 설정

1. HolomanProperties 파일 생성
@ConfigurationProperties("holoman")
public class HolomanProperties {

    private String name;
    private int howLong;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHowLong() {
        return howLong;
    }

    public void setHowLong(int howLong) {
        this.howLong = howLong;
    }
}
2. Configuration 파일에 @EnableConfigurationProperties 설정 추가

HolomanProperties 를 주입받아 처리하도록 수정

@Configuration
@EnableConfigurationProperties(HolomanProperties.class)
public class HolomanConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman(HolomanProperties properties) {
        Holoman holoman = new Holoman();
        holoman.setHowLong(properties.getHowLong());
        holoman.setName(properties.getName());
        return holoman;
    }
}
728x90

댓글

💲 추천 글