새로운 Controller를 테스트하기 위해 테스트 소스를 작성하고 WebMvc와 관련된 빈만 등록해 테스트 하고자 했다. 제공되는 SliceTest 애노테이션인 @WebMvcTest를 테스트클래스에 마킹하고 실행했으나 초기화 단계에서 Exception이 발생하였다.
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
원인
@WebMvcTest로 WebMvc와 관련된 빈만 등록된 상태에서 메인클래스에 마킹한@EnableJpaRepositories이 JPA와 관련된 빈을 찾아 작업을 하려할 때 오류가 발생하였다.
해결
QueryLookupStrategy 설정을 위해 메인클래스에@EnableJpaRepositories를 마킹했으나, 굳이 필요한 설정은 아니므로 지우고 테스트를 실행하였다.(그저 학습의 이유로 디폴트 전략을 명시적으로 설정하였다.) 만일 필요한 옵션이라면 @EnableJpaRepositories를 통해서 하지않고 다른 방법으로 옵션을 줬어야 했을것이다.
@SpringBootApplication
//@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
app.setWebApplicationType(WebApplicationType.SERVLET);
app.run(args);
}
}
By using @EnableJpaRepositories you are explicitly telling Spring Boot’s auto-configuration to back off and that you’ll handle Spring Data yourself. I think what’s happening is that @WebMvcTest is turning off JPA (i.e. not finding your @Entity classes) but @EnableJpaRepositories is still active so it complains that it can’t find any JPA models.
스프링부트는 Java Util Logging, Log4J2, Logback 이렇게 3가지에 대해 기본 설정을 제공하고 있다. spring-boot-starter-logging 의존성을 추가하면 로그관련 라이브러리들이 추가되는 것을 볼 수 있다.
이 중에서 스프링부트는 기본으로Logback을 사용하며 자동으로 이루어지는 설정은org.springframework.boot.logging.DefaultLogbackConfiguration파일을 참고한다. 기본설정으로 아래와 같이 시간-로그레벨-프로세스ID-구분자-쓰레드명-로거명-로그내용 포맷이 출력된다.
디폴트 설정에서 변경을 원한다면 프로퍼티 설정파일에서 logging으로 시작하는 옵션을 지정하거나 별도의 로그설정파일(logback.xml 등)을 사용하여 디폴트 설정을 오버라이드 한다.
Log Level
스프링부트의 기본설정은 INFO 레벨 이상인 로그만 보여준다. 만일 상세한 로그가 보고 싶다면 debug모드로 어플리케이션을 기동하던지 출력되는 로그레벨을 프로퍼티에서 조정한다.
logging.level.com.yang.wind.mapper=TRACE: com.yang.wind.mapper 패키지 이하의 로그레벨을 TRACE로 한다.
logging.level.root=INFO: root 이하 모든 패키지의 로그레벨을 INFO로 한다.
Log Color
만약 ANSI를 지원하는 터미널을 사용한다면 프로퍼티 설정파일에spring.output.ansi.enabled=detect또는always옵션을 줘서 로그를 컬러풀하게 출력할 수 있다.
Log 파일출력
기본적으로 아무설정이 없다면 콘솔은 출력하지만 로그파일은 작성되지 않는다. 파일로 로그를 출력하고자 한다면 프로퍼티 설정파일에logging.file.name과logging.file.path프로퍼티를 추가한다. name과 path 두 설정을 모두 지정할 경우에는 함께 동작하지 않는다.logback-spring.xml과 같이 별도의 파일로 설정을 해줘야 할 듯 싶다. 프로퍼티 지정에 따른 동작방식은 아래를 참고하자.
Log Group
특정 로거들을 그룹핑하여 설정을 동일하게 변경이 가능하다. 예를들어 Tomcat에 관련된 로거들을 동시에 설정변경 하고자 한다면 각자의 패키지로 설정을 변경하기 보다는 그룹을 지정하여 간편하게 변경할 수 있다.