The Last Mind

Captain's Log

Monthly Archives: February 2005

WebRSSAggregator: Iteration 3

19 February 2005 by Joseph Jang

Introduction


WebRSSAggregator는 RSS들을 수집, 통합하여, 웹을 통해 보여주는 어플리케이션이다. 즉, 흔히 말하는 RSS reader다. (전에도 이 사이트를 통해서 소개한 적이 있었으므로 더 자세한 내용은 생략하겠다.)


소프트웨어 개발의 진행 결과는 관리자에게 보고하고, 구현을 마친 요구 사항은 적어두면서, 개발을 하면서 발생한 design decison들을 기록하는 사람들은 거의 없다. 사실, 개발자의 실력을 키워주는 것은 그러한 작은 design decison이 모여서 이루어진 어떤 sense라고 생각한다. 이러한 과정은 물론 우리들의 뇌 속에서 자동으로 이루어지는 것이지만, 소프트웨어 개발을 하면서 드는 생각들을 정리해두는 것만으로도, 더욱 효과적으로, 긍정적인 피드백을 주리라고 생각한다.


Iteration 3


최근에는 적절한 feature들의 set을 모아서 기간을 정하고, 이를 하나의 iteration으로 개발하는 방식을 주로 사용하고 있는데, 이는 FDD에서 어느 정도 따온 방식이라고 볼 수 있다. WebRSSAggregator도 어느덧 세번째 iteration에 접어들었고, 이 iteration에서 구현할 feature들은 다음과 같다.



  • Refactoring

    • Model-View-Controller
    • Apply eruby template
    • Get method accepts Filter (rather than several get* methods)

  • User Interface

    • Change view (flat, simple)
    • Change filter (subscription, category, date, label)
    • mark/unmark Label
    • More subscription information on subscription list, admin interface
    • “Mark read”
    • Content folding

  • Feature

    • Label operation: mark, unmark
    • More subscription information

      • retrieve channel information on addSubscription (title, link, description)
      • automatically update feed on addSubscription (only for Web interface?)

  • Documentation

    • rdoc documentation

  • Release

    • commit rubyforge

여러가지로 적어두었지만, 사용자 인터페이스를 정리하고, 코드를 MVC 기반으로 refactoring하는 것이 이번 iteration의 주요 목표다. 그리고, RubyForge에 WebRSSAggregator를 release하는 것이 이번 iteration의 최종 목표다.


View


어느 정도 기능들이 많아지고 사용자 인터페이스가 복잡해지면서, 가장 문제가 되는 것이 view와 logic의 분리다. 웹 어플리케이션의 View를 어떻게 설계할 것인가를 고민 중이다. MVC에 따르면, 여러 sub-view들 간에 hierarchy를 가진 view 구조를 선호하고 있다. 따라서, 각각의 subview를  (div element를 사용한) block으로 만들고 어플리케이션에 특화한 layout을 가진 main view가 이들을 조직화하고, 대부분의 formatting은 css에 맡김으로써, 간단한 (적어도 WebRSSAggregator에는 사용 가능한) View 정도는 깔끔하게 만들어낼 수 있지 않을까 생각하고 있다.


당장은 subview들 약간만 작업해놓은 상태다. (SimpleItemListView, FlatItemListView) 한가지 고민되는 것은 우리나라의 여러 portal에서 즐겨쓰는 table을 사용한 html page design에는 이러한 방식이 최악이 될 수도 있다는 것이다. 아직도 table의 div 대체 가능성에 대해서 명확한 대답을 보지 못했고, 가능하다면 이것을 증명해보고 싶기도 하다. (물론 WebRSSAggregator 따위로 될 리는 없지만)


이미 Rails 같은 MVC framework이 널려있고, MVC pattern이 꽤 흥행해왔기 때문에 Web App에서의 View에 관련된 내 고민들은 이미 대체로 해결된 별 쓸모없는 것일지도 모른다. 좀 더 살펴볼 예정이고, 조언도 환영한다. 어쨌거나 흥미로운 문제고, 이것 때문에 Web App Development에 대한 나의 관심이 요즈음 한껏 고양된 상태이다.


Accessing DB


Filter


