문제 사항

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

  • 이벤트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 활용기-우아한형제들