똑같은 삽질은 2번 하지 말자

Spring Boot 개념다지기 No.6(SpringApplication, 외부설정) 본문

Spring/Spring Boot

Spring Boot 개념다지기 No.6(SpringApplication, 외부설정)

곽빵 2020. 4. 25. 17:30

스프링 부트 핵심 기능

각종 기술 연동

  • SpringApplication
  • 외부 설정
  • 프로파일
  • 로깅
  • 테스트
  • Spring-Dev-Tools
  • 스프링 웹 MVC
  • 스프링 데이터
  • 스프링 시큐리티
  • REST API 클라이언트
  • 다루지 않은 내용들

앞으로 배울 친구들

 

1.SpringApplication !

@SpringBootApplication
public class SbEx1Application {

	public static void main(String[] args) {
		//SpringApplication.run(SbEx1Application.class, args);
		// 커스텀 마이징을 위해 밑의 형식으로 바꿈
		SpringApplication app = new SpringApplication(SbEx1Application.class);
		app.run(args);
	}

}

 

배너 바꾸는건 resources 파일에 banner.txt에다가 쓰면됨

 

잘 실행된다.

 

ApplicationEvent 등록

 

@Component
public class SampleListener implements ApplicationListener<ApplicationStartingEvent>{
	@Override
	public void onApplicationEvent(ApplicationStartingEvent event) {
		System.out.println("===================");
		System.out.println("Application is Starting");
		System.out.println("===================");
		
	}
}
// 이벤트가 언제 발생하느냐 를 주의해야 한다.
// ApplicationStartingEvent 은 제일 처음발생하는 이벤트라서 Bean으로 등록해도 동작하지않는다.
// 그래서 Component 등록해도 의미가 없긴하다.​

 

 그래서 이 이벤트리스너가 제대로 동작하게 하려면 

@SpringBootApplication
public class SbEx1Application {

	public static void main(String[] args) {
		//SpringApplication.run(SbEx1Application.class, args);
		// 커스텀 마이징을 위해 밑의 형식으로 바꿈
		SpringApplication app = new SpringApplication(SbEx1Application.class);
		app.addListeners(new SampleListener()); // 이벤트 등록
		app.setWebApplicationType(WebApplicationType.REACTIVE); // 웹어플 타입 등록
		app.run(args); 
	}

}

 

저렇게 이벤트 등록을 해줘야한다~~!

ApplicationContext를 만들기 전에 사용하는 리스너는 @Bean으로 등록할 수 없다.

 

 

ApplicationArguments 사용하기

@Component
public class ArgumentClass {
	
	public ArgumentClass(ApplicationArguments arguments) {// 생성자 한개에 param이 빈이라면 컨테이너가 알아서 주입
		System.out.println(arguments.containsOption("foo")); // foo라는 args가 있는지
	}
}

 

 

애플리케이션 실행한 뒤 뭔가 실행하고 싶을 때

  • ApplicationRunner (추천) 또는 CommandLineRunner
  • 순서 지정 가능 @Order

 

2. 외부설정

application.propertis 는 key = value 방식으로 자동으로 읽어들이는 외부설정 파일이다.

테스트용 application.properties 도 따로 만들수 있다.

 

저렇게 src/test/resources 에 application.properties 를 만들면

테스트를 돌릴땐 이젠 main에 있는 파일이 아니라 저 파일을 읽는다.(없으면 메인에 있는 친구를 읽음)

 

음 그렇다면, properties에서 값을 불러 들일때 여러가지 방법이 있는데, 누가 쎌까?(우선순위)

 

프로퍼티 우선 순위

  1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
  2. 테스트에 있는 @TestPropertySource
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트
  4. 커맨드 라인 아규먼트
  5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
  6. ServletConfig 파라미터
  7. ServletContext 파라미터
  8. java:comp/env JNDI 애트리뷰트
  9. System.getProperties() 자바 시스템 프로퍼티
  10. OS 환경 변수
  11. RandomValuePropertySource
  12. JAR 밖에 있는 특정 프로파일용 application properties
  13. JAR 안에 있는 특정 프로파일용 application properties
  14. JAR 밖에 있는 application properties
  15. JAR 안에 있는 application properties
  16. @PropertySource
  17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

application.properties 우선 순위 (높은게 낮은걸 덮어 씁니다.)

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

프로퍼티에 랜덤값 설정

${random.*} -> num = ${random.int}

 

프로퍼티에 설정한 값을 한꺼번에 가져오는

@ConfigurationProperties

 

 

 

이렇게 타입세이프?하게 이용할 수 있다. 

Comments