Skip to content

비지니스 검증을 할 때 도메인과 서비스 어느 쪽에서 예외를 터뜨려야 할까? #3

@Yiseull

Description

@Yiseull

상황 설명

투표 참여 기능을 개발 중인데, 예외 처리에 대한 고민이 생겼다. 기능의 규칙은 다음과 같다.
사용자는 오직 진행 중인 투표에만 참여할 수 있어야 한다. 사용자가 이미 종료된 투표에 참여하려고 시도한다면, 이때 예외를 발생시켜야 한다. 이런 상황에서, 예외 발생은 도메인과 서비스 중 어느 곳에서 처리해야 하는 것이 적절할까?

예시는 실제 로직보다 간소화했습니다.

1. 도메인에서 예외 발생

Vote

public void validateVoting() {
	final LocalDateTime now = LocalDateTime.now();
	if (this.endTime.isAfter(now)) {
		throw new BusinessException(ErrorCode.VOTE_CANNOT_PARTICIPATE);
	}
}

VoteService

public void participateVote(
	final Long voteId,
	final Long itemId,
	final Long memberId,
) {
	final Vote vote = voteReader.read(voteId);

	vote.validateVoting();

	voteManager.participate(vote, memberId, itemId);
}

2. 서비스에서 예외 발생

Vote

public boolean isVoting() {
	final LocalDateTime now = LocalDateTime.now();
	return this.endTime.isAfter(now);
}

VoteService

public void participateVote(
	final Long voteId,
	final Long itemId,
	final Long memberId,
) {
	final Vote vote = voteReader.read(voteId);

	if (!vote.isVoting()) {
		throw new BusinessException(ErrorCode.VOTE_CANNOT_PARTICIPATE);
	}

	voteManager.participate(vote, memberId, itemId);
}

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions