✏️ 0531
Spring 숙련 과제 마무리 & 제출
해설 영상 & 코드
Spring 숙련 과제
중에 찾아본 내용들 정리
ResponseEntity
Spring 프레임워크에서 HTTP 응답을 나타내기 위해 사용되는 클래스
HTTP 응답 상태 코드, 헤더, 그리고 본문을 포함할 수 있는 구조를 제공한다
컨트롤러에서 보다 유연하게 HTTP 응답을 구성하고 반환할 수 있다
- 주요 설정
- 상태 코드 설정
HTTP 응답 상태 코드를 명시적으로 설정
200 OK, 404 Not Found, 500 Internal Server Error 등을 설정 가능 - 응답 본문 설정
응답 본문을 설정
객체를 JSON, XML 등의 형태로 변환하여 클라이언트에게 전달하는 데 유용하다 - HTTP 헤더 설정
응답에 포함될 HTTP 헤더를 설정
Content-Type, Authorization, Cache-Control 등의 헤더를 추가할 수 있
- 상태 코드 설정
- 사용하는 방법
생성자 사용
new ResponseEntity<>(body, statusCode) 와 같이 직접 생성자를 통해 생성
ex) 사용 예시 1️⃣
@GetMapping("/hello")
public ResponseEntity<String> getHello() {
return new ResponseEntity<>("Hello, World!", HttpStatus.CREATED);
}
Hello, World! 메시지와 함께 201 OK 상태 코드를 반환
HttpStatus.CREATED : 201 Created 상태 코드를 반환한다
빌더 패턴 사용
ResponseEntity.ok(), ResponseEntity.status(HttpStatus)와 같은
정적 메서드를 제공하여 빌더 패턴을 통해 보다 간결하게 생성
ex) 사용 예시 2️⃣
@GetMapping("/bye")
public ResponseEntity<String> getBye() {
return ResponseEntity.ok("bye, World!");
}
bye, World! 메시지와 함께 200 OK 상태 코드를 반환
ResponseEntity.ok() : HTTP 상태 코드 200 OK 를 반환
단순히 상태 코드 200 를 반환하는데 사용된다. 메시지는 응답의 본문으로 설정되지 않고, 단순히 성공적인 응답
해당 메서드를 사용하면 반환하는 코드는 항상 200 OK 가 된다
200 OK는 서버가 요청을 성공적으로 처리했음을 나타내는 표준 HTTP 상태 코드
ex) 사용 예시 3️⃣
@GetMapping("/notfound")
public ResponseEntity<String> getNotFound() {
// 리소스를 찾지 못한 경우
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource Not found");
}
Resource Not found 메시지와 함께 404 Not Found 상태 코드를 반환
ResponseEntity.status 는 특정 HTTP 상태 코드를 설정하기 위해 사용
404 Not Found : 요청한 리소스를 서버에서 찾을 수 없음을 나타낸다
.body() : 메시지가 본문으로 설정, 명시적으로 응답의 본문(body)을 설정하는 방법
[#24]TIL 에서 한번 간단하게 정리했던 내용
클라이언트에게 성공 메시지 반환
@Override
protected void successfulAuthentication(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain, Authentication authResult)
throws IOException {
// 1. 인증된 사용자 정보 추출
String username = ((UserDetailsImpl) authResult.getPrincipal()).getUsername();
UserRoleEnum role = ((UserDetailsImpl) authResult.getPrincipal()).getUser().getRole();
// 2. JWT 토큰 생성
String token = jwtUtil.createToken(username, role);
// 3. 응답 헤더에 JWT 토큰 추가
response.addHeader(JwtUtil.AUTHORIZATION_HEADER, token);
// 4. 응답의 Content-Type과 인코딩 설정
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
// 5. 성공 메시지 작성
String message = "로그인 성공하였습니다.";
response.getWriter().write(message);
}
1. 인증된 사용자 정보 추출
authResult.getPrincipal() 을 통해 인증된 사용자 정보를 가져온다
UserDetailsImpl 클래스는 UserDetails 인터페이스를 구현한 사용자 정의 클래스
사용자 이름(username)과 사용자 역할 (role) 을 추출
2. JWT 토큰 생성
jwtUtil.createToken(username, role)을 호출하여 JWT 토큰을 생성
jwtUtil 객체는 JWT 토큰 생성 및 검증을 담당하는 유틸리티 클래스
3. 응답 헤더에 JWT 토큰 추가
response.addHeader(JwtUtil.AUTHORIZATION_HEADER, token)을 호출하여 응답 헤더에 JWT 토큰을 추가
JwtUtil.AUTHORIZATION_HEADER는 일반적으로 Authorization 또는 다른 사용자 정의 헤더 이름을 포함하는 상수
4. 응답의 Content-Type과 인코딩 설정
response.setContentType("application/json")을 호출하여 응답의 Content-Type을 "application/json"으로 설정
=> 클라이언트가 응답을 JSON 형식으로 해석
response.setCharacterEncoding("UTF-8")을 호출하여 응답의 문자 인코딩을 "UTF-8"로 설정
=> 설정 안하면 ??? 가 뜰 때가 있다
5. 성공 메시지 작성
response.getWriter().write(message)을 호출하여 응답 본문에 "로그인 성공하였습니다." 라는 메시지 작성
response.getWriter()는 응답의 출력 스트림을 반환하며, 이 스트림을 사용하여 응답 본문을 작성
클라이언트에게 실패 메시지 반환
@Override
protected void unsuccessfulAuthentication(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException failed)
throws IOException {
// 1. 응답 상태 코드 설정
response.setStatus(401);
// 2. 응답의 문자 인코딩 및 Content-Type 설정
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
// 3. 실패 메시지 작성
String errorMessage = "로그인 실패하였습니다.";
response.getWriter().write(errorMessage);
}
1. 응답 상태 코드 설정
response.setStatus(401)을 호출하여 응답 상태 코드를 401로 설정
HTTP 상태 코드 401은 인증이 필요함을 나타내며, 클라이언트의 인증이 실패했음을 의미
2. 응답의 문자 인코딩 및 Content-Type 설정
response.setCharacterEncoding("UTF-8")을 호출하여 응답의 문자 인코딩을 "UTF-8"로 설정
response.setContentType("application/json")을 호출하여 응답의 Content-Type을 "application/json"으로 설정
=> 클라이언트가 응답을 JSON 형식으로 해석
3. 실패 메시지 작성
response.getWriter().write(errorMessage)을 호출하여 응답 본문에 "로그인 실패하였습니다."라는 메시지 작성
response.getWriter()는 응답의 출력 스트림을 반환하며, 이 스트림을 사용하여 응답 본문을 작성
'개발 일지 > TIL' 카테고리의 다른 글
[ #35 ] TIL (0) | 2024.06.04 |
---|---|
[ #34 ] TIL (1) | 2024.06.03 |
[ #32 ] TIL (0) | 2024.05.30 |
[ #31 ] TIL (0) | 2024.05.29 |
[ #30 ] TIL (0) | 2024.05.28 |