[SpringBoot] Spring Boot 스프링 부트 환경설정

🛰 Spring Boot 스프링 부트 환경설정

[목표]


웹 어플리케이션 타입 지정하기 :SpringApplication

  • 스프링 부트에서 SpringApplication 객체를 통해 어플리케이션 타입 지정 가능
  • 스프링 컨테이너의 인터페이스인 ApplicationContext를 개발자 대신 생성
WevAppplicaion.type AnnotationConfig
WebApplicationType.SERVLET - AnnotationConfigServletWebServerApplicationContext
WebApplicationType.REACTIVE - AnnotationConfigReactiveWebServerApplicationContext
WebApplicationType.NONE – AnnotationConfigApplicationContext


[SpringBootProjectApplicaion.java]

@SpringBootApplication
public class SpringBootProjectApplication {

    public static void main(String[] args) {

	//Spring Application 객체 생성
	SpringApplication applicaion = new SpringApplication(SpringBootProjectApplication.class);

	//Applicaion type을 서블릿으로 설정 setting
	applicaion.setWebApplicationType(WebApplicationType.SERVLET);

	applicaion.run(args);
	}
}


Runner 클래스 작성하기 : ApplicationRunner & properties

  • SpringApplication 실행된 후에 arguments 값을 받아 처리하거나 무엇인가를 실행하고 싶을 때 ApplicationRunner 인터페이스를 구현하는 Runner 클래스를 작성
  • @Order로 처리 순서 지정 가능


[applicaion.properties] : Runner.class에서 받아올 환경 변수 선언

#Tomcat port번호 변경
server.port=8086

#사용자 정의 환경변수 선언
kaya.name=kaya
kaya.age =${random.int(1,50)}
kaya.fullName = ${kaya.name}Lee

[MyRunner.java] : 환경변수 값을 @Value로 매핑하고 출력하기

@Component
@Order(1)
//Order로 Runner의 순위를 줄 수 있음
public class MyRunner implements ApplicationRunner {
	@Value("${kaya.name}")
	String name;

	@Override
	public void run(ApplicationArguments args) throws Exception {
	System.out.println("My name is : " + name);
	}
}


+ @ConfigurationProperties : 환경변수를 Class로 생성해서 받아오기

  • application.properties의 공통 설정들을 Class로 만든 후, getter / setter 매소드를 통해 받아오기
  • @ConfiguraionProperties로 외부 설정 값 주입 후
  • @Autowired로 자동 주입
  • 따로 프로퍼티 클래스 작성 시, Bean으로 등록해서 다른 Bean에도 주입 가능


[pom.xml] : @ConfiguraionProperties를 사용하려면 spring-boot-configuration-processor 의존성을 먼저 설정를 해줘야함

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

[application.properties] : 사용자 정의 환경변수 선언

#사용자 정의 환경변수 선언
kaya.name=kaya
kaya.age =${random.int(1,50)} //1-50중 랜덤숫자
kaya.fullName = ${kaya.name}Lee

[KayaProperties.java] : 환경변수를 사용할 클래스 작성

@Component
@ConfigurationProperties("kaya")
// 공통되는 kaya.* 를 ConfigurationProperties로 매핑
public class KayaProperties {
	private String name;
	private int age;
	private String fullName;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getFullName() {
		return fullName;
	}
	public void setFullName(String fullName) {
		this.fullName = fullName;
	}
}

[MyRunner.java] : 테스트 파일

@Component
@Order(1)
//Order로 Runner의 순위를 줄 수 있음
public class MyRunner implements ApplicationRunner {
	@Value("${kaya.name}")
	String name;

    //위에 클래스로 설정해 둔 프로퍼티 받아오기
	@Autowired
	private KayaProperties property;

	@Override
	public void run(ApplicationArguments args) throws Exception {

    System.out.println("My name is " + name + " and I am "+property.getAge()+" old"  );
    System.out.println("oh, full name is "+ property.getFullName());
	}

}

[콘솔 출력]



어플리케이션의 런타임 환경 관리: @Profile()

  • 스트링 부트 어플리케이션의 런타임 환경 관리
  • @Profile을 통해 테스트 환경에서 실행할 지, 프로덕션 환경에서 실행할 지 설정 가능
  • 테스트 / 프로덕션 환경 설정파일을 각각 따로 생성 후, spring.profiles.active 값을 통해 활성화
  • 개발와 운용모드의 빈을 각 각 다르게 구현을 해놓고 개발모드에는 개발 빈을, 운영모드에는 운영 빈을 활성화 시켜서 사용


Test/Prod Configuration Class 작성

[ProdConfig.java] : 서비스 운영시 사용할 Config class

@Profile("prod")
@Component
public class ProdConfig {

	@Bean
	public String hello() {
		return "현재 운영 모드 실행 중 ";
	}
}

[TestConfig.java] : 개발모드에서 사용하는 Config class

@Profile("prod")
@Component
public class ProdConfig {

	@Bean
	public String hello() {
		return "현재 운영 모드 실행 중 ";
	}
}

[applicaion.properties] : 현재 활성화 시킬 Bean설정

#Config class file 설정
spring.profiles.active=test


[MyRunner.java]

@Component
@Order(2)
public class MyRunner implements ApplicationRunner {

	@Autowired
	private String hello;
    //Test와 prod class에서 선언한 hello 매소드를 Autowired
    //활성화 된 bean의 hello를 불러옴

	@Override
	public void run(ApplicationArguments args) throws Exception {
		System.out.println("profile : " + hello);
	}
}

[콘솔] : properties에 active로 설정해 둔 test 실행



스프링 부트 Logger 설정

  • 부트에 기본적으로 설정된 로그퍼사드 : Logback
  • 스프링 부트 기본 로거를 설정하면 logs/spring.log 파일 자동생성
  • logging.level.패키지명 = 로그 레벨
  • 로그 레벨(log level)을 출력할 Properties 파일을 등록


[applicaion.properties] : logging.path 설정 (logs폴더 자동 생성)

[application-prod.properties] : 서비스 운영모드에서 출력될 로그 환경 설정

kaya.name=kaya Production

#log level
logging.level.com.kaya.myboot.web=info

[application-test.properties] : 개발 모드에서 출력될 로그 환경 설정

kaya.name=kaya TEST

#log level
logging.level.com.kaya.myboot.web=debug

[MyRunner.java] : log 출력할 Runner 클래스 작성 / Logger객체와 LoggerFactory사용

@Component
@Order(2)
public class MyRunner implements ApplicationRunner {

	@Autowired
	private String hello;

	//getLogger(현재 실행중인 클래스명)
	private Logger logger = LoggerFactory.getLogger(MyRunner.class);

	@Override
	public void run(ApplicationArguments args) throws Exception {
		logger.info("=======>> start >>info 모드에서만 출력 되는 것입니다. ========");
		logger.debug("Logger Class Name : " + logger.getClass().getName());
		logger.debug("profile : " + hello);
		logger.debug("My name is " + name + " and I am "+property.getAge()+" old" );
		logger.info("=======>> end >> info 모드에서만 출력 되는 것입니다. ========");
	}
}

[콘솔] : 현재 application.properties에 설정되어있는 spring.profiles.active=test로 인해info와 debug 모두 출력



파일 변경시 자동 재시작 설정 : Spring-Boot-Devtools

  • 클래스 패스에 있는 파일이 변경될 때 마다, 자동으로 서버를 재시작하여 변경사항을 반영함

[pom.xml] : devtools dependency 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
[추가기능]

리스타트 하고 싶지 않은 리소스는? spring.devtools.restart.exclude

리스타트 기능 끄려면? spring.devtools.restart.enabled=false