화요일에 몸이 더 안 좋아져서 결국 일찍 쉬고 화요일에 배웠던 것들을 오늘 적어보려 한다!
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. @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()));
-끄읕-