Could not load file or assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IO.FileNotFoundException: Could not load file or assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.


Assembly Load Trace: The following information can be helpful to determine why the assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' could not be loaded.

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].


Stack Trace: 

[FileNotFoundException: Could not load file or assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +210
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +242
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +17
   System.Reflection.Assembly.Load(String assemblyString) +35
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +122

[ConfigurationErrorsException: Could not load file or assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.]
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +12534692
   System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +202
   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +331
   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +148
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +172
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +1151

[HttpException (0x80004005): Could not load file or assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12656404
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12496021


API 프로그램을 서버 배포 시에 위와 같은 assembly loading이 안되는 문제가 발생 되었다.


문제는 컴파일시 해당 dll을 포함 시키면 되는 것이었다.


아는것이 힘. 경험도 힘 ^^


참조 : http://stackoverflow.com/questions/4742894/mvc3-deployment-dependency-problems



'Programming > C#, ASP' 카테고리의 다른 글

.NET 소스코드 문서화  (0) 2015.07.13
Mono project  (0) 2015.04.22
C# XML/XmlReader  (0) 2015.01.20
Troubleshooting Common Problems with the XmlSerializer  (0) 2015.01.20
ASP.NET Web API 도움말 페이지 작성하기  (0) 2015.01.15

Содержание

 [убрать]

Create XmlReader from Stream

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;
class MainClass
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        Stream rssFeedStream = client.OpenRead("http://yourRssFeedURL");
        XmlReader reader = XmlReader.Create(rssFeedStream);
        reader.MoveToContent();
        while (reader.ReadToFollowing("item"))
        {
            ProcessItem(reader.ReadSubtree());
        }
    }
    static void ProcessItem(XmlReader reader)
    {
        reader.ReadToFollowing("title");
        string title = reader.ReadElementContentAsString("title", reader.NamespaceURI);
        reader.ReadToFollowing("link");
        string link = reader.ReadElementContentAsString("link", reader.NamespaceURI);
        Console.WriteLine("{0}\n\t{1}", title, link);
    }
}

Read Xml output from database

using System;
using System.Collections.Generic;
using System.ruponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
using System.IO;
using System.Diagnostics;
    public class MainClass
    {
        public static void Main()
        {
            SqlConnection cnn = new SqlConnection(@"data source=.\sqlexpress;initial catalog=northwind;integrated security=true");
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cnn;
            cmd.rumandType = CommandType.Text;
            cmd.rumandText = "select * from Employee FOR XML AUTO";
            cnn.Open();
            XmlReader reader=cmd.ExecuteXmlReader();
            StreamWriter writer= File.CreateText(Application.StartupPath + @"\temp.xml");
            writer.Write("");
            while (reader.Read())
            {
                writer.Write(reader.ReadOuterXml());
            }
            writer.Write("");
            writer.Close();
            reader.Close();
            cnn.Close();
            Process.Start(Application.StartupPath + @"\temp.xml");
        }
    }

Using XmlReader to read Xml result set from database

using System;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
public class DirectXML
{
    private static string connectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI";
    public static void Main() 
    {
        string SQL = "SELECT CategoryID, CategoryName, Description FROM Categories FOR XML AUTO";
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand com = new SqlCommand(SQL, con);
        try
        {
            con.Open();
            XmlReader reader = com.ExecuteXmlReader();
            while (reader.Read())
            {
                Console.WriteLine(reader.Name);
                if (reader.HasAttributes)
                {
                    for (int i = 0; i < reader.AttributeCount; i++)
                    {
                        reader.MoveToAttribute(i);
                        Console.Write(reader.Name + ": " + reader.Value);
                    }
                    reader.MoveToElement();
                }
            }
            reader.Close();
        }
        catch (Exception err)
        {
            Console.WriteLine(err.ToString());
        }
        finally
        {
            con.Close();
        }
    }
}

XmlReader: ReadElementContentAsString

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;
class MainClass
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        Stream rssFeedStream = client.OpenRead("http://yourRssFeedURL");
        XmlReader reader = XmlReader.Create(rssFeedStream);
        reader.MoveToContent();
        while (reader.ReadToFollowing("item"))
        {
            ProcessItem(reader.ReadSubtree());
        }
    }
    static void ProcessItem(XmlReader reader)
    {
        reader.ReadToFollowing("title");
        string title = reader.ReadElementContentAsString("title", reader.NamespaceURI);
        reader.ReadToFollowing("link");
        string link = reader.ReadElementContentAsString("link", reader.NamespaceURI);
        Console.WriteLine("{0}\n\t{1}", title, link);
    }
}

XmlReaderSettings and XmlWriterSettings

using System;
using System.Collections.Generic;
using System.ruponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
    public class MainClass
    {
        public static void Main()
        {
            XmlReader reader;
            XmlWriter writer;
            XmlReaderSettings readerSettings =new XmlReaderSettings();
            XmlWriterSettings writerSettings = new XmlWriterSettings();
            readerSettings.IgnoreComments = true;
            readerSettings.Schemas.Add(null, "pubs.xsd");
            readerSettings.ValidationType = ValidationType.None;
            writerSettings.OmitXmlDeclaration = true;
            writerSettings.Indent = true;
            writerSettings.NewLineOnAttributes = true;
            reader = XmlReader.Create("pubs.xml", readerSettings);
            writer = XmlWriter.Create("output.xml", writerSettings);
            while (reader.Read())
            {
                writer.WriteNode(reader, true);
            }
            reader.Close();
            writer.Close();
        }
    }

XmlTextReader in Action

using System;
using System.Xml;
  class XmlTextReaderSample {
    [STAThread]
    static void Main(string[] args) {
      XmlTextReader xmlTextReader = new XmlTextReader("sample.xml");
      while (xmlTextReader.Read()) {
        if (xmlTextReader.NodeType == XmlNodeType.Element) {
          Console.Out.WriteLine((new String(" ", xmlTextReader.Depth * 3)) + "Name: <" + xmlTextReader.Name +  ">; Depth: " + xmlTextReader.Depth.ToString() + "; Attributes count: " + xmlTextReader.AttributeCount.ToString() + ";");
        }
      }
    }
  }


XML serialize/deserialize를 하면서 생긴 문제에 대해 common한 trouble들을 설명하는 page

