개발 기록이
[SpringBoot] @Controller redirect 하기 본문
Spring boot 프레임워크에서의 @Controller, @RestController과 URL 리다이렉트 하는 방법에 대해 알아보자.
1. @Controller 란?
사용자가 특정한 URL로 요청을 보내면, 이 요청을 받아들이고 처리하는 역할을 하는 클래스가 필요하다. 이 클래스에는 해당 요청을 처리하는 메서드가 정의되어 있는데 이 메서드는 요청을 처리한 후 사용자에게 응답을 보내는 역할을 한다.
@Controller 어노테이션이 붙은 클래스가 이러한 역할을 수행하는데 즉, @Controller 어노테이션이 붙은 클래스는 웹 애플리케이션에서 사용자의 요청을 받아들이고 처리하는 역할을 담당한다.
예를 들어, www.example.com/springtest로 접속하면 @Controller가 붙은 클래스는 그 요청을 받아 다음과 같이 return으로 JSP 파일(testFile.jsp)을 반환할 수 있다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TestController {
@GetMapping("/springtest")
public String test() {
// 해당 url로 이동했을 때 실행할 로직 작성
return "testFile"; // 반환할 JSP 파일 "testFile.jsp"을 의미함.
}
}
메서드에 @ResponseBody을 추가하면 응답 데이터를 문자열이나 JSON 데이터 형태로 넘겨줄 수 있다. @ResponseBody를 사용하는 경우에는 페이지를 반환하는 것이 아니기 때문에 다른 URL로 리다이렉트를 해줄 수는 없다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HomeController {
@GetMapping("/springtest")
@ResponseBody
public String test() {
// 해당 url로 이동했을 때 실행할 로직 작성
return "hello"; // "hello" 라는 문자열이 응답으로 전달됨
}
}
다른 url로 리다이렉트하기
POST 요청 후에 리다이렉트를 수행하면 사용자가 웹 브라우저에서 새로고침 버튼을 클릭할 때 발생하는 "데이터 다시 제출" 문제를 피할 수가 있어서 웹 애플리케이션의 안전성과 일관성을 유지할 수 있다. 같은 경로 내에 있는 URL로 redirect를 할 경우 ./ (상대경로)를 이용하면 된다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
@RequestMapping("sample/product/")
public class TestController {
@GetMapping("/main.do")
public String test1() {
return "testFile";
}
@PostMapping("/write.do")
public String test2() {
return "redirect:./main.do";
// ./ 현재경로에서의 main.do로 redirect됨
// return "redirect:sample/product/main.do" 과 동일
}
}
그러나 다른 URL 패턴을 가진 컨트롤러의 URL로 리다이렉트 하는 경우에는 상대경로가 아닌 직접 그 경로를 다 입력해주어야 한다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
@RequestMapping("sample/book/")
public class TestController {
@GetMapping("/main.do")
public String test1() {
return "testFile";
}
@PostMapping("/write.do")
public String test2() {
return "redirect:sample/product/main.do";
// 현재 sample/book/main.do가 아닌 sample/product/main.do로 리다이렉트됨
}
}
2. @RestController 란?
RESTful 웹 서비스를 개발할 때 사용되며 @RestController는 @Controller와 @ResponseBody을 합친 것과 같은 의미를 갖는다. @RestController을 사용하면 응답 데이터는 주로 JSON 또는 XML 형식으로 클라이언트에게 전송된다.
@RestController의 경우에도 페이지를 반환하는 것이 아니라 데이터를 반환하기 때문에 다른 URL로 리다이렉트는 해줄 수 없다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/test")
public String test() {
// 해당 url로 이동했을 때 실행할 로직 작성
return "hello";
}
}
출처: OpenAI ChatGPT (https://openai.com)
'웹 개발 > Back-end' 카테고리의 다른 글
[JAVA] File, Files 클래스 정리 (0) | 2024.04.20 |
---|---|
[웹개발] 파일기능(2) MultipartFile와 MultipartHttpServletRequest 로 파일 저장하기 (0) | 2024.04.13 |
[JAVA] 자바 스트림 사용하기(map, filter, sorted) (0) | 2023.11.19 |
[JAVA]List 비교하기 - contains(), containsAll(), equals() (0) | 2023.08.08 |
[JAVA] List값 임의로 정렬하기 Collection.swap() (0) | 2023.08.06 |