JPA & MyBatis

hee·2026년 3월 8일

Database

목록 보기
1/1

목적

지금까지 프로젝트를 진행하면서 데이터베이스를 사용할 때는 주로 Jakarta Persistence API(JPA)를 사용해왔다.
하지만 이번 프로젝트에서는 처음으로 MyBatis를 사용하게 되었다.
MyBatis는 SQL을 직접 작성하여 데이터베이스와 연동하는 방식이라는 점에서 JPA와 차이가 있다.
이번 글에서는 MyBatis의 기본 개념과 동작 방식에 대해 정리해보고자 한다.

MyBatis란 ?

  • 자바 애플리케이션에서 데이터 베이스와 상호작용하는데 사용되지만, 접근방식과 특징이 많이 다름
  • 여기서의 상호작용 : 저장/조회
  • SQL Mapper 기술
  • 개발자가 작성한 SQL 실행 결과를 객체에 매핑
💡 Mybatis

- SQL Mapper 프레임 워크
- 직접 SQL 작성
- 반복적인 SQL 작성 필요
- 복잡한 SQL 제어에 유리

JPA란 ?

  • ORM (Object Relational Mapping)

  • DB에 자동으로 매핑해주는 프레임 워크

💡 JPA

- Java persistence API, 객체 - 관계 매핑 표준
- JPQL 또는 메서드 이름 기반 쿼리
- 영속성 컨텍스트, JPQL 학습 필요
- CRUD 자동화로 생산성 높음
- 객체 중심 설계에 적합

JPA vs MyBatis 아키텍처 비교

<[JPA]
Controller (REST API 받음)Service (비즈니스 로직)Repository (인터페이스만, 구현체 자동 생성)Entity (객체 ↔ 테이블 자동 매핑)Database
[MyBatis]
Controller (REST API 받음)
    ↓
Service (비즈니스 로직)
    ↓
Mapper (인터페이스) + XML (SQL 작성)
    ↓
DTO/VO (데이터 전달 객체) -> model/도메인/dto, vo 존재 
* DAO는 DB접근담당이고
* DTO는 계층간 데이터 전달용
    ↓
Database

JPA 특징

  • JPA = Java Persistence API는 자바 표준 ORM(Object - Relational Mapping) 기술
  • 객체지향 프로그래밍 방식으로 데이터베이스와 상호작용 할 수 있도록 설계
  • JPA를 사용하면 SQL 대신 Entity를 통해 데이터 처리 가능
  • 대표 구현체 : Hibernate, EclipseLink, OpenJPA
  • 특징 :
    • 데이터베이스 테이블과 자바 객체를 매핑해 객체 지향적으로 데이터 관리
    • JPQL(Java Persistence Query Language) 라는 쿼리 언어 사용
    • 영속성 컨텍스트 (Persistence Context) 를 통해 데이터 변경 사항 자동으로 추적
<@Entity 
public class User {
	@Id
	@GeneratedValue
	private Long id;
	private String name;
}

MyBatis 특징

  • SQL Mapper 프레임 워크, SQL 쿼리를 직접 작성하면서도 자바 객체와 매핑할 수 있는 기능 제공
  • SQL 작성의 자유도 보장, 복잡한 쿼리나 데이터베이스 특화 기능을 활용하기 좋음
  • SQL을 직접 제어할 수 있어서 복잡한 쿼리 작성에 유리
  • XML 혹은 어노테이션 기반으로 SQL 관리
  • 동적 쿼리를 지원하여 조건에 따라 SQL 유연하게 변경할 수 있음
<select id="findUserById" parameterType="Long" resultType="User">
	SELECT * FROM users WHERE id = #{id}
</select>
  • JDBC 프로그래밍 단순화하고 불필요한 Boilerplate 코드 제거하고 Java 소스코드에서 SQL문을 별도의 XML로 저장해 이를 연결함
  • 동적 SQL 생성 기능
    • MyBatis 는 Boilerplate 코드 제거 및 SQL 문 분리 외에도 동적인 SQL 생성 기능을 제공해 프로그램 실행 중에 입력되는 파라미터에 따라 서로 다른 SQL문을 동적으로 생성함

MyBatis 사용 순서와 예시

  1. 스프링 프로젝트 생성 후 필요한 의존성 추가

    • 아마 미리 추가 되어있었을 것
    • spring-core
    • spring-jdbc
    • mybatis
    • mybatis-spring
  2. DB 설정

    • JDBC로 DB연결을 하기에 DB 연결 정보 설정해야함
    • properties나 XML에 DataSource 등록
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/> // mysql 드라이버
       <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/> // mysql 사용
       <property name="username" value="username"/> // 아이디 
       <property name="password" value="password"/> // 비밀번호 
    </bean>
  3. MyBatis 설정

    • MyBatis XML 설정 파일 만들고 필요한 설정 추가
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
       <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
       <constructor-arg ref="sqlSessionFactory"/>
    </bean>
  4. MyBatis Mapper 작성과 등록

    • Mapper = DB 쿼리 ↔ 자바 메서드()를 매핑하는 역할
    • 데이터 베이스에 접근하기 위한 SQL 쿼리를 작성하고, 이를 실행하는 자바 메서드 정의함

    ⇒ 정리하자면 XML에 SQL 쿼리들을 작성할 건데 그 SQL이 연결된 메서드를 정의할 파일

    ex) CRUD 쿼리문을 XML에 작성하고. InsertItems(), Getitems(), modifyItems(), DeleteItems() 메서드가 있는 인터페이스 만들거임. 그리고 그 클래스를 Mapper라는 명칭으로 부르자 !

    @Mapper // 등록 
    // 작성
    public interface UserMapper {
       User getUserById(int id);
       void insertUser(User user);
       void updateUser(User user);
       void deleteUser(int id);
    }
  5. Mapper 인터페이스와 연결될 XML 작성

    • Mapper 메서드() 별로 SQL 쿼리문을 작성함
    <mapper namespace="com.exmaple.mapper.UserMapper">
    	<select id="getUserById" parameterTytpe="int" resultType="com.example.model.User">
    	SELECT * FROM users WHERE id = #{id}
    	</select>
    	<insert id="insertUser" parameterType="com.example.model.User">    
    	INSERT INTO users (name, email) VALUES (#{name}, #{email}) 
    	</insert>  
    	
    	<!-- 다른 메서드들에 대한 쿼리도 추가할 수 있다 -->
    	
    </mapper>
  6. Mapper 사용

    • Mapper 인터페이스를 스프링 Bean으로 등록하고 주입받아 사용함
    @Service
    public class UserSerivce {
    	priate final UserMapper userMapper;
    	
    	public UserService(UserMapper userMapper){
    		this.userMapper = userMapper;
    	}
    	
     // 유저 조회
     public User getUsedById(int id){
    	 return userMapper.getUserById(id);
     }
     // 유저 등록
     public User insertUser(User user){
    	 return userMapper.insertUser(user);
    }

0개의 댓글