Spring - RedirectAttributes 잘못된 부분 수정

MeteorLee·2024년 10월 3일
0
post-custom-banner

Spring - RedirectAttributes(잘못된 부분 많음)

문제

이 글을 쓰게 된 가장 큰 이유는 리다이렉트를 구현해야하는 상황에서 내가 이전에 쓴 글을 보다가 크게 잘못된 부분이 있어서 다시 작성하려고 한다.

리다이렉트는 GET

리다이렉트는 GET 요청이므로 model에 정보를 넣어서 스프링 내부에서 정보를 전달하는 일은 불가능하다. 하지만 이런 기본적인 내용을 글 작성 당시 생각하지 못하고 model로 정보를 넘겨준다고 작성했다.

해결법

Spring 환경에서 리다이렉트를 실행할 때 정보를 넘겨주는 방법들을 조사했다

1. 쿼리 파라미터 (RedirectAttributes.addAttribute)

  • 용도: URL을 통해 데이터를 전달하는 방법입니다. URL에 데이터가 노출되며, 검색 조건, 페이지 번호 등과 같은 정보를 전달할 때 적합함
  • 특징: URL에 포함되기 때문에 사용자가 데이터를 쉽게 볼 수 있으며, 보안에 주의해야 함
redirectAttributes.addAttribute("page", 1);
redirectAttributes.addAttribute("userId", user.getId());
return "redirect:/board/list";

리다이렉트 후 데이터 받기

@GetMapping("/board/list")
public String list(@RequestParam("userId") Long userId, Model model) {
    User user = userService.findById(userId);
    model.addAttribute("user", user);
    return "board/list";
}

2. Flash Attribute (RedirectAttributes.addFlashAttribute)

  • 용도: URL에 데이터를 노출하지 않고, 일회성으로 데이터를 전달하는 방식입니다. 주로 성공/실패 메시지나 잠깐 동안 필요한 데이터를 전달할 때 사용함
  • 특징: 한 번의 요청 이후에는 데이터가 사라지므로, URL에 노출되지 않으며 세션에 일시적으로 저장함
redirectAttributes.addFlashAttribute("user", user);
redirectAttributes.addFlashAttribute("msg", "Operation successful");
return "redirect:/board/list";

리다이렉트 후 데이터 받기:

@GetMapping("/board/list")
public String list(Model model) {
    if (model.containsAttribute("user")) {
        User user = (User) model.getAttribute("user");
        // user 정보 사용
    }
    return "board/list";
}

3. 세션 (HttpSession)

  • 용도: 리다이렉트 이후에도 여러 요청에서 지속적으로 데이터를 유지하고 싶을 때 사용됩니다. 로그인한 사용자 정보 등, 여러 요청 간 유지가 필요한 데이터를 저장할 때 주로 사용함
  • 특징: 세션은 지속적이며, 서버 메모리를 사용합니다. 너무 많은 데이터를 세션에 저장하면 성능 문제를 야기할 수 있음
session.setAttribute("user", user);
return "redirect:/board/list";

리다이렉트 후 데이터 받기:

@GetMapping("/board/list")
public String list(HttpSession session, Model model) {
    User user = (User) session.getAttribute("user");
    model.addAttribute("user", user);
    return "board/list";
}

4. 쿠키 (HttpServletResponse.addCookie)

  • 용도: 클라이언트 측에서 데이터를 저장하여 리다이렉트 후에도 데이터를 유지하는 방법입니다. 세션과 달리 브라우저에 데이터를 저장하기 때문에, 브라우저가 열려 있는 동안에만 데이터를 사용할 수 있음
  • 특징: 클라이언트 측에 저장되므로 데이터 보안에 주의해야 합니다. 쿠키는 보통 사용자 설정이나 트래킹에 사용함
Cookie userCookie = new Cookie("userId", String.valueOf(user.getId()));
userCookie.setMaxAge(60 * 60); // 쿠키 유효 시간 설정 (1시간)
response.addCookie(userCookie);
return "redirect:/board/list";

리다이렉트 후 데이터 받기:

@GetMapping("/board/list")
public String list(@CookieValue(value = "userId", defaultValue = "0") Long userId, Model model) {
    if (userId != 0) {
        User user = userService.findById(userId);
        model.addAttribute("user", user);
    }
    return "board/list";
}

5. URL Path Variable

  • 용도: URL 경로의 일부로 데이터를 전달하는 방법입니다. 리소스 식별자(ID 등)를 URL에 포함하여 전달할 수 있음
  • 특징: URL 경로 자체에 데이터를 포함하므로, 주로 RESTful API에서 사용함
return "redirect:/board/list/user/" + user.getId();

리다이렉트 후 데이터 받기:

@GetMapping("/board/list/user/{userId}")
public String list(@PathVariable Long userId, Model model) {
    User user = userService.findById(userId);
    model.addAttribute("user", user);
    return "board/list";
}

요약

  • 쿼리 파라미터: addAttribute()로 데이터를 URL에 포함하여 전달.
  • Flash Attribute: addFlashAttribute()로 URL에 노출되지 않는 일회성 데이터를 전달.
  • 세션: HttpSession을 사용하여 여러 요청 간 지속적으로 데이터를 유지.
  • 쿠키: 클라이언트 측에 데이터를 저장하고 유지.
  • URL Path Variable: URL 경로의 일부로 데이터를 전달.

각각 용도에 맞는 방식을 선택하는 것이 좋다.

느낀점

이전에 쓴 글이 너무 잘못되었다는 것을 안 순간 얼굴이 화끈해지는 것을 느꼈다. 내 글을 본 사람들이 '이 사람은 정말 기본도 못하는구나' 라는 생각을 하는 것이 당연하다고 생각했다. 그래서 글을 처음 본 순간 바로 삭제하거나 수정하려고 했었다. 하지만 글을 수정하면서 글을 쓰게 된 이유가 나의 공부 때문이라는 것을 다시 생각하는 순간 수정을 그만뒀다. 내가 이 글을 작성하는 이유가 나의 성장 때문인데 나의 부족한 점을 가리기 위해 노력하는 것이 잘못되었다고 생각한다. 가끔은 기본도 잘 안지키고 모자란 부분 투성이지만 이렇게 수정하면서 나아가면 된다고 생각한다.

profile
코딩 시작
post-custom-banner

0개의 댓글