Java의 데이터 액세스 오브젝트 (DAO)


347

나는 문서를 살펴보고라는 용어를 발견했습니다 DAO. 데이터 액세스 개체라는 것을 알았습니다. 누군가 이것이 실제로 무엇인지 설명해 주시겠습니까?

나는 그것이 다른 유형의 소스에서 데이터에 액세스하기위한 일종의 인터페이스라는 것을 알고 있습니다.이 작은 연구 중 데이터 소스 또는 데이터 소스 객체라는 개념에 부딪 쳤고 일이 엉망이되었습니다.

나는 DAO그것이 어디에 사용되는지에 관해서 프로그래밍 방식으로 무엇인지 알고 싶다 . 어떻게 사용 되나요? 매우 기본적인 것들로부터이 개념을 설명하는 페이지에 대한 링크도 높이 평가됩니다.

답변:


447

데이터 액세스 개체는 기본적으로 기본 데이터베이스 또는 다른 지속성 저장소에 대한 액세스를 제공하는 개체 또는 인터페이스입니다.

http://en.wikipedia.org/wiki/Data_access_object 에서 해당 정의

시퀀스 다이어그램도 확인하십시오 : http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

간단한 예를 통해 개념을 이해하는 데 도움이 될 수 있습니다.

직원을 대표 할 엔터티가 있다고 가정 해 보겠습니다.

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

직원 엔터티는 Employee데이터베이스 의 해당 테이블에 유지됩니다 . 직원 엔터티를 조작하는 데 필요한 데이터베이스 작업을 처리하는 간단한 DAO 인터페이스는 다음과 같습니다.

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

다음으로 우리는 인터페이스가 SQL 서버를 처리하고 다른 인터페이스는 플랫 파일 등을 처리하기위한 구체적인 구현을 제공해야합니다.


4
안녕 rami, 난 정말 당신이 매우 간단한 exaple 설명해 보았습니다, 내가 필요한 것입니다 정말 기뻐요. '구체적인 구현'을 의미하는 와트를 설명해 주시겠습니까? 다음에 인터페이스를 클래스에 구현하여 메소드에 대한 정의를 작성해야한다는 의미입니까?. ??
Vasanth Nag KV

네 맞습니다. EmployeeSQLServerDAO라는 클래스와 같이 SQL Server와 관련된 방식으로 메소드에 대한 전체 구현을 제공하여 EmployeeDAO 인터페이스를 구현하는 클래스처럼
Rami

4
그래서 그것은 모든 DAO입니다 ?? 데이터베이스에 액세스하기 위해 작성하는 클래스 일뿐입니다. 데이터베이스에서 서비스가 필요할 때마다 데이터베이스 작업에 사용하는 DAO의 개체를 만든 다음 데이터베이스에서 원하는 것을 얻으면 DAO를 제거합니다. 내가 맞아? 이 DAO 컨셉 라미의 범위를 알 수 있을까요 ??
Vasanth Nag KV

5
예, 이름에서 알 수 있듯이 DAO는 특정 엔티티 / 클래스와 관련된 기본 스토리지에 액세스 / 업데이트하기위한 것입니다. 위의 예에서 우리는 SQL Server DB 테이블을 사용하여 유지하는 직원 클래스 / 엔터티를 가지고 있습니다. 직원 DAO는 직원을 삽입 / 삭제 / 업데이트 / 선택하는 방법을 포함합니다
Rami

2
@PhilipRego는 MSSQL 서버 구현과 같은 여러 가지 구현과 단위 테스트에 사용되는 CSV 파일을 사용하는 다른 구현을 확실히 가질 수 있습니다.
Rami

86

데이터 액세스 오브젝트 (DAO) 란 ?

그것은 인 객체 / 인터페이스 에 사용되며, 액세스 데이터 의 데이터 저장 데이터베이스.

우리가 DAO를 사용하는 이유 :

데이터베이스와 같은 데이터 리소스에서 데이터 검색을 추상화합니다. 이 개념은 "데이터 리소스의 클라이언트 인터페이스와 데이터 액세스 메커니즘을 분리하는 것"입니다.