굉장히 도움이 되는듯 하다.

 

http://msdn.microsoft.com/en-us/library/aa302290.aspx

'Programming > C#, ASP' 카테고리의 다른 글

Mono project  (0) 2015.04.22
Deployment Dependency Problems  (0) 2015.02.06
C# XML/XmlReader  (0) 2015.01.20
ASP.NET Web API 도움말 페이지 작성하기  (0) 2015.01.15
프로젝트에 포함된 파일 access  (0) 2015.01.07
본 번역문서는 ASP.NET Web API 기술을 널리 알리고자 하는 개인적인 취지로 번역되어 제공되는 문서로, 원문을 비롯한 모든 저작권은 마이크로소프트사에 있습니다. 마이크로소프트사의 요청이 있을 경우, 언제라도 게시가 중단될 수 있습니다. 본 번역문서에는 오역이 포함되어 있을 수 있으며 주석도 번역자 개인의 견해일뿐입니다. 마이크로소프트사는 본 문서의 번역된 내용에 대해 일체의 보장을 하지 않습니다. 번역이 완료된 뒤에도 제품이 업그레이드 되거나 기능이 변경됨에 따라 원문도 변경되거나 보완되었을 수 있으므로 참고하시기 바랍니다.

Web API 개발 시, 다른 개발자들이 API의 사용법을 이해할 수 있도록 도움말 페이지를 함께 제공해주면 좋을 것입니다. 그리고, 이 도움말 페이지를 수작업으로 작성할 수도 있겠지만, 기왕이면 자동으로 생성하는 것이 더 편리할 것입니다.

ASP.NET Web API는 이런 작업들을 보다 손쉽게 처리할 수 있도록, 도움말 페이지를 런타임에 자동으로 생성할 수 있는 라이브러리를 제공해줍니다.



API 도움말 페이지 작성하기

먼저 ASP.NET and Web Tools 2012.2 Update 부터 설치해야 합니다. 이 업데이트는 Web API 프로젝트 템플릿에 도움말 페이지를 통합시켜 줍니다.

그런 다음, Web API 프로젝트 템플릿을 선택해서 새로운 ASP.NET MVC 4 프로젝트를 생성해보면, 프로젝트 템플릿에 의해서ValuesController라는 이름의 예제 API 컨트롤러가 생성될 것입니다. 이때, API 도움말 페이지도 함께 생성되는데, 참고로 도움말 페이지와 관련된 모든 코드 파일들은 프로젝트의 Areas 폴더에 위치합니다.

응용 프로그램을 실행시켜 보면, 홈 페이지에 API 도움말 페이지로 이동하는 링크가 추가되어 있는 것을 확인할 수 있습니다.

이 링크를 클릭하면 API 요약 페이지로 이동하게 됩니다.


이 도움말 페이지의 MVC 뷰는 Areas/HelpPage/Views/Help/Index.cshtml에 정의되어 있습니다. 따라서, 이 뷰 페이지를 수정하면 레이아웃이나 소개글, 제목, 형태 등을 원하는 대로 자유롭게 변경할 수 있습니다.

이 페이지의 핵심 부분은 API들의 표로, 컨트롤러를 기준으로 분류되어 있습니다. 그리고, 표의 각 항목들은 IApiExplorer 인터페이스를 통해서 동적으로 생성됩니다. (잠시 뒤에 이 인터페이스에 관해서 다시 살펴볼 것입니다.) 그래서, 새로운 API 컨트롤러가 추가되면 실시간으로 표가 갱신됩니다.

이 표의 "API" 컬럼에는 HTTP 메서드와 관련 URI들의 조합이 나타납니다. 그리고, "Description" 컬럼에는 각 API에 대한 설명이 제공되는데, 처음에는 아주 기초적인 내용들만 나타납니다. 다음 절에서는 XML 주석을 이용해서 이 설명을 편집하는 방법을 살펴볼 것입니다.

각 API 컬럼에는 요청 예제나 응답 본문 등을 비롯한 보다 자세한 정보들을 제공해주는 페이지로 이동할 수 있는 링크가 걸려 있습니다.

노트: NuGet 패키지 관리자를 이용해서 도움말 페이지를 추가할 수도 있습니다. 이 방법은 "Web API" 템플릿 대신 다른 프로젝트 템플릿을 통해서 프로젝트를 시작한 경우에 유용합니다. 도움말 페이지 패키지를 설치하려면, 패키지 관리자 콘솔에서 다음 명령을 실행합니다:
Install-Package Microsoft.AspNet.WebApi.HelpPage

API 문서 추가하기

기본적으로 도움말 페이지는 아주 기초적인 설명만을 제공해줍니다. 그러나, XML 문서 주석을 활용해서 이 설명을 편집할 수도 있습니다. 이 기능을 활성화하려면 Areas/HelpPage/HelpPageAreaRegistration.cs 파일을 열고 다음 줄의 주석을 제거하십시요:

config.SetDocumentationProvider(new XmlDocumentationProvider(
    HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));

그런 다음, 이번에는 XML 문서를 활성화시켜야 합니다. Visual Studio의 솔루션 탐색기에서 마우스 오른쪽 버튼으로 프로젝트를 클릭한 다음, 속성 (Properties)을 선택하고, 빌드 (Build) 페이지를 선택합니다.

계속해서 출력 (Output) 영역 하위의 XML 문서 파일 (XML documentation file) 항목을 체크한 다음, 그 우측의 입력 박스에 "App_Data/XmlDocument.xml"이라고 입력합니다.

그런 다음, /Controllers/ValuesControler.cs 파일에 정의되어 있는 ValuesController API 컨트롤러의 코드를 열고, 컨트롤러 메서드에 약간의 설명 주석을 추가합니다. 다음은 그 사례입니다:

/// <summary>
/// Gets some very important data from the server.
/// </summary>
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}
    
/// <summary>
/// Looks up some data by ID.
/// </summary>
/// <param name="id">The ID of the data.</param>
public string Get(int id)
{
    return "value";
}
: 캐럿을 메서드의 바로 위쪽 줄에 위치시킨 다음, 슬래시 문자를 세 개 입력하면 Visual Studio가 자동으로 XML 요소들을 삽입해줍니다. 그러면, 이 XML 요소들의 빈 칸을 채우기만 하면 됩니다.

