TIL

TIL(2023.3.7)

2023. 3. 9. 02:35
목차
  1. 1. @Valid
  2. 2. ResponseEntity

화요일에 몸이 더 안 좋아져서 결국 일찍 쉬고 화요일에 배웠던 것들을 오늘 적어보려 한다!

 

1. @Valid

클라이언트에서 요청을 보낼 때 받을 변수들에 제한사항을 걸 수 있다.

 

예를 들어 클라이언트에서 username, password를 받는다고 하자. 

  • username은 최소4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
  • password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.

위와 같은 제한 사항이 있을 때 requestDto를 만들어서 받는다고 하면 그 변수 위에 아래와 같이 설정해주면 된다.

@Setter
@Getter
public class SignupRequestDto {

    @NotNull
    @Pattern(regexp = "^[a-z0-9]{4,10}$")
    private String username;

    @NotNull
    @Pattern(regexp = "^[a-zA-Z0-9]{8,15}$")
    private String password;
}

그리고 클라이언트에서 요청 받을 때 제한사항을 잘 지킨 값이 들어왔는지 @Valid 어노테이션을 사용해서 아래와 같이 체크할 수 있다.

signup 함수에서 @RequestBody로 RequestDto를 받아오는데 앞에 @Valid 어노테이션을 붙임으로서 요청 들어오는 값을 체크할 수 있다.

@Controller
@RequiredArgsConstructor
@RequestMapping("/api/auth")
public class UserController {
    private final UserService userService;
    @PostMapping("/signup")
    @ResponseBody
    public ResponseEntity<ResponseMessageDto> signup(@Valid @RequestBody SignupRequestDto signupRequestDto) {
        return userService.signup(signupRequestDto);

    }

    @ResponseBody
    @PostMapping("/login")
    public ResponseEntity<ResponseMessageDto> login(@RequestBody LoginRequestDto loginRequestDto, HttpServletResponse response) {
        return userService.login(loginRequestDto, response);
    }
}

 

2. ResponseEntity

Spring Frameword에서는 HttpEntity라는 클래스가 있는데 HTTP 요청과 응답에 해당하는 HttpHeader과 HttpBody를 포함하는 클래스이다.

public class HttpEntity<T> {

	private final HttpHeaders headers;

	@Nullable
	private final T body;
}

이 HttpEntity 클래스를 상속받은 클래스 중 하나가 ResponseEntity이다. ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 이와 유사하게 HttpEntity 클래스로부터 상속 받는 RequestEntity는 사용자의 HttpRequest에 대한 데이터를 포함하는 클래스이다.

public class RequestEntity<T> extends HttpEntity<T> {}

public class ResponseEntity<T> extends HttpEntity<T> {}

ResponseEntity에는 HttpStatus, HttpHeaders, HttpBody 이렇게 3가지 속성을 갖고 있는데 이 3개를 매개변수로 갖는 생성자도 있다.

public class ResponseEntity<T> extends HttpEntity<T> {
	
	public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
		super(body, headers);
		Assert.notNull(status, "HttpStatus must not be null");
		this.status = status;
	}
}

그래서 우리는 클라이언트에게 응답을 보낼 때 생성자를 호출함으로써 보낼 수 있다.

먼저 ResponseDto를 만들어서 응답 보낼 데이터들을 넣는다. 

@Getter
public class ResponseMessageDto {
    private String msg;
    private int statusCode;

    public ResponseMessageDto(String msg, int statusCode) {
        this.msg = msg;
        this.statusCode = statusCode;
    }
}

그리고 반환할 때 ResponseDto 객체를 만들어서 body로 넣어주고 반환한다.

public ResponseEntity<ResponseMessageDto> login(LoginRequestDto loginRequestDto, HttpServletResponse response) {
        HttpHeaders headers= new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        
        ResponseMessageDto message = new ResponseMessageDto("로그인 성공", HttpStatus.OK.value());
        
        return new ResponseEntity<>(message, headers, HttpStatus.OK);
    }

 

이런 식으로 생성자를 호출해서 반환해줘도 되고 직접 클래스변수 body에 설정해줘도 된다. (여기서 Header는 필요없어서 안 넣어줬다.)

return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessageDto("로그인 성공", HttpStatus.OK.value()));

-끄읕-

  1. 1. @Valid
  2. 2. ResponseEntity
'TIL' 카테고리의 다른 글
  • TIL(2023.3.10)
  • TIL(2023.3.9)
  • TIL(2023.3.8)
  • TIL(2023.3.6)
jooyeongmee
jooyeongmee
jooyeongmee
jooyeongmee
jooyeongmee
전체
오늘
어제
  • 분류 전체보기 (26)
    • 웹백엔드 (5)
    • 웹프론트엔드 (0)
    • Tips (0)
    • java (0)
    • python (1)
    • TIL (18)
    • 알고리즘 (2)
    • Projects (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • http
  • web
  • 서버
  • 네트워크
  • 알고리즘

최근 댓글

최근 글

hELLO · Designed By 정상우.
jooyeongmee
TIL(2023.3.7)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.