Enum 찾기의 달인 (효율적으로 찾기, spring bean과 맵핑)
enum 이전 포스팅 : https://sjh836.tistory.com/134
1. 이놈(Enum...)을 효율적으로 찾는 방법
- 장르, 카테고리, 각종 컨텐츠 타입 등 enum 의 활용은 무궁무진하다. enum 을 잘 선언했다면, enum 을 잘 찾는 것도 중요하다
- 예를들어 DB에 enum name 이 아닌.. 무언가 코드값만 저장하고, 꺼내쓸 때 코드를 enum 으로 바꾸는 상황을 가정해보자.
- 다른 예제로는 API 응답값 내 코드를 우리 서비스의 enum 으로 바꿔쳐야한다던지..
- 아래에서는 enum 을 찾아내는 3가지 예제 코드들이다.@Getter @AllArgsConstructor public enum
@Getter
@AllArgsConstructor
public enum OperatingSystemType {
WINDOW("100"),
UBUNTU("101"),
MAC("102");
private String code;
}
// 1번
public static OperatingSystemType getOs1ByCode(String code) {
for (OperatingSystemType os : OperatingSystemType.values()) {
if (os.getCode().equals(code)) {
return os;
}
}
return null;
}
// 2번
public static OperatingSystemType getOs2ByCode(String code) {
// 또는 switch
if ("100".equals(code)) {
return OperatingSystemType.WINDOW;
} else if ("101".equals(code)) {
return OperatingSystemType.UBUNTU;
} else if ("102".equals(code)) {
return OperatingSystemType.MAC;
} else {
return null;
}
}
// 3번
public static final Map<String, OperatingSystemType> map = new HashMap<>();
static {
for (OperatingSystemType os : OperatingSystemType.values()) {
map.put(os.getCode(), os);
}
}
public static OperatingSystemType getOs3ByCode(String code) {
return map.get(code);
}
- enum 이 몇개 없어서 반복을 길게하여(천만번) 테스트해보면 결과는 다음과 같다.
- 1번은 3번보다 6배 느리다. (150ms)
- 2번은 3번보다 2배 느리다. (45ms)
- 3번 기준 (25ms)
- 컴퓨팅파워, 실제로 한번에 수천수만번회까지 갈 일이 크게 없다는 점을 고려하면 큰 차이는 아니지만, 사소한 팁..!
- 3번관련하여 주의할 점은... enum 생성자가 호출되기 전에 참조를 시도하면 null 이 발생한다. LazyHolder 패턴으로 극복할 수 있을 듯
2. Enum 으로 Bean 을 찾아보자
- 비즈니스를 구현하다보면, enum type 에 따라 실행시킬 bean 이 달라지면 구조가 깔끔하겠다.. 하는 경우가 생긴다.
- 이럴 때, enum 과 bean 을 매핑하는 몇 가지 경우가 있다.
- enum 속성으로 String beanName 정의 => spring context 안에서 applicationContext.getBean(type.getBeanName());
- enum 속성으로 Class<?> beanType 정의 => spring context 안에서 applicationContext.getBean(type.getBeanType());
- EnumMap 으로 enum 과 bean 을 바로 맵핑
Map<OperatingSystemType, OperatingSystemHandler> map = new EnumMap<>(OperatingSystemType.class);
// OperatingSystemHandler 구현체에서 enum type 을 getType 메소드로 명시
for (OperatingSystemHandler handler : operatingSystemHandlerList) {
map.put(handler.getType(), handler);
}
- (백만번) 테스트해보면 결과는 다음과 같다.
- 1번은 2번보다 조금 빠르다. (각각 120ms , 160ms)
- BeanFactory와 ApplicationContext 의 구현체들의 getBean 이 복잡하기 때문
- 3번은 1번과 2번보다 5배 이상 빠르다. (약 20ms)
- (3번에서 EnumMap 대신 HashMap 등을 쓰면 약 35ms)
- EnumMap이 더 빠른 이유는 enum이 단일객체 key임이 보장되어 해싱 등 작업 불필요)
- 1번은 2번보다 조금 빠르다. (각각 120ms , 160ms)
- 소소한 차이지만, 성능과 접근뎁스에서 EnumMap 이 가장 우위에 있음을 알 수 있다.
출처: https://sjh836.tistory.com/175?category=679845 [빨간색코딩]
'JAVA > Java' 카테고리의 다른 글
자바에서 final에 대한 이해 (0) | 2021.04.07 |
---|---|
[자바 프로그래밍] 자바 this를 파헤쳐보자 (0) | 2021.03.29 |
[Java] Java Optional (자바 옵셔널) 정리, 예제모음 (0) | 2021.03.29 |
[Java] Java 클래스 로딩 과정(Java Class Loading Process) (0) | 2021.03.29 |
lambda (람다, 표현식, 함수형 인터페이스, default 메소드, 메소드 레퍼런스) (0) | 2021.03.21 |
객체지향 설계 5원칙 SOLID (SRP, OCP, LSP, ISP, DIP) (0) | 2021.03.21 |
객체지향의 4대 특성 (클래스, 객체, 인스턴스, 캡슐화, 상속, 추상화, 다형성) (0) | 2021.03.21 |
스레드덤프 (thread dump) (0) | 2021.03.21 |