저번에 Beta2예제가 새로운 버전에서 안돌아가는 바람에 다시 만들었습니다-_-;
많은 분들이 안돌아간다고 하셔서 다시 만들었습니다 ㅠ
형식이 조금 바뀌었는데, 별 차이는 없었습니다.
더 편해진 것 같아요. 토큰이라는 것을 이용하네요.

http://code.google.com/p/assql/
다양한 예제와 lib파일은 이곳에서 받을 수 있습니다.

간단하게 insert와 select를 하는 예제를 만들어봤습니다.
테스트 해본 환경은 Eclpse3.4 + Flex Builder 3.0.1 + asSQL Beta 2.7에서 해봤습니다.

DB구조는 다음과 같습니다.

CREATE TABLE `products` (
`id` int(10) unsigned NOT NULL auto_increment,
`description` varchar(45) default NULL,
`price` decimal(15,2) NOT NULL default '0.00',
PRIMARY KEY USING BTREE (`id`,`price`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

INSERT INTO `products` (`id`,`description`,`price`) VALUES
(1,'Lamp','469.80'),
(2,'Table','3502.62'),
(3,'Chair','1061.12');


아래는 소스코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="onCreationComplete()"
layout="horizontal">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import com.maclema.mysql.ResultSet;
import com.maclema.mysql.MySqlToken;
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
import com.maclema.mysql.events.MySqlErrorEvent;
import mx.rpc.AsyncResponder;
import mx.controls.Alert;

private var con:Connection;
private var st:Statement;
private var token:MySqlToken;
[Bindable]
private var dataAC:ArrayCollection;

private function onCreationComplete():void
{
con = new Connection("DB주소", 3306, "DB아이디", "DB비밀번호", "DB명");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect("euckr");
}

private function handleConnected(e:Event):void
{
if (con != null)
{
st = con.createStatement();
}
}

private function selectResult(data:Object, token:Object):void
{
var rs:ResultSet = ResultSet(data);
dataAC = rs.getRows();
}

private function insertResult(data:Object, token:Object):void
{
Alert.show(token.description + " 삽입성공!");
selectProcess();
insertBox.visible = false;
}

private function fault(info:Object, token:Object):void
{
Alert.show("Error: " + info);
}

private function selectProcess():void
{
var token:MySqlToken = st.executeQuery(
"SELECT id, description, price FROM products");
token.addResponder(new AsyncResponder(selectResult, fault));
}

private function insertProcess():void
{
st.sql = "INSERT INTO products (description, price) VALUES (?, ?)";
st.setString(1, inputDescription.text);
st.setNumber(2, Number(inputPrice.text));
var token:MySqlToken = st.executeQuery();
token.description = inputDescription.text;
token.addResponder(new AsyncResponder(insertResult, fault, token));
}
]]>
</mx:Script>

<mx:VBox horizontalAlign="center">
<mx:DataGrid id="productDG" dataProvider="{dataAC}">
<mx:columns>
<mx:DataGridColumn headerText="ID" dataField="id"/>
<mx:DataGridColumn headerText="제품명" dataField="description"/>
<mx:DataGridColumn headerText="가격" dataField="price"/>
</mx:columns>
</mx:DataGrid>

<mx:HBox width="100%" horizontalAlign="center">
<mx:Button label="SELECT" id="btnSelect"
click="insertBox.visible = false; selectProcess()"/>
<mx:Button label="INSERT" id="btnInsert"
click="insertBox.visible = true"/>
</mx:HBox>

<mx:VBox id="insertBox" height="100%" horizontalAlign="center" visible="false">
<mx:Form>
<mx:FormHeading label="정보 입력" />
<mx:FormItem label="제품명">
<mx:TextInput id="inputDescription" />
</mx:FormItem>
<mx:FormItem label="가격">
<mx:TextInput id="inputPrice" restrict="0-9,."/>
</mx:FormItem>
</mx:Form>
<mx:Button id="btnInsertProcess" label="추가" click="insertProcess()" />
</mx:VBox>

</mx:VBox>

