커맨드 패턴이란?
커멘드 패턴은 여러 객체들에 명령(Command)을 해야 할 때 사용되는 패턴입니다.
커맨드 패턴 간단한 원리
command가 만들어지면 createBraodcast란 커맨드로 antmedia, broadcast 등에 메서드 하나로 조작할 수 있습니다.
커맨드 패턴 사용한 이유
- 스트리밍 서버를 antmedia와 broadband 두가지를 사용하고 있습니다.
- 방송 시작할 때 antmedia와 broadband 로직의 차이가 있습니다.
- antmedia - 방송 할때마다 새로운 송출 주소를 생성함
- broadband - 이미 생성되어 있는 송출 주소로 매번 방송을 시작함
- 그래서 방송 시작 로직에 방송 시작 커맨드 실행하면 각각의 로직을 실행하게 끔 했습니다.
커맨드 패턴 적용
- Map으로 각 스트리밍 서버를 구분할 팩토리를 만듭니다.
BroadcastTypeOriginFactory.java
@Component
@RequiredArgsConstructor
public class BroadcastTypeOriginFactory {
private final BroadbandCommand broadbandCommand;
private final AntOriginCommand antMediaCommand;
private final Map<BroadcastType, BroadcastCommand> originCommandMap;
@PostConstruct
void mediaCommandMap() {
originCommandMap.put(BroadcastType.BROADBAND, broadbandCommand);
originCommandMap.put(BroadcastType.ANT, antMediaCommand);
}
public BroadcastCommand getMediaCommand(BroadcastType broadcastType) {
BroadcastCommand originCommand = originCommandMap.get(broadcastType);
if (originCommand == null) {
throw new BusinessException(ErrorCode.NOT_EXIST_SERVICE);
}
return originCommand;
}
}
- 인터페이스로 broadcastCommand를 만듭니다.
public interface BroadcastCommand {
void createBroadcast(CreateOriginBroadcastRequest originBroadcastRequest);
// 커맨드 할 메서드들
// 저는 broadcastStart, finishBroadcast 등이 있습니다.
}
- 각 서비스들에 인터페이스를 구현합니다.
@Service
@RequiredArgsConstructor
public class BroadbandCommand implements BroadcastCommand {
private final BroadbandDomainRepository broadbandDomainRepository;
private final BroadbandStreamingRepository broadbandStreamingRepository;
private final BroadbandIDCApiCaller broadbandIDCApiCaller;
private final BroadbandService broadbandService;
@Override
public void broadcastStart(StartOriginBroadcastRequest request) {
// 로직 작성
}
@Service
@RequiredArgsConstructor
public class AntOriginCommand implements BroadcastCommand {
private final AntMediaStreamingRepository antMediaStreamingRepository;
private final BroadbandStreamingRepository broadbandStreamingRepository;
private final StreamingTypeOriginFactory streamingTypeOriginFactory;
@Override
@Transactional
public void broadcastStart(StartOriginBroadcastRequest request) {
// 로직 작성
}
- 나머지 코드 구현
@Transactional
public void broadcastStart(GetBroadcastRequest request, Long storeId, Long pricePolicyId) {
// 로직..
BroadcastCommand originCommand = broadcastTypeOriginFactory.getMediaCommand(broadcast.getBroadcastType());
originCommand.broadcastStart(originBroadcastRequest);
// 로직..
}
느낀점
코드를 보면 예전에 적은 전략패턴하고 비슷합니다. 저는 커맨드 패턴을 기존 broadcastStart 로직을 수행하다가 나뉘어야하는 부분에 ‘A의 방송 시작 커맨드를 실행시켜줘’ 라는 느낌으로 했습니다. 처음부터 나눠서 로직을 작성하다 보면 broadcastStart 로직에 중복된게 많이 생겨서 위처럼 했습니다.
'spring boot > spring boot' 카테고리의 다른 글
spring boot에서 filter (0) | 2021.12.04 |
---|---|
spring boot 에서 argumentResolver (0) | 2021.12.04 |
spring boot 에서 interceptor (0) | 2021.12.04 |
spring의 dispatcher-servlet와 전체적인 흐름 (0) | 2021.10.20 |
spring 기본 개념 - IOC, DI (0) | 2021.10.18 |