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

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

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

DB구조는 다음과 같습니다.
[code]
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');
[/code]

아래는 소스코드입니다.
[code]
<?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>
[/code]
좀 이상한 점이 con.connect("euckr")로 해야지 한글이 나오더군요. mysql에서 utf8에는 한글이 없는건가.
어쨌든 인코딩은 어려워요 ㅠ

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

여기서 데이터를 파싱하는 부분에서 엄청 편해진 부분이있는데요.
[code]rs.getRows();
[/code]
getRows라는 메소드가 있는데, 이건 해당 데이터셋을 자동으로 ArrayCollection형으로 변환해서 리턴해줍니다.
그러면 바로 바인딩된 datagrid에 데이터가 뿌려지겠죠. 멋집니다.

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

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

사용자 삽입 이미지

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

사용자 삽입 이미지

잘 들어갔네요.

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

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 네버다이 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서버의 아이피를 직접 써주셔야합니다 ^^

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

  3. 네버다이 2008.09.12 14:42  댓글주소  수정/삭제  댓글쓰기

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

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

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

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

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

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

    • 머드초보 2008.09.12 14:53  댓글주소  수정/삭제

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

  4. 돌아이비 2008.11.12 12:07  댓글주소  수정/삭제  댓글쓰기

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

    • 머드초보 2008.11.15 10:41  댓글주소  수정/삭제

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

  5. 돌아이비 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내용을 송수신 하기 때문입니다.
      타 도메인에 있는 소켓을 사용하려면 정책파일에 허락이 되어있는지
      정의가 되어있어야 하는데요.
      위는 뭔가 셋팅이 잘못 된 듯 합니다.
      결론은 저...저도 잘모르겠습니다 ㅠㅠ

  6. 돌아이비 2008.11.17 07:32  댓글주소  수정/삭제  댓글쓰기

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

    • 머드초보 2008.11.19 14:11  댓글주소  수정/삭제

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

  7. EH71 2008.11.19 12:46  댓글주소  수정/삭제  댓글쓰기

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

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

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

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

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

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

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

  8. BlogIcon 블루비 2008.12.03 22:40  댓글주소  수정/삭제  댓글쓰기

    asSQL 보안 문제 때문에 막막하던차에 해결책을 찾을 수 있어서 많은 도움이 되었습니다. ^^

    • 머드초보 2008.12.04 18:37  댓글주소  수정/삭제

      앗~ 도움이 되셨다니 다행입니다 ^^
      보안 문제는 Flash Player가 항상 안고다니는 문제죠 ^^

  9. 권오범 2009.05.21 19:04  댓글주소  수정/삭제  댓글쓰기

    안녕하셔요
    flex를 공부하는 초보자입니다.
    님의 글을 읽고 직접 테스트를 하였는데
    mysql charset이 문제입니다.
    table의 column type이 varchar는 charset을 "euckr"로 연결하면 한글이
    정상적으로 나오는데 column type이 text 인것은 한글이 깨어져
    나옵니다. 반대로 charset을 utf8로 하면 text는 정상이고 varchar는
    한글이 깨어져 나옵니다.
    저의 mysql db charset은 utf8 입니다
    혹 해결방법을 아시면 부탁합니다.

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

      저도 인코딩 문제로 한글깨짐 문제를 겪긴 했는데요.
      text로 된 칼럼은 없어서 테스트를 못해봤네요ㅠ
      db연동하는거라면 사실 서버단이랑 하시는게....-_-
      답변이 못되서 죄송해요 ㅠ

  10. 권오범 2009.06.03 19:50  댓글주소  수정/삭제  댓글쓰기

    assql을 테스트하면서 mysql의 charset에 대하여
    적어봅니다.
    windows와 linux mysql의 기본 charset은 "utf8"입니다
    air program으로 만들어서 테스트 했습니다.
    1. windows-mysql로 접속(local)
    1) assql에서 "euckr"로 연결하면
    - varchar : 한글정상
    - text : 한글깨짐
    2) utf8로 연결
    - 모두 한글 깨짐

    2. linux-mysql로 접속(remote)
    1) utf8로 연결
    - 모두 한글 깨짐
    2) euckr
    - mysql에 charset이 없어 연결이 안됨

    3. linux-mysql 을 local에서 접속(linux에서)
    1) utf8로 연결
    - 모두 한글 정상

    그리고 위의 assql을 이용한 flex program에서
    air program이 아니고 flex로 컴파일한 html과 swf를
    web server(was)로 옮겨 실행할려면
    assql.swc를 어디로 copy하고 어떤 파일을
    맞추어여 합니까
    flex에서는 실행이 되는데 html과 swf를 옮기면
    안됩니다

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

      오 깔끔한 정리 감사해요 ^^
      한글 문제는 언제나 ㅠㅠ

      마지막에 질문은 web서버에 배포할 때 말씀하시는거죠?
      assql.swc를 lib에 넣었으면 통합되어서 swf로 나오는데
      그냥 배포하면 될텐데..
      잘 모르겠네요 ㅠㅠ

  11. 권오범 2009.06.05 11:03  댓글주소  수정/삭제  댓글쓰기

    assql 보안문제는 윗쪽의 PolicyServerServlet.java 로
    windows 쪽 mysql은 해결했습니다.
    원래 linux쪽 mysql로 사용할려고 했으니 linux쪽도
    테스트를 해야죠
    그리고 이상한게 assql을 이용하여 flex에서 만든 air 프로그램은
    위의 보안문제와 상관없이 mysql 접속이 됩니다,
    똑같은 프로그램으로 air프로그램과 web프로그램으로 테스트를
    했는데 linux 쪽 mysql을 air 프로그램은 문제없습니다

    • 머드초보 2009.06.05 11:14  댓글주소  수정/삭제

      아...그 보안문제!
      얘가 socket을 통해 전송하기 때문에 그래요 ^^
      그리고 air는 crossdomain정책이 필요 없습니다
      데스크탑애플리케이션이기 때문이죠.

  12. 샤키 2009.06.08 16:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 플렉스를 공부하고 있는 4학년 학생입니다.
    자료 감사하게 잘봤습니다.
    질문사항이 하나 있는데요.
    sql문 이구요.
    var token:MySqlToken = st.executeQuery("SELECT subject,contents FROM schedule where date="+select_Day+"" );
    ---------------------------------------------------
    var rs:ResultSet = ResultSet(data);
    dataAC = rs.getRows();
    이부분에서 데이터 바인딩을 통해 DataGrid에서 뿌려지게 되잖아요.
    근데 subject부분만 TextArea나 text박스에 뿌려지게 하고 싶은데
    잘안되네요.
    var rs:ResultSet = ResultSet(data);
    subject_txt.text = rs.getRows(data).getItemAt(0).toString();
    제가 작성한 부분은데 [object Object]라고 출력이 되네요
    도와주세요....ㅠㅠ

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

      아....답변이 늦었네요.
      우선 getItemAt(0)을 하게 되면 그 해당 Object를 가져오는 것이지
      특정 칼럼의 값을 가져오지 않습니다.
      디버기해보시면 obj에 어떤 속성이 있는지 확인하시면 확인할 수 있어요
      아마 getItemAt(0).name 이런식으로 접근하시면 됩니다.

  13. 권오범 2009.06.21 11:27  댓글주소  수정/삭제  댓글쓰기

    안녕하셔요
    assql에 대한 질문입니다.

    mysql로 자료를 입력할때 위의 예제와 같이

    st.sql = "INSERT INTO products (description, price) VALUES (?, ?)";
    st.setString(1, inputDescription.text);
    st.setNumber(2, Number(inputPrice.text));
    var token:MySqlToken = st.executeQuery();
    하는데 만약에
    inputPrice.text 값이 'aa' 이고 inputPrice.text 값이 spcae이면
    server로

    "INSERT INTO products (description, price) VALUES ('aa', )"
    넘어갑니다 그리고 syntax error 나고

    assql bug인지 아니면 제가 잘못사용하는지
    알려주십시오

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

      음....그것에 대해서는 저도 잘 모르겠네요.
      저도 assql을 사용해본지 오래되어서 ㅠㅠ
      Number(inputPrice.text) 값은 0이 맞을텐데...
      0을 하드코딩해서 넣어도 그렇게 나오는지 테스트를 해보면 될 듯 하네요.
      안되면 버그임 ㅠㅠ

  14. 박주영 2009.07.10 17:34  댓글주소  수정/삭제  댓글쓰기

    난데 없이 질문입니다. 머드초보님의 ASSQL 사용예를 보고

    간단한 Datagrid를 이용해서 간단한 게시판을 만드는 중인데 너무 막히는데가 많아서

    이렇게 질문드립니다.

    현재 막히는 부분은 두가지 입니다.

    하나는 Datagrid 에 DB에서 가져온 내용을 뿌려줄때 따로 버튼을 만들어서

    메서드를 호출 하지 않으면 Datagrid 에 내용이 나오지 않는 문제입니다.

    private function selectResult(data:Object, token:Object):void{
    var rs:ResultSet = ResultSet(data);
    mydata = rs.getRows();
    }
    private function selectProcess():void{
    token=st.executeQuery(
    "SELECT num,title,writer,date,hit FROM board";);
    token.addResponder(new AsyncResponder(selectResult,fault));
    }

    게시판 보기라는 버튼을 만들어서 호출하는 메서드는 selectProcess() 메서드입니다.

    일단 버튼을 누르면 게시판에 내용은 잘 보여줍니다만

    컴포넌트를 로드 하자 마자 게시판에 내용을 보여주려고 creationComplete

    에서 저 메서드를 호출하니

    TypeError: Error #1009: null 객체 참조의 속성이나 메서드에 액세스할 수 없습니다.

    이런 에러메시지가 나오더군요 . DB에 접속하기 전에 저런 에러가 나나 보다 라고 생각해서

    DB와 접속하는 메서드 밑에서 호출해도 마찬가지로 저 에러메시지가 나타납니다.

    두번째 문제는 Datagrid 에서 글 제목을 클릭했을때 글 내용이 봐 지지 않는 문제입니다.

    Datagrid에서 ItemClick 했을시에 호출되는 메서드는 다음과 같이 작성했습니다.

    private function selectItem(e:Event):void{
    var vnum:Number = dg.selectedIndex+1;
    token = st.executeQuery("SELECT myText FROM board WHERE num='vnum'";);
    dg.visible=false;
    this.currentState ='view';
    }

    DB에 num가 1부터 시작되고 선택한 index 번호는 0부터 시작되기에 1을 더해서

    변수에 기억시켜놓고 .. 쿼리문으로 그 num 에 맞는 내용을 찾게 해서 view 스테이트에

    만들어 놓은 폼에 뿌리고 싶은데 여기서 계속 막힙니다.

    Datagrid 폼을 만들어 놓고 위에 메서드에 db에서 값을 받아오는 ArrayCollection 을 하나

    만들어 쿼리문에 반환값을 받게 한후에 datagrid 에 dataProvider 에 연결시키면 될거

    같은데 결과값이 나오질 않습니다.

    그리고 selectProcess메소드에 마지막에 있는

    token.addResponder(new AsyncResponder(selectResult,fault)); 이 메서드는 어떤 역할

    을 하는것인가요? 인자로 봐서는 selectResult메서드를 호출하면서 실패시에는 fault

    메서드를 호출하는 것 같은데 selectResult메서드 호출시 아무런 인자도 주지 않았는데

    selectResult에서는 (data:Object, token:Object) 를 인자로 받고 있어서 자바를 배운저로

    써는 매우 헷갈리는 부분입니다. 아마도 selectProcess 메서드에서 내부적으로 처리되는

    인자를 자동으로 넘겨주는거 같은데 잘 모르겠네요 .

    • 머드초보 2009.07.13 14:59  댓글주소  수정/삭제

      안녕하세요~
      소스를 전체 보고 싶은데, 볼 수 있을까요?-_-
      질문이 이해가 좀 안돼서 ㅠㅠ 이해력이 원래 좀 딸림 ㅠㅠ

  15. elyse 2009.09.10 17:39  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, BlazeDS로 Messaging service와 Remote Object를 이용(JAVA단 DB 연동)하는 방법과, Socket으로 실시간 데이터를 처리하고 asSQL로 DB 데이터를 처리하는 방법 중 어떤 방법이 더 나을까요? 댓글을 보니 asSQL의 보안문제가 있다고 하는데 구체적으로 어떤 문제가 있는지 알고 싶습니다. 또한 지금은 어느 정도 해결이 되었나...도 궁금하구요. 전 Java는 해본 적이 없지만 C로 프로젝트를 해본 적은 있어서 앞의 두 가지 방안 중 어떤 방식으로 프로젝트 방향을 결정해야 할지.. 막막하네요; 물론 Flex도 초보 입니다. ㅜ_ㅠ 답변 꼭 부탁 드릴게요!

    • 머드초보 2009.09.14 21:43  댓글주소  수정/삭제

      안녕하세요!
      어떤걸 만드실지 모르겠지만, 지속적인 유지보수가 들어가는 프로젝트라면 1번을 추천합니다^^
      답변이 완전 늦었네요-_-
      어떤걸 하시는지가 궁금하네요^^

  16. tera 2009.09.29 12:03  댓글주소  수정/삭제  댓글쓰기

    좋은글 잘 봤습니다. 저도 테스트를 해 봤는데(소스 긁어서;;)
    insert는 잘 됩니다만, selection에서 datagrid로 뿌려주는 함수 호출(예제에서 selectResult 함수)이 안되는데 왜 그런걸까요...

    테스트한 소스는 아래링크에 있습니다.
    http://naturalclass.blogspot.com/

    그럼 수고하세요..

  17. tera 2009.09.29 14:54  댓글주소  수정/삭제  댓글쓰기

    좋은글 잘 봤습니다. 저도 테스트를 해 봤는데(소스 긁어서;;)
    insert는 잘 됩니다만, selection에서 datagrid로 뿌려주는 함수 호출(예제에서 selectResult 함수)이 안되는데 왜 그런걸까요...

    테스트한 소스는 아래링크에 있습니다.
    http://naturalclass.blogspot.com/

    그럼 수고하세요..

    • 머드초보 2009.10.05 09:27  댓글주소  수정/삭제

      음...왜그럴까요...-_-
      사실 저도 저거 안해본지 오래되어서-_-
      예전에 했을 때 저는 분명히 되었는데....ㅠㅠ

  18. elyse 2009.09.30 11:16  댓글주소  수정/삭제  댓글쓰기

    아아, 저 위에 답변, 먼저 감사드려요.
    이전 예제를 가지고 리눅스 서버에 설치된 Mysql IP를 DB 주소에 넣었더니, 다음과 같은 에러가 났습니다. Mysql 버전은, 4.1.21 이구요. crossdomain 관련해서 설정한 것은 없습니다. (어떻게 설정해야 하는지 잘 모르겠습니다;;;;)

    =============================
    Error: Unsupported Server Version
    at com.maclema.mysql::HandshakeHandler/doHandshake()[/Users/Matt/Documents/FlexBuilder3/assql/com/maclema/mysql/HandshakeHandler.as:145]
    at com.maclema.mysql::HandshakeHandler/newPacket()[/Users/Matt/Documents/FlexBuilder3/assql/com/maclema/mysql/HandshakeHandler.as:42]
    at com.maclema.mysql::DataHandler/pushPacket()[/Users/Matt/Documents/FlexBuilder3/assql/com/maclema/mysql/DataHandler.as:34]
    at com.maclema.mysql::Connection/checkForPackets()[/Users/Matt/Documents/FlexBuilder3/assql/com/maclema/mysql/Connection.as:151]
    at com.maclema.mysql::Connection/onSocketData()[/Users/Matt/Documents/FlexBuilder3/assql/com/maclema/mysql/Connection.as:122]
    =========================

    위에 어느 댓글에 달린, http://panzergruppe.hp.infoseek.co.jp/fspfd.html 여기 C 소스 파일을 가져다가 리눅스 서버에 루트로 다음 작업 까지는 했는데 그 이후에 xml 파일이라던가 그런 관계를 잘 모르겠습니다.

    =======================================
    Compile at first like as following.
    gcc -Wall -O2 -o fspfd fspfd.c

    Execute as daemon by root. This server sends back fspfd.xml in same directory to clients.
    ./fspfd &
    =======================================

    이, fspfd.xml 파일이 안생기던데요. 만약 생긴다고 하면 그것을 어떻게 하면 되는 건지 잘 모르겠습니다.

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

      안녕하세요~
      저도 그런에러는 본적이 없는데, 제 생각인데요.
      Mysql이 버전이 낮아서 그런 것 같아요.
      4.X대면 좀 낮은 듯해서 지원하지 않는다고 하는 것 같네요^^

  19. 문준호 2009.11.17 02:09  댓글주소  수정/삭제  댓글쓰기

    예제 대로 코딩을 해봤는데요....

    아래에 DB주소랑 코드랑 아이디랑 비번이랑 이거 제가 잘못 적은건가요???
    실행해서 추가 버튼 눌러도 DB에 저장이 안돼요...
    ㅠ.ㅠ
    좀 알려주세요..ㅠ.ㅠ
    con = new Connection("jdbc:mysql://172.19.116.10:3306", 3306, "moongom", "비번", "products";)

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

      안녕하세요~
      혹시....URL부분에 :3306빼보고도 해보셨는지?
      포트 지정하는게 제 기억으론 2번째 파라메터인 걸로 압니다.

  20. 천천히가자 2010.03.12 10:12  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.. 머드초보님..
    글 잘보았습니다. 따라해서 실행까지 잘되었는데요..
    한가지 문제점이 있어서 질문 좀 드릴게요
    리눅스(CentOS)와 파이어폭스 환경에서는 db접속이 안되네요...
    con = new Connection("DB주소", 3306,
    "DB아이디", "DB비밀번호", "DB이름";
    con.addEventListener(Event.CONNECT, onConnect); <== 요기에서 db연결을 성공적으로 하면
    onConnect라는 함수로 가야되느데.. onConnect함수로 넘어가지를 안습니다. db접속이 안되어서 그런거 같은데요..
    이상한것은 윈도우 환경의 익스플로러랑, 윈도우 환경의 파이어폭스에서는 db에 접속하여 정보를 잘 가지고 옵니다. 리눅스환경의 파이어폭스에서만 접속이 안되네요..
    혹시나 asSQL로 db에 바로 접속하여 가져오는 것이 리눅스에서는 안되는 것인가요??
    db는 mysql5 입니다.

  21. BlogIcon 웹눈 2010.05.07 11:18  댓글주소  수정/삭제  댓글쓰기

    클라이언트 어플단에서 DB ID와 비밀번호 등을 입력하면 정보가 노출되는 위험이 있지 않을까요?
    잘 모르겠지만.. 디컴파일이 된다면...

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

      네~ 이건 보안상 매우 좋지 않은 모델입니다
      게다가 포트도 열려있어야하기 때문에-_-
      실무에서 쓰지 않는게....좋습니다^^

 

http://mudchobo.tomeii.com/tt/257 에 이어서-_-;

오라클에서 해보겠습니다.
아 우선 오라클용 jdbc가 필요해요!
ojdbc6.jar 등의 jbdc ^^

걍 오라클용 dataSource로 바꿔주면 돼요-_-;

applicationContext.xml
[code]
<!-- oracle용 -->
 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="oracle.jdbc.driver.OracleDriver"
  p:url="jdbc:oracle:thin:@localhost:1521:XE"
  p:username="dbid" p:password="dbpw" />

<bean id="insertDataOracle" class="com.mudchobo.TestInsertOracle"
  p:sqlMapClient-ref="sqlMapClient"/>
[/code]
아까 그 TestInsert 인터페이스입니다.
TestInsert.java
[code]
package com.mudchobo;

import org.springframework.transaction.annotation.Transactional;

public interface TestInsert {

 @Transactional(readOnly=true, rollbackFor={Throwable.class})
 public void insertData() throws Throwable;
 
}
[/code]
저기 선언된 bean인 TestInsertOracle을 구현해봅시다.
TestInsertOracle.java
[code]
package com.mudchobo;

import java.io.IOException;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class TestInsertOracle extends SqlMapClientDaoSupport implements
  TestInsert {

 @Override
 public void insertData() throws Throwable {
   getSqlMapClientTemplate().insert("insertData");
   System.out.println("oracle에 insert성공");
   throw new IOException();
 }
}
[/code]
MySQL처럼 IOException을 임의로 발생시킵니다.
main부분을 봅시다.
TestTransaction.java
[code]
package com.mudchobo;

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

public class TestTransaction {

 public static void main(String[] args) {
  String[] configLocation = {"applicationContext.xml"};
  ApplicationContext context =
   new ClassPathXmlApplicationContext(configLocation);
 
  TestInsert testInsertOracle =
   (TestInsert) context.getBean("insertDataOracle");
 
  try {
   testInsertOracle.insertData();
  } catch (Throwable e) {
   System.out.println("예외발생");
  }
 }
}
[/code]
오라클에서는 readOnly로 걸어 놨는데도 불구하고 insert가 됩니다.
그리고 예외를 발생시켰기 때문에 rollbackfor 값을 Throwable로 줬기때문에 IOException이 발생했을 때 롤백하게 됩니다. 잘보면 롤백이 되어있습니다.

오라클에서 set transaction read only 라고 쿼리를 날리면 transaction을 read only로 해버릴 수 있더라구요.
뭐 그냥 그렇다구요-_-;

 
Posted by 머드초보

댓글을 달아 주세요

 

스프링에서 제공하는 트랜젝션을 MySQL과 Oracle에다가 적용을 해봤습니다.
제가 잘 이해를 못하는 건지 모르겠는데, Oracle에서는 ReadOnly가 안먹혀요-_-;
MySQL에서는 먹히는데....-_-; Oracle에서는 자체적으로 transaction에서 ReadOnly를 설정하는게 있더군요.
또 Oracle은 트랜젝션기반이라고 하더라구요. 암튼, 참 어렵습니다-_-;
우선 삽질한 코드입니다.
MySQL로 해보았습니다.

필요한 lib입니다.
spring.jar - 스프링할껀데 필요하겠죠?-_-;
commons-logging.jar - 스프링하려면 이눔이 있어야 돼요-_-; 위에 있는 lib와 종속돼요-_-;
ibatis-2.3.0.677.jar - ibatis로 할껍니다. 이게 db연동을 쉽게 해주니까요-_-;
mysql-connector-java-5.1.5-bin.jar - mysql connector가 필요하겠죠!

프로젝트를 만듭시다. TestTransaction이라는 프로젝트를 만듭시다.
최상위 src폴더에다가 applicationContext.xml파일을 만듭시다.

applicationContext.xml
[code]
<?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:p="http://www.springframework.org/schema/p"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <tx:annotation-driven />
 
 <!-- MySQL용 -->
 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="com.mysql.jdbc.Driver"
  p:url="jdbc:mysql://db주소"
  p:username="dbid" p:password="dbpw" />
 
   <!--  Transaction manager for iBATIS Daos -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
  p:dataSource-ref="dataSource" />
 
 <!-- SqlMap setup for iBATIS Database Layer -->
 <bean id="sqlMapClient"
  class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
  p:dataSource-ref="dataSource"
  p:configLocation="classpath:SqlMapConfig.xml" />
 
<bean id="insertDataMysql" class="com.mudchobo.TestInsertMysql"
  p:sqlMapClient-ref="sqlMapClient"/>
</beans>
[/code]
TestInsert라는 interface를 작성해봅시다.
TestInsert.java
[code]
package com.mudchobo;

import org.springframework.transaction.annotation.Transactional;

public interface TestInsert {

 @Transactional(readOnly=true, rollbackFor={Throwable.class})
 public void insertData() throws Throwable;
}
[/code]
인터페이스에다가 트랜젝션을 걸어도 되더라구요-_-; 구현되는 모든놈이 저 옵션으로 트랜젝션이 먹히는 듯 합니다. 근데 별로 안좋은 방법인듯한데-_-; 그냥 메소드에 거는게.....-_-; 보면 readOnly옵션에다가 Throwable예외가 발생하면 롤백합니다.

구현해봅시다.
TestInsertMysql.java
[code]
package com.mudchobo;

import java.io.IOException;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class TestInsertMysql extends SqlMapClientDaoSupport implements
  TestInsert {

 @Override
 public void insertData() throws Throwable {
   getSqlMapClientTemplate().insert("insertData");
   System.out.println("mysql에 insert성공");
   throw new IOException();
 }
}
[/code]
insert를 시키고, 강제로 IOException을 발생시켰습니다.

ibatis xml부분을 봅시다.
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>
 <sqlMap resource="Insert.xml" />
</sqlMapConfig>
[/code]
Insert.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="Sqlmap">
    <insert id="insertData">
     insert into TESTDATA (DATA) values ('MUDCHOBO')
    </insert>
</sqlMap>
[/code]
보시면 단순 insert를 하고 있습니다-_-;

main부분입니다.
TestTransaction.java
[code]
package com.mudchobo;

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

public class TestTransaction {
 public static void main(String[] args) throws Throwable{
  String[] configLocation = {"applicationContext.xml"};
  ApplicationContext context =
   new ClassPathXmlApplicationContext(configLocation);
 
  TestInsert testInsertMysql =
   (TestInsert) context.getBean("insertData");
  try {
   testInsertMysql.insertData();
  } catch (Throwable e) {
   System.out.println("예외발생");
  }
}
[/code]
이걸 실행하면 트랜젝션이 readOnly이기 때문에 insert하려고 하면 에러가 나버리겠죠.
Connection is read-only. Queries leading to data modification are not allowed; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
요런 에러를 보실 수 있습니다.

Oracle은 다음 장에서-_-;
http://mudchobo.tomeii.com/tt/258 여기에 계속-_-;

 
Posted by 머드초보

댓글을 달아 주세요

 

http://mudchobo.tomeii.com/tt/318

새로운 버전에서 방식이 바뀌었습니다.

여기위에것을 보고 하세요 ^^

우연히 지돌스타님 블로그를 구독하다가 좋은 정보가 있어서 보고 있었습니다.
Flex에서 db와 연동하는 좋은 드라이버가 있다는 정보입니다.
http://blog.jidolstar.com/312


그래서 제가 삽질해봤습니다-_-;

보통 DB랑 연동하려면 JAVA, PHP, ASP 등 다른 언어와 연동이 필요합니다.
근데 이 asSQL이라는 것을 이용하면 그냥 Flex단에서 DB와 연결해줍니다.
우선 asSQL을 받아봅시다.
http://code.google.com/p/assql/
여기서 오른쪽에 보면 2.0.1버전용과 3.0.0버전용이 있습니다.
저는 Flex3으로 할 것이기에 3.0.0을 받아보도록 하겠습니다. assql_Beta2_Flex3.0.0.swc
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', 469.80),
(2, 'Table', 3502.62),
(3, 'Chair', 1061.12);
[/code]
그럼 플렉스 빌더를 실행합니다.
File -> New -> Flex Project 선택합니다. Project name은 FlexMysqlTest 라고 합시다.
Web application선택하고, Application server type은 None으로 하고 Finish 선택!

libs폴더가 있는데요. 아까 받은 assql_Beta2_Flex3.0.0.swc 파일을 libs폴더에 복사합니다.

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
 creationComplete="init();" width="400" height="400">
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   import com.maclema.mysql.events.MySqlErrorEvent;
   import com.maclema.mysql.events.MySqlEvent;
   import mx.collections.ArrayCollection;
   import com.maclema.mysql.ResultSet;
   import com.maclema.mysql.Statement;
   import com.maclema.mysql.Connection;
 
   [Bindable]  
   private var ac:ArrayCollection;
   private var con:Connection;
   private var st:Statement;
     
   private function init():void {
    con = new Connection("DB주소", 3306,
      "DB아이디", "DB비밀번호", "DB이름");
    con.addEventListener(Event.CONNECT, onConnect);
    con.addEventListener(MySqlErrorEvent.SQL_ERROR, onError);
    con.connect();
   }
   
   private function onConnect(e:Event):void {
        st = con.createStatement();
        st.addEventListener(MySqlEvent.RESULT, onResult);
        st.addEventListener(MySqlEvent.RESPONSE, onResponse);
        st.addEventListener(MySqlErrorEvent.SQL_ERROR, onError);
 
    st.executeQuery("SELECT id, description, price FROM products");
   }
   
   private function onResult(event:MySqlEvent):void {
    //FOR SELECT
    var resultset:ResultSet = event.resultSet;
    ac = resultset.getRows();
   }
   
   private function onResponse(event:MySqlEvent):void {
    //FOR INSERT, UPDATE, etc.
   }
   
   private function onError(event:MySqlErrorEvent):void {
    Alert.show(event.text);
   }
  ]]>
 </mx:Script>
 
 <mx:DataGrid id="dg" width="100%" height="100%" dataProvider="{ac}"/>
 
