BE/Spring & Spring Boot

[Spring Boot] DAO

baek-dev 2025. 3. 30. 15:08

DAO (Data Access Object)란?

 

1️⃣ DAO 개념

 

DAO(Data Access Object)는 데이터베이스(DB)와 애플리케이션 간의 데이터 접근을 담당하는 객체임.

 

즉, DAO는 데이터베이스와 직접 상호작용하는 계층으로, 데이터를 조회, 저장, 수정, 삭제(CRUD)하는 역할을 함.

 

DAO를 사용하는 이유:

비즈니스 로직과 데이터 접근 코드의 분리 (유지보수성 증가)

데이터베이스 변경 시 애플리케이션 코드에 최소한의 영향

코드의 재사용성을 높이고 가독성을 향상

 


2️⃣ DAO 패턴 구조

 

DAO는 MVC 패턴에서 Model 계층의 일부로 사용됨.

 

DAO 패턴의 주요 구성요소:

1. Entity (DTO, VO)

DB 테이블과 1:1 매핑되는 데이터 객체

2. DAO (Data Access Object)

SQL을 실행하고 데이터를 조회 및 조작하는 클래스

3. Service

DAO에서 데이터를 가져와 비즈니스 로직을 처리하는 계층

4. Controller

클라이언트 요청을 받고 Service를 호출하여 응답을 반환하는 계층

 


3️⃣ DAO 구현 방식

 

(1) JDBC를 활용한 DAO (기본적인 DAO 구현 방식)

 

JDBC(Java Database Connectivity)를 사용하여 직접 SQL을 실행하는 방식.

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;
    }
}

단점:

JDBC 코드가 많고 반복됨 → 유지보수 어려움

SQL을 직접 관리해야 함

예외 처리 코드가 많아 가독성이 떨어짐

 


(2) Spring JDBC Template을 활용한 DAO

 

JDBC의 복잡한 코드 작성을 줄이기 위해 Spring JDBC Template을 활용 가능.

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class UserDao {
    private final JdbcTemplate jdbcTemplate;

    public UserDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<User> getAllUsers() {
        String query = "SELECT * FROM users";
        return jdbcTemplate.query(query, userRowMapper);
    }

    private RowMapper<User> userRowMapper = (rs, rowNum) -> 
        new User(rs.getInt("id"), rs.getString("name"), rs.getString("email"));
}

장점:

JDBC보다 코드가 간결해짐

예외 처리를 줄이고 가독성을 높일 수 있음

 


(3) JPA를 활용한 DAO (Spring Data JPA)

 

JPA를 사용하면 SQL을 직접 작성하지 않고도 데이터베이스 작업이 가능함.

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

@Repository
public interface UserDao extends JpaRepository<User, Integer> {
    // 기본 CRUD 기능 자동 제공
}

장점:

SQL을 직접 작성할 필요 없음

엔티티(Entity)와 자동 매핑되어 객체 중심적인 데이터 접근이 가능

유지보수성이 뛰어남

 


(4) MyBatis를 활용한 DAO

 

MyBatis는 SQL을 XML 또는 어노테이션으로 관리하는 프레임워크임.

 

① Mapper XML을 이용한 DAO

<mapper namespace="com.example.dao.UserMapper">
    <select id="getUserById" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

② DAO 인터페이스

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);
}

장점:

SQL을 직접 관리할 수 있어 쿼리 최적화가 가능함

복잡한 SQL을 다룰 때 JPA보다 유리함

 


4️⃣ DAO 패턴을 적용한 전체적인 예제

 

📌 DAO, Service, Controller를 분리하여 구현

 

① Entity 클래스

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String email;
}

 

② DAO (Spring Data JPA 사용)

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

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

 

③ Service 계층

import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {
    private final UserDao userDao;

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

    public List<User> getAllUsers() {
        return userDao.findAll();
    }

    public User getUserByName(String name) {
        return userDao.findByName(name);
    }
}

 

④ Controller 계층

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{name}")
    public User getUserByName(@PathVariable String name) {
        return userService.getUserByName(name);
    }
}

 

 


5️⃣ DAO의 장점과 단점

장점 단점
데이터 접근 코드와 비즈니스 로직을 분리할 수 있음 DAO 클래스를 별도로 관리해야 하므로 클래스가 많아질 수 있음
유지보수성이 뛰어나며, 코드 재사용성이 높음 프레임워크(JPA, MyBatis 등)에 따라 구현 방식이 다를 수 있음
데이터베이스 변경 시 최소한의 코드 수정만 필요함 JPA 사용 시 복잡한 SQL 쿼리는 최적화가 어려울 수 있음

 

 


6️⃣ 정리

DAO는 데이터베이스와 상호작용하는 계층으로, 코드의 유지보수성을 높이고 데이터 접근을 효율적으로 관리하는 역할을 함.

DAO 패턴을 사용하면 데이터베이스와의 결합도를 줄이고 객체 중심의 프로그래밍이 가능함.

JDBC, Spring JDBC, MyBatis, JPA 등 다양한 방식으로 DAO를 구현할 수 있으며, 프로젝트에 맞는 방식을 선택하면 됨.

 

 

 

 

출처 : ChatGPT

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

[Spring Boot] WebFlux  (0) 2025.04.01
[Spring Boot] DAO와 Repository의 차이?  (1) 2025.03.31
[Spring Boot] ApplicationContext  (0) 2025.03.23
[Spring Boot] 스프링의 생성자 주입  (0) 2025.03.19
[Spring Boot] Spring AI  (0) 2025.03.13