팝업사용시 TitleWindow, Panel 을 드래그 가능하게 하거나 못하게 하는 기법이 나와있습니다.

http://blog.flashplatform.kr/174


[출처]

http://devgeon.blogspot.com/2008/06/flex-3-advanced-datagrid.html

그동안 개발에는 일반 DataGrid 만 사용해왔다.

하지만 마지막 개발중 Advanced DataGrid 에 대해 알았고 이놈 만만치 않은 놈이란걸 느꼈다.

우선 Adobe Lab 에서 소개하는 Advanced DataGird 의 특징은 아래와 같은것이 있다.
원문 링크

  • 다중 Column 정렬 기능 ( multi column sorting interface )

  • 행 단위 Formatting ( cell-level formatting functions )

  • 계층적 보기 기능 ( tree view )

  • 행 단위 선택 기능 ( cell selection )

  • 열 수정 가능 ( custom rows )

  • 행 Groupping ( column grouping )

  • 합산 하기 및 Grid 출력하기 ( SummaryCollection and the PrintAdvancedDataGrid )
각 특징에 대한 예제도 압축으로 제공하던데.. 일단 글쓰는 지금은 소스를 확인해보기 전이라 어떤지 모르겠다.. 간혹 Flex 2 source 를 제공하는 경우도 있더이다.. 다운로드

google blog.. swf 도 못올린다..
외부에 올리고 link 하는 방법이 있기야 하겠지만.. 어디 이게 세계 최고의 blog 라 할 것인가;
하지만 국내 어느곳도 google 의 service 를 따라오지 못하기에 꾹 참고 나중을 생각해 그냥 쓴다..

실제 SWF 동작 화면은 위 예제 download link 를 통해 경험해 보기 바란다.

블로그는 이미지를 통해 써야겠다..

우선 다중 Column 정렬 기능 이다. Column Header 를 Ctrl 을 누른채 선택하면 된다.
예제파일 1,2 번에서 별다른 기능은 보이지 않았고 위 기능만 보였다.

간단히 source 를 살펴보니 1번 예제는 그냥 아무런 특징이 없는 일반적인 방법으로 data 를 binding 한 예제이고, ( 여기서 살펴볼것은 variableRowHeight="true" 이다. 이 속성 하나로 자동 data 줄바꿈이 가능하다. 기존 DataGrid 에서의 문제가 해결된 셈이다. )
2번 예제는 ActionScript 초기화 작업에서 정렬을 지정해주는 코드가 들어있다.



그다음이 계층적 보기 기능 이다. 이미지에서 보이듯이 다중 Column 정렬 기능또한 가능하다. 당연하지 않은가.. 여기서 사용한것도 Advanced DataGrid 이니까..
여기서 사용된 파일이 4번 file 이다.



그리고 행 단위 Formatting 기능. 그냥 DataGrid 에선 Label_Function 으로 입력될 Text 내용을 바꿨었고, Column 의 ItemRenderer 를 사용해 Text의 서식을 바꿨었는데.. 어떤 방식으로 행 단위 Formatting 을 지원하는지.. 궁금하다. source 를 열어봐야 알겠지.. 요건 5번 file




행 관련 또하나의 개선. 행 단위 선택 기능. Grid 의 Data를 이용한 별도의 작업이 필요할때 아주 요긴하게 쓰일것 같다. ( 예를 들면 특정 행의 data를 double click 한다던지.. cursor 를 over 한다던지 했을때 별도의 data 를 표시하는 등.. )
Ctrl 을 누른채 선택하면 복수 선택도 가능하다. 이건 6번 file



또하나의 멋진기능. 합산 하기 및 Grid 출력하기 중 합산 하기
기존의 DataGrid 에선 이 작업을 하려고 늘 database 에서 query 를 할 때 마지막 행에 별도의 data 를 계산하여 구겨 넣어야 했다. 완전 억지;
논리적인 데이터와 사람의 눈이 따로 놀았다 ㅎㅎ

예) 마지막에 미운오리새끼 취급을 받아야 하는 소계행을 보라..


하지만 Advanced DataGrid 에선 이렇게 멋지게 처리된다. 7번 file



그다음은 위 특징 목록에는 없지만 ( 내생각엔 열 수정 기능 ( custom rows ) 가 이에 해당하지 않나 싶은데.. ) 예제엔 있는 제목 열 나누기 ( Custom Column Header 라고 말해야 하나; Divide Column Header 라고 말해야 하나..) 이것도 엑셀을 통한 화려한 표를 좋아하는 분들께는 좋은 소식이다. 예제 9번에 있다.



