본문 바로가기
GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~

[마이바티스(MyBatis)] DAO (Data Access Object) 작성

by GDNGY 2023. 5. 16.

Chapter 6. DAO (Data Access Object) 작성

데이터베이스 연결 및 세션 생성 이후 실제 데이터 접근을 위한 DAO를 작성해야 합니다. 이 장에서는 인터페이스 기반 DAO, XML 매퍼를 사용한 DAO, 어노테이션 기반 DAO 작성 방법에 대해 알아봅니다. DAO는 DB와의 인터페이스 역할을 하는 중요한 구성 요소입니다.

 


 

반응형

 


[Chapter 6. DAO (Data Access Object) 작성]


6.1. 인터페이스 기반 DAO
6.1.1. 인터페이스 기반 DAO의 장점
6.1.2. 인터페이스 기반 DAO 작성 예시

6.2. XML 매퍼를 사용한 DAO
6.2.1. XML 매퍼의 장점
6.2.2. XML 매퍼를 사용한 DAO 작성 예시

6.3. 어노테이션 기반 DAO
6.3.1. 어노테이션의 장단점
6.3.1.1. @Select 사용법
6.3.1.1.1. @Select 어노테이션의 역할
6.3.1.1.2. @Select 어노테이션 활용 예시
6.3.1.2. @Insert 사용법
6.3.1.2.1. @Insert 어노테이션의 역할
6.3.1.2.2. @Insert 어노테이션 활용 예시
6.3.1.3. @Update 사용법
6.3.1.3.1. @Update 어노테이션의 역할
6.3.1.3.2. @Update 어노테이션 활용 예시
6.3.1.4. @Delete 사용법
6.3.1.4.1. @Delete 어노테이션의 역할
6.3.1.4.2. @Delete 어노테이션 활용 예시

 


6.1. 인터페이스 기반 DAO

DAO(Data Access Object)는 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 연산을 캡슐화합니다. 이를 통해 애플리케이션 로직과 데이터베이스 접근 로직이 분리되어, 각각의 관심사가 명확히 분리되고 코드의 유지 관리가 용이해집니다. MyBatis에서는 DAO를 인터페이스로 정의하고 이를 구현하여 사용하는 방식을 지원합니다.

6.1.1. 인터페이스 기반 DAO의 장점

인터페이스 기반 DAO는 여러 가지 장점이 있습니다.

  • 가독성: 인터페이스를 통해 어떤 연산이 수행되는지 명확하게 알 수 있습니다. 이로 인해 코드의 가독성이 향상되고, 팀원들이 코드를 이해하고 유지 보수하는데 도움이 됩니다.
  • 유지 관리성: 인터페이스는 애플리케이션과 데이터베이스 연산 사이의 계약을 정의합니다. 이 계약에 따라 애플리케이션 코드는 데이터베이스 구조의 변화에 영향을 받지 않습니다. 즉, DAO 인터페이스가 변경되지 않는다면 데이터베이스의 변경이 애플리케이션에 미치는 영향을 최소화할 수 있습니다.
  • 테스트 용이성: 인터페이스 기반으로 DAO를 구현하면, 테스트 시 mock 객체를 쉽게 사용할 수 있습니다. 이는 단위 테스트를 작성하고 실행하는데 큰 이점을 제공합니다.

 

6.1.2. 인터페이스 기반 DAO 작성 예시

간단한 사용자 정보를 조회하고 수정하는 인터페이스 기반 DAO를 작성해 보겠습니다.

 

[예제]

public interface UserDao {
    // 사용자 정보를 조회하는 메소드
    User getUserById(int id);

    // 사용자 정보를 수정하는 메소드
    void updateUser(User user);
}


이 코드는 UserDao 인터페이스를 정의하고, 사용자의 정보를 조회하는 getUserById 메서드와 사용자의 정보를 수정하는 updateUser 메서드를 선언합니다. 이 인터페이스를 구현한 클래스는 이 메서드를 구현하여 실제 데이터베이스 연산을 수행합니다.

 

이렇게 인터페이스를 통해 DAO를 정의하면, 애플리케이션 코드는 인터페이스에 정의된 메소드를 사용하여 데이터베이스에 접근하게 됩니다. 이는 코드의 가독성을 높이고, 데이터베이스 연산 코드를 한곳에 집중시켜 유지 관리를 용이하게 합니다.


6.2. XML 매퍼를 사용한 DAO

