programing

스프링 DAO vs 스프링 ORM vs 스프링 JDBC

randomtip 2023. 3. 12. 21:11
반응형

스프링 DAO vs 스프링 ORM vs 스프링 JDBC

Spring에서 지원하는 데이터 액세스 기술을 살펴보았는데, 여러 옵션이 언급되어 있다는 것을 알게 되었고, 그 차이점에 대해서는 잘 모르겠습니다.

제가 알기로는 Spring JDBC는 데이터베이스 접근을 위한 상용 코드를 줄이기 위한 템플릿을 제공하고 있습니다.즉, 사용자가 직접 SQL 쿼리를 작성하는 것입니다.

Spring-ORM은 Hibernate, My(i)Batis 등의 ORM 테크놀로지를 통해 데이터베이스에 액세스하기 위한 심플한 템플릿을 제공합니다.

Spring 웹사이트에 따르면 Spring-DAO:

봄철 데이터 액세스 오브젝트(DAO) 지원은 JDBC, 휴지 상태 또는 JDO 등의 데이터 액세스 테크놀로지를 일관성 있게 사용하기 위한 것입니다.

ORM vs JDBC에 대해서는 DB에 액세스하는 방법이 다르기 때문에 조금 명확합니다.하지만 Spring-DAO는 너무 혼란스러워요!

이 세 가지 차이점이 정확히 무엇인지 누가 좀 설명해 주시겠습니까?어떤 시나리오에서 어떤 것이 더 좋습니까?

또 도 있습니다.Spring-DATA또한 이용 가능(http://projects.spring.io/spring-data/) Spring에서 지원하는 모든 데이터 액세스 기술자를 위한 일종의 부모 프로젝트입니까, 아니면 Spring-DAO의 새로운 이름입니까?

다음은 각 테크놀로지에 대한 소개입니다.

스프링-DAO

스프링 DAO는 엄밀한 의미에서 스프링모듈이 아니라 DAO를 쓰고 적절하게 쓰도록 지시하는 규칙입니다.따라서 데이터에 액세스하기 위한 인터페이스도 구현도 템플릿도 제공되지 않습니다.쓸 는 DAO로 합니다.@Repository이 되는 등)에는 항상 적절한 (JDBC, Hibernate, JPA 등)로DataAccessException서브클래스

들어, 레이어가 「」, 「 」, 「 」, 「 」를 캐치하고 합니다.HibernateException응하반 JPA를 잡는 됩니다.HibernateException, 가 JPA 「DAO」JPA 를 에, PersistenceException여 . . . .@Repository DAO로 됩니다.DataAccessException, Spring ;가 .DataAccessExceptions봄은 예외로 해석되기 때문에 여전히 던져질 것이다.

단, 다음과 같은 이유로 사용이 제한됩니다.

  1. 공급자가 트랜잭션을 롤백했을 가능성이 있으므로(정확한 예외 서브타입에 따라 다름), 대체 경로를 사용하여 실행을 계속하지 마십시오.
  2. 예외 계층은 일반적으로 Spring이 제공하는 것보다 프로바이더 내에서 더 풍부하며 프로바이더 간에 명확한 매핑은 없습니다.이것에 의존하는 것은 위험하다., DAO에 을 다는 것은 좋은 방법입니다.@Repository스캔 절차에 따라 콩이 자동으로 추가되기 때문입니다.또한 스프링은 주석에 다른 유용한 기능을 추가할 수 있습니다.

봄 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는 DAO 개발을 위해 확장할 수 있는 JdbcDao 지원도 제공합니다.기본적으로 DAO 메서드를 구현하기 위해 사용할 수 있는 DataSource와 JdbcTemplate의 2가지 속성을 정의합니다.또한 SQL 예외에서 spring Data Access로의 예외 변환 기능도 제공합니다.예외입니다.

플레인 jdbc를 사용할 계획이라면 이 모듈을 사용해야 합니다.

스프링-ORM

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

