영한님 강의 중 실전! 스프링 부트와 JPA 활용2를 학습하던 도중에 과거에 백엔드 개발을 처음할 때 실수가 생각나서 기록을 하려고 합니다!
클라이언트가 요청을 보냈을 때 그 요청에 대한 값을 받는 로직을 작성하는 절차는 백엔드 개발에서 정말 자주 개발하는 로직입니다. 예를 들어서 회원 등록 코드를 보여드리면
@RestController
@RequiredArgsConstructor
public class MemberApiController {
private final MemberService memberService;
@PostMapping("/api/v1/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
위 로직을 간단하게 설명 드리면 회원 등록하는 Controller이며 클라이언트의 요청에 Member 라는 Entity 클래스를 직접 받는 로직입니다.
### 1. 이름 찾기
POST http://localhost:8080/api/v2/members
Content-Type: application/json
{
"name": "helloV2"
}
위 HTTP request 처럼 이름을 정상적으로 보내줬을 때는 로직에 문제가 없이 정상 작동하지만 name에 빈 공백을 보냈을 때는 400 에러가 뜨는 현상이 발생합니다.
이를 해결하기 위해서는 Member Entity에 name에 @NotEmpty라는 Validation을 걸어줘야하는 상황이 발생합니다.
자!! 여기서 문제가 발생하는 기반이 됩니다. 지금 코드는 예시인 코드여서 회원 등록 로직만 있을 뿐이지 실무에서는 Member라는 Entity를 회원등록뿐만 아니라 조회, 삭제, 업데이트 등등 많은 기능이 있을 겁니다. 그 때 '음 여기서는 이름을 보내주지 않아도 되겠는데?' 라는 생각으로 name에 빈 값을 보낸다면 Entity에 있는 @NotEmpty라는 Validation 때문에 오류가 발생합니다.
이러한 큰 오류가 발생하는 것을 방지하기 위해서 해결 방안은 API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 받아야 합니다.
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){
Member member = new Member();
member.setName(request.getName());
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
v1코드 보다는 로직이 길어졌지만 v1보다 훨씬 안전한 코드입니다.
v2에서는 Member Entity 대신에 CreateMemberRequest를 RequestBody와 매핑하였습니다.
@Data
static class CreateMemberRequest{
@NotEmpty
private String name;
}
CreateMemberRequest에서 @NotEmpty Validation을 해줘서 Entity 클래스에 있는 @NotEmpty를 작성하지 않아도 됩니다.
그러면 다른 기능에서 Member Entity를 사용할 때도 Entity의 변동없이 사용할 수 있게 됩니다.
** 실무에서는 Entity를 API 스펙에 노출하면 안된다!!!**
제가 했던 실수에 대해서 다시 한번 생각할 수 있었습니다!
김영한님의 실전! 스프링 부트와 JPA 활용2편을 기반으로 작성한 포스팅입니다. 문제 시 삭제하도록 하겠습니다.
'백엔드 지식 저장소' 카테고리의 다른 글
java: Attempt to recreate a file for type study.querydsl.entity.Qclass 문제 해결 (0) | 2024.01.11 |
---|---|
트랜잭션 AOP 주의사항!! (1) | 2024.01.05 |
@Transactional에 관해 (0) | 2023.12.20 |
Transaction Template (0) | 2023.12.15 |
백엔드 개발자라면 알아야하는 15가지 상식 (0) | 2023.11.29 |