[요약] 02. SqlSessionTemplate의 Mapper 메서드 정리

Dami·2025년 4월 27일

1. <insert>

DB에 새로운 레코드를 삽입할 때 사용한다.

기본 형태

<insert id="insertMember" parameterType="MemberDTO">
    INSERT INTO member (name, age)
    VALUES (#{name}, #{age})
</insert>

특징

  • 파라미터를 DTO, Map, 기본형 등으로 넘겨줄 수 있다.
  • 기본적으로 삽입된 레코드 수(int)를 반환한다.
  • 삽입 이후 생성된 PK 값을 얻고 싶으면 <selectKey> 또는 useGeneratedKeys를 사용해야 한다.

2. <update>

기존 레코드를 수정할 때 사용한다.

기본 형태

<update id="updateMember" parameterType="MemberDTO">
    UPDATE member
    SET age = #{age}
    WHERE id = #{id}
</update>

특징

  • 수정 대상 레코드 수(int)를 반환한다.
  • 파라미터는 객체, 맵, 단일 값 모두 가능하다.
  • 부분 업데이트를 위해 <set> 태그와 동적 SQL을 함께 사용할 수 있다.

동적 업데이트 예시

<update id="dynamicUpdate" parameterType="MemberDTO">
    UPDATE member
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age}</if>
    </set>
    WHERE id = #{id}
</update>

3. <delete>

레코드를 삭제할 때 사용한다.

기본 형태

<delete id="deleteMember" parameterType="int">
    DELETE FROM member
    WHERE id = #{id}
</delete>

특징

  • 삭제된 레코드 수(int)를 반환한다.
  • 보통 기본 키나 특정 조건으로 삭제를 수행한다.
  • SQL Injection 방지를 위해 조건은 항상 파라미터 바인딩(#{})으로 작성해야 한다.

4. <select>

레코드를 조회할 때 사용한다.

단일 레코드 조회

<select id="selectOneMember" parameterType="int" resultType="MemberDTO">
    SELECT id, name, age
    FROM member
    WHERE id = #{id}
</select>
  • selectOne() 메서드로 호출하며, 결과는 1건이어야 한다.

다중 레코드 조회

<select id="selectAllMembers" resultType="MemberDTO">
    SELECT id, name, age
    FROM member
</select>
  • selectList() 메서드로 호출하며, 결과는 N건 리스트로 반환된다.

5. <selectKey>

INSERT 수행 전에 또는 후에 PK 값을 조회할 때 사용한다.

BEFORE 방식 예시 (Oracle 시퀀스 사용)

<insert id="insertWithKey" parameterType="MemberDTO">
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        SELECT member_seq.NEXTVAL FROM dual
    </selectKey>
    INSERT INTO member (id, name, age)
    VALUES (#{id}, #{name}, #{age})
</insert>
  • order="BEFORE" : INSERT 하기 전에 키를 조회해서 DTO에 세팅한다.
  • keyProperty="id" : 조회된 키를 MemberDTO의 id 필드에 매핑한다.

AFTER 방식 예시 (MySQL AUTO_INCREMENT 사용)

<insert id="insertAutoIncrement" parameterType="MemberDTO" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO member (name, age)
    VALUES (#{name}, #{age})
</insert>
  • useGeneratedKeys="true" : DB가 자동 생성한 키를 JDBC를 통해 가져온다.
  • keyProperty에 생성된 키 값을 세팅한다.

6. <resultMap>

DB 조회 결과를 복잡한 형태로 객체에 매핑할 때 사용한다.

기본 형태

<resultMap id="memberResultMap" type="MemberDTO">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>

<select id="selectMembers" resultMap="memberResultMap">
    SELECT id, name, age
    FROM member
</select>

특징

  • 단순 매핑(resultType)으로 부족한 경우 사용한다.
  • 컬럼명과 DTO 필드명이 다를 때, 복합 객체를 매핑할 때 유용하다.
  • JOIN 결과를 복합적으로 매핑할 때 필수적이다.

예시: 조인 결과 매핑

<resultMap id="memberWithTeamMap" type="MemberDTO">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="team" javaType="TeamDTO">
        <id property="teamId" column="team_id"/>
        <result property="teamName" column="team_name"/>
    </association>
</resultMap>
  • association: 다른 객체를 1:1로 매핑할 때 사용한다.
  • collection: 다른 객체를 1:N으로 매핑할 때 사용한다.

0개의 댓글