드디어 Spring Boot 1.4가 릴리즈 되었다. Spring boot 빌드 할때 보니까 거의 1시간이 걸린다. 테스트도 거의 5500개 정도? 어마어마하게 테스트 한다..
몇가지만 알아보자.

Log4j

Log4j 1 은 더이상 지원하지 않는다. org.springframework.boot.logging 에서도 log4j가 사라졌고
아파치에서도 EOL(End-of-life) 처리 되었다.

starter 변경

spring-boot-starter-ws 에서 spring-boot-starter-web-services로 변경되었다.
spring-boot-starter-redis 에서 spring-boot-starter-data-redis로 변경되었다.
기존꺼는 향후(2.0)에서 제거될 예정이다.

DataSourceProperties 메서드 변경

getDriverClassName() 에서 determineDriverClassName() 으로 변경 되었다.
getUrl() 에서 determineUrl() 변경
getUsername() 에서 determineUsername() 변경
getPassword()determinePassword() 변경 (문서에서는 determineUsername() 나와 있는데 오타인듯)

DataSource binding

org.apache.tomcat.jdbc.pool.DataSource 를 사용하려면 spring.datasource.tomcat 로 사용하면 된다.
com.zaxxer.hikari.HikariDataSource 를 사용하려면 spring.datasource.hikari 로 사용하면 된다.
org.apache.commons.dbcp.BasicDataSource 를 사용하려면 spring.datasource.dbcp 로 사용하면 된다.
org.apache.commons.dbcp2.BasicDataSource 를 사용하려면 spring.datasource.dbcp2 로 사용하면 된다.

Hibernate 5

1.4는 기본적으로 Hibernate 5 사용한다. 만약 Spring 1.3에서 Hibernate 5.0 쓴다면 마이그레이션 문서를 봐라
그런다면 주의할게 있다.
Hibernate 5.1에서는 NamingStrategy 인터페이스가 제거되었다. (현재는 Hibernate5.0.9를 쓰기 때문에 상관은 없지만 Deprecated처리 되어 있다.) 그래서 아마도 SpringNamingStrategy도 더이상 사용 되지 않을 것이다. 하이버 네이트에 ImplicitNamingStrategy 인터페이스와 PhysicalNamingStrategy 인터페이스가 새로 생겼다.
Spring boot 의 설정방법은

spring.jpa.hibernate.naming.implicit-strategy=...
spring.jpa.hibernate.naming.physical-strategy=...

참고로 spring.jpa.hibernate.naming-strategy -> spring.jpa.hibernate.naming.strategy

만약 Hibernate 4.3 다운그레이딩 하고 싶다면 아래와 같이 하면된다.
maven은 아래와 같다.

<properties>
    <hibernate.version>4.3.11.Final</hibernate.version>
</properties>

gradle은 아래와 같다.

ext['hibernate.version'] = '4.3.11.Final'

@EntityScan

@org.springframework.boot.orm.jpa.EntityScan 어노테이션이 deprecated 되었고 @org.springframework.boot.autoconfigure.domain.EntityScan 으로 변경되었다.

import org.springframework.boot.autoconfigure.SpringApplication;
import org.springframework.boot.orm.jpa.EntityScan;

@SpringBootApplication
@EntityScan(basePackageClasses=Customer.class)
public class MyApplication {
}

1.3에서는 위와 같았지만 1.4에서는 아래와 같이 하면 된다.

import org.springframework.boot.autoconfigure.SpringApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;

@SpringBootApplication
@EntityScan(basePackageClasses=Customer.class)
public class MyApplication {
}

Test

@SpringApplicationConfiguration(classes=MyConfig.class) 에서 @SpringBootTest(classes=MyConfig.class)

@ContextConfiguration(classes=MyConfig.class, loader=SpringApplicationContextLoader.class) 에서
@SpringBootTest(classes=MyConfig.class)

@IntegrationTest 에서 @SpringBootTest(webEnvironment=WebEnvironment.NONE)

