JAVA/Practice

[MAVEN] SpringMVC2 ๋ฒ„์ „1 ์—ฐ์Šต (Controller)

ITs Min 2024. 3. 6.

๐Ÿ” ๋ชฉ์ 

์ค‘๊ฐ„ ํ”„๋กœ์ ํŠธ ๋•Œ ์ง„ํ–‰ํ–ˆ๋˜ ์นด๋ฉ”๋ผ ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์ดํŠธ๋ฅผ Spring์œผ๋กœ ์ด๊ด€ํ•˜๋Š” ๊ฒƒ

์‹ค๋ฌด์—์„œ ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ• ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ์—ฐ์Šต

์•ž์—์„œ ์ผ๋˜ SpringMVC2์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์ƒ๊ฐ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ํž˜๋“  ๊ฒƒ ๊ฐ™์•„ Refresh!!


๐Ÿ” DispatcherServlet (FrontController)

DispatcherServlet์€ MVC2 ํŒจํ„ด์—์„œ ์œ ์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์ด๋‹ค. ๊ทธ๋ƒฅ ์ด๊ฒŒ ์—†์œผ๋ฉด ๋ญ˜ ํ•  ์ˆ˜๊ฐ€ ์—†์Œ

 

Spring์—์„œ๋Š” FrontController ๋Œ€์‹  DispatcherServlet์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฒ„์ „ 1์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  DispatcherServlet์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ก import com.spring.controller.common.DispatcherServlet

 

DispatcherServlet.java

package com.spring.controller.common;

import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.spring.controller.common.DispatcherServlet;

// FrontController
// ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์œผ๋กœ์„œ, Front Controller ๋””์ž์ธ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค.
// ์ฃผ์š” ์—ญํ• ์€ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„ ํ•ด๋‹น ์š”์ฒญ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•˜๊ณ ,
// ์‹คํ–‰๋œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ทฐ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•œ๋‹ค.
public class DispatcherServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private HandlerMapping handler; // ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด
    private ViewResolver viewResolver; // ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด

    // init-method="init"
    // ์„œ๋ธ”๋ฆฟ์ด ์ดˆ๊ธฐํ™”๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
    // 1. ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
    // 2. ์ƒ์„ฑ์ž
    // 3. setter
    // 4. @Autowired
    // 5. DI(์˜์กด์ฃผ์ž…)
    // 6. init() ๋ฉ”์„œ๋“œ
    public void init() {
        handler = new HandlerMapping(); // ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘ ๊ฐ์ฒด ์ƒ์„ฑ
        viewResolver = new ViewResolver(); // ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ๊ฐ์ฒด ์ƒ์„ฑ
        viewResolver.setPrefix("./"); // ๋ทฐ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ(prefix) ์„ค์ •
        viewResolver.setSuffix(".jsp"); // ๋ทฐ ํŒŒ์ผ์˜ ํ™•์žฅ์ž(suffix) ์„ค์ •
    }

    // ํด๋ผ์ด์–ธํŠธ์˜ GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doAction(request, response);
    }

    // ํด๋ผ์ด์–ธํŠธ์˜ POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doAction(request, response);
    }

    // ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ URI๋ฅผ ์ถ”์ถœ
        String uri = request.getRequestURI();
        String cp = request.getContextPath();
        String command = uri.substring(cp.length());
        System.out.println("FC : " + command); // ์ถ”์ถœ๋œ ์š”์ฒญ URI๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅ

        // ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ฐ€์ ธ์˜ด
        Controller controller = handler.getController(command);
        
        // ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์˜ execute() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ฐ˜ํ™˜๋œ ๋ทฐ ์ •๋ณด๋ฅผ ์ €์žฅ
        String view = controller.execute(request, response);

        // ๋ฐ˜ํ™˜๋œ ๋ทฐ ์ •๋ณด๊ฐ€ ".do"๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ, ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ทฐ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ด
        if (view.contains(".do")) {
            view = viewResolver.getView(view);
        }
        
        // ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ทฐ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜์—ฌ ์‘๋‹ตํ•จ
        response.sendRedirect(view);
    }
}

web.xml

  • web-app ์—˜๋ฆฌ๋จผํŠธ: XML ํŒŒ์ผ์˜ ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ๋กœ, Java EE ์Šคํ‚ค๋งˆ์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • servlet ์—˜๋ฆฌ๋จผํŠธ: ์ด ์—˜๋ฆฌ๋จผํŠธ๋Š” ์„œ๋ธ”๋ฆฟ์„ ์ •์˜ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” DispatcherServlet์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋•Œ servlet-name์œผ๋กœ๋Š” "dispatcherServlet"์„, servlet-class๋กœ๋Š” com.spring.controller.common.DispatcherServlet ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • servlet-mapping ์—˜๋ฆฌ๋จผํŠธ: ์ด ์—˜๋ฆฌ๋จผํŠธ๋Š” ์„œ๋ธ”๋ฆฟ๊ณผ URL ํŒจํ„ด์„ ๋งคํ•‘ํ•œ๋‹ค. DispatcherServlet๊ณผ "*.do" URL ํŒจํ„ด์„ ๋งคํ•‘ํ•˜์—ฌ, ".do" ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“  URL ์š”์ฒญ์„ DispatcherServlet์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://java.sun.com/xml/ns/javaee"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		                    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
	
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>com.spring.controller.common.DispatcherServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
</web-app>

๐Ÿ” Controller(Action)

SpringMVC2 ๋ฒ„์ „ 1์—์„œ๋Š” Controller๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์ž‘์„ฑํ•œ Controller๋ฅผ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ implementsํ•œ๋‹ค.