DB로부터 data를 얻어올 때, business logic이 요구하는 내용에 따라 여러 method가 난립했었는데, filter라는 개념을 도입하여, 단순하게 정리했다. 예를 들어, 기존에는,


ItemManager
getItemsBySubscription(subscriptions)
getItemsByDate(dates)
getItemsByLabel(labels)

이었으나, filter를 도입한 후에는,


ItemManager
getItems(subscriptionFilter, dateFilter, labelFilter)

과 같이 단 하나의 method로 정리되었다. 참고로, Rails에서는 SQL 문의 WHERE 절에 들어가는 expression과 유사한 string을 filter로 사용한다.


ItemManager
getItems(filterString)

이러한 filter들을 사용자 interface로 정리하는 것은 꽤 괴로운 일이었다. 직접 사용자의 선택을 모두 case by case로 처리하고 있는데, 다른 MVC framework의 Controller 디자인을 참조해보아야할 듯 하다.


Table Data Gateway/Active Record/Data Mapper


가장 처음 WebRSSAggregator를 만들었을 때는 class가 하나도 없었고, 단지 DB로 SQL 문을 query해서 data를 읽어온 후, html로 번역해서 뿌려주는 ruby script였을 뿐이었다. 초기 기능을 만들고나서 바로 class로 refactoring을 수행했고, 가장 먼저 건드린 곳이 DB를 access하는 부분이었다. 현재의 모습이 그 때 refactoring의 결과인데, 그러한 설계를 Table Data Gateway라고 부른다는 사실을 오늘 처음 알았다.


간단히 설명하면, DB table에 있는 data에 대한 모든 operation (주로 CRUD와 SELECT)을 수행하는 object다. 물론 이러한 operation들은 보통 business logic의 requirement에 따라 만들어지고, 각 operation이 보통 하나의 SQL 문을 나타낸다고 볼 수 있다.


WebRSSAggregator에서 ItemManager, SubscriptionManager, 그리고 CategoryManager가 모두 Table Data Gateway에 속한다. (‘Manager’라는 너무나 보편적인 이름을 지은 것은 후회해야할 일일 것 같다.)


ItemManager, SubscriptionManager, CategoryManager는 각각 attribute만을 가진 Item, Subscription, Category를 사용한다. 즉, Table Data Gateway는 passive data를 다루는 Controller object에 해당하는 것이다. “Object Thinking”에서는 이러한 설계가 Object-oriented paradigm의 철학과는 배치된다고 적극 말리고 있고, 이에 대한 대안을 찾고 있었는데, Rails의 문서를 뒤지던 중에, Active Record라는 pattern을 발견했다.


Active Record는 간단히 말해서, Controller object가 passive data들을 control하는 것이 아니라, Table 또는 Table의 row에 해당하는 object가 스스로 DB access를 수행하는 설계를 가지고 있다. 앞에서 말했던 “Object Thinking”에서의 충고에는 충실한 편이다.


당장은 Table Data Gateway인 ItemManager, SubscriptionManager, CategoryManager의 responsibility를 현재는 passive data에 불과한 Item, Subscription, Category로 이전시켜, Active Record로 만들 생각이다.


DB Access에 관련된 pattern에는 Table Data Gateway와 Active Record외에도 Data Mapper가 있다. Data Mapper는 object와 relational database 사이에서 OR mapping을 수행해주는 object다. 따라서, 이 경우 object는 DB Access에 관해 신경을 쓰지 않을 수 있게 된다. business logic과 DB를 access하는 logic을 적극적으로 분리하는 pattern이라고 볼 수 있다.


기회가 된다면 다음에 이러한 3가지 pattern에 대해서 자세히 써보겠지만, 이 글에서는 더이상 설명하지 않겠다. 좀 더 자세한 내용을 알고 싶은 사람은 Martin Fowler“Patterns of Enterprise Application Architecture”를 보는 것을 추천한다.

Embedding code in HTML


PHP programming language에 대한 어떤 비판 중에는 HTML 안에 code를 embed할 수 있기 때문에, presentation과 code의 분리를 방해한다라는 주장이 있다. asp, jsp 등이 web language로서 보편화된 것을 보면, 그 주장이 사실이라고 하더라도, 분명 그러한 단점을 넘어서는 장점이 있기때문일 것이다.


