본문 바로가기

Spring/SpringBoot

SpringBoot- @Valid, @ResponseBody, @RequestBody

유효성 검증 어노테이션

  • @NotNull : 해당 필드에 null값을 불허한다.

  • @NotEmpty : 해당 필드에 null, ""을 불허한다.

  • @NotBlank : 해당 필드에 null, "", " " 을 불허한다. 즉 최소 1글자

  • @Min : 해당 필드의 최소값을 벗어나는지 검증한다.

  • @Max : 해당 필드의 최대값을 벗어나는지 검증한다.

  • @Pattern : 해당 필드가 특정 형태를 가지도록 검증한다. (정규표현식으로 표현함)

  • @Email : 해당 필드가 이메일 형식을 가지도록 검증한다.

  • @Size : 문자열의 최소, 최대 크기를 검증한다.
    @Size(min=10, max=100) 과 같이 사용할 수 있으며, 기본값은 min=0, max=정수형의 최대값 이다.

 

@Valid, @ResponseBody, @RequestBody

-@Valid, @ResponseBody, @RequestBody 설명 예제

package jpabook.jpashop.api;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.service.MemberService;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;

@RestController
// @RestController = @Controller + @ResponseBody
// @ResponseBody: 자바객체를 json, xml로 변환해서 보낼 때 사용
@RequiredArgsConstructor
public class MemberApiController {

    private final MemberService memberService;

    @PostMapping("/api/v2/members")  // @RequestBody: 이 주소로 json, xml 데이터가 전달되면 이를 자바객체로 변환해서 매핑해줌
    public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
        //@Valid 어노테이션 안 붙이면 에러메시지 안뜸
        Member member = new Member();
        member.setName(request.getName());
        Long id = memberService.join(member);

        return new CreateMemberResponse(id);
    }

    @Data
    static class CreateMemberRequest {
        // 엔티티의 변화에도 대응할 수 있도록 값을 받는
        // Request 파라미터를 별도로 생성
        @NotEmpty(message = "이름은 필수 값 입니다")
        private String name;
    }

    @Data
    static class CreateMemberResponse {

        private Long id;
        public CreateMemberResponse(Long id) {
            this.id = id;
        }
    }
}

 

@Valid

 객체 앞에 @Vaild를 붙여놓으면 객체에 대한 검증을 수행한다. 이때 검증하기 위한 유효성 검증 어노테이션은 객체 내부에 선언되어 있어야한다.
@PostMapping("/api/v2/members")  // @RequestBody: 이 주소로 json, xml 데이터가 전달되면 이를 자바객체로 변환해서 매핑해줌
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
    //@Valid 어노테이션 안 붙이면 에러메시지 안뜸
    Member member = new Member();
    member.setName(request.getName());
    Long id = memberService.join(member);

    return new CreateMemberResponse(id);
}

 매개변수 CreaqteMemberRequest request 앞에 @Valid 어노테이션을 두어 request 객체에 대한 검증을 수행한다.

@Data
static class CreateMemberRequest {

    @NotEmpty(message = "이름은 필수 값 입니다") //유효성 검증 어노테이션
    private String name;
}

CreateMemberRequest 클래스에 @NotEmpty 어노테이션을 두어 검증을 할 수 있게 해두었다. 따라서 name에 아무런 값도 전달되지 않는다면 에러가 발생한다.

아무런 값도 전달하지 않은 경우 "이름은 필수 값 입니다" 에러 메시지와 함꼐 에러가 발생함.

따라서 @Vaild 어노테이션과 유효성 검증 어노테이션을 통해서 객체 단에서 에러 검증이 가능하다.

 

@RequestBody

 xml, json등으로 전달된 데이터를 자바 객체로 변환해서 매핑해준다. 이 어노테이션이 붙은 파라미터에는 http요청의 본문(body)이 그대로 전달된다. 
@PostMapping("/api/v2/members")  // @RequestBody: 이 주소로 json, xml 데이터가 전달되면 이를 자바객체로 변환해서 매핑해줌
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
    //@Valid 어노테이션 안 붙이면 에러메시지 안뜸
    Member member = new Member();
    member.setName(request.getName());
    Long id = memberService.join(member);

    return new CreateMemberResponse(id);
}

이 메서드의 매개변수 CreateMemberRequest request를 보자. @RequestBody 어노테이션이 붙어있는데 이는 PostMapping된 주소로 json이나 xml로 데이터가 전달되는 경우 이 데이터가 request로 매핑되는 것이다. 따라서 "localhost:8080/api/v2/members"로 json 데이터를 POST하면 이 데이터가 request에 들어가는 것이다.  

 

@ResponseBody

자바객체를 HTTP요청의 바디내용으로 매핑하여 클라이언트로 전송한다.
@PostMapping("/api/v2/members")  // @RequestBody: 이 주소로 json, xml 데이터가 전달되면 이를 자바객체로 변환해서 매핑해줌
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
    //@Valid 어노테이션 안 붙이면 에러메시지 안뜸
    Member member = new Member();
    member.setName(request.getName());
    Long id = memberService.join(member);

    return new CreateMemberResponse(id);
}

  saveMemberV2(@RequestBody @Valid CreateMemberRequest request) 에선 CreateMemberResponse를 반환한다. 이는 위에서 보이듯이 클래스 객체이다.

 근데 이 메서드는 MemberApiController 클래스 내부에 선언되었다는 것을 기억해보자. 그리고 MemberApiController에는 @RestController 어노테이션이 적용되어있다.

 

 참고로 @RestController = @Controller + @ResponseBody 이다. 따라서 여기에 써있지는 않지만 이 메서드에서도 @ResponseBody 어노테이션이 적용되어 있음을 알 수 있다. 따라서 여기서 반환된 CreateMemberResponse 객체는 json으로 변환되어 클라이언트에게 전송된다. CreateMemberResponse 내부 필드값이 json으로 반환되게 된다.

"name"을 전달하자 "id"가 반환되어 왔다.

 

참고: @Valid 를 이용해 @RequestBody 객체 검증하기 (tistory.com)

 

 

@Valid 를 이용해 @RequestBody 객체 검증하기

Springboot를 이용해서 어노테이션을 이용한 validation을 하는 방법을 적으려 한다. RestController를 이용하여 @RequestBody 객체를 사용자로부터 가져올 때, 들어오는 값들을 검증할 수 있는 방법을 소개한

jyami.tistory.com

 

'Spring > SpringBoot' 카테고리의 다른 글

SpringBoot- 패치 조인 최적화  (0) 2023.07.06
SpringBoot- API  (0) 2023.07.04
SpringBoot- @GetMapping, @PostMapping  (0) 2023.06.28
SpringBoot- Controller  (0) 2023.06.25
SpringBoot- @Transactional  (0) 2023.06.22