젠장...

웹개발자를 위한 스프링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 머드초보

댓글을 달아 주세요

  1. BlogIcon 에이레네 2008.03.16 16:39  댓글주소  수정/삭제  댓글쓰기

    오홋 이책 좋은가요..? 저도 한번 질러 볼까요? ㅋㅋㅋ

    • 머드초보 2008.03.17 17:05  댓글주소  수정/삭제

      제가 스프링은 잘몰라서 좋은지 안좋은지 모르겠지만
      책 구성을 봐서는 좋은 것 같습니다 ^^
      우선 소스코드로 설명을 해서 이해하기 쉽게 해놨어요^^
      지르세요~ ^^ BlazeDS랑 Spring랑 연동하면 최강이 될꺼에요!-_-;

  2. BlogIcon 최범균 2008.03.17 17:10  댓글주소  수정/삭제  댓글쓰기

    진짜 밥 쏘시나요? 밥을 쏘신다고 하시니까, 한번 뵙고 싶은걸요. ^^ 책이 도움이 되었으면 하구요, 질문거리 등등이 있으시면 자바캔에 올려주세요. (요즘 가능하면 몇일 안에 답 드릴려고 노력중입니다.)

    • 머드초보 2008.03.17 19:48  댓글주소  수정/삭제

      우와 최범균님 반갑습니다 ㅠㅠ
      핫핫~ 밥이야 당연히 대접을 ^^
      지금 이제 막 읽고 있는 단계라서 조금 더 읽어봐야할 듯 하네요^^
      질문은 자바캔에가서 올리도록 하겠습니다 ^^
      작년에 JSP입문했는데 고때 최범균님 책으로 입문하는 바람에
      개념을 빨리 쉽게 잡았던 것 같습니다 ^^
      암튼 방문해주셔서 영광입니다 ^^

  3. namo 2008.04.01 17:50  댓글주소  수정/삭제  댓글쓰기

    저도 최범균 님이 쓴 스프링 2.5 보고 있습니다. iBATIS 연동 관련을 보려는데 3장 남짓 되어 아쉬움이.
    위에 저자 댓글이 보이는 군요..

    • 머드초보 2008.04.02 08:33  댓글주소  수정/삭제

      우와 엄청빨리 보셨군요 ^^
      전 친구들이랑 스터디를 진행하고 있어요 ^^
      방문해주셔서 감사해요~ ^^

 

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

우선 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 머드초보

댓글을 달아 주세요

  1. 서영아빠 2008.03.28 11:32  댓글주소  수정/삭제  댓글쓰기

    좋은 내용 감사합니다.
    도움이 되었습니다. ^^

    • 머드초보 2008.03.28 12:44  댓글주소  수정/삭제

      도움이 되셨다니 다행입니다 ^^
      근데 전 테스트하다가 좀 문제점을 발견했는데-_-;
      dao에서 메소드호출 여러번하면 이상하게 다운이 되던데...
      어쨌든 방문해주셔서 감사합니다 ^^

 

어찌하다보니 스트럿츠2를 공부하게 되었네요.
책에 있는 예제를 이클립스로 셋팅법과 간단한 예제를 소개하려고 합니다-_-;
이 책에서 톰캣플러그인으로 사용하길래 그냥 Dynamic Web Project로 만들어도 될듯해서 ^^
(예제출처 : 스트럿츠2 프로그래밍 - 현철주, 정광선, 민상기 지음)

테스트환경 : Tomcat 6.0.16 + JDK 6 u 4 + Struts 2.0.11

이클립스를 실행합니다.
File -> New -> Project -> Dynamic Web Project선택
Project name을 HelloStruts2로 하고~ ^^
Target Runtime은 톰캣 6.0으로 추가를 해봅시다 ^^ New해서 Apache Tomcat 6.0선택하고 톰캣이 설치된 경로만 지정해주면 돼요 ^^
그리고 Finish를 클릭합시다 ^^