이제 응용 프로그램을 다시 빌드하고 실행한 다음, 도움말 페이지로 이동해봅니다. 그러면, API 표에 주석에 입력한 내용들이 나타나는 것을 확인할 수 있습니다.

참고로 도움말 페이지는 런타임에 XML 파일로부터 문자열을 읽어들입니다. (따라서 응용 프로그램을 배포할 때, 이 XML 파일도 함께 배포해야만 합니다.)

내부 동작 방법

도움말 페이지는 Web API 프레임워크의 일부인 ApiExplorer 클래스를 기반으로 동작합니다. 이 ApiExplorer 클래스는 도움말 페이지를 생성하기 위한 기본적인 내용들을 제공해줍니다. ApiExplorer 클래스는 각 API들을 기술하는 ApiDescription 클래스들 갖고 있는데, 여기에서 말하는 "API"는 HTTP 메서드와 관련 URI의 조합으로 정의됩니다. 예를 들어서, 다음은 몇 가지 개별적인 API들의 목록입니다:

  • GET /api/Products
  • GET /api/Products/{id}
  • POST /api/Products

컨트롤러 액션이 복수의 HTTP 메서드들을 지원하는 경우, ApiExplorer 클래스는 각각의 HTTP 메서드들을 모두 별개의 API로 취급합니다.

그리고, 특정 API를 ApiExplorer 클래스로부터 감추려면 다음과 같이 ApiExplorerSettings 어트리뷰트를 액션에 추가하고 IgnoreApi 속성을 true로 설정하면 됩니다.

[ApiExplorerSettings(IgnoreApi=true)]
public HttpResponseMessage Get(int id) {  }

이 어트리뷰트는 컨트롤러에도 추가할 수 있으며, 그럴 경우 컨트롤러 전체가 숨겨집니다.

이 ApiExplorer 클래스는 IDocumentationProvider 인터페이스를 통해서 설명 문자열을 가져옵니다. 앞에서 살펴본 것처럼, 도움말 페이지 라이브러리는 XML 설명 문자열에서 설명을 가져오는 IDocumentationProvider 인터페이스를 제공해주며, 해당 코드는 /Areas/HelpPage/XmlDocumentationProvider.cs 파일에 존재합니다. 직접 IDocumentationProvider 인터페이스를 구현해서 다른 소스에서 설명을 가져올 수도 있는데, 이를 설정하려면 HelpPageConfigurationExtensions 클래스에 정의되어 있는SetDocumentationProvider 확장 메서드를 호출하면 됩니다.

ApiExplorer 클래스는 각 API들에 대한 설명 문자열을 얻기 위해서 자동으로 IDocumentationProvider 인터페이스를 호출합니다. 그리고, 이를 ApiDescription 개체와 ApiParameterDescription 개체의 Documentation 속성에 저장합니다.

다음 단계

본 자습서에서 살펴본 도움말 페이지 관련 내용에만 얽매일 필요는 없습니다. 애초에, ApiExplorer 클래스 자체가 도움말 페이지 생성 용도로만 사용하기 위한 것도 아닙니다. 이를테면, Yao Huang Lin은 사고의 틀을 깰 수 있게 해주는 몇 가지 멋진 블로그 포스트를 공개했습니다:


- 출처 : http://www.egocube.pe.kr/Translation/Content/asp-net-web-api/201308140001


'Programming > C#, ASP' 카테고리의 다른 글

Mono project  (0) 2015.04.22
Deployment Dependency Problems  (0) 2015.02.06
C# XML/XmlReader  (0) 2015.01.20
Troubleshooting Common Problems with the XmlSerializer  (0) 2015.01.20
프로젝트에 포함된 파일 access  (0) 2015.01.07

요즘 Restful API를 개발하면서 APICpntroller를 사용하여 개발하는 빈도가 높아졌다.

그래서 UI가 없는 단순 string 위주의 response가 많아지면서 내가 개발한 API를 사용하여 application를 개발하는 counter part의 개발자들에게 정해진 형식(json, xml)의 형태로 선개발을 진행 할 수 있도록 dummt data를 주는 프로그램을 만들면서 프로젝트에 포함된 파일을 access 하는 방법이 필요하게 되었다.


json으로 반환하는 data중에 xml row data를 반환하게 되어 있는데 하나의 xml이 굉장히 길었기 때문에 파일 io로 구현하기로 했는데 여러 방법을 시도해본 결과 다음과 같은 방법을 선택하였다.


먼저 환경은 asp.net MVC4이고 파일 경로는 프로젝트내 App_Data폴더에 추가 하였다.


public ReturnModel GetList()

        {

            item.Provider = 1;

            item.ResultList = new List<CommonResultModel>();


            string text = System.IO.File.ReadAllText(AppDomain.CurrentDomain.GetData("DataDirectory").ToString() + @"/1.xml", Encoding.Default);



            for (int i = 0; i < 20; i++)

            {

                CommonResultModel model = new CommonResultModel();

                model.GenreList = new List<string>();

                model.GenreList.Add("Politik & Weltgeschehen");

                model.GenreList.Add("Politik & Zeitgeschehen");

                model.ContentUrl = "http://83.125.32.32/hbbtv-ard/";

                model.Title = i + ". Franziskus' Kampf um Reformen geht in die heikle Phase";

                model.ThumbnailUrl = "http://83.125.32.35/hbbtv-ard/";

                model.Description = "Im Ringen um Reformen in der katholischen Kirche haben sich Tonfall und Gangart im Vatikan verschärft. In der Kurie und bei brennenden Fragen zu Ehe, Familie und Sexualmoral fehlen dem Papst eindeutige Mehrheiten. Gegner wittern Morgenluft. (Autor: Mike Lingenfelser)";

                model.Id = i;

                model.CreatedDate = String.Format("{0:yyyy-MM-dd}", new DateTime(2014, 12, 02));

                model.UpdatedDate = String.Format("{0:yyyy-MM-dd}", new DateTime(2014, 12, 02));

                model.Extends = text;


                item.ResultList.Add(model);

            }

            return item;

        }


중간에 AppDomain.CurrentDomain.GetData("DataDirectory").ToString() + @"/1.xml" 이 부분인데 "DataDirectory"라고 해도 App_Data폴더 주소가 나오는게 신기(?)했다.