MyBatis는 SQL 쿼리와 결과 매핑을 XML 파일에 작성하여 관리할 수 있는 XML 매퍼를 지원합니다. XML 매퍼는 SQL 쿼리와 그 결과를 객체와의 매핑 정보를 별도의 XML 파일에 작성하므로, 코드와 SQL 쿼리를 분리하여 관리할 수 있습니다.

 

6.2.1. XML 매퍼의 장점

SQL 쿼리의 분리: SQL 쿼리를 별도의 XML 파일에 작성하면, 코드에서 SQL 쿼리를 분리하여 관리할 수 있습니다. 이는 SQL 쿼리의 수정과 관리를 용이하게 합니다.

  • 가독성: SQL 쿼리를 XML 형식으로 작성하면, SQL 쿼리의 구조와 흐름을 보다 쉽게 이해할 수 있습니다.
  • 유지 관리성: XML 매퍼를 사용하면, SQL 쿼리와 그 결과를 매핑하는 코드를 별도로 관리할 수 있습니다. 이는 코드의 유지 관리성을 높입니다.

 

6.2.2. XML 매퍼를 사용한 DAO 작성 예시

간단한 사용자 정보를 조회하는 DAO를 XML 매퍼를 이용해 작성해보겠습니다.

 

먼저 DAO 인터페이스를 작성합니다.

[예제]

public interface UserDao {
    User getUserById(int id);
}


다음으로, SQL 쿼리를 작성한 XML 매퍼 파일(UserMapper.xml)을 작성합니다.

[예제]

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.dao.UserDao">
    <select id="getUserById" resultType="com.example.domain.User">
        SELECT * FROM Users WHERE id = #{id}
    </select>
</mapper>


이 XML 파일은 UserDao 인터페이스의 getUserById 메소드에 대응하는 SQL 쿼리를 정의합니다. #{id}는 메서드의 매개변수를 참조합니다.

 

이렇게 XML 매퍼를 사용하면, SQL 쿼리를 별도의 파일에서 관리하고, 쿼리의 수정이 필요할 때는 이 XML 파일만 수정하면 되므로 유지 관리성이 높아집니다.

 


6.3. 어노테이션 기반 DAO

MyBatis는 DAO의 메소드에메서드에 SQL 쿼리를 작성하는 어노테이션 방식을 지원합니다. @Select, @Insert, @Update, @Delete 등의 어노테이션을 사용하여 메서드에 직접 SQL 쿼리를 작성할 수 있습니다. 이 방식은 SQL 쿼리와 자바 코드를 가까이 두어 코드의 가독성을 높일 수 있습니다.

 

6.3.1. 어노테이션 기반 DAO 장단점

장점
  • 가독성: SQL 쿼리를 메소드와 가까이에 위치시키므로 코드의 가독성을 높일 수 있습니다. SQL 쿼리와 그 쿼리를 호출하는 코드가 같은 곳에 위치해 있기 때문에 코드를 이해하거나 디버깅하는 데 도움이 됩니다.
  • 간결성: XML 매퍼 파일 없이도 SQL 쿼리를 작성할 수 있으므로, 전체 코드가 간결해집니다.
단점
  • 유지 관리성: SQL 쿼리가 자바 코드 안에 포함되어 있기 때문에, SQL 쿼리를 수정하려면 자바 코드를 수정해야 합니다. 따라서, SQL 쿼리가 자주 바뀌는 경우에는 유지 관리성이 떨어질 수 있습니다.
  • 복잡한 쿼리 작성의 한계: 복잡한 쿼리를 작성하는 경우, 어노테이션 방식은 가독성을 해칠 수 있습니다. 특히, 여러 줄에 걸친 복잡한 쿼리는 어노테이션 안에 작성하기 어렵습니다.

간단한 사용자 정보를 조회하는 어노테이션 기반 DAO를 작성해 보겠습니다.

[예제]

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

 

6.3.2. @Select 사용법

MyBatis의 @Select 어노테이션은 DAO 인터페이스의 메소드에 적용되어, 해당 메서드가 실행될 때 실행할 SQL SELECT 문을 정의합니다.

 

6.3.2.1. @Select 어노테이션의 역할

@Select 어노테이션은 메소드메서드 위에 작성하며, 이 어노테이션 안에는 SQL SELECT 문이 들어갑니다. 이 어노테이션이 붙은 메서드가 호출되면, 그 안에 정의된 SQL 문이 실행되어 데이터베이스로부터 데이터를 조회합니다. 이렇게 조회된 데이터는 메서드의 반환 타입에 따라 자동으로 매핑됩니다.

 

6.3.2.2. @Select 어노테이션 활용 예시

 

[예제]

public interface UserDao {
    // 모든 사용자 정보를 조회하는 메소드
    @Select("SELECT * FROM Users")
    List<User> getAllUsers();

