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가 됩니다.
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() 로직을 감싸는 유틸리티 메서드를 만드는 것도 좋은 방법입니다.
'스마트웹앱콘텐츠전문가 > JAVA' 카테고리의 다른 글
효율적인 Java 배열 처리법: null 값 처리와 배열 변환을 위한 코드 예시 (0) | 2025.04.17 |
---|---|
Java에서 배열 요소까지 검증하려면? 유효성 어노테이션 완전 분석 (0) | 2025.04.09 |
MyBatis 조회 결과 null 예외 해결법: 안전한 select 처리 가이드 (0) | 2025.04.09 |
자바 롬복(Lombok) 이클립스 설정법과 활용 팁 (0) | 2025.03.14 |
자바 롬복(Lombok) 완벽 가이드: 애너테이션으로 코드 간소화하기 (0) | 2025.03.14 |