</mx:Application>

좀 이상한 점이 con.connect("euckr")로 해야지 한글이 나오더군요. mysql에서 utf8에는 한글이 없는건가.
어쨌든 인코딩은 어려워요 ㅠ

Connection이라는 클래스를 통해 mysql정보를 이용해 con객체를 생성한다음에 Statement를 생성합니다.
그 뒤에 selectProcess메소드에서 보시면, MySqlToken이라는 클래스를 이용합니다. Statement객체의 executeQuery메소드에 쿼리문을 넣어서 실행하면 token이 발행됩니다.
이 token에 addResponder라는 메소드를 통해 AsyncResponder를 이용해 해당 function넣은 객체를 생성해서 addResponder에 집어넣습니다. 그러면 데이터를 가져오는 시점에서 넣은 function이 호출이 됩니다.

여기서 데이터를 파싱하는 부분에서 엄청 편해진 부분이있는데요.
rs.getRows();

getRows라는 메소드가 있는데, 이건 해당 데이터셋을 자동으로 ArrayCollection형으로 변환해서 리턴해줍니다.
그러면 바로 바인딩된 datagrid에 데이터가 뿌려지겠죠. 멋집니다.

insert부분도 똑같습니다.
그냥 자바문법과 비슷하다고 보면 되겠네요.
틀린 점이 있다면 이건 이벤트기반이라는 것이죠 ^^ 비동기적으로 일어납니다.
사용자 삽입 이미지

셀렉트도 잘되네요. 구글크롬에서 해봤어요. 잘 되네요.

사용자 삽입 이미지

머드초보를 2.00로 해서 입력해봅시다.

사용자 삽입 이미지

잘 들어갔네요.