</mx:Application>
[/code]
소켓을 이용해서 하는거라 connect를 호출하고 연결한 뒤 소켓으로 막 보내는 것 같아요.
어쨌든 저렇게 하면 되네요. 참 쉽죠?(밥로스 버전-_-)

INSERT, UPDATE 와 SELECT는 이벤트가 서로 틀립니다.
INSERT,UPDATE는 RESPONSE고, SELECT는 RESULT네요 ^^

사용자 삽입 이미지


 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 지돌스타 2008.04.03 00:06  댓글주소  수정/삭제  댓글쓰기

    ㅎㅎㅎ 잘봤습니다.
    좋은 글 감사해요~ ^^

  2. BlogIcon 검쉰 2008.04.03 09:47  댓글주소  수정/삭제  댓글쓰기

    phpmyadmin 같은 mysql 관리툴 하나 만들어주세요! ㅋ

  3. 펄렁거스 2008.04.04 17:42  댓글주소  수정/삭제  댓글쓰기

    좋은 예제 감사합니다. 한동안 이것 저것 해봤는데 잘 안됬었는데
    한방에 되는군요...

    그런데.. 한글이 깨지는데 이건 어떻게 처리 해야 하나요?

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

      보면 flex는 무조건 utf8로 보내게 되어있습니다.
      만약 mysql서버가 euc-kr로 되어있다면 euc-kr로 보내야겠죠.
      보면 저 드라이버는 utf8로 보내게 되어있습니다.
      그래서 저걸 euc-kr로 보내려면 driver소스를 수정해야합니다.
      Connection클래스에서
      //packet.writeUTFBytes(data);
      packet.writeMultiByte(data, "euc-kr";);
      저렇게 하면 euc-kr로 보내게 됩니다.

      그리고 ResultSet에서
      //return data.readUTFBytes(data.bytesAvailable);
      return data.readMultiByte(data.bytesAvailable, "euc-kr";);
      데이터를 받을 때 보면 UTF로 받는데 euc-kr로 받아주면됩니다.

      근데 해보니까 친구서버에서는 잘 되는데 제 로컬에 있는 서버에서는 안되더군요.
      그래서
      st.executeQuery("SET NAMES 'utf8'";);
      저렇게 강제적으로 utf8로 만들고 날리면-_-;
      Response로 받는데 거기서 다시 select를 해보시면 됩니다-_-;

      결론은..아직 불안전한 드라이버같습니다 ㅠ

  4. 펄렁거스 2008.04.07 12:05  댓글주소  수정/삭제  댓글쓰기

    아 감사합니다. ㅠㅠ
    이런저런 연구를 해봐야 겠네요...

    알려주신데로 st.executeQuery("SET NAMES 'utf8'";);
    로 해결 보았습니다..

    감사해요 ^^

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

      근데 친구서버는 SET NAMES안해도 되던데 이상하네-_-;
      아 그리고 친구말로는 DB접속정보가 SWF에 포함되기 때문에
      보안상 위험하다고 합니다.
      그래서 접속정보만 따로 빼서 보안처리를 해야할 듯 합니다.
      방문해주셔서 감사해요 ^^

  5. BlogIcon 쉭스 2008.04.08 18:54  댓글주소  수정/삭제  댓글쓰기

    좋은정보 감사요~
    콕콕 찝은.. 이런 좋은 정보가.. 역시...ㅋㅋ
    요새 여기 자주 들르네용~ 히히~

    - 한글닉네임의 압박이..;;ㅎ

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

      정보가 도움이 되셨다니 다행이네요 ^^
      방문해주셔서 감사해요 ^^

  6. 2008.04.19 10:35  댓글주소  수정/삭제  댓글쓰기

    혹시 crud예제는 없나요?

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

      다 만들면 되죠 ^^
      st.addEventListener(MySqlEvent.RESPONSE, onResponse);
      이렇게 이벤트리스너를 추가하면, delte나 update, insert하면 저 이벤트함수로 들어가게 돼요. ^^

  7. 찌노 2008.05.09 09:46  댓글주소  수정/삭제  댓글쓰기

    크~ 지돌스타님 블로그 타고 왔어욤..; 이래 친절하게 예제를 만들어서 오픈해주시다니..
    감사합니당 ~ ^^ 많은 도움이 되었습니닷..!

  8. 만성피로 2008.05.13 11:29  댓글주소  수정/삭제  댓글쓰기

    머드초보님 안녕하세요~
    올려주신 자료 잘보고 해보고싶은 욕망에 DB에 테이블 생성하고 컬럼 추가한뒤에
    Flex에서 똑같이 프로젝트 생성한뒤에 실행을 시켜 보았습니다.
    그런데 "SQL Error #0:Error #2031" 에러가 뜨네용
    mxml파일에서 쿼리를 Select해서 ID와 PASS 와 이름 불러오는것은알겠는데
    어떤 데이타베이스를 쓰는지 가령
    mysql데이타베이스인지 Flex라는 데이타베이스를 생성했을때 Flex데이타베이스를 어떻게사용하는지
    알려주시기 바랍니다~~
    코딩에서 보면 어디에도 어떤 데이타베이스를 사용하는지를 찾을수가 없네요...개초보에 설움..흑흑

    부탁드리겠습니다~~

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

      con = new Connection("DB주소", 3306,
      "DB아이디", "DB비밀번호", "DB이름";);
      커넥션을 만들 때 여기다가 입력하면 됩니다.
      DB주소는 jdbc:막이런거 ^^
      db아이디는 아이디고, 비밀번호는 비밀번호고,
      db이름은 db이름쓰시면 됩니다 ^^

  9. 만성피로 2008.05.15 10:13  댓글주소  수정/삭제  댓글쓰기

    아...머드초보님 답변감사합니다....
    그런데 제가
    con = new Connection("jdbc:mysql//localhost:3306/flex",3306,
    "admin","jpaWkd", "flex";);
    admin이 디비아이디이고 jpaWkd가 DB패스워드 flex가 DB이름입니다.
    그런데 에러가 아직두 나네용..흑흑
    jdbc:mysql//localhost:3306/flex가 의심스러운데 흑흑..
    질문드리면서도 X팔려서 흑흑
    답변좀 해주시기 바래요 흑흑

  10. 만성피로 2008.05.15 10:16  댓글주소  수정/삭제  댓글쓰기

    API 살펴보니...이런식인데
    Connection () constructor

    public function Connection(host:String, port:int, username:String, password:String = null, database:String = null)
    흑흑...죽고싶퍼 캬악~

  11. 만성피로 2008.05.15 10:39  댓글주소  수정/삭제  댓글쓰기

    으흐흐...미쳐가는중 ㅋㅋ
    Google의 example가 있더라고용
    con = new Connection("localhost", 3306, "root", "password", "database name";);
    그래서 똑같이 저도 localhost로 불렀는데 데이타가 불러와지질않네요...흠흠...
    이건 머 에러메세지가 뜨질않으니 손을 어디서 대야하는지 몰겠네용..
    1.DB생성여부
    2.DB쿼리
    일단 이두개는 확실한데 말이죠 ㅎㅎ

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

      음 왜그러지-_-;
      localhost말고 ip로 한번 넣어보세요 ^^
      저도 왜그런지 모르겠네요 ㅠㅠ

  12. 오리대장 2008.06.21 05:38  댓글주소  수정/삭제  댓글쓰기

    언뜻보면은 와 유용하겠다 생각들다가도 조금만 생각해보면...
    보안문제때문에 사실상 쓰지도못할거같네요 ㅜ.ㅜ'
    보안문제와 좀더체계적인 뭔가가 필요한데...

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

      아네 그렇죠 ^^ swf파일이 완벽하게 디컴파일이 되다보니-_-;
      게다가 소켓통신으로 하는것 같아서 보안상 참 안 좋은 것 같아요.
      DB연동은 JAVA와 함께-_-;

  13. BlogIcon atom 2008.08.18 04:30  댓글주소  수정/삭제  댓글쓰기

    안녕하세요... 어떻게 검색하다.. flex와 mysql이 연동되는 글을 찾았는데 들어 오게 되었네요...

    정말 좋은 자료 인것 같아요..

    그런데 제가 이번에 flex를 처음 해보는거라 잘몰라서요.

    위의 예제 처럼 실행이랑 DB가져 오는건 아주 잘되는것 같아요...

    하지만 DB에서 가져온 arraycollection에 들어 있는 내용을 어떻게 가져와 사용을 하는지 모르겠습니다..

    datagrid는 그냥 ar에 있는걸 그대로 dataprovider에 넣어 주니 바로 나오던데 다른 list나 label이나 이런곳에 가져다 쓸려니 잘 안되더라구요..

    어떻게 하면 되는지 좋은 자료를 얻어 가는데 또 염치 없이 물어 보게 되네요..*^^*

    부탁드립니다.. 아~ 그리고 한글이 디비에 있는걸 가져오는게 위에 적혀 있는게 하는 건지 잘 이해가 가지 않네요..

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

      안녕하세요!
      ArrayCollection은 배열인데요. label에 사용하시려면 그냥 ac변수에서 해당 값을 접근할 수 있어요. getItem인가? 그런 메소드가 있는데 그걸로 해당 Object로 접근해서 원하는 값에 접근하면 돼죠. 그걸 이용해서 사용하시면 되구요.
      ArrayCollection에 관련된 API나 예제를 찾아보시면 금방 이해하실 수 있을 겁니다 ^^
      java에서 List같은 놈이죠.

  14. BlogIcon atom 2008.08.19 22:56  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~~! 우선 답변 감사합니다.

    저도 머드초보님이 이야기 하신데로 해보았습니다. 하지만 되지 않네요... 댓글 보기 전 글을 남길때 다 해보고 남긴거라서..

    <mx:Label x="31" y="301" width="285" height="47"
    text="{ac.getItemAt(0).toString()}"/>

    이렇게 하니 [object Object] 이렇게만 나오던데..ㅋㅋㅋ

    위의 예제에 맨끝에 출력에 label하나 붙여서 나타내었어요..

    어떻게 해야 할까요?ㅠㅠ 이걸로 이틀이란 시간을 보내니.. 힘드네요..

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

      getItemAt()메소드는 배열의 0번째의 Object를 가져오는 겁니다.
      Object를 toString()해버리면 당연히 그렇게 나옵니다.
      해당 Object에 대한 속성값을 나타내면 되죠.
      {ac.getItemAt(0).description} 이런식으로 사용하면 됩니다.
      저위의 예제를 따라하셨다면 description, id, price속성이 있을껍니다.
      디버깅해보시면 알 수 있습니다 ^^

  15. BlogIcon atom 2008.08.20 00:39  댓글주소  수정/삭제  댓글쓰기

    감사합니다.. 점을 찍었을때 나오지 않아서 되지 않는 줄 알았는데 되네요..

    C#에서는 점을 찍으면 나오는데.. flex는 처음 접해서 잘 몰랐습니다.

    정말 감사합니다.

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

      어떤값이 들어갈지 모르니 점찍으면 안나와요 ^^
      아 그리고, Flex단에서 db연동은 보안상 위협(?)을 느낄 수 있습니다-_-;
      DB는 JAVA나 서버단 언어에서 하도록 하는게 좋습니다 ^^

  16. 동그라미 2008.08.23 04:29  댓글주소  수정/삭제  댓글쓰기

    실행을 하면
    st.addEventListener(MySqlEvent.RESULT, onResult);
    st.addEventListener(MySqlEvent.RESPONSE, onResponse);
    st.addEventListener(MySqlErrorEvent.SQL_ERROR, onError);

    에서 1061: 정의되지 않은 메서드 addEventListener을(를) 정적 유형 com.maclema.mysql:Statement의 참조를 통해 호출했습니다. 라고 하는데 무엇이 문제일까요...T_T

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

      음....이상하네요.
      혹시...그 assql swc파일은 넣으셨는지요?
      없다고 나오는 것보니 라이브러리가 없는 것 같은데요.
      도움이 되지 못해서 죄송해요 ㅠ

  17. keril 2008.09.02 21:46  댓글주소  수정/삭제  댓글쓰기

    저도 동그라미님이랑 같은 오류가납니다
    머드초보님께서 말씀하신 assql_Beta2_Flex3.0.0.swc 는 없구요
    대신 asSQL-Beta2.7.swc 을 받았는데 여기에는 addEventListener메소드가 없나봐요
    이걸 어케해야할지 ㅜㅜ

    • keril 2008.09.02 22:00  댓글주소  수정/삭제

      애궁 제가 문제제기하구 해결까지했네요
      해결이라긴뭐하지만 assql_Beta2_Flex3.0.0.swc 을 제대로 구해서 넣으니 되더군요
      버전다른 엄한걸받아서 피봤네요 ^^

      무슨이유인지는 모르지만 다운로드 목록에서 assql_Beta2_Flex3.0.0.swc
      이 없어진듯 합니다.

      여기저기 기웃거린 결과 렉스님의 블로그에 링크목록이 있더군요 주소 올립니다...
      http://blog.naver.com/rojinsong?Redirect=Log&logNo=50030139861
      불펌이에요 ^^;;

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

      아....뭔가 코딩방식이 바뀌었나보군요.
      새로운 버전이 나왔는데 그걸로 다시 예제를 작성해봐야겠습니다.
      감사해요 ^^

  18. keril 2008.09.02 23:56  댓글주소  수정/삭제  댓글쓰기

    거의 다된줄알구 좋아했는데 마지막에 뭔가 틀어졌네요 ㅎ

    run을하면 새창에서 SQL Error #0: Error #2031: 소켓 오류입니다. URL: jdbc:mysql://localhost/aa
    이라는 메세지가 나와요 ㅜㅜ
    mysql-connector 도 제대로 받아서 C:\Program Files\Java\jdk1.6.0_07\jre\lib\ext 경로로 잘 넣어줬는데 더이상 뭐가 잘못된건지 짐작도 가지않아요 ㅜㅜ

    도움 부탁드립니다

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

      그건 mysql설정문제 인 듯 싶습니다 ^^
      mysql은 포트를 1521을 사용하는데
      mysql://localhost:1521/aa 를 해보면 될 것 같기도하고-_-;
      암튼, 저 주소를 못찾는 것 같아요 ^^

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

      아그리고, 예제를 보니 코딩방식이 바뀐게 맞네요.
      Statement에 addListener를 하는게 아니라
      token을 만들어서 하는 듯 하네요.
      좀 더 봐야겠네요 ^^

    • keril 2008.09.03 15:08  댓글주소  수정/삭제

      3.0버전은 날려버리고 mysql설치부터 다시 삽질해봐야겠어요 ㅋ

      mysql://localhost:1521/aa 로 바꿔서 해봐도 역시 같은 메세지가 나옵니다 ^^

    • 머드초보 2008.09.03 18:59  댓글주소  수정/삭제

      아 mysql의 버전이 낮아서 일 수도 있겠네요.
      저는 테스트할 때 5.0에서 했습니다.
      그리고, 새로운 버전asSQL2.7Beta용으로 예제를 만들어봤습니다.
      참고해주세요 ^^
      mysql버전을 올리고 다시 해보세요 ^^

  19. 천천히가자 2010.03.12 09:48  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.. 머드초보님..
    글 잘보았습니다. 따라해서 실행까지 잘되었는데요..
    한가지 문제점이 있어서 질문 좀 드릴게요
    리눅스(CentOS)와 파이어폭스 환경에서는 db접속이 안되네요...
    con = new Connection("DB주소", 3306,
    "DB아이디", "DB비밀번호", "DB이름";);
    con.addEventListener(Event.CONNECT, onConnect); <== 요기에서 db연결을 성공적으로 하면
    onConnect라는 함수로 가야되느데.. onConnect함수로 넘어가지를 안습니다. db접속이 안되어서 그런거 같은데요..
    이상한것은 윈도우 환경의 익스플로러랑, 윈도우 환경의 파이어폭스에서는 db에 접속하여 정보를 잘 가지고 옵니다. 리눅스환경의 파이어폭스에서만 접속이 안되네요..
    혹시나 asSQL로 db에 바로 접속하여 가져오는 것이 리눅스에서는 안되는 것인가요??
    db는 mysql5 입니다.

    • 머드초보 2010.03.20 13:24  댓글주소  수정/삭제

      일단 flash에서 직접 소켓을 연결해서 mysql로 가져오기 때문에 mysql포트가 닫혀있으면 아마 가져올 수 없을겁니다.
      그 문제가 아니라면 잘 모르겠습니다 ㅠㅠ

  20. FLEX초보 2015.05.06 19:00  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    머드님 덕분에 많이배우고 있는데요~

    위와 같은 방식으로 하면 보안상에 문제가 많지요?

    XML방식으로 가져와서 FLEX 애플리케이션에서 display 해주는 방식은 없을까요?ㅠㅠ

    flex 어렵네여 ㅠㅠ

 