@IntegrationTest 와 함께 @WebAppConfiguration 에서 @SpringBootTest(webEnvironment=WebEnvironment.DEFINED_PORT) (or RANDOM_PORT)

거의 @SpringBootTest로 통합된거 같다. 몇가지 더 있지만 문서를 참고

TestRestTemplate

org.springframework.boot.test 패키지 에서 -> org.springframework.boot.test.web.client 으로 변경 되었고 RestTemplate 을 상속하던 TestRestTemplate이 구성으로 바뀌었다. 기존과 메서드는 동일하다.

Spring Batch Starter

더이상 내장 데이터베이스를 의존하지 않는다. 이는 이제 함께 작성해야한다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>

Downgrading Tomcat

톰캣을 Downgrading 하고 싶다면 아래와 같이 해야된다.

<properties>
    <tomcat.version>7.0.59</tomcat.version>
</properties>
<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    ...
</dependencies>

위는 예전 방식으로 아래는 새로운 방식이다.

<properties>
    <tomcat.version>7.0.59</tomcat.version>
</properties>
<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-juli</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    ...
</dependencies>

MongoDB 3

드라이브 3.2.2로 변경되면서 artifactId도 변경 되었다.

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
</dependency>

이였던 artifactId가 아래와 같이 변경되었다.

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
</dependency>

Thymeleaf 3

기본적으로 Spring Boot1.4는 Thymeleaf 2.1을 지원한다. 하지만 만약 Thymeleaf 3을 사용하고 싶다면 호환도 되니 사용해도 된다.

<properties>
    <thymeleaf.version>3.0.0.RELEASE</thymeleaf.version>
    <thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version>
</properties>

Spring Framework 4.3

예전에도 말했던거 같은데 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping 이정도를 많이 쓸거 같고
명시적으로 @Autowired 없이 생성자에만 있으면 된다. 예를들어

public class SomeController {

  private final SomeService someService;

  @Autowired 
  public void SomeController(SomeService someService){
    this.someService = someService;
  }
  //or
  @Autowired 
  private SomeService someService;
}

뭐 모든 변수에는 final을 되도록이면 사용하면 좋으니(다시 어사인이 안되므로) 생성자에 넣는 사람도 있을 것이다. (Spring 예제나 소스에서는 생성자에 주입을 많이 한다.)
이제는 @Autowired 없이 생성자에만 있으면 된다.

public class SomeController {

  private final SomeService someService;

  public void SomeController(SomeService someService){
    this.someService = someService;
  }
}

코드가 길이지니 lombok 으로

@RequiredArgsConstructor
public class SomeController {

  private final SomeService someService;
}

Third-party library upgrades

Jetty 9.3, Tomcat 8.5, Jersey 2.23, Hibernate 5.0, Jackson 2.7, Solr 5.5, Spring Data Hopper, Spring Session 1.2, Hazelcast 3.6, Artemis 1.3, Ehcache 3.1, Elasticsearch 2.3, Spring REST Docs 1.1, Spring AMQP 1.6 & Spring Integration 4.3
서드파트 라이브러리가 업데이트 되었다. 주의 깊게 볼것은 역시나 Hibernate 나머지는…Jackson 정도? 필자가 많이 쓰는게.. 문서에서 복붙했으니 참고.

Couchbase support

Couchbase를 지원한다. 아래와 같이 메이븐에 작성해주고 CouchbaseRepository를 사용하면 된다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-couchbase</artifactId>
</dependency>

Couchbase Repository

public interface CouchbaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
  //...
  //...
}

Neo4J Support

Neo4J 또한 지원한다. 아래와 같이 메이븐에 작성해주고 GraphRepository를 사용하면 된다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

neo4j Repository

@NoRepositoryBean
public interface GraphRepository<T> extends PagingAndSortingRepository<T, Long> {
  //.. 
  //..
}

Redis Spring Data repositories

spring data redis 문서 참고

