[강의요약] 스프링부트 개념과 활용 - 3부 스프링 부트 원리 (1/2)

개인적인 학습을 위한 inflearn - 스프링부트 개념과 활용(백기선) 강의 요약입니다.

개념과 원리 위주로 요약합니다.

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

3부 - Springboot 원리


1. springboot 의존성 관리의 이해 (maven)

pom.xml > spring-boot-starter-parent > spring-boot-dependencies 에 의존 버전이 모두 작성

이 덕에 개발자는 의존성을 신경쓰지 않아도 되어, 환경 설정/버전 업그레이드 등을 더 쉽게 할 수 있다.

물론 parent를 커스텀 하여 쓸 수 있지만 추천하지 않는다.

2. 의존성 관리 응용

2-1. springboot가 관리하는 의존성 : version 정보 명시 안 함

2-2. springboot가 관리하지 않는 의존성 : maven repository 사이트에서 springboot 버전을 선택 명시

2-3. springboot가 관리하는 버전을 변경 : spring-boot-dependencies에서 정의한 것을 내 프로젝트에서 재정의 모든 프로퍼티는 재정의가 가능

<properties>
  <spring.version>5.0.6.RELEASE</spring.version>
</properties>
3. 자동 설정 이해

자동설정 : interface SpringBootApplication에 붙어있는 @EnableAutoConfiguration. 복잡한 설정없이 서버 기동이 가능케 함

@SpringBootApplication = @SpringBootConfiguration(=@configuration) + @ComponentScan + @EnableAutoConfiguration

SpringBoot에서 빈이 두 번 등록됨

  • ComponentScan 단계에서 스캔하면서 등록

    ComponentScan : 해당 객체 하위의 모든 패키지를 돌면서 Component 어노테이션이 붙어있는 클래스들을 bean으로 등록하는 단계

    추가로 Configuration, Repository, Service, Controller, RestController도 등록한다.

  • EnableAutoConfiguration단계에서 빈을 다시 등록 -> 이 어노테이션이 없어도 실행이 가능하단 뜻

    spring-boot-autoconfigure의 META-INF > spring.factories에 EnableAutoConfiguration 하위의 키값들을 보고 그 configuration들을 모두 빈으로 등록

    진짜 모두는 아니고! 해당 configuration의 conditional 설정에 따라 등록 여부를 판단

    물론 그냥은 안 되고, SpringbootApplication은 웹어플리케이션으로 올리려고 해서 죽는데, 이걸 꺼주면 됨

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication application = new SpringApplication(Application.class);
            application.setWebApplicationType(WebApplicationType.NONE);
          	application.run(args);
            //SpringApplication.run(Application.class, args);
        }
    }
    
4. [실습] 자동 설정 만들기 1부 : Starter와 AutoConfigure

4-1. 의존성 추가 : spring-boot-autoconfigure-processor, spring-boot-dependencies

4-2. @Configuration 작성

4-3. resource/META-INF/spring.factories 작성

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
me.cherrue.HolomanConfiguration

4-4. mvn install : maven > Lifecycle > install

다른 프로젝트에서도 접근이 가능하도록 프로젝트를 빌드해서 로컬 메이븐 저장소에 저장하는 작업

4-5. 만든 메이븐 프로젝트 불러오기

build.gradle

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    // maven local
    // {group id}:{artifact id}:{version}
    implementation 'org.cherrue:cherrue-spring-boot-starter:1.0-SNAPSHOT'
    ...
}

4-6. autoconfiguration 사용하기

applicationRunner : argument 받아서 springboot 실행될 때 자동으로 올라가는 빈이 있었으면 좋겠을 때 사용

main/java/me/cherrue/HolomanRunner.java (신규)

@Component
public class HolomanRunner implements ApplicationRunner {
    @Autowired
    Holoman holoman;

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

:exclamation: 문제점 : component scan -> auto configuration 순서로 빈을 등록하기 때문에, 자동 설정이 덮어씌운다. -> 5번에 계속

// expected
Holoman{name='whitespace', howLong=60}

// real
Holoman{name='Cherrue', howLong=5}
5. [실습] 자동 설정 만들기 1부 : Starter와 AutoConfigure

5-1. 위에서 발생한 문제점 해결하기 : auto configuration이 프로젝트에서 선언한 component의 빈을 덮어쓰는 현상을 해결하자

-> @ConditionalOnMissingBean : componentScan에서 등록되지 않은 빈일 때만 등록

@Configuration
public class HolomanConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setHowLong(5);
        holoman.setName("Cherrue");
        return holoman;
    }
}

5-2. 매번 빈 등록을 하기는 너무 귀찮다. 설정에 적어두자

  1. spring-boot-getting-started (SpringApplication 프로젝트) > resources/application.properties 작성

    holoman.name = applicationProperties
    holoman.how-long = 100
    
  2. cherrue-spring-boot-starter (autoconfiguration 프로젝트) > me.cherrue/HolomanProperties.java 작성 Holoman 빈이랑 같게 생겼는데, @ConfigurationProperties(원하는 이름) 을 붙인다.

    @ConfigurationProperties("holoman")
    public class HolomanProperties {
        String name;
        int howLong;
       
        public String getName() {
            return name;
        }
       
        public int getHowLong() {
            return howLong;
        }
       
        public void setName(String name) {
            this.name = name;
        }
       
        public void setHowLong(int howLong) {
            this.howLong = howLong;
        }
    }
    
  3. cherrue-spring-boot-starter (autoconfiguration 프로젝트) > me.cherrue/HolomanConfiguration.java 수정 자동 설정을 위해 어노테이션을 붙여주고, 함수 인자로 properties를 주입받아 사용한다.

    @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;
        }
    }
    

    안 도는 경우

  4. spring-boot-getting-started (SpringApplication 프로젝트) > me.cherrue/Application.java 의 bean 생성 제거

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication application = new SpringApplication(Application.class);
            application.setWebApplicationType(WebApplicationType.NONE);
            SpringApplication.run(Application.class, args);
        }
    }
    
  5. cherrue-spring-boot-starter (autoconfiguration 프로젝트) maven install -> spring-boot-getting-started (SpringApplication 프로젝트) gradle refresh 후 서버 기동

    Holoman{name='applicationProperties', howLong=100}
    

댓글남기기