JPA 대 Spring JdbcTemplate [닫힌]


84

새 프로젝트의 경우 JPA가 항상 관계형 데이터를 처리하는 데 권장되는 도구이거나 Spring JdbcTemplate이 더 나은 선택 인 시나리오가 있습니까? 답변에서 고려해야 할 몇 가지 요소 :

  • 새로운 데이터베이스 스키마와 기존 스키마 및 테이블
  • 개발자 전문성 수준
  • 데이터 캐싱 레이어와 쉽게 통합 할 수 있습니다.
  • 공연
  • 고려해야 할 다른 관련 요소가 있습니까?

2
고려해야 할 추가 요소 중 하나는 표준화입니다.
Eldad Mor

답변:


145

도메인 모델을 통해 데이터베이스 스키마에 액세스하지 않으려면 Spring JdbcTemplate을 사용하십시오. JdbcTemplate을 사용하면 더 많은 유연성을 가진 더 낮은 수준의 액세스를 사용하지만 아마도 더 많은 상용구를 사용할 수 있습니다.

Spring JdbcTemplate은 이국적인 데이터베이스 스키마 및 저장 프로 시저 포커스와 함께 더 쉽게 사용할 수 있습니다. JPA를 사용하면 데이터베이스 스키마가 도메인 모델에 올바르게 매핑되는지 확인해야합니다.

두 기술 모두 관계형 데이터베이스, SQL 및 트랜잭션을 알고있는 개발자가 필요합니다. JPA를 사용하면 더 많은 숨겨진 복잡성을 얻을 수 있습니다.

JPA는 객체 지향 초점이 캐시 항목 식별, 업데이트 및 무효화를 더 쉽게 만들어주기 때문에 데이터 캐싱 레이어에 더 쉽게 연결할 수 있습니다.

JdbcTemplate 기반 백엔드를 더 잘 조정할 수 있지만 대부분의 경우 더 많은 코드가 관련됩니다.

고려해야 할 몇 가지 다른 측면은 JPA를 사용하면 데이터베이스 스키마에 대한 도메인 모델을 얻을 수 있지만 종종 추가 DTO 클래스를 사용해야한다는 것입니다. JdbcTemplate을 사용하면 DTO 클래스로 직접 작업 할 수 있습니다.


4
관계형 데이터베이스, SQL 및 트랜잭션을 알아야하는 개발자에 대한 +1 포인트. 그러나 JPA를 사용하면 지속성 레이어를 테이블이 아닌 테이블이 지원하는 객체로 취급 할 수 있습니다.
Michael Wiles 2011 년

@Timo 나는 이것을 연결 풀 관점으로 이해하려고 노력하고 있습니다. 그렇다면 JPA는 연결 풀링이있는 HikarCP와 같은 데이터 소스를 가질 수 있습니까? 또는 그 자체 JPA 핸들에게 그것을 수행
Joey587

76

이 게시물에 조금 늦었지만 ORM보다 JdbcTemplate을 사용하는 경향이 있습니다. 나는 SQL (아주 잘 알고 있음)을 알고 있으며 실제로 내 DB에서 "추상"되는 것을 원하지 않습니다. 대부분의 시간 동안 내 앱은 대부분의 비즈니스 로직을 적용하는 DB 뷰를 사용하고 있습니다. JdbcTemplate 구현이있는 적절하게 계층화 된 DAO가 있습니다. "깨끗한"느낌이 들었고 대부분의 상용구 코드는 JdbcTemplate에 의해 숨겨져 있습니다 (그리고 온라인 문서는 ORM보다 훨씬 나아 보입니다). 제한된 시간 동안 Hibernate와 같은 것을 사용했고, 작동 할 때 발견했고 시간을 절약했습니다.하지만 제대로 작동하지 않을 때는 "WTF"디버깅에 며칠이 걸렸습니다. JdbcTemplate DAO impls를 디버깅하는 데 20 분 이상을 소비 할 필요가 없었습니다. 다른 사람들이 언급했듯이 핵심은 SQL / Schema Design에 얼마나 익숙한 지입니다.


48

@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을 사용하는 선택에서 한 세트의 복잡성을 다른 세트와 거래하고 있습니다.


9
결말 문장은 +1. 일반적으로 jdbc와 orm 사이의 결정이며 JPA와 JdbcTemplate에 국한되지 않습니다.
Parvez

2
메모리 풋 프린트는 어떻습니까? JdbcTemplate과 Spring-Data-Jpa 사이에 큰 차이점이 있습니까? (최대 절전 모드로 내가 추측)
면도칼

36

다른 답변에는 언급되어 있지 않지만 둘 다 사용하는 것이 좋습니다. 내 앱에서는 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을 사용하십시오.


20
의 줄 getSomeReport()this.jdbcTemplate. ...아니라이어야 this.entityManager. ...합니까?
Jan Zyka 2014 년

XML을 사용하지 않고 주석 만 사용할 때 JdbcTemplate 빈을 어떻게 선언합니까? Spring에 의해 자동으로 수행되지 않습니다. NoSuchBeanDefinitionException이 발생합니다. [org.springframework.jdbc.core.JdbcTemplate] 유형의 한정 빈이 없습니다
xtian

5

직장에서 우리는 더 많은 유연성을 가지고 있기 때문에 Hibernate JDBCTemplate을 사용합니다. 또한 불필요한 데이터를 많이 앱에 "로드"하지 않기 때문에 JPA보다 성능이 더 좋습니다.
JDBCTemplate의 경우 SQL 기술은 필요한 것을 적절한 속도로 정확하게 제공하는 데 큰 도움이됩니다.


1
좋은 날, '최대 절전 모드 jdbctemplate'을 명확히 해 주시겠습니까? Hibernate와 Spring JDBCTemplate 또는 다른 것의 조합?
qizer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.