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