Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[SpringMVC] 20240110 [프로그램 소스] 본문

[Spring]/Program source (Spring)

[SpringMVC] 20240110 [프로그램 소스]

Jelly-fish 2024. 1. 10. 15:19

 

SpringMVCStudy - Mvc01


 

※ 참고 사항
① [eclipse 실행시, 실행 경로 지정 안내창]
실수로 시작 경로 설정창 안 물어보도록 설정했을 때
`window > preperences > workspace > Prompt for workspace on startup` 체크박스 체크

 

② [apache-tomcat 참고사항]
apache 와 tomcat 은 따로이다.
apache  리소스와 tomcat 리소스가 분리되어 있는데
우리가 사용하는 것은 tomcat 이다.

 

③ [★이클립스 서버 실행시 유의사항 - `metadata` 파일 엉킴 현상]

이를 알지 못하여, eclipse 실행경로가 WebStudy인 창과, FrameworkStudy 인 창을
동시에 열어서 작업하였다가 `metadata` 파일이 엉키게 되어
`WebStudy` 프로젝트가 제대로 실행되지 않았었다.

현재 이클립스에서 아파치 톰캣(`apache-tomcat-8.5.54`) 서버 하나만 사용하고 있기 때문에
★ SpringMVC 기반으로 tomcat 을 돌려놓은 상태에서
다른 이클립스 창으로 또다시 이 톰캣 리소스(서버)를 사용하게 되면 충돌이 발생하게 된다.

서버는 xml을 기반으로 움직이기 때문에`metadata` 에서 하나의 프로젝트에 리소스를 몰아서 전달해야 하는데...
동시에 두 개의 창에서 하나의 서버를 사용하게 되면,
서버가 시작되지 않은 두 번째 파일에 첫 번째 프로젝트의 리소스가 밀어넣어져서
서버 자체의 리소스가 헝클어져 버리기 때문
이다.

[ ※ 시도해 봐야 할 해결 방법 ※ ]

결과적으로, `metadata` 파일이 엉키게 된 것이므로
ⓐ 컴퓨터 재부팅을 해 보거나
ⓑ  apache-tomcat 을 삭제한 후, 재설치 해 보아야 한다.

 


이번 실습에서의 프로그램 실행 흐름 정리

 

[web.xml]


① 클라이언트가 *.action url 로 접근하게 되면
   web.xml 의 DispatcherServlet 클래스가 동작한다.


[dispatcher-servlet.xml]


② 이 DispatcherServlet xml 파일의 빈(Bean) 객체 중
   name 에 해당하는 url을 클라이언트가 접근 시도 했을 경우
   com.test.mvc 패키지 내부에 있는
   HelloController 컨트롤러가 동작하게 된다.


[HelloController.java]


③ HelloController 컨트롤러에서는 클라이언트의 요청을 핸들링한다.
   먼저, 인터페이스인 Controller 를 구현한 후에
   추상 메소드인
   `ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)`를
   `@Override` 한다.

   → ModelAndView mav 인스턴스를 생성한다.
   → ModelAndView 객체에 setAttribute를 하는 것과 같이
      `mav.addObject("객체명", 객체);` 메소드를 통해
      객체를 저장하고
   → ModelAndView 객체가 저장한 객체를 넘겨줄 페이지를
      `mav.setViewName("데이터 전송할 페이지 URL");` 메소드를 통해 (forwarding 처리)
      저장한 객체를 전달한 후
   → ModelAndView 객체를 return 한다.


[Hello.jsp]


④ HelloController 에서 전달한 객체를 수신하여
   EL 을 통해 페이지에서 보여지도록 처리해 준다.

   → `${message }`





■■■ Spring MVC 프로젝트 실습 01 ■■■

○ Prespective
   : JavaEE

○ 다이나믹 웹 프로젝트 생성 (비STS 버전)
   : Mvc01

○ 톰캣 서버 등록 및 포트(port) 설정 (인코딩 필터 적용 이전)
   : port 3306 / URIEncoding="UTF-8"

○ 기타 환경 설정
   : 기본 환경 설정은 『web_standard.epf』 를 통해 구성
     (폰트, 줄번호, 편집포맷, 인코딩방식, 템플릿 등...)

