본문 바로가기

개발 일지/TIL

[ #33 ] TIL

✏️ 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