DAO와 ORM 이해하기

SEUNGJUN·2024년 4월 2일
0

DATABASE

목록 보기
2/4

DAO

DAO는 Data Access Object의 약자로, 데이터베이스나 다른 데이터 저장소에 접근하는 객체를 말합니다. DAO는 주로 데이터베이스와의 통신을 담당하고, 비즈니스 로직과 데이터베이스 간의 결합도를 낮추는 데 사용된다.

1. 데이터베이스 접근 추상화

  • DAO는 데이터베이스에 접근하는 로직을 캡슐화하여 비즈니스 로직에서 데이터베이스 구체적인 접근 방법에 대한 자세한 내용을 알 필요 없이 데이터에 접근할 수 있도록 한다.

2. CRUD 작업 지원

  • DAO는 데이터의 생성(Create), 읽기(Read), 수정(Update), 삭제(Delete)와 같은 기본적인 데이터 조작 작업을 수행할 수 있는 메서드를 제공한다.

3. 트랜잭션 관리

  • DAO는 트랜잭션 관리를 위한 메서드를 제공하여 여러 개의 데이터 조작 작업을 단일 트랜잭션으로 묶어 데이터 일관성을 보장할 수 있다.

4. 예외 처리

  • DAO는 데이터베이스 작업 중 발생할 수 있는 예외를 적절하게 처리하여 응용 프로그램의 안정성을 유지한다.

5. 설정 및 리소스 관리

  • DAO는 데이터베이스 연결 설정과 리소스 관리를 담당하여 데이터베이스 연결 관리, 풀링 등을 효율적으로 처리한다.

일반적으로 DAO는 데이터베이스와 직접적으로 통신하여 데이터를 조작하는 객체로 사용된다. 하지만 최근에는 ORM(Object-Relational Mapping) 기술이 발전하면서 DAO 패턴의 사용빈도가 줄어들고 있는 추세다 ORM은 객체와 데이터베이스 간의 매핑을 자동으로 처리하여 개발자가 직접 SQL 쿼리를 작성하지 않고도 객체를 통해 데이터베이스에 접근할 수 있도록 도와준다.

ORM

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스 간의 데이터를 변환하고 매핑하는 프로그래밍 기술 또는 도구이다. ORM은 객체 지향 프로그래밍 언어에서 사용되는 객체와 관계형 데이터베이스에서 사용되는 테이블 간의 불일치를 해결하기 위해 사용된다.

ORM 기능

1. 객체-관계 매핑

  • ORM은 객체와 데이터베이스 테이블 간의 매핑을 자동으로 처리한다. 즉, 클래스의 필드와 데이터베이스 테이블의 컬럼을 매핑하여 객체를 데이터베이스에 저장하고 검색할 수 있다.

2. SQL 생성 및 실행

  • ORM은 개발자가 직접 SQL 쿼리를 작성하는 것을 대신하여 객체를 통해 데이터베이스에 대한 작업을 수행한다. ORM은 개발자가 객체 지향적인 방식으로 데이터를 다룰 수 있도록 SQL을 자동으로 생성하고 실행한다.

3. 데이터베이스 트랜잭션 관리

  • ORM은 데이터베이스 트랜잭션을 관리하여 데이터의 일관성과 무결성을 유지한다. 개발자는 복잡한 트랜잭션 관리를 신경 쓰지 않고도 안전하게 데이터를 다룰 수 있다.

4. 성능 최적화

  • ORM은 데이터베이스와의 통신을 최적화하여 성능을 향상시킨다. 데이터를 로딩하는 방식이나 쿼리의 실행 계획을 최적화하여 빠른 데이터 액세스를 제공한다.

ORM 장점

1. 개발 생산성 향상

  • ORM을 사용하면 SQL 쿼리를 직접 작성하는 번거로움을 줄일 수 있으며, 객체 지향 프로그래밍 언어의 특징을 활용하여 개발을 빠르게 진행할 수 있다.

2. 유지보수성 향상

  • ORM을 사용하면 데이터베이스 스키마의 변경에 대한 영향을 최소화할 수 있으며, 코드의 재사용성과 유지보수성을 높일 수 있다.

