BE/Spring & Spring Boot

[Spring Boot] DAO와 Repository의 차이?

baek-dev 2025. 3. 31. 19:42

1️⃣ DAO (Data Access Object)란?

 

DAO는 데이터베이스와의 직접적인 상호작용을 담당하는 객체로, SQL을 사용하여 CRUD(Create, Read, Update, Delete) 작업을 수행하는 계층을 의미함.

 

📌 특징

데이터베이스와 직접 연결하여 데이터를 조회, 저장, 수정, 삭제하는 역할.

JDBC, MyBatis, Hibernate, JPA 등 다양한 방법으로 구현 가능.

비즈니스 로직(Service)과 데이터 접근을 분리하여 코드의 유지보수성을 높임.

 

📌 DAO 예제 (JDBC 사용)

import java.sql.*;

public class UserDao {
    private static final String URL = "jdbc:mysql://localhost:3306/mydb";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public User getUserById(int id) {
        User user = null;
        String query = "SELECT * FROM users WHERE id = ?";

        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement pstmt = conn.prepareStatement(query)) {

            pstmt.setInt(1, id);
            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                user = new User(rs.getInt("id"), rs.getString("name"), rs.getString("email"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user;
    }
}

 

 


2️⃣ Repository 패턴이란?

 

Repository 패턴은 DAO와 유사하지만, 도메인(Entity) 중심의 객체 저장소 역할을 하는 것이 핵심 차이점임.

 

📌 특징

도메인 모델과 데이터 접근을 연결하는 계층으로 동작.

데이터베이스뿐만 아니라 파일 시스템, API, 캐시 등 다양한 데이터 저장소와 연결 가능.

일반적으로 JPA에서 @Repository 인터페이스를 사용하여 구현함.

DAO보다 추상화된 계층으로, 데이터 소스를 변경해도 코드 수정이 최소화됨.

 

📌 Repository 예제 (Spring Data JPA 사용)

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    User findByName(String name);
}

위처럼 Repository 패턴은 SQL을 직접 작성하지 않고, JPA가 자동으로 데이터 접근을 처리함.

 


3️⃣ DAO와 Repository의 차이점 비교

비교 항목 DAO (Data Access Object) Repository 패턴
주요 목적 데이터베이스 CRUD 처리 도메인 모델과 데이터 접근 계층을 연결
사용 방식 SQL 직접 작성 (JDBC, MyBatis) ORM 기반 (JPA, Hibernate)
초점 SQL 쿼리 최적화 및 실행 도메인 객체와 데이터 저장소의 연결
유연성 데이터베이스에 강하게 의존적 다양한 데이터 저장소와 연결 가능
Spring 지원 Spring JDBC, MyBatis 사용 가능 JpaRepository, CrudRepository 사용
예제 기술 JDBC, MyBatis, Hibernate JPA, Hibernate (Spring Data JPA)
추상화 수준 SQL을 직접 다룸 (낮은 수준) 엔티티 중심의 고수준 API 제공

 

정리하면:

DAO는 SQL을 직접 관리하는 데이터 접근 계층 (JDBC, MyBatis 사용)

Repository는 ORM과 연동하여 도메인 모델 중심으로 데이터 관리 (Spring Data JPA 사용)

 


4️⃣ DAO와 Repository 패턴을 함께 사용할 수 있을까?

 

✅ 가능함.

보통 Repository 패턴을 사용할 때도 내부적으로 DAO 패턴을 적용할 수 있음.

 

예를 들어:

1. JPA 기반 Repository를 사용하면서, 일부 복잡한 SQL 쿼리는 MyBatis DAO에서 처리할 수 있음.

2. 캐시, API 등 다양한 데이터 소스를 Repository에서 관리하고, DAO는 DB 관련 작업만 수행할 수도 있음.

 

예제: DAO + Repository 병행 사용

 

📌 DAO (MyBatis 사용)

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserDao {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

 

📌 Repository (JPA 사용)

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    User findByName(String name);
}

 

📌 Service에서 DAO와 Repository 동시 활용

import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final UserDao userDao;  // MyBatis 사용
    private final UserRepository userRepository;  // JPA 사용

    public UserService(UserDao userDao, UserRepository userRepository) {
        this.userDao = userDao;
        this.userRepository = userRepository;
    }

    public User getUserById(int id) {
        return userDao.getUserById(id); // MyBatis에서 가져옴
    }

    public User getUserByName(String name) {
        return userRepository.findByName(name); // JPA에서 가져옴
    }
}

 

결론:

DAO는 SQL 중심의 데이터 접근 방식

Repository는 ORM 중심의 데이터 저장소 연동

프로젝트에 따라 두 가지 방식을 함께 사용할 수도 있음!

 


5️⃣ DAO vs Repository, 언제 어떤 걸 써야 할까?

사용 상황 DAO 사용이 적합한 경우 Repository 사용이 적합한 경우
SQL 최적화가 필요할 때 직접 SQL 작성이 필요한 경우 자동화된 데이터 처리를 선호하는 경우
복잡한 쿼리를 다룰 때 다중 테이블 조인, 복잡한 SQL을 자주 사용하는 경우 기본적인 CRUD 중심의 데이터 조작
데이터 소스 변경 가능성 데이터베이스에 강하게 의존해야 하는 경우 캐시, API, NoSQL 등 다양한 저장소와 연동할 경우
Spring 기술 스택 JDBC, MyBatis 등과 함께 사용할 경우 JPA, Hibernate 기반의 ORM을 사용할 경우

정리하면:

JDBC, MyBatis 기반 프로젝트DAO 패턴 사용

Spring Boot + JPA 기반 프로젝트Repository 패턴 사용

복잡한 SQL과 ORM을 함께 사용해야 하는 경우DAO + Repository 병행 사용

 


6️⃣ 결론

요약 DAO Repository
역할 데이터베이스 직접 접근 도메인 중심 데이터 저장소
초점 SQL 중심 (JDBC, MyBatis) ORM 중심 (JPA, Hibernate)
추상화 수준 SQL 직접 관리 (낮음) 고수준 API 제공 (높음)
Spring 지원 JDBC, MyBatis 활용 Spring Data JPA 활용
추천 사용 사례 SQL 튜닝이 필요한 프로젝트 객체 중심 설계를 선호하는 경우

👉 Spring Boot + JPA 프로젝트라면 Repository 패턴이 기본 선택

👉 복잡한 SQL이 필요한 경우 DAO를 병행해서 활용 가능

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] 소셜로그인  (1) 2025.04.07
[Spring Boot] WebFlux  (0) 2025.04.01
[Spring Boot] DAO  (0) 2025.03.30
[Spring Boot] ApplicationContext  (0) 2025.03.23
[Spring Boot] 스프링의 생성자 주입  (0) 2025.03.19