`DAO Design Pattern`

DAO는 데이터 접근 객체(Data Access Object)의 약어입니다. DAO 디자인 패턴은 데이터 영속성 로직을 별도의 계층으로 분리하는 데 사용됩니다. 이렇게 하면 서비스는 데이터베이스 액세스의 저수준 작업이 어떻게 이루어지는지 완전히 알지 못합니다. 이것은 로직의 분리 원칙으로 알려져 있습니다.

DAO 디자인 패턴

DAO 디자인 패턴을 사용하면 다음과 같은 구성 요소가 필요합니다:

  • 모델은 한 계층에서 다른 계층으로 전달됩니다.
  • 인터페이스는 유연한 설계를 제공합니다.
  • 인터페이스 구현은 영속성 로직의 구체적인 구현입니다.

DAO 패턴 구현

위에서 언급한 구성 요소를 사용하여 DAO 패턴을 구현해 봅시다. 여기서 3개의 구성 요소를 사용할 것입니다:

  1. Book 모델은 한 계층에서 다른 계층으로 전달됩니다.
  2. BookDao 인터페이스는 유연한 설계와 API를 제공합니다.
  3. BookDaoImplBookDao 인터페이스의 구현체입니다.

이 로직을 다이어그램으로 표현해 봅시다:

DAO 패턴 모델 클래스

이제 모델 객체를 생성해 봅시다.

package com.journaldev.model;

public class Books {

    private int isbn;
    private String bookName;

    public Books() {
    }

    public Books(int isbn, String bookName) {
        this.isbn = isbn;
        this.bookName = bookName;
    }

    // getter setter 메소드
}

이 객체는 간단하게 유지하기 위해 2개의 속성만 가지고 있습니다.

DAO 패턴 인터페이스

이제 데이터에 대한 영속성 수준에서 액세스하기 위한 인터페이스를 정의해 봅시다.

package com.journaldev.dao;

import com.journaldev.model.Books;

import java.util.List;

public interface BookDao {

    List<Books> getAllBooks();
    Books getBookByIsbn(int isbn);
    void saveBook(Books book);
    void deleteBook(Books book);
}

DAO 패턴 구현

다음으로, 위의 인터페이스를 구현하는 구체적인 클래스를 생성합니다.

package com.journaldev.daoimpl;

import com.journaldev.dao.BookDao;
import com.journaldev.model.Books;

import java.util.ArrayList;
import java.util.List;

public class BookDaoImpl implements BookDao {

    //리스트는 데이터베이스로 동작합니다
    private List books;

    public BookDaoImpl() {
        books = new ArrayList<>();
        books.add(new Books(1, "Java"));
        books.add(new Books(2, "Python"));
        books.add(new Books(3, "Android"));
    }

    @Override
    public List getAllBooks() {
        return books;
    }

    @Override
    public Books getBookByIsbn(int isbn) {
        return books.get(isbn);
    }

    @Override
    public void saveBook(Books book) {
        books.add(book);
    }

    @Override
    public void deleteBook(Books book) {
        books.remove(book);
    }
}

DAO 패턴 사용

마침내, 우리는 main() 메서드에서 이 구현을 사용합니다:

package com.journaldev;

import com.journaldev.dao.BookDao;
import com.journaldev.daoimpl.BookDaoImpl;
import com.journaldev.model.Books;

public class AccessBook {

    public static void main(String[] args) {

        BookDao bookDao = new BookDaoImpl();

        for (Books book : bookDao.getAllBooks()) {
            System.out.println("Book ISBN : " + book.getIsbn());
        }

        //학생 업데이트
        Books book = bookDao.getAllBooks().get(1);
        book.setBookName("Algorithms");
        bookDao.saveBook(book);
    }
}

DAO 패턴의 장점

DAO 패턴을 사용하는 것에는 여러 가지 장점이 있습니다. 여기에 일부를 언급해 봅시다:

  1. 영속성 메커니즘을 변경하는 동안 서비스 레이어는 데이터가 어디에서 오는지 알 필요가 없습니다. 예를 들어, MySQL에서 MongoDB로 전환하려는 경우, 변경 사항은 DAO 레이어에서만 필요합니다.
  2. DAO 패턴은 애플리케이션의 다른 구성 요소 간의 낮은 결합도에 중점을 둡니다. 따라서 View 레이어는 DAO 레이어에 의존하지 않으며, 서비스 레이어만 인터페이스를 통해 의존합니다. 실제 구현에서는 의존하지 않습니다.
  3. 영속성 로직이 완전히 분리되므로 개별 구성 요소에 대한 단위 테스트 작성이 훨씬 쉽습니다. 예를 들어, JUnit과 Mockito를 사용하는 경우, 애플리케이션의 개별 구성 요소를 모의할 수 있습니다.
  4. DAO 패턴에서는 인터페이스와 함께 작업하기 때문에 “구현이 아닌 인터페이스와 함께 작업”하는 스타일을 강조합니다. 이는 우수한 객체 지향 프로그래밍(OOP) 스타일입니다.

DAO 패턴 결론

이 기사에서는 DAO 디자인 패턴을 사용하여 지속성 로직을 분리하고 컴포넌트를 느슨하게 결합하는 방법을 배웠습니다. 디자인 패턴은 프로그래밍 방식에 기반을 둔 것이며, 언어와 프레임워크에 독립적입니다. 아래 링크에서 DAO 예제 프로젝트를 다운로드하십시오.

DAO 패턴 예제 프로젝트 다운로드

참고문헌: Oracle 문서, 위키백과.

Source:
https://www.digitalocean.com/community/tutorials/dao-design-pattern