-출처 : http://stackoverflow.com/questions/1268738/asp-net-mvc-find-absolute-path-to-the-app-data-folder-from-controller

'Programming > C#, ASP' 카테고리의 다른 글

Mono project  (0) 2015.04.22
Deployment Dependency Problems  (0) 2015.02.06
C# XML/XmlReader  (0) 2015.01.20
Troubleshooting Common Problems with the XmlSerializer  (0) 2015.01.20
ASP.NET Web API 도움말 페이지 작성하기  (0) 2015.01.15

원문 : The Best Way to Learn Python - Tuts+ Code Article(참조를 위해 최소한으로 요약 번역하였으니 원문을 꼭 참조하세요!)

파이썬은 이전보다 더 인기있으며, 백엔드 웹서버에서 프론트엔드 게임 개발까지 어디서나 사용되고 있다. 파이썬은 정말 일반적인 목적의 언어이며 자존심있는 프로그래머의 무기 중 필수 툴이다.

임무 1: 기초에서 시작하라

두 가지 버전의 파이썬이 있다: 파이썬 2.7과 파이썬 3.4. 어느 것을 선택할지는 크게 중요하지 않다. 입문자에게는 특히, 차이점이 미미하다. 알아야 한다면, 파이썬 2는 서드파티 지원이 훨씬, 훨씬 더 많고, 파이썬 3는 언어를 설계하는 것이 개발자들의 주요 초점이다.

Wikibooks' Non-Programmers Tutorial for Python

위키북스는 새로운 것을 배우는 훌륭한 소스이며, 파이썬도 예외는 아니다. 너무 기술적이지 않고 유용하고 보람있는 무언가를 바로 코딩할 수 있다.

The Official Python Tutorial

python.org의 공식 문서보다 더 나은 정보 소스를 찾을 수 없을 것이다. 그러나, 바로 뛰어들기를 원한다면, 시작하기에 베스트 장소는 아닐 것이다. 위키북스보다 더 기술적이며, 언어를 숙달해갈 때 나중에 도움이 된다.

초보자에게는 파이썬 2와 파이썬 3의 가장 큰 차이점은 파이썬 2는 괄호없이 print를 사용할 수 있고, 파이썬 3는 괄호가 있어야 한다. 그게 다다.

임무 2: 튜토리얼과 스크린 캐스트

TheNewBoston's Python Programming Tutorials

강사가 재미와 듣기 쉬움을 균형있게 전달한다. 프로그래밍에 지식이 없어도 된다.

Nettuts+'s Python from Scratch

프로그래밍 경험없이도 장고를 이용한 다이내믹 웹사이트를 만들게 해준다.

ShowMeDo's Python Screencasts

완전초보부터 중급까지의 파이썬 테크닉과 관련된 비디오 카탈로그가 아주 많다.

Build a Python Bot That Can Play Web Games

완전 초보에게 추천하지는 않지만, 언급할만한 가치는 있다. 간단한 게임을 하는 파이썬 봇을 만드는 법을 보여준다. 매일 반복적인 작업에 적용할 수 있다.

임무 3: 무료 e북들!

고퀄의 무료 e북이 넘치고 있고, 아래는 그 중 베스트 목록이다.

Learn Python the Hard Way

이름과 다르게 매우 쉽게 배울 수 있다.

Think Python: How to Think Like a Computer Scientist

부제와 같이 이론적인 면을 강조한다. 완전초보에게는 약간 어렵지만 알고리즘 이론과 고급 개념에 대해 읽을 수 있다.

Invent with Python

배워서 써먹고 싶다면, 게임을 만드는 것이 좋다! 파이썬을 몰랐더라도 이 책으로 게임을 만들 수 있다.

The Django Book

웹 개발을 위해 파이썬을 배우고 싶다면, 장고 프레임워크를 사용할 것이다. 파이썬에 능숙하고 프레임워크에 초보라면 이 책이 장고를 가르쳐 준다.

PythonBooks

난이도와 주제 따른 파이썬 책에 대한 공식 위키. 한글 책도 소개되어 있다.

임무 4: 스택오버플로우와 친해져라

스택오버플로우에 초보자 에러와 문제만 있는 것은 아니다. 예로 Hidden features of Python을 한번 봐라. 정식 튜토리얼에 없는 수많은 팁과 트릭을 볼 수 있으며, 중급에서 고급 파이썬 사용자에 매우 도움되는 것이다.

임무 5: 프로젝트 오일러

Project Euler(오일러로 발음한다)에서 400 문제를 풀 수 있다. 각 문제는 대략 50%의 수학과 50%의 프로그래밍이다.

새로운 문제를 해결하면 포럼 글타래를 볼 수 있다. 이 곳에서 많은 사람들이 서로 자신의 해결책과 아이디어를 토론하고 있다. 글타래의 후반 페이지에 있는 많은 해결책이 파이썬으로 되어 있을 것이다. 이것은 정말 여러분의 프로그래밍 능력을 키우는 열쇠가 될 것이다. 여러분보다 빠른 해결책이 있다면 시간을 내서 분석하라.

파이썬으로 된 프로젝트 오일러 문제에 대한 정말 훌륭한 블로그도 있다. 배우려고 한다면, 문제에 막혀서 다른 프로그래머의 작업을 살짝 엿보는 것을 부끄러워 하지마라.

임무 6: 게임 만들기

게임을 만드는 것보다 더 만족스러운 것이 거의 없다. 가파른 학습 곡선이 될 수 있지만, 할 가치가 있고 매우 보람있다. PyGame은 가장 알려진 파이썬 게임 라이브러리이며, 무료 투토리얼도 많이 발견할 수 있을 것이다. 여기 베스트 PyGame 튜토리얼이 몇 개 있다.

Pygame 공식 문서

오리지널 파이썬 튜토리얼과 같이 PyGame 개발자도 소개 문서가 가지고 있지만 너무 기술적이다. 그러나 개발자 문서는 항상 정보의 베스트 소스가 될 것이다.

Invent With Python (With PyGame)

TheNewBoston's Computer Game Development Tutorial

위의 가이드와는 다르게 더 요점적이지만 완전한 게임을 만들게 하지는 않는다.

