게임 옥션 서버

SpringBoot에서 MyBatis 연동하기

KimGeonWoo 2024. 1. 15. 18:51

스프링부트에서 백엔드 프로젝트를 생성하면 높은 응집도와 낮은 결합성 그리고 OOP의 원칙을 지향하기위해 MVC패턴을 지향하기됩니다.

또한 백엔드 개발자로 영구적인 데이터 보관 및 관리를 위해서는 DBMS를 사용하게 되는데 이번 포스팅에서는 MySQL을 연동하기위한 MyBatis의 장단점 및 특징에 대해알아보겠습니다.

 

MyBatis

  • 자바 개발자들이 데이터베이스를 쉽게 다룰 수 있도록 도와주는 ORM Mapper
  • SQL 쿼리를 직접 작성할 수 있으며 실제 쿼리문과 유사하게 작성이 가능하며 동적쿼리를 작성할 수 있다
  • 쿼리와 프로그래밍 코드를 분리하기때문에 코드가 간결해짐과 유지보수성에 용이하다
  • MySQL외에도 다양한 데이터베이스에 연동이 가능하다

※ 동적쿼리 : <if>,<choose>,<otherwise>,<foreach>등 실행 시점에 조건에 따라 SQL쿼리를 동적으로 생성하는 것

 

MyBatis연동하기

 

build.gradle

	implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2")

mybatis를 사용하기 위해 의존성을 추가합니다.

 

application.properties

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/auction?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=
spring.datasource.password=

DB의 연결 정보를 설정하기위한 XML 과정입니다.

JDBC, MySQL, 그리고 아이디와 비밀번호 등을 설정하는 과정입니다.

  • driverClass Name : JDBC 드라이버 클래스 이름을 지정하는데 사용한다.
  • serverTimezone : 데이터베이스와의 시간대 설정을 지정하는 속성. 데이터베이스와 서버 간의 시간 차이를 처리하는데 사용한다.
  • characterEncoding : 데이터베이스와의 문자 인코딩을 설정하는 속성. 데이터베이스와의 통신 중 문자열의 인코딩을 지정하여 정확한 문자 전달을 보장한다.

.

UserMapper.class

@Mapper
public interface UserMapper {

    boolean isExistId(String userId);
    void createUser(User user);
    Integer getID(String userId, String password);
    void updateUser(RequestUserInfo userInfo);
    RequestUserInfo readUserInfo(String userId);
}

 

@Mapper : DB쿼리와 자바 메서드사이를 매핑하는 역할을 담당하는 어노테이션

스프링 빈으로 등록하며 데이터베이스에 접근하기위한 쿼리를 작성하고 이를 실행하는 자바 메서드를 정의합니다.

 

userMapper.xml

    <insert id="createUser" parameterType="com.ccommit.gameauctionserver.dto.User">
        <selectKey keyProperty="id" order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user (  user_id,
                            password,
                            nickname,
                            phone_number,
                            gold,
                            user_level,
                            user_type )

        VALUES           (  #{userId},
                            #{password},
                            #{nickname},
                            #{phoneNumber},
                            #{gold},
                            #{userLevel},
                            #{userType} );
    </insert>

Mapper 클래스에서 정의한 메서드들의 행동을 작성하는 쿼리문입니다.

INSERT외에도 SELECT, UPDATE, DELETE 등이 있으며 실제 쿼리문과 같이 동적쿼리인

<foreach>,<otherwise><if>등을 사용하여 쿼리 실행시에 조건에 따른 쿼리문작성이 가능합니다.

 

UserService.class

    public void createUser(User user) {
        userMapper.createUser(user);
    }

 

빈으로 등록된 Mapper 클래스를 사용하는 예시 코드입니다.

Controller에서 받아온 파라미터 User를 사용해서 userMapper 객체를 사용하여 쿼리문을 실행합니다.

 

결과

MyBatis를 연동하여 JDBC보다 쉽게 연동할 수 있었으며 쿼리문 또한 MySQL의 쿼리문과 유사하게 사용할 수 있었습니다.

또한 Mapper 파일을 통해 동일한 테이블 상의 쿼리문들을 응집시키고 application.properties 등 설정파일에서의 커넥션을 담당하는 드라이버를 설정할 수 있기때문에 높은 응집도 및 낮은 결합성을 유지할 수 있게 되었습니다.

 

느낀점

스프링 관련 서적을 학습하며 MySQL에 연동할때는 JDBC를 직접연동하며 쿼리문들을 각각의 메서드에 작성해야했습니다. 스프링과 MyBatis 의존성을 추가하며 기존의 Gradle또는 Maven을 적용하기 전보다 더 간단하게 사용할 수 있었으며 이번 포스팅에서 동적쿼리문을 제외한 예시코드 외에도 <choose>,<if>,<otherwise>등의 동적쿼리를 사용한 쿼리문 을 사용하는 방법, 그리고 각각의 카디널리티가 어떻게 되어있는지에 대해서도 알아보겠습니다.