저번에 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 머드초보
,
 

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 머드초보
,
 
ActionScript에서 상속-_-;













부모클래스
[code]package com.withflex.myclasses
{
 public class MyClass
 {
  protected var myname:String;
 
  public function setMyname(myname:String):void {
   this.myname = myname;
  }
 }
}
[/code]
자식클래스
[code]
package com.withflex.myclasses
{
 public class MySubClass extends MyClass
 {
  public override function setMyname(myname:String):void {
   this.myname = myname;
   trace(myname);
  }
 
  public function getMyname():String {
   return myname;
  }
 }
}

[/code]
MyClass를 상속받았어요. 그래고 setMyname을 오버라이딩하고, getMyname을 추가했네요.

[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 creationComplete="initApp()">
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   import com.withflex.myclasses.MySubClass;
   import com.withflex.myclasses.MyClass;
   
   private var myObj:MyClass;
   private var mySubObj:MySubClass;
   
   private function initApp():void {
    myObj = new MyClass();
    myObj.setMyname("성종천"); //이눔은 trace안찍힘-_-;
   
    mySubObj = new MySubClass();
    mySubObj.setMyname("성종천"); //이눔은 찍힘-_-;
   }
   
   public function traceName(event:MouseEvent):void {
    Alert.show(mySubObj.getMyname());
   }
  ]]>
 </mx:Script>
 <mx:Button label="버튼입니다" click="traceName(event);"/>
</mx:Application>
[/code]
아....잘되네요.

인터페이스도 되네요.
File -> New -> Action Script interface선택!
[code]
package com.withflex.myclasses.interfaces
{
 public interface IMyClass
 {
  function setName(names:String):void;
 }
}
[/code]

[code]package com.withflex.myclasses
{
 import com.withflex.myclasses.interfaces.IMyClass;
 
 public class MyClass implements IMyClass
 {
  protected var myname:String;
 
  public function setMyname(myname:String):void {
   this.myname = myname;
  }
 }
}
[/code]

그외 액션스크립트 관한 거.

ActionScript는 " "랑 ' '랑 같은 역할을 합니다. 그 이유는 MXML에서는 property값이 ""이기때문입니다.

trace라는 내장함수가 있는데, 디버그모드에서만 작동합니다. 값을 찍어볼 수 있습니다.

도움말은 마우스대고 shift + f2입니다.

액션스크립트에서 생성한 것은 디자인모드에서 안 보입니다.

NaN은 Not a Number의 약자랍니다-_-;(뭔지 몰랐는데 ^^)

var arr:Array = []; 랑   var arr:Array = new Array(); 랑 같은 거랍니다 ^^

C#에서도 있는데 is랑 as연산자가 존재합니다.

/**      */ 라는 주석이 있는데 다큐먼트 주석이랍니다. 좀 더 알아봐야겠습니다 ^^

=== 연산자도 있는데 이것은 값뿐아니라 메모리도 참조하는지 확인한답니다 ^^

delete연산자가 있는데 그냥 변수에 null넣는 거랑 같은 거랍니다-_-;

for in, for each등 편한 for문을 제공합니다 ^^ c#에도 있어요

함수를 변수처럼 사용이 가능해요 ^^

dynamic클래스라는 게 있는데 아무것도 없는 것에 나중에 함수를 추가하고 그럴 수 있다네요. 비추랍니다-_-;

액션스크립트에서도 arguments가 있답니다.

뭐 등등 여러가지 얘기가 많고, 좋은 as3에 관한 ppt를 주셨는데 공개를 하면 안되는 거랍니다 ^^
굉장히 괜찮은 자료네요. 문법은 이것만 있으면 공부할 수 있겠어요 ^^

그리고, 책을 추천해주셨는데 Essential ActionScript 3.0
http://book.naver.com/bookdb/book_detail.php?bid=2882520

가격이.......-_-; 뭐이리 비싸지=-_-;

숙제도 내주셨어요. 컴포넌트익스플로러에서 컴포넌트 쭉 둘러보고 오시고,
ppt준거 한번 씩 해보고 확인해보랍니다. ^^

다음주가 기대되는군요 ^^
 
Posted by 머드초보
,
 

우선 한빛ENI가 어딘지 몰라서 삽질하다가 겨우 찾아냈습니다.

이거 8시간동안 한번에 하려니 무쟈게 힘들군요-_-;
어쨌든 재미있게 들었습니다.

FlexComponent 운영자이신 브라이언(최성훈)님이 강의하시는데 너무 잘하시네요 ^^
첫시간이라서 FLEX에 대해서 간단한 소개와 AS3의 문법 등을 강의하셨습니다.

ActionScript3를 오늘 배운 결과 자바랑 완전 같군요! AS3를 잘다뤄야하는데 그것도 모르고 FLEX를 만졌다니 부끄러울 따름입니다. 완전 강력하다는 것도 느꼈어요. 불가능한게 없군요 ^^

앞으로도 더욱 멋진 강의가 기대되네요 ^^


이날 배운 내용.
우선 컴포넌트를 생성할 때 방법이 2가지가 있습니다.
XML태그로 컴포넌트를 생성하는 방법.
[code]<mx:Button label="버튼" />[/code]
ActionScript를 이용하여 컴포넌트를 생성하는 방법.
[code]var btn:Button = new Button();
btn.label = "이것은 런타임에 생성합니다.";
this.addChild(btn);
[/code]
액션스크립트에 있는 버튼은 런타임에 생성되므로, 미리생성해놓은 mx:Button태그보다 나중에 생깁니다.

커스텀 컴포넌트를 생성할 때에도 방법이 2가지가 있습니다-_-;
MXML을 하나 새로 만들어서 하는법.
File -> New -> MXML Component 해서 기본으로 깔리는 것을 정한 뒤 Finish!
[code]<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
 <mx:Label id="lb" text="Hello World!" />
 <mx:Button id="btn" label="버튼"/>
</mx:HBox>
[/code]
실제 메인 mxml에서는 이렇게 사용한다.
[code]<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:local="*"/>
<!-- 여기에서 xmlns를 정하고싶은 걸로 주고, 그 해당 package를 넣으면 됩니다.-->
 <local:CompControl /><!-- 새 컴포넌트만들때 이름을 넣어주면 됩니다.
</mx:Application>
[/code]
ActionScript를 이용해서 클래스를 생성한 뒤 하는 법.
폴더를 com/withflex/comp/에다가 New -> Action Script Class를 선택!
Name에 MyButton이라고 하고, Superclass는 mx.controls.Button을 받읍시다.
[code]package com.withflex.comp
{
 import mx.controls.Button;

 public class MyButton extends Button
 {
  public function MyButton():void {
   this.label = "액션스크립트클래스로 생성한 버튼";
  }
 }
}
[/code]
Button을 상속받아서 기본 label을 저렇게 바꿨습니다. 그냥 버튼 생성하면 저게 나오게 됩니다.
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 xmlns:btn="com.withflex.comp.*">
 <mx:Button label="버튼" />
 <btn:MyButton />
</mx:Application>
[/code]
패키지명을 저렇게 줬으니 저렇게 하면 되고, btn:MyButton만 해도 label에 이름이 들어갑니다.

다음으로-_-;

 
Posted by 머드초보
,