티스토리 툴바

물빛미르의 푸른 바다향기

블로그 이미지
천천히 오랫동안 채워나갈 공간... 사랑하고 살아가고, 죽음앞에 당당하도록!!!
by 물빛미르
  • 29,967Total hit
  • 16Today hit
  • 52Yesterday hit

'Work'에 해당되는 글 20건

  1. 2012/04/15
    php5.3 으로 업그레이드시 자동 호환성 체크기
  2. 2012/02/17
    2011.9월 BUILD 컨퍼런스 키노트
  3. 2012/01/30
    카산드라
  4. 2011/11/12
    Spring & Ibatis framework 5 - 2011.11.12
  5. 2011/11/05
    Spring & Ibatis framework 4 - 2011.11.05
  6. 2011/10/31
    아파치 재시작 없이 설정 적용하기!!
  7. 2011/10/29
    Spring & Ibatis framework 3 - 2011.10.29
  8. 2011/10/26
    Javascript Frameworks
  9. 2011/10/22
    Spring & Ibatis framework 2 - 2011.10.22
  10. 2011/10/15
    Spring & Ibatis framework 1 - 2011.10.15

[원문]

http://techblog.wimgodden.be/2010/06/24/automated-php-5-3-compatibility-testing-for-your-old-code/


 

[참조]

http://www.php.net/manual/en/migration53.new-features.php : php5.3 버전에서 달라지는 것들

 

http://code.zikula.org/phpcs/wiki/installation : PHP_CodeSniffer 설치(pear)


 

PHP_CodeSniffer를 기반으로 한 PHP5.3 으로 버전업시 발생되는 문제점을 확인하여 리스트해준다.

 

우선, 현재 테스트 환경은 PHP5.3 이 깔려 있어야 한다.

 

[설치순서]