개인적인 생각으로는 code를 HTML에 embedding할 수 있는 것은 매우 편리하다. 위에서 살짝 언급했듯이, subview들을 block등으로 적절히 나타낸다고 하더라도, 전체 layout을 나타낼 때 code를 사용해 HTML을 generation한다면 매우 이해하기 힘들고 수정하기도 힘든 코드만 대량으로 생산해낼 뿐이다. 하지만, code embedding과 HTML을 적절히 조화시키면 깔끔한 View 코드를 생성할 수 있다.


<%
require MenuView.rb
require ContentView.rb
menuView = MenuView.new
contentView = ContentView.new
%>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
</head>
<body>
<div class=“menu”>
<%
menuView.render
%>
</div>
<div class=“content”>
<%
contentView.render
%>
</div>
</body>
</html>

물론, 이러한 기능을 남용하는 사례는 분명 있다. 특히 sub-view가 아닌 business logic이 있을 code에 HTML들이 함께 버젓이 들어가있는 경우는 정말 난감하다.


<?
function get_beer_list()
{
$beers = array (ob“, “hite“, “cass);
?>
<ul>
<?
foreach ($beers as $beer)
{
?>
<li>
<?
print $beer;
?>
</li>
<?
}
?>
</ul>
<?
}
?>

이러한 코드를 보면 그러한 비판은 정말로 유효한 것 같다. (실제로는 더욱 심할테니!) 하지만, 이것은 언어 자체의 문제나, HTML에 code를 embedding 시킬 수 있는 기능 자체의 문제가 아니다. 이러한 코드를 쓴 사람은 어떤 프로그램을 짜더라도 엉망으로 짤 것이다. 프로그래머로서의 자질 자체가 문제인 것이다.


WebRSSAggregator에도 이러한 생각을 증명하기 위해서 eruby를 적용해보았다. 현재까지 만들어진 sub-view들을 제외한 View는 전부 HTML과 embedding된 ruby code로 되어있다. 가능한 한 대부분의 View는 클래스화 하겠지만, 전체 페이지 모두를 클래스화할지는 아직 의문이다.


To Be Continued…


WebRSSAggregator에서의 MVC 구현이 좀 더 진척된 미래의 어느 시점에 다음 편이 나오지 않을까 싶다.

Comments Off | Categories: Software Development

복학 프로젝트

16 February 2005 by Joseph Jang

주변 사람들이야 다 알겠지만, 병역 특례기간도 끝났고, 휴학기간이 끝나서, 이번 봄학기에 복학할 예정이다. 지난 월요일에 대전에 가서 이것저것 처리하고 왔다.


대전에는 가끔씩 갔었지만, 학교엔 거의 3년만에 가본 것 같다. 정문에서 전기전산학과 건물까지밖에 안돌아다녀봐서 잘은 모르겠지만, 3년이라는 세월이 무색할 정도로 옛날 그대로였다. 복학원 제출하고 수강 신청을 했다. 지도교수님도 찾아뵈었는데, 처음엔 얼굴을 못알아보시더니, 곧 알아보시는 눈치였다. ‘뭐하고 사냐?’와 ‘각오는?’의 질문에 적당히 둘러대는 정도로 면담을 마치고, 철호군과 집을 알아보러 나섰다.


원래 지난 달에, 철호군의 지인(?)을 통해 철호군과 함께 살 집을 구해놨었는데, 계약 또는 가계약을 안했더니, 집주인이 변심해버리는 바람에, 다시 집을 알아봐야했다. 철호군이 저번에 알아보았던 곳 근처에서 한번 알아보고, 갤러리아 백화점에서 10분 정도 거리의 임대형 건물들이 한데 모여있는 곳에서 또 한번 알아봤는데, 나중에 간 곳이 비슷한 가격에 집이 마음에 들었다. 3500만원 전세 정도로 대략 18평 정도 투룸을 계약하게되었다. 신혼부부가 살고 있는 집이라 깔끔하기도 하고, 방들도 큰 편이라 마음에 들었다. 철호군이 꼼꼼하게 하자사항을 따져주고, 부동산에서도 꽤 친절하게 설명해주어서, 무난하게 계약을 끝낼 수 있었다.