임무 7: 인기 라이브러리와 툴 알기

PyPy

CPU 집중적인 작업을 하려면, 파이썬 자체로는 병목이 생기는 것을 알게되어 아마 PyPy를 필요로 할 것이다. PyPy는 처리속도를 높여줄 수 있는 파이썬의 대체 컴파일러이다.

NumPy + SciPy

보통 이 두개는 나란히 간다(SciPy가 NumPy에 의존한다). 수학적이거나 과학적인 연구를 위한 진지한 계산 처리를 한다면 이 두 개의 라이브러리는 베스트 친구가 될 것이다. NumPy와 SciPy는 파이썬의 수학적인 함수와 능력을 확장해주고 작업들을 엄청나게 가속할 수 있다.

BeautifulSoup

BeautifulSoup은 정말 아름답다. 정보를 얻기위해 HTML 페이지를 긁어야 할 필요가 있다면 가져오는 것이 매우 좌절스럽고 머리를 쥐어뜯는 것이라는 잘 알게 될 것이다. BeautifulSoup이 모든 것을 하고 수명 몇 년을 벌어줄 것이다. 강추한다.

Python Imaging Library

Python Imaging Library (PIL)는 이미지를 다루는 모든 일에 훌륭하다.

Django

웹 개발이 목표라면 장고 프레임워크를 사용하게 될 것이다. 가장 널리 알려진 웹 프레임워크이며 학습 리소스도 가장 많다.

임무 8: 오픈소스 프로젝트에 관여하라

언어를 파악하고나면 다른 사람의 코드를 읽고 이해하는 것이 언제나 중요한 스킬이다 - 말할 것도 없이, 배우는 훌륭한 방법이기도 하다. 오픈소스 프로젝트들이 좋다. 다른 사람이 여러분의 코드를 판단하는 것을 걱정하지마라. 당장 공헌해야할 필요도 없다. 개선할 무언가를 봤다면, 훌륭하다! 개선사항을 제출하라. 오픈소스의 존재 이유이다.


- 출처 : https://nolboo.github.io/blog/2014/08/10/the-best-way-to-learn-python/


11월30일 자바 스프링 커뮤니티 ‘봄싹’이 주최한 세미나가 네이버 그린 팩토리 강당에서 열렸다. 200여명이 참여한 세미나에서는 프론트엔드 개발 동향을 전하는 세션도 있었다. 변정훈 개발자는 ‘게으른 개발자’ 이야기를 먼저 꺼냈다.

“어떤 작가는 이렇게 말하더라고요. ‘개발자는 1시간 반복 작업을 없애기 위해, 7~8시간을 투자한다’고요. 반복 작업을 없애는 프로그램을 만들기 위해서죠. 저는 이 생각에 동의해요. 특히 단순 반복 작업을 없애기 위해 개발자는 여러 노력을 시도하곤 하죠.”

spring_seminar_thum01

▲변정훈 개발자

서버 개발은 프론트엔드 개발보다 역사가 오래됐다. 그래서 서버 개발 쪽에서는 개발 환경을 도와주는 도구가 많이 나왔다. 불과 몇 년 전엔 자바 빌드 도구로 ‘엔트’가 주로 쓰였지만 이후 ‘메이븐’이 나오고 최근엔 ‘그래들’까지 나왔다. 이러한 도구들은 이전에 서버 개발자들이 불편해하거나 부족해하던 부분을 채워서 나온 결과물이다. 개발을 더 쉽고 효율적으로 할 수 있게 돕는 도구들이다. 하지만 프론트엔드 개발 분야에선 이러한 노력이 적은 편이었다. 하지만 최근 몇 년새 프론트엔드 분야에서도 자동화 기술들이 속속 나오고 있다. 특히 5년 전에 ‘노드JS’가 등장하면서 이러한 변화를 이끌고 있다.

“노드JS가 전체 웹 기술의 일부이지만요. 자바스크립트라는 웹 언어를 사용했다는 점에서 많은 시도들을 이끌고 있어요. 그 중 의존성을 관리하거나 웹서버를 실행하거나 코드 품질을 관리할 때 쓸 수 있는 자동화 기술이 나오고 있죠.”

의존성 관리

웹사이트를 만들려면 의존성 관리를 해야 한다. 제이쿼리, 부트스트랩 등 외부 라이브러리를 가져다쓰고 이에 대한 버전 관리를 하는 것을 의존성 관리라고 한다. 과거 개발자들은 이를 위해 인터넷 웹사이트에 들어가 원하는 라이브러리를 검색하고 내려받아 내부 컴퓨터 폴더에 넣었다. 그리고 HTML 문서에 해당 경로를 입력해야 했다. 의존성 관리 도구를 이용하면 이러한 반복과정을 줄일 수 있다.

대표적인 도구는 ‘보어’가 있다. 보어는 터미널에 명령어를 입력해 의존성 관리를 할 수 있도록 돕는다. 처음 한번만 설치하면 명령어를 간편히 입력하면서 원하는 라이브러리 통합해서 쓸 수 있다. 또한 어떤 버전을 썼고, 다른 팀원이 해당 도구를 썼는지에 대한 기록도 자동으로 남는다.

이처럼 의존성 관리 도구를 쓰면 라이브러리 파일을 형상관리 도구에 넣지 않아도 되고, 버전 업데이트도 훨씬 쉬워진다.

spring_seminar_20141130_01

▲과거 반복과정이 많았던 의존성 관리(출처: 변정훈 개발자 슬라이드쉐어)

웹서버 실행
과거엔 웹 서버 실행하는 게 복잡했다. 루트 경로를 따로 지정 해주는 등 관리하기 힘들고, 실행하는데 시간이 오래 걸렸다. 최근엔 프론트엔드 개발을 위한 빌드 도구가 여럿 나오고 있다. 대표적인 게 ‘그런트’나 ‘걸프’다. 이를 통해 프로젝트별로 환경을 자동화할 수 있다. 이 때문에, 다른 포트, 다른 경로를 사용할 수 있으며, 팀 단위로 작업할 때 누구나 똑같은 환경에서 테스트를 할 수 있다. 또한 ‘웹스톰’, ‘아톰’과 같이 여러 에디터를 사용할 수 있어 특정 개발환경에 종속되지 않는다.

