본문 바로가기

PROGRAMMING/SPRING

[SPRING] API 개발 Validation

필드가 여러 개 있는 상황에서 해당 필드에 대한 제약 조건을 주고 싶을 때

 

 

위와 같이 컨트롤러를 구성하면 문제점이 뭘까?

 

 

1. 엔티티 코드가 복잡해진다

 

@NotEmpty와 같은 어노테이션이 덕지덕지 붙는데 나중에 유지보수성이 저하되는 결과를 초래한다.

 

2. 엔티티 필드명이 바뀌면 API 스펙 자체가 변경되버린다

 

예를 들어 엔티티 필드 중 name이 username으로 변경이 된다면? 

이 API를 가져다 쓰는 쪽에서 같이 변경해주지 않는다면 에러가 발생하게 된다.

 

3. 하나의 애플리케이션에 여러 스펙의 API를 개발해야 되는 상황이 발생할 때

 

각 API 스펙이 다른 상황에서 엔티티에 제약을 반영하기 쉽지 않다.

 

그렇다면 어떻게 개발해야 할까?

엔티티를 파라미터로 받지 말고 별도의 데이터 전송 객체를 생성해서 여기에 데이터를 담아서 전달해야 한다.

 

 

위 코드에서는 CreateMemberRequest DTO객체를 생성해서

이를 다시 Member형태로 가공해서 전달하는 방식으로 변경했다.

 

API를 만들 때에는 API스펙에 맞는 별도의 객체를 생성해야 위에서 말한 이슈를 피하면서 안정적으로 서비스를 운영할 수 있다.

 

실무에서는 절대로 엔티티를 파라미터로 받거나 외부로 노출해서는 안된다.