http://mudchobo.tomeii.com/tt/236 에 이어서-_-;
이제 셋팅이 끝났으면 코딩을 해봅시다.

※이 예제는 스프링프레임워크에서 제공하는 스텝바이스텝 예제의 일부를 조금 수정한 것 입니다.

우선 DB구조입니다-_-;
[code]
CREATE TABLE `products` (
  `id` int(11) NOT NULL,
  `description` varchar(255) default NULL,
  `price` decimal(15,2) default NULL,
  PRIMARY KEY  (`id`),
  KEY `products_description` (`description`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr;

INSERT INTO `products` (`id`, `description`, `price`) VALUES
(1, 'Lamp', 391.50),
(2, 'Table', 2918.85),
(3, 'Chair', 884.27);
[/code]

그냥 src폴더는 자바서버단 폴더구요. flex_src폴더는 플렉스클라이언트단 폴더입니다^^
우선 스프링을 사용할 수 있게 web.xml파일을 수정해봅시다.
web.xml파일을 열어서 코드를 추가합니다.

web.xml
[code]
<context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

<listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>
[/code]
applicationContext*라고 적어 놓은 이유가 ibatis랑 분리를 하려고-_-;
설정파일은 applicationContext.xml과 applicationContext-ibatis.xml 두개를 사용할껍니다.

src에다가 코딩을 해봅시다.
java는 perspective를 Java EE로 바꾸고 합시다-_-;

우선 domain부분에 ValueObject를 하나 만들어봅시다-_-;
Java Resources:src에다가 New를 하고 class를 선택합니다.
package는 springapp.domain이라고 하구요.
Name은 Product라고 하고 Finish
[code]
package springapp.domain;

public class Product {

 private int id;
 private String description;
 private Double price;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getDescription() {
  return description;
 }

 public void setDescription(String description) {
  this.description = description;
 }

 public Double getPrice() {
  return price;
 }

 public void setPrice(Double price) {
  this.price = price;
 }
}
[/code]
ProductDao를 만들어봅시다.
Java Resource:src에 New해서 interface를 추가합시다.
package에다가 springapp.dao라고 써놓고,
Name에다가 ProductDao라고 씁시다-_-;
[code]
package springapp.dao;

import java.util.List;

import springapp.domain.Product;

public interface ProductDao {
 public List<Product> getProductList();
}
[/code]
딸랑 ProductList만 가져오는 메소드가 있어요!
저 Dao인터페이스를 구현해봅시다!!!
[code]
package springapp.dao;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import springapp.domain.Product;

public class ProductDaoImpl extends SqlMapClientDaoSupport implements
  ProductDao {

 protected final Log logger = LogFactory.getLog(getClass());

 @SuppressWarnings("unchecked")
 @Override
 public List<Product> getProductList() {
  logger.info("Getting products!");
  return getSqlMapClientTemplate().queryForList("getProductList");
 }
}
[/code]
ibatis부분인데요. 설정파일을 보도록 하겠습니다.

SqlMapConfig.xml
[code]
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
 <typeAlias alias="Product" type="springapp.domain.Product"/>

 <sqlMap resource="springapp/dao/MySQLProduct.xml" />
</sqlMapConfig>
[/code]
alias지정해주고, resource는 MySQLProduct.xml파일이네요. 보도록 합시다.

MySQLProduct.xml
[code]
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Product">

 <resultMap id="ProductMap" class="Product">
  <result property="id" column="id" />
  <result property="description" column="description" />
  <result property="price" column="price" />
 </resultMap>

 <select id="getProductList" resultMap="ProductMap">
  select id, description, price from products
 </select>

</sqlMap>
[/code]
getProductList라는 것은 products테이블에서 내용을 select하는 것이네요.
Dao가 완성되었네요! 너무 길어지니 다음이시간에-_-;

 
Posted by 머드초보
,
 
초간단시리즈-_-;
스프링에 있는 bean을 플렉스에서 가져다가 쓸 수 있어요!
멋져요!-_-;

우선 준비물! 저의 테스트 환경입니다.
Eclipse IDE for Java EE Developers  : http://www.eclipse.org/downloads/
Flex Builder 3 Eclipse Plug-in(로그인후받을 수 있음) :
http://www.adobe.com/cfusion/tdrc/index.cfm?product=flex_eclipse
JDK 6 update 5 : http://java.sun.com/javase/downloads/index.jsp
Apache Tomcat 6.0.16 : http://tomcat.apache.org/download-60.cgi
Spring Framework 2.5.2 : http://www.springframework.org/download
BlazeDS : http://opensource.adobe.com/wiki/display/blazeds/Downloads
Spring과 BlazeDS연동라이브러리 : blazeds-spring-beta1.jar 현재 beta1이군요.
http://www.igenko.org/archiva/repository/igenko/com/adobe/flex/blazeds-spring/
JDK6을 먼저 설치를 합니다.
이클립스는 받아서 그냥 압축을 풀어버립시다.
그리고, 플렉스빌더3 이클립스 플러그인을 설치 합니다.
톰캣은 ZIP버전이면 그냥 압축을 풀어놓고 JAVA_HOME을 잡아줍시다-_-;
스프링프레임워크는 lib파일을 가져다 쓸것이니 아무대나 압축을 풀어놓읍시다.

셋팅이 완료가 되었으면 이클립스를 띄웁시다.
File -> New -> Project선택, Flex Project선택 후 Next
Project이름은 SpringAndBlazeds라고 지어봅시다-_-;
Application Type은 Web Application이라고 하고, Application server type은 J2EE로 선택합니다.
넥스트를 하고 Target runtime에서 Tomcat을 설정해야합니다.
New한다음에 Apache폴더에 Tomcat 6.0을 선택하고, 해당 톰캣의 경로를 지정합니다.
Finish를 클릭하고, flex WAR파일을 선택하라고 하는데 받아놓은 blazeds.war파일을 선택하면 됩니다.
Finish를 클릭하면 끝납니다-_-; 셋팅이 완료가 되었어요!

이제 스프링IDE를 설치해봅시다.
이클립스메뉴에서 Help -> Software Updates -> Find And Install 선택
Search for new features to install를 선택 후 Next
New Remote Site선택 Name은 Spring IDE, url은 http://springide.org/updatesite/ 라고 씁니다.
추가한 것만 체크된 상태에서 Finish클릭!
Search Result에서 Spring IDE선택.
그러면 몇개는 설치 못하는데 설치 못하는 것은 체크해제를 시켜요-_-;
Dependencies에서 Spring IDE Dependencies 체크해제
Integration에서 Spring IDE AJDT Intergration 체크해제
AspectJ Development Tools도 설치하려면 하세요(전 사용할 줄 몰라요^^)
Next -> agree -> finish하면 설치가 됩니다.
설치가 다 되면 이클립스ide를 restart하라고 나와서 리스타트하면 돼요^^

그리고 우리가 만든 프로젝트에  마우스 오른쪽버튼을 클릭해서
Spring Tools -> Add Spring Project Nature선택 하면 완료됩니다.

필요한 라이브러리를 복사해봅시다.
dist/spring.jar : 스프링프레임워크를 쓰기 위해 꼭 필요한 놈.
dist/module/spring-test.jar : 스프링테스트 할 때 필요한 놈.
lib/jakarta-commons/commons-logging.jar : 로그찍을 때 필요한 놈.
lib/ibatis/ibatis-2.3.0.677.jar : ibatis쓸 때 필요한 놈.
lib/cglib/cglib-nodep-2.1_3.jar : Junit으로 테스트 할 때 필요한데, JUnit테스트를 할 때에는 Interface가 구현이 안되어있어서(aop를 사용하려면 interface가 구현이 되어있어야 한다고 하더군요) 필요한 놈.
lib/aspectj/aspectjweaver.jar : aop때문에 필요한 놈 같은데-_-;
lib/junit/junit-4.4.jar : JUnit을 사용하기 위해 필요한 놈.
mysql-connector-java-5.1.5-bin.jar : mysql Connector. db가 다른거면 다른 Connector가 있으면 돼요!
blazeds-spring-beta1.jar : 위에서 설명한 spring과 blazeDS와 연동할 때 필요한 놈.

셋팅은 여기까지-_-;
 
Posted by 머드초보
,
 
젠장...

웹개발자를 위한 스프링2.5프로그래밍을 읽고 있습니다.
제가 좋아하는 최범균(나중에 만나면 밥쏘겠습니다-_-; 만날일없겠지만^^)님이 쓰신 책인데 예전에 JSP를 입문할 때 최범균님이 쓰신 JSP 2.0프로그래밍을 읽고 입문했거든요.

책은 잘 쓰시는 것 같아요 ^^ 이해하기 쉽고 코드로 실무적인 면을 많이 설명하시는 것 같아요^^

그냥 AOP를 적용해보려다가 만난 메시지-_-;

Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

어떤 블로그 가니까 spring-framework-2.5.1에서 lib\cglib에 cglib-nodep-2.1_3.jar파일을 lib에 추가하면 된다는군요. 추가하니까.....되더군요-_-;

그나저나 이 책은 어제다 공부하지-_-; 할 것이 태산같군요 ㅠㅠ
 
Posted by 머드초보
,
 

오늘도 삽질삽질을 하다가 드디어-_-;
저도 테스트라는 것을 하게 되었습니다.

우선 Junit4를 스프링에서 하기 위해서는 spring-framework-2.5.1.zip파일에서 lib/junit 폴더에 있는 junit-4.4.jar파일을 lib에 추가합니다.
참고로 이클립스에서 있는 놈은 4.3인데 최신버전을 좋아하는 저로썬 그냥 4.4를 /WEB-INF/lib에 추가해서 써요. 이거 이렇게 추가안하고 이클립스에서 제공하는 junit을 사용하면 뭐 이상한 워닝이 떠요-_-;
원래 기존에는 프로젝트의 properties에 Java Build Path에서 Libraries에서 Add Library에서 junit을 추가하는 식으로 했는데 이렇게 하면 워닝막 뜨던데-_-;

Classpath entry org.eclipse.jdt.junit.JUNIT_CONTAINER/4 will not be exported or published. Runtime ClassNotFoundExceptions may result. 

이런거 ^^ 아마 무슨 실행할 때에 클래스가 없다고 뜰 것 같다고 말하는 것 같아요-_-;
저렇게 하지말고 그냥 lib에다가 처박아넣으니 그냥 워닝도 안 뜨더라구요.

뭐어쨌든 테스트클래스를 만들어봅시다.

Project에다가 대고 New -> Source Folder 를 클릭해서 test라는 소스폴더를 만듭시다.
그리고 원하는 테스트를 만들고 싶은 클래스에 대고 오른쪽마우스를 클릭하고
New -> Other -> JUnit Test Case선택
맨위에 source folder만 프로젝트명/src를 /test로 바꿔주고 넥스트를 클릭합시다.
원하는 메소드를 선택할 수 있는데 원하는 메소드를 선택합시다.
그럼 이렇게 작성이 되네요.
[code]
@Test
 public void testUserDeptSearch() {
  fail("Not yet implemented");
 }
[/code]
코드를 작성해봅시다.
[code]
package com.mudchobo.searchbatch.service;

import static org.junit.Assert.assertTrue;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

import com.mudchobo.searchbatch.dao.UsersDao;
import com.mudchobo.searchbatch.domain.Users;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
  "file:WebContent/WEB-INF/applicationContext.xml",
  "file:WebContent/WEB-INF/applicationContext-ibatis.xml" })