Java์—์„œ๋Š” ActionForward๋ฅผ ํ†ตํ•ด View์— ์ „๋‹ฌํ•˜์˜€์ง€๋งŒ Spring์—์„œ๋Š” ViewResolver๋ฅผ ์ด์šฉํ•œ๋‹ค.

Controller.java (์ธํ„ฐํŽ˜์ด์Šค)

package com.spring.controller.common;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

// Action
public interface Controller {

	// ActionForward → String
	String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
	
}

LoginAction.java

package com.spring.controller.member;

import java.io.IOException;

import com.spring.controller.common.Controller;
import com.spring.model.member.MemberDAO;
import com.spring.model.member.MemberDTO;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

// ๋กœ๊ทธ์ธ ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
public class LoginAction implements Controller {

    // execute ๋ฉ”์„œ๋“œ ์žฌ์ •์˜
    @Override
    public String execute(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // ํšŒ์› ์ •๋ณด๋ฅผ ๋‹ด์„ DTO ๊ฐ์ฒด ์ƒ์„ฑ
        MemberDTO memberDTO = new MemberDTO();
        // ํšŒ์› DAO ๊ฐ์ฒด ์ƒ์„ฑ
        MemberDAO memberDAO = new MemberDAO();
        
        // ์š”์ฒญ์œผ๋กœ๋ถ€ํ„ฐ ํšŒ์› ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์™€ DTO ๊ฐ์ฒด์— ์„ค์ •
        memberDTO.setId(request.getParameter("memberId"));
        memberDTO.setPw(request.getParameter("memberPw"));
        
        // DAO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์› ์ •๋ณด ์กฐํšŒ
        memberDTO = memberDAO.selectOne(memberDTO);
        
        // ํšŒ์› ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
        if(memberDTO != null) {
            // ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
            return "mainPageAction.do";
        }
        // ํšŒ์› ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
        else {
            // ์ด์ „ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ
            return "goBack.do";
        }
    }
}

๐Ÿ” HandlerMapping

HandlerMapping ์—ญ์‹œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“  HandlerMappingํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜์กด ์ฃผ์ž…์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

HandlerMapping.java

package com.spring.controller.common;

import java.util.HashMap;
import java.util.Map;

import com.spring.controller.member.JoinAction;
import com.spring.controller.member.JoinPageAction;
import com.spring.controller.member.LoginPageAction;
import com.spring.controller.member.LogoutAction;
import com.spring.controller.member.MainPageAction;

// ์š”์ฒญ URI์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ ํด๋ž˜์Šค
public class HandlerMapping {
    private Map<String, Controller> mappings; // ์š”์ฒญ URI์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋งต

    // ์ƒ์„ฑ์ž: ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public HandlerMapping() {
        mappings = new HashMap<String, Controller>(); // ๋งต ์ƒ์„ฑ
        
        // ๋งต์— ์š”์ฒญ URI์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ์ถ”๊ฐ€
        mappings.put("/main.do", new MainPageAction()); // ๋ฉ”์ธ ํŽ˜์ด์ง€ ์š”์ฒญ ๋งคํ•‘
        mappings.put("/joinPage.do", new JoinPageAction()); // ํšŒ์› ๊ฐ€์ž… ํŽ˜์ด์ง€ ์š”์ฒญ ๋งคํ•‘
        mappings.put("/join.do", new JoinAction()); // ํšŒ์› ๊ฐ€์ž… ์š”์ฒญ ๋งคํ•‘
        mappings.put("/loginPage.do", new LoginPageAction()); // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์š”์ฒญ ๋งคํ•‘
        mappings.put("/logout.do", new LogoutAction()); // ๋กœ๊ทธ์•„์›ƒ ์š”์ฒญ ๋งคํ•‘
    }
    
    // ์š”์ฒญ URI์— ํ•ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public Controller getController(String commend) {
        return mappings.get(commend);
    }
}

๐Ÿ” ViewResolver

๋งˆ์ง€๋ง‰์ธ ViewResolver ๋˜ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์ด๋‹ค.

ViewResolver๋Š” HandlerMapping๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ Setter๋ฅผ ์ด์šฉํ•ด ์˜์กด ์ฃผ์ž…์„ ํ•œ๋‹ค.

ViewResolver.java

package com.spring.controller.common;

// ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ํด๋ž˜์Šค
public class ViewResolver {
    public String prefix; // ๋ทฐ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ(prefix)
    public String suffix; // ๋ทฐ ํŒŒ์ผ์˜ ํ™•์žฅ์ž(suffix)

    // prefix ์„ค์ • ๋ฉ”์„œ๋“œ
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    // suffix ์„ค์ • ๋ฉ”์„œ๋“œ
    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }

    // ์‹ค์ œ ๋ทฐ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public String getView(String view) {
        return prefix + view + suffix;
    }
}

๐Ÿ’ก ๊ฒฐ๋ก 

์˜ค๋Š˜ ์ด๊ด€ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ์•„์ง Spring์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์„ ํ•˜๋ฉด์„œ ๋А๋‚€์ ์€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ ์šฉ์‹œํ‚ค๋ฉด์„œ ๋ญ๊ฐ€ ๋ถ€์กฑํ•œ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค์‹œ ๋ณต๊ธฐํ•˜๋Š” ์‹์œผ๋กœ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์•ž์œผ๋กœ SpringMVC2์—์„œ์˜ Controller ํŒŒํŠธ์— ๋Œ€ํ•ด ๋ฒ„์ „๋ณ„๋กœ ๋‹ค์‹œ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


 

๋Œ“๊ธ€

TOP

๋Šฆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋• ๋„ˆ๋ฌด ๋Šฆ์€ ๊ฑฐ๋‹ค.