hufscheer / spectator-server

7 stars 0 forks source link

[FEAT] 타임라인 삭제 기능 구현 #175

Closed ldk980130 closed 3 months ago

ldk980130 commented 3 months ago

🌍 이슈 번호

📝 구현 내용

🍀 확인해야 할 부분

다형성을 최대한 활용

타임라인 생성과 삭제를 아래 서비스 로직만으로 다 처리하도록 다형성을 최대한으로 활용해 보았습니다. 적어도 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);
    }