3주차 - RawJPA 기본
-
- Query Mapper를 사용하여 SQL 쿼리를 관리하는 방법을 배우기
- 별도의 쿼리 파일을 통해 SQL을 관리함으로써 코드의 가독성과 유지보수성을 높인다.
- Annotation을 사용하여 SQL 쿼리를 클래스나 메소드에 직접 정의하는 방법을 배우기
- 이를 통해 동적 쿼리 생성과 실행 과정을 이해하고 실습한다.
- RawJPA를 사용하여 테이블과 연동되는 객체(엔티티)의 구조와 작동 원리를 배우기
- JPA의 기본적인 구성 요소와 엔티티의 생명주기를 이해한다.
- 실제 데이터베이스 테이블과 매핑되는 Java 객체를 생성하는 방법을 배우기
- 엔티티 클래스 작성과 어노테이션을 통한 필드 매핑 방법을 실습한다.
- 엔티티 간의 관계(일대일, 일대다, 다대다)를 정의하고 매핑하는 방법을 배우기
- 연관 관계 매핑을 통해 복잡한 데이터 구조를 효과적으로 관리하는 방법을 학습한다.
- Query Mapper를 사용하여 SQL 쿼리를 관리하는 방법을 배우기
들어가기 앞서 Persistence Framework가 어떻게 등장했는지 간단하게 이해하기!!
Persistence Framework
데이터를 데이터베이스에 저장하고 불러오는 작업을 쉽게 할 수 있도록 도와주는 프레임워크이다.
예를 들어, JPA (Java Persistence API), Hibernate, MyBatis
Spring에서는 Spring Data JPA를 많이 사용해.
이런 프레임워크를 사용하면 SQL을 직접 작성하지 않고도 객체(Entity)와 데이터베이스 간의 매핑을 쉽게 할 수 있다!!
(데이터를 영속화(저장, 조회, 수정, 삭제)하는 작업을 쉽게 처리하도록 도와주는 프레임워크라고도 한다.)
- JDBC 로 직접 SQL을 작성했을때의 문제
- SQL 쿼리 요청시 중복 코드 발생
- DB별 예외에 대한 구분 없이 Checked Exception (SQL Exception) 처리
- Connection, Statement 등.. 자원 관리를 따로 해줘야함
- 자원 해제 안해주면 메모리 꽉차서 서버가 죽는 문제가 발생
- 이 문제 해결을 위해 처음으로 Persistence Framework 등장!
- Persistence Framework 는 2가지가 있다.
- SQL Mapper : JDBC Template, MyBatis 👈 요게 먼저나옴
- ORM : JPA, Hibernate, + Spring Data JPA
- Persistence Framework 는 2가지가 있다.
- SQL Mapper (QueryMapper)
- SQL ↔ Object
- SQL 문과 객체(Object)의 필드를 매핑하여 데이터를 객채화
영속성(Persistence) ?
- 데이터를 DB에 저장하고 유지하는 것
- 애플리케이션이 종료되더라도 데이터가 유지됨
정리
| 방식 | SQL 작성 | 매핑 방식 | 장점 | 단점 |
| QueryMapper (MyBatis) | 직접 SQL 작성 | 자동 매핑 지원 | SQL 제어 쉬움 | SQL 문법 오류 가능 |
| JDBC Template + RowMapper | 직접 SQL 작성 | RowMapper 구현 필요 | JDBC보다 편리 | 매핑 코드 많음 |
| Raw JPA | JPQL | 엔티티 직접 관리 | 객체 중심 개발 가능 | JPQL 학습 필요 |
결론
- MyBatis: SQL을 많이 써야 하면 사용
- JDBC Template: SQL을 직접 관리하고 싶다면 사용
- JPA: 객체 중심 개발 원하면 사용
01. 쿼리 파일 만들기 (Query Mapper)
MyBatis란
- MyBatis 는 RowMapper 가 가지고있는 단점인 “반복되는 코드”를 줄이고 “함께 있는 프로그램 코드와 쿼리 코드를 분리하여 관리”하고 싶은 니즈를 반영하여 탄생했다.
- 반복적인 JDBC 프로그래밍을 단순화
- SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL 을 분리
MyBatis 특징
- jdbc로 처리하는 코드의 설정(Connection) 부분을 줄이고 실제 sql문에 연결함으로서 빠른 개발이 가능(SQL Mapper 특징)
- MyBatis 코드는 map인터페이스(또는 클래스)와 SQL 쿼리와 ResultSet 매핑을 위한 xml 및annotation을 사용
- 다른 방식에 비해 객체자체보다 쿼리에 집중할 수 있다.

하지만 MyBatis에도 한계가 있다.
- 결국 SQL을 직접 작성해야 한다는점(DB기능 즉, DB타입 및 테이블에 종속적)
- 테이블마다 비슷한 CRUD반복
MyBatis의 동작

