문제 사항

배너의 타입이 있고, 배너의 타입들은 다음과 같이 구성되어 있습니다.

  • 이벤트1
  • 이벤트2
  • 이벤트3
  • 이벤트4
  • 이벤트5
  • 광고1
  • 광고2
  • 광고3
  • 광고4
  • 광고5

여기에 하위 타입이 추가되며, 이벤트 타입 배너에만 하위 타입을 추가해야 합니다.

해결 방법

기존에 배너 타입을 별도로 정의하지 않아, ENUM 클래스로 추가했습니다. 또한 배너 타입을 ‘이벤트’, ‘광고’ 등으로 묶기 위해 *Group ENUM 클래스를 추가했습니다.

BannerType Eunm

@Getter
public enum BannerType {
    EVENT_1("이벤트1"),
    EVENT_2("이벤트2"),
    EVENT_3("이벤트3"),
    EVENT_4("이벤트4"),
    EVENT_5("이벤트5"),
    AD_1("광고1"),
    AD_2("광고2"),
    AD_3("광고3"),
    AD_4("광고4"),
    AD_5("광고5"),
    ;

    private String type;

    BannerType(String type) {
        this.type = type;
    }
    
    public static boolean isBannerType(String type) {
        return Arrays.stream(BannerType.values())
                .anyMatch(bannerType -> bannerType.getType().equals(type));
    }
    
    public static BannerType getBannerType(String type) {
        return Arrays.stream(BannerType.values())
                .filter(bannerType -> bannerType.getType().equals(type))
                .findAny()
                .orElse(null);
    }

}

BannerTypeGroup Enum

@Getter
public enum BannerTypeGroup {
    EVENT("이벤트", Arrays.asList(
            BannerType.EVENT_1,
            BannerType.EVENT_2,
            BannerType.EVENT_3,
            BannerType.EVENT_4,
            BannerType.EVENT_5
            )),
    AD("광고", Arrays.asList(
            BannerType.AD_1,
            BannerType.AD_2,
            BannerType.AD_3,
            BannerType.AD_4,
            BannerType.AD_5
            ));

    private String type;
    private List<BannerType> banners;

    BannerTypeGroup(String type, List<BannerType> banners) {
        this.type = type;
        this.banners = banners;
    }

    public boolean isBannerType(BannerType bannerType) {
        return banners.stream()
                .anyMatch(banner -> banner == bannerType);
    }

    public static BannerTypeGroup findByBannerType(BannerType bannerType) {
        return Arrays.stream(BannerTypeGroup.values())
                .filter(bannerTypeGroup -> bannerTypeGroup.isBannerType(bannerType))
                .findAny()
                .orElse(null);
    }
}

서비스에서 사용

BannerType bannerType = BannerType.getBannerType(banner_type);
BannerTypeGroup requestBannerType = BannerTypeGroup.findByBannerType(bannerType);
String eventTypeName = BannerTypeGroup.EVENT.name();
if (requestBannerType.name().equals(eventTypeName)) {
    // 이벤트 배너인 경우만 하위 타입 저장
}

Enum 사용법 및 예제

Java Enum 활용기-우아한형제들