Spring FrameWork 실습-3

유동현·2022년 11월 14일
0

스프링MVC

목록 보기
3/13
post-thumbnail

목적

  • DB에 있는 테이블의 데이터를 불러오기 & 데이터 입력하기

과정

  • memberlist.action ->Spring 컨테이너 web.xml
    ->*.action -> dispatcher-servlet.xml
    ->/memberlist.action -> memberlistController
    ->DB접근 & MID,이름,전화번호 .addObject
    ->MEmberList.jsp ->우리눈앞에는 DB에있던 데이터가 보일거고

  • 입력시 memberinsert.action 으로 이동 -> Spring 컨테이너 web.xml -> .action -> dispatcher-servlet.xml -> /memberinsert.action -> memberinsertController-> dao.add(MID,이름,전화번호)를 통해 DB에 접근 및 입력 -> .view("redirect:memberlist.action") ->memberlist.action ->Spring 컨테이너 web.xml
    ->
    .action -> dispatcher-servlet.xml
    ->/memberlist.action -> memberlistController
    ->DB접근 & MID,이름,전화번호 .addObject
    ->MEmberList.jsp ->우리눈앞에는 DB에있던 데이터가 보일거고

1.의존 객체가 가질 속성 정의

DTO클래스 정의

package com.test.mvc;

public class MemberDTO
{

	private int mid;
	private String name, telephone;
	
	
	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;
	}
}

2.의존 객체 Interface 생성

package com.test.mvc;

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

public interface IMemberDAO
{
	
	public ArrayList<MemberDTO> list() throws SQLException ;
	
	public int add(MemberDTO member) throws SQLException;
	
	public int count() throws SQLException;
	
	
}

3.의존 객체 interface를 implements하는 DB연결 담당 클래스 생성

  • DBConn.java대신에 Spring에서쓰는 DataSource인터페이스 사용

/*=============================
 MemberDAO.java
 -데이터 액션 처리 클래스
 - IMemberDAO 인터페이스를 implements 하는 클래스
  → IMemberDAO 인터페이스에 선언된 메소드 재정의.
 - Connection 객체에 대한 의존성 주입을 위한 준비
  →setter injection
   ① 인터페이스 형태의 데이터타입을 취하는 멤버 구성(변수 선언)
   ② setter 구성 (setter 메소드 정의)
  
 88888888888888888888888888888888*/

package com.test.mvc;

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

import javax.sql.DataSource;


public class MemberDAO implements IMemberDAO
{
	
	// 우리는 여기서 쿼리문 필요 → 작업객체 필요
	//→ 작업객체는 Connection 통해서 생성 가능 but 지금 Connection 없음
	//   spring이 쓰는 Connection 쓸것이다. (dataSource)
	// 어떤 계정 정보, 어떤 ip 등의 정보는 dataSource bean 등록하는 과정에서
	// 속성값으로 xml 에서 넘겨주게 될 것이다.
	// 그러면 그걸 spring container 에서 주입받아서 connection 이루어 질 것이고
	// 그걸로 작업객체 생성하고, 그 작업객체 통해서 쿼리문 수행할 것이다.
	
	//※ Connection 객체에 대한 의존성 주입을 위한 준비
	
	//① 인터페이스 형태의 데이터타입
	private DataSource datasource;

	public void setDatasource(DataSource datasource)
	{
		this.datasource = datasource;
	}

	@Override
	public ArrayList<MemberDTO> list() throws SQLException
	{
		
		// 커넥션 객체
		Connection dbconn =  datasource.getConnection();
		
		ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
		
		String sql = "SELECT MID, NAME, TELEPHONE FROM TBL_MEMBERLIST ORDER BY MID";
		
		PreparedStatement pstmt = dbconn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setMid(rs.getInt("MID"));
			dto.setName(rs.getString("NAME"));
			dto.setTelephone(rs.getString("TELEPHONE"));
			result.add(dto);
			
		}
		
		rs.close();
		pstmt.close();
		dbconn.close();
		
		return result;
	}

	@Override
	public int add(MemberDTO member) throws SQLException
	{
		Connection dbconn =  datasource.getConnection();
		
		int result = 0;
		
		String sql="INSERT INTO TBL_MEMBERLIST(MID, NAME, TELEPHONE) VALUES(MEMBERLISTSEQ.NEXTVAL, ? , ?)";

		PreparedStatement pstmt = dbconn.prepareStatement(sql);
		
		pstmt.setString(1, member.getName());
		pstmt.setString(2, member.getTelephone());
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		dbconn.close();
		
		return result;
	}

	@Override
	public int count() throws SQLException
	{
		int result =0;
		Connection dbconn =  datasource.getConnection();
		//sql 작성
		String sql="SELECT COUNT(*) AS COUNT FROM TBL_MEMBERLIST";
		
		//작업객체 생성
		Statement stmt = dbconn.createStatement();
		
		ResultSet rs =  stmt.executeQuery(sql);
		
		if(rs.next())
		{
			result = rs.getInt("COUNT");
		}
		
		rs.close();
		stmt.close();
		dbconn.close();
		return result;
	}
	
	

}

4. DB 데이터 list 컨트롤러 생성

