다른 조 발표 영상을 보다가 '룩업 테이블' 이라는 생소한 용어를 접해 알아보게 됐다.
값을 빠르게 찾기 위한 미리 만들어 놓은 표
- 특정 입력값에 대해 미리 계산된 결과 값을 저장해 놓고, 나중에 해당 값을 빠르게 가져다 쓰는 참조용 데이터 표
- 일종의
맵(Map)
,딕셔너리(Dictionary)
같은 자료구조로 구현 가능- B에서는 "코드 테이블"이라고 부르기도 함 (예: 성별, 국가, 직업 코드 등)
배열, HashMap, EnumMap
등 다양한 방식으로 만들 수 있으며, 어떤 자료구조를 선택하느냐에 따라 성능과 코드 가독성이 달라짐
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];
}
}
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, "알 수 없음");
}
}
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);
}
}
HashMap
보다 메모리 효율이 좋고 빠름룩업 테이블은 보통
변하지 않는 참조 데이터
를 담고 있다.
그런데 Java에서는 정적인 자료구조를 만들어도,Spring Bean이 완전히 초기화되기 전에 데이터를 넣으면 문제가 발생
할 수 있어요.
그래서 다음과 같은 이유로 초기화 타이밍이 중요하다.
@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이 관리합니다.@PostConstruc
t는 Spring이 모든 의존성 주입을 완료한 후 딱 한 번
호출합니다.@PostConstruct
는 한 번만 실행되며, 비즈니스 로직을 넣으면 XinitService
같은 서비스 클래스로 위임하는 게 좋다.불변(immutable)
또는 ConcurrentMap
사용을 고려해야 함