[SpringBoot] Enum Class
자바 개발에서 Enum 클래스는 특정 값들이 미리 정의된 제한된 집합으로 관리되기 때문에 데이터의 일관성 유지에 중요한 역할을 합니다. 데이터베이스에서 상태나 유형을 나타내는 필드(status, type) 등을 제한된 값으로 설정하려면 Enum 클래스가 적합합니다. 이 글에서는 Enum 클래스의 특징, 생성 방법, 실제 활용 예시와 함께 JPA에서 Enum 타입을 어떻게 다루는지에 대해 설명하겠습니다.
1. Enum Class의 특징
Enum 클래스는 몇 가지 중요한 특징을 가지고 있습니다:
- 순차적으로 증가하는 인덱스: 열거형 상수는 선언된 순서에 따라 0부터 시작해 인덱스 값을 가집니다. 이 값은 내부적으로 사용되며, 이를 통해 Enum 값의 순서를 추적할 수 있습니다.
- 대문자 상수 사용: Enum 클래스의 상수는 보통 대문자로 선언하며, 이는 Enum 상수가 고유한 값을 나타내는 특성을 잘 표현합니다.
- 세미콜론 위치: Enum 상수 목록의 마지막 항목 뒤에는 세미콜론을 추가하지 않습니다. 하지만 각 Enum 상수와 해당 값들을 연결할 경우에는 세미콜론을 붙여야 합니다.
- 상수와 값 연결: Enum 상수에 특정 값을 연결하려면 클래스 생성자에서 이를 처리하며, 이러한 연결을 위해 세미콜론을 사용해야 합니다.
2. Enum Class 생성 방법
Enum 클래스는 다음과 같이 생성할 수 있습니다:
@AllArgsConstructor // 기본 생성자 생성 어노테이션
@Getter // Getter 메소드를 자동으로 생성하는 어노테이션
public enum 클래스명 {
상수1(id, "title", "description"),
상수2(id, "title", "description");
private Integer id;
private String title;
private String description;
}
- @AllArgsConstructor: 열거형 상수에 필요한 값을 매개변수로 받는 생성자를 자동으로 생성해 줍니다.
- @Getter: 각 필드에 대해 getter 메소드를 자동으로 생성합니다.
3. UserStatus Enum Class 예시
예를 들어, 사용자의 상태를 나타내는 UserStatus Enum 클래스를 생성할 때, "REGISTERED"와 "UNREGISTERED" 두 상태만 사용하려는 경우 아래와 같이 작성할 수 있습니다:
package com.hello.day2.enumclass;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum UserStatus {
REGISTERED(0, "등록", "사용자 가입상태"),
UNREGISTERED(1, "탈퇴", "사용자 탈퇴상태");
private Integer id;
private String title;
private String description;
}
위 코드에서 UserStatus Enum 클래스는 사용자 상태에 대한 정보를 담고 있으며, 각 상태에는 id, title, description을 연결하여 정의합니다.
4. JPA에서 Enum 사용 방법
JPA에서는 @Enumerated 어노테이션을 사용하여 Enum 타입을 필드에 지정할 수 있습니다. 이 어노테이션을 사용하면 데이터베이스에서 열거형 값을 어떻게 저장할지 정의할 수 있습니다.
- EnumType.STRING: 열거형 상수의 이름을 DB에 저장합니다 (예: "REGISTERED", "UNREGISTERED").
- EnumType.ORDINAL: 열거형 상수의 순서(인덱스)를 DB에 저장합니다 (예: 0, 1). 이 방식은 순서가 바뀔 경우 문제가 발생할 수 있으므로, String으로 저장하는 방식이 더 안전합니다.
Users 클래스 예시
UserStatus Enum 클래스를 Users 엔티티 클래스에서 사용할 때는 아래와 같이 정의합니다:
package com.hello.day2.model.entity;
import com.hello.day2.enumclass.UserStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userid;
private String userpw;
private String name;
private String hp;
private String email;
@Enumerated(EnumType.STRING)
private UserStatus status; // REGISTERED, UNREGISTERED
private LocalDateTime regDate;
private LocalDateTime updateDate;
}
@Enumerated(EnumType.STRING)을 사용하여, status 필드는 UserStatus Enum 타입으로 지정하고, 해당 값은 DB에 열거형의 이름인 "REGISTERED"와 "UNREGISTERED"로 저장됩니다.
5. UserRepositoryTest 클래스 예시
UserRepositoryTest 클래스에서 Users 엔티티를 저장할 때, UserStatus Enum을 사용하는 예시는 아래와 같습니다:
package com.hello.day2.repository;
import com.hello.day2.Day2ApplicationTests;
import com.hello.day2.enumclass.UserStatus;
import com.hello.day2.model.entity.Users;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
public class UsersRepositoryTest extends Day2ApplicationTests {
@Autowired
private UsersRepository usersRepository;
@Test
public void create() {
Users user = Users.builder()
.userid("mellon")
.userpw("1234")
.name("이메론")
.hp("010-1888-4521")
.email("mellon@mellon.com")
.status(UserStatus.REGISTERED)
.regDate(LocalDateTime.now())
.build();
Users newUser = usersRepository.save(user);
}
}
이 코드는 UserStatus.REGISTERED 값을 사용하여 새로운 사용자를 생성하고 데이터베이스에 저장하는 예시입니다.
실행결과
위의 코드가 실행되면, 데이터베이스에 Users 테이블에 새 사용자 정보가 저장되며, status 필드는 "REGISTERED" 값으로 저장됩니다. UserStatus Enum 클래스를 사용하여 상태 값에 대한 일관성을 보장할 수 있습니다.
요약
Enum 클래스는 제한된 값들의 집합을 정의하여 데이터의 일관성을 유지하고, 코드의 가독성을 높이는 데 중요한 역할을 합니다. JPA에서는 @Enumerated 어노테이션을 사용하여 데이터베이스에 Enum 값을 저장할 때 EnumType.STRING 방식을 사용하는 것이 좋습니다. 이를 통해 값이 변경되더라도 코드가 안전하게 유지될 수 있습니다.