아.....스트럿츠2를 받아야죠! http://struts.apache.org/download.cgi 여기서 Struts 2.0.11버전을 받습니다.
압축을 풀고 lib경로에 있는 파일들을 방금 만든 프로젝트경로의 lib폴더로 복사합니다.
antlr-2.7.2.jar
commons-beanutils-1.6.jar
commons-chain-1.1.jar
commons-logging-1.0.4.jar
commons-logging-api-1.1.jar
commons-validator-1.3.0.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
oro-2.0.8.jar
struts2-core-2.0.11.jar
struts-core-1.3.5.jar
xwork-2.0.4.jar

플러그인만 빼고 다 복사하면 돼요. 플러그인도 같이 복사하면 에러나요-_-; 해당 lib가 없어서 그런 것 같아요. spring plugin이런것을 사용하려면 spring lib가 있어야 하는 듯 해요 ^^

그다음 web.xml파일에 아래와 같은 filter를 추가해줍니다.
[code]
<filter>
   <filter-name>struts</filter-name>
   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
 
<filter-mapping>
   <filter-name>struts</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
[/code]

Java Resources : src에 오른쪽 마우스를 대고 struts.xml파일을 하나 추가해줍시다.
이눔은 빌드되면서 classes폴더로 들어가게 됩니다.

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

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts
Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 <package name="default" extends="struts-default" namespace="">
 
  <action name="echo" class="example.chapter3.EchoAction">
   <result>/WEB-INF/echo.jsp</result>
  </action>
 
 </package>
</struts>
[/code]
보면 struts1이랑 비슷해요. 대신 이눔은 package라는 놈이 있어서 비슷한 놈들 끼리 묶을 수 있어요.

이제 저 example.chapter3.EchoAction을 만들어 봅시다.
Java Resources: src에 오른쪽 마우스를 대고! EchoAction클래스를 하나 만듭시다.
EchoAction.java
[code]
package example.chapter3;

public class EchoAction {
 private String echo;
 
 public String execute() throws Exception {
  return "success";
 }

 public String getEcho() {
  return echo;
 }

 public void setEcho(String echo) {
  this.echo = echo;
 }
}
[/code]
요렇게 작성을 합니다. 보면 execute가 있네요. 그리고 get, set이 있구요.

이제 action에 작성한 jsp를 작성해봅시다.
WEB-INF에 오른쪽마우스를 클릭해서 JSP를 선택해서 추가합니다.
아까 ACTION에서 작성한 echo.jsp파일을 생성합시다.
echo.jsp
[code]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>예제3-1: echo</title>
</head>
<body>

<s:form action="echo" theme="simple">
 <s:textfield name="echo" />
 <p/><s:property value="echo" /></p>
 <s:submit />
</s:form>
</body>
</html>
[/code]
간단히 보면 스트럿츠태그가 있습니다. 예전에 쓰던 <html:, <bean: 보다 더 좋아진 듯 합니다.
신기한 건 s:textfield해놓고, name을 echo로만 줘도 setter가 작동하는 듯 합니다-_-;
s:property도 getter가 그냥 작동하는 듯 합니다. 뭐 아직 저도 잘몰라서 뭐라 말은 못하겠네요.
어쨌든 이제 실행시켜보고 field에 뭐라고 쓰면 뭐라고 나올 껍니다-_-;

url은 http://localhost:8080/HelloStruts2/echo.action 로 요청합니다 ^^

사용자 삽입 이미지


음....더 공부를 해봐야할 것 같네요 ^^
 
Posted by 머드초보

