본문 바로가기
백엔드/SpringBoot

SpringBoot의 Auto Configuration과 Application.properties 설정

by 1005ptr 2020. 12. 19.
반응형

서론


Spring Boot 애플리케이션을 생성하면 아래와 같은 클래스가 생성된다.

public static void main()은 C언어 같은거 배울때나 콘솔 애플리케이션 만들때 맨날 봤던 프로그램의 시작점이다.

package com.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestRestWebApplication {

	public static void main(String[] args) {
		SpringApplication.run(TestWebApplication.class, args);
	}

}

어노테이션에 대한 JavaDoc 설명을 보면

여러개의 빈을 선언하는 설정 클래스를 가리킨다. 또한 Auto Configuration과 Component Scan을 수행한다.

편의성 어노테이션으로 @Configuration, @EnableAutoConfiguration, @ComponentScan 어노테이션을 적은것과 동일하다.

이번 문서에서 중요한 부분은 @EnableAutoConfiguration 어노테이션이 포함되어있다는 부분이다.

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html

 

SpringBootApplication (Spring Boot 2.4.1 API)

Specify whether @Bean methods should get proxied in order to enforce bean lifecycle behavior, e.g. to return shared singleton bean instances even in case of direct @Bean method calls in user code. This feature requires method interception, implemented thro

docs.spring.io

@EnableAutoConfiguration 어노테이션은

  • 필요할거같은 Configuration 들을 알아서 만들어준다.
  • 직접 Configuration 빈들을 만들어갈수록 알아서 조금씩 물러난다.
    • 사용자가 만들어 논 빈이 있으면 그걸 쓰고 없으면 알아서 만들어준다.

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/EnableAutoConfiguration.html

 

EnableAutoConfiguration (Spring Boot 2.4.1 API)

Enable auto-configuration of the Spring Application Context, attempting to guess and configure beans that you are likely to need. Auto-configuration classes are usually applied based on your classpath and what beans you have defined. For example, if you ha

docs.spring.io

문제


스프링 프로젝트를 생성하고 초반에는 application.properties 에 auto config가 읽을 수 있는 프로퍼티들을 잔뜩 등록해줬다.
두가지만 적어보자면

  • spring.jackson.property-naming-strategy=UPPER_CAMEL_CASE
  • mybatis.configuration.jdbcTypeForNull=NULL

근데 어느순간부터 이게 동작을 안하기 시작했다.

왜 그런가? 정답은 내가 저 프로퍼티의 구현체를 직접 만들어버려서 Auto Config가 꺼졌기 때문이다.

 

각자 다른이유로 꺼졌는데 먼저 첫번째 프로퍼티는 아래 글을 보고 알았다.

베댓의 설명에 따르면

  • @EnableWebMvc 어노테이션을 쓰면 Spring MVC의 auto-configuration 기능이 꺼진다. (이건 위에서 말했다.)
  • Spring MVC 설정은 HTTP 메시지 변환(JSON)을 포함하고 있다.
  • 나는 Swagger 설정할때 WebMvcConfigurationSupport를 extends 한 것 때문이었다.
    • @EnableWebMvc를 하면 WebMvcConfiguartionSupport를 임포트 하는거라 같은 행위라고 보면 된다.

그래서 설정이 안먹혔던 것이다.

 

Auto Config 계속 하고 싶으면

  • @EnableWebMvc
  • extends WebMvcConfigurationSupport

등등 WebMvc 관련 설정 구현체를 만들면 안된다.

 

https://stackoverflow.com/questions/40649177/jackson-is-ignoring-spring-jackson-properties-in-my-spring-boot-application

 

Jackson is ignoring spring.jackson.properties in my spring boot application

Jackson is ignoring spring.jackson.property-naming-strategy=SNAKE_CASE. I am using springBootVersion 1.4.2.RELEASE. In my application.properties file, I have added spring.jackson.property-naming-

stackoverflow.com

대신에

  • implements WebMvcConfigurer

를 많이 쓴다고 한다.

JavaDoc에도 나와있는데 Auto Config는 살리면서도 각 메서드별로 오버라이드해서 커스터마이즈 할 수 있어서 좋다.

https://atoz-develop.tistory.com/entry/How-to-develop-web-app-with-spring-boot-right-away

 

스프링 부트에서 즉시 웹 개발을 시작할 수 있는 이유 - AutoConfiguration

스프링 부트에서 즉시 웹 개발을 시작할 수 있는 이유 - AutoConfiguration spring-boot-starter-web 의존성을 추가하여 스프링 부트 프로젝트를 만들기만 하면 즉시 웹 어플리케이션 개발이 가능하다. @Rest

atoz-develop.tistory.com


두번째 설정은 굳이 검색하지 않고도 문제는 알아챘다.

  1. 맨 처음에 CUD 동작 확인한 다음에 CUD 테스트를 안해봤다.
  2. 멀티 디비를 써야되는 환경이 되었고 멀티 디비 Auto Configuration이 되는지 확인했더니 안되길래 클래스 하나 만들어서 처리했다.
  3. 그럼으로써 Auto Configuration은 꺼졌고 JdbcTypeForNull 프로퍼티 설정이 동작안하게 된것이다.
  4. 한참 뒤에 CUD 돌려보니까 되던게 안되는 상황 발생

 

결론은 Configuration 만들때 properties에 관련 Auto Config 설정이 있는지 잘 확인해봐야 한다.

 

추가


아래는 .properties 파일에서 사용하는 스프링과 마이바티스 프로퍼티 목록 링크

https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html

 

Common Application properties

 

docs.spring.io

https://mybatis.org/mybatis-3/configuration.html#properties

 

mybatis – MyBatis 3 | Configuration

Configuration The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves. The high level structure of the document is as follows: configuration properties These are externalizable, substitutable properties

mybatis.org

 

반응형

'백엔드 > SpringBoot' 카테고리의 다른 글

Thymeleaf 템플릿 적용하기  (0) 2020.12.20
프로퍼티 클래스 만들기  (0) 2020.12.19
Spring Boot에 Swagger 적용하기  (0) 2020.12.10
DTO 따로 만들기(Param, VO)  (0) 2020.08.02
Rest Controller 매개변수 어노테이션  (0) 2020.08.02

댓글