데이터에 직접 액세스 할 때 발생하는 문제는 데이터 소스가 변경 될 수 있다는 것입니다. 예를 들어, 애플리케이션이 Oracle 데이터베이스에 액세스하는 환경에 배치되어 있다고 가정하십시오. 그런 다음 Microsoft SQL Server를 사용하는 환경에 배포됩니다. 응용 프로그램에서 저장 프로 시저 및 데이터베이스 별 코드 (예 : 숫자 시퀀스 생성)를 사용하는 경우 응용 프로그램에서 해당 프로 시저를 어떻게 처리합니까? 두 가지 옵션이 있습니다.

  • Oracle 대신 SQL Server를 사용하도록 응용 프로그램을 다시 작성하거나 차이점을 처리하기 위해 조건부 코드를 추가하십시오. 또는
  • 응용 프로그램 논리와 데이터 액세스 사이에 계층을 만듭니다.


모두 DAO Pattern 이라고하며 다음과 같이 구성됩니다.

  • 데이터 액세스 개체 인터페이스 -이 인터페이스 모델 개체에서 수행 할 표준 작업정의합니다 .
  • Data Access Object 구체적 클래스 -이 클래스는 위의 인터페이스를 구현합니다. 이 클래스는 데이터베이스 / xml 또는 기타 스토리지 메커니즘 일 수 있는 데이터 소스에서 데이터를 가져옵니다 .
  • 모델 객체 또는 값 객체 -이 객체는 DAO 클래스를 사용하여 검색된 데이터를 저장 하는 get / set 메소드포함하는 간단한 POJO 입니다.

이 예를 확인하십시오. 그러면 더 명확하게 지워집니다.

예제
나는이 것들이 DAO에 대한 당신의 이해를 어느 정도까지 분명히 해 주었다고 가정한다.


13

DAO (Data Access Object)는 엔터프라이즈 응용 프로그램에서 매우 사용되는 디자인 패턴입니다. 기본적으로 모든 소스 (DBMS, XML 등)의 데이터에 액세스하는 데 사용되는 모듈입니다. 다음과 같은 몇 가지 예를 읽으십시오.

DAO 예

원본 DAO 패턴 을 구현하는 방법에는 여러 가지 가 있으며 작업을 단순화 할 수있는 많은 프레임 워크가 있습니다. 예를 들어, iBatis 또는 Hibernate와 같은 ORM (Object Relational Mapping) 프레임 워크는 SQL 조회 결과를 Java 오브젝트에 맵핑하는 데 사용됩니다.

도움이 되길 바랍니다.


8

데이터 액세스 개체 패턴 또는 DAO 패턴은 하위 수준의 데이터 액세스 API 또는 작업을 고급 비즈니스 서비스와 분리하는 데 사용됩니다. 다음은 데이터 액세스 개체 패턴의 참가자입니다.

데이터 액세스 개체 인터페이스-이 인터페이스는 모델 개체에서 수행 할 표준 작업을 정의합니다.

Data Access Object 구체적 클래스-이 클래스는 위의 인터페이스를 구현합니다. 이 클래스는 데이터베이스 / xml 또는 기타 스토리지 메커니즘 일 수있는 데이터 소스에서 데이터를 가져옵니다.

모델 객체 또는 값 객체-이 객체는 DAO 클래스를 사용하여 검색된 데이터를 저장하는 get / set 메소드를 포함하는 간단한 POJO입니다.

샘플 코드는 여기 ..


7

DAO와 ORM이 모든 언어로 사용되므로 Java에 국한되지 않고 일반적입니다.

DAO를 이해하려면 먼저 ORM (Object Relational Mapping)을 이해해야합니다. 이는 "name"및 "age"열이있는 "person"이라는 테이블이있는 경우 해당 테이블에 대한 오브젝트 템플리트를 작성 함을 의미합니다.

type Person {
name
age
}

이제 특정 쿼리를 작성하는 대신 DAO의 도움으로 모든 사람을 가져 와서 사용중인 db 유형 (오류가 발생할 수 있음)에 대해 대신 수행하십시오.

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

DAO 추상화를 직접 작성하지 말고 사용중인 언어 및 프레임 워크에 따라 일반적으로 일부 오픈 소스 프로젝트의 일부입니다.