댓글을 달아 주세요

  1. 초보자 2008.03.05 15:01  댓글주소  수정/삭제  댓글쓰기

    스트럿츠 정말 처음입니다. ^^; 위에 내용되로 따라 해보니 아래와 같은 문제가 생겼습니다.

    Cannot find the tag library descriptor for /struts-tags

    따로 설정해주는게 있는지요? 해당 페이지를 볼려고 하면 URL 경로를 어떻게 주어야하는지요?

    • BlogIcon 머드초보 2008.03.05 16:08  댓글주소  수정/삭제

      아....해당 jsp파일을 로드하는게 아니라 액션url을 요청해야해요.
      http://localhost:8080/HelloStruts2/echo.action
      echo라는 action으로 추가했으면 echo액션을 요청하는 겁니다.
      위에 안써놨네요 죄송해요 ^^

  2. 스트럿츠초보 2008.03.26 11:34  댓글주소  수정/삭제  댓글쓰기

    이클립스로 저렇게 작성하고 나서 어떻게 실행시켜야 하나요?
    이클립스에서 run해서 하면 되는건가요?
    그리고 저걸 그냥 웹브라우져에 url만 치고 들어갈수 있게 설정할라면 톰켓 어디에가다 소스파일을 위치 시켜야하는지 알려주세요..
    dgmeet@nate.com 여기로 메일좀 보내주세요.

    • 머드초보 2008.03.27 08:26  댓글주소  수정/삭제

      안녕하세요! 이클립스에 톰캣을 추가하고 그 추가한 톰캣에 해당 프로젝트를 추가하고, url요청하면 됩니다 ^^
      톰캣에 배포하려면 ANT나 WAR로 제작해서 톰캣매니저로 배포하는 방법이 있구요 ^^
      혹시 궁금사항 있으시면 mudchobo@nate.com으로 연락주세요 ^^

  3. BlogIcon Gizmo_j 2008.08.20 17:52  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    위에 있는대로 착실하게 진행을 했는대...
    404에러가 떨어지내여..ㅠㅠ
    EchoAction.java는 컴파일이 되서 build폴더에 들어 가있구여
    struts.xml 이놈두 classes 폴더에 들어가 있습니다.
    혹시
    이거 말고 사전에 머 다른거 작업해야하는게 있는건가여..?
    아~ 왜 이러지..ㅠㅠ 흑...
    이거 되면 Flex로 붙이는 방법도 찾아야 되는대...
    큰일이내여...ㅠㅠ

    • 머드초보 2008.08.21 08:32  댓글주소  수정/삭제

      음...이상하네요.
      사전에 작업같은 거 안해줘도 되는데-_-;
      이거 저도 아주 오래전에 한거라 기억이....
      web.xml에도 추가를 하셨는지요?

  4. 감사합니다 2008.10.16 00:39  댓글주소  수정/삭제  댓글쓰기

    더분에 좋은자료 감사합니다.
    몇가지 도움을 부탁하고싶습니다.(햔재의 소스 코드 기능 추가 변경)

    1. 수정또는 삭제시 별도의 페이지(비밀번호 확인)를 호출하게 하였는데.
    비밀번호 묻지 않고 MessageBox에서 진행여부를 묻고 그후 처리하는 방법으로 수정하고싶습니다.
    2. 페이지의 목록수를 콤보박스에서 입력 받아 자유로이 보기줄수를 조정하고자 할때는 어떻게
    수정해야하는지요
    3. 입력 또는 수정시에 구분값을 입력 받는경우 보통 Code TABLE에서 정의한 코드를 사용하는데
    이런경우 콤보로 입력 받는경우의 처리방법

    위 내용에 대한 도움 부탁드립니다.

    • 머드초보 2008.10.17 23:20  댓글주소  수정/삭제

      제가 스트럿츠2를 공부하려고 하다가 스프링으로 넘어가다보니 스트럿츠2를 전혀 안해봐서 모르겠네요 ㅠㅠ
      도움이 되지 못해서 죄송해요 ㅠ

  5. idoori 2009.11.09 16:32  댓글주소  수정/삭제  댓글쓰기

    앞으로 여기서 공부좀 해야겠구먼~

 

얼마전에 넷빈즈로 swing을 이용한 Desktop Application을 만들고 있었습니다.

잘 몰라서 그냥 버튼 드래그 하고, 버튼에 오른쪽 버튼 클릭해서 action을 주고 그 해당 메소드에다가 코딩하고 그런식으로 하고 있었습니다. 그래서 다 만들고 나서 jar파일을 만들고 나니 디자인이 맘에 안들었습니다.

