[스프링부트] 12. MVC 프레임워크(리다이렉션)

백하림's avatar
Mar 19, 2025
[스프링부트] 12. MVC 프레임워크(리다이렉션)
package org.example.demo10; import jakarta.servlet.ServletConfig; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.example.demo10.core.ComponentScan; import org.example.demo10.core.RequestMapping; import org.example.demo10.core.ViewResolver; import java.io.IOException; import java.lang.reflect.Method; import java.util.Set; @WebServlet("*.do") public class DispatcherServlet extends HttpServlet { private Set<Object> controllers; @Override public void init(ServletConfig config) throws ServletException { // 1. 컴포넌트 스캔 ComponentScan componentScan = new ComponentScan(config.getServletContext()); controllers = componentScan.scanClass("org.example.demo10.controller"); //System.out.println(controllers.size()); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // localhost:8080/user.do?path=join String path = req.getParameter("path"); // 2. 라우팅 String templatePath = route(path); // 3. 리다이렉션 if (templatePath.contains("redirect:")) { String redirectPath = templatePath.replace("redirect:", ""); // resp.setStatus(302); // resp.setHeader("Location", "?path=" + redirectPath); resp.sendRedirect("?path=" + redirectPath); // 이 코드는 위에 두 줄을 내장하고 있음 302세팅 return; } // 4. 이동 if (templatePath == null) { resp.setStatus(404); resp.getWriter().println("<h1>404 Not Found</h1>"); } else { req.getRequestDispatcher(ViewResolver.viewName(templatePath)).forward(req, resp); } } private String route(String path) { for (Object instance : controllers) { Method[] methods = instance.getClass().getMethods(); for (Method method : methods) { RequestMapping rm = method.getAnnotation(RequestMapping.class); if (rm == null) continue; // 다음 for문으로 바로 넘어감 if (rm.value().equals(path)) { try { return (String) method.invoke(instance); } catch (Exception e) { throw new RuntimeException(e); } } } } return null; } }
package org.example.demo10.controller; import org.example.demo10.core.Controller; import org.example.demo10.core.RequestMapping; @Controller public class UserController { @RequestMapping("join") public String join() { System.out.println("UserController join"); return "join"; } @RequestMapping("login") public String login() { System.out.println("UserController login"); return "redirect:home"; } }
package org.example.demo10.controller; import org.example.demo10.core.Controller; import org.example.demo10.core.RequestMapping; @Controller public class BoardController { @RequestMapping("home") public String home() { return "home"; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>home page</h1> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>join page</h1> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>login page</h1> </body> </html>
💡
리다이렉트와 포워딩을 지원 (redirect:home)
 

Spring MVC - 간단한 회원가입 및 페이지 이동 예제

notion image

프로젝트 생성

notion image
notion image
notion image

BoardController

package org.example.hello.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class BoardController { // localhost:8080/detail (GET) detail.mustache @GetMapping("/detail") public String detail() { return "detail"; } // localhost:8080/home @GetMapping("/home") public String home() { return "home"; } }

UserController

package org.example.hello.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @Controller public class UserController { // localhost:8080/join // body : username=ssar // header : Content-Type : application/x-www-form-urlencoded // 줄게 -> 회원가입 정보 @PostMapping("/join") public String join(String username) { // 1. DB insert System.out.println("username : " + username); // 2. 응답 return "redirect:/home"; } // 줘 -> 회원가입 페이지 @GetMapping("/join-form") public String joinForm() { return "join-form"; } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>회원가입 페이지 - 폼태그, 인풋</h1> <form action="/join" method="post"> <input type="text" name="username" placeholder="Enter username"> <button type="submit">회원가입</button> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>홈 페이지</h1> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>디테일 페이지 입니다.</h1> </body> </html>
notion image
notion image
notion image
💡
  1. 회원가입 페이지 (join-form)
  • /join-form으로 GET 요청을 보내면 join-form.html을 보여줌.
  • HTML에는 inputsubmit 버튼이 있음.
  • 사용자가 입력하고 "회원가입" 버튼을 누르면 /join으로 POST 요청이 감.
  1. 회원가입 요청 (join)
      • 사용자가 username을 입력하면 /join으로 요청을 보냄.
      • join(String username) 메서드가 실행됨.
      • System.out.println()을 통해서 입력값을 출력함.
      • 완료되면 redirect:/home으로 이동해서 홈 화면을 보여줌.
  1. 홈 화면 (home)
      • /home으로 GET 요청을 보내면 home.html이 보여짐.
  1. 디테일 페이지 (detail)
      • /detail로 요청을 보내면 detail.html을 보여줌.
Share article

harimmon