.XML -> Spring 의 환경설정

Spring-Framework-3.0.2.RELEASE.zip
Spring-Framework-3.0.2.RELEASE-dependencies.zip
C드라이브에 넣어서 압축해제

 

파일 spring-docs을 생성후 Spring-Framework-3.0.2.RELEASE.zip 압축해제 파일을 넣어둔다.
Spring-Framework-3.0.2.RELEASE-dependencies.zip 을 C드라이브 넣어 압축해제

- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar

Spring은 의존관계이기 떄문에 다양한 자료형에 도움이 필요하다

경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar

추가한다

 

main 자바를 생성후,

import 하기!
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 추가

 

 

'Spring' 카테고리의 다른 글

Spring 모듈 다운로드~  (0) 2015.07.01
04일차_Spring MVC, 데이터송수신, 회원관리.txt  (1) 2015.07.01
03일차_DI테스트  (0) 2015.06.30
02일차_DI테스트  (1) 2015.06.30
01일차_DI 설명  (0) 2015.06.30
블로그 이미지

알 수 없는 사용자

,
http://docs.spring.io/downloads/nightly/release-download.php?project=SPR

 

다운로드 가능

 

-SPR/spring-framework-3.0.2.RELEASE-with-docs.zip
-SPR/spring-framework-3.0.2.RELEASE-dependencies.zip

다운 받아서 압축해제~
 

 

 

 

'Spring' 카테고리의 다른 글

Spring 기본 설정방법!  (0) 2015.07.01
04일차_Spring MVC, 데이터송수신, 회원관리.txt  (1) 2015.07.01
03일차_DI테스트  (0) 2015.06.30
02일차_DI테스트  (1) 2015.06.30
01일차_DI 설명  (0) 2015.06.30
블로그 이미지

알 수 없는 사용자

,
----------------------------------------------------------
Spring MVC 

1.  웹 개발을 위한 MVC 패턴이 적용된 Spring 프레임워크. Spring 에서는 DispatcherServlet 클래스가 컨트롤러 역할을 합니다.

2. SpringMVC 의 주요 구성 요소
- DispatcherServlet
- HandlerMapping
- Controller : 사용자 작성. 액션 처리.
- ModelAndView
- ViewResolver
- View : 사용자 작성. 결과 출력.
- web.xml : DispatcherServlet 서블릿 객체 등록. 사용자 작성.
- dispatcher-servlet.xml : Controller 객체 등록. 사용자 작성.

3. SpringMVC의 실행 흐름
- 사용자 요청 -> DispatcherServlet 
- DispatcherServlet -> HandlerMapping에 주소 분석 요청
- DispatcherServlet -> 특정 Controller 객체 호출 및 결과 수신. 결과는 ModelAndView 객체. ModelAndView 객체는 View 객체 정보와 결과값이 들어있는 객체임.
- DispatcherServlet -> ViewResolver에 View 객체 분석 요청
- DispatcherServlet -> 특정 View 객체에 Model 객체를 넘겨주고 결과 출력.

4. SpringMVC에서 사용자 역할
- Controller : 액션 처리를 담당하는 Controller 클래스 작성. Controller 인터페이스를 상속받아서 구현.
- web.xml :  서블릿 주소와 DispatcherServlet 클래스 등록
- View : 결과 출력용 JSP 페이지 작성
- dispatcher-servlet.xml : 사용자가 작성한 Controller 객체 등록. URL 매핑 주소 등록.

5. SpringMVC 프로젝트 생성
- 다이나믹 웹 프로젝트 생성
- 톰캣 서버 등록
- SpringMVC 환경 설정을 위한 라이브러리 등록 (WebContent>WEB-INF>lib)
경로1: spring-docs\spring-framework-3.0.2.RELEASE\dist
org.springframework.aop-3.0.2.RELEASE.jar
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.web-3.0.2.RELEASE.jar
org.springframework.web.servlet-3.0.2.RELEASE.jar
org.springframework.jdbc-3.0.2.RELEASE.jar
org.springframework.transaction-3.0.2.RELEASE.jar

경로2: spring-de-framework-3.0.2.RELEASEpendencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
com.springsource.org.apache.commons.logging-1.1.1.jar

ojdbc6.jar, javax.servlet.jsp.jstl-1.2.1.jar, javax.servlet.jsp.jstl-api-1.2.1.jar 파일도 추가해야 합니다.

6. 처리 과정

1) 외부 요청

2) DispatcherServlet 요청 접수
- web.xml에서 DispatcherServlet 등록
    
//web.xml  (WebContent>WEB-INF 폴더 하위에 생성)
<?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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SampleProject</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 DispatcherServlet 등록 -->
  <!--  
  <servlet>
  	<servlet-name>서블릿식별자</servlet-name>
  	<servlet-class>패키지이름.컨트롤러클래스</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>서블릿식별자</servlet-name>
  	<url-pattern>*.확장자</url-pattern>
  </servlet-mapping>
  -->  

  <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>*.it</url-pattern>
  </servlet-mapping>

</web-app>


- dispatcher-servlet.xml에서 URL 패턴 등록
- 사용자 요청 분석

3) 컨트롤러의 특정 메소드 호출 (액션 처리, 모델과 뷰 객체 리턴)
- 사용자 요청에 맞는 액션 처리
- 결과 데이터가 들어있는 모델 객체 준비
- 뷰 정보(JSP 페이지 정보-객체가 아니라 View 페이지 이름) 리턴

4) 뷰 페이지에서 최종 웹페이지를 작성.
- JSP 페이지 내에서 EL, JSTL 표기 사용.

5) 응답 완료.


----------------------------------------
JSP 템플릿 등록

<%@ page language="java" contentType="text/html; charset=${encoding}"
    pageEncoding="${encoding}"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="${encoding}">
<title>Insert title here</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

</head>
<body>
<div>

</div>
</body>
</html>



-----------------------------------------------
Hello, World! 메시지 출력

//web.xml  (WebContent>WEB-INF 폴더 하위에 생성)
<?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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SampleProject</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 DispatcherServlet 등록 -->
  <!--  
  <servlet>
  	<servlet-name>서블릿식별자</servlet-name>
  	<servlet-class>패키지이름.컨트롤러클래스</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>서블릿식별자</servlet-name>
  	<url-pattern>*.확장자</url-pattern>
  </servlet-mapping>
  -->  

  <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>*.it</url-pattern>
  </servlet-mapping>

</web-app>






//HelloController.java (com.test 패키지 하위에 생성)
package com.test;

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

	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		//액션 코드
		String result = "Hello, SpringMVC World!";
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("result", result);
		mav.setViewName("/WEB-INF/source/Hello.jsp");

		return mav;
	}

}





//Hello.jsp (WebContent>WEB-INF/source 폴더 하위에 생성)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

</head>
<body>
<div>
${result}
</div>
</body>
</html>
</body>
</html>





//dispatcher-servlet.xml (WebContent>WEB-INF 폴더 하위에 생성)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <bean name="/Hello.it" class="com.test.HelloController"></bean>

</beans>




//요청주소
http://localhost:8090/프로젝트이름/Hello.it



--------------------------------------
데이터 송수신 테스트
- Spring MVC 버전


1. 프로그램 구성
//SendController.java -> 컨트롤러 객체.
//Send.jsp -> 뷰 객체

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

//dispatcher-servlet.xml -> 컨트롤러 객체 등록. URL 매핑 주소 등록.
Send.it -> SendController.java -> Send.jsp
Receive.it -> ReceiveController.java -> Receive.jsp


//요청주소
http://localhost:8090/프로젝트이름/Send.it



2. 프로그램 소스 코드
//SendController.java -> 컨트롤러 객체.
package com.test;

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

	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		ModelAndView mav = new ModelAndView();
		mav.setViewName("/WEB-INF/src/Send.jsp");
		return mav;
	}

}





//Send.jsp -> 뷰 객체
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

</head>
<body>
<div>
	<form action="Receive.it" method="post">
		이름 <input type="text" name="yourName">
		<input type="submit">
	</form>
</div>
</body>
</html>




//ReceiveController.java -> 컨트롤러 객체.
package com.test;

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

	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		//데이터 수신 (yourName, 한글 인코딩)
		request.setCharacterEncoding("UTF-8");
		String yourName = request.getParameter("yourName");
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("yourName", yourName);
		mav.setViewName("/WEB-INF/src/Receive.jsp");
		return mav;
	}

}







//Receive.jsp -> 뷰 객체
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

</head>
<body>
<div>
안녕하세요, ${yourName}님.
</div>
</body>
</html>






//dispatcher-servlet.xml -> 컨트롤러 객체 등록. URL 매핑 주소 등록.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<!--
	name="" 속성에는 사용자 요청 주소 등록
	class="" 속성에는 컨트롤러 클래스 등록
 	-->	
 	<bean name="/Hello.it" class="com.test.HelloController"></bean>

 	<bean name="/Send.it" class="com.test.SendController"></bean>
 	<bean name="/Receive.it" class="com.test.ReceiveController"></bean>


</beans>





//요청주소
http://localhost:8090/프로젝트이름/Send.it





