MyBatis

[MyBatis] 06. Enum 타입의 활용

  • -

이번 포스트에서는 enum 타입의 컬럼을 mybatis에서 사용하기 위한 방법을 알아보자.

 

TypeHandler

Mybatis에서는 PreparedStatement에 파라미터를 설정하거나 결과를 가져올 때 TypeHandler라는 것을 사용한다.  

https://mybatis.org/mybatis-3/ko/configuration.html#typeHandlers

 

MyBatis – 마이바티스 3 | 매퍼 설정

매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할

mybatis.org

당연히 자주 사용되는 타입에 대해서 다양한 TypeHandler를 내장하고 있지만 MyBatis가 모르는 타입 즉 사용자 정의 타입에 대해서는 당연히 커스텀 TypeHandler를 제공해줘야 한다.

 

DTO 구성

여기서는 사용자의 권한을 설정할 수 있는 DTO인 User를 생각해보자.

package com.quietjun.oauthtest.model.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String id;
    private String name;
    private String email;
    private String pass;
    private String picture;
    
    private Role role;
}

 

여기서 Role은 enum 상수 타입으로 아래와 같이 작성해보자.

package com.quietjun.oauthtest.model.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Role {
    
    GUEST("ROLE_GUEST", "손님"),
    USER("ROLE_USER", "일반 사용자");

    private final String key;
    private final String title;
}

그리고 이 정보를 저장하기 위한 table은 아래와 같다.

CREATE TABLE `user` (
  `id` varchar(50) NOT NULL,
  `name` varchar(45) NOT NULL,
  `pass` varchar(100) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `picture` varchar(100) DEFAULT NULL,
  `role` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

 

이제 문제는 User가 가진 Role 타입의 객체를 어떻게 테이블의 문자열 컬럼인 role에 연결할 것인가가 남았다. 이를 위해 사용자 정의의 TypeHandler가 필요하다.

 

RoleTypeHandler 작성

사용자정의 TypeHandler를 작성하기 위해서는 TypeHandler interface를 구현해주면 된다.  abstract method 3개를 구현해주면 되는데 역할은 주석을 참조하자.

TypeHandler를 작성한 후 어떤 클래스에 적용할 것인지를 설정하기 위해서 @MappedTypes 애너테이션을 이용한다.

package com.quietjun.oauthtest.model.typehandlers;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;

import com.quietjun.oauthtest.model.dto.Role;

@MappedTypes(Role.class)
public class RoleTeypHandler implements TypeHandler<Role> {

    @Override
    // 지정된 타입의 어떤 값을 DB에 저장할 것인가?
    public void setParameter(PreparedStatement ps, int i, Role parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.getKey());
    }

    @Override
    // 컬럼 이름 기반으로 조회된 값을 활용해서 실제 반환할 객체 구성하기
    public Role getResult(ResultSet rs, String columnName) throws SQLException {
        String roleKey = rs.getString(columnName);
        return getRole(roleKey);
    }

    @Override
    // 컬럼 index 기반으로 조회된 값을 활용해서 실제 반환할 객체 구성하기    
    public Role getResult(ResultSet rs, int columnIndex) throws SQLException {
        String roleKey = rs.getString(columnIndex);
        return getRole(roleKey);
    }

    @Override
    // Callablestatement에서 컬럼 index 기반으로 조회된 값을 활용해서 실제 반환할 객체 구성하기    
    public Role getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String roleKey = cs.getString(columnIndex);
        return getRole(roleKey);
    }

    // 실제 객체를 구성하는 메서드
    private Role getRole(String roleKey) {
        Role role = null;
        switch (roleKey) {
        case "ROLE_USER":
            role = Role.USER;
            break;

        default:
            role = Role.GUEST;
            break;
        }
        return role;
    }
}

 

MyBatis에 TypeHandler 설정

작성한 Handler는 MyBatis에 등록해주면 되는데 사용하는 플랫폼에 따라 다양한 방법으로 처리가 가능하다.

xml 기반으로 config 파일을 만들때는 typeHandlers 태그를 사용한다.

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

 

자바 기반으로 설정할 때는 sessionFactoryBean의 setTypeHandlers 메서드를 사용한다.

@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    ...
    sessionFactoryBean.setTypeHandlers(new TypeHandler[] {
        new RoleTypeHandler()
    });
 
    return sessionFactoryBean.getObject();
}

 

SpringBoot를 사용중이라면 application.properties에 mybatis.type-handlers-package 속성을 이용하면 된다.

mybatis.type-handlers-package=com.quietjun.oauthtest.model.typehandlers

 

'MyBatis' 카테고리의 다른 글

[MyBatis] 05. 기타  (0) 2023.06.18
[MyBatis] 04. 동적 쿼리  (0) 2023.06.18
[MyBatis] 03. 조회 결과의 매핑  (0) 2023.06.18
[MyBatis] 02. CRUD  (0) 2023.06.18
[MyBatis] 01. 소개 및 환경 설정  (2) 2023.06.18
Contents

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

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