spring_seminar_20141130_02

▲과거 웹서버를 실행할 때 관리하거나 실행 속도가 낮았다(출처: 변정훈 개발자 슬라이드쉐어)

▲빌드도구로 웹서버를 실행했을 때 장점(출처: 변정훈 개발자 슬라이드쉐어)

코드 품질 관리
프론트엔드 개발 쪽에서 유효성이나 코드를 검사하는 것을 ‘린트’라고 한다. 사실 프론트엔드 개발에선 코드에 조금 문제가 있어도 결과를 실행하는 데 이상이 없었다. 하지만 최근엔 린트 도움을 받아 코드 품질을 더 높일 수 있다. 린트 도구로 세미콜론을 빼먹은 걸 알 수 있거나, 어떤 함수를 쓰지 말야야 하는지 등을 알 수 있다. 개발자가 실수할 가능성도 줄어든다. ‘JS힌트’가 대표적이며 페이스북이 만든 ‘플로우’나 트위터가 만든 ‘리세스’등도 있다.

spring_seminar_20141130_06-input

▲JS힌트와 같은 도구로 코드검사를 할 수 있다(출처: 변정훈 개발자 슬라이드쉐어)

spring_seminar_20141130_06-output

▲JS힌트 도구가 위의 소스 문법을 검색한 결과(출처: 변정훈 개발자 슬라이드쉐어)

테스트는 한번에

프론트엔드 개발자는 여러 웹브라우저를 동시에 테스트해야 한다. 이러한 과정을 한번으로 줄여주는 도구도 있다. 대표적으로 ‘소스랩’이 있다. 소스랩은 CI 서버를 실행시킬 때, 여러 웹브라우저를 연결해 테스트할 수 있다. 이렇게 되면 한번 실행해 인터넷 익스플로러, 크롬, 파이어폭스 등에 제대로 작동하는지 하나의 인터페이스 안에서 간편하게 볼 수 있다.

변정훈 개발자는 “자동화 기술은 도구이기 때문에 배우는 데 진입장벽이 높지 않다”라며 “상대적으로 쉽게 배울 수 있는 동시에 얻어갈 수 있는 이점이 많아 개발자들과 공유하고 싶었다”라고 설명했다. 또한 “개별적인 도구들이 언제 어떻게 쓰이는지 알 수 있으면 여러 도구를 조합해서 사용할 수 있다”라며 “이로 인해 효율적이고 빠르게 웹 개발을 할 수 있으며, 웹 개발 환경이 어떻게 변화하는지도 알 수 있다”라고 강조했다.

spring_seminar_thum02

▲변정훈 개발자

변정훈 개발자가 제안하는 프론트엔드 개발에서 사용할 수 있는 자동화 도구

의존성 관리를 위한 도구

웹서버 실행

코드 품질 관리

전처리

유닛테스트

테스트


 - 출처 : http://www.bloter.net/archives/214274

event.stopPropagation(), event.preventDefault () 이해하기

 

TestEventHandler.html


 

event.stopPropagation() 을 이해하기 위해서는 우선 HTML 상에서 사용자 이벤트가 어떻게 전달되는지 이해해야 합니다.


웹에서의 클릭이벤트 전파

propagation 의 사전적의미는 전파, 확산입니다. 

사용자가 마우스로 웹페이지 내의 버튼을 클릭했을때 대부분의 사람들은 버튼만 반응했다고 생각하게 됩니다. 하지만 웹페이 내부에서는 

버튼을 감싸고 있는 부모 태그들 또한 클릭 이벤트에 반응하게 됩니다. 이것을 Bubble Up(버블업)이라고 합니다.

 

 

위 슬라이드 우측의 문서구조를 보면 a 태그는 li, ul 의 두개의 부모태그가 있습니다.

사용자가 a 태그를 클릭했을때 클릭이벤트는 a 태그를 감싸고 있는 li, ul 태그로 순차적으로 전달되게 됩니다. 

즉 a 태그의 onclick  -> li 태그의 onclick  -> ul 태그의 onclick 을 실행하게 됩니다.

만약에 ul 태그에 클릭 이벤트가 있을 경우 a 태그를 클릭하는 순간에는 의도하지 않은 ul 태그의 클릭 이벤트가 실행됩니다.


예를 들어 설명하면

이웃집에서 이사를 와서 바로 옆집에 살고 있는 철수네 집에 떡을 돌렸다고 칩시다. 철수는 떡을 받고 기쁜 나머지 아버지에게 가져다 줍니다. 철수 왈 "아버지 옆집에서 새로 이사를 왔다고 맛있는 떡을 주고 갔어요~" 철수는 효심이 지극했습니다. 철수 아버지 또한 효심이 지극하여 받자 마자 바로 철수 할아버지에게 떡을 가져다 줍니다. 철수 아버지 왈 "아버님 옆집에서 새로 이사를 왔다고 맛있는 떡을 주고 갔습니다." 이렇게 3부자는 떡을 오손 도손 나눠 먹게됩니다.

그런데 옆집에서 철수에게 떡을 주면서 "이 떡은 꼭 너 혼자만 먹어야 한다" 라고 말하면서 철수에게 떡을 주었다면... 철수는 혼자 먹습니다. 효심보다는 떡에 눈이 멀었던 거죠...

 

이때 혼자만 먹어라는 의미를 stopPropagation 이라고 합니다.


즉, stopPropagation 은 부모태그로의 이벤트 전파를 stop 중지하라는 의미입니다.

 

event.preventDefault() 는?

preventDefault 를 이해하기 위해서는 a 태그를 유심히 봐야 합니다. 위 슬라이드에 표시된 a 태그는 내부적으로 href="#" 속성을 가지고 있습니다. href 속성은 웹브라우저에게 a 태그 클릭시 이동하여야할 페이지를 나타냅니다.

예를 들면) <a href="http://ismydream.tistory.com" onclick="...">창조적고찰 블로그</a> 처럼 사용합니다.

 

위 a 태그는 click 이벤트 또한 가지고 있기 대문에 a 태그를 클릭했을 때는 두가지 행동을 하게 됩니다.

첫번째 click 이벤트를 실행합니다. 두번째는 브라우저에게 href 에 표시된 곳으로 이동하도록 합니다.

 

