스마트웹앱콘텐츠전문가/JAVA

Enum 없이도 가능한 Java 비교 로직: compareTo() 한 줄로 끝내기

9D4U 2025. 4. 18. 13:50
728x90
반응형

Java 기반의 웹 프로젝트나 백엔드 시스템을 개발하다 보면 사용자 권한 또는 직급을 기준으로 로직을 분기하거나

접근을 제한해야 할 때가 많습니다.

그럴 때 자주 사용되는 방법 중 하나가 compareTo() 메서드를 활용한 문자열 비교입니다.

 

이번 포스팅에서는 아래와 같은 코드 한 줄을 중심으로 이를 어떻게 해석하고,

어떻게 활용할 수 있는지 상세하게 설명해 드립니다.

 

 

UserConst.GROUP_POST.compareTo(loginUser.getPost()) > 0

 

이 코드를 보면서 “이게 무슨 의미지?” 하고 의문이 들었다면,

지금부터 천천히 따라오세요. 자바 초보자부터 중급자까지 이해할 수 있도록 쉽게 풀어보겠습니다.

 

 

 

 

 


1. compareTo() 메서드란?

 

Java의 String 클래스와 많은 Enum, 사용자 정의 객체들은 Comparable 인터페이스를 구현하고 있습니다.

이 인터페이스에 정의된 대표 메서드가 바로 compareTo()입니다.

 

int compareTo(T o);
  • this > o이면 양수 반환
  • this == o이면 0 반환
  • this < o이면 음수 반환

 

 

예를 들어,

"Manager".compareTo("Admin") > 0 // true

 

이 경우 "Manager"가 "Admin"보다 사전적으로 뒤에 있기 때문에 양수를 반환합니다.

따라서 조건문은 true가 됩니다.

 

 

IMG

 


2. 실제 코드 분석

 

 

UserConst.GROUP_POST.compareTo(loginUser.getPost()) > 0

 

이 코드는 다음과 같은 의미를 가집니다:

UserConst.GROUP_POST의 값이 로그인한 사용자 직급 코드보다 높은가?

구체적으로 해석해볼게요.

  • UserConst.GROUP_POST: 시스템에 정의된 상수. 예를 들어 "E"이라는 문자열이 저장되어 있을 수 있습니다.
  • loginUser.getPost(): 로그인한 사용자의 직급 코드. 예: "A", "B", "C" 등

 

예시:

UserConst.GROUP_POST = "E";
loginUser.getPost() = "A";

→ "E".compareTo("A") > 0
→ "사전 순서상 E가 A보다 뒤" → 조건 성립 (true)

 

이 경우 로그인한 사용자의 직급이 A이므로,

E보다 낮은 권한으로 간주되어 조건이 성립됩니다.

 

 

 

 

 


3. 왜 compareTo()를 사용할까?

 

compareTo()를 사용하는 가장 큰 이유는 간단하고 직관적인 비교를 가능하게 하기 때문입니다.

특히 직급(Post)이나 권한(Role)이 문자열로 정리되어 있는 경우,

따로 숫자 값을 매기지 않고도 쉽게 우선순위를 정할 수 있습니다.

 

하지만 이 방법에는 단점도 있습니다.

 

 

 

반응형

 

 


4. 문자열 비교의 한계점

 

Java의 compareTo()는 기본적으로 사전 순서(lexicographical order)에 따라 비교합니다.

이 말은, 실제 직급 순서와 문자열 순서가 일치하지 않는 경우 잘못된 비교 결과를 가져올 수 있다는 뜻입니다.

 

 

예를 들어:

"A" < "E" // 사전순 맞지만, 시스템상 권한은 A > E일 수 있음

 

이런 문제가 발생하면 권한 로직 전체가 잘못 작동할 위험이 있습니다.

 

 

 

 


5. 더 안전한 대안: Enum 또는 숫자 비교

 

 

직급, 권한 등은 실제로 정렬 순서가 중요한 데이터이기 때문에, 문자열 대신 Enum을 사용하면 훨씬 안전합니다.

 

Enum 사용 예시:

 

public enum UserRole {
    A,
    B,
    E
}

// 비교 예:
UserRole.E.compareTo(UserRole.A) > 0 // true

 

이렇게 하면 시스템적으로도 명확한 순서를 유지할 수 있고, 오타나 순서 오류 위험도 줄어듭니다.

또 다른 방법으로는 DB나 상수 설정에서 아예 숫자 값을 매기는 것도 좋습니다:

 

직급 코드 - 직급 이름 -  순위

A 관리자 3
E 매니저 2
B 중간 관리자 1

 

→ 숫자 값끼리 비교하면 혼동이 줄어듭니다.

 

 

 

 

 


 

  • compareTo()는 문자열/Enum 간의 정렬 비교를 할 때 쓰는 메서드입니다.
  • 위 코드에서 핵심은 "상수 직급이 로그인 직급보다 높은가"를 판단하는 것입니다.
  • 단, 문자열 비교는 실제 직급 순서와 다를 수 있으므로, 가능한 Enum 또는 숫자 기반 비교로 개선하는 것이 좋습니다.
  • 직급/권한 비교에는 항상 정렬 기준이 명확한 자료구조를 사용하세요.
  • 유지보수를 생각하면 문자열 대신 Enum 또는 코드 + 숫자 구조를 추천합니다.
  • 실제 시스템에서는 compareTo() 로직을 감싸는 유틸리티 메서드를 만드는 것도 좋은 방법입니다.
728x90