---------------------------------------------
회원관리 Spring MVC 버전
- SimpleDriverDataSource 클래스 이용
- jdbc 모듈 추가

1. 기능 구현
- 이름, 전화번호 입력 받아서 데이터베이스 저장
- 이름, 전화번호를 데이터베이스에서 읽어내서 화면에 출력

2. 데이터베이스 준비
CREATE TABLE memberList(
	mid NUMBER  --PK
	,name VARCHAR2(30)
	,telephone VARCHAR2(30)
);

CREATE SEQUENCE memberListSeq;

ALTER TABLE memberList
	ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);

INSERT INTO memberList (mid, name, telephone)
	VALUES (memberListSeq.nextval, 'kim', '010-123-1234');
COMMIT;

SELECT mid, name, telephone 
	FROM memberList 
	ORDER BY mid;

SELECT COUNT(mid) AS count  FROM memberList;


3. 화면 구성
[회원 관리]

이름 : hong             -> <input type="text">
전화 : 010-123-1234     -> <input type="text">
회원추가                -> <input type="button">

전체 인원수 : 2명              -> <p> ... </p>
----------------------------   -> <table>...</table>
번호 이름 전화
1   hong   010-123-1234
2   kim    010-222-2222
----------------------------


4. Spring MVC + JDBC 환경 jar 파일 목록
com.springsource.org.apache.commons.logging-1.1.1.jar
javax.servlet.jsp.jstl-1.2.1.jar
javax.servlet.jsp.jstl-api-1.2.1.jar
ojdbc6.jar
org.springframework.aop-3.0.2.RELEASE.jar
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.jdbc-3.0.2.RELEASE.jar
org.springframework.transaction-3.0.2.RELEASE.jar
org.springframework.web-3.0.2.RELEASE.jar
org.springframework.web.servlet-3.0.2.RELEASE.jar



5. 프로그램 구성

//Member.java -> 사용자 정의 자료형 클래스
//MemberDAO.java -> 데이터베이스 액션 클래스. Connection 객체에 대한 의존성 주입. setter 메소드 추가
//MemberList.jsp -> 회원 명단 출력. 회원 추가 폼 화면 구성.

//MemberListController.java -> 컨트롤러 클래스.  출력 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가
//MemberInsertController.java -> 컨트롤러 클래스. 회원 추가 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가
//dispatcher-servlet.xml  
->  컨트롤러 객체 등록. 사용자 요청 주소 등록. SimpleDriverDataSource 객체 등록. 의존 객체 주입 설정. DAO 객체 등록.

//요청주소
http://localhost:8090/프로젝트이름/MemberList.it


6. 프로그램 소스코드

//Member.java -> 사용자 정의 자료형 클래스
package com.test;

public class Member {
	
	private String mid, name, telephone ;

	public String getMid() {
		return mid;
	}

	public void setMid(String 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;
	}

}





//MemberDAO.java -> 데이터베이스 액션 클래스. Connection 객체에 대한 의존성 주입. setter 메소드 추가
package com.test;

import java.sql.*;
import java.util.*;

import javax.sql.DataSource;

public class MemberDAO {
	
	//의존객체 주입(DI) 준비
	private DataSource dataSource;
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	
	public ArrayList<Member> list()  {
		ArrayList<Member> result = new ArrayList<Member>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			//Connection 객체 얻는 방법
			conn = dataSource.getConnection();
			
			String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
			pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) {
				Member member = new Member();
				member.setMid(rs.getString("mid"));
				member.setName(rs.getString("name"));
				member.setTelephone(rs.getString("telephone"));
				result.add(member);				
			}
			rs.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
		    try{
		    	if (pstmt != null) {
		    		pstmt.close();
		    	}
				conn.close();
		    }catch(SQLException se){
		       se.printStackTrace();
		    }
		}			
		
		return result;
	}
	
	//전체 회원수 출력 액션 처리
	public int count() {
		int result = 0;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			//Connection 객체 얻는 방법
			conn = dataSource.getConnection();
			
			String sql = "SELECT COUNT(mid) AS count FROM memberList";
			
			pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) {
				result = rs.getInt("count");
			}
			rs.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
		    try{
		    	if (pstmt != null) {
		    		pstmt.close();
		    	}
				conn.close();
		    }catch(SQLException se){
		       se.printStackTrace();
		    }
		}			
			
		return result;
	}	
	
	
	//회원 추가 액션 처리
	public int add(Member member) {
		int result = 0;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			//Connection 객체 얻는 방법
			conn = dataSource.getConnection();

			String sql = "INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, ?, ?)";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, member.getName());
			pstmt.setString(2, member.getTelephone());
			pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
		    try{
		    	if (pstmt != null) {
		    		pstmt.close();
		    	}
				conn.close();
		    }catch(SQLException se){
		       se.printStackTrace();
		    }
		}			
			
		
		return result;
	}	
	
	
}




문제) 아래 나머지 소스 코드 작성할 것.

//MemberListController.java -> 컨트롤러 클래스.  출력 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가
package com.test;

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 {

	//의존객체 주입(DI) 준비
	private MemberDAO dao;
	public void setMemberDAO(MemberDAO dao) {
		this.dao = dao;
	}
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		//액션 코드 추가
		//데이터베이스 액션 -> count(), list() 메소드 호출
		int count = dao.count();
		ArrayList<Member> list = dao.list();	
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("count", count);
		mav.addObject("list", list);
		mav.setViewName("/WEB-INF/src/MemberList.jsp");
		return mav;
	}

}




//MemberList.jsp -> 회원 명단 출력. 회원 추가 폼 화면 구성.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원관리</title>

<link rel="stylesheet" type="text/css" href="MyTable.css">

<style type="text/css">
	#error { display: none; color: red; }
</style>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
	$("#myForm").submit(function() {
		$("#error").css("display", "none");
		if ($("#name").val()=="" || $("#telephone").val()=="") {
			$("#error").css("display", "inline");
			return false;
		}
		return true;
	});
	$("#name").keyup(function(){
		$("#nameLength").html($(this).val().length);
	});
	$("#telephone").keyup(function(){
		$("#telephoneLength").html($(this).val().length);
	});
});
</script>

</head>
<body>
<div>
<h1>[회원 관리]</h1>

<%-- action="" 속성에서 서블릿 주소 지정 (*.it) --%>
<form action="MemberInsert.it" method="post" id="myForm">
	<table>
		<tr>
			<th>이름*</th>
			<td>
			<input type="text" id="name" name="name" 
					required="required"> ( <span id="nameLength">0</span> / 30 )
			</td>
		</tr>
		<tr>
			<th>전화*</th>
			<td>
			<input type="text" id="telephone" name="telephone" 
					required="required"> ( <span id="telephoneLength">0</span> / 30 )
			</td>
		</tr>
		<tr>
			<th></th>
			<td>
			<input type="submit">
			<span id="error">모든 항목을 채워야 합니다.</span>
			</td>
		</tr>
	</table>
</form>

<h2>
	전체 인원수 : ${count} 명
</h2>
<table id="customers">
	<tr>
		<th>번호</th><th>이름</th><th>전화</th>
	</tr>
	<c:forEach var="member" items="${list}">
	<tr>
		<td>${member.mid}</td>
		<td>${member.name}</td>
		<td>${member.telephone}</td>
	</tr>	
	</c:forEach>
</table>

</div>
</body>
</html>




//MemberInsertController.java -> 컨트롤러 클래스. 회원 추가 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가
package com.test;

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

	//의존객체 주입(DI) 준비
	private MemberDAO dao;
	public void setMemberDAO(MemberDAO dao) {
		this.dao = dao;
	}
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		//액션 코드 추가
		//데이터 수신 (한글 인코딩)
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name"); 
		String telephone = request.getParameter("telephone");
		
		//데이터베이스 액션
		Member member = new Member();
		member.setName(name);
		member.setTelephone(telephone);
		dao.add(member);	
		
		ModelAndView mav = new ModelAndView();
		mav.setViewName("redirect:MemberList.it");
		return mav;
	}

}





//dispatcher-servlet.xml  
->  컨트롤러 객체 등록. 사용자 요청 주소 등록. SimpleDriverDataSource 객체 등록. 의존 객체 주입 설정. DAO 객체 등록.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <bean id="remoteDataSource" 
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    	<property name="driverClass" 
    			value="oracle.jdbc.driver.OracleDriver" />
    	<property name="url" 
    			value="jdbc:oracle:thin:@211.63.89.72:1521:xe" />
    	<property name="username" value="username" />
    	<property name="password" value="password" />
    </bean>
    
   <bean id="memberDAO" class="com.test.MemberDAO">
    	<property name="dataSource">
    		<ref bean="remoteDataSource" />
    	</property>
    </bean>  

 	<bean name="/MemberList.it" class="com.test.MemberListController">
    	<property name="memberDAO">
    		<ref bean="memberDAO" />
    	</property>
 	</bean>
 	
 	<bean name="/MemberInsert.it" class="com.test.MemberInsertController">
    	<property name="memberDAO">
    		<ref bean="memberDAO" />
    	</property>
 	</bean>

</beans>






//요청주소
http://localhost:8090/프로젝트이름/MemberList.it


