DTO를 Result<T> 클래스에 담아서 반환할 때의 예외처리
안녕하세요!
영한님 강의를 들으면서 추가적으로 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 인턴이에요.
DTO를 Result
여러 가지 방법으로 예외처리를 구현할 수 있지만, Service 클래스에서 try-catch문을 사용하는 것이 권장되는 방법입니다. 이유는 다음과 같습니다.
데이터 유효성 검사: Service 클래스에서 예외처리를 하면 DTO의 데이터 유효성 검사를 할 수 있습니다. 예를 들어, 요청 파라미터로 넘어온 값이 null이거나 유효하지 않은 형식일 경우에는 예외를 던져서 이를 처리할 수 있습니다.
예외 처리 로직 분리: Controller 클래스에서 예외처리를 하게 되면, Controller 클래스가 비즈니스 로직과 예외 처리 로직을 동시에 처리해야 합니다. 이는 코드의 가독성을 떨어뜨리고 유지보수를 어렵게 만들 수 있습니다. 반면에 Service 클래스에서 예외처리를 하면 Controller 클래스에서는 비즈니스 로직에 집중할 수 있습니다.
따라서, try-catch문을 사용하여 예외처리를 구현하는 것이 좋습니다. 그러나, 상황에 따라 다르게 구현할 수도 있으니 실제 프로젝트의 요구사항과 가이드라인을 따르는 것이 좋습니다.
더 자세한 내용이 필요하시다면, 구체적인 예외 처리 상황을 알려주시면 더 도움을 드릴 수 있을 것 같아요.
RepositoryTest의 패키지 위치가 domain인 이유
0
30
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
30
1
update()에 사용하는 setter 질문드립니다.
0
48
1
SQL 중심적 개발의 문제점에 대한 질문
0
72
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
84
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
176
1
@repository 어노테이션
0
89
3
ItemService
0
58
1
논리 커밋, 물리 커밋 질문드립니다.
0
54
1
내부 트랜잭션 커밋은 필수인가요?
0
57
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
54
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
178
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
79
1
@EventListener(ApplicationReadyEvent.class) 관련
0
88
1
트랜잭션 동기화 매니저와 데이터 소스
0
76
1
DB 관련 강의 개설 계획은 없으신건가요?
0
133
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
94
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
113
1
트랜잭션 전파 질문.
0
87
1
프로젝트 오픈 에러
0
126
1
외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
0
84
2
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
73
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
102
1
커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문
0
98
2