3. 플랫폼 독립성

  • ORM은 다양한 데이터베이스에 대한 지원을 제공하므로, 애플리케이션의 플랫폼을 변경하거나 데이터베이스를 교체할 때 유연성을 제공한다.

4. 보안 강화

  • ORM을 사용하면 SQL Injection과 같은 보안 취약점을 방지할 수 있으며, ORM이 제공하는 보안 기능을 활용하여 데이터베이스 보안을 강화할 수 있다.

ORM 예시

1. Student Entity 클래스 생성

import javax.persistence.*;

@Entity
@Table(name = "Student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;

    // Getter 및 Setter 메서드
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2. JPA를 사용하여 MySQL 데이터베이스와 연동하고 데이터를 읽고 쓰기

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = null;
        EntityManager entityManager = null;
        EntityTransaction transaction = null;

        try {
            // EntityManagerFactory 생성
            entityManagerFactory = Persistence.createEntityManagerFactory("MyPersistenceUnit");

            // EntityManager 생성
            entityManager = entityManagerFactory.createEntityManager();

            // 트랜잭션 시작
            transaction = entityManager.getTransaction();
            transaction.begin();

            // 새로운 학생 객체 생성
            Student student = new Student();
            student.setName("John");
            student.setAge(20);

            // 학생 객체 저장 (데이터베이스에 INSERT)
            entityManager.persist(student);

            // 트랜잭션 커밋
            transaction.commit();
        } catch (Exception e) {
            // 트랜잭션 롤백
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            // EntityManager 종료
            if (entityManager != null) {
                entityManager.close();
            }
            // EntityManagerFactory 종료
            if (entityManagerFactory != null) {
                entityManagerFactory.close();
            }
        }
    }
}

JPA를 사용하여 MySQL 데이터베이스와 연동하고 새로운 학생 객체를 데이터베이스에 저장한다. JPA는 EntityManager를 통해 데이터베이스와 상호작용하며, EntityManagerFactory를 사용하여 EntityManager를 생성합니다. 개발자는 객체 지향적으로 데이터베이스와 상호작용할 수 있으며, SQL 쿼리를 직접 작성할 필요가 없다.

DAO와 ORM

DAO(Data Access Object)와 ORM(Object-Relational Mapping)은 데이터베이스와의 상호 작용을 돕는 데 사용되는 두 가지 다른 접근 방식이다.

DAO(Data Access Object)

  • DAO는 데이터베이스와의 상호 작용을 추상화하는 디자인 패턴이다.
  • 개발자는 DAO를 통해 데이터베이스에 액세스하는 메서드를 정의하고 호출한다.
  • DAO는 일반적으로 JDBC(Java Database Connectivity)와 함께 사용되며, SQL 쿼리를 직접 작성하여 데이터베이스에 액세스한다.
  • 데이터베이스와의 특정 연결에 대한 세부 사항은 DAO 내부에 숨겨진다.

ORM(Object-Relational Mapping):

  • ORM은 객체와 관계형 데이터베이스 간의 매핑을 자동화하는 기술이다.
  • ORM은 객체 지향 언어의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 제공하여 데이터베이스와의 상호 작용을 추상화한다.
  • 개발자는 ORM을 사용하여 객체를 데이터베이스 레코드로 매핑하고 객체 간의 관계를 유지할 수 있다.
  • ORM은 Hibernate, JPA(Java Persistence API), Entity Framework 등과 같은 프레임워크를 사용하여 구현된다.

DAO는 데이터베이스와의 상호 작용을 추상화하는 디자인 패턴이며, ORM은 객체와 관계형 데이터베이스 간의 매핑을 자동화하는 기술이다. DAO는 데이터베이스에 직접 SQL 쿼리를 작성하여 접근하고 결과를 처리하는 반면, ORM은 객체를 데이터베이스 레코드로 매핑하고 SQL 쿼리를 자동으로 생성하여 데이터베이스와 상호 작용한다.

profile
RECORD DEVELOPER

0개의 댓글