--------------------------------------











 

'Spring' 카테고리의 다른 글

Spring 기본 설정방법!  (0) 2015.07.01
Spring 모듈 다운로드~  (0) 2015.07.01
03일차_DI테스트  (0) 2015.06.30
02일차_DI테스트  (1) 2015.06.30
01일차_DI 설명  (0) 2015.06.30
블로그 이미지

알 수 없는 사용자

,

03일차_DI테스트

Spring 2015. 6. 30. 14:41

--------------------------------
DI 테스트4
- SimpleDriverDataSource 클래스 이용
- 콘솔 프로젝트
- 오라클에 대해서 로컬 서버와 원격 서버를 동시 사용할 수 있도록 설정.
- jdbc 모듈 추가


1. 기능 구현
- 이름, 전화번호를 입력 받아서 데이터베이스에 저장
- 번호, 이름, 전화번호를 콘솔에 출력

2. 화면 구성
이름 전화번호(x exit)?kim 010-123-1234
1명의 회원이 추가되었습니다.
이름 전화번호(x exit)?x

------------------
전체 회원수 : 1명
------------------
번호 이름 전화번호
1 kim 010-123-1234
------------------


3. 데이터베이스 준비 (local, remote 오라클 서버에 동시에 설정)
CREATE TABLE memberList (
 mid NUMBER  --PK
 ,name VARCHAR2(30)
 ,telephone VARCHAR2(30)
);

CREATE SEQUENCE memberListSeq;

ALTER TABLE 테이블이름
 ADD CONSTRAINT 제약이름 제약종류(제약대상);
ALTER TABLE 테이블이름
 DROP CONSTRAINT 제약이름;

ALTER TABLE memberList
 ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);

INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, 'kim', '010-123-1234');
ROLLBACK;

SELECT mid, name, telephone FROM memberList;

SELECT COUNT(mid) AS count FROM memberList;


4.프로젝트 환경 설정
- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.jdbc-3.0.2.RELEASE.jar
org.springframework.transaction-3.0.2.RELEASE.jar


경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar

ojdbc6.jar 추가할 것.


4. 프로그램 구성
//Member.java -> 자료형 클래스
//MemberDAO.java -> Conn 객체에 대해서 의존 관계 설정.
//Main.java -> main() 메소드
//applicationContext.xml -> 스프링 환경 설정 파일. DataSource 객체 등록.

5. 프로그램 소스 코드
//Member.java -> 자료형 클래스
package com.test;

public class Member {
 
 private String mid, name, telephone ;

 public String getMid() {
  return mid;
 }

 public void setMid(String 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;
 }

}

 

 

//MemberDAO.java -> Conn 객체에 대해서 의존 관계 설정.
package com.test;

import java.sql.*;
import java.util.*;

import javax.sql.DataSource;

public class MemberDAO {
 
 //의존객체 주입(DI) 준비
 private DataSource dataSource;
 public void setDataSource(DataSource dataSource) {
  this.dataSource = dataSource;
 }
 
 public ArrayList<Member> list()  {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection();
   
   String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while(rs.next()) {
    Member member = new Member();
    member.setMid(rs.getString("mid"));
    member.setName(rs.getString("name"));
    member.setTelephone(rs.getString("telephone"));
    result.add(member);    
   }
   rs.close();
   
  } catch (SQLException e) {
   e.printStackTrace();
  }finally {
      try{
       if (pstmt != null) {
        pstmt.close();
       }
    conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }
  }   
  
  return result;
 }
 
 //전체 회원수 출력 액션 처리
 public int count() {
  int result = 0;
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection();
   
   String sql = "SELECT COUNT(mid) AS count FROM memberList";
   
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while(rs.next()) {
    result = rs.getInt("count");
   }
   rs.close();
   
  } catch (SQLException e) {
   e.printStackTrace();
  }finally {
      try{
       if (pstmt != null) {
        pstmt.close();
       }
    conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }
  }   
   
  return result;
 } 
 
 
 //회원 추가 액션 처리
 public int add(Member member) {
  int result = 0;
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection();

   String sql = "INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, ?, ?)";
   
   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, member.getName());
   pstmt.setString(2, member.getTelephone());
   pstmt.executeUpdate();
   
  } catch (SQLException e) {
   e.printStackTrace();
  }finally {
      try{
       if (pstmt != null) {
        pstmt.close();
       }
    conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }
  }   
   
  
  return result;
 } 
 
 
}

 

 


//Main.java -> main() 메소드
package com.test;

import java.util.Scanner;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {

  ApplicationContext context
   = new ClassPathXmlApplicationContext("applicationContext.xml");
  MemberDAO dao
   = context.getBean("memberDAO", MemberDAO.class);
  
  Scanner sc = new Scanner(System.in);
  
  do {
   
   System.out.print("이름 전화번호(x exit)?");
   String name = sc.next();
   if (name.equalsIgnoreCase("x")) {
    break;
   }
   String telephone = sc.next();
   
   try {
    Member member = new Member();
    member.setName(name);
    member.setTelephone(telephone);
    dao.add(member);
    System.out.println("회원이 추가 되었습니다.");
   }catch(Exception e){
    System.out.println(e.toString());
   }
  
  }while(true); 
  
  sc.close();

  
  System.out.println("-----------------------");
  System.out.printf("전체 인원수 : %d 명 %n"
    , dao.count());
  System.out.println("-----------------------");  
  for( Member member : dao.list()){
   System.out.printf("%s %s %s %n"
     , member.getMid()
     , member.getName()
     , member.getTelephone());
  }  
  
 }

}

 

 

//applicationContext.xml -> 스프링 환경 설정 파일. DataSource 객체 등록.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   
    <bean id="localDataSource"
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
     <property name="driverClass"
       value="oracle.jdbc.driver.OracleDriver" />
     <property name="url"
       value="jdbc:oracle:thin:@localhost:1521:xe" />
     <property name="username" value="username" />
     <property name="password" value="password" />
    </bean>

    <bean id="remoteDataSource"
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
     <property name="driverClass"
       value="oracle.jdbc.driver.OracleDriver" />
     <property name="url"
       value="jdbc:oracle:thin:@211.63.89.85:1521:xe" />
     <property name="username" value="username" />
     <property name="password" value="password" />
    </bean>
   
    <bean id="memberDAO" class="com.test.MemberDAO">
     <property name="dataSource">
      <ref bean="remoteDataSource" />
     </property>
    </bean>
   
   
</beans>   

 

 

----------------------------------------------
성적관리 Spring DI 버전
- 콘솔  프로젝트
- SimpleDriverDataSource 클래스 이용


1. 기능 구현
- 학생 테이블에는 학생의 개인 정보(번호, 학생 이름, 전화번호)가 저장된다.
- 성적 테이블에는 학생의 성적 정보(번호, 과목1, 과목2, 과목3)가 저장된다.
- 번호 항목은 학생 테이블의 PK, 성적 테이블의 PK&FK로 지정한다.
- 학생 출력시 번호, 학생 이름, 전화번호, 성적 입력 여부가 출력된다.
- 학생 입력은 학생 이름, 전화번호를 입력한다.
- 성적 출력시 번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정 점수가 출력한다.
- 판정 기준은 합격, 과락, 불합격으로 구분한다.
- 성적 입력이 안된 학생인 경우는 번호, 학생 이름만 출력하고 점수는 null 문자 또는 X 문자로 출력한다.
- 성적 입력은 학생 개개인별로 과목1, 과목2, 과목3 점수를 입력한다.

2. 화면 구성

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?1

--- 학생 입력 ---
이름 전화번호(x 종료)?kim 010-111-1111
1명의 학생을 입력했습니다.
이름 전화번호(x 종료)?x

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?2

-- 성적 입력 ---
학생 번호 검색(x 종료)?1
1, kim, 010-111-1111, O
이미 성적이 입력된 상태입니다.
학생 번호 검색(x 종료)?2
2, park, 010-222-2222, X
과목1의 점수?100
과목2의 점수?100
과목3의 점수?100
1명의 성적을 입력했습니다.
학생 번호 검색(x 종료)?3
검색 결과 없습니다.
학생 번호 검색(x 종료)?x

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?3

--- 학생 출력 ---
전체 학생 수 : 2명
-----------------------------------------
번호, 학생 이름, 전화번호, 성적 입력 여부
-----------------------------------------
1, kim, 010-111-1111, O
2, park, 010-222-2222, X


--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?4

--- 성적 출력 ---
전체 학생 수 : 2명
-----------------------------------------
번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정
-----------------------------------------
1, kim, 100, 100, 100, 300, 100.0, 합격
2, park, 50, 50, 50, 150, 50.0, 불합격

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?x


3. 데이터베이스 준비

-- 학생 테이블 생성
CREATE TABLE student (
 sid NUMBER --PK
 ,name VARCHAR2(30)
 ,tel VARCHAR2(30)
);

--PK 제약 추가
ALTER TABLE student
 ADD CONSTRAINT student_sid_pk PRIMARY KEY(sid);

--일련번호 생성을 위한 시퀀스 객체 생성
CREATE SEQUENCE studentSeq;

