https://taesan94.tistory.com/m/268

문제 상황

public class ReservedSeatService {

    private final ReservedSeatRepository reservedSeatRepository;
    private final SeatConverter seatConverter;
    private final SeatService seatService;
    private final ScheduleService scheduleService;

    public ReservedSeatService(ReservedSeatRepository reservedSeatRepository, SeatConverter seatConverter,
        SeatService seatService, ScheduleService scheduleService) {
        this.reservedSeatRepository = reservedSeatRepository;
        this.seatConverter = seatConverter;
        this.seatService = seatService;
        this.scheduleService = scheduleService;
    }

    public List<ResponseFindSeat> findReservePossibleSeats(Long scheduleId) {
        Schedule schedule = scheduleService.findById(scheduleId);
        List<Long> reservedSeatIdList = reservedSeatRepository.searchByScheduleIdStartsWith(scheduleId).stream()
            .map((reservedSeat) -> reservedSeat.getSeat().getId())
            .collect(toList());

        return seatService.findRemainSeats(schedule.getTheaterRoom().getId(), reservedSeatIdList).stream()
            .map(seatConverter::convertFromSeatToResponseFindSeat)
            .collect(toList());
    }

}

뭐가 문제?

첫 번째 시도 - 의존성을 컨트롤러에서 받아서 처리하기

먼저 findReservePossibleSeats함수를 예약 좌석 리스트를 찾는 역할만을 수행하도록 변경했다.

@Service
@Transactional(readOnly = true)
public class ReservedSeatService {
	private final ReservedSeatRepository reservedSeatRepository;
	private final SeatConverter seatConverter;

	public ReservedSeatService(ReservedSeatRepository reservedSeatRepository, SeatConverter seatConverter) {
		this.reservedSeatRepository = reservedSeatRepository;
		this.seatConverter = seatConverter;
	}

	public List<Long> findReservedIdListByScheduleId(Long scheduleId) {
		return reservedSeatRepository.searchByScheduleIdStartsWith(scheduleId).stream()
			.map((reservedSeat) -> reservedSeat.getSeat().getId())
			.collect(toList());
	}

    ...

}

그리고 기존 ReservedSeatService에 처리하던 다른 Service 호출을 Controller로 변경했다.

public class ReservedSeatController {

	private final ReservedSeatService reservedSeatService;
	private final SeatService seatService;
	private final ScheduleService scheduleService;

	public ReservedSeatController(ReservedSeatService reservedSeatService,
		SeatService seatService, ScheduleService scheduleService) {
		this.reservedSeatService = reservedSeatService;
		this.seatService = seatService;
		this.scheduleService = scheduleService;
	}

	@GetMapping("/{scheduleId}/possible")
	public ResponseEntity<List<ResponseFindSeat>> findReservePossibleSeats(@PathVariable Long scheduleId) {
		Schedule schedule = scheduleService.findById(scheduleId);

		List<Long> reservedSeatIdList = reservedSeatService.findReservedIdListByScheduleId(schedule.getId());
		return ResponseEntity.ok(seatService.findRemainSeats(schedule.getTheaterRoom().getId(), reservedSeatIdList));
		}
	}

    ...

}

컨트롤러에서 여러 Service를 호출할 때의 문제점.

public class SomthingController {

    private final ServiceA serviceA;
    private final ServiceB serviceB;
    private final ServiceC serviceC;

    public SomthingController(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC) {
    	this.serviceA = serviceA;
        this.serviceB = serviceB;
        this.serviceC = serviceC;
    }

    @GetMapping("/")
    public void something() {
    	serviceA.save();
        serviceB.save();
        serviceC.save();
    }

}

두 번째 시도 - 여러 서비스를 관리하는 Service

@Service
@Transactional(readOnly = true)
public class ReservationService {

	private final ReservedSeatService reservedSeatService;
	private final SeatService seatService;
	private final ScheduleService scheduleService;

	public ReservationService(ReservedSeatService reservedSeatService,
		SeatService seatService, ScheduleService scheduleService) {
		this.reservedSeatService = reservedSeatService;
		this.seatService = seatService;
		this.scheduleService = scheduleService;
	}

	/**
	 * 스케줄 별 예약좌석 조회
	 *
	 * @param scheduleId 스케줄 id
	 * @return 예약(되어있는) 좌석의 id 리스트
	 */
	@Transactional
	public List<ResponseFindSeat> findReservePossibleSeatList(Long scheduleId) {
		Schedule schedule = scheduleService.findById(scheduleId);

		List<Long> reservedSeatIdList = reservedSeatService.findReservedIdListByScheduleId(schedule.getId());
		return seatService.findRemainSeats(schedule.getTheaterRoom().getId(), reservedSeatIdList);
	}
}

1:1 매핑 Service의 문제점(?)