가끔, 내 생각과는 다르게 IDE에서 멋대로 코드를 포맷팅하는 경우가 있다.

그런 때에 사용할 수 있는 기능이 있다.

인텔레제이 2017.x 기준 [Preference > Editor > Code Style] 에서 'Formatter Control'을 체크하면 된다.

이렇게 작성한 코드도

@Test
public void formatterOff() throws Exception {
List<String> arrays = new ArrayList<>(); arrays.add("Test"); arrays.add("Formatter");
}

포맷팅을 하면

@Test
public void formatterOff() throws Exception {
List<String> arrays = new ArrayList<>();
arrays.add("Test");
arrays.add("Formatter");
}

처럼 되지만 //@formatter:off~//@formatter:on 을 이용하면

@Test
public void formatterOff() throws Exception {
//@formatter:off
List<String> arrays1 = new ArrayList<>(); arrays1.add("Test"); arrays1.add("Formatter");
//@formatter:on

List<String> arrays2 = new ArrayList<>(); arrays2.add("Test"); arrays2.add("Formatter");
}

이런 코드가

@Test
public void formatterOff() throws Exception {
//@formatter:off
List<String> arrays1 = new ArrayList<>(); arrays1.add("Test"); arrays1.add("Formatter");
//@formatter:on

List<String> arrays2 = new ArrayList<>();
arrays2.add("Test");
arrays2.add("Formatter");
}

이렇게 변경된다.


메서드 체이닝을 이용해서 작성하는 경우에 유용하다.

저작자 표시
신고
내겐 인텔리제이 개발환경은 너무너무 낯설다. ㅡ0-)

이클립스에서 스프링부트 기반으로 개발하던 환경을 벗어나니 너무너무 낯설기만 하다.

지금 진행하고 있는 프로젝트를 war 로 배포하려고 하면서 전과는 다른 개발방식 때문에 이런저런 새로운 상황들이 벌어져서 나를 당황하도록 만든다.

Table of Contents

1. 문제발생

@Entity 선언한 엔티티 객체를 생성한 후 테스트를 위해 실행하려는 순간 다음과 같은 문제가 발생한다.

2016-05-22 21:02:21.993  INFO 11450 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@b62fe6d: startup date [Sun May 22 21:02:21 KST 2016]; root of context hierarchy
2016-05-22 21:02:23.603  INFO 11450 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2016-05-22 21:02:23.620  INFO 11450 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2016-05-22 21:02:23.687  INFO 11450 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.1.0.Final}
2016-05-22 21:02:23.688  INFO 11450 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2016-05-22 21:02:23.690  INFO 11450 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2016-05-22 21:02:23.722  INFO 11450 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2016-05-22 21:02:23.860  INFO 11450 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2016-05-22 21:02:24.165  WARN 11450 --- [           main] o.h.c.beanvalidation.TypeSafeActivator   : HHH000274: Unable to apply constraints on DDL for io.honeymon.springboot.proto.entity.Article
 
javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.createValidator(ValidatorFactoryImpl.java:339) ~[hibernate-validator-5.2.4.Final.jar:5.2.4.Final]
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.getValidator(ValidatorFactoryImpl.java:256) ~[hibernate-validator-5.2.4.Final.jar:5.2.4.Final]
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:207) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyRelationalConstraints(TypeSafeActivator.java:191) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyRelationalConstraints(TypeSafeActivator.java:150) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.activate(TypeSafeActivator.java:98) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:132) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:276) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:881) [hibernate-entitymanager-5.1.0.Final.jar:5.1.0.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) [spring-orm-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338) [spring-orm-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) [spring-orm-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) [spring-orm-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076) [spring-context-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851) [spring-context-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) [spring-context-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:765) [spring-boot-1.4.0.M3.jar:1.4.0.M3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.4.0.M3.jar:1.4.0.M3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.4.0.M3.jar:1.4.0.M3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1182) [spring-boot-1.4.0.M3.jar:1.4.0.M3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1171) [spring-boot-1.4.0.M3.jar:1.4.0.M3]
at io.honeymon.springboot.proto.PrototypeBootApplication.main(PrototypeBootApplication.java:10) [main/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na]