계약을 마치고, 7시쯤 되어서, 아라기술에 가서 아르바이트 관련 얘기를 했다. 대충 하프타임 정도로 얘기를 했고, 합리적인 선에서 일하기로 결정했다. 22학점을 들으면서 하프타임이면 상당히 고달픈 삶이 될 것 같다. 3월, 5월 같이 시험기간이 없는 달에는 그럭저럭 해나가더라도, 시험기간이 있는 달에는 아르바이트를 줄이는 게 좋을 듯하다. 봄학기에 아르바이트를 어느 정도 해보고, 많이 힘들다면, 가을 학기에는 아르바이트를 하지 않거나 아주 조금만 하는 것이 좋을 듯 하다. 방학 기간에 어차피 현장 실습을 해야해서, 가을학기에 살 정도는 생활비를 벌어둘 수 있지 않을까 생각이 든다.


대충 1년동안 졸업 요건을 채울 수 있긴 한데, 이후로 무엇을 할지 아직 모호한 상태라서, 1년 내에 끝낼지 한학기 더해서 성적을 어느 정도 올릴 지는 아직 고민 중이다. 성적은 아무래도 앞으로의 진로에 있어서 얼마나 더 많은 옵션이 있느냐의 중요한 요건이라고 생각하지만, 한학기를 투자할 만한 가치가 있는 옵션이 있는지는 좀 더 생각해봐야할 것 같다. 현재 고려하고 있는 것은, 석사 과정 진학과 외국 회사 취업 쪽이다. 석사 과정은 어느 정도 학계의 분위기를 경험해보고 안목을 넓히는데는 괜찮다고 생각한다 (라는 충고를 받았다). 게다가 2년 정도라면 그 이익에 대한 투자로는 적절하기도 하고. 사실, 외국 회사 취업은 아무래도 준비 기간이 필요하기 때문에, 그 경우를 선택한다면 무조건 복직하게 될 것 같고, 석사 과정 진학이라면 아마도 성적을 올려두는 것이 필요할 것이다.


당장은 이런 식으로 2-3년 정도의 옵션만 생각할 예정이다. 장기적으로 여러 옵션들을 고려할 능력도 없거니와, (내가 이 분야에 머물러 있다는 가정하에) 이 분야는 빠르게 변화하기 때문이다.

Comments Off |

번역 진행중인 소프트웨어 개발 관련 책들

15 February 2005 by Joseph Jang

The C++ Programming Language


“More Effective C++”와 “Effective STL”을 번역하신 곽용재님이 번역작업 중이시고, 초고를 탈고하셨다고 한다. The C++ Programming Language는 C++의 창안자인 Bjarne Stroustroup이 쓴 책인 만큼 권위있고, 자세하며, 잘 쓰여진 책이다. (Books for Software Development 참조) C++ 을 배우는 사람들이 C++ 책을 추천해달라고 할 때, The C++ Programming Language를 추천해줄 수 없었던 가장 큰 이유가 번역이 되지 않았다는 사실이었는데, 앞으로는 대답이 달라질 수 있을 듯하다.


Joel On Software


“Rapid Development”번역하신 박재호님이 번역작업중이시다. 이 책은 원래 개발자들 사이에 매우 유명한 “Joel On Software”라는 Joel Spolsky의 홈페이지 내용을 책으로 엮은 것이다. 나는 송민철 팀장님이 알려주신 “The Joel Test”를 통해서 Joel On Software를 알게되었는데, 이 후로 계속 RSS를 구독중이다. 아쉽게도, 원서를 아마존을 통해서 이미 사버려서, 번역판을 살 일은 없을 것 같지만, 이런 좋은 책이 번역된다는 것은 매우 기쁜 일이다.

Comments Off | Categories: Book, Software Development

My Xfire Profile

13 February 2005 by Joseph Jang

