[강의요약] 스프링부트 개념과 활용 - 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. 매번 빈 등록을 하기는 너무 귀찮다. 설정에 적어두자
-
spring-boot-getting-started (SpringApplication 프로젝트) > resources/application.properties 작성
holoman.name = applicationProperties holoman.how-long = 100
-
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; } }
-
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; } }
안 도는 경우
-
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); } }
-
cherrue-spring-boot-starter (autoconfiguration 프로젝트) maven install -> spring-boot-getting-started (SpringApplication 프로젝트) gradle refresh 후 서버 기동
Holoman{name='applicationProperties', howLong=100}
댓글남기기