--INSERT 쿼리 샘플
INSERT INTO student (sid, name, tel)
 VALUES (studentSeq.nextval, 'kim', '010-111-1111');
INSERT INTO student (sid, name, tel)
 VALUES (studentSeq.nextval, 'park', '010-222-2222');

SELECT * FROM student;

ROLLBACK;


--성적 테이블 생성
CREATE TABLE grade (
 sid NUMBER --PK & FK
 ,sub1 NUMBER(3) --CHECK 제약 추가
 ,sub2 NUMBER(3) --CHECK 제약 추가
 ,sub3 NUMBER(3) --CHECK 제약 추가
);

--제약 추가
ALTER TABLE grade
 ADD CONSTRAINT grade_sid_pk PRIMARY KEY(sid);
ALTER TABLE grade
 ADD CONSTRAINT grade_sid_fk FOREIGN KEY(sid)
   REFERENCES student(sid);
ALTER TABLE grade
 ADD CONSTRAINT grade_sub1_ck
  CHECK (sub1 BETWEEN 0 AND 100);
ALTER TABLE grade
 ADD CONSTRAINT grade_sub2_ck
  CHECK (sub2 BETWEEN 0 AND 100);
ALTER TABLE grade
 ADD CONSTRAINT grade_sub3_ck
  CHECK (sub3 BETWEEN 0 AND 100);

--INSERT 쿼리 샘플
INSERT INTO grade (sid, sub1, sub2, sub3)
 VALUES (1, 100, 100, 100); --O
INSERT INTO grade (sid, sub1, sub2, sub3)
 VALUES (1, 100, 100, 100); --X
INSERT INTO grade (sid, sub1, sub2, sub3)
 VALUES (2, 200, 200, 200); --X
INSERT INTO grade (sid, sub1, sub2, sub3)
 VALUES (3, 0, 0, 0); --X


--학생 테이블의 자료 2명으로 만들 것.
SELECT * FROM student;

--성적 테이블의 자료 1명으로 만들 것.
SELECT * FROM grade;


--학생 출력 쿼리
--번호, 학생 이름, 전화번호, 성적 입력 여부(0 또는 1)
--학생 테이블 + 성적 테이블 -> JOIN, SUB QUERY
--OUTER JOIN의 경우
SELECT s.sid AS sid, s.name AS name, s.tel AS tel
 , DECODE(g.sid, null, 0, 1) AS sub
 FROM student s, grade g
 WHERE s.sid=g.sid(+);

--SUB QUERY의 경우
SELECT sid, name, tel
 , DECODE((SELECT sid FROM grade WHERE sid=s.sid)
  , null, 0, 1) AS sub
 FROM student s;

-->뷰(View)로 등록하는 것을 권장
CREATE OR REPLACE VIEW studentView
AS
SELECT sid, name, tel
 , DECODE((SELECT sid FROM grade WHERE sid=s.sid)
  , null, 0, 1) AS sub
 FROM student s;
-->뷰를 이용한 학생 출력 쿼리
SELECT sid, name, tel, sub
 FROM studentView
 ORDER BY sid;

 

--학생 수 출력 쿼리
SELECT COUNT(*) AS count FROM student;


--학생 검색 쿼리
SELECT sid, name, tel, sub
 FROM studentView
 WHERE sid=1;

 

--성적 출력 쿼리
--번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정(0 합격, 1 과락, 2 불합격)
--학생 테이블->번호, 학생이름
--성적 테이블->과목1, 과목2, 과목3
--총점, 평균, 판정 -> 계산 결과
--학생 테이블 + 성적 테이블 -> JOIN, SUB QUERY
--OUTER JOIN의 경우
SELECT s.sid AS sid, s.name AS name
 , g.sub1 AS sub1, g.sub2 AS sub2, g.sub3 AS sub3
 , NVL( (g.sub1 + g.sub2 + g.sub3), 0 ) AS tot
 , NVL( ( (g.sub1 + g.sub2 + g.sub3)/3 ), 0 ) AS ave
 , (CASE
 WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60 AND
  (g.sub1>=40 AND g.sub2>=40 AND g.sub3>=40))    THEN 0
 WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60)
  THEN 1
 ELSE 2
 END) AS ch
 FROM student s, grade g
 WHERE s.sid = g.sid(+);
--> 뷰(View) 등록
CREATE OR REPLACE VIEW gradeView
AS
SELECT s.sid AS sid, s.name AS name
 , g.sub1 AS sub1, g.sub2 AS sub2, g.sub3 AS sub3
 , NVL( (g.sub1 + g.sub2 + g.sub3), 0 ) AS tot
 , NVL( ( (g.sub1 + g.sub2 + g.sub3)/3 ), 0 ) AS ave
 , (CASE
 WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60 AND
  (g.sub1>=40 AND g.sub2>=40 AND g.sub3>=40))    THEN 0
 WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60)
  THEN 1
 ELSE 2
 END) AS ch
 FROM student s, grade g
 WHERE s.sid = g.sid(+);
--> 뷰를 이용한 성적 출력
SELECT sid, name, sub1, sub2, sub3, tot, ave, ch
 FROM gradeView
 ORDER BY sid;

--(과제)SUB QUERY의 경우
SELECT sid, name, sub1, sub2, sub3 , tot, ave
  ,CASE
    WHEN (( ave )>=60 AND
      (sub1>=40 AND sub2>=40 AND sub3>=40)) THEN 0
    WHEN (( ave )>=60) THEN 1
    ELSE 2
    END AS ch
FROM (SELECT sid, name
   ,(SELECT sub1 FROM grade WHERE sid=s.sid) AS sub1
   ,(SELECT sub2 FROM grade WHERE sid=s.sid) AS sub2
   ,(SELECT sub3 FROM grade WHERE sid=s.sid) AS sub3
 ,NVL((SELECT (sub1+sub2+sub3)
  FROM grade WHERE sid=s.sid), 0) AS tot
   ,NVL((SELECT (sub1+sub2+sub3)/3
  FROM grade WHERE sid=s.sid), 0) AS ave
 FROM student s);


4.프로젝트 환경 설정
- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.jdbc-3.0.2.RELEASE.jar
org.springframework.transaction-3.0.2.RELEASE.jar


경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar

ojdbc6.jar 추가할 것.


5. 프로그램 구성
//Student.java -> 자료형 클래스. 학생 정보 저장용.
//Grade.java -> 자료형 클래스. 성적 정보 저장용.
//StudentDAO.java -> 데이터베이스 액션 처리 클래스
//GradeDAO.java -> 데이터베이스 액션 처리 클래스

//MenuAction.java -> 서브 메뉴 액션 클래스
//Main.java -> main() 메소드. 메인 메뉴 클래스

//applicationContext.xml -> src 폴더 하위에 생성.

6. 프로그램 소스 코드
//Student.java -> 자료형 클래스. 학생 정보 저장용.
package com.test;

//사용자 정의 자료형 클래스
public class Student {
 
 //멤버변수, getter, setter
 //데이터베이스의 테이블 내에 존재하는 모든 컬럼명 기준
 //동일 자료, 동일 변수(식별자)에 저장
 //->sid(NUMBER), name(VARCHAR2), tel(VARCHAR2), sub(NUMBER)
 private int sid;
 private String name, tel;
 private int sub;
 
 public int getSid() {
  return sid;
 }
 public void setSid(int sid) {
  this.sid = sid;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 public int getSub() {
  return sub;
 }
 public void setSub(int sub) {
  this.sub = sub;
 }
}

 

 

 

//Grade.java -> 자료형 클래스. 성적 정보 저장용.
package com.test;

//사용자 정의 자료형 클래스
public class Grade {
 
 //멤버변수, getter, setter
 //데이터베이스의 테이블 내에 존재하는 모든 컬럼명 기준
 //동일 자료, 동일 변수(식별자)에 저장
 //->sid(NUMBER)
 //, name(VARCHAR2)
 //, sub1(NUMBER+NULL), sub2(NUMBER+NULL), sub3(NUMBER+NULL)
 //, tot(NUMBER+NULL), ave(NUMBER+NULL)
 //, ch(NUMBER)
 private int sid;
 private String name, sub1, sub2, sub3, tot, ave;
 private int ch;
 
 public int getSid() {
  return sid;
 }
 public void setSid(int sid) {
  this.sid = sid;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSub1() {
  return sub1;
 }
 public void setSub1(String sub1) {
  this.sub1 = sub1;
 }
 public String getSub2() {
  return sub2;
 }
 public void setSub2(String sub2) {
  this.sub2 = sub2;
 }
 public String getSub3() {
  return sub3;
 }
 public void setSub3(String sub3) {
  this.sub3 = sub3;
 }
 public String getTot() {
  return tot;
 }
 public void setTot(String tot) {
  this.tot = tot;
 }
 public String getAve() {
  return ave;
 }
 public void setAve(String ave) {
  this.ave = ave;
 }
 public int getCh() {
  return ch;
 }
 public void setCh(int ch) {
  this.ch = ch;
 }

}

 

 

 

//StudentDAO.java -> 데이터베이스 액션 처리 클래스
package com.test;

import java.sql.*;
import java.util.*;

import javax.sql.DataSource;

//데이터베이스 액션 처리 클래스(학생 정보)
public class StudentDAO {
 