실행 순서는 이해만 해라
(파랑색) MyBatis 라이브러리의 의존성을 추가하면 자동으로 구성되는 동작들
(보라색) 개발자가 정해주면 되는 파일
(1) ~ (3)은 응용 프로그램 시작시 수행되는 프로세스이다. (어플리케이션은 실행할때 1번 실행한다)
(1) 응용 프로그램이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청
(2) SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 Mybatis 구성 파일을 읽는다.
(3) SqlSessionFactoryBuilder는 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory 생성
(4) ~ (10)은 클라이언트의 각 요청에 대해 수행되는 프로세스이다.
(4) 클라이언트가 응용 프로그램에 대한 프로세스를 요청
(5) 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession 가져오기
(6) SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환
(7) 응용 프로그램이 SqlSession에서 매퍼 인터페이스의 구현 개체 가져오기(매핑쿼리를 가져올 수 있다.)
(8) 응용 프로그램이 매퍼 인터페이스 메서드 호출
(9) 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행 요청
(10) SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행
- SqlSession Factory Builder (1), (2), (3)
- MyBatis 설정 파일을 읽어와서
- 설정정보 기반으로 SqlSession Factory 를 생성하는 빌더 객체
- MyBatis Config File (2)
- 매핑해줄 객체가 들어있는 패키지 경로와
- Mapping File 목록을 지정해주는 설정 파일
- http://mybatis.org/dtd/mybatis-3-config.dtd>">
- SqlSession Factory (3), (5), (6)
- 설정에 맞게 SqlSession 을 생성하여 들고있는 객체
- SqlSession (6), (7), (9), (10)
- Mapping File 에서 쿼리를 조회해서 쿼리를 수행하고 응답을 받아올 수 있는 세션 객체
- Mapper Interface (8), (9) - 방법1, 방법2
- DB 에서 조회하는 객체와 Java 프로그램의 객체간에 인터페이스를 정의하는 객체
- 방법1. Dao 클래스 정의(직접 정의)
- SqlSession 를 직접적으로 사용하는 방법
- SqlSession 멤버 변수로 사용하며 쿼리파일 수행 요청
- 장점
- 쿼리문 실행 전에 넣어줄 매개변수와 쿼리 결과값의 변형을 정의할 수 있다.
- Namespace를 내 마음대로 둘 수 있다.
- .xml 파일의 쿼리문 id와 mapper 메소드명을 일치시킬 필요가 없다.
- 단점
- Sqlsession 객체를 주입받아야 하며, 쿼리문 실행 시 항상 호출해야 한다.
- 쿼리문 호출 시 sqlsession에 .xml 파일의 namespce와 쿼리문 id를 매개변수로 넘겨야 한다.
// 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);
}
}
- 방법2. Mapper Interface 정의
- SqlSession 를 간접적으로 사용하는 방법
- ibatis 에서 구현해주는 org.apache.ibatis.annotations.Mapper 어노테이션을 사용하면 sqlSession 를 사용하여 자동으로 호출해줌
// UserMapper.java
@Mapper
public interface UserMapper {
User selectUserById(@Param("id") Long id);
}
- 장점
- 메소드의 내부 구현이 불필요하다.
- Sqlsession 객체 주입이 불펼요하다.
- .xml 파일의 쿼리문 id와 mapper 메소드 명이 일치한다.
- 단점
- .xml의 Namespace가 실제 Mapper.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>
SqlSession란
MyBatis에서 SQL을 실행하고 데이터베이스와 상호작용하는 핵심 인터페이스야.
주요 역할:
- SQL 실행 (select, insert, update, delete)
- 트랜잭션 관리 (commit, rollback)
- Mapper 인터페이스 제공
일반적으로 SqlSessionFactory를 통해 SqlSession을 생성하고, 작업이 끝나면 close()를 호출해서 세션을 닫아야 한다.
하지만 Spring과 함께 쓰면 SqlSessionTemplate을 사용해서 트랜잭션을 자동으로 관리할 수 있어
SQL Mapper에 MyBatis
반복적인 코드를 많이 줄일 수 있다.
Mapper Interface를 정의하는 방법을 2가지가 있다.
Dao클래스로 SqlSession를 직접 정의 하는 방법 (SqlSession 멤버 변수로 사용하며 쿼리파일 수행 요청)
Mapper Interface로 SqlSession를 간접적으로 사용하는 방법 (Mapping File - SqlSession 가 실행하는 쿼리가 담긴 파일)
Mapper Interface 정의
SqlSession 를 간접적으로 사용하는 방법
'Sparta(JAVA심화3기) - TIL > 스파르타 강의 - JPA, Docker, 입문, 숙련, 심화' 카테고리의 다른 글
| JPA(JAVA Persistence API) - 3-3 주차 (TIL) ⭐️ (0) | 2025.02.14 |
|---|---|
| JPA(JAVA Persistence API) - 3-2주차 (TIL) (1) | 2025.02.11 |
| JPA(Java Persistence API) - 2-2주차 (TIL) (1) | 2025.02.11 |
| JPA (Java Persistence API) - 2-1주차 (TIL) (0) | 2025.02.11 |
| JPA (Java Persistence API) - 1주차 (1) | 2025.02.11 |