[Spring MVC]/Program source (Spring MVC)

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

Jelly-fish 2024. 1. 11. 17:36

012
MemberList.jsp

SpringMVCStudy - Mvc03


 


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

○ Prespective
   : JavaEE

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

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

○ 실습 성격
   : 데이터 송수신 관련 실습(Spring MVC 버전)
     JDBC 모듈 추가 활용
     SimpleDriverDataSource 클래스(객체) 활용

○ 기능 구현
   : 사용자로부터 이름, 전화번호 정보를 입력받아 데이터베이스에 저장
     저장된 이름, 전화번호 항목을 데이터베이스로부터 읽어 화면에 구성

○ 사전 작업
   - TBL_MEMBERLIST 테이블 생성
   - MEMBERLISTSEQ 시퀀스 생성
   - 샘플 데이터 입력 및 조회

○ 기본 레이아웃(페이지 화면 구성)
   이름 [         ]       → <input type="text">
   전화 [         ]       → <input type="text">
     < 회원 추가 >        → <button type="button">

   전체 인원 수 : 2명     → <p>...</p>
   --------------------   → <table>...</table>
   번호  이름  전화번호
     1    노.. 010...
     2    김.. 010...
   --------------------

[ ★ 파이널 프로젝트 들어갈 때, 
아래와 같이 물리적 파일 구성에 대한 정리 글을 작성하고 시작하도록 하자.]
[ ★ 주제의 윤곽이 잡히게 되면, View 작업을 먼저 실행한 후 필요한 데이터, 보여져야 하는 화면을
생각하면서 구성해야 업무 가닥을 잡을 수 있다.]


○ 물리적 파일 구성
   - Mvc03_scott.sql → 데이터베이스 관련 객체 구성 및 실습 데이터 준비

   - MemberDTO.java → 사용자 정의 자료형 클래스(DTO 활용)

   - IMemberDAO.java → 인터페이스
   - MemberDAO.java → 데이터베이스 액션 처리 클래스
                                   Connection 객체에 대한 의존성 주입
                                   (의존성 주입을 위한 준비 필요)

   - MemberListController.java → 사용자 정의 컨트롤러 클래스
                                   리스트 출력 액션
                                   DAO 객체에 대한 의존성 주입 
                                   (의존성 주입을 위한 준비 필요)

   - MemberList.jsp → 회원 리스트 출력용 뷰
                                   회원 데이터 입력(추가) 폼 화면 구성

   - MemberInsertController.java→ 사용자 정의 컨트롤러 클래스
                                   회원 데이터 추가 액션
                                   DAO 객체에 대한 의존성 주입
                                   (의존성 주입을 위한 준비 필요)

   - web.xml → DispatcherServlet 객체 등록
                                   URL 매핑 주소 등록

   - dispatcher-servlet.xml → 컨트롤러 객체 등록
                                   URL 매핑 주소 등록
                                   SimpleDriverDataSource 객체 등록
                                   의존 객체 주입 설정 
                                   DAO 객체 등록


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

○ 사용자 최초 요청 주소
   `http://localhost:3306/Mvc03/memberlist.do`


 

 


MemberList.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>MemberList.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
	* {line-height: 150%;}
	#customers td {text-align: center;}
	#submitBtn
	{
		height: 150%;
		width: 250px;
		font-size: 18px;
		font-weight: bold;
		font-family: 맑은 고딕;
		color: #343;
		margin: 10px;
	}
	#err
	{
		color: red;
		font-size: small;
		display: none;
	}
	
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
	
	$(document).ready(function()
	{
		$("#submitBtn").click(function()
		{
			// 테스트
			//alert("확인~!!!");
			
			// 이름과 전화번호 두 항목 모두 필수 입력 항목이기 때문에... 생략 가능
			$("#err").css("display", "none");
			
			if($("#name").val()=="" || $("#telephone").val()=="")
			{
				$("#err").css("display", "inline");
				return;
			}
			
			$("#memberForm").submit();
				
			
		});
	});

</script>


</head>
<body>

<div>
	<h1>회원 관리</h1>
	<hr>
</div>

