인프런 커뮤니티 질문&답변

자프링님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

DTO를 Result<T> 클래스에 담아서 반환할 때의 예외처리

해결된 질문

23.08.08 03:25 작성

·

336

0

안녕하세요!

영한님 강의를 들으면서 추가적으로 RestTemplate에 대해 알게되어 지금까지 배운 것을 복습할 겸 api와 DTO 통신에 대해 연습하고 있었습니다.

DTO를 반환할 때, 그냥 주기보다는 Result<T>의 data같은 속성에 담아서 주는 것이 바람직하다고 하여 그 응용을 연습해 볼겸 Result<T>에 status 속성을 추가해보았습니다.

status 속성은 외부 api에서 조건을 충족하는 api를 찾아 와서 반환할 DTO가 있을 경우 "success"를, 조건을 충족하는 api를 찾지 못하여 HttpClientErrorException 예외가 발생할 경우 "fail"을 담아서 반환하고자 하였습니다.

아래의 코드를 통해 구현은 성공하였으나, Service 클래스에서 try-catch문을 사용하는게 좀 찜찜하여 혹시 try-catch문 없이 구현하는게 더 좋을지 아니면 그냥 사용해도 좋은지가 궁금하여 질문을 하게 되었습니다.

(status가 "fail"이면 data는 null을 반환하게끔 설계해보았습니다)

 

@RestController
@RequiredArgsConstructor
@RequestMapping("/summoners")
public class SummonerController {

    private final SummonerService summonerService;

    @GetMapping
    public ResponseEntity<Result<SummonerDTO>> findSummonerApi(@RequestParam String name) {
        SummonerDTO summonerDTO = summonerService.findSummonerApi(name);

        if (summonerDTO == null) {
            return ResponseEntity.ok().body(new Result<>("fail", null));
        }
        return ResponseEntity.ok().body(new Result<>("success", summonerDTO));
    }
}
@Slf4j
@Service
@RequiredArgsConstructor
public class SummonerService {

    @Value("${apiKey}")
    private String apiKey;

    private final SummonerRepository summonerRepository;
    private final RestTemplate restTemplate;

    // riot에서 소환사 정보 api를 받아오는 메서드
    public SummonerDTO findSummonerApi(String name) {
        String url = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summonerName}";

        HttpHeaders headers = new HttpHeaders();
        headers.set("X-Riot-Token", apiKey);

        try {
            return restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), SummonerDTO.class, name).getBody();
        } catch (HttpClientErrorException e) {
            return null;
        }
    }
}

Controller와 Service의 코드는 위와 같습니다. (restTemplate은 별도의 설정파일에 빈으로 구현하였습니다)

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2023. 08. 10. 03:31

안녕하세요, 인프런 AI 인턴이에요.

DTO를 Result 클래스에 담아서 반환할 때의 예외처리에 대해 궁금한 점이 있으신 것 같네요.

여러 가지 방법으로 예외처리를 구현할 수 있지만, Service 클래스에서 try-catch문을 사용하는 것이 권장되는 방법입니다. 이유는 다음과 같습니다.

  1. 데이터 유효성 검사: Service 클래스에서 예외처리를 하면 DTO의 데이터 유효성 검사를 할 수 있습니다. 예를 들어, 요청 파라미터로 넘어온 값이 null이거나 유효하지 않은 형식일 경우에는 예외를 던져서 이를 처리할 수 있습니다.

  2. 예외 처리 로직 분리: Controller 클래스에서 예외처리를 하게 되면, Controller 클래스가 비즈니스 로직과 예외 처리 로직을 동시에 처리해야 합니다. 이는 코드의 가독성을 떨어뜨리고 유지보수를 어렵게 만들 수 있습니다. 반면에 Service 클래스에서 예외처리를 하면 Controller 클래스에서는 비즈니스 로직에 집중할 수 있습니다.

따라서, try-catch문을 사용하여 예외처리를 구현하는 것이 좋습니다. 그러나, 상황에 따라 다르게 구현할 수도 있으니 실제 프로젝트의 요구사항과 가이드라인을 따르는 것이 좋습니다.

더 자세한 내용이 필요하시다면, 구체적인 예외 처리 상황을 알려주시면 더 도움을 드릴 수 있을 것 같아요.