개발 기록이

[SpringBoot] @Controller redirect 하기 본문

웹 개발/Back-end

[SpringBoot] @Controller redirect 하기

studyingbackhoe 2024. 3. 30. 14:58

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";
    }
}

 
 

봄 로고 작가: Icons8

출처: OpenAI ChatGPT (https://openai.com)