반응형
1. 이클립스에 스프링 플러그인을 설치하게 되면 xml생성시 오류없이 작성할수 있다.
2. 그럼이번에 스프링에사용될 jar파일 path를 걸어 주도록 하자.
A. preferences> java > buildpath > user libraries 여기에서 새라이브러리를 만들어 사용할
.jar파일을 추가 해주도록한다.
B. 사용할 .jar 파일 목록
Commons-dbcp.jar
Commons-lang.jar
Commons-logging.jar
Commons-pool.jar
mysql-connector-java-5.1.7
servlet-api.jar
spring.jar
3. 유저라이브러리에 등록하여 프로젝트 properties > java build path > libraries에 추가해준다.
이정도로 셋팅은 끝난듯 하다, 셋팅에 대한 자세한걸 원한다면 , 다음에 글로 다시 한번 남기는게 좋을것 같다
자 이번엔 직접 소스를 적어볼가?
일단 어떤 Class파일이 있는지 살펴보자
* Test 하기 위한 Class 파일
BoardDao.java
BoardDaoImpl.java
BoardDto.java
BoardController.java
* Test를 위한 Controller, Controller이름에 _Test를 붙였다.
BoardController_Test.java
* AOP를 위한 XML 설정 파일
application-context.xml
web.xml
web.xml
자 그럼이제 java 파일을 뜯어 보도록 하자.
첫번째. 자바파일 BoardDto 새로운 프로젝트를 구상하고 만드는거에 있어 속성 즉 DB에 저장될 값과 화면에 보여질 여러가지 속성값들이 미리 정의 대어 있어야 하지 싶다. ( 개인적인생각)
그럼 먼저 Dto부터 만들어보자. 초간단 테스트 이기때문에 속성값은 단두개다!! ^^;
자 그럼 java파일을 먼저 보기로 했짐나 일단 DB Table 부터 만들어보자.
테이블명 |
필드명 |
한글명 | 설명 |
Board |
subject |
제목 | 제목을 입력하는 필드 |
contents |
내용 |
가장많은 내용이 들어가 |
|
* 생성 SQL문
mysql> CREATE DATABASE mysqltest;
mysql> CREATE TABLE BOARD(subject varchar(20), varchar(80));
mysql> INSERT INRO BOARD('subject', 'contents') VALUES('제목','내용입력')
mysql> CREATE TABLE BOARD(subject varchar(20), varchar(80));
mysql> INSERT INRO BOARD('subject', 'contents') VALUES('제목','내용입력')
4-1 이제부터 본격적으로 자바 파일을 살펴보자. DB를 생성하고 소성에 뭐가 필요한지 알게 되었으니 "Dto"를 만들도록 하자. [ BoardDto.java]
package data.board.controller.dto;
public class BoardDto {
private String subject;
private String contents;
/**
* @return the subject
*/
public String getSubject() {
return subject;
}
/**
* @param subject the subject to set
*/
public void setSubject(String subject) {
this.subject = subject;
}
/**
* @return the contents
*/
public String getContents() {
return contents;
}
/**
* @param contents the contents to set
*/
public void setContents(String contents) {
this.contents = contents;
}
}
복잡하지 않고 구분하기 쉽게 db의 field명과 동일하게 명칭을 주었다. (이게더 햇갈리나?)public class BoardDto {
private String subject;
private String contents;
/**
* @return the subject
*/
public String getSubject() {
return subject;
}
/**
* @param subject the subject to set
*/
public void setSubject(String subject) {
this.subject = subject;
}
/**
* @return the contents
*/
public String getContents() {
return contents;
}
/**
* @param contents the contents to set
*/
public void setContents(String contents) {
this.contents = contents;
}
}
4-2 Dto를 생성했으니 이번엔 DAO를 만들어보자.(DAO라 하든 MANAGER라 하든 명칭이야 같다 붙이기 나름 아니겠는가~?) [BoardDao.java]
package com.board.controller.dao;
import org.springframework.dao.DataAccessException;
import data.board.controller.dto.BoardDto;
public interface BoardDao {
/**
*
* @return
* @throws DataAccessException
*/
public BoardDto get() throws DataAccessException;
/**
*
* @return
*/
public int get_2();
}
엇 인터페이스로 선언했구나, 그럼 어디선가 이걸 사용한다는건데, 자~ 자바의 기본구조를 설명하자니 너무길고,(사실 잘 기억이 안남) 아무튼 객체지향? 적으로 설계를 하라고하면 이렇게 하면댄다고 하기에 인스턴스를 생성하고 Class를 생성해서 상속받아 사용하면 된다고 했으니 한번 해보자 그럼import org.springframework.dao.DataAccessException;
import data.board.controller.dto.BoardDto;
public interface BoardDao {
/**
*
* @return
* @throws DataAccessException
*/
public BoardDto get() throws DataAccessException;
/**
*
* @return
*/
public int get_2();
}
4-3 위에걸 상속받아서 실제 Class를 구현해보자 클래스 이름은 [BoardDaoImpl.java]
/**
*
*/
package com.board.controller.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardDaoImpl extends NamedParameterJdbcDaoSupport implements BoardDao {
private static RowMapper boardMapper = new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum) throws SQLException{
BoardDto boardDto = new BoardDto();
boardDto.setSubject(rs.getString("SUBJECT"));
return boardDto;
}
};
/**
* @throws DataAccessExcption
* @return boardDt
*/
public BoardDto get() throws DataAccessException {
NamedParameterJdbcTemplate jt = getNamedParameterJdbcTemplate();
StringBuffer sb = new StringBuffer();
sb.append("SELECT * FROM BOARD");
HashMap paramMap = new HashMap();
BoardDto boardDto =(BoardDto) jt.queryForObject(sb.toString(), paramMap, boardMapper);
return boardDto;
}
public int get_2() {
System.out.println("단위테스트 수행시 묶여진 모든 Class는 전부 수행된다?");
return 3;
}
}
*
*/
package com.board.controller.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardDaoImpl extends NamedParameterJdbcDaoSupport implements BoardDao {
private static RowMapper boardMapper = new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum) throws SQLException{
BoardDto boardDto = new BoardDto();
boardDto.setSubject(rs.getString("SUBJECT"));
return boardDto;
}
};
/**
* @throws DataAccessExcption
* @return boardDt
*/
public BoardDto get() throws DataAccessException {
NamedParameterJdbcTemplate jt = getNamedParameterJdbcTemplate();
StringBuffer sb = new StringBuffer();
sb.append("SELECT * FROM BOARD");
HashMap paramMap = new HashMap();
BoardDto boardDto =(BoardDto) jt.queryForObject(sb.toString(), paramMap, boardMapper);
return boardDto;
}
public int get_2() {
System.out.println("단위테스트 수행시 묶여진 모든 Class는 전부 수행된다?");
return 3;
}
}
이번엔 뭔가가 길다.. 아 이걸 일일이 Commant달아서 설명하기가 힘들다.(사실나도잘 모름 Copy & Paste라서..)
자!! 이만 하고 그럼 'DTO', 'DAO' , 'IMPL' 도 했으니 이번엔 뭘 해야 하나...? 자 하나 남았다.
바로 Controller 그럼 이번에 Controller를 생성해 보도록 하자.
4.4 이곳에서 뭔가가 이러나고 즉 BL(BusinessLogic)이 생성되것지요? 그렇다면 한번 어떻게 생겼는지 봅시다.
package com.board.controller;
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardController {
private BoardDao boardDao;
private BoardDto boardDto = new BoardDto();
/**
* @return the boardDao
*/
public BoardDao getBoardDao() {
return boardDao;
}
/**
* @param boardDao the boardDao to set
*/
public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}
/**
* 기본테스트 목적 _1
* @return
*/
public int test(){
//TODO:
return 12;
}
/**
* 기본테스트목적 _2
* @return
*/
public int testDao(){
int i=boardDao.get_2();
return i;
}
public BoardDto get(){
boardDto = boardDao.get();
return boardDto;
}
}
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardController {
private BoardDao boardDao;
private BoardDto boardDto = new BoardDto();
/**
* @return the boardDao
*/
public BoardDao getBoardDao() {
return boardDao;
}
/**
* @param boardDao the boardDao to set
*/
public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}
/**
* 기본테스트 목적 _1
* @return
*/
public int test(){
//TODO:
return 12;
}
/**
* 기본테스트목적 _2
* @return
*/
public int testDao(){
int i=boardDao.get_2();
return i;
}
public BoardDto get(){
boardDto = boardDao.get();
return boardDto;
}
}
음.. 뭐 대단한건 없고 일반 적인 거랑 비슷하게 생깄느디요? 그렇치요... 테스트만 성공해보자 하는 목적으로 만든거라보니 BL이라곤 하나두 읎는듯 ^^;;;
4.5 마지막으로 이걸 테스트 할수 있는 클래스!! [BoardController_Test.java]
/**
* =============================
* Copyright(c) 2008
* @FileName :
* @FileTitle :
*
* [Change History]
* LastModifier :
*
*/
package test.com.board.controller;
import java.sql.SQLException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.board.controller.BoardController;
import data.board.controller.dto.BoardDto;
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:/applicationContext*.xml" })
/**
* @ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"}) 다음과 같이 로케이션 정보를 적어준다.
* 그렇치 않다면 현재 위치의 MenmerTest Class 이름을 본따 MemberTest-context.xml 이라는 기본적인 이름을 찾게 된다
*/
@RunWith(SpringJUnit4ClassRunner.class) // 사용하고자 하는 junit Class 파일
@ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"})
public class BoardController_Test extends AbstractDependencyInjectionSpringContextTests {
/*
* AbstractDependencyInjectionSpringContextTests 를 사용하게 되면 테스트 후 DB rollback을 해준다.
*/
/**
* @Autowired : Setter 설정 없이도 Autowired를 사용 함으로써 Setter의 효과를 볼수 있다.
* 아키텍쳐 구조를 알기위해서는 좀더 자료를 찾아 볼것.
*/
@Autowired
private BoardController boardController;
// private ApplicationContext ctx;
private BoardDto boardDto= new BoardDto();
/**
* @Test : test를 수행하기 위한 method
*/
@Test
public void get_2(){
int i= boardController.test();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get_3(){
int i= boardController.testDao();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get() throws SQLException{
boardDto = boardController.get();
assertNotNull(boardDto);
System.out.println(boardDto.getSubject());
}
}
/**
* TEST 예전방식으로 Context를 설정해 줄때 사용 하는 방식인듯 하다.
*/
//String[] paths = {"E:/300. 소프트웨어공학/Source/Java_Source/SpringFreamWork/Board_WEB/WebContent/WEB-INF/spring-servlet.xml" };
//FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
//String[] paths = {"/WEB-INF/applicationContext.xml" };
//ctx = new ClassPathXmlApplicationContext(paths);
//boardController = (BoardController)ctx.getBean("boardController");
* =============================
* Copyright(c) 2008
* @FileName :
* @FileTitle :
*
* [Change History]
* LastModifier :
*
*/
package test.com.board.controller;
import java.sql.SQLException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.board.controller.BoardController;
import data.board.controller.dto.BoardDto;
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:/applicationContext*.xml" })
/**
* @ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"}) 다음과 같이 로케이션 정보를 적어준다.
* 그렇치 않다면 현재 위치의 MenmerTest Class 이름을 본따 MemberTest-context.xml 이라는 기본적인 이름을 찾게 된다
*/
@RunWith(SpringJUnit4ClassRunner.class) // 사용하고자 하는 junit Class 파일
@ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"})
public class BoardController_Test extends AbstractDependencyInjectionSpringContextTests {
/*
* AbstractDependencyInjectionSpringContextTests 를 사용하게 되면 테스트 후 DB rollback을 해준다.
*/
/**
* @Autowired : Setter 설정 없이도 Autowired를 사용 함으로써 Setter의 효과를 볼수 있다.
* 아키텍쳐 구조를 알기위해서는 좀더 자료를 찾아 볼것.
*/
@Autowired
private BoardController boardController;
// private ApplicationContext ctx;
private BoardDto boardDto= new BoardDto();
/**
* @Test : test를 수행하기 위한 method
*/
@Test
public void get_2(){
int i= boardController.test();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get_3(){
int i= boardController.testDao();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get() throws SQLException{
boardDto = boardController.get();
assertNotNull(boardDto);
System.out.println(boardDto.getSubject());
}
}
/**
* TEST 예전방식으로 Context를 설정해 줄때 사용 하는 방식인듯 하다.
*/
//String[] paths = {"E:/300. 소프트웨어공학/Source/Java_Source/SpringFreamWork/Board_WEB/WebContent/WEB-INF/spring-servlet.xml" };
//FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
//String[] paths = {"/WEB-INF/applicationContext.xml" };
//ctx = new ClassPathXmlApplicationContext(paths);
//boardController = (BoardController)ctx.getBean("boardController");
테스트인데 뭐이리 길어 하시는 분도 분명 계실꺼다.. 사실 알고보면 짧은거다.. 메소드 마다 Commant도 달고 사용하지 않는건 주석처리가 많이되있어서 조금 길다.
자!! 이제 Test하기위한 Source는 다했다. 이제 XML을 설정하로 가자!!
반응형
'Spring' 카테고리의 다른 글
Mail - Spring JavaMailSender(2/2) - Mail sender Test (0) | 2010.09.14 |
---|---|
Junit Spring ApplicationContext (Applacation Bean Test, Spring Bean Call) (0) | 2010.09.08 |
SpringFramework *.property 사용방법 (0) | 2010.05.06 |
Spring applicatioContext-*** (0) | 2009.01.08 |
Sping freamwork _ v1 셋팅 (setting) Eclipes (0) | 2008.10.20 |