마지막은 어떤 기능인지 모르겠지만 아마도 합산 하기 및 Grid 출력하기 중 출력하기 관련 기능이지 않나 싶다. 10번 file



이상이다.

테마파일을 받아서 적용하는 법입니다.
전에 모아 놓았던 것을 이제서야 한번 보게 되네요.

프로젝트에서 Properties로 들어가고, Flex Compiler로 들어갑니다.
flekristal theme을 사용한다고 할때, compiler.theme 옵션을 다음과 같이 추가합니다.

-compiler.theme=./theme/flekristal/src/flekristal.css

swc 파일을 추가한다면
-theme=../theme/theme.swc 을 추가합니다.

추가하고 컴파일을 다시 해야만 합니다.

지돌스타님 블로그를 참고하였습니다.
http://blog.jidolstar.com/380


먼저 다음과 같은 설치가 되어 있습니다. 버젼은 현재 제가 사용하는 것입니다.
개발용이라 local에 모두 설치했습니다.

1. JDK 설치 (1.6.0_13)
2. Tomcat 설치 (6.0.20)
3. Eclipse 설치 (Galileo)
4. Flex 설치 (3.3)
5. BlazeDS 설치 (3.2.0.3978)

지돌스타님의 블로그에 방문해서 5번까지 설치합니다.


6. MSSQL JDBC Driver : sqljdbc (2.0.1803.100)
간단하게는 sqljdbc4.jar를 tomcat home 밑에 lib 디렉토리에 복사하면 됩니다.

이제 JNDI 셋팅을 합니다. 

다음과 같이 하면 MSSQL과 연결이 됩니다.

