본문 바로가기
개발/Spring

MVC 패턴(3) - 비즈니스 로직 구현

by BellOne4222 2024. 2. 19.

@Service

  • 비즈니스 로직을 담당하는 컴포넌트
  • 도메인 모델(데이터)과 컨트롤러 사이에 위치
  • 구현 방식
    1. 인터페이스 + 클래스 
      • 인터페이스를 요구사항에 따른 기능 문서(javadoc)로 작성
      • 같은 기능을 하는 다양한 구현체를 작성할 니즈가 예상될 때 적합하다
    2. 클래스
      • 인터페이스를 추가로 작성하는 수고를 덜 수 있다.
      • 컨트롤러 레이어와의 결합도가 증가한다.

 

2. 클래스 방식으로 EventService 구현

// EventService

@RequiredArgsConstructor
@Service // EventService 인터페이스 구현체
public class EventService{

	private final EventRepository eventRepository;

	public List<EventDto> getEvents(Long placeId, String eventName, EventStatus eventStatus,
		LocalDateTime eventStartDatetime, LocalDateTime eventEndDatetime) {
		return eventRepository.findEvents(placeId, eventName, eventStatus, eventStartDatetime, eventEndDatetime);
	}
    

// APIEventController

@RequiredArgsConstructor
@RequestMapping("/api")
@RestController
public class ApiEventController {

	private final EventService eventService;

	@GetMapping("/events")
	public ApiDataResponse<List<EventResponse>> getEvents(
		Long placeId, String eventName, EventStatus eventStatus,
		@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime eventStartDatetime,
		@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime eventEndDatetime
	){
		List<EventResponse> response = eventService
			.getEvents(placeId, eventName, eventStatus, eventStartDatetime, eventEndDatetime)
			.stream().map(EventResponse::from).toList();
		return ApiDataResponse.of(response);

	}
    
  // eventRepository
  
  public interface EventRepository {

	default List<EventDto> findEvents(
		Long placeId, String eventName, String eventStatus, LocalDateTime eventStartDatetime, LocalDateTime eventEndDatetime
	) {
		return List.of();
	}
    
  // eventResponse
  public record EventResponse(
	Long placeId,
	String eventName,
	EventStatus eventStatus,
	LocalDateTime eventStartDatetime,
	LocalDateTime eventEndDatetime,
	Integer currentNumberOfPeople,
	Integer capacity,
	String memo
) {

	public static EventResponse of(
		Long placeId,
		String eventName,
		EventStatus eventStatus,
		LocalDateTime eventStartDatetime,
		LocalDateTime eventEndDatetime,
		Integer currentNumberOfPeople,
		Integer capacity,
		String memo
	) {
		return new EventResponse(
			placeId,
			eventName,
			eventStatus,
			eventStartDatetime,
			eventEndDatetime,
			currentNumberOfPeople,
			capacity,
			memo
		);
	}

	public static EventResponse from(EventDto eventDto) {
		if (eventDto == null) { return null; }
		return EventResponse.of(
			eventDto.placeId(),
			eventDto.eventName(),
			eventDto.eventStatus(),
			eventDto.eventStartDatetime(),
			eventDto.eventEndDatetime(),
			eventDto.currentNumberOfPeople(),
			eventDto.capacity(),
			eventDto.memo()
		);
	}

}

'개발 > Spring' 카테고리의 다른 글

오류 처리  (0) 2024.02.19
Validation  (0) 2024.02.19
Test Driven Development(TDD)  (1) 2024.02.18
Controller Test  (0) 2024.02.18
ControllerAdvice  (0) 2024.02.17