새 프로젝트의 경우 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 기술은 필요한 것을 적절한 속도로 정확하게 제공하는 데 큰 도움이됩니다.