[리팩토링] 리스트 조회에서 api 만 분리하기

API 분리

  • 별도 상품종류에 대한 설정 코드를 api 로 분리하기
상품종류 선언
		별도 속성에 대해 설정함.
		서비스를 통해 상품종류에 대한 조회(VO)

를 DTO 로 해당 종류에 대해 조회할 수 있도록 설정함

REST CONTROLLER

@RestController("/api/board")
@RequiredArgsConstructor
@Slf4j
public class 상품API{
    
    private final 상품서비스 상품서비스;
    
    @GetMapping("/config/list/{bcId}")
    public ResponseEntity<상품설정> 상품설정정보조회(@PathVariable("상품정보") String 상품정보, 상품설정정보DTO 상품설정정보DTO) {
        상품설정 상품설정= 상품서비스.상품설정정보조회(상품설정정보DTO);
        return new ResponseEntity<>(상품설정, HttpStatus.OK);
    }
}

DTO

@Value
public class 상품설정정보DTO implements Serializable {
    String 상품종류;
    String 멀티도메인;
}

어드민과 일반 사용자를 분리해야하는 경우

  • 해당 경우 인터셉터에서 별도 어드민, 일반 사용자를 분리하는 전역처리가 되어있음.
public class NoticeFilterStrategyFactory {
    
    public static NoticeFilterStrategy getNoticeFilterStrategy(boolean isBoardManager) {
        if (isBoardManager) {
            return new ManagerNoticeFilterStrategy();
        }
        return new UserNoticeFilterStrategy();
    }
}
public interface NoticeFilterStrategy {
    
    boolean shouldShowNotice(BoardArticle boardArticle);
}
public class ManagerNoticeFilterStrategy implements NoticeFilterStrategy {
    
    @Override
    public boolean shouldShowNotice(BoardArticle boardArticle) {
        return true;
    }
}
public class UserNoticeFilterStrategy implements NoticeFilterStrategy {
    
    @Override
    public boolean shouldShowNotice(VO notice) {
        return isWithinDisplayPeriod(notice);
    }
    
    private boolean isWithinDisplayPeriod(VO notice) {
        // 표기할 VO 로직
        
        return true;
    }
    
}
  • 전략패턴으로 OCP 를 통한 확장에 용이하게 수정하였다.

        return notFilteredNotices.stream()
                                 .filter(noticeFilterStrategy::shouldShowNotice)
.collect(Collectors.toList()); // TODO unmodifiedList 로 변경해야함 java 11 로 마이그레이션시 주의하셈
  • 서비스단에서 별도 전략에 따라 필터링 방법을 다르게 정할 수 있으며, 별도 전략 수정시에도 대응가능.
  • 수정불가능한 리스트로 반환해야합니다.

Uploaded by N2T