'분류 전체보기'에 해당되는 글 1012건
- 2010.01.28 이동하면서 아이팟으로 회의자료 정리했음
- 2010.01.28 한/영 커서 표시 프로그램
- 2010.01.28 SQL Server 연결된 서버 설정
- 2010.01.27 오라클 관련
- 2010.01.27 파이어폭스 관련
- 2010.01.27 SQL Server 연결된 서버 설정 - 오라클
- 2010.01.25 그림책 축제
- 2010.01.25 왜 머리속에만 멤도는거지?
- 2010.01.24 네트워크 드라이브 암호 지우기
- 2010.01.22 사람을 대하는 표정
- 2010.01.17 디컴파일한 소스를 컴파일하기
- 2010.01.17 영어공부 - ESLPod
- 2010.01.17 [DBNETLIB][ConnectionOpen (Invalid Instance()).]잘못된 연결입니다. 1
- 2010.01.17 원주 추어탕
- 2010.01.15 CASE 구문내에 SELECT 사용하기
- 2010.01.15 자기 통제력
- 2010.01.15 SQL Server 원격연결
- 2010.01.11 구글 리더
- 2010.01.11 명동예술극장
- 2010.01.11 Spring 소스 분석 - View로 Model이 전달되는 방법
- 2010.01.11 Galileo
- 2010.01.11 Spring 소스 연결
- 2010.01.10 flesh out
- 2010.01.10 [해석] Developing a Spring Framework MVC application step-by-step Chapter 2. Developing and Configuring the Views and the Controller
- 2010.01.10 Eclipse Console
- 2010.01.10 Developing a Spring Framework MVC application step-by-step 테스트케이스
- 2010.01.10 Ant에서 Tomcat Application 실행시키키
- 2010.01.10 Developing a Spring Framework MVC application step-by-step 예제 실행하기
- 2010.01.09 [해석] Developing a Spring Framework MVC application step-by-step Chapter 1. Basic Application and Environment Setup
- 2010.01.08 파이어폭스에서 임시파일 확인 주기 설정 방법
- 이동하면서 아이팟으로 회의자료 정리했음
- 雜동사니
- 2010. 1. 28. 19:00
외부에서 회의가 있는데 급하게 나오느라 준비를 하지 못했다.
회의라는게 준비를 하지 못하면 회의가 늘어지거나 아무런 결정도 내리지 못하게 되버린다.
다행히 회의에 필요한 자료가 메일에 텍스트형태로 있다.
이동하는 차량안에서 아이팟에서 여러 메일에 흩어진 자료를 모아서 메모장에 옮기고 정리했다.
이 프로젝트를 하면서 처음으로 예상된 시간내에 회의가 끝나고 의사결정이 이루어졌다.
ipod thanx~
회의라는게 준비를 하지 못하면 회의가 늘어지거나 아무런 결정도 내리지 못하게 되버린다.
다행히 회의에 필요한 자료가 메일에 텍스트형태로 있다.
이동하는 차량안에서 아이팟에서 여러 메일에 흩어진 자료를 모아서 메모장에 옮기고 정리했다.
이 프로젝트를 하면서 처음으로 예상된 시간내에 회의가 끝나고 의사결정이 이루어졌다.
ipod thanx~
- 한/영 커서 표시 프로그램
- 雜동사니
- 2010. 1. 28. 17:56
- SQL Server 연결된 서버 설정
- 日常茶飯事
- 2010. 1. 28. 09:41
여러가지 방법으로 가능함.
1.
연결된 서버명 : IP 주소
공급자 : Microsoft OLE DB Provider for SQL Server
2.
연결된 서버명 : HOST명
공급자 : Microsoft OLE DB Provider for SQL Server
3.
공급자 : SQL Native Client
제품 이름 : 호스트명? 연결된 서버명과 동일
데이터 원본 : IP 주소
4.
공급자 : Microsoft OLE DB Provider for SQL Server
데이터 원본 : IP 주소
카탈로그 : 데이터베이스명
5. SQL Server 2005 에서 MySQL 연결
공급자 : Microsoft OLE DB Provider for ODBC Drivers
제품 이름 : MySQL ODBC 5.1 Driver
데이터 원본 : ODBC 등록한 이름
1.
연결된 서버명 : IP 주소
공급자 : Microsoft OLE DB Provider for SQL Server
2.
연결된 서버명 : HOST명
공급자 : Microsoft OLE DB Provider for SQL Server
3.
공급자 : SQL Native Client
제품 이름 : 호스트명? 연결된 서버명과 동일
데이터 원본 : IP 주소
4.
공급자 : Microsoft OLE DB Provider for SQL Server
데이터 원본 : IP 주소
카탈로그 : 데이터베이스명
5. SQL Server 2005 에서 MySQL 연결
공급자 : Microsoft OLE DB Provider for ODBC Drivers
제품 이름 : MySQL ODBC 5.1 Driver
데이터 원본 : ODBC 등록한 이름
- tnsname.ora 위치
C:\oracle\product\10.2.0\db\NETWORK\ADMIN\
C:\oracle\product\10.2.0\db\NETWORK\ADMIN\
정리해라===
오라클 캐릭터셋 확인 및 변경 방법 https://m.blog.naver.com/PostView.nhn?blogId=sjy2907&logNo=220075412154&targetKeyword=&targetRecommendationCode=1
오라클 DB 용량 확인 https://m.blog.naver.com/PostView.nhn?blogId=sjy2907&logNo=220019270794&targetKeyword=&targetRecommendationCode=1
- Profile 위치
C:\Documents and Settings\USER\Application Data\Mozilla\Firefox\Profiles\xxxx.default\prefs.js
- SQL Server 연결된 서버 설정 - 오라클
- 日常茶飯事
- 2010. 1. 27. 07:12
SQL Server 2005 Express와 Oracle 10g Express간의 연결된 서버 설정
- 공급자를 Microsoft OLE DB Provider for Oracle 로 지정
제품 이름 : Oracle
데이터 원본 : 10.20.30.40:1521
- 공급자를 Oracle Provider for OLE DB 로 지정
연결이 안됨.
TNS로 설정하거나 추가로 필요한 모듈을 설치해야 된다고 함.(해보지는 않았음)
[todo] 129에 받아둔 거 설치해서 해보자.
L사 SQL Server 2005 와 다른 주소의 오라클 연결
공급자를 Microsoft OLE DB Provider for Oracle 로 지정
제품 이름 : Oracle
데이터 원본 : ERP_DEV (tnsnames.ora에 설정된 이름임)
* 대소문자 주의할 것.
- 공급자를 Microsoft OLE DB Provider for Oracle 로 지정
제품 이름 : Oracle
데이터 원본 : 10.20.30.40:1521
- 공급자를 Oracle Provider for OLE DB 로 지정
연결이 안됨.
TNS로 설정하거나 추가로 필요한 모듈을 설치해야 된다고 함.(해보지는 않았음)
[todo] 129에 받아둔 거 설치해서 해보자.
L사 SQL Server 2005 와 다른 주소의 오라클 연결
공급자를 Microsoft OLE DB Provider for Oracle 로 지정
제품 이름 : Oracle
데이터 원본 : ERP_DEV (tnsnames.ora에 설정된 이름임)
* 대소문자 주의할 것.
- 왜 머리속에만 멤도는거지?
- 카테고리 없음
- 2010. 1. 25. 10:29
- 네트워크 드라이브 암호 지우기
- 日常茶飯事
- 2010. 1. 24. 20:33
> net use * /d
이렇게 해도 잘안되는 경우가 있음.
이런 경우 네트워크 드라이브를 연결시키자. 이때도 기존 연결이 있다고 나오면 위 명령어로 지운다.
> net use
새 연결 정보가 저장됩니다.
상태 로컬 원격 네트워크
-------------------------------------------------------------------------------
OK Z: \\1.2.3.4\Project Microsoft Windows Network
명령을 잘 실행했습니다.
- 사람을 대하는 표정
- 雜동사니
- 2010. 1. 22. 21:00
필요한 서류가 있어서 구청에 들렀다.
(언제나 그렇듯이) 내가 필요한 양식이 없다.
가까운 창구에 있는 담당자에게 물어봤더니 답을 해준다.
그런데 내가 잘 못들어서 다시 물어봤다.
그랬더니 아주 인상을 찌그리며 답을 해준다.
20대 중반으로 보이는 예쁜 아가씨였는데 반복되는 업무에 지친듯했다.
나같이 똑같은 질문을 하는 사람이 하루에 여러 수십명이 되겠지.
저 아가씨는 엄청난 노력을 해서 공무원이 되었을텐데 지금 얼마나 자신이 하는 일에 만족하고 있을까하는 생각이 든다.
안정된 직장
많은 연봉
연말의 성과급
복지혜택
우리가 직장을 선택하는 기준이다.
이런 기준을 가지고 선택한 직장에서 내가 하고 싶은 일을 한다는 것은 사치일지도 모른다.
남들이 부러워 하는 직장에 다니는 것에 만족하며 살수도 있고 조금 부족하지만 자기가 원하는, 또는 자기가 원하는 것을 하기 위한 일을 하며 살수도 있지 않겠나.
iPod 에서 작성된 글입니다.
(언제나 그렇듯이) 내가 필요한 양식이 없다.
가까운 창구에 있는 담당자에게 물어봤더니 답을 해준다.
그런데 내가 잘 못들어서 다시 물어봤다.
그랬더니 아주 인상을 찌그리며 답을 해준다.
20대 중반으로 보이는 예쁜 아가씨였는데 반복되는 업무에 지친듯했다.
나같이 똑같은 질문을 하는 사람이 하루에 여러 수십명이 되겠지.
저 아가씨는 엄청난 노력을 해서 공무원이 되었을텐데 지금 얼마나 자신이 하는 일에 만족하고 있을까하는 생각이 든다.
안정된 직장
많은 연봉
연말의 성과급
복지혜택
우리가 직장을 선택하는 기준이다.
이런 기준을 가지고 선택한 직장에서 내가 하고 싶은 일을 한다는 것은 사치일지도 모른다.
남들이 부러워 하는 직장에 다니는 것에 만족하며 살수도 있고 조금 부족하지만 자기가 원하는, 또는 자기가 원하는 것을 하기 위한 일을 하며 살수도 있지 않겠나.
iPod 에서 작성된 글입니다.
- 디컴파일한 소스를 컴파일하기
- 日常茶飯事
- 2010. 1. 17. 23:00
jad로 디컴파일한 소스를 수정해서 다시 컴파일하려니 이런 에러가 발생한다.
[todo] 방법이 없나?
WEB-INF\src>"C:\Program Files\Java\jdk1.6.0_12\bin\javac" -d . com/test/model/TestDAO.jav
a
com\test\model\TestDAO.java:159: not a statement
/* 173*/ exception;
^
com\test\model\TestDAO.java:236: not a statement
/* 258*/ exception;
^
a
com\test\model\TestDAO.java:159: not a statement
/* 173*/ exception;
^
com\test\model\TestDAO.java:236: not a statement
/* 258*/ exception;
^
[todo] 방법이 없나?
- 영어공부 - ESLPod
- 雜동사니
- 2010. 1. 17. 23:00
ESLPod를 box.net에 올렸다.
iPod에 넣고 틈틈이 들어야 겠다.
스크립트는 구글문서에 올려두고 MiGhtyDocs로 공유한다.
- 아이팟에서 스크립트를 볼수도 있다. 1
이런걸 보면 애플이 그냥 애플이 아니구나라는 생각이 든다.
iPod에 넣고 틈틈이 들어야 겠다.
스크립트는 구글문서에 올려두고 MiGhtyDocs로 공유한다.
- 아이팟에서 스크립트를 볼수도 있다. 1
이런걸 보면 애플이 그냥 애플이 아니구나라는 생각이 든다.
- 2010-02-09 [본문으로]
- [DBNETLIB][ConnectionOpen (Invalid Instance()).]잘못된 연결입니다.
- 日常茶飯事
- 2010. 1. 17. 20:38
ERP에서 우리 시스템의 데이터베이스에 연결된 서버로 붙이려고 하는데 한참동안 쿼리가 실행되더니 접속이 되지 않는다.
암호도 바꿔보고
권한도 아예 db_owner로 줬는데도 그러네.
그런데 쿼리를 실행한 결과를 보니 요상한 에러 메세지가 나왔다.
쿼리가 너무 오래 걸린다고 에러메세지도 확인하지 않고 부산을 떨었다.
검색해보면 포트번호를 추가하라고 되어 있는데 어디서 해야 하나?
데이터 원본에 아이피를 넣었는데 그 뒤에 ,를 넣고 1433 포트번호를 추가했다.
된다.
헉.
오늘의 교훈 : 에러 메세지부터 확인하라.
암호도 바꿔보고
권한도 아예 db_owner로 줬는데도 그러네.
그런데 쿼리를 실행한 결과를 보니 요상한 에러 메세지가 나왔다.
[DBNETLIB][ConnectionOpen (Invalid Instance()).]잘못된 연결입니다.
처음부터 에러메세지를 확인했어야 한다.쿼리가 너무 오래 걸린다고 에러메세지도 확인하지 않고 부산을 떨었다.
검색해보면 포트번호를 추가하라고 되어 있는데 어디서 해야 하나?
데이터 원본에 아이피를 넣었는데 그 뒤에 ,를 넣고 1433 포트번호를 추가했다.
된다.
헉.
오늘의 교훈 : 에러 메세지부터 확인하라.
- CASE 구문내에 SELECT 사용하기
- 日常茶飯事
- 2010. 1. 15. 18:00
1. 데이터의 상태변경 이력을 기록해 두었다가 출력하는 기능이 필요했다.
2. 이력데이터를 가져와서 출력하는데 상태를 변경한 아이디는 있는데 이름이 없어서 ERP시스템에서 데이터를 가져와야 했다.
3. 사용자 아이디는 4가지로 구분된다.
관리자, 시스템, 본사직원, 업체직원
관리자 아이디는 admin
시스템은 실제 존재하지는 않는 아이디임(백그라운드 프로세스가 처리하는 경우) SYSTEM
본사직원 테이블은 TB_EMPLOYEE
업체직원 테이블은 TB_VENDOR
4. CASE 구문을 사용하고 각 조건 아래 SELECT 구문을 넣으면 될거 같다.
그런데 안된다.(나중에 알았는데 SELECT 컬럼명, 이렇게 해야 하는데 컬럼명을 안적었음)
- 1) 필요한 데이터를 테이블(z)로 구성한다.
- 2) 위와 동일한테 전체를 가져옴. 쿼리를 실행시키면 15초 정도 걸리는데 프로그램으로 실행하면 2초내에 출력된다. =-=>???
- 3) 안되는줄 알았는데 된다.
- 4) 함수로 만드는게 제일 좋을듯.
2. 이력데이터를 가져와서 출력하는데 상태를 변경한 아이디는 있는데 이름이 없어서 ERP시스템에서 데이터를 가져와야 했다.
3. 사용자 아이디는 4가지로 구분된다.
관리자, 시스템, 본사직원, 업체직원
관리자 아이디는 admin
시스템은 실제 존재하지는 않는 아이디임(백그라운드 프로세스가 처리하는 경우) SYSTEM
본사직원 테이블은 TB_EMPLOYEE
업체직원 테이블은 TB_VENDOR
4. CASE 구문을 사용하고 각 조건 아래 SELECT 구문을 넣으면 될거 같다.
그런데 안된다.(나중에 알았는데 SELECT 컬럼명, 이렇게 해야 하는데 컬럼명을 안적었음)
- 1) 필요한 데이터를 테이블(z)로 구성한다.
- 2) 위와 동일한테 전체를 가져옴. 쿼리를 실행시키면 15초 정도 걸리는데 프로그램으로 실행하면 2초내에 출력된다. =-=>???
- 3) 안되는줄 알았는데 된다.
- 4) 함수로 만드는게 제일 좋을듯.
자신의 삶에 대한 통제력을 갖고 있는 사람들은
허둥대지 않고 그럭저럭 시간에 대어 도착합니다.
그들은 조금도 당황하지 않고 일을 처리합니다.
반면 그렇지 못한 사람들은 삶의 압력에
끊임없이 시달리며 항상 조금 늦게,
그리고 준비가 좀 덜 된 상태로
자리를 옮깁니다.
- 에크낫 이스워런의《마음의 속도를 늦추어라》중에서 -
* 약속 장소에 5분 먼저 온 사람과
5분 늦게 온 사람의 태도는 천지 차이입니다.
직장 출근을 항상 적어도 30분 일찍 하는 사람이면
그는 이미 성공의 길에 들어선 것과 같습니다.
자기 통제력은 시간관리에서 드러납니다.
(2006년 8월 24일자 앙코르 메일)
출처 : 고도원의 아침편지
허둥대지 않고 그럭저럭 시간에 대어 도착합니다.
그들은 조금도 당황하지 않고 일을 처리합니다.
반면 그렇지 못한 사람들은 삶의 압력에
끊임없이 시달리며 항상 조금 늦게,
그리고 준비가 좀 덜 된 상태로
자리를 옮깁니다.
- 에크낫 이스워런의《마음의 속도를 늦추어라》중에서 -
* 약속 장소에 5분 먼저 온 사람과
5분 늦게 온 사람의 태도는 천지 차이입니다.
직장 출근을 항상 적어도 30분 일찍 하는 사람이면
그는 이미 성공의 길에 들어선 것과 같습니다.
자기 통제력은 시간관리에서 드러납니다.
(2006년 8월 24일자 앙코르 메일)
출처 : 고도원의 아침편지
- SQL Server 원격연결
- 日常茶飯事
- 2010. 1. 15. 10:16
SQL Server 2005 Express 설치후 원격 연결이 안됨
로컬에서 localhost\sqlexpress, devtest\sqlexpress 는 되지만 127.0.0.1\sqlexpress 는 안됨
- 원격연결을 허용하도록 구성하기
1. SQL Server 노출영역 구성
- 로컬 및 원격 연결 선택
- SQL Server Browser 시작 (이건 안해도 될듯)
2. SQL Server Configuration Manager
IPAll만 설정하면 될듯
- 별칭으로 접근하기
로컬에서 127.0.0.1\sqlexpress 는 되지만 원격지에서 IP\sqlexpress 로는 안됨
(SQL Server Configuration Manager 에서 접속하려는 IP 를 사용하도록 설정하면 되지만 그렇게 하지 않는 경우)
클라이언트 네트워크 유틸리티로 별칭 등록
- 서버 이름 : IP\sqlexpress
- 포트번호 : 1433(동적으로 확인하면 안됨)
로컬에서 localhost\sqlexpress, devtest\sqlexpress 는 되지만 127.0.0.1\sqlexpress 는 안됨
- 원격연결을 허용하도록 구성하기
1. SQL Server 노출영역 구성
- 로컬 및 원격 연결 선택
- SQL Server Browser 시작 (이건 안해도 될듯)
2. SQL Server Configuration Manager
IPAll만 설정하면 될듯
- 별칭으로 접근하기
로컬에서 127.0.0.1\sqlexpress 는 되지만 원격지에서 IP\sqlexpress 로는 안됨
(SQL Server Configuration Manager 에서 접속하려는 IP 를 사용하도록 설정하면 되지만 그렇게 하지 않는 경우)
클라이언트 네트워크 유틸리티로 별칭 등록
- 서버 이름 : IP\sqlexpress
- 포트번호 : 1433(동적으로 확인하면 안됨)
- Spring 소스 분석 - View로 Model이 전달되는 방법
- 日常茶飯事
- 2010. 1. 11. 04:57
- Controller에서 ModelAndView를 리턴하는데 View에 전달되는 데이터는 어떤 식으로 저장되는지 궁금함.
DispatcherServlet
doService()
doDispatch()
render()
AbstractView
render()
renderMergedOutputModel()
InternalResourceView //여러 구현체중 하나
renderMergedOutputModel()
exposeModelAsRequestAttributes()
AbstractView
exposeModelAsRequestAttributes()
String modelName = (String) entry.getKey();
Object modelValue = entry.getValue();
if (modelValue != null) {
request.setAttribute(modelName, modelValue); //모델이름으로 request에 저장된다.
...
RequestDispatcher.include() - OR - forward()
doService()
doDispatch()
render()
AbstractView
render()
renderMergedOutputModel()
InternalResourceView //여러 구현체중 하나
renderMergedOutputModel()
exposeModelAsRequestAttributes()
AbstractView
exposeModelAsRequestAttributes()
String modelName = (String) entry.getKey();
Object modelValue = entry.getValue();
if (modelValue != null) {
request.setAttribute(modelName, modelValue); //모델이름으로 request에 저장된다.
...
RequestDispatcher.include() - OR - forward()
- Spring 소스 연결
- 日常茶飯事
- 2010. 1. 11. 03:57
- [해석] Developing a Spring Framework MVC application step-by-step Chapter 2. Developing and Configuring the Views and the Controller
- 日常茶飯事
- 2010. 1. 10. 23:06
http://web.archive.org/web/20161120010625/http://docs.spring.io/docs/Spring-MVC-step-by-step/part2.html
Chapter 2. Developing and Configuring the Views and the Controller.pdf
2장. 뷰와 컨트롤러 개발
[todo] 이 부분 빠졌음.
2.1. JSTL과 JSP 헤더 파일 작성
JSTL 관련 라이브러리인 jstl.jar, standard.jar를 WEB-INF/lib/에 복사한다.
앞으로 작성할 모든 JSP에 포함될 헤더파일을 작성한다.
헤더파일을 include해서 모든 JSP 파일에 동일한 구문을 간단하게 넣을수 있다.
모든 JSP 파일을 WEB-INF/jsp/에 넣는다.
URL을 통해서 직접 접근하지 못하고 컨트롤러를 통해서만 뷰에 접근 가능하도록 한다.
이 방법은 어떤 어플리케이션 서버에서는 작동하지 않을지도 모르는데 이 경우 jsp/를 위로 올린다.
우선 모든 JSP에 포함될 헤더파일을 만든다.
'springapp/war/WEB-INF/jsp/include.jsp':
헤더파일을 사용하도록 index.jsp를 수정하면 JSTL을 사용할 수 있으므로 Front Controller로 리다이렉트하는 <c:redirect/> 태그를 사용한다.
이것은 index.jsp에 대한 모든 요청을 어플리케이션 프레임워크로 통하도록 수정한다.
'springapp/war/index.jsp':
hello.jsp를 WEB-INF/jsp/로 옮기고 index.jsp와 동일한 directive를 추가한다.
model에서 가져와서 뷰에 전달된 현재 일자와 시간을 JSTL <c:out/> 태그를 사용하여 출력한다.
'springapp/war/WEB-INF/jsp/hello.jsp':
2.2. Controller 개선
Controller에서 JSP의 위치를 수정하기 전에 단위테스트부터 수정한다.
뷰에 대한 경로를 WEB-INF/jsp/hello.jsp로 수정해야 하고 모델에 now라는 키로 객체를 전달해야 한다.
'springapp/tests/HelloControllerTests.java':
이 상태에서 테스트를 실행하면 당연히 실패한다.
뷰에 대한 경로를 WEB-INF/jsp/hello.jsp로 수정하고 모델에 현재 일자와 시간에 대한 값을 now라는 문자열 키로 담는다.
'springapp/src/springapp/web/HelloController.java':
Controller는 springapp-servlet.xml에 이미 설정되어 있기 때문에 수정한 코드를 빌드하고 배포하는데 문제없다.
브라우저에 http://localhost:8080/springapp/를 치면 index.jsp를 호출하고 hello.htm으로 전달된다. 이것은 DispatcherServlet에 의해서 처리된뒤, 페이지 컨트롤러에서 모델에 날짜와 시간을 담고 hello.jsp에서 사용된다.
2.3. Controller에서 View 분리하기
현재 컨트롤러는 뷰에 대한 전체 경로를 명시하고 있는데 이것은 컨트롤러와 뷰 사이에 불필요한 종속성을 만들고 있다.
뷰에 대해 논리적인 이름을 매핑하면 컨트롤러를 수정하지 않고 뷰를 교체할수 있다
ResourceBundleViewResolver나 SimpleUrlHandlerMapping을 사용하면 프로퍼티파일에 이러한 매핑을 설정할수 있다
InternalResourceViewResolver에서는 뷰에 대한 매핑을 접두어, 접미어를 이용해서 간단하게 설정할수 있다
여기서는 두번째 방법으로 구현한다
springapp-servlet.xml에 viewResolver 엔트리를 추가한다.
JstlView를 설정하면 국제화를 지원하는 메세지 리소스 번들를 JSTL과 같이 사용할수 있다.
'springapp/war/WEB-INF/springapp-servlet.xml':
컨트롤러에서 뷰 이름을 수정하고 HelloControllerTests를 실행하면 실패할 것이다.
'springapp/test/springapp/web/HelloControllerTests.java':
컨트롤러에서 사용한 뷰이름에서 접두어와 접미어를 제거하면 컨트롤러는 hello라는 논리적인 이름으로 뷰를 참조하게 된다
이제는 테스트를 통과하게 되고 컴파일해서 배포해서 어플리케이션이 동작하는지 확인한다
2.4. 요약
2장에서 작성한 것을 살펴보면
우리가 사용할 JSP페이지에서 사용할 태그 라이브러리 디렉티브를 담고 있는 Include.jsp 헤더 파일을 작성했다.
여기에서 변경한 것은
컨트롤러가 뷰를 참조할때 하드코딩된 이름이 아닌 논리적인 이름으로 참조하도록 HelloControllerTests를 수정하였고
HelloController는 springapp-servlet.xml에 정의된 InternalResourceViewResolver를 사용한 논리적인 이름을 참조한다.
아래는 이런 작업을 한뒤의 프로젝트 디렉토리 구조 스크린샷이다.
[todo] 이 부분 빠졌음.
2.1. JSTL과 JSP 헤더 파일 작성
JSTL 관련 라이브러리인 jstl.jar, standard.jar를 WEB-INF/lib/에 복사한다.
앞으로 작성할 모든 JSP에 포함될 헤더파일을 작성한다.
헤더파일을 include해서 모든 JSP 파일에 동일한 구문을 간단하게 넣을수 있다.
모든 JSP 파일을 WEB-INF/jsp/에 넣는다.
URL을 통해서 직접 접근하지 못하고 컨트롤러를 통해서만 뷰에 접근 가능하도록 한다.
이 방법은 어떤 어플리케이션 서버에서는 작동하지 않을지도 모르는데 이 경우 jsp/를 위로 올린다.
우선 모든 JSP에 포함될 헤더파일을 만든다.
'springapp/war/WEB-INF/jsp/include.jsp':
헤더파일을 사용하도록 index.jsp를 수정하면 JSTL을 사용할 수 있으므로 Front Controller로 리다이렉트하는 <c:redirect/> 태그를 사용한다.
이것은 index.jsp에 대한 모든 요청을 어플리케이션 프레임워크로 통하도록 수정한다.
'springapp/war/index.jsp':
hello.jsp를 WEB-INF/jsp/로 옮기고 index.jsp와 동일한 directive를 추가한다.
model에서 가져와서 뷰에 전달된 현재 일자와 시간을 JSTL <c:out/> 태그를 사용하여 출력한다.
'springapp/war/WEB-INF/jsp/hello.jsp':
2.2. Controller 개선
Controller에서 JSP의 위치를 수정하기 전에 단위테스트부터 수정한다.
뷰에 대한 경로를 WEB-INF/jsp/hello.jsp로 수정해야 하고 모델에 now라는 키로 객체를 전달해야 한다.
'springapp/tests/HelloControllerTests.java':
이 상태에서 테스트를 실행하면 당연히 실패한다.
뷰에 대한 경로를 WEB-INF/jsp/hello.jsp로 수정하고 모델에 현재 일자와 시간에 대한 값을 now라는 문자열 키로 담는다.
'springapp/src/springapp/web/HelloController.java':
Controller는 springapp-servlet.xml에 이미 설정되어 있기 때문에 수정한 코드를 빌드하고 배포하는데 문제없다.
브라우저에 http://localhost:8080/springapp/를 치면 index.jsp를 호출하고 hello.htm으로 전달된다. 이것은 DispatcherServlet에 의해서 처리된뒤, 페이지 컨트롤러에서 모델에 날짜와 시간을 담고 hello.jsp에서 사용된다.
2.3. Controller에서 View 분리하기
현재 컨트롤러는 뷰에 대한 전체 경로를 명시하고 있는데 이것은 컨트롤러와 뷰 사이에 불필요한 종속성을 만들고 있다.
뷰에 대해 논리적인 이름을 매핑하면 컨트롤러를 수정하지 않고 뷰를 교체할수 있다
ResourceBundleViewResolver나 SimpleUrlHandlerMapping을 사용하면 프로퍼티파일에 이러한 매핑을 설정할수 있다
InternalResourceViewResolver에서는 뷰에 대한 매핑을 접두어, 접미어를 이용해서 간단하게 설정할수 있다
여기서는 두번째 방법으로 구현한다
springapp-servlet.xml에 viewResolver 엔트리를 추가한다.
JstlView를 설정하면 국제화를 지원하는 메세지 리소스 번들를 JSTL과 같이 사용할수 있다.
'springapp/war/WEB-INF/springapp-servlet.xml':
컨트롤러에서 뷰 이름을 수정하고 HelloControllerTests를 실행하면 실패할 것이다.
'springapp/test/springapp/web/HelloControllerTests.java':
컨트롤러에서 사용한 뷰이름에서 접두어와 접미어를 제거하면 컨트롤러는 hello라는 논리적인 이름으로 뷰를 참조하게 된다
이제는 테스트를 통과하게 되고 컴파일해서 배포해서 어플리케이션이 동작하는지 확인한다
2.4. 요약
2장에서 작성한 것을 살펴보면
우리가 사용할 JSP페이지에서 사용할 태그 라이브러리 디렉티브를 담고 있는 Include.jsp 헤더 파일을 작성했다.
여기에서 변경한 것은
컨트롤러가 뷰를 참조할때 하드코딩된 이름이 아닌 논리적인 이름으로 참조하도록 HelloControllerTests를 수정하였고
HelloController는 springapp-servlet.xml에 정의된 InternalResourceViewResolver를 사용한 논리적인 이름을 참조한다.
아래는 이런 작업을 한뒤의 프로젝트 디렉토리 구조 스크린샷이다.
- Eclipse Console
- 日常茶飯事
- 2010. 1. 10. 14:05
Show Console When Standard Out Changes
Show Console When Standard Error Changes
테스트를 진행하거나 할때 표준 출력/에러가 콘솔에 찍히면 Console View 가 활성화되어서 불편하다.
그런 경우 이 옵션을 끈다.
- Developing a Spring Framework MVC application step-by-step 테스트케이스
- 日常茶飯事
- 2010. 1. 10. 13:50
- Chapter 1
처음에는 단순히 리턴하는 모델의 뷰이름만 확인한다.
- Chapter 2.2
모델의 뷰이름이 제대로 되었는지 확인하고 모델 데이터가 있는지 확인한다.
- Chapter 2.3
- Chapter 3.2
도메인객체에 대한 테스트
서비스 클래스에 대한 테스트
처음에는 단순히 리턴하는 모델의 뷰이름만 확인한다.
- Chapter 2.2
모델의 뷰이름이 제대로 되었는지 확인하고 모델 데이터가 있는지 확인한다.
- Chapter 2.3
- Chapter 3.2
도메인객체에 대한 테스트
서비스 클래스에 대한 테스트
- Ant에서 Tomcat Application 실행시키키
- 日常茶飯事
- 2010. 1. 10. 09:21
- build.xml
- build.properties
- appserver.home/conf/tomcat-users.xml
- 확인
출처 : Developing a Spring Framework MVC application step-by-step
- build.properties
appserver.home=E:/resources/programs/java/apache-tomcat-6.0.18
appserver.lib=${appserver.home}/lib
deploy.path=${appserver.home}/webapps
tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret
appserver.lib=${appserver.home}/lib
deploy.path=${appserver.home}/webapps
tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret
- appserver.home/conf/tomcat-users.xml
- 확인
$ ant list
Buildfile: build.xml
list:
[list] OK - Listed applications for virtual host localhost
[list] /springapp:running:0:springapp
[list] /manager:running:0:manager
[list] /:running:0:ROOT
[list] /docs:running:0:docs
[list] /examples:running:0:examples
[list] /host-manager:running:0:host-manager
BUILD SUCCESSFUL
Total time: 3 seconds
Buildfile: build.xml
list:
[list] OK - Listed applications for virtual host localhost
[list] /springapp:running:0:springapp
[list] /manager:running:0:manager
[list] /:running:0:ROOT
[list] /docs:running:0:docs
[list] /examples:running:0:examples
[list] /host-manager:running:0:host-manager
BUILD SUCCESSFUL
Total time: 3 seconds
출처 : Developing a Spring Framework MVC application step-by-step
- Developing a Spring Framework MVC application step-by-step 예제 실행하기
- 카테고리 없음
- 2010. 1. 10. 09:04
이클립스에서 실행하기
- Dynamin Web Project로 만든다.
컴파일이 자동으로 되고, 클래스패스를 자동으로 잡아준다.
- Ant는 Outline View에서 실행시킨다.
[todo] 필요없는 target 지우기, 그러나 테스트서버에서는 필요하다. 필요한 target만 여기 적어놔.
- Tomcat은 Server View를 이용한다.
- Test는 단축키(@~x, t)를 이용한다.
IDE 사용하지 않고 실행하기
- Ant를 이용한다.
- Dynamin Web Project로 만든다.
컴파일이 자동으로 되고, 클래스패스를 자동으로 잡아준다.
- Ant는 Outline View에서 실행시킨다.
[todo] 필요없는 target 지우기, 그러나 테스트서버에서는 필요하다. 필요한 target만 여기 적어놔.
- Tomcat은 Server View를 이용한다.
- Test는 단축키(@~x, t)를 이용한다.
IDE 사용하지 않고 실행하기
- Ant를 이용한다.
- [해석] Developing a Spring Framework MVC application step-by-step Chapter 1. Basic Application and Environment Setup
- 日常茶飯事
- 2010. 1. 9. 19:43
http://web.archive.org/web/20161119155731/http://docs.spring.io/docs/Spring-MVC-step-by-step/part1.html
Chapter 1. Basic Application and Environment Setup.pdf
1장. 기본 어플리케이션 및 환경설정
1.1. 프로젝트 디렉토리 생성
모든 소스와 작성할 파일을 저장할 디렉토리를 springapp/라고 하자.
자바소스를 저장할 src/를 만든다.
어플리케이션을 패키징하고 배포할 WAR에 들어갈 모든 파일을 저장할 war/를 만든다.
war/에는 자바소스를 제외한 JSP 소스, 설정파일이 저장된다.
1.2. index.jsp 작성하기
아주 간단한 index.jsp를 war/에 작성하자.
index.jsp는 우리가 만드는 어플리케이션의 시작점이 된다.
'springapp/war/index.jsp': war/에 WEB-INF/를 만들고 WEB-INF/ 아래에 web.xml을 만든다.
'springapp/war/WEB-INF/web.xml':
1.3. Tomcat에 배포하기
이 Tutorial에서 계속 사용될 Ant 빌드 스크립트를 만들자.
이 빌드 스크립트에는 컴파일, 빌딩, 배포하는 타겟이 있고, 일부는 특정 서버에만 사용되는 것도 있다.
'springapp/build.xml': Tomcat이 아닌 다른 WAS를 사용한다면 빌드 스크립트 마지막 부분은 지워도 된다.
WAS의 hot deploy 특성에 따르거나, 직접 서버를 내렸다 올려야 한다.
IDE를 사용한다면 build.xml의 Tomcat 타겟에 에러 표시가 보일지도 모르는데 무시해도 된다.
Ant 빌드 스크립트가 개발을 좀더 쉽게 할 수 있게 도와 줄것이다.
여기에 사용된 대부분의 내용은 Ant나 Tomcat의 기본적인 내용이므로 자세한 설명은 생략한다.
빌드 파일 내용을 springapp/에 build.xml에 넣기만 하면 된다.
그리고 같은 위치에 build.properties를 만들고 서버가 설치된 위치를 맞춘다.
'springapp/build.properties':
당신이 시스템에 Tomcat을 설치하지 않았다면 Tomcat 소유주가 appserver.home/webapps/에 대해 모든 권한을 줘야 한다.
또는 소유주가 appserver.home/webapps/springapp/를 만들고 이 디렉토리에 모든 권한을 줘야 한다.
리눅스에서는 chmod a+rwx springapp 라는 명령어를 사용하면 모든 사용자에게 모든 권한을 줄수 있다.
'appserver.home/conf/tomcat-users.xml'에 사용자를 추가한다. 이제 모든 준비가 다 되었고 springapp/에서 ant 명령을 실행시킨다.
빌드하거나 배포하려면 deploy나 deploywar 타겟을 실행시킨다.
1.4. 어플리케이션 확인
${appserver.home}/bin/startup.bat 을 실행시켜서 Tomcat을 시작하자.
Tomcat이 우리가 만든 어플리케이션을 올렸는지 list 태스크로 확인할 수 있다.
브라우저로 http://localhost:8080/springapp/index.jsp을 열어보자.
1.5. Spring 프레임워크 다운로드
Spring Framework 2.5를 다운로드 받고 적당한 곳에 압축을 푼다.
1.6. web.xml 수정
springapp/war/WEB-INF/web.xml을 수정한다.
Front Controller인 DispatcherServlet을 설정한다.
나중에 설정할 정보에 기반하여 보내질 모든 요청을 처리한다.
이 서블릿 정의는 servlet-mapping 엔트리로 여기서 사용될 URL 패턴을 매핑한다.
우리는 htm 확장자를 가진 모든 URL을 springapp 서블릿으로 보내도록 설정한다.
'springapp/war/WEB-INF/web.xml':
springapp-servlet.xml을 springapp/war/WEB-INF/에 만든다.
이 파일은 DispatcherServlet에서 사용되는 빈에 대한 정의를 한다.
모든 웹 관련 컴포넌트가 사용할 WebApplicationContext이다. =-=> ???
이 파일의 이름은 web.xml 의 servlet-name 엘리먼트에 -servlet을 붙여서 만든다.
이것은 Spring Web MVC 프레임워크의 표준 명명법이다.
이제 /hello.htm 에 대한 빈을 설정하고 class는 springapp.web.HelloController로 하자.
이것은 /hello.htm 이라는 URL에 대한 요청을 controller가 처리하게 한다.
Spring Web MVC 프레임워크는 요청 URL과 처리할 객체를 매핑하는데 HandlerMapping 인터페이스 구현체를 사용한다.
DispatcherServlet과 달리 HelloController는 특정 페이지에 대한 요청을 처리한다.(Fowler는 이것을 Page Controller라고 한다.)
DispatcherServlet이 사용하는 기본적인 HandlerMapping은 BeanNameUrlHandlerMapping이다.
이 클래스는 빈이름을 요청의 URL과 매핑해서 DispatcherServlet이 어떤 컨트롤러를 호출할지 알려준다.
'springapp/war/WEB-INF/springapp-servlet.xml':
1.7. WEB-INF/lib에 라이브러리 복사하기
war/WEB-INF/lib/를 만들고 Spring 배포본에서 spring.jar, spring-webmvc.jar, commons-logging.jar를 복사해 넣는다.
이 라이브러리는 서버에 배포되고 빌드에 사용된다.
1.8. Controller 만들기
springapp.web 패키지에 HelloController를 만든다.
src/springapp/web/에 HelloController.java를 만든다.
'springapp/src/springapp/web/HelloController.java':
이것은 아주 기본적인 Controller 구현이다.
우리는 나중에 Spring에서 제공하는 Controller 구현체를 구현해서 확장할 것이다.
Spring Web MVC에서 Controller는 요청을 처리하고 ModelAndView를 리턴한다.
이 경우에는 hello.jsp이다.
이렇게 리턴한 모델은 ViewResolver에 의해서 수행된다.
우리는 명시적으로 ViewResolver를 지정하지 않았기 때문에 Spring에 기본적으로 제공된다.(view 이름에 해당하는 URL로 포워딩한다.)
이 핸들러로 실제로 요청이 왔는지 로거를 찍어본다.
Tomcat을 사용하면 로그가 appserver.home/log/catalina.out에 출력된다.
IDE를 사용하면 lib/의 jar파일을 빌드 패스에 추가해야 한다.
서블릿 컨테이너의 servlet-api.jar도 추가해야 HelloController.java가 제대로 컴파일된다.
1.9. Controller에 테스트 작성하기
테스트는 소프트웨어 개발에 있어서 필수적이다.
애자일 개발에 있어서도 핵심 practice이다.
controller에 복잡한 로직을 넣기 전에 테스트를 작성한다.
테스트는 개발이 진행됨에 따라 변경에 대한 신뢰를 줄수 있다.
springapp/ 아래에 test/를 만들어서 테스트를 작성한다.
HelloControllerTests 테스트 클래스를 만들고 JUnit의 TestCase를 상속한다.
단위 테스트는 handleRequest()가 리턴하는 뷰이름이 hello.jsp인지 확인한다.
'springapp/test/springapp/web/HelloControllerTests.java':
테스트를 실행시키려면, build.xml에 테스트 태스크를 추가한다.
우선 junit.jar를 복사해서 넣는다.
테스트를 컴파일하고 실행시키는 태스크를 하나로 두는 대신 buildtests와 tests로 나눈다.
IDE에서 테스트를 실행시키려면 junit.jar를 빌드 패스에 추가한다.
'springapp/build.xml':
애자일의 또다른 practice는 지속적인 통합이다.
빌드할 때마다 테스트를 실행시켜서 개발이 진행되면서 어플리케이션이 제대로 동작하는지 확인할 수 있다.
1.10. View 작성하기
이미 앞에 언급된대로 hello.jsp로 포워딩한다.
war/에 둔다.
'springapp/war/hello.jsp':
1.11. 어플리케이션 컴파일, 배포
depoy 타겟을 실행시키고 reload 타겟을 실행시키면 빌드하고 Tomcat을 리로드한다.
Ant 출력과 Tomcat 로그를 확인한다.
1.12. 어플리케이션 테스트
브라우저로 http://localhost:8080/springapp/hello.htm 으로 들어가본다.
1.13. 요약
1.1. 프로젝트 디렉토리 생성
모든 소스와 작성할 파일을 저장할 디렉토리를 springapp/라고 하자.
자바소스를 저장할 src/를 만든다.
어플리케이션을 패키징하고 배포할 WAR에 들어갈 모든 파일을 저장할 war/를 만든다.
war/에는 자바소스를 제외한 JSP 소스, 설정파일이 저장된다.
1.2. index.jsp 작성하기
아주 간단한 index.jsp를 war/에 작성하자.
index.jsp는 우리가 만드는 어플리케이션의 시작점이 된다.
'springapp/war/index.jsp': war/에 WEB-INF/를 만들고 WEB-INF/ 아래에 web.xml을 만든다.
'springapp/war/WEB-INF/web.xml':
1.3. Tomcat에 배포하기
이 Tutorial에서 계속 사용될 Ant 빌드 스크립트를 만들자.
이 빌드 스크립트에는 컴파일, 빌딩, 배포하는 타겟이 있고, 일부는 특정 서버에만 사용되는 것도 있다.
'springapp/build.xml': Tomcat이 아닌 다른 WAS를 사용한다면 빌드 스크립트 마지막 부분은 지워도 된다.
WAS의 hot deploy 특성에 따르거나, 직접 서버를 내렸다 올려야 한다.
IDE를 사용한다면 build.xml의 Tomcat 타겟에 에러 표시가 보일지도 모르는데 무시해도 된다.
Ant 빌드 스크립트가 개발을 좀더 쉽게 할 수 있게 도와 줄것이다.
여기에 사용된 대부분의 내용은 Ant나 Tomcat의 기본적인 내용이므로 자세한 설명은 생략한다.
빌드 파일 내용을 springapp/에 build.xml에 넣기만 하면 된다.
그리고 같은 위치에 build.properties를 만들고 서버가 설치된 위치를 맞춘다.
'springapp/build.properties':
# Ant properties for building the springapp
appserver.home=${user.home}/apache-tomcat-6.0.14
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib
deploy.path=${appserver.home}/webapps
tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret
appserver.home=${user.home}/apache-tomcat-6.0.14
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib
deploy.path=${appserver.home}/webapps
tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret
당신이 시스템에 Tomcat을 설치하지 않았다면 Tomcat 소유주가 appserver.home/webapps/에 대해 모든 권한을 줘야 한다.
또는 소유주가 appserver.home/webapps/springapp/를 만들고 이 디렉토리에 모든 권한을 줘야 한다.
리눅스에서는 chmod a+rwx springapp 라는 명령어를 사용하면 모든 사용자에게 모든 권한을 줄수 있다.
'appserver.home/conf/tomcat-users.xml'에 사용자를 추가한다. 이제 모든 준비가 다 되었고 springapp/에서 ant 명령을 실행시킨다.
빌드하거나 배포하려면 deploy나 deploywar 타겟을 실행시킨다.
1.4. 어플리케이션 확인
${appserver.home}/bin/startup.bat 을 실행시켜서 Tomcat을 시작하자.
Tomcat이 우리가 만든 어플리케이션을 올렸는지 list 태스크로 확인할 수 있다.
브라우저로 http://localhost:8080/springapp/index.jsp을 열어보자.
1.5. Spring 프레임워크 다운로드
Spring Framework 2.5를 다운로드 받고 적당한 곳에 압축을 푼다.
1.6. web.xml 수정
springapp/war/WEB-INF/web.xml을 수정한다.
Front Controller인 DispatcherServlet을 설정한다.
나중에 설정할 정보에 기반하여 보내질 모든 요청을 처리한다.
이 서블릿 정의는 servlet-mapping 엔트리로 여기서 사용될 URL 패턴을 매핑한다.
우리는 htm 확장자를 가진 모든 URL을 springapp 서블릿으로 보내도록 설정한다.
'springapp/war/WEB-INF/web.xml':
springapp-servlet.xml을 springapp/war/WEB-INF/에 만든다.
이 파일은 DispatcherServlet에서 사용되는 빈에 대한 정의를 한다.
모든 웹 관련 컴포넌트가 사용할 WebApplicationContext이다. =-=> ???
이 파일의 이름은 web.xml 의 servlet-name 엘리먼트에 -servlet을 붙여서 만든다.
이것은 Spring Web MVC 프레임워크의 표준 명명법이다.
이제 /hello.htm 에 대한 빈을 설정하고 class는 springapp.web.HelloController로 하자.
이것은 /hello.htm 이라는 URL에 대한 요청을 controller가 처리하게 한다.
Spring Web MVC 프레임워크는 요청 URL과 처리할 객체를 매핑하는데 HandlerMapping 인터페이스 구현체를 사용한다.
DispatcherServlet과 달리 HelloController는 특정 페이지에 대한 요청을 처리한다.(Fowler는 이것을 Page Controller라고 한다.)
DispatcherServlet이 사용하는 기본적인 HandlerMapping은 BeanNameUrlHandlerMapping이다.
이 클래스는 빈이름을 요청의 URL과 매핑해서 DispatcherServlet이 어떤 컨트롤러를 호출할지 알려준다.
'springapp/war/WEB-INF/springapp-servlet.xml':
1.7. WEB-INF/lib에 라이브러리 복사하기
war/WEB-INF/lib/를 만들고 Spring 배포본에서 spring.jar, spring-webmvc.jar, commons-logging.jar를 복사해 넣는다.
이 라이브러리는 서버에 배포되고 빌드에 사용된다.
1.8. Controller 만들기
springapp.web 패키지에 HelloController를 만든다.
src/springapp/web/에 HelloController.java를 만든다.
'springapp/src/springapp/web/HelloController.java':
이것은 아주 기본적인 Controller 구현이다.
우리는 나중에 Spring에서 제공하는 Controller 구현체를 구현해서 확장할 것이다.
Spring Web MVC에서 Controller는 요청을 처리하고 ModelAndView를 리턴한다.
이 경우에는 hello.jsp이다.
이렇게 리턴한 모델은 ViewResolver에 의해서 수행된다.
우리는 명시적으로 ViewResolver를 지정하지 않았기 때문에 Spring에 기본적으로 제공된다.(view 이름에 해당하는 URL로 포워딩한다.)
이 핸들러로 실제로 요청이 왔는지 로거를 찍어본다.
Tomcat을 사용하면 로그가 appserver.home/log/catalina.out에 출력된다.
IDE를 사용하면 lib/의 jar파일을 빌드 패스에 추가해야 한다.
서블릿 컨테이너의 servlet-api.jar도 추가해야 HelloController.java가 제대로 컴파일된다.
1.9. Controller에 테스트 작성하기
테스트는 소프트웨어 개발에 있어서 필수적이다.
애자일 개발에 있어서도 핵심 practice이다.
controller에 복잡한 로직을 넣기 전에 테스트를 작성한다.
테스트는 개발이 진행됨에 따라 변경에 대한 신뢰를 줄수 있다.
springapp/ 아래에 test/를 만들어서 테스트를 작성한다.
HelloControllerTests 테스트 클래스를 만들고 JUnit의 TestCase를 상속한다.
단위 테스트는 handleRequest()가 리턴하는 뷰이름이 hello.jsp인지 확인한다.
'springapp/test/springapp/web/HelloControllerTests.java':
테스트를 실행시키려면, build.xml에 테스트 태스크를 추가한다.
우선 junit.jar를 복사해서 넣는다.
테스트를 컴파일하고 실행시키는 태스크를 하나로 두는 대신 buildtests와 tests로 나눈다.
springapp/resourcs/devlib/를 두고 여기에 junit.jar를 넣는다.
build.xml에 다음의 내용을 추가한다.
<property name="resources.dir" value="resources"/>
<property name="devlib.dir" value="${resources.dir}/devlib"/>
...
<path id="devlib-classpath">
<fileset dir="${devlib.dir}">
<include name="*.jar"/>
</fileset>
</path>
buildtests, tests 타겟에 <classpath refid="devlib-classpath"/>를 추가한다.
build.xml에 다음의 내용을 추가한다.
<property name="resources.dir" value="resources"/>
<property name="devlib.dir" value="${resources.dir}/devlib"/>
...
<path id="devlib-classpath">
<fileset dir="${devlib.dir}">
<include name="*.jar"/>
</fileset>
</path>
buildtests, tests 타겟에 <classpath refid="devlib-classpath"/>를 추가한다.
IDE에서 테스트를 실행시키려면 junit.jar를 빌드 패스에 추가한다.
'springapp/build.xml':
애자일의 또다른 practice는 지속적인 통합이다.
빌드할 때마다 테스트를 실행시켜서 개발이 진행되면서 어플리케이션이 제대로 동작하는지 확인할 수 있다.
1.10. View 작성하기
이미 앞에 언급된대로 hello.jsp로 포워딩한다.
war/에 둔다.
'springapp/war/hello.jsp':
1.11. 어플리케이션 컴파일, 배포
depoy 타겟을 실행시키고 reload 타겟을 실행시키면 빌드하고 Tomcat을 리로드한다.
Ant 출력과 Tomcat 로그를 확인한다.
1.12. 어플리케이션 테스트
브라우저로 http://localhost:8080/springapp/hello.htm 으로 들어가본다.
1.13. 요약
- 설정이 제대로 되었는지 확인하기 위해 index.jsp를 만들었다. 나중에 실제 링크가 있는 페이지로 만들것이다.
- DispatcherServlet과 springapp-servlet.xml
- 지금은 단순히 ModelAndView만 리턴하는 HelloController. 나중에 model을 구현한다.
- 뷰이름을 검증하기 위한 HelloControllerTests
- 아주 간단한 hello.jsp
- 파이어폭스에서 임시파일 확인 주기 설정 방법
- 카테고리 없음
- 2010. 1. 8. 18:24
Trac에 올린 파일을 다운받는데 이전 파일이 계속 열리는 경우가 있다.
about:config
browser.cache.check_doc_frequency
3을 1로 변경한다.
http://www.webmini.net/49543
http://forums.mozilla.or.kr/viewtopic.php?f=2&t=2772
about:config
browser.cache.check_doc_frequency
3을 1로 변경한다.
http://www.webmini.net/49543
http://forums.mozilla.or.kr/viewtopic.php?f=2&t=2772
Recent comment