PS. 실무db연동은....서버단언어와 함께하시길 바랍니다 ^^ (JAVA, C# 등등~)
머드초보 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://mudchobo.tomeii.com/tt/rss/comment/318
  2. 지돌스타 2008/09/03 15:35  편집/삭제  댓글 작성  댓글 주소

    좋은 정보입니다. ^^

    • 머드초보 2008/09/03 19:00  편집/삭제  댓글 주소

      보니까 asSQL버전이 올라가면서 기존 예제가 문제가 있었더라구요.
      코딩방식이 바뀌어서 다시 만들었습니다 ^^
      방문해주셔서 감사해요~ ^^
      그....기존 버전의 트랙백을 날려주셔도 돼요 ^^

  3. keril 2008/09/03 19:09  편집/삭제  댓글 작성  댓글 주소

    말씀해주신대로 mysql설정미스인듯합니다..

    그런데 잘 해결이 안되고있네요 ^^;

  4. keril 2008/09/03 19:13  편집/삭제  댓글 작성  댓글 주소

    그리고 이클립스 유로파 (eclipse-jee-europa-winter-win32) 가 실행이 안되네요
    제껏만 그런가해서 친구컴에서도 해봤는데 같은 증상....
    jvm terminated. Exit code=-1 로시작해서 꽤나긴 설명이있는데 짧은지식으로는 ㅋ

  5. 비매품 2008/09/03 22:09  편집/삭제  댓글 작성  댓글 주소

    아;; 제가 정말 초보라 그러는데;;
    굳이 이클립스가 필요한건가요? 코딩은 플렉스3 빌더에서 다 할 수 있는거 아닌가요? ㅠㅠ;

    그리고 돌려보니까...
    insert에 품목 입력하면

    Error #2044: 처리되지 않은 ioError입니다. text=Error #2031: 소켓 오류입니다. URL: DB주소

    Main Thread (Suspended: TypeError: Error #1009: null 객체 참조의 속성이나 메서드에 액세스할 수 없습니다.)
    FlexMysqlTest/insertProcess
    FlexMysqlTest/__btnInsertProcess_click

    이렇게 뜨는데 제가 뭘 빼먹은건지 궁금합니다.^^;;;;;

    • 머드초보 2008/09/04 09:03  편집/삭제  댓글 주소

      이클립스는 자바프로그래밍을 위해서 필요합니다.
      Flex는 RemoteObject를 통해서 완벽하게 java연동을 지원합니다.
      그래서 DB연동은 JAVA단에서 주로 하는데, 이것을 하려면
      이클립스가 필요합니다.

      그리고 소켓오류는 제 위에 소스를 그대로 가져다가 쓰신 것 같은데요.
      저기 DB주소부분에는 DB주소가 들어가야합니다.
      localhost나 DB서버가 작동하고 있는 서버의 IP를 적어주시면 돼요 ^^
      그리고 포트는 디폴트로 설치하셨으면 1521이고,
      DB접속ID, PW, 그리고 DB명을 넣어주시는 겁니다.

  6. 비매품 2008/09/04 09:55  편집/삭제  댓글 작성  댓글 주소

    asSQL이 자바나 php없이도 연결가능하다 그래서 이클립스가 필요없는줄 알았습니다 ^^;;
    소스 다시보니까 제가 아무것도 안하고 그냥 돌리기만 했네요 ^^;;;
    디비 공부좀 많이 해야겠습니다.ㅠㅠ 디비가 완전 꽉막혀서;;

    답글 고맙습니다^^

    • 머드초보 2008/09/04 10:11  편집/삭제  댓글 주소

      asSQL은 자바나 PHP없이 DB연결이 가능합니다.
      asSQL를 이용해서 DB연동한다면 이클립스가 필요없습니다.
      asSQL은 클라이언트에서 직접 MySQL에 접속하여 DB를 제어합니다.
      하지만, 보안상 취약점도 있고, DAO단을 따로 만드는게
      나중에 유지보수차원에서 더 좋을듯싶습니다.
      간단한 DB연동이라면 asSQL을 쓰셔도 될 듯 합니다 ^^

  7. atom 2008/09/08 10:11  편집/삭제  댓글 작성  댓글 주소

    안녕하세요.. 머드 초보님..

    위의 포스트를 보고 flex를 이용하여 웹에 붙이는걸 했습니다.

    하지만 에러가 나던데..ㅠㅠ 이유를 잘 몰라서 이렇게 물어 보게 되네요..

    -------------------------------------------------------------
    Error #2044: 처리되지 않은 ioError입니다. text=Error #2048: 보안 샌드박스 문제가 발생했습니다. http://210.118.69.241/Web_Service_Test/bin-debug/Web_Service_Test.swf은(는) 210.118.69.241:3306에서 데이터를 로드할 수 없습니다.
    --------------------------------------------------------------

    에러 메세지는 위와 같은데.. 이리저리 사방 팔방 물어 보고 해봐도 답이 안나오네요..

    flex builder에서 실행 하였을 때는 잘 되는데... 이걸 웹페이지에 embed로 붙여서 사용하니 바로 에러발생하네요..

    이것 땜시 3일째 잠을 못자고 있는데.. 너무 답답한 마음에.. 물어 보게 되네요..ㅠ

    • 머드초보 2008/09/08 11:23  편집/삭제  댓글 주소

      보안샌드박스 문제입니다.
      MySQL서버가 돌아가는 서버에 crossdomain.xml파일이 있어야합니다.
      이것에 swf파일이 돌아가는 서버가 MySQL이 설치된 서버에 허락이 되어있는지가 정의된 파일입니다.
      http://code.google.com/p/assql/wiki/JavaPolicyFileServer
      이게 서버프로그램인데 요걸 컴파일해서 MySQL이 설치된 서버에 띄워놓으시면 될겁니다.
      사실 저도 안해봐서-_-; 잠만 해볼께요-_-;

      아...해보니까 되네요 ^^
      저걸 서블릿으로 띄우는데 저 띄우는게
      843포트를 열어서 보안파일을 전송하는 듯합니다.
      궁금한거있으면 메일주세요.
      mudchobo@nate.com

  8. 꽃녀 2008/09/08 11:41  편집/삭제  댓글 작성  댓글 주소

    헐..좋은정보입니다.

    저도 따라서 한번 해봐야겠네요.~~

  9. atom 2008/09/08 13:19  편집/삭제  댓글 작성  댓글 주소

    머드초보님이 링크 걸어 주신 곳으로 들어가서 xml이랑 파일을 만들었는데.. 컴파일 해서 그냥 켜놓으라는 이야기인가요??ㅋ

    • 머드초보 2008/09/08 13:27  편집/삭제  댓글 주소

      컴파일해서 톰캣으로 띄우는겁니다.
      톰캣이 뜨면서 저 프로그램로직상 843포트를 열어놓게 되는데
      이 포트를 이용해서 클라이언트가 보안파일을 요청하는데
      보안파일에 허용되는 도메인이면
      허용할 수 있게 하는겁니다.

      즉, 톰캣의 $CATALINA_HOME$/webapps/ROOT/WEB-INF/classes에 저 컴파일한게 들어가고, web.xml에는 저기 설정에 맞는 서블릿 설정이 들어가면 되겠죠 ^^

      c로 된 것도 예전에 있었는데요.
      이 놈은 cygwin을 이용해서 gcc로 컴파일해서 그냥 띄워놓으면 되는겁니다.

  10. 꽃녀 2008/09/08 13:56  편집/삭제  댓글 작성  댓글 주소

    그러니깐..

    저위의 예는 서버사이드(JAVA, PHP)없이 ASSQL을 사용한 예이구요..

    실제 개발할때는 ASSQL을 사용하지 않고 Remoting 등으로

    서버사이드를 거쳐 (일반적인 방식으로..) 사용하라는 말인거죠? ^^;

    저도 헷갈리고 사람들도 헷갈릴거 같아서 ㅋ;;

    • 머드초보 2008/09/08 14:23  편집/삭제  댓글 주소

      아넵 맞습니다 ^^
      아직 asSQL이 보안상 문제가 좀 있다고 합니다-_-;
      그리고, DAO단은....따로 빼는게 편한 ^^
      그냥 저 예제는 저 정도가 가능하다는 것을 그냥 보여준거죠 ^^

  11. 네버다이 2008/09/12 14:04  편집/삭제  댓글 작성  댓글 주소

    머드초보님 잘 지내셨는지요? ^^

    assql 찾다가 또 머드초보님 홈피로 왔네요.

    위 예제 따라해보고 있는데요. 로컬은 잘되나 제 홈피계정에서 돌리면 위에서 이미 언급하신분처럼

    에러가 나네요. crossdomain.xml 설정해줬구요.

    http://otl.pe.kr/a/assql.html

    위 페이지입니다.

    호스팅업체에서는 localhost호스트에 대해서 따로 막지는 않았다고 합니다. 포트도 기본포트구요.

    문제가 뭘까요? 그럼 추석 잘 보내세요~


    <?xml version="1.0"?>
    <cross-domain-policy>
    <allow-access-from domain="*" to-ports="3306" secure="false" />
    <allow-access-from domain="*.otl.pe.kr" to-ports="3306" secure="false" />
    <allow-access-from domain="www.otl.pe.kr" to-ports="3306" secure="false" />
    <allow-access-from domain="otl.pe.kr" to-ports="3306" secure="false" />
    </cross-domain-policy>

    • 머드초보 2008/09/12 14:18  편집/삭제  댓글 주소

      안녕하세요~
      assql은 http통신이 아닌 소켓으로 3306포트로 직접 통신하고 있습니다.
      그래서 3306포트로 소켓을 연결할 때 FLEX애플리케이션은 843포트로 크로스도메인파일을 요청합니다.
      그래서 843포트로 크로스도메인파일을 줄 서버프로그램을 만들어야합니다.
      http://code.google.com/p/assql/wiki/JavaPolicyFileServer
      이거대로 톰캣으로 띄워서 843포트를 여시는 방법이 있구요.
      서버가 유닉스나 리눅스 계열이라면 gcc를 이용한 방법이 있습니다.
      http://panzergruppe.hp.infoseek.co.jp/fspfd.html
      그리고 assql은 localhost로 하면 안되더라구요.
      아이피를 직접 써주셔야합니다.
      해당 MySQL서버의 아이피를 직접 써주셔야합니다 ^^

      그나저나 네버다이님 오랜만이네요 ^^

  12. 네버다이 2008/09/12 14:42  편집/삭제  댓글 작성  댓글 주소

    네 오래간만이네요. 오기는 자주왔는데 글을 안써서리.. ^^

    제가 호스팅을 받다보니 제약이 많네요.

    우선 linux서버에 apache,php,mysql 연동된 호스팅받고 있구요.

    업체쪽에서 뭔가 해주지지는 않을꺼 같네요. 이거 되면 홈피에 이거저거 만들어 볼라고 했더만

    843번만이라도 열어달라고 하면될라나... ^^

    ip를 직접써줘야 한다는건 결국 연동했을때 공인ip를 가진 mysql일 경우만 가능한 경우가 되겠군요.

    • 머드초보 2008/09/12 14:53  편집/삭제  댓글 주소

      아 그렇군요.
      843번포트로 서버프로그램만 띄울 수 있다면 됩니다 ^^
      ip말고 도메인으로 해도 될것같은데요.
      mysql이 떠있는 서버의 아이피나, 도메인주소를 알면 되는것이죠^^
      호스팅을 받고 있군요.
      음 샤바샤바만 잘해보시면 ^^

  13. 돌아이비 2008/11/12 12:07  편집/삭제  댓글 작성  댓글 주소

    안녕하세요? 플렉스를 공부하고 있는 초보 프로그래머입니다.^^
    asSQL 관련예제를 검색하다가 머드초보님 블로그를 방문하게 되었는데 플렉스 관련 예제가 많네요~
    머드초보님 예제들로 열공해야겠습니다. 좋은 예제들 감사해요~^^

    • 머드초보 2008/11/15 10:41  편집/삭제  댓글 주소

      저도 초보 프로그래머입니다 ㅠㅠ
      허접한 예제가 도움이 되었으면 합니다 ^^

  14. 돌아이비 2008/11/13 00:02  편집/삭제  댓글 작성  댓글 주소

    예제 받아간지 얼마되지 않아서 바로 질문을 드리게 되네요..^^;;
    #2048 보안샌드박스 문제가 발생하길래 댓글로 알려주신 페이지에 있는 소스들 참고해서
    web.xml / crossdomain.xml / PolicyServerServlet.java 3개 파일을 만들었습니다.

    web.xml은 $CATALINA_HOME$/webapps/ROOT/WEB-INF 내의 web.xml 파일에 내용 추가했고,

    crossdomain.xml 파일은 $CATALINA_HOME$/webapps/ROOT 폴더 내에 두었고요.

    PolicyServerServlet.java 파일은 javac로 컴파일해서
    PolicyServerServlet.class / PolicyServerServlet$1.class / PolicyServerServlet$1$1.class 3개 파일을
    $CATALINA_HOME$/webapps/ROOT/WEB-INF/classes/com/maclema/flash 폴더 내에 넣었습니다.

    그런데도 디버그 모드로 띄워보니

    오류: http://localhost:8080/lcds/assql-ex-debug/main.swf의 SWF는 정책 파일 없이 해당 도메인에서 소켓에 연결할 수 없습니다.

    라는 오류메시지가 뜨네요..ㅠ_ㅠ

    의심가는 부분은 PolicyServerSevlet.java 파일 내 crossdomain.xml 파일 경로 설정 부분 뿐인데..
    어떻게 해야 보안샌드박스 문제를 해결할 수 있을지 도저히 감이 안와서 이렇게 댓글을 남깁니다.

    그럼 즐거운 하루 보내시고 시간 여유있으실 때 답변 부탁드려요^^ 굽신굽신~

    • 머드초보 2008/11/15 10:44  편집/삭제  댓글 주소

      음...우선 정책파일을 못 찾는 것 같은데....
      서블릿에서 생성하는 놈은 843포트로 정책파일을 받는 스레드를
      만드는 겁니다. assql은 소켓을 통해 db내용을 송수신 하기 때문입니다.
      타 도메인에 있는 소켓을 사용하려면 정책파일에 허락이 되어있는지
      정의가 되어있어야 하는데요.
      위는 뭔가 셋팅이 잘못 된 듯 합니다.
      결론은 저...저도 잘모르겠습니다 ㅠㅠ

  15. 돌아이비 2008/11/17 07:32  편집/삭제  댓글 작성  댓글 주소

    음.. 그렇군요.. ㅠ_ㅠ
    여기저기 검색하면서 이렇게 저렇게 고쳐봤는데도 여전히 먹통이네요.. ㅠ_ㅠ
    그래도 로컬에서는 잘 돌아가니까 공부하는데는 별 지장이 없네요~
    정책파일 문제는.. 다 그렇듯이 언젠가는 해결법을 찾겠죠^^;
    답변 감사드려요~ 즐거운 하루 보내세요^^

    • 머드초보 2008/11/19 14:11  편집/삭제  댓글 주소

      음....보안샌드박스문제는 생각해보면 간단합니다.
      해당 서버에서 해당 도메인을 허락하는거죠 ^^
      좀만 더 보시면 알 수 있을겁니다^^

  16. EH71 2008/11/19 12:46  편집/삭제  댓글 작성  댓글 주소

    안녕하세요-
    흔적도 없이 포스팅 잘 보고 있습니다ㅎㅎㅎ

    오늘은 흔적을 좀 남겨야 할 것 같은데요....
    책들을 참조해서 자바 서버 애플리케이션 <-> 플렉스 클라이언트 채팅 프로그램을 만들어보고 있는데요.
    서버는 톰캣에 얹어 돌리는 서블릿은 아니고 소켓이 구현되어 있는 통짜 애플리케이션입니다.

    플렉스 클라이언트에서 접속을 시도하면 보안 샌드박스 에러가 나는데요.
    이 포스트에 써주신 같은 방법으로 이 문제를 해결할 수 있는건지 궁금합니다.
    클라이언트는 80포트로 html 파일에 접근해서, 8401포트로 자바 애플리케이션에 접근합니다.

    이 포스트에 있는 방법을 수정해서 적용해야 한다면 어떤 부분을 수정해주어야 하나요?

    답변 주시면 감사드리겠습니다ㅠ 초보에겐 너무 어렵네요ㅠㅠ

    • 머드초보 2008/11/19 14:12  편집/삭제  댓글 주소

      안녕하세요!
      구조가 어떻게 되어있는지 이해가 잘 안되네요 ㅠ
      클라이언트가 80포트로 html에 접근하다니 무슨 말인지 모르겠어요.

정말 초간단예제군요-_-;
어노테이션을 사용하면 굉장히 편해져요.
저번주 스터디시간에 한 내용을-_-;

AOP를 적용하려면 인터페이스가 있어야 돼요.
Apple이라는 인터페이스를 만들어 봅시다.
com.mudchobo.example4라는 패키지에 Apple이라는 interface를 만듭시다.
Apple.java


package com.mudchobo.example4;

public interface Apple {
public void println();
}

println이라는 메소드가 하나있네요. 구현해봅시다.
AppleImpl.java

package com.mudchobo.example4;

public class AppleImpl implements Apple {

@Override
public void println(){
System.out.println("Apple : 맛있다");
}
}

사과는 맛있다 라는 메시지를 출력하는군요. 그럼 AOP....(갑자기 두리녀석이 전화를..-_-; 갑자기 2시간남겨놓고 술먹자고 전화하는 이상한놈이네요-_-;)
AOP 클래스를 만들어봅시다.

package com.mudchobo.example4;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AnnotLoggingAspect {

@Around("execution(public * com.mudchobo.example4.*.println*(..))")
public void logging(ProceedingJoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();

try {
System.out.println("before : " + methodName);
joinPoint.proceed();
System.out.println("after : " + methodName);
} catch (Throwable e) {
System.out.println("예외가 발생했어요!");
}
}
}

Around는 before, after, 예외 등을 다 포함하고 있죠. 그냥 메소드하나 구현하는거라고 보면 돼요.
execution은 AspectJ의 정규식을 넣으면 돼요. 문법은 검색 고고싱~--;
저건 맨앞에는 public, private정하는거고, 두번째는 리턴타입(*면 전부다겠죠?), 그다음은 패키지명 쓰고, (..)부분은 파라메터관련된 부분이죠. 검색고고싱~
저건 com.mudchobo.example4패키지에서 모든클래스중에 println으로 시작하는 메소드에 aop를 적용하겠다는 얘기에요. println메소드는 우리가 방금 구현한 Apple인터페이스에 있죠.

스프링 설정파일을 봅시다. 최상위 폴더에 applicationContext.xml파일로 지정합시다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<aop:aspectj-autoproxy />

<bean id="apple" class="com.mudchobo.example4.AppleImpl" />

<bean class="com.mudchobo.example4.AnnotLoggingAspect" />

</beans>

자 보면, apple이라는 bean은 우리가 만든 사과클래스구요. aop클래스를 bean으로 해서 선언해주었어요.
만약 SpringIDE를 설치했다면 왼쪽에 보시면 aop가 어디에 또는 몇개 적용이 되어있는지 나와요.
그럼 메인클래스를 보도록 해요.

Main4.java

package com.mudchobo.example4;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main4 {

public static void main(String[] args) {
String configLocation = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
Apple apple = (Apple) context.getBean("apple");
apple.println();
}
}

설정파일을 불러와서 ApplicationContext를 만들고, 거기서 apple이라는 bean을 불러옵니다.
그리고, apple.println()메소드를 호출하게 되면 aop가 적용되어 호출됩니다.

before : println
Apple : 맛있다
after : println

PS.회사프로그램에 스프링을 이용해서 AOP를 적용해보았는데요. 코드가 깔끔해지고, 참 좋은 것 같아요.
회사프로그램에서 예외처리하는 부분이 굉장히 많았는데 이것을 따로 빼서 하나로 합치니-_-; 코드가독성이 올라가네요. 암튼, 좀 더 배워봐야겠네요.
머드초보 이 작성.

당신의 의견을 작성해 주세요.

어찌하다보니 스트럿츠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를 추가해줍니다.


<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>


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

struts.xml

<?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>

보면 struts1이랑 비슷해요. 대신 이눔은 package라는 놈이 있어서 비슷한 놈들 끼리 묶을 수 있어요.

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

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;
}
}

