룩업테이블

ssongyi·2025년 4월 21일
0

Java/Spring TIL

목록 보기
10/11

다른 조 발표 영상을 보다가 '룩업 테이블' 이라는 생소한 용어를 접해 알아보게 됐다.

룩업 테이블(Lookup Table)

값을 빠르게 찾기 위한 미리 만들어 놓은 표

  • 특정 입력값에 대해 미리 계산된 결과 값을 저장해 놓고, 나중에 해당 값을 빠르게 가져다 쓰는 참조용 데이터 표
  • 일종의 맵(Map), 딕셔너리(Dictionary) 같은 자료구조로 구현 가능
  • B에서는 "코드 테이블"이라고 부르기도 함 (예: 성별, 국가, 직업 코드 등)

룩업 테이블 구현방법

배열, HashMap, EnumMap 등 다양한 방식으로 만들 수 있으며, 어떤 자료구조를 선택하느냐에 따라 성능과 코드 가독성이 달라짐

1. 배열(Array) 기반 룩업 테이블

public class SquareLookup {
    private static final int[] squares = new int[101];

    static {
        for (int i = 0; i <= 100; i++) {
            squares[i] = i * i;
        }
    }

    public static int getSquare(int num) {
        return squares[num];
    }
}
  • 속도가 매우 빠름 (O(1) 접근)
  • 인덱스(정수 범위)가 명확할 때 유리
  • 범위 외 값에 대한 예외 처리가 필요함

2. HashMap 기반 룩업 테이블

public class DayLookup {
    private static final Map<Integer, String> dayMap = new HashMap<>();

    static {
        dayMap.put(1, "월요일");
        dayMap.put(2, "화요일");
        dayMap.put(3, "수요일");
        dayMap.put(4, "목요일");
        dayMap.put(5, "금요일");
        dayMap.put(6, "토요일");
        dayMap.put(7, "일요일");
    }

    public static String getDay(int number) {
        return dayMap.getOrDefault(number, "알 수 없음");
    }
}
  • 키 값이 정수가 아닌 경우 유리 (예: 문자열, enum 등)
  • 빠른 접근 (O(1)에 가까움)
  • 범용성 좋고, 유연함

3. EnumMap 기반 룩업 테이블

public enum Role {
    ADMIN, USER, GUEST
}

public class RoleDescriptionLookup {
    private static final EnumMap<Role, String> descriptions = new EnumMap<>(Role.class);

    static {
        descriptions.put(Role.ADMIN, "관리자 권한");
        descriptions.put(Role.USER, "일반 사용자");
        descriptions.put(Role.GUEST, "비회원 사용자");
    }

    public static String getDescription(Role role) {
        return descriptions.get(role);
    }
}
  • Enum을 키로 쓰는 특수 목적용 Map
  • HashMap보다 메모리 효율이 좋고 빠름
  • Enum 기반 도메인 로직에 매우 적합

룩업 테이블을 왜 초기화해야할까?

룩업 테이블은 보통 변하지 않는 참조 데이터를 담고 있다.
그런데 Java에서는 정적인 자료구조를 만들어도, Spring Bean이 완전히 초기화되기 전에 데이터를 넣으면 문제가 발생할 수 있어요.

그래서 다음과 같은 이유로 초기화 타이밍이 중요하다.

@PostConstruct 를 활용한 초기화

@Component
public class CountryCodeLookup {

    private final Map<String, String> codeMap = new HashMap<>();

    @PostConstruct
    public void init() {
        codeMap.put("KR", "대한민국");
        codeMap.put("US", "미국");
        codeMap.put("JP", "일본");
        // 필요시 DB나 API에서 불러오기 가능
    }

    public String getCountryName(String code) {
        return codeMap.getOrDefault(code, "알 수 없음");
    }
}
  • @Component로 등록된 이 Bean은 Spring이 관리합니다.
  • @PostConstruct는 Spring이 모든 의존성 주입을 완료한 후 딱 한 번 호출합니다.
  • 이 안에서 Map이나 기타 룩업 구조를 초기화해두면 안전하고 효율적으로 참조할 수 있음

@PostConstruct 사용 시 주의할 점

  1. @PostConstruct는 한 번만 실행되며, 비즈니스 로직을 넣으면 X
  2. 복잡한 로직이 있다면 따로 initService 같은 서비스 클래스로 위임하는 게 좋다.
  3. 멀티 스레드 환경에서 데이터를 변경하지 않도록 불변(immutable) 또는 ConcurrentMap 사용을 고려해야 함

0개의 댓글