관리 메뉴

Legday

[Spring]DS(Dispatcher Servlet) 정적으로 구현해보기 본문

Spring&Springboot/Spring(개인공부용)

[Spring]DS(Dispatcher Servlet) 정적으로 구현해보기

Legday 2022. 8. 30. 15:31

1) 새 프로젝트 생성

- 앞에서는 Spring Project를 생성했는데 이번에는 조금 옛날 방식으로 해보겠습니다. 

- file->new->Other.. 를 선택합니다.

- 검색창에 dy 를 입력해 Dynamic Web Project 클릭!( 스프링이전 개발자들은 이런식으로 했다고 합니다.)

- 프로젝트 이름은 자유롭게 하시고

- 2번째 박스를 보면 어느 서버를 타겟으로 할 지 정할 수 있습니다. 저는 앞전에 해놔서 디폴트값이 설정되어있지만 처음하시는 분은 2번 빨간박스를 클릭!

- 본인이 다운받았던 Apache Tomcat 버전에 맞게 선택

- next누르고 finish 누르면 됩니다.

- 그 이후론 넥스트를 쭉쭉해주면 됩니다.

2) 서버 실행하기

- src->main->webapp 파일 내부에 index.jsp파일 생성을 합니다.

- 간단하게 jsp파일 내부에 표시를 해둡니다

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>index.jsp 실행</h1>
</body>
</html>

 

- 서버 실행하기

- 프로젝트 우클릭 후 Run on Server 클릭

- localhost 폴더가 닫혀있다면 더블클릭해서 Tomcat 서버 클릭 후 next

- 어느 프로젝트를 서버에 담을 껀지 정하는 화면입니다. test프로젝트를 오른쪽으로 이동시켜주면 됩니다.

- 서버를 실행하면 아래처럼 나오는데 당연한 결과입니다 . 당황하지 마시고 server.xml 에 가서 context-path설정을 해주면 됩니다.

- server.xml 클릭!

- 빨간 부분을 /test -> / 로 바꿔주시고

- 브라우저에 localhost:8000/ 만입력하면 자동으로 가게됩니다.

- 수정후 서버를 껏다가 다시 실행시키면 됩니다.

 

3) 정적인 Dispatcher Servlet 구현해보기

1. 패키지 생성

- 우클릭해서 패키지를 클릭

- 패키지 이름은 사이트 주소를 거꾸로 기입하는게 약속이다

2. 클래스 생성

- 아까 만든 패키지 우클릭해서 new class 

- DispatcherServlet이라는 이름의 클래스 생성

- 우선 HttpServlet 을 extends 해주면 자동으로 소켓이 생성이 된다.

- 그리고 GET , POST , PUT , DELETE  통신을 doProcess메서드 안에서 다 실행하게 한다.

- 이때 각각의 메서드는 req객체와 res객체를 매개변수로 받는다.

- @WebServlet 어노테이션을 통해 url 을 매핑해준다.

- 우선 getMethod()를 통해 어떤 통신을 하는지 데이터를 받아서 출력해보자

package site.metacoding.ds;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/")
public class DispatcherServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req,resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req,resp);
	}
	
	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req,resp);
	}
	
	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req,resp);
	}
	
	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doProcess 요청됨");
		String httpMethod = req.getMethod();
		System.out.println(httpMethod);
	}
	
}

getMethod() 

- 우선 포스트맨 을 실행해서 get,post,put,delete 방식으로 보내서 콘솔창에 잘 뜨는지 확인해보자

- getMethod()는 보시다시피 통신할때 어떤 method를 이용하는지 알 수 있는 메서드이다.

getRequestURI() 

- 패키지 우클릭 후 Annotation 생성을 해보자

- RequestMapping이라는 어노테이션 생성

- Target은 어노테이션이 어디 위에 적어줄 지 정하는 어노테이션(메서드,필드, 클래스 등)

- Retention은 어노테이션이 동작하는 시점을 정해주는 어노테이션

- 그리고 사용자가 만든 어노테이션안에는 value()라는 메서드를 적어준다(고정임)

package com.exam.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD}) //메서드위에만 사용하는 어노테이션
@Retention(RetentionPolicy.RUNTIME) //RUNTIME(런타임시),SOURCE(컴파일시) 어노테이션이 동작함
public @interface RequestMapping {
	String value(); //value메서드는 키값, 고정이다.
	//예시 : @RequestMapping("hello") -> hello가 value로 들어간다

}

 

- 그 다음 UserController 클래스를 생성해보자

- RequestMapping 정보에 따라 호출되는 메서드를 UserController 메서드로 작성

package com.exam.test;

public class UserController {

	@RequestMapping("/login")
	public void login() {
		System.out.println("login 호출됨");
	}
	
	@RequestMapping("/join")
	public void join() {
		System.out.println("join 호출됨");
	}
	
	@RequestMapping("/joinForm")
	public void joinForm() {
		System.out.println("joinForm호출됨");
	}
}

- 그리고 DispatcherServlet 클래스 내부에있는 doProcess()메서드를 아래와 같이 바꿔주자

- 우선 앞서 말한 getMethod()로 통신메서드를 입력받는건 똑같고

- 새로운 getRequestURI()는 사용자가 주소창에 입력한 URI을 파싱하여 IP주소 이외의 값을 파싱하여 리턴하는 메서드이다. 우선 파싱결과만 보자

private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doProcess 요청됨");
		String httpMethod = req.getMethod();
		System.out.println(httpMethod);
		
		String identifier = req.getRequestURI();
		System.out.println(identifier);
		
		//UserController c = new UserController();
		
		//if(identifier.equals("/join")) {c.join();}
		//else if(identifier.equals("/login")) {c.login();}
		//else {System.out.println("잘못된 주소");}
	}

- 아래 그림과 같이 localhost:8000/ 뒤로 오는 내용을 파싱하여 리턴해주는 메서드입니다

- if-else문을 이용하여 응용해보자

- 아까 만든 UserController클래스의 메서드를 호출해보자

이렇게 동적인 주소는 개발자가 직접 일일히 적어주면 DS구현이 가능하다. 하지만 동적으로 하기위해선 다른방법을 써야한다.