요렇게 작성을 합니다. 보면 execute가 있네요. 그리고 get, set이 있구요.

이제 action에 작성한 jsp를 작성해봅시다.
WEB-INF에 오른쪽마우스를 클릭해서 JSP를 선택해서 추가합니다.
아까 ACTION에서 작성한 echo.jsp파일을 생성합시다.
echo.jsp

<%@ 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>

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

url은 http://localhost:8080/HelloStruts2/echo.action 로 요청합니다 ^^
사용자 삽입 이미지


음....더 공부를 해봐야할 것 같네요 ^^
머드초보 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://mudchobo.tomeii.com/tt/rss/comment/222
  2. 초보자 2008/03/05 15:01  편집/삭제  댓글 작성  댓글 주소

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

    Cannot find the tag library descriptor for /struts-tags

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

  3. 스트럿츠초보 2008/03/26 11:34  편집/삭제  댓글 작성  댓글 주소

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

    • 머드초보 2008/03/27 08:26  편집/삭제  댓글 주소

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

  4. Gizmo_j 2008/08/20 17:52  편집/삭제  댓글 작성  댓글 주소

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

    • 머드초보 2008/08/21 08:32  편집/삭제  댓글 주소

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

  5. 감사합니다 2008/10/16 00:39  편집/삭제  댓글 작성  댓글 주소

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

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

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

    • 머드초보 2008/10/17 23:20  편집/삭제  댓글 주소

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