개발을 하다 보면 데이터베이스와의 상호작용을 관리하는 DAO(Data Access Object)라는 개념을 자주 접하게 됩니다. 그런데 MyBatis와 JPA 같은 ORM 도구를 사용할 때 DAO의 사용 여부나 방식이 다르다는 이야기를 들어본 적이 있으신가요? 이번 글에서는 MyBatis와 JPA에서 DAO의 역할과 사용 방식, 그리고 두 기술의 차이점을 중심으로 설명드리겠습니다.

MyBatis는 SQL 쿼리를 명시적으로 작성해야 하는 프레임워크입니다. 따라서 MyBatis에서는 DAO 클래스가 SQL 쿼리를 호출하는 중요한 역할을 담당합니다. DAO는 보통 XML 매핑 파일이나 어노테이션을 통해 SQL과 연결되며, 데이터베이스와의 통신을 처리합니다.
@Mapper
public interface UserDAO {
User findById(@Param("id") Long id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(@Param("id") Long id);
}

JPA는 ORM(Object Relational Mapping) 기술로, 객체와 데이터베이스 간의 매핑을 자동으로 처리합니다. JPA에서는 DAO 대신 Repository 패턴을 사용하는 경우가 많습니다. Repository는 DAO와 유사한 역할을 하지만, 데이터베이스 접근을 더 추상화하여 개발자가 쿼리를 직접 작성하는 부담을 줄입니다.
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
쿼리 작성이 자동화되거나 최소화됩니다.
메서드 이름 기반으로 쿼리를 생성하므로 반복 작업이 줄어듭니다.
복잡한 쿼리가 필요한 경우 JPQL(Java Persistence Query Language)이나 Native Query를 사용할 수 있습니다.
JPA에서는 DAO라는 개념을 명시적으로 사용하지 않고 Repository가 그 역할을 대신합니다. 하지만 특정한 상황에서는 DAO를 직접 구현해 사용할 수도 있습니다.

DAO는 JPA에서도 사용할 수 있지만, JPA의 기본 철학은 객체 중심 설계와 자동화된 데이터 접근입니다. 따라서 JPA에서는 보통 Repository를 사용하여 DAO 역할을 대체합니다. 하지만 다음과 같은 경우에는 DAO를 직접 구현하기도 합니다.
DAO는 MyBatis에서만 사용하는 개념이 아닙니다. MyBatis와 JPA 모두에서 DAO는 사용할 수 있지만, 두 기술의 철학과 접근 방식에 따라 구현 방식이 다릅니다. MyBatis는 명시적인 SQL 작성을 지원하기 때문에 DAO 패턴이 필수적이며, JPA는 Repository 패턴을 통해 더 추상화된 데이터 접근을 제공합니다. 상황에 맞는 패턴을 선택해 사용하는 것이 중요합니다.