□ 쿼리 파일 만들기(QuaryMapper)
- MyBatis
RowMapper가 가지고있는 단점인 "반복되는 코드"를 줄이고 "함께있는 프로그램 코드와 쿼리 코드를 분리하여 관리"하고 싶은 니즈를 반영하여 탄생
- 반복적인 JDBC 프로그래밍을 단순화
- SQL 쿼리들을 XML파일에 작성하여 코드와 SQL을 분리
- JDBC로 처리하는 코드의 설정(Connetcion)부분을 줄이고 실제 SQL문에 연결함으로서 빠른 개발이 가능하게 한다(SQL Mapper 특징)
- MyBatis 코드는 map 인터페이스와 SQL 쿼리와 ResultSet 매핑을 위한 xml 및 annotation을 사용한다.
- 객체 자체보다 쿼리에 집중할 수 있다.
- SqlSesstion Factory Builder (1), (2), (3)
- MyBatis 설정 파일을 읽어와서 설정정보 기반으로 SqlSesstion Factory를 생성하는 빌더 객체
- 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>
- SqlSession Factory (3), (5), (6)
- 설정에 맞게 SqlSession을 생성하여 돌고있는 객체
- SqlSesstion (6), (7), (9), (10)
- Mapping File 에서 쿼리를 조회해서 쿼리를 수행하고 응답으 받아올 수 있는 세션 객체
- 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 위치를 가르켜야 한다.
- 메소드 내부 정의가 불가능하다.
- 방법1. Dao클래스 정의(SqlSession를 직접적으로 사용, 멤버변수로 사용하여 쿼리파일 수행 요청)
- DB에서 조회하는 개체외 Java 프로그램의 객체간에 인터페이스를 정의하는 객체
- 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>
'Java & Spring > Spring' 카테고리의 다른 글
JPA - Querydsl 사용법 및 실습 (0) | 2024.10.04 |
---|---|
JPA - JPQL사용해보기 (2) | 2024.10.02 |
JPA - 데이터베이스와 SQL (3) | 2024.09.26 |
테스트코드 작성에 사용되는 메서드 및 애노테이션(1) (0) | 2024.09.23 |
47일차 - Controller 테스트 (0) | 2024.09.11 |