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

강종헌님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

회원 등록 API

NotEmpty 속성 적용 관련

작성

·

188

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

/api/v1/members 에서는 NotEmpty를 멤버 클래스에서 적용함
public class Member {
 ~~ 중략
    @NotEmpty
    private String name;
~~ 중략
}

/api/v2/members 를 테스트 하면서 멤버 클랫스에서는 @NotEmpty 를 제거하고 MemberApiController  내부에 이너 DTO 클래스에 @NotEmpty 속성을 넣으면 API 에서 빈값을 넣어도 그냥 통과시켜 버립니다.
public class Member {
//중략
    private String name;   //@NotEmpty 제거
//중략
}

public class MemberApiController {
//중략
@Data
    static class CreateMemberRequest {
        @NotEmpty
        private String name;
    }
//중략
}

강사님의 의도는 V2가 엔티티에 독립성은 보장 프레젠테이션 레이어의 체크 사항을 엔티티 레벨로 가져오지 않고 DTO를 사용하여 결합을 느슨하게 하려고 보이는데 그러한 의도로 코드 수정하면 원하는 결과가 나오지 않습니다.

 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 강종현님

저의 경우에는 정상 작동하는 것을 확인했는데요.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용을 바탕으로 답변드리겠습니다.

@NotEmpty 애노테이션은 Bean Validation API의 일부로, 해당 필드가 null이 아니며 길이가 0이 아닌 문자열을 포함하고 있어야 함을 나타냅니다. DTO 내부에 @NotEmpty를 사용했음에도 값이 통과되는 것으로 보아, Controller 레벨에서 Bean Validation이 제대로 활성화되거나 적용되지 않은 것 같습니다.

스프링에서는 @Valid 또는 @Validated 애노테이션을 통해 Controller 내의 메서드 파라미터에 대한 검증을 활성화할 수 있습니다. Controller 메서드에서 DTO를 파라미터로 사용하실 때, 해당 DTO 앞에 @Valid 또는 @Validated 애노테이션을 붙여주셨는지 확인해보세요.

예를 들어, @NotEmpty 애노테이션이 있는 DTO를 사용하는 Controller 메서드는 다음과 같이 작성될 수 있습니다.

@PostMapping("/api/v2/members")
public ResponseEntity createMember(@Valid @RequestBody CreateMemberRequest request) {
    // 메서드 구현
}

위의 코드에서 @Valid 애노테이션은 CreateMemberRequest 객체에 대한 검증을 활성화하여, @NotEmpty와 같은 Bean Validation 애노테이션이 적용된 필드에 대해 검증을 수행하게 합니다. 만약 검증에 실패할 경우, 메서드는 실행되지 않고, 스프링은 기본적으로 검증 실패 정보를 담은 응답을 반환합니다.

검증이 제대로 적용되고 있는지 확인하는 한 가지 방법은, Controller 메서드의 실행 여부를 로깅을 통해 확인하는 것입니다. 만약 Controller 메서드가 호출되지 않았다면, 검증에서 실패하여 메서드 호출 자체가 차단된 것일 수 있습니다.

Bean Validation과 @Valid, @Validated의 사용에 대한 확실한 적용을 원하시면, 스프링 공식 문서 또는 인프런의 스프링 관련 강의를 참고하시는 것이 좋습니다.