○ Spring MVC 환경 설정을 위한 라이브러리 등록
   : WebContent > WEB-INF > lib 경로에 등록
     - 경로 1   → C:\s-f-3.0.2-with-docs\dist
       ·파일 1 → org.springframework.aop-3.0.2.RELEASE.jar
       ·파일 2 → org.springframework.asm-3.0.2.RELEASE.jar
       ·파일 3 → org.springframework.beans-3.0.2.RELEASE.jar
       ·파일 4 → org.springframework.context-3.0.2.RELEASE.jar
       ·파일 5 → org.springframework.core-3.0.2.RELEASE.jar
       ·파일 6 → org.springframework.expression-3.0.2.RELEASE.jar
       ·파일 7 → org.springframework.jdbc-3.0.2.RELEASE.jar
       ·파일 8 → org.springframework.transaction-3.0.2.RELEASE.jar
       ·파일 9 → org.springframework.web.servlet-3.0.2.RELEASE.jar
       ·파일10 → org.springframework.web-3.0.2.RELEASE.jar

     - 경로 2   → C:\s-f-3.0.2-dependencies\org.apache.commons
                   \cohttp://m.springsource.org.apache.commons.logging\1.1.1
       ·파일11 → cohttp://m.springsource.org.apache.commons.logging-1.1.1.jar

     - 경로 3   → C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
                   (오라클 설치 경로)

       ·파일12 → ojdbc6.jar

     - 경로 4   → C:\Downloads\12_JSTL\jakarta-taglibs-standard-1.1.2\lib

       ·파일13 → jstl.jar
       ·파일14 → standard.jar

○ 물리적 파일 구성
   - HelloController.java
   - Hello.jsp
   - dispatcher-servlet.xml (파일 이름 변경 불가)
   - web.xml (dispatcher-servlet 프론트 컨트롤러 등록)
   - hello.action
   
   ※ 『dispatcher-servlet.xml』 파일의 기본 설정 내용(템플릿)을 구성하기 위해
       스프링 DOC의 내용을 참고해서 작성할 수 있도록 한다.
       ·경로 → C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf
       ·파일 → spring-framework-reference.pdf
       ·내용(위치) → 해당 pdf 문서의 페이지 번호 상 425 페이지
                       파일 구조의 바로가기 인덱스 상 450/805 페이지
       ·해당 위치로 이동하면 XML 파일에 대한 샘플(템플릿) 코드가 있다.
         이 내용을 복사하여 dispatcher-servlet.xml 파일의 기본 내용으로 작성한다.


○ 사용자 최초 요청 주소
   http://localhost:3306/Mvc01/hello.action

※ 우리가 작성한 Mvc01 프로젝트의 실행 및 처리 과정 정리

   ① 외부 요청
      http://localhost:3306/Mvc01/hello.action
      ===========================
         http://www.test.co.kr

      → web.xml 관여
         (→ Front Controller 등록 → DispatcherServlet 등록)

   ② DispatcherServlet 요청 접수

      → web.xml → DispatcherServlet 등록
         web.xml → URL 패턴 등록


     → 사용자 요청 분석 → 특정 컨트롤러 지정

   ③ 해당 컨트롤러의 특정 메소드 호출(액션 처리, ModelAndView 객체 반환)

      → 사용자의 요청에 맞는 액션 처리

      → 결과 데이터가 들어있는 모델 객체 준비

      → 뷰 정보(JSP 페이지 정보) 반환

         ※ JSP 페이지 정보
            - 여기서는 객체가 아닌 경로 포함된 View 페이지의 이름

   ④ 뷰 페이지에서 최종 웹 페이지를 작성

      → JSP 페이지 내에서 El 이나 JSTL 등의 표기 사용 가능

   ⑤ 응답 완료~!!!

 


전체적인 프로그램 실행 흐름 정리 - 내 정리
[web.xml]
① 클라이언트가 `*.action url` 로 접근하게 되면
   web.xml 의 DispatcherServlet 클래스가 동작한다.


[dispatcher-servlet.xml]
② 이 DispatcherServlet xml 파일의 빈(Bean) 객체 중
   name 에 해당하는 url을 클라이언트가 접근 시도 했을 경우
   com.test.mvc 패키지 내부에 있는
   HelloController 컨트롤러가 동작하게 된다.



[HelloController.java]
③ HelloController 컨트롤러에서는 클라이언트의 요청을 핸들링한다.
   먼저, 인터페이스인 Controller 를 구현한 후에
   추상 메소드인
   ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)를
   @Override 한다.

   → ModelAndView mav 인스턴스를 생성한다.
   → ModelAndView 객체에 setAttribute를 하는 것과 같이
      mav.addObject("객체명", 객체); 메소드를 통해
      객체를 저장하고
   → ModelAndView 객체가 저장한 객체를 넘겨줄 페이지를
      mav.setViewName("데이터 전송할 페이지 URL"); 메소드를 통해 (포워딩처리)
      저장한 객체를 전달한 후
   → `ModelAndView` 객체를 return 한다.