 //의존객체 주입(DI) 준비
 private DataSource dataSource;
 public void setDataSource(DataSource dataSource) {
  this.dataSource = dataSource;
 }
 
 //학생 전체 명단 출력 메소드
 public ArrayList<Student> list() {
  ArrayList<Student> result = new ArrayList<Student>();
  
  //1. 데이터베이스 연결 과정
  //2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
  //3. 데이터베이스 연결 종료 과정
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection();

   String sql = "SELECT sid, name, tel, sub FROM studentView ORDER BY sid";
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   
   //문제)
   //next() 메소드는 row 단위 접근 (반복 처리)
   //getInt() 메소드는 column 단위 접근
   //데이터베이스 자료 -> Student 객체에 저장
   //Student 객체 -> 컬렉션에 저장
   while(rs.next()) {
    Student student = new Student();
    student.setSid(rs.getInt("sid"));
    student.setName(rs.getString("name"));
    student.setTel(rs.getString("tel"));
    student.setSub(rs.getInt("sub"));
    result.add(student);
   }
  
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }   
  
  return result;
 }
 
 
 //학생 인원수 출력 메소드
 public int count() {
  int result = 0;
  
  //1. 데이터베이스 연결 과정
  //2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
  //3. 데이터베이스 연결 종료 과정
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection(); 
   
   String sql = "SELECT COUNT(*) AS count FROM student";
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   
   while(rs.next()) {
    result = rs.getInt("count");
   }
  
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }   
   
  return result;
 }
 

 //문제) 학생 입력 메소드
 public int add(Student student) {
  int result = 0;
  
  return result;
 }
 
 

}

 

 

 

//GradeDAO.java -> 데이터베이스 액션 처리 클래스
package com.test;

import java.sql.*;
import java.util.ArrayList;

import javax.sql.DataSource;

//데이터베이스 액션 처리 클래스(성적 정보)
public class GradeDAO {
 
 //의존객체 주입(DI) 준비
 private DataSource dataSource;
 public void setDataSource(DataSource dataSource) {
  this.dataSource = dataSource;
 } 
 
 //성적 전체 출력 메소드
 public ArrayList<Grade> list() {
  ArrayList<Grade> result = new ArrayList<Grade>();
  
  //1. 데이터베이스 연결 과정
  //2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
  //3. 데이터베이스 연결 종료 과정

  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection();

   String sql = "SELECT sid, name, sub1, sub2, sub3, tot, ave, ch FROM gradeView ORDER BY sid";
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   
   //문제)
   //next() 메소드는 row 단위 접근 (반복 처리)
   //getInt() 메소드는 column 단위 접근
   //데이터베이스 자료 -> Grade 객체에 저장
   //Grade 객체 -> 컬렉션에 저장
   while(rs.next()) {
    Grade grade = new Grade();
    grade.setSid(rs.getInt("sid"));
    grade.setName(rs.getString("name"));
    grade.setSub1(rs.getString("sub1"));
    grade.setSub2(rs.getString("sub2"));
    grade.setSub3(rs.getString("sub3"));
    grade.setTot(rs.getString("tot"));
    grade.setAve(rs.getString("ave"));
    grade.setCh(rs.getInt("ch"));
    result.add(grade);
   }   
   
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }   
  
  
  return result;
 }
 
 
 //학생 인원수 출력 메소드
 public int count() {
  int result = 0;
  
  //1. 데이터베이스 연결 과정
  //2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
  //3. 데이터베이스 연결 종료 과정
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection(); 
   
   String sql = "SELECT COUNT(*) AS count FROM student";
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   
   while(rs.next()) {
    result = rs.getInt("count");
   }
  
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }   
   
  return result;
 }
 
 
 
 //학생 검색 메소드 (성적 입력 전에 학생 정보 검색시 사용)
 //검색 결과 있으면 Student 객체 반환
 //검색 결과 없으면 null 반환
 public Student searchSid(int sid) {
  Student result = null;
  
  //1. 데이터베이스 연결 과정
  //2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
  //3. 데이터베이스 연결 종료 과정
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = dataSource.getConnection();  
  
   String sql = "SELECT sid, name, tel, sub FROM studentView WHERE sid=?";
   pstmt = conn.prepareStatement(sql);
   //검색 진행을 위한 sid 값을 쿼리 문자열에 바인딩한다.
   pstmt.setInt(1, sid);
   ResultSet rs = pstmt.executeQuery();
   
   //검색 결과가 없다면
   //while() { } 블럭을 실행하지 않는다.
   //결과적으로 result 변수에는 null 값이 유지된다.
   while(rs.next()) {
    //검색 결과가 있다면
    //Student 객체를 생성하고,
    //result 변수에 Student 객체를 저장한다.
    //데이터베이스 자료를 Student 객체에 저장한다.
    result = new Student();
    result.setSid(rs.getInt("sid"));
    result.setName(rs.getString("name"));
    result.setTel(rs.getString("tel"));
    result.setSub(rs.getInt("sub"));
   }
   
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }   
  
  return result;
 }
 
 
 //문제) 성적 입력 메소드
 public int add(Grade grade) {
  int result = 0;
  
  return result;
 }
 
 

}

 

 

 

//MenuAction.java -> 서브 메뉴 액션 클래스
package com.test;

import java.util.*;

public class MenuAction {
 
 //의존객체 주입(DI) 준비
 private StudentDAO sdao;
 private GradeDAO gdao;

 public void setStudentDAO(StudentDAO sdao) {
  this.sdao = sdao;
 }
 public void setGradeDAO(GradeDAO gdao) {
  this.gdao = gdao;
 }
 
 //1. 학생 입력
 public void menu1(Scanner sc) {
  System.out.println();
  System.out.println("--- 학생 입력 ---");
  do {
   System.out.println("이름 전화번호(x 종료)?");
   String name = sc.next();
   if (name.equalsIgnoreCase("x")) {
    break;
   }
   String tel = sc.next();
   
   //학생 정보 입력 액션 처리
   //-> StudentDAO 객체의 add() 메소드 호출
   Student student = new Student();
   student.setName(name);
   student.setTel(tel);
   int result = sdao.add(student);
   System.out.printf("%d명의 학생을 추가했습니다 %n", result);
   
  }while(true);
 }

 //2. 성적 입력 (학생 검색)
 public void menu2(Scanner sc) {
  
 }

 //3. 학생 출력
 public void menu3() {
  System.out.println();
  System.out.println("--- 학생 출력 ---");
  System.out.printf("전체 학생 수 : %d명%n", sdao.count());
  System.out.println("---------------------------------------");
  System.out.println("번호, 학생 이름, 전화번호, 성적 입력 여부");
  System.out.println("---------------------------------------");
  for (Student student : sdao.list()) {
   System.out.printf("%d %s %s %s %n"
     , student.getSid()
     , student.getName()
     , student.getTel()
     , (student.getSub()==0)?"X":"O");
  }  
  System.out.println("---------------------------------------");
 }

 //4. 성적 출력
 public void menu4() {
  
 }

 private static String studentGrade(int grade) {
  String result = "";
  switch (grade) {
  case 0: result = "합격"; break;
  case 1: result = "과락"; break;
  case 2: result = "불합격"; break;
  }
  return result;
 }

}

 

 

 


//Main.java -> main() 메소드. 메인 메뉴 클래스
package com.test;

import java.util.*;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  ApplicationContext context
   = new ClassPathXmlApplicationContext("applicationContext.xml");
  MenuAction menu
   = context.getBean("menuAction", MenuAction.class);
  
  do {
   System.out.println();
   System.out.println("--- 성적 관리(데이터베이스 사용) ---");
   System.out.println("1. 학생 입력");
   System.out.println("2. 성적 입력 (학생 검색)");
   System.out.println("3. 학생 출력");
   System.out.println("4. 성적 출력");
   System.out.print("선택(1~4, x 종료)?");
   String m = sc.next();
   if (m.equalsIgnoreCase("x")) {
    break;
   }
   try {
    switch (m) {
    case "1": menu.menu1(sc); break;
    case "2": menu.menu2(sc); break;
    case "3": menu.menu3(); break;
    case "4": menu.menu4(); break;
    }
   }catch(Exception e) {
    System.out.println(e.getMessage());
   }
  }while(true);

  sc.close();
 }

}

 

 

 

//applicationContext.xml -> src 폴더 하위에 생성.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="localDataSource"
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
     <property name="driverClass"
       value="oracle.jdbc.driver.OracleDriver" />
     <property name="url"
       value="jdbc:oracle:thin:@211.63.89.83:1521:xe" />
     <property name="username" value="username" />
     <property name="password" value="password" />
    </bean>
   
    <bean id="remoteDataSource"
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
     <property name="driverClass"
       value="oracle.jdbc.driver.OracleDriver" />
     <property name="url"
       value="jdbc:oracle:thin:@211.63.89.72:1521:xe" />
     <property name="username" value="username" />
     <property name="password" value="password" />
    </bean>
   
   <bean id="gradeDAO" class="com.test.GradeDAO">
     <property name="dataSource">
      <ref bean="remoteDataSource" />
     </property>
    </bean>   
   
   <bean id="studentDAO" class="com.test.StudentDAO">
     <property name="dataSource">
      <ref bean="remoteDataSource" />
     </property>
    </bean>   
   
   <bean id="menuAction" class="com.test.MenuAction">
     <property name="studentDAO">
      <ref bean="studentDAO" />
     </property>
     <property name="gradeDAO">
      <ref bean="gradeDAO" />
     </property>
    </bean>   