, 설정은 으로 「」, 「」, 「」, 「」, 「」, 「1」을 됩니다.DataSourceSessionFactory ★★★★★★★★★★★★★★★★★」EntityManagerFactory하기 때문에 JDBC는 통합 클래스가 순수 JDBC의 경우 JDBC는 DataSource에만 의존하기 때문에 JdbcTemplate와는 별도로 이러한 통합 클래스가 필요하지 않습니다.

JPA나 휴지 상태 등의 ORM을 사용할 경우 spring-jdbc는 필요 없고 이 모듈만 필요합니다.

스프링 데이터

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

초기 아이디어는 개발자가 아닌 DataO(Per 방법) 및 N-SCTY Corporation(Per 방법) 및 N-SCTY Corporation)에 기반하고 있습니다.가졌다oop 등 (NOSQL)

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

애플리케이션 컨텍스트가 로드되면 스프링은 데이터 액세스테크놀로지에 관련된 모든 보일러 플레이트코드를 포함하는 DAO 인터페이스에 프록시를 제공하고 설정된 쿼리를 호출합니다.

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

다음은?

이 모든 것을 알았으니 이제 무엇을 골라야 할지 결정해야 합니다.여기서 좋은 소식은 테크놀로지에 대해 최종적인 선택을 할 필요가 없다는 것입니다.스프링 파워는 실제로 여기에 있습니다.개발자로서 코드를 작성할 때 비즈니스에 집중합니다.실현할 수 있다면 기본 테크놀로지의 변경은 구현 또는 구성의 세부 사항입니다.

  1. 엔티티에 대한 POJO 클래스로 데이터 모델을 정의하고 엔티티 속성 및 다른 엔티티와의 관계를 나타내는 메서드를 가져오거나 설정합니다.테크놀로지에 근거해 엔티티 클래스나 필드에 주석을 달 필요가 있는 것은 확실합니다만, 현시점에서는 POJO만으로 충분합니다.지금은 비즈니스 요건에 집중하세요.
  2. DAO의 인터페이스를 정의합니다.1개의 DAO는 정확하게1개의 엔티티에 대응합니다만, 관계를 탐색하는 것으로 추가 엔티티를 로드할 수 있기 때문에, 각각의 엔티티에 대해 DAO는 필요 없습니다.엄격한 명명 규칙에 따라 파인더 방법을 정의합니다.
  3. 이를 바탕으로 다른 사용자가 DAO를 위한 mock을 사용하여 서비스 계층에서 작업을 시작할 수 있습니다.
  4. 다양한 지속성 기술(sql, no-sql)을 학습하여 요구에 가장 적합한 기술을 찾아 그 중 하나를 선택합니다.이를 기반으로 도면요소에 주석을 달아 DAO를 구현합니다(또는 스프링 데이터를 사용하도록 선택한 경우 스프링에서 DAO를 구현합니다).
  5. 비즈니스 요건이 진화하고 데이터 액세스 기술이 이를 지원하기에 충분하지 않은 경우(예: JDBC 및 일부 엔티티에서 시작했지만 이제 더 풍부한 데이터 모델이 필요하고 JPA가 더 나은 선택) DAO 구현, 엔티티에 대한 주석 몇 개 추가 및 스프링 구성 추가) DAO를 변경해야 합니다.Entity Manager Factory 정의).나머지 비즈니스 코드는 변경으로 인한 다른 영향을 받지 않습니다.

주의: 트랜잭션 관리

Spring은 트랜잭션 관리를 위한 API를 제공합니다.데이터 액세스에 스프링을 사용할 계획이라면 트랜잭션 관리에도 스프링을 사용해야 합니다. 스프링은 매우 잘 통합되기 때문입니다.봄부터 지원되는 각 데이터 액세스 기술에 대해 로컬 트랜잭션에 대한 매칭 트랜잭션 매니저가 있으며 분산 트랜잭션이 필요한 경우 JTA를 선택할 수 있습니다.모두 동일한 API를 구현하기 때문에 (다시 한 번) 비즈니스 코드에 더 이상 영향을 주지 않고 기술을 변경할 수 있는 구성일 뿐입니다.

