복붙노트

[SPRING] Spring DAO 대 Spring ORM 대 Spring JDBC

SPRING

Spring DAO 대 Spring ORM 대 Spring JDBC

Spring에서 지원하는 데이터 액세스 기술을 검토 중이 었는데 여러 가지 옵션이 있음을 알았습니다. 그 중 여러 가지 옵션에 대해 잘 모르겠습니다.

내가 알고 있듯이, Spring JDBC는 평범한 구식을 통해 데이터베이스에 액세스하기위한 상용구 코드를 줄이기위한 템플릿을 제공한다. 사용자가 직접 SQL 쿼리를 작성한다.

Spring-ORM은 Hibernate, My (i) Batis 등과 같은 ORM 기술을 통해 데이터베이스에 액세스하기위한 단순화 된 템플릿을 제공합니다.

Spring 웹 사이트 당 Spring DAO :

나는 DB에 접근하는 다른 방법을 목표로하기 때문에 ORM 대 JDBC에 대해 약간 명확하다. 하지만 Spring-DAO는 당연히 혼란 스럽습니다!

아무도 정확하게이 세 가지 사이의 차이점을 명확히 해 줄 수 있습니까? 어떤 시나리오에서 어느 것이 선호되어야 하는가?

또한 Spring-DATA도 사용할 수있는 또 다른 프로젝트가 있습니다. (http://projects.spring.io/spring-data/) 이제 스프링에 의해 지원되는 모든 데이터 액세스 기술에 대한 부모 프로젝트가 될까요? 봄 DAO의 이름?

해결법

  1. ==============================

    1.다음은 언급 된 각 기술에 대한 소개입니다.

    다음은 언급 된 각 기술에 대한 소개입니다.

    봄 - DAO

    Spring-DAO는 봄 모듈이라는 엄격한 표준이 아니라, DAO를 작성하고 잘 쓰도록 지시해야하는 규칙입니다. 따라서 데이터에 액세스하기위한 인터페이스 나 구현 또는 템플릿을 제공하지 않습니다. DAO를 작성할 때 @Repository 주석을 달아서 기본 기술 (JDBC, Hibernate, JPA 등)에 링크 된 예외가 적절한 DataAccessException 하위 클래스로 일관되게 변환되도록해야합니다.

    예를 들어, 당신이 지금 Hibernate를 사용하고 있다고 가정하고, 당신의 서비스 계층이 HibernateException을 잡아서 그것에 반응하도록하십시오. JPA로 변경하면 DAO 인터페이스가 변경되어서는 안되며 HibernateException을 포착하는 블록으로 서비스 계층을 계속 컴파일하지만 DAO가 이제 JPA PersistenceException을 던지면서 이러한 블록을 입력하지 않습니다. DAO에서 @Repository를 사용하면 기본 기술과 연결된 예외가 Spring DataAccessException으로 변환됩니다. 서비스 레이어가 이러한 예외를 포착하고 지속성 기술을 변경하기로 결정한 경우 봄이 기본 예외를 번역 할 때 동일한 Spring DataAccessExceptions이 여전히 발생합니다.

    그러나 다음과 같은 이유로 사용이 제한됩니다.

    Spring-JDBC

    Spring-JDBC는 배관 코드를 제거하고 SQL 쿼리와 매개 변수에 집중하는 데 도움이되는 JdbcTemplate 클래스를 제공합니다. DataSource로 구성하기 만하면 다음과 같은 코드를 작성할 수 있습니다.

    int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
    
    Person p = jdbcTemplate.queryForObject("select first, last from person where id=?", 
                 rs -> new Person(rs.getString(1), rs.getString(2)), 
                 134561351656L);
    

    Spring-JDBC는 또한 JdbcDaoSupport를 제공하여 DAO 개발을 확장 할 수있다. 그것은 기본적으로 두 개의 속성을 정의합니다 : DAO 메소드를 구현하는 데 사용할 수있는 DataSource와 JdbcTemplate. 또한 SQL 예외에서 Spring DataAccessExceptions에 대한 예외 변환기를 제공합니다.

    일반 JDBC를 사용하려는 경우이 모듈을 사용해야합니다.

    봄-ORM

    Spring-ORM은 JPA, JDO, Hibernate 및 iBatis와 같은 많은 지속성 기술을 포괄하는 우산 모듈입니다. 이러한 각 기술에 대해 Spring은 통합 클래스를 제공하여 각 기술을 Spring 구성 원칙에 따라 사용할 수 있으며 Spring 트랜잭션 관리와 원활하게 통합 할 수 있습니다.

    각 기술에서, 구성은 기본적으로 DataSource bean을 일종의 SessionFactory 또는 EntityManagerFactory 등의 bean에 주입하는 것으로 구성됩니다. 순수 JDBC의 경우, JDBC는 DataSource에만 의존하기 때문에 이러한 통합 클래스 (JdbcTemplate 제외)는 필요하지 않습니다.

    JPA 나 Hibernate와 같은 ORM을 사용할 계획이라면 spring-jdbc는 필요 없지만이 모듈 만 필요합니다.

    봄 데이터

    Spring-Data는 SQL과 NOSQL 데이터 소스 모두를 포괄하는보다 일반적인 방법으로 데이터 (DAO + annotation)에 액세스하는 방법을 정의하는 공통 API를 제공하는 포괄적 인 프로젝트입니다.

    초기 아이디어는 개발자가 DAO (파인더 메소드)와 엔티티 클래스를 기술에 구애받지 않는 방식으로 작성하고, 구성 (DAO 및 엔티티에 대한 주석 + 스프링 구성)에 따라 기술을 제공하는 것입니다 xml 또는 java 기반), JPA (SQL) 또는 redis, hadoop 등 (NOSQL) 구현 기술을 결정합니다.

    파인더 메소드 이름에 대해 봄에 정의 된 명명 규칙을 따르는 경우 가장 간단한 경우 파인더 메소드에 해당하는 쿼리 문자열을 제공 할 필요조차 없습니다. 다른 경우에는 finder 메소드에서 주석 내부에 쿼리 문자열을 제공해야합니다.

    응용 프로그램 컨텍스트가로드되면 spring은 DAO 인터페이스에 대한 프록시를 제공하고 데이터 액세스 기술과 관련된 상용구 코드를 모두 포함하며 구성된 쿼리를 호출합니다.

    Spring-Data는 비 SQL 기술에 중점을두고 있지만 여전히 JPA (유일한 SQL 기술) 용 모듈을 제공합니다.

    무엇 향후 계획

    이 모든 것을 알면 무엇을 골라야할지 결정해야합니다. 여기서 좋은 소식은 당신이 기술에 대한 결정적인 최종 선택을 할 필요가 없다는 것입니다. 실제로 Spring Power가있는 곳입니다. 개발자는 코드를 작성할 때 비즈니스에 집중하고 잘 수행하면 기본 기술을 변경하는 것이 구현 또는 구성 세부 사항입니다.

    참고 : 트랜잭션 관리

    Spring은 트랜잭션 관리를위한 API를 제공한다. 데이터 접근을 위해 스프링을 사용할 계획이라면 트랜잭션 관리를 위해 봄을 사용해야한다. Spring에서 지원하는 각 데이터 액세스 기술에는 로컬 트랜잭션을위한 일치하는 트랜잭션 관리자가 있거나 분산 트랜잭션이 필요한 경우 JTA를 선택할 수 있습니다. 이들 모두는 동일한 API를 구현하므로 기술 선택은 비즈니스 코드에 영향을 미치지 않고 변경 될 수있는 구성에 불과합니다.

    참고 : Spring 설명서

    언급 한 Spring 문서에 대한 링크는 다소 오래되었다. 다음은 최신 릴리스의 문서입니다 (4.1.6, 모든 항목 포함).

    Spring 데이터는 Spring 프레임 워크의 일부가 아니다. 원칙에 익숙해지기 위해 먼저 읽어야 할 공통 모듈이 있습니다. 문서는 다음에서 찾을 수 있습니다.

  2. ==============================

    2.Spring DAO (Data Access Object) : JDBC 구현 프레임 워크에 추상 인터페이스를 제공하는 객체, 즉 Spring DAO는 개별 지원 클래스를 사용하여 JDBC 및 Hibernate, MyBatis, JPA, JDO에 액세스하는 일반화 된 개념입니다. 또한 @Repository 주석을 정의하여 일반화 된 예외 계층 구조를 제공합니다. 이 주석은 SQLException에서 Spring의 데이터 액세스 전략에 무관 한 DataAccessException 계층 구조로의 SQL 예외 변환을위한 Spring 컨테이너에 정의된다.

    Spring DAO (Data Access Object) : JDBC 구현 프레임 워크에 추상 인터페이스를 제공하는 객체, 즉 Spring DAO는 개별 지원 클래스를 사용하여 JDBC 및 Hibernate, MyBatis, JPA, JDO에 액세스하는 일반화 된 개념입니다. 또한 @Repository 주석을 정의하여 일반화 된 예외 계층 구조를 제공합니다. 이 주석은 SQLException에서 Spring의 데이터 액세스 전략에 무관 한 DataAccessException 계층 구조로의 SQL 예외 변환을위한 Spring 컨테이너에 정의된다.

    플랫폼 별 예외는 캐치 (catch) 된 다음 스프링의 검사되지 않은 데이터 액세스 예외 중 하나로 다시 throw됩니다.

    스프링 JDBC : 일반 JDBC의 경우이 모듈을 사용합니다.이 모듈은 크로스 커팅 문제를 줄이기 위해 JdbcTemplate, NamedParameterJdbcTemplate (JdbcTemplate 랩핑) 및 SimpleJdbcTemplate과 같은 DataSource 및 Template 클래스에만 의존합니다.

    public class EmployeeDao {  
    private JdbcTemplate jdbcTemplate;  
    
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  
        this.jdbcTemplate = jdbcTemplate;  
    }  
    
    public int saveEmployee(Employee e){  
        return jdbcTemplate.update(query);  
    }  
    public int updateEmployee(Employee e){  
        return jdbcTemplate.update(query);  
    }  
    public int deleteEmployee(Employee e){  
           return jdbcTemplate.update(query);  
    }  
    
    }  
    

    스프링 XML :

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    

    Spring JDBC는 또한 JdbcDaoSupport, NamedParameterJdbcDaoSupport, SimpleJdbcDaoSupport를 제공하는데, 이는 다음과 같이 우리 자신의 DAO 추상 인터페이스를 확장하고 개발할 수있는 (즉, 편리한) 방법이다 :

    public interface EmployeeDao {
    
        public void saveEmployee(Employee emp);
    }
    
    public class EmployeeDaoImpl extends JdbcDaoSupport implements EmployeeDao{
    
        @Override
        public void saveEmployee(Employee emp) {
    
            Object[] inputs = new Object[] {emp.getName(), emp.getSalary(), emp.getDept()};
            getJdbcTemplate().update(query, inputs);
        }
    }
    

    봄철 XML :

    <bean id="employeeDAO" class="EmployeeDaoImpl">
            <property name="dataSource" ref="dataSource" />
        </bean>
    

    Spring ORM : Hibernate, JPA, MyBatis와 같은 ORM 도구 지원을 위해 ... DataSource를 다음 클래스 및 해당 DaoSupport 클래스와 함께 주입하여 Spring을 쉽게 통합합니다.

  3. ==============================

    3.SomeObjectDao와 같은 인터페이스를 생성 한 다음 JdbcSomeObjectDao, HibernateSomeObjectDao와 같은이 인터페이스의 다른 구현을 작성합니다. 그런 다음 SomeObjectService 클래스에서 SomeObjectDao 인터페이스에서 작동하고 구체적인 구현 중 하나를 주입합니다. 따라서 SomeObjectDao의 각 구현은 JDBC 또는 ORM 등을 사용하여 세부 사항을 숨 깁니다.

    SomeObjectDao와 같은 인터페이스를 생성 한 다음 JdbcSomeObjectDao, HibernateSomeObjectDao와 같은이 인터페이스의 다른 구현을 작성합니다. 그런 다음 SomeObjectService 클래스에서 SomeObjectDao 인터페이스에서 작동하고 구체적인 구현 중 하나를 주입합니다. 따라서 SomeObjectDao의 각 구현은 JDBC 또는 ORM 등을 사용하여 세부 사항을 숨 깁니다.

    일반적으로 JDBC와 ORM의 다른 구현은 다른 종류의 예외를 throw합니다. Spring의 DAO 지원은 다른 기술 특정 예외를 일반적인 Spring DAO 예외에 매핑 할 수있다. 따라서 실제 구현에서 더 많이 분리됩니다. 또한 Spring의 DAO 지원은 DAO 개발에 도움이되는 추상 * DataSupport 클래스 세트를 제공합니다. SomeObjectDao 인터페이스를 구현하는 것 외에도 Spring의 * DataSupport 클래스 중 하나를 확장 할 수 있습니다.

  4. ==============================

    4.추가 정보. 스프링 데이터 JPA를 사용하는 것이 좋습니다. @Repository, @Service와 같은 주석을 사용합니다. 예를 보여 드리겠습니다.

    추가 정보. 스프링 데이터 JPA를 사용하는 것이 좋습니다. @Repository, @Service와 같은 주석을 사용합니다. 예를 보여 드리겠습니다.

    @Repository("customerEntitlementsRepository")
    public interface CustomerEntitlementsRepository extends CrudRepository<BbsExerul, BbsExerulPK> {
    
      @Query(value = "SELECT " + "CONTRACT_NUMBER, EXECUTIVE_NUMBER, " + "GROUP_VALUE, " + "CODE, "
          + "SUBCODE, " + "CURRENCY " + "FROM BBS_EXERUL " + "WHERE CONTRACT_NUMBER =:clientId AND "
          + "EXECUTIVE_NUMBER =:representativeId", nativeQuery = true)
      Collection<CustomerEntitlementsProjection> getFieldsExerul(@Param("clientId") String clientId,
          @Param("representativeId") String representativeId);
    
    }
    

    CustomerEntitlementsProjection은 여러분이 엔티티 또는 DTO pojo와 링크 된 Spring 프로젝션 인 경우;

    @Projection(name = "customerEntitlementsProjection", types = { BbsExerul.class })
    public interface CustomerEntitlementsProjection {
    
      String getContractNumber();
    
      String getExecutiveNumber();
    
  5. ==============================

    5.spring-dao lib는 버전 2.0.8 (2008 년 1 월)에서 중단되었습니다. spring-dao의 클래스는 spring-tx로 복사되었습니다. 따라서 스프링 - DAO에서 찾을 수있는 클래스가 필요한 경우 대신 spring-tx에 종속성을 추가하십시오. (출처.)

    spring-dao lib는 버전 2.0.8 (2008 년 1 월)에서 중단되었습니다. spring-dao의 클래스는 spring-tx로 복사되었습니다. 따라서 스프링 - DAO에서 찾을 수있는 클래스가 필요한 경우 대신 spring-tx에 종속성을 추가하십시오. (출처.)

  6. from https://stackoverflow.com/questions/24990400/spring-dao-vs-spring-orm-vs-spring-jdbc by cc-by-sa and MIT license