우선 기본적으로 솔라리스10에는 MySQL이 설치가 되어있더군요-_-;
몰랐습니다. 걍 지우고 다시 깔아봅시다. 원래 삽질을 좋아해서-_-;

pkgrm으로 mysql 지워버립시다-_-;(이래도 되나-_-;)

다시 깔아봅시다.
http://dev.mysql.com/downloads/ 이곳에서 MySQL 솔라리스 pkg용으로 받습니다.
Solaris (pkgadd packages) 이눔인 것 같습니다.

우선 mysql계정을 만들어야 돼요.
[root][/] groupadd mysql
[root][/] useradd -g mysql mysql
[root][/] passwd mysql
새 암호:
새 암호를 다시 입력하십시오:
passwd: 암호(mysql용)가 성공적으로 변경되었습니다.

mysql이라는 그룹을 추가하고 mysql이라는 사용자를 추가하고 그룹은 mysql로 하고 비밀번호를 바꿔줍시다.
아.....그리고 mysql이라는 계정에 디렉토리가 아마 /home/mysql로 되어있는데요.
home아래에 이상하게 디렉토리가 안만들어지드라구요. 그래서 /user/mysql/ 이라는 디렉토리를 만들고
소유자를 mysql로 바꿨습니다.

[root][/]mkdir /user/mysql/
[root][/]chown mysql /user/mysql/
[root][/]cd /user/mysql/
[root][/user/mysql]ls -al
총 4
drwxr-xr-x   2 mysql    root         512  1월 18일  18:37 ./
drwxr-xr-x   4 root     root         512  1월 18일  18:37 ../
[root][/user/mysql]vi /etc/passwd/