주의: 스프링 매뉴얼

말씀하신 Spring 문서에 대한 링크는 오래된 것입니다.다음은 최신 릴리스(4.1.6, 모든 토픽 포함)의 매뉴얼입니다.

스프링 데이터는 스프링 프레임워크의 일부가 아닙니다.원리에 익숙해지려면 먼저 읽어야 하는 공통 모듈이 있습니다.메뉴얼은, 다음의 URL 에 있습니다.

  • 단일 html 페이지: http://docs.spring.io/spring-data/data-commons/docs/1.9.2.RELEASE/reference/html/
  • PDF: http://docs.spring.io/spring-data/data-commons/docs/1.9.2.RELEASE/reference/pdf/spring-data-commons-reference.pdf

Spring DAO(데이터 액세스 개체): JDBC 구현 프레임워크에 추상 인터페이스를 제공하는 개체입니다.Spring DAO는 JDBC 및 Hibernate, MyBatis, JPA, JDO에 개별 지원 클래스를 사용하여 액세스하기 위한 일반적인 개념입니다.또한 다음과 같이 정의함으로써 일반화된 예외 계층을 제공합니다.@Repository주석입니다.이 주석에서는 Spring 컨테이너에 sql sql 예외 변환을 Spring의 데이터 액세스 전략에 구애받지 않는 계층으로 정의합니다.

즉, 각 테크놀로지에 고유한 예외를 포착할 염려 없이 영구 프레임워크와 코드를 쉽게 전환할 수 있습니다.


JDBC:플레인 JDBC에서는 이 모듈을 사용합니다.이 모듈은 다음에 따라 달라집니다.DataSource( 「」등)JdbcTemplate,NamedParameterJdbcTemplate (비밀(이행)JdbcTemplate 및 )의 개요SimpleJdbcTemplate크로스 커팅 우려를 줄여줍니다.

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);  
}  
  
}  

및 Spring 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);
    }
}

및 spring XML:

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

Spring ORM: 휴지 상태, JPA, MyBatis 등의 ORM 툴을 지원하는 경우스프링을 주입하여 쉽게 통합DataSource DaoSupport②.

  • SessionFactory
  • EntityManagerFactory J의 경우PA 우 、
  • SqlSessionFactory

.SomeObjectDao 이 .JdbcSomeObjectDao,HibernateSomeObjectDao 당신의 그 your your your your SomeObjectService하는 SomeObjectDao이치 의 각 SomeObjectDaoJDBC, ORM 등 사용 여부에 관계없이 자세한 내용은 표시되지 않습니다.

보통 JDBC 및 ORM 구현에 따라 다른 종류의 예외가 발생합니다.스프링 DAO 지원은 이러한 다양한 기술별 예외를 일반적인 스프링 DAO 예외에 매핑할 수 있습니다.따라서 실제 구현에서 더 멀리 떨어져 있습니다.또한 Spring의 DAO 지원은 추상적인 기능을 제공합니다.*DataSupportDAO를 사용하다이 때문에, IT부문의 도입하는 것 외에,SomeObjectDaospring spring(봄의 봄) 중 할 수 .*DataSupport를 누릅니다

spring-dao lib는 버전 2.0.8(2008년1월)에서 정지되었습니다.춘도의 학급을 춘절로 베꼈다따라서 spring-dao에서 찾을 수 있는 클래스가 필요한 경우 대신 spring-tx에 종속성을 추가합니다.(출처).

추가 정보로서.Spring Data 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);

}

여기서 Customer Entitlements Projection은 스프링 프로젝션으로, 고객님의 엔티티 또는 DTO pojo와 링크되어 있습니다.

@Projection(name = "customerEntitlementsProjection", types = { BbsExerul.class })
public interface CustomerEntitlementsProjection {

  String getContractNumber();

  String getExecutiveNumber();

언급URL : https://stackoverflow.com/questions/24990400/spring-dao-vs-spring-orm-vs-spring-jdbc

반응형