@TransactionConfiguration(transactionManager = "transactionManager",
       defaultRollback = true)
@Transactional
public class UsersManagerImplTest {

 @Autowired
 private UsersDao usersDao;
 
 @Test
 public void testUserDeptSearch() {
  System.out.println("UserDeptSearch");
  String dept = "김치";
  List<Users> usersList = usersDao.searchUsersDept(dept);
  Users users = usersList.get(0);
  System.out.println(users.getDept());
  assertTrue(users.getDept() != null);
 }
}
[/code]
저렇게 RunWith를 사용하면 되는 듯.
그리고 applicationContext파일은 여러개 일 때에는 저렇게 설정하면 돼요.
여기서 또 주의할 점은!
applicationContext.xml파일에 properties파일, sqlMapConfig.xml파일 같은 것을 표시할 때
보통 /WEB-INF/~~ 경로에다가 두시는 경우가 많은데요.
저기다가 두고,
[code]
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
  p:location="WEB-INF/jdbc.properties" />
[/code]
이렇게 작성해버리면 이 JUnit4는 저 jdbc.properties파일을 못찾습니다.
class path resource [WEB-INF/jdbc.properties] cannot be opened because it does not exist
이딴식으로 뜨는데요.
그래서 저런 파일들은 classpath인 classes폴더 아래에다가 두면 됩니다.
그냥 src폴더에 package하나 만들어서 설정파일은 다 때려박으세요-_-;
jdbc.properties, SqlMapConfig.xml파일 같은 것은(즉 applicationContext.xml파일에 써진 파일경로 같은거) classes경로 아래에 두도록 합시다. 그런다음에 파일경로 적는 부분에다가는
classpath:<package명>/SqlMapConfig.xml 이렇게 쓰면 돼요^^
그러면 JUnit도 잘 찾아요 ^^

실행할 때는 테스트자바파일에 대고 오른쪽버튼 누르면 JUnit Test가 나와요~

 
Posted by 머드초보
,