mysql:x:101:100::/user/mysql:/bin/csh  #홈디렉토리변경 및 쉘도 변경

받은다음에 서버에 올려서 gunzip으로 풀고, pkgadd로 패키지를 설치합시다. 당근 root계정으로 ^^
[root][/user/mudchobo]gunzip mysql-5.0.45-solaris10-i386.pkg.gz
[root][/user/mudchobo]pkgadd -d mysql-5.0.45-solaris10-i386.pkg

이제 막 설치가 되는데요. 다되었으면 "<mysql>(이)가 성공적으로 설치되었습니다." 라고 떠요.
기본으로 /usr/local/mysql/ 에 설치가 되어있습니다.

설정파일을 만들어야하는데요.  /etc/my.cnf 에다가 만듭니다.
[root][/user/mudchobo]vi /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /user/mysql/data
datadir은 mysql 홈디렉토리아래에 data디렉토리로 설정해두시면 됩니다.
저의 홈디렉토리는 /user/mysql/ 이어서 저렇게 설정한 겁니다.

mysql이 어느경로에서도 실행될 수 있게 PATH를 잡아줍시다.
기존 PATH에 /usr/local/mysql/bin 이눔도 추가해줍시다.

csh에서는 setenv PATH {$PATH}:/usr/local/mysql/bin 이런식으로 합니다.

