Chapter 3. SQL 매핑 파일 작성
마이바티스의 핵심 기능 중 하나는 SQL 매핑입니다. 이 장에서는 마이바티스의 SQL 매핑 파일 작성 방법에 대해 상세하게 설명합니다. SQL 매핑 파일은 객체와 SQL 쿼리 간의 매핑을 정의하며, 매퍼 파일 구조와 쿼리 작성 방법에 대해 다룹니다.
[Chapter 3. SQL 매핑 파일 작성]
3.1. 매퍼 파일 구조
3.1.1. namespace 설명
3.1.1.1. namespace의 역할
3.1.1.2. namespace 사용 예시
3.1.2. resultMap 설명
3.1.2.1. resultMap의 역할
3.1.2.2. resultMap 사용 예시
3.1.3. parameterType 설명
3.1.3.1. parameterType의 역할
3.1.3.2. parameterType 사용 예시
3.2. 쿼리 작성 방법
3.2.1. SELECT 쿼리 예제
3.2.1.1. 기본 SELECT 쿼리
3.2.1.2. 조건문을 포함한 SELECT 쿼리
3.2.2. INSERT 쿼리 예제
3.2.2.1. 기본 INSERT 쿼리
3.2.2.2. 다중 행 INSERT 쿼리
3.2.3. UPDATE 쿼리 예제
3.2.3.1. 기본 UPDATE 쿼리
3.2.3.2. 조건문을 포함한 UPDATE 쿼리
3.2.4. DELETE 쿼리 예제
3.2.4.1. 기본 DELETE 쿼리
3.2.4.2. 조건문을 포함한 DELETE 쿼리
3.1. 매퍼 파일 구조
매퍼 파일이란 SQL 쿼리와 자바 메서드를 연결시키는 역할을 하는 xml 파일입니다. 이 파일은 SQL문을 작성하고, 어떻게 파라미터를 넘기고 결과를 받아올지를 정의합니다. 그럼 이제부터 매퍼 파일의 기본 구조와 그 중요한 요소인 namespace에 대해 알아봅시다.
3.1.1. namespace 설명
매퍼 파일의 가장 첫 부분에 나오는 것이 바로 namespace입니다. XML 문서에서 namespace는 해당 문서가 속하는 범주 혹은 그룹을 정의하는 역할을 합니다. 마이바티스에서는 이 namespace를 통해 매퍼 파일과 DAO 인터페이스를 연결합니다.
3.1.1.1. namespace의 역할
마이바티스에서 namespace는 매퍼 파일과 해당 매퍼 파일의 SQL문을 호출할 DAO 인터페이스와의 연결고리 역할을 합니다. namespace에 지정된 값은 DAO 인터페이스의 패키지 경로와 이름이 되며, 이를 통해 SQL문을 호출하는 코드에서 어떤 매퍼 파일의 어떤 SQL문을 호출할 것인지를 명확히 할 수 있습니다.
예를 들어, 'org.myapp.mapper.MyMapper'라는 DAO 인터페이스가 있고, 이 인터페이스에서 'selectUser'라는 SQL문을 호출하려면 다음과 같이 코드를 작성하게 됩니다.
[예제]
// sqlSession은 MyBatis의 핵심 객체로, SQL문을 실행하고 결과를 반환하는 역할을 합니다.
User user = sqlSession.selectOne("org.myapp.mapper.MyMapper.selectUser", parameter);
3.1.1.2. namespace 사용 예시
그럼 실제 매퍼 파일에서는 어떻게 namespace를 사용하는지 살펴봅시다. 아래는 'org.myapp.mapper.MyMapper'라는 namespace를 가지는 매퍼 파일의 예시입니다.
[예제]
<mapper namespace="org.myapp.mapper.MyMapper">
<!-- SQL문 작성 -->
</mapper>
위의 예시에서 볼 수 있듯이, 매퍼 파일에서는 <mapper> 태그의 namespace 속성을 통해 해당 매퍼 파일의 namespace를 지정합니다. 이 namespace는 DAO 인터페이스의 패키지 경로와 이름이 되어, SQL문을 호출하는 코드에서 해당 매퍼 파일을 찾을 수 있게 도와줍니다.
3.1.2. resultMap 설명
resultMap은 SQL 쿼리의 결과를 자바 객체에 매핑하는 방법을 정의합니다. 'resultMap'은 각 칼럼과 해당 칼럼이 매핑될 자바 객체의 프로퍼티를 연결해 주는 역할을 합니다.
3.1.2.1. resultMap의 역할
resultMap은 이름에서도 알 수 있듯이, SQL 쿼리의 결과를 Java 객체에 매핑하는 역할을 합니다. SQL 쿼리의 결과는 일반적으로 테이블의 행(row)이고, 이 행은 여러 개의 칼럼으로 구성되어 있습니다. 이 각각의 칼럼 값을 Java 객체의 필드에 맞게 매핑하는 것이 바로 resultMap의 역할입니다.
resultMap을 사용하면 복잡한 쿼리 결과를 Java 객체에 손쉽게 매핑할 수 있습니다. 예를 들어, 조인된 테이블의 결과를 하나의 Java 객체에 매핑하거나, 테이블의 컬럼 이름과 Java 객체의 필드 이름이 다른 경우에 resultMap을 통해 매핑 정보를 정의할 수 있습니다.
3.1.2.2. resultMap 사용 예시
이제 resultMap을 어떻게 사용하는지 예시를 통해 살펴보겠습니다. 아래의 예시는 'User'라는 Java 객체에 SQL 쿼리 결과를 매핑하는 resultMap입니다.
[예제]
<resultMap id="UserResult" type="com.myapp.domain.User">
<result property="id" column="user_id"/>
<result property="name" column="user_name"/>
<result property="email" column="user_email"/>
</resultMap>
위의 resultMap에서 볼 수 있듯이, <resultMap> 태그를 통해 resultMap을 정의합니다. id 속성은 이 resultMap의 식별자이며, type 속성은 SQL 쿼리 결과를 매핑할 Java 객체의 타입을 지정합니다.
그 아래의 <result> 태그는 각 컬럼을 Java 객체의 필드에 매핑하는 정보를 담고 있습니다. property 속성은 Java 객체의 필드 이름을, column 속성은 SQL 쿼리 결과의 칼럼 이름을 지정합니다. 이렇게 resultMap을 통해 SQL 쿼리 결과와 Java 객체의 매핑 정보를 명시적으로 정의할 수 있습니다.
3.1.3. parameterType 설명
이번 섹션에서는 MyBatis 매퍼 파일에서 중요한 역할을 하는 parameterType에 대해 알아보겠습니다.
3.1.3.1. parameterType의 역할
parameterType은 MyBatis에서 SQL 쿼리를 실행할 때 필요한 파라미터의 타입을 명시하는 역할을 합니다. 즉, SQL 쿼리에서 사용되는 파라미터의 Java 타입을 MyBatis에 알려주는 것이죠. 이는 MyBatis가 적절한 JDBC 타입으로 변환하여 쿼리를 실행할 수 있도록 해줍니다.
SQL 쿼리에서 사용하는 파라미터는 다양한 타입이 될 수 있습니다. 예를 들어, 간단한 쿼리에서는 String, Integer, Long 같은 기본 타입이 사용될 수 있고, 복잡한 쿼리에서는 사용자 정의 타입이나 Map 등의 컬렉션 타입이 사용될 수 있습니다. 이러한 파라미터의 타입을 MyBatis에 알려주는 것이 parameterType입니다.
3.1.3.2. parameterType 사용 예시
다음은 'parameterType'을 사용한 예제입니다.
[예제]
<insert id="insertUser" parameterType="org.myapp.dto.User">
INSERT INTO Users (USER_ID, USER_NAME, USER_EMAIL)
VALUES (#{userId}, #{userName}, #{userEmail})
</insert>
이 예제에서 'parameterType'은 'org.myapp.dto.User'로 지정되어 있습니다. 이는 쿼리에 전달될 파라미터의 타입이 'User' 클래스임을 의미합니다. 여기서 'User' 클래스는 'userId', 'userName', 'userEmail' 등의 프로퍼티를 가지고 있으며, 이 프로퍼티들의 값이 SQL 쿼리에 바인딩됩니다.
[예제]
<select id="selectUser" parameterType="java.lang.Integer" resultMap="UserResult">
SELECT * FROM Users WHERE id = #{id}
</select>
이 예제에서 parameterType은 java.lang.Integer로 설정되어 있습니다. 이는 id 파라미터가 Java의 Integer 타입임을 MyBatis에 알려주는 것입니다.
이렇게 parameterType을 통해 파라미터의 타입을 명시하면, MyBatis는 이 정보를 바탕으로 적절한 JDBC 타입으로 변환하여 쿼리를 실행하게 됩니다.
이처럼 MyBatis의 매퍼 파일은 SQL 쿼리와 자바 객체간의 매핑을 담당하며, 'namespace', 'resultMap', 'parameterType' 등의 요소를 통해 이 매핑을 세밀하게 제어할 수 있습니다.
3.2. 쿼리 작성 방법
마이바티스를 이용한 SQL 쿼리 작성 방법에 대해 알아보겠습니다. 이번 섹션에서는 SELECT 쿼리에 대한 기본적인 내용과 조건문을 포함한 복잡한 쿼리에 대해 알아봅시다.
3.2.1. SELECT 쿼리 예제
SELECT 쿼리는 데이터베이스로부터 데이터를 조회하는 데 사용됩니다. 마이바티스에서는 SQL 쿼리를 작성하고, 쿼리 결과를 자바 객체에 매핑하기 위해 <select> 태그를 사용합니다.
3.2.1.1. 기본 SELECT 쿼리
간단한 SELECT 쿼리를 작성하는 방법을 보겠습니다. 아래의 예시는 Users 테이블에서 모든 사용자 정보를 조회하는 쿼리입니다.
[예제]
<select id="selectAllUsers" resultMap="UserResult">
SELECT * FROM Users
</select>
이 코드에서 id는 이 쿼리를 참조하는 데 사용되는 고유한 식별자입니다. resultMap은 SQL 쿼리 결과를 Java 객체에 매핑하는 방법을 지정하는 데 사용됩니다. 여기서는 "UserResult"라는 결과 매핑을 사용하도록 지정하였습니다.
3.2.1.2. 조건문을 포함한 SELECT 쿼리
조건문을 포함한 SELECT 쿼리는 <if> 태그를 사용하여 작성할 수 있습니다. 아래의 예시는 사용자 이름이 주어진 경우, 해당 이름의 사용자 정보를 조회하는 쿼리입니다.
[예제]
<select id="selectUserByName" parameterType="java.lang.String" resultMap="UserResult">
SELECT * FROM Users
<if test="name != null">
WHERE name = #{name}
</if>
</select>
이 코드에서 parameterType은 쿼리에서 사용할 파라미터의 타입을 지정합니다. <if> 태그 내부의 test 속성은 조건을 표현하는데, 이 속성의 값이 true일 경우에만 <if> 태그 내부의 SQL 코드가 실행됩니다.
3.2.2. INSERT 쿼리 예제
마이바티스를 사용하여 데이터를 삽입하는 INSERT 쿼리를 작성하는 방법에 대해 알아보겠습니다. 기본적인 INSERT 쿼리와 다중 행을 한 번에 삽입하는 방법을 살펴보겠습니다.
3.2.2.1. 기본 INSERT 쿼리
INSERT 쿼리는 새로운 데이터를 데이터베이스에 삽입할 때 사용됩니다. 마이바티스에서는 <insert> 태그를 사용하여 INSERT 쿼리를 작성할 수 있습니다.
다음 예시는 Users 테이블에 새로운 사용자를 추가하는 INSERT 쿼리입니다:
[예제]
<insert id="insertUser" parameterType="com.example.User">
INSERT INTO Users (name, email)
VALUES (#{name}, #{email})
</insert>
이 예제에서 id는 쿼리를 참조할 때 사용하는 고유 식별자입니다. parameterType은 쿼리에 전달되는 파라미터의 자바 타입을 지정합니다. #{name}과 #{email}은 전달된 파라미터에서 name과 email 속성을 가져옵니다.
3.2.2.2. 다중 행 INSERT 쿼리
여러 행을 한 번에 삽입하려면 <foreach> 태그를 사용하여 여러 개의 값에 대한 SQL 문을 생성할 수 있습니다. 다음 예시는 여러 사용자를 한 번에 추가하는 INSERT 쿼리입니다:
[예제]
<insert id="insertUsers" parameterType="java.util.List">
INSERT INTO Users (name, email)
VALUES
<foreach item="user" collection="list" separator=",">
(#{user.name}, #{user.email})
</foreach>
</insert>
이 예제에서 parameterType은 쿼리에 전달되는 파라미터의 자바 타입을 지정합니다. 이 경우에는 java.util.List 타입입니다. <foreach> 태그는 컬렉션의 각 항목에 대해 반복하며, item 속성은 현재 항목의 별칭을 지정합니다. separator 속성은 각 반복 사이에 삽입할 문자열을 지정합니다.
3.2.3. UPDATE 쿼리 예제
UPDATE 쿼리는 데이터베이스에 이미 존재하는 데이터를 수정할 때 사용됩니다. 마이바티스에서는 <update> 태그를 사용하여 UPDATE 쿼리를 작성할 수 있습니다.
3.2.3.1. 기본 UPDATE 쿼리
기본적인 UPDATE 쿼리는 특정 조건을 만족하는 행의 데이터를 수정합니다. 예를 들어, Users 테이블의 특정 사용자의 이메일 주소를 변경하는 UPDATE 쿼리는 다음과 같습니다:
[예제]
<update id="updateUserEmail" parameterType="com.example.User">
UPDATE Users
SET email = #{newEmail}
WHERE id = #{id}
</update>
이 예제에서 id는 쿼리를 참조할 때 사용하는 고유 식별자입니다. parameterType은 쿼리에 전달되는 파라미터의 자바 타입을 지정합니다. #{newEmail}과 #{id}는 전달된 파라미터에서 newEmail과 id 속성을 가져옵니다.
3.2.3.2. 조건문을 포함한 UPDATE 쿼리
조건문을 포함한 UPDATE 쿼리는 특정 조건에 따라 다르게 작동하는 쿼리를 작성할 수 있습니다. 예를 들어, 사용자가 새 이메일 주소를 제공한 경우에만 이메일을 업데이트하는 쿼리는 다음과 같습니다:
[예제]
<update id="updateUserEmailConditional" parameterType="com.example.User">
UPDATE Users
SET
<if test="newEmail != null">
email = #{newEmail},
</if>
last_updated = NOW()
WHERE id = #{id}
</update>
이 예제에서 <if> 태그는 조건을 평가하고, 조건이 참인 경우에만 내부의 SQL을 포함합니다. 이 경우에는 newEmail 속성이 null이 아닌 경우에만 email 필드를 업데이트합니다.
3.2.4. DELETE 쿼리 예제
DELETE 쿼리는 데이터베이스의 특정 행을 제거할 때 사용됩니다. 마이바티스에서는 <delete> 태그를 사용하여 DELETE 쿼리를 작성합니다.
3.2.4.1. 기본 DELETE 쿼리
기본적인 DELETE 쿼리는 특정 조건을 만족하는 행을 데이터베이스에서 제거합니다. 예를 들어, Users 테이블에서 특정 사용자를 제거하는 DELETE 쿼리는 다음과 같습니다:
[예제]
<delete id="deleteUser" parameterType="int">
DELETE FROM Users
WHERE id = #{id}
</delete>
이 예제에서 id는 쿼리를 참조할 때 사용하는 고유 식별자이며, parameterType은 쿼리에 전달되는 파라미터의 자바 타입을 지정합니다. #{id}는 전달된 파라미터의 id 속성을 가져옵니다.
3.2.4.2. 조건문을 포함한 DELETE 쿼리
조건문을 포함한 DELETE 쿼리는 특정 조건에 따라 다르게 작동하는 쿼리를 작성할 수 있습니다. 예를 들어, 사용자가 가입한 지 일정 기간이 지난 후에만 사용자 계정을 제거하는 쿼리는 다음과 같습니다:
[예제]
<delete id="deleteOldUsers" parameterType="java.util.Date">
DELETE FROM Users
WHERE signup_date < #{cutoffDate}
</delete>
이 예제에서 #{cutoffDate}는 전달된 파라미터의 cutoffDate 속성을 가져옵니다. 즉, signup_date가 cutoffDate보다 이전인 모든 사용자를 제거합니다.
2023.05.16 - [GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~] - [마이바티스(MyBatis)] 환경 설정
'GD's IT Lectures : 기초부터 시리즈 > 마이바티스(MyBatis) 기초부터 ~' 카테고리의 다른 글
[마이바티스(MyBatis)] 데이터베이스 연결 및 세션 생성 (0) | 2023.05.16 |
---|---|
[마이바티스(MyBatis)] 동적 SQL (0) | 2023.05.16 |
[마이바티스(MyBatis)] 환경 설정 (0) | 2023.05.16 |
[마이바티스(MyBatis)] 마이바티스(MyBatis) 소개 (0) | 2023.05.16 |
[마이바티스(MyBatis)] 마이바티스(MyBatis) 란? (0) | 2023.05.15 |
댓글