<div>
	<form action="memberinsert.do" method="post" id="memberForm">
		이름
		<input type="text" name="name" id="name" class="control" required="required">
		<br>
		전화
		<input type="text" name="telephone" id="telephone" class="control" required="required">
		<br>
		<button type="button" id="submitBtn">회원 추가</button>
		<span id="err">모든 항목을 입력해야 합니다.</span>
	</form>
	
	<br>
	<!-- <p>전체 인원 수 : 2명</p> -->
	<p>전체 인원 수 : ${count }명</p>
	
	<table id="customers" style="width: 500px;" class="table">
		<tr>
			<th>번호</th><th>이름</th><th>전화번호</th>
		</tr>
	
		<%-- EL, JSTL 표현에 의한 전체 회원 명단 출력 부분 --%>
		<c:forEach var="member" items="${memberList }">
			<tr>
				<%-- MemberDTO 객체의 --%>
				<%-- getMid(), getName(), getTelephone() 메소드 호출하는 EL 표현 --%>
				<td>${member.mid }</td>
				<td>${member.name }</td>
				<td>${member.telephone }</td>
			</tr>
		</c:forEach>
		<!-- 
		<tr>
			<td>1</td>
			<td>고길동</td>
			<td>010-1212-3434</td>
		</tr>
		<tr>
			<td>2</td>
			<td>마이콜</td>
			<td>010-4455-6677</td>
		</tr>
		 -->
		 
		 
	</table>
	
</div>

</body>
</html>

Mvc03_scott.sql

 

SELECT USER
FROM DUAL;
--==>> SCOTT

DESC TBL_MEMBERLIST;
--==>> 
/*
이름    널?       유형            
----- -------- ------------- 
ID    NOT NULL VARCHAR2(30)  
PW    NOT NULL VARCHAR2(50)  
NAME  NOT NULL VARCHAR2(50)  
TEL   NOT NULL VARCHAR2(50)  
EMAIL          VARCHAR2(100) 
*/

DROP TABLE TBL_MEMBERLIST;
--==>> Table TBL_MEMBERLIST이(가) 삭제되었습니다.

--○ 실습 테이블 다시 생성

CREATE TABLE TBL_MEMBERLIST
( MID       NUMBER
, NAME      VARCHAR2(30)
, TELEPHONE VARCHAR2(50)
, CONSTRAINT MEMBERLIST_MID_PK PRIMARY KEY(MID)
);
--==>> Table TBL_MEMBERLIST이(가) 생성되었습니다.


--○ 시퀀스 생성(MEMBERLISTSEQ)
CREATE SEQUENCE MEMBERLISTSEQ
NOCACHE;
--==>> Sequence MEMBERLISTSEQ이(가) 생성되었습니다.

--○ 입력 쿼리문 구성 및 샘플 데이터 입력
INSERT INTO TBL_MEMBERLIST(MID, NAME, TELEPHONE)
VALUES(MEMBERLISTSEQ.NEXTVAL, '정현욱', '010-1111-2222');
--> 한 줄 구성
INSERT INTO TBL_MEMBERLIST(MID, NAME, TELEPHONE) VALUES(MEMBERLISTSEQ.NEXTVAL, '정현욱', '010-1111-2222')
;
--==>> 1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_MEMBERLIST(MID, NAME, TELEPHONE) VALUES(MEMBERLISTSEQ.NEXTVAL, '박가영', '010-3333-4444')
;
--==>> 1 행 이(가) 삽입되었습니다.

--○ 확인
SELECT MID, NAME, TELEPHONE
FROM TBL_MEMBERLIST
ORDER BY MID;
--> 한 줄 구성
SELECT MID, NAME, TELEPHONE FROM TBL_MEMBERLIST ORDER BY MID
;
--==>>
/*
MID	NAME	TELEPHONE
1	정현욱	010-1111-2222
2	박가영	010-3333-4444
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.

--○ 인원 수 조회 쿼리문 구성
SELECT COUNT(*) AS COUNT
FROM TBL_MEMBERLIST;
--> 한 줄 구성
SELECT COUNT(*) AS COUNT FROM TBL_MEMBERLIST
;
--==>> 2

 


MemberDTO.java

 

/*===============================
  MemberDTO.java
  - 사용자 정의 자료형 클래스 
================================*/

