드디어 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 문서를 보는 것이 좋다.