새소식

📘 기초 지식/Spring

Spring에서 Mybatis 사용하기

  • -

항상 데이터베이스를 다룰 때 JPA을 이용해서 다뤘는데 Mybatis를 이용해서 프로젝트를 진행해보고자 사용법에 대해서 공부하게 되었다.

 

데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence) 이라고 한다.

자바에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자가 일일히 수행해야 하는 번거로움이 있다.

SQL Mapper와 ORM은 개발자가 직접 JDBC Programming을 하지 않도록 기능을 제공해주는 Persistence Framework 종류이다.

기존 JDBC 만의 사용으로 쿼리문을 만들어 요청하는 과정은 쿼리문이 조금만 길어져도 관리가 힘들고 번거롭다. 따라서 JPA와 MyBatis 라이브러리를 사용하여 문제를 해결할 수 있다.

 

 

SQL Mapper와 ORM

 

- SQL Mapper

  • 객체와 테이블 간의 관계를 매핑하는 것이 아님
  • SQL문을 직접 작성하고 쿼리 수행 결과를 어떠한 객체에 매핑할지 바인딩 하는 방법
  • DBMS에 종속적인 문제
  • EX) JdbcTemplate, MyBatis

- ORM

  • 개발자가 반복적인 SQL을 직접 작성하지 않음
  • DBMS에 종속적이지 않음
  • 복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper을 혼용하여 사용 가능

 

 

JPA와 MyBatis의 차이

 

JPA : ORM(Object Relational Mapping) 기술

  • 자바 ORM의 기술 표준
  • 대표적인 오픈소스로 Hibernate
  • CRUD 메소드 기본 제공
  • 쿼리를 만들지 않아도 됨
  • 1차 캐싱, 쓰기지연, 변경감지, 지연로딩 제공
  • MyBatis는 쿼리가 수정되어 데이터 정보가 바뀌면 그에 사용 되고 있던 DTO와 함께 수정해주어야 하는 반면에, JPA 는 객체만 바꾸면 된다.
  • 즉, 객체 중심으로 개발 가능
  • but 복잡한 쿼리는 해결이 어려움

 

MyBatis : Object Mapping 기술

  • 자바에서 SQL Mapper를 지원해주는 프레임워크
  • SQL문을 이용해서 RDB에 접근, 데이터를 객체화 시켜준다.
  • SQL을 직접 작성하여 쿼리 수행 결과를 객체와 매핑
  • 쿼리문을 xml로 분리 가능
  • 복잡한 쿼리문 작성 가능
  • 데이터 캐싱 기능으로 성능 향상
  • but 객체와 쿼리문 모두 관리해야함, CRUD 메소드를 직접 다 구현해야한다.

 

 

MyBatis 사용법

 

먼저 종속성 추가해준다.

dependencies {

    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
    
}

 

이후 데이터베이스에 테이블을 생성하는 방법을 찾아보고 있는데 jpa를 사용하다 보니 엔티티 클래스에 에너테이션을 달아서 자동으로 테이블을 생성하는 방식에만 익숙하다보니 그와 비슷한 내용을 구글링을 통해 찾고 있었다.

 

하지만 원하는 정보는 찾을 수가 없었고 xml파일에 sql문을 이용해 mapper를 사용하는 방식만이 나왔다.

 

그러다가 공식문서와 구글링을 통해서 알아낸 것이 mybatis는 자동으로 테이블을 생성하는 것이 아니라 데이터베이스에 직접 테이블을 생성해주는 방식이었다..ㅋㅋ

 

이 외에도 엔티티 클래스를 생성하고 resultmap이라는 명령어를 사용해서 직접 객체를 영속화 시켜주는 방법이 있었지만 해당 방법은 복잡한 테이블 설계가 이루어졌을 때 직접 지정해주는 방식이 있는 것 같긴 했지만 이것을 사용할 필요는 없어보이고

 

MySQL을 사용해 데이터베이스를 연동하고 테이블을 직접 생성해주었다..

 

그리고 굳이 엔티티 클래스를 사용하지 않고 DTO를 이용해 계층간 이동할 때만 데이터를 담아주면 되며 xml파일을 이용해서 mapper에 필요한 sql문을 작성해주면 된다.

 

일단 나는 xml파일 위치를 resources 하위에 mapper 디렉토리를 만들어서 사용을 했기 때문에 yml파일에 해당 경로를 입력해줬다.

mybatis:
  mapper-locations: mapper/*.xml

 

그리고 해당 경로에 xml파일을 만들어서 해당 코드를 입력하고

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<mapper namespace="com.reading.lib.domain.user.mapper.UserMapper"> //mapper 파일 경로 입력

	<select id="findByUserData" parameterType="String" resultType="MemberDTO">
        SELECT *
        FROM user
        WHERE userId = #{userData} or email = #{userData} or nickname = #{userData}
    </select>

</mapper>

 

Mapper와 DTO에는 해당 코드를 입력해줬다.

@Mapper
public interface UserMapper {

    MemberDTO findByUserData(String userData);

}
@Data
@AllArgsConstructor
public class MemberDTO {

    private String userId;
    private String email;
    private String nickname;
    private LocalDateTime create_at;

}

 

이러한 방법을 사용해주면 될 것 같다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.