package com.test.mvc;

public class MemberDTO
{
	// 주요 속성 구성
	private int mid;
	private String name, telephone;
	
	// 사용자 정의 생성자 없음 → default 생성자 자동 삽입
	
	// getter / setter 구성 
	public int getMid()
	{
		return mid;
	}
	public void setMid(int mid)
	{
		this.mid = mid;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getTelephone()
	{
		return telephone;
	}
	public void setTelephone(String telephone)
	{
		this.telephone = telephone;
	}
	
	
	
}

 


IMemberDAO.java

 

/*==================
   IMemberDAO.java
   - 인터페이스
====================*/

package com.test.mvc;

import java.sql.SQLException;
import java.util.ArrayList;

public interface IMemberDAO
{
	// 회원 데이터 추가(등록) 메소드 선언
	public int add(MemberDTO member) throws SQLException;
	
	// 전체 인원 수 확인(조회) 메소드 선언
	public int count() throws SQLException;
	
	// 전체 회원 리스트 확인(조회) 메소드 선언
	public ArrayList<MemberDTO> list() throws SQLException;
	

}

 

MemberDAO.java

 

/*=============================================
   MemberDAO.java
   - 데이터베이스 액션 처리 클래스
   - IMemberDAO 인터페이스를 구현하는 클래스
   - Connection 객체에 대한 의존성 주입
     (의존성 주입을 위한 준비 필요)
===============================================*/

package com.test.mvc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.sql.DataSource;


public class MemberDAO implements IMemberDAO
{
	// ※ Connection 객체에 대한 의존성 주입을 위한 준비
	//    ① 인터페이스 형태의 데이터타입을 취하는 속성 구성

	private DataSource dataSource;
	

	//    ② setter 구성
	public void setDataSource(DataSource dataSource)
	{
		this.dataSource = dataSource;
	}
	
	// ※ IMemberDAO 인터페이스의 메소드 오버라이딩

	@Override
	public int add(MemberDTO member) throws SQLException
	{
		int result = 0;
		
		Connection conn = dataSource.getConnection();
		
		
		String sql = "INSERT INTO TBL_MEMBERLIST(MID, NAME, TELEPHONE)"
				  + " VALUES(MEMBERLISTSEQ.NEXTVAL, ?, ?)";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, member.getName());
		pstmt.setString(2, member.getTelephone());
		
		result = pstmt.executeUpdate();
		
		return result;
		
	}

	@Override
	public int count() throws SQLException
	{
		
		int result = 0;
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT COUNT(*) AS COUNT"
				  + " FROM TBL_MEMBERLIST";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			result = rs.getInt("COUNT");
		}
		
		return result;
		
	}

	@Override
	public ArrayList<MemberDTO> list() throws SQLException
	{
		ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT MID, NAME, TELEPHONE"
				  + " FROM TBL_MEMBERLIST ORDER BY MID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			MemberDTO member = new MemberDTO();
			
			member.setMid(rs.getInt("MID"));
			member.setName(rs.getString("NAME"));
			member.setTelephone(rs.getString("TELEPHONE"));
			
			result.add(member);
			
		}
		
		
		
		return result;
	}
	
}

MemberListController.java
/*=====================================
   MemberListController.java
   - 사용자 정의 컨트롤러 클래스
   - 전체 회원 리스트 출력 액션
   - 전체 인원 수 확인 액션
   - DAO 객체에 대한 의존성 주입
     (의존성 주입을 위한 준비 필요)
=======================================*/

package com.test.mvc;

import java.util.ArrayList;

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 MemberListController implements Controller
{
	// 인터페이스 자료형을 취하는 속성 구성
	private IMemberDAO dao;
	
	
	// setter 메소드 구성
	public void setDao(IMemberDAO dao)
	{
		this.dao = dao;
	}



	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// 액션 코드
		
		ModelAndView mav = new ModelAndView();
		
		int count = 0;
		ArrayList<MemberDTO> memberList = new ArrayList<MemberDTO>();
		
		try
		{
			count = dao.count();
			memberList = dao.list();
		}
		catch(Exception e)
		{
			System.out.println(e.toString());
		}
		
		mav.setViewName("/WEB-INF/view/MemberList.jsp");
		mav.addObject("count", count);
		mav.addObject("memberList", memberList);

		
		return mav;
		
	}
	
}

 