</beans>   


----------------------------------------------------

 

 

 

 


 

'Spring' 카테고리의 다른 글

Spring 기본 설정방법!  (0) 2015.07.01
Spring 모듈 다운로드~  (0) 2015.07.01
04일차_Spring MVC, 데이터송수신, 회원관리.txt  (1) 2015.07.01
02일차_DI테스트  (1) 2015.06.30
01일차_DI 설명  (0) 2015.06.30
블로그 이미지

알 수 없는 사용자

,

02일차_DI테스트

Spring 2015. 6. 30. 14:41

--------------------------------
DI 테스트2
- 콘솔 프로젝트
- 오라클에 대해서 로컬 서버와 원격 서버를 동시 사용할 수 있도록 설정.

1. 프로그램 구성
//Member.java -> 자료형 클래스
//DAO.java -> 인터페이스
//LocalDAO.java -> 클래스. DAO 인터페이스 구현.
//RemoteDAO.java -> 클래스. DAO 인터페이스 구현.
//MemberDAO.java -> DAO 객체의 list() 메소드 호출 클래스. DAO 인터페이스를 구현한 클래스에 대해서 의존 관계 설정.
//Main.java -> main() 메소드
//applicationContext.xml -> 스프링 환경 설정 파일. (src 폴더 하위에 생성)

2. 프로젝트 환경 설정
- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar

경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar


ojdbc6.jar 추가할 것.

3. 데이터베이스 준비
CREATE TABLE memberList(
 mid NUMBER  --PK
 ,name VARCHAR2(30)
 ,telephone VARCHAR2(30)
);

CREATE SEQUENCE memberListSeq;

ALTER TABLE memberList
 ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);

INSERT INTO memberList (mid, name, telephone)
 VALUES (memberListSeq.nextval, 'kim', '010-123-1234');
COMMIT;

SELECT mid, name, telephone
 FROM memberList
 ORDER BY mid;

SELECT COUNT(mid) AS count  FROM memberList;

4. 프로그램 소스 코드
//Member.java -> 자료형 클래스
package com.test;

public class Member {
 
 private String mid, name, telephone ;

 public String getMid() {
  return mid;
 }

 public void setMid(String 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;
 }

}

 

 


//DAO.java -> 인터페이스
package com.test;

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

public interface DAO {
 
 public ArrayList<Member> list() throws SQLException, ClassNotFoundException;
 
}

 

 


//LocalDAO.java -> 클래스. DAO 인터페이스 구현.
package com.test;

import java.sql.*;
import java.util.ArrayList;

public class LocalDAO implements DAO {

 @Override
 public ArrayList<Member> list() throws SQLException, ClassNotFoundException {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Class.forName("oracle.jdbc.driver.OracleDriver");
  String url = "jdbc:oracle:thin:사용자아이디/패스워드@localhost:1521:xe";
  Connection conn = DriverManager.getConnection(url);
  
  String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  ResultSet rs = pstmt.executeQuery(sql);
  while(rs.next()) {
   Member member = new Member();
   member.setMid(rs.getString("mid"));
   member.setName(rs.getString("name"));
   member.setTelephone(rs.getString("telephone"));
   result.add(member);
  }
  rs.close();  
  pstmt.close();
  conn.close();
  
  return result;
 }

}

 

 

 

//RemoteDAO.java -> 클래스. DAO 인터페이스 구현.
package com.test;

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

public class RemoteDAO implements DAO {

 @Override
 public ArrayList<Member> list() throws SQLException, ClassNotFoundException {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Class.forName("oracle.jdbc.driver.OracleDriver");
  String url = "jdbc:oracle:thin:사용자아이디/패스워드@아이피주소:1521:xe";
  Connection conn = DriverManager.getConnection(url);
  
  String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  ResultSet rs = pstmt.executeQuery(sql);
  while(rs.next()) {
   Member member = new Member();
   member.setMid(rs.getString("mid"));
   member.setName(rs.getString("name"));
   member.setTelephone(rs.getString("telephone"));
   result.add(member);
  }
  rs.close();  
  pstmt.close();
  conn.close();  
  
  return result;
 }

}

 

 


//MemberDAO.java -> DAO 객체의 list() 메소드 호출 클래스. DAO 인터페이스를 구현한 클래스에 대해서 의존 관계 설정.
package com.test;

public class MemberDAO {
 
 private DAO dao;
 
 public void setDao(DAO dao) {
  this.dao = dao;
 }
 
 public void list() {
  try {
   
   for (Member member : dao.list()) {
    System.out.printf("%s %s %s %n"
      , member.getMid()
      , member.getName()
      , member.getTelephone());
   }
    
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 

}

 

 


//Main.java -> main() 메소드
package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {
  
  ApplicationContext context
   = new ClassPathXmlApplicationContext("applicationContext.xml");
  MemberDAO dao
   = context.getBean("memberDAO", MemberDAO.class);
  dao.list();

 }

}

 

 


//applicationContext.xml -> 스프링 환경 설정 파일. (src 폴더 하위에 생성)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
 <bean id="localDAO" class="com.test.LocalDAO"></bean>
 <bean id="remoteDAO" class="com.test.RemoteDAO"></bean>

 <bean id="memberDAO" class="com.test.MemberDAO">
  <property name="dao">
   <ref bean="remoteDAO" />
  </property>
 </bean>
 
</beans>

 


--------------------------------
DI 테스트3
- 콘솔 프로젝트
- 오라클에 대해서 로컬 서버와 원격 서버를 동시 사용할 수 있도록 설정.

1. 프로그램 구성
//Member.java -> 자료형 클래스
//Conn.java -> 인터페이스
//LocalConn.java -> 클래스. Conn 인터페이스 구현.
//RemoteConn.java -> 클래스. Conn 인터페이스 구현.
//MemberDAO2.java -> Conn 객체에 대해서 의존 관계 설정.
//Main.java -> main() 메소드
//applicationContext.xml -> 스프링 환경 설정 파일. (src 폴더 하위에 생성)

2. 프로그램 소스 코드
//Member.java -> 자료형 클래스
package com.test;

public class Member {
 
 private String mid, name, telephone ;

 public String getMid() {
  return mid;
 }

 public void setMid(String 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;
 }

}

 

 

//Conn.java -> 인터페이스
package com.test;

import java.sql.*;

public interface Conn {
 
 Connection getConn()
   throws ClassNotFoundException, SQLException;
 void close() throws SQLException;

}

 

 

 


//LocalConn.java -> 클래스. Conn 인터페이스 구현.
package com.test;

import java.sql.*;

public class LocalConn implements Conn {

 //Connection(데이터베이스 연결) 객체 저장용 변수 선언
 private static Connection conn = null;
 
 //1. 데이터베이스 연결 과정
 public Connection getConn()
   throws ClassNotFoundException, SQLException {

  //Connection 객체가 생성되지 않은 경우에만
  //신규 객체를 생성한다. -> SingleTone
  if (conn == null) {
   //데이터베이스 연결 액션(로그인 과정)
   Class.forName("oracle.jdbc.driver.OracleDriver");
   String url = "jdbc:oracle:thin:username/password@211.63.89.83:1521:xe";
   conn = DriverManager.getConnection(url);
  }
    
  return conn;
 }
 
 
 //2. 데이터베이스 연결 종료 과정
 public void close() throws SQLException {
  if (conn != null) {
   conn.close();
  }
  conn = null; //멤버변수를 NULL 값으로 초기화
 }
 
 
}

 

 

 

//RemoteConn.java -> 클래스. Conn 인터페이스 구현.
package com.test;

import java.sql.*;

public class RemoteConn implements Conn {

 //Connection(데이터베이스 연결) 객체 저장용 변수 선언
 private static Connection conn = null;
 
 //1. 데이터베이스 연결 과정
 public Connection getConn()
   throws ClassNotFoundException, SQLException {

  //Connection 객체가 생성되지 않은 경우에만
  //신규 객체를 생성한다. -> SingleTone
  if (conn == null) {
   //데이터베이스 연결 액션(로그인 과정)
   Class.forName("oracle.jdbc.driver.OracleDriver");
   String url = "jdbc:oracle:thin:username/password@211.63.89.72:1521:xe";
   conn = DriverManager.getConnection(url);
  }
    
  return conn;
 }
 
 
 //2. 데이터베이스 연결 종료 과정
 public void close() throws SQLException {
  if (conn != null) {
   conn.close();
  }
  conn = null; //멤버변수를 NULL 값으로 초기화
 }
 
 
}

 

 

//MemberDAO2.java -> Conn 객체에 대해서 의존 관계 설정.
package com.test;

import java.sql.*;
import java.util.*;

public class MemberDAO2 {

