Java & Spring/Spring

JPA - 쿼리 파일 만들기

DJ.Kang 2024. 9. 27. 15:36

□ 쿼리 파일 만들기(QuaryMapper)

- MyBatis

RowMapper가 가지고있는 단점인 "반복되는 코드"를 줄이고 "함께있는 프로그램 코드와 쿼리 코드를 분리하여 관리"하고 싶은 니즈를 반영하여 탄생

  • 반복적인 JDBC 프로그래밍을 단순화
  • SQL 쿼리들을 XML파일에 작성하여 코드와 SQL을 분리
  • JDBC로 처리하는 코드의 설정(Connetcion)부분을 줄이고 실제 SQL문에 연결함으로서 빠른 개발이 가능하게 한다(SQL Mapper 특징)
  • MyBatis 코드는 map 인터페이스와 SQL 쿼리와 ResultSet 매핑을 위한 xml 및 annotation을 사용한다.
  • 객체 자체보다 쿼리에 집중할 수 있다.

  1. SqlSesstion Factory Builder (1), (2), (3)
    • MyBatis 설정 파일을 읽어와서 설정정보 기반으로 SqlSesstion Factory를 생성하는 빌더 객체
  2. MyBatis Config File(2)
    • 매핑해줄 객체가 들어있는 패키지 경로와 Mapping File목록을 지정해주는 설정 파일
    • <!-- /resources/mybatis-config.xml -->
      <!DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
          <typeAliases>
              <package name="com.thesun4sky.querymapper.domain"/>
          </typeAliases>
          <mappers>
              <mapper resource="mapper/UserMapper.xml"/>
          </mappers>
      </configuration>
  3. SqlSession Factory (3), (5), (6)
    • 설정에 맞게 SqlSession을 생성하여 돌고있는 객체
  4. SqlSesstion (6), (7), (9), (10)
    • Mapping File 에서 쿼리를 조회해서 쿼리를 수행하고 응답으 받아올 수 있는 세션 객체
  5. Mapper Interfate (8), (9)
    • DB에서 조회하는 개체외 Java 프로그램의 객체간에 인터페이스를 정의하는 객체
      • 방법1. Dao클래스 정의(SqlSession를 직접적으로 사용, 멤버변수로 사용하여 쿼리파일 수행 요청)
        // UserDao.java
        import org.apache.ibatis.session.SqlSession;
        import org.springframework.stereotype.Component;
        
        import com.thesun4sky.querymapper.domain.User;
        
        @Component
        public class UserDao {
        
          // SqlSession 멤버 변수로 사용하며 쿼리파일 수행 요청
          private final SqlSession sqlSession;
        
          public UserDao(SqlSession sqlSession) {
            this.sqlSession = sqlSession;
          }
        
          public User selectUserById(long id) {
            return this.sqlSession.selectOne("selectUserById", id);
          }
        
        }
        장점
        - 쿼리문 실행 전에 넣어줄 매개변수와 쿼리 결과값의 변형을 정의할 수 있다.
        - Namespace를 내 마음대로 둘 수 있다.
        - .xml파일의 쿼리문 id와 mapper 메소드명을 일치시킬 필요가 있다.
        단점
        - SqlSession 객체를 주입받아야 하며, 쿼리문 실행 시 항상 호출해야 한다.
        - 쿼리문 호출 시 SqlSession에 .xml파일의 namespace와 쿼리문 id를 매개변수로 넘겨야한다.
      • 방법2 Mapper Interfate정의(SqlSession를 간접적으로 사용, 애노테이션을 사용하여 자동호출)
        // UserMapper.java
        @Mapper
        public interface UserMapper {
        
          User selectUserById(@Param("id") Long id);
        
        }
         장점
        - 메소드의 냅부 구현이 불필요하다
        - SqlSession 객체 주입이 불필요하다.
        - .xml파일의 쿼리문 id와 mapper 메소드 명이 일치한다.
        단점
        - .xml의 Namespace가 실제 Mapper.java 위치를 가르켜야 한다.
        - 메소드 내부 정의가 불가능하다.
  6. Mapping File(10)
    • SqlSession가 실행하는 쿼리가 담긴 파일
    • 정의된 인터페이스에 기반해서 수행할 쿼리를 담아두고 쿼리 수행 결과를 어떤 인터페이스 매핑할지 정의해놓은 파일
      <!-- UserMapper.xml -->
      <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.thesun4sky.querymapper.mapper.UserMapper">
          <select id="selectUserById" resultType="User">
              select id, name from users where id = #{id}
          </select>
      </mapper>