타임라인 생성과 삭제를 아래 서비스 로직만으로 다 처리하도록 다형성을 최대한으로 활용해 보았습니다. 적어도 TimelineService 내부에선 각 구현체를 신경쓰지 않고 로직을 처리할 수 있습니다.
@Service
@Transactional
@RequiredArgsConstructor
public class TimelineService {
private final TimelineRepository timelineRepository;
private final EntityUtils entityUtils;
private final TimelineMapper timelineMapper;
public void register(Member member, Long gameId, TimelineRequest request) {
Game game = checkPermissionAndGet(gameId, member);
Timeline timeline = timelineMapper.toEntity(game, request);
timelineRepository.save(timeline);
}
public void deleteTimeline(Member member, Long gameId, Long timelineId) {
Game game = checkPermissionAndGet(gameId, member);
Timeline timeline = getLastTimeline(timelineId, game);
timeline.rollback();
timelineRepository.delete(timeline);
}
위처럼 구현하기 위해 TimelineRequest Dto를 상속 구조로 변경했습니다.
@Getter
@AllArgsConstructor
public class TimelineRequest {
private final Long gameTeamId;
private final Long recordedQuarterId;
private final Integer recordedAt;
@Getter
public static class RegisterScore extends TimelineRequest {
private final Long scoreLineupPlayerId;
public RegisterScore(
Long gameTeamId,
Long recordedQuarterId,
Long scoreLineupPlayerId,
Integer recordedAt
) {
super(gameTeamId, recordedQuarterId, recordedAt);
this.scoreLineupPlayerId = scoreLineupPlayerId;
}
}
@Getter
public static class RegisterReplacement extends TimelineRequest {
private final Long originLineupPlayerId;
private final Long replacementLineupPlayerId;
public RegisterReplacement(
Long gameTeamId,
Long recordedQuarterId,
Long originLineupPlayerId,
Long replacementLineupPlayerId,
Integer recordedAt
) {
super(gameTeamId, recordedQuarterId, recordedAt);
this.originLineupPlayerId = originLineupPlayerId;
this.replacementLineupPlayerId = replacementLineupPlayerId;
}
}
}
타임라인 삭제 시 각 구현체마다의 롤백 로직
타임라인이 삭제되면 각 구현체마다 해야하는 행동이 다를 수 있습니다.
Timeline 부모 클래스에 rollback 추상 메서드를 정의 후 각 구현체에서 오버라이드하도록 했습니다. 지금은 ScoreTimeline에만 로직이 들어갔지만 추가될 예정입니다.
@Override
public void rollback() {
game.cancelScore(scorer);
}
🌍 이슈 번호
📝 구현 내용
🍀 확인해야 할 부분
다형성을 최대한 활용
타임라인 생성과 삭제를 아래 서비스 로직만으로 다 처리하도록 다형성을 최대한으로 활용해 보았습니다. 적어도
TimelineService
내부에선 각 구현체를 신경쓰지 않고 로직을 처리할 수 있습니다.위처럼 구현하기 위해
TimelineRequest
Dto를 상속 구조로 변경했습니다.타임라인 삭제 시 각 구현체마다의 롤백 로직
타임라인이 삭제되면 각 구현체마다 해야하는 행동이 다를 수 있습니다.
Timeline 부모 클래스에 rollback 추상 메서드를 정의 후 각 구현체에서 오버라이드하도록 했습니다. 지금은 ScoreTimeline에만 로직이 들어갔지만 추가될 예정입니다.