MemberInsertController.java
/*=======================================
   MemberInsertController.java
   - 사용자 정의 컨트롤러 클래스
   - 회원 데이터 추가 액션 처리 클래스 
   - DAO 객체에 대한 의존성 주입
     (의존성 주입을 위한 준비 필요)
=========================================*/

// setter injection : setter 를 통한 의존주입
// constructor injection : 생성자를 통한 의존주입

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 MemberInsertController implements Controller
{

	// dao 관련 속성 구성 → 인터페이스 형태
	private IMemberDAO dao;
	
	public void setDao(IMemberDAO dao)
	{
		this.dao = dao;
	}


	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// 액션 코드
		
		ModelAndView mav = new ModelAndView();
		
		// 이전 페이지(MemberList.jsp)로부터 넘어온 데이터 수신
		//-- name, telephone
		
		request.setCharacterEncoding("UTF-8");
		
		String name = request.getParameter("name");
		String telephone = request.getParameter("telephone");
		
		try
		{
			// MemberDTO 구성
			MemberDTO member = new MemberDTO();
			
			member.setName(name);
			member.setTelephone(telephone);
			
			// insert 쿼리문을 수행하는 dao 의 add() 메소드 호출
			dao.add(member);
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
		// check~!!!
		//mav.setViewName("/WEB-INF/view/MemberList.jsp");	//--(Ⅹ)
		
		// check~!!!
		// sendRedirect()  → MemberList.jsp				//--(Ⅹ)
		//                 → memberlist.do					//--(○)
		
		// ★★★★★★★★★★★★★★★★
		// 【컨트롤러로 접근 해야한다!!!】
		// ★★★★★★★★★★★★★★★★
		
		// MemberList.jsp 는 컨트롤러를 통해서 클라이언트를 만난다.
		// 왜냐하면, 첫 페이지에서 회원 목록을 보여주어야 하기 때문에.
		mav.setViewName("redirect:memberlist.do");
		// redirect 를 통해 컨트롤러에 들어가는 방식이므로
		// redirect:를 작성해 준다.
		
		return mav;
		
	}
	
}

 


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>*.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 객체의 패키지 경로가 포함된 클래스 이름을 등록한다. -->

	<!--  DataSource → SimpleDriverDataSource -->
	<bean id="localDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@211.238.142.170:1521:xe"></property>
		<property name="username" value="scott"></property>
		<property name="password" value="tiger"></property>
	</bean>
	
	<!--  DataSource → SimpleDriverDataSource -->
	<bean id="remoteDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@211.238.142.171:1521:xe"></property>
		<property name="username" value="scott"></property>
		<property name="password" value="tiger"></property>
	</bean>
	
	<!-- MemberDAO -->
	<bean id="memberDAO" class="com.test.mvc.MemberDAO">
		<property name="dataSource">
			<ref bean="localDataSource" />
		</property>
	</bean>
	
	<!-- MemberListController -->
	<bean name="/memberlist.do" class="com.test.mvc.MemberListController">
		<property name="dao">
			<ref bean="memberDAO" />
		</property>
	</bean>
	
	<!-- MemberListInsertController -->
	<bean name="/memberinsert.do" class="com.test.mvc.MemberInsertController">
		<property name="dao">
			<ref bean="memberDAO" />
		</property>
	</bean>
	
	
	
</beans>

web.xml
    클라이언트가 특정 url (`*.do`) 접근시 
     DispatcherServlet (dispatcher-servlet.xml)
    동작 
    `<url-pattern>*.do</url-pattern>`

 

	<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>

 


 

`<property name="해당 빈(Bean)객체 클래스의 프로퍼티(속성변수) 명" value="속성 변수에 저장할 값">`

②-1 dispatcher-servlet.xml
    `Connection` 객체의 의존 주입. 
    `Connection` 의존 주입 : `SimpleDriverDataSource` 사용.
    `class="org.springframework.jdbc.datasource.SimpleDriverDataSource"`
     → ⓐ `driverClass ` : "oracle.jdbc.driver.OracleDriver"
     → ⓑ `url` : "jdbc:oracle:thin:@localhost:1521:xe"
     → ⓒ `username` : "scott"
     → ⓓ `password` : "tiger"

 

