SpringBoot에서 MyBatis 연동하기
스프링부트에서 백엔드 프로젝트를 생성하면 높은 응집도와 낮은 결합성 그리고 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>등의 동적쿼리를 사용한 쿼리문 을 사용하는 방법, 그리고 각각의 카디널리티가 어떻게 되어있는지에 대해서도 알아보겠습니다.