Spring Boot 2.1.6.RELEASE , Spring Data JDBC 1.0.9.RELEASE 기준 작성된 글
Spring Data JDBC는 Data Jpa가 가진 단점(? 또는 복잡성?)을 해결하기 위해 나온 라이브러리이다.
https://www.slideshare.net/SpringCentral/the-new-kid-on-the-block-spring-data-jdbc
Data Jpa가 domain mapping과 repository 연계만큼은 편하기 때문에 쓰고 있지만 사실 대다수의 기능을 잘 쓰지 않는다.
딱 거기까지만 쓰기 좋고 관계형 DB를 Java Object로 맵핑하기 위한 다양한 방법들은 복잡하고 영속성이라던가 그밖에 제공하는 다양한 개념들도 그렇게 까지 깊이 있게 쓰지 않았다.
그래서 기존에 사용하던 Data Jpa를 Data JDbc로 쉽게 바꿀 수 있을까 싶어 몇 가지 살펴보았다.
Spring Boot에서 Data Jdbc 사용하기
동일한 Spring Data 그룹이라 대다수의 설정은 거의 동일하다.
dependency를 추가하고
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
JavaConfig에서 @EnableJdbcRepositories 설정을 한다.
@Configuration
@EnableJdbcRepositories(basePackages = "net.bluesky.blog.repository")
public class DataJdbcConfig {
@Bean
NamedParameterJdbcOperations operations(@Qualifier("blogDataSource") DataSource blogDataSource) {
return new NamedParameterJdbcTemplate(blogDataSource);
}
@Bean
PlatformTransactionManager transactionManager(@Qualifier("blogDataSource") DataSource blogDataSource) {
return new DataSourceTransactionManager(blogDataSource);
}
}
그리고 data jpa를 쓰듯이 기존과 동일하게 domain repository를 사용하면 동작한다.
public class Blog {
@Id
private long id;
// .. 중간 생략
}
public interface BlogRepository extends CrudRepository<Blog, Long> {
}
Data Jpa에서 Data JDBC로 옮기면?
몇 가지 문제가 있어서 아직 제대로 옮기지 못했다.
- annotation 변경 처리 필요
Data Jpa의 경우 javax.persistence-api의 annotation을 쓴다.
그런데 Data Jdbc의 경우 spring-data-jdbc에서 제공하는 annotation을 써야 해서 전부 변경해야 한다.
@Table, @Column 은 spring-data-jdbc의 annotation으로 변경해야 하고 그 밖의 annotation은 모두 spring-data-commons에서 제공하는 annotation으로 변경해야 한다. - Table name 호출 문제
Data Jpa가 자동으로 만들어주는 테이블은 Blog라는 이름의 테이블이 만들어진다. (첫 글자가 대문자)
그런데 동일한 Domain을 Data Jdbc에서 호출하면 blog라는 이름의 테이블을 호출한다.
MsSQL처럼 대소문자 구분이 없으면 호출에 문제가 없지만 MySQL, MariaDb는 바로 문제가 발생한다.
@Table("Blog")와 같이 재지정해야 해결된다.
이름 관련 기본 처리 규칙이 다른 듯한데 확인이 필요하다. - column name 호출 문제
Jpa에서 자동으로 만들어주는 테이블의 경우 createdDate 란 이름의 칼럼은 createdDate라는 이름 그대로 칼럼을 만들어준다.
참조 타입의 칼럼명에 _ 를 쓰려면 @Column을 사용해서 이름을 지정한다.
Data Jdbc에선 name 중간에 대문자가 있으면 _소문자로 기본 변환한다. (칼럼명 생성 규칙이 반대로 되어 있는 것 같은?)
createdDate는 created_date로 쿼리를 만든다.
@Column("createdDate")과 같이 재지정해야 해결된다. - UUID default value 처리는?
Data Jpa에서 UUID를 id로 사용하고 기본값 생성 처리를 하는 경우 다음처럼 사용했다.위처럼 사용하면 java에서 insert 시 id를 생성해주고 db는 16 길이의 binary 칼럼에 저장했다.
Data Jdbc의 경우 JdbcSimpleTypes에 UUID Type이 등록은 되어 있다.
하지만 @GeneratedGenerator를 쓸 수 없고 현재 안내는 BeforeSave Event를 쓰라고 되어있어 그리 깔끔한 방법은 아닌 것 같다.
https://docs.spring.io/spring-data/jdbc/docs/1.0.9.RELEASE/reference/html/#jdbc.events
그리고 이벤트 핸들러는 동작해도 실제 UUID 타입이 binary 16 length 칼럼에 저장이 올바르게 되지 않는다.
varchar로 바꾼 경우 저장은 된다.
이 부분은 추후 지원이 되거나 해야 좀 더 쓸만하지 않을까 싶다. @Entity public class Blog { @Id @GeneratedValue(generator = "uuid-gen") @GenericGenerator(name = "uuid-gen", strategy = "uuid2") @Column(length = 16) private UUID id; // 이하 생략 }
- audit는?
이 부분도 올바르게 동작하지 않는다.
문서상 지원한다고 되어 있는데 어떤 설정이 문제인 건지 확인은 하지 못했다.
결론?
현재 버전의 spring data jdbc를 쓰려면 아예 새로 만드는 경우 사용을 고려하는 편이 좋을 것 같다.
Data Jpa 였던 걸 옮기려면 상당히 많이 바꿔야 한다.
지원이 불편한 부분은 버전이 올라가면 해결되지 않을까 싶다.
기능 상 Data JDBC가 Data Jpa를 대체할 수 있는 모듈인 건 맞지만 마이그레이션은 현재 불편하다.
'Study > Java' 카테고리의 다른 글
Spring Boot 2.2 Release Notes (0) | 2019.10.18 |
---|---|
JDK 13 New Features (0) | 2019.09.25 |
thymeleaf-layout-direct 성능 문제 (groovy 성능 문제) (0) | 2019.09.24 |
STS 4.4.0 (eclipse 2019-09) 에서 Junit 5 실행 시 PreconditionViolationException NoClassDefFoundError 에러 발생하는 경우 (0) | 2019.09.20 |
Spring RestTemplate으로 요청 시 302 redirect 된 페이지의 response 결과받기 (0) | 2019.08.09 |
JDK 12 New Features (0) | 2019.07.18 |
Spring Boot servlet filter 사용하기 (0) | 2019.07.03 |
RestTemplate 응답 log 확인하기 (0) | 2019.06.20 |
Asciidoc 문서 작성을 위한 프로젝트 경로 설정 팁 (0) | 2019.06.19 |
Eclipse (STS) 메모리 설정 이후 응답 없음 현상 (0) | 2019.06.17 |