    // id로 사용자 정보를 조회하는 메소드
    @Select("SELECT * FROM Users WHERE id = #{id}")
    User getUserById(int id);
}

 

위의 예제에서는 두 개의 메소드에 @Select 어노테이션을 사용했습니다. getAllUsers 메서드는 모든 사용자 정보를 조회하는 SQL 문을, getUserById 메서드는 id를 조건으로 사용자 정보를 조회하는 SQL 문을 각각 정의하고 있습니다.

 

6.3.3. @Insert 사용법

MyBatis의 @Insert 어노테이션은 DAO 인터페이스의 메소드에 적용되어, 해당 메서드가 실행될 때 실행할 SQL INSERT 문을 정의합니다.

 

6.3.3.1. @Insert 어노테이션의 역할

@Insert 어노테이션은 메소드메서드 위에 작성하며, 이 어노테이션 안에는 SQL INSERT 문이 들어갑니다. 이 어노테이션이 붙은 메서드가 호출되면, 그 안에 정의된 SQL 문이 실행되어 데이터베이스에 새로운 데이터를 삽입합니다.

 

6.3.3.2. @Insert 어노테이션 활용 예시

 

[예제]

public interface UserDao {
    // 사용자 정보를 삽입하는 메소드
    @Insert("INSERT INTO Users (id, name, email) VALUES (#{id}, #{name}, #{email})")
    void insertUser(User user);
}

 

위의 예제에서는 사용자 정보를 삽입하는 SQL 문을 정의하는 insertUser 메소드에 @Insert 어노테이션을 사용했습니다. #{id}, #{name}, #{email} 부분은 User 객체의 id, name, email 필드에 해당하는 값으로 대체됩니다.

 

6.3.4. @Update 사용법

MyBatis의 @Update 어노테이션은 DAO 인터페이스의 메소드에 적용되어, 해당 메서드가 실행될 때 실행할 SQL UPDATE 문을 정의합니다.

 

6.3.4.1. @Update 어노테이션의 역할

@Update 어노테이션은 메소드메서드 위에 작성되며, 이 어노테이션 안에는 SQL UPDATE 문이 들어갑니다. 이 어노테이션을 붙인 메서드가 호출되면, 그 안에 정의된 SQL 문이 실행되어 데이터베이스의 기존 데이터를 업데이트합니다.

 

6.3.4.2. @Update 어노테이션 활용 예시

 

[예제]

public interface UserDao {
    // 사용자 정보를 업데이트하는 메소드
    @Update("UPDATE Users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);
}

 

위의 예제에서는 사용자 정보를 업데이트하는 SQL 문을 정의하는 updateUser 메소드에 @Update 어노테이션을 사용했습니다. #{id}, #{name}, #{email} 부분은 User 객체의 id, name, email 필드에 해당하는 값으로 대체됩니다.

 

6.3.5. @Delete 사용법

MyBatis의 @Delete 어노테이션은 DAO 인터페이스의 메소드에 적용되어, 해당 메서드가 실행될 때 실행할 SQL DELETE 문을 정의합니다.

 

6.3.5.1. @Delete 어노테이션의 역할

@Delete 어노테이션은 메소드메서드 위에 작성되며, 이 어노테이션 안에는 SQL DELETE 문이 들어갑니다. 이 어노테이션을 붙인 메서드가 호출되면, 그 안에 정의된 SQL 문이 실행되어 데이터베이스의 데이터를 삭제합니다.

 

6.3.5.2. @Delete 어노테이션 활용 예시

 

[예제]

public interface UserDao {
    // 사용자 정보를 삭제하는 메소드
    @Delete("DELETE FROM Users WHERE id = #{id}")
    void deleteUser(int id);
}

 

위의 예제에서는 사용자 정보를 삭제하는 SQL 문을 정의하는 deleteUser 메소드에 @Delete 어노테이션을 사용했습니다. #{id} 부분은 deleteUser 메서드의 인자로 전달된 id 값으로 대체됩니다.

 

 

2023.05.16 - [GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~] - [마이바티스(MyBatis)] 데이터베이스 연결 및 세션 생성

 

[마이바티스(MyBatis)] 데이터베이스 연결 및 세션 생성

Chapter 5. 데이터베이스 연결 및 세션 생성 마이바티스를 활용하려면 먼저 데이터베이스에 연결해야 합니다. 이 장에서는 데이터베이스 연결 정보를 설정하고, 세션을 생성하는 방법에 대해 다룹

gdngy.tistory.com

 

반응형

댓글