그래서 버튼이랑 필드배치를 다시 하고 막 하다보니.....코드가 날아갔습니다 ㅠㅠ
으앙~ 하던중에 class파일을 다시 java파일로 만들어 준다는 프로그램에 있다고 들은 적이 있어서 막 찾고 있었습니다. 그러던중 Jad라는 놈을 찾았는데 ^^ 잘 되더군요 ^^

근데 원래의 java파일대로 만들어 주진 않습니다. ^^ 그래서 똑같은 역할을 하는놈으로 만들어주긴하는데-_-;
상당히 보기에 난해한 부분이 있는 건 사실입니다 ^^ 그냥 소스가 없다거나 돌아가는 소스를 보고 싶다거나 할 때 쓰면 되겠네요 ^^

Jad공식홈페이지입니다.
http://www.kpdus.com/jad.html

 
Posted by 머드초보

댓글을 달아 주세요

 

클라이언트입니다.

그냥 Socket이랑 조금 틀립니다.

그냥 소켓은 데이터를 받을 때에
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
를 등록해서 데이터가 들어오면 함수가 호출되도록 되어 있습니다.

그리고 보낼 때에도 writeUTF어쩌구로 보냅니다.

근데 XMLSocket은 더 간단하게 주고 받을 수 있습니다.

XMLSocket은 저 아래에있는 이벤트를 등록합니다.
xmlsocket.addEventListener(DataEvent.DATA, socketDataHandler);

그리고, 저 함수에서 DataEvent에 있는 data값에 데이터가 들어있습니다.
그냥 출력해주면 돼요-_-;

보낼 때에는 XMLSocket에 있는 send메소드를 이용해서 그냥 보내면 돼요. 아주 간단해요!

클라이언트(FLEX)
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 creationComplete="initApp()">
 
 <mx:Script>
  <![CDATA[
   private var xmlsocket:XMLSocket;
   [Bindable]
   public var userId:String;
   
   private function initApp():void {
    currentState = "logon";
   }
   
   public function logon():void {
    userId = tUserId.text;
   
    xmlsocket = new XMLSocket();
    xmlsocket.addEventListener(DataEvent.DATA, socketDataHandler);
    xmlsocket.connect("localhost", 10001);
    xmlsocket.send(userId + "\n");
   
    currentState = "chat";
   }

   private function socketDataHandler(event:DataEvent) :void {
    log.text += event.data;
      }
        
   public function send():void {
                xmlsocket.send(msg.text + "\n");
                msg.text = "";
                
   }
  ]]>
 </mx:Script>
 
 <mx:Panel id="panel" width="100%" height="100%" verticalAlign="middle"
  horizontalAlign="center">
  <mx:ControlBar id="cb" height="44" />
 </mx:Panel>
 
 <mx:states>
 
  <mx:State name="logon">
   <mx:AddChild relativeTo="{panel}">
    <mx:HBox>
     <mx:Label text="User Id:" />
     <mx:TextInput id="tUserId" enter="logon()" />
     <mx:Button label="Logon" click="logon()" />
    </mx:HBox>
   </mx:AddChild>
  </mx:State>
 
  <mx:State name="chat">
   <mx:SetProperty target="{panel}" name="title"
    value="접속자 ID : [{userId}]" />
   <mx:AddChild relativeTo="{panel}">
    <mx:TextArea id="log" width="100%" height="100%" editable="false"
     updateComplete="log.verticalScrollPosition=log.maxVerticalScrollPosition;"/>
   </mx:AddChild>
   <mx:AddChild relativeTo="{cb}">
    <mx:HBox width="100%" paddingTop="0" paddingBottom="0">
     <mx:TextInput id="msg" enter="send()" width="100%" />
    </mx:HBox>
   </mx:AddChild>
  </mx:State>
 
 </mx:states>
 
</mx:Application>
[/code]

 
Posted by 머드초보

댓글을 달아 주세요