[Hello.jsp]
④ HelloController 에서 전달한 객체를 수신하여
   EL 을 통해 페이지에서 보여지도록 처리해 준다.

   → `${message }`

 

 

web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Mvc00</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

	<!-- ※ Spring MVC Framework 등록 -->
	<!--    → Front Controller 등록 -->
	<!--    → DispatcherServlet 객체 등록 -->

	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>

</web-app>

 


   ※ 『dispatcher-servlet.xml』 파일의 기본 설정 내용(템플릿)을 구성하기 위해
       스프링 DOC의 내용을 참고해서 작성할 수 있도록 한다.
       ·경로 → C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf
       ·파일 → spring-framework-reference.pdf
       ·내용(위치) → 해당 pdf 문서의 페이지 번호 상 425 페이지
                       파일 구조의 바로가기 인덱스 상 450/805 페이지
       ·해당 위치로 이동하면 XML 파일에 대한 샘플(템플릿) 코드가 있다.
         이 내용을 복사하여 dispatcher-servlet.xml 파일의 기본 내용으로 작성한다.

 

dispatcher-servlet.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			http://www.springframework.org/schema/context
			http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:component-scan base-package="org.springframework.samples.petclinic.web" />
	
	<!-- ※ 사용자 정의 Controller 객체 등록 및 URL 매핑 주소 등록 -->
	<!--    - 『name=""』 속성에 매핑 주소를 등록한다. -->
	<!--       이 과정에서 Front Controller 가 갖고있는 확장자의 형태로 구성한다. -->
	<!--    - 『class=""』 속성은 -->
	<!--       Controller 객체의 패키지 경로가 포함된 클래스 이름을 등록한다. -->
	
	
	<bean name="/hello.action" class="com.test.mvc.HelloController"></bean>
	
	
</beans>

 

HelloController.java (src - com.test.mvc)

 

/*=================================
   HelloController.java
   - 사용자 정의 컨트롤러 클래스
===================================*/

package com.test.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
//    사용자 정의 컨트롤러 클래스를 구성한다.
//    cf. Controller Annotation 활용
public class HelloController implements Controller
{

	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// 원래는, 컨트롤러로 모델과 뷰를 분리(결합을 막는다.)시켜야 하지만...
		// 문 손잡이를 모두 분리시켜서 부품화시키지 않고
		// 공통된 부분을 합쳐놓는 것 → 『ModelAndView』 이다!
		
		// 액션 코드
		
		ModelAndView mav = new ModelAndView();
		
		// 문자열 변수 생성.
		String message = "Hello, SpringMVC World~!!!";
		
		
		// setAttribute() 를 한 것과 마찬가지.
		// request.setAttribute()를 사용해도 되지만
		// 스프링에서는 같은 환경에서 정해진 틀을 지켜야 하므로...
		// [ModelAndView] 객체를 사용하도록 약속했으므로.
		mav.addObject("message", message);
		//             =======   =======
		//              객체명    객체
		
		mav.setViewName("/WEB-INF/view/Hello.jsp");
		// RequestDispatcher 를 통해 포워딩하는 처리와 유사하다.
		// 파일의 url을 넘겨주는 것만으로도
		// 객체를 넘기는 대상 뷰 객체를 지정해 주는 것이다.
		
		
		return mav;
		
	}
	
}

 


 

Hello.jsp (WebContent - WEB-INF - view)

 

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>

<div>
	<h1>${message }</h1>
</div>

</body>
</html>

 

 

※ 우리가 작성한 Mvc01 프로젝트의 실행 및 처리 과정 정리

   ① 외부 요청
      http://localhost:3306/Mvc01/hello.action
      ===========================
         http://www.test.co.kr

      → web.xml 관여
         (→ Front Controller 등록 → DispatcherServlet 등록)

   ② DispatcherServlet 요청 접수

      → web.xml → DispatcherServlet 등록
         web.xml → URL 패턴 등록


     → 사용자 요청 분석 → 특정 컨트롤러 지정

   ③ 해당 컨트롤러의 특정 메소드 호출(액션 처리, ModelAndView 객체 반환)

      → 사용자의 요청에 맞는 액션 처리

      → 결과 데이터가 들어있는 모델 객체 준비

      → 뷰 정보(JSP 페이지 정보) 반환

         ※ JSP 페이지 정보
            - 여기서는 객체가 아닌 경로 포함된 View 페이지의 이름

   ④ 뷰 페이지에서 최종 웹 페이지를 작성

      → JSP 페이지 내에서 El 이나 JSTL 등의 표기 사용 가능

   ⑤ 응답 완료~!!!

 

 


 

 