Xfire는 게이머들간의 social network를 형성하기 위한 툴입니다. 내가 플레이하는 게임이나 플레이하는 서버를 다른 사람들과 공유할 수 있죠. 어떤 게임을 플레이하고 있는지 탐지하기 위해 하드 드라이브를 검색해야하는데, 직접 게임들이 있는 곳을 바로 지정 못하는 점과, 인터페이스가 좀 아쉽지만, 그런대로 쓸만합니다. 어찌보면, Game Server Browser인 All Seeing Eye의 부분적인 기능을 가지고 있기도 하군요. (저는 All Seeing Eye의 lifetime registered user입니다.)


Counter-Strike community쪽에서는 Xfire를 사용하는 모습이 종종 보입니다. 우리나라의 Counter-Strike community인 NariCS에서도 Xfire를 지원합니다. (자신이 쓴 글 밑에 Xfire profile이 embed됩니다.)


다음은 제 Xfire profile입니다. 등록한지는 오래 됐는데, 그동안 사용을 안했고, 이제부터 사용해볼 생각입니다. 아이디는 cestlavie이니, 관심있는 분은 buddy로 등록하시길.


Cestlavie's Xfire Miniprofile

Comments Off | Categories: Game

VAC for Source Engine

13 February 2005 by Joseph Jang

요즘은 Counter-Strike:Source만 즐기는데요. 치터들이 많아서 답답해, Source에서의 anti-cheat 정보를 좀 찾아보았습니다.

seaofp님이 NariCS News에 “VAC가 곧 나올거다 아마도 1월 내에…”란 요지의 글을 올리신 적이 있는데, 비슷한 시기에 나온 이 사이트의 뉴스에서는 1 사분기(~3월)라고 하는군요. (Valve와의 interview에서 나온 얘기라고하니 뭐 믿을만 하겠죠?)

http://www.halflifesource.com/forums/showthread.php?threadid=27187

그리고, 최근에 나온 뉴스에도 “VAC 2 is coming”이라고 언급되어있군요.

http://ve3dboards.ign.com/message.asp?topic=18374398
http://www.narics.net/bulletin/view.php?id=b_news&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=4039

CD나 Punkbuster가 아니라면, 어서 VAC라도 나왔으면 좋겠습니다.

Comments Off | Categories: Game

Is PHP A Bad Programming Langauge? (Part 1)

09 February 2005 by Joseph Jang

Introduction


PHP는 매우 널리 퍼져있는 프로그래밍 언어다. TPC Index에서 10% 가량의 비율로 4위를 차지하고 있으며, Apache Module Report에서는 apache web server들의 50%에서 mod_php를 사용하고 있다는 점이 그 사실을 증명해준다.


반대로, PHP를 미워하거나 싫어하는 사람들도 많다. 회사에서도 PHP 대신 다른 언어를 쓰자는 의견도 자주 언급된다. 이러한 주장을 하는 사람들의 의견을 직접 들어보면, 합리적이거나 설득력 있는 이유를 제시하는 경우는 매우 드물다.


정말로 PHP는 나쁜 언어인가?


Philosophy and History of PHP


어떤 프로그래밍 언어든지, 그 언어를 만든 사람의 철학이 그 언어에 담겨있고, 그 언어의 발전방향을 결정하기 마련이다. PHP가 정말로 나쁜 언어인가를 판단하기 위해서는 PHP의 철학은 무엇인가를 알아둘 필요가 있다.


PHP Manual에서는 PHP를 다음과 같이 소개하고 있다.


PHP, which stands for “PHP: Hypertext Preprocessor” is a widely-used Open Source general-purpose scripting language that is especially suited for Web development and can be embedded into HTML. Its syntax draws upon C, Java, and Perl, and is easy to learn. The main goal of the language is to allow web developers to write dynamically generated webpages quickly, but you can do much more with PHP.


즉, PHP는 general-purpose이긴 하지만, Web development를 위해 특화된 언어이며, 쉽게 배울 수 있고, 빠르게 개발할 수 있는 (agile) 언어라는 점을 선언하고 있다.


PHP의 역사를 보면 왜 PHP가 이러한 철학을 가지고 있는지는 확연하게 드러난다. PHP의 원래 이름은 “Personal Home Page Tools”였으니 말이다.


Why PHP?