이 에러를 뱉으며 애플리케이션이 실행되지 않는다. 이와 관련된 문제를 인터넷을 통해 찾아본 결과, 이 문제의 답은 역시나 스택오버플로우에서 찾았다.

이와 관련해서 스프링부트 프로젝트에서도 이슈로 등록되어 논의가 있었지만…​

인텔리제이의 버그로 정리가 된 듯 싶다. @_@)>

2. 원인

스프링부트를 https://start.spring.io 를 통해서 프로젝트를 생성하면 프로젝트에서 기본내장컨테이너가providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')로 선언이 된다. providedCompile  compile, runtime 에서는 동일한 스코프로 적용이 되지만 war 로 빌드될 때는 제외된다.

providedXXX는 이행성 설정이다. 어떤 라이브러리가 provided로 설정되면 그것이 의존하는 다른 라이브러리도 자동으로 provided가 된다. 강제로 compile 로 지정해도 상관없다.

— http://kwonnam.pe.kr/wiki/gradle/webGradle Web(War) Plugin - 손권남님

providedCompile 로 정의가 된 spring-boot-starter-tomcat 의존성과 관련된 부분들이 war 에서 제외되는 상황이 생긴다.

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-el</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-logging-juli</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-websocket</artifactId>
    </dependency>
</dependencies>

위의 내용은 org.springframework.boot : spring-boot-starter-tomcat : 1.3.5.RELEASE 에서 확인가능하다.

providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')으로 인해서 tomcat-embed-el 도 제외가 되어 el 처리를 위한 구현체가 없어서 하이버네이트 validator 에서 예외를 뱉는 것이다. ㅡ_-)

== 해결방법

compile("javax.el:javax.el-api:2.2.5")

을 추가하면 정상적으로 실행이 된다…​. 뭘까? ㅡ_-)?

혹은

providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')

를 제거하면 된다. javax.el-api 혹은 org.apache.tomcat.embed:tomcat-embed-el 를 추가하는 것으러 처리가 될 것이다.

흠냐릿!!


저작자 표시
신고

아무런 생각없이 인텔리제이에서 자바프로젝트를 생성해서 자바8 코딩을 연습해보려고 하는데 거북스럽게 뜨는 빨간줄들!!

거기에 “lambda expressions not supported at this language level” 메시지가 뜬다.

'Project Structure' 창을 열어 'Project language level' 을 8에 맞춰도 위의 빨간줄과 팝업이 사라지질 않는다.

그러다가 '설마?' 하는 마음에 'build.gradle' 을 열어보니 아래 항목이 똬악!

sourceCompatibility 는 자바소스를 컴파일링하는데 사용할 자바버전을 지정하는 항목인데 인텔리제이에서 생성하는 템플릿의 버전이 1.5로 되어 있는 것을 발견하지 못하고 프로젝트 설정부분에서만 깨작거리고 있었는데...!!

`build.gradle`  에서 `sourceCompatibility` 를 제외하니 빨간줄과 팝업이 사라졌다. 흠냐.

문제가 생기면 그 발생한 부분에 너무 함몰되어 전체적으로 살펴보려는 것을 나중에 하는 이상한 습관이 들어버린 듯 하다. ㅡ_-);;

반성하자.

저작자 표시
신고


인텔리제이 12버전인가를 사용했던 기억이 나는데...

4년만에 다시 사용하려고 하니 너무나 낯설다.

그렇다고 해서 이클립스를 잘 사용한 건 아니지만...

저작자 표시
신고

안드로이드 공부 다시해야겠네요. @_@);;

처음 시작했을 때 접지말고 계속 할 것을...

안드로이드 스튜디오부터 어떻게 쓸지를 모르겠다능...


http://www.yes24.com/24/goods/18455808?scode=032&OzSrank=2

전에 받은 책을 열어볼 때가 되었습니다.

저작자 표시
신고

+ Recent posts