1. pear 를 통한 PHP_CodeSniffer 1.3 이후 버전 설치 (http://pear.php.net/PHP_CodeSniffer)

 

2. PHP5.3 호환성 체크용 룰셋 다운받기 (https://github.com/wimg/PHP53Compat_CodeSniffer/downloads)


우선, pear 리스트에 PHP_CodeSniffer가 설치되어 있는 지 확인하고 없거나, 버전이 1.2.2 stable로 되어 있는 경우, 이를 1.3.0RC1으로 재설치 한다.

 

> pear list                    => 목록확인

> pear install PHP_CodeSniffer-alpha         => 설치후 PHP_CodeSniffer 1.3.0RC1 beta 로 설치됨

 

다음, pear 설치 디렉토리로 이동한 뒤에 호환성 체크 룰셋 적용한 파일들을 다운

 

> cd C:\Server\PHP\PEAR                      : pear 디렉토리

> cd PHP\CodeSniffer\Standards              : CodeSniffer 디렉토리

> git clone git://github.com/wimg/PHP53Compat_CodeSniffer.git PHP53Compatibility


 

git 가 설치되어 있지 않다면 파일 다운 후 Standards 디렉토리에 PHP53Compatibility디렉토리로 이름변경하고 추가(https://github.com/wimg/PHP53Compat_CodeSniffer/downloads)

설치된 PHP53Compatibility 디렉토리 안에는 아래의 파일과 디렉토리가 있게 된다.

 

README.markdown

ruleset.xml

Sniffs 디렉토리

 

[실행]

> phpcs --standard=PHP53Compatibility <테스트할 php source 디렉토리>

 

만약, 테스트할 php 코드가 .php뿐만 아니라 .html .inc 도 있을 경우 --extensions 옵션을 추가

 

> phpcs --extensions=php,html,inc --standard=PHP53Compatibility <테스트할 php source 디렉토리>


[실행결과]

 

FILE: C:\workspacePHP\test.php
------------------------------------------------------------------------------
FOUND 0 ERROR(S) AFFECTING 1 LINE(S)
------------------------------------------------------------------------------
 1 | WARNING | No PHP code was found in this file and short open tags are not
   |                | allowed by this install of PHP. This file may be using short
   |                | open tags but PHP does not allow them.
------------------------------------------------------------------------------

 

이렇게 나온 경우는 해당 php 파일에 short open tag(<?)를 사용했거나, php 코드가 없는 경우

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

2 | WARNING | The use of function ereg() is discouraged; use preg_match() instead

 

4 | WARNING | The use of function split() is discouraged; use preg_split() instead


9 | WARNING | The use of function ereg_replace() is discouraged; use preg_replace() instead


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


이런 식으로 호환성 결과가 나온다.

파일이 많을 경우 지체되는 경우도 있어, 디렉토리별로 실행하고 결과를 파일로 남겨서 살펴보는 쪽을 추천한다.

저작자 표시 비영리 변경 금지

'Work > Etc' 카테고리의 다른 글

php5.3 으로 업그레이드시 자동 호환성 체크기  (0) 2012/04/15
Javascript Frameworks  (0) 2011/10/26
trackback 1 AND comment 0

마이크로소프트에서 윈도우 7을 지나서 윈도우 8을 발표했다.
키노트 영상으로 자세히 소개하고 있는데 상당히 매력적이다.
점점 더 가벼워지고 이동성이 높아진 다양한 하드웨어들을 볼때 윈도우8의 반응은 더 뜨거울거라는 생각이 든다.

각 동영상은 친절하게 한국어 자막이 달려있다. ㅋㅋ
버퍼링 시간이 조금 걸리는 편이지만 인내를 가지고 보면 매력적인 윈도우8을 만날 수 있다.

 


BUILD 컨퍼런스 키노트 Day 1-1

BUILD 컨퍼런스 키노트 Day 1-2

BUILD 컨퍼런스 키노트 Day 1-3

BUILD 컨퍼런스 키노트 Day 1-상

BUILD 컨퍼런스 키노트 Day 1-하

BUILD 컨퍼런스 키노트 Day 2 

메트로 스타일 앱 개발을 위한 8가지 팁 

p.s 동영상 자체를 가져오려 했으나...tistory랑 충돌이 나서 그냥 링크로~
저작자 표시 비영리 변경 금지
trackback 0 AND comment 0
카산드라의 거울이 아니고 SQL을 사용하지 않는 noSQL DB의 이름이다.

http://bcho.tistory.com/440 

http://blog.evanweaver.com/2009/07/06/up-and-running-with-cassandra/

기존 DB가 2차원 배열 형태였다면 이녀석은 객체형태라고 보면 이해가 간단하다.
객체니까 당연히 객체도 담을 수 있으니 데이터를 담는 방법이 매우 자유로워진다.
DB를 설계하다보면 각 데이터에 따라서 달라지는 정보를 담아야 하는 경우가 생기게 되는데 그 경우에 기존 DB는 구분자를 두어서 조합한 데이터를 텍스트형에 밀어넣어버리거나 아예 참조키를 가지고 키=값으로 이루어진 서브 정보 테이블을 두어야 했다.
하지만 객체형인 구조에서는 그럴 필요가 없다. 각 데이터에 따라 필요한 정보를 자유롭게 구성해 담을 수 있다는것이 매우 매력적으로 다가온다.

대충만 훝어보았는데 시간을 내어서 조물락 조물락 토이 플젝이라도 하나 해봐야겠다. 
저작자 표시 비영리 변경 금지
trackback 0 AND comment 0

드디어...마지막 시간이다!!!!!

첫 예제는 Annotation 기반 AOP 작업.
AOP로 세션관리를 하는 코드를 생성해 본다.

1. 환경설정
- web.xml 에 servlet 설정을 한다. 이제는 좀 익숙해져가는듯...^^
<servlet>
   <servlet-name>springapp</servlet-name>
   <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
  </servlet> 
 
  <servlet-mapping>
   <servlet-name>springapp</servlet-name>
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>

- springapp-servlet.xml 파일을 생성해준다.
- 필요한 lib 파일을 복사해서 넣어준다.
- DB 연결이 필요한경우 index.html 을 실행해서 Server.xml에  context를 생성해준 뒤 Context 내부에 Resource 설정을 넣어준다.
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="30" maxWait="10000" name="사용할 이름" password="계정비번" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:XE" username="계정명"/>

2. AOP
- 세션을 요청할 session_req.jsp파일을 생성해 준뒤 세션 값을 가지고 접근하는 경우 링크와 없이 접근하는 경우 링크를 생성해 준다.

- 팩키지를 구분하여 컨트롤러 클래스를 생성한 뒤 @Controller Annotation을 붙여준다. 컨트롤러 내부에 session_req.jsp 에서 링크로 걸어준 .do 파일들에 대한 맵핑을 @RequestMapping 을 붙여 메소드를 생성해준다.
메소드는 ModelAndView를 리턴해야하고, request와 ModelAndView를 파라메터로 가지도록 해야한다.
public ModelAndView session_action(HttpServletRequest request, ModelAndView mav){}

- aop 팩키지를 만들어서 내부에 aop클래스를 생성하는데 인터페이스나 클래스의 상속없이 일반 클래스를 생성하고 클래스명 위에 @Aspect 를 붙여서 Aspect 클래스로 만들어준다.
- 세션 체크는 동작 전에 실행되어야 하므로 @Before 어노테이션을 붙여서 메소드를 생성해 주면서 메소드를 실행할 JoinPoint를 입력해준다. 이번 예제에서는 public 으로 시작하는 메소드 중 리턴여부와 상관없이 session_로 시작하는 파라메터를 가지는 모든 메소드 실행 전에 실행하도록 설정을 넣어주었다.
@Before("execution(public * session_*(..))")

- 메소드는 JoinPoint를 파라메터로 받는데 이 JoinPoint를 통해서 실행 메소드의 파라메터 값을 가져올 수 있다. Object 배열로 joinPoint.getArgs()를 받으면 실행 메소드의 파라메터가 순서대로 객체로 반환된다. 형변환을 통해 파라메터를 변환하고 필요한 정보를 뽑아서 세션 처리를 한다.

@Before("execution(public * session_*(..))")
public void sessionCheck(JoinPoint joinPoint){
  Object[] args = joinPoint.getArgs();
  
  HttpServletRequest request = (HttpServletRequest)args[0];
  ModelAndView mav = (ModelAndView)args[1];
  HttpSession session = request.getSession();

  Object login = session.getAttribute("name");
  
  if(login == null){
   mav.setViewName("session_input.jsp");
  } else {
   mav.setViewName("session_success.jsp");
  }//if - login
}

- 세션 처리에 따라 필요한 jsp 파일을 생성해 준다.

- 가장 중요한 servlet 파일 설정!
이전에 Aop 실습시에는 인터페이스를 하나 생성했었는데, 이유는 무조건 인터페이스를 상속받아야만 프록시가 생성되기 때문이었다. 이번에는 aop의 autoproxy 태그를 선언하여 처리한다.
 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
 <aop:config proxy-target-class="true"></aop:config>
- 마지막으로 컨트롤러 클래스와 AOP 클래스 빈을 등록하면 끝~!!!

저작자 표시 비영리 변경 금지
trackback 0 AND comment 0
오늘부터 Spring 3.0 버전으로 교육을 진행한다.
3.0은 Annotation 기반으로 2.5에서 설정하던 많은 사항들이 간소화 되었다.
기본적인 MVC, DI, AOP 패턴등의 구조는 같지만 설정 부분들이 매우 간소화 되어 있어서 사용이 훨씬 편리해졌다.

1. 환경설정
- 3.0 lib 에서 필요한 파일들을 프로젝트의 lib에 넣어준다.
- web.xml 에 springapp 설정부분을 넣어준다.
<servlet>
   <servlet-name>springapp</servlet-name>
   <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>springapp</servlet-name>
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>

- Server 에서 server.xml 파일을 열어서 Context 태그 내부에 Resource를 넣어준다.
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/oracle" password="1234" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:XE" username="spring"/>

- <servlet-name>-servlet.xml 파일을 생성하고 필요한 정보를 설정해준다.
DB에 접근을 위해 jndi 설정을 넣어주고, 이 데이터 소스를 받아서 ibatis로 연결해주기 위한 sqlMapClient 와 ibatisTemplate 을 생성해준다.

<bean id="ibatisTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
  <property name="sqlMapClient" ref="sqlMapClient"/>
 </bean>
 
 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFctoryBean">
  <property name="dataSource" ref="springDataSource"/>
  <property name="configLocation" value="/WEB-INF/SqlMapConfig.xml"/>
 </bean>
 
 <bean id="springDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/oracle"/>
  <property name="resourceRef" value="true"/>
 </bean>

2. Controller
- 2.5에서는 컨트롤러의 동작 내용에 따라서 AbstractController나 AbstractCommandController, SimpleFormController 등을 상속해주어야 하던것을 3.0에서는 @Controller를 선언해주는것만으로 설정이 끝난다.

- 3.0에서는 DefaultAnnotationHandlerMapping을 기본으로 사용할 수 있다. 이전처럼 UrlHandlerMapping 을 사용하고 싶거나 다른 맵핑 방식을 원하는경우 물론 지정해서 가능하다.
다른 매핑을 지정하는 경우에도 annotation을 사용할 수 있는데, 이때는 DefaultAnnotationHandlerMapping도 명시적으로 선언해 주어야 한다.

- 컨트롤러로 사용할 클래스를 생성하고 클래스 위에 @Controller를 써서 컨트롤러 클래스로 지정한다. 컨트롤러를 메모리에 올리기 위해 xml파일에 컨트롤 클래스를 적어주고 DB 처리를 위해 Dao를 넣어준다.
<bean id="boardController" class="kosta.controller.BoardAnnotationController">
  <property name="boardDao" ref="boardDao"/>
</bean>

- 컨트롤러 파일이 여러개가 되는 경우 각각의 파일을 모두 지정할 필요없이 팩키지 전체를 등록할 수도 있다.
<context:component-scan base-package="com.kosta.board.controller" />

- 메소드 상단에 @RequestMapping 어노테이션으로 매핑을 설정한다. 이때 파일명만 넣어서 단순하게 @RequestMapping("/list.do") 형태로 설정 하는 방법도 있고, GET/POST의 메소드 전송방식에 따라서 같은 파일로 action처리를 하고자 하는 경우는 value와 method를 선언해주면 된다.
@RequestMapping(value="/insert.do", method=RequestMethod.POST)

- 메소드에서 간단한 파라메터를 넘겨받아서 처리해야 하는경우 @RequestParam 을 이용해서 처리한다.
public ModelAndView detail(@RequestParam("seq") Integer seq)

- Form 전송 데이터의 경우는 폼 값에 맞춘 객체를 생성해서 메소드의 파라메터로 지정해 두면 자동으로 폼 입력 데이터값을 가진 객체가 컨트롤러로 넘어오게 된다.
public ModelAndView update_action(Board board)
 
파라미터 타입 설명
HttpServletRequest, HttpServletResponse 서블릿 API
java.util.Locale 현재 요정에 대한 Locale
InputStream, Reader 요청 컨텐츠에 직접 접근할 때 사용
OutputStream, Writer 응답 컨텐츠를 생성할 때 사용
@PathVariable 어노테이션 적용 파라메터 URI 템플릿 변수에 접근할 때 사용
@RequestParam어노테이션 적용 파라메터 HTTP 요청 파라미터를 매핑
@RequestHeader어노테이션 적용 파라메터 HTTP 요청 헤더를 매핑
@CookieValue어노테이션 적용 파라미터 HTTP 쿠키 매핑
@RequestBody 어노테이션 적용 파라미터 HTTP 요청의 몸체 내용에 접근할 때 사용
Map, Model, ModelMap 뷰에 전달할 모델 데이터를 설정할 때 사용
커맨드 객체 HTTP 요청 파라미터를 저장 한 객체, 기본적으로 클래스 이름을 모델명으로 사용 @ModelAttribute 어노테이션 설정으로 모델명을 설정할 수 있음
Errors, BindingResult HTTP 요청 파라미터를 커맨드 객체에 저장한 결과, 커맨드 객체를 위한 파라미터 바로 다음에 위치
SessionStatus 폼 처리를 완료 했음을 처리하기 위해 사용. @SessionAttributes 어노테이션을 명시한 session속성을 제거하도록 이벤트를 발생 시킨다.



3. DAO
- DAO의 경우 지난번 ibtis 실습때는 sqlMapClient를 받아서 사용했으나 이번에는 ibatisTemplate를 받아서 사용한다. 역시 servlet.xml파일에서 Dao파일 설정 태그에 DI 방식으로 미리 생성해둔 ibatisTemplate객체를 넣어준다.
- ibatis 쿼리용 xml파일은 지난시간에 실습했던 xml파일을 재활용했다. ^^

4. Validation
- org.springframework.validation.Validator 를 상속받아서 Validation클래스를 생성해준다. 클래스를 생성하면 기본으로 두개의 메소드가 오버라이드 된 상태로 나타난다.
- supports : Validation을 체킹할 클래스를 확인하는 메소드
체킹할 클래스의 isAssignableFrom 을 확인해서 리턴값을 돌려주는 간단한 소스를 작성해준다.
if(Board.class.isAssignableFrom(arg0)){
   return true;
  }
 - validate : 실제로 Validation을 확인해주는 클래스
if 문으로 필요값의 null여부를 확인한 뒤
errors.rejectValue("title", "required");를 호출해준다. 이 문장은 message.validation.properties파일 내에 선언해둔 메시지 중 required.title 로 선언된 메시지를 가져와 에러 메시지로 출력해주게 된다.

- jsp파일에서는 tablib에 spring과 form을 선언해 주고
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Form 태그 바로 위에 바인딩을 걸어준다.
<spring:hasBindErrors name="board"/>
Validation체크 후 에러 메시지를 보여줄 부분에다가는 <form:errors path="board.title"/> 이라고 코딩해주면된다.

5. Tiles
- 템플릿으로 사용할 파일들을 tiles 팩키지에 우선 등록을 해준 뒤 설정에 들어간다.
header, footer 등 중복으로 사용할 모듈을 생성해주고 template으로 사용할 파일에서 모양을 잡아준다.
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
태그 라이브러리로 prefix를 선언해 준뒤 모양 내의 필요한 곳에서 <tiles:insertAttribute name="header"/>
형태로 선언해 주면 된다. 여기서 표기한 hearder라는 이름은 아래에서 설정할 xml파일에 설정해둔 이름값이며 해당태그의 value로 설정된 파일을 가져와서 뿌려주게된다.

- xml 파일 내부에 템플릿으로 사용할 파일들을 등록해줘야 한다.
기본으로 사용할 템플릿의 모양으로 base_layout 을 만들어주고
<definition name="base_layout" template="/tiles/template.jsp">
  <put-attribute name="header" value="/tiles/header.jsp"/>
  <put-attribute name="footer" value="/tiles/footer.jsp"/>
 </definition>

Body 부분만 호출에 따라서 다른 파일을 가져오도록 템플릿을 설정해 주면된다.
이때 매번 반복될 부분을 선언해둔 클래스를 extends로 지정해주면 다시 선언할 필요가 없다.
<definition name="insert_form" extends="base_layout">
  <put-attribute name="body" value="/board/insert_form.jsp"></put-attribute>
 </definition>

- 이제 설정한 xml파일을 servlet.xml 에 설정해준다.
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
   <list>
    <value>/WEB-INF/tiles2def.xml</value>
   </list>
  </property> 
 </bean>
저작자 표시 비영리 변경 금지
trackback 0 AND comment 0
apache graceful

아파치설치디렉토리/bin/apachectl restart
아파치설치디렉토리/bin/apachectl -k graceful 

보통 아파치 설정을 변경하면 아파치 재시작을 하게 된다.
문제는 이게 한 서버내에 여러 사이트가 있는 경우 다른 사이트에 영향을 미치게 된다는것... 그래서 찾아보니...
graceful 이 있었다.
graceful 은 conf 파일을 읽어서 다시 시작하기 때문에 연결이 종료되지 않는다.
restart의 경우는 서버를 멈췄다가 재시작하기때문에 연결이 종료되어 버린다.

하지만, 모듈을 추가하는 등의 작업시에는 반드시 restart를 해줘야 한다. 

* httpd 를 사용해서 restart를 하는 경우 -k 옵션을 제외한다.
$ /etc/init.d/httpd graceful
이렇게만 명령을 내리면 된다. ^^*

참고,
http://httpd.apache.org/docs/2.0/ko/stopping.html 
저작자 표시 비영리 변경 금지
trackback 0 AND comment 0
오늘은 하루동안 Ibatis를 진행한다.
iBatis란 SQL 실행 결과를 자바빈즈 혹은 Map 객체에 매핑해 주는 Persistence 솔루션으로 SQL을 소스코드가 아닌 XML로 따로 분리해 관리하도록 지원해준다.

1.iBatis 설치
http://ibatis.apache.org/java.cgi 에서 다운을 받는다.
압축을 풀면 lib 디렉토리에 api가 있다.

2. sqlmap-config.xml
- sqlmap-config에서 sqlmap.xml파일을 포함하고 sqlmap.xml 안에 Mapstatement를 가지고 있게 되는데 이 Mapstatment을 실제로 스프링에서 사용하게 된다.

- sqlmap-config.xml 파일은 커넥션 정보와 사용할 sqlmap파일에 대한 정보를 가지는 두가지 역할을 한다.

-sqlmap.xml 파일은 result map 과 실제 사용할 쿼리문을 담고 있다.

3. 환경설정
- java perspactive에서 java 프로젝트를 생성한 후 Build path 설정에서 External Lib로 압축을 풀어둔 ibatis-2.3.0.677.jar 파일을 추가해준다.
DB연결을 위해 ojdbc14.jar파일도 추가해 주어야 한다
- 샘플을 가지고 실습을 해 보기 위해 ibatis폴더 내의 simple_example 폴더로 들어가서 com폴더를 프로젝트 내 src 아래로 추가해준다.
- Quantum perspective 환경에서 사용할 테이블을 생성해 준다.
 
4. sqlmap-config 설정
- transactionManager 태그에 DB환경에 맞추어 변수값을 설정해 준다.
기존에 추가해둔 Servers아래 server.xml 파일을 열면 설정된 값을 확인 할 수 있으므로 복사해서 값을 설정해 주도록 한다.
<transactionManager type="JDBC" commitRequired="false">
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>
      <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:XE"/>
      <property name="JDBC.Username" value="spring"/>
      <property name="JDBC.Password" value="1234"/>
    </dataSource>
  </transactionManager>
-  사용할 sqlmap 파일을 연결해 주어야 한다. 샘플에는 기본으로 Account.xml이 연결되어 있음을 확인 할 수 있다. 이 파일을 원하는 파일 명으로 변경해주고 해당 xml파일을 생성해주어야 하는데 실습에서는 기존의 Account.xml파일을 rename하고 파일 내용을 수정해서 사용했다.
<sqlMap resource="com/mydomain/data/Member.xml"/>

5. sqlmap
- sqlmap으로 사용할 파일 내부에는 기본적으로 select, insert,update, delete 가 정의되어 있다. 이렇게 sqlmap 내부에 정의되는 메소드들을 mapstatement라고 한다.
sqlmap으로 사용하는 파일은 사용하지 않는 메소드라도 오류가 있으면 정상적으로 작동되지 않으므로 모든 메소드를 제대로 작성해 주거나 사용하지 않을 메소드는 우선 주석처리를 해 주어야 한다.

- sqlmap에서 주고받을 객체로 일반 자바클래스(POJO)를 생성해주고 자바클래스에서 정의해둔 프로퍼티를 insert 문의 value로 넣어주면 된다. insert 메소드에 id로 지정한 이름과 DAO에서 메소드를 호출할때 넘겨주는 id값이 같아야 한다. 태그의 내부에는 실제 쿼리문이 들어간다.
<insert id="insertMember" parameterClass="Member">
insert into Member (
      MEM_ID,
      MEM_NAME,
      MEM_PASSWD,
      MEM_TEL,
      MEM_EMAIL,
      MEM_COMMENT
     
    ) values (
      #id#, #name#, #passwd#, #tel#, #email#, #comment#
    )
</insert>

- select의 경우 테이블의 필드명과 클래스의 변수명이 다를때 결과값의 매핑을 위해 resultMap 을 선언해서 쓸 수 있다.
<resultMap id="MemberResult" class="Member">
    <result property="id" column="MEM_ID"/>
    <result property="name" column="MEM_NAME"/>
    <result property="passwd" column="MEM_PASSWD"/>
    <result property="tel" column="MEM_TEL"/>
    <result property="email" column="MEM_EMAIL"/>
    <result property="comment" column="MEM_COMMENT"/>
  </resultMap>

- select의 결과값은 테이블명이 같은 경우나 쿼리 자체에서 알리아스로 지정해서 매핑을 해준 경우라면 resultClass, 그렇지 않고 resultMap을 이용한 매핑이 필요하다면 resultMap 을 선언해 준다.
<select id="selectMemberById" parameterClass="String" resultMap="MemberResult">
    select
      *
    from Member
    where MEM_ID = #id#
  </select>

- SQL문 생성 태그
중복으로 사용되는 sql문을 설정한뒤 include해서 사용할 수 있다.
<sql id="select">
select * from order
</sql>

<select id=“selectOrderById resultClass="map">
<include refid="select" />
where order_id = #orderId#
</select>


6. 자바 클래스
- ibatis에서 맵핑해줄 자바빈으로 사용할 클래스는 매우 간단하게 생성한다. 생성한 테이블의 필드명과 일치하는 프로퍼티들을 작성해주고 eclipse의 코드 생성 기능을 이용해 getter와 setter를 생성해준다.
- 역시 코드생성 기능을 이용해 toString 메소드를 생성해 주면 끝!

7. DAO
- DAO에서는 sqlMapClient 객체를 통해서 sqlMapConfig.xml파일을 가져오게 되고 이 객체를 통해 최종적으로 sqlmap 파일 내부의 Mapstatement(sql)를 접근한다.
이 sqlMapClient객체가 모든 쿼리 질의시에 미리 생성이 되어 있어야 하기때문에 static으로 정의해준다.

private static SqlMapClient sqlMapper;

static {
    try {
      Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
      reader.close();
    } catch (IOException e) {
      // Fail fast.
      throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
    }
  }

- insert
미리 생성해둔 SqlMapClient를 통해서 sqlmap의 mapstatement를 콜한다.
이때 데이터를 넘겨주는 클래스로는 이미 생성해둔 자바 클래스를 넘긴다.
mapstatement를 콜할때 넘겨주는 첫번째 인자는 mapstatement의 id값이므로 xml상의 id값과 맞춰준다.
sqlMapper.insert("insertMember", Member);

- select
select는 queryForList 와 queryForObject 두가지로 나뉜다. List는 당연히 목록 및 검색 결과를 보여주기 위해 사용하는것으로 2개 이상의 데이터를 결과 클래스들을 담은 List를 리턴한다. Object 는 파라메터 값을 넘겨서 상세보기를 제공할때 사용한다.

return sqlMapper.queryForList("selectAllMembers");
return (Member) sqlMapper.queryForObject("selectMemberById", id);

8. Dynamic 태그
조건에 따라서 where절을 동적으로 구성할 필요가 있는 경우 사용하는 태그이다.
저작자 표시 비영리 변경 금지
trackback 0 AND comment 0
http://mootools.net

http://yuilibrary.com/ 

둘다 jQuery 형태의 문법을 이용해 만들어져 있다. 
도입을 고려해보아도 좋을듯... 
저작자 표시 비영리 변경 금지

'Work > Etc' 카테고리의 다른 글

php5.3 으로 업그레이드시 자동 호환성 체크기  (0) 2012/04/15
Javascript Frameworks  (0) 2011/10/26
trackback 0 AND comment 0

두번째 교육...
어제 워크샵을 양평으로 갔다가 일정을 마무리하고 밤에 나와서...피곤해 죽을거 같다.
오늘 수업... 잘 들을 수 있어야 하는디...큰일..ㅋ.ㅋ

오늘은 MVC를 이용해 간단한 게시판을 하나 생성해본다.

1. 프로젝트 시작
- Dynamic web project 를 생성한다
- web.xml 에 servlet 을 정의해준다.
<servlet>
   <servlet-name>springapp</servlet-name>
   <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>springapp</servlet-name>
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>
- 환경설정 용 xml 파일은 servlet-name과 이름을 같게(servlet명-servlet.xml)해서 생성해주면 알아서 설정파일을 읽어준다. 따라서 springapp-servlet.xml 로 파일을 생성해서 WEB-INF 폴더 안에 넣어준다.

- 필요한 Lib파일들을 lib에 추가해준다. spring.jar를 비롯한 modules아래 파일과 기타 필요한 파일들을 추가해주고 JRE System Library에 jstl.jar, standard.jar 가 없는 경우 해당 파일도 추가해준다.

2. DB 설정
- com.quantum.feature_3.3.0.2.bin.dist.zip 의 압축을 풀어 안에 있는 두개의 폴더를 eclipse폴더 안에 복사해주고 eclipse를 재실행한다. 재실행 후 이클립스 우측 상단의 perspective 설정 부분에 new 를 클릭해서 Others로 들어가보면 Quantum 이 생성된것을 확인 할 수 있다. Quantum View 선택 후 좌측 Database Bookmarks에서 new Bookmark를 실행한다.

- Add > Add External Jar를 선택하여 ojdbc14.jar 를 추가해줘야 하는데 이 파일은 C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib 아래 위치해 있다. (찿기 쉽게 C:\Tomcat6 폴더 아래로 복사해주자 ㅋㅋ)
확인 후 Class선택 부분을 눌러서 oracle.jdbc.driver.OracleDriver를 선택해주자.
다음으로 계정정보 입력창이 나오게 되는데 계정정보를 입력하고 확인을 해주면 좌측 Database Bookmarks에 설정한 이름으로 DB북마크가 생성된것을 확인할 수 있다.

- 사용할 데이터 베이스를 선택하고 board에 사용할 테이블, 시퀀스 등을 생성해서 환경을 설정해준다.

- oracle 10g 메뉴에서 Database 홈페이지로 이동을 눌러 DB홈에서 계정 설정을 맞춰서 생성해주어야 한다.
(DB는 원하는 DB의 플러그인만 이클립스에 설치해주면 다른 DB로 교체 가능하다)

- J2E perspective로 돌아가서 Servers>server.xml을 열어보면 파일 가장 하단에 현재 프로젝트에 대한 Context가 설정되어 있는것을 확인할 수 있다. Context안에 서버 리소스 설정을 해준다.
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/oracle" password="계정비번" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:DB명" username="계정명"/>

3. Controller
- insert_form.do를 맵핑하기 위한 bean을 설정해준다.
<bean name="/insert_form.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
       <property name="viewName" value="/board/insert_form.jsp" />
</bean>

- form에서 데이터를 컨트롤러로 넘겨주기위해서는 Command 객체가 필요하다.
따라서 이 Command객체를 사용할 수 있는 AbstractCommandController로 InsertController 클래스를 생성해 준다.

- InsertController 에서 사용할 command 객체를 연결해준다.
form에서 controller로 데이터를 넘기는 객체를 command객체, DB에서 controller로 데이터를 넘기는 객체를 DTO라고 하는데 정석은 두 객체를 따로 생성해주어야 하나 실습 편의사 DB의 column명과 form의 name값을 일치시켜서 하나의 클래스(Board)로 두 객체의 역활을 담당하도록 하는걸로 진행한다.
따라서 InsertController에서 사용할 Command객체로 Board를 연결해준다.
<bean name="/board_insert.do" class="kosta.controller.InsertController">
       <property name="commandClass" value="kosta.model.Board" />
</bean>

4. DI 패턴으로 DAO 받아오기
- Jndi 객체 생성
org.springframework.jndi.JndiObjectFactoryBean 클래스의 빈을 선언해준다. property로 jndiName을 설정해줘야 하는데 Server.xml에서 설정해준 Resource 의 name값을 value로 넣어준다.
외부 리소스를 사용하는 것이기 때문에 resourceRef 를 true로 설정해줘야한다.
<bean id="springDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
       <property name="jndiName" value="jdbc/oracle" />
       <property name="resourceRef" value="true" />
</bean>

- Jdbc Template 객체 생성
생성한 Jndi 객체를 받는 org.springframework.jdbc.core.JdbcTemplate 객체를 생성해 준다. dataSource로 위에서 생성한 Jndi의 id값을 넣어주는 이때 객체를 받는 것이기 때문에 value가 아닌 ref로 선언해 줘야한다
<bean id="springJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
       <property name="dataSource" ref="springDataSource" />
</bean>

- DAO에 생성한 jdbc객체를 프로퍼티 방식으로 넘겨준다. 이때 넘겨줄 클래스의 변수명이 property의 name값과 일치해야 한다.
<bean id="boardDao" class="kosta.model.BoardDao">
       <property name="myJdbcTemplate" ref="springJdbcTemplate"/>
</bean>

- 이제 InsertController객체에서 생성한 DAO를 받아서 사용할 수 있도록 역시 DI패턴의 프로퍼티 방식으로 DAO를 넘겨주자. 위에서 선언한 InsertController 빈에 property하나만 추가해주면 된다. 이때도 InsertController 내부에 선언한 프로퍼티명과 일치해야 한다. ref에는 위에서 생성한 jdbc를 받은 DAO객체의 id값을 넣어주면 된다.
<property name="boardDao" ref="boardDao"></property>

5. List
- 글 작성 후 리스트로 이동할때는 데이터를 가지고 이동할 필요가 없기때문에 리다이렉트를 넣어서 새로운 ModelAndView를 생성해 리턴한다.
return new ModelAndView("redirect:/board_list.do");

- ListController 클래스의 경우에는 Command를 받아야 할 필요가 없으므로 AbstractController를 상속받거나 일반 Controller 인터페이스를 구현해주어도 된다.
이번에는 인터페이스 구현상식으로 작업을 진행했다.

- BoardDao의 list 메소드 생성
boardDorg.springframework.jdbc.core.RowMapper 를 이용해 데이터를 List형태로 리턴받는다. RowMapper를 inner class로 구현하는데 override 메쏘드로 mapRow가 자동 생성된다. command 겸 DTO로 이용할 Board 객체를 생성해서 set을 이용해 값을 셋팅해주는 소스를 작성하면 RowMapper가 알아서 List에 자동으로 add해서 리스트를 돌려주게 된다

- ListController에서 Dao로 부터 받은 list와 view를 지정해서 ModelAndView객체를 넘겨주면 그 객체를 받아서 view를 구현해 준다.

- list.jsp 파일
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
상단에 위 소스를 선언해 주고 루프가 들어가야 할 부분을 <c:forEach>로 감싸주어 구현하면 되는데 이때 items에 MAV로 부터 넘겨준 list를 선언해준다.
<c:forEach var="board" items="${list }">
       <tr>
              <td>${board.seq }</td>
              ...
       </tr>
</c:forEach>

6. View
- myJdbcTemplate.queryForObject 메소드를 통해 조건에 해당하는 데이터를 가지고 온다.
board = myJdbcTemplate.queryForObject(sql, value, mapper);

7. SimpleFormController
- 글 수정시에 DB에서 기존 자료를 가져오는 DTO와 글 수정후 DB에 저장하는 Command를 가진 Controller두개를 하나로 처리하도록 해주는 컨트롤러이다.
글 수정 폼으로 이동시에는 글 번호를 가진 get 방식으로 이동하고, 글 수정 완료시에는 post방식으로 데이터가 이동하는 것에 착안한것으로 같은 컨트롤러에서 데이터 전송방식에 따라 처리를 다르게 해준다.

- formBackingObject, onSubmit 메소드를 이클립스 소스생성기로 override해준다.
이때 formBackingObject 메쏘드는 super 클래스인 AbstractController 내부에 위치하고 있다.

- formBackingObject 메소드에서 isFormSubmission(request) 를 체크해서 true인경우는 Post방식, false인경우는 Get방식으로 분기 처리해준다.

- Get 경우
view페이지 구현시와 마찬가지로 request에서 seq를 받아서 view 페이지를 연결해준다.
Get할때 연결할 view페이지를 xml에서 property로 선언해서 추가해 주어야 하며, 처리시에 받아온 command 데이터를 호출하기 위해 commandName선언도 해주어야한다.
<property name="formView" value="/board/update_form.jsp"/>
<property name="commandName" value="boardCmd"/>

- Post 경우
수정폼에서 전송한 데이터를 command 객체화 한다.
board = (Board)super.formBackingObject(request);
Post 전송의 경우 formBackingObject 를 거쳐서 onSubmit을 타게 되는데 이때 onSubmit으로 가져가야 하므로 command객체를 xml파일에서 commandClass를 선언해 준다.
<property name="commandClass" value="kosta.model.Board" />
onSubmit 메쏘드 내에서 업데이트 처리 로직을 구현해준다.

- 업데이트 실패시 이전 폼 화면으로 돌아가도록 처리하기 위해서는 exception 처리를 통해 showForm를 호출하면 된다.
업데이트 성공시에는 xml에 선언해 둔 successView 로 이동하게 할 수 있다.
<property name="successView" value="redirect:/board_list.do"/>
xml에 위와 같이 선언해 둔 후 수정 성공 시 setViewName 에 getSuccessView 메소드를 호출하면 된다.



저작자 표시 비영리 변경 금지

'Work > Study' 카테고리의 다른 글

아파치 재시작 없이 설정 적용하기!!  (0) 2011/10/31
Spring & Ibatis framework 3 - 2011.10.29  (0) 2011/10/29
Spring & Ibatis framework 2 - 2011.10.22  (0) 2011/10/22
Spring & Ibatis framework 1 - 2011.10.15  (0) 2011/10/15
Java Script Key code  (0) 2011/07/27
보안관련 정리  (0) 2011/07/15
trackback 0 AND comment 0

Spring 2.5, 3.0(Annotation) 두 버전을 조금씩 보기로 한다.
이번주와 다음주는 2.5, 남은 3주는 3.0으로 진행한다.
Ibatis는 Mybatis로 이름이 변경되었으나 편의상 Ibatis로 부른다.
백문이 불여 일타!
실습 위주로 진행한다.

1. 환경설정
- Oracle Database 10g Express Edition 설치
- Apache Tomcat 6.0 설치
- Eclipse Helios 설치
- Spring Container 다운로드
http://www.springsource.org/download
spring-framework-2.5.6.SEC01-with-dependencies.zip 을 다운

2. Eclipse 셋팅
- Tomcat 연결
Windows > Preperences > Server > Runtime Env 
Add -> Tomcat 6.0 선택, 파일 위치선택후 완료.
- Workbanch 하단 탭에서 Server 선택 후 빈 화면에 우측버튼 New>Server>Tomcat6 선택후 완료.
- Help > install new software > add
http://springide.org/updatesite 주소 입력후 Core / Spring IDE , Extensions / Spring IDE 설치. (설치 후 재시작 필수)
- 프로젝트에 Spring 연결
프로젝트 우클릭 > Build Path> Configure Build... 클릭 -> Lib 탭에서 다운로드해서 압축을 풀어둔 Spring 2.5 폴더 아래 dist/spring.jar 파일 선택

3. Spring 패턴들
- DI
- AOP
- MVC

- DB : JDBC Template, ORM(ibatis)
(Tiles, Velocity, Bean)

- Validation
- Transaction
- Jason
- DWR

4. Dependency Injection, DI (의존성 주입)
- 모든 객체를 Spring Container(조립기, XML)에 등록하고 Spring Container를 통해서 객체를 받도록 한다. 따라서 객체의 변경이 있는경우 Spring Container만 변경하면 되기때문에 적용 소스를 일일이 수정할 필요가 없어진다.

처음 설명을 들을때는 어댑터 패턴과 비슷하다고 생각했는데 어댑터로만 이루어졌다고 보기는 어렵고 어댑터 패턴의 기능을 생각하면 이해가 좀 빨리 되긴 한다.

- 생성자 방식과 프로퍼티 방식이 있으며 이클립스의 자동화 기능덕에 주로 프로퍼티 방식을 더 선호하는 편이다. ㅋㅋㅋ

- <ref> : 객체를 받을때, <value> : 문자, 숫자 등을 받을때 사용.

- 프로퍼티 방식의 경우 <property> 태그안에 작성하는 name은 set받을 프로퍼티 명과 일치해야 한다.

- 객체, 문자, 숫자 뿐만 아니라 배열, List, Map, Set 등 다양한 타입이 가능하다.

* Framework 와 Lib의 차이점은???
- Lib는 개발자가 주도하는 개발의 방향에서 필요한 부분만 가져다가 쓰게 된다.
- Framework는 Framework가 이미 정의해둔 구조에서 필요한 부분을 개발자가 작성하는 형태로 Framework가 주도하게된다.

5. AOP (Aspect Oriented Programming)
- Aspect Oriented Programming은 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍함으로써 공통 모듈을 손쉽게 적용할 수 있게 해준다.

- Spring 에서의 AOP 
- POJO 클래스를 이용한 구현
- 스프링 API를 이용한 구현
-  Annotation을 이용한 구현 

- XML 최상위 태그에 xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation 에 http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 추가

- Aspect 설정
<bean id=“writelog” class=“org.kosta.spring.LogAspect”/>
-> Aspect로 사용할 클래스(일반 java클래스이다.)
<aop:config>
<aop:pointcut id=“포이트컷ID” expression=“execution(적용대상 필터)”/>
<aop:aspect id=“어스펙트ID” ref=“writelog”>
-> 클래스를 ref로 받아서 어스펙트로 설정해준다. 
<aop:around pointcut-ref=“포이트컷ID” method=“실행할 메소드”/>
-> 어스펙트에서 실행할 메쏘드 
</aop:aspect>
</aop:config>

6. MVC
MVC는 회사에서 cakePHP를 공부할때 한번 본적이 있어서인지 아주 익숙한것이 아닌데도 왠지 친근하다 ㅋㅋ
Spring의 MVC는 cake처럼 간단하게 M,V,C만으로 이루어지진 않는다. 일반적으로 urlMapping방식을 사용하는데 반해서 Spring에서는 다양한 맵핑방식을 지원하고 View도 하나의 언어로 한정되는것이 아니라 class도 될 수 있고, Tiles나 Jsp등 다양한 녀석들을 사용할 수 있도록 되어 있다.

오늘은 HandlerMapping에서 UrlHandlerMapping을 사용하고, view로는 JSP파일을 사용했다. JSP의 경우 view를 지정해주는 viewResolver를 사용하지 않아도 기본적으로 지원해주지만 명시적으로 지정하는 방법을 사용했다.

Spring MVC 패턴에서는 컨트롤러가 비즈니스 로직을 모두 처리한 후 디스패쳐에게 ModelAndView 타입을 통해 데이터와 사용할 view를 넘겨주는 방식이다.

오늘의 실습은 요기까지~~ ^^* 
저작자 표시 비영리 변경 금지

'Work > Study' 카테고리의 다른 글

Spring & Ibatis framework 3 - 2011.10.29  (0) 2011/10/29
Spring & Ibatis framework 2 - 2011.10.22  (0) 2011/10/22
Spring & Ibatis framework 1 - 2011.10.15  (0) 2011/10/15
Java Script Key code  (0) 2011/07/27
보안관련 정리  (0) 2011/07/15
파일내용 일괄 변경  (0) 2011/06/30
trackback 0 AND comment 0

ARTICLE CATEGORY

All (509)
be Happy!! (15)
Inside (135)
Outside (69)
Feel (254)
Work (20)
Wine (9)
Informations (6)
독도는 한국땅!!! (1)

CALENDAR

«   2012/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

ARCHIVE