SpringMVCStudy - Mvc02


 

■■■ Spring MVC 프로젝트 실습 02 ■■■

○ Prespective
   : JavaEE

○ 다이나믹 웹 프로젝트 생성 (비STS 버전)
   : Mvc02

○ 기본 환경 구성 및 라이브러리 설정
   : Mvc00 (우리가 임의로 구성해둔 샘플)로 부터
     src, WebContent 디렉터리 복사 & 덮어쓰기

○ 실습 성격
   : 데이터 송수신 관련 실습(Spring MVC 버전)

○ 물리적 파일 구성
   - SendController.java → 컨트롤러 객체
   - Send.jsp → 뷰 객체

   - ReceiveController.java → 컨트롤러 객체
   - Receive.jsp → 뷰 객체

   - web.xml → DispatcherServlet 객체 등록 / URL 매핑 주소 등록
   - dispatcher-servlet.xml → 컨트롤러 객체 등록 / URL 매핑 주소 등록

   - send.do → 이클립스 실행 과정에서 요청을 위한 빈 파일
   

○ 사용자 최초 요청 주소
   http://localhost:3306/Mvc02/send.do

 


 

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Mvc00</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

	<!-- ※ Spring MVC Framework 등록 -->
	<!--    → Front Controller 등록 -->
	<!--    → DispatcherServlet 객체 등록 -->

	<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★  -->
	<!-- DispatcherServlet 을 사용할 때, 
	     <servlet-name> 의 이름은 반드시 dispatcher 로 사용하도록 하자!-->
	<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★  -->
	
	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	

</web-app>

 


 

dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			http://www.springframework.org/schema/context
			http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:component-scan base-package="org.springframework.samples.petclinic.web" />
	
	
	<!-- ※ 사용자 정의 Controller 객체 등록 및 URL 매핑 주소 등록 -->
	<!--    - 『name=""』 속성에 매핑 주소를 등록한다. -->
	<!--       이 과정에서 Front Controller 가 갖고있는 확장자의 형태로 구성한다. -->
	<!--    - 『class=""』 속성은 -->
	<!--       Controller 객체의 패키지 경로가 포함된 클래스 이름을 등록한다. -->
	
	<bean name="/send.do" class="com.test.mvc.SendController"></bean>
	<bean name="/receive.do" class="com.test.mvc.ReceiveController"></bean>
	
</beans>

SendController.java
/*=================================
   SendController.java
   - 사용자 정의 컨트롤러 클래스
===================================*/

package com.test.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
//    사용자 정의 컨트롤러 클래스를 구성한다.
//    cf. Controller Annotation 활용
public class SendController implements Controller
{

	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// 액션 코드
		
		ModelAndView mav = new ModelAndView();
		
		mav.setViewName("/WEB-INF/view/Send.jsp");
		
		
		return mav;
		
	}
	
}

Send.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Send.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>

<div>
	<h1>Spring MVC 데이터 송수신 실습</h1>
	<hr>
</div>

<div>
	<form action="receive.do" method="post">
		이름 <input type="text" name="userName">
		<button type="submit">submit</button>
	</form>
</div>

	<!-- receive.do -->
	<!-- → 안녕하세요, 홍길동님 반갑습니다. -->

</body>
</html>

ReceiveController.java

 

/*=================================
   ReceiveController.java
   - 사용자 정의 컨트롤러 클래스
===================================*/

package com.test.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
//    사용자 정의 컨트롤러 클래스를 구성한다.
//    cf. Controller Annotation 활용
public class ReceiveController implements Controller
{

	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// 액션 코드
		
		
		ModelAndView mav = new ModelAndView();
		
		request.setCharacterEncoding("UTF-8");
		
		String name = request.getParameter("userName");
		
		String result = String.format("안녕하세요, %s님 반갑습니다.", name);
		
		
		mav.addObject("result", result);
		mav.setViewName("/WEB-INF/view/Receive.jsp");
		
		
		return mav;
		
	}
	
}

Receive.jsp

 

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Receive.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>

<!-- <h1>안녕하세요, ${name }님 반갑습니다.</h1> -->
<!-- 위와 같이 처리해도 괜찮다. -->

<div>
	<h1>Spring MVC 데이터 송수신 실습</h1>
	<hr>
</div>
<%-- 
<div>
	<h2>데이터 수신 결과</h2>
	<h2>안녕하세요, ${userName }님 반갑습니다.</h2>
</div>
 --%>
<div>
	<h1>${result }</h1>
</div>


	

</body>
</html>