※ 개인 프로젝트 진행시 새롭게 알게된 내용을 정리하기 위한 게시글 입니다.
개인 프로젝트를 진행하면서 처음으로 Enum에 대해 알게되었고,
제대로 사용하기 위해서 구글링을 통해서 개념을 이해하고 프로젝트에 적용을 시켰다.
우선 Enum 개념과 장점에 대해 간단하게 알아보자!
1. Enum 개념
- 자바 1.5 버전부터 추가되었으며 열거형으로 불리고 서로 연관된 상수형의 집합을 의미함
- 기존 상수를 정의하는 방법으로 문자열이나 숫자들을 나타냈던 기본 자료형의 값을 Enum으로 사용
2. Enum 장점
- 코드가 단순해지고 가독성이 좋음
- 인스턴스 생성과 상속을 방지하여 상수 값의 타입 안정성이 보장됨
- 새로운 상수들의 타입을 정의함으로 정의한 타입 외의 타입을 가진 데이터값을 컴파일시 체크함
- 구현 의도가 열거형이라는 것을 해당 클래스를 통해 바로 알 수 있음
처음에 Enum을 왜 써야되는지 정확한 이유를 몰랐기 때문에 사용하지 않고
회원등급을 setAuth_provider("ADMIN"), setAuth_provider("USER") 이런식으로 세개의 클래스에 적용을 했었다.
불편한 점은 못 느끼다가 해당 값을 ADMIN, USER가 아닌 ROLE_ADMIN, ROLE_USER 이런식으로 변경하고 싶었고,
그러다보니 세개의 클래스를 전부 열어서 각각 값을 수정해야되는 부분이 생기게 되었다.
몇개 안되는 부분의 수정사항이지만,
"클래스들을 전부 찾아서 각각 값을 수정해줘야된다고?"
"나중에 어디였는지 까먹으면 다 열어봐야되는건가?"
이런 물음들이 생기기 시작했고 그냥 지나쳤던 Enum에 대한 개념과 사용방법을 구글링하기 시작했다.
Enum 클래스 파일에만 값을 수정하면 된다는 글을 보고 편리하겠다고 생각했고
직접 적용해보니까 상수 값을 변경하고 싶을 때 Enum 클래스만 수정하면 되서 편리했다.
적용시 JPA는 간단하게 어노테이션으로 해결이 되지만 나는 Mybatis여서 구글링을 다시 많이 하게 되었고
아래 코드로 똑같이 생성한다면 Mybatis에서 간단하게 Enum 클래스를 사용할 수 있을 것이다.
1. Enum.class 생성
package data.dto;
public enum Role {
// 아래에 원하는 값들을 나열
ADMIN("ROLE_ADMIN"), EXECUTIVE("ROLE_EXECUTIVE"), USER("ROLE_LOCAL"), SOCIAL("ROLE_SOCIAL");
public String code;
private Role(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public static Role get(String code) {
for (Role element : values()) {
if (element.code.equalsIgnoreCase(code)) {
return element;
}
}
return null;
}
public static Role lookup(String code) {
for (Role element : Role.values()) {
if (element.code.equalsIgnoreCase(code)) {
return element;
}
}
return null;
}
}
2. EnumTypeHandler.class 생성
package data.handler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import data.dto.Role;
public class ProductVersionTypeHandler extends BaseTypeHandler<Role> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Role parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(i, parameter.getCode());
}
@Override
public Role getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Role.lookup(rs.getString(columnName));
}
@Override
public Role getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Role.valueOf(rs.getString(columnIndex));
}
@Override
public Role getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Role.valueOf(cs.getString(columnIndex));
}
}
- EnumTypeHandler 클래스를 생성하는 이유는 Mybatis에 Enum 타입을 넘기면 상수 그대로 저장하기 위함
- MyBatis 공식 사이트 참고
https://mybatis.org/mybatis-3/ko/configuration.html#typeHandlers
MyBatis – 마이바티스 3 | 매퍼 설정
매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할
mybatis.org
이렇게 적용하면 DB에 아래의 이미지처럼 잘 적용이 되어 들어가게 된다.

※ 만약에 따라하다가 잘 안되거나 궁금한 사항이 있으시면 댓글로 남겨주세요.
※ 해당 게시글은 Springboot + Maven + Mybatis + Jstl를 사용하여 개발하고 있는 프로젝트의 일부입니다.
'Development Log' 카테고리의 다른 글
| [React/NestJS/TypeScript] 로그인 시 JWT Token 발급 및 인증(Token sessionStorage 저장) (0) | 2023.09.15 |
|---|---|
| choco 설치와 mkcert 설치 후 React 적용(with. React + TypeScript) (2) | 2023.09.12 |
| [Development Log] TypeScript에서 http-proxy-middleware 사용법 (0) | 2023.08.21 |
| [Development Log] React + NestJS 연동하는 방법(with. TypeScript) (0) | 2023.08.21 |
| Spring boot - 스프링부트 회원가입 아이디 중복체크 (프론트+백) (2) | 2022.02.02 |