Java Enum 사용법을 Spring Boot 실무 예제와 함께 정리했습니다. DTO, Entity, Controller, JPA EnumType.STRING 사용법부터 switch 문 활용, 코드와 설명을 함께 사용하는 실무 패턴까지 자세히 알아봅니다.

Java Enum이란?
Java에서 Enum(열거형) 은 정해진 값만 사용할 수 있도록 제한하는 특별한 타입입니다.
문자열(String)처럼 어떤 값이든 저장할 수 있는 것이 아니라, 미리 정의한 값만 사용할 수 있기 때문에 코드의 안정성과 가독성이 크게 향상됩니다.
Spring Boot에서는 특히 다음과 같은 데이터를 표현할 때 Enum을 많이 사용합니다.
- 사용자 권한(Role)
- 주문 상태(OrderStatus)
- 결제 상태(PaymentStatus)
- 브라우저 종류(UserAgentType)
- 회원 상태(MemberStatus)
값의 범위가 정해져 있는 데이터라면 Enum을 사용하는 것이 가장 좋은 선택입니다.
Enum이 필요한 이유
String으로 상태를 관리하면 다음과 같은 문제가 발생할 수 있습니다.
private String userAgent;
다음과 같이 서로 다른 문자열이 모두 저장될 수 있습니다.
user.setUserAgent("mobile");
user.setUserAgent("Mobile");
user.setUserAgent("MOBILE");
user.setUserAgent("모바일");
모두 같은 의미지만 서로 다른 값으로 인식됩니다.
이런 문제는 데이터의 일관성을 깨뜨리고 유지보수를 어렵게 만듭니다.
Enum을 사용하면 이러한 문제를 원천적으로 방지할 수 있습니다.
Enum 정의하기
브라우저 종류를 관리하는 Enum을 만들어 보겠습니다.
public enum UserAgentType {
PC,
MOBILE,
TABLET,
BOT,
UNKNOWN
}
이제 UserAgentType은 위에서 정의한 다섯 가지 값만 사용할 수 있습니다.
DTO(Model)에서 Enum 사용하기
DTO에서도 일반적인 타입처럼 사용할 수 있습니다.
public class User {
private Long id;
private String name;
private UserAgentType userAgentType;
// getter, setter
}
사용 예제입니다.
User user = new User();
user.setName("홍길동");
user.setUserAgentType(UserAgentType.MOBILE);
System.out.println(user.getUserAgentType());
실행 결과
MOBILE
Enum을 사용하면 오타나 잘못된 값이 들어가는 것을 컴파일 단계에서 확인할 수 있습니다.
예를 들어 다음 코드는 컴파일 오류가 발생합니다.
user.setUserAgentType(UserAgentType.ANDROID);
ANDROID가 Enum에 정의되어 있지 않기 때문입니다.
String과 Enum 비교
StringEnum
| 어떤 문자열이든 저장 가능 | 정의된 값만 저장 가능 |
| 오타 발생 가능 | 컴파일 단계에서 오류 확인 |
| 유지보수가 어려움 | 코드의 안정성이 높음 |
| IDE 자동완성 지원이 제한적 | 자동완성 지원 |
| 값 검증이 필요 | 별도의 검증이 거의 필요 없음 |
실무에서는 허용 가능한 값이 정해져 있다면 대부분 Enum을 사용하는 것이 좋습니다.
Controller에서 Enum 사용하기
Spring Boot Controller에서도 일반 객체처럼 사용할 수 있습니다.
@GetMapping("/users")
public String users(Model model) {
User user = new User();
user.setName("홍길동");
user.setUserAgentType(UserAgentType.PC);
model.addAttribute("user", user);
return "user";
}
Thymeleaf에서는 다음과 같이 출력할 수 있습니다.
<span th:text="${user.userAgentType}"></span>
출력 결과
PC
JPA(Entity)에서 Enum 사용하기
Entity에서는 @Enumerated를 사용하여 Enum을 데이터베이스에 저장합니다.
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private UserAgentType userAgentType;
}
EnumType.STRING
DB에는 문자열이 저장됩니다.
| id | user_agent_type |
| 1 | MOBILE |
| 2 | PC |
| 3 | BOT |
EnumType.ORDINAL
@Enumerated(EnumType.ORDINAL)
숫자로 저장됩니다.
| id | user_agent_type |
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
하지만 ORDINAL은 Enum의 순서가 변경되면 기존 데이터가 잘못 해석될 수 있습니다.
예를 들어 중간에 새로운 Enum을 추가하면 저장된 숫자의 의미가 모두 바뀌게 됩니다.
따라서 실무에서는 대부분 EnumType.STRING을 사용하는 것을 권장합니다.
switch 문에서 Enum 사용하기
Enum은 switch 문과 함께 사용하면 코드가 더욱 깔끔해집니다.
switch (user.getUserAgentType()) {
case PC:
System.out.println("PC 접속");
break;
case MOBILE:
System.out.println("모바일 접속");
break;
case BOT:
System.out.println("검색봇 접속");
break;
default:
System.out.println("기타");
}
문자열을 비교하는 것보다 성능과 가독성 모두 뛰어납니다.
실무에서는 코드와 설명을 함께 관리한다
실제 프로젝트에서는 단순히 이름만 사용하는 경우보다 코드(Code) 와 설명(Description) 을 함께 관리하는 경우가 많습니다.
public enum UserAgentType {
PC("PC", "데스크톱"),
MOBILE("MO", "모바일"),
TABLET("TB", "태블릿"),
BOT("BOT", "검색봇");
private final String code;
private final String description;
UserAgentType(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
}
사용 예제입니다.
UserAgentType type = UserAgentType.MOBILE;
System.out.println(type);
System.out.println(type.getCode());
System.out.println(type.getDescription());
실행 결과
MOBILE
MO
모바일
이 방식을 사용하면 화면에는 설명을 출력하고, 시스템 내부에서는 코드를 사용하는 등 다양한 요구사항을 쉽게 처리할 수 있습니다.
실무에서 Enum을 많이 사용하는 사례
다음과 같은 경우에는 거의 대부분 Enum을 사용합니다.
- 사용자 권한(Role)
- 주문 상태(OrderStatus)
- 결제 상태(PaymentStatus)
- 회원 상태(MemberStatus)
- 브라우저 종류(UserAgentType)
- 게시글 상태(PostStatus)
- 배송 상태(DeliveryStatus)
- 로그인 방식(LoginType)
- 성별(Gender)
- 국가 코드(CountryCode)
허용 가능한 값이 정해져 있는 데이터라면 Enum이 가장 적합한 선택입니다.
사용 시 주의사항
- EnumType.ORDINAL은 가능한 사용하지 않는 것이 좋습니다.
- Enum 이름은 변경하지 않는 것이 좋습니다.
- 화면에 보여줄 문자열은 별도의 설명(description) 필드를 사용하는 것이 좋습니다.
- 공통 코드성 데이터는 Enum으로 관리하면 유지보수가 쉬워집니다.
- 비즈니스 로직이 있다면 Enum 내부에 메서드를 추가해 관리하는 것도 좋은 방법입니다.
자주 묻는 질문(FAQ)
Q1. Enum과 String 중 어떤 것을 사용하는 것이 좋나요?
허용 가능한 값이 정해져 있다면 Enum을 사용하는 것이 좋습니다. 타입 안정성과 유지보수성이 크게 향상됩니다.
Q2. JPA에서는 STRING과 ORDINAL 중 무엇을 사용해야 하나요?
실무에서는 대부분 EnumType.STRING을 사용합니다. Enum 순서가 변경되어도 기존 데이터가 안전하게 유지됩니다.
Q3. Enum에도 변수와 메서드를 만들 수 있나요?
가능합니다. Enum은 단순한 상수 집합이 아니라 생성자, 필드, 메서드를 가질 수 있는 특별한 클래스입니다.
Q4. Enum 안에서 비즈니스 로직을 작성해도 되나요?
네. 상태별 동작이나 공통 로직을 Enum 내부에 작성하면 객체지향적인 코드로 관리할 수 있습니다.
마무리
Java Enum은 단순히 상수를 모아놓은 기능이 아니라 정해진 값만 사용할 수 있도록 보장하는 강력한 타입입니다.
특히 Spring Boot에서는 DTO, Entity, Controller, Service 등 거의 모든 계층에서 활용되며, 데이터의 일관성과 코드의 안정성을 높이는 데 큰 도움이 됩니다.
실무에서는 EnumType.STRING을 사용해 데이터베이스와 연동하고, 코드와 설명을 함께 관리하는 패턴을 적용하면 유지보수성과 확장성을 더욱 높일 수 있습니다.
허용 가능한 값이 정해져 있는 데이터라면 String보다 Enum을 사용하는 습관을 들이는 것이 장기적으로 훨씬 효율적인 개발 방법입니다.
'실무개발' 카테고리의 다른 글
| Spring Boot @ControllerAdvice 사용법 완벽 가이드: 예외 처리부터 basePackages 옵션까지 (0) | 2026.08.05 |
|---|---|
| JavaScript event.target과 this 차이점, HTML dialog 클릭 이벤트 완벽 정리 (0) | 2026.07.30 |
| JWT 인증 실패와 권한 오류 처리 전략, 401과 403을 올바르게 구분하는 방법 (0) | 2026.07.28 |
| Spring @ModelAttribute 사용법, POST 요청에서도 자동 바인딩될까? (0) | 2026.07.24 |
| VS Code + Spring Boot + Gradle에서 외부 JAR 파일 적용하는 방법 (0) | 2026.07.24 |