왜 PHP 였는가? 왜 여러 language alternative들 중 PHP가 “Web language”의 자리를 차지했는가? 답은 PHP 언어의 철학안에 있다. PHP는 웹 개발에 특화되어있었으며, 쉽게 배울 수 있고, 빠르게 개발할 수 있으며, open source였기 때문이다. 언어 외적인 중요한 factor 중 하나는 PHP가 빠르게 성장하고 있던 Apache의 module 기능을 처음으로 적용한 middleware solution이라는 것이었다. (“처음으로” 라는 사실은 중요하지 않다. ”초기에”라는 말이 적합할 것이다. 3개월 정도 후에, Perl도 modperl을 내놓았기 때문이다.)


Comments | Categories: Software Development

Indigo programming model

09 February 2005 by Joseph Jang

Windows XP/2003용의 Avalon, Indigo subsystem을 포함한 Visual Studio 2005 Beta 2가 곧 나올 예정이다.


한편, VSLive 2005에서는 Indigo Day에서 Indigo에 대한 여러가지 session들이 있었던 모양. 특히, Don Box의 ‘Programming Indigo’ session이 너무 보고 싶으나…


“Hello World” Indigo server만으로 참을 수 밖에 없다.


C# Attribute를 사용해 contract/interface를 명시하는 방식은 이미 최근 RPC 관련 programming model에서 일반적인 trend라고 볼 수 있고, ServiceHost는 일종의 Container라고 볼 수 있을 것 같다. 특기할만한 점은 C# Generics을 이용해 container와 implementation을 결합했다는 점 정도. 여러 end point를 추가할 수 있는 점도 여러 Transport를 제공하는 Indigo의 특성을 잘 드러내주는 점이라고 할 수 있을 듯 하다.

Comments Off | Categories: Software Development

Google Maps

09 February 2005 by Joseph Jang

http://maps.google.com/


우리나라에서 하는 지리 정보 서비스에서 기본적으로 제공하는 drag & drop base의 인터페이스를 기초로 하고 있다. (게다가 firefox에서도 잘보인다!) 그리고 역시나 keyboard shortcut (arrow key, page up/down, +/-)을 제공한다.


구글답게, 뭔가 틀린 점은 검색 인터페이스에 있다. “hotels in los angeles”, “fuel near los angeles” 등을 직접 쳐보라. 지도상의 위치들이 바로 나오고 전화번호들까지 보여준다. Direction 서비스도 마찬가지다, 도시나 거리 이름, 도로번호 등의 pair를 검색창에 넣으면, 길찾기를 할 수 있다.


신기하게도, 네이버 지도, 다음 지도, 야후 거기, 어떤 서비스도 이런 인터페이스는 보여주지 않는다. (주로 combo box를 이용해 지역을 선택하거나, 주소 정보만 보여주고, 지도 정보와 결합하지 않는다.) 사실 기술적으로도 우리나라 서비스에서 불가능한 것은 아니다. 지도 정보 자체의 질이 문제인 것도 아니다. 다만, 사용자를 얼마나 고려하는가하는 생각의 차이일 것이다. Google Maps의 직관적인 인터페이스와 네이버 지도 서비스의 난잡한 인터페이스를 비교해보라.


아쉽게도 Google Maps는 미국에 한정되어서 서비스되고 있다.

Comments Off |

XStandard

09 February 2005 by Joseph Jang

MovableTypeWriter에서 mshtml을 사용해보았는데, XHTML 표준에 너무 맞지 않는 코드를 생성해내서, XStandard란 product를 눈여겨보고 있다.


Lite/Pro 버전으로 나뉘어서, Lite 버전엔 확장성 관련 기능들이 좀 빠져있긴 하지만, Lite도 상용 제품에 사용가능하다는 것이 눈에 띈다. 무엇보다도, XHTML 표준에 맞는 코드를 생성해내는 것이 마음에 든다.


“The editor generates clean XHTML Strict or 1.1, uses CSS for formatting, and ensures the clean separation of content from presentation”


pistos2님이 쓰신 여러 HTML editor들의 비교글도 읽어보자.


http://blog.naver.com/pistos2/80002160967


Update: gaemon님에 의하면 blogger에서는 자체 editor에서 XHTML compliant한 코드를 생성해준다고 한다.

Comments | Categories: Software Development

← Older posts