새 프로젝트의 경우 JPA가 항상 관계형 데이터를 처리하는 데 권장되는 도구이거나 Spring JdbcTemplate이 더 나은 선택 인 시나리오가 있습니까? 답변에서 고려해야 할 몇 가지 요소 :
- 새로운 데이터베이스 스키마와 기존 스키마 및 테이블
- 개발자 전문성 수준
- 데이터 캐싱 레이어와 쉽게 통합 할 수 있습니다.
- 공연
- 고려해야 할 다른 관련 요소가 있습니까?
답변:
도메인 모델을 통해 데이터베이스 스키마에 액세스하지 않으려면 Spring JdbcTemplate을 사용하십시오. JdbcTemplate을 사용하면 더 많은 유연성을 가진 더 낮은 수준의 액세스를 사용하지만 아마도 더 많은 상용구를 사용할 수 있습니다.
Spring JdbcTemplate은 이국적인 데이터베이스 스키마 및 저장 프로 시저 포커스와 함께 더 쉽게 사용할 수 있습니다. JPA를 사용하면 데이터베이스 스키마가 도메인 모델에 올바르게 매핑되는지 확인해야합니다.
두 기술 모두 관계형 데이터베이스, SQL 및 트랜잭션을 알고있는 개발자가 필요합니다. JPA를 사용하면 더 많은 숨겨진 복잡성을 얻을 수 있습니다.
JPA는 객체 지향 초점이 캐시 항목 식별, 업데이트 및 무효화를 더 쉽게 만들어주기 때문에 데이터 캐싱 레이어에 더 쉽게 연결할 수 있습니다.
JdbcTemplate 기반 백엔드를 더 잘 조정할 수 있지만 대부분의 경우 더 많은 코드가 관련됩니다.
고려해야 할 몇 가지 다른 측면은 JPA를 사용하면 데이터베이스 스키마에 대한 도메인 모델을 얻을 수 있지만 종종 추가 DTO 클래스를 사용해야한다는 것입니다. JdbcTemplate을 사용하면 DTO 클래스로 직접 작업 할 수 있습니다.
이 게시물에 조금 늦었지만 ORM보다 JdbcTemplate을 사용하는 경향이 있습니다. 나는 SQL (아주 잘 알고 있음)을 알고 있으며 실제로 내 DB에서 "추상"되는 것을 원하지 않습니다. 대부분의 시간 동안 내 앱은 대부분의 비즈니스 로직을 적용하는 DB 뷰를 사용하고 있습니다. JdbcTemplate 구현이있는 적절하게 계층화 된 DAO가 있습니다. "깨끗한"느낌이 들었고 대부분의 상용구 코드는 JdbcTemplate에 의해 숨겨져 있습니다 (그리고 온라인 문서는 ORM보다 훨씬 나아 보입니다). 제한된 시간 동안 Hibernate와 같은 것을 사용했고, 작동 할 때 발견했고 시간을 절약했습니다.하지만 제대로 작동하지 않을 때는 "WTF"디버깅에 며칠이 걸렸습니다. JdbcTemplate DAO impls를 디버깅하는 데 20 분 이상을 소비 할 필요가 없었습니다. 다른 사람들이 언급했듯이 핵심은 SQL / Schema Design에 얼마나 익숙한 지입니다.
@Timo에 동의합니다. 내가 추가 / 확장 할 유일한 다른 통찰력은 ORM이 데이터에 대한 순수한 SQL 액세스와 다른 의미를 가지고 있다는 것입니다.
ORM의 요점은 데이터가 가능한 한 DB에 있다는 사실을 추상화하는 것입니다. ORM을 적절하게 사용하면 모든 지속성 작업이 하나의 얇은 레이어에서 처리됩니다. 모델 객체에는 지속성 코드가 거의 없거나 전혀 없습니다. ORM을 사용하고 있다는 사실은 모델에 표시되지 않아야합니다.
이 때문에 ORM은 특정 유형의 작업, 즉 간단한 CRUD 작업을 쉽게 수행 할 수 있습니다. 모델 객체를로드하고, 제시하고, 업데이트하고, 아주 쉽게 삭제할 수 있습니다. 데이터에 액세스 할 때 비즈니스 논리를 작성할 수있는 모델 개체를 다시 가져 오기 때문에 생활이 더 쉬워집니다. JDBC를 사용하는 경우 데이터에서 개체 인스턴스를 '수화'해야하므로 복잡하고 오류가 발생하기 쉽습니다.
ORM이 항상 최선의 선택은 아닙니다. JPA는 작업을위한 도구입니다. 도구가 작업에 충분하지 않은 경우 더 나은 도구를 찾고 싶을 것입니다. 예를 들어, 전체 개체 그래프를 복사하고 해당 개체의 새 복사본을 저장해야하는 시나리오가있었습니다. 내가 시도한 것처럼 ORM을 사용했다면 DB에서 모든 개체를로드 한 다음 복사 한 다음 새 개체를 저장해야했습니다. 너무 오래 걸렸습니다.
더 나은 해결책은 단순히 jdbc 기반 작업을 사용하고 'select via select'SQL 호출을 사용하여 새 행을 만드는 것입니다. 빠르고 코드가 더 간단했습니다.
고려해야 할 또 다른 사항은 JDBC에 익숙하고 기한이 있으며 ORM 악 대차에 뛰어들 필요가 없다는 것입니다. Spring JdbcTemplate 클래스는 매우 강력하고 유용합니다. 때로는 작업에 가장 적합한 도구는 알고있는 도구입니다. ORM에 익숙해 져야하지만 기대치가 높은 프로젝트에 반드시 필요한 것은 아닙니다. 배워야 할 것이 많고 사소한 것은 아닙니다. 실제로 jdbc와 orm을 사용하는 선택에서 한 세트의 복잡성을 다른 세트와 거래하고 있습니다.
다른 답변에는 언급되어 있지 않지만 둘 다 사용하는 것이 좋습니다. 내 앱에서는 JPA와 JdbcTemplate을 사용하고, crud 유형 작업에는 JPA를 사용하지만보고에는 jdbcTemplate을 사용합니다.
@Repository
public class FooRepository
{
@PersistenceContext
private EntityManager entityManager;
@Autowired(required = true)
private JdbcTemplate jdbcTemplate;
public void saveFoo(Foo foo)
{
this.entityManager.persist(foo);
}
public List<SomeReportPojo> getSomeReport()
{
return this.jdbcTemplate.queryForList("SELECT .. ",SomeProjectPojo.class);
}
}
Spring의 가장 큰 장점은 JPA 예외에서 Spring Dao 예외 계층 구조로의 예외 변환이 JPA와 jdbcTemplate 모두에서 작동한다는 것입니다. 따라서 의미가 있으면 JPA를 사용하고 의미가 있으면 jdbcTemplate을 사용하십시오.
getSomeReport()이 this.jdbcTemplate. ...아니라이어야 this.entityManager. ...합니까?
직장에서 우리는 더 많은 유연성을 가지고 있기 때문에 Hibernate JDBCTemplate을 사용합니다. 또한 불필요한 데이터를 많이 앱에 "로드"하지 않기 때문에 JPA보다 성능이 더 좋습니다.
JDBCTemplate의 경우 SQL 기술은 필요한 것을 적절한 속도로 정확하게 제공하는 데 큰 도움이됩니다.