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 |