import java.sql.Connection;
import java.sql.*;


  ArrayList<Member> al = new ArrayList<Member>();
  try {
      // Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); sqljdbc4부터는 안써도 된다네요.
  
      String connectionUrl = "jdbc:sqlserver://192.168.0.10:1433;" +
           "databaseName=ABCD;user=username;password=password;";
      Connection con = DriverManager.getConnection(connectionUrl);
   
      String SQL = "SELECT * FROM tablename where lastname='" + name + "'";
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(SQL);

      while (rs.next()) {
          al.add(new Member("abcd",30,"test1"));
          al.add(new Member("efgh",31,"test2"));
          al.add(new Member(rs.getString("emp"),1,rs.getString("lastname")));
      }
      rs.close();
      stmt.close();
      con.close();
      return al;


하지만 Tomcat의 DB Pooling 기능을 이용하려면 JNDI를 이용해야 한다고 합니다.

import를 먼저 합니다. 

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

 

 ArrayList<Member> al = new ArrayList<Member>();
  try {
       Context initCtx = new InitialContext();
      Context envCtx = (Context) initCtx.lookup("java:comp/env");
      DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");

      Connection con = ds.getConnection();
   
      String SQL = "SELECT * FROM tablename where lastname='" + name + "'";
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(SQL);

      while (rs.next()) {
          al.add(new Member("abcd",30,"test1"));
          al.add(new Member("efgh",31,"test2"));
          al.add(new Member(rs.getString("emp"),1,rs.getString("lastname")));
      }
      rs.close();
      stmt.close();
      con.close();
      return al;



소스를 위처럼 바꾸고
Eclipse에서 Project Explorer에 보면 Servers가 있는데 여기에 context.xml과 server.xml를 수정합니다. 기존에 있는 것은 두고 ResourceLink와 Resource만 추가하면 됩니다.

[context.xml]

<Context>
   ...
    <ResourceLink name="jdbc/EmployeeDB" global="jdbc/EmployeeDB" type="javax.sql.DataSource"/>
</Context>


[server.xml]

  <GlobalNamingResources>
    .....
      <Resource name="jdbc/EmployeeDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="username"
            password="password"
            driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
            url="jdbc:sqlserver://192.168.0.10:1433;DatabaseName=ABCD"
            maxActive="8"
            maxIdle="4"/>
  </GlobalNamingResources>

 

지돌스타님의 블로그에 설명이 잘 되어 있습니다.

http://blog.jidolstar.com/362

지돌스타님 블로그에 잘 설명되어 있습니다.
http://blog.jidolstar.com/365
제공 : 한빛 네트워크
저자 : Jack Herrington
역자 : 노재현
원문 : Creating MyTube with Flex and PHP

[이전 기사 보기] Flex와 PHP를 이용한 MyTube 구현(1)

Flex를 이용한 인터페이스 구성 파트 1

Flex를 이용해서 원하는 비디오를 재생시키기 위해서는 Flex에게 재생시킬 수 있는 비디오의 리스트를 알려줘야만 합니다. 어떻게 해야하냐면 XML파일을 이용해서 Flex에게 비디오 리스트 정보를 넘겨줄 수가 있는데요, 여기서는 PHP로 다시 돌아가서 데이터베이스에서 비디오 리스트를 읽어들인 후에 XML로 출력하는 스크립트를 만들어 보도록 하겠습니다. 다음 [리스트 6]의 movies.php 파일을 보도록 하죠.

[리스트 6] movies.php
<?phprequire "DB.php";$moviebase = 'http://localhost:8080/movies/';header( 'content-type: text/xml' );$dsn = 'mysql://root@localhost/movies';$db =& DB::connect( $dsn );if ( PEAR::isError( $db ) ) { die($db->getMessage()); }?><?php$res = $db->query( 'SELECT title, source, thumb, width, height FROM movies' );while( $row = $res->fetchrow( ) ) {?>  <?php}?>
위 PHP 스크립트를 만든 후에 커맨드 라인에서 실행시키거나 브라우저에서 실행시키게 되면 다음 [그림 3]과 같은 XML 리스트를 볼 수가 있습니다.


[그림 3] XML로 표현된 비디오 리스트

이제 XML로 비디오 리스트 정보를 넘겨줄 수 있으니 전에 만들었던 simplemovie.mxml 파일을 좀 더 개선해 보도록 하겠습니다. 다음 [리스트 7]은 simplemovie.mxml의 업그레이드 된 버전입니다.

[리스트 7] mytube1.mxml
<?xml version="1.0" encoding="utf-8"?><?xml:namespace prefix = mx />import mx.rpc.events.ResultEvent;import mx.controls.VideoDisplay;import mx.controls.List;import mx.rpc.http.HTTPService;import mx.collections.ArrayCollection;[Bindable]private var movies : ArrayCollection = new ArrayCollection();public function onGetMovies( event : ResultEvent ) : void{  var firstMovie : String = event.result.movies.movie[0].source.toString();  videoPlayer.source = firstMovie;  movies = event.result.movies.movie;  movieList.selectedIndex = 0;}public function onPrevious() : void{  if ( movieList.selectedIndex == 0 )    movieList.selectedIndex = movies.length - 1;  else    movieList.selectedIndex -= 1;  videoPlayer.source = this.movieList.selectedItem.source.toString();}public function onPlay() : void{  videoPlayer.source = this.movieList.selectedItem.source.toString();  videoPlayer.play();}public function onNext() : void{  if ( movieList.selectedIndex >= ( movies.length - 1 ) )    movieList.selectedIndex = 0;  else    movieList.selectedIndex += 1;  videoPlayer.source = this.movieList.selectedItem.source.toString();}public function onChange() : void{  videoPlayer.source = this.movieList.selectedItem.source.toString();}                                           
전과 비교해서 크게 바뀐 부분이 있다면 파일의 상단에 있는 액션 스크립트(ActionScript)인데요, 이 코드로 전체적인 인터페이스를 관리하게 됩니다. 이 액션 스크립트가 하는 일은 먼저 onGetMovies 함수에 있는 HTTPService를 이용해서 movies.php 파일로부터 XML 정보를 읽어들이는 것입니다. HTTPService 클래스는 XML 리스트를 찾게 되면 XML 문서 객체모델(Document Object Model)로 변경하게 되고, 우린 이 문서 객체 모델을 이용해서 첫번째 비디오에 대한 정보를 얻어서 재생할 수가 있습니다. 또 onGetMovies 함수는 movies 라는 변수를 이용해서 페이지에 있는 리스트 박스에 비디오의 이름을 출력하게 됩니다. 나머지 액션 스크립트는 유저가 리스트 박스에 있는 비디오를 선택하거나 "이전", "다음" 버튼을 선택했을 경우를 처리하기 위한 코드입니다.

위 리스트의 제일 아래를 보면 전체 유저 인터페이스를 구성하는 Flex 오브젝트를 볼 수 있습니다. 여기에 이전 비디오와 다음 비디오를 선택할 수 있는 버튼을 배치하고, 오른쪽에는 현재 비디오 리스트를 출력하는 리스트 박스가 배치되어 있습니다.

이제 Flex Builder를 이용해서 위 프로그램을 컴파일하고 실행시키게 되면 [그림 4]와 같은 화면을 볼 수 있습니다.


[그림 4] Flex를 이용해서 구성한 첫 번째 인터페이스

리스트 박스에서 비디오를 선택할 수도 있고, 이전, 다음 버튼을 이용해서 비디오를 선택할 수도 있습니다. 멋있죠? 이제 미리보기 이미지를 제공해 주면 더 멋있어질 것 같네요.

Flex를 이용한 인터페이스 구성 파트 2 – 미리보기 이미지

미리보기 이미지를 비디오 리스트에 출력하려면 리스트 박스를 비디오의 제목과 미리보기 이미지를 같이 출력할 수 있도록 수정해야 합니다. 다행히도 Flex의 기능을 이용하면 아주 쉽게 수정이 가능합니다. 우선 태그에 itemRenderer를 추가하도록 하고, 다음 [리스트 8]을 보겠습니다.

[리스트 8] mytube2.mxml
...  ...
여기서 MovieItem이라는 item renderer MXML 컴포넌트를 만들었습니다. 이 컴포넌트를 만들려면 메뉴에서 "New > MXML Component"를 선택하고 [리스트 9]와 같이 컴포넌트를 코드에 넣으면 됩니다.

[리스트 9] MovieItem.mxml
<?xml version="1.0" encoding="utf-8"?>     
여기서는 Canvas 라는 컨테이너를 이용했지만, 원한다면 마음에 드는 컨테이너를 선택해서 설정하셔도 괜찮습니다. 그리고 나서 미리보기 이미지 추가를 위해서 태그를 사용하고 비디오 제목을 출력하기 위해서 을 이용하면 됩니다. 좀 더 재밌게 해보기 위해서 미리보기 이미지를 약간 회전시켜 봤습니다. [그림 5]를 보도록 하죠.


[그림 5] 미리보기 이미지를 추가한 리스트 박스

꽤 괜찮은 비디오 플레이어가 됐네요. 여기에 추가적으로 비디오 설명, 재생 시간, 링크, 추천 버튼과 같은 기능을 추가하면 더 좋을 것 같습니다.

저장소와 대역폭

데이터베이스를 구성하고 비디오 공유 사이트 페이지를 만들어 내는것 자체는 지금까지 잘 해결했는데, 사실 이것말고 한가지 더 고려해야 할 것이 있습니다. 바로 대역폭을 고려해야 합니다. 플래시 비디오 파일 자체가 인코딩이 잘 된다고 해도 역시 비디오 파일이기 때문에 크기가 큰 편에 속하게 됩니다. 그렇기 때문에 중간에 끊김없이 비디오 재생을 얼마나 할 수 있는지 파악하는 것이 무엇보다 중요하게 됩니다.

확실한 방법중 하나는 인터넷 데이터 센타에서 서비스를 하는 것입니다. 다른 방법으로는 비디오 공유 사이트에서는 비디오 자체에 대한 데이터를 가지지 않고 링크만 저장하고 실제 비디오 데이터는 다른 곳에 저장하는 방법입니다. 아마존의 S3 서비스 같은 경우가 좋은예인데요, 저렴한 가격으로 좋은 저장소로 활용할 수가 있고, 어느정도 사이트가 커질때까지는 안정적으로 활용할 수 있습니다.

결론

플래시를 이용한 비디오의 등장과 광대역폭의 보편화로 인해서 이제 적은 예산으로 비디오 공유 사이트를 운영한다는 것이 현실로 다가왔습니다. 바라기는 이 글을 통해서 여러분이 좀 더 멋있는 비디오 공유사이트를 만들어냈으면 하는 것입니다.


역자 노재현님은 어렸을 때부터 컴퓨터를 접하게 된 덕에 프로그래밍을 오랫동안 정겹게 하고 있는 프로그래머 입니다. 특히나 게임 및 OS 개발에 관심이 많으며, 심심할 때면 뭔가 새로운 프로그램을 만들어내는 것을 좋아합니다. 다음에서 웹 관련 개발을 한 후에 현재는 www.osguru.net이라는 OS관련 웹사이트를 운영하며 넥슨에서 게임 개발을 하고 있습니다.
* e-mail: wonbear@gmail.com
* homepage: http://www.oguru.net

출처 : [기타] 블로그 집필 - 좌충우돌의 개발노트

+ Recent posts