이제 주요 질문입니다. " .. 사용되는 곳 .. ". 일반적으로 복잡한 비즈니스 및 도메인 특정 코드를 작성하는 경우 DAO가 없으면 인생이 매우 어려워집니다. 물론 제공된 ORM 및 DAO를 사용할 필요가 없으며, 자체 추상화 및 기본 쿼리를 작성할 수 있습니다. 나는 과거에 그것을했고 거의 항상 후회했습니다.


6

oracle 웹 사이트에서 찾을 수있는 가장 좋은 예 (설명과 함께)는 여기에 있습니다 . 또 다른 좋은 tuturial은 여기 에서 찾을 수 있습니다 .


2
나만입니까 아니면 대부분의 Java 자습서 및 정보 제공 사이트는 매우 오래된 것입니까? 그 튜토리얼은 2008 년입니다! 다양한 Java 주제에 대한 많은 상위 검색 결과가 더 오래되었습니다.
bergie3000

2
@ bergie3000 :이 패턴은 새로운 것이 아닙니다.
Bằng Rikimaru

5

너무 많은 설명과 혼동하지 마십시오. DAO : 이름 자체에서 Object를 사용하여 데이터에 액세스하는 것을 의미합니다. DAO는 다른 비즈니스 로직과 분리되어 있습니다.


4

데이터 액세스 오브젝트는 데이터 소스와의 연결을 관리하여 데이터를 확보하고 저장하며, 비즈니스 오브젝트가 데이터 소스에 투명하게 액세스 할 수 있도록 기본 데이터 액세스 구현을 추상화합니다. 데이터 소스는 RDBMS, XML 저장소 또는 플랫 파일 시스템 등과 같은 모든 데이터베이스 일 수 있습니다.


4

봄 JPA DAO

예를 들어 엔터티 그룹이 있습니다.

이 엔티티에 대해 저장소 GroupRepository를 작성합니다.

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

그런 다음이 리포지토리를 사용할 서비스 계층을 만들어야합니다.

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T save(T entity) {
        return repository.save(entity);
    }

    @Override
    public void deleteById(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List<T> findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

그리고 컨트롤러에서 우리는이 서비스를 사용합니다.

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection<Group> groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity<?> getGroup(@PathVariable Long id) {
        Optional<Group> group = groupService.findById(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}

이것은 원래 작성자 요청에 따라 DAO 패턴이 아닌 리포지토리 패턴을 설명하는 것으로 보입니다. 또한 인터페이스가 Collection과 같은 접근법을 따라야하기 때문에 귀하의 예제가 오도 될 수 있다고 생각하므로 일부 작업에는 적합하지 않습니다.
Jan Haesen

2

DAO는 3 계층 아키텍처에서 "Persistence Manager"와 같은 행위이며 DAO는 "Gang of Four"책을 참조 할 수있는 디자인 패턴도 있습니다. 애플리케이션 서비스 계층은 DAO 메소드의 숨겨진 세부 사항 및 내부 세부 사항을 몰라도 DAO 클래스의 메소드를 호출하기 만하면됩니다.


2

Dao clases는 jdbc 로직을 재사용하는 데 사용되며 Dao (Data Access Object)는 디자인 패턴입니다. dao는 JDBC 로직을 포함하는 간단한 자바 클래스입니다.

데이터 액세스 계층은 별도의 비즈니스 논리 계층과 영구 계층에서 우수한 것으로 입증되었습니다. DAO 디자인 패턴은 클라이언트로부터 데이터 액세스 구현을 완전히 숨 깁니다.

Java DAO (Java Data Access Object)는 비즈니스 응용 프로그램에서 중요한 구성 요소입니다. 비즈니스 응용 프로그램은 거의 항상 관계형 또는 객체 데이터베이스의 데이터에 액세스해야하며 Java 플랫폼은이 데이터에 액세스하기위한 많은 기술을 제공합니다. 가장 오래되고 가장 성숙한 기술은 데이터베이스에 대해 SQL 쿼리를 실행하고 한 번에 한 열씩 결과를 가져올 수있는 기능을 제공하는 JDBC (Java Database Connectivity) API를 사용하는 것입니다.


1

Pojo는 또한 private에 정의 된 특정 변수에 대한 getter 및 setter를 작성할 수있는 Java의 Model 클래스로 간주합니다. 모든 변수는 여기 개인 수정 자로 선언됩니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.