데이터 접근 객체

소프트웨어에서 데이터 접근 객체(, DAO)는 특정 유형의 데이터베이스나 기타 지속성 메커니즘에 추상 인터페이스를 제공하는 패턴이다. 애플리케이션 호출을 지속성 계층으로 매핑함으로써, DAO는 데이터베이스의 세부 사항을 노출하지 않고 데이터 작업을 제공한다. 이러한 격리는 단일 책임 원칙을 지원한다. 이는 애플리케이션에 필요한 데이터 접근을 도메인 특정 객체 및 데이터 유형(DAO의 공용 인터페이스) 관점에서, 이러한 요구사항이 특정 DBMS로 충족되는 방식(DAO의 구현)과 분리한다.

이 디자인 패턴은 대부분의 프로그래밍 언어, 지속성이 필요한 대부분의 소프트웨어, 그리고 대부분의 데이터베이스에 적용 가능하지만, 전통적으로 Java EE 애플리케이션 및 관계형 데이터베이스(썬 마이크로시스템즈의 모범 사례 가이드라인 "Core J2EE Patterns"에 기원하여 JDBC API를 통해 접근됨)와 관련이 깊다.

이 객체는 3계층 구조의 데이터 접근 계층에서 찾아볼 수 있다.

이 객체를 구현하는 방법은 다양하다:
 각 테이블당 하나의 DAO.
 특정 DBMS의 모든 테이블당 하나의 DAO.
 SELECT 쿼리가 대상 테이블로만 제한되고 JOIN, UNION, 서브쿼리 및 공통 테이블 표현식(CTE)을 포함할 수 없는 경우.
 SELECT 쿼리에 DBMS가 허용하는 모든 것을 포함할 수 있는 경우.

 장점 
데이터 접근 객체(DAO)를 사용하는 것은 분명한 장점을 제공한다. 서로에 대해 알 필요가 없는 애플리케이션의 두 부분을 분리하는 것이다. 이러한 분리를 통해 두 부분은 독립적으로 진화할 수 있다. 비즈니스 로직이 변경되더라도 일관된 DAO 인터페이스에 의존할 수 있다. 한편, 지속성 로직에 대한 수정은 DAO 클라이언트에 영향을 주지 않는다.

저장소의 모든 세부 사항은 애플리케이션의 나머지 부분으로부터 숨겨진다(정보 은닉 참조). 테스트에서 DAO를 테스트 더블로 대체함으로써 유닛 테스트 코드가 용이해지며, 결과적으로 테스트를 지속성 계층으로부터 독립적으로 만들 수 있다.

자바 프로그래밍 언어의 맥락에서 DAO는 다양한 방식으로 구현될 수 있다. 이는 데이터 접근을 애플리케이션 로직에서 분리하는 상당히 단순한 인터페이스부터 프레임워크 및 상용 제품에 이르기까지 다양하다.

자바 퍼시스턴스 API(JPA) 및 엔터프라이즈 자바빈즈와 같은 기술은 애플리케이션 서버에 내장되어 있으며 Java EE 애플리케이션 서버를 사용하는 애플리케이션에서 사용될 수 있다. 객체 관계 매핑(ORM)을 기반으로 하는 탑링크와 같은 상용 제품도 사용 가능하다. 대중적인 오픈 소스 ORM 소프트웨어로는 Doctrine, Hibernate, iBATIS 및 Apache OpenJPA와 같은 JPA 구현체가 있다.

 단점 
DAO 사용의 잠재적인 단점으로는 추상화 누수(leaky abstraction), 중복 코드, 그리고 추상화 역전(abstraction inversion)이 있다. 특히 DAO를 일반적인 자바 객체로 추상화하면 각 데이터베이스 접근의 높은 비용이 가려질 수 있다. 개발자들은 단일 작업으로 반환될 수 있는 정보를 검색하기 위해 무심코 여러 번의 데이터베이스 쿼리를 수행할 수 있다. 애플리케이션에 여러 개의 DAO가 필요한 경우, 각 DAO마다 동일한 생성, 읽기, 갱신, 삭제 코드를 작성해야 할 수도 있다.해결 방법은 http://www.ibm.com/developerworks/java/library/j-genericdao/index.html 참조

이러한 단점들은 각 테이블마다 별도의 DAO가 있고 SELECT 쿼리가 대상 테이블 이외의 다른 것에 접근하는 것이 방지될 때만 나타난다는 점에 유의해야 한다.

 도구 및 프레임워크 
 ODB: C++용 컴파일러 기반 객체 관계 매핑(ORM) 시스템
 ORMLite: JDBC 및 안드로이드를 위한 자바 기반 경량 객체 관계 매핑(ORM) 프레임워크
 마이크로소프트 엔티티 프레임워크
 DBIx::Class: 펄용 객체 관계 매핑(ORM) 모듈
 TuxORM: JDBC를 위한 자바 기반 단순 객체 관계 매핑(ORM) 라이브러이
 퍼시스트 (자바 도구): 자바 기반 객체 관계 매핑 및 데이터 접근 객체 도구

 같이 보기 
 CRUD(Create, read, update and delete)
 서비스 데이터 객체

 각주 

 외부 링크 
 Java Persistence - The DAO Design Pattern
 PHP best practices (Use Data Access Objects (DAO))

분류:소프트웨어 디자인 패턴
분류:아키텍처 패턴