코디룩 서비스 클래스가 아이템 서비스 클래스의 빈을 주입 받고, 아이템 서비스 클래스가 코디룩 서비스 클래스의 빈을 주입 받으면서 서로 순환 참조 에러가 발생했다.
CoordinateLookAdminServiceImpl.class
public class CoordinateLookAdminServiceImpl implements CoordinateLookAdminService {
private final CoordinateLookRepository coordinateLookRepository;
private final StylePointAdminService stylePointAdminService;
private final ItemAdminService itemAdminService;
ItemAdminServiceImpl.class
public class ItemAdminServiceImpl implements ItemAdminService {
private final ItemRepository itemRepository;
private final BrandAdminService brandAdminService;
private final CategoryService categoryService;
// 생성자 주입 방식 -> 에러 발생 원인
private final CoordinateLookAdminService coordinateLookAdminService;
// 아래와 같이 coordinateLookAdminService를 생성자 주입 방식으로 가져온 후 사용 -> 순환 참조 에러 발생 원인
@Override
public List<Item> findAllByCoordinateLookId(Long id) {
CoordinateLook coordinateLook = coordinateLookAdminService.findById(id);
return itemRepository.findItemByCoordinateLook(coordinateLook);
}
CoordinateLookAdminServiceImpl
클래스에서 ItemAdminServiceImpl
의존 관계 주입을 하고 있고, 반대로 ItemAdminServiceImpl
클래스에서 CoordinateLookAdminServiceImpl
의존 관계 주입을 하고 있다.findAllByCoordinateLookId
메서드에서 코디룩 서비스를 사용하므로 순환 참조 에러가 발생한 것이다.
수정 된 ItemAdminServiceImpl.class
public class ItemAdminServiceImpl implements ItemAdminService {
private final ItemRepository itemRepository;
private final BrandAdminService brandAdminService;
private final CategoryService categoryService;
// 아래와 같이 coordinateLookAdminService를 생성자 주입 방식 대신, 메서드 주입 방식으로 변경
@Override
public List<Item> findAllByCoordinateLookId(Long id, CoordinateLookAdminService coordinateLookAdminService) {
CoordinateLook coordinateLook = coordinateLookAdminService.findById(id);
return itemRepository.findItemByCoordinateLook(coordinateLook);
}
수정 된 ItemAdminController.class
public class ItemAdminController {
private final ItemAdminService itemAdminService;
// Controller에서 서비스 객체 생성자 주입 추가
private final CoordinateLookAdminService coordinateLookAdminService;
@GetMapping("/coordinate-looks/{id}")
public ResponseEntity<List<ItemDto>> getItemsByCoordinateLookId(@PathVariable Long id) {
// coordinateLookAdminService를 파라미터로 전달
List<Item> items = itemAdminService.findAllByCoordinateLookId(id, coordinateLookAdminService);
if (items.isEmpty()) {
return ResponseEntity.notFound().build();
}
List<ItemDto> itemResponseDtos = items.stream()
.map(itemAdminService::convertToDto)
.collect(Collectors.toList());
return ResponseEntity.ok(itemResponseDtos);
}
}