[Spring MVC] API 계층 - DTO 구현

정동아·2023년 6월 13일

백엔드 부트캠프

목록 보기
35/41

DTO란?

DTO란 Data Transfer Object 의 약자로, 데이터를 전송하기 위한 용도의 객체라고 생각할 수 있다.
클라이언트 -> 서버, 서버 -> 클라이언트로 전송하는 응답 데이터의 형식으로 클라이언트와 서버간에 데이터 전송이 이루어지는데 이 구간에서 DTO를 사용할 수 있다.

DTO를 왜 쓰는가?

바로 전에 Controller클래스에 작성한 코드를 가져오면

@RestController
@RequestMapping("/v1/members")
public class MemberController {
    @PostMapping
    public ResponseEntity postMember(@RequestParam("email") String email,
                                     @RequestParam("name") String name,
                                     @RequestParam("phone") String phone) {
        Map<String, String> map = new HashMap<>();
        map.put("email", email);
        map.put("name", name);
        map.put("phone", phone);

        return new ResponseEntity<Map>(map, HttpStatus.CREATED);
    }

		...
		...
}

이렇다.
여기서 회원 정보를 저장하기 위해 @RequestParam 애너테이션을 사용하고있다. 근데 현업에서는 더 많은 정보가 회원 정보에 포함될 수 있다. 그러면 @RequestParam 이 엄청나게 많아질 것이다.
이럴 경우에, 클라이언트의 요청 데이터를 하나의 객체로 전달받는 역할을 하는 것이 DTO클래스이다.

@RestController
@RequestMapping("/v1/members")
public class MemberController {
    @PostMapping
    public ResponseEntity postMember(MemberDto memberDto) { 
    //@RequestParam을 사용하는 부분이 사라지고 MemberDto memberDto가 추가되었다. 
        
   //@RequestParam을 통해 전달받은 요청 데이터들을 Map에 추가하는 로직이 사라지고, MemberDto 객체를 ResponseEntity 클래스의 생성자 파라미터로 전달한다. 
        return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
    }

		...
		...
}

정리하면, 코드 자체를 간결하게 할 수 있다.

두번째는, DTO클래스를 사용하면 유효성 검증 로직을 DTO클래스로 빼서 핸들러 메서드의 간결함을 유지할 수 있기때문이다.

가장 중요한 목적은 HTTP요청의 수를 줄이기 위함이다. (비용이 많이 드는 작업이다.)

DTO클래스를 만들 때 주의해야할 점은, 멤버 변수 이외에 각 멤버 변수에 해당하는 getter 메서드가 있어야한다는 것이다.
getter 메서드가 없으면 Response Body에 해당 멤버 변수의 값이 포함되지 않는 문제가 발생하게된다.


@RequestBody 애너테이션

@RequestBody 애너테이션은 JSON형식의 RequestBody를 MemberPostDto 클래스의 객체로 변환 시켜주는 역할을 한다.
= 클라이언트 쪽에서 전송하는 RequestBody가 JSON형식이어야한다는 것과 같다.
만약 JSON형식이 아닌 다른 형식의 데이터를 전송한다면, Spring 내부에서 Unsupported Media Type과 같은 에러메시지를 포함한 응답을 전달한다.

@ResponseBody 애너테이션

@Response Body는 JSON형식의 Response Body를 클라이언트에 전달하기 위해 DTO클래스의 객체를 ResponseBody로 변환하는 역할을 한다.

여기서 가장 중요한 점은 Spring MVC에서는 핸들러 메서드에 @ResponseBody 애너테이션이 붙거나 핸들러 메서드의 리턴 값이 ResponseEntity일 경우, 내부적으로 HttpMessageConverter가 동작하게되어 응답 객체 (여기서 DTO클래스의 객체)를 JSON형식으로 바꿔준다.

0개의 댓글