href="#" 속성을 넣은 이유는 a 태그에는 click 이벤트가 있으니 click 이벤트만 실행하고 웹브라우저는 이동하지 말아라 하는 의도로 설정한 값입니다. 이렇게 하게 되면 클릭시에는 click 이벤트만 실행되고 웹브라우저가 이동하지는 않게 됩니다. 제가 생각하기에는 좀 꼼수 같기도 합니다.

 

근데 여기서 한가지 주의해야 할 점이 있습니다. href="#" 은 웹브라우저가 다른 곳으로 이동하지는 않지만 스크롤이 있는 곳에서는 페이지 상단으로 이동하게 됩니다. href="#~~~" 으로 사용하는것을 앵커(닻) 라고 하는데 href="#" 은 웹브라우저의 최상단을 가리키는 앵커입니다.

 

글을 작성할때나, 회원가입을 할때 버튼 한번 클릭할때마다 페이지가 쭉 위로 올라가는 경험을 해보신분들은 그 짜증스러움을 익히 아시리라 생각합니다. ㅠㅠ

 

이 브라우저 행동을 막기위해서 사용하는게 preventDefault 입니다.


preventDefault 는 a 태그 처럼 클릭 이벤트 외에 별도의 브라우저 행동을 막기 위해 사용됩니다.


출처 : http://ismydream.tistory.com/98

'Programming > JavaScript' 카테고리의 다른 글

[typescript] Cannot use JSX unless the '--jsx' flag is provided.  (0) 2020.12.10
[JAVASCRIPT] replace  (0) 2013.05.08


UPDATE 07/19/2013: As pointed out in the comments by Ray Moro, a better way to fix this may be to remove the extension from your bundle name. So /bundle/myscrips.js becomes /bundle/myscriptsthis will cause it to run the module without having to change the config settings below.

That's a mouthful of a title.

If you're using ScriptBundle and StyleBundle's in an ASP.NET MVC4 app and you're suddenly getting 404 errors even though EnableOptimizations is set to true make sure you have the following in yourWeb.Config in the system.webServer section:

  1. <modules runAllManagedModulesForAllRequests="true">  
  2.   <remove name="BundleModule" />  
  3.   <add name="BundleModule" type="System.Web.Optimization.BundleModule" />  
  4. </modules>  

I've wasted incalculable amounts of time on this issue, TWICE!!! I don't know why this isn't in the web.config by default or better yet not needed to use Bundling.

출처 : http://sports.news.nate.com/view/20140830n05951?mid=s1005

1. Angular.js 가 주고자 하는 가치는 무엇인가?

  앵귤러는 모던 애플리케이션을 개발하기 위한 프레임워크입니다. 복잡하고 단순 반복적인 작업을 대폭 줄여줌으로써 신속한 개발을 가능하게 해줍니다. 이를 통해 보다 빨리 고객의 피드백을 받고 개선할 수 있는 에자일한 개발 진행이 가능해 집니다. 보다 적은 작업을 통해 보다 더 많은 행복을 주는 프레임워크입니다. 


  1989년 HTML을 시작으로 2005년 Ajax가 나오고 이후 jQuery를 통하여 DOM 을 조작을 통한 웹서비스 개발 시대를 거쳐 지속적인 브라우져 기술의 성숙과 JavaScript 해석기의 성능향상으로 이제는 자바스크립트를 통해 클라이언트에서도 서버와 같은 MVC 패턴 방식의 애플리케이션 개발이 가능해 졌습니다. 만일 jQuery만을 통해 웹앱을 개발한다고 생각하면 HTML 페이지마다 들어가는 서버코드와 자바스크립트들의 복잡한 코드에 머리를 쥐어 짤지도 모릅니다. 

  저는 13년을 넘게 자바언어로 서버만을 개발했었습니다. 가끔 클라이언트단의 jQuery 코드를 볼 때마다 저 영역으로는 절대 들어가지 말자라고 생각했습니다. 왜일까요? 그것은 서버처럼 잘 정비된 애플리케이션 프레임워크도 없으며, 서버코드와 자바스크립트를 HTML 사이사이에 끼워 넣으며 스파게티같은 코드를 짜야 하기 때문이었습니다. 

  그러나 2010년 이후부터 상황은 바뀌었습니다. Backbone.js가 이러한 복잡함을 해결하고자 초기 프레임워크로 나왔고, 이후Ember.js 그리고 Angular.js 에서 Meteor.js 까지 모던 웹앱을 개발할 수 있는 프레임워크가 나왔습니다. 앵귤러는 어떻길래 이들 프레임워크 중 단연 선풍적인 인기를 누리고 있는 걸까요?


  - .js F/W  트랜드 



- .js 에서 dot(점)을 빼고 Backbonejs 와 Angularjs 트랜드 


  Backbonejs 와 Angularjs(노란색) 의 트랜드 변화는 급상승 중