그다음 가장먼저 실행해야할 mysql_install_db를 실행해야합니다.
[root][/] cd /usr/local/mysql/scripts
[root][/opt/mysql/mysql/scripts]ls
mysql_install_db*           mysql_install_db.in         mysql_install_db.old.1208*  mysql_install_db.old.1731*
[root][/opt/mysql/mysql/scripts] ./mysql_install_db --user=mysql --ldata=/user/mysql/data

라고 해주면 됩니다. 자 이제 mysql을 띄워 봅시다. mysql은 mysql계정으로 들어가서 띄워야합니다.
[mysql][/user/mysql] mysqld &
[1] 1516
[mysql][/user/mysql] 080118 19:07:17  InnoDB: Started; log sequence number 0 43655
080118 19:07:17 [Note] mysqld: ready for connections.
Version: '5.0.45'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)
[mysql][/user/mysql]

mysql에 접속해봅시다. root비밀번호가 처음에는 설정되어 있지 않습니다. password없이 접속됩니다.
[mysql][/user/mysql] mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>


mysql 비밀번호 변경하는 방법은 2가지가 있네요(더 있을 수도 있을지도^^)

1. mysqladmin을 이용해서 하는방법
[mysql][/user/mysql] mysqladmin -u root password '비밀번호'


2. mysql에 mysql -u root 로 접속해서 변경하는 방법(이건 차후에 변경할 때도 쓰이겠죠^^)

[mysql][/user/mysql] mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.0.45 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('비밀번호');
Query OK, 0 rows affected (0.01 sec)



이제 사용자를 추가해봅시다.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'myid'@'%' IDENTIFIED BY 'mypasswd' WITH GRANT OPTION;
Query OK, 0 rows affected (0.02 sec)
mysql>

저기 %로하셔야 어디서든 접속이 가능한 계정으로 만들어집니다. localhost로하면 local에서 밖에 접속을 못합니다.

mysql을 종료시켜봅시다.
[mysql][/user/mysql] mysqladmin -uroot -p1234 shutdown
080118 19:27:18 [Note] mysqld: Normal shutdown
080118 19:27:18  InnoDB: Starting shutdown...
080118 19:27:20  InnoDB: Shutdown completed; log sequence number 0 43655
080118 19:27:20 [Note] mysqld: Shutdown complete
[mysql][/user/mysql]

아....잘되네요

두리야 다 정리했다 어셔 시도해보거라-_-;
 
Posted by 머드초보

댓글을 달아 주세요