<!--  DataSource → SimpleDriverDataSource -->
<bean id="localDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@211.238.142.170:1521:xe"></property>
    <property name="username" value="scott"></property>
    <property name="password" value="tiger"></property>
</bean>

<!--  DataSource → SimpleDriverDataSource -->
<bean id="remoteDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@211.238.142.171:1521:xe"></property>
    <property name="username" value="scott"></property>
    <property name="password" value="tiger"></property>
</bean>

②-2 dispatcher-servlet.xml
        `MemberDAO` 빈(Bean) 객체를 생성한 후, 
        위에서 생성한 빈(Bean) 객체 의존 주입. (setter Injection)
<!-- MemberDAO -->
	<bean id="memberDAO" class="com.test.mvc.MemberDAO">
		<property name="dataSource">
			<ref bean="localDataSource" />
		</property>
	</bean>

 


②-3 dispatcher-servlet.xml
        `MemberDAO` (Data Access Object) 객체를 통해
         데이터베이스 액션 처리를 Controller 에서 수행하기 때문에
         `MemberDAO` 객체를 Controller에 의존 주입을 해 주어야 한다.
         → ⓐ `MemberListController`
         → ⓑ `MemberInsertController`
	<!-- MemberListController -->
	<bean name="/memberlist.do" class="com.test.mvc.MemberListController">
		<property name="dao">
			<ref bean="memberDAO" />
		</property>
	</bean>
	
	<!-- MemberInsertController -->
	<bean name="/memberinsert.do" class="com.test.mvc.MemberInsertController">
		<property name="dao">
			<ref bean="memberDAO" />
		</property>
	</bean>

 


★★★ [전체적인 프로그램 실행 흐름 재정리] ★★★

 

① 클라이언트 `http://localhost:3306/Mvc03/memberlist.do` 주소에 접근


② `*.do` 형태의 url 에 접근하여, `DispatcherServlet` 동작. (`dispatcher-servlet.xml`)

 

[web.xml]
	<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>

③ `dispatcher-servlet.xml` 에서 `"/memberlist.do"` url 로 접근하였기 때문에

     `MemberListController` 컨트롤러가 동작.

 

[dispatcher-servlet.xml]
	<!-- MemberListController -->
	<bean name="/memberlist.do" class="com.test.mvc.MemberListController">
		<property name="dao">
			<ref bean="memberDAO" />
		</property>
	</bean>

 

④ `MemberListController` 컨트롤러에서 `MemberDAO` 객체를 통해

     클라이언트가 접근하는 View 페이지에 회원 리스트를 출력하도록 처리.

     → 인원수 받기 : count = dao.count();

     → 회원 리스트 (`ArrayList<MemberDTO>`) 받기 : memberList = dao.list();

 

[MemberListController.java]
      	    //=========================================
            // dispatcher-servlet.xml 파일에서 
            // 의존 객체 주입을 실행해 주는 부분.
            // →『setter Injection』
            //=========================================
            // 인터페이스 자료형을 취하는 속성 구성
            private IMemberDAO dao;

            // setter 메소드 구성
            public void setDao(IMemberDAO dao)
            {
                this.dao = dao;
            }
            //=========================================

	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{

            // 액션 코드
            ModelAndView mav = new ModelAndView();

            int count = 0;
            ArrayList<MemberDTO> memberList = new ArrayList<MemberDTO>();

            try
            {
                // 회원 인원수 반환받기.
                count = dao.count();
                // 회원 리스트 반환받기.
                memberList = dao.list();
            }
            catch(Exception e)
            {
                System.out.println(e.toString());
            }

            mav.setViewName("/WEB-INF/view/MemberList.jsp");
            mav.addObject("count", count);
            mav.addObject("memberList", memberList);

            return mav;

	}

 


⑤ 클라이언트가 `MemberListController.java` 컨트롤러에 의해

     View 페이지인 `MemberList.jsp` 파일에 접근.

     ↓

    이 페이지에서, 클라이언트가 이름, 전화번호를 작성한 후 

    버튼을 클릭하면

    `memberinsert.do` url 을 요청하게 된다.


 