2. Angular.js 가 어떻길래 개발자들이 열광하는가?

  앵귤러의 아버지인 미스코님(Misko Hevery)의 소개 동영상을 잠시 감상해 봅시다 


  요즘 SI시에 서버개발을 위하여 Spring Framework와 iBatis(myBatis)를 사용하는 것이 기본적인 관례처럼 되었는데요. 이들의 기능을 잠깐 생각해 볼까요. 

  - DI (Dependency Injection) 을 통하여 코드간의 결합도를 줄여주고, 테스트 코드의 작성을 쉽게 해줍니다. 

  - MVC 패턴를 통하여 기본적인 서버 개발의 틀을 가이드 해줍니다.

  - 다양한 라이브러리와 툴의 결합으로 개발 생산성을 높여줍니다.


 이를 앵귤러 입장에서 생각해 보면 정확히 위와 같은 요구사항을 충족해 주고 있습니다. 

  - DI를 지원합니다. 모듈단위의 개발로 코드를 간결하게 유지하고 테스트를 쉽게 해줍니다.

  - MV* 패턴을 통하여 역할을 나누고 아키텍쳐 Layered 개발을 가능하게 해줍니다. 당연히 유지 보수가 쉬워지겠죠

  - jQuery의 Plugins 포함한 기존의 다양한 라이브러리를 재 사용할 수 있습니다. 

  - 서버의 Maven, Ant 와 같은 관련된 라이브러리 의존성 관리 및 빌드 자동화 툴과 결합하여 개발 생산성을 높일 수 있습니다. 


  하지만 앵귤러를 시작하기 전에 하나의 선입견을 버리고 새로운 인식으로 접근을 해야 합니다. 자바스크립트는 이제 브라우져에서 화면의 단순 조작을 통한 효과에 쓰이는 언어가 아닌 진정한 엔터프라이즈급 애플리케이션부터 모바일 웹앱까지 모던한 애플리케이션을 만드는데 가장 많이 쓰이고 있는 개발언어가 되었다는 것입니다. 구글은 크롬앱을 코르도바(폰갭)를 통하여 안드로이드 및 iOS에서 구동하는 툴킷을 2014년 초에 출시할 계획입니다. 크롬앱은 자바스크립트로 개발합니다. 이는 본격적으로 네이티브 모바일 앱과 자바스크립트 모바일 웹앱이 함께 공존할 수 있는 시기가 왔다는 것을 암시합니다. 


 앵귤러(Angular.js)는 화면을 조작하는 라이브러리나 화면을 조작하는 프레임워크가 아니 모던 애플리케이션을 개발하는 프론트엔드 프레임워크입니다. 최근에는 이를 SPA(Single Page Application) 개발이라 부릅니다. Adobe의 Flex 기술을 통하여 클라이언트단에 엔터프라이즈 애플리케이션을 개발하는 RIA(Rich Internet Application) 가 선풍적인 인기를 누렸음을 잘 알것입니다. 인터넷이 되는 스마트 기기 에서 Adobe Flash의 공식 미지원 발표에 있은 후 이제 RIA의 용어는 점점 잊혀져 가고 있습니다. 하지만 사람들의 요구는 UX에 점점 더 목말라하고 있습니다. 단순한 웹서비스로는 이에 대응하기 힘들며 PC시대의 RIA를 표방한 Adobe의 Flex 프레임워크처럼 현재의 PC와 Mobile을 통합하는 진정한 RIA와 같은 자바스크립트 진영의 개발 프레임워크가 바로 앵귤러(Angular.js) 입니다. 무엇을 제공하 길래 앵귤러는 SPA 프레임워크의 큰형님이 되고 있는 걸까요?



 SPA vs RIA 비교 



3. Angular.js에는 무엇이 있는가?

  앵귤러는 클라이언트의 애플리케이션을 견고하게 만들 수 있는 방법을 제시하고 있습니다. 클라이언트의 생명은 바로 UX에 있다고 생각합니다. 훌륭한 사용자 경험을 주기 위하여 앵귤러 사용한다면 빠르게 개발하고 사용자의 피드백을 받아 개선해 갈 수 있습니다.


  견고한 싱글 페이지 웹 애플리케이션(SPA)을 만들기 위하여 앵귤러는 다음과 같은 기능을 제공합니다. 

  - 모듈 단위 개발을 통하여 글로벌 영역을 오염시키지 않고 모듈 단위 개발을 가능하게 해줍니다. 따라서 대규모의 애플리케이션 확장이 가능해 집니다. 


  - 양방향 데이터 바인딩을 통하여 View(HTML) 와 Controller(자바스크립트) 사이에 데이터에 대한 양방향 동기화를 자동으로 해줍니다. 즉, View 에서 데이터를 입력하면 Controller 단의 데이터를 업데이트 해주고, 그 반대도 가능해 집니다. 기존 jQuery에서는 데이터의 동기화를 위하여 Event와 Listener를 등록하는 코드를 모두 개발해야 했다면 앵귤러에서는 이런 코드를 찾아 볼 수 없습니다. Flex의 [Bindable]을 생각하면 됩니다. 


  - 앵귤러를 보통 MVW 프레임워크라 부릅니다. W는 Whatever의 의미로 Controller, Service등 무엇이든 올 수 있다는 것입니다. 역시 가장 중요한 것은 Model과 View의 연동을 양방향으로 함으로써 UX를 보다 쉽고 빠르게 개발토록 하는데 있습니다. 


  - Controller는 View HTML에서 발생한 이벤트에 따라 Model 변경을 제어하고, Service는 백앤드 서비스를 데이터 I/O 통신을 담당합니다. 각 필요한 기능은 DI(Dependency Injection)을 통하여 펑션의 파라미터 주입방식으로 인스턴스를 받아서 사용합니다. 


  - SPA 의 Single Page라는 의미는 최초에 index.html 을 서버로부터 받은 후 부분적인 화면의 변경을 위하여 부분 HTML(Partial HTML)만을 받아서 index.html의 특정 영역의 DOM 객체 변경을 통해 View의 일부분을 바꿔줍니다. 이후 서버로 부터 받는 것은 View의 컨텐츠 데이터인 JSON 이나 XML 입니다. 이렇게 화면의 부분 변경을 위하여 Routing 기능을 제공합니다. 


  - jQuery + PHP, jQuery + JSP 코드가 들어간 HTML 이 기존의 코딩 방식이라면 Javascript + HTML 만 존재하는 것이 앵귤러의 코딩 방식이다. 또한 반복해서 사용하는 HTML 또는 자바스크립트 코드조각이나 위젯/플러그인을 앵귤러만의 컴포넌트로 만들어서 HTML tag, attribute, class, comment 등의 방식으로 HTML에 포함시킬 수 있는 Directives(지시자) 기능을 제공합니다. Flex의 MXML에 차트관련 컴포넌트를 <Line> 태그로 표현하듯이, Angular.js의 Directive(컴포넌트)를 만들면 HTML안에 <Line> 과 같은 태그를 포함시킬 수 있습니다. 즉, Directive는 HTML 태그로 표기할 수 있는 컴포넌트 모듈을 만들 수 있고 Callback 펑션 기능을 내부로 숨기고 재사용할 수 있는 것이다. 


  - 백앤드로 Node.js를 사용한다면 Flex의 Messaging 기술과 같은 Push 방식의 구현을 Socket.io 모듈을 통하여 보다 더 쉽게 구현 할 수 있다. 


이제 자바스크립트 코딩이 가능하다면 싱글 페이지 애플리케이션(SPA) 에 도전해 봅시다.


- 출처 : http://mobicon.tistory.com/398

+ Recent posts