 //커넥션 객체에 대한 의존 객체 주입 준비
 //LocalConn, RemoteConn 클래스의 객체
 private Conn conn;
 public void setConn(Conn conn) {
  this.conn = conn;
 }
 
 public ArrayList<Member> list()  {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   //Connection 객체 얻는 방법
   conn = this.conn.getConn();
   
   String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while(rs.next()) {
    Member member = new Member();
    member.setMid(rs.getString("mid"));
    member.setName(rs.getString("name"));
    member.setTelephone(rs.getString("telephone"));
    result.add(member);    
   }
   rs.close();
   
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  }finally {
      try{
       if (pstmt != null) {
        pstmt.close();
       }
    //연결 종료시 conn.close(); 사용하면 안됨.
    this.conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }
  }   
  
  return result;
 }
}

 

 


//Main.java -> main() 메소드
package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {
  
  ApplicationContext context
   = new ClassPathXmlApplicationContext("applicationContext.xml");
  MemberDAO2 dao
   = context.getBean("memberDAO2", MemberDAO2.class);
  
  for (Member member : dao.list()) {
   System.out.printf("%s %s %s %n"
     , member.getMid()
     , member.getName()
     , member.getTelephone());
  }

 }

}

 

 

 

//applicationContext.xml -> 스프링 환경 설정 파일. (src 폴더 하위에 생성)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
 <bean id="localConn" class="com.test.LocalConn"></bean>
 <bean id="remoteConn" class="com.test.RemoteConn"></bean>
 <bean id="memberDAO2" class="com.test.MemberDAO2">
  <property name="conn">
   <ref bean="localConn"></ref>
  </property>
 </bean>
 
</beans>

 

 

--------------------------------
DI 테스트4
- 콘솔 프로젝트
- 오라클에 대해서 로컬 서버와 원격 서버를 동시 사용할 수 있도록 설정.

1. 기능 구현
- 이름, 전화번호를 입력 받아서 데이터베이스에 저장
- 번호, 이름, 전화번호를 콘솔에 출력

2. 화면 구성
이름 전화번호(x exit)?kim 010-123-1234
1명의 회원이 추가되었습니다.
이름 전화번호(x exit)?x

------------------
전체 회원수 : 1명
------------------
번호 이름 전화번호
1 kim 010-123-1234
------------------


3. 데이터베이스 준비 (local, remote 오라클 서버에 동시에 설정)
CREATE TABLE memberList (
 mid NUMBER  --PK
 ,name VARCHAR2(30)
 ,telephone VARCHAR2(30)
);

CREATE SEQUENCE memberListSeq;

ALTER TABLE 테이블이름
 ADD CONSTRAINT 제약이름 제약종류(제약대상);
ALTER TABLE 테이블이름
 DROP CONSTRAINT 제약이름;

ALTER TABLE memberList
 ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);

INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, 'kim', '010-123-1234');
ROLLBACK;

SELECT mid, name, telephone FROM memberList;

SELECT COUNT(mid) AS count FROM memberList;

 

4. 프로그램 구성
//Member.java -> 자료형 클래스
//Conn.java -> 인터페이스
//LocalConn.java -> 클래스. Conn 인터페이스 구현.
//RemoteConn.java -> 클래스. Conn 인터페이스 구현.
//MemberDAO.java -> Conn 객체에 대해서 의존 관계 설정.
//Main.java -> main() 메소드
//applicationContext.xml -> 스프링 환경 설정 파일. (src 폴더 하위에 생성)


//문제) 이름, 전화번호를 입력 받아서 데이터베이스에 저장하는 액션 추가할 것.


5. 프로그램 구성
//Member.java -> 자료형 클래스
package com.test;

public class Member {
 
 private String mid, name, telephone ;

 public String getMid() {
  return mid;
 }

 public void setMid(String 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;
 }

}

 

 

//Conn.java -> 인터페이스
package com.test;

import java.sql.Connection;
import java.sql.SQLException;

public interface Conn {
 
 public Connection getConnection()  throws SQLException, ClassNotFoundException;

}

 

 


//LocalConn.java -> 클래스. Conn 인터페이스 구현.
package com.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class LocalConn implements Conn {

 @Override
 public Connection getConnection() throws SQLException,
   ClassNotFoundException {
  Connection conn = null;
  
  Class.forName("oracle.jdbc.driver.OracleDriver");
  String url = "jdbc:oracle:thin:username/password@localhost:1521:xe";
  conn = DriverManager.getConnection(url);
  
  return conn;
 }

}

 

 


//RemoteConn.java -> 클래스. Conn 인터페이스 구현.
package com.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class RemoteConn implements Conn {

 @Override
 public Connection getConnection() throws SQLException,
   ClassNotFoundException {
  Connection conn = null;
  
  Class.forName("oracle.jdbc.driver.OracleDriver");
  String url = "jdbc:oracle:thin:username/password@211.63.89.85:1521:xe";
  conn = DriverManager.getConnection(url);
  
  return conn;
 }

}

 

 

//MemberDAO.java -> Conn 객체에 대해서 의존 관계 설정.
package com.test;

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

public class MemberDAO {
 
 private Conn conn;
 
 public void setConn(Conn conn) {
  this.conn = conn;
 }
 
 public ArrayList<Member> list() throws SQLException, ClassNotFoundException {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Connection connection = conn.getConnection();
  
  String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
  PreparedStatement pstmt = connection.prepareStatement(sql);
  ResultSet rs = pstmt.executeQuery(sql);
  while(rs.next()) {
   Member member = new Member();
   member.setMid(rs.getString("mid"));
   member.setName(rs.getString("name"));
   member.setTelephone(rs.getString("telephone"));
   result.add(member);
  }
  rs.close();  
  pstmt.close();
  connection.close();
  
  return result;
 }
 
 public int count() throws SQLException, ClassNotFoundException {
  int result = 0;
  
  Connection connection  = conn.getConnection();
  
  
  String sql = "SELECT COUNT(*) AS count FROM memberList";
  PreparedStatement pstmt = connection.prepareStatement(sql);
  ResultSet rs = pstmt.executeQuery();
  
  while(rs.next()) {
   result = rs.getInt("count");
  }
   
  rs.close();
  pstmt.close();
  connection.close();
  
  return result;
 }
 
 public int add(Member member) throws SQLException, ClassNotFoundException {
  int result = 0;
  
  Connection connection  = conn.getConnection();
 
  String sql = "INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, ?, ?)";
  PreparedStatement pstmt = connection.prepareStatement(sql);
  pstmt.setString(1, member.getName());
  pstmt.setString(2, member.getTelephone());
  result = pstmt.executeUpdate();
  pstmt.close();
  connection.close();  

  return result;
 } 
 

}

 

 


//Main.java -> main() 메소드
package com.test;

import java.util.Scanner;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {
  
  ApplicationContext context
   = new ClassPathXmlApplicationContext("applicationContext.xml");
  MemberDAO dao
   = context.getBean("memberDAO", MemberDAO.class);

  Scanner sc = new Scanner(System.in);
  
  do {
   
   System.out.print("이름 전화번호(x exit)?");
   String name = sc.next();
   if (name.equalsIgnoreCase("x")) {
    
    break;
   }
   String telephone = sc.next();
   
   Member member = new Member();
   member.setName(name);
   member.setTelephone(telephone);
   try {
    dao.add(member);
    System.out.println("회원이 추가 되었습니다.");
   }catch(Exception e){
    System.out.println(e.toString());
   }
  
  }while(true); 
  
  sc.close();
  
  try {
   System.out.println("-----------------------");
   System.out.printf("전체 인원수 : %d 명 %n"
     , dao.count());
   System.out.println("-----------------------");  
   for( Member member : dao.list()){
    System.out.printf("%s %s %s %n"
      , member.getMid()
      , member.getName()
      , member.getTelephone());
   }
  } catch (Exception e) {

  }
  
 }

}

 

 

//applicationContext.xml -> 스프링 환경 설정 파일. (src 폴더 하위에 생성)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
 <bean id="localConn" class="com.test.LocalConn"></bean>
 <bean id="remoteConn" class="com.test.RemoteConn"></bean>
 <bean id="memberDAO" class="com.test.MemberDAO">
  <property name="conn">
   <ref bean="localConn" />
  </property>
 </bean>
 
</beans>

 


----------------------------------------

 

'Spring' 카테고리의 다른 글

Spring 기본 설정방법!  (0) 2015.07.01
Spring 모듈 다운로드~  (0) 2015.07.01
04일차_Spring MVC, 데이터송수신, 회원관리.txt  (1) 2015.07.01
03일차_DI테스트  (0) 2015.06.30
01일차_DI 설명  (0) 2015.06.30
블로그 이미지

알 수 없는 사용자

,

01일차_DI 설명

Spring 2015. 6. 30. 14:41

-------------------------------
Spring Framework

1. Framework -  어플리케이션을 구현하고 관리하는 환경

2. Spring Framework - 설정정보(XML)에 의해서 어플리케이션을 구성하고, 객체를 생성, 관리하는 주체.

