Language/Java

Enum Type과 Embedded Type의 차이

대기업 가고 싶은 공돌이 2024. 2. 21. 18:13

프로젝트를 진행하던 도중 Enum Type과 Embedded Type을 활용하려는데 막상 둘의 차이점이 무엇인지 어느 상황에 둘을 적용해야하는 것인지 헷갈려 찾아보게 되었다.

 

Enum Type이란?

주로 열거형 타입이라고 부르는 이넘 타입은, 우리가 정의한 값의 집합을 이루는 자료형이다.

이렇게 정의한 값들은 상수로서 식별자로 사용된다.

 

예시)

public enum Sex {
    MALE,FEMALE
}

 

enum type을 엔티티에 가져와 사용할 때는 다음과 같은 어노테이션을 사용해주어야 한다.

@Enumerated(EnumType.STRING)
private Sex sex;

 

EnumType에는 ORDINARY와 STRING 두 가지 가 있는데 실무에서는 STRING만 사용할 것을 추천한다.

ORDINARY로 설정하게 되면 MALE이 0 FEMALE이 1로 설정되어 데이터베이스에 저장되게 된다.

 

성정체성이 흔들리는 유저가 새로운 성별을 요청하여 새 성별을 가운데에 추가하게 되었다고 가정해보자.

MALE, ?, FEMALE 다음과 같이 enum 타입을 수정한다면, 기존의 데이터베이스에는 MALE이 0 FEMALE이 1로 저장되었었는데 이 이후로는 MALE이 0, ?가 1, FEMALE이 2으로 저장되게 되는것이다.

 

따라서 이전의 데이터베이스에 저장된 모든 값을 수정해줘야할 문제가 생기기 때문에 STRING으로 설정하여 문자그대로 저장하는 것을 추천한다.

 

아무튼 이렇게 enum 타입은 그저 값을 나열하여 매핑해주는 역할만 수행한다고 보면 된다.

 

그렇다면 Embedded Type이란 무엇일까

Embedded Type이란?

임베디드 타입이란 값타입들을 모아서 만든 복합 값타입을 임베디드 타입이라고 한다.

하나의 클래스로서 존재하며 다른 엔티티를 임베디드 타입 내부에 가질 수도 있다.

 

*여기서 값타입은 단순히 값만을 사용하고 엔티티처럼 식별자가 없기에 값이 변경시 추적이 불가능한 타입을 의미한다.*

 

예시)

 

@Embeddable
@Getter
public class Address {

    private String city;
    private String street;
    private String zipcode;

    protected Address(){}

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
}

 

이와 같이 하나의 클래스로 존재하며 내부에 해당 클래스의 필드값만 사용하는 메소드를 정의할 수도 있어, 높은 응집도를 가진다.

 

위의 예시들을 살펴보면 enum 타입은 단순히 미리 정해진 값을 열거하는 것에 그치는것을 알 수 있고,

embedded 타입은 하나의 클래스로서 동작하며, 미리 정해진 값이 아닌 다른 값을 넣을 수 있다는 것을 알 수 있다.

 

결론: 그저 정해진 값을 열거하는 것에 그칠 때에는 ENUM 타입을 사용하고, 하나의 객체로서 활용할 방안(메소드)등이 있거나 정해진 값을 사용하는게 아니라면 EMBEDDED 타입을 사용하도록 하자.

 

'Language > Java' 카테고리의 다른 글

[JAVA] Comparator 인터페이스의 이해  (0) 2024.08.09
[JAVA] private static final을 사용하는 이유  (0) 2023.11.18