Caffeine cache support

카페인 캐싱을 지원한다 구아바 캐싱은 향후에 삭제될 예정이니 구아바 캐싱을 사용하는 사람은 카페인 캐싱으로 마이그레이션하는게 좋다.

Analysis of startup failures

예전에 한번 썼던 기억이.. 참고
서버 기동시 에러가 살짝 바뀌었다. 좀더 이쁘고 유용한 정보를 출력해준다.

Image Banners

이것도 위의 링크에서 한번 말했던 것이다.
이미지 배너 지원 banner.gif, banner.jpg, banner.png
image 속성 추가
– banner.image.height
– banner.image.margin
– banner.image.invert
– banner.image.width

RestTemplate builder

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.basicAuthorization("user", "secret").build();
}

위와 같이 간단하게 인증처리를 할 수 있다.

JSON Components

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;

@JsonComponent
public class Example {
  public static class Serializer extends JsonSerializer<SomeObject> {
    @Override
    public void serialize(SomeObject someObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
      //...
    }

  }

  public static class Deserializer extends JsonDeserializer<SomeObject> {
    @Override
    public SomeObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
      //...
    }
  }
}

@JsonComponent 어노테이션으로 JsonSerializer, JsonDeserializer 을 할 수 있다. 딱히 쓸일이 있나 모르겠네.. @JsonComponent 은 @Component 어노테이션을 메타 어노테이션으로 선언 되고 있다.

Convention based error pages

커스텀한 에러페이지 설정 /public/error 또는 템플릿 엔진을 사용한다면 /templates/error에 status code 를 파일명으로 사용하면 된다. 404 일경우 src/main/resource/public/error/404.html에 작성하면 된다.

Test improvements

예전에 포스팅한것이 있기에 참고

Deprecations in Spring Boot 1.4

Velocity deprecated spring 4.3
UndertowEmbeddedServletContainer클래스의 생성자 deprecated
@ConfigurationProperties 속성 locations(), merge() deprecated
SpringApplication 클래스의 protected한 printBanner() deprecated

org.springframework.boot.autoconfigure.test.ImportAutoConfiguration 에서 org.springframework.boot.autoconfigure.ImportAutoConfiguration 이동

org.springframework.boot.test 바로 아래 클래스들은 모두 deprecated (다른 곳으로 이동한 듯으로 보임)
PropertiesConfigurationFactory.setProperties(Properties) deprecated

org.springframework.boot.context.embedded 패키지의 deprecated 된 것은 org.springframework.boot.web.servlet 이동

org.springframework.boot.context.web 아래 클래스들 모두 deprecated (다른 곳으로 이동한 듯으로 보임)

spring-boot-starter-ws -> pring-boot-starter-web-services

spring-boot-starter-redis -> spring-boot-starter-data-redis

@org.springframework.boot.orm.jpa.EntityScan -> @org.springframework.boot.autoconfigure.domain.EntityScan

management.security.role -> management.security.roles

TomcatEmbeddedServletContainerFactory.getValves() -> TomcatEmbeddedServletContainerFactory.getContextValves()

org.springframework.boot.actuate.system.EmbeddedServerPortFileWriter-> org.springframework.boot.system.EmbeddedServerPortFileWriter

org.springframework.boot.actuate.system.ApplicationPidFileWriter -> org.springframework.boot.system.ApplicationPidFileWriter

Property Renames

spring.jackson.serialization-inclusion -> spring.jackson.default-property-inclusion
spring.activemq.pooled -> spring.activemq.pool.enabled
spring.jpa.hibernate.naming-strategy -> spring.jpa.hibernate.naming.strategy
server.tomcat.max-http-header-size -> server.max-http-header-size

이상으로 Spring boot 1.4에 변경 되었거나 새로운걸 알아봤다. 필자가 문서를 잘못 이해 한 부분도 있을 수 있으니 해당 포스팅은 참고만하고 1.4 문서를 보는 것이 좋다.