JongTachi의 개발 블로그

[Java-Enum] 자바 Enum 매핑: 이해와 활용법 본문

Java

[Java-Enum] 자바 Enum 매핑: 이해와 활용법

JongTachi 2024. 12. 24. 13:33
728x90
반응형

Java Enum은 특정 값들의 집합을 정의할 때 유용한 기능입니다.

✅ 주로 코드의 가독성을 높이고, 실수를 줄이는 데 도움을 주죠. 

 

오늘은 Enum의 기본 개념부터 데이터베이스와의 매핑까지, 하나씩 차근차근 알아보겠습니다.

 

1. What is Java Enum? 🤔

Enum(열거형)은 상수 집합을 표현하는 특수 클래스입니다.

예를들어 요일, 색상, 상태 같은 값들을 Enum으로 정의할 수 있어요.

 

기본 사용법

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

 

Enum 값 사용

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.MONDAY;

        // 출력
        System.out.println("Today is: " + today);

        // 비교
        if (today == Day.MONDAY) {
            System.out.println("It's Monday!");
        }
    }
}

 

출력 결과:

Today is: MONDAY  
It's Monday!

 

📝 한 줄 요약

Enum은 미리 정해진 값의 집하을 표현하는 데 사용됩니다. 딱 떨어지는 값들(요일, 상태 등)이 사용하기에 딱입니다!


2. Enum에 추가 데이터와 기능을 넣어보기 🛠️

단순히 상수만 표현 할 수 있는 게 아니라

Enum에 추가 데이터를 넣거나 메서드를 정의해서 좀 더 간지?나게 사용하실 수 있습니다.

 

데이터와 메서드 추가하기

public enum Status {
    ACTIVE("활성화 상태 🟢"), 
    INACTIVE("비활성화 상태 🔴"), 
    PENDING("승인 대기 상태 🟡");

    private final String description;

    // 생성자
    Status(String description) {
        this.description = description;
    }

    // Getter 메서드
    public String getDescription() {
        return description;
    }
}

 

활용하기

public class EnumWithDescription {
    public static void main(String[] args) {
        Status status = Status.ACTIVE;

        System.out.println("Status: " + status);
        System.out.println("Description: " + status.getDescription());
    }
}

 

출력결과:

Status: ACTIVE  
Description: 활성화 상태 🟢

 

💡 Tip: 이런 식으로 Enum에 추가 정볼르 넣으면 화면 출력, 로그 기록 등 다영한 곳에서 활용할 수 있어요.


 

3. Enum과 데이터베이스 매핑하기 🗄️

Spring JPA 같은 ORM 프레임워크를 사용하면 Enum 값을 데이터베이스에 저장하거나 불러올 수 있어요.

보통 Enum 값을 문자열(String) 또는 숫자(Integer) 형태로 저장합니다.

 

1) 문자열로 저장하기 (추천)

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)  // 문자열로 저장
    private Status status;
}

 

ID STATUS
1 ACTIVE
2 INACTIVE

 

2) 숫자로 저장하기 

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.ORDINAL)  // 숫자로 저장
    private Status status;
}

 

ID STATUS
1 0
2 1

 

⚠️ 주의: ORDINAL 방식은 Enum 순서가 변경되면 문제가 생길 수 있어요. 웬만하면 STRING을 쓰는 걸 추천합니다!

 

4) 커스텀 매핑: 유연하게 사용하기

가끔 데이터베이스에 Enum을 저장할 때 커스텀 값을 사용해야할 상황이 오곤 합니다.

예를 들어, ACTIVE는 'A', INACTIVE는 'I'로 저장하고 싶다면 아래처럼 구현하면 됩니다.

 

커스텀 컨버터 작성하기

@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {

    @Override
    public String convertToDatabaseColumn(Status status) {
        switch (status) {
            case ACTIVE: return "A";
            case INACTIVE: return "I";
            case PENDING: return "P";
            default: throw new IllegalArgumentException("Unknown status: " + status);
        }
    }

    @Override
    public Status convertToEntityAttribute(String dbData) {
        switch (dbData) {
            case "A": return Status.ACTIVE;
            case "I": return Status.INACTIVE;
            case "P": return Status.PENDING;
            default: throw new IllegalArgumentException("Unknown dbData: " + dbData);
        }
    }
}

 

엔티티와 연결

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Convert(converter = StatusConverter.class)
    private Status status;
}

 

이상 Enum 매핑에 대한 설명이었습니다.

감사합니다.

 

 

 

728x90
반응형