⑥ `memberinsert.do` url 을 요청하게 되면서 또다시 web.xml 에 의해

     dispatcher-servlet.xml 이 실행된다.

[web.xml]
	<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>

⑦ dispatcher-servlet.xml 파일에서

     클라이언트가 요청한 url 이 `http://localhost:3306/Mvc03/memberinsert.do` 이므로

     `MemberInsertController` 컨트롤러가 동작한다.

 

[dispatcher-servlet.xml]
	<!-- MemberInsertController -->
	<bean name="/memberinsert.do" class="com.test.mvc.MemberInsertController">
		<property name="dao">
			<ref bean="memberDAO" />
		</property>
	</bean>

⑧ MemberInsertController.java 컨트롤러에서 

    클라이언트가 입력한 이름 `name`, 전화번호 `telephone` 속성에 해당하는

    데이터를 데이터베이스 `TBL_MEMBERLIST`에 INSERT 처리 한다.

    

[MemberInsertController.java]
  	    //=========================================
            // dispatcher-servlet.xml 파일에서 
            // 의존 객체 주입을 실행해 주는 부분.
            // →『setter Injection』
            //=========================================
            // 인터페이스 자료형을 취하는 속성 구성
            private IMemberDAO dao;

            // setter 메소드 구성
            public void setDao(IMemberDAO dao)
            {
                this.dao = dao;
            }
            //=========================================
            
	// 요청을 핸들링 하겠다는 메소드.
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// 액션 코드
		
		ModelAndView mav = new ModelAndView();
		
		// 이전 페이지(MemberList.jsp)로부터 넘어온 데이터 수신
		//-- name, telephone
		
		request.setCharacterEncoding("UTF-8");
		
		String name = request.getParameter("name");
		String telephone = request.getParameter("telephone");
		
		try
		{
			// MemberDTO 구성
			MemberDTO member = new MemberDTO();
			
			member.setName(name);
			member.setTelephone(telephone);
			
			// insert 쿼리문을 수행하는 dao 의 add() 메소드 호출
			dao.add(member);
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
		// check~!!!
		//mav.setViewName("/WEB-INF/view/MemberList.jsp");	//--(Ⅹ)
		
		// check~!!!
		// sendRedirect()  → MemberList.jsp				//--(Ⅹ)
		//                 → memberlist.do					//--(○)
		
		// ★★★★★★★★★★★★★★★★
		// 【컨트롤러로 접근 해야한다!!!】
		// ★★★★★★★★★★★★★★★★
		
		// MemberList.jsp 는 컨트롤러를 통해서 클라이언트를 만난다.
		// 왜냐하면, 첫 페이지에서 회원 목록을 보여주어야 하기 때문에.
		mav.setViewName("redirect:memberlist.do");
		// redirect 를 통해 컨트롤러에 들어가는 방식이므로
		// redirect:를 작성해 준다.
		
		return mav;
		
	}

※ <★여기서 체크할 사항★>

데이터베이스(`TBL_MEMBERLIST`)에 클라이언트가 입력한 이름 `name`, 전화번호 `telphone`를

입력한 후에 곧바로 View 페이지인 MemberList.jsp 로 이동해서는 안 된다.

 

MemberList.jsp 페이지 자체가, 클라이언트를 바로 만나는 페이지가 아니라

`MemberListController.java` 컨트롤러를 통해 만나는 View 페이지이기 때문이다.

MemberListController.java 컨트롤러에서 `MemberDAO` 데이터베이스 액션 처리 객체를 통해

`TBL_MEMBERLIST` 테이블에 있는 항목들을 가져와 준 후에 View 페이지인

`MemberList,jsp` 에 뿌려 주어야 하므로 반드시 MemberListController 컨트롤러를 거쳐서 View 페이지에

접근해야 한다.

 

즉, 컨트롤러에서 `dao.add(MemberDTO member)` 메소드를 통해 데이터를 테이블에 추가한 후에

`ModelAndView` 객체를 전송해 주어야 하는 페이지는

View 페이지(`MemberList.jsp`)가 아니라, Controller 페이지(`MemberListController.java`)인 것이다.