관리대상(객체) -> 설정정보(XML) 등록 -> 객체 생성 -> 컨테이너(IoC)에 등록
-> 사용자 요청 -> 객체 제공 -> 액션 진행

3. IoC (Inversion of Control, 제어의 역전)
Spring Framework -> 객체 생성 -> 관리
사용자 -> 사용하고자 하는 객체에 대한 요청 -> Spring Framework 가 제공

중간부품(객체) 조립->최종부품(객체) 조립 -> 완성품(객체)
A -> B -> C

완성품(객체) <- 틀(프레임워크) <- 부품(객체)을 적절한 자리에 배치(설정정보)
C <- B <- A

4. DI (Dependency Injection, 의존주입, 의존성 삽입)

최종부품을 얻기 위해서 중간부품을 최종부품에 조립을 해야 한다면
최종부품은 중간부품이 포함된 상태로만 사용할 수 있다.
최종부품은 중간부품에 대해서 의존성이 존재한다.
단점은 중간부품에 대한 교체 또는 교환이 쉽게 진행되지 않는다.

아이폰과 삼성폰의 차이
- 배터리(중간부품) 차이
- 아이폰(최종결과물)은 일체형. 배터리 교환 및 교체가 어렵다. 의존성이 높다.
- 삼성폰(최종결과물)은 배터리(중간부품)가 교환형. 배터리 교환 및 교체가 쉽다. 의존성이 낮다.
- 객체와 객체의 결합은 약할 수록 좋다. 약한 결합을 만들려면 Interface 가 필요하다.


class A {
 private B b;
 public A() {
  b = new B();
 }
}

A 객체 사용을 위해서는 B 객체(의존 객체)가 필요하고,
B 객체를 C, D로 교체 또는 교환이 쉽지 않다.


틀을 만들고, 중간부품과 최종부품이 서로 연결될 수 있도록 한다.
장점은, 중간부품을 교체 및 교환하기가 쉽다.

class A {
 private B의인터페이스 b;
 public void setA(B의인터페이스 b) {
  this.b = b;
 }
}

A 객체 사용을 위해서는 B 객체(의존 객체)가 필요하고,
B 객체를 외부에서 제공하도록 수정되었기 때문에
B 객체를 C, D로 교체 또는 교환이 쉽게 된다.

A, B 객체를 외부에서 관리할 수 있고, A 와 B의 의존 상태를 조정할 수 있다.
그리고, B 객체 대신에 C, D 로 대체하는 것이 쉬어진다.

의존 객체를 외부에서 제공하는 과정을 DI(의존 주입)라고 한다.


-------------------------------------
스프링 프레임워크 다운로드
http://docs.spring.io/downloads/nightly/release-download.php?project=SPR
-SPR/spring-framework-3.0.2.RELEASE-with-docs.zip
-SPR/spring-framework-3.0.2.RELEASE-dependencies.zip

 

--------------------------------------
DI 테스트 프로그램 작성
- 콘솔 프로젝트
- 성적 처리

1. 스프링 환경 설정
- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar

경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar

2. 프로그램 구성
//Record.java -> 인터페이스
//RecordView.java -> 인터페이스
//RecordImpl1.java -> 클래스
//RecordImpl2.java -> 클래스
//RecordViewImpl.java -> 클래스
//Main.java -> 클래스. main() 메소드.
//applicationContext.xml -> 스프링 환경 설정 (src 폴더 하위에 생성)

3. 프로그램 소스 코드
//Record.java -> 인터페이스
package com.test;

public interface Record {
 
 public void setKor(int kor);
 public int getKor();
 
 public void setEng(int eng);
 public int getEng();
 
 public void setMat(int mat);
 public int getMat();

 public int getTotal();
 
 public double getAve();

}

 

 

//RecordView.java -> 인터페이스
package com.test;

public interface RecordView {
 
 //setter 메소드 정의
 public void setRecord(Record record);
 
 //입력 액션 전용 메소드
 public void input();
 
 //출력 액션 전용 메소드
 public void output();

}

 

 

//RecordImpl1.java -> 클래스
package com.test;

public class RecordImpl1 implements Record {
 
 private int kor, eng, mat;
 
 @Override
 public int getKor() {
  return kor;
 }

 @Override
 public void setKor(int kor) {
  this.kor = kor;
 }

 @Override
 public int getEng() {
  return eng;
 }

 @Override
 public void setEng(int eng) {
  this.eng = eng;
 }

 @Override
 public int getMat() {
  return mat;
 }

 @Override
 public void setMat(int mat) {
  this.mat = mat;
 }

 @Override
 public int getTotal() {
  int result = 0;
  result = this.getKor() + this.getEng() + this.getMat();
  return result;
 }

 @Override
 public double getAve() {
  double result = 0;
  result = this.getTotal() / 3.0;
  return result;
 }

}

 

 


//RecordImpl2.java -> 클래스
package com.test;

public class RecordImpl2 implements Record {

 private int kor, eng, mat;
 
 @Override
 public int getKor() {
  return kor;
 }

 @Override
 public void setKor(int kor) {
  this.kor = kor;
 }

 @Override
 public int getEng() {
  return eng;
 }

 @Override
 public void setEng(int eng) {
  this.eng = eng;
 }

 @Override
 public int getMat() {
  return mat;
 }

 @Override
 public void setMat(int mat) {
  this.mat = mat;
 }

 @Override
 public int getTotal() {
  int result = 0;
  //기본 점수 추가
  result = 100 + this.getKor() + this.getEng() + this.getMat();
  return result;
 }

 @Override
 public double getAve() {
  double result = 0;
  result = this.getTotal() / 4.0;
  return result;
 }
}

 

 


//RecordViewImpl.java -> 클래스
package com.test;

import java.util.Scanner;

public class RecordViewImpl implements RecordView {
 
 private Record record;
 
 @Override
 public void setRecord(Record record) {
  this.record = record;
 }

 @Override
 public void input() {
  
  Scanner sc = new Scanner(System.in);
  System.out.print("국어 영어 수학?");
  String kor = sc.next();
  String eng = sc.next();
  String mat = sc.next();

  record.setKor(Integer.parseInt(kor));
  record.setEng(Integer.parseInt(eng));
  record.setMat(Integer.parseInt(mat));
  
  sc.close();

 }

 @Override
 public void output() {
  
  System.out.println("국어 영어 수학 총점 평균");
  System.out.printf("%3s %3s %3s %3d %3.1f %n"
     , record.getKor()
     , record.getEng()
     , record.getMat()
     , record.getTotal()
     , record.getAve());
  
 }

}

 

 


//Main.java -> 클래스. main() 메소드.
package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {
  //기존 방법 사용하는 경우
  /*
  RecordView view = new RecordViewImpl();
  
  //둘 중에 하나만 사용
  //RecordImpl1 클래스의 객체 사용 상태와
  //RecordImpl2 클래스의 객체 사용 상태를
  //쉽게 바꿀 수 있다.
  view.setRecord(new RecordImpl1());
  //view.setRecord(new RecordImpl2());

  view.input(); //입력 폼 구성
  view.output(); //출력 폼 구성

  */
  
  //스프링 프레임워크 사용하는 경우(.xml 파일 필요)
  //RecordImpl1 클래스의 객체 사용 상태와
  //RecordImpl2 클래스의 객체 사용 상태를
  //쉽게 바꿀 수 있다.
  //->외부 환경 설정 파일에서 설정 가능
  ApplicationContext context
   = new ClassPathXmlApplicationContext("applicationContext.xml");
  RecordView view = context.getBean("recordViewImpl"
     ,RecordView.class);
  view.input();
  view.output();

 }

}

 

 


//applicationContext.xml -> 스프링 환경 설정 (src 폴더 하위에 생성)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

 <!-- 관리대상(객체) - 설정정보(XML) 등록 -->
 <!-- <bean></bean> 엘리먼트를 사용해서 객체 등록 -->
 <!-- id="" 식별자 지정, class="" 클래스이름 지정 -->
 <bean id="recordImpl1" class="com.test.RecordImpl1"></bean>
 <bean id="recordImpl2" class="com.test.RecordImpl2"></bean>
 
 <!-- 의존 객체 지정하는 부분 -->
 <bean id="recordViewImpl" class="com.test.RecordViewImpl">
  <!-- <property></property> 엘리먼트는 의존객체 주입(DI)을
  setter를 통해서 지정하는 경우 -->
  <!--
  RecordImpl1 클래스의 객체 사용 상태와
  RecordImpl2 클래스의 객체 사용 상태를
  쉽게 바꿀 수 있다.
   -->
  <property name="record">
   <ref bean="recordImpl1" />
  </property>
 </bean>

</beans>

 

-------------------------------------------------------

 

 

 

 

 

 

 

 

'Spring' 카테고리의 다른 글

Spring 기본 설정방법!  (0) 2015.07.01
Spring 모듈 다운로드~  (0) 2015.07.01
04일차_Spring MVC, 데이터송수신, 회원관리.txt  (1) 2015.07.01
03일차_DI테스트  (0) 2015.06.30
02일차_DI테스트  (1) 2015.06.30
블로그 이미지

알 수 없는 사용자

,