/*
 MemberListController.java
 - 사용자 정의 컨트롤러 클래스
 - 회원들의 목록(리스트) 출력 액션.
 - DAO 객체에 대한 의존성 주입을 위한 준비.
  →setter injection
   ① 인터페이스 형태의 자료형
   ② setter구성
*/

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;

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); //"count"라는 이름으로 count를 넘겨줄게
	      mav.addObject("memberList", memberList); //"memberList"라는 이름으로 memberList를 넘겨줄게
	      
	      
	      return mav;
	}


}

5. 데이터를 받아와 출력할 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>MemberList.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
	
	$(function()
	{
		$("#submitBtn").click(function()
		{
			//alert("버튼");
			
			
			$("#error").css("display","none");
			
			if($("#name").val()=="" || $("#telephone").val()=="")
			{
				$("#error").css("display","inline");
				return;
			}
			
			$("#memberForm").submit();
		});
	});


</script>



</head>
<body>

<div>
	<h1>회원 관리(MemberList.jsp)</h1>
	<hr>
</div>

<div>
	<form id="memberForm" action="memberinsert.action" method="post">
		이름 : <input type="text" name="name" id="name" class="control txt"><br>
		전화 : <input type="text" name="telephone" id="telephone" class="control txt">
		<br>
		<button type="button" id="submitBtn" class="btn">회원 추가</button><br>
		<span id="error">모든 항목을 입력해야 합니다.</span>
	</form>
	
	<br><br>
	
	<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() - getTelephone() 메소드 호출할 수 있는 EL 표현 활용 부분  --%>
		<td>${member.mid }</td>
		<td>${member.name }</td>
		<td>${member.telephone }</td>
	
	</tr>
	
	</c:forEach>
	
	
	</table>
	
	
</div>

</body>
</html>

6.Dispatcher-servlet 구성

<?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" />

	<!-- ※ 『dispatcher-servlet.xml』 의 기본 샘플코드 -->
	<!--  이코드는 기본설정에 대한 템블릿을 복사하기 위해 스프링 doc를 참조하여 작성한다. -->
	<!--  ① 『C:\Downloads\s-f-3.0.2-with-docs\spring-framework-3.0.2.RELEASE\docs\spring-framework-reference\htmlsingle』경로로 이동-->
	<!--  ②『spring-framework-reference.html』파일 실행-->
	<!--  ③pdf의 경우 본문페이지 425페이지 찾아서 이동 450/ 805 페이지로 이동-->
	<!--  ④ 페이지 하단의 XML 파일 샘플코드 복사 & 붙여넣기 -->
	
	
	
	<!-- ※ 사용자 정의 Controller 객체 등록 및 요청 URL 매핑 주소 등록 -->
	<!-- URL 매핑하려면 bean의 name 속성 -->
	
	
	<!-- 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:@----------: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.action" class="com.test.mvc.MemberListController">
	<property name="dao">
		<ref bean="memberDAO"/>
	</property>
	
	</bean>
	
	
</beans>

현재 의존 관계 Controller > DAO > Connection

SimpleDriverDataSource : DAO 에서 필요한 Connection 객체

7. DB에 Insert할 Controller 등록

/*=================================
	MemberInsertController.java
	- 사용자 정의 컨트롤러 클래스
	- 회원 데이터 추가 액션 처리 클래스
	- DAO 객체에 대한 의존성 주입을 위한 준비.
	 → setter injection
	  ① 인터페이스 형태의 자료형 구성
	  ② setter 구성
==================================*/

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』 인터페이스를 구현함으로써
// 사용자 정의 컨트롤러 클래스를 구성한다.

// implements Controller 또는 extends AbstractController
// -- 서블릿에서 HttpServlet 을 상속받은 서블릿 객체 역할
public class MemberInsertController implements Controller
{
	//Spring 이 제공하는 
	//Controller 인페이스의 handleRequest()메소드 재정의
	
	private IMemberDAO dao;
	
	
	

	public void setDao(IMemberDAO dao)
	{
		this.dao = dao;
	}




	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		
		//하는 일은 doGet , doPost 와 같다.
		
		//컨트롤러 내부 액션 처리 코드
		int result = 0;
		
		request.setCharacterEncoding("UTF-8");
		
		String name = request.getParameter("name");
		String telephone = request.getParameter("telephone");
		
		try
		{
			MemberDTO member = new MemberDTO();
			
			member.setName(name);
			member.setTelephone(telephone);
			
			result = dao.add(member);
			
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
		ModelAndView mav = new ModelAndView();
		
		
		//mav.setViewName("/WEB-INF/view/MemberList.jsp");
			//→MemberListController 가 일을 할 수 있도록 처리
		//     → 이 컨트롤러에 의해 MemberList.jsp가 클라이언트를 만남
		mav.setViewName("redirect:memberlist.action");
		//Spring에게 이것이 리다이렉트를 하는것이니 클라이언트에게 memberlist.action으로 안내해줘라는 의미
		
		return mav;
	}

	
	
}

memberlist.action으로 요청하는 이유 : MemberList.jsp는 받은 데이터를 출력하는 기능일뿐 데이터를 넘겨주지 않는다. 그러므로 memberlist.action을 요청하여 다시 DB에 접근해 데이터를 읽어오고 읽어온 데이터를 .addObject로 담아 MemberList.jsp를 요청하도록 해야한다.

0개의 댓글