export default {
  "owner": "doortts",
    "projectName": "Test",
    "assignees": [],
    "memberCount": 1,
    "issueCount": 2,
    "postCount": 248,
    "milestoneCount": 0,
    "issues": [
  {
    "id": 1,
    "title": "새로운 이슈",
    "type": "ISSUE_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1479543123000,
    "body": "이슈인거죠!!\r\n[bensound-cute.mp3](/files/21957)\r\n",
    "attachments": [
      {
        "id": 21957,
        "name": "bensound-cute.mp3",
        "hash": "0df209c0a171931c4612ac8edefc0d681498148e",
        "containerType": "ISSUE_POST",
        "mimeType": "audio/mpeg",
        "size": 2718353,
        "containerId": "1"
      }
    ],
    "comments": [
      {
        "id": 1,
        "type": "ISSUE_COMMENT",
        "authorId": "doortts",
        "authorName": "너굴",
        "createdAt": 1479543131000,
        "body": "넹 그럿습니다.\r\nㅋㅋ"
      },
      {
        "id": 2,
        "type": "ISSUE_COMMENT",
        "authorId": "doortts",
        "authorName": "너굴",
        "createdAt": 1479579108000,
        "body": "정말요?\r\n"
      },
      {
        "id": 3,
        "type": "ISSUE_COMMENT",
        "authorId": "doortts",
        "authorName": "너굴",
        "createdAt": 1479579129000,
        "body": "넹..ㅋㅋ[bensound-memories.mp3](/files/21959)\r\n[bensound-cute.mp3](/files/21958)\r\n",
        "attachments": [
          {
            "id": 21958,
            "name": "bensound-cute.mp3",
            "hash": "0df209c0a171931c4612ac8edefc0d681498148e",
            "containerType": "ISSUE_COMMENT",
            "mimeType": "audio/mpeg",
            "size": 2718353,
            "containerId": "3"
          },
          {
            "id": 21959,
            "name": "bensound-memories.mp3",
            "hash": "7e89fcc98822bdd2c0da64b23178bfb6ca7d78dc",
            "containerType": "ISSUE_COMMENT",
            "mimeType": "audio/mpeg",
            "size": 3224136,
            "containerId": "3"
          }
        ]
      }
    ]
  },
  {
    "id": 2,
    "title": "또 새로운 이슈",
    "type": "ISSUE_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1479544250000,
    "body": "인겁니다!"
  }
],
    "posts": [
  {
    "id": 1,
    "title": "1st",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1206515873000,
    "body": "> doortts | 2008-03-26 수요일 오후 4:17 | 이생각 저생각 | [원본](http://blog.doortts.com/1)\n\n동욱의 도움으로\n티스토리 입점.\n\n기술적인 이야기를 해보려고 고민중임.(얼씨구)\n\n#### Comments\n\n얼씨구-\n조타!\n\n이런 저런 이야기 주저리 주저리 해보는 아이디어 좋다.\nIT이야기 만담 식으로는 어때?\n\n우리 대화를 재밌어 할 사람들이 www에는 있지 않을까...\n없음 말구 OTL\n\n [M-o-N](http://nephilim.tistory.com) | 2008-03-27 목요일 오후 7:26\n\n--\n\n오랜만이 글을 쓰려고 보니까 '굉장히 힘든 일'이라는걸 알게 되었어! 도둑질도 해 본 놈이 한다고 (응?) 조금씩 쓰다보면 나아지지 않을까?\n\n [doortts](http://doortts.tistory.com) | 2008-03-28 금요일 오후 1:56\n\n--\n"
  },
  {
    "id": 2,
    "title": "Aged engineer",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1206532988000,
    "body": "> doortts | 2008-03-26 수요일 오후 9:3 | 이생각 저생각 | [원본](http://blog.doortts.com/2)\n\n직장동료가 이야기를 들려줬다.\n\nembeded software 업체에 있던 친구가 있는데 그만두고 한전에 취직했다고 한다. 전공이 전기쪽이었다고는 하는데, 어쨌든 수년간의 경험과 지식을 버리고 한전에 간 셈이다.\n\n그런데 그 친구가 말하길,\n\nIT 쪽에서 일하다 나이를 먹으면 기술과 시류에 뒤떨어져서는 결국 찬밥신세인데,\n한전에 와보니 여기 사람들은 시간이 지나면 지날수록 기술과 연륜이 쌓여서\n오히려 정년 퇴직을 한 사람들을 데려다 쓰질 못해서 안달이라는 거다.\n\n엔지니어라면, 그리고 오랫동안 한 분야에서 갈고 닦는다면 한전 기사 같은 형태가 되어야 맞는데, 이바닥(IT)은 당췌 어케 살아남는가 만이 화두가 되기 십상인 BLOOD RED OCEAN 인 거다.\n\n그래도 열심히 살면 되겠지? 뒤떨어 지지 않도록 노력하면 같이는 가겠지? 싶기도 한데,\n\n사실 하는 일에 익숙해지다 보니, 어느샌가 새로운 일이 두려워져 버려 움추려드는 사람이 되어 자신만의 살길(?)을 찾아 자기 정당화 내지는 합리화의 논리를 펼쳐버리게 되기도 한다.\n\n바로 기술자와 관리자로 나뉘는 거다.\n\n기술에 빠져들어 점점 안드로메다로 가시는 젊은 분들은 곧잘\n**'기술은 1g 도 모르는 것들이 위에서 말만하며 관리가 고급기술인 줄 착각하며 우릴 무시한다'** 며 비난하고\n\n**'중요한건 기술이 아니야. 사업의 방향성과 그 안에서 사람을 어떻게 다루느냐 인거야. 뭘 모르는 새파란 것들'** 이라며 기술자를 나무라는 윗분들의 모습은 참 마음이 답답하게 만든다.\n\n그 와중에 사람좋고 착하고 그저 성실하다보니,\n그렇게나 능력좋고 총기있던 사람들이 소위 말하는 **'시스템'**이라는데 적응해 버려서는\n그저 워드/엑셀/파워포인트에만 열중하는 모습을 보며\n\n참 아쉬운 마음이 크게 든다.\n\n#### Comments\n\n그래.. 한전 알았어..\n\n [M-o-N](http://nephilim.tistory.com) | 2008-03-27 목요일 오후 7:45\n\n--\n"
  },
  {
    "id": 3,
    "title": "Where will life take you",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1206776520000,
    "body": "> doortts | 2008-03-29 토요일 오후 4:42 | 이생각 저생각 | [원본](http://blog.doortts.com/3)\n\n재능과 안목에 무릎꿇고 앉아서 좌절할만한 루이비통의 광고 영상\n\nLouis Vuitton's Where will life take you? (Directed : Bruno Aveillan)\n\n\n\n#### Comments\n\nㅇㅇ.. 가격과 마케팅에 무릎 꿓고 앉기도 한다우. OTL\n\n [M-o-N](http://nephilim.tistory.com) | 2008-03-31 월요일 오전 1:30\n\n--\n"
  },
  {
    "id": 4,
    "title": "세렌게티 초원에는 물소들만 날뛰고... (응??)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1207806720000,
    "body": "> doortts | 2008-04-10 목요일 오후 2:52 | 이생각 저생각 | [원본](http://blog.doortts.com/4)\n\n![zrclip_008p3fb7e291.png](/files/21526)})\n\n팀 내에는 좋은 책들이 (이미) 많고,\n또 적절히 좋은 책들을 들여오고 있는데,\n\n다행히도 '우왓!' 할만한 좋은 책이 들어와도\n읽기 위해 팀내에서 경쟁(?)을 하지 않아도 된다.\n\n이런 기쁜 상황에 눈물이 앞을 가린다.\n\n흑흑..\n\nps. 이 글을 쓰려고 맘 먹은 순간 뒤에 앉은 모 군이 신간 책 하나를 인터셉트(인터럽트?) 해갔다.\n\n나야 차차 읽으면 되는지라 '천천히 읽지 뭐~' 하지만\n그래도 이게 얼마만에 일어난 경쟁(...)인가 하는 생각에\n이상스레 가슴이 뭉클..\n\n하지만 그 인간도 얼마 뒤면 딴데로 간다는 생각에\n한번 더 가슴이 뭉클..\n\n#### Comments\n\n지금 와서 말하는데 그 Effective Java는 아무리 생각해도 복사본이야. \n 어딘가에서 돈이 새고 있어... \n\n 그게 ほんもの일리가 없다구! 어따 숨켜써!\n\n [M-o-N](http://nephilim.tistory.com) | 2008-04-10 목요일 오후 10:10\n\n--\n",
    "attachments": [
      {
        "id": 21526,
        "name": "zrclip_008p3fb7e291.png",
        "hash": "47e954eb74669f584c777ab3f4e609e6f851eb78",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 90288,
        "containerId": "12184"
      }
    ]
  },
  {
    "id": 5,
    "title": "IT (=In This?) World",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1208751240000,
    "body": "> doortts | 2008-04-21 월요일 오후 1:14 | 이생각 저생각 | [원본](http://blog.doortts.com/5)\n\n'사람들의 삶의 질을 향상시킨다'다는 기치 아래 존재하는 이 세상(IT)은\n매우 아이러니 하게도 그 참여자들의 삶은 곧잘 어지간한 3D는 저리 가라 하는 수준밖에\n되질 않곤 한다.\n\n밤낮없이 자신의 Life meter 를 줄여가면서 일하지만,\n그 결과 누리게 되는 댓가는 무엇인가?\n\n![zrclip_001n7950a51b.png](/files/21527)})\n\n좀 더 나은 시스템과 종사자들을 위한 신기술은 끊임없이 나오고 있지만,\n열심히 따라가려 노력해도 그 성과가 눈이 쉽게 보이는 일은 잘 없다.\n\n기술들과 그에 바쳐진 사람들의 피와 땀은 결국\n시스템을 팔팔하게 살리지만, 정작 본인들은 그 장소에 환멸을 느끼곤 한다.\n\n나 또한 청소차만 지나다니는 새벽길을\n\n'내가 무슨 큰 부귀영화를 누리겠다고 이리 살고 있나?'\n\n하며 눈물 주륵주륵 흘리며 출근하던 시절이 있었다.\n\n그런시절을 겪으면서도,\n여지껏 내가 이 업계에 남아 있는 이유는,\n\n별것 아닌 오기 한 점,\n\n조그마한 바람 한결에 지나지 않더라도\n업계의 삶을 바꾸어보리라, 내 주변 만이라도 다른 세상의 아침을 맞이하게 하리라 하는\n치기어린 목표가 있어서이다.\n\n실력을 키우고, 힘을 키워\n어떻게든 노력해보고 물러나도 물러나야하지 않겠나... 하고 생각하고는 있는데,\n\n지금처럼 해서 과연 그런 날이 올까?\n\n싶은 생각에 마음 한켠이 살짝 시려온다.",
    "attachments": [
      {
        "id": 21527,
        "name": "zrclip_001n7950a51b.png",
        "hash": "55a198fba3332a3a9213a12c50b12dc7dea179b0",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 87552,
        "containerId": "12185"
      }
    ]
  },
  {
    "id": 6,
    "title": "Nihilistic punch line?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1208874618000,
    "body": "> doortts | 2008-04-22 화요일 오후 11:30 | 이생각 저생각 | [원본](http://blog.doortts.com/6)\n\n인생의 행복을 타인의 시선에서 찾는다면\n그래서 남들이 어떻게 생각하느냐에 따라\n\n스스로가 가슴뿌듯 행복하게,\n때로 부끄러움에 비참해하는 삶을 산다면\n\n자신의 인생을 어찌 내 것이라 말할 수 있겠는가?\n\n행복은\n\n현재 자신의 상황이 아니라\n현재 자신의 마음가짐에 달린거라는걸\n\n잊지 말자.\n\nNihilistic punch line\n: 허무주의의 멋들어진 농담\n\n재미있는 단어라서 그냥 뜻없이 써본다."
  },
  {
    "id": 7,
    "title": "Eclipse Plugin Project 생성시 Rcp option 의 의미",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1208967660000,
    "body": "> doortts | 2008-04-24 목요일 오전 1:21 | 이클립스 RCP | [원본](http://blog.doortts.com/7)\n\n![042308_1619_1.png](/files/21528)})\n\n**Rich Client Application**\n\nRCP를 만들려면 **org.eclipse.core.runtime.applications** 확장을 가져야 한다.\n\n거기다가 만일 Branding 을 원하면 **org.eclipse.core.runtime.products** 확장이 있어야 한다.",
    "attachments": [
      {
        "id": 21528,
        "name": "042308_1619_1.png",
        "hash": "c9408428f494d74cac4ddad1066a330346f146ef",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 6870,
        "containerId": "12187"
      }
    ]
  },
  {
    "id": 8,
    "title": "Zoundry Raven = Blog Writer",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209019052000,
    "body": "> doortts | 2008-04-24 목요일 오후 3:37 | 이생각 저생각 | [원본](http://blog.doortts.com/8)\n\n블로그에 글을 쓰는데, 사실 온라인 상에서 써도 별로 불편한 건 없다.\n\n왜냐하면 이미 computer = network 라는 공식이 성립되어 있기 때문에,\n어디를 가든 온라인 어플리케이션(blog)를 편하게 쓸 수 있다.\n\n하지만 한가지 불편한게 있는데, 바로 그림을 올려야 할 경우이다. (특히 캡쳐해서 그걸 올릴려고 할때는 캡쳐 -> 그림판 -> 저장 후 updload -> 이미지 지정 등등등)\n\n이럴때 전용 wirter 를 쓰면 상당히 편해진다. 현재 내가 아는 수준에서 alt - print screen 으로 캡쳐 -> 붙여넣기 후 자연스럽게 이어서 글쓰기가 가능한 툴은\n\n*   MS OFFICE 2007\n*   MS Live Writer\n*   그리고 오늘 알게 된 Zoundry Raven\n\n이다.\n\n안타깝게도 Open office 계열에서는 지원해 주지 않는다. (심지어 개발자 버전의 open office 3.x 대에서도 마찬가지로)\n\nMS OFFICE 는 무겁기도 하거니와 현재 업무상 쓰는 office 2003을 바꿀수 없어서 PASS\n\nMS LIVE Writer 는 써보니까 괜찮긴 하던데(msn 계정과 연동가능!!) 디자인과 편의가 개인적인 욕심수준(?)에 미달,\n\n지금 쓰고 있는 Zoundry Raven 이 당첨! 되겠다.\n\n[http://www.zoundryraven.com/](http://www.zoundryraven.com/)\n\n![zrclip_002p2e8b7bff.png](/files/21529)})\n\n원하는 기능은 다 되고, 느리지도 않고 편하고 좋다.\n\n이미 올린 글들까지 볼 수 있고 수정도 가능하니 더더욱 좋지 아니한가?\n\n개인적으로 강추 한방 날린다.\n\n![zrclip_003p74d02e8e.png](/files/21530)})\n\n![zrclip_004p5e20ea83.png](/files/21531)})\n\n#### Comments\n\n오오 내가 원하던 그런거야! thx~\n\n [M-o-N](http://nephilim.tistory.com) | 2008-04-25 금요일 오전 12:16\n\n--\n",
    "attachments": [
      {
        "id": 21529,
        "name": "zrclip_002p2e8b7bff.png",
        "hash": "b8c6318e874d524729bd3d49a82ff2aad426dd8c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 30951,
        "containerId": "12188"
      },
      {
        "id": 21530,
        "name": "zrclip_003p74d02e8e.png",
        "hash": "5806e44c31cb432c59ec14cb1fb8fc63e30c5187",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 39444,
        "containerId": "12188"
      },
      {
        "id": 21531,
        "name": "zrclip_004p5e20ea83.png",
        "hash": "81cb176407e0f04edad0b3fc9ed9a48c42698482",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 35454,
        "containerId": "12188"
      }
    ]
  },
  {
    "id": 9,
    "title": "Eclipse Europa 로 RCP 만들기, 부제 : 좌절금지",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209021661000,
    "body": "> doortts | 2008-04-24 목요일 오후 4:20 | 이클립스 RCP | [원본](http://blog.doortts.com/9)\n\n내가 아는 한 세상에 나온 본격적인 RCP 책은 단 한 권뿐이다.\n\n![zrclip_005n27432a13.png](/files/21535)})\n\n바로 이책이다.\n\n2006년에 원서로 스터디를 하다가, 팀원들 다 좌절드시고 혼자 버둥대다가, 작년에 번역서가 나오면서 올해 다시 시작하고 있는데, 참 잘 쓴 책이란 생각이 든다. (정말 개발 많이 해본 사람이 쓴 책이라는걸 설명도 없이 지나가는 부분에서 문득문득 느끼곤 한다.)\n\n다만 **아쉬운 점**이 하나 있는데 바로 **이클립스 3.1 기준으로 쓰였다**는 점이다.\n(책 겉면에도 'eclipse 3.1의 새로운 RCP 기능 어쩌구 하는 문구가..)\n\n현재 3.3 (유로파) 이 대세이고 곧 3.4가 나오며 e4( eclipse 4) 준비 중인 시점에서 3.1로 시작하는건 좀 아니지 않냐? 라는 이상한 자존심에 3.3으로 어찌어찌 진행중인데 곳곳에 함정이 기다리고 있다.\n\n특히, 근래에 겪은 extension 을 인식하지 못하는 상황은 나를 심히 좌절시켰었다. 문서도 없고, 논의글도 없어서 정말 어렵게 어렵게 try and repeat 형태로 우회하는 방법을 알아내었지만, 영 찜찜함이 그지없었다.\n\n그냥 3.1로 깔로 착실하게 책대로 가야 하나 하는 고민에까지 빠져들게 했는데..\n\n![zrclip_006n71660c6d.png](/files/21532)})\n(뜬금없는 엄한 사진..)\n\n**그러다 이틀전!**\n\n문득 떠오른 생각 하나! 혹시 버그 아니삼? (-,-);;;\n\n![zrclip_001n5795bc63.png](/files/21533)})\n\n업데이트를 해 보았다.\n![zrclip_007n494c4dc1.png](/files/21534)})\n\n**잭일슨!!! eclipse.org download 에도 없는 3.3.2 버전으로 update 가 되면서 문제가 사라진 것이다!!** 어쩐지 논리적으로 말이 안되더라 싶더니만.. 업데이트(패치)로 해결이 되다니...\n\n아는 사람도 없고, 해당 부분을 하는 사람도 없으니 구굴에서 문제제기를 하는 사람도 없고.. (몇몇있는데 그들도 못찾고 뻘짓중이더라..)\n\n어쨌든 그리하여 또 한 고비를 넘겼다. 최종적으로 스터디를 마치게 되면 그간 고생한 내용을 정리해서 공유해야 겠다는 생각 뿐이다.\n\n힘들구나~ 힘들어~~",
    "attachments": [
      {
        "id": 21532,
        "name": "zrclip_006n71660c6d.png",
        "hash": "82b31189cb1593b143cff38c23a0c765a0c8ce9c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 40527,
        "containerId": "12189"
      },
      {
        "id": 21533,
        "name": "zrclip_001n5795bc63.png",
        "hash": "9d4d23bcdf185677e904bba7dfbfc0dc93e9bcd4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 60648,
        "containerId": "12189"
      },
      {
        "id": 21534,
        "name": "zrclip_007n494c4dc1.png",
        "hash": "2911d615b841e974876fdbf88254912a291c9b28",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 41211,
        "containerId": "12189"
      },
      {
        "id": 21535,
        "name": "zrclip_005n27432a13.png",
        "hash": "90e5b6e4d5ef3e0d4eb5707f59ad4b8dfbecac8f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 71649,
        "containerId": "12189"
      }
    ]
  },
  {
    "id": 10,
    "title": "Eclipse 3.3 에서 왜 help system 이 extension 으로 정상 동작하지 않는가?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209027046000,
    "body": "> doortts | 2008-04-24 목요일 오후 5:50 | 이클립스 RCP | [원본](http://blog.doortts.com/10)\n\n## \norg.eclipse.help.toc\n\nextension을 추가하는 것 만으로는 help 메뉴가 동작하지가 않는다.\n\n현재 논의 되고 있는 차기 3.4 버전에서 이 help 지원이 향상될거라고는 하는데 어쨌든 우선은 아래와 같은 plugin 들을 target platform 에 넣어주어야 한단다. (그걸 어찌 알수 있었겠소!!!)\n\n[https://bugs.eclipse.org/bugs/show_bug.cgi?id=202160](https://bugs.eclipse.org/bugs/show_bug.cgi?id=202160)\n\n![zrclip_009n42125b77.png](/files/21536)})\n\n#### Comments\n\n흙내음이나오.\n 당신이 삽질한 이 대지에서...\n\n [M-o-N](http://nephilim.tistory.com) | 2008-04-24 목요일 오후 11:59\n\n--\n",
    "attachments": [
      {
        "id": 21536,
        "name": "zrclip_009n42125b77.png",
        "hash": "35fda825698f34b376ccbbe1b44ef5278040cfa9",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 32148,
        "containerId": "12190"
      }
    ]
  },
  {
    "id": 11,
    "title": "이클립 RCP 5번째 생일",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209205822000,
    "body": "> doortts | 2008-04-26 토요일 오후 7:30 | 이클립스 RCP | [원본](http://blog.doortts.com/11)\n\n[5년전](https://bugs.eclipse.org/bugs/show_bug.cgi?id=36967 \"Bugzilla Entry\") [bugzilla](https://bugs.eclipse.org/bugs/show_bug.cgi?id=36967 \"bugzilla entry\") 에 앞으로 이클립스를 non-IDE 형태의 독립형 Rich Client Application 으로 만들어달라는 요청이 처음으로 등록되었고, 현재에 이르렀다고 한다.\n\n이제 RCP 도 [equinox p2](http://wiki.eclipse.org/Equinox_p2) 프로젝트와 함께 조만간 업그레이드 된다고 한다. (두근두근)\n\n아직은 대중성에서 다소 부족하지만, 새로 거듭나는 모습에서는,\n\n현재의 인기없는 JAVA GUI DESKTOP Application 의 category killer 가 되어 주길 바란다.\n\nHappy birth day rcp!"
  },
  {
    "id": 12,
    "title": "14 Rules for Faster-Loading Web Sites",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209717032000,
    "body": "> doortts | 2008-05-02 금요일 오후 5:30 | Better SW Development | [원본](http://blog.doortts.com/12)\n\n14 Rules for Faster-Loading Web Sites\n\n*   [Rule 1 - Make Fewer HTTP Requests](http://stevesouders.com/hpws/rule-min-http.php)\n*   [Rule 2 - Use a Content Delivery Network](http://stevesouders.com/hpws/rule-cdn.php)\n*   [Rule 3 - Add an Expires Header](http://stevesouders.com/hpws/rule-expires.php)\n*   [Rule 4 - Gzip Components](http://stevesouders.com/hpws/rule-gzip.php)\n*   [Rule 5 - Put Stylesheets at the Top](http://stevesouders.com/hpws/rule-css-top.php)\n*   [Rule 6 - Put Scripts at the Bottom](http://stevesouders.com/hpws/rule-js-bottom.php)\n*   [Rule 7 - Avoid CSS Expressions](http://stevesouders.com/hpws/rule-expr.php)\n*   [Rule 8 - Make JavaScript and CSS External](http://stevesouders.com/hpws/rule-inline.php)\n*   [Rule 9 - Reduce DNS Lookups](http://stevesouders.com/hpws/rule-dns.php)\n*   [Rule 10 - Minify JavaScript](http://stevesouders.com/hpws/rule-minify.php)\n*   [Rule 11 - Avoid Redirects](http://stevesouders.com/hpws/rule-redir.php)\n*   [Rule 12 - Remove Duplicate Scripts](http://stevesouders.com/hpws/rule-js-dupes.php)\n*   [Rule 13 - Configure ETags](http://stevesouders.com/hpws/rule-etags.php)\n*   [Rule 14 - Make AJAX Cacheable](http://stevesouders.com/hpws/rule-ajax.php)\n\n참조 : [http://stevesouders.com/hpws/rules.php](http://stevesouders.com/hpws/rules.php)\n\n#### Comments\n\nFaster-Loading Web Sites!!\n오메!\n이런 건 내 분야인줄 알았는데..\n\n [M-o-N](http://nephilim.tistory.com) | 2008-05-24 토요일 오전 1:24\n\n--\n"
  },
  {
    "id": 13,
    "title": "이름없는 액션은 허공에 발길질",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209721425000,
    "body": "> doortts | 2008-05-02 금요일 오후 6:43 | 이클립스 RCP | [원본](http://blog.doortts.com/13)\n\n확장을 이용하지 않은 사용자정의 Action 은 반드시 ID 를 지정해 주어야 한다.\n\n아니면 regist( someAction) 시에 에러가 발생한다.\n\n..\n\nActionBarAdvisor Class ...\n\n![zrclip_003n262e77b2.png](/files/21538)})\n\nAssert 로 id 가 없을경우 run 실패를 만들어 버린다.\n\n그리고 Action Class 에 **final static String 으로 ID를 설정해 놓아도 setId 안하면** 말짱 황!\n\n![zrclip_002p1259502b.png](/files/21537)})",
    "attachments": [
      {
        "id": 21537,
        "name": "zrclip_002p1259502b.png",
        "hash": "42ef613f2f2611b8bf39ece13cd4d0ea200c34a8",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 6156,
        "containerId": "12193"
      },
      {
        "id": 21538,
        "name": "zrclip_003n262e77b2.png",
        "hash": "3ac689a0b2b2d8620bfa7e4c43ccca5328b7587e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 3990,
        "containerId": "12193"
      }
    ]
  },
  {
    "id": 14,
    "title": "Java 언어로 배우는 디자인 패턴 입문(개정판)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209827955000,
    "body": "> doortts | 2008-05-04 일요일 오전 12:19 | Books | [원본](http://blog.doortts.com/14)\n\n현재 상태 : WANTED\n\n![zrclip_001n294b57f4.png](/files/21539)})\n\n예전에 이 책의 2편(쓰레드)을 옆 동료한테서 살짝 빌려서 본 적이 있었는데, 꽤 괜찮았었던 걸로 기억한다.\n새로 개정판이 나왔다고 하는데 봐야겠다는 의지가 살살 생긴다.\n\nHead First : Design Pattern 책이 워낙 잘 나왔었기에 (= 개인적으로는 읽고서는 쇼크상태까증..-,-) 과연 어떨까 싶은데, 우선 연습문제라는 것들이 있어서 나름 자극이 되지 않을까 싶다.\n\n#### Comments\n\n이 책 초판하고 헤드 퍼스트 둘다 봤었는데요.. \n초판은 절판으로 빌려서 봤었어요.\n이 책이 더 이해가 쉬운듯 하네요..ㅋ\n아마도 영어번역 보다는 일어 번역이 더 쉽기도 하고..\n헤드퍼스트는 약간.. 그림 난발이자나요 ㅋ.\n\n [루비시안](http://starplatina.tistory.com) | 2008-05-21 수요일 오전 11:15\n\n--\n\n그 옆 동료... -_-;;\n응 이 책 참 잘썼던겄같아. (내가 개정 이전의 판본을 봐서 이리 애매한 표현밖에...)\n\n [M-o-N](http://nephilim.tistory.com) | 2008-05-24 토요일 오전 1:23\n\n--\n",
    "attachments": [
      {
        "id": 21539,
        "name": "zrclip_001n294b57f4.png",
        "hash": "2d97f3ce29c00a0995ca156ebbf0c1a746dbc39e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 238488,
        "containerId": "12194"
      }
    ]
  },
  {
    "id": 15,
    "title": "켄트 벡의 구현 패턴 : 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209828360000,
    "body": "> doortts | 2008-05-04 일요일 오전 12:26 | Books | [원본](http://blog.doortts.com/15)\n\n현재상태 : WANTED\n\n![zrclip_002n3f6a1b3.png](/files/21543)})\n\n서점에 가서 잠깐 봤는데, 우선 책이 얇다. 그리고 얇은 거에 비해서는 가격은 얇지 않다. (-,-);\n\n다만 고민하면서 읽어 볼만한 내용이 있어서 약간 흥미가 가긴 가는데, 내돈 주고 보기는 사실 살짝 아까운 감이... (^_^);;\n\n그래도 기회가 닿으면 읽어보고 싶은내용.\n\nPS. 번역이 좀 부실하다는 이야기가 서평으로 약간 들려온다.\n\n#### Comments\n\n요즘 우리  \"벡\"씨가 같은 뼈로 사골국물을 100번도 더 우려낸다는 소문이...\n\n [M-o-N](http://nephilim.tistory.com) | 2008-05-24 토요일 오전 1:22\n\n--\n",
    "attachments": [
      {
        "id": 21543,
        "name": "zrclip_002n3f6a1b3.png",
        "hash": "04152bc0da6845e3176a60bc10cea9082d14c7d6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 125343,
        "containerId": "12198"
      }
    ]
  },
  {
    "id": 16,
    "title": "Blog2Book 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209829281000,
    "body": "> doortts | 2008-05-04 일요일 오전 12:41 | Books | [원본](http://blog.doortts.com/16)\n\n![zrclip_003n2e37d968.png](/files/21541)})\n\n우선 우리나라에서 이런류의 책의 발간되었다는 사실에 약간 감탄하였다.\n\n\n몇몇 비슷한 책이 출간되었었지만,\n\n아직까지는 가장 마켓팅에서 성공한 책이지 않나 싶다.\n\n\n\n내용은 저자가 현장에서 고생을 많이 했고,\n\n단순히 고생으로만 끝내지 않고 공부도 적잖이 했다는 것을 알려준다.\n\n\n다만,\n\n\n구성에 있어서 다소 산만한 경향이 있다.\n\n하나의 주제에 대해서 직접건드리기 보다는,\n\n\n관련내용부터 시작하는지라 약간 뜸을 들인다고 해야 할까?\n\n그런 덕분에 분량에 비해 하고자 하는 이야기가 다소 약해진감도 없잖아 있지만,\n\n쉽게 숙숙~ 읽을 수 있는건 장점이기도 하다.\n\n\n자, 그럼 나름 몇개 항목으로 정리해 보면~\n\n\n전문성 : ★★★☆☆\n\n책구성 : ★★★☆☆\n\n난이도 : ★★★☆☆\n\n흥미도 : ★★★★☆",
    "attachments": [
      {
        "id": 21541,
        "name": "zrclip_003n2e37d968.png",
        "hash": "db7e7e09503f94ce54100509cea5156da0a29480",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 118902,
        "containerId": "12195"
      }
    ]
  },
  {
    "id": 17,
    "title": "프로그래밍 수련법",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1209829628000,
    "body": "> doortts | 2008-05-04 일요일 오전 12:47 | Books | [원본](http://blog.doortts.com/17)\n\n![zrclip_004n7fb407e0.png](/files/21542)})\n\n서점에 봤을때는 사실 눈에 잘 안들어 왔는데, 서평이 나쁘지 않아서 다시금 관심이...",
    "attachments": [
      {
        "id": 21542,
        "name": "zrclip_004n7fb407e0.png",
        "hash": "f3860f6989e1aeec1c9950f0f19104f55f9559f2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 121923,
        "containerId": "12197"
      }
    ]
  },
  {
    "id": 18,
    "title": "일기장",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1210643880000,
    "body": "> doortts | 2008-05-13 화요일 오전 10:58 | 이생각 저생각 | [원본](http://blog.doortts.com/18)\n\n내가 내 인생의 4년이란 세월을 쏟은 전공(과목)이란 것을 버리고 이 업계를 향했을 때, 내 마음은 순진 그 자체였다. 컴퓨터를 가까이 하고, 그 걸 통해 무언가를 만든다(create)는 사실에 대단히 흥분해 있었다. 그리고 아주 소박한 개인목표를 하나 가졌었는데, 그건 **내가 만든 일기장으로 일기를 쓰는 것**이었다. 다만, 거기엔 조건이 하나 있었는데 그 일기장은 **웹이 아니라 클라이언트 프로그램이여야 한다**는 것이었다.\n\n![zrclip_006p78b59378.png](/files/21544)})\n\n7 years passed away..\n\n세상이 변했다. 나도 변했다. 많은 기술을 접했고, 그리고 그 만큼이나 잊었다.\n\n하지만 난 아직 일기장을 만들지 못했다.\n\n> 블로그에 글을 매일 올리면 되지 않느냐? 웹 사이트도 하나 갖고 있지 않느냐?\n\n반문할 수 있는데, 사실 그건 사기꾼 소리조차 듣지 못할 유치한 변명일 뿐이다.\n\nJAVA 가 창궐했을때, 자바로 만들면 어떨까? 생각했었는데, 그 충격적인 Desktop application speed에 손을 놓았다. (정신은 이미 한참전에 놓고 살았던지라 그건 놓고 말고도 없었고..-,-)\n\n흠흠.. 어쨌든 상황도 많이 바뀌었고, JAVA 가 느리다는 것도 어디까지나 상대적인 이야기이지 desktop application 으로 충분히 쓸만한 시절이 되었다. 덕분에 요새 들어 다시 한번 일기장 만들기의 꿈이 살살 올라오고 있다. 어쩌면 지금이 기회가 아닐까? 싶기도 하다. 시도해 볼까나?",
    "attachments": [
      {
        "id": 21544,
        "name": "zrclip_006p78b59378.png",
        "hash": "297d1e2792f5919a18e365ef231a8b51396dde0b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 84360,
        "containerId": "12196"
      }
    ]
  },
  {
    "id": 19,
    "title": "Code for whom",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1210665180000,
    "body": "> doortts | 2008-05-13 화요일 오후 4:53 | 이생각 저생각 | [원본](http://blog.doortts.com/19)\n\n이바닥에서 키보드 좀 쳤다 하는 사람이라면, 흔히 인용되는 문구 중에 파씨 형님(=Martin Fowler)이 말한\n\n> **![zrclip_001n77050d56.png](/files/21545)})\n> 컴퓨터가 이해하는 코드는 어떤 바보라도 짠다. 좋은 프로그래머는 사람이 이해하는 코드를 짠다**\n\n라는 글을 본 적이 있을거다.\n\n참, 좋은 글귀다.\n\n또 Software 칠판에 선좀 그었다 하는 백형(=Kent Beck)은\n\n> **![zrclip_002p37700e20.png](/files/21540)})\n> 내가 사용하는 비용 절감 전략은 모든 프로그래머가 커뮤니케이션하기 쉬운 코드를 짬으로써, 유지 비용을 줄이는 것이다.**\n\n라고 말했다고 한다.\n\n역시 좋은 글귀다.\n\n어디선가는\n\n> **당신이 타인의 코드를 쉽게 잘 이해했다면 당신이 뛰어난 것이 아니라 코드를 작성한 사람이 뛰어난 것이다**\n\n라는 글귀도 본것 같다.\n\n자, 그러면 이것들이 공통적으로 의미하는 것은 무엇인가?\n\n혼자 방에 앉아서 커피를 홀짝이며 짜서는 결국 혼자만 쓰는 프로그램이 아니라면, 혹은 키보드에 손을 대는 순간 의식을 읽어 왜 이렇게 짰는지 알아버린다는 사이코메트리(Phychometry)와 함께 작업하는게 아니라면,\n\n돌고래와 IQ경쟁을 벌이는 범인들도 소설책을 보듯 읽을 수 있어야 하고,\n\n**적어도 이게 날자는 건지 헤엄치자는 건지는 누구나 제대로 이해할 수 있게 프로그램을 작성해야 한다는 소리다.**\n\n얼마전에 읽은 어떤 글은\n\n'Email은 누구의 것인가? 쓴 사람(writer)의 것인가? 읽을 사람(receiver)의 것인가? '\n\n라며 커뮤니케이션에서 상대 배려의 중요성을 말하고 있었다. (신 문명의 총아로 인정받다 이제는 쓰레기통처럼 변해 버린 Email 이지만 어쨌든.)\n\n마찬가지로 협업프로그래밍에 종사한 사람은 자신이 작성하는 코드는 누구를 위한 코드인가? 에 대해서 진지하게 고민해 봐야 한다.\n\n개인적으로 생각하는 **아름다운사람의 기본 조건**은 자신에 대한 존중만큼이나 타인에 대해 배려를 할 줄 아는 사람이라 생각한다. (특히 약자에 대해서는 더욱더!)\n\n그런 의미에서 getNmc() 가 getNameCode 인지 getNativeMachineCode 인지 읽는 사람의 상상력을 한껏 자극해 들판으로 뛰나가고 싶게 유도하는 짓은 미국산 소고기만큼이나 비추인 거다.\n\n#### Comments\n\n내 언젠간 이 글에 Trackback 한 번 달 것 같네!\n내가 요즘 <모모모 TFT>에 있잖아. 참 진취적이고 도전꺼리여서 좋은데...\n\n사람들이 왜 패턴도 많이 알고, 책도 많이 읽은 똑똑한 사람들이 그 쉬운 \"기본 조건\"  문제는 소홀하게 대하는 걸까?\n\n [M-o-N](http://nephilim.tistory.com) | 2008-05-24 토요일 오전 1:19\n\n--\n\n공감하며 읽다가, Email 얘기에선 가슴이 뜨끔하네... 난 그래도 나 하고싶은대로 떠들며 살고 싶어.... 읽기 싫으면 말라지...쳇....--;;;\n\n [yarrie](http://cskstory.tistory.com) | 2008-07-02 수요일 오후 11:6\n\n--\n",
    "attachments": [
      {
        "id": 21540,
        "name": "zrclip_002p37700e20.png",
        "hash": "4ec3ff5cc918bbb608854c92488e42a7305ce663",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 50274,
        "containerId": "12199"
      },
      {
        "id": 21545,
        "name": "zrclip_001n77050d56.png",
        "hash": "36ba0f97ef8c8a67c73a558c87fd93c35acf2287",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 64980,
        "containerId": "12199"
      }
    ]
  },
  {
    "id": 20,
    "title": "eclipse 3.4에 탑재된 equinox p2에 대한 시끄러움들",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1212292004000,
    "body": "> doortts | 2008-06-01 일요일 오후 12:45 | 이생각 저생각 | [원본](http://blog.doortts.com/20)\n\neclipse 3.4에 탑재된 equinox project2 (이하 p2)에 대한 갑론을박 이야기가 끊이지 않고 있다.\n\n처음에는 몇몇 사람들의 eclipse update 에 대한 불만정도로 이해했었는데, 광범위하게 이야기가 번져서는 p2 프로젝트 팀원들에 대해 일종의 분노(?)까지 나타내는 사람들이 늘고 있다. (참조 : [planeteclipse.org](http://www.planeteclipse.org/ \"Planet Eclipse is a window into the world, work and lives of Eclipse hackers and contributors.\"))\n\n대략 이야기는 p2를 적용하면서 software update 가 완전히 바뀌는 바람에 **'적응이 대략난감!'**이라는 형태인것 같다. 사실난 아직 3.4로 올라갈 생각이 없기 때문에 뭐라 하긴 어렵지만, 많은 사람이 불편하다고 말할 정도면 불편한건 맞는것 같다.\n\nP2 팀에서는 좀더 유연하고 확장 가능한 형태로 update 를 바꾸었다고 말하고 있는데, 글쎄..\n(사용자 적응의 문제인건가? 아니면 개발이 잘못 가고 있는건가? )\n\n현대의 SOFTWARE에서 눈여겨 봐야 할 부분은 **Flexibility = Cost** 이기 때문에 둘 사이의 균형이 중요한 것 같다.\n\n어떻게 될런지는 좀더 지켜봐야 겠다. (그때까지는 eclipse 3.4로의 upgrade 는 이런저런 이유로 잠시 보류!)\n\n![zrclip_002n3b2969b.png](/files/21546)})\n\nSoftware updates를 선택하면..\n\n![zrclip_001n2a80682e.png](/files/21548)})\n\n![zrclip_003ncb28ec7.png](/files/21553)})\n\n이런 화면이... -,-;;;\n\n결국 머리속에 드는 생각은.. **'음.. 업데이트는... next time으로 미루..'**",
    "attachments": [
      {
        "id": 21546,
        "name": "zrclip_002n3b2969b.png",
        "hash": "df0a1214f634d1e2dcea17f7d6ccc0e824e50d28",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 38076,
        "containerId": "12204"
      },
      {
        "id": 21548,
        "name": "zrclip_001n2a80682e.png",
        "hash": "6fc1adf71e76229450917f7d3dbaad4fd74b1386",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 105108,
        "containerId": "12204"
      },
      {
        "id": 21553,
        "name": "zrclip_003ncb28ec7.png",
        "hash": "f7ae92f1ad22aef283c02cebb03bc86a1f783db1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 325071,
        "containerId": "12204"
      }
    ]
  },
  {
    "id": 21,
    "title": "소니에릭슨의 CooL!! 그 자체인 서비스",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1212656254000,
    "body": "> doortts | 2008-06-05 목요일 오후 5:57 | 이생각 저생각 | [원본](http://blog.doortts.com/21)\n\n[http://www.sonyericsson.com/product/trackid/](http://www.sonyericsson.com/product/trackid/)\n\n![zrclip_001n9fc00f0.png](/files/21547)})\n\n음악을 녹음(샘플링)해서 보내면 해당 음악의 정보를 알려주는 소니 에릭슨 뮤직폰 서비스!!\n\n길가다가 문득 듣고는 ' 어! 이 노래 좋은데!! 누구 노래지??' 라며 알고 싶어하는 우리의 심장을 정통으로 꿰뚫는 서비스!!\n\n정말 CooL!!! 이라는 감탄사가 절로 나온다!! (님좀짱인듯!!!)",
    "attachments": [
      {
        "id": 21547,
        "name": "zrclip_001n9fc00f0.png",
        "hash": "6820282e484af088520b5180e7cb6a1aa407cd7d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 91884,
        "containerId": "12201"
      }
    ]
  },
  {
    "id": 22,
    "title": "[번역] Neil Bartlett: What is OSGi for??",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1213008347000,
    "body": "> doortts | 2008-06-09 월요일 오후 7:45 | 이클립스 RCP | [원본](http://blog.doortts.com/22)\n\n![zrclip_001p1e4f0077.png](/files/21552)})\n\n\n\n이클립스 OSGi p2가 요즘 욕을 먹다먹다 별 소리를 다 듣고, JAVA.NET의 Editor's Daily Blog로는 **OSGi가 대체 뭐냐? 너무 장황하게들 설명하는데 뭔소린지도 모르겠고, 과연 모듈 시스템이 필요한거냐?** 라는 질문까지 나와서는 한 무리를 형성하자 Neil Bartlett 이라는 사람이 아래와 같은 글을 올렸다. 뭐, 개인 의견이니까 심각하게 볼 건 없지만, 몇 가지 이야기는 들어볼 만 하다 생각되어서 번역해서 올려본다.\n\n영어가 딸리다 보니, 의역을 넘어 창작(...)의 영역까지 가는것 같지만, 그냥 그런가 보다 하고 읽으시길..\n\n\n\n\n\n|  | [Neil Bartlett: What is OSGi for??](http://neilbartlett.name/blog/2008/06/06/what-is-osgi-for/) | 2008-06-07 |  |\n\n\n\njava.net 일일 업데이트에서 Chris Adamson은 OSGi의 늘어난 탁월함에 대한 글을 썼다. 그러나 그와 동시에 OSGi를 **사용**하지는 않고 있다고 시인했는데, 이건 비단 그 만의 경우는 아닌것 같다. OSGi 커뮤니티에 속해 있고, OSGi의 끝내주는 기능들에 대해 설명하는데 열성적인 우리들은, **OSGi가 무엇이고 왜 중요한지**에 대해 설명하는데는 크게 노력해오지 않았던것 같다.\n\n요약하자면, OSGi는 자바를 위한 모듈시스템이다. 그렇지만 그게 실제로 의미하는 것은 무엇인가?\n\n하나의 배포 유닛으로써 **모듈**의 주요 기능 중 하나는... 무언가를 (직접) 만들거나 아니면 우리의 어플리케이션의 기능성을 확장하기 위해 내려받아 설치 할 수도 있다는 거다.\n\n자바에서의 표준 배포 유닛은 JAR 파일이다. 우리가 JAR 파일들을 가져다 클래스패스 경로 위에 놓아두면, 경우에 때에 따라, 우리의 프로그램이 동작한다. 왜 단지 **어떤 경우에만** 인가? 왜냐하면 JAR 파일이란건 **모듈**이 아니라, 단지 임의의 코드 덩어리이기 때문이다. 또한, 실행시에 JAR 파일을 읽어들일때 그 즉시 (JAR파일이란 건) 존재하지 않게 되버린다. **:** \"클래스경로\" 라는 건 단지 긴 클래스들의 목록일 뿐이다. 클래스경로위에 놓은 JAR파일은 그 목록에 기여하지만, 실행할 때에는 JAR 파일들 사이의 경계들이 사라져버린다.\n\n이런게 만들어내는 현상 중 하나는, JAR들이 사용자들로부터 구현패키지들을 숨길 수 있는 길이 없다는 것이다. 그리고 또 다른 한가지 현상으로는, JAR파일들의 클래스들은 클래스경로상에서 최초 사용가능한 위치에서 읽어들여지는데, 그 경로란게 항상 맞는건 아니라는 거다. 예를 들면, JAR 파일 하나가 org.foo.A 와 org.foo.B라는 두개의 클래스를 포함하고 있고, A 는 B에 의존하고 있다고 가정해보자. 우리는 이 두개의 클래스들을 JAR 파일 하나 안에 넣어 놓을 거다. 하지만 A는 같은 JAR 파일안의 B가 필요하다는 걸 강하게 나타낼 방법은 없다. 만일 다른 org.foo.B 를 제공하는 JAR 파일(혹은 동일 Library의 old 버전)이 있고, 그 JAR파일이 클래스경로에서 앞쪽에 위치하는 일이 발생한다면 항상 그 다른 B 클래스를 취한다. (결과적으로) 악질적인 클래스로딩 에러들이 잇따라 일어나게 된다.\n\n**진정한 모듈**이란 단지 구현코드 만이 아닌 설명이 적힌 메타데이터 - 이를테면 (첫째) 이 모듈의 목적은 무엇이고 제공자가 누구인지 등등. (둘째) 이 모듈의 의존성은 어떻게 되는지, 그리고 (셋째) 이 모듈이 다른 모듈에게 제공하는 건 무엇인지 - 와 함께 구성된다. 또한, 진정한 모듈 시스템에서는, 각각의 모듈에 대해 독립된 네임스페이스를 만들고, 통제되어지고 명확하게 정의된 방식으로만 교차 모듈 로딩을 허용한다.\n\n종속관계로 의미하고자 하는 것은 무엇인가? 쉽게말해서, 프로그램이나 코드 블럭이 동작하게 될 환경에 대한 **일련의 가정들**인 것이다. 예를들면, 어떤 자바 클래스는 JAVA 5에서 동작하고, 아파치 Log4J 라이브러리에 접근할 거라고 가정할 수 도 있다. 이런 가정들이란 **암시적**이고, (따라서) 잘못된 환경에서 처음으로 실행하려고 하기 전까지는 그런 가정이 있는지 조차 알 수 없다는 걸 의미한다. 다시말해, Java 1.4 환경에서 실행하려다 어긋나는 광경을 처음 목격하기 전까지, 이 코드는 Java5 에서 실행된다고 가정되어 있다는 사실을 (역어셈블링을 제외 하고는) 알 수가 없다는 거다. 마찬가지로 Log4J가 클래스경로에 없는 상태에서 처음 실행되어서 NoClassDefFoundError 를 보기전까지는 Log4J를 호출한다는 사실을 알 수가 없다.\n\n그래서 우리는 어떤 클래스가 특정환경에서 동작할지 어떨지를 실행해 보기 전까지는 제대로 알 수가 없다. 그리고는 심지어 문제점들을 즉각 발견 못할 수 도 있다. 왜냐하면 특정 실행경로가 뒤따르지 않으면 문제가 발생하지 않기때문이다.\n\n반대로, OSGi는 명시적이고 선언적인 의존정보를 우리에게 제공한다. JAR의 MANIFEST.MF 에 헤더를 추가함으로써, JAR 파일이 동작하게 될 환경이 어떻게 되는지 정확하게 명세화 할 수 있다.\n`Import-Package: org.apache.log4j\nBundle-RequiredExecutionEnvironment: J2SE-1.5`\n\n우리는 검증할 책임이 있고 독립된 모듈로 (해당부분을) 읽어들이는 프레임웍(=OSGi 구현체,equinox등)을 가지고 있다. 만일 우리가 Java 1.4에서 이 JAR 파일을 설치한다면, (클래스파일들로)\"해체\"되지 않을 것이고, 왜 그런지 확실한 메시지를 얻게 될것이다. 만일 Log4J 모듈이 아직 설치되지 않은 어플리케이션에 이 JAR 파일을 설치한다면, 다시 한번, 빠진것이 무엇인지 설명해주는 명시적인 에러 메시지를 보게 될 것이다. 이런 제약조건들때문에, 만일 적절하게 조립된 번들이 분해된다면, 결코 ClassNotFoundException 나 NoClassDefFoundError 가 발생하지 않으리란 걸 확신할 수 있다. (뭐, Class.forName() 등을 사용해서 동적으로 클래스를 읽어들이는 코드나 비슷한 경우에서의 이슈꺼리가 여전히 있긴 하지만, 그럴때는 또 거기에 따른 다른 처리방법이 있는거고... 대부분은 그렇다는 거다)\n\n더욱이, 우리는 이런 모든 종속성을 실제로 배포하거나 어플리케이션이 동작하기 한참 전에 정적(방식)으로 검사할 수 있다. 모든 종속성 정보는 눈에 보이는, 선언적인 형태로, MANIFEST.MF 안에 바로 들어 있다. 이건 어플리케이션의 동작이 누락된 JAR 파일때문에 실패하지 않게 도와주는 완벽한 툴이다. 또한 서드파티 모듈을 가져와서 우리 어플리케이션에서 동작할지 어떨지, 그리고 만일 동작하지 않는다면 동작하기 해서 다른 어떤 모듈이 필요한지 즉각 확인할 수 있다\n\n이건 단지 겉을 긁어대는 수준이지만, 적어도 Chris의 \"왜 모듈 시스템을 필요로 하고 원하는가?\"라는 질문에 답이 되길 바란다. 쉽게말해, 모듈 시스템이 없으면, 자바 어플리케이션들의 제작과 배포는 너무많은 오류를 손쉽게 일으킬 수 있다. 자바 프로그러머들은 10년 넘게 \"JAR 지옥\" 과 \"클래스경로 지옥\", 그리고 숨겨진 의존성들의 고통을 반복해왔다. (결국)우리는 그것에 익숙해져서 그 고통을 더 이상 의식적으로 자각하지 못한다. 그러나 그 고통이 사라진다면 (제길) 당신은 잘 알게 될거다!\n\n\n\n\n\n덧붙여 말하면, 위 모든 것들은 모듈 시스템을 사용하는것에 대한 논증이지, 반드시 OSGi를 사용하라는것은 아니다. 예를들면 NetBeans 플랫폼과 Glassfish V1,V2에 들어있는 HK2(=V3에서는 4년전쯤에 OSGi로 대부분 교체되었다), 그리고 (만들어진 적이 있는지는 알수 없는)JSR 277, 예전 Eclipse 모듈 시스템(=4년쯤 전에 OSGi로 교체되었다)과 같은 다른 모듈 시스템들도 주변에 널려 있다. 만일 당신이 어떤 정치가들에게 당신의 투표권을 사용하기에 알맞은지 어떤지를 묻는다면, 그들 하나같이 그렇다고 할거고, 왜 그들의 정당에 투표해야만 하는지 설명할 것이다. (=즉 어떤 주장을 하는 사람들에게 그들의 주장이 옳은거냐고 묻는다면, 누구나 다 그렇다고 말 할 것이고 그 이유에 대해서도 설명하려 들 것이라는 이야기) 난 자바에 있어서 사용가능한 어떤 다른 모듈시스템보다 왜 OSGi를 사용해야만 하는지, 그 이유에 대한 설명은 다른 사람들(혹은 나중 글을 통해 스스로)에게 남겨둘까 한다.\n\n--- 이하 원문 --\n\n| [Neil Bartlett: What is OSGi for??](http://neilbartlett.name/blog/2008/06/06/what-is-osgi-for/) | 2008-06-07 | \n |\n\n2008-06-07 00:02 작성\n\nIn his daily update at java.net, Chris Adamson [writes about](http://weblogs.java.net/blog/editors/archives/2008/05/the_remedy.html) the increasing prominence of OSGi. But also admits that he just doesn't \"get\" OSGi, and it seems he's not the only one. Perhaps we in the OSGi community, in our enthusiasm for explaining the cooler features of OSGi, have not done a great job of explaining what OSGi _is_ and why it matters.\n\nIn a nutshell, OSGi is a module system for Java, but what does that really mean?\n\nOne of the main functions of a module is as a unit of deployment… something that we can either build or download and install to extend the functionality of our application.\n\nThe standard unit of deployment in Java is the JAR file. We take these JAR files and put them on our classpath and, some of the time, our application runs. Why only some of the time? Because a JAR file is not a module, it is merely an arbitrary chunk of code. Also, when we load a JAR file at runtime it immediately disappears: the \"classpath\" is merely a long list of classes. JARs that we place on the classpath contribute to that list, but at runtime the boundaries between the JARs dissolve.\n\nOne symptom of this is that JARs have no way to hide implementation packages from users. Another is that classes are loaded from the first possible location in the classpath, which is not always correct. For example, suppose a JAR file contains two classes, `org.foo.A` and `org.foo.B`, and `A` depends on `B`. We ship these two classes together in a JAR, but there is no way for `A` to insist that it gets the B from the same JAR. If another JAR happens to provide `org.foo.B` (e.g. an older version of the same library) and that other JAR is listed earlier on the classpath, then we will _always_ get that other `B`. Evil classloading errors ensue.\n\nA real module consists not just of implementation code, but also metadata that describes: (a) What this module is for and who provides it etc (b) What dependencies it has, and (c) What it provides to other modules. Also in a real module system, we create an isolated namespace for each module, and only allow cross-module loading to occur in a controlled and well-defined way.\n\nWhat do we mean by a dependency? Simply, it is a set of assumptions made by a program or block of code about the environment in which it will run. For example, a Java class may assume that it is running on Java 5 and that it has access to the Apache Log4J library. These assumptions are _implicit_, meaning we don't know they exist until the first time we try to run the code in an environment where they are false. In other words, we don't know (except by disassembling) that the code assumes it is running on Java 5 until we first try running it on Java 1.4 and watch it crash. Likewise we don't know that it makes calls to Log4J, until the first time we run it without Log4J on the classpath and see a `NoClassDefFoundError`.\n\nTherefore we have no real idea whether a class will work in a particular environment except by trying it out. Even then we may not immediately discover problems, because they don't occur until a particular execution path is followed.\n\nBy contrast, OSGi makes us provide explicit, declarative dependency information. By adding headers to the JAR's MANIFEST.MF, we can specify exactly what environments that JAR will run in:`Import-Package: org.apache.log4j\nBundle-RequiredExecutionEnvironment: J2SE-1.5`\n\nWe then have a framework that is responsible for validating and loading this as an isolated module. If we install this JAR on Java 1.4, it will not \"resolve\", and we will get a clear message telling us why not. If we install this JAR in an application that does not have a Log4J module already installed, then again we will get an explicit error message explaining what is missing. Because of these constraints, we can be confident that if a properly constructed bundle resolves, it can _never_ throw a `ClassNotFoundException` or a `NoClassDefFoundError` (well, almost… there is still the issue of code that does dynamic class loading using `Class.forName()` or similar… there are different mechanism to handle this).\n\nEven better, we can do all of this dependency checking statically, long before actually deploying or running an application. All of the dependency information is visible, in declarative form, right in the MANIFEST.MF. This is perfect for tools, whicht can help us to construct applications that never fail due to a missing JAR. We can also take a third-party module and immediately identify whether it will work in our application, and if not what other module we need to obtain in order to make it work.\n\nThis just scratches the surface, but I hope it at least answers Chris' question \"Why would you want or need a module system?\". Simply, without a module system, the construction and deployment of Java applications is just too error-prone. Java programmers have been coping with pain - with \"JAR hell\" and \"classpath hell\" and hidden dependencies - for more than ten years. We've got so used to it that we don't consciously notice the pain any more. But you damn well notice when the pain goes away!\n\nIncidentally, all of the above is an argument for using a module system, not necessarily for using OSGi. There are other module systems around - such as the one in NetBeans platform, and HK2 in Glassfish V1 and V2 (which is largely replaced by OSGi in V3), and JSR 277 (if it is ever built), and the old Eclipse module system (which was replaced with OSGi around four years ago). If you ask any politician whether it's good to use your vote, they will unanimously agree that it is, and _then_ they explain why you should use it to vote for _their_ party. I will leave it for others (or myself in a later post) to explain why you should use OSGi rather than any of the other module systems available for Java.\n\n\n\n",
    "attachments": [
      {
        "id": 21552,
        "name": "zrclip_001p1e4f0077.png",
        "hash": "5e1335dbd65851c61f53805e044c129d8ffcfb42",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 84018,
        "containerId": "12205"
      }
    ]
  },
  {
    "id": 23,
    "title": "JAVA 5 생명주기 종료 적응기간",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1213536919000,
    "body": "> doortts | 2008-06-15 일요일 오후 10:34 | 이생각 저생각 | [원본](http://blog.doortts.com/23)\n\n![zrclip_001p249d4ccf.png](/files/21549)})\n\nJAVA 5 가 지난 4월 8일부로 EOL (End of life)의 적응기간에 들어갔다. 최종적으로는 10월에 기술 서비스가 종료된다. 저번달 부터 사람들에게 이야기를 했지만 그다지 큰 반응은 없다. 현장에서는 여전히 1.3, 1.4 1.5가 두루두루 쓰이고 있고, 1.5(JAVA 5) 보다는 (안타깝게도) 1.4가 더 많이 쓰고 있다고 한다.\n\n1.5 (JAVA 5)를 쓰더라도 WAS에 따라 쓸 뿐이지 Annotation 이라던가 auto-boxing, 향상된 loop 기능을 적극 쓰는 사람은 많지 않은 듯 하다. (아키텍터들은 좀 반성해야 한다!) 뭐, 업무의 성격상 New Technology 를 적용한 구현 보다는 stable service 쪽에 더 관심이 맞춰줘 있기 때문이라고 (개인적으로 납득하기위해) 생각한다. 그리고 그에 더해 자사 개발 Framework 지원 문제가 관련되어 있는 것도 JDK 버전업을 어렵게 하고 있다. (JAVA JDK가 상위로 올라가면 동작이 이상해지는 - 그렇게 만들려고 해도 쉽지 않을 터인데 참 - 놀라운 자사 프레임웍에게 경의를!!)\n\n여기까지는 잡담이고...\n\n등돌리고 외면하던 작업(..)을 다시 시작하려고 오늘 HOME PC의 eclipse 아이콘을 눌렀더니 에러가 났다.\n\n![zrclip_002n3fac77cd.png](/files/21550)})\n\n아! 맞다! PC 를 포맸했었지!!\n\n핑계김에 오늘 부로 JAVA 6를 써 보려고 한다. java.sun.com 사이트에가서 JAVA 6 New Feature 를 보니, 적지 않은 내용이 있더군. 게다가 JAVA 6 가 update 6 에 update 10 beta 까지 나와있더군. 사무실에 계신 분들, JAVA 5 New Feature 도 모르시는데, JAVA 6까지 봐야 한다는걸 알면 어떤 반응을 보일까?\n\n어쟀든 팀내 스터디(=교육)진행을 위해 나라도 먼저 봐 두어야 겠다.",
    "attachments": [
      {
        "id": 21549,
        "name": "zrclip_001p249d4ccf.png",
        "hash": "188f80f71b1e71d1e7034053c85a5e4b94c8e745",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 12825,
        "containerId": "12202"
      },
      {
        "id": 21550,
        "name": "zrclip_002n3fac77cd.png",
        "hash": "62fc604719eaa13265ff3ac8f0f06ae9cc770c32",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 6783,
        "containerId": "12202"
      }
    ]
  },
  {
    "id": 24,
    "title": "Firefox 3 드디어 출고!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1213837868000,
    "body": "> doortts | 2008-06-19 목요일 오전 10:11 | 이생각 저생각 | [원본](http://blog.doortts.com/24)\n\n![zrclip_001n3257c6b1.png](/files/21551)})\n\n280번만 더 다운 받아서 5만건이 넘었으면 좋았을텐데 하는 **말 그대로의 숫자**에 대한 살짝 아쉬움이 든다.\n\n그래도 하루만에 전 세계적으로 천만건에 육박하는 다운로드를 기록하다니, FIREFOX도 대단한 것 같다.\n\n우리나라도 하루빨리 Browser Independent day 가 왔으면 좋겠다.\n\n*아래는 쿵푸팬더의 스승님인 Red Panda... [Firefox의 마스코트가 여우가 아니라](http://channy.tistory.com/268) 이 Red Panda 였다는군요..\n\n![zrclip_002n72f095bd.png](/files/21554)})",
    "attachments": [
      {
        "id": 21551,
        "name": "zrclip_001n3257c6b1.png",
        "hash": "d086498c7a1d66dd68d78e593fcad25b762f3eaa",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 91029,
        "containerId": "12206"
      },
      {
        "id": 21554,
        "name": "zrclip_002n72f095bd.png",
        "hash": "e257c465f8bbce394e5e6f8ffedcb143233081e6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 233529,
        "containerId": "12206"
      }
    ]
  },
  {
    "id": 25,
    "title": "JAVA ONE Wrap-up seminar 회고",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1214320348000,
    "body": "> doortts | 2008-06-25 수요일 오전 12:11 | 잊기전에 회고 | [원본](http://blog.doortts.com/25)\n\n지나면 잊으니까, 잊기전에 회고!\n\n장소 : 이화여대 이화삼성관 103호\n시간 : 6.21 토, 오후 1시 ~6시\n\n느낀점과 ToDo (세미나 내용과 도중에 떠오른 개인생각의 혼합)\n\n*   신상철 JAVA evangelist 씨의 강연은 역시 굿 (희끗한 머리... 나이가 얼마나 되셨을까?)\n*   *   javapassion.com 이 이분 사이트였을 줄이야.. (사이트에는 주인이 \"상신\" 이라고 나옴)\n*   JAVAFX 를 엄청 미는 느낌?\n*   netbeans와 glassfish 의 통합도도 굿! (넷빈즈, Ruby 연습할때 이외에 쓰지는 않지만 볼때마다 느끼는건 대단하다는 생각뿐)\n*   JAVA 6 - Modularized JRE 로 변모\n*   synchronized -> atomic keyword로!\n*   허광남 - 생각보다 잘 생겼네.. 그리고 나이에 비해 동안이네. (자기반성 中 -_-);\n*   SW는 그 기조가 건축이면서 요구사항은 건축물과 다르다는걸 생각하자.(=잦은 변경을 요한다)\n*   TDD를 좀더 봐야겠다. (coverage 라던가, Mock object, automated test case generation)\n*   DATA OBJECT, 특히 collection type data의 Test에 대해서 좀 더 고민(reflection을 이용하면 되지 않을까? "
  },
  {
    "id": 27,
    "title": "Agile Day 참석 후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1214486577000,
    "body": "> doortts | 2008-06-26 목요일 오후 10:21 | 잊기전에 회고 | [원본](http://blog.doortts.com/27)\n\n**Session1.**\n\n김창준 애자일컨설팅 대표님의 agile 소개 강연을 들었다. 실제 본건 두번째, 강연을 들은 건 첫 번 째다.\n\n간결하고 전문적이다. 특별한 군더더기 없는 글자와 심플한 그래프 몇 개로 하고 싶은 말을 다 하더라. (멋지다!)\n\n**가급적 적극적으로 행사에 임하자!** 주의 인지라 질의응답시간 때 제일먼저 질문했다.\n\n질문은 \"agile 은 소규모 프로젝트에서 큰 효과를 발휘한다고 알고 있는데, 큰 규모의 기업에 해당 방법론을 적용하기 위해서 고려되어지거나 변경되어지는 부분은 무엇인가?\" 였고 대답은 요약하면 \"**일부를 변경하던가 하는 식으로 실천방법을 좀더 유연하게 적용한다\"** 였다.\n\n이후 몇 가지 질의 응답이 이루어졌다.(노트를 두고와 못 적었더니 기억이 전혀...-,-)\n\n중간 쉬는 시간에 쉬시는 김창준님을 내가 곁에가서 질의 응답으로 괴롭혀 드렸던것 같다. (화장실도 못가게 테러를... (죄송합니다!) )\n\n좋은 이야기를 많이 들을 수 있었던것 같다. (쉽게 미소짓는 얼굴은 아니시지만, 친절하시다!)\n\n**Session2.**\n\nagile 방법론을 발표한 자사 발표자가 다소 거세게 공격당했다.\n\n내 생각엔\n\n**'agile쓰라는데말야, 그러려면 뭐뭐뭐가 문제일텐데 어떻게 해결할거야?'** 라며 되물음 당하기 보다는\n\n**'아! 저걸 적용하면 저렇게 이득을 얻으수 있는거군!! agile을 적용해야겠는걸!!이 프로젝트에서 쓰려면 뭐뭐뭐가 문제니까 어떻게 해결해서 agile 을 적용시킬까?'** 라고 스스로에게 자문하게 만들었어야 하지 않았나 싶다.\n\n난 이번에도 질문을 했는데, (튀고 싶진 않았지만 어쨌든..-_-)\n\n휴대용 CD Player 제품경쟁 시대에서 튀어나온 MP3플레이어 이야기를 들어가며 나름 기대하고 있는 방법론이란 이야기를 꺼냈고,\n\n이어서 너무 많은 질문이라 답변대신 질문만 한다며 아래와 같은 질문을 했다. (집에와서 메일로 발표자에게 보냈다)\n\n**1\\. Agile 에 경험있는 one man hero 가 팀을 끌고가는 식이 되버리기 쉬울듯 한데 어떻게 생각하시는지?\n2\\. 프로젝트 참여 구성원의 자질로 요구되는 것이 있는지?\n3\\. 신규 구성원들의 agile 에 대한 이해 및 적응 부분은 어떻게 해결한 것인지?\n4\\. Agile 방법론에 대한 학습곡선 효율증진을 위한 전략은 있는지?\n5\\. 방법론의 전파(전개)계획은 어떻게 세우셨는지?\n6\\. Benchmarking 하였거나 혹은 agile 적용 결과나 수치 등을 제시할 수 있는 국내외 그룹(회사)이 있는지? (가급적 국내로)**\n\n....\n\n이하 생략\n\n....\n\n**세미나 종료 후**\n\n중간 쉬는 시간에 김창준님을 괴롭혔기에, 이야기 도중 끊겨버린 이야기는 차마 이어서 묻지 못하고 집에 가려는데, 뒤에서 먼저 선듯 말을 걸어주신 김창준님! 안그래도 평소 고마운 마음이 있었는데 짧게나마 음료수 한잔 대접해 드리며, 잠시나마 이런저런 좋은 이야기를 조금 더 나눌 수 있었다. (감사합니다!) 그리고 Sten 에서 진행하는 교육 이야기를 했더니, 이야기해서 3일차 만이라도 참석해 보라고 권해 주셨다. 다음에 기회가 닿으면 좀더 많은 이야기 나눌 수 있었으면 좋겠다.\n\n**한가지 더!**\n\n회사 동료 도움으로 또 하나의 좋은 인연을 만났다. 흔치 않은 분야에 대한 공통 관심사를 가진 사람을 만난다는건 생각보다 쉽지 않은법인지라... 다만, 곧 한국을 떠날거란 사실은 못내 아쉬움이 남았다.\n\n#### Comments\n\n그 MP3는 (사실 나는 당신에게 그 비유를 세번째 정도 들었던 것 같아 --;) 너무 나도 통쾌했다오! \n우흐흐\n\n [M-o-N](http://nephilim.tistory.com) | 2008-07-01 화요일 오후 10:34\n\n--\n\n이런 글을 읽다보면, 내 머리가 너무 텅 비어있다는 생각이 드니.. 이거 참..\n\n 김은혜 | 2008-10-26 일요일 오전 1:44\n\n--\n"
  },
  {
    "id": 28,
    "title": "프리젠테이션 젠",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1214725814000,
    "body": "> doortts | 2008-06-29 일요일 오후 4:49 | Books | [원본](http://blog.doortts.com/28)\n\n![zrclip_001p1f96139f.png](/files/21555)})\n\n**Presentation Zen: Simple Ideas on Presentation Design and Delivery**\n\n외국에서는 꽤 유명한 책이라고 한다. (Amazon 평점 5/5 ) 특히 저자 **가르 레이놀즈는** [presentationzen.com](http://presentationzen.com/) 사이트를 운영하고 있으며, 이 책으로 파워포인트나 키노트로 하는 기존 프리젠테이션 방식에 일대 변혁을 불러일으킬 것이라는 평을 듣고 있다.\n\n아래 내용은 테크니컬 에반젤리스트인 구의 가와사키의 이 책을 나타내는 소개 PT 다.\n\n이것 만으로도 배울 내용이 있고, 더욱더 책을 끌리게 만들고 있다.\n\n![zrclip_002n62cfb3c.png](/files/21556)})\n\n#### Comments\n\n저말 진짜예요? 저 책 사봐야 되겠는데, 비싼건 아니겠지? 실망하면 책임지세요~~ㅋㅋㅋ\n\n [yarrie](http://cskstory.tistory.com) | 2008-07-02 수요일 오후 10:58\n\n--\n",
    "attachments": [
      {
        "id": 21555,
        "name": "zrclip_001p1f96139f.png",
        "hash": "d1740cb4997c37ecbc7ab6a6adb32b35f4f374f7",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 109041,
        "containerId": "12207"
      },
      {
        "id": 21556,
        "name": "zrclip_002n62cfb3c.png",
        "hash": "d8fc37a763a02c731768fe9dec4f35f5bf20aba0",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 288363,
        "containerId": "12207"
      }
    ]
  },
  {
    "id": 30,
    "title": "Guide to Greener Eclectronics",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1214913995000,
    "body": "> doortts | 2008-07-01 화요일 오후 9:5 | 이생각 저생각 | [원본](http://blog.doortts.com/30)\n\n[그린피스에서 발표한 레포트](http://www.greenpeace.org/raw/content/international/press/reports/guide-greener-electronics-8-edition.pdf)에서 발췌. 소니, 역시 일본기업이고 일류기업 답다고나 할까? 삼성은 규모면에서 Sony를 앞질렀을지 모르지만, 글로벌 선두기업으로서 가지는 정신은 아직 다소 부족한듯.\n\n몇가지 특이할만한 점은 Nokia는 5.8로 선두였는데, 몇가지 문제(take-back문제와 recycle practice 부분)로 인해 1점이나 감점되어서 3위가 되었다는 점. 그리고 LG전자(LGE)는 한참 멀었다는 사실, 그리고 닌텐도는 그린피스가 보기에는 거의 악의축(...)기업이라는 거다.\n\n관심있는 사람은 한번 받아 보시던가요.\n\n![zrclip_001pc3451e1.png](/files/21559)})\n\n#### Comments\n\n그리너 에클렉트로닉스- 우헤헤\n오우~ developerWorks 여기도 있었다\n같이 플젝하는 정지X과장님은 이벤트도  당첨되었더라구! (칙셔-)\n\n [M-o-N](http://nephilim.tistory.com) | 2008-07-01 화요일 오후 10:34\n\n--\n\n뭣! 정X범 과장이었던거야!!! (우소!!!)\n\n [doortts](http://doortts.tistory.com) | 2008-07-02 수요일 오전 12:20\n\n--\n\n이 싸람들이~~!!\n\n X지X 과장 | 2008-09-09 화요일 오후 5:23\n\n--\n",
    "attachments": [
      {
        "id": 21559,
        "name": "zrclip_001pc3451e1.png",
        "hash": "9c6869ffa72f5d8d1edb29a7ea0877588305d41e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 283005,
        "containerId": "12211"
      }
    ]
  },
  {
    "id": 31,
    "title": "이클립스 Version Numbering 체계",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1215139290000,
    "body": "> doortts | 2008-07-04 금요일 오전 11:41 | 이클립스 RCP | [원본](http://blog.doortts.com/31)\n\n기존에 사용되던 Version Numbering을 3.2부터 정제된 형태로 사용되고 있다.\n\n다른데에 적용해도 괜찮을 만큼 꽤 체계적이라고 생각된다.\n\n[http://wiki.eclipse.org/index.php/Version_Numbering](http://wiki.eclipse.org/index.php/Version_Numbering)\n\n![zrclip_002p593788e1.png](/files/21558)})\n\n| First development stream\n- 1.0.0\n\nSecond development stream\n- 1.0.100 (indicates a bug fix)\n- 1.1.0 (a new API has been introduced)\nThe plug-in ships as 1.1.0\n\nThird development stream\n- 1.1.100 (indicates a bug fix)\n- 2.0.0 (indicates a breaking change)\nThe plug-in ships as 2.0.0\n\nMaintenance stream after 1.1.0\n- 1.1.1\nThe plug-in ships as 1.1.1\n |\n\n#### Comments\n\n음, 너무 복잡해서 잘 이해가 안되네.\n\n [산사랑](http://www.jopenbusiness.com/) | 2008-08-08 금요일 오후 5:37\n\n--\n",
    "attachments": [
      {
        "id": 21558,
        "name": "zrclip_002p593788e1.png",
        "hash": "61becfc42d1d49b1705b61474bfde94e3f1894f2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 109554,
        "containerId": "12209"
      }
    ]
  },
  {
    "id": 33,
    "title": "Professional 이란?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1215861026000,
    "body": "> doortts | 2008-07-12 토요일 오후 8:9 | 이생각 저생각 | [원본](http://blog.doortts.com/33)\n\n토요일의 99%는 늦게 일어나는데, 오늘은 아침부터 부산을 떨어서 9시까지 신촌 [토즈](http://www.toz.co.kr/)를 갔다. 왜냐하면 O모 사이트 운영자이신 K모님이 **junit 과 TPTP에 대해 유료 세미나를 진행**한다고 해서이다. 평소 무료세미나도 잘 안가는데, 내 돈까지 내고 참석했다는건 개인적으로는 대단한 일이다.\n\n그리고 참가비 2만원은 (매우 안타깝게도) 내게 결코 적은 돈은 아니었다. (사고싶던 책 접고 가는 데다가 마늘(garlic2)님께 빌린 돈이기까지 하다.)\n\n토즈는 처음가봤는데, 시설도 좋았고, 환경도 쾌적한 편이었다.\n\n하지만 안타깝게도 정작 '세미나'는 그러하지 못했다.\n\n오전 9시~12시까지 시간은 세시간. 참석자는 10여명 남짓. 좋은 시설 아래에서 길진 않지만 많은 것을 주고 받을 수 있는 조건이었다.\n\n하지만 결국 얻은 것은 무엇인가? 라는 의문만 남았다.\n\nTDD 자료 30분만 읽으면 알 수 있는 테스트케이스 작성(아주아주)기초, 이클립스 단축키 몇 가지, 그리고 30분도 채 안되는 시간동안 본 TPTP, 거기다 TPTP는 본인도 자세히는 모른다고 하시니...\n\n개인적으로 k모 님을 좋아하지만 이건 좀 아니라는 생각이 들었다. 쓴소리가 되겠지만, 애정어린 마음으로 몇가지 이야기를 해 보려고 한다.(이상하게 들리겠지만 난 k모 님이 잘 되기를 바란다. 프리랜서들이 롤 모델로 삼을 수 있는 사람, 영향력을 발휘할 수 있는 star player가 되어 주었으면 하기 때문에 더욱 그러하다. 왜냐하면 나는 결코 그리 되지 못할것이기 때문이다. )\n\n**우선 Professional 이란 무엇인가?**\n\nprofessional 이란 말은 흔히 쓰는 말인데, 일반적으로 \"a.전문적인, n.분야 전문가\" 등의 의미로 알고 있다. 좀 더 정확한 정의를 알기위해 반대말을 한번 보자.\n\n![zrclip_001n3635a0d4.png](/files/21557)})\n\n내가 영어를 잘해서 한영사전 놔두고 영영사전을 꺼내든게 아니라, 한영사전에는 단순 어휘로만 치환되어 있기에 '의미'를 느끼기 어려워서이다.\n\n첫 줄(1번)을 보자.\n\n아마추어란 명사로, **운동이나, 여흥, 기타 취미활동을 하는 사람**이라고 되어있는데 마지막 부분에 중요한 말이 나온다. 그런 활동을 하되, 바로 **without being paid for it** 인거다. 따라서 반대말인 ****professional**** 은 바로 **with being paid for it!** 인거다.\n\n큰 돈은 아니지만 돈은 받고 강연을 했으니 k모 님은 오늘 전문가(professional)로서 앞에 서신 것이고, 따라서 참여자들에게 그들이 들인 시간에 대한 가치, 혹은 비용 지불의 가치를 제공해 줄 의무가 있다.\n\n하지만 정말 안타깝게도, 돈도 시간도 모두 다 아까웠다. 아침잠 포기하고 간것도 억울하고, 돈 2만원도 억울했다. 그나마 책을 받으신 분은 조금 나으셨을까? (비론 전혀 다른 분야의 책들이긴 하지만.)\n\n내가 이리 쓴소리를 내는 이유는, 반대급부로 '나 잘났소!'하자는게 결코 아니다.\n\n3시간이란 시간은 정말 짧은 시간이기에 강연자가 준비를 많이 하지 않으면 순식간에 끝나는 분량의 시간이다. 따라서 기승전결을 미리 고민하고, 시간 분배를 해서 체계적으로 진행하지 않으면 농담 몇개에 화면 몇개 보다가 끝나는 것도 요원한 일이 아닌 시간인거다.\n\n**그럼 오늘 세미나는 어떠했나?**\n\n- 시간 분배계획을 미리 공지 하지 않고, 진행하면서 소요되는 데로 시간을 사용했다.\n\n- 교재라던가 유인물이라던가, 아니면 그 흔한 ppt 하나 없이 자신의 site에 올린 글들과 웹 검색에서 찾은 페이지로 혼란스럽게 진행하였다.\n\n- 참석자들의 참여를 끌어내지 못해서, 강의도 아니고, 세미나도 아닌 어중간한 형태가 되버렸다.\n\n- 결과적으로 들인 노력에 비해 얻은 것이 거의 없다.\n\n왠지 몹쓸사람 만든것 같아 미안한 마음이 더 크지만, 사람은 발전해 나가는 거고, 그러기 위해서는 걸림돌이 있어줘야 하는 거라 믿는다. 등뒤에 묻은 먼지는 등을 때려주는 사람이 없으면 계속 남아 있는 법이니까!\n\n부디 다음에는 좀 더 Professional 한 모습을 보여주시길 기대한다.\n\n#### Comments\n\n이제야 글을 봤습니다.\n쓴소리 달게 받겠습니다. 시간이 좀 지나서 자료를 만들어서 공개하고 있습니다. \nhttp://okjsp.tistory.com/tag/tptp \n물론 턱없이 부족한 내용입니다만 앞으로도 계속 추가하도록 하겠습니다.\n제 강의의 자유분방함과 체계없음은 앞으로도 계속될 것 같습니다.\n솔직한 마음은 제 경험을 나누고 싶어서입니다.\n만약 이클립스라는 주제로 강의를 했다고 하면 이미 10여번 강의를 했기 때문에 프로페셔널한 모습을 조금 보여줬을 수 있을 것 같습니다.\n\n사실 허명이 되지 않기 위해서 노력은 합니다만, (국내 자바 사이트 남은 게 없어서 제 사이트에 많이들 오시기 때문에 실력보다 이름이 많이 유명해진 듯 합니다) 강의에 임하는 자세는 아직 많이 부족합니다.\n\n죄송합니다.\n\n [kenu](http://okjsp.tistory.com) | 2008-07-28 월요일 오후 1:2\n\n--\n",
    "attachments": [
      {
        "id": 21557,
        "name": "zrclip_001n3635a0d4.png",
        "hash": "a36f132dc78911bc6e02c15f9fd4000fa4addd3d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 5301,
        "containerId": "12210"
      }
    ]
  },
  {
    "id": 34,
    "title": "오늘 받은 '프리젠테이션 젠', 포장 정성에 놀라다",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1216132320000,
    "body": "> doortts | 2008-07-15 화요일 오후 11:31 | Books | [원본](http://blog.doortts.com/34)\n\n처음 받았을때 생각보다는 얇은 책 두께에 놀랐다.\n\n그러나 정말 놀란것은 겉 포장 박스를 뜯었을 때이다.\n\n![IMG_3939.JPG](/files/21565)})\n\n세상에나! 예쁜 포장지로 포장을 해서 보내주신 거다! (!!!!)\n\n![IMG_3938.JPG](/files/21567)})\n\n어찌보면 별것 아닐 수도 있지만, '에이콘 출판사'를 다시 보는 계기가 되었다고나 할까..\n\n![IMG_3941.JPG](/files/21564)})\n\n사진으로는 잘 표현이 안 되었지만, 겉 표지도 질감이 예사롭지 않다. 꽤나 고급스러운 느낌을 주기에 충분하다.\n(관련업무 종사자에게 선물용으로도 손색이 없을 듯)\n\n![IMG_3942.JPG](/files/21566)})\n\n책 자체도 미려한 편집과 높은 품질의 사진들로 채워져 있었다. 내용은 차치하더라도 적어도 구매자가 책 값이 아깝다는 생각이 들지는 않을게 분명하다.\n\n평소에도 에이콘 출판사의 책들이 꽤 품질이 높다고 여겼었는데, 어떤면에서 이번 책, 프리젠테이션 젠은 당분간 그 정점에 있는 책이 되지 않을까 생각된다.\n\n더불어 좋은 책 보내주신 '에이콘 출판사'분들에게 감사의 마음을 전하고 싶다.\n\n#### Comments\n\n음 포장지를 보기 전까지 그렇게 탐나지 않았던 책이었는데,\n지금은 이 말이 하고 싶어\n\n\"줘!\"\n\n [M-o-N](http://nephilim.tistory.com) | 2008-08-08 금요일 오전 9:5\n\n--\n",
    "attachments": [
      {
        "id": 21564,
        "name": "IMG_3941.JPG",
        "hash": "5483e46d9d575a6392a74b4a171a97d14cad0024",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 81396,
        "containerId": "12216"
      },
      {
        "id": 21565,
        "name": "IMG_3939.JPG",
        "hash": "2a504933c28adf26d3dd81e8b0633690a51902d2",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 86754,
        "containerId": "12216"
      },
      {
        "id": 21566,
        "name": "IMG_3942.JPG",
        "hash": "e823143c6541b8b2ddef401acbb91258b263d093",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 87153,
        "containerId": "12216"
      },
      {
        "id": 21567,
        "name": "IMG_3938.JPG",
        "hash": "85dd91306b0f21956d0724ba05346a7fb9662fb7",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 106989,
        "containerId": "12216"
      }
    ]
  },
  {
    "id": 35,
    "title": "이래서 어려운거다",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1216804394000,
    "body": "> doortts | 2008-07-23 수요일 오후 6:13 | 이클립스 RCP | [원본](http://blog.doortts.com/35)\n\nJFace 를 이용해서 개발할 때 사용하는 ContentProvider와 LabelProvider .\n\nIContentProvider를 구현하는 클래스들을 보라. (스크롤바가 반 정도라는 것도 감안해서..)\n\n![zrclip_003p4af307c6.png](/files/21560)})\n\nLabelProvider는 또 어떻고...-_-;;\n\n![zrclip_002n6238dbbf.png](/files/21562)})\n\n이러니 어려운거고 이러니 여차하면 삽질하는 거다. -_-;\n\n#### Comments\n\n무식하게 -_-;; RCP의 start 부터 중단점을 찍고 시작해보았는데, -_-;;이거는 머 거의 시작할 때까지 얼마나 걸렸는지.. \n후미.. 결코 만만하게 볼만한 내용은 아닌것 같습니다 ^^;\n\n [승진이](http://breathair.tistory.com) | 2009-07-29 수요일 오후 5:25\n\n--\n",
    "attachments": [
      {
        "id": 21560,
        "name": "zrclip_003p4af307c6.png",
        "hash": "83fb515cf215bd275e88250848c6677c97bc17b4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 36765,
        "containerId": "12213"
      },
      {
        "id": 21562,
        "name": "zrclip_002n6238dbbf.png",
        "hash": "b37a08d350092f1575c799d169fab4037203e22b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 32091,
        "containerId": "12213"
      }
    ]
  },
  {
    "id": 36,
    "title": "이클립스 기동시에 발동되는 View 목록과 특정 View 감추기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1217748402000,
    "body": "> doortts | 2008-08-03 일요일 오후 4:25 | 이클립스 RCP | [원본](http://blog.doortts.com/36)\n\n이클립스 기동시에 발동되는 View 목록 (part의 id 와 name) 을 살펴봤다.\n\nIWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();\nIViewReference [] view = page.getViewReferences();\nfor (IViewReference viewReference : view) {\n  System.out.println( viewReference.getId() + \" : \" + viewReference.getPartName() );\n}\n\n- 결과 -\n\norg.eclipse.jdt.ui.PackageExplorer : Package Explorer\norg.eclipse.jdt.ui.TypeHierarchy : Hierarchy\norg.eclipse.ui.views.ProblemView : Problems\norg.eclipse.jdt.ui.JavadocView : Javadoc\norg.eclipse.jdt.ui.SourceView : Declaration\norg.eclipse.ui.views.ContentOutline : Outline\norg.eclipse.mylyn.tasks.ui.views.tasks : Task List\norg.eclipse.ui.internal.introview : Welcome\n\n--------\n\n즉, 특정 VIEW 를 찾아서 접거나 열고 싶으면 (이를테면 welcome 같은)\n\nIViewPart view = page.findView(\"org.eclipse.ui.internal.introview\");\nif (view != null)\n    page.hideView(view);\n\n형태로 작성하면 된다."
  },
  {
    "id": 37,
    "title": "XUnit Test Patters",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1217774812000,
    "body": "> doortts | 2008-08-03 일요일 오후 11:46 | Books | [원본](http://blog.doortts.com/37)\n\n![zrclip_001n19bcc4bd.png](/files/21561)})\n\n[http://xunitpatterns.com/](http://xunitpatterns.com/)\n\n아쉽게도 영문책뿐이지만, 우리나라에도 번역되어 나왔으면 좋겠다. 아쉽게나마 위 사이트에 가보면 책 내용을 사이트에서 살펴볼 수 가 있다. (거의 대부분의 내용이 오픈되어 있는 듯 한데...)\n\n그 양이 적지 않아 보려면 시간이 좀 걸릴 듯 하지만, 그만한 가치는 있을 것 같다.\n\n#### Comments\n\n곧나올껍니다;;ㅋ 누가 지금 번역작업중에 있거든요;;ㅋ\n\n [HelolS](http://helols.tistory.com) | 2008-12-30 화요일 오후 11:29\n\n--\n",
    "attachments": [
      {
        "id": 21561,
        "name": "zrclip_001n19bcc4bd.png",
        "hash": "1d0af6a4cfbcb35ed42d223c3401b992ea5e5234",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 41895,
        "containerId": "12214"
      }
    ]
  },
  {
    "id": 38,
    "title": "Europa 에서 Ganymede 로",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1217811709000,
    "body": "> doortts | 2008-08-04 월요일 오전 10:1 | 이클립스 RCP | [원본](http://blog.doortts.com/38)\n\n이클립스를 2.x 대 부터 써왔지만, 사실 본격적으로 쓰기 시작한 건 3.x 대 부터다.\n\n특히 calisto 로 불렸던 3.2 버전은 이클립스 내부에서도 제대로된 제품군의 이미지를 위해\n\n여러개의 서브 프로젝트들이 3.2 버전 출시에 맞춰 동시에 패키징되고 배포되었던 걸로 기억한다.\n\nCalisto(칼리스토) 가 가장 임팩트 강했던 버전이었고, 같은 3.x 대 임에도 내부적으로도 적잖이 바뀐 버전으로 기억한다.)\n\n덕분에 미리 나왔던 책들이 제대로 동작 안하는 일도 적잖이 발생했고...\n\n![zrclip_001n650cd41e.png](/files/21568)})\n\n그 다음으로 오랫동안 써왔던 3.3 Europa (유로파)\n\n나름 안정적으로 잘 써왔었는데, 플러그인 개발 관련 치명적인 버그가 있었다. 공식으로 배포되는 버전(3.3.1.1)을 쓰면서 고생고생하다가 자포자기한 심정으로 지내다, 우연히 업데이트 패치로 (3.3.2)로 올라가면서 해결된 가슴아픈 사연이 있는 버전.\n\n![zrclip_002p31de5d91.png](/files/21570)})\n\n얼마전 새로 나왔다는 Ganymede('가니메데'라고 쓰고 '게너미드'라고 읽는다.ㅎㅎ)\n\n버전으로는 3.4에 해당하는 버전으로 또 나름 많이 발전한것 같다. 특히 Quick-fix 관련이나 Junit test 관련해서 매력적인 부분이 있었는데, 예전에 버전 올리면서 고생한 기억에 미루고 있었다.\n\n그러다 울컥한 마음(?)에 설치하고 기존 프로젝트들이 들어있는 workspace 를 지정했는데, 별다른 에러가 없이 잘 되는 것이다. (물론 현재 3.4 관련 각종 버그들이 버그질라에 올라오고 있는 상태이긴 하지만...)\n\n게다가 도대체 기존에 작성된 ViewID 를 어떻게 찾아낼 것인가? 에 대한 다소 난감한 고민을 해결해 주는 (Cool 하게 깜찍한) 기능이 탑재되어 있다. (Plug-in spy, alt-shift-F1)\n\n![zrclip_003p5bbda8ba.png](/files/21563)})\n\n그 외에도 개발을 편리하게 만들어 주는 다양한 기능들이 산재해 있다.\n\n이러니 Ganymede로 가지 않을 수가 있겠는가..\n\n기왕이면 다홍치마라고 좋은게 좋은거 아니겠나라며~ (혼자 맘대로 생각중)\n\n부디 이번엔 프로덕트 자체가 물을 드시게 만드는 일만 안생기길 바란다.\n\nps.\n\nEclipse 3.4 - New and Noteworthy\n\n[http://download.eclipse.org/eclipse/downloads/drops/R-3.4-200806172000/whatsnew3.4/eclipse-news-all.html](http://download.eclipse.org/eclipse/downloads/drops/R-3.4-200806172000/whatsnew3.4/eclipse-news-all.html)\n\n#### Comments\n\n임파꾸또... -_-;\n\n [M-o-N](http://nephilim.tistory.com) | 2008-08-08 금요일 오전 9:6\n\n--\n\n이번 주 화요일(2008.8.5) 저녁에 이클립스 RCP 라는 책을 샀다. 이제 이책을 가지고 RCP 등을 본격적으로 연구를 하려고 한다. 주중에는 독서(일 하면서 책 쓰기)를 하느라 시간을 낼 수가 없었는데 주말에 Eclipse 3.4 버전을 새로 설치하여 산뜻한 마음과 기분으로 새로 시작하려고 한다.\n\n예전에 PC가 너무 느려 이클립스를 사용하지 않고 UltraEdit를 주로 사용하였는데 오랜만에 이클립스를 설치하고 이클립스 RCP라는 책에 따라 연구를 시작하면 여러가지 문제가 발생할 것 같다. 2008년 4월부터 RCP를 다시 시작한 것 같은데 서로 도와가며 같이 연구를 했으면 한다.\n\n [산사랑](http://www.jopenbusiness.com/) | 2008-08-08 금요일 오후 5:49\n\n--\n",
    "attachments": [
      {
        "id": 21563,
        "name": "zrclip_003p5bbda8ba.png",
        "hash": "fa393f0f16d9ea267da5a66550d0964956eb7443",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14250,
        "containerId": "12219"
      },
      {
        "id": 21568,
        "name": "zrclip_001n650cd41e.png",
        "hash": "69c2a8e9607c69839c68eb4ce1e54ecbdc6501ad",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 102429,
        "containerId": "12219"
      },
      {
        "id": 21570,
        "name": "zrclip_002p31de5d91.png",
        "hash": "bb8bf3b7899305bdd85cf5c5135bff674ba52b11",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 153900,
        "containerId": "12219"
      }
    ]
  },
  {
    "id": 39,
    "title": "Mock Object를 사용하여 쉽게 테스트하기 part 1",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1220194440000,
    "body": "> doortts | 2008-08-31 일요일 오후 11:53 | Better SW Development | [원본](http://blog.doortts.com/39)\n\n테스트 작성이 쉽지 않은 경우,\n\n그 중에서도 DB가 필요하다면서 테스트를 꺼리게 될 경우,\n\nMock Object 를 사용해서 어떻게 테스트가 가능한지 살펴 보고자 한다.\n\n전체 2부로\n\n1부 : Plain mock object 을 이용해서\n2부 : Mock Object Framework 을 이용해서\n\n계획되었으나 이러저런 이유로 현재 1부 먼저 공개하게 되었다.\n\n[Mock Object 를 이용한 테스트(클릭)](http://www.doortts.com/oc/MockObjectTest.html)\n\n\"테스트 케이스 작성 어렵다 말고, 방법을 생각해 보자\"\n\n라고 말하고 싶다. (^_^);\n\n**- 추가 부연 설명 -**\n\nMock Object 라는건 무엇일까요?\n\n예전에 자동차 만드는 CF에서 자동차 모양을 나무로 깍아서 디자인 원형을 만드는 것을 보신 분도 계실것니다.\n\n말하자면 디자인으로 제품원형을 만들때 모양을 조각하기 쉬운 나무를 이용하는 것을 생각하시면 되겠습니다.\n\n그래서 겉 모양만 실제와 비슷하게 보이는 가상 객체를 만드는 것을 Mock Object 라고 보시면 되겠습니다.\n\n본 예제에서는 JDBC 중 흔히 사용되는 세가지 인터페이스 Connection, Statement, ResultSet 을 구현(implements)하는 Mock Object 를 만듦으로써 DB 없이 어떻게 테스트 가능한 클래스를 도출해 낼 것인가에 대해서 살펴보고 있습니다.\n\n**- 나중에 추가 --**\n\n제가 작업한 내용을 다시 보니 말도 어색하고,\n\n무엇보다 긴장한 나머지 틀린 단어에, 딴소리(...)까지\n\n전혀 서슴없더군요. -_-;;\n\n혹 들으신다면, 부디 적당히 걸러서 들으세요. (죄송)\n\n#### Comments\n\n혹시 강사 경력이 있으신가요? 동영상에 맞춰 설명을 잘 하시네요. :)\n\n 이국진 | 2008-09-03 수요일 오전 12:7\n\n--\n\n안녕하세요? 어떻게 알고 들르셨는지요? 블로그 주소라도 남겨 주셨으면 인사드리러 갔을텐데 아쉽습니다.\n부끄럽습니다만, 남겨주신 코멘트는 칭찬이라 생각하겠습니다.\n감사합니다.(^_^);\n\n [doortts](http://doortts.tistory.com) | 2008-09-06 토요일 오전 12:36\n\n--\n\nMock 사용이 익숙치 않았는데 좋은 자료 만들어 주셔서 감사합니다.\n\n [CoolGuy](http://humility.tistory.com) | 2009-01-23 금요일 오전 8:52\n\n--\n\n그리 말씀해 주시니, 저도 감사합니다. 평안한 설 연휴 되세요. :)\n\n [doortts](http://doortts.tistory.com) | 2009-01-23 금요일 오후 2:44\n\n--\n"
  },
  {
    "id": 40,
    "title": "우리나라 대부분의 SI 프로젝트는 실패해야 한다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1220632680000,
    "body": "> doortts | 2008-09-06 토요일 오전 1:37 | 이생각 저생각 | [원본](http://blog.doortts.com/40)\n\n**우리나라 대부분의 SI 프로젝트는 실패해야 한다고 생각한다.**\n\n다소 과격하게 들리고 공격적으로 느낄수도 있겠지만 내 생각은 그러하다.\n\n(skip)\n\n오늘 회사 후배가 찾아왔다.\n내가 봤을때 정말 맡은 일 열심히 하는 후배다.\n오늘 퇴근 시간즈음에 나를 부른건, 퇴직인사를 하기 위해서다.\n\n가슴이 착찹하다.\n\n(또 skip)\n\n**우리나라의 SI 프로젝트는 너무 성공한다.**\n\n말도 안될만큼 성실하게 일하는 사람들이 있기 때문에,\n집버리고 여자친구 남자친구, 아내 남편 버리고,\n프로젝트가 의례 그렇다는 듯이 막판이 다가오면 다가올 수록, 마치 자신의 잠재능력의 끝을 보여주고 싶기라도 한것마냥\n가속화된 형태로 자신들의 삶을 쏟아붓는 사람들이 있기에,\n\n어떻게든 성공시켜 버린다.\n\n(그리고 일련의 사람들은 그렇게 하기 위해 곧잘 **책임감**이라고 하는 덕목을 비겁하게 이용하곤 한다.)\n\n제때 즈음에 오픈하고, 큰 사고(= 사람 쓰러지는 건 사고로 치지 않는다. 핵심은 돈이다)없이 얼마간 지속되면 프로젝트 성공했다고 한다. (그리고 심할 경우 성공사례 발표 같은 짓까지도 서슴없이 일삼는다.)\n\n아마 모르긴 몰라도 전세계 SW 프로젝트의 평균 성공률이 30%정도 쯤이라면,\n우리나라는 (announced percentage로) 80%쯤 되는게 아닐까 싶을 정도다.\n\n다시 한번 말하지만,\n\n**현재 우리나라 대부분의 SI 프로젝트는 실패해야 한다.**\n\n어쩌면 나보고 '아이고 맙소사! 이거 Stone child 아냐?' 할지도 모르겠지만,\n프로젝트가 끝나고 참여자들에게 설문을 받아서,\n\n**이번 프로젝트와 같은 프로젝트에 다시 참여하고 싶습니까?**\n\n혹은\n\n**프로젝트를 진행하는 동안 본인과 본인의 삶이 존중받았다고 생각합니까?**\n\n라는 질문에 대한 응답을 프로젝트 성공 여부에 포함시켜야 한다고 생각한다.\n\n고객과의 계약, 그리고 이 설문, 둘 중 하나라도 만족 못시켰으면,\n\n프로젝트 실패건으로 카운트하고 다들 한 방에 모여앉아 반성 또 반성해야 한다.\n\n시스템은 살고 사람은 죽어나는게 무슨 성공적인 SI인가? 시스템이란게 대체 누구를 위한 것인가? 주객이 전도된 현상이라고는 생각되지 않는가?\n\n몸도 마음도 피폐해져서는 떠나는 사람이 속출해도,\n납기에 맞춰 물건을 넘겼으니 프로젝트가 성공이라고 믿는 사람들이 있기때문에,\n\n안타까운 사연들이 넘쳐나는 업계가 되는거다.\n\n**제발 실패하자.**\n\n그래서 반성에 반성을 하게 하고,\n\n사람을 기계나사, 컨베이어 벨트 라인처럼 최대한 가동시켜 생산성을 극대화시키겠다는 (혹은 그럴수 밖에 없다는) 어리석은 생각을 되돌리고,\n\n일정과 사람과 환경에 대한 잘못된 가정과 운용이 무엇인지 찾아내서\n\n개선시킬 수 있도록, 기회를 주자.\n\n제발 그렇게 좀 하자.\n\n#### Comments\n\n나 또한, 그렇게 되기 위한 많은 시나리오를 상상해봤는데...\n정리 결과 문제 제기가 어찌 되느냐에 따라 방법이 많이 나뉘더군.\n(근거를 좀 대면서 쓰려다가, 벙찐 설명했다가 당했던 아픈 기억이 있어서 걍 쉽게 썼어..--;)\n\n1. 시간이 흘러가면서, 많은 문제가 야기되고\n    다수 개발자들의 이민, 이직 등의 직업 기피로 인해 결국은 개발자의 삶의 질을 고려.\n2. 사회적 이슈 제기. 헌법 소원 혹은 노동 쟁의를 통한 사회적 반향을 불러 일으킴\n3. 경제적 이슈 제기. 개발자들을 잘 대우하고, 또 개발자들이 선호하는 회사가 큰 성공을 불러일으킴\n    상대업체는 경쟁을 위해 개발자들의 삶을 보장하게 됨\n\n근데 중요한 것은 1,2,3 번이 모두 너무 씁쓸하다. 다른 방안은 없어?\n\n [M-o-N](http://nephilim.tistory.com) | 2008-09-06 토요일 오후 11:57\n\n--\n\n음.. 글쎄.. 현대차 노조 영입? ㅎㅎㅎ\n\n [doortts](http://doortts.tistory.com) | 2008-09-07 일요일 오전 2:23\n\n--\n\n근데 시스템이라도 살믄 참 다행이군요..\n제가 경험해본 SI는 대부분 (저만의 판단으론)시스템도 실패한 경우인데...\n\n vizitors | 2008-09-30 화요일 오후 3:59\n\n--\n\n본문에 연장해서...\n\n얼마전, TMIN(?) Room Door(?) 만들어 내기 위하여, \n몇 명의 직원이 이혼을 하기도 했다고 자랑스럽게 말씀하시던 그 분의 모습에서 \n60-70년대, 허리띠 졸라매고 우리도 한 번 잘살아 보세를 외쳤던 모습이 떠오르네요.\n\n우린 아직도 그 시절 그 마인드에 머물러 있는게 아닐까 싶네요.\n\nPS: 여의도 in 애자일은 연재가 완료 된건가요?\n뭔가 제대로 흘러가는 프로젝트를 보는 것 같아,\n대리만족을 느꼈었는데 더 이상 글이 없네요. :(\n\n proxies | 2009-07-19 일요일 오후 5:40\n\n--\n"
  },
  {
    "id": 41,
    "title": "곰플레이어(Gom player)개발자들의 마인드 중 배울점",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221021287000,
    "body": "> doortts | 2008-09-10 수요일 오후 1:34 | 이생각 저생각 | [원본](http://blog.doortts.com/41)\n\n곰 플레이어 업데이트 알림이 떳다.\n\n![zrclip_001p3692ca0d.png](/files/21569)})\n\n언제 부턴가 이런식으로 업데이트 알림이 뜬다.\n\n별것 아닐수도 있지만, '**업데이트가 있습니다 하실래요?**' 식의 메시지 보다 얼마나 더 고객 친화적인가?\n(보통은 업데이트가 끝나고 나서야 뭐뭐가 업데이트 되었음. 이런식으로 나오는데 말이다)\n\n업계에서 기술은 쉽게 모방해도 이런 마인드는 쉽게 배우기 어려운 법이다.",
    "attachments": [
      {
        "id": 21569,
        "name": "zrclip_001p3692ca0d.png",
        "hash": "7feba4894e71845800bb19bbb5be7636045b89ea",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 12654,
        "containerId": "12217"
      }
    ]
  },
  {
    "id": 42,
    "title": "FireFox vs Chrome 이제는 TraceMonkey vs V8 엔진의 싸움?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221024593000,
    "body": "> doortts | 2008-09-10 수요일 오후 2:29 | 이생각 저생각 | [원본](http://blog.doortts.com/42)\n\nFireFox vs Chrome 이제는 [TraceMonkey](http://weblogs.mozillazine.org/roadmap/) vs [V8](http://code.google.com/p/v8/) 엔진의 싸움?\n\n요즘 IT 호사가들은 구글 크롬의 자바스크립트 엔진인 V8 엔진이 빠르다고 난리다.\n\n파이어폭스(이하 파폭) 스폰서인 구글에서 브라우저를 내보냈으니, 파폭측도 예민해 졌나 보다.\n\n시기도 묘하게 나온 V8엔진.(IE 8 beta 가동중에 나왔다)\n\n파폭3.1에 탑재될 차세대 엔진인 TraceMonkey 개발진도 즉각 대응 발표를 하였다.\n\n뭐, 예상했겠지만, 한마디로 **'우리께 더 좋다!**'라는 내용이다.\n\n하지만, 이미 나와서 쓰고 있는 제품(크롬)과 알파 단계인 제품(파폭3.1)은 경쟁이라고 하기 어렵다고 본다.\n\nwinner get them all 방식의 세계에서 늦으면 이미 한 수 접고 가는 것이기 때문이다.\n\n(이하 TraceMonkey 팀의 발표자료)\n\n![zrclip_001n49afa708.png](/files/21571)})\n\n![zrclip_002n50f68c3b.png](/files/21572)})\n\n#### Comments\n\nGrease Monkey, Trace Monkey ... \n원숭이 이름 들어간 것이 점점 많아져.. 가만, V8은 야채주스 이름이잖아!\n\n [M-o-N](http://nephilim.tistory.com) | 2008-09-15 월요일 오후 1:10\n\n--\n\nV8도 이젠 맛이 세 가지나 있게 되었다구!\n\n [doortts](http://doortts.tistory.com) | 2008-09-16 화요일 오전 12:39\n\n--\n",
    "attachments": [
      {
        "id": 21571,
        "name": "zrclip_001n49afa708.png",
        "hash": "68acda6a8b9a44c4015ab4693b74838ec94abdf1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 104310,
        "containerId": "12220"
      },
      {
        "id": 21572,
        "name": "zrclip_002n50f68c3b.png",
        "hash": "68acda6a8b9a44c4015ab4693b74838ec94abdf1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 104310,
        "containerId": "12220"
      }
    ]
  },
  {
    "id": 43,
    "title": "Mock Object를 사용하여 쉽게 테스트하기 part 2",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221142215000,
    "body": "> doortts | 2008-09-11 목요일 오후 11:9 | Better SW Development | [원본](http://blog.doortts.com/43)\n\n매우 당황했습니다.\n\n정말이지 너무나도 부끄러운 마음에 어찌할 바를 모르고 있습니다.\n\n그래서 2부를 급하게 만들게 되었습니다.\n이번에도 부족한 점은 여전히 (아니, 어쩌면 저번보다도 더) 많지만,\n\n그래도 도움되는 사람이 있길 바라며 올려봅니다.\n\n----------- Screen Cast --------------------------\n**Mock Object를 사용하여 쉽게 테스트하기**\n1부 : Plain mock object 을 이용해서\n2부 : Mock Object Framework 을 이용해서\n--------------------------------------------------\n전체 2부 중 2부 입니다.\n\n[Mock Object를 사용하여 쉽게 테스트하기 part2 (클릭)](http://www.doortts.com/oc/MockObjectTest2.html)\n\n▨▨▨ **추가 내용** ▨▨▨\n업계 인기 mock 프레임웍인 [Easymock](http://www.easymock.org/) 이나 어쩌면 다소 생소할 수 있는 [mockito](http://code.google.com/p/mockito) 나\n둘 다 테스트 단순히 오리지날 객체(인터페이스)의 동작을 stub 하는 것 이외에 케이스 작성을 쉽게 해주기 위해 stub 한 메소드가 호출 되었는지 여부, n번의 호출이 필요한 경우 정말 n 번 호출 되었는지 여부를 확인 할 수 있는 메소드를 함께 제공하고 있습니다. 그 이외에도 각자만의 독특한 개념들도 있고, 비슷한 개념의 다른 메소드 들도 있습니다. 다만, 유틸리티는 유틸리티 일뿐, 편하게 쓰시되 빠져드실 필요까지는 없을 것 같습니다.\n\n▨▨▨ **자바 최종 소스 파일** ▨▨▨\n[DatabaseExample.java](http://www.doortts.com/oc/DatabaseExample.java)\n[DatabaseExampleTest.java](http://www.doortts.com/oc/DatabaseExampleTest.java) (오로지 Mockito Framework만을 사용한 경우. 극단적인 케이스라 볼 수 있습니다.)\n\n▨▨▨ **이전 스크린 캐스트** ▨▨▨\n[Mock Object를 사용하여 쉽게 테스트 하기 part1](http://doortts.tistory.com/entry/Mock-Object를-사용하여-쉽게-테스트하기)"
  },
  {
    "id": 44,
    "title": "끝나지 않는 질문",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221288900000,
    "body": "> doortts | 2008-09-13 토요일 오후 3:55 | 이생각 저생각 | [원본](http://blog.doortts.com/44)\n\n**이상한 방식으로 나를 감동 시킨 책**\n\n![zrclip_001n33ef7a2e.png](/files/21573)})\n\n이 책 제목을 보고 어떻게 생각할런지는 모르겠지만, 이책의 원제는 'My Job went to the india' 이다. DC(개발센터) 해외이전을 추진하는 기업들이 많아지면서 설자리를 뺏겨가는 것이 아닌가 하는 불안감을 가질 개발자들에게 들려주는 저자(차드 파울러)의 선배로서의 경험담이라고 보면 된다.\n\n실제 인도 개발센터에 매니저로 가서 생활하면서 겪은 에피소드들도 간간히 이어지며, 음악가로 시작한 자신의 경력을 바탕으로 이야기를 재밌게 풀어내고 있다. 가격도 별로 안비싸니 한 번 읽어 볼만 한데,\n\n사실 내가 말하고 싶은 **이 책의 진정한 가치는 마지막 챕터에서 나온다.** 어쩌면 그저그런 담론서가 될 수 있겠지만,\n\n꾹 참고 마지막 챕터까지 가보면 적잖은 감동을 느낄 수 있으리라 생각한다. 중요하지만 우리가 때때로 잊고 지내고 있는 것이 무엇인지를 이야기 해 주고 있다.\n\n**올해도 다시 한 번 나를 감동 시킨 춤**\n\nMatt Harding의 '춤' 여행기 2008년 버전.\n\n어설프기 그지 없지만, 밝은 얼굴로 천진하게 사람들과 춤을 추는 그의 모습은,\n부럽기도 하고 그 만큼이나 감동스럽다.\n\n전 세계 사람 누구에게나 공통언어인건 '춤'이 아닐까? 어떤 의미에서 바로 위에 소개 한 책의 마지막 챕터 내용과 이어지는 것 일지도 모르겠다.\n\n**사람은 무엇으로 사는가? 그 끝나지 않는 질문에 대한 각자의 해답을 생의 마지막 날까지 찾아가는 게 우리의 삶이 아닐까 싶다.**\n\n\nWhere the Hell is Matt? (2008)\n\n제작기간 14개월\n촬영장소 전 세계 42개국\nhttp://www.wherethehellismatt.com/\n\n쓰인 배경음악\n제목 : praan, 인도 북부 벵골어. 뜻은 life\n가사 : 라빈드라나드 타고르( Rabindranath Tagore) 의 1913년 노벨작품상 기탄잘리(Gitanjali) 시 \"Stream Of Life\" 인용\n작곡 : Garry Schyman, Bioshock 의 음악프로듀셔\n\n#### Comments\n\n오오 예전보다 더욱 재밌어졌어-\n감동적이다..\n\n [M-o-N](http://nephilim.tistory.com) | 2008-09-15 월요일 오후 1:9\n\n--\n\n그렇지? 난 특히 인도 무희와 함께 한 부분이 특히 재밌는 거 같아.\n음악이야 뭐 말할것도 없고.\n\n [doortts](http://doortts.tistory.com) | 2008-09-16 화요일 오전 12:39\n\n--\n",
    "attachments": [
      {
        "id": 21573,
        "name": "zrclip_001n33ef7a2e.png",
        "hash": "24886b495702a852c9dadab596ae473842f4f03e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 142443,
        "containerId": "12221"
      }
    ]
  },
  {
    "id": 45,
    "title": "이 테크닉은 우리에게 적합하지 않습니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221568738000,
    "body": "> doortts | 2008-09-16 화요일 오후 9:38 | 이생각 저생각 | [원본](http://blog.doortts.com/45)\n\n새로운 방법론이나 테크닉 소개를 할때면 공통적으로 접하게 되는 anti-opinion 에 대한 좋은 FAQ가 될 수 있는 이야기.\n\n37signals.com 의 [Getting Real](http://gettingreal.37signals.com/GR_kor.php) 에 대한 이야기 중 몇 가지 자주 듣는 불평들과 그에 대한 그 들의 대답.\n\n## \"이 테크닉은 우리에게 적합하지 않습니다.\"\n\n(중략) Getting Real은 모두 적용해야 하는 것이 아닙니다. 비록 당신이 Getting Real의 전체를 받아 들여지지 않는다고 해도, 그 몇 개의 아이디어를 손에 넣을 순 있을 것입니다.\n\n## \"37Singals이 Getting Real의 아이디어를 개발하지 않았잖아요.\"\n\n(중략) 이러한 테크닉들은 모두 37signals의 유일한 것이 아닙니다. 중요한 점은 우리가 일을 어떻게 개선해서 성공으로 이끌었는가 하는 점입니다.\n\n## \"너무나 흑백논리에서 이야기 하고 있습니다.\"\n\n(중략) 적당히 얼버무리는 표현보다 분명한 표현 쪽이 좋다고 생각합니다.  (중략) 몇 개의 전략은 여러분 환경에는 맞지 않을 수도 있습니다. 여러분의 판단력과 상상력에 맡기십시오.\n\n## \"우리 회사에서는 적용할 수 없어요.\"\n\n비록 여러분 회사를 통상적으로 큰 조직 구조와 장기 스케줄로 운영하고 있다 하더라도, Getting Real 도입의 여지는 아직 있습니다. 우선은, 큰 조직 단위를 작은 단위로 분해하는 것입니다. 너무나 많은 사람이 관련되는 경우, 실제로는 아무것도 할 수 없습니다. 간결하면 간결할수록 업무를 더 빠르고 더 낫게 수행할 수 있습니다.\n\n..... 등등..\n\n37signals.com 에 관심이 없더라도 한 번 읽어 볼 만한 내용이라 생각한다.\n\n[Getting Real(클릭)](http://gettingreal.37signals.com/GR_kor.php)"
  },
  {
    "id": 46,
    "title": "Guice 라고 쓰고 Juice 라고 읽는다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1222247290000,
    "body": "> doortts | 2008-09-17 수요일 오전 12:55 | 이생각 저생각 | [원본](http://blog.doortts.com/46)\n\n최근에 학습하다가 중단한 Google 의 DI 프레임워크인 [Guice](http://code.google.com/p/google-guice/)\n\nDI에 특화된 프레워크이며 객체 생성 속도가 (지들 말로는) 스프링의 100배쯤이라고 한다. (설마! 근데, 혹자는 1000배라는 이야기도..-_-);;\n\n또한 XML 대신에 annotaion 을 사용하여 injection 을 처리한다.\n\n== Injection 처리 ==\npublic class Client {\n    private final Service service;\n\n    @Inject\n    public Client(Service service) {\n        this.service = service;\n    }\n    public void go() {\n        service.go();\n    }\n}\n\n== Bind 처리 ==\n\n| \n\npublic class MyModule implements Module {\n     public void configure(Binder binder) {\n         binder.bind(Service.class)\n           .to(ServiceImpl.class)\n           .in(Scopes.SINGLETON);\n     }\n }\n \n\n |\n\n== 논란의 핵심 (implementBy) ==\n\n| \n\n@ImplementedBy(ServiceImpl.class) public interface Service {\n     void go();\n }\n \n\n |\n\n여담인데 한가지 아쉬운건, Guice 개발자가 두명인데, 그중 한명인 Bob lee 는 의사소통에 다소 문제가 있지 싶다.\n\n([BOB LEE의 BLOG](http://crazybob.org/) 난장판임... -_-;; spring sucks!! 라는 발언까지...)\n\n어쨌든 XML Hell 을 annotation 으로 풀어보겠다는 의지는 확실한듯.\n\n이하 소개 비디오와 '스프링과 피코 컨테이너와 Guice의 비교' 글은 한 번쯤 봐둘만은 하다.\n\nGuice 소개 비디오\n[http://video.google.com/videoplay?docid=6068447410873108038](http://video.google.com/videoplay?docid=6068447410873108038)\n\nComparison between Guice, PicoContainer and Spring\n[http://www.christianschenk.org/blog/comparison-between-guice-picocontainer-and-spring/](http://www.christianschenk.org/blog/comparison-between-guice-picocontainer-and-spring/)\n\nLies, Damned Lies, and XML - Bob lee (논쟁의 중심)\n[http://crazybob.org/2007/06/lies-damned-lies-and-xml.html](http://crazybob.org/2007/06/lies-damned-lies-and-xml.html)\n\n커플링에 대한 Kevin Bourrillion 의 의견과 논쟁\n[http://smallwig.blogspot.com/2007/06/coupling.html](http://smallwig.blogspot.com/2007/06/coupling.html)\n\n== 이하는 읽어도 그만, 안 읽어도 그만~ ==\n\nThe point I was trying to make is the following. Lets take the (evil) @ImplementedBy annotation: you annotate an interface with it and tell Guice that it's implemented by the supplied class. This could be problematic in two ways:\n1\\. the interface suddenly knows its implementing class. That's not what you want if you aim for loose coupling.\n2\\. this leads to the second point: with this annotation you're probably breaking a well-designed package structure. Suppose you've got some class that needs the interface in a package \"foo\", the interface is in package \"foo.bar\" and an implementation of the interface is in \"foo.bar.impl\". That's a nice tree: the class uses the interface, while the implementation of the interface uses -well- the interface. There are no circles; only unidirectional links between the packages. If you now use the @ImplementedBy annotation it gets circular: the interface has a link back to \"foo.bar.impl\" and isn't independent from the implementation anymore.\n\nYou might say that a) the annotation is a kind of documentation as it just points out what's in the code anyway and b) that these cases were you want to have super-independent packages are rare. While I would be on your side, all I wanted to say was, that you can see it this way too and that there might be people who choose Spring instead of Guice (because of these artificial arguments) because... -well- they are fussy.\n\nFinally I'd like to correct my conclusion. You'll probably use @Inject and some implementations of Module (e.g. one for tests and one for production use) and that'll be it. This doesn't couple your code tight to Guice and the annotations don't hurt at all. Whether there's one more JAR on my classpath (whether on compile- or runtime) or not doesn't bother me, because I'm using Maven so this just comes down to some few lines in the POM.\n\n------------------------\n\n\"Lets take the (evil) @ImplementedBy annotation:\"\n...\n\"1\\. the interface suddenly knows its implementing class. That's not what you want if you aim for loose coupling.\"\n\nI can tell you that from a maintenance perspective the ImplementedBy annotation could actually be beneficial. Why? Because when you are browsing through code and you hit an interface, you are no longer faced with a brick wall (you don't know which implementation is being used). With the aforementioned annotation you could navigate to the implementation with a single click. Sure you can do a search for the implementation but in some situations there are multiple candidates, and thats where you can start wasting serious time (if you are unfamiliar the the code)."
  },
  {
    "id": 47,
    "title": "프로그래머 스킬 테스트",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221711448000,
    "body": "> doortts | 2008-09-18 목요일 오후 1:17 | 이생각 저생각 | [원본](http://blog.doortts.com/47)\n\n자신의 기본 프로그래밍 실력은 얼마나 될까 테스트 해보고 싶을때가 있다.\n\n[http://www.betterprogrammer.com/](http://www.betterprogrammer.com/)\n\n가입이나 로그인 필요없이 임의의 4개 문항이 나오며,\n\n온라인으로 답을 제출하면 채점해서 응시자 중 자신의 순위를 알려준다.\n\n![zrclip_003p1b6da9e0.png](/files/21576)})\n\n단답형의 간단한 알고리즘 문제들이 나온다. (말 그대로 문제만 간단.ㅎㅎ)\n\n![zrclip_002p778388d8.png](/files/21575)})\n\n문항에따라 recommended time 과 max.time 이 다른데, 쉬운 문제도 있고 꽤 어려운 것도 있다. 그리고 60일 내에 3번 이상 응시할 경우, 응시기록이 삭제된다고 한다. 아마 계속 봐서 등수를 높이는 것을 막기 위한 것 같다. 뭐, 최소한의 시스템적인 예의랄까?\n\n여유될때 환기도 시킬겸 한번 도전해 보면 좋을 것 같다.",
    "attachments": [
      {
        "id": 21575,
        "name": "zrclip_002p778388d8.png",
        "hash": "032a4285ac3c037d3b6f03b8f514f1e87e2a494e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 83790,
        "containerId": "12226"
      },
      {
        "id": 21576,
        "name": "zrclip_003p1b6da9e0.png",
        "hash": "28d59d26333b333d35cdda2d55ca5710923dab20",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 167238,
        "containerId": "12226"
      }
    ]
  },
  {
    "id": 48,
    "title": "1등보다 나름 더 멋진 2등이 있을 수도 있다고 생각해",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1221740987000,
    "body": "> doortts | 2008-09-18 목요일 오후 9:29 | 이생각 저생각 | [원본](http://blog.doortts.com/48)\n\n![zrclip_001p1e70d387.png](/files/21577)})\n\n개발자가 있는 회사라면 저런 사이트 정도 하나 있어야 하는데 말이다.\n\n참, 아숩다.\n\n울 회사도 하나 있었으면...\n\nPS. DAUM 에서 우연히 찾은 지식 확장의 node 가 될 수 있는 유용한 정보 두 가지\n\n1\\. XMLHttpRequest RFC 한글 번역본\n[http://dna.daum.net/TR/XMLHttpRequest/](http://dna.daum.net/TR/XMLHttpRequest/)\n\n2\\. 잘 정리되어 있는 JUnit 4.4 사용후기와 팁\n[http://dna.daum.net/technote/java/JUnit_4.4_TipsAndTricks](http://dna.daum.net/technote/java/JUnit_4.4_TipsAndTricks)\n\n#### Comments\n\n온갖 쉽지 않은 회사 상황에도 불구,\n \"다음 가고파\"\n\n근데 링크 걸어줬음 좋았을 껄 .. (좋은 정보에도 딴지를 거는)\n\n [M-o-N](http://nephilim.tistory.com) | 2008-09-23 화요일 오전 9:6\n\n--\n\n아! 링크! 좋은 생각인데!!.... 라고 쓰고 보니 PS에 항목에 링크가 있잖아!!\n\n [doortts](http://doortts.tistory.com) | 2008-09-24 수요일 오후 5:43\n\n--\n",
    "attachments": [
      {
        "id": 21577,
        "name": "zrclip_001p1e70d387.png",
        "hash": "38896921ade848b88651b309e2966f297917dcbc",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 176985,
        "containerId": "12227"
      }
    ]
  },
  {
    "id": 49,
    "title": "한빛출판사 Blog2Book 저자 세미나 후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1222354389000,
    "body": "> doortts | 2008-09-25 목요일 오후 11:52 | 잊기전에 회고 | [원본](http://blog.doortts.com/49)\n\n![zrclip_001n764b0c3a.png](/files/21574)})\n\n의 저자 문우식님께서 진행하는 세미나를 참석했다.\n\n그는 또한 [카뮤즈](http://www.kamuse.com/)의 소프트웨어 아키텍트이기도 하다.\n\n**주제 : Object Oriented Thinking**\n\n**시간 : pm7 ~ 9:30**\n\n**장소 : 묘한 곳에 위치하고 있는 한빛출판사 본사1층 강의장**\n\n아키텍트이며 선임개발자로서의 여러가지 개발에 대한 시각을 들을 수 있는 좋은 기회였던것 같다. 그리고 P-Camp 때와 마찬가지로 다양한 개발자들이 참 열심히 살고 있구나 하는 점도 마찬가지로 느꼈다.\n\n또 하나 강의를 듣고 느낀점 중 하나는,\n\n저자인 문우식님은 자신의 회사의 미래를 고민할 수 있는 위치에 있는 사람이라는 생각에 다소 부럽기도 했다.\n\n한빛출판사 본사도 첨 봤는데, 깔끔 아담하니 잘 지은듯 하다.\n\n다만 간단한 식사를 제공한다고 해서 샌드위치 정도를 생각했는데, 예상과는 달리... 1000원(아! 올라서 1500인가? 어쨌든..) 김밥을 렛스비 캔커피와 함께 주었다는 점은 살짝 실망이었다.\n\n이하는 내가 한 질문과 저자의 응답 요약\n\n---------------------------\n\nQ1\\. UML을 개발에 사용하시는지요? 개발시 어떤 것들을 산출물로 남기시는지요?\n\nA1\\. UML을 사용하지 않습니다. 대신에 칠판을 사용합니다. 문서가 요구사항으로 지정된 경우를 제외하고 산출물은 문맥이 명확한 코드로 대체합니다.\n\nQ2\\. 서버에서 OOP가 어렵다고 하셨는데 이유는?\n\nA2\\. 서버는 성능 = 비용 이기때문에 효율적인 프로그래밍을 위해서 OOP방식을 사용하지 않습니다.\n\n---------------------------\n\n사무실에서 같이 갈 사람이 있었으면 더 좋았을듯 싶은데 것도 살짝 아숩다.(^_^);;",
    "attachments": [
      {
        "id": 21574,
        "name": "zrclip_001n764b0c3a.png",
        "hash": "bbad41cb2ad8a0585bc4d4cd000211c93ac2be6e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 30666,
        "containerId": "12225"
      }
    ]
  },
  {
    "id": 52,
    "title": "어떤 솔류션들",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1222870961000,
    "body": "> doortts | 2008-10-01 수요일 오후 11:22 | Better SW Development | [원본](http://blog.doortts.com/52)\n\n**언제나 그렇듯 문제란게 있다.**\n\n그리고 보통 그 문제를 쉽게 해결하는 방법으로 사람들은 시스템을 생각해 낸다.\n\n이를테면,\n\n지각이 잦다 -> 지각하면 불이익을 준다.\n\n제때에 쉴수 없다는 팀원들의 불만이 많다. -> 팀원들의 연차 소진 비율을 팀장평가에 반영하도록 하자!\n\n어찌보면 법이랑 비슷한다.\n\n예외사항과 문제라고 인식되는 상황이 발생(or 발견)될때마다 추가항목을 넣는 식으로 메꾸는 거다.\n\n이건 다른식으로 보면, 공포정치가 효율이 높은가의 문제인 것 같다.\n\n**개발자가 있다.**\n\n언제나 그렇듯 문제란게 있다.\n\n지각 관리가 필요하단다. -> 자리에 오면 로그인 하는 식으로 체크를 하게 할 수 있습니다!\n\n팀원들의 연차 소진 비율이 필요하다. -> 사내시스템으로 신청하고 그래프가 나오도록 해서 관심사병에 해당하는 인간이 바로 드러날 수 있게 할수 있을것 같아요!\n\n...\n\n좋지 아니한 녀석이다. (-_-);...\n\n**리더가 있다.**\n\n언제나 그렇듯 문제를 가져오는 녀석이 있다.\n\n지각이 잦다 -> \"OO씨는 일도 잘하고 장점이 많은데, 출근만 조금 일찍하면 정말 완벽할것 같아!\" 라고 말해 준다.\n\n제때에 쉴수 없다는 팀원들의 불만이 많다. -> \"최대한 보장해 줄테니까, 내 눈치 보지 말고 필요할때 써! 그리고 팀 평가에도 영향을 미친다고 하니까, 남기지 않도록 하면 더 좋을 것 같아!\" 라고 또 말해준다.\n\n...\n\n미안.. 아직 이런 리더는 못 만나봤다.."
  },
  {
    "id": 53,
    "title": "Eclipse, 플랫폼에서 생태계로",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1223272632000,
    "body": "> doortts | 2008-10-06 월요일 오후 2:57 | Better SW Development | [원본](http://blog.doortts.com/53)\n\n이클립스가 Gamymede SR1(Service Release1) 을 배포하면서 첫 화면을 바꾸었습니다.\n그러면서 전면으로 내세운 컨셉은 유저와 커미터와 맴버들, 그리고 Ecosystem(생태계)이 조화롭게 어울려가는 모습.\n(그 가운데에 download eclipse는 개인적으로는 약간 조크처럼 느껴진다. ex.닥치고 다운? )\n\n![zrclip_004p4aad370b.png](/files/21581)})\n\nUsers 와 Members 와 Committers가 만들어가는 ecosystem.\n\n![zrclip_003n35f93b44.png](/files/21580)})\n\n이클립스 사용자를 위한 첫 페이지.\n\n![zrclip_005n31f8f0a3.png](/files/21578)})\n\n화면을 보면 어느정도 감이 오겠지만,\nEcosystem 이란 유저와 맴버들이 함께 만들어가는 eclipse 환경(혹은 확장)을 의미한다.\n\n![zrclip_006n7be28cce.png](/files/21579)})\n\n나름 역할에 따른 메인화면을 보여주는 건 역시 참신성을 떠나 새롭게 느껴진다.\n\n문뜩 떠오른 생각하나.\n\nborland도 eclipse 밑으로, weblogic 로 eclipse 밑으로 들어온 현재.\n\nNetbeans 사용자는 얼마정도 될까?\n\n혹시 JDeveloper 사용자가 더 많은거 아냐? (-_-);;\n\n사족1.현재 JDeveloper는 막강 오라클이 받쳐주고 있다. 오라클 ERP 프레임워크인 OAF라는 거대한 시스템을 받쳐주는 근간이기도 하다.\n이젠 버리기에는 너무 큰 동물원이 되었다고나 할까?",
    "attachments": [
      {
        "id": 21578,
        "name": "zrclip_005n31f8f0a3.png",
        "hash": "6697cac91c57c9bd108ef33de83cb49f266ff1a6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 165072,
        "containerId": "12228"
      },
      {
        "id": 21579,
        "name": "zrclip_006n7be28cce.png",
        "hash": "c9b690abe6d9bf7f1297b1bac8bb66bd800308dc",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 137028,
        "containerId": "12228"
      },
      {
        "id": 21580,
        "name": "zrclip_003n35f93b44.png",
        "hash": "92dfae6ba3ef6469cdcde44f3c25f08ae50afa2f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 224865,
        "containerId": "12228"
      },
      {
        "id": 21581,
        "name": "zrclip_004p4aad370b.png",
        "hash": "6e23d2f60c092097bbd5e63fe4b3a8a209ebf562",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 260205,
        "containerId": "12228"
      }
    ]
  },
  {
    "id": 54,
    "title": "어떤 의미로 무서운 IT서적 출판사, 에이콘",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1223943720000,
    "body": "> doortts | 2008-10-14 화요일 오전 9:22 | Books | [원본](http://blog.doortts.com/54)\n\n관심있게 보고 있는 IT 서적 출판사가 세 군데 있는데,\n\n[에이콘](http://www.acornpub.co.kr/blog/), [한빛](http://www.hanb.co.kr/), [위키북스](http://www.developerfarm.com/wikibook/) 이다.\n\n그런데 개인적으로 생각하기에 그 중 근래에 들어 특히 '앞서간다!'라는 느낌을 주는 출판사는 에이콘이 아닌가 싶다.\n\n이번에 에이콘 출판사에서 발간 예정인 책이다.\n\n![사용자 삽입 이미지](http://www.acornpub.co.kr/blog/attach/1/1677961918.gif)\n\n원서의 표지는 줄어들어서 좌 하단으로 배치되었다. 좀\n\n에이콘 출판사가 갖는 장점 몇가지를 꼽아 보라면\n\n**- 입문서 위주가 아니며, 분야가 영역이 다양하다.**\n\n**- 번역서의 퀄러티가 일정수준 이상을 보장한다.**\n\n- 편집이 깔끔하다.\n\n정도가 될것 같다.\n\n물론 에이콘 책들을 다 읽은 것도 아니고,에이콘 출판사와는 메시지하나 주고받은 적 없는 관계지만\n\n그래도 멀찌감치서 보기에,\n\n어떤 의미로는 대단하고, 어떤 의미로는 멋진, 그래서 이번 책 출간 같은 경우에는 좋은 의미로 '이야~ 무섭다!'라고 느낄 정도이다.\n\n ![사용자 삽입 이미지](http://www.acornpub.co.kr/blog/attach/1/1944751072.gif)\n\n근래에 출간된 이 책까지 포함해서 언제 꼭 봐야겠다고 마음 먹고 있다.\n\n애자일을 거대규모 프로젝트에서 어떻게 적용하는가에 대해 너무 궁금해서 말이다.\n\n앞으로 또 어떤 책이 나올까 기대된다.\n\nps. [로드 존슨](http://americas.springone.com/conference/speaker/rod_johnson.html)의 책은 어느 출판사에서 나올까가 개인적으로는 큰 관심사중 하나이다. (어쩌면 영영 안나올런지도...)\n\nps2\\. [인사이트](http://www.insightbook.co.kr/)와 헷깔려 한 부분이 있었네요. 애자일은 아직까진 인사이트가 꽉 잡고 있는듯 합니다. (^_^);\n\n#### Comments\n\n안녕하세요. 저희보고 '무섭다'는 데 왜 흐뭇~한 걸까요? ^^\n좋게 봐주셔서 감사합니다.\n앞으로는 \"메시지 하나 주고받는 적 있는 관계\"  만들어보죠. 뭐. ^^\n기대해주셔서 감사합니다. 괜히 많이 좀 떨리네요. :)\n\n [에이콘](http://www.acornpub.co.kr/blog) | 2008-10-14 화요일 오후 5:30\n\n--\n\n애자일은 아직까지는 인사이트가 발군\n\n저 책이 뒤집을지는 두고 봐야 할일\n\n안티에이콘(?)-호야지기\n\n [호야지기](http://hoyajigi.com) | 2008-10-14 화요일 오후 5:41\n\n--\n\n맞아요! 호야지기님! 제가 헷갈렸더라구요. (집에오는 길에 직장동료랑 이야기 하다가 알았습니다. ^_^);\n\n [doortts](http://doortts.tistory.com) | 2008-10-14 화요일 오후 8:59\n\n--\n"
  },
  {
    "id": 55,
    "title": "DB를 어떻게 사용할 것인가? (How to use your DB)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1224752940000,
    "body": "> doortts | 2008-10-23 목요일 오후 6:9 | 이생각 저생각 | [원본](http://blog.doortts.com/55)\n\n데이터베이스(DB), 정확히는 데이터베이스 매니지먼트 시스템(DBMS)는 현대 자료구조 시스템의 가장 활성화된 형태이다. 그리고 한가지 일만 잘하도록 만든다(Do the best thing you can do) 라는 원칙에 따라 DBMS는 n-tier 구조에서 데이터부분을 책임지는 핵심 요소로 꾸준히 발전되어 왔다.\n\n[![zrclip_001n32c9f7bd.png](/files/21583)})](http://farm2.static.flickr.com/1185/525820504_2409a11a8b_b.jpg)\n\n\n정말 많은 발전을 이루었다. DBMS를 이용해서 할 수 있는 일들이 정말 다양해 졌다. C도 집어삼키고(Pro*C), JAVA도 집어삼켰다. 작성할 수 있는 쿼리(Query)도 버전이 늘어가면서 점점 늘어나고 있다. 예전에는 어렵게 코딩해야 했던 기능들이 내장 함수 한 두개면 한방에 해결되는 사례도 적잖이 있다.\n\n이를테면 어떠한 학생이 있고, 이 학생의 기말성적보다 바로 윗 성적의 학생, 아랫성적의 학생의 몇가지 정보들을 찾고자 하는 경우가 있다고 치자. 예전 같으면 다양한 방식이 시도될 수 있었겠지만, 현재 O모사 DBMS의 경우 lead, lad 라는 함수를 사용하면 sql 문장 하나로 처리가 가능하다. (이정도면, 글자 잘라내기 치환하기 류의 소극적 처리는 언급할 필요도 없다고 본다)\n\n[http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions001.htm#i88893](http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions001.htm#i88893)\n\n위 링크는 유저 정의 함수와 패키지로 제공하는 기능를 제외한 일반 함수의 목록이며, 개인적으로 230개 까지 세다가 그만두었다. 외운다고 외워질 문제의 수준이 아니다.\n\n어디, 비단 이뿐이겠는가?\n\n벤더별 차이는 있지만, DBMS의 발전된 내장 기능을 쓰면 뽑아내기 어려운 자료형태가 손쉽게 나온다.\n\n정말 좋다. 그리고 DBMS을 쓰면 쓸수록, SQL를 쓰면 쓸수록 그 놀라운 기능에 감탄을 하게 된다.\n\n아!\n\n**그런데, 안타깝게도 비극은 거기에서 출발한다.**\n\nDBMS의 놀라운 기능들, 특히 자료를 뽑아내는 형태의 업무에 있어서 그 막강한 내장 기능들을 자주 사용하다 보면, 다크포스에 빠진 스타워즈의 아나킨 스카이워커처럼 되버리기 쉽다. (뭔소리니냐 이건?-_-)\n\n![zrclip_005p66d2223d.png](/files/21585)})\n\n\n(어디까지나 주관적이지만) **SW개발에 있어서 가장 흔하고 가장 강력한 커플링은 SQL에서 온다고 본다.**\n\n소스레벨의 커플링은 고작해봐야, 클래스 몇개, 변수 몇개 수준이지만, SQL에서 오는 커플링은 최악의 경우 서버 박스가 왔다 갔다 하게 만드는 수준이기 때문이다. DBMS 내장 기능을 써대면 써댈수록 해당 DBMS를 벗어나기 어렵게 만든다. 가끔씩 개발좀 했다 싶은 분들, 특히나 평소에 쿼리좀 뱉었다 싶은 분들 중에\n\n'이거 XX DBMS에선 지원되는 쿼리인데, YY DBMS에선 지원이 안되네. 역시 꼬졌...'\n\n식으로 이야기 하는 걸 보곤 한다.\n\n1/3 정도만 맞다고 생각한다.\n\n쓸수 있는데 안쓰는 거랑, 쓸수 없어서 못쓰는 거랑의 차이가 그 1/3이다.\n\n**약간 딴 얘길 해보자.**\n\nANSI SQL이라는게 있다. (버전에 따라 다르지만, 여기에선 [SQL:1999](http://certcities.com/editorial/columns/story.asp?EditorialsID=106)를 기준으로 삼기로 한다)\n\nSQL문을 표준화 해서 사용하기 위해서 ANSI에서 만들었다. 한, 10년 되었는데, O모사 DBMS가 가장 지원이 늦었다.\n\n왤까?\n\n여러가지가 이유가 있겠지만, (설마 기술력이 딸려서? No way!!)\n\n시장 점유율이 가장높은 O라클 입장에선 개발자들과 강력한 커플링을 형성하고 있는데, 굳이 표준구문 지원해서 이전을 쉽게 만들 필요가 전.혀 없는거다. 오히려 점점더 하드코어하고도 중독성 있는 방향으로 진행했다. (오라클 지원 함수중 analytic function 시리즈를 보라!)\n\n미친듯이 객체지향을 공부한 듯한 포스의 SW아키텍트와 또 잘하는진 모르겠지만 좌우당간 모시기 힘들었다는 모델러들을 데려다가 개발을 했는데, 이상하게 다양한 재사용이 힘든경우가 많다. 모르긴 몰라도, 그 중 으뜸은 DBMS 관련쪽이라고 본다. DBMS 바꾸는 작업을 엄두내는 곳은, 프로젝트가 마왕의 소굴이라 도저히 안되겠다 싶어 용자들을 불러 모은 곳 정도라고 본다.\n\n하여튼 커플링은 나쁘고 DB커플링은 한층 더 나쁘다!\n\n![zrclip_002p2fa416de.png](/files/21582)})\n\n\n또 다른 얘길 하나 더 해보자.\n\n개발자들도 바보가 아니다. 지금 내가 말한 내용이 지구상에서 처음으로 하는 이야기일리가 없잖은가?\n\n**Oh, Really Man? ORM ?**\n\nDBMS 커플링은 내가 다 없애 주지! 하면서 나온게 [ORM(Object-Relational Mapper)](http://en.wikipedia.org/wiki/Object-relational_mapping)라고 불리는 녀석이다.\n\nDBMS는 신경쓰지마. 내가 다 해줄께. 대신에 넌 Entity 모델에만 신경써!\n\n어떤 의미로 끝내주는 개념이다.\n\n하지만 그건 외국얘기고, 우리나라에선 아직은 활용이 미미하다. 그리고 앞으로도 당분간은 미미할 예정이다.\n\n- 첫째, 기술자체가 낯설다.\n\n일이 빡세서 공부할 시간이 없다는 가슴아픈 사연을 필두로하는 다양한 이유로 배우기 어려워하고 있다.\n\n- 둘째, DBMS에 종속적인 쿼리로 성능을 쥐어짜내는 형태의 SQL 개발에 익숙해진 DBA, 개발자들이 보기엔 문제가 있어 보인다.\n\n- 셋째, 유지보수에도 해당 기술에 대한 이해자가 없으면, 뒷감당이 안된다.\n\n뭐, 그 외에도 자세히 들어가면 자잘하게 많겠지만, 그런거 얘기 하는 자린 아니니까 이쯤하자.\n\n**정리하자면 DBMS 커플링을 줄이기 위해서 ORM 을 쓰자!** 도 현재는 답이 아니라는 거다.\n\n그럼 방법은?\n\n자, 이제부터 내가 하고자 하는 내용이다.\n\n**DB를 어떻게 사용할 것인가? (How to use your DB)**\n\n그럴 듯한 제목에 비해 사실 정확한 답은 없다. 대신 개발자가 지키면 보답을 받을 수 있는 원칙은 있다.\n\n여기에서 몇 가지만 소개해 본다.\n\n| \n\n**1\\. DBMS는 단지 데이터가 저장되어있는 Persistence BOX라고 생각한다.**\n\n다양한 기능을 지원한다고 해서 '유후! 옳다쿠나!!' 하고 쓰면 곤란하다. CRUD용 BOX라고 생각하자. 이건 머리속에 넣는 컨셉으로 개발의 방향을 일정하게 유지시킬 수 있게 해준다.\n\n**2\\. 최대한 간결하게 쿼리문(SQL)을 짠다.**\n\n쉬운 쿼리가 좋은 쿼리다. 다른 개발자의 이해도 쉽게 만들고, 튜닝도 쉽게 만들어 준다. 이건 절대 법칙에 가깝다. 오해의 소지가 있는 말이지만, 당신이 쓰는 메일이 당신 것이 아닌것처럼, 당신이 작성하는 소스도 당신을 위한 것이 아니라는 생각을 갖는게 좋다.\n\n**3\\. SQL로 비즈니스 로직을 구현하려 들지 말자.**\n\n가끔보면 교묘한 SQL로 비즈니스 요구사항을 해결해서는 '후훗!' 하고 있는 걸 보는데, 부디 다시 한번 잘 생각해 보기 바란다. MVC 모델이란게 왜 나왔는지를 말이다. (실제로 분기문과 함수가 천상의 하모니를 이루어서 SQL 하나가 A4 6장 분량을 넘어서는 걸 본적이 있다. 짠 사람은 이미 인간 한계선을 돌파했다고 보는데,결국 수정도 튜닝도 저 하늘 멀리 머나먼 곳으로 가버렸다. - 새로 다시 짰다)\n\n |\n\n이 외에도 더 막 생각날려고 하는데, 접기로 한다. 위, 세가지만 지키면서 DB를 다뤄도, 품질이 높아지고, 미래에 대한 대비가 가능해 진다. 아주 기초적인 원칙인데, 놀라운 성과가 나올수 있다.\n\n희안한건, 기술이 발달하다 보면, 다양하고 놀라운 기교로 점철되다가 어느 순간엔가는 다시 소박한 모습이 되어서는 최선이 무엇인지에 대해 다시 생각해 보게 만드는 현상이 있다.\n\n무예를 닦으면 닦을 수록 동작이 간결해 진다던가, JAVA진형의 POJO로의 귀환이라던가 하는 식으로 말이다. (비약의 간극이 너무 컷다면 양해를:)\n\n![zrclip_003n225a207c.png](/files/21584)})\n\n\n어쨌든,\n\n기교를 접고 간결함을 추구하며, 남을 생각한다...라는 건\n\n굳이 개발이 아니더라도, 덕목으로 삼을만 하지 않은가?\n\n뭐, 아님 말고!\n\nPS. ORM 에 관심있으신 분은 [http://wiki.javajigi.net/pages/viewpage.action?pageId=5924](http://wiki.javajigi.net/pages/viewpage.action?pageId=5924) 에도 한번 가보심이. (^_^);\n\n#### Comments\n\n재미있게 잘 읽었습니다. 개발을 하다보면 데이터에 초점이 맞춰지다보면 결국 DB로 가게되는데,  위에 소개한 몇가지 원칙이 유용할 것 같네요. simplity는 개발뿐 아니라 삶자체에 적응하면 좋은 것 같아요. 복잡한 것보다 간단한게 좋잖아요.. 히힛.\n\n [namo](http://namoda.springnote.com/) | 2011-07-14 목요일 오전 9:45\n\n--\n",
    "attachments": [
      {
        "id": 21582,
        "name": "zrclip_002p2fa416de.png",
        "hash": "056552128a9a3fe75301e8e5ee79d2db1b337417",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 250857,
        "containerId": "12230"
      },
      {
        "id": 21583,
        "name": "zrclip_001n32c9f7bd.png",
        "hash": "7ee9d8fa5936adb8b9916c6913bfec0c68db4244",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 198930,
        "containerId": "12230"
      },
      {
        "id": 21584,
        "name": "zrclip_003n225a207c.png",
        "hash": "0d22ed474919ca99fcaff8f072b5a30735ea7c5c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 274968,
        "containerId": "12230"
      },
      {
        "id": 21585,
        "name": "zrclip_005p66d2223d.png",
        "hash": "2df778868fa976bf6bff5755a368fcdabf15a24d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 317262,
        "containerId": "12230"
      }
    ]
  },
  {
    "id": 56,
    "title": "Role Model들이 간과하기 쉬운 한가지 조건",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1225693221000,
    "body": "> doortts | 2008-11-03 월요일 오후 3:20 | 이생각 저생각 | [원본](http://blog.doortts.com/56)\n\nIT 업계란게 참 묘합니다.\n\n크게 돈 버는 사람은 적은데도 뛰어드는 사람이 많고,\n\n밤을 새면서 일해도 즐거워 하는 사람도 많습니다.\n\n**\"새로운 것을 배우고 만들어 간다, 그와 함께 성장해 간다\"**\n\n라는 인간의 원초적인 욕망에 기여하는 경우가 많기 때문입니다.\n\n어쩌면 욕심을 내면 낸 만큼 성장할 수 있는 길이 무궁무진한 곳일지도 모르겠습니다.\n\n어쩌다보니 기술적으로 뛰어난 사람들을 적잖이 보게 됩니다.\n\n나이고하를 불문하고 뛰어난 사람들이 많습니다.\n\n열심히 노력하는 사람들도 많고요.\n\n그런데,\n\n어디까지나 개인적인 느낌이겠지만\n\n참 안타까운 SW 전문가(혹은 지망자)들의 유형이 하나 있습니다.\n\n**다들 열심히 공부하지 않고, 배우려 하지 않는다**며 다른 사람들, 보통은 익명의 다수를 향해 화살을 날리는 사람들이 그 부류입니다. **공부 안한다, 영어문서 안본다, 대충 일 끝내기에만 바쁜게 한심해 보인다**...며 심하게 질타합니다.\n\n하지만, 많은 사람들이 질타로만 끝냅니다.\n\n[![zrclip_004p3cd3ab68.png](/files/21586)})](http://www.flickr.com/photos/leonhuang/208093933/)\n\n\n우리 사회는 강자가 약자를 무시하는 경향이 은연중에 넓게 퍼져있습니다.\n\n부자는 약자에게 노력하지 않아서 그런거라며 나무라고,\n\n일등은 순위권 밖의 사람들에게 나는 너희들이 놀때 노력했노라 하며 이야기 하고,\n\n지식이 뛰어난 사람은 다들 스스로 배우려 하지 않는게 한심하다 이야기 합니다.\n\n맞는 이야기도 많지만, 때로는\n\n그런 모습이 겸양을 가장한 자신에 대한 으쓱임의 한 형태라고 보일때가 있습니다.\n\n\"나는 이러저러하게 했다. 처음부터 쉽지 않았지만 이러저러 했기때문에 이렇게 말할 수 있다.\" 라는 식으로 말입니다.\n\n배려가 부족합니다.\n\n**역량을 갖추고, 능력이 좋고, 가진게 많다면,**\n\n**그 다음에 필요한건 배려라고 생각합니다.**\n\n[![zrclip_002n7e42c62a.png](/files/21587)})](http://www.flickr.com/photos/waynemethod/72038173/)\n\n포커스를 줄이겠습니다.\n\n사람들이 공부를 안한다고요?\n\n그게 악영향을 끼친다 생각되면 먼저 한 당신이 알려주세요.\n\n혹, 영어 문서를 봤는데 좋다 생각되면, 볼 의지가 있는 사람에게 주세요.\n\n그리고 이건 정말 다들 봐야한다 생각이 들면, 번역이나 요약을 해서 필요한 사람에게 주세요.\n\n바쁘다고요? 귀찮게 그걸 어떻게 하냐고요?\n\n그럼, 1:1 로, 1:n 으로라도 직접 알려주세요.\n\n시간이 없고, 장소가 없다고요?\n\n**그래서 못하겠다면, 그럼 다른 이를 그런식으로 비난하지 마세요.**\n\n당신의 그 변명 처럼, 다른 사람도 다들 사연이 다릅니다.\n\n돈이든 지식이든 능력이든, 가진 사람은 가지지 못한사람에게 우쭐한 우월감을 가지거나, 그걸 포장한 한탄의 표현을 나타내기란 참 쉽습니다.\n\n부디 나눠 주세요.\n\n안그래도 능력없고, 가지지 못하고, 배우지 못한 사람에게 거친 돌 같은 질타는 더 힘들어 질 수 있습니다.\n\n**그게 아니라 본인은, 생업에 시달리면서도 열심히 노력하는 거라고요?**\n\n구별하는 방법이 있습니다.\n\n(인터넷에 글올리는게 생업은 아니라는 가정하에서)\n\n**낮에 10줄 넘는 글 2개 이상을 올리는 날이**\n\n**일주일에 2일 이상 이라면 당신은 능력을 떠나 이미 충분히 축복받은 겁니다.**\n\n그러면 타인을 배려해 주세요.\n\n**쓴 소리는 부디 주변의 친한 사람들에게 하세요.**\n\n생업이 끝나면 파김치가 되서는 집에가서 쉬기도 벅찬 사람들에겐 당신이 가진 열정과 축복과 노력을\n\n조금 더 나눠주세요.\n\n많은 사람들이 부러워 하는 당신의 그 무언가를요.\n\n그래서 좀 더 당신을 닮아야 겠다는 생각이 들도록 말입니다.\n\n그저, 행하지 못해 가르친다는 어떤 부끄러운 사람의 조그만 바램입니다.",
    "attachments": [
      {
        "id": 21586,
        "name": "zrclip_004p3cd3ab68.png",
        "hash": "d10170ac7db0ce9bab96264f026bb9e9e331d133",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 139251,
        "containerId": "12231"
      },
      {
        "id": 21587,
        "name": "zrclip_002n7e42c62a.png",
        "hash": "2771cd6eb0e436ed383b88302711d25feac0fac5",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 242421,
        "containerId": "12231"
      }
    ]
  },
  {
    "id": 57,
    "title": "이상한 경쟁",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1225932808000,
    "body": "> doortts | 2008-11-06 목요일 오전 9:53 | 이생각 저생각 | [원본](http://blog.doortts.com/57)\n\n이상한 경쟁.\n\n* 고등학생이라고 가정하고 읽습니다 *\n\n공부하다보면 우연히 혹은 노력으로 알게 되는 내용이 있다. 그리고 왠지 시험에 나올 것 같은데, 옆 짝꿍, 혹은 나와 경쟁관계에 있는 녀석은 '이걸 알까?' 싶은 내용일 때가 있다. 그러면 어떻게 하나?\n\n대부분이 취하는 방법은 혼자만 알고 끝내는거다.\n\n그런데 그 방식에는 중요한 것이 빠져있다. 옆 짝꿍과 경쟁하는데 경쟁의 목적이 반에서 1등이라면 말이 된다. 하지만, 그게 전국의 고3들과 경쟁하는 수능이라면 참 우스운 거다. 우선 내가 아는 지식이 정말 맞는지에 대한 최소한의 검증도 어렵고, 혹은 그것보다 더 나은 방법을 상대방, 혹은 반에 누군가가 알고 있을 수도 있기 때문이다.\n\n거의 쉽지는 않겠지만, 반에서 1등과 2등, 그리고 혹은 그 외 등수들이 자신만의 공부 비법이나 Know-how 를 공유하면 그들의 전국 석차는 다 같이 오를 가능성이 더 높아진다. 그게 심리적이든 지식적이든 서로에게 자극이 되고 공부가 되기 때문에 그렇다.\n\n그런데 현실은 어떤가?\n\n나만 알것 같은 짧은 공식하나에 우월감을 갖거나, 자신의 숨겨진 비기라고 생각하는 경우가 얼마나 많은가?\n\n사람의 심리란게 참 묘해서 하나를 내 놓으면 자신의 하나를 잃는 것만 같지만, 멀리보면 그렇지 않은 경우가 적지 않다. 그 유명한 **'돌맹이로 만든 스프'**라는 우화처럼, 내가 먼저 내어놓는 용기는 모두에게 필요한 마법의 돌이 될 수도 있다.\n\n[![zrclip_001n3a5e391a.png](/files/21588)})](http://www.flickr.com/photos/themotjuste/57778899/)\n\n#### Comments\n\n고등학생이라는 가정과 더불어 내신 반영이 사라지고 오로지 수능만으로 대학에 진학한다는 것이 전제되어야 하지 않을까요? 그리고 이런 이상한 경쟁을 조금이나마 개선시키기 위해서는 심리적 요소를 고려해 학생들의 평가 방식(상대평가 및 등수제 등)을 바꾸는 것이 선행되어야 하지 않을까요?\n\n 김은혜 | 2008-11-09 일요일 오전 3:37\n\n--\n\n아! 나의 실수가..\n\n고등학생 = 엔지니어\n반 = 소속팀\n수능 = 오픈마켓\n\n로 바꿔서 읽습니다.\n\nps. 이메일 주소좀 알려줘. 어째 아는 사람이 하나도 없는겨? (윤양도 모른다잖아)\n\n [doortts](http://doortts.tistory.com) | 2008-11-09 일요일 오후 4:9\n\n--\n",
    "attachments": [
      {
        "id": 21588,
        "name": "zrclip_001n3a5e391a.png",
        "hash": "ae584e71c1688840d9f7d3d9632f0c5a20fa810f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 404187,
        "containerId": "12232"
      }
    ]
  },
  {
    "id": 58,
    "title": "Maven 학습 중",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1226216824000,
    "body": "> doortts | 2008-11-09 일요일 오후 4:47 | Better SW Development | [원본](http://blog.doortts.com/58)\n\n[Maven](http://maven.apache.org/) 이라는 툴에 대해서 보고 있다.\n\n징글징글하게 많은 툴과 라이브러리들이 난무하는 자바진영에서 그래도 어느정도 영향력을 발휘하고 있는 Tool 인 것 같아, 보게 되었다.\n\n아직 학습중이지만, 뭐하는데 쓰는 거냐? 에 대해 간략히 이야기 한다면 build tool + project management tool 라고 할 수 있겠다. Project Management Tool 이라고 하니까 뭔가 대단해 보일 수 도 있지만, Focus 는 소스와 라이브러리 관리 + 단위테스트에 한정되어 있다.\n\n프로젝트 소스를\n\nMain 소스, Rsource, Test 의 3가지 커다란 카테고리로 나누고, 소스 빌드에 필요한 의존성이 있는 라이브러리들을 관린해 준다. 그 핵심에는 POM(Project Object Model)이라는 프로젝트 소스 관리 개념이 자리잡고 있다. 여기에 플러그 인 이라고 하는 개념과 함께 다양한 기능을 제공하고 있지만, Maven 의 저작자들은 Maven 을 빌드와 배포에 우선적으로 사용하길 권하고 있다. (우선 필요한 부분위주로 쓰고, 다양한 기능들은 천천히 알아가라는 뜻인것 같다.)\n\n자바 진영의 최고 Build 툴이라면 두말 할 것 없이 Ant 인데, Ant와 Maven 의 관계는 상호 경쟁적이라기 보다는 상호 보완적인 관계가 더 맞는것 같다. 물론 둘 다 같은 일을 할 수 있지만, 함께 쓰는게 더 나아 보인다.\n\nAnt 와 비교해 보면 Maven 의 독특한 특징이 보이는데, Ant가 바다와 같은 광활한 컨트롤이 가능하다면 Maven 은 COC(Convention Over Configuratoin)이라 컨셉을 바탕으로 보편적인 상식에 의한 설정의 최소화를 꾀한다. 따라서 세밀한 조정은 Ant가, 그리고 편하고 간단한 설정은 Maven 이 강점을 갖는다.\n\nAnt 로 빌드 + Deploy 스크립트를 짜 봤지만, 구조적으로 프로젝트 소스를 관리하려면, Initial Script를 짜는 시간도 적잖이 드는데다가, 지나면 지날 수록 ant 실행용 build.xml 의 크기와 복잡도가 만만찮게 변하게 된다. (뭐, 그 쯤 되면 make가 더 간단할지도.)\n\n아직 학습중이니까 여기까지만 쓰고 정리하자면\n\n=== Maven ===\n- 프로젝트 Build 및 소스한정 관리 툴\n- COC 를 이용한 간편한 설정지원\n- 의존관계를 설정함으로써 편리한 환경구성지원\n- 학습에 어느정도 기간이 필요함\n- ant가 하는 일을 할 순 있지만, 함께 쓰는게 더 좋을 듯 함\n- POM (Project Object Model)이라는 개념을 갖고 있으며 pom.xml 에 기술되어 있음\n- 적지 않은 오픈소스 프로젝트들에서 도입하고 있음\n\nPS.\n\n한영사전에는 뜻이 짧게 '전문가' 이렇게만 나오는데 영영사전에는 아래와 같이 나온다.\n\nA **maven** (also _mavin_) is a trusted expert in a particular field, who seeks to pass knowledge on to others.\n\n(뒷쪽 문장에 주목)\n\n그리고, 발음은 한영사전 기준으론 메이번, Oxford 영어 사전에는 메이븐으로 나온다. 메이븐이 맞지 싶다."
  },
  {
    "id": 59,
    "title": "Maven + m2eclipse 설치 하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1226414859000,
    "body": "> doortts | 2008-11-11 화요일 오후 11:47 | Better SW Development | [원본](http://blog.doortts.com/59)\n\nMaven + m2eclipse 설치 하기\n\nMaven 설치하기\n\n![zrclip_001n315983ce.png](/files/21617)})\n\n메이븐 사이트(maven.apache.org) 접속\n\n![zrclip_002p38aa0822.png](/files/21590)})\n\n![zrclip_003p135a31f6.png](/files/21589)})\n\n압축파일을 적당한 폴더에 푼다.\n\n![zrclip_007p6dc200c9.png](/files/21592)})\n\nPATH에 환경 변수로 JAVA_HOME과 M2_HOME 을 잡아준다.\n\n![zrclip_005p79348c18.png](/files/21593)})\n\n그 다음엔 PATH 에 %M2_HOME%\\bin 을 추가\n\ncmd 창에서 mvn -version 을 통해 확인한다.\n\n![zrclip_006n287ab6f8.png](/files/21591)})\n\n이제 테스트 프로젝트를 한 번 만들어 보자.\n\n적당한 디렉터리로 이동. (참고로 전 d:\\development 로 이동했습니다)\n\n![zrclip_031n78aa0cbd.png](/files/21613)})\n[http://maven.apache.org/guides/mini/guide-creating-archetypes.html](http://maven.apache.org/guides/mini/guide-creating-archetypes.html)\n\n프로젝트 생성 명령어의 축약형은 위와 같습니다. 전, 제 마음대로 아래와 같이 타이핑 하였습니다.\n\nmvn archetype:create -DgroupId=com.doortts.maventest -DartifactId=maventest\n\n![zrclip_030p77f8178d.png](/files/21603)})\n\n이후 필요한 파일들을 maven central repository 로 부터 내려 받습니다. (대략 100년쯤 걸립니다...)\n\n멍하니 있지 말고 남는 시간을 이용해 eclipse 용 플러그인 m2eclipse 를 설치해 봅니다.\n\nm2eclipse 설치하기\n\n![zrclip_009n7c8aab3e.png](/files/21594)})\n\n![zrclip_010n5e65c383.png](/files/21616)})\n\n다음 주소를 이클립스 업데이트 사이트로 등록해야 한다.\n\n[http://m2eclipse.sonatype.org/update/](http://m2eclipse.sonatype.org/update/)\n\n![zrclip_012n53080ac7.png](/files/21599)})\n\n![zrclip_013p463cb981.png](/files/21601)})\n\n![zrclip_015n8c381f9.png](/files/21595)})\n\n사이트가 추가되었으면 필요한 만큼 선택 후 Install 버튼 클릭. 이후 계속 진행.\n\n인스톨 완료 후 이클립스 재시작\n\n![zrclip_016n2cd30614.png](/files/21596)})\n\n경고 메시지 확인\n\n![zrclip_023p78b70f76.png](/files/21598)})\n\n이클립스 설정 선택\n\n![zrclip_019paf8ec5e.png](/files/21606)})\n\n필터에 jre 라고 타이핑\n\n![zrclip_022p331e0b23.png](/files/21605)})\n\n![zrclip_021n39642bbf.png](/files/21604)})\n\n디렉터리를 선택해서 JDK 가 설치된 곳을 선택하여 JRE 위치가 변경되는 것을 확인한다.\n\n![zrclip_027n67a02154.png](/files/21597)})\n\n바로가기를 만들어서 -vm %JAVA_HOME%\\bin\\ 를 대상에 추가\n\n다시 이클립스를 재 실행하여서 다른 경고 메시지가 없는지 확인한다.\n\n다시 이제 아까의 cmd 창을 보면 대략 완료 되었을 겁니다.\n\n![zrclip_028n6409f02.png](/files/21600)})\n\n![zrclip_029n55bc2094.png](/files/21607)})\n\npom.xml 도 열어보고, 하위 폴더로 이동해서 구조를 살펴봅니다.\n\n![zrclip_032n2e1ec4f3.png](/files/21602)})\n\n이클립스에서 프로젝트로 읽어 들일수 있도록 아래와 같이 타이핑 합니다.\n\n![zrclip_033p235872ff.png](/files/21615)})\n\n메이븐 기본 문법은 \"mvn 플러그인이름:목표\" 이며 각각 plugin과 goal 이라고 부릅니다. 플로그인 이름과 골 이름을 같이 쓰는건 해당 플러그인의 Default Action 을 의미합니다.\n\n![zrclip_034n175c398d.png](/files/21611)})\n\n다시 보면 이클립스에서 import 할 수 있도록 파일이 두 개 더 생긴걸 볼 수 있습니다.\n\n![zrclip_035p5447b371.png](/files/21610)})\n\n이클립스에서 Existing Projects into workspace 를 선택하고 Next\n\n![zrclip_037p2ab8fd67.png](/files/21608)})\n\nBrowse를 선택해서 좀전에 생긴 폴더를 선택하고 Finish !!\n\n![zrclip_038pc3b1fa0.png](/files/21614)})\n\n패키지 익스플로러에 정상적으로 생성된것을 확인하면 최종 완료 입니다!! (^_^)/",
    "attachments": [
      {
        "id": 21589,
        "name": "zrclip_003p135a31f6.png",
        "hash": "927b5c6e00a9491585952fb45281f3809d75fa3e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 18297,
        "containerId": "12234"
      },
      {
        "id": 21590,
        "name": "zrclip_002p38aa0822.png",
        "hash": "336e93642822771c9cd23c5cf1d00d85f76b0df2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 18126,
        "containerId": "12234"
      },
      {
        "id": 21591,
        "name": "zrclip_006n287ab6f8.png",
        "hash": "1948810d8d76903f9303877fd46a97783d561f79",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14649,
        "containerId": "12234"
      },
      {
        "id": 21592,
        "name": "zrclip_007p6dc200c9.png",
        "hash": "715323dfc5356d02a5e2784af94b5c86c56c7992",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15219,
        "containerId": "12234"
      },
      {
        "id": 21593,
        "name": "zrclip_005p79348c18.png",
        "hash": "179ece7fcb99d6d7c567f2629b4d6501082e705a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 12882,
        "containerId": "12234"
      },
      {
        "id": 21594,
        "name": "zrclip_009n7c8aab3e.png",
        "hash": "b59000091a5bc525c1343b7ee01404de7273c1c2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 17841,
        "containerId": "12234"
      },
      {
        "id": 21595,
        "name": "zrclip_015n8c381f9.png",
        "hash": "f0f8a26d91ea977b8f0eaf14bb0b7ab05582240b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15789,
        "containerId": "12234"
      },
      {
        "id": 21596,
        "name": "zrclip_016n2cd30614.png",
        "hash": "ef1b1320e6f178f6c7b5a410f7cbd3b1cb96ae57",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 23541,
        "containerId": "12234"
      },
      {
        "id": 21597,
        "name": "zrclip_027n67a02154.png",
        "hash": "75d5e179f24086b66af5a221d71cc60903223578",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 23712,
        "containerId": "12234"
      },
      {
        "id": 21598,
        "name": "zrclip_023p78b70f76.png",
        "hash": "b31632bad2532023f266cf943dea3103facecd32",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 12768,
        "containerId": "12234"
      },
      {
        "id": 21599,
        "name": "zrclip_012n53080ac7.png",
        "hash": "dd50aff7c597c570a036a4010db796b863f1fa8e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 16644,
        "containerId": "12234"
      },
      {
        "id": 21600,
        "name": "zrclip_028n6409f02.png",
        "hash": "3307a6d03b657521261f61a1a3796d452f8ae527",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 11286,
        "containerId": "12234"
      },
      {
        "id": 21601,
        "name": "zrclip_013p463cb981.png",
        "hash": "ad14bc047ebf64a7f81b9cc3369381078b207460",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 12711,
        "containerId": "12234"
      },
      {
        "id": 21602,
        "name": "zrclip_032n2e1ec4f3.png",
        "hash": "e9f4b81de28b6dc53cf15c90aec6c1e52e3ee853",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 8949,
        "containerId": "12234"
      },
      {
        "id": 21603,
        "name": "zrclip_030p77f8178d.png",
        "hash": "f6ea63e3918cf855e1d830f889ad116ce3e54d7e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 8778,
        "containerId": "12234"
      },
      {
        "id": 21604,
        "name": "zrclip_021n39642bbf.png",
        "hash": "6d69ef7d90c0e2a0bc5b5f5584db0cb1d22a9985",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 36765,
        "containerId": "12234"
      },
      {
        "id": 21605,
        "name": "zrclip_022p331e0b23.png",
        "hash": "6f2dcab3db63df738105e4c11de6b5812557de23",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 18126,
        "containerId": "12234"
      },
      {
        "id": 21606,
        "name": "zrclip_019paf8ec5e.png",
        "hash": "c1920fb1eb18990e28182eb6134ec78024ec0484",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14136,
        "containerId": "12234"
      },
      {
        "id": 21607,
        "name": "zrclip_029n55bc2094.png",
        "hash": "5342076bda507a63b1e1b5423b0c5af507c5b4fb",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 21318,
        "containerId": "12234"
      },
      {
        "id": 21608,
        "name": "zrclip_037p2ab8fd67.png",
        "hash": "1853af5e21cd0b86e10dc0b61893b315de19709b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 21945,
        "containerId": "12234"
      },
      {
        "id": 21610,
        "name": "zrclip_035p5447b371.png",
        "hash": "30b8e12c457e3fb1c6021f9fde2efa0356ab9c66",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 13851,
        "containerId": "12234"
      },
      {
        "id": 21611,
        "name": "zrclip_034n175c398d.png",
        "hash": "1d448f7d284f880a56fed8970a874ff160221872",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15504,
        "containerId": "12234"
      },
      {
        "id": 21613,
        "name": "zrclip_031n78aa0cbd.png",
        "hash": "7e25d2b57d4629175ae747600085cd6053cb7893",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 1938,
        "containerId": "12234"
      },
      {
        "id": 21614,
        "name": "zrclip_038pc3b1fa0.png",
        "hash": "b84697b0867581610fd0b454d1bceba57b051f6b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 5871,
        "containerId": "12234"
      },
      {
        "id": 21615,
        "name": "zrclip_033p235872ff.png",
        "hash": "9c03c326cf4ce3d493c928cf8d28be5db738b5f5",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 1140,
        "containerId": "12234"
      },
      {
        "id": 21616,
        "name": "zrclip_010n5e65c383.png",
        "hash": "d1abd03cf7a8b5faf256da486ca22550c6114756",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 5814,
        "containerId": "12234"
      },
      {
        "id": 21617,
        "name": "zrclip_001n315983ce.png",
        "hash": "ce04eaa5ed5b39bd2b9ee2ce9d9d53d0b946d978",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 78489,
        "containerId": "12234"
      }
    ]
  },
  {
    "id": 60,
    "title": "썬테크 블로그는 \"테크 블로그\" 인가?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1226455740000,
    "body": "> doortts | 2008-11-12 수요일 오전 11:10 | 이생각 저생각 | [원본](http://blog.doortts.com/60)\n\n어디에 있긴 있는데 내가 잘 모르걸 수도 있지만,\n\n어쨌든 외국 사이트에서만 보던,\n특정 주제에 대해 다양한 시각을 보여주는 메타블로그를\n\n우리나라 버전으론 아직 못 봤었다.\n\n그 와중에 한국 썬에서 테크 블로그([http://www.sdnkorea.com](http://www.sdnkorea.com/)) 라는 것을 만들었다는 것에 나름 기대를 했었다.\n\n하지만, 현재 모습은 어떠한가?\n\n**썬테크 블로그는 \"테크 블로그\" 인가? 아니면, 그저 여러명의 블로거들의 글이 포스팅 되는 단순 RSS 리더인가?**\n\n현재 썬테크 블로그엔\n\n그냥 개개인 신변잡기들의 내용이 우후죽순으로 올라오고 있다. 심지어는 글도 없는 단지 \"썬블로그 가입\" 만 들어있는 글까지...\n\n썬의 의도가 무언지 모르겠다. 혹시 내가 잘못 생각하고 있었던 건지도 모르겠다.\n\n![zrclip_002n3b7b2d65.png](/files/21609)})\n\n![zrclip_003n23f7b0c.png](/files/21618)})\n\n![zrclip_005n5231220d.png](/files/21612)})\n\n..... 몇 개 더 캡쳐했다가 혹 싸우자는 이야기인줄 알까봐 지웠다. (...)\n\n삭막한 기술얘기만 하는걸 바란건 아니었지만,\n\n어쨌든 실망스럽다.\n\n이럴거면 뭣하러 이런걸 만들었는가?\n\n그냥 google rss 나 hanrss 로 관심있는 블로그를 구독해 보는게 더 낫다고 생각된다.\n\n쓴소리 해봤자 돌아오는 건 좋은 반응이 아닌건 알지만, 좋은 취지가 바래져서는 그대로 묻혀질까 하는 기우에 어렵게 올려본다.\n\n#### Comments\n\n안녕하세요, 한국 썬 마케팅 팀의 박안나라고 합니다.  \n\n이메일을 주셔서 답신을 드렸습니다만, 포스트에도 답변을 드립니다. 메일로 말씀드렸듯이 큰 컨셉은 잡고 나가나 이후에 반응에 대해서는 예측하기 쉽지 않은 부분이 많아 적절히 대처를 오히려 전략으로 생각하며 운영하고 있고, 그 반응속에서도 또 고객인 개발자를 더 알아갈수 있으리라 생각하고 있습니다. \n혹 실망되는 부분이 있더라도 응원하는 마음으로 지켜봐주세요. 좋은 아이디어가 있으면 부탁드리구요. \n시간이 지날수록 나은 모습 보여드리겠습니다.\n\n문의사항이 있으면 알려주시기 바랍니다 (anna.park@sun.com) \n감사합니다\n\n박안나 드림\n\n [박안나](http://www.parkanna.com) | 2008-11-12 수요일 오후 2:14\n\n--\n\n저도 마찬가지로 답 메일을 드리고 나니 여기에도 글을 남겨주셨네요.\n\n--- 이하 메일 내용 ---\n\n빠른 답변 감사합니다.\n\n좀 더 차분한 마음으로 기대하고 있겠습니다.\n\n애정이 없다면 뭣하러 남의 기업 일에 메일까지 썼겠습니까?\n\n그럼, 좋은 하루 되세요. (^_^)/\n\n감사합니다.\n\n [doortts](http://doortts.tistory.com) | 2008-11-12 수요일 오후 2:31\n\n--\n",
    "attachments": [
      {
        "id": 21609,
        "name": "zrclip_002n3b7b2d65.png",
        "hash": "082e466176ad6a3beaffe64f3a9f2a64c8783936",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 13110,
        "containerId": "12235"
      },
      {
        "id": 21612,
        "name": "zrclip_005n5231220d.png",
        "hash": "facab7c90faa0348a287ba9e79cca64bc7b67712",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2565,
        "containerId": "12235"
      },
      {
        "id": 21618,
        "name": "zrclip_003n23f7b0c.png",
        "hash": "c41d5713f1d916727df92730db5c771744ca48ad",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 969,
        "containerId": "12235"
      }
    ]
  },
  {
    "id": 61,
    "title": "개인적인 편견 하나",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1226822830000,
    "body": "> doortts | 2008-11-16 일요일 오후 5:7 | 이생각 저생각 | [원본](http://blog.doortts.com/61)\n\nIT 업계에서 만 지내다 보니 다른 업계는 어떨지 모르겠자만,\n어쨌든 개인적으로 갖고 있는 **편견** 중 하나인...\n\n[![zrclip_006p3d8024c2.png](/files/21619)})](http://www.flickr.com/photos/ricepuppy/2798852391/)\n\n**회의를 많이(혹은 오래) 하는 관리자의 특징!**\n\n- 회의 주제에 대한 소신이나 자신이 없다.\n\n- 회의를 통해 해당 주제를 배우려는 경향이 있다.\n\n- 단어 자체와 대화의 논리력에 집중한다.\n\n- 권한 위임은 최소화 하고 책임 위임은 최대화 한다.\n\n- 즉흥적인 아이디어가 많다.\n\n- 가능성보다 결함에 대해 이야기한다.\n\n- 결론을 쉽게 내지 않는다.\n\n- 바쁘거나 한가한 이유는 회의가 많거나 적어서이다.\n\n- '브레인 스토밍'이라는 말을 좋아한다.\n\n- '기술'은 중요한 게 아니라고 믿는다.\n\n.\n.\n.\n\n뭐, 다 장단점은 있는거겠죠?",
    "attachments": [
      {
        "id": 21619,
        "name": "zrclip_006p3d8024c2.png",
        "hash": "f4e5d75e8201cbb7e4294112b63f123f6a53af3b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 303411,
        "containerId": "12236"
      }
    ]
  },
  {
    "id": 63,
    "title": "약장사? 책장사?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1227508303000,
    "body": "> doortts | 2008-11-24 월요일 오후 3:31 | Books | [원본](http://blog.doortts.com/63)\n\n오늘 한 일.\n\n**--> 약(=책) 팔았음. (-,-);;;**\n\n속으로 좀 찔리고 있음. (???)\n...\n..\n\n아래 글은 사내 팀 게시판에 올린 글로 팀원들 책 읽게 하기 위함이 목적인지라, 책 소개에 다소 약(...)을 쳤습니다.\n따라서 부분에 따라 실제 책 내용이 소개(...)와 다를 수도 있음을 미리 밝힙니다.\n참고로, 이미지 출처는 강컴입니다.\n\n------------------------------------------------------\n\n안녕하세요? 도서 담당입니다.\n아래와 같은 도서를 구매할 예정입니다.\n총 5 권 입니다.\n\n단순 기술서는 배제하였습니다.\n그럼, 좋은 책과 함께, 충전의 시간을 가지셨으면 합니다.\n\n**[요구사항 관련]**\n\n사용자 스토리: 고객 중심의 요구사항 기법\n![](http://kangcom.com/b_pic/200602140030.gif)\n전반적인 주제는 '소프트웨어 요구사항은 의사소통의 문제'라는 걸 전제로 '고객의 마음을 어떻게 알아낼까? ' 에 대한 이야기를 하고 있습니다. 책도 두껍지 않아서 쉽게 읽으실 수 있는 책이라 생각됩니다.\n\n흔히들 말하시죠, 내새끼도 내 맘같지 않은데, 고객은 무신...\n\n그렇다고 포기할 순 없잖습니까?\n어떻게 하면 조금이라도 더 체계적이고 확실하게 요구사항을 뽑아낼 수 있을지 고민해 볼 수 있는 좋은 책이라고 합니다.\n\n참고 : [http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200602140030](http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200602140030) \n\n**[테스트 관련]**\n\nTesters Insight : winter 2008\n![](http://kangcom.com/b_pic/200810280003.gif)\n국/내외 전문가의 글이 실려 있는 실전적인 내용의 테스트 기고지 입니다.\n\n목차.\n1\\. 정부의 컨설팅 프로젝트 지원 '전문가 진단으로 중소기업의 테스트 역량 강화한다'-KIPA이혁재\n2\\. 탐색적 테스팅의 가치 '실용적-현실적 테스팅 접근법' - 애자일 컨설팅 김창준\n3\\. 해외 테스팅 활동과 국내 현황 'IT강국을 넘어 테스팅 강국 꿈꾼다 - LG 전자 한무희\n...\n...\n\n15\\. '노키아를 통해 본 SW품질과 테스트 프로세스' - LG CNS 정현중\n...\n\n참고 : [http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200810280003](http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200810280003) \n\n**[프로젝트 관리]**\n소프트웨어 프로젝트에서의 리스크 관리 - 원제 : Waltzing With Bears\n![](http://kangcom.com/b_pic/200409040001.gif)\n\n처음엔, 분석이 안된다고 했습니다.\n그래서 분석에 집중했더니, 이젠 설계가 잘 안된다고 하네요.\n자, 그럼 다음은 뭘까요?\n\n개발?\n개발자들이 개발을 못한다는 소리야 뭐 어제 오늘이 아니잖아요.\n\n어쩌면, 다음엔, '리스크 관리가 안된다'고 할지도 모르겠습니다.\n\n참고 : [http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200409040001](http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200810280003)\n\nps. 그럼 '리스크' 다음은? 자, 한 사이클 끝났으니까, 처음부터 다시 돌아야 겠죠~ (^_^); 농담같은 농담입니다.ㅎㅎ\n\n**[방법론 관련]**\n\n엔터프라이즈급 애자일 방법론\n![](http://kangcom.com/l_pic/200809220239.gif)\n프로젝트 규모 확장에 따른 애자일 기법과 사례가 들어 있는 책입니다. 소규모 프로젝트에 적절하다고 생각되는 애자일 방법론을 규모가 큰 프로젝트에선 어떻게 적용할 것인지에 대한 내용이 들어 있습니다.\n\n자사의 애자일 방법론 발전 방향과 비교해 볼 수 있지 않을까 생각됩니다.\n\n원제는 : \"Scaling Software Agility\", Best Practices for Large Enterprises\n\n참고 : [http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200809220239](http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200809220239) \n\n**[DC 개발자 양성 관련]**\n\n프로그래밍 심리학\n![](http://kangcom.com/b_pic/200712140017.gif)\n\n아, 이거 뭐야? 개발 테크닉 이야기 아냐? 하면서 눈을 찌푸리시려 한다면, 경기도 오산입니다. (죄송)\n이책은 나온지 40년이 넘은 책입니다만, 여전히 고전이라 불리며 읽히는 책으로\n\n프로그래머와 팀, 그리고 프로그램을 어떻게 다룰 것인가에 대한 이야기를 합니다.\n\n주요 내용으로는\n\n-개인의 성격이 프로그래밍에 끼치는 영향\n-프로그래머의 지능과 문제 해결 능력\n-동기와 훈련, 경험이 프로그래밍에 끼치는 영향\n-큰 규모의 프로젝트에서 일어나는 공통 사회 문제들\n-공식 조직과 비공식 조직\n\n등등을 다룹니다.\n\n아마 DC 관련 조직 관리자분들이 읽으셔야 하는게 아닐까 생각이 드네요.\n\n---------------------------------------\n그럼 다른 이견 없으시면 본 책을 구매하겠습니다.\n언제나 팀원들의 발전과 팀을 생각하는 도서담당 이었습니다.\n감사합니다.\n\n#### Comments\n\n프로그래밍 심리학... 저 어려운책을...\n\n [호야지기](http://hoyajigi.com) | 2008-12-29 월요일 오후 5:31\n\n--\n"
  },
  {
    "id": 64,
    "title": "간편한 Subversion server 툴 visualsvn server",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1227757833000,
    "body": "> doortts | 2008-11-27 목요일 오후 12:50 | Better SW Development | [원본](http://blog.doortts.com/64)\n\n팀내에서 간소히 사용할 SCM 툴로 subversion 을 물망에 놓고\n\ntigris.org 사이트에서 다운 받으려고 보니, 아래와 같은 VisualSVN server 라는 툴이 링크중에 있더군요.\n\n놀랍게도 apache + subversion server + 관리콘솔 까지 한 방에 해결되더군요.\n\nhttps 도 지원하고, 게다가 사용법은 얼마나 쉽던지요.\n\n[http://www.visualsvn.com/](http://www.visualsvn.com/)\n\n![zrclip_001p4dfcf77f.png](/files/21621)})\n\n![manager[1].png]([##_ATTACH_PATH_##]/kk8.png)\n\n![zrclip_002n6aaaebf5.png](/files/21622)})\n\n그리고 **무료**입니다.\n\n그런데 클라이언트들(subclipse, tortoise)과 연동 테스트를 마쳐보고, 신나서 팀 서버에 설치하려고 보니 설치가 안되더군요.\n\n**이유는?**\n\n서버가 windows 2000 server 버전인겁니다. 위 툴은 2003부터 지원... -_-;;\n\n인스톨시작전에 체크해서 설치를 막아버립니다. 굳이 막을 필요까지는 없었는데, 내부 사정이야 모르죠.\n\ncollabnet 의 오리지날 subversion server 는 설치가 되는데, 팀내 관리할 분에게 커맨드를 배우라고 할 수도 없는 형편인지라, 조금 난감해 지더군요.\n\n팀서버가 windows 2000인것도 조금 아쉽고, windows 2000을 지원하지 않는 것도 아쉽습니다만, 어쩔수 있겠습니까?\n\n어쨌든 windows 환경에서 쉽게 사용하기에는 꽤 괜찮은 툴인것 같습니다.\n\n물론, 숨겨진 버그같은게 없다는 가정하에서 말입니다만.\n\nps. trac 하고 연동도 쉽게 되는군요.\n\n[http://www.visualsvn.com/server/trac/](http://www.visualsvn.com/server/trac/)\n\n![zrclip_003n147b2c07.png](/files/21620)})\n\n#### Comments\n\nVisualSVN.\n이거 프리 아닌것같아요 ^^\n다운로드페이지 가보니까\n위에 30일 사용가능한 라이센스라고 써있던데요 ^^;;;\n\n [GNUNIX](http://www.gnunix.co.kr) | 2009-03-17 화요일 오전 11:42\n\n--\n\n안녕하세요? VisualSVN은 이야기 주신데로 Free가 아니고요, 여기 소개한 VisualSvn Server 는 Free입니다. :) 의견 주셔서 감사합니다.\n\n [doortts](http://blog.doortts.com) | 2009-03-17 화요일 오후 4:22\n\n--\n",
    "attachments": [
      {
        "id": 21620,
        "name": "zrclip_003n147b2c07.png",
        "hash": "051a33e5d889721bdcbfa54eeb56c685d986d46c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 11343,
        "containerId": "12238"
      },
      {
        "id": 21621,
        "name": "zrclip_001p4dfcf77f.png",
        "hash": "f24c88b636bfe514ad32fec971a9b084837d7d00",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 28329,
        "containerId": "12238"
      },
      {
        "id": 21622,
        "name": "zrclip_002n6aaaebf5.png",
        "hash": "1d8c8a549b2299ffc81fa81b0d22b8fc3324e87c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 3819,
        "containerId": "12238"
      },
      {
        "id": 21623,
        "name": "manager[1].png",
        "hash": "9f450b589f6549438fa2329137acc3f2384e76e6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 25194,
        "containerId": "12238"
      }
    ]
  },
  {
    "id": 65,
    "title": "생일 역설 (Birthday Paradox)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1228663260000,
    "body": "> doortts | 2008-12-08 월요일 오전 12:21 | 이생각 저생각 | [원본](http://blog.doortts.com/65)\n\n누구를 만났는데, 공교롭게도 생일이 같은 사람인 경우가 있습니다.\n\n참, 신기합니다.\n\n전, 생일이 특이한데 1월1일 입니다. 그리고 저랑 생일이 같은 사람을 1명 알고 있습니다. 여자분인데, 처음에 생일이 서로 같은걸 알고는 **'아! 운명인가 보다!'** 라는 생각은 안했습니다.. (..뭔소린지?-_-)\n\n처음엔 굉장히 신기했는데, 생각해 보면 1년은 365일인지라 쉽게 생가각해서 우리나라 인구를 천 만명쯤 확 줄여서 3650만명이라고 보면, 생일 같은 사람이 대략 10만명은 있는건데요, 이러면 좀 느낌이 다르죠.\n\n어쨌든, 그래도 생일이 같은 사람을 주변에서 보는건 흔한 건 아닌것 같습니다.\n\n[![zrclip_013n5e16e777.png](/files/21631)})](http://www.flickr.com/photos/toechsner/2789808493/)\n\n\n확률을 따져 보겠습니다.\n\n**제 옆에 한 사람이 있습니다. 그럼 저랑 생일이 같을 확률은 1/365 입니다.** 다시 말해 365명 정도가 제 옆에서 웅성대고 있어야 겨우 저와 생일이 같은 사람이 1명 정도 존재한다는 겁니다.\n\n그런데 말입니다. 문제 상황을 살짝 바꾸어서\n\n'**모임 내에서 서로 생일이 같은 사람이 있을 확률이 50%가 넘게 되는 모임인원**'은 몇 명 쯤일까요?\n\n즉, 몇 명쯤이 모여 있으면 50%의 확률로 **'어! 뭐야? 둘이 생일이 같은거야?'** 라며 인연설을 꺼낼 수 있게 될까요?\n\n뭐, 고등학교때 배운 combination 으로 계산할 수 도 있는데요, 언듯 생각이 나지 않아 계산이 어려워 질 수도 있습니다. 그래서 반대로 생각해 보겠습니다. (1 - 모임 내의 사람들이 모두다 생일이 다를 확률) 로 말입니다.\n\n**Case1\\. 모임 인원이 두 명일 경우**\n\n1 - 1/(365 - 내 생일 하루) = 1 - 1/364 = 0.0027 (0.27%) 굉장히 낮죠.\n\n**Case2\\. 모임 인원이 세 명일 경우**\n\n1 - 1/(365 - 내 생일 하루)*1/(365 - 내 생일 하루 - 앞 사람 생일 하루) = 1 - 1/364 * 1/363 = 0.008\n\n이런식으로 계산하면 되는데요, 한 번 엑셀로 쭉 계산해 보았습니다.\n\n![zrclip_003n7a72109d.png](/files/21626)})\n\n![zrclip_004p39dabcd0.png](/files/21627)})\n\n23명 정도의 모임이 있으면 동전 앞 뒤면 정도의 확률로 같은 생일자가 존재하고, 41명 정도가 되면 90%의 확률로 같은 생일자가 생깁니다.\n\n언듯 생각하면 이상합니다만, 확률적으론 그렇습니다. 이런걸 **생일 역설(Birthday Paradox)**이라고 한다네요. 자, 뭐, 상식적인 수준으로 알아 둬도 나쁘진 않은 이야기입니다만, 좀더 IT와 관련지어 생각해 보겠습니다.\n\n돌아다니다 보면 사이트에서 파일을 다운로드 받을때에 아래 그림과 같은 메시지를 본 적이 있으실 겁니다.\n\n![zrclip_006n18333bf0.png](/files/21630)})\n\n![zrclip_007n69924ef.png](/files/21628)})\n\n혹시라도 돌아다니다가 오염된 파일을 받을까봐 단방향 해시함수로 signature 된 코드를 제공하니, 다운 받아서 확인해 보라는 뜻입니다.\n\nMD5 라고 되어 있는 링크를 클릭해 보았습니다.\n\n![zrclip_009p7106b40d.png](/files/21624)})\n\n괴 문자들이 보이는데, 이게 바로 다운 받으려고 하는 httpd-2.2.10.tar.gz 파일에 대한 단방향 해시값(Hash value)입니다. MD5 해시는 128비트, 즉 2의 128제곱의 다른 경우로 해시값이 표기 되며, 내용이 1bit 라도 다르면 다른 해시값이 나오게 되어있습니다.\n\n따라서 이 httpd 압축파일의 해시값과 같은 해시값을 갖는 파일이 존재할 확률은 1/ (3.4 * 10의 38승) 으로, 이정도면 거의 0에 수렴한다고 봐도 무방하죠. 그래서 이 압축파일의 고유성을 MD5 해시값을 통해 증명하는것이 타당한 거죠. (바이러스나 파일손상이 조금만 생겨도 해시값이 달라지니깐요)\n\n그런데 앞서 같은 생일자를 찾는 문제와 같이, 전체 MD5 해시 값들 중 같은 값이 나올 확률을 따져 보면 약간 상황이 달라지는 겁니다. 생일 파라독스 관점에서 접근하면,즉, **'특정 값과 같은 값'**이 아닌, **'군집중 같은 값을 갖는 쌍'** 의 관점으로 접근하면, 앞선 그래프처럼 일정 모 집단 이상이 되면 급격하게 확률이 증가되는 구간이 생깁니다.\n\nMD5가 나왔던 1991년 경에는 같은 해시 값을 갖는 객체(target)를 찾을 수 있는 것 조차 쉽지 않아 보였더랬습니다만, 2006년에 발표된 알고리즘( **[**Tunnels in Hash Functions: MD5 Collisions Within a Minute**](http://eprint.iacr.org/2006/105) )**은 구 펜티엄 3.2G 짜리로 평균 17초면 값충돌(collision)이 나오는 값이 발견된다고 이야기 하고 있습니다.\n\n전 세계가 네트워크로 묶이고, 전체 객체 수가 많아지면서 MD5 해시의 한계가 살짝 드러나는 거죠. 사실 값 충돌(=같은 해시값을 갖는 다른 개체)을 찾아내는 것과 실제 같은 Hash 값을 값은 갖는 개체가 존재하는 것과는 또 별개의 문제일 수 있습니다만, 어쨌든 유일성 증명에서 MD5는 실용적(Pratical)인 수준에서만 쓰이고, Scientific 한 부분에선 쓰이지 않게 되었습니다.\n\n그래서 요즘에는 이런 생일역설 문제를 줄이기 위해서, 적잖은 경우 128bit 값의 MD5 대신 160bit 를 사용하는 SHA 해시 값을 파일 고유값으로 제공하기도 합니다.\n\n![zrclip_010p268e1959.png](/files/21625)})\n\n\n![zrclip_011p56237f99.png](/files/21629)})\n\n\n자, 별건 아니지만, 이게 바로 Download 받을 때 옆에 나오는 해시값의 비밀입니다. (^_^);\n\n#### Comments\n\n좋은 글 잘 읽었습니다 ^_^ 트랙백으로 글 등록할게요!\n\n [鬼風](http://onikaze.tistory.com) | 2009-04-27 월요일 오후 5:0\n\n--\n\n오...진짜 그런가..상당히 높군..\n난 어째 지금까지 한명밖에 못만났지..??\n\n [이지호](http://blog.naver.com/joe1111) | 2010-04-26 월요일 오전 10:36\n\n--\n\n주인장님 안녕하세요 ㅎㅎ 제가 궁금한게 있는데요.\n어찌어찌하다가 Birthday Paradox 문제를 보게 되었는데\n\n1 - 1/(365 - 내 생일 하루)*1/(365 - 내 생일 하루 - 앞 사람 생일 하루) = 1 - 1/364 * 1/363 = 0.008\n이게 이해가 안가네요.\n이 식이 어떻게 성립되는지 알고 싶습니다.\n\n계산기로 아무리 쳐봐도 1 - 1/364 * 1/363 = 0.008 ->  0.999xxxx 이런식으로 나오더라구요\n\n [gear4001](http://gear4001.tistory.com) | 2010-05-22 토요일 오후 6:5\n\n--\n\n아. 수식 설명이 조금 잘못되었군요.\n\n'1- 모두 다를 확률'형태로 계산합니다.\n따라서\n\n두 명 : =1-(365-1)/365 = 0.0027\n세 명 : =1-(365-1)/365*(365-2)/365 = 0.0082\n네 명 : =1-(365-1)/365*(365--2)/365*(365-3)/365 = 0.0164\n\n...\n...\n\n [doortts](http://blog.doortts.com) | 2010-05-22 토요일 오후 11:28\n\n--\n\n아하 그렇군요~ ^^\n\n [gear4001](http://gear4001.tistory.com) | 2010-05-25 화요일 오후 2:47\n\n--\n\n좋은 정보 감사합니다. 재미있게 보고 엮인글(트랙백)을 추가하였습니다.\nMD5 이야기는 조금 어렵군요.\n행복한 하루 되세요.\n\n [Kata Pro](http://manofpro.tistory.com) | 2010-10-25 월요일 오전 7:26\n\n--\n\n우와! 글 등록일이 제 생일입니다!\n\n zeide | 2011-07-13 수요일 오후 4:54\n\n--\n",
    "attachments": [
      {
        "id": 21624,
        "name": "zrclip_009p7106b40d.png",
        "hash": "4856dd4440bed6071f28acb9408beb759d378933",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 16416,
        "containerId": "12239"
      },
      {
        "id": 21625,
        "name": "zrclip_010p268e1959.png",
        "hash": "2a90bbd76c27d11c99d975d813f05540da96b672",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 33972,
        "containerId": "12239"
      },
      {
        "id": 21626,
        "name": "zrclip_003n7a72109d.png",
        "hash": "f04eb90ba10ab809dc62b1880a13589331ae0189",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 21603,
        "containerId": "12239"
      },
      {
        "id": 21627,
        "name": "zrclip_004p39dabcd0.png",
        "hash": "136cf8a47ed7d9607261b6c1f68734548311fe69",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 9633,
        "containerId": "12239"
      },
      {
        "id": 21628,
        "name": "zrclip_007n69924ef.png",
        "hash": "44f97a6ebc9e8b5e8208f67d5e5118c53ad6dc21",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 21888,
        "containerId": "12239"
      },
      {
        "id": 21629,
        "name": "zrclip_011p56237f99.png",
        "hash": "47958de54db8cd90fcfeccc08ccf34d0b0a89ef7",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 9861,
        "containerId": "12239"
      },
      {
        "id": 21630,
        "name": "zrclip_006n18333bf0.png",
        "hash": "49922f6f18613cae47c6f0835d95102371748c63",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 31293,
        "containerId": "12239"
      },
      {
        "id": 21631,
        "name": "zrclip_013n5e16e777.png",
        "hash": "2ebd6f642a1abcbaa385399be964a88ef9a69b9c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 332025,
        "containerId": "12239"
      }
    ]
  },
  {
    "id": 66,
    "title": "자바기술 지원 표준 (Java Endorsed Standards)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1228733921000,
    "body": "> doortts | 2008-12-08 월요일 오후 7:58 | Better SW Development | [원본](http://blog.doortts.com/66)\n\n자바에 포함되어 있는 기술인데,\n\n**1\\. 자바 표준 협의체인 JCP(** [**Java Community Process**](http://www.jcp.org/) **)에서 정한 기술이 아닌 경우, 혹은**\n\n**2\\. 해당 기술이 신기술인지라 새롭게 업데이트 되었을때에 플렛폼에 해당하는 기술로 업데이트가 필요가 생길 수 있는 기술일 경우**\n\nJAVA 에서는 두 가지 케이스를 각각\n\n**1\\. 자바기술 지원 표준 (Java Endorsed Standards) 과**\n\n**2\\. 독립형 기술 (Standalone Technologies)**\n\n이라고 부른다.\n\n그리고 이런 기술들의 변화를 빠르게 지원하기 위해, 해당 기술을 새롭게 구현한 내용(클래스나 인터페이스를 구현한 내용 )으로 덮어씌울 수 있도록 여지를 남겨 두었다.\n\n이걸 Endorsed Standards Override Mechanism (지원 표준 중첩 매커니즘...-_-)이라고 한다.\n\n물론 자바 기술 전체가 아니라, 특정 기술들에 대해서만 창구를 열어 놓았으며, 대표적인게, CORBA, IOP, DOM, XML 파서, Compiler, SOAP 관련 패키지들이다.\n\n**그럼 실제적으로는 어떻게 오버라이드 시킬수 있는것일까?**\n\n설명에 따르면 플랫폼 폴더 구분자로 분리된 아래 디렉터리를 이용하라고 되어 있다.\n\n     \\lib\\endorsed          [Microsoft Windows]\n     /lib/endorsed          [Solaris or Linux]\n\n따라서 xml 파서를 Xalan 을 쓰고 싶으면, 해당 파일을 다운 받아서 위 폴더에 넣어 놓기만 하면 끝!\n\n대표적인 예로 만일 JDK를 1.4 -> 5.0 으로 업그레이드 했는데, 이전 버전의 라이브러리를 써야 해서 XML 파서 관련 에러가 난다면, 위 방법을 이용해서 특정 파서(이를테면 XALAN)를 위 디렉터리에 넣어 놓으면 되겠다. (실제 이 경우에는 1.4 에서 5.0 으로 올라가면서 XML 관련 패키지의 경로가 바뀌었는데, Endorsed Standards Override Mechanism 을 이용해 트릭으로 해결하는 것이 가능하다)\n\n참고로, Tomcat 을 사용한다면, Tomcat 하위 폴더에도 마찬가지로 endorsed 라는 폴더가 있는데, 역시 마찬가지 의미를 갖는다고 보면 된다.\n\n아! 혹시 JAVA_HOME 이든 TOMCAT_HOME 이든, 하위에 endorsed라는 폴더가 없다면, 그냥 만들어 주면 된다. (tomcat 은 ver 6 올라가면서 없애 버렸다는데 확인해 보진 않아서 모르겠다. 다만, 스펙에 있으니 만들어\n주면 된단다.)\n\n참조\n\n[http://java.sun.com/javase/6/docs/technotes/guides/standards/](http://java.sun.com/javase/6/docs/technotes/guides/standards/)\n\n[http://blogs.sun.com/arungupta/entry/metro_on_tomcat_6_x](http://blogs.sun.com/arungupta/entry/metro_on_tomcat_6_x)"
  },
  {
    "id": 67,
    "title": "OOP 의 원칙들 (Object-Orientied Programming Principles)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1229271153000,
    "body": "> doortts | 2008-12-15 월요일 오전 1:12 | 이생각 저생각 | [원본](http://blog.doortts.com/67)\n\nOO 언어가 절차(Procedual) 언어와 다른 이유는 모듈성(Modularity)을 전면으로 내세웠느냐 아니냐의 차이라고 본다.\n\n보통은 이 모듈의 최소 단위로 클래스(Class) 를 이야기 한다. 따라서, 클래스가 얼마만큼 잘 만들어지느냐, 그리고 그로 인해 클래스의 묶음체인 패키지(Package)혹은 컴포넌트(component)가 정제되어 있느냐가 OO 프로그램의 질(quality)을 판가름 한다.\n\n이 퀄러티를 평가하고 유지하는 데에 있어서 기준이 되는 원칙이 몇 개 있는데, 그걸 OO 원칙(OO Principle) 이라고 부른다.\n\n그럼, OO 원칙에는 어떤 것들이 있는지 살펴보도록 하자.\n\n\n\n**OOP 4대 기본 원칙**\n\n**(Object Oriented Programming Basic Principle)**\n\n**추상화(Abstraction)**\n\n추상화는 주제 영역(Subject Domain Area)내에서 시스템에 참여 시키고자 하는 대상에 대한 관심점(a point of concern)의 표현방법이다. 다만, 있는 그대로 풀어내는 것이 아니라, 모듈의 단위를 결정하기 위한 '단어'를 정하는 것이다. 추상화 단계에서 속성(attribute)과 행위(Behavior)를 분리해 내는 방식은 추상화 혼란을 일으키기 쉽기 때문에, 명백하다 생각되는 경우를 제외하고는 관계(relation)를 통해 속성과 행위를 찾아내는 방식을 선호한다.\n\n**캡슐화(Encapsulation)**\n\n추상화의 목적이 대상에 대한 관심 영역의 시야 한정(limitation of view)이라고 한다면, 캡슐화는 정보의 영역의 한정(limitation of information area)이 목적이다. 정보(Information, 혹은 Data)를 객체 안에 포함시키고, 그 정보에 대한 직접 접근은 허용하지 않는 대신, 필요에 따라 확인할 수 있는 접근점(인터페이스)을 외부에 공개하는 방식이다. 가끔, 캡슐화와 정보은닉(Information Hiding)에 대해서 혼란을 겪을 수 있는데, 캡슐화는 모듈화(modularity)의 의미가 더 강하고, 정보 은닉은 '대상에 대한 정보를 묻지(Query) 않으면 알 수 없게 만든다'는 의미를 갖는다. 따라서, 잘 된 캡슐화는 정보 은닉의 내용을 포함한다.\n\n**상속(Inheritance)**\n\n상속은 추상화와 캡슐화가 이루어진 모듈에 대한 세분화된 체계(Datailed Category)이다. 따라서, 얼마만큼 세분화(=상속)할 것인가는 설계자의 의지에 달려있다. 흔히 상세(Detail)와 복잡(Complextity)은 비례하기 때문에, 현대 프로그래밍에서는 상속은 최소한으로 한정 할 것을 권장하고 있다.\n\n**다형성(Polymorphism)**\n\n다형성은 모듈이 갖고 있는 자아 정체성(Identity)과 그 것의 표현 방식을 의미한다. 말하자면, 학생은 모두 공부를 해야 하지만, 공부하는 방식은 각자가 다 다르며, 그로 인해 각각의 학생은 구별된다. 다형성을 극대화 하기 위해 우리는 종종 추상 클래스(Abstract class)나 인터페이스(Interface, Pure Virtual Function)를 이용한다.\n\n**OO 설계 원칙들 (OO Design Principles)**\n\nOO 프로그래밍의 기본 4대 원칙 이외에도 보다 나은 OO 프로그래밍을 위해서 이야기 되는 원칙들이 있다.\n\n그 중 가장 흔히 접하는 용어중에 SRP (Single Responsibility Principle, 단일책임원칙)이라는게 있다.\n\n**SRP (Single Responsibility Principle, 단일책임원칙)**\n\n하나의 모듈, 그러니까 하나의 클래스 혹은 하나의 메소드는 하나의 일에 대해서만 책임을 질 수 있도록 잘 분리되어 있어야 한다는 의미로, 객체 지향의 지향점 중 하나인 높은 응집도(High Cohesion)를 말한다. 이 법칙은, 흔히 말하는 사고(logic)와 표현(Presentation)의 분리뿐 아니라, 관심도 철저하게 분리되어야 한다고 이야기 하고 있다. 따라서 SRP가 잘 되어 있는 모듈은 중복(Duplication)이 적으며, 변경이 한 곳에서만 일어날 수 있게 만들어 준다. 혹시, 데이터 모델링을 한 적이 있다면 정규화(Normalization)와 관련지어 생각할 수 있겠다. 피플웨어(Peopleware)로 잘 알려져 있는 [톰 디마코](http://www.systemsguild.com/GuildSite/TDM/Tom_DeMarco.html)가 1979년에 쓴 'Structured Analysis and Systems Specification'에서 최초로 소개 되었다.\n\n![zrclip_007p57365a34.png](/files/21636)})\n\n\n**디미터의 법칙(Demeter's Law, LoD)**\n\n최소 지식의 원칙(Principle of Least Knowledge) 이라고도 불린다. OO 프로그래밍 연구 프로젝트(Demeter Project)에서 나온 법칙으로 흔히 '친한 친구들 하고만 이야기 하여라(Only talk to your immediate friends)' 라는 이야기로 요약된다. 친구는 클래스 정도로 해석하면 되며, getA().getB().getC() 하는 식으로 **'여러 객체에 물어물어 가는 식으로 정보를 찾아내는 스타일은 자제하는 것이 좋다'**라는 법칙이다. 재미있는 것은 다른 법칙과 달리 디미터의 법칙은 장/단점이 생기는 법칙으로, 디미터의 법칙을 잘 따를 경우 메소드(=함수)가 많이 생기게 되면서 복잡도가 증가 할 수 있다. 하지만, 전체적으로는 잘 따르는 것이 좋은 법칙이다. 현재 디미터의 법칙이라 불리는 법칙은 디미터 프로젝트의 OO 프로그래밍 스타일 가이드 중 함수와 메소드(Law of Demeter for Functions/Methods) 부분의 가이드를 말한다.\n\n**![zrclip_005n3400c01c.png](/files/21635)})** \n\n#### Comments\n\n우와~, 좋은 자료에 감사드립니다. 정말 많은 도움이 됬습니다.\n\n [곰동](http://gomdong.pe.kr) | 2009-06-07 일요일 오후 12:57\n\n--\n\n와, 제가 이해한 OOP과 정확히 같네요. 저보다 정리가 더잘되어있지만 말이죠^^;\n\nOOP와 모듈성을 어떻게 표현내야할까 생각했었는데 가려운곳을 정확히 긁어주시는 표현 및 정리예요.\n이후 객체지향원칙들도 잘읽었습니다^^\n\n [아시모프](http://silverktk.tistory.com) | 2009-07-07 화요일 오전 11:57\n\n--\n\n정말 제대로 이해할 수 있도록 정리되어 있군요. 감사히 잘 읽었습니다.\n\n [사내양](http://guysheep.tistory.com) | 2010-06-11 금요일 오전 8:19\n\n--\n",
    "attachments": [
      {
        "id": 21632,
        "name": "zrclip_010p28bc333e.png",
        "hash": "42cd03b741f2975082e1e7a96029135c0613ad6b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2964,
        "containerId": "12241"
      },
      {
        "id": 21633,
        "name": "zrclip_003p4349104b.png",
        "hash": "df5e749dba2422861ad5b77b239c702215112d46",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 8892,
        "containerId": "12241"
      },
      {
        "id": 21634,
        "name": "zrclip_009p45c023bf.png",
        "hash": "af61a95440cef7b4871b309be8924dfd138184be",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 51927,
        "containerId": "12241"
      },
      {
        "id": 21635,
        "name": "zrclip_005n3400c01c.png",
        "hash": "3a97439a88264162c7f23a270b8f7cebd53395be",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 73302,
        "containerId": "12241"
      },
      {
        "id": 21636,
        "name": "zrclip_007p57365a34.png",
        "hash": "a1a36de31ceb25acdfa6ea54a9cd404d9700b741",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 169575,
        "containerId": "12241"
      },
      {
        "id": 21637,
        "name": "zrclip_006p650c5aea.png",
        "hash": "8b71221d1cdee325d70cd09253c49d99b2559662",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 531126,
        "containerId": "12241"
      }
    ]
  },
  {
    "id": 68,
    "title": "자신에 대한 3자 테스트",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1230269003000,
    "body": "> doortts | 2008-12-26 금요일 오후 2:23 | 이생각 저생각 | [원본](http://blog.doortts.com/68)\n\n한해를 돌아 본다는 것은 무엇인가?\n\n자신에 대해 스스로 평가를 내려 본다는 것은 무엇인가?\n\n3자 테스트(Third-party Test)가 더 신뢰를 높인다고 이야기 하면서도, 한 해에 대한 본인의 3자 테스트를 정작 본인은 인정하지 않는 것은 자신만이 아는 자신에 대한 평가, 즉 한 해 동안의 자신(=application)의 구성에 대한 좀더 엄격한 레벨(=low level api)에서의 평가가 오직 본인에 의해서만 가능하다고 믿기 때문이다.\n\n그래서 자신에 대한 스스로의 평가는 일반적인 타인의 평가보다 좀 더 **'위안적'**이거나 좀 더 **'혹독한'**수준의 평가가 이루어진다. 물론 아마 대부분은 **'혹독한'**쪽에 더 가까우리라 생각된다.\n\n왜냐하면 사람은 평소에 자신의 본의를 100% 나타내면서 살지 않고,\n\n의도 되었든 그렇지 아니하였든, 좋은 쪽이든 나쁜 쪽이든 오해는 사기 마련이며\n\n타이밍의 문제로 진정한 자신과는 다른 자신의 이미지를 남들에게 심어주는 경우가 종종 있기 때문이다.\n\n그게 말그대로의 일과 업무가 되었든 단순한 이미지가 되었든 간에 말이다.\n\n자신에 대한 스스로의 평가란 가장 정확할 수 있으면서도, 상당히 주관적으로 편향될 수 밖에 없는 '**보고서의 한 종류**'이기 때문에, 참조는 하되 그것에 큰 믿음을 갖는 것은 다소 위험할 수 있다. 책임의 전가라던가, 사건의 회피라던가 하는 식의 인간 본연의 기질이 알게 모르게 가미되어서는 내년에도, 그리고 그 다음 해에도 마찬가지로 패턴반응을 나타나게 할 수 있다.\n\n**'평가'**는 어떤 식으로든 **'비난'**이 되어서는 안되며, 자신을 되돌아 보면서 미처 인식하지 못하였던 것들에 대해 다시금 생각해 보는 **계기**가 되어야 하고, 그로 인해 좀 더 스스로를 발전시킬수 있다는 **믿음**을 갖는 것이 중요하다.\n\n한 해 동안 자신이 했던 모든 행동은,\n\n좋았든, 나뻤든, 그 자체로도 충분히 의미가 있으며, 무한의 모래사장에서의 모래알 한 알 같은 삶에 있어서, 있는 그대로 안고 가야 하는 자신의 역사라는 걸 잊어서는 안되겠다. 그래서, '**연말**'의 이미지는 한 해 중 나쁜 것은 잊자라는 생각보다는 스스로를 '회고'하면서 마음을 열고 자기 자신의 모습을 있는 그대로 받아들인다에 더 초점을 맞추어야 한다고,\n\n나는 어리석게도 열심히 믿고 있다."
  },
  {
    "id": 69,
    "title": "[번역] 허드슨을 이용한 지속적인 통합(Continuous integration with Hudson) #1",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1230422340000,
    "body": "> doortts | 2008-12-28 일요일 오전 2:22 | Better SW Development | [원본](http://blog.doortts.com/69)\n\n[번역통합본](http://doortts.tistory.com/entry/%EB%B2%88%EC%97%AD-%ED%86%B5%ED%95%A9-%ED%97%88%EB%93%9C%EC%8A%A8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%ED%86%B5%ED%95%A9-Continuous-integration-with-Hudson \"[http://doortts.tistory.com/entry/%EB%B2%88%EC%97%AD-%ED%86%B5%ED%95%A9-%ED%97%88%EB%93%9C%EC%8A%A8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%ED%86%B5%ED%95%A9-Continuous-integration-with-Hudson]로 이동합니다.\")을 확인하세요. :)\n-----------------------------\n\n자바월드([http://www.javaworld.com/](http://www.javaworld.com/))에 기고된 허드슨(Hudson) 글을 번역해서 올려 봅니다. 매우 상세하게 설명되어 있어서 CI 서버가 생소한 사람들도 어렵지 않게 따라갈 수 있도록 되어있습니다.\n\n**내용이 긴 관계로 3~4회로 나누어서 올리고, 나중에 합친 형태도 제공하는 식으로 하겠습니다.**\n\n이번회는 허드슨 개요에서 설치까지 입니다.\n\n음.. 요즘엔 저작권 문제가 상당히 날카로와져서 조금 망설였지만, 비 영리의 외국 기사 번역은 상식적인 선에서 저작권에 훼손을 가하지 않는다면 문제 되지 않는다는 글을 어디선가 보고서는 마음대로 올려봅니다. (-,-) 그리고, 번역시에 큰 고민하지 않고 진행한 관계로 다소 어색할 수 있습니다만, 이해가 곤란한 수준이 되진 않도록 노력하였습니다.\n\n원문은 [http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html](http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html) 에서 살펴보실 수 있습니다.\n\n-------------- Started Here ------------\n\n**허드슨을 이용한 지속적인 통합(Continuous integration with Hudson)**\n\n쉬운 설치와 설정을 제공하는 오픈소스 CI 서버\n\nBy Nicholas Whitehead, JavaWorld.com, 12/18/08\n\n지속적인 통합(CI)은 소프트웨어 개발 생명주기에 걸쳐서 코드 품질 보증에 대해 초점을 맞추고 있는 팀들에겐 흔한 실천방법이 되었다. 이 글에서, 니콜라스 화이트헤드(Nicholas Whitehead ) 는 인기있는 오픈 소스 CI 서버인 **허드슨(Hudson)**을 소개한다. 당신의 어플리케이션 개발 환경에 허드슨 서버를 구축하는 방법을 배워보고, 허드슨이 제공하는 많은 설정 옵션들의 전체적인 개념을 얻어보자. (예제는 윈도우 XP에 톰캣6 혹은 우분투 리눅스에 JBoss AS 로 되어있다.) 그리고 자동화된 빌드, 테스트, 그리고 예제 프로젝트용 레포팅 프로세스를 구현하는 방법을 보기로 한다. **레벨은: 초급!**\n\n_지속적인 통합_(CI)는 소프트웨어 빌드를 만들어내는 절차를 쉽게 하고 안정화 하기 위한 실천방법들의 세트이다. CI는 아래와 같은 난관이 있는 개발팀을 도와준다\n\n*   **소프트웨어 빌드 자동화**: CI를 이용해서 당신은 버튼을 하나 누른다던가, 혹은 미리 일정을 정해놓고, 아니면 특정한 이벤트에 대한 반응같은 식으로 어떤 소프트웨어 구조물(이하 아티펙트, Artifact)의 빌드 프로세스를 실행시킬 수 있다. 만일 당신이 소스로 부터 소프트웨어 구조물을 빌드하고자 한다면, 당신의 빌드 프로세스는 특정 IDE나 컴퓨터, 혹은 특정인에 속박되지 않는다.(물론 그래서도 안되지만 말이다)\n*   **지속적이고 자동화된 빌드 검증**: CI 시스템은 새로운 소스코드나 수정된 소스코드가 체크인 될때마다 끊임없이 빌드를 실행하도록 설정될 수 있다. 이건 어떤 소프트웨어 개발팀이 주기적으로 신규 코드나 수정된 코드를 체크인 하는 사이에, CI 시스템은 새로운 코드에 의해 빌드가 깨지는지의 여부를 지속적으로 검증할수 있다는 것을 의미한다. 이것은 개발자들이 상호의존적인 컴포넌트들의 변경에 대해 각각 점검해야 하는 것에 대한 필요성을 줄여준다.\n*   **지속적이고 자동화된 빌드 테스트**: 빌드 검증의 확장에 해당하는 이 프로세스는, 신규 코드나 수정된 코드가 빌드 아티팩트에 대해 미리 정의된 **테스트 슈트**가 실패하도록 만들지 않는다는 것을 보증해 준다. 빌드 검증과 테스트 둘 다에 있어, **실패(Failures)**는 빌드나 테스트가 실패했다는 것을 나타내는 **'통지(notification)'**를 관련 부서들에게 보내는 방아쇠(...trigger)가 된다.\n*   **빌드 후속 절차 자동화**: 한 소프트웨어 아티팩트의 빌드 생명주기에서는 빌드 검증과 테스트가 완료된 다음에도 문서 생성, 소프트웨어 패키징, 그리고 해당 아티팩트들을 실행환경이나 소프트웨어 저장소로 전개(deploy)하는 것 같은 자동화될 수 있는 추가적인 작업이 필요할 수 도 있다. 이런 형태로 아티팩트들이 사용자들이 사용할 수 있도록 신속히 만들어 질 수 있다.\n\nCI 서버를 구현하기 위해, 당신은 최소한 하나의 접근가능한 소스코드 저장소(그리고 그 안에 들어있는 소스코드), 빌드 스크립트 한 세트와 절차들, 그리고 빌드된 아티팩트용 테스트 슈트 하나가 필요하다. 그림1은 CI시스템의 기본 구조의 개략도(outline)이다.\n\n#### [![zrclip_002p45ce784e.png](/files/21639)})](http://www.javaworld.com/javaworld/jw-12-2008/images/CIOverview.jpg)\n\n#### 그림 1\\. CI시스템의 기본 구조 (클릭하면 크게 보임)\n\n시스템 컴포넌트들은 아래와 같은 순서로 동작한다.\n\n1.  개발자들은 소스코드 저장소 안으로 새로운 코드나 수정된 코드를 체크인 한다.\n2.  CI 서버는 각각의 프로젝트를 위한 전용 작업공간을 만든다. 하나의 새로운 빌드가 요청되거나 예정되면, 소스는 저장소로부터 빌드가 수행될 이 작업공간으로 불려온다.\n3.  CI서버는 새로이 만들어진, 혹은 새롭게 갱신된 작업공간에서 빌드 프로세스를 수행한다.\n4.  일단 빌드가 완료되면, CI서버는 추가적으로 새로운 아티팩트에 대해 정의된 테스트 슈트를 수행할 수 있다. 만일 빌드가 실패하면, 등록된 개개인들은 이메일, 인스턴스 메시징, 혹은 어떤 다른 방식으로, 통지받게 된다.\n5.  만일 빌드가 성공적이면, 해당 아티팩트들은 패키지되어서 (이를테면 어플리케이션 서버 같은)배포처로 전송되거나 아니면 소프트웨어 저장소에 새로 버전붙여진 아티팩트로 저장되기도 한다. 이 저장소는 CI서버의 일부가 될수도 있고, 혹은 파일서버나 Java.net, SourceForge같은 소프트웨어 배포 사이트 식의 외부 저장소가 될 수도 있다. 소스코드 저장소와 아티팩트 저장소는 분리될 수 있고, 몇몇 CI서버들을 사용하면 공식적인 소스관리 시스템을 전혀 갖고 있지 않아도 실제로 그렇게 하는 것이 가능하다.\n6.  CI서버는 보통 어떤 형태든 프로젝트를 설정하고 디버그할 수 있는, 그리고 경우에 따라 특별하게 즉시 빌드를 만들어 내게 하거나 보고서 생성, 혹은 빌드된 아티팩트들을 검색하는 식의 동작들을 요청할 수 있는 콘솔을 갖는다.\n\n## 허드슨: 지속적인 통합 서버\n\n[지속적인 통합](http://www.javaworld.com/javaworld/jw-06-2007/jw-06-awci.html)은 지난 몇년에 걸쳐 인기리에 성장해 왔고, 상업용/공개용 둘 다 포함해서 오늘날 당신이 선택할 수 있는 꽤 많은 수의 CI 서버들이 있다. 나는 동료가 [허드슨(Hudson)](https://hudson.dev.java.net/)을 추천하기 이전에 개인적으로 4개의 CI 서버들을 사용하고 있었다. 나는 곧바로 감명받았다. 초기에 내가 허드슨은 잘 알려져 있지 않다고 추측하고 있는 동안에, [자바 파워 툴즈 사이트의 설문](http://www.wakaleo.com/polls/18-what-continuous-integration-server-are-you-using-in-2008)은 응답자들 사이에서 허드슨이 가장 폭넓게 사용되는 CI서버라는 걸 보여줬다. (이글이 쓰여지는 시점에서) 투표 중 37.8퍼센트를 차지하고 있다.\n\n\n\n#### 지원하는 SCM들 Supported SCMs\n\n허드슨은 서브버전에 대한 지원은 곧 바로 사용할 수 있는 수준으로 내장 되어있고, CVS와 통합하기 위해서는 약간의 설정만 필요하며, CVS클라이언트가 허드슨 호스트에 인스톨 되어 있다고 가정하고 있다. 몇몇 다른 소스 코드 관리(SCM) 솔류선들은 [허드슨 플러그인](http://hudson.gotdns.com/wiki/display/HUDSON/Plugins#Plugins-Sourcecodemanagement) 형태로 지원되고 있다. 이 글을 쓰는 시점에서 아래오 같은 SCM들이 지원된다.\n\n*   Accurev\n*   BitKeeper\n*   ClearCase\n*   Git\n*   Mercurial\n*   Perforce\n*   StartTeam\n*   Team Foundation Server\n*   Visual SourceSafe\n*   URL SCM (SCM에 URL 을 사용할 수 있게 해주는 특별한 SCM 플러그인)\n\n이 글에서, 나는 서브버전과 Java.net의 소스 저장소를 사용할 것이다. 따라서 당신은 위에 있는 어떠한 플러그인들도 설치할 필요가 없다. (여담으로, MKS 소스통합 허드슨 플러그인을 만들고 있는 사람을 알고 있는데, 혹시 관심있으면 메일(email) 주길 바란다)\n\n\n\n허드슨은 공짜이고 오픈소스 제품으로 Java.net에 자리잡고 있다. 허드슨은 썬 마이크로 시스템의 엔지니어인 코수케 카와구치(Kohsuke Kawaguchi)에 의해 최초로 작성되었으며, 2005년 2월에 그의 블로그에서 릴리즈가 발표되었다. 허드슨은 그 이후 거의 154번의 릴리즈가 있었다.\n\n**왜 내가 허드슨을 좋아하는 지, 그리고 왜 내가 (몇몇 특별한 요구사항이 필요한 경우를 제외하고) 허드슨을 당신에게 추천하는 지에 대한 이유는 아래와 같다.**\n\n*   내가 사용했던 모든 CI 제품중에서, 인스톨하고 설정하기가 가장 쉬웠다.\n*   웹 기반 유저 인터페이스는 매우 친숙하고, 직관적이며, 빠르게 반응했고, 많은 경우에 있어 개별적인 설정 필드에 대해 Ajax를 이용한 즉각적인 피드팩을 제공하였다.\n*   허드슨은 (만약 당신이 자바 개발자라면 유용할 수 있는)자바 기반이지만 자바 기반의 소프트웨어를 빌드하는데에 한정되어 있지는 않다.\n*   허드슨은 깔끔하게 컴포넌트화 되어 있고 잘 정의되고 문서화되어있는 확장가능한 API를 허드슨 플러그인 형태로 제공한다. 그로인해 서버의 기능을 확장하는 커다란 허드슨 플러그인 라이브러리를 갖게 하였다. 이 라이브러리들은 허드슨 콘솔에서 자유롭게 사용가능하고 설치 가능하다.\n\n## 허드슨 인스톨 하기: Windows XP 혹은 우분투 리눅스\n\n허드슨을 사용하기 위해서, 당신은 접속가능하고 허드슨이 지원되는 소스 관리 시스템과 아티팩트로 빌드될 수 있는 소스, 그리고 동작하는 빌드 스크립트가 필요하다. 그 외에, 동작하는 허드슨 서버를 인스톨하고 설정하기 위해 당신이 정말 필요한 것은 자바 1.5 이상과 [허드슨 인스톨 파일](http://hudson.gotdns.com/latest/hudson.war)을 설치하는 것이다.\n\n\n\n\n\n```\nC:\\hudson> java -jar hudson.war\n```\n\n\n\n\n\n하지만, 서블릿2.4와 JSP 2.0스젝에 기반한, GlassFish, Tomcat, JBoss, 혹은 Jetty 같은 자바 서블릿 컨테이너에 허드슨을 디플로이 하는것이 좀더 일반적일 수 있다. 다음 섹션에서, 두개의 허드슨 인스톨 시나리오로 진행하려고 한다. 하나는 윈도우즈XP에 [Tomcat 6](http://www.javaworld.com/javaworld/jw-01-2008/jw-01-tomcat6.html)을 이용하는 것이고 다른 하나는 우분투(Ubuntu) 리눅스에 [JBoss 4.2.3](http://www.javaworld.com/javaworld/jw-02-2005/jw-0221-jboss4.html) 를 이용하는 것이다. ([JBoss AS 5.0](http://www.jboss.org/jbossas/downloads/) 는 이 글의 제출일 이후에 릴리즈 되었다)\n\n### 허드슨 인스톨 하기: 톰캣6와 윈도우즈 XP\n\n나는 당신의 윈도우즈XP 머신위에 JAVA 버전 1.5 이상이 설치되어 있다고 가정할 것이다. 아래에 이어지는 단계는 윈도우즈 서비스 인스톨러를 이용해서 톰캣 6.0.18을 설치할 것이다. 그래서 윈도우즈 XP 가 부팅되면 곧바로 허드슨이 시작되게 할 것이며, 로그인 하지 않더라도 백그라운드로 동작하도록 할 것이다. 다운로드해서 설치할 톰캣 파일은 [apache-tomcat-6.0.18.exe](http://tomcat.apache.org/download-60.cgi)이다.\n\n톰캣 설치는 인스톨 옵션을 선택하게 할 것이다. **Custom** 옵션을 선택해서 그림 2에 보이는 것처럼 **Service**를 반드시 선택하자. 그래서 톰캣이 서비스로 동작한다.\n\n![Tomcat installation options](http://www.javaworld.com/javaworld/jw-12-2008/images/TomcatInstallOptions.jpg)\n\n#### 그림 2\\. 톰캣 설치 옵션\n\n다음으로, 톰캣을 설치할 디렉터리를 그림 3에 보이는 것처럼 선택하자. 디렉터리를 정할 때 빈 공백이 없는 디렉터리를 고르는 걸 추천한다. 나중에 나한테 감사 할거다.\n\n#### ![zrclip_005n659bde55.png](/files/21641)})\n\n#### 그림3\\. 인스톨 디렉터리 고르기\n\n이제 인스톨러는 응답대기할 포트를 선택하라고 물을 것이다. 기본값은 포트 8080인데, 적당하다. 해당 포트를 사용하는 다른 어플리케이션이 없는지만 유의하자. 만일, 해당 포트를 사용하는 어플리케이션이 있으면, 톰캣은 적절히 뜨지 않을 것이다. (뭐. 당연하잖아!!) 톰캣 관리자 유저이름과 패스워드도 물어볼거다. 그림 4에 모두 나와 있다.\n\n#### ![zrclip_004n1ced88c.png](/files/21638)})\n\n#### 그림4\\. 리스닝포트와 관리자 유저 이름과 패스워드 고르기\n\n그리고나면 인스톨러는 자바 JRE가 설치된 위치를 물어볼 것이다. 그림 5에 보이는 것처럼, 나는 Sun Java 1.6.0_07을 사용했다.\n\n#### ![zrclip_006n5cdd7abb.png](/files/21640)})\n\n#### 그림5\\. 톰캣을 띄울 Java JRE 고르기\n\n**Install** 을 클릭하고 나면, 인스톨이 실행&완료 되고 서비스가 시작될 것이다. 웹 브라우저에 http://localhost:8080 을 입력해서 톰캣이 제대로 동작하는지 확인할 수 있다. (톰캣이 인스톨 된 컴퓨터에서 웹 브라우저를 띄우는 것이 아니라면 localhost 대신에 IP 주소나 적절한 이름으로 치환한다) 그림 6에 보이는 스크린샷 처럼 웹 페이지가 표시될 것이다.\n\n[![Verifying Tomcat installation and operation](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_TomcatSuccessfulInstall.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/TomcatSuccessfulInstall.jpg)\n\n#### 그림6\\. 톰캣 인스톨과 동작 검증\n\n이제, 허드슨을 인스톨하기 위해, [hudson.war](http://hudson.gotdns.com/latest/hudson.war) 파일을 톰캣이 설치된 디렉터리의 webapps 하위 디렉터리로 복사한다. 만일 당신이 그림3에 보이는 것과 동일한 인스톨 디렉터리를 사용했다면 webapps 는 C:\\Tomcat6\\webapps가 될 것이다. 톰캣은 핫-디플로이(뜨거운 배포...-_- sorry)를 할텐데, 지금 할 수 있는 쉬운 방법은 톰캣을 재시작하는 것이다. 재시작 하는데는 두가지 방법이 있는데, 첫 번째는 DOS 쉘을 열여서 아래와 같은 명령어를 입력하는 것이다.\n\n\n\n\n\n```\n  C:\\Tomcat6>net stop Tomcat6\n  C:\\Tomcat6>net start Tomcat6\n```\n\n\n\n\n\n두 번째 옵션은 서비스 애플릿을 여는 것이다. 제어판(Control Panel)의 관리자 툴에서 해당 애플릿을 찾을 수 있다. 제어판은 시작버튼에 있는 윈도우 툴바에서 설정를 선택해서 제어판을 고르면 된다. 서비스 애플릿에서, **Apache Tomcat** 이라고 이름 붙은 서비스를 찾아서 재시작 버튼을 누른다. 그림 7에 설명되어 있다.\n\n#### ![zrclip_007p66ec86dd.png](/files/21642)})\n\n#### 그림7\\. Services 애플릿Figure 7\\. The Services applet\n\n이제 허드슨이 설치되었다. 웹 브라우저에 [http://localhost:8080/hudson](http://localhost:8080/hudson) 이라고 지정해서 확인할 수 있다. 메인 허드슨 스크린은 그림 8과 같다.\n\n[![The Hudson start page](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_HudsonStartScreen.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/HudsonStartScreen.jpg)\n\n#### 그림8\\. 허드슨 시작 페이지\n\n당장 필요한 것은 이게 전부다! 만일 당신이 Windows XP 와 Tomcat 기반의 어플리케이션 개발 환경에 친숙하다면, 세팅은 다 끝났다. 만약 당신이 우분투 리눅스에 JBoss 를 실행하는 시스템을 선호한다면, 계속 읽기 바란다.\n\n### 허드슨 인스톨 하기: JBoss 4.2.3 on Ubuntu Linux 8.04 (Hardy Heron)\n\n우분투에 썬 자바 1.6을 설치하려면, 쉘을 열어서 아래와 같은 커맨드를 실행하여라.\n\n\n\n\n\n```\n  sudo apt-get install sun-java6-jdk\n```\n\n\n\n\n\nsudo 커맨드를 실행하면, 패스워드를 물어볼 것이다.\n\nJBoss를 인스톨 하는데는 몇 가지 방법이 있다. 여기에선 jboss 전용 유저를 만들것이다. 이 방식이 최고의 선택이고, 유저를 만들어서 당신의 home 디렉터리에 JBoss를 인스톨하는 것이 나은 방법으로 여겨지고 있다. 여기에 요약된 절차는 우분투 포럼에 있는 [a useful description](http://ubuntuforums.org/showthread.php?p=4031613) 을 응축한 것이다.\n\n첫째로, [the JBoss 4.2.3.GA package](http://www.jboss.org/jbossas/downloads/) 를 다운로드 한다. jboss-4.2.3.GA.zip 이라고 이름붙은 파일을 찾아라.\n\n다음으로, jboss로 이름지어진 group 과 home 디렉터리, 유저를 만들어야 한다. group 은 편리하지만, 이글에서 자세히 다루진 않는다. 우분투 서버에 있는 다른 유저들에게 JBoss권한을 확장할 수 있게 해준다.\n\n리스트1 은 jboss home 디렉터리, 유저, 그룹을 생성하는 명령어들과 JBoss서버를 설치하는 것을 코멘트로 보여준고 있다.\n\n#### 리스트1\\. jboss 계정 생성과 서버 인스톨\n\n`echo Create the jboss group\nsudo groupadd jboss\necho Create the jboss user, define bash as the user's default shell and /home/jboss as the home directory\necho and make the user jboss part of the group jboss\nsudo useradd -s /bin/bash -d /home/jboss -m -g jboss jboss\necho Copy the jboss-4.2.3.GA file to /home/jboss or download directly into that directory\nsudo mv jboss-4.2.3.GA /home/jboss\necho Change the owner of the file to jboss\nsudo chown jboss:jboss /home/jboss/jboss-4.2.3.GA\necho Log into the jboss account\nsudo su jboss\necho Go to the jboss home directory\ncd\necho Unzip the file jboss-4.2.3.GA\nunzip jboss-4.2.3.GA\necho Create a symbolic link \"jboss\" for \"jboss-4.2.3.GA\".\necho This allows you to change JBoss versions with minimal changes\nln -s jboss-4.2.3.GA jboss`\n\nunzip 이 설치 되어 있지 않으면, (sudo 명령이 실행가능한 유저로 로그인해서) 아래와 같은 명령어를 입력해서 인스톨하여라.\n\n\n\n\n\n```\nSudo apt-get install unzip\n```\n\n\n\n\n\nJBoss 서버는 이제 기본적으로 인스톨 되었다. 다음과 같은 명령어를 사용해서 띄울 수 있다.\n\n\n\n\n\n```\n/home/jboss/jboss/bin/run.sh\n```\n\n\n\n\n\n그러나 명령어로 띄우는 것이 아니라, 이 예제에서는 장비가 시작될때 서비스가 자동적으로 시작되도록 자동 시작 스크립트를 설치할 것이다. JBoss 를 내려받을 때 세 개의 서로 다른 init.d 스크립트도 함께 다운로드 되었지만, 손 본 필요가 있다. 자동으로 기동과 정지를 가능하게 해줄 jboss-init.sh 스크립트를 다운로드 할 수도 있다. 그런다음, 리스트2에 있는 명령어들을 실행하여라.\n\n#### 리스트2\\. JBoss를 위한 자동 시작 스크립트 인스톨 하기\n\n\n\n\n\n```\necho Move the jboss-init.sh file to /etc/init.d/ and rename it to jboss\n sudo mv jboss-init.sh /etc/init.d/jboss\n echo Change the owner of the /etc/init.d/jboss file to root\n sudo chown root:root /etc/init.d/jboss\n echo Make the /etc/init.d/jboss file executable\n sudo chmod ug+x /etc/init.d/jboss\n echo Activate the /etc/init.d/jboss file in the rc.d lifecycle process.\n sudo update-rc.d jboss defaults\n```\n\n\n\n\n\n자 이제 아래와 같은 명령어를 이용해서 백그라운드 프로세스로 JBoss 서버를 시작할 수 있다. (로그아웃 해도 프로세스는 종료되지 않을 것이다)\n\n\n\n\n\n```\nsudo /etc/init.d/jboss start\n```\n\n\n\n\n\nJBoss가 동작하는 것을 확인하기 위해 브라우저에 [http://localhost:8080/jmx-console](http://localhost:8080/jmx-console) 라고 지정해보자. (뜨는데 몇 분쯤 걸릴수 있다) 그림9는 나와야 하는 JBoss JMX 콘솔을 보여준다.\n\n[![The JBoss JMX console](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JBossJMXConsole.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JBossJMXConsole.jpg)\n\n#### 그림 9\\. The JBoss JMX console\n\n허드슨을 디플로이 하는 것은 간단하다. [hudson.war](http://hudson.gotdns.com/latest/hudson.war) 파일을 /home/jboss/jboss/server/default/deploy 에 복사하면 끝난다. jboss 유저를 이용해서 JBoss서버가 해당 파일을 읽을 수 있는 권한을 갖도록 하는 것이 최선이다. 허드슨이 몇 초 이내에 디플로이 될 것이다. 그러면 웹 브라우저에 [http://localhost:8080/hudson](http://localhost:8080/hudson) 이라고 지정해서 디플로이가 잘 되었는지를 확인할 수 있다. 그림 8에 보이는 것과 같은 페이지가 보여질 것이다.\n\n## Setting up a build in Hudson\n\n## 부터는 다음에 이어서 계속하겠습니다...\n\n#### Comments\n\n번역 대체 언제 끝낼것이야! \n 이것 말고도 뭔가 일이 있는데,\n 그건 누가 해야할까?~ 누가 해야할까?~ -_-;\n\n 근데, 이걸 보니 나도 문득 하다만 Apache Felix 번역이.. (안되어~~)\n\n [M-o-N](http://nephilim.tistory.com) | 2008-12-30 화요일 오후 11:5\n\n--\n\n번역이 생각보다.. 생각보다... OTL...\n\n [doortts](http://doortts.tistory.com) | 2008-12-30 화요일 오후 11:7\n\n--\n\n와우~;; \n허드슨 아저씨 떳어요 ;;ㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-03-03 화요일 오후 2:39\n\n--\n",
    "attachments": [
      {
        "id": 21638,
        "name": "zrclip_004n1ced88c.png",
        "hash": "1b320905d306a9fa34f8de889e5484002346eec5",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 64125,
        "containerId": "12243"
      },
      {
        "id": 21639,
        "name": "zrclip_002p45ce784e.png",
        "hash": "fe25421df35519889f1ca969a2874647edcde4ac",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 49704,
        "containerId": "12243"
      },
      {
        "id": 21640,
        "name": "zrclip_006n5cdd7abb.png",
        "hash": "65afea129341be0159ed11dd2d2230df281afe2c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 66861,
        "containerId": "12243"
      },
      {
        "id": 21641,
        "name": "zrclip_005n659bde55.png",
        "hash": "cc22375d7fc81ee9b17fbfe9ad466a21b108967b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 84531,
        "containerId": "12243"
      },
      {
        "id": 21642,
        "name": "zrclip_007p66ec86dd.png",
        "hash": "66af75dea32b1f56f75f23bb0da55150b88aa02d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 133950,
        "containerId": "12243"
      }
    ]
  },
  {
    "id": 70,
    "title": "[번역] 허드슨을 이용한 지속적인 통합(Continuous integration with Hudson) #2",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1230813784000,
    "body": "> doortts | 2008-12-31 수요일 오후 4:29 | Better SW Development | [원본](http://blog.doortts.com/70)\n\n자바월드([http://www.javaworld.com/](http://www.javaworld.com/))에 기고된 허드슨(Hudson) 글을 번역해서 올려 봅니다. 매우 상세하게 설명되어 있어서 CI 서버가 생소한 사람들도 어렵지 않게 따라갈 수 있도록 되어있습니다.\n\n**이번 회는** 허드슨 CI 서버(Hudson CI server)에 대한 두 번째 번역입니다. 이번에는 '**허드슨에서 빌드 세팅하기'**에서 '**빌드 업무(build job)을 설정'**하는 부분까지 입니다. 번역 분량이 적지 않다보니, 다소 시간이 걸렸습니다. 자세하게 다듬지 않아 내용이 어색할 수 도 있습니다만, 가급적 너그럽게 보시고, 혹시 의미를 곡해하는 부분이 있으면 알려주세요. 수정하도록 하겠습니다.\n\n원문은 [http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html](http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html) 에서 살펴보실 수 있습니다.\n\n그럼, 밝고 희망찬 새해 되세요. 감사합니다. :)\n\n--------- started here ------------\n\n## 허드슨에서 빌드 세팅하기(Setting up a build in Hudson)\n\n당신은 윈도우즈XP에서 동작하는 톰캣, 혹은 우분투 리눅스에서 동작하는 JBoss 에 허드슨을 인스톨하는 절차를 지금까지 겨쳐왔다. 대부분의 단계들은 운영체제에서 어플리케이션 서버를 설치하고 관리자 작업을 수행하는 것에 관련되어 있었다.; 나는 당신이 허드슨을 인스톨 하는 것 그 자체는 사소한 부분이라는 것에 동의하리라 생각한다. 다음으로는, 빌드 업무를 구축할 수 있도록 허드슨에서 필요한 몇 가지 기본 설정 방법을 보게 될 것이다.\n\n### 전제조건\n\n빌드 업무(build job)를 셋업하기 전에, 아래와 같은 조건들이 반드시 만족되어야 한다.\n\n*   접근 가능한 소스 코드 저장소(repository)가 있어야 한다.\n*   저장소는 빌드를 필요로 하는 소스 코드를 담고 있어야 한다.\n*   저장소는 소스를 빌드하는 빌드 스크립트를 반드시 포함하고 있어야 한다. 허드슨이 간단한 쉘을 지원하지만, 여기서 말하는 스크립트는 보통 [Ant](http://www.javaworld.com/javaworld/jw-11-2005/jw-1107-build.html) 나 [Maven](http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html) 스크립트, NAnt 나 MSBuild 같은 빌드 스크립트를 말한다.\n\n본 글에서는, 예제 소스를 빌드하는데 [Ant version 1.7](http://ant.apache.org/bindownload.cgi) 을 사용할 것이다.\n\n### 허드슨 설정하기\n\n소프트웨어 빌드작업을 시작시키기에 앞서 허드슨에 있는 몇 가지 마이너한 설정에 주의를 기울일 필요가 있다. 우선, 허드슨에게 JAVA JDK 와 Ant 의 인스톨위치가 어디인지 알려주어야 한다. [http://localhost:8080/Hudson](http://localhost:8080/Hudson)의 허드슨 메인 페이지에서, **Manage Hudson** 링크를 클릭하여라. 이어지는 페이지에서, **Configure System** 을 클릭한다.\n\n시스템 설정 페이지에서, 목록의 첫 번째 항목인 **Home directory** 를 주의 깊게 보기 바란다. 이곳이 바로 허드슨의 모든 설정이 저장되고 모든 작업이 이루어지는 곳이다. 본 글의 뒷 부분에서 이 디렉터리를 다시 살펴볼 것이다.\n\nJDK와 Ant 인스턴스 둘 다 설정하기 위해서, 각각의 섹션 하단에 있는 **Add** 버튼을 누르자. 한 세트의 필드들이 설정 섹션 아래로 확장될 것이다. 이들 두 개의 섹션은 그림 10에서 보여주고 있다.\n\n[![zrclip_001p7ff5de71.png](/files/21643)})](http://www.javaworld.com/javaworld/jw-12-2008/images/AddingAntandJDK.jpg)\n\n#### 그림10\\. Ant와 JDK 설정하기\n\n각각의 경우에 있어, JDK와 Ant 인스톨을 식별해 주는 임의의 이름을 할당한다. 당신의 프로젝트 요구사항에 따라서 복수개의 인스턴스가 설정될 수 있기 때문에 겹치지 않는 임의의 이름을 할당할 필요가 있다. 예를 들면, 당신은 Java JDK 1.4, 1.6, 그리고 1.7용 인스턴스와 Ant 1.6, 1.7 용 인스턴스를 갖고 있을 수도 있다. 당신이 당신 프로젝트 빌드를 설정할 때에는, 사용하기 원하는 인스턴스를 선택하는 것이 가능하다.\n\n현재 빈 공백 필드로 보여지고 있는 JAVA_HOME과 ANT_HOME이 유효한 디렉터리가 아니라는 걸 허드슨이 즉각적으로 당신에게 알려준다는 점에 주목하길 바란다. 유효한 디렉터리가 입력되면, 경고가 사라지게 될것이다. 이게 바로 허드슨이 유저 친화적이라고 말할 수 있는 간단한 예의 하나이다. 허드슨은 디렉터리를 찾게 될 때야 비로소 에러가 발생하게 되는 방식이 아닌 즉각적인 피드백을 준다.\n\n나는 이미 Java 1.6 JDK를 설치했기 때문에, 다음과 같이 JDK 인스톨 정보를 설정할 수 있다.\n\n*   **name**: JDK 1.6.0_07\n*   **JAVA_HOME**:\n    *   **Windows**: C:\\jdk1.6.0_07\n    *   **Linux**: /usr/lib/jvm/java-6-sun\n\n만일 당신인 윈도우즈를 사용하고 있다면, 간단하게 [Ant 설치파일](http://ant.apache.org/bindownload.cgi) 을 다운로드 받아 대상 디렉터리에 압축을 풀어버리면 된다. 우분투라면, Ant 를 설치하기 위해 아래와 같은 명령어를 사용할 것이다.\n\n\n\n\n\n```\nsudo apt-get install ant\n sudo apt-get install ant-optional\n ant -version\n Apache Ant version 1.7.0 compiled on August 29 2007\n```\n\n\n\n\n\n우분투의 인스톨 명령은 Ant를 /usr/share/ant 에 설치할 것이다.\n\n그림11은 우분트에서의 JDK와 Ant 설정을 보여주고 있다. 인스톨된 위치를 지정하는 필드들을 입력하면, 경고표시가 사라진다. 나는 올바르지 않게 설정된 Ant의 두 번째 인스턴스를 또 하나 추가했다. 만일 당신이 Ant 인스턴스가 설치된 올바른 디렉터리는 아니지만, 유효한 디렉터리 경로를 입력했다면, 그림에서처럼 당신이 입력한 항목이 올바르지 않은 것 같다는 허드슨의 경고를 보게 될 것이다. JDK나 Ant 둘 다 마찬가지다. 나는 그 후에 이 잘못된 Ant 항목을 지웠고, 유효한 것 하나만 남겼다.\n\n[![JDK and Ant configured under Ubuntu](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_AddingAntandJDK2.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/AddingAntandJDK2.jpg)\n\n#### 그림 11\\. 우분투에서의 JDK 와 Ant 설정\n\n같은 폼의 약간 아랫부분에서는, 실행가능한 CVS 의 장소를 지정할 수 없 다는 경고가 보일 것이다. 만일 CVS를 사용하지 않는다면, 가볍게 무시해도 된다.\n\n이 페이지에서 중요한 마지막 항목은, 허드슨이 빌드 실패 같은 중요한 이벤트들을 이메일로 당신에게 알려줄 수 있게 하는 SMTP 설정이다. 만일 당신의 SMTP 서버가 인증를 필요로 한다면, 고급 옵션(advanced)을 사용할 필요가 있다. 나는 내 Google Apps 호스트 도메인을 사용한다. 하지만, 만일 당신이 Gmail 계정을 가지고 있다면, 당신은Google SMTP 서버와 Gmail 어드레스를 사용할 수 있다. 그림12에서 보이는 것이 본인의 허드슨 서버 이메일 설정이다.\n\n[![Configuring Hudson's SMTP forwarder using Google's mail server](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_SMTPConfiguration.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/SMTPConfiguration.jpg)\n\n#### 그림12\\. 구글 메일 서버를 이용한 허드슨 SMTP 발송 설정 (클릭하면 확대됨)\n\n기본적인 시스템 레벨의 설정은 이제 끝났다. 당신은 이제 특정 빌드 작업(build job)을 설정할 준비가 되었다.\n\n## 허드슨에서 빌드 업무 설정하기 (Configuring a build job in Hudson)\n\n[http://localhost:8080/Hudson](http://localhost:8080/Hudson) 에 있는 허드슨 메인 페이지에서, **New Job** 링크를 클릭하여라. 그림 13은 그 다음에 나타날 화면을 보여주고 있다. 여기에서, 당신은 새로운 빌드 업무(build job)에 이름을 할당한다. 새로 빌드 업무 만드는 데에는 몇 가지 옵션이 있다. 하지만, 이 글의 범위에서는, **Build a free-style software project** 라고 이름 붙여진 타입에 집중할 생각이다. 내가 종종 사용하는 다른 옵션 타입 하나는 **Copy existing job** 이다. 이 타입은 이미 존재하는 빌드 업무를 복사해서 새 빌드 업무를 만들고자 할 때 손 쉽게 사용 가능한 타입이다.\n\n[![New job name](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_NewJobName.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/NewJobName.jpg)\n\n#### 그림13\\. 새로운 업무(Job) 이름 (마찬가지로 클릭하면 확대 됨)\n\n본 예제에서는, java.net의 Subversion에 저장되어 있는 HeliosJMX 프로젝트 용 빌드 업무를 세팅할 예정이다. 나는 trunk에서 바로 꺼낸 신선하고 따끈따끈한 소스를 빌드할 예정이기 때문에, 해당 빌드 업무를 **HeliosJMXTrunk** 라고 이름붙였다. 그렇게 이름을 입력한 다음, **OK** 를 클릭했다.\n\n다음으로는 새로운 빌드업무에 대한 다량의 설정 항목이 꽤 길게 이어진다. 이 설정의 상세한 내용은 아래 목록과 같다. 이 폼에 있는 각각의 옵션 오른쪽에는 작은 물음표(?) 아이콘이 있다. 어떤 설정 옵션이던지 좀 더 상세화된 설명을 보려면 망설이지 말고 클릭해라. 클릭한다고 해서 다른 페이지로 이동되어 버리는 식으로 진행중인 작업내용이 소실되거나 하진 않는다. 대신에, 허드슨은 도움말을 바로 페이지 안으로 간단히 나타나게 한다. 그래서 도움말 기능(Help)을 사용하는 것은 무시해도 좋을 정도로만 참견한다. 사실상 이 모든 설정들은 윈도우즈나 리눅스 둘 다 동일하다.\n\n*   **프로젝트 이름(Project name)**: 난 이미 HeliosJMXTrunk 라고 프로젝트 이름을 지었지만, 여기에서 바꿀 수 있다.\n*   **설명(Description)**: 빌드 업무에 대해 기술할 수 있는 자유 형식 폼 필드\n*   **오래된 빌드 버리기(Discard old builds)**: 허드슨은 이 체크박스를 선택하지 않는다면, 이전 기록을 보관할 것이다.\n*   **이 빌드작업은 파라미터화 됨(This build is parameterized)**: 만일 이 옵션을 선택하면, 허드슨은 빌드 프로세스에 전달 가능한, 이름-값 쌍으로 이루어진 임의의 파라미터 세트 제공을 허락 할 것이다. 설정 파라미터들은 러닝 빌드 환경에서 환경 변수로 지정될 것이다.\n*   **프로젝트 기반 보안 활성화(Enable project-based security)**: 허드슨은 유저들이 허드슨 웹 페이지를 접근할 때 인증작업을 하기 위한 전체 보안 스키마를 지원한다. 또한 이 보안 스키마는 어떤 유저들이 어떤 빌드 업무를 건드리는 것이 가능한지에 대한 제어를 제공할 수 있다. 나는 이 허드슨 인스턴스에서 보안은 설정하지 않았다.\n*   **빌드 불가(Disable build)**: 이 항목이 체크되면, 옵션이 비 활성화 될때까지 이 빌드 업무는 실행되지 않을 것이다.\n*   **고급 옵션(Advanced options)**: 나는 이 옵션 중에 사용하는 것은 없다. 하지만 이 체크 박스를 선택하면, 다음과 같은 옵션들이 인터페이스에 나타나게 된다.\n    *   정숙 기간(Quiet Period): 빌드 수행이 예정되었을 때 실제 수행 이전에 발생하는 정숙 기간(=휴지기간)을 설정할 수 있다. (즉, Delay time과 동일의미, 0 이면 build now! 의 의미)\n    *   커스텀 워크스페이스를 사용(_Use custom workspace)_: 기본적으로, 허드슨은 ${jboss-home}/.hudson/jobs/[project name] 에 빌드 업무용 워크스페이스를 만든다. 이 옵션은 당신 다른 장소를 지정하는 것을 가능케 해준다.\n*   **소스 코드 관리(Source code management)**: 기본적으로 사용 가능한 세 가지 옵션은 다음과 같다.\n    *   Subversion\n    *   CVS\n    *   None**None** 옵션은 소스 코드 저장소가 선행조건이라고 앞서 말한 나의 단정사항에 위배된다. 그러나 대부분의 경우에 있어, 허드슨과 함께 어떤 유용한 일을 하려면 종류는 어찌되었든 저장소가 필요하다는 걸 여전히 지지한다. 이 글 뒷부분에서, 허드슨 플러그인들이 어떻게 설치되는지 소개할 것이다. 만약 당신이 SCM 관련 플러그인을 설치한 다음 허드슨을 재시작하면, 이 목록에 새로운 옵션이 보이게 될 것이다. 이 글에서, 나는 Subversion 을 사용하고 있다. 당신이 Subversion을 선택한다면, 설정 섹션이 폼에 확장되어 나타날 것이다. 다음 섹션에서 이 섹션에 대한 설정을 따로 소개할 것이다. (\"서브버전 업무 설정\"을 볼것)\n*   **다른 프로젝트들이 빌드 된 다음에 빌드(Build after other projects are built)**: 이 옵션은 (한 업무가 다른 업무의 결과물에 의존을 갖는 업무 의존성) **조립 라인**이나 몇 개의 관련 프로젝트를 그룹으로 묶어 간단히 함께 빌드하길 원하는 것 같은 **시나리오**를 지원한다. 이것을 선택하면, 이 빌드가 실행하기 전에 먼저 실행할 콤마(,)로 분리된 다른 프로젝트 이름들을 입력하기 위한 필드가 제공될 것이다.\n*   **SCM 폴링(Poll SCM)**: 이것은 CI 시스템들을 위한 고전적인 옵션이다. 이 옵션을 선택하면, 얼마나 자주 허드슨이 당신의 저장소 변경을 체크할 것인지를 정의하는 크론 표현식(cron expression)을 지정할 수 있다. 만일 변경이 발견되면, 빌드가 수행될 것이다. 예를 들어, 표현식이 0,15,30,45 * * * * 이라면 허드슨은 매 15분 마다 변경을 위해 당신의 저장소를 체크할 것이다. 크론 문법에 대한 좀더 상세한 내용은 [the Quartz CronTrigger javadoc](http://quartz.sourceforge.net/javadoc/org/quartz/CronTrigger.html) 을 살펴보길 바란다.\n*   **주기적인 빌드(Build periodically)**: (마찬가지로 크론 표현식으로 정의된) 이 옵션은 허드슨에게 SCM의 변경과 관계없이 특정 주기로 프로젝트를 빌드할 것을 간단하게 지시한다. 이 옵션은 SCM은 비교적 고정적인데 반해, 테스트 환경은 어떤 식으로든 주기적으로 생기는 경우, 그런 테스트의 실행을 하고자 할 때에 도움이 될 수 있다.\n*   **빌드 단계 추가하기(Add build step)**: 빌드 스크립트를 실행하기 위한 지시사항을 추가하려면 이 버튼을 클릭하여라. 지시사항은 다음 중 하나가 될 수 있다.\n    *   쉘 실행하기\n    *   윈도우 배치 명령어 실행\n    *   Ant 호출 (이게 내가 사용할 옵션이다. 자세한 내용은 아래에서 설명할 것이다)\n    *   탑 레벨 Maven 타켓 호출\n*   **아티팩트 아카이브 하기(Archive the artifacts)**: 이 옵션을 선택해서 파일이나 디렉터리 마스크(mask = include와 exclude를 지정할 수 있는 Ant 스타일의 마스크)를 지정할때, 마스크와 일치하는 아티팩트들은 빌드가 완료되면, 허드슨 아티팩트 저장소에 추가되고 빌드 업무와 빌드 시퀀스 넘버를 사용해서 키값(key)으로 만들어지게 될 것이다. 옵션에 따라, 허드슨 서버의 디스크 공간을 절약하기 위해서 성공적으로 빌드된 이전의 모든 아티팩트들을 버릴 수 있다.\n*   **사용 추적을 위해 파일들의 사용 흔적을 기록 (Record fingerprints of files to track usage)**: 이 옵션을 선택하면, 비슷한 형태의 Ant 스타일 마스크(mask)를 사용해서, 허드슨으로 하여금 생성된 아티팩트들의 사용흔적(fingerprints)을 유지하도록 지시할 수 있다. 그렇게 해서, 시스템 내의 다른 어느 곳에서 이들 아티팩트들이 사용되는지를 당신이 좀 더 쉽게 추적할 수 있게 해준다.\n*   **Javadoc 만들어내기(Publish javadoc)**: 만일 당신의 빌드 스크립트가 javadoc 컨텐트를 생성해낸다면, 이 옵션은 허드슨으로 하여금 해당 컨텐트를 만들어 낸 다음 곧바로 업무 홈 페이지에 게시할 것을 지시할 것이다. 빌드가 성공한 모든 경우에 있어 javadoc 컨텐트는 계속 유지될 것이다. 그러나 기본적으로 마지막에 해당하는 것만 유지된다.\n*   **JUnit 테스트 결과 보고서 만들어내기(Publish JUnit test result report)**: 만일 당신의 빌드 스크립트가 JUnit 테스트를 수행한다면, 이 옵션은 허드슨으로 하여금 XML테스트 결과 문서를 처리해서 각각의 성공적인 빌드의 진행 보고서를 생성해 내고, 지속적으로 결과들을 모으도록 지시한다. 모인 결과가 바로 업무 홈 페이지에 있는 보고서에 해당하며, 오랜 시간에 걸쳐 수행된 빌드 업무용 단위 테스트의 기록이 될 수 있는 트랜드(historical trends)로 보여주는 보고서이다.\n*   **다운스트림 테스트 결과 모으기(Aggregate downstream test results)**: 어떤 경우에는, 한 업무의 단위 테스트 스위트의 수행 시간이 실제 빌드 시간 보다 엄청 더 길다. 이런 경우에는, 빌드와 테스트를 각각 다른 업무로 분리하는 것을 선택할 수 있다. 그래서 상대적으로 빌드가 빠르게 종료될 수 있도록 말이다. 하지만, 구현되어 있는 하나 이상의 테스트 업무들은 빌드가 성공적으로 완료되면 그 즉시 수행되게 된다. 만일 당신이 이 옵션을 선택하면, 허드슨은 모든 빌드 후속 업무들의 테스트 결과들을 모으고, 소급 적용하는 식으로 해당 내용들을 주요 빌드 업무에 대한 테스트 결과로 보고할 것이다.\n*   **다른 프로젝트 빌드하기(Build other projects)**: 앞선 항목들과 관련되어서, 이 옵션은 하나의 논리적인 빌드와 테스트 프로세스를 연속적으로 수행되어야 하는 두 개 이상의 물리적인 업무로 구현하기 위해 사용된다. 이 옵션을 선택되면, 필드가 보여지게 될텐데, 이 필드에는 현재 업무 이후에 수행되길 원하는 업무 이름들을 콤마(,)로 분리해서 기입하면 된다. 이 작업은 비록 현재 현재 업무 수행이 빌드가 불안정하다고 판단할 지라도 선택한 내용에 따라 수행된다.\n*   **이메일 공지(E-mail notification)**: 이 옵션을 선택하면, 하나 혹은 그 이상의 공백으로 분리된 이메일 주소를 입력할 수 있고, 해당 이메일로 허드슨의 업무 수행 완료 공지가 보내지게 된다. 빌드 실패, 불안정 빌드 등의 이벤트들은 이메일 발송을 일으키게 된다. 여기에 있는 추가적인 옵션은 허드슨이 판단하기에 빌드를 깨뜨린 코드를 SCM에 체크인 한 작업자에게 \"특별한\" 이메일을 보내도록 만드는 것이다.\n\n이것들은 숙지해야 하는 적지 않은 정보들이다. 다음으로, 이 모든 것이 어떻게 작동하는지 좀 더 잘 이해하기 위해서, 빌드 업무의 예제를 살펴 볼 것이다. 이를 통해, 설정 옵션이 실제로 의미하는 것이 무엇인지를 알 수 있을 것이다.\n\n### 허드슨에서 빌드 업무 설정하기: 예제\n\n이어지는 내용은 내 허드슨 서버에 설정되어 있는 실제 빌드 업무의 예제이다. 이 빌드 업무는 HeliosJMX라고 불리는 내가 작성한 유틸리티 라이브러리를 빌드한다. 이 섹션에 있는 모든 이미지들은 이전 섹션에서 살펴본 New Job 화면에서 따왔다.\n\n그림 14에서, 프로젝트 이름, 설명, 그리고 허드슨이 마지막 5개의 빌드만 유지하도록 하는 버림 정책(discard policy )을 볼 수 있다.\n\n[![Example job setup, Part 1](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JobConfiguration1.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JobConfiguration1.jpg)\n\n#### 그림14\\. 업무 셋업 예제, 파트1\n\n그림 15는 해당 업무(job)의 서브버전 셋업을 보여준다. java.net 에 있는 서브버전 저장소용 URL은 [https://helios.dev.java.net/svn/helios/helios-jmx/trunk](https://helios.dev.java.net/svn/helios/helios-jmx/trunk) 이다. 로컬 모듈 디렉터리(**Local module directory** ) 프로퍼티는 업무 워크스페이스에 만들어지게 되는 선택적이고 추가적인 하위 디렉터리 이다.\n\n**Use update** 체크박스는 매우 중요하다. 허드슨이 빌드 수행용 워크스페이스를 준비하기 위한 가장 빠른 방식은 간단하게 서브버전 저장소로부터 해당 디렉터리를 refresh 하는 것이다. 이 작업은 대부분의 경우에 적절하며 매우 빠르다. 그러나 어떤 인스턴스들에서는, 워크스페이스가 업데이트 될 때에 저장소로부터는 이미 제거된 소스 아티팩트들이 남아있을 수도 있다. 차선책은 이 옵션을 불가로 만드는 것이다. 해당 경우에 있어 허드슨은 워크스페이스를 깨끗히 비우고 저장소로부터 다시 불러올 것이다.\n\n마지막 옵션은 FishEye 나 VisualSVN 같은 소스 저장소 브라우저를 할당한다. 만약 당신 이들 제품 중 사용 가능한한 것이 있다면, 적용 가능한 해당 브라우저를 선택해서, 당신의 소스 저장소를 지정해 놓아라.\n\n[![Example job setup, Part 2](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JobConfiguration2.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JobConfiguration2.jpg)\n\n#### 그림15\\. 업무 셋업 예제, 파트2\n\n그림 16에서 내가 선택한 빌드 트리거를 볼 수 있다. 나는 매 5분마다 서브버전을 조사해서 변경사항이 있으면 빌드작업을 수행하길 원한다.\n\n[![Example job setup, Part 3](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JobConfiguration3.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JobConfiguration3.jpg)\n\n#### 그림16\\. 업무 셋업 예제, 파트3\n\n그림17은 빌드 프로세스를 수행하기 위해 내가 정의해 놓은 Ant 태스크의 셋업을 보여준다. 설정 옵션들은 아래와 같다.\n\n*   **Ant 버전(Ant version)**: 빌드를 수행 시에 사용하려고 미리 정의해 놓은 Ant 인스턴스\n*   **타겟들(Targets)**: 지정한 Ant 스크립트 중에서 수행되어야 하는 타겟들의 목록. 스크립트의 디폴트 테스크가 실행될 경우에는, 빈 칸으로 남겨 놓을 수 있다.\n*   **빌드파일(Build file)**: 유효 워크스페이스를 기준으로 놓고 봤을 때, 수행되어야 하는 Ant 스크립트의 상대적인 위치.\n*   **프로퍼티들(Properties)**: Ant 스크립트로 전달될 추가 시스템 프로퍼티 정의값. 나는 서브버전 인증정보를 스크립트로 전달하기 위해 이들 프로퍼티들을 사용했다. 왜냐하면 내 작업 절차에는 몇 가진 변경사항들을 저장소로 반영하는 단계가 포함되어 있기 때문이다. 추가적으로, 나는 내 단위 테스트들 위한 설정 파라미터들에 해당하는 몇몇 파라미터들을 정의했다.\n*   **자바 옵션들**: 자바 명령행 옵션들을 여기에서 전달할 수 있다. 여기에서 나는 Ant의 -debug 옵션을 할당했다. 왜냐하면 나는 Ant 스크립트에 있는 디버깅 문제에 대해 작업하고 있었기 때문에, 해당 옵션을 사용해서 Ant가 추가적인 분석정보들을 로그에 생성하게 하였다. 다른 흔한 옵션은 기동되는 JVM의 초기 힙 사이즈(-Xms)와 최대 힙사이즈(-Xmx)를 특정하는 지시문들이다. 이 옵션은 빌드 스크립트를 수행하기 위해 허드슨에 의해 실행되는 모든 새로운 JVM 인스턴스가 따르게 된다.\n\n[![Example job setup, Part 4](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JobConfiguration4.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JobConfiguration4.jpg)\n\n#### 그림17\\. 업무 셋업 예제, 파트4\n\n그림18은 내가 정의한 빌드 후속 액션들을 보여준다.\n\n*   **아티팩트 아카이브하기(Archive artifacts)**: 허드슨에게 빌드가 완료되면 해당 아티팩트들을 아카이브 할 것을 지시한다. 이것은 Ant 스타일의 파일 마스크로, 유효한 워크스페이스에 상대적인 디렉터리와, 파일이름들, 그리고 아카이브 될 확장자들을 지정한다. 아카이브된 아이템들은 업무 빌드 인스턴스 홈 페이지를 통해 접근가능하게 될 것이다. 고급 옵션(advanced options)은 마스크에서 제외될 것들을 지정 가능하게 해주며, 마지막으로 성공한 빌드에서 생성된 것들을 제외한 모든 아카이브 된 아티팩트들을 지우는 옵션을 갖는다.\n*   **javadoc 만들어내기**: 이전 옵션과 비슷하다. 하지만 빌드 프로세스에 의해 생성된 임의의 javadoc 컨텐트에 대해 적용 가능하다.\n*   **JUnit 테스트 결과 보고서 만들어내기**: 허드슨에게 미리 정의된 위치에 JUnit XML 결과 문서를 얻어내고 기록이 될 수 있는 트랜드 보고서로 취합할 것을 지시한다.\n\n[![Example job setup, Part 5](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JobConfiguration5.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JobConfiguration5.jpg)\n\n#### 그림18\\. 업무 셋업 예제, 파트5\n\n그림19는 내가 정의해 놓은 빌드 후속 액션들을 좀 더 많이 보여준다.\n\n*   **FindBugs 분석 결과 만들어내기**: 나의 빌드 스크립트는 해당 빌드 업무와 연관되어 있는 소스코드에 대한 [FindBugs](http://www.javaworld.com/javaworld/jw-11-2003/jw-1121-quality.html) 정적 코드 분석을 수행해서 findbugs 보고서를 생성한다. 이 옵션은 [허드슨 FindBugs 플러그인](http://hudson.gotdns.com/wiki/display/HUDSON/FindBugs+Plugin)이 설치된 경우에 사용가능하다. 이 옵션은 허드슨으로 하여금 정의된 FindBugs XML 결과 보고서를 불러와서 업무 홈 페이지에 게재되는 히스토리컬 FindBugs 경향 보고서로 취합할 것을 지시한다. FindBugs 플러그인용 고급 옵션은 보고되어 지는 FindBugs 단정 항목들과 허드슨이 판단하는 해당 빌드 업무의 상태에 관한 최종 결정에 그 단정 항목들이 어떻게 영향을 끼치게 할 것인지에 대한 카테고리를 정할 수 있게 해준다.\n*   **이메일 공지**: 빌드 실패시 공지를 보낼 공백으로 분리된 이메일 주소를 지정한다. 빌드 업무가 영구적으로 불안정한 상태이거나 깨진 상태일때, **Send email for every unstable build** 옵션을 언체크 하는 것은 이미 알고 있는 상태에 대해서 계속적으로 공지가 되는 것을 막아준다.\n*   **Cobertura 커버리지 보고서 만들어내기**: 나의 빌드 스크립트는 생성된 클래스를 조율하기 위해 코드 커버리지 지시자로 [Cobertura](http://cobertura.sourceforge.net/) 를 사용한다. JUnit 테스트가 실행할때, Cobertura 는 코드 커버리지를 추적하고 테스트가 완료되면 커버리지 보고서를 생성한다. 이 옵션은 허드슨 Cobertura 플러그인이 설치되면 사용가능하다. 이 옵션은 허드슨으로 하여금 정의된 Cobertura XML 커버리지 리포트를 불러와서 마찬가지로 업무 홈페이지에 기록으로 남을 수 있는 Cobertura 트랜드 보고서로 게재하기 위해 취합된다. **Coverage Metric Targets** 이라고 이름붙은 섹션은 빌드 업무의 상태에 대한 허드슨 최정 결정에 영향을 미치는 **코드 커버리지 맵**의 레벨을 정하는 방법을 지정할 수 있게 해준다. (이것에 관해서는 '빌드 업무의 상태' 섹션을 보아라)\n\n[![Example job setup, Part 6](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_JobConfiguration6.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/JobConfiguration6.jpg)\n\n#### 그림19\\. 빌드 업무 셋업 예제, 파트6\n\n이 시점에서, 만일 당신이 새 업무를 정의를 마쳤다면, 실행해서 어떻게 동작하는지 볼 시간이다. 당신의 빌드 트리거들이 어떻게 설정되었든 상관없이, **Disable Build** 를 체크하지 않는 한 언제든 애드 혹(ad hoc, 특별한)빌드를 요청할 수 있다. 당신이 새로운 빌드 업무를 구축하거나 위에 있는 스크릿샷에서 보이는 것처럼 내가 했던 디버깅을 구축할때, 빌드 트리거를 기다리는 것은 사리에 맞지 않는다. 다음 섹션에서, 나는 빌드를 실행하도록 애드 혹을 요청하는 방법과 수행되고 있는 빌드 업무를 볼 수 있는 방법을 보여줄 것이다.\n\n## 빌드 업무를 실행하고 지켜보기 Running and watching a job\n\n에 대해서는 다음에 계속 하겠습니다. 다음 번에는 이번 보다 좀더 흥미로운 이야기가 나옵니다.\n\n#### Comments\n\n음 결국 #2가 나왔어!(칙셔-)\n연휴에 허드슨 번역만 열심히 하고 있다니!\n(이봐 이봐... 어디로 가고 있는 거야.)\n\nps. 나도 묘하게 끌리는 .. (안되어!)\n\n [M-o-N](http://nephilim.tistory.com) | 2009-01-02 금요일 오전 3:26\n\n--\n\n흠......... CVS 계정 페스워드는 도대체 어디다가 넣어야해요? \n권한 없는 계정이 하나 필요한건가요 ? ㅜ \n막혔어요;;ㅋ\n\n [성윤](http://helols.tistory.com) | 2009-03-03 화요일 오후 3:15\n\n--\n\n성윤!! \n-_- 무슨 말인지 잘 모르겠어. 미안.\n\n [doortts](http://blog.doortts.com) | 2009-03-04 수요일 오후 8:47\n\n--\n\nㅋ; 스터디때 만나면 ..다시 물어볼꼐요;;ㅋ\n\n [성윤](http://helols.tistory.com) | 2009-03-04 수요일 오후 10:49\n\n--\n\n안녕하세요. 허드슨과 Coverage 구성해 보고 있습니다. 그런데, 당췌 위치가 잘 못 되었는지 어쨌는지.. 안 되네요.\n그런데, 분명 로컬(이클립스) 테스틀 하거나, 허드슨이 빌드한 디렉토리 가보면 있는데, 왜자꾸  C:\\.hudson\\jobs\\JDBCTemplate\\workspace\\JdbcTemplate-Snapshot' 이쪽을 가르키는지 모르겠네요.\n\nNo coverage results were found using the pattern 'JdbcTemplate-Snapshot/dist/report/cobertura/coverage.xml' relative to 'C:\\.hudson\\jobs\\JDBCTemplate\\workspace\\JdbcTemplate-Snapshot'.  Did you enter a pattern relative to the correct directory?  Did you generate the XML report(s) for Cobertura?\nFinished: FAILURE\n\n Richpapa | 2010-01-19 화요일 오전 11:53\n\n--\n\n안녕하세요? 답변이 늦었습니다. \n에러 내용으로 봐서는 JOB 이름을 JDBCTemplate 로 만드셧던것 같군요.\n\n방법이 2가지 있습니다\n\n1. report 경로를 지정하실 때 pattern 매칭으로 찾아버리기\n\n**/*coverage.xml\n\n2. 상대경로로 정확히 지정하기\nJOB이름/경로/coverage.xml\n\n혹, JOB 이름이 틀렸거나, 절대 경로를 지정하신건 아니신지 모르겠습니다. \n\n그럼 건승하세요!\n\n [doortts](http://blog.doortts.com) | 2010-01-26 화요일 오후 3:31\n\n--\n",
    "attachments": [
      {
        "id": 21643,
        "name": "zrclip_001p7ff5de71.png",
        "hash": "f37d3be038d384e88c501c0613b4cc1b6504fe7b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 22116,
        "containerId": "12244"
      }
    ]
  },
  {
    "id": 71,
    "title": "의사 결정 회의를 드라마틱하게 만들어 줄 기본 원칙 몇 가지",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1230823903000,
    "body": "> doortts | 2009-01-02 금요일 오전 12:31 | 이생각 저생각 | [원본](http://blog.doortts.com/71)\n\n1.  **이해 당사자만 참여한다.**\n    * 자신이 무슨 일을 하는지 많은 사람에게 알리는 것을 목적에 내포하는 경우가 있는데 이는 정치에 가까운 일이며, 회의의 **목적**에 맞지 않고 팀원의 시간을 소비한다.\n    * 경우에 따라서는 자신의 주제에 대한 불안감으로 인한 다양한 사람을 불러 좀 더 나은 아이디어를 얻고자 하는 경우가 있다. 이런 경우는 공개적으로, 그리고 사전에 브레인스토밍 모임임을 선언해야 한다.\n\n2.  **발표중이라면 질문은 노트등에 적어서 질의응답시간을 이용한다.**\n    * 질문하고자 하는 내용의 답이 당사자의 발표가 끝나기 전에 나오는 경우가 적지 않다.\n    * 또한, 발표의 흐름을 끊고, 시간을 지연시킨다.\n\n3.  **회의 진행자는 회의 방향이 주제와 일치하고 있는지 계속 체크한다.**\n    * 본 회의의 결정주제와 상관없는 이야기가 길어지지 않도록 이야기를 끊을 수 있어야 한다.\n\n4.  **가급적 한 사람이 오랫동안 이야기 하는 일이 없도록, 시간제한을 둔다.** * 1회 발언은 2분 미만 \n    * 총 소요시간을 1시간 이내로 한다.\n    * 제한을 두어도 안전장치를 두지 않으면 지켜지지 않게 되는 경우가 많으므로 시간이 지나면 진행자가 이야기를 마무리 시켜야 한다.\n\n5.  **의사 결정회의는 브레인 스토밍이 아님을 숙지 시킨다.**\n    * 선택지는 회의 참여자들에게 사전에 공지되어야 하며\n    * 회의 중에 신규로 나온 아이디어에 대해서는 가급적 회의중에 선택지 중 하나로 포함하지 않으며\n    * 담당자를 정해서 추후에 회의에서 정해진 의사 결정안과 비교하는 자료를 작성하게 한다.\n    * 그로 인해 변경이 필요한 경우에는 메일 회람등을 통해 재 모임이 필요한지 여부를 결정하게 한다.\n\n6.  **한 번의 회의로 결정을 지어야 하는 사안이 아닌 경우에는 베스트 안이 아닌 다수의결 안건을 선택해서 최대한 빨리 실행한다.**\n    * 모든 결함(Defect)이 제거된 안을 선택하는 것은 소요시간/비용/노력 대비 효율이 떨어진다.\n    * 2:8의 법칙과 지속적인 개선 방식을 적용하여 최선안을 개선해 나가거나, 빠르시간안에 실행가능여부를 판단할 수 있도록 한다.\n\n7.  **사안을 결정짓지 못하고 다음에 다시 모이기로 한 회의, 혹은 목표시간을 넘긴 회의는 실패로 규정한다.**\n    * 실패는 문제점을 찾아 개선할 수 있으면 실패가 아님을 인식한다.\n    * 따라서 실패는 받아들여져야 하며, 회의 진행 자체도 지속적으로 개선해야 한다.\n    * 또한 사람들은 **실패**라는 단어에 민감하기 때문에 되풀이 되지 않기 위해 노력하게 된다. \n\n8.  **'회의 진행 기법은 반드시 지켜져야 하며, 익숙하지 않기 때문에 처음엔 다소 힘들 수 도 있다'는 사실을 참여자가 모두 인식해야 하며, 자기 개선의 의지를 가져야 한다.**  \n\n**기타 권장 기법**\n- 회의테이블이 작을 경우 발언권 장갑 같은 아이템을 이용하여, 아이템이 없는 사람은 발언에 끼어 들지 않게 한다.\n- 모레시계/타이머\n- 회의 점수표 이용 (회의 시간 정시 착석 +1점. 발언 +1점. 발언시간 준수 +1점 등등), 단 점수표를 네거티브(-) 점수제로 운영하면 분위기에 +가 되지 못하므로 유의."
  },
  {
    "id": 72,
    "title": "Occupational disease (職業病)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1230988204000,
    "body": "> doortts | 2009-01-03 토요일 오후 10:10 | 이생각 저생각 | [원본](http://blog.doortts.com/72)\n\n아.. 무슨색 핸드스트랩을 살까... 고민하던 중..\n\n**앗! 성공이다!!** 하면서 산 스트랩.. (...)\n\n[IMG_5839.JPG](/files/21644)\n\n...\n\n이 정도면 중증.. 이지 않나 싶다.",
    "attachments": [
      {
        "id": 21644,
        "name": "IMG_5839.JPG",
        "hash": "2cf9604ac3f507262302c840ba1eb28357aa9207",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 120711,
        "containerId": "12246"
      },
      {
        "id": 21645,
        "name": "IMG_5841.JPG",
        "hash": "941f488c88ea0ba757fbdd425a677e5775288528",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 110654,
        "containerId": "12246"
      }
    ]
  },
  {
    "id": 73,
    "title": "[번역] 허드슨을 이용한 지속적인 통합(Continuous integration with Hudson) #3",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1231047220000,
    "body": "> doortts | 2009-01-04 일요일 오전 2:43 | Better SW Development | [원본](http://blog.doortts.com/73)\n\n자바월드([http://www.javaworld.com/](http://www.javaworld.com/))에 기고된 허드슨(Hudson) 글을 번역해서 올려 봅니다. 매우 상세하게 설명되어 있어서 CI 서버가 생소한 사람들도 어렵지 않게 따라갈 수 있도록 되어있습니다.\n\n허드슨 CI 서버(Hudson CI server)에 대한 세 번째 번역분량입니다. 다음 번에는 마무리 될 것 같습니다. 해야 할 일이 많은데, 어쩌다가 허드슨에 빠져 버렸네요. :) 이번 분량은 '**빌드 업무 실행과 지켜보기'** 입니다. 이전과 마찬가지로 자세하게 다듬지 않아 내용이 어색할 수 도 있습니다만, 가급적 너그럽게 보시고, 혹시 의미를 곡해하는 부분이 있으면 알려주세요. 수정하도록 하겠습니다.\n\n원문은 [http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html](http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html) 에서 살펴보실 수 있습니다.\n\n--------- started here ------------\n\n## 빌드 업무 실행과 지켜보기 Running and watching a job\n\n최근에 만든 빌드 업무의 첫 번재 빌드를 실행하기 위해서, [http://localhost:8080/hudson](http://localhost:8080/hudson) 에 있는 허드슨 대시보드로 이동한다. 그림 20은 내 우분투 서버에 본인이 구축한 새로운 허드슨 인스턴스의 브랜드를 보여주고 있다.\n\n#### ![The Hudson dashboard](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_HudsonDashboard.jpg)\n\n#### 그림20\\. 허드슨 대시보드(Hudson dashboard)\n\n내가 정의해 놓은 HeliosJMXTrunk 빌드 업무가 화면 중앙에 보인다. 이 화면에서 주목할 만한 몇 가지 항목은 다음과 같다.\n\n*   회색의 원형 아이콘은 빌드 업무의 상태를 나타낸다. 본 예제에서는, 한 번도 빌드가 일어난 적이 없기 때문에 회색이다.\n*   왼쪽에 **빌드 큐(Build Queue)**라고 라벨이 붙여져 있는 테이블은, 현재 실행중이거나 실행하기 위해서 대기열에 들어있는 빌드 업무를 보여준다. **빌드 수행 상태(Build Executor Status)**라고 라벨이 붙은 테이블은 할당된 빌드 쓰레드의 상태를 보고한다. 기본값으로, 허드슨은 두 개의 빌드 쓰레드를 할당하며, 이것은 허드슨이 동시에 두 개까지 빌드 업무를 수행할 수 있음을 의미한다. 이 숫자를 수정하려면, **Manage Hudson** 을 클릭한 다음 **Confifure Executors**를 클릭한다. 소프트웨어 빌드는 꽤나 자원 집약적인 경향이 있는 관계로, 쓰레드 숫자는 조심스럽게 설정해야 한다. 동시 빌드를 너무 많이 지정하면 허드슨 서버에 적당하지 않은 수준의 부하를 주게 될 것이고, 결과적으로 당신의 빌드 업무를 느리게 만들 것이다.\n*   RSS 피드(feed) 아이콘을 주목하여라. 허드슨은 이벤트 공지 방법 중 하나로 RSS 피드를 제공한다. 그리고 이 피드에는 전반적인 시스템용 피드와 각각의 개별적인 빌드 업무 보고용 피드가 있다.\n    *   성공적인 빌드\n    *   불안정한 빌드\n    *   깨진 빌드\n    *   SCM 변경\n\n빌드를 요청하기 위해서는, 빌드 업무 리스트 테이블의 오른쪽 끝에 있는 빌드 아이콘을 클릭하면 된다. 혹은, 빌드 업무 이름을 클릭해서 빌드 업무 홈페이지로 이동한 다음, **Build Now** 라고 이름 붙은 아이콘 링크를 클릭할 수도 있다.\n\n한번 빌드 업무가 실행되면, 실행중인 빌드 업무 리스트를 대시보드나 빌드 업무 홈 페이지에 있는 대기열(Queue)에서 볼 수 있다. 이들 두 개의 뷰는 그림 21에서 볼 수 있다.\n\n#### ![zrclip_001pe0ceb8a.png](/files/21646)})\n\n#### 그림 21\\. 실행중인 빌드 업무에 대한 두 개의 서로 다른 뷰\n\n전형적인 형태로, 어떤 시점에서 당신은 현재 실행중인 빌드 업무의 결과물을 봄으로써 빌드 업무의 진척상황을 보길 원할 것이다. 그렇게 하려면, 빌드 업무 홈페이지로 이동해서 **Console Output** 을 클릭하여라. 만일 빌드 업무가 끝나면, 빌드 스크립트에 의해 생성된 정적인 결과물을 보여줄 것이다. 하지만 만약 빌드 업무가 여전히 실행 중이라면, 허드슨은 계속해서 페이지의 내용을 갱신해서 현재 발생하는 결과물들을 볼 수 있게 해줄 것이다. 그림 22는 매우 유용한 해당 기능에 대해 보여주고 있다.\n\n#### ![zrclip_002n107ac5a2.png](/files/21649)})\n\n#### 그림22\\. 실행중인 빌드 업무의 결과물을 보여주는 라이브 콘솔\n\n빌드가 한 번 완료되고 나면, 세 곳에서 빌드 업무 완료가 보여질 것이다.\n\n*   그림 23처럼, 허드슨 대시보드에서 해당 내용을 볼 수 있다.\n*   그림24처럼, 빌드 업무 홈 페이지에서 해당 내용을 볼 수 있다.\n*   빌드 이력에 있는 특정 빌드 링크를 클릭해서, 허드슨이 빌드 인스턴스용으로 특별해 생성한 해당 빌드의 홈 페이지로 이동할 수 있다. 이 내용은 그림 25에서 보여주고 있다.\n\n[![The Hudson dashboard, showing the completed job](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_DashboardCompletedJob.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/DashboardCompletedJob.jpg)\n\n#### 그림23\\. 완료된 빌드 업무를 보여주고 있는 허드슨 대시보드\n\n대시보드에 있는 심볼들의 의미는 \"빌드 업무 상태(Job state)\"라고 이름 붙은 아래의 섹션에 요약되어 있다. 간략하게 말하자면, 노란 원은 빌드가 성공은 했지만 불안정하다는 것을 나타낸다. W 컬럼에 있는 작은 태양 아이콘은 \"날씨\"를 나타내는데, 빌드가 성공했고 후속 작업 플러그인들이 허드슨에게 문제사항이 없다고 보고했기 때문에 해당 날씨는 \"햇볕 쨍쨍\"이다. 여기에서 또 하나 주목할 내용은 마지막 빌드의 지속 시간이 15분이었다는 점이다. 그렇게 된 이유는 의도적으로 오래 실행되게 스케줄 잡혀있는 컴포넌트용 단위 테스트가 내 테스트 스위트 내에 들어 있기 때문이다. 이 업무는 빌드와 테스트를 나누어 놓은 좋은 예가 될 수 있을 것이다.\n\n#### ![zrclip_005n12b983ee.png](/files/21648)})\n\n#### 그림 24\\. 완료된 빌드 업무를 보여주는 빌드 업무 홈 페이지\n\n빌드 업무 홈 페이지는 몇몇 흥미로운 항목을 포함한다. 왼편에 있는 링크들은 (**New Job** 에서 정의한 것을 수정하기 위해서) 해당 빌드 업무 설정용 명령어와 빌드 업무를 삭제하고, 해당 빌드 업무를 실행하기 위한 명령어들이다. 오른편에 있는 것들은 가장 최근의 프로젝트와 아티팩트들에 대한 링크들이다.\n\n![zrclip_006p4c675a14.png](/files/21647)})\n\n#### 그림25\\. 완료된 빌드를 보여주는 빌드 홈 페이지 Figure 25\\. The build home page for the completed build\n\n빌드 홈 페이지는 해당 빌드 인스턴스를 지정한다. 허드슨이 내부적인 빌드 넘버를 할당한다는 점에 주목하여라. 이 빌드 넘버는 분산된 빌드들을 추척하는 데에 유용하다. 이 페이지는 실패한 세 개의 JUnit 단위 테스트 케이스뿐 아니라 서브버전에서 발견된 리비전들(revisions)도 목록으로 보여준다. (이번 빌드에서 리비전 변경은 없었다). 여기에서 이 들 세 개의 실패가 허드슨이 해당 빌드를 '불안정상태(unstable)'로 표시하게 된 원인이다. 불안정 상태란 해당 소프트웨어가 에러 없이 빌드는 되었으나, 단위 테스트는 에러가 있음을 의미한다. 그림26은 단위 테스트에 에러가 없고, 그래서 안정된 빌드(stable build)로 지정된, 새로운 빌드가 끝난 후의 대시보드와 프로젝트 페이지의 섹션들을 보여준다.\n\n[![The dashboard and job home page after build #2](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_PagesAfterBuild2.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/PagesAfterBuild2.jpg)\n\n#### 그림 26\\. #2 빌드 후의 대시보드와 빌드 업무 홈 페이지\n\n나는 이제 빌드 업무를 설정하고 빌드 트리거를 지정하고 애드 혹(ad hoc) 빌드를 요청하기 위해 필요한 모든 단계들을 아우를 수 있게 되었다. 남은 것은 허드슨이 빌드 업무의 상태를 표시하기 위해 사용하는 스키마에 대해 짧게 논의해 보는 것이 남았다.\n\n### 빌드 업무 상태(Job states)\n\n위에 보이는 스크린샷에서, 빌드 업무의 현재 상태를 나타내는 두개의 아이콘을 보았을 것이다. 허드슨은 빌드 업무의 전체적인 현황을 나타내기 위해서 두 개의 개념을 사용한다.\n\n*   **빌드 업무 상태(Job state)**: 그림 27은 가장 최근에 수행된 빌드 업무가 가질 수 있는 네 개의 상태 심볼을 요약해 보여준다.\n    *   성공(_Successful)_: 빌드가 완료되었고 안정적으로 간주됨\n    *   불안정(_Unstable_): 빌드가 완료되었고 불안정한 것으로 간주됨\n    *   실패(_Failed_): 빌드가 실패함\n    *   사용불가(_Disabled_)빌드 업무가 사용불가임\n\n*   **빌드 업무 안정도(Job stability)**: 빌드 업무가 완료되고 이슈없이 대상 아티팩트를 생성할지라도, 허드슨은 플러그인 형태로 구현된, 그러니까 암묵적으로 안정도를 평가하기 위해 만들어 놓은 후속 작업들에 기반하여 해당 빌드에 (0~100 사이의) 안정도 점수를 부여할 것이다. 이 암묵적인 작업들이란 단위 테스트들(JUnit), 커버리지(Cobertura), 정적 코드 분석(FindBugs)을 포함한다. 해당 점수가 높으면 높을 수록 빌드는 더 안정적이다. 그림28은 안정도 점수 범위에 따른 심볼들을 요약해서 보여준다.\n\n![Job states](http://www.javaworld.com/javaworld/jw-12-2008/images/JobStates.jpg)\n\n#### 그림27\\. 빌드 업무 상태(Job states)\n\n![Job stability](http://www.javaworld.com/javaworld/jw-12-2008/images/JobStability.jpg)\n\n#### 그림28\\. 빌드 업무 안정도(Job stability)\n\n## 빌드 트랙들 Build tracks\n\n에 대해서는 다음에 이어서 계속하겠습니다.\n\n#### Comments\n\n이런 다음이라는 군...\n\n [M-o-N](http://nephilim.tistory.com) | 2009-01-05 월요일 오전 12:45\n\n--\n",
    "attachments": [
      {
        "id": 21646,
        "name": "zrclip_001pe0ceb8a.png",
        "hash": "066f163a102f3af7599da32191b6bc8e090af63d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 64353,
        "containerId": "12247"
      },
      {
        "id": 21647,
        "name": "zrclip_006p4c675a14.png",
        "hash": "3086062b09541be01931a918cc43706672489a8e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 123462,
        "containerId": "12247"
      },
      {
        "id": 21648,
        "name": "zrclip_005n12b983ee.png",
        "hash": "604799f96c73bcad8feebc065c0311f496001fc5",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 155496,
        "containerId": "12247"
      },
      {
        "id": 21649,
        "name": "zrclip_002n107ac5a2.png",
        "hash": "1f3cf666db9f34373a4c05532d1d961e247e032a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 216030,
        "containerId": "12247"
      }
    ]
  },
  {
    "id": 75,
    "title": "XMPP 기반 메신저 Spark와 google talk 연동하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1231130235000,
    "body": "> doortts | 2009-01-05 월요일 오후 1:37 | Better SW Development | [원본](http://blog.doortts.com/75)\n\n예전부터 메신저 기능을 위해서 [XMPP](http://xmpp.org/)를 지원하는 [Jive Software](http://www.igniterealtime.org/)의 클라이언트 Spark 와 서버 Openfire 를 사용하고 있었습니다.\n\nXMPP 기반 메신저들은 호환이 가능한 관계로, google talk 와도 연동해서 쓰고 있습니다.\n\n아래는 google talk와 연동시 필요한 설정 내용입니다.\n\n![zrclip_003p72a84643.png](/files/21650)})\n\nserver = gmail.com\n\n![zrclip_002n426571e5.png](/files/21651)})\n\nadvanced 버튼을 누른다음에는\n\n* * *\n\n\"Automatically discover host and port\" 언체크!\n\nHost = talk.google.com\n\nPort = 5223\n\nUse OLD SSL = checked\n\n* * *\n\n하시면 되겠습니다.\n\n참고로, 허드슨(hudson)과 연동도 가능합니다. (^_^);\n\n#### Comments\n\n좋은 정보 감사드립니다. 복 받으실 거에요!! ^^\n\n 나그네 | 2010-11-09 화요일 오전 10:25\n\n--\n",
    "attachments": [
      {
        "id": 21650,
        "name": "zrclip_003p72a84643.png",
        "hash": "7df7289a343091281f3935e371a5c6d7f99cb91e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 18696,
        "containerId": "12248"
      },
      {
        "id": 21651,
        "name": "zrclip_002n426571e5.png",
        "hash": "e6266732728c83dac72dd70e71a2628a3f5c2e30",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15732,
        "containerId": "12248"
      }
    ]
  },
  {
    "id": 76,
    "title": "[번역] 허드슨을 이용한 지속적인 통합(Continuous integration with Hudson) #4",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1231253817000,
    "body": "> doortts | 2009-01-06 화요일 오후 11:51 | Better SW Development | [원본](http://blog.doortts.com/76)\n\n허드슨 CI 서버(Hudson CI server)에 대한 네 번째, 마지막 번역분량입니다.\n\n네. 그렇습니다. 이번엔 발로 번역했습니다. (상상은 자제를..-,-);; .. 고로, 한국어를 번역해야 하는 부분이 충.분.히 있을 수 있습니다.\n\n가급적 너그럽게 보시고, 혹시 의미를 곡해하는 부분이 있으면 알려주세요. 수정하도록 하겠습니다.. 라고는 하지만, 아무도 뭐라하는 사람이 없어서 마음편하게 썼습니다. (하.하.하! 이제 부턴 새출발을!)\n\n...\n\n본 글은 자바월드([http://www.javaworld.com/](http://www.javaworld.com/))에 기고된 글을 번역한 것으로 허드슨(Hudson)에 대해서 매우 상세하게 설명되어 있어서 CI 서버가 생소한 사람들도 어렵지 않게 따라갈 수 있도록 되어있습니다.\n\n원문은 [http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html](http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html) 에서 살펴보실 수 있습니다.\n\n--------- started here ------------\n\n## 빌드 트랙들 Build tracks\n\n허드슨은 복수개의 빌드 트랙을 만들수 있게 해준다. 당신의 소프트웨어 개발 절차에 따라, 당신은 소프트웨어 프로젝트 당 하나 이상의 빌드 트랙을 만들어 내기를 원할 수 있다. 빌드 트랙은 고유한 설정을 갖고 있는 하나의 특정한 프로젝트나 프로덕트를 위한 빌드 업무이다. 동일한 프로젝트에 대한 빌드 트랙들을 서로 구분짓는 요소들은 해당 빌드 업무에서 가져온 소스 코드의 SCM 브랜치(branch)가 될 수도 있다. (즉 한 프로젝트 내에서 브랜치가 여러개 발생하면, 그에 따라 빌드들이 개별적인 '트랙'이라는 형태로 존재하게 될 수 있다는 이야기이다) 다른식으로는, 서로 다른 트랙들이란 같은 소스에 대해 수행하게 되는 서로 다른 작업들의 세트가 될 수도 있다. 논리적으로 동일한 소프트웨어 프로젝트에 대해 어떻게 서로 다른 빌드 트랙들을 만들지를 지시하는 것에 따른 영향은 다음과 같다.\n\n*   **소스 컨트롤 브랜치들(Source control branches)**: 많은 개발 팀들은 그들의 소스 컨트롤 시스템에서 소스 코드의 여러 버전에 대한 개발을 동시에 깔끔히 지원하기 위해서 일련의 브랜치들을 유지해 나간다. 이와 같은 경우에, 오래되어 사용하지 않는 브랜치들에 대해서 뿐 아니라, 개발에 사용되는 각각의 브랜치에 대해서 분리된 빌드 트랙을 만드는 것은 사리에 맞는다. (여기에서 구버전들을 관리하는 이유는 소프트웨어의 구 버전들이 카탈로그화 되어서 경우에 따라서는 쉽사리 다시 만들어 내기 위해서이다)\n    *   트렁크 빌드: 가장 최신의 활성화된, 그리고 종종 변경이 일어나는 기반 소스\n    *   릴리즈 빌드: 지속적인 릴리즈에 한정되어 있는 개별 분리된 브랜치. 소스 코드는 대부분 안정화 되어 있다. 하지만 트렁크 개발은 향후 릴리즈를 위해서 지속적으로 변경된다.\n    *   버그 수정 빌드: 메인라인(=trunk) 활동으로부터 격리된 상태에서 버그를 수정하기 위해 생성된 개별 브랜치\n    *   실험적인 빌드: 기반 소스에 실험적인 아이디어를 테스트 하기 위해서 생성된 개별 브랜치. 결국엔 메인라인 소스가 되지 않을 수 있음.\n*   **빌드 업무 작업 카테고리들**: 다른 소스 기반에 대한 빌드는 어떠한 특정 브랜치들의 현재 활동이나 상태에 따라 다른 빌드 세트나 연속적인 빌드 작업이 필요할 수도 있다. 예를 들면, 다음과 같은 경우에 개별 트랙들을 구축하길 원할 수도 있다.\n    *   안정성에는 관심이 없지만 빌드 여부와 빌드 아티팩트들이 사용가능 여부를 정기적으로 심플하게 확인하길 원하는 경우 같은 **간단한 빌드 확인 업무(Simple build verification jobs)**\n    *   다소 띄엄띄엄 수행할 수도 있는, 그리고 아티팩트들을 빌드하고 소스 코드와 빌드된 아티팩트들에 대해서 풀 테스팅 스위트를 수행하는, **빌드와 안정성 확인 빌드(Build and stability verification builds)**\n    *   전체 빌드와 안정성 테스트 스위트들을 수행하고 배포를 위해 전달하게 되는 것들을 패키징하기 위한 일련의 작업들을 완료하는 **릴리즈 후보 업무(Release candidate jobs)**\n    *   릴리즈 후보가 배포를 위해 준비되고 패키지된 아티팩트들이 공개 저장소에 자동적으로 업로드 되었을때, 전체 릴리즈를 완료하기 위해 필요한 다른 작업들과 함께 수행되는 **전체 릴리즈 업무(Full release jobs )**\n*   전달가능한 고려사항들: 정확하게 동일한 코드 브랜치와 빌드 작업은 다소 다른 툴을 사용해서 빌드될 필요가 있을 수 있다. 예를 들면, 당신은 당신 클래스들의 버전들을 자바 1.5용과 자바 1.4용으로 분리해서 릴리즈 하도록 원할수 도 있다.\n\n그림29는 소스 컨트롤 브랜치들과 그에 관련된 허드슨 빌드 트랙들 사이에서 생길 수 있는 논리적인 구조를 보여준다.\n\n#### ![zrclip_007p35a4c2b7.png](/files/21653)})\n\n#### 그림29\\. 소스 컨트롤 브랜치들과 허드슨 빌드 트랙들\n\n허드슨은 기존 빌드 업무를 복사하는 식으로 새로운 빌드 업무를 쉽게 만들수 있다. 그렇게 하기 위해서는, 허드슨 대시 보드로 가서, New Job 링크를 클릭한다. 새로운 빌드 업무의 이름을 입력한 다음 **Copy existing job** 을 선택한다. 당신이 타이핑을 시작할 때에, 허드슨은 당신이 타이핑하는 것과 일치하는 복사 가능한 기존 빌드 업무 목록을 보여준다. 그리고 나서 OK를 누르면, 새로운 빌드 업무가 만들어질 것이다. 이 절차는 그림 30에서 보여주고 있다.\n\n[![Creating a new job as a copy of an existing job](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_NewJobCopy.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/NewJobCopy.jpg)\n\n#### 그림30\\. 기존 빌드 업무를 복사해서 새 빌드 업무 생성하기\n\n당신은 이미 이런식으로 새 빌드 업무를 한번 만들었을텐데, 빌드 업무의 이름을 제외하고는 기존 빌드 업무를 복사한 것과 실제로 동일하다. 그래서 항목을 변경하는 식으로 새로운 복사본을 변경하고 싶을 것이다. 예를 들면 다음과 같은 작업을 원할 수 있다.\n\n*   워크스페이스가 가져온 소스 컨트롤 대상 브랜치를 수정하기\n*   허드슨이 실행할 빌드 스크립트나 빌드 스크립트 대상을 수정하기\n*   허드슨에서 Ant 스크립트로 넘길 시스템 파라미터 수정하기\n\n### 뷰 사용하기 Using views\n\n이미 당신은 몇 개의 빌드 트랙을 만들었기에, 당신의 대시보드가 긴 빌드 업무 목록으로 다소 어지럽게 되었다고 느낄 수 있다. 대시보드를 정리하는 쉬운 방법은 뷰(Views)를 만드는 거다. 대시보드 뷰는 대시보드에 분리된 탭안에서 보여지는 연관있는 빌드 업무들의 그룹이다. 그리고 그 그룹은 당신이 임의로 정의할 수 있다. 관련있는 빌드 업무들을 그룹핑하는 뷰를 만들 때, 일관성있는 빌드 업무 네이밍 컨벤션을 구현하는 것이 유익하다는 것을 알게 될 것이다.\n\n뷰를 만들려면, 대시보드에 + 로 라벨이 붙은 작은 탭을 클릭하여라. 새로운 뷰 페이지에서, 새로운 그룹의 이름과 선택적인 설명을 입력하여라. 당신이 해당 뷰에 포함하길 원하는 특정 빌드 업무를 선택할 수 있도록 허드슨은 현재 설정된 모든 빌드 업무에 대해 라벨 붙은 체크박스를 제공할 것이다.\n\n그러나, 내 생각하기에 빌드 업무의 그룹을 만드는 더 나은 방법은 **Use a regular expression to include jobs in the view(뷰에 빌드 업무를 포함하기 위해서 정규 표현식을 사용하기)**라고 이름붙은 체크박스를 클릭해서 당신이 그룹에 포함시키기를 원하는 빌드 업무의 이름을 매치시킬 수 있는 정규 표현식을 적는 것이다. 이게 바로 손쉬운 일관성 있는 네이밍 컨벤션이다. 당신은 일반적인 소프트웨어 프로젝트나 혹은 가능한 경우, 빌드 타입으로 빌드 업무를 하나로 그룹핑하는 뷰를 설정할 수 있다. 나는 후자의 접근법을 선택하고, 그림31에서처럼 빌드 업무에 release 라는 단어가 들어간 모든 빌드 업무를 포함하는 릴리즈 빌드(Release Build)라고는 이름의 뷰를 만들었다.\n\n![zrclip_001n78c1132.png](/files/21652)})\n\n#### 그림31\\. 대시보드 뷰 만들기 F\n\n정규 표현식으로 빌드 업무를 포함시키는 방법을 사용했을 때의 추가적인 이점은 새로운 빌드 업무가 생길때, 빌드 업무 이름과 매치되는 어떤 뷰에든 자동적으로 추가될 것이라는 점이다. 반면에 특정 빌드 업무를 선택해서 그룹핑하는 뷰는 손수 업데이트를 해주어야 한다.\n\n그림32는 빌드 타입 기반으로 새롭게 정리된 대시보드를 보여주고 있다.\n\n[![Dashboard views by build type](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_DahboardViews.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/DahboardViews.jpg)\n\n#### 그림32\\. 빌드 타입으로 나눈 대시보드 뷰\n\n## 허드슨 플러그인들 Hudson plugins\n\n_허드슨 플러그인_이라는 말은 허드슨의 기존 기능을 확장하는 라이브러리들과 허드슨에 새로운 기능을 추가하기를 원하는 개발자들용 확장성을 제공하는 방법, 이 두가지를 다 의미할 수 있다. 어떤 플러그인들은 단순히 당신의 빌드 프로세스에 유용한 추가기능이 될 수도 있고, 혹은, CVS나 Subversion 이외의 다른 소스 컨트롤 시스템을 지원하기 위해 구현한 SCM 플러그인, 환경구축시에 허드슨을 사용하기 위해 필요한 무언가가 될 수도 있다.\n\n현재 수 많은 플러그인들이 사용가능한 관계로, 여기에서 모든 리스트를 다루진 않을 것이다. 하지만, 일반적인 플러그인 카테고리는 다음과 같다.\n\n*   **SCM**: 허드슨이 CVS나 서브버전이외의 소스 컨트롤 시스템을 지원하기 위해 구현한 플러그인들\n*   **트리거들**: 이벤트를 감시하고 빌드를 촉발하는 플러그인들. 예를들자면, URL 변경 트리거는 URL을 감시할 것이다. 해당 주소에 있는 컨텐트가 변경되면, 트리거는 빌드 업무를 수행할 것이다.\n*   **빌드 도구들**: MSBuild나 Rake 같은 추가적인 빌드 도구를 구현한 플러그인들. 이 플러그인들은 허드슨에서 자바가 아닌 소프트웨어를 빌드하고자 할 때 매우 유용하다.\n*   **빌드 랩퍼들(Build wrappers)**: 자신의 빌드 프로세스 전 후에 제어된 이벤트들을 수행하는 것에 특별히 관련된 플러그인들. 예를 들면, VMware 플러그인은 빌드 전에 게스트 VM을 시작시키고, 빌드가 끝난 다음에 중지시킬 것이다. 단위 테스트들을 수행하기 위해서 게스트 VM이 필요한 상황에서 유용하다.\n*   **빌드 공지 관련(Build notifiers)**: 이 플러그인들은 빌드 업무 이벤트 관련 공지를 발행하는 대안 방법들을 지원해 준다. 대안 방법에는 Twitter나 IRC, 구글 캘린더 이벤트 같은 것들이 있다.\n*   **슬레이브 런처와 컨트롤러들(Slave launchers and controllers)**: 본 글에서 소개되지 않은 허드슨의 매우 강력한 기능 중 하나는, 마스터 허드슨 인스턴스를 대신해 작업을 수행하는 슬레이브 허드슨을 가지는 능력이다. 현재 이 카테고리에는 단 하나의 플러그인 만이 존재한다. SSH 링크를 통해 슬레이브를 관리하는 SSH 슬레이브 플러그인이 바로 그것이다.\n*   **빌드 보고서들(Build reports)**: 당신의 소스코드난 생성된 아티팩트를 분석한 몇가지 양식에 기반한 유용한 보고서들을 만드는 일련의 플러그인 들이다. 예를 들면, Cobertura 플러그인은 당신의 빌드 스크립트에 의해 생성된 지속적 커버리지 보고서들을 모은다.\n*   **외부 사이트 통합(External site integrations)**: 허드슨과 Jira나 버그질라 같은 다른 어플리케이션들을 통합하는 걸 도와주는 플러그인들\n*   **아티팩트 업로더(Artifact uploaders)**: java.net 파일 저장소나, FTP 서버 같은 어떤 네트워크로 연결된 종단점에 빌드된 아티팩트 배포를 돕는 플러그인들\n*   **페이지 데코레이터(Page decorators)**: 허드슨 웹 페이지의 미관을 꾸미거나 치장하는데 유용한, 몇 몇 플러그인들. 허드슨에서 제공하는 모든 페이지들에 구글 트래킹을 추가하는 구글 애널리틱스(Google Analytics) 같은 플러그인.\n\n허드스 플러그인 매니저는 당신의 허드슨 서버에 새로운 플러그인들을 인스톨하고 기존 것들을 업데이트할 수 있게 해준다. 이 매니저는 사용가능한 플러그인들과 플러그인 업데이트 목록을 가져오기 위해 온라인 저장소에 접속할 것이다. 만일 당신의 허드슨 서버가 외부 리소스에 접속할 수 없다면, 허드슨 웹사이트에서 당신이 원하는 [플러그인들을 다운로드](https://hudson.dev.java.net/servlets/) 할 수도 있다. 사이트에서 plugins 폴더를 클릭하면 사용가능한 플러그인 목록을 보게 될 것이다. 개별 플러그인 파일들은 .hpi 확장자를 갖는다. 당신이 플러그인을 다운받은 다음에는, 허드스 홈 디렉터리에 있는 플러그인 하위디렉터리에 해당 플러그인을 복사한다. (허드슨 홈 디렉터리는 .hudson 이라고 불리고, 허드슨 서버를 운영하는 사용자의 홈 디렉터리에 위치할 것이다.) 일단 해당 플러그인 파일이 복사되고 나면, 플러그인이 동작하도록 허드슨을 재시작 할 필요가 있다.\n\n허드슨 플러그인 매니저를 사용하기 위해서는, 대시보드에서 **Manage Hudson** 링크를 클릭한 다음, **Manage Plugins** 를 클릭한다. 플러그인 매니저는 그림33에 보여지고, 해당 매니저는 4개의 탭을 갖고 있다.\n\n*   **업데이트들(Updates)**: 허드슨이 업데이트 가능하다고 탐지한 플러그인 목록. 리스트에 올라있는 각각의 플러그인은 업데이트를 적용하기 위해해서 선택될 수 있다.\n*   **사용가능한 것들(Available)**: (현재 설치되어 있지 않은) 설치 가능한 플러그인 목록. 리스트에 올라있는 각각의 플러그인은 인스톨하기 위해서 선택가능하다.\n*   **인스톨(Install)**: 이미 설치된 플러그인 목록\n*   **고급(Advenced)**: 허드슨이 온라인 플러그인 저장소와 통신할 수 있도록 거쳐야 하는 HTTP 프록시를 설정할 수 있게 해준다. 추가적으로, 허드슨 외부에서 다운로드한 플러그인들을 설치하기 위해 사용할 수 있는 업로드 기능이 있다.\n\n[![The Hudson plugin manager](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_PluginsManager.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/PluginsManager.jpg)\n\n#### 그림33\\. 허드슨 플러그인 매니저\n\n일단 당신이 원한 플러그인이나 업데이트가 설치되면, 허드슨은 그것들을 적용하기 위해 재기동 되어야 한다. 만일 당신이 JBoss 를 사용한다면, 최초에 당신이 디플로이한 JBoss 디플로이 디렉터리에 있는 hudson.war 파일을 터치(unix의 touch)하는 걸로 효과를 발휘시킬 수 있다는 걸 주목해라. (touch는 특정 파일의 타임스탬프를 업데이트 하는 유틸리티이다)\n\n어떤 종류들의 빌드 보고서 플러그인들을 이해하기 위한 한 가지 중요한 컨셉은, 그것들이 당신을 위한 핵심 보고서를 반드시 생성하는건 아니라는 점이다. 그보다는, 보고서들이 생성될때마 지속적으로 보고서들을 모으는 추가적인 작업에 관심을 갖는다. 어떤 경우에는, 생성된 보고를 통합된 허드슨 네이티브 보고서로 다시 포맷팅해서 생성해 낼 것이다. 예를 들면, Cobertura 플러그인은 당신의 대상 테스트 클래스들의 절차를 구현하고 단위테스트를 수행하고, 해당 빌드 한정의 커버리지 보고서를 생성할 빌드 스크립트가 필요하다. 그러면 해당 플러그인은 동작중인 히스토리컬 커버리지 경향 보고서를 업데이트 한다. 그렇게해서 당신은 당신의 커버리지 퍼센트율이 시간에 따라 어떻게 변해가는지 비주얼화 할 수 있다. 이들 경향 보고서의 예제는 그림 34에서 볼 수 있다.\n\n![zrclip_001n1f75855b.png](/files/21654)})\n\n#### 그림34\\. 단위 테스트들, 정적 코드 분석, 코드 커버리지에 대해 이력으로 남은 경향들\n\n추가로, JUnit 테스트 결과들과 FindBugs 들은 빌드 업드 홈페이지나 인스턴스 홈 페이지에 표시되는 허드슨 네이티브 보고서를 만들어 내느 플러그인의 예시들이다. (JUnit 플러그인은 사실 빌트인 되어있어서 설치할 필요가 없다) 그림35는 빌드 인스턴스 페이지에 볼 수 있는 FindBugs 플러그인에 의해 생성된 빌트인 보고서의 예시이다. .\n\n[![FindBugs summary report for a build](http://www.javaworld.com/javaworld/jw-12-2008/images/thmb_FindBugsSummary.jpg)](http://www.javaworld.com/javaworld/jw-12-2008/images/FindBugsSummary.jpg)\n\n#### 그림35\\. 빌드에 대한 FindBugs 요약 보고서\n\n당신은 당신 생각가능한 어떤 종류의 허드슨 확장이든 실제로 제공하기 위해서 당신 스스로 플러그인을 구현할 수 있다. 만일 당신이 플러그인 확장을 구현하는데 관심이 있다면, 허드슨 위키에서 레펀런스와 문서, 그리고 튜터리얼을 찾을 수 있다. (아래 부분에 있는 리소스 섹션을 보길)\n\n## 결론\n\n이로서 허드슨 지속적인 통합 서버에 대한 소개는 끝이났다. 나는 허드슨이 끝내주는 소프트웨어라는걸 당신이 알게 될거라 생각한다. 쉬운 설치와 설정 덕분에, 당신은 매우 빠른 시간안에 구축해서 띄우고 동작시켜 볼 수 있다. 허드슨 개발 프로젝트가 자리잡고 있는 java.net 사이트에서의 활동 규모를 근거로 놓고 봤을때, 허드슨은 확실히 강한 추진력을 갖고 있다. 내가 띄엄띄엄 보곤하는 메일링 리스트에서도 사람들이 일관되고 빠르게 그들의 질문에 대한 응답을 받는 것을 알 수 있다. 언젠가는 내가 해당 내용을 필요할 날이 올 수도 있게지만, 어쨌든 현재까지는 지원을 찾기 위해 날 멈추게 하는 이슈에 맞닥드려본 적은 없다. 나는 당신이 허드슨에 대해 함께 탐험해 본 것을 즐겼길 바란다. -- 더 많은 글과 다운로드꺼리, 관련 링크는 아래의 리소스 섹션을 체크해 보아라.\n\n### 저자에 대해\n\n[Nicholas Whitehead](mailto:whitehead.nicholas@gmail.com) 은 시니어 테크놀로지 아키텍트이다. (a senior technology architect at the Small Business Services division of ADP in Florham Park, N.J.)\n\n\n\n### 리소스들(Resources)\n\n### Downloads\n\n*   Get the latest Hudson WAR file [here](http://hudson.gotdns.com/latest/hudson.war) or [here](https://hudson.dev.java.net/files/documents/2402/109746/hudson.war).\n*   Download [apache-tomcat-6.0.18.exe](http://tomcat.apache.org/download-60.cgi) to install Tomcat on your Windows machine. Download [JBoss 4.2.3.GA](http://www.jboss.org/jbossas/downloads/) for a Linux environment (look for the file named jboss-4.2.3.GA.zip).\n*   [Ant](http://ant.apache.org/bindownload.cgi) is the build tool used for examples in this article.\n*   [jboss-init.sh](http://www.javaworld.com/javaworld/jw-12-2008/jboss-init.sh) enables the automatic start and stop of the JBoss server.\n*   If your Hudson server cannot connect to outside resources, you can [download the plugins you need](https://hudson.dev.java.net/servlets/) from the Hudson Website.\n\n### Learn more\n\n*   \"[Introducing continuous integration](http://www.javaworld.com/javaworld/jw-06-2007/jw-06-awci.html)\" (Paul Duvall, Steve Matyas, Andrew Glover; JavaWorld, 2007): Get an overview of CI in this chapter excerpt from _Continuous Integration: Improving Software Quality and Reducing Risk_ (Addison-Wesley Professional, June 2007).\n*   \"[Which open source CI server is right for you?](http://www.javaworld.com/javaworld/jw-11-2006/jw-1101-ci.html)\" (John Smart, JavaWorld, 2006): Introduces and compares four top CI servers -- CruiseControl, Continuum, Luntbuild, and Hudson.\n*   _Java Power Tools_ author John Smart [talks shop about tools](http://www.javaworld.com/podcasts/jtech/2008/022808jtech.html) he's most likely to use for his own projects, including Hudson, in this podcast episode of JavaWorld's Java Technology Insider.\n*   Check out the [Hudson project](https://hudson.dev.java.net/) on Java.net.\n*   If you're ready to start using Hudson seriously, you should study up on [best practices](http://hudson.gotdns.com/wiki/display/HUDSON/Hudson+Best+Practices) (from the Hudson Wiki). You might also want to be aware of [CI anti-patterns](http://www.ibm.com/developerworks/java/library/j-ap11297/index.html) (Paul Duvall, IBM developerWorks, December 2007).\n*   Hudson was the most used CI server in an [informal developer survey](http://www.wakaleo.com/polls/18-what-continuous-integration-server-are-you-using-in-2008) in 2008\\. Learn more about the results [here](http://server.dzone.com/blogs/mrjohnsmart/2008/02/24/birds-eye-survey-world-continu).\n*   The procedure for installing JBoss outlined in this article has been condensed from [this useful thread](http://ubuntuforums.org/showthread.php?p=4031613) in the Ubuntu forums.\n*   Check out the [complete list of SCM plugins for Hudson](http://hudson.gotdns.com/wiki/display/HUDSON/Plugins#Plugins-Sourcecodemanagement).\n*   Find out more about the [Hudson FindBugs plugin](http://hudson.gotdns.com/wiki/display/HUDSON/FindBugs+Plugin).\n*   If you are interested in implementing your own plugin, check out these [references, documentation, and tutorials](http://hudson.gotdns.com/wiki/display/HUDSON/Extend+Hudson).\n*   Learn more about [Cobertura](http://cobertura.sourceforge.net/).\n*   Read the [Quartz CronTrigger javadoc](http://quartz.sourceforge.net/javadoc/org/quartz/CronTrigger.html) for information on the cron syntax Hudson uses\n\n",
    "attachments": [
      {
        "id": 21652,
        "name": "zrclip_001n78c1132.png",
        "hash": "7d926a0639dba55fcd7ae720e15304c4e2113065",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 30552,
        "containerId": "12249"
      },
      {
        "id": 21653,
        "name": "zrclip_007p35a4c2b7.png",
        "hash": "29f228b9cfb270314a02e74d3b24c6b6d74f3651",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 138795,
        "containerId": "12249"
      },
      {
        "id": 21654,
        "name": "zrclip_001n1f75855b.png",
        "hash": "3a0bca5090fa7fc678f8ad7ae0816dfe8f5b1197",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 161823,
        "containerId": "12249"
      }
    ]
  },
  {
    "id": 77,
    "title": "해커에서 고객까지, SW 사용자의 분류와 대처방법",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1231507729000,
    "body": "> doortts | 2009-01-09 금요일 오후 10:28 | 이생각 저생각 | [원본](http://blog.doortts.com/77)\n\nBalsamiq 라는 독립형 소형 소프트웨어 개발업체(Micro-ISV) 블로그에 [재미있는 글](http://www.balsamiq.com/blog/?p=382)이 있어서 소개해 봅니다.\n\n![zrclip_001p650d6c2e.png](/files/21655)})\n\n위 그림은 소프트웨어 구매자에서 해커까지의 스펙트럼을 나타냅니다. 실제 정확한 숫자에 의해서 그린 그림이 아니라, 생각과 믿음에 의해서 크기를 나누어 보았다고 하는데요, 한쪽 끝(붉은색)에는 절대 소프트웨어에 돈을 쓰지 않는 사람들이 있고, 반대 끝에는 (녹색) 업무를 위해 SW를 구매하는 사람이 있네요\n\n**붉은 색은 절대 SW에 돈 안써!** 에 해당하는 부류로, 해킹을 하거나 심지어는 리버싱을 해서 다른 이름으로 내다 팔기까지 하는 무리를 나타냅니다.\n\n그 다음은 **살 능력이 안되어!**거나 돈이 많지 않아서 훔쳐쓰는 사람들.\n\n중간에 있는 **노란색은 쉽게 훔쳐쓸수 있으면 걍 훔쳐쓰지 뭐!** 에 해당하는 사람들. 하지만 크랙된 해당 SW를 구하기가 쉽지 않다면 결국 돈을 지불할 대부분의 계층.\n\n옅은 녹색은 **법이 무서워서 구매!**하는 사람들. 혹은 자신의 사업규모를 운영하는 사람들.\n\n마지막으로 녹색은 **기꺼이 SW를 구매!** 하는 사람들로 정직하고 세금도 잘내는 부류로 분류했습니다.\n\n**자, 당신은 어느 부류인가요? 당신 PC의 프로그램은 당신을 어떤 부류로 만들고 있나요? :)**\n\n재미있는 점은, 해당 블로그 주인장(=젊은 Balsamiq 사장이죠)은 **소프트웨어 개발업자의 위 그림 상의 사람들에 대한 부류별 대처법**도 이야기 하고 있습니다.\n\n**SW를 훔쳐다 변형해 내다 파는 사람들**에 대해서는 우선 당신 SW에 EULA(End User License Agreement)와 Terms of Use를 잘 만들어 놓은 다음에 변호사랑 친하게 지내다가 불법이 발견되면 강력한 문구의 편지를 보내라고 합니다.\n\n**해커들은 어떻게 대해야 할까요?**\n\n싸우려 들지 말라고 하네요. :) 해커들은 맘만 먹으면 아침에 일어나서 아침 먹기도 전에 크랙하는 건 우스우니까, 구태여 그들을 막아보겠다고 괜히 코드를 꼬아 놓는다던가, 암호화 한다던가 하는 등등의 기타 기교를 부리지 말라는 군요. 자칫하다간 도발해서 북돋는다던가, 적을 만들수 있다는 거죠. **수 없이 많은 바이러스가 사실은 MS가 리눅스에 대해 공격적으로 발언하고 대응한 결과로 생겨났다고 합니다.** 그냥 점잖은 기업이 되라는 군요. 그래서 자신은 non-profits and do-gooders 들에게는 쉽게 라이센스를 주었고, 결과적으로 구글에서 balsamiq mockups serial 이라고 쳤을때 거의 안나오게 되었답니다.\n\n**난 SW는 돈으로 거래 되어선 안된다고 생각해!** 라 자유 소프트웨어 연맹 쪽(스톨만 계열?) 부류에게는 그냥 주랍니다. 어쨌든 안쓸 사람들이니까, 오픈소스 커뮤니티 같은데 기여도 하면서 말입니다.\n\n**살 능력이 안되어!** 부류에게는 쓸수는 있게 길을 마련해 주라는 군요. 대신에 다소 불편한 제약사항을을 걸어놓아서\n\n****노란색 부류**를 녹색쪽으로 이동시키는 일을 함께 하랍니다.**\n\n그리고 팁처럼 이야기 한 부분에서는 **라이센스 키에 사용자 이름을 포함**시키면 법이 무서워서 산다는 사람이 좀더 녹색쪽으로 이동하기 쉬워진답니다. 물론 마지막 **실 구매자는 정말 고마운 사람들**이니까 잘 하랍니다.\n\n자신의 소프트웨어에 정성을 다하고, 고객에 소리에 귀 기울이고 잘 지원하며, 사이트도 잘 관리하면 그게 구매자에 대한 보답이고 구매자는 더욱 신뢰하는 관계가 될 수 있다고 합니다.\n\n맞는 말인 것 같습니다. 좋은 SW는 그 자체의 가치보다 그 SW로 인해 구매자에게 더 큰 가치를 제공해 줄 수 있다면, 그리고 지속적으로 그들을 지원하는 로열티를 제공한다면, 서로 좋은 관계로 공생할 수 있을 것 같습니다. 그리고 그게 맞다는건 다들 알고는 있잖습니까? :)\n\n![zrclip_002n2e247f41.png](/files/21656)})\n\n참고로 [Balsamiq](http://www.balsamiq.com/) 는 위 스크린샷과 같은 SW 개발 목업(Mockup)을 만드는 걸 도와주는 SW를 만들어 파는 Micro-ISV입니다. UI 를 스케치하듯 디자인 할 수 있답니다. 자신이 non-profit bloger 라는 메일을 보내면 라이센스 키를 보내 줍니다. 그리고 저 제품은 Flash 기반 제품이라 위키나 블로그, [Confluence](http://www.balsamiq.com/products/mockups/confluence), [JIRA](http://www.balsamiq.com/products/mockups/jira) 등에 통합하는건 아주 쉽다네요.",
    "attachments": [
      {
        "id": 21655,
        "name": "zrclip_001p650d6c2e.png",
        "hash": "1be97fe5f6f91a43d08b993f588197be43b47335",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 46113,
        "containerId": "12250"
      },
      {
        "id": 21656,
        "name": "zrclip_002n2e247f41.png",
        "hash": "4cf378a7024ef80295b0cfe9eeb9f4abce4908d1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 112518,
        "containerId": "12250"
      }
    ]
  },
  {
    "id": 78,
    "title": "이슈관리 공학도구(Trac) 소개 및 예제화면, FAQ",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1231731978000,
    "body": "> doortts | 2009-01-12 월요일 오후 12:35 | Better SW Development | [원본](http://blog.doortts.com/78)\n\nFull Size Guide 를 만들었습니다만, 우선 간단한 소개와 FAQ를 먼저 공유하기 위해 정리해 보았습니다.\n\n적용소감을 간략히 이야기 드리자면\n\n**- 사용방법이 매우 간단해서 별다른 설명 없이도 직관적으로 사용할 수 있다\n\n- 이슈 공지(Notification)가 자동적으로 전달 되기때문에 이슈관리 대장(엑셀파일)을 계속 확인하거나 폴더들을 드나들 필요가 없다\n\n- 이슈의 흐름과 진척상황이 보인다.**\n\n입니다.\n\n기타 아래에 있는 FAQ에 상세한 내용을 담았습니다\n\n---------- started here ------------\n\n**이슈관리 공학도구(Trac) 소개 및 예제화면, FAQ 1\\. Trac 소개**\n\nTrac은 이슈의 관리와 할당/추적을 지원하는 오픈소스 제품입니다.\n\n기존의 툴들(버그질라, 맨티스)이 버그 추적(Bug Tracking)에 중점을 두었었다면, Trac 은 업무(task or issue)와 버그를 통합한 형태로 관리합니다. 한가지 독특한 점은 trac에서는 버그나 이슈를 티켓(Ticket)이라는 형태로 통칭해서 부르고 있다는 점입니다. 한글에서 동음 반복문이 좋은 표현이 아니라는 것처럼 issue the issue 라는 표현을 재치 있게 issue the ticket(티켓을 발행)이라는 형태로 표현하였습니다.\n\n**2 Trac 활용 화면 샘플**\n\nA. 텍스트 큐브 개발 환경 (권장)\ni. [http://dev.textcube.org/wiki](http://dev.textcube.org/wiki)\nii. http://blog.tattertools.com/153 (팀 디자이너의 사용후기)\n\nB. 교육용 환경 샘플 (그냥 참고 정도로만 보세요^_^)\n\n![zrclip_001n109ce115.png](/files/21658)})\n\n![zrclip_002n127617a0.png](/files/21660)})\n\n![zrclip_005n24a7e6b1.png](/files/21659)})\n\n![zrclip_003n5a64cb89.png](/files/21657)})\n\n![zrclip_006p460df360.png](/files/21661)})\n\n**3\\. Trac FAQ**\n\n**A. Trac 사용의 이점은 무엇입니까?**\n\n이 내용은 Trac 이라기 보다는 **이슈 트래커 사용의 이점**이 무엇인지에 대해 이야기 하는 것이 맞는것 같습니다.\n이슈 트래커의 대표적인 장점은, 프로젝트 이슈의 투명성, 공동작업에 효율성 증진, 지식축적, 릴리즈관리, 소스연동을 통한 접근성 강화 등이 있습니다. 이슈(=장애, 버그, 기능개선 요청 등)를 관리하는 전통적인 방식인 엑셀 파일관리나 웹 게시판 등의 방법은 이슈의 라이프사이클 제대로 제공하지 못하며, 결국 경험의 축적이 자산화로 연결되지 못하게 되는 흔한 경우를 만든다고 보시면 되겠습니다 프로젝트의 이슈는 프로젝트에서 정의한 이슈 작업흐름(work flow)에 따라 생성에서 종료까지가 이슈의 상태기반으로 담당자와 작업이 유기적으로 연결되어야 하며, 그 과정이 투명하게 보여야 하고, 이력(history)으로 남겨질 수 있어야 하겠습니다. 이슈 트래커들은 그 과정을 시스템 적으로 지원합니다.\n\n**B. Trac 은 어느 정도 규모에서 사용가능 한가요?**\n\nTrac 에서 제공하는Category(=component) 의 한계상 다층 깊이의 hierarchy는 제공하고 있지 않습니다. 따라서 부서와 파트가 많아지고 모듈이 많아지면 복잡도가 증가할 수 있습니다. 하지만 그 규모의 수준이란게 기반 프로젝트을 어떻게 하위 프로젝트로 사이징 할 수 있느냐에 따라 달라질 수 있습니다. 국외 사례는 제외 하더라도, 국내에서 대표적으로 알려준 케이스를 꼽자면, DAUM 에서는 Trac 을 전사적 기본 이슈 관리도구로 사용했으며, 최근 구글에서 인수한 TNC(태더&컴패니)의 유명한 블로그 툴인 Tatter Tools (Tistory 기반툴) 개발에 Trac 이 사용되었습니다. (여담으로 이야기 드리자면, 최근 DAUM은 JIRA라는 상용 제품으로 이슈 관리도구를 변경한 것으로 알고 있습니다. NAVER는 JIRA가 예전부터 표준 툴이었다고 들었습니다.) 우선은 Trac 이나 Mantis등의 오픈소스 툴을 사용하고, 상용툴로의 이전은 복잡도와 프로젝트 상황에 맞추어 가면 될 것 같습니다.\n\n**C. 이슈 관리의 단점은 없습니까?**\n\ni. 이슈 관리의 단점이라기 보다는 이슈 자체에 대한 잘못된 해석이 건강한 이슈관리를 훼손할 수 있습니다. 이를테면, **'이슈를 많이 만드는 팀은 문제 있는 팀'** 이라던가, **'결함이 많이 발견되는 모듈 개발자는 능력이 다소 부족한 개발자'** 같은 시각으로 일련의 '평가'와 이슈를 결부시키려고 하는 경우가 있습니다. 이것은 프로젝트의 이슈(=위험, Risk)자체를 투명하게 이끌어내어서 적극적으로 관리하고 경험으로 축적하고자 하는 이슈 트랙 시스템이 가진 선의의 의지와 상반되는 형태로 이슈 자체의 은폐를 조장할 가능성이 있습니다. 따라서, 절대로 이슈는 해결해야 하는 Task 그 이상도 이하로도 여기지 않는 풍토를 만드는 것이 중요합니다.\n\n**D. 기존 시각에서 볼 때 새로운 툴이라는 것에 대한 부정적인 시각은 어떠한가요?**\n\n저는 생산성을 높이기 위해서라면 사용할 수 있는 자원은 최대한 사용해야 한다고 봅니다. 한 사람이 고생해서 2사람 이상이 편해 질 수 있다면(즉, ROI가 맞는다면), 누군가는 해야 합니다. **'툴은 툴일 뿐!'**이라는 담언은 툴을 사용하지 말라는 담언이 아닙니다. 최대한 잘 사용하되 의존적이어서는 안된다는 이야기라는걸 모두들 아실 겁니다. 최초에 컴퓨터가 사무업무 기반을 대체할 수 있다고 생각한 사람은 많지 않았습니다. 하지만 그 생산성을 당해낼 수 없었기에 따라갈 수 밖에 없었으며, 중요한 점은 조기에 얼마나 혼란 없이 받아 들일 수 있는가가 관건이라 생각합니다.\n\n**E. 기타 이슈 관리 툴에는 어떠한 것들이 있나요?**\n\ni. MANTIS, 정확히는 MANTS BT (버그 트래킹), MANTIS BTS 등으로 불립니다. 버그 수집에 초점이 맞추어져 있었는데, 최근에는 보고서 기능을 필두로 이슈 관리쪽으로도 사용된다고 합니다. 데모는 [http://www.mantisbt.org/demo/my_view_page.php](http://www.mantisbt.org/demo/my_view_page.php) 에서 보실 수 있습니다.\n\nii. JIRA, 정확히는 Atlassian JIRA 입니다. 상용 툴로써 현재까지는 가장 활발히 이용되고 있고, 가장 발전된 형태라고 칭해지고 있습니다. [http://www.atlassian.com/software/jira/screenshots/default.jsp](http://www.atlassian.com/software/jira/screenshots/default.jsp) 에서 화면을 보실 수 있습니다. 요즘은 대부분 JIRA로 가는 추세인 것 같습니다. [http://jira.springframework.org/browse/SPR](http://jira.springframework.org/browse/SPR) 링크는 스프링 프레임워크의 이슈 트랙화면입니다. 마찬가지로 JIRA로 구성되어 있습니다.\n\niii. Bugzilla, 가장 오래된 툴입니다. [https://landfill.bugzilla.org/bugzilla-tip/request.cgi](https://landfill.bugzilla.org/bugzilla-tip/request.cgi) 에서 살펴보실 수 있습니다. 인터페이스가 다소 고전적이고, 버그 추적에 집중되어 있으며, 세분화된 항목들로 인해 이슈 등록 시에 다소 혼란스러울 수 있습니다.\n\niv. 비교 관련 글로는 [http://www.ibm.com/developerworks/kr/library/s_issue/20071127/](http://www.ibm.com/developerworks/kr/library/s_issue/20071127/)를 참조하시면 되겠습니다.\n\nv. 이 외에도 다양하게 존재하고 있으며, 좀 더 머리가 복잡해 지고 싶으시면 [http://www.michaelflanakin.com/Articles/Comparisons/WebBasedIssueTrackers/tabid/198/Default.aspx](http://www.michaelflanakin.com/Articles/Comparisons/WebBasedIssueTrackers/tabid/198/Default.aspx) 에 들러서 본격적으로 살펴보시는 것도 나쁘지 않은 선택이라 봅니다.\n\n---------- endd here ------------\n\n#### Comments\n\n[iv. 비교 관련 글]의 링크가 로컬 시스템으로 되어 있네요.\n\n [namomo](http://cupofmilk.net) | 2009-01-12 월요일 오후 2:57\n\n--\n\n네. 감사합니다.(^_^) 수정해 놓았습니다.\n\n [doortts](http://doortts.tistory.com) | 2009-01-12 월요일 오후 3:2\n\n--\n\n좋은 글 잘 보고 갑니다. ^^\n\n textbook | 2010-04-20 화요일 오전 11:31\n\n--\n",
    "attachments": [
      {
        "id": 21657,
        "name": "zrclip_003n5a64cb89.png",
        "hash": "fcc58d8cb26928845dc91a465446b1b271c418d9",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 16131,
        "containerId": "12251"
      },
      {
        "id": 21658,
        "name": "zrclip_001n109ce115.png",
        "hash": "51c337b81f42960bd5666e8da2d10aa2c50c7a92",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 58995,
        "containerId": "12251"
      },
      {
        "id": 21659,
        "name": "zrclip_005n24a7e6b1.png",
        "hash": "ff581a494b9901f4c5122fcfac189133deadb72f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 128991,
        "containerId": "12251"
      },
      {
        "id": 21660,
        "name": "zrclip_002n127617a0.png",
        "hash": "092555bdee0840da4764a5866b354e94a28ff470",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 169689,
        "containerId": "12251"
      },
      {
        "id": 21661,
        "name": "zrclip_006p460df360.png",
        "hash": "b777be5ab25eb3b7637866e9c9338dee4bdafaa4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 157377,
        "containerId": "12251"
      }
    ]
  },
  {
    "id": 79,
    "title": "짝 프로그래밍 팁과 트릭 (Pair Programming Tips And Tricks)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1231839277000,
    "body": "> doortts | 2009-01-13 화요일 오후 6:20 | Better SW Development | [원본](http://blog.doortts.com/79)\n\n짝 프로그래밍에 대한 가이드를 찾기가 어려울 수 있다. 언제 짝을 할 것이며 얼만큼 할 것인가? 뭐, 그런 종류의 질문과 가이드 말이다.\n\n저는 보통 P.P은 하루 중 최대 반나절 정도만 시행하는 걸 권장하며,\n\n짝 프로그래밍을 하는 시기는\n\n- 개발 업무 영역을 팀원 전체가 다 알게 하고 싶을 경우\n\n- 버그를 찾고자 할 때\n\n- 만들고자 하는 부분에 대한 명확한 그림이 그려지지 않을 때\n\n- 새로운 신입을 팀 내에 빠르게 적응시키게 하기 위해서\n\n사용하길 권장 합니다.\n\n이때 주의할 점은\n\n- 서로를 신뢰하고, 코드에 대한 지나친 소유욕을 갖지 않는 것\n\n- 대화를 자주 나누되, 둘의 목표가 좋은 SW를 만드는 데에 있다는 것을 공유하며\n\n- 대화를 논쟁으로 생각하지 말 것. (Winner, Loser 가 생겨서는 안된다.)\n\n정도 입니다.\n\n기타 다른 이야기들도 있지만, 마침 잘 정리해 놓은 좋은 참고 자료가 있어, 번역해서 올려봅니다.\n\nPS.참! 어떤 곳에서는 USB 허브를 이용해서 자리 바꿔 안지 않고 아예 여러명이 키보드를 놓고 한다는 곳도 있더라구요. :)\n\n--------- Started Here ---------\n\n# 짝 프로그래밍 팁과 트릭 ([Pair Programming Tips And Tricks](http://c2.com/cgi/fullSearch))\n\n**시작하기**\n\n*   좀 도와 주시겠어요?\n*   함께 하셔요! :)\n\n**페어 프로그래밍 도중에는**\n\n*   제가 해볼게요!\n*   해보실래요?\n*   제 계획은 이렇습니다. 뭔가하면...\n*   어떤 식으로 하실 생각이신가요?\n*   이제 무얼 할까요? 다음 단계를 뭐죠?\n*   뭔가 빼먹은 건 없나 모르겠네요. 생각나시는게 있으세요?\n*   우선 좀 짜 보죠.\n*   방금 짠 코드는 잘 동작하는 것 같나요? 단위 테스트를 해 보죠.\n*   무얼 테스트 하실건가요?\n*   좀 더딘것 같은데요. 어떻게 되가죠?\n*   잘 이해가 안돼요. 그림을 한 번 그려보시겠어요? 설명해 주세요!\n\n**휴식**\n\n*   좀 쉴까요?\n*   그만 할까요?\n*   자리를 바꿔보면 어때요?\n*   나가서 좀 쉽시다!\n\n**경우에 따라서는**\n\n*   제가 잠시 혼자 살펴봐도 될까요? (페어 프로그램은 아니지만 집중적인 페어 프로그래밍후에 긴장 완화 시킬 수 있다. 단, 단지 '살펴보는' 수준일 경우에 한해서 말이다.\n\n**하지 말아야 할 것**\n\n*   짜증!\n\n* * *\n\n**명심할 내용:**\n\n*   강요하지 말것. 페어 프로그래밍을 강요하면 오히려 페어 프로그래밍을 하는 것에 대한 사람들사이의 반감을 증가시킬 것이다.\n*   혼자 너무 오래 코딩하지 말것. 돌아가면서 한다.\n\n*   충분하게 코딩한 다음 키보드를 넘긴다.\n\n*   의사소통하라. : 듣는 것, 말하는 것 둘 다.\n*   자주 쉬어라. 쉬는 시간을 건너뛰진 말아라. (가이드라인: 초심자일 경우 15분, 숙련자의 경우는 45분)\n*   짝도 나눈다. 다른 짝들과 바꿔본다.\n*   즐겨라\n*   믿음을 가질 것\n*   [우선은 자신](http://c2.com/cgi/wiki?BlameYourselfFirst)[이 잘못했을 가능성](http://c2.com/cgi/wiki?BlameYourselfFirst)을 먼저\n    생각하여라\n*   당신의 에러를 인식해라. 가능한 빨리.\n*   자존심을 세우지 말아라\n*   [옆에 있는 사람을 놔눈채 혼자만 달리지 말자](http://c2.com/cgi/wiki?SlowDown)\n*   적응에 따라 차차 속도를 높인다\n*   당신보다 경험이 적은 사람과 함께 짝이 되어본다.\n*   당신보다 경험이 많은 사람과 함께 짝이 되어본다,\n*   코드는 짝 프로그래밍을 하는 두 사람중 어느 사람의 것도 아니다. 하지만 체크인 하기 전까지, 변경에 대한 책임은 둘에게 있다.\n*   언제나 [코드에 대화를 담기](http://c2.com/cgi/wiki?RecordYourCommunicationInTheCode)위해 노력하여라.\n\n출처: [http://c2.com/cgi/wiki?PairProgrammingTipsAndTricks](http://c2.com/cgi/wiki?PairProgrammingTipsAndTricks)"
  },
  {
    "id": 80,
    "title": "[번역 통합] 허드슨을 이용한 지속적인 통합 (Continuous integration with Hudson)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1232025019000,
    "body": "> doortts | 2009-01-15 목요일 오후 6:36 | Better SW Development | [원본](http://blog.doortts.com/80)\n\n작년말에서 올 초 사이트(blog.doortts.com)에 번역해 올린 글 들을 오타 조금 잡고, 문장 조금 고치고 하는 식으로 약간이나마 정리해서 출력하기 쉽게 파일 하나에 모아서 올려봅니다.\n\n\n\n[Continuous_Integration_with_Hudson_doortts.pdf](/files/21662)\n\n사이트에 올라와 있는 다듬기 이전의  글은 아래와 같습니다.\n\n[번역-허드슨을-이용한-지속적인-통합 #1](http://doortts.tistory.com/entry/%EB%B2%88%EC%97%AD-%ED%97%88%EB%93%9C%EC%8A%A8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%ED%86%B5%ED%95%A9Continuous-integration-with-Hudson-1 \"[http://doortts.tistory.com/entry/번역-허드슨을-이용한-지속적인-통합Continuous-integration-with-Hudson-1]로 이동합니다.\")\n\n[번역-허드슨을-이용한-지속적인-통합 #2](http://doortts.tistory.com/entry/%EB%B2%88%EC%97%AD-%ED%97%88%EB%93%9C%EC%8A%A8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%ED%86%B5%ED%95%A9Continuous-integration-with-Hudson-2 \"[http://doortts.tistory.com/entry/번역-허드슨을-이용한-지속적인-통합Continuous-integration-with-Hudson-2]로 이동합니다.\") \n\n[번역-허드슨을-이용한-지속적인-통합 #3](http://doortts.tistory.com/entry/%EB%B2%88%EC%97%AD-%ED%97%88%EB%93%9C%EC%8A%A8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%ED%86%B5%ED%95%A9Continuous-integration-with-Hudson-3 \"[http://doortts.tistory.com/entry/번역-허드슨을-이용한-지속적인-통합Continuous-integration-with-Hudson-3]로 이동합니다.\") \n\n[번역-허드슨을-이용한-지속적인-통합 #4](http://doortts.tistory.com/entry/%EB%B2%88%EC%97%AD-%ED%97%88%EB%93%9C%EC%8A%A8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%ED%86%B5%ED%95%A9Continuous-integration-with-Hudson-4 \"[http://doortts.tistory.com/entry/번역-허드슨을-이용한-지속적인-통합Continuous-integration-with-Hudson-4]로 이동합니다.\")\n\n#### Comments\n\n썬 개발자 네트워크에서 링크 따라 왔습니다~\n덕분에 허드슨을 수월하게 이해할 수 있겠네요.\n고맙습니다~ :)\n\n 굴돌 | 2009-04-09 목요일 오전 10:49\n\n--\n\n감사합니다^^\n\n [루마](http://pjungs.pe.kr) | 2009-04-17 금요일 오후 9:59\n\n--\n\n형덕분에 허드슨을다 구경해보네. 땡큐!\n\n [소내기](http://sonegy.egloos.com) | 2009-07-02 목요일 오전 10:39\n\n--\n\n아, 내용이 너무 좋습니다.\n개인적으로 저자님의 테스트 주도개발 : TDD실천법과 도구 조만간 꼭 읽어보도록 하겠습니다.\n\n제 블로그에 저자님의 글을 많이 포스팅했습니다. 사전 동의를 구하지 못했네요.\n출처를 꼭 명시하였고, 상업적인 목적으로는 사용안하겠으나,\n혹시 위반되는 사항이 있다면 꼭 말씀해주세요. 조치하도록 하겠습니다.\n\n개인적으로 저자님의 글을 자주 읽는 충성도 있는 독자입니다^^\n\n [DEV.WON](http://blog.naver.com/jadin1) | 2011-10-07 금요일 오전 11:44\n\n--\n\n아.. 왠지 부끄럽네요..\n도움이 되셨다면 다행입니다.\n\n그리고 필요하신 만큼 참조하셔서 쓰셔도 무방합니다.\n\n:)\n\n [doortts](http://blog.doortts.com) | 2011-10-18 화요일 오후 10:44\n\n--\n\n좋은 글 감사합니다..^^\n\n kichis | 2011-10-18 화요일 오전 12:32\n\n--\n\n댓글 남겨주셔서 감사합니다. \n좋은 하루 되세요~\n\n [doortts](http://blog.doortts.com) | 2011-10-18 화요일 오후 10:43\n\n--\n",
    "attachments": [
      {
        "id": 21662,
        "name": "Continuous_Integration_with_Hudson_doortts.pdf",
        "hash": "4ab8a332b7440dd1a7c9051039c89d7ab731cafc",
        "containerType": "BOARD_POST",
        "mimeType": "application/pdf",
        "size": 2855971,
        "containerId": "12253"
      }
    ]
  },
  {
    "id": 81,
    "title": "[가이드북] 형상관리(Subversion)와 이슈 관리(Trac)를 연동하여 프로젝트 개발 환경에 적용하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1232352948000,
    "body": "> doortts | 2009-01-19 월요일 오후 5:12 | Better SW Development | [원본](http://blog.doortts.com/81)\n\n형상관리(Subversion)와 이슈 관리(Trac)를 프로젝트 개발 환경에 적용하기위한 나름 퍼펙트 SETUP 가이드 북 입니다. :)\n\n관련 지식이 전무한 상태에서도 구축이 가능하도록,\n\n최대한 자세히 기술하였으며,\n\n최초 구축시에는 가이드 문서를 읽는 시간 때문에 반나절 정도 소요될 수 있습니다만, \n\n이 후 재 구축하는데에는 대략 30분 정도면 가능할 정도로 간단합니다. \n\n그럼, 열의 있으신 분들께 도움 되었으면 좋겠습니다.\n\n[TRAC과_Subversion을_이용한_개발환경_구축가이드_doortts.pdf](/files/21663)\n--\n타겟 환경 : 윈도우즈 환경\n개발환경 구성: VisualSVN server + Subclipse + Trac + 이클립스 Mylyn 연동\n--\n\n#### Comments\n\n작년에 솔라리스에 subversion / trac 설치 한다고 삽질 엄청했었는데;; \n그에 비해서 윈도운 정말 간단히 구축이 가능하네요;;ㅋ \n가이드북 받아갑니다~ 잘볼께요~^^;;\n\n [성윤](http://helols.tistory.com) | 2009-01-19 월요일 오후 5:31\n\n--\n\n나도 한때 제대로 된 시스템이라면 적어도 최소 리눅스베이스는 되어야 서버라 할 수가 있지~ 했는데, 요즘엔 약간 생각이 바뀌었지.\n\n리눅스/유닉스가 좋은건 알지만, 요즘엔 워낙 PC power 가 좋아서 ROI 가 높은 윈도우도 나쁘지 않아~ (나쁘지 않은게 아니라 더 편리한 케이스도 많지)\n\n [doortts](http://doortts.tistory.com) | 2009-01-20 화요일 오후 2:40\n\n--\n\n좋은 자료 감사합니다.\n\n [kenu](http://okjsp.tistory.com) | 2009-01-20 화요일 오전 10:45\n\n--\n\n안녕하세요? 잘 지내시죠? \n\n그때 하신 이야기 기억하시나 모르겠습니다만,\n\n저, 기다리고 있는거 아시죠?\n\n압박 들어갑니다..ㅎㅎㅎ\n\n [doortts](http://doortts.tistory.com) | 2009-01-20 화요일 오후 2:36\n\n--\n\n잘 봤습니다. 이거...집에 설치해야겠네요.\n도움 많이 될것 같습니다.\n\n [신차영](http://www.chayoung.pe.kr/blog) | 2009-01-21 수요일 오전 10:2\n\n--\n\n감사합니다. 더 좋은 SW를 만드시는데 보탬이 될수 있으면 좋겠습니다.\n\n [doortts](http://doortts.tistory.com) | 2009-01-23 금요일 오후 2:45\n\n--\n\nokjsp를 보고 왔는데 아직 svn구축도 안해봣지만 한번 구축해봐야겟네요.\n\n한번 훑어봤는데 상당히 설명을 잘해놓으셔서 이해가 잘되네요 ㅎㅎ\n\n 장난꾸러기 | 2009-01-21 수요일 오전 11:11\n\n--\n\n부끄러운 작업물입니다. 관련 질문이 있으시면 언제든 남겨주세요. 많이 아는건 아니지만 한도내에서 답변드리겠습니다. 평안한 연휴 되세요.\n\n [doortts](http://doortts.tistory.com) | 2009-01-23 금요일 오후 2:46\n\n--\n\n와우... 멋진 자료네요... 잘 봤습니다... ^^\n\n [뽀여니](http://wwwzemna.net) | 2009-02-19 목요일 오전 10:45\n\n--\n\n실제 프로젝트 업무에 들어가기 전에 형상관리, 이슈관리 같은 내용은 접하기 쉽지 않고 또 막연히 어렵게 느껴졌는데 가이드북을 통해 접할 수 있어 큰 도움이 될 것 같습니다.\n좋은 자료 작성해 주시고 또 올려주셔서 정말 감사드립니다.\n\n [_jini](http://www.jinistory.pe.kr/) | 2009-03-04 수요일 오후 3:30\n\n--\n\n도움이 되셨다면 다행입니다. 성공적인 프로젝트가 되시길! :)\n\n [doortts](http://blog.doortts.com) | 2009-03-04 수요일 오후 8:46\n\n--\n\n지나가다가 잘 보고 갑니다 :)\n\n 육식공룡 | 2009-03-05 목요일 오전 9:52\n\n--\n",
    "attachments": [
      {
        "id": 21663,
        "name": "TRAC과_Subversion을_이용한_개발환경_구축가이드_doortts.pdf",
        "hash": "598e55c2435e776735f952840937410c16cc5ab2",
        "containerType": "BOARD_POST",
        "mimeType": "application/pdf",
        "size": 1168412,
        "containerId": "12254"
      }
    ]
  },
  {
    "id": 82,
    "title": "화난 원숭이 실험 (Angry Monkey Experiment)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1232436777000,
    "body": "> doortts | 2009-01-20 화요일 오후 4:32 | 이생각 저생각 | [원본](http://blog.doortts.com/82)\n\n**![](http://farm1.static.flickr.com/21/24798261_c9cf43e405.jpg?v=0)** 외국에서 한 어떤 재미있는 실험 결과입니다.\n\n**단계 1**\n\n원숭이들을 커다란 우리에 가두어 놓은 다음 천장에 바나나를 달아 놓고 줄을 매달아 놓습니다.\n\n원숭이들은 천장에 있는 바나나를 보고는 '버네나!!' 하면서 줄을 타고 기어 오릅니다.\n\n이때, 호스로 찬물을 뿌려서 떨어뜨립니다.\n\n그렇게 우리안의 원숭이들이 몇 번인가 찬물을 맞게 되면, '아! 못먹는 바나나'라는 생각이 들었는지\n\n더이상 어떠한 원숭이도 줄을 타고 오르려 하지 않는답니다.\n\n그리고 사람이 지키지 않아도 바나나가 없어지지 않고 계속 남에 있게 된답니다.\n\n**단계 2**\n\n우리 안에 있는 원숭이 한 마리를 새로운 원숭이로 교체합니다.\n\n새로 들어온 원숭이는 얼마 지나지 않아 천장에 매달려 있는 바나나와 줄을 발견합니다.\n\n![](http://farm1.static.flickr.com/161/420393625_ef7e313eea.jpg?v=0)\n\n당연히 새로 온 원숭이도 '버네나!' 하면서 줄을 타러 갑니다.\n\n그런데, 새로 들어온 원숭이가 천장에 달린 바나나를 먹기 위해 줄을 타려하자, 다른 원숭이들이 말리더랍니다.\n\n'올라가지 마라. 찬물 나온다. 못 먹는다.' 뭐 그런의미인거죠.\n\n주변 원숭이들이 그들만의 언어와 함께 잡아당겨서,\n\n결국 새로 들어온 원숭이도 줄을 타려하지 않게 됩니다.\n\n**단계 3**\n\n일정한 기간을 두고 우리 안의 원숭이를 한 마리씩 교체합니다.\n\n결국 우리안에는 찬 물을 맞아본 원숭이는 한 마리도 존재하지 않게 됩니다.\n\n하지만, 어느 원숭이도 바나나를 먹으려고 하지 않더라는 군요.\n\n그 뒤로 계속해서 말입니다.\n\n![](http://farm4.static.flickr.com/3024/2740362359_6fcac656e6.jpg?v=0)\n\n**이게 바로 화난 원숭이 실험(Angry Monkey Experiment)입니다**.\n\n* 본 이야기는 Qcon 에서 [Neal Ford](http://www.nealford.com/ \"[http://www.nealford.com/]로 이동합니다.\")가 했다는 이야기로 조직문화가 얼마나 무서운가 를 동물실험으로 보여줍니다.  Qcon - San Francisco에 다녀온 [JAVAJIGI](http://javajigi.tistory.com/ \"[http://javajigi.tistory.com/]로 이동합니다.\")님을 통해 전해 들은 이야기 입니다. *\n\n#### Comments\n\n흠..이거 재밌는걸...\n\n [이지호](http://blog.naver.com/joe1111) | 2010-04-26 월요일 오전 10:33\n\n--\n"
  },
  {
    "id": 83,
    "title": "컨셉 맵 (Concept Map)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1232604854000,
    "body": "> doortts | 2009-01-22 목요일 오후 3:11 | Better SW Development | [원본](http://blog.doortts.com/83)\n\n생각을 정리한다던가, 아이디어를 모을때 Mindmap 같은 기법을 사용한다.\n종이에 쓸 때도 있지만, 저장의 한계상, 보통 [Freemind](http://freemind.sourceforge.net/wiki/index.php/Main_Page \"[http://freemind.sourceforge.net/wiki/index.php/Main_Page]로 이동합니다.\") 나 XMind 등의 툴을 사용한다.\n\n그런데 마인드 맵은 상위/하위 개념, 혹은 연관개념 형태의 브레인스토밍에 적합하지만, 주체들의 관계를 표시하기에는 다소 약하다.\n[mindmap.png](/files/21665)\n* opensource mindmap tool [XMind](http://www.xmind.net/ \"[http://www.xmind.net/]로 이동합니다.\"). 기능은 좋은데 다소 느리며 폰트 변경이 번거롭다.*\n\n그럴 때 사용하는 것이 컨셉맵이다.\n\n|  [conceptmap01.png](/files/21664) |\n\n* 컨셉맵의 대표 프로그램인 [CampTools의 사이트](http://cmap.ihmc.us/ \"[http://cmap.ihmc.us/]로 이동합니다.\"). 웹 사이트 첫 페이지 자체가 CampTools 로 만들어져 있다 *\n\n컨셉맵은 주제들 사이의 관계를 설명하기 위해서 쓰인다. 그래서 상위에서 하위로 갈때, 관계가 읽혀질 수 있다. 마인드 맵이나 컨셉맵 어느 하나가 더 좋다라기 보다는 영역이 살짝 다르다고 보는 것이 맞는 것 같다.\n\n두 분야 모두 오래된 부분이라(실제로 컨셉맵은 마인드맵 보다 10년 정도 먼저 나온 개념이다) 어느 정도 공인된 사고 정리(혹은 노트)방법이며, 상용툴/무료툴 모두 나와있다. \n\n컨셉맵도 상당히 쓸만하지만, 다만 한가지 아쉬운 점은 언어적인 한계상 컨셉맵을 우리말기반으로 제대로 쓰기에는 어색함이 있다. 주어(단어)-술어(동사)-목적어(단어) 식의 언어에 맞춰줘 있기 때문이다.\n\n어쨌든 관계를 설명할 필요가 있을때는 컨셉맵의 개념을 도입해 보는 것도 괜찮을 것 같다.\n![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot-1.jpg)\n\n[![soldierant님이 촬영한 Gobbledy Gook.](http://farm1.static.flickr.com/12/17847692_8827bf20ae.jpg?v=0)](http://www.flickr.com/photos/bryce/17847692/ \"[http://www.flickr.com/photos/bryce/17847692/]로 이동합니다.\")\n\n* 컨셉맵의 또 다른 예 *\n\nps. 참고로, 컨셉맵을 쓸때는 위에서 아래로 읽힐 수 있게 쓰는 것이 기본 원칙이다.",
    "attachments": [
      {
        "id": 21664,
        "name": "conceptmap01.png",
        "hash": "936bb03e0509356733408fcde8f3d83e59938129",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 82238,
        "containerId": "12256"
      },
      {
        "id": 21665,
        "name": "mindmap.png",
        "hash": "296e24c0572239a75052bbb56b3864af9930f8b2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 61651,
        "containerId": "12256"
      }
    ]
  },
  {
    "id": 84,
    "title": "유용한 윈도우 유틸리티 사이트인 Stefan's Tools",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1232798700000,
    "body": "> doortts | 2009-01-24 토요일 오후 9:5 | Better SW Development | [원본](http://blog.doortts.com/84)\n\n서브버전 클라이언트 툴로 유명한 tortoisesvn.net 에 [Stefan's Tools](http://tools.tortoisesvn.net/ \"Home\") 라는 이름으로 호스팅 되어있는 유틸리티 모음 사이트에는 작지만 쓸만한 툴이 몇 개 있다.\n\n서브버전에 새로운 commit 이 일어났는지 확인해 주는 [CommitMonitor](http://tools.tortoisesvn.net/CommitMonitor)\n\n![zrclip_003n10e409e2.png](/files/21668)})\n\n윈도우 탐색기에서 정규식을 이용해 파일 찾는 걸 도와주는 [winGrep](http://tools.tortoisesvn.net/grepWin)\n\n![zrclip_002p3fa75b5d.png](/files/21666)})\n\n![zrclip_004n394a3f9c.png](/files/21669)})\n\n탐색기에 도구모음을 추가해 주는 [StExBar](http://tools.tortoisesvn.net/StExBar) (커맨드창을 바로 띄워주는 고마운 기능!)\n\n![zrclip_005n130cf500.png](/files/21667)})\n\n* 해당 폴더에서 바로 커맨드 창을 연다 *\n\n![zrclip_006n62b10f10.png](/files/21670)})\n\n* 파일이름 일괄 바꾸기 *",
    "attachments": [
      {
        "id": 21666,
        "name": "zrclip_002p3fa75b5d.png",
        "hash": "154be0c566759cb3a96a9f57d4badf1e60d5f40e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 27816,
        "containerId": "12257"
      },
      {
        "id": 21667,
        "name": "zrclip_005n130cf500.png",
        "hash": "e4d547216b361396dd9ab8e529d4041f0b7fcdb8",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 9234,
        "containerId": "12257"
      },
      {
        "id": 21668,
        "name": "zrclip_003n10e409e2.png",
        "hash": "2eba91335de852b49278bf691806dd5c467f472e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 44916,
        "containerId": "12257"
      },
      {
        "id": 21669,
        "name": "zrclip_004n394a3f9c.png",
        "hash": "d3ca0cbc924b2fd003c5842c9308bb2efbe07b0d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 28101,
        "containerId": "12257"
      },
      {
        "id": 21670,
        "name": "zrclip_006n62b10f10.png",
        "hash": "24193b184e9e02855e40fb364f7e759a401b1679",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 67659,
        "containerId": "12257"
      }
    ]
  },
  {
    "id": 85,
    "title": "jetty @ eclipse - 경량 자바 웹 컨테이너가 이클립스 프로젝트 안으로",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1233229759000,
    "body": "> doortts | 2009-01-29 목요일 오후 8:48 | Better SW Development | [원본](http://blog.doortts.com/85)\n\n![zrclip_002n5be53cd3.png](/files/21672)})\n\nJetty 는 오픈소스이며, 표준을 준수하며 순수 자바로 만들어진 웹 서버입니다.\n\n기존에는 codehaus.org에 기거하고 있었는데, 이번에 eclipse 프로젝트, 정확히는 Eclipse Runtime Project 안으로 들어가게 될 것 같습니다.\n\n관련해서 eclipsecon 에서 발표도 한다고 하네요. 현재 commiter를 모으고 있습니다만 jetty 자체가 이미 오픈소스 형태로 진행되는 프로젝트 였기 때문에 적정 수준의 참여자들이 이미 있습니다. 게다가 이미 이클립스 3.3 부터 help 시스템이 tomcat 에서 jetty 로 교체된 상황인지라 무난하게 이클립스 프로젝트 안으로 진입할 것 같습니다.\n\n![zrclip_003n7a9f1ef0.png](/files/21671)})\n\njetty는 임베디드 된 형태의 오픈소스 웹컨테이너 중에서는 아는 사람들 사이에서는 꽤나 유용하게 쓰이던 웹 서버입니다. 현재 jetty가 거주하고 있는 [http://jetty.mortbay.org/jetty/](http://jetty.mortbay.org/jetty/) 사이트를 가보면 내세우고 있는 장점 그대로입니다.\n\n**심플하고,**\n\n**용량 확장성이 있으며,**\n\n**효율적이고,**\n\n**임베디드하기 쉽고,**\n\n**플러그인 형태로 제공되기 쉽습니다.**\n\n실제로 작년 [javalobby](http://java.dzone.com/)에서 선정한 [The Best Java Tools You Never Knew Existed](http://java.dzone.com/articles/best-java-tools-you-never-knew) 중 하나로 뽑히기도 하였습니다.\n\n그 전부터도 jetty는 유의깊게 봐 두고 있던 open source product 이었는데요, 어플리케이션 제작자의 입장에서 봤을때, 어떠한 형태가 되었든 배포가 되는 어플리케이션을 만들게 될 때 웹이 제공하는 기능(Feature)을 이용할 수 있으면 요긴할 경우가 많습니다. 그럴때 간단히 jetty 를 내장해서 쓰려 마음먹고 있었기 때문입니다. .\n\n[Eclipse galileo](http://wiki.eclipse.org/Eclipse/Galileo_Plan) (eclipse 3.5) 에 jetty의 차기 버전인 jetty 7이 탑재되고 좀 더 발전된 형태로 integration 이 이루어 질 예정이라는데요, 어떤식으로 통합되어 어떻게 발전할지 기대 됩니다.\n\n참고로 이런저런 상황을 다 떠나서 순수히 [jetty의 아키텍처](http://docs.codehaus.org/display/JETTY/Architecture) 자체를 살펴보는 것 만으로도 배울 것도 많고 매우 흥미롭답니다. (어플리케이션 라이프 사이클, NIO, 소켓통신등에 관심있으시다면 더할 나위 없겠죠)\n\n![zrclip_004p3e4b084.png](/files/21673)})\n\nps. 응용하실 때 쓰는 예제 사이트는 다음 페이지를 참조하세요.\n[http://jetty.mortbay.org/xref/org/mortbay/jetty/example/package-summary.html](http://jetty.mortbay.org/xref/org/mortbay/jetty/example/package-summary.html)\n\n#### Comments\n\n[Tomcat 최종 분석]이라는 Tomcat을 분해해서 내부 구조를 설명해주는 좋은 책이 있었는데, 글을 읽고 나니 [Jetty 최종 분석]이 나올 것 같네. 어쨌건,  \"임베디드 Web Container\"가 jetty 가 급부상하게된 키워드가 아닐까하오. Derby 도 ActiveMQ도 임베드해서 쓰는 재미가 쏠쏠하오.\n\n [M-o-N](http://nephilim.tistory.com) | 2009-02-03 화요일 오전 12:56\n\n--\n",
    "attachments": [
      {
        "id": 21671,
        "name": "zrclip_003n7a9f1ef0.png",
        "hash": "1b858b5671eef75ee16165a862f71c21329e1cfc",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 30951,
        "containerId": "12258"
      },
      {
        "id": 21672,
        "name": "zrclip_002n5be53cd3.png",
        "hash": "45effb313b5afb5ddd6f7568d42e3e2e14bd3952",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 38760,
        "containerId": "12258"
      },
      {
        "id": 21673,
        "name": "zrclip_004p3e4b084.png",
        "hash": "88d676f0e65c57a243631c5d0c09420ea88847de",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 8949,
        "containerId": "12258"
      }
    ]
  },
  {
    "id": 86,
    "title": "애자일(Agile)과 SI 프로젝트, 해결해야 하는 질문들, 잊어서는 안되는 원칙들",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1234099319000,
    "body": "> doortts | 2009-02-08 일요일 오후 10:4 | 이생각 저생각 | [원본](http://blog.doortts.com/86)\n\n**요즘 애자일(Agile)이 확실히 트랜드는 트랜드입니다.**\n\n여기 저기서 애자일을 어떻게 도입할지 고민하고 있는 모습이 보입니다.\n\n원래 Agile 은 그 근원이 생산(Production)에서 기원하는 관계로 보다 빨리 출시하고, 보다 쉽게 변화에 적응하는 것을 그 바탕으로 합니다. 따라서 효율을 높이기 위해 우선순위에서 밀리는 요소는 뒤로 제치고, 중요한 것에 집중하는 형태를 취하게 됩니다.\n\n**어째서 Agile이 대두 되었을까요?**\n\n여러가지 이유야 많습니다만, 우선 Agile의 태생을 이해하는 것이 Agile을 적용을 하는데에 있어 이해득실을 따져보시기 좋을 것 같습니다.\n\n90년대 중 후반, 소위 말하는 닷 컴 버블 시절, 너도 나도 인터넷을 이용한 서비스를 만들어 내기 시작한 시절이 있었습니다. 그 시절에는 누가 먼저 서비스를 내 놓느냐, 그리고 내 놓은 서비스를 고객 변화에 맞게 얼마나 잘 맞춰가며 변화하느냐가 생명이었습니다.\n\n그런데, 대부분의 회사들이 기획한 대로 일정내에 출시 하는 것이 만만치 않다는 걸, 그리고 출시 하더라도 재빠른 버그수정이나 요구사항 적용같은 작업이 굉장히 어렵다는 걸 알게 됩니다. **'최초 출시 업체보다 3개월 늦게 출시하면, 그 쪽 분야는 이미 그 업체에게 뺏긴거다'** 라는 게 일반적인 인식이었습니다. 그래서 많이들 실패하게 됩니다. 출시는 늦춰지고, 나온 제품은 시원찮고, 경쟁은 심하고... 등등등.. (['세상을 바꾼 32개의 통찰'](http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200809200001)이란 책을 읽어보시면 다양한 이야기가 있습니다)\n\n그런 상황이다 보니 무언가 대안을 찾게 되고, 그 와중에 Agile 이 떠오르게 됩니다.\n\n**'빠른 시간내에 고객에게 최대의 가치를 전달'** 이란 모토와 맞는거죠. 그리고, 우수한 인재가 있는 팀들도 실패하는 와중에 성공 케이스들이 나오고 있었으니까요.\n\nLean 방식, Toyota 방식, Scrum 등등 생산성과 품질, 속도를 이야기 하는 방법들이 조명 받게 되었습니다.\n\n2000년대 초반 XP도 한 열기 했는데, XP는 가치와 실천방법(Practice) 중심이다 보니, 전통적인 기존 기업들이 받아들이기에는 XP 가치 그대로의 '용기'가 필요했고, 쉽게 적용하기 어려운 점이 있었습니다. 결국 근래에는 XP 보다 Scrum 이 더 많이 적용되는 추세입니다.\n\n![zrclip_002n323d8741.png](/files/21674)})\n\n\n#### Comments\n\n좋은 글 잘 읽고 갑니다. ^^ \n최근에는 XP와 스크럼을 합쳐서 적용하고 있는데, 프로젝트 성공에 목표를 두고 방법론들을 적용하기 보다는\n방법론의 일정에 맞춰 프로젝트를 조정하는 기이한 현상을 겪고 있었는데 많은 생각을 하고 갑니다.\n(애자일의 적용이 프로젝트의 성공을 보장하는 것이 아닌데 몇번 적용해서 효과를 보고나니 자세한 분석없이 '모든경우에 성공할 것이다'라고 맹신하게 되는 것 같네요.)\n\n [Monolith](http://monolith.pe.kr) | 2009-02-14 토요일 오후 10:6\n\n--\n\n도움이 되신다면 다행이고요. :)\n그런데 말씀하신 '기이한 현상'이 궁금한데요.\n\n [doortts](http://blog.doortts.com) | 2009-02-16 월요일 오후 12:37\n\n--\n",
    "attachments": [
      {
        "id": 21674,
        "name": "zrclip_002n323d8741.png",
        "hash": "3e990a08ba3a2c817c427913c507da3b727442d2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 28500,
        "containerId": "12259"
      },
      {
        "id": 21675,
        "name": "zrclip_005n1259bb10.png",
        "hash": "f7c8ab8cb51a67468f41e34aba95db61c6a1275c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 234327,
        "containerId": "12259"
      }
    ]
  },
  {
    "id": 87,
    "title": "최고의 프로그래밍 팁! 이라고 올라온 이미지",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1234701627000,
    "body": "> doortts | 2009-02-15 일요일 오후 9:40 | Better SW Development | [원본](http://blog.doortts.com/87)\n\n외국의 모 사이트에서 선정한 최고의 프로그래밍 팁\n\n![programming_tip.png](/files/21676)\n\n\"당신 사는 곳을 아는 어떤 매니악한 연쇄살인범이, 당신이 작성한 코드의 유지보수 작업을 하게 될거라고 늘 생각하면서 코딩하세요!\"\n\n#### Comments\n\n우왓~\n대박입니다. ^^;\n\n [kenu](http://okjsp.tistory.com) | 2009-02-15 일요일 오후 11:43\n\n--\n\n안녕하세요 Kenu님! 근데, 쓰시는 책은 현재 Hold 상태이신?\n\n [doortts](http://blog.doortts.com) | 2009-02-16 월요일 오후 12:39\n\n--\n\n넵. 먹고 살 돈이 다 바닥났네요. 마음 독하게 먹고 써야되는데, 의지 박약입니다. ㅡㅡ;\n관심 감사합니다.\n\n [kenu](http://okjsp.tistory.com) | 2009-02-16 월요일 오후 11:49\n\n--\n\nㅋㅋ 최고에요.\n아놔! 오늘부터 뒤를 조심해야겠...;;;\n\n [박성철](http://me2day.net/geekinside) | 2009-02-18 수요일 오후 7:47\n\n--\n\n다들 이렇게만 코딩한다면, 남의 코드 보는것이 즐거워 질 수도 있지 않을까요? :) 어쨌든 시리얼 킬러라... 멋진 발상입니다.\n\n [doortts](http://blog.doortts.com) | 2009-02-19 목요일 오전 9:11\n\n--\n\nㅋㅋㅋ 칼침 안맞게 조심해야겠어요;;ㅋㅋ\n\n무셔라;;ㄷㄷㄷㄷ~~\n\n [성윤](http://helols.tistory.com) | 2009-02-27 금요일 오후 9:13\n\n--\n\n저정도 편집증은 있어야 코드좀 짠다고 할 수 있겠지. ㅎㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2009-03-04 수요일 오후 8:48\n\n--\n",
    "attachments": [
      {
        "id": 21676,
        "name": "programming_tip.png",
        "hash": "aa6a77d5aa4b79c73a892b645b1b2ade26ca7b53",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 39209,
        "containerId": "12260"
      }
    ]
  },
  {
    "id": 88,
    "title": "구글 쉘 (google shell, goosh.org)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1234702482000,
    "body": "> doortts | 2009-02-15 일요일 오후 9:54 | Better SW Development | [원본](http://blog.doortts.com/88)\n\n구글에 있는 javascript shell 프로그램\n\n[http://goosh.org/](http://goosh.org/)\n\n에 접속하면 쉘 방식으로 다양한 구글 서비스를 이용할 수 있다.\n\n![zrclip_001p5eaab63e.png](/files/21677)})\n\nhelp 라고 쳐보면\n\n![zrclip_002p8970ea6.png](/files/21678)})\n\n계산기, 웹검색, email 확인 등등 google 이 제공하는 다양한 서비스가 쉘 명령어로 처리된다.\n\n이를테면 \"images 다코타 패닝 최근 사진 \" 하는 식으로 명령어를 내려보면\n\n![zrclip_004p69bab3b9.png](/files/21679)})\n\n일반적으로 쉘 에서 제공하는 명령어(이를테면 ls 같은)나 단축키, 화살표 위/아래 같은 기능도 제공하네요.\n\n효용성은 모르겠지만, 잘 만들었네요.",
    "attachments": [
      {
        "id": 21677,
        "name": "zrclip_001p5eaab63e.png",
        "hash": "75c8de2fc24ca19e0926cb2ed59c9786b91b1af7",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 6042,
        "containerId": "12261"
      },
      {
        "id": 21678,
        "name": "zrclip_002p8970ea6.png",
        "hash": "e59522373453706d69a18c26c0fc8738858fab11",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15789,
        "containerId": "12261"
      },
      {
        "id": 21679,
        "name": "zrclip_004p69bab3b9.png",
        "hash": "9314e32344881403361bff55bfc8c08990dfec9d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 57855,
        "containerId": "12261"
      }
    ]
  },
  {
    "id": 89,
    "title": "Pulse, 이클립스 개발환경 동기화",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1234870100000,
    "body": "> doortts | 2009-02-17 화요일 오후 8:28 | Better SW Development | [원본](http://blog.doortts.com/89)\n\n이클립스를 사용하려면 기본적으로 고민해야 하는 선택사항이 몇 개 있습니다.\n\n그 중 최초는 어떤 버전을 내려받을지를 선택하는 것입니다.\n\n![zrclip_002n12a8d779.png](/files/21680)})\n\nJava 버전을 받을지, 아니면 WTP를 받을지, RCP/plug-in 을 받을지 등등등...\n\n사실 다운로드 받아도 기본적으로 자주 쓰는 플러그인들이 있다면 그것도 찾아서 내려 받아야 합니다.\n\nanyedit 라던가, subversive나 subclipse 같은 svn 클라이언트 플러그인이라던가, 근래에 유행하는 정적 분석툴 (checkstyle, findbugs) 등등..\n\n시간이 솔찬히 걸리는데다, 이클립스 자체를 몇 번 재기동하게 됩니다. (물론 선택사항이라고는 하지만, 그렇다고 재시작 안하고 그냥 쓰는 사람은 별로 없을 겁니다.)\n\n게다가 집, 학교, 회사, 이동용 노트북에 새로운 장소에 간다던가 하면 세팅이 만만치 않습니다. (정확히는 귀찮죠...)\n\n또한 프로젝트 팀원들 사이의 동기화도 문제가 될 수 있죠.\n\n![zrclip_001p1bdee7a6.png](/files/21683)})\n\n자, 이럴때 쓰는 것이 [Pulse](http://www.poweredbypulse.com/) 입니다. (RCP로 만들어진 툴이죠)\n\n![zrclip_003p4d8f15e2.png](/files/21682)})\n\n목록중 원하는 데로 선택해서 개인 프로파일로 만들면 됩니다. 플러그 인의 경우도 일일히 사이트 돌아다니지 않고, 선택해서 추가해 놓으면 됩니다. (간단한 설명과 라이센스도 함께 표시 됩니다)\n\n![zrclip_004n6b76c0d3.png](/files/21681)})\n\n\n실제 플러그인이 설치까지 다 된 상태로, 지정한 폴더로 인스톨 됩니다. 그리고 프로필은 공유하는 것도 가능하네요. 프로젝트에 AA(Application Architect) 들어가시는 분들은 zip 파일이나 [Install Factory](http://user.chol.com/~chosmos/) 를 쓰실텐데요, 이런 방법 한번 써보시는 것도 괜찮을 듯 합니다. (인터넷만 연결되어있고, profile 만 공유하면 되니까요)\n\n#### Comments\n\n좋은 정보 감사합니다.\n저희 팀에서도 써 보면 좋겠네요...\n\n [임성현](http://architect1.pe.kr) | 2009-11-17 화요일 오전 9:20\n\n--\n",
    "attachments": [
      {
        "id": 21680,
        "name": "zrclip_002n12a8d779.png",
        "hash": "1d5b2dad7b7a7f8930da0a3850a0d663b370a152",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 115995,
        "containerId": "12262"
      },
      {
        "id": 21681,
        "name": "zrclip_004n6b76c0d3.png",
        "hash": "c7e762b41e40d1e27c1f3595818e15f4dcef6c32",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 133608,
        "containerId": "12262"
      },
      {
        "id": 21682,
        "name": "zrclip_003p4d8f15e2.png",
        "hash": "9cf0de525710110e25577a7717aa038c8a236dd9",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 166269,
        "containerId": "12262"
      },
      {
        "id": 21683,
        "name": "zrclip_001p1bdee7a6.png",
        "hash": "f950bb3d26f89d3fd8bf41b675340c705577a666",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 178524,
        "containerId": "12262"
      }
    ]
  },
  {
    "id": 90,
    "title": "SI 프로젝트에 Agile 을 적용하기 위해 고려해야 하는 질문에 대한 개인적인 고찰",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1234969262000,
    "body": "> doortts | 2009-02-18 수요일 오후 11:19 | 이생각 저생각 | [원본](http://blog.doortts.com/90)\n\n이하 글은 이전에 올렸던 글인 [](http://blog.doortts.com/entry/%EC%95%A0%EC%9E%90%EC%9D%BCAgile%EA%B3%BC-SI-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%95%B4%EA%B2%B0%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%A7%88%EB%AC%B8%EB%93%A4-%EC%9E%8A%EC%96%B4%EC%84%9C%EB%8A%94-%EC%95%88%EB%90%98%EB%8A%94-%EC%9B%90%EC%B9%99%EB%93%A4)[애자일(Agile)과 SI 프로젝트, 해결해야 하는 질문들, 잊어서는 안되는 원칙들](http://blog.doortts.com/entry/%EC%95%A0%EC%9E%90%EC%9D%BCAgile%EA%B3%BC-SI-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%95%B4%EA%B2%B0%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%A7%88%EB%AC%B8%EB%93%A4-%EC%9E%8A%EC%96%B4%EC%84%9C%EB%8A%94-%EC%95%88%EB%90%98%EB%8A%94-%EC%9B%90%EC%B9%99%EB%93%A4 \"[http://blog.doortts.com/entry/애자일Agile과-SI-프로젝트-해결해야-하는-질문들-잊어서는-안되는-원칙들]로 이동합니다.\") 에 대한 개인적인 의견입니다. 언제나와 마찬가지로 보시고 취하실 부분은 취하고, 버릴 부분은 알아서 처분하시길 바랍니다. :)\n\n1.  **방법론과 관계없이 모든 요구사항을 관철시키려고 하는 고객을 어떻게 설득할 것인가?**\n    - 이터레이션 마다 결과물을 보여주니, 고객의 feedback 이 강력할 수 있습니다\n\n    A. 고객의 요구사항이 개발의 방향을 벗어 나지는 않았는지 우선 확인합니다.\n    B. 고객의 요구사항에 공감하며 반영의 의지를 보입니다.\n    C. 하지만, 이때 새로운 요구사항이 얼마의 일정이 소요하게 될 것인지를 확인해서 알려주어야 합니다.\n    D. 팀 미팅을 통해 일정을 추정해 냅니다.\n    E. 고객에게 소요기간을 이야기하며, 우선순위를 정하도록 합니다. 이로 인해 일정이 변경되는 부분에 대해서 알려준 다음, 선택하게 합니다\n\n2.  **팀 맴버 구성 비율을 어떻게 가져갈 것인지?**\n    - 기존의 role base의 인원구성으로 whole team 이 가능할 것인지 고민하셔야 합니다.\n\n    A. 분석과 설계가 가능한 개발자, 개발할 수 있는 DBA, 모델링이 가능한 AA가 함께 하면 이상적입니다만, 그건 말 그대로 이상적.\n    B. 팀원들만으로 개발 전영역을 커버하기에 부족하다면, 외부에서 점검/지원해 줄 수 있는 비상주 인력을 소싱합니다.\n    C. 특정 역량이 부족해 팀 개발이 삐걱일 때는 팀 마스터가 Rain Maker 역할을 할 수 있어야 합니다.\n    D. 특정 역량이 뛰어난 팀원이 있을 경우에는 구심에 놓고 적극적으로 활용합니다. (ex. 뛰어난 AA : 공학도구나 연계, 특정 개발분야에서 최대 퍼포먼스를! 훌륭한DBA: Data모델링이나 DB설계등에서 최대 퍼포먼스를! 등등등)\n    \n\n3.  **기존 방법론에 충분히 익숙한 프로젝트 리더 들의 사고 전환을 어떻게 할 것인가?**\n    - 대시보드와 ToDo 정도로는 불안해 할 수 있습니다.\n\n    A. 이번 프로젝트를 성공적으로 만들기 위해서, Agile 방법론이 여타 방법론보다 어떠한 장점을 줄 수 있는지 스스로 비교 판단하게 유도합니다. 만일 장점이 단점보다 크지 못하다는 결과가 나오면 방법론 선택이 잘못된 셈입니다. (이래서는 안되겠죠)\n    B. 애자일을 불안해 한다면, 정확히 불안해 하는 요인이 무엇인지를 파악해서, open 된 곳에서 해당 내용을 볼 수 있도록 만듭니다. 그리고, 팀 원 들은 해당 사항에 대해 어떻게 생각하는지 의견을 모읍니다.\n    C. 특별히 작성했으면 좋겠다고 생각하는 문서가 있으면, 팀원과 협의를 합니다. 단, 이때 팀원들에게 부하를 주는지, 개발을 방해하게 되는지 살펴보고 판단합니다.\n\n4.  **앉아서 '아~ '하고 입만 벌리던 고객을 어떻게 참여시킬 것인가?**\n    - SI 기업에는 업무 전문가들이 고객보다 업무를 잘 알아서 고객은 자신이 하는 업무를 몰라도 알아서 구축해 주는 수준입니다.\n    - 고객은 자신을 괴롭히는걸 좋아하지 않습니다.\n\n    A. '고품질의 제품(서비스)전달'을 원한다면 고객이 적극적으로 참여해 주었을 때 보다 더 가깝게 실현가능하다는 점을 이해시킵니다.\n    B. OO회사는 알아서 다 해준다던데... 하는 식으로 반응하게 될 경우, 고객을 좀 더 번거롭게 만드는 점에 대해 서는 고객과 적극 공감하며, 대신 고객에게 좀 더 빠른 피드백과 전체 비용이익을 더 향상시켜 줄 수 있다는 점을 부각시킵니다.\n    C. 프로젝트 성공에 대한 열망이 강한 고객일 수록 반감없이 쉽게 끌어들일 수 있다는 점과 일치합니다.\n    \n\n5.  **타협하고 싶어진다. (자동화된 Test는 어려우니까 빼고…etc)** \n\n    A. 타협은 할 수 있지만, 이득을 얻지 못하게 되는 부분이 어떤 점인지는 고객/팀원 모두 인지해야 합니다.\n    B. 그리고, 최대한 적용할 수 있는 부분까지 적용하기 위해 노력합니다. (ex.특별히 민감한 모듈에 대해서는 자동화 테스트를 구축)\n\n6.  **Agile 에 대한 개발자들의 오해와 마음가짐** - Agile 하면 산출물 안 만드는 거 아냐? 라고 생각하는 사람들이 적지 않습니다.\n    - 만들어야 한다고 하면 급 실망해하며 결국 비슷하잖아... 라고 돌아서기 쉽습니다.\n\n    A. 애자일의 가치가 산출물 미작성에 있는 것이 아님을 인식시킵니다..\n    B. 경우에 따라서는 사용하는 개발 방법론이 Agile 임을 숨길 수도 있습니다. (단, 이런 경우 일부 개발자에게 줄 수 있는 'Agile 프로젝트로 진행한다'는 자긍감은 주지 못하게 될 수 있습니다.)\n    C. 필요한 산출물은 팀원이 공의의 개념(Consensus)을 갖기 위해서임을 인지시킵니다.\n    D. 불 필요한 산출물은 최대한 제어되고 있음을 이해시킵니다.\n\n7.  **기법 활용 미숙 (User story ? Story point?, 스크럼 미팅? CI?)** - 책 읽고, 교육 한번 받고 진행하면 헤메기 딱 좋습니다. 기존 방법론의 갑갑하지만, 타이트한 틀이 없기 때문입니다.\n\n    A. 첫 번째 적용 프로젝트일 경우 피할 수 없음. 단, 보정에 대한 감을 빠른 시일 내에 갖을 수 있도록 노력하며, 현황을 고객과 공유할 수 있는 용기를 가져야 합니다.\n    B. 프로젝트 성공을 위해 할 수 있는 최선을 다할 예정임을 이야기하고, 지원을 얻어야 하겠습니다.\n    C. 이 때, 이를 볼모로 하는 고객의 낚시 행위에 대해서 적절히 대응 해야 합니다.\n    \n\n8.  **외부 감리는 어떻게 설득할 것인가?**\n    - 외부 감리가 당황해 할 수 있습니다.\n\n    A. 외부 감리를 받아야 하는 프로젝트의 경우 반복주기(Iteration)을 따로 잡아, 감리용 산출물 작업을 할 수도 있습니다.\n    B. 외부 감리를 받아야 하는 프로젝트는 우선은 애자일 방법론 도입은 미루고, 애자일 기법(Practice)도입을 선행 하는 식으로 프로젝트를 개선시킬 수 있습니다. (Daily Build, CI, TDD, Pair work etc)\n    C. 자칫 무모하게 들릴 수 도 있지만, 애자일 도입 조직이 큰 조직일 경우, 외부 감리 조직에 대해 로비를 해서 자사의 Agile 방법론이 감리 방법론중 하나로 새롭게 적극 반영 될 수 있도록 하는 작업을 진행합니다. (아직은 초기단계라 선점 가능함. S모사나 L모사, 또 다른 S모사 같은 경우 충분히 가능하다고 봅니다)\n\n9.  **SI에는 분석 설계가 끝난 다음에 개발자가 투입되는 경우가 많습니다. 하지만, 이는 대부분의 Agile 방법에 상치됩니다.** \n\n    A. 우선은 프로젝트 규모와 방향에 대해서 후 투입된 개발자들이 이해할 수 있게 하는 것이 중요합니다.\n    B. 이를 위해 분석/설계자들과 Workshop 을 함께 진행하는 것도 하나의 방법이 될 수 있습니다.\n    C. 요구사항(혹은 SRS)에 대해 분석/설계자들과 개발자들 각각의 개발 SIZE 에 대한 논의를 진행해 볼 필요가 있습니다.\n    D. 이 때 필요하다면, 일부에 대해 Planning Poker Game 등을 사용해서 각자 비슷한 수준으로 생각하고 있는지 확인해 봅니다.\n    E. 크게 다른 부분이 나올 경우는 공의가 이루어지지 않았거나 분석에서 추정을 잘못한 경우입니다. 가급적 빠른 협의가 필요합니다.\n    \n\n10.  **초급 개발자들이 많은 프로젝트는 어떻게 해야 하나요? 문제를 일으키는 개발자가 있을 경우에는요? 그리고, 인원교체가 쉽지 않은 경우에는요?** 개발자 5명 정도의 소규모 팀이라면 1명의 포션이 20%입니다. %가 큽니다.\n\n    A. 이론적인 솔류션은 '해당 팀원의 문제가 무엇인지를 파악. 이를 해결해 주고 함께 나아간다' 입니다.\n    B. 하지만, 상황에 따라 팀원을 교체하는 것이 답일 수 있습니다. (이때, 다른 팀원들도 납득할 만한 상황이어야 합니다)\n    C. 실제, 0.5 MM 나 그 이하의 Man Power 를 내는 팀원의 경우, 교체가능한 인력 수급문제나, 새로운 인력의 프로젝트 적응기간 필요로 인해 '교체'자체가 난감한 경우가 있습니다. 이럴 때 조차라도 팀원 교체, 내지는 팀원 규모자체를 줄이는 방향으로 MM를 맞추는 것이 비용적인 측면에서 이득이 될 수 있습니다. (여기서의 비용은 프로젝트 비용, 커뮤니케이션 비용 등을 말합니다)\n    \n\n11.  **혹시, 사내에서 필수로 사용해야 하는 프로젝트 프로세스나 시스템(진척도,공정관리 등등)들은 어떻게 할까요? 예외로 할까요?** \n\n    A. 팀의 마스터(혹은 PL, PM)가 해결해 주어야 하는 문제중 하나.\n    B. 경량화된 형태로 팀을 운영하는데에, 해당 프로세스가 주는 부담을 최소화 해야 합니다.\n    C. 관련팀과 협의하여 사용 예외로 처리하고, 대신에 대체할 산출물을 찾습니다.\n    D. 혹은, 프로젝트 종료 후 애자일 산출물을 바탕으로 후 기입하는 방식을 따르게 할 수도 있습니다.\n    F. FP 계산을 요구할 경우, 마찬가지로 대체 추정 가능한 산출물을 준비합니다. (ex.Stroy Point의 workday/MM 변환등)\n\n12.  **'전체비용절감'을 생각하는 Agile에서 봤을 때, 배포전까지의 비용이 오히려 예전보다 높을 수 있습니다. 구축만 하고 빠지는 프로젝트의 경우 그걸 감당하려는 PM이나 팀을 만들 수 있을까요?** \n\n    A. 애자일 실천방법들(TDD, CI, PAIR Programming(=work) )등을 적극 도입할 경우 개발기간이 일정 부분 늦어질 수 있습니다. (연구에 따르면, 숙련된 개발자들로 TDD만 사용했을 때에도 20%정도 가량 개발진척이 늦어질 수 있다고 합니다)\n    B. 이 때, 가장 좋은 방법은 고객에게 선택지를 내미는 방식입니다. (Practice 사용하면 결함수정비용을 포함한 전체 개발비용을 어느 정도 감소시킬 수 있는지, 연구자료/조사자료를 제시합니다. 도입/미도입에 따른 효과/비용을 이야기해서 고객이 선택하게 합니다.)\n    C. 가장 좋은 방법은 이런 내용을 바탕으로 차별화된 방식으로 수주를 하는 것이라 생각합니다.\n    D. 향 후 분리발주가 정착되면, 이를 응용해서 구축 비용을 분할해서 받는 것도 가능해 질 수 있겠습니다.\n    E. 동일 팀이'기획 -> Product 개발 -> 출시 -> 유지보수/기능개선'으로 지속적으로 운영되는 애자일 팀과 '개발팀  유지보수팀 분리'의 SI 팀이 확연하게 다른 부분이 바로 이 부분입니다.\n\n개인적인 SI 애자일을 도입하는데에 Plus 가 될 수 있다고 생각하는 방향은, 인력과 리소스를 모아 사내에 Star Team 을 만들어서, 다른 사람들이나 팀이 따라오거나 본을 삼을 수 있도록 만드는 것인 것 같습니다. 그리고 이 때, Star Team 의 작업방식을 투명하게 공개해서, 쉽게 따라할 수 있도록 하면 더 좋을 것 같습니다.\n\n이상, Agile을 SI에 도입하기 위해 고려해야 하는 질문들에 대한 개인적인 의견이었습니다.\n\n[ScrumAgile.png](/files/21684)    그림출처 : http://blogs.conchango.com/colinbird/archive/2006/03/10/3058.aspx\n\n#### Comments\n\n정말 치열하게 생각하시네요.\n멋집니다. \n점심 먹고 자세히 읽어보겠습니다.\n\n [박성철](http://me2day.net/geekinside) | 2009-02-19 목요일 오전 9:7\n\n--\n",
    "attachments": [
      {
        "id": 21684,
        "name": "ScrumAgile.png",
        "hash": "a7f2f75da4cffceacacb2580590b33e04ba0423a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 122650,
        "containerId": "12263"
      }
    ]
  },
  {
    "id": 91,
    "title": "Agile Development, Explained",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1235734527000,
    "body": "> doortts | 2009-02-27 금요일 오후 8:35 | 이생각 저생각 | [원본](http://blog.doortts.com/91)\n\n![zrclip_001p55c813e1.png](/files/21685)})\n\n![zrclip_001n6ee0053e.png](/files/21686)})\n\n애자일이 이렇게 쓰여선 안되겠죠...\n\n출처 : [http://www.geekherocomic.com/comics-highres/2009-02-21-agile-development-explained.png](http://www.geekherocomic.com/comics-highres/2009-02-21-agile-development-explained.png)",
    "attachments": [
      {
        "id": 21685,
        "name": "zrclip_001p55c813e1.png",
        "hash": "bfaa0ffcad2944c9ea371ce9b120720c001d00dc",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 134349,
        "containerId": "12264"
      },
      {
        "id": 21686,
        "name": "zrclip_001n6ee0053e.png",
        "hash": "a07b6ac91b105d056c5052685a8cbf93dda5076a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 127338,
        "containerId": "12264"
      }
    ]
  },
  {
    "id": 92,
    "title": "일을 즐거워 하는 사람이 일을 잘하는 사람이 되지 못하는 이유",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1235909880000,
    "body": "> doortts | 2009-03-01 일요일 오후 9:18 | 이생각 저생각 | [원본](http://blog.doortts.com/92)\n\n--- 쓰고 나서 보니, 글 자체가 '시덥잖다' 는 느낌이 들었지만, 들인 시간이 아까워서 올린다. ---\n\n고등학교 때 공부에 있어서 심하게 좌절감을 느끼게 만들어 준 두 부류가 있는데,\n\n그 중 하나가 '머리가 좋은 녀석들'이었다.\n\n한 번 책을 읽는 것 만으로도 '포토그래픽' 수준의 메모리를 자랑하며 책의 페이지와 위치까지 기억해 내는 부류.\n반복해서 읽어도 자고 일어나면 곧 잘 흐릿해지는 나에게는 그저 부러움의 존재들이었다.\n\n그리고 얘네는 정말 이길 수 없겠구나! 라며 완벽하게 무릎꿇게 만든 부류가 바로 두 번째인데,\n\n'공부가 재밌다는 녀석들'이었다.\n\n하는 일이 재밌다는 사람들에 대해서는 따라가는 사람이 머리가 좋든, 노력을 하든 어쨌든 절대 당할 수가 없는 거다.\n너무 재밌어서 눈 뜨고 있는 하루의 대부분을 그 속에서 살고 싶어하는 사람들은 '정말 그 일을 해야 하는 바로 그 사람'인 거다.\n\n모든 분야가 비슷하지 않을까 생각했다.\n\n그리고 무언가에 종사하는 사람은 보통 두 가지 부류로 나뉘는 것 같다.\n\n 원해서 하는 사람과,\n해야 하기 때문에 하는 사람. \n잘 하고 못하고는 두 번째 문제이고, 시간의 흐름안에서 결국 더 앞서 나아가는 사람은 대부분 전자라고 믿는다.\n\n...\n\n근래에 사람들을 접하게 되면서, 소위 일 잘한다는 사람을 보게 된다.\n그런데 일 잘하는 사람과 일을 즐기는 사람이 일치하지 않는 걸 보곤 한다.\n\n왜 그럴까? 일을 즐기면 당연히 더 잘하게 되는게 아닐까?\n공부가 재밌으면 성적이 더 잘 나오는게 당연하잖아?\n그런데 사회에서는 뭐가 다른걸까?\n\n일 잘하는 사람이란 어떤 사람인가를 살펴 보자.\n\n- 맡은 일의 마무리를 잘 짓는다.\n- 실수가 적다\n- 성공하기 어려운 일을 잘 성공시킨다.\n\n\n더 있겠지만, 대표적으로 위 세가지 정도가 아닐까 싶다.\n\n이에 대해 일을 좋아하는 이들의 특징은 대개 아래와 같다.\n\n- 반복적이거나 비 효율적인 일을 개선하기 위해서 다양한 시도를 한다. (실패나 지연이 생긴다)\n- 더 많은 일을 하려고 한다. (힘들어 진다)\n- 성공하기 어려운 일도 도전해 본다 (실패가 따른다)\n\n\n이런 부류는 요령과 기술이 쌓이기 전에는 좋은 소리 듣기 힘들다.\n\n반면 '일 잘하는 사람' 되는 쉬운 길은 아래와 같다.\n\n- 일을 적절히 가려가면서 적게 한다.\n- 자신이 현재 하는 일이 얼마나 어려운지에 대해서 효율적으로 광고 한다.\n- 일을 재밌어하는 사람을 이용하거나 사용 가능한 사람들을 최대한 쥐어짠다.\n- 성공하기 어려운 일은 가능한 한도 내에서 절대 맡지 않는다.\n\n\n극단적인 케이스를 예로 들었지만, 그리고 입 안 한 켠이 씁쓸하지만,\n동료에게 인정받기 보다 위에서 인정 받으려면 어쩔수 없다.\n\n가끔' 재주좋다.기술 좋다'는 소리에 자신이 '일 잘하는 사람'으로 착각하는 사람들이 있는데, 비정하게도 조직의 사람이라면, 위에서 당신을 생각하는 모습은 다를 수 있다는 걸 잊지 말아야 겠다.\n\n#### Comments\n\n그래도 일은 즐기면서;;ㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-03-03 화요일 오후 2:20\n\n--\n\n아놔~ 난 둘다에 해당사항이 없군하~\n\n mini | 2009-03-26 목요일 오후 12:57\n\n--\n\n일은 즐기는 == 잘하는 \n\n사람이 되고 싶어요~~ 냐하 ;\n\n [스루](http://srue.net) | 2009-05-16 토요일 오후 4:7\n\n--\n\n난 일잘한다고  \"알려진\"  사람인데...\n(잘난척은 아니고, 현실과 다르다는...)\nsubtyping좀 해봐봐요~~~ ㅋ\n\n 동네 엉아들 중 1인 | 2009-05-17 일요일 오후 6:44\n\n--\n\n아주 정확하시네요..\n\n쥐어 짜는 사람 몇 몇 알고 있습니다. \n\n결국 돈 쥐는 사람들이고.... \n그 사람들 즐기려는 사람들 찾지만...\n일 잘하는 사람이 무서워 하는 사람은 눈치 빠른 사람ㅎㅎ\n\n tron1981 | 2010-01-14 목요일 오전 10:57\n\n--\n"
  },
  {
    "id": 93,
    "title": "그림으로 보는 자바 학습 로드맵",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1237961780000,
    "body": "> doortts | 2009-03-25 수요일 오후 1:54 | 이생각 저생각 | [원본](http://blog.doortts.com/93)\n\n안그래도 예전부터 책을 이용한 로드맵을 한 번 그려보면 어떨까 생각했었더랬는데,\n마침 [한빛 출판사에서 이벤트](http://www.hanb.co.kr/events/roadmap/ \"[http://www.hanb.co.kr/events/roadmap/]로 이동합니다.\")를 하길래 만들어 보았습니다.\n\n로드맵을 그릴 때 고려했던 점\n- 아무리 좋은 책이 많아도 한 분야에 너무 많은 책을 제시하면 학습자에게 로드(Road)를 제시하지 못한다.\n- 읽었을때 소요 시간대비 학습효과가 큰 책 위주\n- 개발의 전 분야를 다루기 보다는 가급적 자바 개발로 한정한다. (자꾸 욕심이 나서 이게 정말 쉽지 않더군요.)\n\n![JavaStudyRoadMapWithHanbitPress3.png](/files/21687)[말 그대로의 로드맵, 클릭하면 크게 보입니다. 출력해서 벽면에 붙일 수 있는 ver.]\n\n로드맵 해설\n[입문]\n\n- 자바 문법과 사용법을 익힐 수 있는 책\n- JSP/Servlet 문법과 사용법을 익힐 수 있는 책\n\n입문은 다 비슷합니다. 다만 좋은 책을 하나 골라 차분히 읽는 것이 중요. (쇼핑식 여러 도서 구매 금물!)\n그 중에서 비 전공자들에게 좀 더 쉽게 어필되는 것이 Head First 시리즈가 아닌가 싶다.\n\n[문법떼고 읽을 분야]\n- 알고리즘\n- 테스트 주도 개발\n- 리팩터링\n\n위 세가지 분야의 책은 언제 읽어도 읽어야 하는 책. 물론 개발 경험이 어느정도 있으면 더 잘 와닿겠지만, 초반부터 습관을 들인다는 측면에서 읽는 것도 괜찮을 것 같다. 왜냐하면 나중에 다시 읽으면 또 느낌이 새로울 분야이기 때문.\n\n[고급과정]\n- 디자인 패턴\n- 소프트웨어 방법론이나 생산성 관련 도서\n\n디자인 패턴은 언제든 한 번쯤 다리를 걸고 넘어질 내용이다. 고전명작 GOF의 책(피어슨 에듀케이션)이 부담스럽다면 HF 시리즈가 답. 물론 영진닷컴에서 나온 유키히로시의 책도 대안이 될 수 있지만, 머리속에 강하게 남는데는 HF 시리즈만한게 없는 것 같다.\n\n소프트웨어 방법론이나 생산성하면 개발 담론서 및 Agile 관련서를 떠올리기 쉽다.\n실용주의 프로그래머책이 센세이션을 일으켰는데, 초반에 접근하기엔 난이도가 살짝 있을 수 있으므로 사전에 경험을 좀 쌓아두는 것도 괜찮다. 그런면에서 코드 크래프트는 적절한 난이도가 아닌가 싶다.\n\n[분야집중]\n- 웹\n웹은 단어부터가 방대한데, 우선 HTML 정도는 알아야 하지 않나 싶다.\n그리고 나면 당연 JSP/Servlet 인데, 근래에 우리나라에서는 x-internet 기반이 심해져서 오히려 학습효과가 떨어지는 기현상(...)이 있지만 어쨌든 배워두어야 하는 기초 기술임에는 틀림없다. 이쪽은 특히나 API 위주로 학습하면 나중에 카오스 상태에 빠지기 쉬우므로 착실하게 기초를 닦아 둘 필요가 있다.\n\n- 네트워크 프로그래밍 : 별론 선택이 많지 않다. Manning 에서 나온 자바 네트워크 책이 훌륭하다고 하지만, 본적이 없는 관계로 이야기 하기 힘들다. 대신 Java5의 NIO 기능에 관심이 있다면 마찬가지로 선택지가 거의 없다.\n [개발의 효율을 높이는 유틸리티]\n- 유틸리티 시리즈\n. 시간을 들인만큼 보답을 받을 수 있는 분야중 하나가 유틸리티 관련서이다.\n. 이클립스 자체에 대한 설명은 '세상을 덮친 이클립스 3/ed'이 괜찮다. (하지만 여기엔 호불호가 갈릴듯)\n. 한빛에서 나온 유틸리티 시리즈는 다들 어느정도 이상 볼만한데, 아쉬운건 맵에도 적었지만, 겹치는 부분이 쏠쏠해서 구매에 부담을 준다는 사실이다.\n\n그 외에 HTML/JAVASCRIPT , DB/SQL계열, 프레임워크 계열등이 많지만 그건 각자 차차 학습해 나갈 수 밖에 없는 분야이다.\n\n배움의 끝이 어디 있겠냐마는 최초의 한 권을 선택하기 어려운 경우라면 로드맵의 추천서부터 읽어도 절대 손해는 보지 않으리라 생각된다.\n\n----------------------------------------\n1\\. 현재 하시는 일은 무엇인가요?\n - IT 회사 교육 부서에 근무\n\n2\\. 로드맵에서 각 단계별로 같이 보면 좋은 책이 있나요?\n - Head First 시리즈는 전 시리즈에 걸쳐서 높은 품질을 유지하고 있습니다. (IT 서적계의 블럭버스터이기도 하죠)\n - 같이보면 좋은 책을 찾는 것도 좋지만, 배울때에는 좋은 책 하나를 꾸준히 보는 것이 더 중요할 수도 있습니다.\n\n3\\. 로드맵에 대한 자신의 생각을 적어주세요.\n - 로드맵도 중요하지만, 자칫하다간 욕심이 앞서 Book Shopper 로 전락할 수도 있다.\n\n무엇보다 중요한건, '배우고자 하는 열의' 그리고 그를 통해 '자신을 발전 시킬 수 있다고 믿는 신념'이 아닐까 한다. 부디, 포스가 함께 하시길! (May Force be with You!)\n\n#### Comments\n\n추천 하나 했음..ㅋ 푸힛;;ㅋ\n\n [성윤](http://helols.tistory.com) | 2009-03-26 목요일 오전 9:39\n\n--\n\n형 일등 먹은거 축하해요;;ㅋㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-04-01 수요일 오전 9:29\n\n--\n\n참 잘 정리해주셨네요! 팀원들 스터디 가이드라인을 찾던 중인데 고민이 해결됐습니다. 감사합니다! Book Shopper는 딱 제 얘기라 찔끔하네요^^\n\n [javanese](http://blog.eclipsercp.or.kr/javanese) | 2009-04-26 일요일 오후 2:25\n\n--\n\n정리해주신 자료 감사히 보고갑니다^^ 출력해서 저희 연구실에도 하나 붙여둬야겠네요^^\n\n [Eunseok](http://kimeunseok.com) | 2011-03-22 화요일 오전 9:35\n\n--\n",
    "attachments": [
      {
        "id": 21687,
        "name": "JavaStudyRoadMapWithHanbitPress3.png",
        "hash": "993222e1dc3db1458c64f239979964ec98bd641e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 991493,
        "containerId": "12266"
      }
    ]
  },
  {
    "id": 94,
    "title": "내가 읽은 Agile Books",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1241539843000,
    "body": "> doortts | 2009-05-06 수요일 오전 1:10 | Books | [원본](http://blog.doortts.com/94)\n\n내일부터 새로운 프로젝트에 간다.\n\n사내에서는 Agile 프로젝트라고 부르려는(...) 프로젝트이다.\n\n평소 관심과 평소 진행한 몇 가지 교육, 그리고 관련서적 탐독만으로 실제 프로젝트에 내가 도움이 어느정도 될런지는 모르겠지만, 그 정도인 나에게조차 기울여지는 관심이 적지 않기 때문에 부담이 큰것도 사실이다. (이런 상황에서 내가 절대로 경계해야 하는 건 교조주의! 일것이다)\n\n뭐, 비단 나 뿐 아니라, 우리나라에서 Agile 을 접하는 것 자체가 쉽지 않은데 그나마 제일 근접할 수 있는 방법이라고 한다면 '책'을 통해서일 것이다. Agile 관련서적은 국내에서는 사실 [인사이트](http://blog.insightbook.co.kr/) 출판사가 거의 최선봉을 맡고 있다. 그간 읽었던 Agile 책들을 정리해 보니 인사이트 책들이 압도적으로 많다.\n\n![clip_image002.jpg](/files/21688)})\n\n**익스트림 프로그래밍, 제2판 : 변화를 포용하라\n(Extreme Programming Explained: Embrace Change (2/E))**\n\nKent Beck의 책으로 내가 제일 먼저 접하게 된 XP 책이다. 그리고 내 삶의 상당부분을 변화시킨 책이기도 하다. 지금은 여러 책들이 많이 출간되었고, 애자일이 어느 정도 이야기 되었었더랬지만, 저 책을 처음 접했을 당시만 해도 책 안의 내용들이 '눈물나게' 감격적이었다.\n\n010101 이진수로 이루어진 어쩌면 가장 비인간적인(=감정적 요소가 제외되어져야 하는) 업계에서 이렇게 사람(People)을 전면으로 내세우면서도 프로젝트가 성공할 수 있다는 빛을 보여준 책이랄까?\n\n이래 저래 몇 번은 읽은 것 같다.\n\n![clip_image004.jpg](/files/21693)})\n\n사용자 스토리: 고객 중심의 요구사항 기법\n(User Stories Applied : For Agile Software Development)\n\n**Mike Cohn** **의 책인데,** 사용자 스토리에 대한 구체적이고도 실질적인 사례를 들고 있다. 사례를 많이 들다 보니, 때로는 이야기가 다소 반복적으로 설명되는 경향이 있긴 하지만, 사용자 스토리 작성의 교과서라 불려도 손색이 없는 것 같다. 각 장마다 토론거리와 문제들을 올려 놓아서 좀더 오래, 그리고 깊게 볼수 있도록 배려한 점은 저자의 센스와 식견을 잘 보여준다.\n\n**![clip_image006.jpg](/files/21692)})**\n\n**스크럼:** 팀의 생산성을 극대화시키는 애자일 방법론(Agile Software Development with SCRUM)\n\n**근래에 가장 크게 유행하고 있는 애자일 프렉티스라면 스크럼(SCRUM)**이 아닐까 싶다. 그 스크럼에 대한 해설서인데, 책이 두껍지 않게 되어있어서 금새 읽을 수 있다. 스크럼은 단순히 그 안의 실천방법들만 배운다면 10분이면 배울수 있다는 식으로 편하게 이야기 하지만, 실제 스크럼으로 프로젝트를 진행할때 발생하는, 그리고 고려해야 하는 문제들을 어느정도 다루고 있다. (사실 썩 만족스럽게 다루는 수준은 아니다.) 어쨌든 스크럼을 적용하는 팀은 적어도 한 권은 비치되게 되지 않을까 생각한다. (앞으로 더더 팔릴듯=,=)\n\n**![clip_image008.jpg](/files/21689)})**\n\n**애자일 프랙티스**Practices of an Agile Developer\n\n**올해 읽은 책 중에 이 책이 포함되어 있는데,** 원서는 Pragmatic Bookshelf 에서 발간되었다.(원서의 출판사 이름만으로도 두께는 추측이 가능할 것이다.) 개인적으로는 생소한 Venkat Subramaniam 이라는 사람과 실용주의 프로그래머로 유명한 Andy Hunt 가 공동저자이다. 결론부터 말하면 그간 읽은 책들이 있었어서인지 내용 자체는 다른 Agile 서적들에 비해 다소 싱거웠다. 알법한 이야기가 많이 나왔다고나 할까? (Andy hunt 때문일 수도 있다)\n\n**![clip_image010.jpg](/files/21696)})**\n\n**애자일 회고:** 최고의 팀을 만드는 애자일 기법Agile Retrospectives: Making Good Teams Great\n\n**사실 읽다가 중반에 현재 잠깐접혀 있는 상태이다.** 회고에 대한 다양한 사례를 전문가 (회고계의 여신) 두 분(...)이 이야기 해주고 있다. 중간에 접어놓게 된 이유는 취향과 달라서 살작 지루했다는 점이다. 공학도이다 보니 왠지 좀더 응축해서 간결하게 말할 수는 없었을까 하는 생각이 들었다.\n\n**ps.** **제목 자체는 짐 콜린스의 그 유명한 책인 Good to great** 를 패러디한 느낌이랄까? 뭐, 말하고자 하는건 알것 같다.**![clip_image012.jpg](/files/21697)})**\n\n**![clip_image014.jpg](/files/21695)})**\n\n현재 읽고 있는 책. 사용자 스토리의 저자 마이크 콘(Mike Cohn)이 그 뒤에 쓴 책으로 추정과 계획쪽에 집중해서 이야기 하고 있다. (이부분이 사실 모호해 지기 쉬워서 많이 공격받는 부분인지라 아마 더 자세하게 할 말이 많았던것 같다.) 제대로 된 서평은 다 읽고 써야겠음.\n\n그외 인사이트 출판사 이외의 애자일 관련 책으로는\n\n![clip_image016.jpg](/files/21690)})\n\n위키북스의 **린 소프트웨어 개발의 적용.\nmplementing Lean Software Development: From Concept to Cash**\n\n(인사이트에 비슷한 책인 '린 소프트웨어 개발:애자일 실천 도구 22가지' 이 있는데 전 이쪽을 먼저 접하게 되었다.)\n\n그 유명한 포펜픽 부부의 책. 인사이트 쪽과 위키북스 쪽중 어느 쪽이 더 유명한진 모르겠지만, **굉장히 재밌는 내용이었다.**\n\n이 책을 들고 복도에 서서 1/3쯤 읽게 만들정도로 재미있었다. 특히 항공사 이야기가 많이 나오는데, 분야가 새로워서인지 더 흥미로웠다.\n\n![clip_image018.jpg](/files/21694)})\n\n**엔터프라이즈급 애자일 방법론\nScaling Software Agility: Best Practices for Large Enterprises**\n\n이것도 위키북스에서 나온 책으로 애자일 방법론의 엔터프라이즈급 적용에 대해서 이야기한다고 써있는데, 앞부분에 방법론 이야기와 일반론이 상당부분 나와서 좀 아쉬웠다. 애자일을 포함한 다양한 방법론에 대해서 정리/요약해서 설명해 주고 있다. 아마 저자가 RUP에서 넘어온 사람이라 스스로도 핑계김에 정리해 본게 아닐까 하는 생각도 살짝 들었다. 그리고 DSDM이 언급되는 최초의 국내 서적이 아닐까?\n\n팀 동료의 추천도서이기도 하다.\n\n![clip_image020.jpg](/files/21691)})\n\n**Head First Software Development****더 쉽고 재미있게 소프트웨어를 개발하는 방법**\n\n한빛 출판사 최초의 애자일 도서. 애자일하게 소프트웨어를 처음부터 끝까지 만드는 방식에 대해서 간략하게 설명해 주고 있다. 입문자가 보기에 매우 쉽게 잘 쓰여져 있으며, 헤드퍼스트 시리즈의 네임벨류에 걸맞는 수준이라고 생각한다. 다만 몇몇 분들이 깊이가 다소 얕지 않느냐고 말씀하시던데, 이정도 두께에 이정도 내용이면 초급에겐 적당하다고 생각된다. 좀더 깊이가 필요한 부분은 따로 구매해도 될 많은 책들이 있으니까. (애자일 프로젝트 투입시 교육용으로 괜찮지 않을까?)\n\n그 외에도 더 있습니다만, 밤이 늦은 관계로 시간날 때 다른 글로 보충해야 겠다.\n\n뭐, 주르륵~ 이런 저런 책을 소개했지만, 결과적으로\n\n'변화'는\n\n따라가야 하는 것인지, 아니면 만들어 나가야 하는 것인지는 어디까지나 전적으로 적용하는 사람의 손에 달렸지 않나 싶다.\n\nPS. 연휴 끝났네요. 좋은 하루 되세요.\n\nPS2\\. 몸이 저질이라 연휴동안 골골대다 이제 조금 회복되었네요.\n\n#### Comments\n\n컥 많이도 읽었네요 ;;ㅋㅋ \n부디~ 좋은 성과 있길.. ㅋㅋ 바래요 ~ 행님~ㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-05-06 수요일 오후 2:17\n\n--\n\n뭐, 별로~\n\n언제 함 봐야지!\n\n [doortts](http://blog.doortts.com) | 2009-05-07 목요일 오후 7:11\n\n--\n\n안녕하세요. 인사이트 두루입니다.\n트랙백 감사합니다.\n플래닝 포커 카드를 택배로 보내드릴 예정입니다.\n택배 받으실 성명, 주소, 전화번호와 트랙백 건 포스트 제목, 주소를 제 메일(kscs점insight골gmail점com)로 보내주시기 바랍니다.\n안 그러면 제가 마니마니 헤매게 되거던요...\n좋은 하루 되세요.\n\n duru | 2009-05-06 수요일 오후 7:9\n\n--\n\n오래간만에 포스팅이시네요.\n새로운 프로젝트 좋은 결과 얻으시기 바랍니다.\n\n [_jin](http://www.jinistory.pe.kr) | 2009-05-07 목요일 오후 2:24\n\n--\n\n몸이 저질이라 한 동안 골골댔었습니다.\n\n프로젝트 나오니깐 오히려 몸이 살아나는것 같네요.\n프로젝트 Lessons Learned 는 정리해서 공유토록 하겠습니다.\n\n [doortts](http://blog.doortts.com) | 2009-05-07 목요일 오후 7:9\n\n--\n",
    "attachments": [
      {
        "id": 21688,
        "name": "clip_image002.jpg",
        "hash": "b9a5777fdb6237919a254b705012c4b11745e98b",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 19608,
        "containerId": "12269"
      },
      {
        "id": 21689,
        "name": "clip_image008.jpg",
        "hash": "b15def14344c75e9e38d28c13b06e8487d104ce9",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 22059,
        "containerId": "12269"
      },
      {
        "id": 21690,
        "name": "clip_image016.jpg",
        "hash": "76bea31b83b5f9c8b25b64d9122d9e080fb0923b",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 19323,
        "containerId": "12269"
      },
      {
        "id": 21691,
        "name": "clip_image020.jpg",
        "hash": "23d9c0cb33a54b5a6504c37586959203427da2a5",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 22629,
        "containerId": "12269"
      },
      {
        "id": 21692,
        "name": "clip_image006.jpg",
        "hash": "24fcd6d33f6909d7c343c5c74e8755981c6ea800",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 18810,
        "containerId": "12269"
      },
      {
        "id": 21693,
        "name": "clip_image004.jpg",
        "hash": "e427c4a61284dd2eeac20566d2e84f46b041e439",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 23199,
        "containerId": "12269"
      },
      {
        "id": 21694,
        "name": "clip_image018.jpg",
        "hash": "2929207fcd2d96fffd8285c0e90bc79f7a806817",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 14649,
        "containerId": "12269"
      },
      {
        "id": 21695,
        "name": "clip_image014.jpg",
        "hash": "9f1614ae7b5831061b63b5e1d08a5a26d4b9f321",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 26790,
        "containerId": "12269"
      },
      {
        "id": 21696,
        "name": "clip_image010.jpg",
        "hash": "cc20f595eb82a454dd303ecaafec2ccab19c7cbf",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 25308,
        "containerId": "12269"
      },
      {
        "id": 21697,
        "name": "clip_image012.jpg",
        "hash": "e56b0a8030102daa2fe39aa315b79414a4978115",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 6897,
        "containerId": "12269"
      }
    ]
  },
  {
    "id": 95,
    "title": "Agile in the Yoido",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1242042207000,
    "body": "> doortts | 2009-05-11 월요일 오후 8:43 | 이생각 저생각 | [원본](http://blog.doortts.com/95)\n\n현재 여의도 모 프로젝트에서 Agile 프로젝트를 진행중이다. 내가 맡은 롤은 프로젝트가 Agile 을 유지할 수 있게 도와 주며, 특히 TDD 및 Pair Programming 에 대한 현장 가이드를 만들어서 제공하는 데에 있다. 기간은 대략 한달.\n\n단순 가이드만으로 그치지 않기 위해 현장에서 개발자들과 함께 개발업무를 나누어 하며 사내 Agile 가이드의 보완 작업등을 함께 할 예정이다. 처음에는 현장파견까지 Full Time 으로 진행할 것인가에 대하여 의문점을 갖는 사람들도 있었지만, 급박하게 돌아가는 단납기 프로젝트에서 Agile 을 적용하고, 애자일 실천기법(Practice)을 적용하는데는 다소 위험이 따르기에, 부하 분산적인 측면에서도 프로젝트에 M/M(Man Month)기여를 하겠다고 했다.\n\n사무실은 다른 사람들과 달리 난 야근수당도 없고, 프로젝트 성공시에도 Profit Share 대상에서 제외된다.\n\nAgile 과 함께 생산성 향상등에 대해서 고민중인데, 현재 SA (Software Architect)가 따로 있는 상황에서 내 Role 이 다소 묘하게 느껴질 때도 있다.  하지만, 뭐가 어찌 되었든, 부디 이번 프로젝트가 사내 Agile 성공 프로젝트로 사례로 남아서, 좀 더 Agile 이 넓게 펼쳐졌으면 한다.\n\n사람은 죽고 시스템은 사는 프로젝트 현실(People is dying for System)에 Agile 에 나름 빛이 될 수 있을까? 문제는 생산성인데, 생산성이 늘면 과연 그 만큼 사람들에게 여유를 줄 수 있게 될런지는 또 다른 의문이긴 하다.\n\n어쨌든, 오늘 드디어 개발자들과 첫 대면을 마쳤고, 함께 '화이팅!'을 했다.\n\n\n#### Comments\n\n아! 수원님이 지도하는 애자일 프로젝트라면 한번 참여하고 싶어지네요. ㅎㅎ\nPM은 잘 협조하려나요? \n그런데 TDD와 짝 프로그래밍... 정말 수련이 많이 필요하다는 생각이 드는데 잘 되어서 좋은 경험으로 남았으면 합니다.\n\n그런데 사람이 죽는 것은 맞는 데 시스템이라도 살아 남나요? ㅋㅋ\n\n [박성철](http://me2day.net/geekinside) | 2009-05-19 화요일 오전 10:52\n\n--\n\n누굴 지도하고 뭐 그런거 아닙니다. 같이 머리맞대고 고생해 보자는 거죠. 뭐. :)\n\n [doortts](http://blog.doortts.com) | 2009-05-19 화요일 오후 9:44\n\n--\n"
  },
  {
    "id": 96,
    "title": "드디어 구글 캘린더에 !!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1242986301000,
    "body": "> doortts | 2009-05-22 금요일 오후 6:58 | 이생각 저생각 | [원본](http://blog.doortts.com/96)\n\n구글 캘린더를 beta 때부터 아주 잘 써오고 있다.\n벌써 2년이 넘었는데,\n\n때 되면 일정을 핸펀으로 보내주는 무료 sms 기능까지 추가되었어서, 사내 캘린더도 버리고, 아주 잘 쓰고 있었는데, 딱 하나 아쉬운 것이 ToDo list 기능이 없었다는 점이었다.\n\n그런데 오늘 캘린더를 들어갔더니만..\n\n[](./attachments/)\n앗? 저건?\n\n[](./attachments/)이야~!! 드디어 To Do List 기능까지 추가되어 버렸다. 그것도 아주 깔끔하게!\n\n참조 : http://gmailblog.blogspot.com/2009/05/tasks-now-in-calendar-too.html",
    "attachments": [
      {
        "id": 21698,
        "name": "newTask.png",
        "hash": "a0c01d3bf8e78fa7b292fbba9ed3a77bbe398b84",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2132,
        "containerId": "12268"
      },
      {
        "id": 21699,
        "name": "calendar_tasks[1].jpg",
        "hash": "be4f365863efbb04d16cca2c90313febace3860e",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 29063,
        "containerId": "12268"
      }
    ]
  },
  {
    "id": 97,
    "title": "애자일 JAM Project 사이트 오픈 중",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1243216729000,
    "body": "> doortts | 2009-05-25 월요일 오전 10:58 | Better SW Development | [원본](http://blog.doortts.com/97)\n\n안녕하세요? 즐거운 월요일입니다. :)\n현재 저는 여의도에서 Agile로 진행되는 SI 프로젝트에 참여 중입니다.\n\n기본환경은 JAVA + x-internet (GAUCE) + 사내 JAVA프레임워크(DEVON, struts와 ibatis 와\n유사함) 로 진행되며,\n\n회사내에서 모처럼 Agile 기법들을 최대한 도입하기로 하였습니다.\n(사용자스토리, 추정, 회고, SCRUM, CI(=허드슨), TDD, Pair Programming 등등.. )\n\n업무는 특정 고객들을 대상으로 하는 영문베이스의 global web page 구축입니다. (보고서 기능도 있네요)\n\n회사내에서야 물론이고, 회사 밖 분들에게도 직/간접적으로 도움이 될 수 있도록,\n진행상황을 공개하려고 합니다.\n\n[http://doortts.textcube.com](http://doortts.textcube.com/)\n(프로젝트 종료 후 해당 사이트를 살려두게 될런지는 불분명합니다만 우선은 공개합니다)\n\n그때 그때의 Lessons Learned 와 고민을 정리해보고 있습니다.\n\n급박하게 돌아가는 SI 에서 Agile 이 어떻게 쓰이고,\n어떻게 득/실이 나오는지도 함께 보게 될 예정입니다.\n\n보시고, 이런저런 아이디어들도 얻어가시고, 뭐, 코멘트도 달아주신다면야 그야말로 더더욱 좋고요~  :)\n\n그럼, 행복한 하루 되세요~(^_^)/\n\n#### Comments\n\n마치 프로젝트 현장에 있는듯한 생생함을 전해주시는군요.\n흥미롭게 잘 보았습니다.\n결과가 어찌되던간에 과정자체에서 많은것을 얻어갈 수 있겠네요.^^\n\n [열이아빠](http://koko8829.tistory.com) | 2009-05-25 월요일 오후 12:39\n\n--\n\n흥미롭게 봐 주셨다니 감사합니다.\n\n [doortts](http://blog.doortts.com) | 2009-05-26 화요일 오전 9:27\n\n--\n\n님의 오픈 마인드로 인하여 우리나라의 IT 미래는 더욱 발전하리라 믿어 의심지 않습니다.\n자주 들려보겠습니다. ^^ 좋은 결과 있으시길...\n\n [아름프로](http://jazz.pe.kr) | 2009-05-25 월요일 오후 12:42\n\n--\n\n뭐, 그렇게까지 거창한게 아니라서 더욱 부끄럽습니다만, 어차피 다같이 잘해보자고 하는거 함께 발전해 나갔으면 하는 마음입니다.\n\n [doortts](http://blog.doortts.com) | 2009-05-26 화요일 오전 9:28\n\n--\n\n완전 잼 있겠는데요 ;;ㅋㅋ 담에 또 이런 프로젝트 뜨면 ~~ 좀 불러줘요 ..ㅋㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-05-27 수요일 오전 9:18\n\n--\n\n재밌기는~. 힘들다.-_-;;\n\n그나저나 부르면 올수는 있는거여?\n그런거면 부를걸... \n\n아쉽네.\n\n [doortts](http://blog.doortts.com) | 2009-05-27 수요일 오전 10:2\n\n--\n\n부르면 달려가죱;; ~~ \n프리인생 머 있겠어요 ~~ ㅋ\n담에 기회되면;;ㅋㅋ 불러줘요 ~ㅋㅋ 아싸~\nㅋ\n\n [성윤](http://helols.pe.kr) | 2009-05-28 목요일 오후 4:20\n\n--\n\nhttp://www.jazzlab.net/jazz/4231\n여기에 글 살짝 남겼습니다. ^^\n\n [아름프로](http://jazz.pe.kr) | 2009-05-27 수요일 오전 10:29\n\n--\n"
  },
  {
    "id": 98,
    "title": "대한민국 민주주의에 대한 근조",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1243438101000,
    "body": "> doortts | 2009-05-28 목요일 오전 12:28 | 이생각 저생각 | [원본](http://blog.doortts.com/98)\n\n퇴근후 덕수궁에 갔다.\n그냥... 복잡한 마음과 함께 여차하면 눈물이 당장이라도 나올것 같았다. 겨우, 그리고 간신히 참았다.\n\n부끄럽고.화나고.싫고.또.싫고... 답답했다.\n\n그저 한없이 착잡할 뿐이다."
  },
  {
    "id": 99,
    "title": "CI 서버(Hudson)를 사용할 경우 SCM에 대한 Commit Comment의 의미",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1243473730000,
    "body": "> doortts | 2009-05-28 목요일 오전 10:22 | Better SW Development | [원본](http://blog.doortts.com/99)\n\n보통 개발자들에게 가급적이면 자주 커밋(commit 혹은 check-in)을 할 것을 권장한다. 적어도 메소드 하나 정도가 완료되면, 그리고 컴파일 에러가 발생하지 않으면 작업한 내용을 소스 저장소(Source Repository)로 보내야 한다.\n\n흔히 보이는 잘못된 Commit 의 케이스를 뽑아보면 이렇다.\n\n- Comment 없는 commit\n  . 특히 CI 서버와 연동되어 있을 경우, 해당 빌드에 참가한 소스가 뭘 하는건지 쉽게 알수 없게 된다.\n- 컴파일 에러가 있는 소스의 커밋\n  . 빌드를 깨뜨리게 된다.\n- 지나치게 짧은 간격의 commit\n  . 빌드서버에 부하를 준다.\n  . 변경 comment 를 달기 어렵게 된다.\n\n해결책\n- Comment 없는 commit\n\n\n#### Comments\n\n제가 요즘 일이 한가해서 매일 서핑만 하네요 ㅎㅎ\n프로젝트가 시작되어 본격적으로 개발되기 시작한 후에는 변경이 어렵겠지만\n위와 같은 svn의 단점을 보완한 Bazaar나 Git같은 분산형 scm도 괜찮을 것 같습니다.\n\n저도 사용해 보지는 않고 벌써 알고 계실 내용을 괜히 ㅋ.\n\n 홍성호 | 2009-06-03 수요일 오후 6:37\n\n--\n\n안녕하세요? SVN의 단점을 보완한 분산형 SCM이 요즘 슬슬 떠오르는 것 같습니다.\n\nGIT, Bazaar는 이름만 들어봤습니다. 다만 IBM Team Concert에 포함된 분산형 SCM과 비슷하지 않을까 추측정도만 해보는 수준입니다만, 저장소를 개개인이 갖고 있고, 일정 순간에 서로 동기화 하는 모양이라면, 한 장소에서 프로젝트가 진행되는 현재까지는 SVN이 을 좀더 잘 효율적으로 사용할 수 있도록 유도하는데에 노력을 기울이고 싶습니다.\n\nSI현장에선 아직까지도 CVS를 쓰는 곳이 많고, SVN 을 최신 제품처럼 느껴하는 분들이 적지 않은 상황이라, SCM 자체 보다는 Branch /Tag 전략과 문제상황시의 적절한 대응에 대한 가이드가 좀 더 필요하다 생각합니다.\n\n혹 블로그가 있으시면 알려주세요~ :)\n\n [doortts](http://blog.doortts.com) | 2009-06-04 목요일 오전 12:11\n\n--\n\nㅎㅎ 아직 개을러서 운영중인 블로그는 없습니다.\n나중에 블로그를 개설하면 먼저 알려드릴테니 꼭 놀러와 주세요.\n\n 홍성호 | 2009-06-08 월요일 오전 9:10\n\n--\n"
  },
  {
    "id": 100,
    "title": "때로는 엑셀보다 모눈종이, Low-Tech High-Touch",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1245331267000,
    "body": "> doortts | 2009-06-18 목요일 오후 10:21 | 이생각 저생각 | [원본](http://blog.doortts.com/100)\n\n최근 프로젝트는 SI의 애자일 프로젝트였습니다. ([애자일 인 여의도](http://blog.doortts.com/entry/%EC%95%A0%EC%9E%90%EC%9D%BC-JAM-Project-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%98%A4%ED%94%88-%EC%A4%91))\n\n아직 프로젝트는 진행형 입니다만, 현재 저는 Observer (혹은 eye of beholder) 위치로 물러났습니다.\n\n애자일 프로젝트가 다 그러하듯이 대시보드를 사용했고, 포스트잇과 A4지를 사용했습니다. 그리고 펜과 스카치테이프와 가위 등등을 많이 사용했습니다.\n\n[](./attachments/)[포스트 잇, 테이프, 유성네임펜, 커터 등등]\n\n[](./attachments/)[색상별로 포스트잇을 만들어서 업무를 전달하였습니다]\n\n[](./attachments/)[엑셀이나 시스템에 등록하는 것이 아니라, 벽면에 붙였습니다]\n\n[](./attachments/)[보고 만지고 잡아서 옮깁니다]\n\n[](./attachments/)[업무항목을 인쇄해서 벽면에 오려 붙였습니다. 이 위에 포스트잇이 붙게 되죠]\n\n[](./attachments/)[때로는 흘겨쓴 사람의 글씨가 컴퓨터안의 정형화된 폰트보다 더 멋지게 보일 수도 있습니다]\n\n[](./attachments/)[일반적인 모습이라면, 메일로 업무를 받는다던가 오피스 문서로 받던가 하겠지만, 우리의 업무들은 A4종이를 접어만든 개인 우편함(?)에 들어 있습니다. 다음 업무를 진행하기 위해 작업꺼리를 꺼내 내용을 확인하고 옆 벽면으로 옮길 때면, 이미 한참 전에 어른이 되어버린 우리들에게도, 마치 어린시절 아날로그 라디오의 주파수를 맞추던 것과 같은 묘한 긴장과 따뜻한 느낌을 동시에 전해 줍니다.]\n\n[](./attachments/)[삐뚤빼뚤... 그래도 직접 손으로 쓸때의 느낌은 엑셀에 배경색을 넣는것과는 또 다르죠]\n\n[](./attachments/)[진척도는 점을 찍어서 펜으로 긋습니다. 혹시 긋다가 틀리면 뭐, 그냥 찍찍 긋고요.]\n\n[](./attachments/)[우리가 하고 있는 형형색색의 일들]\n\n[](./attachments/)[벽에 붙은 대시보드의 모습은 무형의 SW를 유형의 무언가와 연결시켜 주는 예술그림 같다는 생각도 듭니다]\n\n멋드러진 그래프와 딱딱 각이 맞추어져 있는 일정관리 프로그램도 좋지만,\n\n때로는,\n\n만지고 느끼고 움직일 수 있는,\n그래서 사람과 사람이 좀 더 쉽게 교류할 수 있게 도와주는 이런 Low-Tech High-Touch 방식이\n우리를 조금 더 미소짓게 만들어 주기도 합니다.\n\n그리고, 그게 바로 Agile SW개발 방식의 장점 중 하나가 아닌가 싶습니다.\n\n#### Comments\n\n재미있어요... 애자일 플젝 경험기도 재밌게 읽었네요 ㅎㅎ\n힘들더라도 즐겁게 일할 수만 있다면...\n\n 김은혜 | 2009-06-19 금요일 오후 8:7\n\n--\n\n재미있게 일하는 거. 어쩌면 생각만큼 불가능하지 않은 일이라고 생각한다구. 문제는 의지... 인게 아닐까? 유머를 잃지 않고, 용기를 내어 타협을 한 번 한 번 거절할때마다 조금 더 가까워 지리라 믿는다구.\n\n뭐.. \n\n그래도 안되면, 그땐 할수 없지만 말야~ ㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2009-06-20 토요일 오전 12:43\n\n--\n\n동감! 의지, 끈기, 유머, 믿음...\n\nhttp://blog.naver.com/farn501\n혹시 시간되실 때, 여기 한번 들어가보세요. 보안파트에 처음 들어간 코 흘리개 시절부터 그만둘 때까지 거의 오년간 제가 못살게 굴었던 STG 보안 엔지니어분 블로그인데요 (지금은 팀장님이 되셨다는..). 약간 선배님과 비슷한 면들을 갖고 계신 듯. 흥미로운 내용들이 많답니다.\n\nP.S) 글 제목 보고 떠오른건데.. 어느날, 홈피에 일기 쓰다가 정사각형 원고지에 글이 써보고 싶어졌다는.. 이제는 좀 오래된 기억 속, 정사각형 원고지.\n\n 김은혜 | 2009-06-22 월요일 오전 12:18\n\n--\n\n이분이구만! 저번에 말했던 사람이!\n\n [doortts](http://blog.doortts.com) | 2009-06-22 월요일 오후 11:26\n\n--\n\n완전 아기자기 해보여요 !! ㅋㅋ \n전 골방에서 ... 패인코딩 놀이중인데;; \n\n산뜻한 환경을 보니;; 코딩할 욕구가 확 떨어지는데요 ;;ㅋㅋ \n잼있겠어요 ;;; 애자일프로젝!!\n\n [성윤](http://helols.tistory.com) | 2009-06-22 월요일 오전 12:42\n\n--\n\n성윤! 우리 슬슬 닭한번 꽉! 물때가 되었지 싶은데 말야~ 주중에 날 함 잡자구!\n\n [doortts](http://blog.doortts.com) | 2009-06-22 월요일 오후 11:21\n\n--\n\n왠지 놀이방 창업을 꿈꾸고 있는 사람이라는 느낌은 내가 덕후여서 이겠지...\n\n [M-o-N](http://nephilim.tistory.com) | 2009-06-28 일요일 오후 7:48\n\n--\n\n응. 자아 정체성을 찾아가는 당신의 근래가 아름답소!\n\n [doortts](http://blog.doortts.com) | 2009-06-30 화요일 오전 10:25\n\n--\n\n아~ 아름답습니다.\n조금 섹시하기도... *^^*\n\n [박성철](http://me2day.net/geekinside) | 2009-06-29 월요일 오후 5:5\n\n--\n\n성철님!! 이러시면 안되어요! ㅎㅎㅎ\n\n그나저나 언제 또 함 뵈어야죠? 네?\n\n [doortts](http://blog.doortts.com) | 2009-06-30 화요일 오전 10:26\n\n--\n\n저야 언제나 환영이죠. ^^\n벙개 함 때려주세요.\n\n [박성철](http://me2day.net/geekinside) | 2009-07-01 수요일 오전 10:18\n\n--\n",
    "attachments": [
      {
        "id": 21700,
        "name": "IMG_6924.JPG",
        "hash": "91ae5ccff5e75847dde7e5ec07ff981f32384a53",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 90874,
        "containerId": "12273"
      },
      {
        "id": 21701,
        "name": "IMG_6963.JPG",
        "hash": "995c849626d51ae72f6152fe2e146711223ef00f",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 122591,
        "containerId": "12273"
      },
      {
        "id": 21702,
        "name": "IMG_6976.JPG",
        "hash": "b55e12213dacdc21ee3e171d044c1a36c3a577e6",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 112010,
        "containerId": "12273"
      },
      {
        "id": 21703,
        "name": "IMG_6973.JPG",
        "hash": "3a37889b7a7b3fd71bc220c173785149220b00b4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 115506,
        "containerId": "12273"
      },
      {
        "id": 21704,
        "name": "IMG_6923.JPG",
        "hash": "65d38605957c80c70ef8ec4209664dc8b2afb140",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 114009,
        "containerId": "12273"
      },
      {
        "id": 21705,
        "name": "IMG_6891.JPG",
        "hash": "ffb6ec14842e24bfca7e8b06076e5c9f00708565",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 113517,
        "containerId": "12273"
      },
      {
        "id": 21706,
        "name": "IMG_6949.JPG",
        "hash": "29ee162043018655ad3cd970dc18a8c176adc321",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 91596,
        "containerId": "12273"
      },
      {
        "id": 21707,
        "name": "IMG_6915.JPG",
        "hash": "b128c312150bb7700f7d8a2a75da7f7e23ded8e4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 77230,
        "containerId": "12273"
      },
      {
        "id": 21708,
        "name": "wallp.jpg",
        "hash": "7d4086f514d56944917ff57c5f76ec61596f3099",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 32144,
        "containerId": "12273"
      },
      {
        "id": 21709,
        "name": "IMG_6932.JPG",
        "hash": "165b94a55953248a76a06c8d7b043aac3c70b36e",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 104271,
        "containerId": "12273"
      },
      {
        "id": 21710,
        "name": "IMG_6893.JPG",
        "hash": "0b6135688bfbe35f259b005d8e4fd261c4f3da64",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 98959,
        "containerId": "12273"
      },
      {
        "id": 21711,
        "name": "IMG_6950.JPG",
        "hash": "07a4274ac2e9abf9b5b219b548f678580873c0fd",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 115769,
        "containerId": "12273"
      }
    ]
  },
  {
    "id": 101,
    "title": "어떤 소프트웨어 개발자의 꿈에 대한 가격 (The price of a certain software developer's dream)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1245683428000,
    "body": "> doortts | 2009-06-23 화요일 오전 12:10 | 이생각 저생각 | [원본](http://blog.doortts.com/101)\n\n나는 비록 Software를 개발하는게 본업은 아니지만, Software를 개발하는 (적어도 그렇다고 믿는) 회사에서 일하고 있다.보통의 경우 회사 동료들이 만든 software를 특정 고객들이 구매한다. 물론 대부분 특정 고객에게 특화된(Customized for customer) 형태의 유니크한 제품들이다.\n\nSoftware 를 판매하는 회사에 근무하고 있지만, 사실 개인적으로 Software를 구매하는 비율은 매우 낮다. (이상하게 들릴수도 있는데, 현재의 나는 아르바이트를 해서 먹고 살던 대학생 시절보다 훨~씬~ 더 Software에 대한 지출이 적다)\n\n그러다 최근에 다시 용기(?)를 내어서 구매하고 있는 Software 가 있는데, 올 3월부터 PayPal 로 구독(subscription)하고 있는 [JUnit Max](http://www.junitmax.com/junitmax/subscribe.html \"[http://www.junitmax.com/junitmax/subscribe.html]로 이동합니다.\") 라는 제품이다.\n\n\n\n이 제품은, SUnit의 아버지이며, 에리히 감마(Erich Gamma)와 함께 JUnit 을 만든 켄트벡(Kent Beck)이 만들고 있는 제품으로, TDD를 통해 프로그램을 만들때, Test Case를 수행하는 시간 간격을 극소화 시켜서 말 그대로 Extreme 하게 단위 테스트 케이스를 수행할 수 있게 도와준다. (이클립스 플러그인 형태로 동작한다)\n\n현재 만드는 과정중 임에도 매달 일정액의 돈을 내고 사용하는 방식으로, Paid Beta User 라고 생각하면 될 듯 싶다.\n\n뭐, 그렇다고 해도 중간에 돈을 안내면 더이상 사용못한다던가 하는 방식은 아니다. 그리고, 돈을 최대한 받아내기 위한 흔한 편법 같은것도 없다. (정상적이진 않지만, 알음알음 무료로도 쓸수 있다. 그리고 JUnit 최신버전에 JUnitMax Core 가 탑재되어 있다고 하던데 어떤식인지는 확인해 보진 않았다.)\n\n그럼에도 내가 이 제품을 꾸준히 구입하는 데에는 몇 가지 이유가 있는데\n\n 1\\. 제품 가격이 적절하다.\n\n- 월 2$인데, 오른 환율을 감안하더라도 3천원정도이다. (주1)\n\n2\\. 이미 나는 그(=kent)에게 많은 빚을 지고 있다.\n\n - 그의 글과 여러가지 기여(contribution)으로 인해 개인적으로도 많은 발전을 이룰수 있었다.\n\n3\\. 그의 소망이 내 소망과도 일치한다.\n\n - 사실, 이 이유가 가장 큰 이유이다. \n\n[JUnitMax Origin](http://www.threeriversinstitute.org/blog/?p=76 \"[http://www.threeriversinstitute.org/blog/?p=76]로 이동합니다.\") 이라는 그의 블로그 글을 보면 몇 가지 재미있는 이야기가 나온다.\n\n\"JUnit의 첫번째 버전을 에리히와 함께 작성한 이후로 난 줄곧 JUnit을 상용화할 방법이 생기길 원했었다. 엄청난 부자가 될 필요까진 없었지만, 대학 학비도 내고, 집 저당금도 내고, 연금도 마련해 놓았으면 했다\"\n\n\n그의 파트너였던 (Extreme Progrmming Explained의 저자중 한명 이기도 한) Cynthia Andres 의 충고로 그는 $0 x ∞ 사용자 와 $∞ x 0 사용자 사이에서 전자를 선택하게 된다. 결국 JUnit 은 근래에 가장 성공한 Software 중 하나가 된다. 하지만, 사실 소프트웨어의 성공에 비해  그가 직접적으로 얻은 혜택은 거의 없다.\n\n6~7년전 어느 컨퍼런스에 JUnit 기여에 대한 추상적인 가치에 대해 자신의 커뮤니티에게 이야기 하고 있을 때 Michael Cusumano (MIT 교수)가 와서는 \"그게 대학 학비를 대주진 않죠!\" 라고 말했을때 가슴이 살짝 시렸던것 같다.\n\n게다가 Kent 의 고백에 따르면 어느날인가 다시 프로그래밍일을 하게 되었는데, 그게 너무 좋았더라고 한다. 점점 강연이나 글쓰기,컨설팅 같은 일이 늘어서는 프로그래밍을 멀리하게 되었는데, 자신이 사랑하는게 무언지 다시 알게 되었다고 한다.\n\nI needed to be a programmer.\n\n\n그는, 다시 프로그래머가 되어야 겠다고 생각하게 되었단다.\n\n하루는 [DabbleDB](http://dabbledb.com/ \"[http://dabbledb.com/]로 이동합니다.\") (주2) 를 만드는 Avi Bryant 를 런던의 컨퍼런스에서 만나게 되는데 그에게서 이런 말을 듣게 된다.\n\n“The more I program, the more money I make. When I add features, I make more sales.”\n전 프로그래밍을 하면 할수록 돈을 더 벌어요. 제가 기능을 추가하잖아요? 그럼, 판매는 더 늘어나죠.\n\n프로그래밍이 돈으로 전환된다는 이야기는 그에게 꿈같은 이야기 처럼 들렸다고 한다. (순진하지 않나요? :)\n\n그리고 Sonatype(주3)의 CEO인 Mark de Visser 의 \"생존가능한 비즈니스용 소프트웨어를 만들수 있다\"는 응원이 마침 JUnitMax를 만드는 그에게 큰 응원이 된다.\n\n그는 이렇게 이야기를 마무리 한다.\n\nJUnit Max is my attempt to make a living programming a betterenvironment for programmers who test, but trying to avoid the lure ofdoing it for attention.\n\nJUnit Max는 테스트를 수행 하지만, 곧잘 빼먹으려하는 프로그래머들에게 더 나은 환경을 제공하기 위한 내 자신의 생계형 프로그래밍에 대한 시도입니다.\n\n상업적으로 생존가능한 소프트웨어이면서, 동시에 다른 사람들에게 기여할 수 있는 Software를 만든다는 건 프로그래밍을 업으로 삼는 사람들에게, 그리고 무언가를 창조하는 '프로그래밍을 사랑하는 사람들'에겐 꿈이지 않을까?\n\n[![](http://farm1.static.flickr.com/93/234749795_f11fb1d45b.jpg?v=0)](http://www.flickr.com/photos/fcphoto/234749795/ \"[http://www.flickr.com/photos/fcphoto/234749795/]로 이동합니다.\")\n\n그의 꿈도 이루어졌으면 좋겠다.\n그리고 그와 같은 내 꿈도 그러하게 되었으면 좋겠다.\n\n자신이 만든 Software가 점심에 흔히 먹고 소비되어 버리는 스타벅스 한 잔 보다 더 높은 가치로 기꺼이 인정받는 날이 오길 바라며, 오늘도 대륙건너 멀리서 나는 그와 나를 함께 응원하고 있다.\n\n----------\n주1. 최근 가격이 월 10$정도로 올랐다. -_-;\n\n주2. DabbleDB는 엑셀과 DB가 결합된 형태로 사용자들이 많이 사용하는 업무형태를 분석해서 conventional 기능제공 위주로 운영되는 웹서비스이다. 한달에 유저당 8$라는 저렴한 비용으로 서비스되며 Salesforce.com 같은 규모는 아니더라도, 소규모 단체나 업체에서 사용하기에는 무리가 없어 보인다. DabbleDB는 무료로도 사용할 수 있는데, 대신 사용자 데이터들이 public open 되는 제약이 있다.\n\n주3. Maven Company 인 [Sonatype](http://www.sonatype.com/ \"[http://www.sonatype.com/]로 이동합니다.\")은 open source 인 Maven 의 저작자들이 세운 회사다. 그들이 회사를 차렸을때 일부 비난하던 사람들도 있었지만, 그들이 메이븐을 만들고 또 상업적인 회사를 만들게 된것도 Kent와 마찬가지로 Love Programming 때문이라고 생각한다. Maven 이 업계에 기여한 바는 상당히 크며, 특히 그들이 무료로 공개한 온라인 북 [Maven: The Definitive Guide](http://sonatype.com/products/maven/documentation/book-defguide \"[http://sonatype.com/products/maven/documentation/book-defguide]로 이동합니다.\")은 Maven 을 학습하는데 있어 최고의 책으로 평가받는다. 현재 메이븐(Maven) 전파활동과 교육(Training), 리파지터리 매니저인 Nexus 판매 등을 주 사업으로 회사가 운영되고 있다.\n\n#### Comments\n\n가격 올랐다고 해서 깜짝 놀랐는데 이번 달도 $2만 빠져나갔더라고요. ^^\n얼마 전 트위터에 junit 커스터마이제이션 필요한 회사 없냐고 물어보는 글 올린 것 보고 맘이 짠 했는데 정말 돈 좀 버셨으면 좋겠어요.\n어제 잠이 잘 안 와 이런 저런 생각하다 미투에 올린 글( http://me2day.net/geekinside/2009/07/01#00:45:34 )이 생각나네요.\npaypal에서 $2 빠져나갔다는 SMS 메세지가 올 때마다 고마운 마음을 가져봅니다.\n\n [박성철](http://me2day.net/geekinside) | 2009-07-01 수요일 오전 10:17\n\n--\n\n기존 구독자는 당분간은 계속 유지되는것 같습니다. 기뻐해야 하는... 거겠죠? -,-;\n\n [doortts](http://blog.doortts.com) | 2009-07-02 목요일 오후 9:32\n\n--\n\n전, 글 중에서 이 부분이 가장 마음에 와 닿네요.\n\n\"자신이 사랑하는게 무언지 다시 알게 되었다고 한다.\n그는, 다시 프로그래머가 되어야 겠다고 생각하게 되었단다.\"\n\n 김은혜 | 2009-07-01 수요일 오후 6:55\n\n--\n\n형님! 담주 중에 변개 예정!\n\n다들 형님을 보고 파 하는듯;; ? ㅋㅋ \n전화 드릴께요 ~ㅋ\n\n [성윤](http://helols.tistory.com) | 2009-07-04 토요일 오전 12:25\n\n--\n\n다들 얼굴본지 오래라 나도 궁금하다우. 날 잡아서 불러주시길!\n\n [doortts](http://blog.doortts.com) | 2009-07-04 토요일 오후 11:16\n\n--\n\n저 실례입니다만, '변개'는 상당히 묘한 느낌이군요...ㅎ\n(이 너굴- 도대체 음지에서 뭘하고 다니는거야!)\n\n [M-o-N](http://nephilim.tistory.com) | 2009-07-06 월요일 오전 8:36\n\n--\n\nJUnit Max is no longer being actively developed or sold. 이게 걸려있네요\n벌써 꿈이 무너지는걸까요?\n\n 선데이모닝 | 2009-07-18 토요일 오전 4:43\n\n--\n\n저도 봤습니다. :(\n\n [doortts](http://blog.doortts.com) | 2009-07-20 월요일 오후 10:35\n\n--\n"
  },
  {
    "id": 102,
    "title": "IBM 개발자들의 수다 참여 후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1246716732000,
    "body": "> doortts | 2009-07-04 토요일 오후 10:56 | 이생각 저생각 | [원본](http://blog.doortts.com/102)\n\n지난 6월27일 IBM에서 주최한 \"[개발자들의 수다](http://www.ibm.com/developerworks/kr/event/seminar/dwlive_0905/final.html \"[http://www.ibm.com/developerworks/kr/event/seminar/dwlive_0905/final.html]로 이동합니다.\")\"에 참여하였더랬습니다.\n\n[동료](http://nephilim.tistory.com/)를 꼬셔서 발표에도 참석했습니다. (제목: [이상한 나라의 개발자](http://blog.doortts.com/attachment/cfile25.uf.1337F91E4A4F61196E8B20.pdf \"[http://blog.doortts.com/attachment/cfile25.uf.1337F91E4A4F61196E8B20.pdf]로 이동합니다.\"))\n\n\n\n발표형식이 단순 세미나식이 아니라,\n무려 '페차쿠차(주1)'형식으로 표방하고 있기에 왠지 더 의욕이 불타더군요. (활활)\n\n거기다가 둘이서 함께 진행하는 식으로 자체적으로 난이도도 높여 보았습니다. (우리팀만 둘이서 발표)\n\n사실 막상 지르고 보니, 준비가 쉽지 않았습니다.\n\n혼자 하는것이 아니기 때문에 함께 모여셔 준비해야 하는데,\n서로 멀리 떨어져 생활하는데다, 각자 바쁜일정과, 준비하기에 짧은 시간 등등\n실패로 이끌만한 요인이 많았죠.\n\n그럼에도 무사히 마친 건\n스크립트까지 손수 작성해서 사고(...)를 막아준 동료덕이 큽니다. (6:4를 요구하더군요. ... 응?)\n\n[](./attachments/)\n\n때때로 무념무상에 지르고 보는 저입니다만,\n그래도 아이디어 좋고, 매사 재밌게 받아주는 동료 덕분에\n재밌고도 즐겁게 끝났습니다.\n\n발표 후에는 테이블을 만들어서 발표한 사람들과 함께 토론하는 시간을 가졌습니다.\n(테이블 만들어 놓고 발표자들이 사람을 모아야 하는 상황이...-,-... )\n\n다행히 저희는 발표자가 우선 둘이라서, 사람들이 조금만 있어도 일정수준 이상의 규모가 되버리더군요. (하하)\n\n[](./attachments/)\n\n[](./attachments/)\n\n토론의 주제는 '팀의 변화를 어떻게 만들어 낼 것인가?' 였습니다.\n\n저한테 먼저 물어보셨는데, 전 슬쩍 질문을 다시 돌렸습니다.\n사실 답이 필요한 질문이라기 보다는 서로의 경험과 생각을 나누고, 거기서 '공감(共感)'을 이끌어 내야 하는 질문이라 생각했습니다.\n\n토의 내용을 간략히 정리해 보면 이렇습니다.\n\n- 창의성뿐 아니라 프로세스도 필요하다.\n- 재미로 새로운 시도를 하는건 과연 좋은 모습인가?\n- 회사가 사람에 대해 투자를 할 수 있는 회사인가도 중요하다.\n- 해당 변화에 대한 성공사례가 있어야 한다.\n- 때로는, 기존 상황의 문제점을 먼저 보여주어야 움직이게 하기가 쉽다.\n- 팀 동료들에게 새로운 시도를 유도할 경우에는 최소한 쉽게 접근할 수 있도록 도와주자.\n- '그럼 니가 해봐!' 이런식의 역할 떠넘기기는 창의적인 시도를 개인의 추가 업무로 만들어 위축시킨다.\n- 서로에 대한 이해가 필요하다.\n- 문제는 터트리자. 단, 해결책까지 함께 제안하자.\n\n나름의 토의 결론\n\nWant to do : 더 나은 방향으로 팀의 변화를 만들어 내기\nWhat to do : 더 많이 더 자주, 건전한 커뮤니케이션을 만들것.\nHow to do : 용기와 이해. 그리고 서로에 대한 인정\n\n5시 반쯤 끝나고, 뒷풀이를 했는데, 저는 개인적인 사정으로 안주만 축내고 나왔습니다.\n\n다시 다른 곳에서 또 뵐 날이 있기를 고대합니다.\n\n아! 그리고, 어리고도 참신하면서도 멋지고 재밌는 친구들이 많더군요. :)\n\n아!! [Kenu](http://okjsp.tistory.com/) 님은 몸이 너무 좋아지셨더군요. 직업을 바꾸신줄 알겠어요. (떼인돈 받아 드리...)\nKenny(강윤신)님은 역시 시원시원한 언변! (여친님도 살짝 비슷한 느낌이)\n\n그리고 우연히 Home Site를 알게 된 모임에 뵌 몇몇 분들\n\n범석님 : http://www.strongberry.net/\n준기님 : http://daybreaker.info/\n야간 개발팀 흥섭님: http://heungsub.net/\n\n주1) **Pecha Kucha** (ペチャクチャ) : 일본에서 유래된 프레젠테이션 형식으로 20개의 장표를 장당 20초씩 발표해서 정확히 6분40초에 마치는 방식. 장표당 할당되는 시간이 짧기 때문에 한 장 한 장이 명료해야 하고, 20개의 장표가 빠르게 흘러가기 때문에 전체적인 흐름과 일관성이 유지되지 않으면 발표자의 목표 전달이 제대로 되지 않는다. 연습과 창의력이 필요한 형태로, 페차쿠차 방식을 사용하면 일종의 경연대회 내지는 축제처럼 이루어지는 경향이 있다.\n\n#### Comments\n\n생각해보니 6:4를 요구한 건 당신이잖아! 결정적으로 6이 당신이고 4가 나였다고!\n이 이중성으로 치자면 아수라 백작 못지않는 너굴 백작! \n옆에서 내 동료들이 당신의 채찍에 죽어갔다고! (순간 노예가 됨)\n\n [M-o-N](http://nephilim.tistory.com) | 2009-07-06 월요일 오전 8:35\n\n--\n\n하하하~~~ (으..응?)\n\n [doortts](http://blog.doortts.com) | 2009-07-06 월요일 오후 10:5\n\n--\n\n며칠전 M-o-N님 블로그에서 읽었었는데 올리셨군요. ^^\n발표 내용이 참 재미있었는데 토론 내용에서는 약간 쌉싸름한 맛도 나네요.\n현실에서 쓴 맛을 본 사람이 저 뿐은 아닌 듯... ㅎㅎ\n\n [박성철](http://me2day.net/geekinside) | 2009-07-06 월요일 오후 2:47\n\n--\n\n저희 조가 제일 씁쓸하지 않았나 싶습니다. (연애이야기 한 조도 있었다는데... 게다가 우리조는 연령대도... OTL)\n\n [doortts](http://blog.doortts.com) | 2009-07-06 월요일 오후 10:6\n\n--\n\n후기에 트랙백을 걸려고 보니... 저는 후기를 작성하지 않았더군요... \n메일만 보내고, 그 메일을 후기라고 착각하고 있었나봐요 -_-;;;\n후기를 보니, 요런 시간이 만하졌으면 하는 생각이 다시 듭니다.\n:)\n\n [조영운](http://dont.pe.kr/tt) | 2009-07-08 수요일 오후 9:49\n\n--\n",
    "attachments": [
      {
        "id": 21712,
        "name": "p10[2].jpg",
        "hash": "a74a753e4bfa53aa220dcf2b288cec58de6cf4bd",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 51448,
        "containerId": "12275"
      },
      {
        "id": 21713,
        "name": "IMGP7380_resize.JPG",
        "hash": "83774531680f5626d6b2dd00ba363792bbbeed9a",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 343304,
        "containerId": "12275"
      },
      {
        "id": 21714,
        "name": "이상한나라의개발자_채수원_이동욱.pdf",
        "hash": "c091e5ff23c37a93b319d009ef41229dd8197add",
        "containerType": "BOARD_POST",
        "mimeType": "application/pdf",
        "size": 375129,
        "containerId": "12275"
      },
      {
        "id": 21715,
        "name": "IMGP7379_resize.JPG",
        "hash": "aa56d5ff00fbb40f49822c99e773d51e5ca16002",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 361976,
        "containerId": "12275"
      }
    ]
  },
  {
    "id": 103,
    "title": "지식에 대한 갈망의 반대편 (A hunger for Knowledge, side B)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1248096780000,
    "body": "> doortts | 2009-07-20 월요일 오후 10:33 | 이생각 저생각 | [원본](http://blog.doortts.com/103)\n\n인간이 가진 근본적인 욕구중 하나는 미지(謎知)에 대한 탐구심 이라고 어느 사회학자가 말했다. 수 많은 학자들과 이론, 그리고 시간을 건너온 다양한 책이 현재(現在)의 한 부분을 이루고 있는 것도 그런 이유에 의해서라고 생각한다.\n\n**지식에 대한 욕망은 지극히 순수한 욕망이다.**\n\n하지만, '욕망'이라는 말이 내포하고 있는 치명성처럼, 때로는 욕망이 만족을 넘어 탐욕으로 변해가는 경우가 있다. 상당수의 소설에서 묘사되는 드라큘라의 피에 대한 집착은 사실 '순수한 욕망(Pure Hunger)'에 가깝다. 생존을 위해 필요한 분량, 그 이상은 탐욕이란 걸 스스로 충분히 자각하고는 있지만 멈출 수 없는 나선궤도에 이미 탑승했기 때문에 결국 재(ash)가 된다. \n\n지식이 지혜에 이르지 못하면 '중독'되버리는 것과 유사하다.\n\n[##_1C|cfile2.uf.110EFB504FFCC4CF14AAE1.jpg|width=\"530\" height=\"530\" filename=\"iwantmore.jpg\" filemime=\"image/jpeg\"|_##]\n\n**[\"I want more, than YOU!\"]**\n\n\n\" 왜 지식을 갈망하는가? \"\n\n\" 얻은 지식으로 무엇을 할 것인가? \"\n\n가끔은 한 번씩 스스로 질문해 보곤 한다.\n\n더 나은 내가 되어, 더 나은 세상을 만들고 싶다고 입으로는 말하지만,\n그저 지식에 대한 갈증(Hunger)을 채우고 싶어 단순히 매달리는 것일 뿐인게 아닌가... 하는 생각에\n\n때로는 혼란스러울 때가 있다.\n\n\n\n  \n\n당신은, 더 많이 배워서 무엇을 이루고 싶은가?\n\n혹시, 소유의 일종, 비교우위 가치의 한가지 척도로 쓰고 있지는 않은가?\n\n\n\n[![zrclip_001n4198353b.png](/files/21717)})](http://www.flickr.com/photos/katieelizabethphotography/2847379970/)\n\n  \n\n'지식을 갈망하다(longing for knowledge)'라는 말은 때때로는 마치 \"기회를 틈타 스승을 해치고 비전서를 빼앗아 도망가는 비극미의 전형적인 악당\"을 연상시키는 말.. 같다는 생각이 들곤 한다.\n\n \n\n#### Comments\n\n저는 좀 더 쓸모있는 사람이 되서 제 미래의 자식들 산입에 거미줄 치지 않게 하고 싶어요.\n\n [기선](http://whiteship.me) | 2009-07-20 월요일 오후 11:37\n\n--\n\n노력에 비해서는 소박한데~ \n나름 현실적이면서도 쿨하군! :)\n\n [doortts](http://blog.doortts.com) | 2009-07-21 화요일 오후 8:39\n\n--\n\n좋은 글입니다. 요즘 안그래도 머리가 복잡했는데 마치 먼가를 꽤뚫는듯한 말이네요..성윤이가 번개를 주선한다고 하던데 소식이 없네요. 번개때 뵙겠습니다.\n\n 김재진 | 2009-07-21 화요일 오전 8:38\n\n--\n\n그러게 ... 수원이 형이... 고기집 알아보고 바로 연락준다고 했는데;;; 아직까지 고기집 물색중이신가봐 ~~ ㅋ\n형 맞나요 ?\n\n [성윤](http://helols.tistory.com) | 2009-07-21 화요일 오후 6:21\n\n--\n\n전 지식으로 세계정복의 꿈을 !! (남의 블로그와서 깽판친기분은 멀까요;;;; ㄷㄷㄷ)\n\n [성윤](http://helols.tistory.com) | 2009-07-21 화요일 오후 6:22\n\n--\n\n집안에 일이 좀 있었는데, 진정하는 중이야. 금주 목요일쯤 잡아볼까 하는데, 어때?\n\n [doortts](http://blog.doortts.com) | 2009-07-21 화요일 오후 8:39\n\n--\n\n좋아요 ;; 쿄쿄쿄;; ㅋ\n\n [성윤](http://helols.tistory.com) | 2009-07-22 수요일 오전 10:12\n\n--\n",
    "attachments": [
      {
        "id": 21716,
        "name": "iwantmore.jpg",
        "hash": "40d1b04df61e40ba5f7074f7a35d45b8a7b6c6a3",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 115253,
        "containerId": "12276"
      },
      {
        "id": 21717,
        "name": "zrclip_001n4198353b.png",
        "hash": "72dd61927e0698887136e8e1f67fd4f84b288885",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 409488,
        "containerId": "12276"
      }
    ]
  },
  {
    "id": 104,
    "title": "보는 것 만으로도 공부가 되는 회사, 인픽스(INPIX)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1248477300000,
    "body": "> doortts | 2009-07-25 토요일 오전 2:16 | 이생각 저생각 | [원본](http://blog.doortts.com/104)\n\n단순히 '웹사이트 에이전시' 라고 치부해 버리기에는 놀라운 회사가 있다. 그들의 모습을 보고 있자면, 아티스트 이면서, 동시에 기술자라는 생각이 든다. 인픽스(inpix.com) 사이트를 방문하면 우선 첫 화면부터 눈길을 끈다.\n\n[##_1C|cfile24.uf.191DB2284A69EAAE520AFA.png|width=\"496\" height=\"414\" alt=\"\" filename=\"inpix01.png\" filemime=\"image/jpeg\"|_##]\n사이트 자체가 마우스 클릭과 휠(Wheel)로 동작하는데 처음엔 좀 어색하지만, 통일된 인터페이스에 적용된 다음에는 별 불편함이 없다.\n\n전등을 끄는 것 처럼 오른편에 있는 줄을 잡아당기는 것도 가능하다. (Reset기능)\n\n그런데, \"뭐, 웹 디자인 회사가 저정도야 뭐..\" 할 수 있겠지만, 실제 놀라움은 그들의 Mind 이다.\n\n[인터뷰 내용](http://blog.naver.com/einicute?Redirect=Log&logNo=40042772573 \"[http://blog.naver.com/einicute?Redirect=Log&logNo=40042772573]로 이동합니다.\")을 보면 회사의 슬로건이 Smart Idea 라고 하는데, 이건 그들이 매달 하는 세미나를 살펴보면 단순히 모토 수준이 아니라는 걸 알 수 있다.\n\n![zrclip_001p5797eb11.png](/files/21721)})\n\n![zrclip_002p709fcbc4.png](/files/21720)})\n\n... 클라우드 컴퓨팅, GTD 등등등 해서\n\n![zrclip_005p6ac012c1.png](/files/21718)})\n\n스크럼까지..\n\n이쯤되면 단순한 웹에이전시라고 생각은 사라질 것이다. 학습(세미나)내용도 간략하게 정리해서 제공하고 있다.\n\n회사는 밝고 건전하며, 지식은 나누고 있다.\n\n보통 우리는 곧잘 이런 저런 회사들의 이야기를 들으면서, 부러워하며 들어가고 싶어하곤 한다. (이를테면 G모사라던가..)\n\n그런데 우리가 바라보고만 있을 때에, 어떤 이들은 그런 회사를 이미 만들어 나가고 있더라.\n\n길게 써 봐야 타이핑하는 손만 피곤한 것이고, 직접 한번 볼 필요가 있다.\n\n난 보면서 이래저래, 반성 많이 했다.\n\nPS. 포트폴리오를 보면 그들이 만든 사이트들을 볼 수 있는데, 역시 감탄이 나온다.\n\n![zrclip_006p2f5faae8.png](/files/21719)})\n\n#### Comments\n\n독특한 사이트네요 ;;ㅋㅋㅋ 디자인이 아주 ..ㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-07-27 월요일 오전 1:36\n\n--\n",
    "attachments": [
      {
        "id": 21718,
        "name": "zrclip_005p6ac012c1.png",
        "hash": "a84d8e820e3a95ffec9e7fdf3b508fdd88c24d81",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 144723,
        "containerId": "12277"
      },
      {
        "id": 21719,
        "name": "zrclip_006p2f5faae8.png",
        "hash": "a79c9fb03572c894d268f20cf47b1ecf7bf7551d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 93366,
        "containerId": "12277"
      },
      {
        "id": 21720,
        "name": "zrclip_002p709fcbc4.png",
        "hash": "c364daa49948f4c440193d985482a6902807df1f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 155097,
        "containerId": "12277"
      },
      {
        "id": 21721,
        "name": "zrclip_001p5797eb11.png",
        "hash": "b29126fd6487bcddbf9067c01b85ae1b67144073",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 229824,
        "containerId": "12277"
      },
      {
        "id": 21722,
        "name": "inpix01.png",
        "hash": "bac4016358a06fb4bc27eb8d6494371ef5b26c05",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 315342,
        "containerId": "12277"
      }
    ]
  },
  {
    "id": 105,
    "title": "프랭클링 다이어리, GTD, ToDo 리스트, RUP, Agile 이 실패하는 이유",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1248801117000,
    "body": "> doortts | 2009-07-26 일요일 오후 10:44 | 이생각 저생각 | [원본](http://blog.doortts.com/105)\n\n\"성공하는 사람들의 7가지 습관\" 이라는 스티븐 코비 박사의 유명한 책이 있다. 그리고 그 안의 개념중 \"소중한 것 먼저하기Put first Things First\"를 바탕으로 해서 크게 히트한 다이어리 \"프랭클린 다이어리\"\n\n[![zrclip_001p3f4da5da.png](/files/21726)})](http://www.flickr.com/photos/shuttercat7/1402975075/)\n\n혹시 프랭클린 다이어리를 쓰는 사람들은 주변에서 본적이 있다면, 그들은 무언가 마치 체계적인 삶을 사는 것 같고 자신은 인생을 대충 막 살고 있는 것 처럼 느껴져서는 '이크! 안되겠다! 나도 프랭클린 다이어리를 써야할까?' 라는 생각이 들 수 있다. 그런식으로, 많은 사람들이 주변의 영향으로, 혹은 책을 읽거나 교육을 직/간접적으로 받게 되거나 해서 프랭클린 다이어리를 쓰기 시작하지만, 내가 본 대부분의 주변인들 다이어리는 불과 몇 개월을 유지 못하고 결국 서랍에 들어가서 나오지 않게 되더라. 개중에는 끝까지 잘 쓰는 사람이 있는데, 그런 사람은 뭘해도 끝까지 할 사람인거 아니가 싶다. (한편으로는 살짝 독하다는 느낌도...-,-)\n\n근래에 주변에서 유행하는 방식이 하나 또 있는데 \"Getting Things Done (GTD)\" 라는 방법론(methodology)이다. 이것도 SW 방법론은 아니다.\n\n[##_1C|cfile5.uf.134CFE244A6F1CFB4C4B13.jpg|width=\"320\" height=\"475\" alt=\"\" filename=\"Getting_Things_Done.jpg\" filemime=\"image/jpeg\"|_##]\n\n이건 데이비드 알랜(David Allen)이 창시한 방식인데 우리나라에는 \"끝도없는 일 깔끔하게 해치우기\"라는 제목으로 번역되어 소개되었다.\n\n스티브코비 선생님의 \"소중한것 먼저하기FTF\"가 Top-Down 식 방법이라면, 알랜의 GTD는 Bottom-up 방식에 가깝다.\n\nGTD는 우선, 해야할 일들을 몽땅 머리속에서 몽땅 뽑아내어서(Collect) 머리를 비우고, 실행가능한 일인가 판단해서 아니다 싶으면 비워버린다(Blow it, or trash). 만일 실행가능하다면 다음 할일(Next Action)을 결정하고, 그 중에서 짧은 시간(2분에서 5분사이)안에 해결 가능하면 바로 그 자리에서 처리! 아니면, 남에게 위임하거나 나중으로 연기하는 방식이다.\n\n[##_1C|cfile3.uf.156D300B4A6F2AB184B31F.jpg|width=\"665\" height=\"374\" alt=\"\" filename=\"GTDclouds_1920_wide.jpg\" filemime=\"image/jpeg\"|_##][GTD workflow, 클릭하면 커진다]\n\nGTD는 원대한 계획을 세운다기 보다는 우선 해야 할일을 찾아서 처리하는데에 중점을 준 방식이다. 근래에 추종자들이 부쩍 느는게 보이는데, 개인적으로 느끼기엔 아마 프랭클린 다이어리에 실패한 경험이 있는 사람들과 새로운 것(new tech)에 관심이 많은 사람들이 대다수이지 않나 싶다.\n\n프랭클린 다이어리 보다는 GTD는 지원하는 다양할 툴이 있다. 내 PC 에도 그 중 하나인 Jello dashboard 라는 툴이 설치되어 있다. (여담인데, jello.dashboard는 extJs 로 만들어져 있는데, outlook 과 연동되며 마치 데스크탑 어플리케이션 처럼 깜쪽같이 잘 만들어져 있다)\n\n관련해서 좀 더 관심이 있는 사람은 이곳([http://lovesera.com/tt/415](http://lovesera.com/tt/415))을 참조하면 더 많은 정보를 얻을 수 있다.\n\n[](http://lovesera.com/tt/415%29)[![zrclip_002p6885c015.png](/files/21725)})](http://lovesera.com/tt/415 \"[http://lovesera.com/tt/415]로 이동합니다.\")\n\n그런데...\n\nGTD 관련 BP 사례도 많이 있지만, 앞서 스티븐 선생님의 방법과 마찬가지로 제대로 쓰지 못하고 혼란만 겪다가 그만두는 사람도 적지 않다.\n\n왜 그런걸까? 누구는 잘 써서 승승장구하는 것 같은데, 누구는 왜 잘 안되는 걸까?\n\n사실 위 두 가지 사례는 방법론의 전형적인 모습이다. 각 방법론은 BP가 있고, 이상적인 목표지점을 잘 알려준다. 그리고 사람들은 알게 모르게 비법이라 생각되는 방법론(Methology)에 빠저들게 되어있다.\n\n\"난 그런거 없다고!\"\n\n글쎄... 만일 To Do 리스트를 주기적으로 작성한다면, 그것 만으로도 당신은 당신의 삶에 대해서 무언가 방법론적인 접근을 하고 있는 셈이다.\n\n그런데 왜일까? 왜 나는 거창한 방법론은 둘째치고 ToDo 리스트도 관리하다 말다 하게 되버리는 걸까?\n\n정답을 알 순 없지만, 원인 하나는 알 수 있다.\n\n우리는 지나치게 방법론의 형식에 의존하는 경향이 있다.\n\n우리는 각자가 다 다르다.\n\n누구는 이것이 맞을 수 있고, 누구는 저것이 맞을 수 있다.\n성공한 야구선수, 축구선수 같은 운동선수들을 떠올려 보자. 모두가 각자 자신에 맞는 특정 방식을 찾아낼때 진정한 효율을 발휘하지 않던가?\n\n남을 흉내내어 자신의 몸을 옷에 맞추는 방식은 효율이 낮거나 스스로를 괴롭게 만들어 포기하게 되기 쉬워진다.\n\n각자에 맞는 방식을 찾아내는 것이 관건인거다.\n\n그럼, 어떻게 찾아낼 수 있을까?\n\n음.. 글쎄... 한번 생각해 보자. 위에 있는 방법론들은 따지고 보면, 일 잘해서 성공하자 인데, 성공하자! 는 개인 뿐 아니라 기업도 마찬가지이다. 성공하기 위해 수 많은 돈을 쓰는 기업들을 보고 힌트를 얻어보자.\n\n유명한 회사의 모토나 유명한 방법론들 사이에는 공통점이 하나 있는데, 몇 개만 적어 볼테니 찾아보기 바란다.\n\nIBM(Think), Apple(Think Different), HEWLETT-PACKARD(Invent), GILLETTE(Innovation), FORD(Better Ideas), Honda(Independent thinking) (기업마인드 방법론자들의 판타지인)Northwest Airline(창의적이고 적극적인 직원육성), 일명 '샐러리맨들의 유토피아' 일본의 미라이 공업(항상 생각한다),Toyota(Lean Production. 지속적인 개선=낭비요소 제거), Scrum (Retrospective회고), XP(Reflection반성,Improvement개선) 등등등..\n\n자, 공통점이 찾아 지는가?\n\n\"생각을 통해 지속적인 개선을 이룬다\"\n\n다시 더 줄여보자.\n\n생각 -> 개선 -> 생각\n\n어찌보면 일반론적인 이야기의 좀 허탈한 답이지만, 원래 궁극은 간결한 법이다.\n\n개인적으로 Agile 방법론에 있어서 최고의 실천방법(Best Practice) 하나를 꼽으라면 나는 거침없이 '회고'라고 말할 거다. 왜냐하면, 팀원들이 모여서 현재 자신들이 겪는 문제점과 현재 가용가능한 자원한도내에서 어떻게 개선할것인지를 찾아내서 실천하게 해주는 계기가 되기 때문이다. (가용가능 자원, 생각, 개선)\n\n정리해 보자.\n\n세상에는 우리를 성공으로 이끌어 준다고 말하는 다양한 방식과 프레임워크와 방법론 들이 있다. 하지만, 우리는 방법론의 틀(=형식)을 충실히만 따르면 그대로 되리라(=성공하리라) 쉽게 생각하곤 한다. 아니, 어쩌면 생각없이 무작정 따르고만 있는 경우도 많다. 하지만, 그걸로는 부족하다. 방식을 따르되, 자신, 혹은 조직이나 팀에 맡는 형태가 될수 있도록, 계속해서 고민하고 개선해 나가야 한다. 그 와중에 일부는 버려질 수 있다는 점도 고려하자. 100% 적용한다고 100% 성공하진 않는다.\n\n우등생이 예습과 복습을 자신의 비결로 내세우는건 \"예습\",\"복습\"이 핵심이 아니라 그것들을 어떻게 자신에 맞게 효율적으로 적용했느냐 라는걸 상기하자.\n\nps. 쓰고 보니 또 어줍잖은 글이 되었지만, 원래 \"행하지 못하는 자가 가르친다\"라지 않던가?\n\n:)\n\n#### Comments\n\n저의 계속되는 고민의 실타래와 같은 이야기네요. 공감되는 이야기입니다.\n그런데, \"우리는 지나치게 방법론의 형식에 의존하는 경향이 있다.\"  라는 부분에서 공감하지만, 저는 요즘 이런 생각도 해봅니다.  \"어느순간 방법론을 제 스스로 무시한다\",  \"방법론에 대한 공부는 제대로 하지 않는다\"  ...\nFranklin 에서 GTD 넘어와서 잘 쓰다가 요즘 슬럼프에 빠진 이유를 생각해보고 있는데 .. 정작 GTD에 대한 공부는 제대로 하지 않고 어설프게 알고 있는 지식에서 나만의 방식으로 GTD를 만들어 가고 .. 결국엔 GTD가 Franklin화 되어 버리는 악순환에 빠지게 되는것 같습니다. ->  의존적인 모습보다는 그것을 벗어남에 따른 실패를 보고 있지 않나 싶습니다. (GTD에 대한 신념(!)과 의지부족?)\n원론은 충실히하면서 그 기반에 말씀하신 '생각 ->  개선 ->  생각' 을 접목 시키는 노력을 다시한번 해봐야겠습니다.\n좋은 글 감사합니다.\n\n [아름프로](http://jazz.pe.kr) | 2009-07-30 목요일 오전 1:20\n\n--\n\n이야기 하신  \"제대로 학습하지 않는다\"  부분, 저도 공감이 갑니다. 이런저런 이유로 핑계를 대서는 제대로 해보지도 않게 되버리기 쉬운것 같습니다. :) 열심히 배우고 우선 착실하게 수행해 보는것이 변화 이전에 선행되어야 하는것 같습니다. 달아주신 좋은 글 감사합니다. :)\n\n [doortts](http://blog.doortts.com) | 2009-07-31 금요일 오전 7:12\n\n--\n\n말씀에 동의합니다. GTD 는 단지 도구일뿐 목표가 되면 곤란해 지는 것 같습니다. 목표에 따라 유연히 사고, 실천하는 것이 무엇보다 중요하겠지요.\n\n [박스타](http://parkstar.textcube.com) | 2009-12-07 월요일 오후 4:35\n\n--\n",
    "attachments": [
      {
        "id": 21723,
        "name": "Getting_Things_Done.jpg",
        "hash": "ffc8ebf74b1856bc825c1dbd68ed0c13e0122761",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 30556,
        "containerId": "12278"
      },
      {
        "id": 21724,
        "name": "GTDclouds_1920_wide.jpg",
        "hash": "fe6b03bf4591770c182ea70ca8835eda5b7a51d4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 70600,
        "containerId": "12278"
      },
      {
        "id": 21725,
        "name": "zrclip_002p6885c015.png",
        "hash": "d505691801c2f58eac8533d2c07cfcb09a2312a4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 229482,
        "containerId": "12278"
      },
      {
        "id": 21726,
        "name": "zrclip_001p3f4da5da.png",
        "hash": "37b362f5807d138d6eb098a09361afd67697d56c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 259065,
        "containerId": "12278"
      }
    ]
  },
  {
    "id": 106,
    "title": "인정하긴 어려운 흔한 오류",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1250217148000,
    "body": "> doortts | 2009-07-29 수요일 오후 4:52 | 이생각 저생각 | [원본](http://blog.doortts.com/106)\n\n팀에는 이런저런 문제들이 생기기 마련이다.\n\n의욕적인 관리자이던, 그렇지 않던. 노련하던, 그렇지 않던.\n\n이유야 뭐 여러 가지가 있겠지만, 그 중에 흔히 발생하는 '인정하긴 어려운 흔한 오류'가 하나 있다.\n\n팀장 혹은 관리자가 의식적이던 무의식적이던 자신이 팀을 소유한다고 생각 하는 것이다.\n\n하지만, 관리자는 팀을 지배할 뿐이지 팀을 소유한 것이 아니다.\n\n그 차이를 잊거나 종종 간과하기 때문에 발생하는 문제도 적지 않다.\n\n만일 본인이 의식적이든 무의식 적이든 \"우리 애들\" 이라는 표현을 종종 쓴다면, 어떤 의미로 쓰는지 한 번쯤은 생각해 보았으면 좋겠다. 그리고 부디 그 의미 안에 \"팀원 보다는 좀 더 큰 힘을 가진 자신이 지켜 주어야 할 대상\"의 의미도 포함되어 있기를 기원한다.\n\n[![428072913_450b2a8ba6[1].jpg](/files/21731)](http://www.flickr.com/photos/babykailan/428072913/in/set-768013/ \"[http://www.flickr.com/photos/babykailan/428072913/in/set-768013/]로 이동합니다.\")[그림 출처 : [http://www.flickr.com/photos/babykailan/428072913/in/set-768013/](http://www.flickr.com/photos/babykailan/428072913/in/set-768013/ \"[http://www.flickr.com/photos/babykailan/428072913/in/set-768013/]로 이동합니다.\")]\n\n\n#### Comments\n\n저 PM한테 지배당하는것 같아효~\n구해주세요 ~ 행님 ㅠㅠ\n\n [윤](http://helols.pe.kr) | 2009-08-20 목요일 오전 12:16\n\n--\n\n그냥 지배당함을 즐겨. 별수 있나.-_-\n\n그나저나 날이 왤케 더운지 잠을 잘 수가..\n\n [doortts](http://blog.doortts.com) | 2009-08-20 목요일 오전 12:33\n\n--\n",
    "attachments": [
      {
        "id": 21731,
        "name": "428072913_450b2a8ba6[1].jpg",
        "hash": "44ec03a19461eba9d4be290750dd3eafaac33efb",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 69312,
        "containerId": "12281"
      }
    ]
  },
  {
    "id": 107,
    "title": "[뭘, 이런걸 다?] MS 윈도우즈에서 창을 닫는 방법!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1248994102000,
    "body": "> doortts | 2009-07-31 금요일 오전 1:31 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/107)\n\n개인적으로 단축키를 좋아하는 편이다. 아마 DOS gamer 시절과 Unix worker 시절의 영향이 아닐까 싶다.\n\n그래서 보통 탐색기(=이자식!!)[footnote][윈도우 탐색기의 유래 농담](http://ruru.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%83%90%EC%83%89%EA%B8%B0%EC%9D%98-%EC%9C%A0%EB%9E%98-Windows-Explorer)을 들은 이후로 매번 이런 쓰레기 농담질을 하고 앉아 있다는...[/footnote]나 웹브라우저 창을 닫을 때 단축키를 애용한다.\n\n그런데 내가 흔히 쓰는 단축키(뭘까? :)를 제외하고도 MS 윈도우즈에서 창을 닫는 방법은 최소 다섯 가지는 더 있다. (에엣?)\n\n한번 생각해 보시길!!\n\n(Think Time... :)\n.\n.\n.\n.\n.\n.\n\n**1\\. alt + F4**\n대부분의 창을 닫을 수 있는 단축키이다. 정확히는 어플리케이션 종료키. 단점은 alt 키와 F4키가 거리가 있어서 타이핑 도중에 누르려면 그닥 편하게 눌리진 않는다.\n\n**2\\. ctrl + w** 이건 원래 MDI(Multiple Document Interface)를 지원하는 어플리케이션에서 문서닫기 단축키에 해당한다. 하지만, 윈도우 탐색기를 비롯하여 대부분의 어플리케이션에서도 동작한다. **내가 제일 많이 쓰는 단축키 :)** 왼손 바닥 옆면으로 ctrl 키를 누르고 약지(네번째 손가락)로 w를 누른다.\n\n**3\\. 마우스로 X 버튼 누르기**\n![zrclip_001n7b88b943.png](/files/21729)})\n\n**4\\. 창 왼쪽 상단 모서리 아이콘 더블클릭**\n\n![zrclip_002p2526ce72.png](/files/21727)})\n\n이건 아는 사람이 많진 않을것 같은데, 창 왼쪽 상단의 작은 아이콘 부분을 더블클릭하면 창이 닫긴다. 창들이 겹쳐져 있어서 오른쪽 X 버튼이 안 보일때 자주 쓴다. 써보면 생각보다 편리하다는걸 알 수 있다. 일부 Unix 계열 X-window 창에서도 동일하게 동작했던 방법으로 기억한다.\n\n5\\. 상단 창 제목 표시줄에서 마우스 오른쪽 버튼 누른후 메뉴선택\n\n[##_1C|cfile22.uf.1365F4254A721FC738D857.png|width=\"597\" height=\"290\" alt=\"\" filename=\"topmenu.png\" filemime=\"image/jpeg\"|_##]\n\n**6\\. 작업관리자로 창 닫기 : ctrl + shift + esc 후 어플리케이션 선택 -> 마우스 오른클릭!**\n\n![zrclip_003p72729fc7.png](/files/21728)})\n\n정 안될 때 쓰는 방법인데, 작업관리자 단축키(ctrl+shift+esc)가 생각보다 누르기 편하다. 왼손 엄지로 ctrl 과 shift 를 동시에 누르면서 중지나 검지로 esc 를 누른다.\n\n커맨드 창에서 쓰는 명령어까지 하면 더 많겠지만, 지금도 충분히 Otaku 같은 느낌이 나니깐 이쯤에서 줄이는 걸로. :)\n\n#### Comments\n\n어우 형님 글 읽다가 Ctrl+W 눌렀어요--;\n\n [소내기](http://sonegy.egloos.com) | 2009-07-31 금요일 오전 10:9\n\n--\n\n우분투에선 4번 안되요..ㅋㅋ \n윈도우 탐색기에선 alt ->  space ->  c 도 먹는데;; 다른데선 잘 안되네요;;ㅋ\n\n [성윤](http://helols.tistory.com) | 2009-07-31 금요일 오전 10:25\n\n--\n\n그러네.. alt 키를 이용한 시퀀스 클릭 방식인 alt ->  f ->  c 도 되고..\n\n아, 그리고 맞아, 우분투는 4번 안되어. ㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2009-08-02 일요일 오후 9:57\n\n--\n\nie8에서 탭이 하나뿐인 창이라면 ctrl+f4도 되네요 ㅎ\n\n [vitasys](http://blog.naver.com/han8315) | 2009-09-01 화요일 오후 10:42\n\n--\n",
    "attachments": [
      {
        "id": 21727,
        "name": "zrclip_002p2526ce72.png",
        "hash": "5c6a99738b4c00852346e29029c43c4618297c1f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 23085,
        "containerId": "12279"
      },
      {
        "id": 21728,
        "name": "zrclip_003p72729fc7.png",
        "hash": "eabe0783f02f934c2fd251e52cd71e134eac7976",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 29184,
        "containerId": "12279"
      },
      {
        "id": 21729,
        "name": "zrclip_001n7b88b943.png",
        "hash": "bdccfeb58559f4aa6ac1f8e392583790bb73f488",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15447,
        "containerId": "12279"
      },
      {
        "id": 21730,
        "name": "topmenu.png",
        "hash": "804e4ac27ca8347578fa56835e5253d868475b2a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 44833,
        "containerId": "12279"
      }
    ]
  },
  {
    "id": 108,
    "title": "[뭘, 이런걸 다?] 윈도우즈 cmd 창에서 파일/폴더이름 자동완성 하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1249217685000,
    "body": "> doortts | 2009-08-02 일요일 오후 9:50 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/108)\n\n윈도운 cmd 창에서 명령어 치고 tab 키누르면 파일 혹은 폴더들이 목록으로 로테이션되고, 몇 글자라도 타이핑을 한다면 자동완성이 된다.\n\n이를테면 윈도우즈 도스창 에서 Documents and Settings 폴더로 가고 싶을 경우\n\n-------------------------------------------------------------------------\nC:\\>dir\nC 드라이브의 볼륨에는 이름이 없습니다.\n볼륨 일련 번호: F475-A089\n\nC:\\ 디렉터리\n\n2007-04-03  오후 02:36                 0 AUTOEXEC.BAT\n2007-04-03  오후 02:36                 0 CONFIG.SYS\n2007-04-03  오후 03:49              Documents and Settings\n2008-02-28  오후 02:43              Intel\n2008-05-13  오전 10:12              jdk1.5.0_15\n2008-05-10  오후 07:21                25 msdcomsh.log\n2008-07-24  오전 11:31              Program Files\n2008-05-16  오전 11:09              Temp\n2008-07-14  오후 05:37            44,795 usrchk.log\n2008-07-22  오후 08:52              WINDOWS\n              10개 파일           1,144,400 바이트\n               6개 디렉터리  66,382,344,192 바이트 남음\n\n-------------------------------------------------------------------------\n\ncd d 까지 치고 tab 키 누르면\n\ncd \"Documents and Settings\" 로 바뀌고 여기서 \\를 타이핑 하고 , 즉\n\ncd \"Documents and Settings\"\\ 이 상태에서 tab 키를 더 눌러보면\n\n\"Documents and Settings\" 아래의 폴더 혹은 파일들의 리스트가 나온다.\n\n이런 식으로 특정 폴더로 빨리 가거나 파일을 실행하는 것이 가능하다.\n\ncd 하고 바로 tab 키를 눌러도 된다.\n\n물론 명령어 cd 에만 되는건 아니다.\n가끔 보면 파일이나 폴더이름을 일일히 치거나 컴파일 할때 마우스로 복사해 붙이던데\n\n별건 아니지만, 윈도우즈 command 창 많이 쓰시는 분들에게 도움 되길..\n\n#### Comments\n\n헉... 이기능 어케 알았어요 ? 저만 알고 있는줄 알앗는데!! \n대단하신데요;;ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-08-04 화요일 오후 8:56\n\n--\n"
  },
  {
    "id": 109,
    "title": "[뭘, 이런걸 다?] svchost.exe 의 정체",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1250262540000,
    "body": "> doortts | 2009-08-15 토요일 오전 12:0 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/109)\n\n가끔 컴퓨터가 느려서 ctrl-shift-esc 를 눌러서 작업표시줄을 보면 svchost.ext 라는 파일이 메모리나 CPU를 다량으로 섭취(..)하고 있는 장면을 볼수 있다. 모르고 살면 모르는 건데, 알고나면 기분이 좋지 아니하게 된다. (바이러스 아닌가 하는 의구심도 들고)\n\n![zrclip_001n7cc79c96.png](/files/21734)})\n[대체 뭘까? 메모리 90M를 잡고 있는 저 svchost.exe 프로세스는?]\n\nsvchost.exe 파일은 윈도우 시스템 파일로 Win32 서비스들을 처리하기 위한 포괄적인 호스트 프로세스(Generic Host Process)이다. Microsoft windows 는 동적 링크 라이브러리(Dynamic Link Library, 일명 DDL)를 이용해서 공통기능을 수행할 수 있게 해준다. 하지만 DLL만으로는 동작할 수 없기 때문에, DLL를 이용하기 위해서는 실행 프로그램이 필요하다. 그래서 svchost.exe 파일같은 실행가능한 프로세스가 있어야 한다. MS윈도우즈에는 백그라운드로 실행되는 '서비스'라는 것들이 있는데, 그것들의 수행을 svchost.exe 가 맡는다. 하지만 그렇다고 해서 **특정 서비스**와 **svchost.exe** 프로세스가 1:1 로 맵핑되는건 아니다. 그랬다간 svchost.exe 프로세스만 100여개가 뜨는 일도 요원한 일만은 아니게 된다.\n\nsvchost.exe 는 우선 윈도우 시작시에 윈도우 레지스트리에 있는 서비스들을 검사해서 읽어들일 서비스들의 목록을 만든다. 그런 다음 서비스들을 그룹핑 한 다음, 몇 개의 독립된 svchost.exe 프로세스로 나누어 수행한다. 이는 무리하게 많은 프로세스가 기동된다던가, 아니면 한 프로세스가 모든 일을 위임받아 처리하다가 문제가 생겨 통채로 다 날라가게 된다던가 하는, 두 가지 경우 모두를 막기 위함이다.\n\n**정리하면 svchost.exe 프로세스는 윈도우즈 서비스를 백그라운드로 구동하는 프로세스이다.**\n\n그런데, 아쉽게도 일반적으로는 어느 svchost.exe 프로세스가 어떤 서비스 그룹을 수행하는지 알 수가 없다. 하지만, 그렇다고 방법이 없는건 아닌데, 몇 가지 중 방법 하나만 소개해 보기로 한다.\n\n가장 쉬운건 Tool 을 이용하는 건데 지금은 MS 로 흡수되버린 [sysinternals](http://technet.microsoft.com/en-us/sysinternals/default.aspx)의 유명한 프로그램인 [Process Explorer](http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)를 이용하면 된다.\n\n![zrclip_003p63372c1f.png](/files/21735)})\n\n![zrclip_002p42919da8.png](/files/21732)})\n[process explorer 를 실행한 다음 마우스로 슬쩍 올려다 놓으면 어떤 서비스들이 그룹핑 되어 있는지 확인가능하다]\n\n그런다음, 혹시 자주 CPU를 높게 잡아먹거나 확인해 보고 아니다 싶은 서비스가 발견된다면, 찾아서 제어판 - 컴퓨터 관리 -서비스 항목에서 Disable 로 만들어 주자.\n\n![zrclip_004p7463d04b.png](/files/21733)})\n\n참조 :\n\n[http://windowshelp.microsoft.com/Windows/ko-KR/help/057580a1-7002-4f43-9240-a74f42cb05c91042.mspx](http://windowshelp.microsoft.com/Windows/ko-KR/help/057580a1-7002-4f43-9240-a74f42cb05c91042.mspx)\n\n[http://qaos.com/article.php?sid=1432](http://qaos.com/article.php?sid=1432)\n\n[http://www.online-tech-tips.com/computer-tips/how-to-fix-svchostexe-errors-and-problems-with-high-cpu-usage/](http://www.online-tech-tips.com/computer-tips/how-to-fix-svchostexe-errors-and-problems-with-high-cpu-usage/)\n\n\n\n   \n\n\n\n\n\n#### Comments\n\nCMD에서 명령어 tasklist /svc 로 확인하시면 쉽게 svchost에서 서비스 중인 서비스 목록을 확인 할 수 있습니다.\n\n [MayStyle](http://maystyle.tistory.com) | 2009-10-07 수요일 오후 3:21\n\n--\n\nWow!!! 이런 기능도 있었네요! 몰랐습니다. 검색해서 찾아 오시는 분들께 좋은 팁이 될것 같습니다. 감사합니다!\n\n [doortts](http://blog.doortts.com) | 2009-10-12 월요일 오후 4:48\n\n--\n",
    "attachments": [
      {
        "id": 21732,
        "name": "zrclip_002p42919da8.png",
        "hash": "2e44920ceddf25acf9053f321db1d2778590d5c8",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 13110,
        "containerId": "12282"
      },
      {
        "id": 21733,
        "name": "zrclip_004p7463d04b.png",
        "hash": "26e55fa54ffc9d32a89d9c5d7906d01d4cf8477c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 30210,
        "containerId": "12282"
      },
      {
        "id": 21734,
        "name": "zrclip_001n7cc79c96.png",
        "hash": "25ee66cfe7be2d699d48380d8e5ee34a53703b7c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14193,
        "containerId": "12282"
      },
      {
        "id": 21735,
        "name": "zrclip_003p63372c1f.png",
        "hash": "dacf54e2ba0d6ba8e78535cc17d3fc5d5229d909",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 221046,
        "containerId": "12282"
      }
    ]
  },
  {
    "id": 110,
    "title": "한국에서 만나는 XP의 아버지, 패턴의 영웅들, 개발자 책상위의 스승",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1250734876000,
    "body": "> doortts | 2009-08-20 목요일 오전 10:15 | 이생각 저생각 | [원본](http://blog.doortts.com/110)\n\n개인적으로 느끼기에\n우리는 지금, 사회/정치/경제적으로, 우리나라 IT 산업이 시작된 이후로 가장 어두운 터널을 통과하고 있는 것 같다.\n\n![3030981583_0a70f18db4_m[1].jpg](/files/21736)\n\n미숙했지만 창의적이고 선구적인 시절이 있었고, 성숙하진 않았지만 부유했던 시절이 있었고, 가진게 많지는 않아도 산업이 활발했던 시절이 있었다면, 현재는 부유하지도, 그렇다고 창의가 힘을 얻지도, 산업이 과거만큼 활발하지도 않은 시절이라고 느껴진다.\n\n혹여 어느날인가는, 어떤 누군가 말 잘하고 글 잘쓰는 사람이 \"Is IT Dead?\" 라는 글을 써 올리지 않을까도 싶다.\n\n전체적으로 어두운 분위기...\n\n사실 개발자들은 대부분 어두움과 친하다. 어두운 밤, 검은색 바탕화면이나 검은색 에디터 창, 눈 밑의 다크까지... :)\n어두운게 나쁜건 아니지만, 어쨌든 이젠 다 어둡다.. 처럼 느껴진다.\n\n[![2588630230_f58fb68882[1].jpg](/files/21739)](http://www.flickr.com/photos/diabolikkitsuney/2588630230/ \"[http://www.flickr.com/photos/diabolikkitsuney/2588630230/]로 이동합니다.\")\n[Dark 도 이 정도면 그나마 간지라도 나지만..]\n\n그런 개발자들에게도 빛은 있다. 개발을 잘 하고 싶다는 의욕이 있는 개발자라면 한번은 보거나 사거나 들어봤을 책과 분야가 있다. 그런 그 책과 분야의 대가들이 무려 한달 남짓 사이로 한국에 왔거나 올 예정이다.\n(인물과 대표작만 적어보면)\n\n스티브 맥코넬 [Steve McConnell](http://www.stevemcconnell.com/ \"[http://www.stevemcconnell.com/]로 이동합니다.\") : 코드 컴플릿트(Code Complete), 7월말\n랄프 존슨 [Ralph E. Johnson](http://www.cincomsmalltalk.com/userblogs/ralph/blogView \"[http://www.cincomsmalltalk.com/userblogs/ralph/blogView]로 이동합니다.\") : 디자인패턴 (one of GOF [footnote][/footnote]) 8월\n에리히 감마 [Erich Gamma](http://en.wikipedia.org/wiki/Erich_Gamma \"[http://en.wikipedia.org/wiki/Erich_Gamma]로 이동합니다.\") : 디자인패턴(one of GOF) 8월\n켄트벡 [Kent Beck](http://www.threeriversinstitute.org/ \"[http://www.threeriversinstitute.org/]로 이동합니다.\") : XP의 아버지, TDD의 창시자, GOF보다 앞섰던 패턴의 선구자 9월초\n\n어찌보면 아는 사람만 아는 사람일 수 도 있지만, 사실 한 분 한 분이 다 Legend 급인 분들이다. 외국으로 찾아가지 않고도, 아시아 변방의 작은 땅덩어리 '한국'에서 불과 한 달여 사이에 이런 사람들을 만날 수 있다는 점은 우울한 시절의 Blessed Gift 일지도 모르겠다.\n\n혹 지나버린 세 명 중 한 명도 만나지 못했다면, 남은 한 분, Kent Beck은 꼭 볼수 있기를 기원한다. God bless you!\n\nSTEN 안내페이지 : [켄트 벡(Kent Beck) 초청세미나 & 워크샾](http://www.sten.or.kr/bbs/board.php?bo_table=news&wr_id=1807 \"[http://www.sten.or.kr/bbs/board.php?bo_table=news&wr_id=1807]로 이동합니다.\")\n주최자 김창준님 블로그 : [켄트 벡 초청 세미나, 워크샵 내용](http://agile.egloos.com/5084979 \"[http://agile.egloos.com/5084979]로 이동합니다.\")\n\n주1 --\n4인방(Gang Of Four)으로 불리는 네 명은 Erich Gamma(현재 IBM distinguished Engineer로 활동 중), Richard Helm(현재 Boston Consulting Group에 근무 중), Ralph Johnson(일리노이 대학 컴퓨터학부 교수로 재직 중), John Vlissides(2005년 추수감사절에 44세를 일기로 생을 마감)를 말한다.\n\n그리고 GOF의 책이란 그 네 명이 함께 쓴, IT 서적 역사상 가장 크게 성공했다고 일컬어 지는 책, 바로 “Design Patterns, Elements of Reusable Object-Oriented Software”을 지칭한다. 흔히 줄여서 “GOF책”이라고도 부른다.\n\n![1499817187_4d208050f1[1].jpg](/files/21737)\n[Who is who?]\n\n참고로, 원래 GOF(Gang of Four)라는 명칭은 중국의 문화 혁명을 이끌었던 4명(모택동(毛澤東)의 부인 강청(江靑), 왕홍문(王洪文), 장춘교(張春橋), 요문원(姚文元) )을 지칭하던 단어로, 그들처럼 SW업계에서 개발의 혁명을 이끈 네 명이란 의미로 차용해 사용하게 되었다고 한다. )\n- from [Strategy 디자인 패턴 탐험하기](http://network.hanb.co.kr/view.php?bi_id=1581 \"[http://network.hanb.co.kr/view.php?bi_id=1581]로 이동합니다.\")",
    "attachments": [
      {
        "id": 21736,
        "name": "3030981583_0a70f18db4_m[1].jpg",
        "hash": "707c7bbf09d7f1040c48f170d05201a4994256f0",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 17422,
        "containerId": "12283"
      },
      {
        "id": 21737,
        "name": "1499817187_4d208050f1[1].jpg",
        "hash": "77a8f9a5cc7e212d2dc232b3aa629839b10fa451",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 90677,
        "containerId": "12283"
      },
      {
        "id": 21738,
        "name": "117804605_54ed96a211[1].jpg",
        "hash": "5a7e62306bb206bc1bbd19ccaf67fcfd5dc4c462",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 89702,
        "containerId": "12283"
      },
      {
        "id": 21739,
        "name": "2588630230_f58fb68882[1].jpg",
        "hash": "15240ece0f61d612fd912c3176c73c329a4e9a10",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 103876,
        "containerId": "12283"
      }
    ]
  },
  {
    "id": 111,
    "title": "Responsive Design 반응적 설계 (by Kent Beck) 세미나 회고",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1252229767000,
    "body": "> doortts | 2009-09-06 일요일 오후 5:55 | 잊기전에 회고 | [원본](http://blog.doortts.com/111)\n\n9월2일, 그러니까 4일전에 Kent Beck 세미나에 다녀왔다. 켄트벡이 한국에 9월1일 밤에 왔으니까, 오자마자 바로 진행한 세미나인 셈이다. 세미나의 제목은 \"Responsive Design (반응적 설계)\" 였다. 지난 3년간의 자신의 연구에 대한 정리를 발표하는 첫 세미나 라고 본인 스스로 밝혔다. 한국에서 2회 진행하고 동일한 내용을 중국 북경(Beijing)에서 진행한다고 들었다. 첫 발표라 그런지 강한 응집력(high cohesion)을 갖고 발표된 느낌은 들지 않았다. :) 강의도중 계속적으로 질문등을 유도하는 식의 Feed-back 을 요청했다는 점도 그런 느낌에 일조를 했다.\n\n실제 세미나는 우선 김창준님의 '내가 본 Kent Beck'이라는 제목으로 소개하는 발표부터 시작했다. 그 뒤 Kent Beck이 오전 2시간, 오후 2시간 발표했고, 질의 응답 40여분 남짓해서 오후 5시 반에 끝났다.\n\n9월 2일 하루에만도 200 명에 가까운 사람들이 참석했고, 9월 4일에는 300명 가량이 참석했다고 들었다. 대단한 인기인 셈인데, 세미나를 들은 사람의 반응은 다양했다. 사실 100명이상이 참여하는 세미나이면서 인당 9만원의 참석비를 받는 세미나라 다들 기대가 남달랐었을지도 모르겠다. 그래서 실망했다는 사람들도 적지 않았다. (심지어 앉아서 조는 사람들이 적지 않은 걸 보고는 개인적으론 경악을!)\n\n[XP그룹에서의반응](http://groups.google.com/group/xper/browse_thread/thread/688d5a73a544bae4 \"[http://groups.google.com/group/xper/browse_thread/thread/688d5a73a544bae4]로 이동합니다.\")\n\n그리고 반응들에 대한 내 느낌\n\n많은 IT 엔지니어들이\n\n'삶에 피로가 누적되어 있고 경쟁적인 상황에 있는 경우가 많아서'이지 않나 하는 생각도 듭니다.\n여기서 '경쟁적'이란 사회가 만든부분도 있고, 스스로가 만드는 부분도 있습니다만, 어쨌든.\nnew technology, fresh skill, tip&trick 이 좀더 입에 달다고 느껴지기 쉽잖아요.\n\n'최강 다이어트 비법소개. 살아있는 다이어트 분야의 전설이 들려주는 드라마틱한 체중감량 신화!'\n\n에 참석했더니,\n\n'하루 세끼 적당량의 밥을 꾸준히 섭취. 그리고 매일 조깅과 웨이트 트레이닝을 1시간씩 격일로 할것!\n중요한건, 목표와 의지!'\n\n라고 이야기를 듣고 온다면 어떨까 하는 상상을 해 봅니다. :)\n\n아마 '수박과 우유, 현미가루를 갈아서 아침/저녁으로 먹는거다!!' 라고 듣고 왔으면, '역시!! 그런게 있었던 거였어!!' 라며 역시 대가는 뭐가 달라도 달라! 라며 많은 분들이 좋아했겠지만, 글쎄요..\n\n진리는 단순하지만, 마음에 새기고, 원칙에 맞춰 실행하는건 어렵죠.\n\n대가라 불리는 많은 분들은 원리에 충실하고 원칙을 지키며, 자신에 맞는 변화를 익히고 그것을 창의성과 결합해 발전시켰던 분들이 아닌가 싶습니다.\n\n그 분들의 말에서 자신의 생각을 정제하고 응용하고 받아들일 수 있는 요소를 찾는게 중요한 것 같습니다.\n\n사실 KentB 아저씨가, 오후엔 '내일 당장이라도 써 먹을 수 있는 좀더 실제적인 이야기를 해 주겠다!' 라고 말했지만, 오후도 그렇게 실제적으로 느껴지진 않았어서, 좀 실망스러웠더랬습니다.\n\n그런데 가만히 생각해 보면 방식과 사고전환에 대한 여러가지 숙제를 남겨주었던 것 같다는 생각이 듭니다.\n\n그래도 일면 아쉬운건 아쉽습니다.  :)\n\n'예습과 복습을 철저히. 잠은 충분히' 라는 전국 수석자들의 공통대사를 들으면, 우린 곧잘 이렇게 말하니까요.\n\n\"젠장! 빌어먹을!!!\" :)\n\n\n난 사실 그의 Fan 이다. 나에게는 엔지니어로서의 방향성 전환을 이끈 책이 세권 있는데, 그 중 두 권이 그의 책이다.\n\n하나는 익스트림 프로그래밍(eXtreme Programming Explained, 이하 XPE)\n![200607040038[1].jpg](/files/21742)Kent Beck이 자신의 부인 신시아와 함께 쓴 책이다. (주1)\n\n그 다음 책이 테스트 주도 개발(Test Driven Development by Example, 이하 TDDBE)\n![200412020003[1].jpg](/files/21740)\nXPE는 정독으로 네 번쯤 읽었고, TDDBE는 최근에 산 책을 포함해서 네 권을 샀다.\n반 십년에 걸쳐서인데, XPE는 처음 세번까지는 읽을때마다 느낌이 다르다는 사실에 놀라워 하면서 읽었고, TDDBE는 내용이 좋아서 읽은 다음엔 주변 사람들에게 주었기 때문에 다시 읽고 싶으면 사곤 해서 그렇다.\n\n어쨌든, 오랜기간 책안의 스승이었던 분이 한국에 왔으니 어찌 만나러 가지 않을 수 있었겠는가? :)\n\n이제 다음주에 Kent Beck은 3일간 Being Agile 이라는 이름으로 워크샵을 진행한다. 정말 어렵게 가게된 자리인데, 부디 참석후에도 그가 여전히 나의 스승으로 남을 수 있기를 간절히 기원한다. 그러기 위해서는 나도 그저 막연히, 단지 무언가를 그로부터 배우겠다는 생각 보다는, 어떻게 반응하고 어떻게 참여할지 미리 준비해서 가야겠다. 좀 더 기술적이고, 내용 회고적인 내용은 워크샵까지 마치고 다시 적기로 마음먹는다.\n\n![20090902_KentbeckSeminar_038.jpg](/files/21741)(원래 사진이 없었는데, 인터넷 검색에서 찾았다. 어정쩡하니 뒤에 서있는 모습 하곤~ :o\n\n주1) 부인 신시아도 함께 한국에 왔다. 정확히는 켄트벡은 해외 강연에 부인을 비롯하여 대동할 수 있는 가족들을 모두 동반하고 다닌다고 한다. 아들 둘에 딸 셋이니 적지 않은 가족인데, 한국에는 둘째 딸과 막내딸, 둘째 아들만 대동했다\n\n주2) [http://sites.google.com/site/kentbackkorea2009/](http://sites.google.com/site/kentbackkorea2009/ \"[http://sites.google.com/site/kentbackkorea2009/]로 이동합니다.\")\n켄트벡 방한과 세미나에 대한 다양한 정보를 얻을 수 있는 사이트\n향후 진행될 워크샵에 대한 내용도 올라올 예정이다.\n\n주3) 그의 세미나를 참석하지 못해 내용이 궁금하신 분은 그의 개인 블로그 [http://www.threeriversinstitute.org/blog/](http://www.threeriversinstitute.org/blog/ \"[http://www.threeriversinstitute.org/blog/]로 이동합니다.\") 의 최근 글들을 읽어보면 대부분의 내용을 알 수 있다. (이부분도 사실 아쉬움에 일조를 한듯함)\n\n세미나와 관련된 블로그의 제목을 몇 개 적어보면\n- Design Dilemma (비용과 기능,옵션등의 상관관계. Constraints 제약조건에 대한 이야기)\n- Design is an island (적절한 디자인에 대한 이야기)\n- Design is beneficially relating elements (그가 생각하는 SW디자인의 정의)\n- Coupling and Cohesion (결합력과 응집력)\n- The Flight of the Startup (비행과 벤처에 대한 비유)\n- Developing for the Flight of the Startup (개발과 비행)\n- Every Project is a Startup (사내 프로젝트도 벤처나 마찬가지다)\n- Latency, Throughput, and Variance (개선시 고려할 세가지 사항)\n\n#### Comments\n\n>>i~ 담에 보면 이야기좀 해주세요~ 세미나 이야기~\n\n그나 저나 저 사진은 ... 지못미 인데요 ;;;\n\n [윤](http://helols.pe.kr) | 2009-09-07 월요일 오후 12:32\n\n--\n",
    "attachments": [
      {
        "id": 21740,
        "name": "200412020003[1].jpg",
        "hash": "ab2aabd02202850c60e39047ebf24d457143b125",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 13193,
        "containerId": "12284"
      },
      {
        "id": 21741,
        "name": "20090902_KentbeckSeminar_038.jpg",
        "hash": "c4c704414be5c85a0b5238192049f57d332268a1",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 65307,
        "containerId": "12284"
      },
      {
        "id": 21742,
        "name": "200607040038[1].jpg",
        "hash": "d3c4ef82390ed0595eb08d63bbde6da6e3096658",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 126396,
        "containerId": "12284"
      },
      {
        "id": 21743,
        "name": "200607040038[1].jpg",
        "hash": "d3c4ef82390ed0595eb08d63bbde6da6e3096658",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 126396,
        "containerId": "12284"
      }
    ]
  },
  {
    "id": 112,
    "title": "단방향 가속해법 (One way accelerated solution)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1253291783000,
    "body": "> doortts | 2009-09-07 월요일 오전 3:2 | 이생각 저생각 | [원본](http://blog.doortts.com/112)\n\n예전에 모 사이트에서 일할 때의 이야기.\n\n개발후 테스트 완료된 모듈을 운영 서버에 반영하는데에 종종 문제가 발생했다. (나를 포함해서) 반영작업을 하는 작업자가 때때로 실수를 하는 것이다. 물론 서버 대수가 많고, 시스템이 복잡한 이유이긴 하지만, 그렇다고 그냥 놔둘순 없었다. 관련 팀들이 모여 장시간의 회의를 했다. 상대에 대한 비난은 최대한 접고 우선은 해결책을 모색하기로 했다.\n\n그 결과로 반영 후 작업 상태를 점검 할 수 있도록\n\n1\\. 작업 체크리스트를 만들었다.\n![3738306829_9923d2c953[1].jpg](/files/21744)\n\n하지만, 그래도 여전히 문제가 발생하곤 했다.\n체크 리스테 자체에도 빈틈이 있었고, 밤에 혼자 일하다 보니 체크 리스트 작업을 종종 까먹기도 했다. 그런식으로 장애가 몇 번쯤 반복될 때 즈음. 이대로는 안되겠다는 생각에 다시 대책 회의가 다시 열렸다. '그래! 자신의 일을 자기가 판단 하려니 잘 안보는 거였어! 왜 버그도 남이 보면 쉽게 찾는 경우가 많곤 하잖아?' 라는 의견이 모였다. 그래서 소스 반영작업 전에 당일 수행할 작업에 대한\n\n2\\. 동료검토(peer-review) 단계를 추가했다.\n\n![531802055_013bdb053a.jpg](/files/21748)\n\n\n하지만, 그래도 작업 실수로 인한 다양한 문제는 근절되지 않았다. '왜지? 둘이 검토를 하는데도 실수로 누락되는 부분이 왜서 생기는 거지?' \n\n결국 또 다시 회의를 하였고, 그 결과, 이번엔\n\n3\\. 체크리스트를 두 번 작성하도록 정했다.\n![3738306829_9923d2c953[1].jpg](/files/21744)![3738306829_9923d2c953[1].jpg](/files/21744)\n\n작업 하면서 한 번, 작업 마치고 다시 한 번! 이렇게 두번 체크리스트를 작성하라고 했다. 설마 동료검토에다가 체크리스트를 두 번이나 검토하는데도 서버 작업하는데에 누락이나 실수가 있을 수 있겠냐는 발상이었다.\n(뭐, 사실 이쯤 되면 운영 환경에 모듈 반영 작업 하는 일 자체가 본의아니게 운영팀의 초고도 부담백배 핵심업무가 될 수밖에 없다. )\n\n어쨌든, 이렇게라도 해서 우리를 괴롭히던 모듈 반영 오류에 따른 장애 문제가 해결되면 다행이니까 견뎌보기로 한다. 자, 그럼 문제는 해결나? \n\nNo way!! 반영자의 실수로 인한 에러율이 줄긴 했지만 여전히 에러는 발생했다. 이쯤 되면, 고객도 분노하고, 팀장도 분노하고, 동료도 분노한다. 그래서 결단의 수를 쓸 수 밖에 없어졌다.\n\n4\\. 또 실수하면 패널티를 개인에게 물리겠다\n라는 공지가 전달 되었다.\n\n![461624012_ca90f6a529.jpg](/files/21745)\n\n\n..\n..\n\n그래서, 그 뒤로 반영 실수로 인한 장애가 줄어들고 모두가 더 행복해 졌습니다..???\n\nMasaka! (설마!)\n\n확실히 작업자 실수로 인한 장애가 더 줄긴 했다.\n\n하지만, 이젠 반영작업은 작업자에게 굉.장.한 정신적 프레셔를 주는 일이 되었다. 안그래도 지쳐있는 작업자들에게 피로도와 스트레스가 몇 배가 되버린건 당연! 문제상황은 더 줄어 들었지만, 하루 빨리 여길 뜨던가 딴일을 해야 겠다는 생각이 작업자들 모두의 머리 속에 들수 밖에 없었다.\n\n단 방향식 해결책이란 언제나 이런식이기 쉽다.\n![1597584670_89e82b933a.jpg](/files/21747) \n예전 CPU 들의 Hz 전쟁같은 식으로 한 방향을 향해서 극도로 쥐어짜내는 형태.\n창의성도 결여되고, 품질도 떨어지기 쉽다. 실제로 인텔의 cpu clock 전쟁 마지막 세대인 '프레스캇'은 과도한 클럭 쥐어짜기로 인해 열이 굉장히 심했고, 그 결과 '프레스 핫!' 이라고 까지 불렸었다. (과열로 인한 문제도 적지 않았다)\n\n타개점은 Architecture 변경이었다. 소위 말하는 패러다임쉬프트. 문제상황을 달리보는 관점. 그래서 나온게 Core 아키텍처이고, 그게 발전해서 현재 우리가 쓰는 Core 2 Duo 계열이 되었다. Core2Duo 는 기존 4G에 육박한 CPU 성능을 1G대에서도 가뿐히 넘어서고 있다.\n![289746552_e36365c281.jpg](/files/21750)\n뭐든, 한 방향으로만 가면 상황을 만족시키는 답이 점점 어려워지기 마련이다.\n\n다시 모듈 반영 문제로 돌아가 보자.\n\n차분히 그리고 냉정히 생각해보면 모듈 반영 에러의 근본적인 문제는 '반영 작업 하나 제대로 처리 못하는 바보같은 운영팀 녀석들!' 이 아니라 '사람이 작업한다'는 점이었다.\n\n![226169698_6f24c3fb4c.jpg](/files/21751)\n\n다시말해서, 좀 더 우와한 해결책은 '정신 똑바로 차린다'가 아니라 일찌감치 '모듈 반영 작업을 최대한 자동화해서 누락과 실수를 제거한다' 였던 것이다.\n\n하지만, 그걸 깨달았을 때에는 이미 우린 일방도로를 너무 많이 지나온 상태였다. 그렇기 때문에, 과거의 우리 자신을 부정하며 새롭게 시작하기 위해 돌아가는건 (여러가지로 이유로) 어렵게 되었다는 것을 알게 되었다. (고객신뢰라던가 팀간 정치, 감정의 골이라던가.. 등등등..)\n\n.\n.\n.\n\n여러 프로젝트에서 발생하는 문제들이 분석/설계가 제대로 안되어서 그렇다는 말이 많다.\n\n고객의 요구사항을 제대로 파악해 내지 못한다는 거다.\n\n자, A라는 회사의 해결책을 살펴보자.\n\n해결책을 찾기 위해 TFT(Task Force Team)를 구성한다. (전통적인 해결책 모색 시퀀스의 시작점이기도 하다)\n\n요구 사항 파악이 문제란다.\n\n1\\. 그래서 최대한 고객의 요구사항을 잘 뽑아내기 위해 분석작업에 노력(effort)을 쏟았다. (기간이며 인원이며..)\n\n(분석단계에서) 요구사항 명세서 같은 산출물을 최대한 자세하고 정확하게 만들어 내기 위해 많은 에너지를 써야 했다. 하지만, 그래도 개발이 진척되어 가다보면 이전에 없던 고객의 새로운 요구사항이 자꾸자꾸 나왔다. 안되겠다는 생각이 들었다. 그래서\n\n2\\. 초반 요구사항을 뽑을때 회의록이나 계약서에 명시해서 고객이 못 바꾸도록 만들었다.\n단순하면서도 간단한 해결책인것 같았는데, 고객은 답답해졌다고 느낀다. 나중에 요구사항을 말해도 합의사항에 없어서 못 들어준다고 하니 때때로 짜증도 난다. (그리고, 보통은 고객이 답답하고 짜증나는데 일해주는 사람이 편해지는 경우는 없다)\n\n그래서 고객은 교훈삼아 새롭게 마음을 먹었다. 다음엔 최대한 요구사항을 쉽게 확정 짓지 않겠노라고...\n\n고객은 점점 더 오묘모호하게 요구사항을 이야기 하게 된다. 왜? 너무 자세하고 명확히 말하면 나중에 생각나는 요구사항을 안 들어줄거라고 생각하니까. 또 그로인해 발생하는 문제를 고객 담당자인 본인이 책임을 져야 하니까.\n\n일해주는 우리 입장에서는 고객의 요구사항 파악과 확정이 점점 더 힘들어 지는것 같았다.\n뭘까? 어떻게 해야 할까? 우리가 너무 요구사항을 띄엄띄엄 봤어서 그런건가? 라는 자기 반성과 함께 새로운 해법을 찾아낸다.\n\n3\\. 단순하게 접근해선 요구사항 파악이 안되니 '요구공학'이란걸 만들어서 도입하기로 했다.\n공학! 이름만으로도 뭔가 빈틈없고 체계적으로 해결해 줄것만 같은 느낌인거다!\n\n쉽진 않았지만, 관련 전문가들을 부르고 연구하고 정리해서 요구사항을 잘 뽑아내 고객을 꼼짝 못하게 만들 수 있도록 하는 요구공학(Engineering) 이란걸 만든다.\n\n하지만, 그 결과, 교육을 받고 도입된 공학을 적용해도, 요구사항 파악 문제는 좀처럼 잘 해결이 되지가 않았다.\n\n'왜지? 많은 자원과 노력을 기울여 공학까지 만들었는데도 잘 안되는거지?\n그래! 요구공학을 적용할 전문 인력이 부족해서 그런건거 같아! 분석 전문가를 다수 양성해야 겠어! 그게 해결책인거야!\n.\n.\n아.. 근데 잠깐? 어째 지금과 비슷한 시퀀스의 경험을 어디선가 했던 것도 같은데... 데.. 데자뷰???'\n![2375255538_dbbcb0c251.jpg](/files/21749)\n..\n..\n.\n물론 예로 든 상황이란게 다소 극단적이긴 하지만, 때때로 이런 생각이 들곤 한다. 이런 경우에 있어 혹시\n\n보다 근본적인 문제는 고객의 요구사항이 바뀌는 것이 아니라, 바뀌는 고객의 요구사항을 따라가기 어렵게 만들고 있는 우리의 시스템 구조에 있는 건 아닐까?\n\n좀더 쉽고 유연한 시스템으로 만들었으면, 그래서 고객이 새로운 요구사항을 내었을때에 난감한 표정으로 '바꾸기 어렵다'고 말할 수 밖에 없는 상황이 조금은 더 줄어 들 수 있었던 건 아닐까?\n\n사실, 고객과 요구사항에 대한 문제는 수십년을 걸쳐서도 깔끔히 해결못한 SW공학의 블랙홀 중 하나이다.\n이렇듯 한가지 방식으로 간단하게 해결 되는 문제는 아니다.\n\n하지만 가끔은 중심에서 벗어나서 머리를 식히며 우리가 가는 방향이 맞는지, 더 개선이 가능한 방향인지는 한 번쯤 생각해 볼 필요는 있는 것 같다.\n\n\" 한 방향으로 가속화 하는 식의 개선은 한계가 쉽게 온다. 근본적인 원인은 현상의 이면에 있을 수도 있다. \" 는사실을 마음속에서 되뇌이면서 말이다.\n\n![226698892_d74a05545c.jpg](/files/21746)\n\n[이미지 참고]\n1\\. http://www.flickr.com/photos/40491122@N03/3738306829/\n2\\. http://www.flickr.com/photos/clagnut/531802055/\n3\\. http://www.flickr.com/photos/andrewgrant/461624012/\n4\\. http://www.flickr.com/photos/linux-works/289746552/\n5\\. http://www.flickr.com/photos/noamg/226698892/\n6\\. http://www.flickr.com/photos/jeffrinehart/2375255538/\n등등..\n\n#### Comments\n\n느낄점이 많은 얘기네요! \n그리고 이미지들이 멋집니다.^^\n\n [박형근](http://codereview.co.kr) | 2009-09-25 금요일 오후 1:46\n\n--\n\n글이.. 읽기 편하네요.\n필력이 좋으십니다!!!! 잘 읽고 갑니다.\n\n alex | 2012-07-07 토요일 오후 6:29\n\n--\n\n편하게 읽으셨다니 다행이네요. \n코멘트 감사합니다. : )\n\n [doortts](http://blog.doortts.com) | 2012-07-11 수요일 오전 8:54\n\n--\n",
    "attachments": [
      {
        "id": 21744,
        "name": "3738306829_9923d2c953[1].jpg",
        "hash": "7dc373af8df656950a49c064e9a1157734ebfe72",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 19086,
        "containerId": "12285"
      },
      {
        "id": 21745,
        "name": "461624012_ca90f6a529.jpg",
        "hash": "bb5e07428f98705b852457f77fc0fe7d1cb7fe4b",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 82332,
        "containerId": "12285"
      },
      {
        "id": 21746,
        "name": "226698892_d74a05545c.jpg",
        "hash": "317e37c5c1f01df5ad31927bd06b9318861a62ae",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 71281,
        "containerId": "12285"
      },
      {
        "id": 21747,
        "name": "1597584670_89e82b933a.jpg",
        "hash": "40ca4c5c290c273358e7cd18a3d7ac69fcaf40e1",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 93059,
        "containerId": "12285"
      },
      {
        "id": 21748,
        "name": "531802055_013bdb053a.jpg",
        "hash": "e4e03ca21160317bc937f2d5103d0d28285fb2f3",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 91090,
        "containerId": "12285"
      },
      {
        "id": 21749,
        "name": "2375255538_dbbcb0c251.jpg",
        "hash": "574d07a9e8be17885a36b4eea085fd48697a6ec5",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 90455,
        "containerId": "12285"
      },
      {
        "id": 21750,
        "name": "289746552_e36365c281.jpg",
        "hash": "faefb315c86786e9717963dd9c39e5231a6ff81e",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 127010,
        "containerId": "12285"
      },
      {
        "id": 21751,
        "name": "226169698_6f24c3fb4c.jpg",
        "hash": "3e52e9fa4df2c0217122204b60df818754c216a4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 151453,
        "containerId": "12285"
      }
    ]
  },
  {
    "id": 113,
    "title": "애자일 개발과 탐색적 테스팅",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1254837274000,
    "body": "> doortts | 2009-10-06 화요일 오후 7:20 | 이생각 저생각 | [원본](http://blog.doortts.com/113)\n\n애자일 개발과 탐색적 테스팅  \n\nConcealed precondition of Agile Development and Exploratory Testing\n\n\n\n  애자일 개발을 바라 보거나 적용하려 할 때 흔히 빠지게 되기 쉬운 오해의 함정 중 하나는 기존 방식에서 사용했던 방법들을 부정하거나 그 방법들의 가치를 인정하려 하지 않으려 한다는 점이다. 애자일을 적용(혹은 도입)하기 위해서는,  새로운 판에서 새로운 룰로 시작해야 한다고 자신도 모르는 사이에 은연중에 믿어 버리게 된다. 그래서는 UML 이라던가, 모델링이나 설계관련 문서들이 가치 없다고 간주해 버린다. 심지어는 전통적인 방식을 따르는 기존 맴버들을 향해 ‘애자일’을 폭력적으로 사용하기도 한다. \n\n 애자일은, 전통적인 SW개발의 방식이나 산출물들이 가치가 없다고 호도하는 것으로 시작하는 것이 아니라, 형식이 목표와 가치를 넘어설 정도로 일방적으로 따르는 교조적인 접근 방식에 대한 비효율을 개선 하자는 데에 그 출발점을 두고 있다. 애자일 선언문(Agile Manifest)만 보더라도 애자일 적인 접근을 우위에 놓자는 것이지 기존 방식이 나쁘다고 말하는 부분은 어디에도 없다. 오히려 기존 방식의 가치를 존중하고 있음을 명백히 밝히고 있다. \n\n\n\nWe are uncovering better ways of developing software by doing it and helping others do it.\n\n우리는, 소프트웨어 개발을 직접 수행하고, 다른 사람들의 개발을 도와 주는 것을 통해, 소프트 웨어 개발의 더 나은 방식을 찾아가고 있다.\n\n\n\nThrough this work we have come to value:\n\n이 작업을 통해 우리는 다음과 같은 가치에 도달하였다.\n\n\n\n  \n\n Individuals and interactions over processes and tools  \n\n    절차와 도구 보다는 개개인 및 상호작용을.\n\n Working software over comprehensive documentation\n\n     많은 것들을 아우르는 문서 보다는 동작하는 소프트웨어를.\n\n\n Customer collaboration over contract negotiation\n\n    계약협상 보다는 고객과의 협력을.\n\n Responding to change over following a plan \n\n    계획을 고수하기 보다는 변화에 반응하는 것을.\n\n  \n\nThat is, while there is value in the items on the right, we value the items on the left more.\n\n오른쪽 항목들도 가치가 있지만, 우리는 왼쪽 항목의 것들에 좀 더 가치를 둔다. \n\n  \n\n- from Manifesto for Agile Development \n\n\n\n\n\n  \n\n애자일 방식의 개발은 소위 ‘애자일’에서 이야기 하는 ‘기법들(Practice)’을 잘 따르는 개발 방식이기 앞서, 실용적인 정신이 밑바탕에 자리하고 있는 방식이라는 것을 알아야 한다. 가용 가능한 자원(Resource)내에서 ‘사용 가능하다면, 개발에 도움이 되는 것은 어떠한 방식이든 가리지 않고 최대한 이용한다’는 지극히 현실적인 노력의 자세가 그 밑에 깔려 있다. 따라서, 단순히 선언적으로 따라 하는 식으로는, 이미 오랜 세월에 걸쳐 팀 내에 충분히 정제되어 있는 상태의 기존 방식, 이를테면 폭포수 방식(Waterfall)이나 RUP 방식 등을 사용했을 때 보다 더 나은 효과를 누리기 어려울 수 있다. 때로, 애자일 개발 방식을 따르는 팀에서 팀원 개개인의 역량이 부족해서 가용 가능한 기법이나 자원이 적은 상태라면, 어려움이 생겼을 때 취할 수 있는 선택지가 더 한정적이 될 수 밖에 없고 결국 개발 팀은 더 좁은 벼랑 길을 걸을 수 밖에 없게 된다. 그것도 다양한 혼란스러움과 함께 말이다. \n\n  \n\n![2774725981_03ec29009b.jpg](/files/21754) \n\n사실, 애자일 적용에 대한 이런 내용은 애자일 도입 초반부터 강조 되었어야 하는 것이 맞다. 하지만, 애석하게도 그리 되지 않은 이유 중 하나는, 애자일 확산 초기에 애자일을 추진했던 사람들 중 다수에,  전통적인 개발 방법론를 비롯하여 UML, RUP 등의 기존 모델링 기법의 전문가나 관련 경험자들이 많이 포함되어 있었기 때문이다. 그래서 속칭, 선구자로 이름을 날린 이들의 말을 가만히 듣다 보면 애자일 방식만 알면 OK 가 아니라, ‘**기존 방식은 기본으로 알고 있거나 여차 하면 쓸수 있다고 가정하고, 그 위에서 장단점을 살려 새로운 제안 방식들을 말 그대로 애자일하게 필요한 만큼 가져다 쓴다**’는 개념이 종종 숨어 있다는 걸 알 수 있다. 마치, C나 C++에서 자바로 넘어온 중급 개발자들이, 기존 지식에 해당하는 주소(Address)와 포인터, 참조(reference) 등의 컨셉을 개발 기저에 놓고는 자바의 여러 가지 규칙을 그 위에서 이해하며 사용했던 것 처럼 말이다. 그에 비해, 자바로 개발 언어를 시작한 많은 개발자들은 주소나 메모리 관련 부분에서 초반에 곧잘 혼란을 겪을 수 밖에 없었다.(주1) 마찬가지로, 처음 애자일로 시작한 사람들은, 미묘한 전제 조건에 주의를 기울이지 않으면 오해/오용과 함께 헤매게 되기 쉽다. 결국 어설픈 개발 실력과 지식으로 Agile 개발 방식만을 흉내 내듯 팀에 도입하면 프로젝트가 훨씬 더 어렵게 진행되어 버린다는 이야기이다.\n\n  \n\n![3717904846_c581d49319[1].jpg](/files/21753) \n\n실제로, 애자일 접근방식의 하나인 스크럼(Scrum)을 열심히 따랐는데도 프로젝트들이 실패하는 현상들에 대해 마틴 파울러(Martin Fowler)는 ‘시들시들한 스크럼(Flaccid Scrum)’이라는 글에서 해당 현상의 이유를 비슷한 개념을 들어 설명하고 있다. \n\n\n\n“**스크럼에 기술관련 기법들이 범위(scope) 안에 포함하고 있지 않다고 해서 기술적인 기법들이 중요하지 않다고 생각해서는 안 된다**” - [http://martinfowler.com/bliki/FlaccidScrum.html](http://martinfowler.com/bliki/FlaccidScrum.html)\n\n마찬가지로, 많은 스크럼 활동가들이 “좋은 기술적인 기법들을 사용하는 것, 그리고 그런 기술적인 기법을 적절히 사용할 수 있는 수준의 실력 있는 팀을 유지하는 것이 프로젝트 성공에 있어 중요한 점”이라고 지적 한다.\n\n\n\n지금까지 애자일 개발 방식에 대해 이야기 했는데, 탐색적 테스팅의 경우도 이와 비슷하다..\n\n\n\n탐색적 테스팅(Exploratory Testing, 이하 ET)은 Cem Kaner 의해 소개되었고 제임스 바크(James Bach)릍 통해 널리 알려진 방식으로 방법론이라기 보다는 테스트 접근 방식에 더 가깝다. SW 프로젝트에서 보통 테스트를 수행할 때에는, 테스트 관련 문서를 미리 작성하고 그에 맞추어서 절차적으로 진행하게 되는 데에 반해, ET는 계획서나 설계서 같은 문서를 미리 작성하지 않고, 테스터가 테스트 대상이 되는 제품을 직접 다루면서 자신의 경험과 지식을 기반으로 자유롭게 테스트를 진행한다. ‘탐색적’이라는 단어의 의미처럼, 제품을 조금씩 탐색해 가면서 테스트 범위를 늘려가게 되며, 결과적으로 테스터가 빠른 시간 내에 제품에 대해 효율적으로 테스트를 수행할 수 있게 된다. 말은 간단한데 실제로 이것만으로 탐색적 테스팅 기법을 적용하겠다고 마음을 먹는다면 ‘마구잡이 테스트’나 특별한 체계가 없는 ‘내 맘대로 테스트’가 되어서는 ET에서 이야기하는 장점을 누리지 못하고 혼란만 가중 되기 쉽다. 아니면 전통적인 테스트 방식을 따르기 싫은 거부감과 귀찮음에 대한 변명거리로 쓰이는 수준이 돼버리고 만다.\n\n![3115363478_3c3d1ffac2[1].jpg](/files/21752)\n\n\n\n\n  \n\n 사실 ET 접근 방식에도 적용 전에 고려해야 하는 중요한 전제 조건 하나가 있다. 테스트를 하게 될 테스터는 **다양한 테스트 기법과 방법론에 익숙해져 있는 잘 훈련된 인원**이어야 한다는 점이 바로 그것이다. 경험이 많고 지식이 쌓여있는 인원이 테스트를 해 나가기 때문에, 필요에 따라, 명세기반, 구조기반을 가로지르면서 등가 분할, 경계값 분석, 결정 테이블, 상태 전이, 유즈케이스, 페어와이즈 조합, 구문 테스트, 결정 테스트 등등 사용가능 한, 그리고 필요하다고 생각하는 방법은 무엇이든 적극 활용할 수 있어야 한다는 소리다. 이 부분이 단순히 경험에 따라 테스트 한다는 일반적인 경험기반 테스트 방식 과 ET를 구별 지어 주는 점이다.\n\n\n\n이 글은, ET(탐색적 테스팅)을 설명하고자 하는 글은 아니지만 ET에 대해 조금만 더 설명하자면, ET를 효율적으로 수행하기 위해서는, 우선 경험 있는 테스터가 필요하고, 그 다음 선정된 테스터는 테스트 대상을 실제로 다루면서 학습을 해 나가고 학습된 부분에 대해 테스트를 계획(=설계)하고 테스트를 수행한다. 이런 식으로 학습과 계획, 테스트가 반복되는 주기(cycle)을 통해 제품 자체에 대한 이해도 높아지고 그와 함께 점점 더 효율적으로 테스트가 가능해 진다는 사상이다.\n\nET는 여러 면에서 애자일 방식과 매우 닮아 있다. 방법론으로 규정 짓기 어렵다는 점, 전체에 대한 설계를 위해 사전에 많은 시간을 투입하지 않는다는 점, 그리고 문서를 자세히 작성하는 데에 치중하기 보다는 수행 단계를 바로 시작해서는 점진적으로 발전해 나간다는 점이 유독 그러하다. 그래서 몇 가지 사항에 대해서는 애자일 개발방식과 장/단점을 공유하게 되는데, 개발자들에게는 플러스 요소와 마이너스요소를 함께 제공한다.\n\n\n\n바로 실제 수행하는 인원들의 안정된 기술적 밑바탕이 필요하다는 점이다.\n\n\n\n어떤 운동이 되었든, 해당 운동을 잘하기 위해서 아주 기본이 되는 요건은 그 운동을 하게 될 선수의 체력이다. 마찬가지로 어떤 방법론을 사용하던지, 어느 업무를 하든, 소위 말하는 'IT'이라는 걸 하는 한, 해당 방식을 잘 따라 해서 효과를 거두기 위해서는 참여 엔지니어들의 기술력은 기본이 될 수 밖에 없다.\n\n\n\n하지만, 여러가지 이유로 우리는 기술을 버리고 관리를 우위에 두곤 한다. 생각보다 많은 경영자들은 엔지니어를, 그리고 기술을, 교체가능한(Replaceable) 일반재로 보는데, 내가 보기엔 '방법론/관리방식'이 훨씬 더 교체가능한 일반재라고 본다. 경영진이 몇 년에 한 번씩 바뀌어서는 새로운 정책을 도입할때, 어렵지 않게 적용하는 모습을 볼 때면 더더욱 그렇다는 믿음이 강해진다. \n\n어쨌든, 지금 까지 주절주절 이런저런 이야기를 했는데, 우리가 흔히 간과해서 애자일이나 탐색적 테스트 적용의 실패를 이곳 저곳으로 둘러대곤 했던 핑계를 잠시 접고, 그 근본이 깔려있는 숨은 원칙이 무엇이었는지 한 번쯤 곰곰히 따져 볼 필요가 있다.\n\n마지막으로, 많은 이들이 끝까지 읽지 않고 넘어가서 곧잘 간과되곤 하는 애자일 선언문의 뒤에 나오는 '숨은 원칙들'에 대한 부분 중 하나를 인용하며 글을 마칠까 하다.\n\n\n\n\n\n탁월한 기술과 뛰어난 설계에 대한 끊임없는 관심은 기민성(Agility)을 강화시킨다.\n- Principles behind the Agile Manifesto \n\n\n\n이미지 출처\n\nhttp://www.flickr.com/photos/zerega/2774725981/\n\nhttp://www.flickr.com/photos/twelve-paws/3717904846/\n\nhttp://www.flickr.com/photos/23076491@N02/3115363478/\n\n\n\n주1. 비약이 컸다면 양해를 :)\n\n#### Comments\n\n공감가는 말입니다. 과거 화두가 되었던 디자인패턴이나, RUP나 TDD나 애자일 방법론이나... 보면 탄탄한 기본기를 바탕으로 하고 있지 않으면, 기본적인 룰 조차 지키기가 어렵죠. 그리고 세상엔 완벽한 방법론이 없기 때문에, 사상을 이해하고 정수는 유지하되 접근 방법은 상황에 맞춰 달리 해야 하지 않나 합니다.\n\n [AlexK](http://alexk.name) | 2009-10-07 수요일 오후 1:44\n\n--\n\n정수를 찾아내서 유지하기 위해서는 그 전에, '가르침 그대로 따라했을때 실패하는 과정'을 겪어야 한다고 이야기 하기도 합니다. :)\n\n [doortts](http://blog.doortts.com) | 2009-10-12 월요일 오후 4:55\n\n--\n\n좋은 글 감사합니다. 제가 생각해왔던 고민들과 똑같아서... 깜짝 놀랐습니다. ^^;\n회사 업무로 Test Case 개선작업을 1년 넘게 하면서 답답해 했던 부분이거든요...\n언제 제 블로그에 정리하면 트랙벡을 남기겠습니다.\n\n [정의의소](http://dicawoo.com) | 2009-10-07 수요일 오후 4:13\n\n--\n\n아마, 많은 사람들이 비슷한 고미을 할 것 같습니다. TestCase 개선작업에 대한 내용은 매우 궁금합니다. 거시는 트랙백에 저도 같이 트랙백 거는 날이 빨리 왔으면 좋겠습니다~ :)\n\n [doortts](http://blog.doortts.com) | 2009-10-12 월요일 오후 4:51\n\n--\n",
    "attachments": [
      {
        "id": 21752,
        "name": "3115363478_3c3d1ffac2[1].jpg",
        "hash": "086ef03eec17fcc78baf9a1561176f5f983c40ed",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 74493,
        "containerId": "12286"
      },
      {
        "id": 21753,
        "name": "3717904846_c581d49319[1].jpg",
        "hash": "dc12e45df23811421093aca94d2fa69cc6b16af7",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 60816,
        "containerId": "12286"
      },
      {
        "id": 21754,
        "name": "2774725981_03ec29009b.jpg",
        "hash": "0fca677a68da787940e5ebd82279de15e849677e",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 103316,
        "containerId": "12286"
      }
    ]
  },
  {
    "id": 114,
    "title": "Subversive 의 작은 승리, Subversive Connector Discovery",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1255278676000,
    "body": "> doortts | 2009-10-12 월요일 오전 12:36 | Better SW Development | [원본](http://blog.doortts.com/114)\n\n이클립스에서 사용가능한 Subversion 클라이언트 툴은 현재 두 개로 양분되어 있다.\n\n    ![zrclip_007n41cb944f.png](/files/21759)})     하나는 subversion을 만들 tigris의 subclipse ( [http://subclipse.tigris.org/](http://subclipse.tigris.org/) )\n\n![zrclip_006n55f403e0.png](/files/21758)})다른 하나는polarion의 subversive ( [http://www.polarion.com/products/svn/subversive.php](http://www.polarion.com/products/svn/subversive.php) )\n\n**'둘 중 어느걸 쓰는게 더 낫느냐?'** 는 오랜 논쟁의 치킨싸움이니까 괜히 동참하지 말고, 아무거나 쓰면 된다. (치킨싸움 유경험자임 :)\n\n뒤 늦게 나와서는 결국 현재 eclipse 프로젝트내에 공식으로 들어가 있는 건 subversive.\n\nSubversive를 사용하려면 이클립스의 Help 메뉴에서 Install New Software 를 선택해서 galileo 공식 릴리즈 사이트를 선택해서 Subversive SVN Team Provider (Incubation)을 선택하면 된다.\n\n![zrclip_001p34b28b1e.png](/files/21756)})\n\n그런데 그 동안\n\n(이클립스 프로젝트에서 누락된 분노의 tigris 때문인지, 아니면 상업적인 서비스를 노리는 TMate의 전략때문인지 어떤건지) **라이센스 문제로 Subversion Connector 는 따로 업데이트 사이트를 가서 받아야 하는 불편함이 있었다.**\n\n하지만 이젠 더 이상 그럴 필요가 없다. polarion 이 최근 Subversive Connector Discovery 라는 걸 만들어 놓았다.\n\n어떻게 사용하는 건가 하면, 위에 그럼처럼 이클립스 공식 사이트를 이용해서 SVN Team Provider 만 설치한 다음 이클립스 재기동하고 subversive 관련 기능을 사용하려고 하면, 그 순간 connector 가 설치되어 있는 지를 확인해서 없으면 다음과 같은 창을 띄워 준다.\n\n![zrclip_003n1a01d8e3.png](/files/21760)})\n****\n\n잘 보면 JavaHL 과 SVNKit 두 종류로 나뉜다는 걸 알 수 있다. '다 설치하긴 그렇고, 어떤 버전을 설치해야 할까? ' 라고 잠시 고민할 수도 있는데, 고민하는 시간이 아까우니까 최신 버전 하나씩만 설치하자. 다 설치해 버려도 시스템상 문제는 없으니까, 찜찜하면 다 설치 하던가.. (으응?? -,-)  * 커넥터 관련해서는 따로 포스팅 하겠음 *\n\n![zrclip_004n34f8f5f5.png](/files/21755)})\n\n![zrclip_005p5c358691.png](/files/21757)})\n****\n\n어쨌든 이젠 더 이상 업데이트 사이트를 추가로 찾아서 Connector를 따로 설치하지 않아도 되게 되었다. (물론 잘 살펴보면 조삼모사끼가 강하긴 하지만, 어쨌든.) 결국, 이 상태로라면 시간이 지나면 지날수록 인지도에서 subclise 가 밀리게 될 것 같다.\n\n**ps. 하지만 난 개인적으로 subclipse를 더 선호한다.**\n\n프로젝트를 share project 로 만들때 하위 폴더를 통채로 제거하는 기능이 아직 subversive에서 안되고, subclipse 에서는 branch를 그래프로 보여주는 기능을 제공한다... :)\n\n아, 그런차이가 있었냐고? 그럼 subclipse 를 써야 겠다고? 왜 이러삼! 위에서 말했듯이, 치킨싸움이라니깐~~~ :)\n\n#### Comments\n\n^^ 잘 읽었습니다.\nsubversive의 잔머리에 탄복했습니다. ^^;\n\n [kenu](http://okjsp.tistory.com) | 2009-10-12 월요일 오전 9:3\n\n--\n\n와우! 몸짱 Kenu님! 오랜만이셔요!! 언제 얼굴 뵈면서 식사할 기회 생겼으면 좋겠습니다~~~ (어찌 지내시는지 궁금해요~)\n\n [doortts](http://blog.doortts.com) | 2009-10-12 월요일 오후 4:47\n\n--\n\n전 subclipse이놈 아이콘이 영;; 맘에 안들어서 ..z subversive를 쓰는데요 ;;ㅋㅋ \n\n저도 식사 ;;ㅋㅋ\n\n [성윤](http://helols.tistory.com) | 2009-10-12 월요일 오후 5:59\n\n--\n\n오!~ 좋은 정보 감사합니다 ^0^/\n\n [김석영](http://deuxksy.tistory.com) | 2009-10-29 목요일 오후 3:46\n\n--\n\n정보 감사합니다 ^^ 일부분만 블로그에 퍼갈게요  ><\n\n 카루딘 | 2013-01-09 수요일 오후 5:47\n\n--\n",
    "attachments": [
      {
        "id": 21755,
        "name": "zrclip_004n34f8f5f5.png",
        "hash": "e5c0de6d5f3d30301597fbc1b9c2f2c2d9208664",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 32262,
        "containerId": "12287"
      },
      {
        "id": 21756,
        "name": "zrclip_001p34b28b1e.png",
        "hash": "650014f0510d343fbc6df5fdb7e8100053a08462",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 52212,
        "containerId": "12287"
      },
      {
        "id": 21757,
        "name": "zrclip_005p5c358691.png",
        "hash": "0a0049cf79fa348945f25d894eaa06343afa677b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 52782,
        "containerId": "12287"
      },
      {
        "id": 21758,
        "name": "zrclip_006n55f403e0.png",
        "hash": "2f78ce819647b8face552bfca42e245c439d4044",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 3819,
        "containerId": "12287"
      },
      {
        "id": 21759,
        "name": "zrclip_007n41cb944f.png",
        "hash": "3f54c7ef382db3d3310ddca1d505976525cab3d3",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2736,
        "containerId": "12287"
      },
      {
        "id": 21760,
        "name": "zrclip_003n1a01d8e3.png",
        "hash": "22c8c2dc3a31b40b8576c2ffb5141829c30e4485",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 80199,
        "containerId": "12287"
      }
    ]
  },
  {
    "id": 115,
    "title": "SVN Connector Client 들의 차이점",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1255390200000,
    "body": "> doortts | 2009-10-12 월요일 오전 1:16 | Better SW Development | [원본](http://blog.doortts.com/115)\n\nSVN Connector Client 들의 차이점\n\n**1\\. JavaHL (**  [**http://subclipse.tigris.org/wiki/JavaHL**](http://subclipse.tigris.org/wiki/JavaHL)  **)**\n\nJavaHL은 tigris 가 Subversion을 만들면서 함께 개발한 Native 클라이언트 구현체(JNI)이다. 따라서 동작하려면 바이너리 파일이 필요하다. (윈도우일 경우 dll, 유닉스일 경우 so 파일, 등등) .\n\n**장점 :**\n\nSubversion 새 버전을 만들면 그에 맞는 Java Binding 버전을 함께 제공한다.\n\n**단점 :**\n\n- SSH 프로토콜을 사용하려면 수동으로 터널을 만들어 주어야 한다.\n- proxy server 세팅을 위한 인터페이스를 제공하지 않는다.\n- 여러 버전의 JavaHL을 동시에 사용할 수는 없다. 이건 자바 클래스 로더 문제임\n- 네이티브 바이너리를 사용하기때문에 이클립스에서 어떤 충돌이 발생할 수 있다.\n\n유의사항 사용하게 될 Subversion 의 버전과 JavaHL의 버전을 일치시키지 않으면 문제가 발생할 수 있다.\n\n| Subclipse Version | SVN/JavaHL Version |\n| 1.6.x | 1.6.x |\n| 1.4.x | 1.5.x |\n| 1.2.x | 1.4.x |\n| 1.0.x | 1.4.x |\n\n **** \n\n**2\\. SVNKit (**  [**http://svnkit.com/**](http://svnkit.com/)  **)**\n\n순수하게 자바로 구현된 SVN Connector 클라이언트임. 따라서 JRE가 설치된 어떤 OS에서도 사용할 수 있음\n\n**장점 :**\n\n- OS에 맞는 바이너리 파일을 찾을 필요없음\n- proxy server 세팅을 위한 인터페이스를 제공함\n- SSH 프로토콜이 포함되어 있음\n- 이클립스 IDE에서 충돌발생할 염려가 없음\n\n**단점 :**\n- 새로운 Subversion 이 나오면 지원하는데에 시간 차이가 좀 남\n- 적용할때에 가끔, 네이티브 코드로부터 버그를 물려받기도 함\n- 최초 버전들(베타나 RC들)은 때때로 매우 불안정함\n\n![zrclip_009n41c9081a.png](/files/21761)})\n\n\n\n[http://subclipse.tigris.org/wiki/JavaHL](http://subclipse.tigris.org/wiki/JavaHL)\n[http://svnkit.com/](http://svnkit.com/)\n[http://www.polarion.com/products/svn/subversive/connector_discovery.php](http://www.polarion.com/products/svn/subversive/connector_discovery.php)",
    "attachments": [
      {
        "id": 21761,
        "name": "zrclip_009n41c9081a.png",
        "hash": "a8df8ac3a102c3429c8feb466e9199d90ea2e042",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 77292,
        "containerId": "12288"
      }
    ]
  },
  {
    "id": 116,
    "title": "자바가 unsigned 타입을 지원하지 않는 이유",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1256487492000,
    "body": "> doortts | 2009-10-26 월요일 오전 1:18 | Better SW Development | [원본](http://blog.doortts.com/116)\n\n**\"자바에서 int 는 21억이 한계라고? 이봐! C/C++은 32bit환경이라는 가정하에서 두 배인 42억 까지 가능하다고!\"**\n\n\n\nJAVA 의 int 타입 , 그리고 C/C++같은 C 계열의  long 타입은 32bit(4Byte)의 크기를 갖는다. 그래서 일반적으로 java의 int나 c 계열의 long 타입에 저장 가능한 숫자는 2의 32승 -2,147,483,648 에서 2,147,483,647 까지이다. 하지만, JAVA 는 C 계열 언어와 다르게 unsigned type을 지원하지 않는다. 그래서 C 계열에서는 unsigned 라는 키워드를 사용해서 음수나 양수, 한쪽만 사용하게 될 경우 두 배 크기 영역까지 데이터 저장에 사용할 수 있는 반면 자바는 그렇게 할 수가 없다. 초창기 JAVA로 넘어온 사람들 중 일부는 이에 대해서 불만을 토로했다. 특히 기존 legacy 시스템과 연동해야 하거나, 이미 unsigned type들을 사용하고 있는 네트워크 프로토콜을 사용할 때, 동일한 32bit 타입임에도 long 을 int 로 바로 변환이 되지 않았기 때문에, 이런저런 적지 않은 불편함을 주었다. 왜 C 와 C++의 많은 부분을 흡수한 포스트 C++인 자바는 unsigned 타입을 지원하지 않는 걸까?\n\n\n\n공식적인 이유는 찾기가 어려운데, 적지 않은 개발자들이 signed 와 unsigned 연산으로 인한 다양한 문제(=버그)에 시달렸기에 간결한 언어를 지양하는 자바에서는 signed, unsigned 로 구분해서 사용하는 방법을 아예 제외해 버린 걸로 추측된다. 정답은 JAVA를 만든 사람에게 직접 물어보는 수 밖에.\n\n그런데, 마침 “자바 리포트(Java Report)*”라는 잡지, 2000년 7월에 실린 인터뷰 기사에서 이와 관련된 참고할 만한 이야기가 나온다. “C 언어 패밀리 인터뷰 (The C Family of Languages)”라고 제목 붙은 이 인터뷰에는 데니스 리치(Dennis Ritchie), 뱐 스트라우스트럽(Bjarne Stroustrup), 제임스 고슬링(James Gosling), 이렇게 셋이 참석하는데, 각각 C, C++, JAVA 의 아버지라 불리는 사람들이다.\n\n가히 기념비적이라 할 수 있는 이 인터뷰에는 매우 흥미로운 이야기가 다수 등장하는데, 그 중 “간결한 언어”와 관련된 질문에 대한 대답의 일부분으로, 고슬링은 다음과 같이 이야기를 한다. **“C** **개발자들에게 unsigned 에 대해 한번 물어보세요. unsigned 어떻게 되고, 연산이 어떻게 이루어지는지 제대로 이해하고 있는 개발자가 거의 없다는 걸 바로 알 수 있을 겁니다”**  그러면서 그는, 자바는 다른 언어들이 봉착하게 되는 다양한 경계조건들(edge cases)과 제대로 이해하는 사람이 거의 없는 것들은 포함시키지 않았다고 말했다.\n\n\n\n그리고 실제로 C 계열 최신 언어인 C#에서는 컴파일러 차원에서 unsigned와 signed 타입들간의 연산 자체를 상당히 제한하는 형태로 언어의 간결함을 추구하고 있다. \n\n\n\n간결함이냐, 확장성이냐? 는 오래된 주제라 여기서 논의할 내용은 아닌지라 이쯤에서 정리하기로 한다.\n\n\n\nThe C Family of Languages: Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling 인터뷰 전문은 현재 여기 [](http://www.gotw.ca/publications/c_family_interview.htm)[http://www.gotw.ca/publications/c_family_interview.htm](http://www.gotw.ca/publications/c_family_interview.htm \"[http://www.gotw.ca/publications/c_family_interview.htm]로 이동합니다.\") 에서 찾아볼 수 있다.\n\n* 자바 리포트는 2001년 10월호를 마지막으로 폐간되었다.\n* 기타 참조자료\nMSDN : [C# vs JAVA Data Type](http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx \"[http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx]로 이동합니다.\")\n방준영님 블로그 : [http://bangjunyoung.blogspot.com/2009/05/cc-signedunsigned.html](http://bangjunyoung.blogspot.com/2009/05/cc-signedunsigned.html \"[http://bangjunyoung.blogspot.com/2009/05/cc-signedunsigned.html]로 이동합니다.\")\n\n#### Comments\n\n[Java unsigned] 좋은 글 잘 읽었습니다.\n\n [누아니](http://hdnua.tistory.com) | 2016-09-18 일요일 오전 12:13\n\n--\n"
  },
  {
    "id": 117,
    "title": "[뭘, 이런걸 다?] 윈도우용 grep 툴 findstr 을 이용한 SVN Hooking (부제:commit 시 comments 강제화 하기)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1257741375000,
    "body": "> doortts | 2009-11-09 월요일 오후 1:36 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/117)\n\n윈도우에서 쉘 스크립트를 사용하기 위해서 cygwin 을 사용하거나 powershell 등을 사용하는 경우가 종종 있습니다. 특히 svn hook script 등을 사용하고자 할 때 더욱 그렇죠.\n\n이럴때 위와 같은 유틸리티를 설치하지 않고도 간단 유용하게 쓸 수 있는 윈도우 커맨드가 findstr 이라는 커맨드 입니다. grep 비슷하게 사용할 수 있습니다.\n\n상세참조 : [http://technet.microsoft.com/en-us/library/bb490907.aspx](http://technet.microsoft.com/en-us/library/bb490907.aspx \"[http://technet.microsoft.com/en-us/library/bb490907.aspx]로 이동합니다.\")\n\nsvn 설치 디렉터리 하위에 hook 폴더가 있습니다. 그 안에 UNIX/LINUX의 경우에는 .sh 파일로, 윈도우일 경우에는 .bat 파일로 스크립트를 만들어 주면 됩니다. 다음은 pre-commit.bat 라고 만들어서 넣어놓은 스크립트 파일입니다. commit 할때 주석을 달지 않고 무의식적으로 commit 하는 걸 막아주는 스크립트 입니다.\n\n아래 스크립트는 findstr 로 commit 때의 코멘트를 비교해서 아무것도 없으면 GOTO NOTOK 로 JUMP 하게 만들어 놓은 예제입니다. hook script의 exit 코드가 1 이면 commit 이 실패하게 됩니다. 0 이면 정상 commit 이 일어나고요.\n\n## pre-commit.bat ##\n\necho %1 %2 >> c:\\result.txt\nsvnlook log %1 -t %2 | findstr /I . >> c:\\result.txt || GOTO NOTOK\nexit 0\n\n:NOTOK\necho \" \" >&2\necho \"Commit Comments is required!!!\" >&2\nexit 1\n\n\n단 이때 svnlook 이라는 실행파일은 path 내에 존재해야 합니다. 아니경우 full path 를 적어주시면 되고요.\n예) c:\\svn\\svnlook .......\n\n![XIOCdwnSoV[1].png](/files/21762)\n올 봄에 프로젝트때에 작성했던 스크립트인데, 미리 정리 안해놓았었더니 상세 내용은 많이 까먹었네요. :)\n\n참조 : [http://doortts.textcube.com/20](http://doortts.textcube.com/20 \"[http://doortts.textcube.com/20]로 이동합니다.\")",
    "attachments": [
      {
        "id": 21762,
        "name": "XIOCdwnSoV[1].png",
        "hash": "c32d99bd2a40cfd68146a1f7ef5590a19b3e4adf",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 13262,
        "containerId": "12290"
      }
    ]
  },
  {
    "id": 118,
    "title": "테스트주도개발 워크샵(TDD workshop) 외부 참가자 신청받습니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1258339092000,
    "body": "> doortts | 2009-11-16 월요일 오전 11:34 | Better SW Development | [원본](http://blog.doortts.com/118)\n\n안녕하세요? 일기장/메모장 같은 블로그에 '안녕하세요?'라고 인사를 쓰니 조금 어색하네요. :)\n\n그래도 가끔 찾아오시는 분이 몇 분은 계실것 같아서 글을 남겨 봅니다.\n\n사내 동료직원들과 함께  테스트 주도 개발(TDD) 워크샵을 금주 토요일과 차주 토요일, 이틀에 걸쳐 진행해 볼 예정입니다.\n\n가능하신 분이 계시면 사외에 계신분도 몇 분 정도 초대해서 함께 진행해 볼까 하여 글을 올리게 되었습니다.\n\n이하 사내 메일 내용중 일부 입니다.\n\n참고하셔서 아래와 동일한 양식으로 메일 주시면, 안내 메일드리겠습니다.\n\n![email_address.png](/files/21763)\n\n--------- 이하 사내 발송 메일 중 일부 발췌 + 약간 수정 ^^;; -------\n\n테스트주도개발(Test Driven Development, TDD)에 대해서 어느정도 들어보시고, 사용해 보시고 계신지 모르겠습니다.\n\n저 개인적으로는 Agile 과 함께 앞으로 나아가야 할 방식중 하나로 TDD를 꼽고 있는데요,\n\n그 동안 업무 내외적으로 조금씩 준비해 왔던 컨텐츠로 베타라고 하기에도 조금은 이르지만, 어쨌든\n\n**TDD 워크샵**을 진행해 보려 합니다. (**Non-official 과정입니다**)\n\n제가 업무로 배당받아서 하는 일이 아닌지라, 여러가지 제약사항이 있습니다만.\n\n그럼에도 (저를 포함해서)서로에게 도움이 될 수 있을 것 같아서 살짝 수요를 조사해 보려 합니다.\n\n의향이 있으신 분은 답장 주세요.\n\n**-- 답장양식 --**\n\n1\\. 소속/이름/경력\n\n2. TDD 경험 (예. 책을 읽음. 처음 들어봄. 조금 사용해 봄. 프로젝트에서 사용, 등등등)\n\n3\\. 최근프로젝트에서의 Role\n\n4\\. 얻고자 하는것, 다른사람들에게 기여할 수 있을것 같은 것\n\n5\\. 연락처\n\n**--------------**\n\n그럼 좋은 하루 되시구요.\n\n읽어 주셔서 감사합니다.\n\n----------------------------------------------------------------------\n\n**제목 : 테스트 주도 개발 워크샵 (TDD Workshop)** \n\n일정 : 11월 21일(토), 11월28일(토) 각각 하루 6시간 정도씩 (10 to 4)\n\n인원 : 15명 정도\n\n장소 : 상암 LG CNS ITC 11층 기술대학원 or 본사 회의실 (인원과 상황에 따라 달라짐)\n\n내용 : 실습과 토론등 참여 위주로 진행됩니다. (일정 사이의 일주일 간에 하셔야 하는 숙제도 있습니다)\n\n- TDD 기본\n\n- xUnit Concept\n\n- JUnit (4.7버전까지의 New Concept 포함)\n\n- Support Libraries : Hamcrest, Unitils, DBUnit, HttpUnit, Selenium etc..\n\n- Mock Object\n\n- TDD in GUI apps        \n\n- TDD with CI\n\n- TDD 와 SW디자인\n\n- TDD 작성 패턴\n\n- BDD\n\n등등등.. 시간되는 한도내에서 +-\n\n----------------------------------------------------------------------\n\n**안내사항**\n\n- 단순 전달식 교육이 아닙니다. 최대한 자유로운 분위기 하에서 참여자들에 의해 최대한 자율적으로 진행될 예정입니다.\n\n**- 따라서, 적극적인 의견표현과 참여에 의지가 있으신 분들이 신청해 주셨으면 좋겠습니다.**\n\n- 그리고 어느 정도 밀도로 워크샵이 진행될지는 저도 잘 모르겠습니다. ^^;\n\n- 개인 노트북 지참\n\n- 회비 3만원 (이틀 모두 빠지지 않으시면, 같이 먹는 간식비 제외하고 돌려드립니다 :)\n\n#### Comments\n\n이틀 모두가 아니라 하루만 참여할 수도 있을까요?\n선약이 있어서 흥미로운 주제에 상호작용 까지 있다면 매우 흥미로운 시간이겠네요.\n\n [영회](http://younghoe.info) | 2009-11-16 월요일 오후 11:28\n\n--\n\n하루만 참여하셔도 괜찮습니다만 Rule 은 rule 입니다. (죄송)\n\n [doortts](http://blog.doortts.com) | 2009-11-17 화요일 오후 8:53\n\n--\n\n날짜가 괴롭게 하는군요. 구글 Agile 모임과 겹치는 것 같아서요. 이번만이 아닌 따로 한 번 더 워크샵을 진행할 생각은 없으신가요? 꼭 참가하고 싶은데, 일정이 겹칩니다. ^^\n\n [Richpapa](http://richpaparyan.tistory.com) | 2009-11-17 화요일 오후 1:15\n\n--\n\n이번에 진행해 보고 괜찮았으면 추가로 더 진행해 볼 의향은 있습니다.\n\n [doortts](http://blog.doortts.com) | 2009-11-17 화요일 오후 8:54\n\n--\n\n신청 메일은 보냈습니다만 주로 사용하는 언어와는 별 상관이 없나요? 저는 주로 닷넷을 사용하는데\n\n [tack](http://tack.tistory.com) | 2009-11-17 화요일 오후 8:32\n\n--\n\n아.. 제가 본문에 썼어야 했는데, 미처 적지 않았군요. JAVA 언어를 기본으로 사용하게 됩니다. 사용하게 될 라이브러리도 JAVA 계열이라 어떻게 느끼실지 모르겠습니다. :(\n\n [doortts](http://blog.doortts.com) | 2009-11-17 화요일 오후 8:52\n\n--\n\n주인장님이 제가 아는 분이군요. :)\n말씀하신대로 Rule이 중요하니까 다음 기회를 노리렵니다.\n\n [영회](http://younghoe.info) | 2009-11-22 일요일 오전 1:12\n\n--\n",
    "attachments": [
      {
        "id": 21763,
        "name": "email_address.png",
        "hash": "b26eb6fac5f9d1a06ebb8af892b26ad28ddf3874",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2192,
        "containerId": "12291"
      }
    ]
  },
  {
    "id": 119,
    "title": "Java의 static, 득과 실, 어떻게 사용할 것인가?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1258414200000,
    "body": "> doortts | 2009-11-16 월요일 오후 3:31 | Better SW Development | [원본](http://blog.doortts.com/119)\n\n\n\n예전 C 시절에 그랬다.\n\n'전역변수는 악마'라고. (Global variables are evil.)\n\n\n\n흔히 '모든 범죄의 이면에는 여자와 돈이 있다'고 말하는데, 마찬가지로 '모든 버그의 이면에는 피곤한 개발자와 전역변수가 있다'고 말할 정도로 전역변수는 문제시 되었다.\n\n그 시절엔 전역변수를 최대한 사용하지 않는게 일반적인 원칙이었다. 그래서 종종 function을 호출할 때 필요한 데이터나 참조를 모두 파라미터로 넘겨서 처리하곤 하였다. 그러다 보니, 프로그램이 성장해 나가면서 function 의 파라미터 선언부는 점점 길어질 수 밖에 없었다. 결과적으로 function의 선언이 복잡해 지거나, 경우에 따라서 필요없는 파라미터까지도 함께 넘겨야 하는 아쉬운 일이 종종 발생했다. 그래도 전역변수를 사용하는 것 보다는 낫다고 여겨졌었다.\n\n어두운 동굴과 음습한 터널을 지나 어느 사이엔가 객체 지향의 시대가 도래했다.\n(글쎄... 라며 반론할 수도 있겠지만, 적어도 객체지향 **언어**의 시대는 도래했지 않은가?)\n\n객체지향 언어는 기본적으로 '클래스'라는 개념의 **모듈화된 객체**를 전면으로 내세워 언어적으로 지원했고, 이로 인해 프로그램 전범위에 걸쳐서 동일하게 접근해야 하는 전역변수의 필요성은 드라마틱하게 줄어들었다. 객체는 자신이 필요한 자원을 자기 내부에서 소비하도록 유도되었기 때문에, 그리고 그렇지 않은 경우에는 다른 객체를 이용해서 처리하면 되었기 때문에, 기존에 절차언어에서 겪어야 했던 '전역변수'로 인한 간섭이 최소화 되었다.\n\n**'클래스에도 일종의 전역변수 같은 맴버변수(=field variable)가 있잖아요?'** 라고 물을 수도 있는데, 필드의 소유는 기본적으로 클래스(=모듈) 내로 한정되어 있다. 그리고 아주 기본적인 객체지향 원리를 준수함으로써, 맴버변수를 외부로 직접 오픈하는, 즉 public scope의 필드를 갖는 경우는 거의 만들지 않게 되었다. getter, setter 등을 이용하거나 특정한 접근메소드를 통해서만 한정적으로 접근가능하게 만들어 놓는게 일반적인 원리가 되었다. 따라서 한 클래스의 맴버변수의 값이 달라진다고 해서, 다른 클래스에서 받게 되는 영향은 극히 적다. 만일, 자신의 프로그램이 그렇지 않다면 객체지향 언어를 이용해 절차적으로 프로그래밍했기 때문일 가능성이 높다.\n\n어쨌든 프로그래밍 언어를 사용해 비즈니스적인 로직을 구현함에 있어, 로직에 필요한 자원을 생성하고 소비하는 부분이 객체 각각에게로 한정 위임되었기 때문에, 구현 복잡도가 줄어들었고, 작성도 보다 손쉬워 졌다. ( 절차언어에서 전역변수 하나가 나오면, 그 변수를 제대로 다루기 위해서는 참조 하는 모든 부분의 연관성을 따져보고 앉아 있어야 하는데, 일부분 라이브라리라도 함께 사용하게 되는 경우에는 끔.찍.하다는 표현이 절로 나오는 상황에 빠지게 된다) 하지만 그렇다고 해도 전역변수가 주었던 일부 장점은 여전히 매력적으로 보일때가 종종 있다.\n\n바로 **공용자원(public shared resource)에 대한 접근**이 그 중 하나이다.\n\n네트워크, DB, 외부파일 등등은 프로그램 내부 여기저기에서 참조되거나 호출될 필요가 있는데, 매번 객체를 생성한다던가, 연결을 만들고, 자원을 여는 작업을 각각하는 건, 매우 비효율적이면서, 그리고 그로 인한 새로운 문제점을 야기시킬 가능성이 높은, 더러운 짓(Dirty factor)이 된다. 따라서 이런 자원들은 단일 접근점을 통해서 여러 부분에서 이용될 수 있다면, 비용도 줄이고, 효율도 높일 수 있다. 일종의 '전역변수'같은 통로를 통해 접근하는 편이 나을 수 있다는 말이다.\n\nJAVA에는 이런 전역변수 형태의 접근을 가능하게 만들어 주는 static 이라는 키워드가 있는데, 이 키워드는 일반적인 클래스의 라이프 사이클을 넘어서는, 초 클래스적인 접근을 가능하게 만들어 주는 무시무시한 키워드이기도 하다.\n\n일반적으로 클래스의 변수나 메소드는 해당 클래스가 인스턴스화 되기 전에는 접근하거나 사용할 수 없는데, static 으로 선언된 변수나 메소드는 해당 클래스의 인스턴스화와 상관없이 바로 접근이 가능하고, 이용이 가능하다.\n\n클래스 안에 선언되어 있으나, 해당 클래스와 삶을 갖이 하지 않는 존재라...\n\n어찌보면 뜬금없을 수 있는데, 그래서 그나마 혼란을 줄여주는 최소한의 규칙이 하나 있는데 그게 바로 'static 에서는 non-static 에 대한 접근을 제한한다'는 규칙이다.\n\npublic class Game {   \n    public int score = 0;\n\n    public static void main(String[] args) {\n        score = 10;\n    }\n}\n\nCannot make a static reference to the non-static field score Game.java line 6\n\n\n컴파일하면 위와 같은 에러가 나온다.\n\n위와 반대의 경우, 즉 non-static 에서 static 호출은 에러는 아니가 경고(warning) 정도만 띄워준다. 그도 그럴 것이 static 은 인스턴스화와 상관없이 접근가능하기 때문에 non-static 으로의 접근시에는 해당 클래스가 인스턴스화가 안되어 있을 수 있기 때문에 에러가 나는 것이고, 그 반대는 당연히 인스턴스화가 이루어졌을 경우에만 해당 호출(= non-static에서의 호출)이 가능한 상황이 되기 때문에 에러까지는 아닌게 되는 것이다.\n\n어쨌든 이런 static 의 도움으로 인해 자바는 전역변수를 갖는 것이 가능해 졌다. 어디서나, 언제나 마음대로 접근 가능! 이를 응용해서 위에서 말한 공용자원 접근을 제공하는 방식으로 싱글톤(Singleton)이라는 것이 있다. 흔히 다음과 같은 형태로 구현된다.\n\n\npublic class Game {   \n    private int score;\n    private static Game game;\n\n    private Game(int score){\n        this.score = score;\n    }\n\n    public static Game getInstance(){\n        if( Game.game == null ){\n            game = new Game(10);\n        }\n        return game;\n    }\n\n    public static void main(String[] args) {\n        Game game = Game.getInstance();\n        System.out.println(\"game.getScore(): \" + game.getScore());\n        game.setScore(100);\n        System.out.println(\"game.getScore(): \" + game.getScore());\n        Game newGame = Game.getInstance();\n        System.out.println(\"newGame.getScore(): \" + newGame.getScore());\n    }\n\n    public int getScore(){\n        return score;\n    }\n\n    public void setScore(int score){\n        this.score = score;\n    }\n}\n\n-- 결과 --\ngame.getScore(): 10\ngame.getScore(): 100\nnewGame.getScore(): 100\n\n\n\n생성자를 private 으로 만들어서 new 로 생성할 수 없게 만들고, public static 메소드를 통해서만 객체에 접근 가능하게 만들어 준다.  getInstance() 메소드를 살펴 보면, 한 번 만들어진 Game 객체가 계속 유지되도록 유도하고 있는 걸 알 수 있다. 즉, 데이터베이스 연결이나 네트워크 연결등의 공용 자원 접근에 이런식의 static 응용을 하면 효율을 높일 수 있다.\n\n자, 그런데 이런 건 긍정적인 경우이고, 부정적인 경우를 생각해 보자.\n\n우선, 위 예제에서 보는 것 처럼 static 으로 접근하는 객체가 상태를 가지게 될 경우, 그 상태가 계속 유지된다는 점을 알 수 있다. 이게 큰 문제인데, 왜냐하면, 언제 어떤식으로, 어디에서 어떻게, 접근이 일어날 지 예측할 수 없는 static 이기 때문에 현재 상태를 가정할 수가 없다는 점이다.\n\n즉 static 객체의 상태에 내가 10을 대입했다 하더라도, 바로 그 다음 순간 그대로 10이 유지되리란 보장이 없다. 특히 자바의 장점으로 내세우는 멀티스레드 환경에서는 동시에 여기저기서 접근이 일어날 수 있기 때문에 더더욱 난감해진다.\n\n즉, 절차언어에서의 전역변수, 바로 그 유령이 되살아 나는 셈이다. (Return of the Jedi?)\n\n이런 이유로, TDD에서도 static method 나 static 변수를 테스트 하기 어려운 케이스로 꼽고 있다. TDD는 기본적으로 상태에 기반한 행위의 결과를 비교하는 경우가 많기 때문에, 상태가 시시때때로 변할 수 있다는 가정하에서는, 혹은 그런 환경을 구축한다는 것 자체도, TDD를 어렵게 만들거나 곧잘 신뢰할 수 없게 만드는 요인이 되기 때문이다.\n\n그럼 어떻게 하라구?\n\nstatic 은 최대한 안 쓰는게 답이다.\n\n에엣? 너무 무책임 한 것 아닌가?\n\nOK. 손에 쥔 돌을 놓으시길. :)\n\n다시 정리 하도록 하겠다.\n\n#1\\. Rule\nstatic 은 최대한 안 쓰는 게 답이다.\n\n#2\\. Rule\nstatic 을 쓸때는 상태를 저장, 혹은 변경하지 않는 방식으로 사용한다.\n\nMath.PI "
  },
  {
    "id": 120,
    "title": "Long Time No See",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1264437142000,
    "body": "> doortts | 2010-01-26 화요일 오전 1:32 | 이생각 저생각 | [원본](http://blog.doortts.com/120)\n\n1.\n마지막으로 포스팅한 글이 11월 중순이니까 대략 두 달 만에 글을 씁니다.\n글을 올리고 싶은 마음이 때때로 들었지만, 컴퓨터 모니터를 마주하기만 하면,\n마음의 여유가 사라져 버리곤 하였더랬습니다.\n\n:(\n\n 2.\n연말부터 시작해서 연초에 이르기까지, 마주하게 되는 사람들에게 종종 묻곤 했던 질문이 있습니다.\n\n\"스스로 재능이 있다고 생각되는 건 무엇인가요?\"\n\n\"하고 싶은 일은 무엇인가요?\"\n\n\"자신이 되고 싶은 모습이 있다면, 그건 무엇인가요?\"\n\n아마, 스스로는 대답을 찾지 못해서, 사람들의 이야기를 듣고 싶었던 것 같습니다.\n그리고 이 세 질문에 대한 답이 하나로 일치하는 사람을 만나보고 싶었던 것 같습니다.\n\n3.\n어줍잖게도 '글'을 쓰고 있습니다. 참, 쉽지 않더군요. 즐기던 일이, 약속잡고 해야 하는 일이 되니까, 점점 즐겁지가 않아져서 한 동안 고민했습니다. 이런식으로 어물쩡 하게 하다가는, 앗차하는 사이에 사회생활 접게 되는 거 아니냐 하는 걱정도 큽니다. 조만간 관련 내용을 공개하고 주변 사람들에게 도움을 청해야 할것 같습니다.\n\n4.\n올 한해는 세상과 더 소통을 할까? 아니면, 조용히 가정사에 충실할까 고민중입니다.\n둘 중 어느것이 되었든, 개인적으로는 올해를 '안식년'으로 삼기로 했습니다.\n회사 팀장님이 눈치채지 않도록 요령이 필요할 것 같습니다.\n내년까지 사무실 책상이 유지되길 바랍니다. :)\n\n#### Comments\n\n프로그램을 사랑하고 내가 잘 하는것 중에 하나가 개발이라는 사실을 우연찮게 알았습니다.\n\n대학을 입학하고 군대를 갔다오고서도 난 프로그램을 안할꺼라고 생각했습니다.\n\n학점이라도 잘 받아봐야겠다는 마음으로 군대 제대후 열심히 했습니다.\n\n그런데 이게 솔찬히 재밌습니다. 그래서 시간 가는 줄 모르고 대학 생활을 보냈고, 그 이후로도 지금 이일을 하고 있습니다.\n\n전 SQLGate 라는 DB 개발툴을 만드는 회사에 대표로 있습니다. 벌써 만든지가 7~8년 되어갑니다.\n\n\"스스로 재능이 있다고 생각하십니까?\"  라는 질문에는  \"천재적인 재능이 있습니다\"  라고 답합니다. 개발에 있어서만은요\n\n\"하고 싶은 일은 무엇입니까?  \"  제가 만든 제품을 사용자들이 돈내고 사는 행위를 보는 것입니다.\n\n\"자신이 되고 싶은 모습이 있다면 무엇인가요?\"  젊은 개발자와 용기를 내지 못하는 개발자들에게 힘과 용기가 되는 사람이 되고 싶습니다.\n\n저도 모르는 용기가 엄청 쏟아 오릅니다. 그 직원들 월급과 버그에 시달리지만 꿈과 희망에 다시 도전하고 있는절 사랑합니다.\n\n좋은 질문에 답변 드리고 싶었습니다 행복하세요\n\n [양용성](http://www.antwiz.com) | 2010-02-23 화요일 오후 2:38\n\n--\n"
  },
  {
    "id": 121,
    "title": "개발자의 두 부류, Platformer와 World Creator",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1268879508000,
    "body": "> doortts | 2010-03-18 목요일 오전 11:31 | 이생각 저생각 | [원본](http://blog.doortts.com/121)\n\n#1.\n영화'타짜'를 본적이 있는지 모르겠다. 개인적으로는 '우리나라에 이정도 오락영화가!!!'라고 느낄 정도로 잘 재밌게 봤다. 주인공 고니(조승우 분)는 소위 말하는 겜블계의 고수로 나온다. 주종목으로 고스톱이 나오는데, 좋은 머리와 다양한 스킬로 판을 지배한다. 그는 고스톱이라는 판 위에서 자신이 낼 수 있는 최고의 고효율을 내는 선수이다. 심지어 판의 흐름을 자신이 원하는데로 조종해나가기까지 한다. 하지만 그런 그도 넘을 수 없는 한계가 하나 있다.  고스톱이라는 게임과 그 룰 안에서만 움직일 수 있다는 점이다. 어떠한 경우에도 고스톱 규칙을 벗어날 순 없다. 하지만, 뭐, 그렇다고 불쾌해 하거나 기분나쁘게 생각하진 않을 것이다. 그 판위의 많은 사람들에게 이미 충분히 많이 칭송받고 있으니까.\n\n![타짜.png](/files/21766)\n\n일반적으로 플랫폼 위에서 생활하는 사람을 플랫포머(platformer)라고 한다. 개발자는 기본적으로 다중 플랫포머이다. OS도 선택하고, 개발언어도 선택하고, 요즘에는 프레임워크도 선택한다. 내가 아는 뛰어난 엔지니어들은 고효율 플랫포머이다. 각자의 영역에서 판 위의 다른 선수들 보다 효율이 높다. 머리도 좋고, 열의도 있고, 재능도 있다. 뛰어난 개발자가 된다. 창의적으로 문제를 풀고 숨겨진 비기를 시전한다.\n\n#2.\n하지만, 그들을 포함해 우리가 개발에 사용하는 기술 중에서, 우리가 만든 것은 무엇이 있을까 생각해 봤다. 아쉽게도 플랫폼이라고 할 만한 것은 쉽게 떠오르지가 않았다. 좀 이상하다고 생각한 적은 없는가? 우리가 쓰는 대부분의 기술이 외국에서 들어왔다. 깜짝 놀랄만큼 신기하고 복잡한 기술도 많지만, 개중에는 '앗차!'싶을 정도로 단순한 것들도 있다. 외국의 개발자와 우리나라 개발자가 서로 해결해야 하는 문제가 완전 판이해서 생긴 현상은 아닐것이다. 같은 문제를 겪었을 것이고, 같은 불편함을 느꼈을 텐데, 우리는 대부분이 follower이고 platformer라는 점은 매우 아쉽다. 우리의 문화와 자세에 문제가 있는게 아닐까 하는 생각이 들었다.\n  #3\n우리나라는 다른 나라보다 follower의 경향이 더 두드러진것 같다. 모르긴 몰라도, 특정 영화 하나를, 석달쯤 사이에 국민의 1/4이 보는 나라가 많지는 않을것이다. 개발자들도 비슷한 경향을 많이 본다. 새로운 기술을 빨리 받아들이는데는 뛰어나지만, 자신의 기술을 만드는 능력은 부족해 보인다. 자신의 개성을 새로운 기술을 사용하거나 용어를 받아들이는 걸로 표현하는 수준의 개발자는 있지만, 서툴더라도 스스로 만들어 내서 그걸 개성으로 표현하는 경우는 많지 않다. 설사 있더라도 체계적으로 공개하거나 함께 공유하진 않는다. 개개인의 문제라기 보다는 문화와 감성이 준비되어 있지 않다고 하는게 더 정확할 것 같다. 이 글을 쓰는 본인도 예에서 벗어나지 못한다는 것이 또한 아쉽다.\n![아바타.jpg](/files/21765)\n\n#4\n이렇게, 남들이 만들어 놓은 판 위에서 열심히 재능과 시간을 쏟고 있다고 생각하니 조금은 씁쓸해 졌다. 이상한 반골기질로 '남들이 만든 플랫폼 위에서 생활하기 싫어!!' 라고 말하고 싶은건 아니다. '차라리 새로운 세상을 만들어라!'라고 말하고 싶은 것도 아니다. 내가 말하고 싶은 건, follower가 되는 사람의 고단함과 아쉬움이다. 대부분의 follwer는 자신의 플랫폼위에서 전문가가 되지 못한다. 해결할 수 없는 근본적인 이유는, 자신이 플랫폼을 만들지 않았기 때문이고, 그것을 제외한 제일 큰 이유는 플랫폼의 '의미'를 잊어버기 때문이다.\n\n#5\nXBOX360과 닌텐도Wii와 소니 플레이스테이션3(PS3)의 게이머들중 상당수는 자신의 플랫폼위에서 나오는 게임과 타 플랫폼의 게임의 차이로 인해 스트레스를 받는다.  아마 새로운 게임 플랫폼이 나오면 그로 인해 또 스트레스를 받게 될 것이다. 그게 플랫포머의 한계다.\n![god_war_3.jpg](/files/21764)\n\n#6\n'아내가 결혼했다'라는 소설의 주인공은 '축구'를 매우 좋아하고, 그 분야의 나름 전문가이기 때문에 세상을 축구를 통해 바라본다. 다양한 비유가 등장하는데, 나름 들어맞는다. 때로는 조금 억지스럽기도 하지만, 나쁘지 않게 들어 맞는다. 비슷하게 개발자들도 자신 몸담고 있는 플랫폼위에서 자신의 문제현상을 해결하기 위해 노력한다. 플랫폼으로 해결하지 못하면 괴로워하게 되고, 어느 수준에 이르면 더 나은 플랫폼을 찾아서 떠난다. 자신이 몸담고 있던 플랫폼을 뒤로 하고 말이다.\n\n#7\n대부분의 플랫포머는 한계가 온다. 열심히 파랑새를 쫓으며 자기 자신을 비효율적으로 소모해 버리기 십상이다. 쫓고 쫓고 또 쫓다보니 그저 피곤해질 뿐이다. 다 필요없어! 라고 말하거나, 좋은게 좋은거지.. 식으로 되버리면서 열정을 잃어 버린다. 아주 잘 풀리면, 취미로 남는게 고작이다. 그 한계를 넘어설 방법 하나는, 세상을 만드는 사람이 되는 것이다. 그게 바로 World Creator이다.\n\n#8.\n그래서, 난 이제부터 개발자, 좀더 고상한 표현으로 SW엔지니어를 platformer와 world creator로 구분해야겠다고 마음먹었다. 각 영역에서 뛰어나고 안 뛰어나고는 두 번째 문제로 보고 말이다. 그리고 앞으로는 주변에서 world creator를 더 많이 볼 수 있었으면 좋겠다고 생각했다. 왜냐하면, 더 훌륭하기 때문이 아니라 더 희귀하기 때문이다. 그리고 플랫포머의 한계를 넘는 가능성을 만들어 나갈 사람이기 때문이다.\n\nPS\n만일 고스톱이라는 게임을 만든사람이 명백하고, 현재 살아있다면 어땠을까?라고 생각해 본다. 고효율 플랫포머와는 또 다른 방식으로 높게 칭송받았을 것이다. 하나의 산업과 문화를 만들어낸 어떤 창조자(world creator)로 말이다.\n\n#### Comments\n\nTDD 검색 중 들르게 되었습니다. 재미있는 글이 많네요. 한 가지, 고니가 탁월함을 보인 도박 장르(?)는 섰다 입니다...\n\n [lump3n](http://lump3n.com) | 2011-09-07 수요일 오후 11:38\n\n--\n",
    "attachments": [
      {
        "id": 21764,
        "name": "god_war_3.jpg",
        "hash": "d4a16e39387aef7673f0e5894e9f573ab68c3a92",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 70296,
        "containerId": "12294"
      },
      {
        "id": 21765,
        "name": "아바타.jpg",
        "hash": "d44d2794bd005cdc95f28e88a360de637746b627",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 174694,
        "containerId": "12294"
      },
      {
        "id": 21766,
        "name": "타짜.png",
        "hash": "22ba624920cfe5ee01ffb33263e1c0fddc51edd1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 343532,
        "containerId": "12294"
      }
    ]
  },
  {
    "id": 122,
    "title": "좋은 소프트웨어를 만드는 어떤 방식 하나, 테스트 주도 개발 (Test-Driven Development) : (상편)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1271064399000,
    "body": "> doortts | 2010-03-30 화요일 오후 6:28 | Better SW Development | [원본](http://blog.doortts.com/122)\n\n소프트웨어를 만든다는건 공학(Engineering)인가, 예술(Art)인가?\n\n이 두 의견의 충돌은 호사가들의 입을 통해 오랫동안 이어저 오는 논쟁꺼리에 해당한다.\n\n이 논쟁에 '경제'개념까지 추가해서는 '산업'까지도 선택지 사이에 끼어들게 되면 '우리가 하는 일은 대체 어느 영역인가?'라는 혼란스러운 마음이 든다. 하지만, 이런저런걸 다 차치하고, 공학이 되었든 예술이 되었든, 아니면 장사가 되었든 공통적으로 추구하는 것이 하나 있다면, '제대로 동작해야 한다'는 목표다.\n\n![3_moffcalc.jpg](/files/21768)\n[아주 편리한 무료 계산기. 마이크로소프트 제품 아님!]\n\n그런데 소프트웨어를 '제대로 동작하게 만든다'라는 말은 축구 감독이 선수들에게 '다른건 신경쓰지 말고 편하게 커다란 골대안에 공만 넣으면 돼! 기둥 맞추는건 어려우니까 왠만하면 시도하지 말고!'라는 주문 만큼이나 단순하지만 어려운 이야기다. '제대로 동작하는 소프트웨어를 만든다'라는 말에는 너무 많은 혼돈의 요소(Chaos Factor)들이 문장표현의 바깥 부분에 잠재되어 있기 때문이다.\n\n솔직히 개발자들 중에서 자신이 만드는 소프트웨어를 잘 만들고 싶어하지 않은 사람이 있을까?  '난 시간도 무진장 들이고 돈도 잔득 써서 세상에서 제일 쓰레기 같은 소프트웨어를 만들거야!'라고 말하는 개발자는 없다. 다들 잘만들고 싶어한다. 잘하고 싶은데 안되는 것일 뿐이다.\n\n왜?\n\n소프트웨어라는게 이름만 소프트하고 실제로는 안 소프트 하니까...\n\n즉... 잘 돌아가는 좋은 소프트웨어를 만든다는게 아.주. 어려우니까...\n\n좋은 소프트웨어를 만드는 건 정말 어렵다. 모두가 원하지만, 거의 잘 안되는 영역중 하나다. 좋은 소프트웨어를 만들기 위해서는, 기본적으로 배워야 할 것이 너무 많다.\n\n프로그래밍 언어부터 시작해서 각종 공학이론까지, 배워야 할 것도 많고, 해봐야 하는 것들도 많다. 사실, 이러저러한 것들을 한참 동안 배워도 배워도 어떻게 써먹어야 할지 막막할 때가 많다. 하다못해 넉넉한 시간과 경제적 여유가 있다면, 차분히 생각을 정리해 나가면서 조금씩 만들어 나갈텐데, 그런게 가능한 상업 프로젝트는 들어본 기억이 없다.\n\n소프트웨어 개발 대부분의 경우에 있어,\n\n취미로 만들면 취미로 만들기 때문에 위대한 소프트웨어가 되질 못하고, 자본과 사람이 많이 들어가면 소프트웨어 자체가 복잡해지는 바람에 또 위대한 소프트웨어가 되지 못한다. 그래 결국 대부분은 목표를 낮춰 낮춰서 그저 '잘 돌아가는 소프트웨어로만 만들자'라는 소박한(걸로 착각하는) 목표만 세우곤 하는데, 그건 착각에 착각이다.\n\n수비고 공격이고 이젠 다 신경쓰지 말고,\n상대편 골대안에 골만 넣어! 그냥 그렇게 하면 돼!\n\n이런 느낌의 목표라는걸 잘 몰라라한다.\n이 경우 대부분 한 두 골을 더 먹는게 일반적인 수순이다.\n\n살짝 도메인을 벗어나서\n좋은 자동차는 어떤 자동차를 말하는 걸까 생각해 보자.\n\n![supercar.jpg](/files/21769)\n\n우선, 잔고장 염려 없이 꾸준히 주행가능한 차가 좋은차의 1순위 중 하나일 것이다.\n그리고 모양이 좋아야 한다.\n그리고 운전자가 자동차를 편하게 이용할 수 있어야 한다.\n\n모양이 좋아야 한다? = 디자인\n편하게 이용할 수 있어야 한다? = 사용자 경험.\n잔고장 염려 없이 주행가능한 차? = 좋은 설계가 바탕이 되는 탄탄한 내부구성\n\n자동차가 가지는 최소한의 목적은 위 세 개중 마지막에 해당할 것이다.\n그럼 마지막을 이루기 위해서 필요한 가장 기본 조건은 무엇일까?\n\n아마, '신뢰도 높은 부품을 쓴다'가 가장 기본이 될 것이다.\n\n나는 소프트웨어도 마찬가지라고 생각한다.\n좋은 설계와 좋은 소프트웨어를 이루기 위해서는 좋은 부품(=모듈)이 밑 바탕에 자리잡고 있어야 한다.\n\n![blot.png](/files/21767)\n\n다행히도, 이런 방식을 추구하는 개발 방식이 소프트웨어 개발 기법중에 존재한다.\n나온지도 이제 십수년을 넘겼고, 뛰어난 개발자들은 기본으로 사용하고 있고,뛰어난 개발자가 되고 싶어하는 더 많은 수의 개발자들은 이 기법을 잘 사용하기 위해 노력하고 있다.\n\n바로\n\n'테스트 주도 개발(Test-driven Development, 이하 TDD)'이라고 불리는 개발 방식이다. 이 방식은 '단위 테스트 케이스'라는걸 먼저 만들어 놓고, 해당 테스트를 통과하는 코드를 작성하는 형태로 프로그램을 만들어 나간다. 코드를 작성하기 전에 테스트 케이스를 작성해 놓고, 이를 통해서 개발을 이끌어 나간다.\n\n이렇듯, 테스트가 개발 단계별 진행을 주도적으로 이끌어 나가기 때문에, 테스트 주도 개발이라고 불린다.\n\n이 방식은 모듈의 특성을 미리 정해놓고 개발하기 때문에, 목표로 하는 한계치와 경계값을 만족시키는 모듈이 작성과 함께 만들어지고, 변경이 가해지는 순간 순간이 만들어 놓은 테스트 케이스를 통해 점검 가능하게 된다. 그것도 아주 자연스럽게 말이다.\n\n부끄러운 이야기지만,\n난 회사내에서 분석설계 관련 과목과 디자인 패턴, 리팩터링등의 과목을 여러해 강의해 왔고, 요즘에는 애자일 기법을 사내에 전파하는 일을 한다.\n\n그런데 수년 동안의 그 과정 안에서,\n\n테스트주도개발이라는 기법은 아주 쉽게 시작해서 너무 많은 걸 얻을 수 있는 훌륭한 기법이라는 걸,\n시간이 지날수록 점점 더 크게 느끼게 되었다.\n\n(안타깝게도 많은 개발자들이 주로 글자로만 배우게 되는)상당수의 객체지향의 기본원리들이 TDD를 배우게 되면, 접근과 이해의 방식이 달라진다.\n\n말하자면, 추상화, 응집도 증진과 커플링감소, 관심의 분리(SOC, Separation Of Concerns), 인터페이스에 의한 개발, 의존성격리 등등의 원리들이 그림과 글자로 배워서 말그대로 머릿속에 추상화되어 남는게 보통인데, TDD를 하면 개발도중에 자연스럽게 몸에 익혀진다.\n\n왜? 테스트 케이스를 쉽게 만들려면 어쩔수 없이 코드의 모양이 객체지향 원칙을 추구하게 된다.\n\n심지어 객체지향 원칙을 모른다 할지라도 말이다.\n\n이를테면, 하나의 모듈이나 메소드가 많은 일을 하면 테스트 케이스를 만들기 어렵거나 복잡해 진다. 그럼, 자연스럽게 분리하려고 노력하게 된다. 또, 테스트 케이스는 한 번에 하나씩에 대해서만 만들도록 권장하는데, 그럴려면, 집중해야 하는 것이 무엇인지 관심영역이 어디인지 고민할 수 밖에 없다. 그리고, 모듈간의 커플링이 늘면 테스트 준비과정이 복잡해 진다. 없앨수 있는걸 찾거나 정 안되면 Mock을 들이민다. 처음엔 Mock의 신기함으로 시작하지만, 결국은 Mock 이 많아지면, 것도 힘들어진다는 걸 발견하면서 의존성이 주는 폐혜를 깨닫게 된다. 그 단계쯤 되면 '의존성을 가급적 줄여서 프로그램을 짜야겠다!'고 마음먹게 된다.\n\n대충 예를 들었지만 이런식이다.\n\nTDD 방식으로 개발하면 일반적인 경우보다 훨씬 간결하게 프로그램이 작성된다.\n\n가끔 테스트 케이스 자체를 복잡하게 만들어서 TDD의 취지를 무색하게 하는 경우도 있지만, 그건 머리좋은 소수에 해당한다. 초반에 잘만 가이드 해주면 대부분은 잘 작성한다.\n\n이제부터는 진짜 부끄러운 이야기에 해당한다.\n(사실 쓰려니 손발이 조금 오그라...)\n\n난 켄트 벡의 '테스트주도 개발(TDDBE)'책을 5번 샀다.\n\n좋은 음악을 들으면 함께 듣고 싶은 마음처럼, 다 읽고는, 옆 사람에게 줬다.\n그러다 시간이 지나 기억이 잘 안날때 쯤이면 다시 사서 읽었다.\n그리고 또 관심보이는 옆 사람에게 주었다.\n\n(후진 기억력이 크게 일조했지만) 그런식으로 해서 같은 책을 5번이나 사서 읽었다.\n\n그런데, 어느날 충격을 받았다.\n\n내가 책을 주었던 어느 누구도 TDD를 업무에 적용하지 않는 것이다.\n\n왜??\n\n이유를 물어봤다.\n\n..\n--- (하)편에서 계속.....\n\n하편 : [http://blog.doortts.com/124](http://blog.doortts.com/124 \"[http://blog.doortts.com/124]로 이동합니다.\")\n\n\n\n#### Comments\n\n어려운 고민을 재미있게 풀어주시네요^_^\n다음 편이 너무 기대됩니다.\n\n [땡초](http://blog.powerumc.kr) | 2010-04-12 월요일 오후 8:48\n\n--\n\n빨리 하편을 올려주세요. (앗! 다음은 중편인가요?)\n궁금합니다.\n\n soy | 2010-04-13 화요일 오후 6:44\n\n--\n\n읽어주셔서 감사합니다. 조만간 올리겠습니다.\n\n [doortts](http://blog.doortts.com) | 2010-04-13 화요일 오후 10:19\n\n--\n\n아~ 드라마처럼 중요한 순간에서 끊겼군요 ㅠ..ㅠ\n\n [Outsider](http://blog.outsider.ne.kr) | 2010-04-16 금요일 오전 11:55\n\n--\n\n하편이 궁금해지는 군요..\n아마도 시간이 그이유중에 하나겠죠.. ㅠㅠ..\n\n 꾸르릉 | 2010-04-17 토요일 오후 9:29\n\n--\n\n안녕하세요 좋은 글 잘 읽었습니다!\n\n말씀하신 \"제대로 동작하는 소프트웨어\"가 Agile에서 선택한 가치(Value)중 하나였습니다. ^^ 겉만 뻔지르 하고 제대로 동작할 것 같이 보여주는 문서보다는  \"실제 동작하는 소프트웨어\"에 더 큰 가치를 둔 거죠.\n\n아마 그런 이유와 말씀해 주신 부분들 때문에 Agile에서 TDD를 아주 중요하게 생각하고, 추천하는 것 같습니다.\n\n다음 글도 기대하겠습니다. ^^/\n\n [kwangshin](http://kwangshin.pe.kr) | 2010-04-27 화요일 오후 4:14\n\n--\n\n좋은 글 감사합니다 :)\nTDD는 정말 너무 너무 너무 너무 어려운 것 같아요.\n켄트 백의 글만 봐서는 참 쉬워보이는데... 직접 해보려니 참;; T.T\n다음 편 기대중입니다 :)\n\n [곰세](http://gommse.net) | 2010-04-30 금요일 오전 9:48\n\n--\n\n하편 계속 기다리는 중입니다. ㅋㅋㅋ\n\n 야옹 | 2010-10-16 토요일 오전 11:59\n\n--\n\n재밌네요.\n뒷 내용이 궁금해짐..ㅎㅎ\n\n 뉴와이 | 2010-11-28 일요일 오전 5:42\n\n--\n\n아니.. 스폰서 광고 caffe bene 나올것 같은 이 결말은..\n\n하편이 너무 궁금하군요\n\n 오리발 | 2011-05-20 금요일 오전 9:28\n\n--\n",
    "attachments": [
      {
        "id": 21767,
        "name": "blot.png",
        "hash": "adf1bbc9bfe666aa021f211775baf1b95718af7b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 52613,
        "containerId": "12295"
      },
      {
        "id": 21768,
        "name": "3_moffcalc.jpg",
        "hash": "72fa04f6fcc7a3d2a3577a195bc41c6974b7955b",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 34776,
        "containerId": "12295"
      },
      {
        "id": 21769,
        "name": "supercar.jpg",
        "hash": "775e0d07601ef07a9e73f248dc9a153f69a52f2a",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 62808,
        "containerId": "12295"
      }
    ]
  },
  {
    "id": 123,
    "title": "TDD 안티패턴(Anti-pattern), 전통적으로 잘못 인식되어 있는 테스트 메소드의 리팩터링",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1272167457000,
    "body": "> doortts | 2010-04-25 일요일 오후 12:48 | Better SW Development | [원본](http://blog.doortts.com/123)\n\n* 내용 논의를 위해 올렸습니다. 책의 일부분이라 문맥적으로 다소 어색할 수 있습니다. :) *\n\n\n\n기본적으로 좋은 테스트 케이스는 다음과 같은 규칙을 따른다고 말했다.\n\n\n\n| \n\n- 하나의 테스트 케이스는 외부와 독립적이어야 한다.\n\n따라서, 다른 테스트 케이스에 영향을 주거나 받지 않아야 한다.\n\n- 하나의 일관된 시나리오를 갖고 있어야 한다.\n\n |\n\n\n\n그런데 우리가 테스트 케이스 정련 작업을 할 때 종종 이 항목을 묘하게 위반하곤 한다. 이제 와서 고백하건대, 본인도 앞에서 마찬가지 작업을 했다. 다만, 한꺼번에 설명하는 것이 부담스러웠고, 다소 논란의 소지가 있는 내용이기에 이 부분까지 미뤘다. 여기까지 왔다면, 당신은 그게 무엇인지 들을만한 자격이 있다. :)\n\n\n\n다음 코드에 대해 다시 한번 살펴보기 바란다.\n\n\n\n| \n\n**public**  **class** AccountTest {\n\n **private** Account account;\n\n      \n\n @Before\n\n **public**  **void** setUp(){\n\n account = **new** Account(10000);\n\n }\n\n      \n\n @Test\n\n **public**  **void** testDeposit() **throws** Exception {\n\n account.deposit(1000);\n\n _assertEquals_(11000, account.getBalance());\n\n }\n\n      \n\n @Test\n\n **public**  **void** testWithdraw() **throws** Exception {\n\n account.withdraw(1000);\n\n _assertEquals_(9000, account.getBalance());\n\n }\n\n}\n\n |\n\n어느 부분이 미묘하다고 이야기 하려는 걸까?\n\n\n\n출금하기(withdraw)를 테스트 하는 메소드를 살펴보자.\n\n\n\n| \n\n @Test\n\n **public**  **void** testWithdraw() **throws** Exception {\n\n account.withdraw(1000);\n\n _assertEquals_(9000, account.getBalance());\n\n }\n\n\n\n |\n\n\n\n테스트 메소드는 하나의 일관된 시나리오를 갖고 외부에 독립적이어야 하는데, 이 부분만으로는 시나리오가 연결성을 갖지 않는다. setUp을 함께 살펴봐야 문맥적으로 하나의 정상적인 테스트 시나리오가 만들어진다.\n\n\n\n| \n\n **private** Account account;\n\n      \n\n @Before\n\n **public**  **void** setUp(){\n\n account = **new** Account(10000);\n\n }\n\n @Test\n\n **public**  **void** testWithdraw() **throws** Exception {\n\n account.withdraw(1000);\n\n _assertEquals_(9000, account.getBalance());\n\n }\n\n |\n\n\n\n이건 AccountTest클래스 내의 다른 테스트 케이스의 경우도 마찬가지이다. 앞 테스트 코드는 안타깝지만, 다음과 같이 적는 것이 문맥적으로는 오히려 더 적절하다는 생각이 든다.\n\n\n\n| \n\n**public**  **class** AccountTest {\n\n\n\n @Before\n\n **public**  **void** setUp(){\n\n }\n\n      \n\n @Test\n\n **public**  **void** testDeposit() **throws** Exception {\n\n Account account = **new** Account(10000);\n\n account.deposit(1000);\n\n _assertEquals_(11000, account.getBalance());\n\n }\n\n      \n\n @Test\n\n **public**  **void** testWithdraw() **throws** Exception {\n\n Account account = **new** Account(10000);\n\n account.withdraw(1000);\n\n _assertEquals_(9000, account.getBalance());\n\n }\n\n}\n\n\n\n |\n\n\n\n'Account 생성이 중복이잖아요!!'라고 항의를 할 수도 있다. 알고 있다. 중복되는 부분이 존재한다.\n\n'아..지금 무슨 소리세요? 중복은 나쁜거고.. 나쁜냄새로 불리며, 버그를 쉽게 만들어 내고, 또..'\n\n\n\n맞는 말이다. 하지만, 테스트 케이스 코드는 접근이 조금 다르다. 정련 시에 중복을 제거하는 것은 맞는데, 그 중복되는 부분이 테스트 시나리오의 일부라면 조금 고민해 볼 필요가 있다. 비록 중복이 되었지만, 각각 독립된 테스트 시나리오에 해당하는 위의 두 테스트 메소드는 앞선 경우보다 가독성이 더 높다. 왜냐하면, 테스트 메소드가 하나의 문맥 측면에서 완결성을 갖기 때문이다.\n\n\n\n그럼 setUp과 tearDown같은 테스트 픽스처 메소드는 언제 사용할까? 테스트 시나리오에 참가하고 있는 객체들에게 테스트에 필요한 사전 조건이나 기반 환경을 제공할 때 사용하는 것이 더 어울린다. 이를 테면 다음과 같은 가상의 코드가 그 예에 해당한다.\n\n\n\n\n\n| \n\n**public**  **class** AccountTest {\n\n\n\n Connectoin conn;\n\n\n\n @Before\n\n **public**  **void** setUp(){\n\n conn = manager.getConnection();\n\n Transaction.start(conn);\n\n }\n\n      \n\n @Test\n\n **public**  **void** testDeposit() **throws** Exception {\n\n Account account = **new** Account(10000);\n\n account.deposit(1000);\n\n _assertEquals_(11000, account.getBalance());\n\n }\n\n      \n\n @Test\n\n **public**  **void** testWithdraw() **throws** Exception {\n\n Account account = **new** Account(10000);\n\n account.withdraw(1000);\n\n _assertEquals_(9000, account.getBalance());\n\n }\n\n\n\n @After\n\n **public**  **void** tearDown(){\n\n Transaction.end(conn);\n\n }\n\n}\n\n\n\n |\n\n\n\n테스트 시나리오를 진행하기 위해서 선행되어야 하는 환경과 정리작업에 해당하는 부분을 setUp과 tearDown으로 분리해 놓았다. 그리고 테스트에 필요한 테스트 재료는 각각의 테스트 메소드에서 준비했다.  중복된 코드는 리팩터링의 대상이 되는 것이 맞지만, 테스트 케이스를 작성할 때는 조금 더 고민해 보는 시간이 필요하다.\n\n\n\n  \n\n**추가 논의**\n\n위 내용은 다소 논란의 여지가 있는 부분이라 생각되어 애자일 커뮤니티인 XPer 메일링리스트([http://groups.google.com/group/xper](http://groups.google.com/group/xper))에 본 절의 제목과 내용을 그대로 올렸습니다. 논의된 의견 중, 박영록님과 김창준 대표님의 답변은 많은 분들과 공유할 만 한 좋은 접근법이라 생각되어 코드를 정리해 옮겨봅니다.\n\n\n\n| \n\n @Test\n\n **public**  **void** testWithdraw() **throws** Exception {\n\n account = prepareTenThousandAccount();\n\n account.withdraw(1000);\n\n _assertEquals_(9000, account.getBalance());\n\n }\n\n\n\n **private** Account prepareTenThousandAccount() **throws** Exception {\n\n return **new** Account(10000);\n\n }\n\n\n\n |\n\n[중복을 제거하기 위해 테스트 픽스처 생성 부분을 메소드로 추출한 박영록님의 테스트 코드]\n\n\n\n| \n\n **public** **class** BaseAccountWithDeltasTest {\n\n  **private** Account account;\n\n  **private**  **int**  base, delta;\n\n\n\n  @Before\n\n  **public**  **void** setUp(){\n\n  base = 10000;\n\n  delta = 1000;\n\n  account = **new** Account(base);\n\n  }\n\n\n\n  @Test\n\n  **public**  **void** testDeposit() **throws** Exception {\n\n  account.deposit(delta);\n\n  assertEquals(base+delta, account.getBalance());\n\n  }\n\n\n\n  @Test\n\n  **public**  **void** testWithdraw() **throws** Exception {\n\n  account.withdraw(delta);\n\n  assertEquals(base-delta, account.getBalance());\n\n  }\n\n }\n\n\n\n |\n\n[최대한 중복이 줄어들어서 마치 템플릿코드처럼 동작하는 김창준님의 테스트 코드]\n\n  \n\n본 내용은 XPer 메일링 리스트에서도 이야기중에 있습니다. \n\n해당 글은 [여기](http://groups.google.com/group/xper/t/876ec0b90a43c8b7 \"[http://groups.google.com/group/xper/t/876ec0b90a43c8b7]로 이동합니다.\")에서 볼 수 있습니다.\n\n#### Comments\n\n김창준님의 방법은 중복을 제거하는데는 훌륭하지만, \ndeposit 내부에 다소 복잡한 계산식이 존재할 경우는 결국 구현한 루틴과 동일한 루틴을 테스트 코드에 넣어서, \n(위 코드에서는 단순히 + 연산자 1개만을 사용했지만요) 버그가 드러나지 않는 문제도 발생할 수 있을 것 같습니다.\n(양 쪽 계산식 모두에 결함이 있어서 정합성이 맞아버리는...)\n\n이런 문제를 회피하기 위해서는 어떻게 테스트 코드를 작성하는 게 좋을까요?\n\n [Gloridea](http://blog.gloridea.net) | 2010-06-21 월요일 오후 9:57\n\n--\n\n네. 이야기 주신 우려도 생길 수 있을 것 같습니다. \n\n다만, 본 예제에서 창준님께서 작성하신 코드의 경우는, 단위 테스트 케이스 시나리오에서 Fixture 생성부분을 좀 더 유연하게 분리하려는 노력으로 보시는 것이 맞을 것 같습니다. + 나 -가 붙은 부분은 deposit 구현이 아니라 재료를 준비하는 과정이었습니다. \n\n(혹시 창준님이 보시고 답글을 남겨 주시려나 모르겠네요. :)\n\n어쨌든, 좋은 의견 감사합니다. 위 글을 보는 다른 분들께도 도움이 될 것 같습니다.\n\n그럼 좋은 하루 되세요!\n\n [doortts](http://blog.doortts.com) | 2010-06-22 화요일 오후 6:55\n\n--\n"
  },
  {
    "id": 124,
    "title": "좋은 소프트웨어를 만드는 어떤 방식 하나, 테스트 주도 개발 (Test-Driven Development) : (하편)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1287839427000,
    "body": "> doortts | 2010-05-06 목요일 오후 3:55 | Better SW Development | [원본](http://blog.doortts.com/124)\n\n- [상편](http://blog.doortts.com/122 \"[http://blog.doortts.com/122]로 이동합니다.\")에 이어서-\n\n(후진 기억력이 크게 일조했지만) 그런식으로 해서 같은 책-테스트주도 개발(TDDBE)-을 5번이나 사서 읽었다.\n그런데, 어느날 충격을 받았다.\n내가 책을 주었던 어느 누구도 TDD를 업무에 적용하지 않는 것이다.\n 왜??\n\n이유를 물어봤다.\n물어본 사람들은 각자 몇 가지의 이유를 댔다.\n\n \n\n1.  이상적인 이야기잖아요? 실제 프로젝트에서는 그런거 할 시간 없어요.\n\n2.  어렵더라구요. 막상 적용해 보려면 뭐부터 어떻게 해야 할 지 모르겠어요.\n3.  혼자서 좀 해보긴 했는데, 주변에서 하는 사람도 없고 그러다 보니 지쳐서..\n4.  적용해 보자고 했더니 관리자가 Best Practice 사례를 보여 달라고 하더라구요. -_-;; \n\n등등등...\n \n맞는 말이다. TDD는 쉽지 않다. 정확히 말하자면 기초를 배우기는 쉬운데 잘하기는 어렵고, TDD가 일상이 되고 습관이 되기는 훨씬 어렵다. 해야하는 이유보다 하지 못할 수 밖에 없는 이유를 대기도 더 쉽다.  대부분은 이런저런 이유로 포기하게 된다. 게다가 TDD를 적용해서 일을 하려면 동일한 작업을 하는데에 있어 평소보다 더 많은 노력이 들어간다. 익숙하지 않다면, 그리고 본인이 프로그래밍 자체를 즐기는 스타일이 아니라면, 30%쯤 시간이 더 든다고 생각하면 된다. 3달 걸릴 일이 4달쯤 걸릴거다. \n이렇게 이야기하면 마치 TDD를 하지 말라는 얘기처럼 들릴 것 같다. 하지만 그렇지 않다. 원래 뭐든 포기해 버리면 쉬운 법이다. 하지만, 성공하는 사람이나 조직은 어려움을 포기하지 않는 사람이나 조직이다. 어줍은 조언일런진 모르겠지만 이런말을 해주고 싶다. \n\n\n온갖 어려움이 있겠지만, 그래도 자신이 하는 일을 더 잘하고 싶고, 스스로가 더 발전하고 싶다는 욕망이 있는 엔지니어라면 TDD를 꼭 해봐야 한다.\n\n\n\n남들과 똑같이 하고도 더 뛰어난 사람이 되거나 더 좋은 소프트웨어를 만들 수 있다고 생각한다면 그건 '사행심'이다. 잘 하고 싶으면 더 노력해야 한다. 더 잘 만들고 싶으면 남다른 노력들 수 밖에 없다.\n\n소위 말해 '투자'를 해야 한다. (팀 차원에서 이루어진다면 좋겠지만, 안된다면 개인차원에서라도!)\n\n예전에 누군가가 내게 해준 말이 하나 있는데 이런 시점에선 가끔씩 기억이 난다.\n\n프로는 경기중에 연습하지 않는다.\n\n\n전문가는 프로고 우리가 지향하는 방향도 프로다. 하지만 우리는 여러가지 이유로 연습은 하지 않고 경기만 한다. 때로는 연습할 시간이 없어서이기도 하고, 돈이 없어서이기도 하고, 연습을 도와줄 사람이 없어서 고독하거나, 아니면 연습한다고 꼭 잘하게 되는것 같지도 않는 것처럼 느껴서일 수도 있다. 이런저런 이유는 많다. 하지만, 연습하지 않고 경기만 한다면, 시간이 흐를수록 본인의 경기는 점점 지리지리 흐느적 해지기 마련이다. 좋은 경기를 만들고, 좋은 작품을 남기고, 좋은 소프트웨어를 만들려면 노력이 필요하다. 단언컨데 TDD는 그런 노력들 최고 중 하나가 되기 충분하다. \n(참고 : [테스트주도개발(TDD)를 배워야 하는 이유, TDD를 이야기 하는 이유)](http://blog.doortts.com/131 \"[http://blog.doortts.com/131]로 이동합니다.\") \n![Brewers VS Cubs.jpg](/files/21806)\n[경기에 사용하는 도구에 피가 묻을 정도로 연습한 적이 있나요?]\n\n어떻게 하면 그럼 TDD를 좀 더 잘 할 수 있을까?\n\n\n\n1.  교육을 받자. - 찾아보면 TDD교육들이 있다. 정부지원 과정중에도 TDD 과정이 있는걸로 알고 있다. 정 안되면 본인을 불러도 된다. :) 교육은 짧은 시간내에 쉽게 지식을 전승받을 수 있는 좋은 방법이다.\n\n2.  함께 할 사람을 찾는다. - 찾아보면 TDD를 하고 싶어하는 엔지니어들이 적지 않다. 그리고 가능하다면 짝프로그래밍으로 함께 해보자. 장담컨데 효과는 배가 된다.\n\n3.  책을 읽자.  - 시중에 괜찮은 책들이 몇 권 있다. 개인적으로 느끼는 난이도 순서는 다음과 같다.\n\n    테스트주도개발 : TDD실천법과 도구 (채수원)\n    -> 테스트주도개발 (켄트벡)\n    -> .NET예제로 배우는 단위테스트(로이 오셔로브)\n    -> xUnit 테스트 패턴(제라드 메스저로스)\n\n    서점가서 살펴보고 본인 수준에 맞는 책으로 읽어 보자. \".NET예제로 배우는 단위테스트\"의 경우 .NET기반이라 자바 개발자들에겐 조금 아쉽겠지만, 중간쯤에는 일반적인 단위테스트 작성법에 대한 이야기들이 많이 들어 있어서 그 부분만 읽어도 괜찮을 듯 싶다. \n4.  자신의 업무에 적용해 보자. - 쓰지 않으면 배워도 잊혀지기 마련이다. 업무에 TDD를 적용해 보는 것이 필요하다. 단, 자신의 업무 전체를 TDD로 하려 마음먹지 말자. 작게 시작하는 것이 좋다. 이왕이면 변경이 잦거나 로직이 복잡하다고 생각하는 것부터 시작해보자.\n\n\n\n 이 외에도 더 있겠지만, 위 네가지부터 시작하면 좋을 것 같다.\n\n자, 이제 이 글을 마무리 지을 시점이다. 이 글 상편을 시작한것이 봄이었는데 하편을 미루다 미루다 가을이 되었다. 사실 내가 하고자 하는 말은 이미 제목에서 다 했다고 생각한다. :)\n\n좋은 소프트웨어를 만드는 어떤 방식 하나, 테스트 주도 개발 \n\n좋은 소프트웨어를 만드는 여러가지 방법 중 많은 엔지니어들이 추천하는 테스트주도 개발(Test-Driven Development). 아직 시작안했다면 늦지 않았으니까 시작해 보길 권한다.\n\nps.\n전편에도 손발이 오그라 드는 얘길 조금 썼는데, 후편에도 하나 해보자면, TDD를 어려워 하는 엔지니어들이 TDD 시작하는데에 도움이 되었으면 하는 마음에서 눈물의 책(이라고 쓰고 TDD실천법과 도구라고 읽는 책)도 썼다. 어떻게 생각할런지 모르겠지만, 난 나와 같은 업종에서 일하는 IT인들을 참 좋아한다. 같은 별에서, 그것도 같은 나라에서 같은 언어로 같은 일을 한다는 것이 얼마나 경이로우면서도 동질감 큰 인연인지 모르겠다고 생각하곤 한다. 좋은 음악은 함께 나눠듣고 싶은 마음처럼, 좋은 기술은 함께 공유하고 함께 성장하고 싶은 마음이 크다. TDD가 그런 기술이 되었으면 좋겠다.\n\nps2.\n이런 저런 장점을 이야기 한다 하더라도 TDD를 해야 겠다는 마음을 먹는 건 여전히 쉽진 않다.\n\n차라리 캘리포니아 금광(=아이폰 앱 대박) 같은 TDD관련 사례라도 퍼진다면, 무조건 달려가고 볼 개발자라도 많이 생길텐데 사실 그런 사례도 없다. 있어도 널리 소개 되질 않는다. 외국에는 많이 있고, 잘 된 사례도 많다고는 하지만, 이거야 원~ 이게 무슨 북미 신화도 아니고, TDD에 대해서는 '그랬었었~었대더라~' 식의 지인 통신같은 이야기만 잔뜩이다. 결국 나같았어도 쉽게 따라 뛰어들 용기가 생기지 않을 것 같다.\n\n그런사실을 잘 알기에 국내 사례를 찾아서 여기저기 돌아다녀 봤다. 아쉽지만, 개인 차원의 이야기는 어느 정도 있었지만, 팀 단위로 TDD를 하는 경우는 직접 본 경우가 아직 없다. 우리 어른 들이 좋아하는 수치적인 자료와 함께 현재도 지속적으로 진행되는 모습을 보여줄 수 있는 사례는 더더 없지 싶다. (소개로 들은 바에 의하면 넥스트리 소프트라는 회사에서는 단위테스트 작성이 당연한 분위기와 문화가 되었다고 하는데 확인은 못해봤다. 어느 정도이고 어느 수준인지 정말 궁금하다) 그래도 한가지 고무적인 점은 사내(LG CNS)에서 TDD에 대한 사례가 조금씩 쌓여가고 있다는 점이다. 내년 정도쯤이면 의미있는 자료와 수치들을 공개할 수 있지 않을까 생각한다.\n\n#### Comments\n\n웹 브라우저에서  &로 주욱 이어 붙인 파라미터를 보내서 서비스 레이어로 전달해야만 테스트 할 수 있었던 것이.. 서비스 레이어 프로그램만 단위테스트를 하면서 얼마나 빨라졌는지 모릅니다. 하지만.. 정말 습관을 들이지 않으면 다시 브라우저에서 파라메터 이어 붙이고, 콘솔창에 나오는 예외, 에러로그를 보면서 작업하게 되더라구요.. 최근 서비스레이어에서 xml로 반환받는 것을 만들었는데.. xml 파싱해서 테스트 확인하는거.. '귀찮더라구요'... -_-;;; 그냥 콘솔출력해서 '육안'으로 확인했지요.. 자기가 작성한 프로그램에 대한 확인으로 자신감을 얻는 것 TDD가 주는 선물입니다. ^^;\n\n [내사랑꿀떡](http://blog.daum.net/gujjy) | 2010-10-25 월요일 오전 10:4\n\n--\n\nTDD는 '자기가 작성한 프로그램에 대한 확인으로 자신감을 얻는 것'이라는 말씀이 와 닿습니다. :)\n\n [doortts](http://blog.doortts.com) | 2010-10-27 수요일 오후 1:49\n\n--\n\n기대하고 있었던 하편 잘 읽었습니다.\n사람들이 TDD 적용을 하지 않는 이유가 우리 팀과 크게 다르지 않아 가슴이 먹먹하네요.\n\n 야옹 | 2010-10-25 월요일 오후 1:38\n\n--\n\n들어보면 이유는 다 비슷한 것 같습니다. 안하는 이유도, 그리고 하는 이유도 말입니다. :)\n\n그래서인지 가끔은 '이유'자체가 상황을 핑계로 만들어진다는 느낌도 들곤 합니다.\n\n부족한 글임에도 좋게 봐주셔서 감사합니다.\n\n [doortts](http://blog.doortts.com) | 2010-10-27 수요일 오후 1:53\n\n--\n\n안녕하세요. 글에서 언급하신 (주)넥스트리소프트의 최영목 대리입니다.\n\n들으신대로 저희 회사에서는 단위테스트가 당연한 문화로 정착되었습니다. 또한 CI를 적극 활용하여 빌드 자동화도 하고 있으며, scrum base로 개발을 진행하고 있습니다. 물론 짝프로그래밍도 자연스럽게 진행을 하고 있습니다.\n\n언제 한번 이런 내용에 대해서 토의할 수 있는 좋은 자리가 마련된다면 좋겠습니다. ^^\n\n제 블로그는 swtest.co.kr 입니다. 혹시나 제가 잘못 이해하고 있는 부분이 있다면 업계 선배님으로서 좋은 조언 부탁드립니다. ^^\n\nps. 좋은 책 감사드립니다. 저도 잘 보고 있습니다. 토비님 블로그도 잘 보고 있구요 ^^\n\nps2. 저희가 일하는 모습의 일부입니다. ^^ (저희 연구소장님 블로그입니다.)\nhttp://greatkim91.tistory.com/129\nhttp://greatkim91.tistory.com/157\n\n [스쿨쥐](http://swtest.co.kr) | 2010-10-25 월요일 오후 11:29\n\n--\n\n안녕하세요? 이렇게 직접 댓글까지 남겨주시다니, 반갑기도 하고 고마운 마음도 들었습니다. \n\n기회가 된다면 한번 찾아뵙고 이야기 나눌수 있었으면 좋겠습니다. (지나가는 말이 아니라 정말로요)\n\n괜찮으시면 제가 한번 찾아가 뵈도 될까요? :)\n\n [doortts](http://blog.doortts.com) | 2010-10-27 수요일 오후 1:56\n\n--\n\n넵^^ 현재 저는 상암동쪽에서 테스트 관련 컨설팅에 참여하고 있습니다. (물론 제 윗분들이 거의 다 해결하십니다만 ^^;;)\n\n제 연락처는 010-삼사오팔-3936(최영목)입니다.\n\n시간되실때 연락주시면 식사라도 하시면서 좋은 말씀 부탁드리겠습니다. ^^\n\n [스쿨쥐](http://swtest.co.kr) | 2010-10-28 목요일 오전 8:47\n\n--\n\n'프로는 경기중에 연습하지 않는다.'\n\n갑자기 뜨끔하네요. \n좋은 글 잘 감상(?)하고 갑니다. 이젠 자야지.. ㅋㅋ\n\n [영회](http://younghoe.info) | 2010-10-27 수요일 오전 1:41\n\n--\n\n저도 때때로 뜨끔하는걸요. ㅎ~\n\n인간은 참으로 지독한 망각의 동물이라, 오늘 하루를 이렇게 오만하게 사는 거겠죠.\n\n그럼 좋은 하루 되세요\n\n [doortts](http://blog.doortts.com) | 2010-10-27 수요일 오후 1:57\n\n--\n",
    "attachments": [
      {
        "id": 21806,
        "name": "Brewers VS Cubs.jpg",
        "hash": "d71a2242cd2b1e0e8f59f320bc3030f367acf350",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 48507,
        "containerId": "12307"
      }
    ]
  },
  {
    "id": 126,
    "title": "근황",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1275638079000,
    "body": "> doortts | 2010-06-04 금요일 오후 4:54 | 이생각 저생각 | [원본](http://blog.doortts.com/126)\n\n글 쓰는게 점점 더 무겁게 느껴져, 더더 못 쓰고 있는것 같습니다.\n블로그에 개인적인 이야기는 잘 하는 편이 아닙니다만,\n쉬어가는 의미로 근황 몇 자 적어봅니다.\n\n----------------------------------------------------------\n\n1\\. 안드로이드는 안드로메다\n- 회사내에서 모바일 교육과정 개발을 진행하고 있습니다. 당분간은 외부에서 강사를 초빙해서 개발자을 양성하게 될 겁니다. 물론 장기적으로는 내부에 교육과정을 만들게 되겠지만 말입니다. 현재 국내 IT 기업시장에서 안드로이드는 초 상종가입니다. 정확한 액수를 밝히긴 어렵지만, 안드로이드 강사 두 달 월급이 제 1년 연봉보다 많을 겁니다. 근래에 모바일쪽에 너무 지나치게 개발자가 몰리는 경향이 있어서 오히려 걱정될 정도입니다.\n\n2\\. 테스트 주도 개발 책 발간 예정\n- 그 동안 써왔던 '테스트 주도 개발' 책이 다음 주 부터 예약판매에 들어갈 예정입니다. 책 제목은 \"테스트 주도 개발 : 고품질 쾌속개발을 위한 TDD실천법과 도구\" 입니다. 책 쓴다는게 어렵다고는 들었지만, 이 정도로 힘들줄은 몰랐습니다. 여튼 책에 대해서는 따로 소개를 드릴예정입니다만, 쉽고 빠르고 TDD를 익히고 적용할 수 있도록 최선을 다해 노력했습니다. 어렵고 지루한 책은 저 조차도 별로 안좋아 하기 때문에, 그렇게 되지 않도록 준비했습니다.\n\n3\\. 인력 브로커\n- 주변사람들에게 책을 쓰거나 번역하는 일을 권하고 소개하는 일들을 해왔습니다. 그 결과 몇 몇 분들이 저작과 번역을 하게 되었습니다. 힘든만큼 보람도 큰 일이라 생각하기에 괜실히 혼자 뿌듯해 합니다. 앞으로는 출판사/번역가/기획자 등등을 연결해 줄 때 소개비라도 받아야 할까요? :)\n\n4\\. 사내 엔지니어 모임, \"열린세미나\"\n- 저희 회사는 SI회사입니다. 국내 SI기업들이 그렇듯이 능력있고, 열의있는 엔지니어들이 뜻을 펼치거나 서로 이야기를 나눌 자리조차 잘 없습니다. 2년전부터 \"열린세미나\"라는 이름으로 엔지니어모임을 해왔었습니다. 비공식 모임이었는데, 5월부터 공개적으로 전환하는 일을 진행중에 있습니다. 회사의 인정도 받고, 더 좋은 자리에서 더 많은 이야기를 나눌 수 있는 지원도 받을 수 있게 되었습니다. 주말에 모여 사비로 간식먹고 '초청강사'님에게 돈모아 기념품 드리던 어려운 시절을 조 금은 벗어날 수 있지 않을까 기대해 봅니다. ObjectClan.com 이었는데 최근 도메인 갱신을 안했더니 지금은 중지되어 있습니다만 곧 살릴 예정입니다. 임시 사이트는 [http://doortts.com/oc](http://doortts.com/oc \"[http://doortts.com/oc]로 이동합니다.\") 입니다.\n\n5\\. 새로운 프로그래밍 언어 학습 중\n- 스칼라(Scala)라는 자바 JVM기반위의 언어에 대해 학습하고 있습니다. Functional 언어의 특징과 정적타입의 장점을 동시에 갖고 있는 묘한 녀석입니다. 시작하게 된 건 옆동네 친구(nephilim)덕분입니다. 자바와 루비, 파이선등등의 이미 유명한 언어들의 장점을 흡수하여 만들어 졌고, 일반 JVM위에서 돌아간다는 장점 덕분에 큰 거부감 없이 학습할 수 있습니다. (언어 자체의 난이도는 논외로 하고 말입니다) 게다가 일반JVM위에서 돌아가기 때문에 (당연하지만) 기존 자바 라이브러리들도 그대로 사용할 수 있습니다. 협업에는 치명적이지만, 어쨌든 개인 프로그래밍에는 즐거움을 줄 수 있을 것 같습니다.\n\n---------------------------------------\n\n이렇게라도 조금 글을 다시 쓰기 시작했으니, 점차 쓰는게 나아지리라 기대해 봅니다. 블로그에 글을 쓰는게 힘든 '일'이라고 느껴지면 여러가지로 좋지 않더라구요.\n\n자! 그럼 이제 얼마남지 않은 봄기운을 즐겨보자구요!! 오늘도 날이 좋네요~ :)\n\n#### Comments\n\n책을 발간하신다니 멋지군요!\n책 나오면 꼭 사보겠습니다.^^\n\n [박형근](http://codereview.co.kr) | 2010-06-04 금요일 오후 8:31\n\n--\n\n말씀만으로도 감사합니다. 생각해보니 XPer에서 몇 번 뵈었지만, 이야기는 별로 못 나눠본것 같습니다. 다음엔 서로 아는척 하기! 입니다. :)\n\n [doortts](http://blog.doortts.com) | 2010-06-05 토요일 오후 12:10\n\n--\n",
    "attachments": [
      {
        "id": 21770,
        "name": "email.png",
        "hash": "c452961d8002d2d7b2d17cbad4f134f43bb3a9f4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2554,
        "containerId": "12297"
      }
    ]
  },
  {
    "id": 127,
    "title": "때로는 효율보다 마음으로 - 부제: 책갈피 꽂으러 파주까지",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1276619461000,
    "body": "> doortts | 2010-06-16 수요일 오전 1:31 | Books | [원본](http://blog.doortts.com/127)\n\n오랜 기간 공을 들였던 TDD 책이 발간 되었습니다.\n\n테스트 주도 개발 : 고품질 쾌속개발을 위한 TDD실천법과 도구\n(줄여서 쾌속개발 TDD)\n\n![](file:///C:/Users/RENZFL%7E1/AppData/Local/Temp/moz-screenshot.png)그런데 초기 구매자들께 대한 감사한 마음으로 조그만 정성이라도 보여 드리고 싶어서 책갈피를 만들어 보았습니다. 직접 디자인(...)하고 사비로 인쇄를 맡겨서 찾아온 책갈피 입니다.\n\n[cfile27.uf.1737CA1C4C17A4F34E0893.png](./attachments/cfile27.uf.1737CA1C4C17A4F34E0893.png)\n[부끄럽지만 PPT와 그림판으로 만들어서 인쇄했어요.]\n\n이 책갈피를 책에 꽂기 위해서 일과후에 기획자님과 함께 파주 물류창고에 다녀왔습니다.\n멀고도 멀고도 멀더군요. 게다가 이런저런 어드벤처 게임같은 일이 일어나서 파주 일주를 했네요.\n6시에 홍대입구를 떠나서 최종 물류창고에 도착한 시각은 8시가 넘어서 였습니다.\n\n![IMG_0771.jpg](/files/21773)\n[파주시 파주읍에 위치한 도서전문 물류센터]\n\n![IMG_0774.jpg](/files/21778)\n[우리 책은 어디쯤에?]\n\n![IMG_0779.jpg](/files/21776)\n[맨 처음 잘못 찾아간 신형 물류센터 내부 모습. 아직 이전이 덜 되었다고 해서 다른 곳으로 이동해야 했습니다]\n\n![IMG_0783.jpg](/files/21775)\n[책갈피를 꽂기 위해 밴딩되어 있는걸 풀어야 했습니다]\n\n![IMG_0784.jpg](/files/21772)\n[오늘 오전(15일 화요일)에 출하된 초회판 책들과 사이에 넣어야 하는 책갈피들(앞면)]\n\n![IMG_0787.jpg](/files/21779)\n[다소곳한 모습으로 책갈피를 끼우고 계신 담당 기획자님]\n\n![IMG_0789.jpg](/files/21777)\n[초반의 다소곳은 어딘가로 사라지고 빛의 속도로 열심히 책 사이 사이에 책갈피를 꽂기 시작]\n일 끝내고 양념통닭을 먹기 위한 일념의 힘?\n\n![IMG_0791.jpg](/files/21774)\n[책갈피가 중간에 들어있는 초기 물량분. 초기 주문자 분들이 높은 확률로 랜덤으로 받으실 겁니다]\n\n담당 기획자님과 여러가지로 뜻이 잘 맞고 의기가 투합되어서 다양한 난관을 헤쳐나갈수 있었습니다.\n이번에도 피로를 무릅쓰고 저 먼 파주까지 함게 하셨답니다.\n\n사실 사진의 느낌은 저는 놀면서 사진이나 찍고 여자 기획자를 혹사시킨 분위기지만, 그... 그렇지는 않.. 않답니다..\n\n여튼, 책갈피 별것 아니지만, 받아보실때 한 분 이라도 흐믓하게 웃고 시작하실 수 있었으면 하는 마음에서 시작한 작업이었습니다. 이 작업 자체만 놓고 보면 장당 100원도 안하는 책갈피를 끼우기 위한 노력치고는 효율이 형편없다 할수도 있겠지만, 산다는게 꼭 효율만으로 이루어 지는건 아니잖아요? :)\n\n어쨌든 이제 예판하신 분들을 비롯하여 내일부터 책을 본격적으로 받아 보실수 있으실텐데요,\n부디 서로에게 좋은 경험으로 마음 뿌듯한 연결고리가 되었으면 좋겠습니다.\n\n책도, 그리고 책 사이에 끼워져 있는 제 마음도 함께 말입니다.\n\n#### Comments\n\n아 물류창고가 저런 곳이었군요.. ^^\n그나저나 정말 고생하셨어요. 책갈피까지 직접 끼우시는 필자분이라니!!\n\n [decoder](http://decoder.tistory.com) | 2010-06-16 수요일 오전 9:23\n\n--\n\n네. 저도 도서전문 물류창고는 처음 봤어요. 매트릭스에서 무기가 옆으로 좌르르륵 나오던 장면과 비슷하더라구요. 대신 여긴 무기가 아니고 책이..\n\n [doortts](http://blog.doortts.com) | 2010-06-16 수요일 오후 7:23\n\n--\n\n재미있네요 ^^;; \n\n저렇게 물류 센터에 있는걸 풀러서 다시 넣을 생각을 했다는게 대단하시네요~\n\n [멋진인생](http://run2you.tistory.com) | 2010-06-16 수요일 오전 9:30\n\n--\n\n네. 나중에 보니 이걸 어떻게 했나 싶더라구요. 몰라서 무식하다는 말이 딱 맞는것 같아요. :)\n\n [doortts](http://blog.doortts.com) | 2010-06-16 수요일 오후 7:24\n\n--\n\n우와 책갈피랑 기획자님 이쁘세요. +_+\n\n [기선](http://whiteship.me) | 2010-06-16 수요일 오전 9:45\n\n--\n\n당신에게 줄 책갈피는 챙겨놨어!\n\n [doortts](http://blog.doortts.com) | 2010-06-16 수요일 오후 7:24\n\n--\n\n저 책갈피에 쏟은 정성때문에라도 책을 사보고싶네요.\n고생하셨습니다.^^\n\n 창천 | 2010-06-16 수요일 오후 1:11\n\n--\n\n좋게 봐주셔서 오히려 제가 더 감사합니다!\n\n [doortts](http://blog.doortts.com) | 2010-06-16 수요일 오후 7:24\n\n--\n\n저자와의 만남이 불발되어 아쉽습니다.\n정독 후에 다시 뵙기를 바랍니다.\n\n zeide | 2010-06-16 수요일 오후 1:40\n\n--\n\n저자와의 만남을 주선한게 아니라, 느닷없는 통보였답니다. -_- '닭집으로 와라! 우린 준비되었다!'\n\n [doortts](http://blog.doortts.com) | 2010-06-16 수요일 오후 7:25\n\n--\n\n멋진 책 써주셔서 감사합니다.\n모든 행보 하나하나에 마음이 느껴지는 군요\n\n [짱가](http://architect.tistory.com) | 2010-06-16 수요일 오후 5:10\n\n--\n\n저야말로 오히려 감사드립니다. 게다가 이 책을 계기로 짱가님을 알게 되었어서 너무 기쁩니다! 나중에 맛나는 밥 같이 드시는 날 오길 고대하겠습니다!\n\n [doortts](http://blog.doortts.com) | 2010-06-16 수요일 오후 7:26\n\n--\n\n이야. 드디어 나오는군요. 정말 축하드려요. 먼 곳까지 가셔서 준비한 이벤트..받는 사람들이 뿌듯할거 같네요. 새로 프로젝트에 들어와서 정신이 없지만 책들고 싸인 받으러 갈께요. ^^\n\n [k16wire](http://pragmaticstroy.com) | 2010-06-17 목요일 오전 12:38\n\n--\n\n감사합니다! 인터뷰에 응원에, 여러가지로 도와주신 덕분인것 같습니다. 조만간 얼굴 뵙고 인사드릴게요. :)\n\n [doortts](http://blog.doortts.com) | 2010-06-17 목요일 오후 9:51\n\n--\n\n책에 저자 싸인이 빠진것이 한가지 아쉬운점이었숨돵. ^^\n\n [짱가](http://architect.tistory.com) | 2010-06-18 금요일 오후 5:26\n\n--\n\n무슨요~~ 오히려 제가 짱가님 싸인을 책에 받아 두고 싶은걸요. 책 보시다 보면, 짱가님의 숨결(?)이 반영된 부분을 보실거에요. :)\n\n [doortts](http://blog.doortts.com) | 2010-06-19 토요일 오후 6:51\n\n--\n\n그간 얼마나 애썼을지..............책을 보니 이제야 마음에 와 닿는구나. 아담하고 예쁘고 퀄러티가 느껴지는 책 !\n책의 내용은 이해하지 못하지만.............정말 정말 수고 했구나. 건강도 꼭 챙기기를...........\n\n coffee | 2010-06-19 토요일 오후 7:43\n\n--\n\n감사합니다. 어머니.\n가족이란 이런거구나 하는 걸 다시 느꼈습니다.\n큰 힘이 되었습니다.\n\n [doortts](http://blog.doortts.com) | 2010-06-21 월요일 오전 9:30\n\n--\n\nㅋㅎㅎ...\n다음날 힘들어하던 모습이 ....\n\n csk | 2010-06-21 월요일 오후 7:3\n\n--\n\n체력이 안되네요. 체력이.. (이넘의 후진 체력은..)\n\n [doortts](http://blog.doortts.com) | 2010-06-21 월요일 오후 8:48\n\n--\n\n책갈피는 언제쯤 볼수 있을까요 +.+\n\n [is윤군](http://helols.pe.kr) | 2010-06-29 화요일 오전 2:44\n\n--\n\n이거야 원 서로 얼굴을 볼 시간이 되어야 말이지. 어쨌든 책갈피는 따로 챙겨봤어! 그리고 그 외에 줄게 하나 더 있구. 기대하라구! (실은 나도 기대되어)\n\n [doortts](http://blog.doortts.com) | 2010-06-29 화요일 오후 8:54\n\n--\n",
    "attachments": [
      {
        "id": 21771,
        "name": "TDDBook_책갈피.png",
        "hash": "8eaa3fd505838b5197c3dc7611ce5a34ce1acbb1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 91326,
        "containerId": "12298"
      },
      {
        "id": 21772,
        "name": "IMG_0784.jpg",
        "hash": "2b8882ba74b022e0f5bf2294e1f8207ca3af58d9",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 223682,
        "containerId": "12298"
      },
      {
        "id": 21773,
        "name": "IMG_0771.jpg",
        "hash": "7be71d255e654ed34cea6ed43d1396d7c7541114",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 177101,
        "containerId": "12298"
      },
      {
        "id": 21774,
        "name": "IMG_0791.jpg",
        "hash": "1421a7836d2d51d47a29085796abf8fd3bd20c80",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 268576,
        "containerId": "12298"
      },
      {
        "id": 21775,
        "name": "IMG_0783.jpg",
        "hash": "af2cf8e45eb076e52d90eb5654c60507bca770df",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 211728,
        "containerId": "12298"
      },
      {
        "id": 21776,
        "name": "IMG_0779.jpg",
        "hash": "38960604d8de6a5dad895932bad838423984b0ef",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 274743,
        "containerId": "12298"
      },
      {
        "id": 21777,
        "name": "IMG_0789.jpg",
        "hash": "c2698e2e24a6528d6a00c8495f5f8efa1d90b6fc",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 285882,
        "containerId": "12298"
      },
      {
        "id": 21778,
        "name": "IMG_0774.jpg",
        "hash": "ac16e8272c7913fa9394de76284db9dd3d2c6495",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 249875,
        "containerId": "12298"
      },
      {
        "id": 21779,
        "name": "IMG_0787.jpg",
        "hash": "bedf47422e5af043d861b1a1762a418061f04880",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 471029,
        "containerId": "12298"
      }
    ]
  },
  {
    "id": 128,
    "title": "테스트 주도 개발 : 고품질 쾌속개발을 위한 TDD실천법과 도구",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1277076600000,
    "body": "> doortts | 2010-06-21 월요일 오전 2:39 | Books | [원본](http://blog.doortts.com/128)\n\n오랜 기간 공을 드렸던 책이 저번 주에 수요일에 발매 되었습니다.\n\n![한빛에서_만들어준_배너.png](/files/21781)\n테스트 주도 개발 : 고품질 쾌속개발을 위한 TDD실천법과 도구\n(줄여서 '고품질 쾌속개발을 위한 TDD')\n\n- 책에 대한 기본 소개 -\n\n1\\. 목차 및 '미리보기'를 볼 수 있는 책 소개\n[http://www.yes24.com/24/goods/3908398](http://www.google.com/url?sa=D&q=http://www.yes24.com/24/goods/3908398&usg=AFQjCNGgU2l1ui26-NcEN1dKggkmCIhiYw)\n\n2.TDD 책을 쓰게 된 동기가 된 이야기\n[http://blog.doortts.com/122](http://www.google.com/url?sa=D&q=http://blog.doortts.com/122&usg=AFQjCNEEVNzGu_ag4UFqTHk_9LChcZw9jw)\n\n3.물류창고 갔던 이야기\n[http://blog.doortts.com/127](http://www.google.com/url?sa=D&q=http://blog.doortts.com/127&usg=AFQjCNENIwUwJzOmbTdzoNrCaEs5mFUueg)\n\n4.책 공식 사이트\n[http://tddbook.com](http://www.google.com/url?sa=D&q=http://tddbook.com&usg=AFQjCNGMBPiWhvvIZx7zWLyz9M1nO510IA)\n\n--------------------------\n\n이렇게 말하면 어떻게 생각하실지 모르겠지만, 이 책은 집필 초기부터 몇 가지 뚜렷한 목표를 가지고 만들어진 책입니다.\n\n\n\n*   켄트벡의 TDD책(TDD by Example)만으로는 프로젝트 적용이 힘들다. TDD를 실제 프로젝트에 적용하고자 할 때 발생하는 상황에서의 다양한 해법을 담을 것!\n*   TDD를 적용할 발생하는 개발지연을 최소한으로 감소시킬 수 있는 기법을 알려주어야 한다.\n\n*   TDD는 목적이 아니라 수단이 되어야 한다. 무엇의? 더 나은 소프트웨어와 보다 더 나은 개발자의 삶을 위한 활동의 하나로써의 TDD가 되어야 한다.\n\n*   책이 지루해서는 안된다.\n*   내용이 지나치게 어려워서도 안된다. 하지만, 너무 쉬워서 도전할 주제 자체가 없어서도 안된다.\n\n*   독자는 책에 투자한 시간과 돈을 보상받을 수 있어야 한다. (정제된 내용을 담을것!)\n\n*   단순히 TDD에 대한 지식증가 만이 아니라, 책을 읽었을 때 성장감을 느낄 수 있어야 한다.\n\n\n\n또한 제 자신이 책을 좋아하는 사람이고, '책'이라는 것 자체를 아끼기에 사소하지만 신경을 놓지 않았던 부분도 있습니다.\n\n\n\n*   책이 지나치게 크거나 두껍지 않을 것!\n*   폰트가 미려하고 가독성이 높을 것!\n*   종이질!\n*   내지 디자인이 보기 편해야 한다.\n*   책 가격이 비싸지 않아야 한다.\n\n\n\n[보기만 해도 피곤해 지는 까탈스런 느낌..-_-]\n\n특히 위와 같은 부분은 [담당 편집자](http://me2day.net/shinegirl \"[http://me2day.net/shinegirl]로 이동합니다.\")와의 긴밀한 협력이 없었으면 논의 자체가 불가능 했을겁니다. 다행히 의기투합되었어서 최대한 목표대로 진행되었습니다. 시대적 상황(=안드로이드,아이폰이 세상을 덮치고 있고 모두가 그에 집중하느라 다른 부분에는 관심과 지원이 약한 상황)에서 힘든 점이 사실 한 두가지 아니었습니다. 편집자 분께서도 수 년간 만든 책 중에서도 이 책 처럼 힘들었던 책이 없다고 하시더군요. (사연을 다 이야기 하자면 밤 샙니다.-_-);\n\n긴 글은 지루할 가능성이 높으니 이후에는, 궁금해 하실만한 이야기 몇 가지 적어보는 걸로 마치도록 하겠습니다.\n\nQ> 와! 이제 책을 출간했으니 인세를 받아서 부자되시는 거죠?\n네. 빌딩하나 사려고요. ... 노.. 농담입니다. 책 쓰는게 돈은 안된다는 이야기는 이전에도 많이 들었는데, 정말 그런것 같습니다. 제가 책을 쓰기 위해 투자한 시간을 GX25 아르바이트 시간당 비용하고 따져보니, GX 아르비쪽이 2배쯤 더 남는것 같습니다. -_-;; 뭐, 앞으로야 모르겠지만, 당분간은 계속 그럴 겁니다. 게다가 제가 무슨 켄트벡이나 마틴파울러가 아니잖아요? 첫 책이기도 하고, 요즘 책이라는 매체에 대한 느낌이나 국내 IT 상황도 그렇고 말입니다. 다만, 책으로 인해 좀더 많은 사람들과 교류할 수 있는 계기가 되었으면 하는 바램입니다. 물론 책 쓰는 중간에도 지식 외적으로도 많은 걸 배웠습니다. 또, 고마운 분들도 많이 알게 되었고요. 그건 돈으로 가치매길 수 있는 부분이 아니니까요.\n\nQ> 책 쓰는데 얼마쯤 걸렸나요?\n준비기간이나 중간에 쉰 기간을 빼놓고 1년쯤 걸린것 같습니다. 집필에 8개월, 베타리딩부터 시작된 교정에 4개월. 중간에 힘들어서 마음속으로 몇 번 울었습니다. 담당 편집자님도 마찬가지로 몇 번 우셨을 겁니다. :)\n\nQ> 출판사와는 어떻게 인연이 닿으셨나요?\n한빛 출판사의 짤막 번역물을 몇 개 번역한 인연을 계기로 메일로 제안을 드려 시작하게 되었습니다.\n\nQ> 회사일을 하면서 작업하는 것에 대해 어려움은 없었나요?\n물론 많았습니다. 특히 혹시라도 생길지 모를 곤란한 문제를 피하기 위해 일과중 회사내에서는 작업을 하지 않는 걸 원칙으로 삼았기 때문에 시간 내기가 쉽지 않았습니다. (물론 가끔 살짝 살짝 보는 것과 프린트 하는 것 정도는 예외로 하고요^^) 집필은 퇴근시간 이후와 주말을 최대한 사용했습니다. 정 급할때는 중간에 휴가를 쓰기도 했습니다.\n\nQ> TDD관련 국내서로는 처음인데요, 어쩔수 없이 관련 외국 서적을 많이 참고 하셨겠죠?\n책을 쓸 때 어려웠던 점 중 하나가 바로 이점입니다. 처음에는 TDD관련 미번역 외국 책들(JUnit in Action을 비롯하여 JUnit Recipe, xUnit Test Patterns등)을 목록에 넣고 참고 차원에서 읽고 시작하려고 했었습니다. 그런데, 얼마 지나지 않아 그만두었습니다. 알게 모르게 그 책들을 옮겨 적는 일을 저지를까 두려웠기 때문입니다. 눈부신 불빛 앞에서는 다른걸 못 보거든요. 그 책들이 너무 훌륭하다던가, 제가 작성하려는 부분에 대한 더 나은 해답을 제공하고 있다던가 한다면 제 책을 포기하던가, 아니면 번역으로 돌어서던가 해야 했을 겁니다. 그리고 어떤식으로든 그 책들에게 영향을 받아 쓰여진다면, 어느날 그 책들이 번역되어서 나오게 되면 제 책이 가치를 잃어 버릴수도 있습니다.\n\n그래서 읽는걸 중지했습니다.\n\n프레임워크의 레퍼런스를 본다던가, 외국의 포럼이나 블로그 글은 참조할지언정 책을 보진 않았습니다. 이 부분이 굉장히 갈등을 겪으면서도 고통스러웠던 부분 중 하나입니다. 대신에, 실제 경험했고, 가이드 했던 부분들을 중심으로, 실 프로젝트에 TDD를 할 때 어떤 점이 고민이고, 어떤 부분에서 시행착오를 겪게 되는지에 대해 정리하는 쪽으로 집중했습니다. 2005년에 켄트벡의 책이 국내에 소개된 이후로 이렇다할 TDD관련 책이 나오지 않았던 이유도 아마 비슷한 이유가 포함되어 있어서가 아닐까 생각합니다. \n\n어쨌든 관련 서적을 최대한 참고하지 않았기, 미번역 외국 책에서 설사 비슷한 내용이 나오더라도 그건 가는 길이 같아서 마주친 것이지, 시침뚝 떼고 참고한 것은 아니라는 점에서, 좀 더 떳떳할 수 있을 것 같습니다. 다만, 제가 생각하지 못했던 부분이나, 미처 알지 못했던 다른 방식의 기법이 담겨져 있을 수는 있을 거라 생각합니다.\n\nQ> 책이 출간된 현재 기분은 어떠신가요?\n우선 떨립니다. 과연 독자들이 어떻게 받아들여 줄런지도 궁금하고요. 제가 원체 쑥스럼을 잘 타는 성격입니다만, 당분간은 용기를 내서 여기저기 책 홍보를 해보려고 합니다. 아무리 좋은 책도 읽혀야 좋은 책이니까요. 아. 제 책이 좋은 책이라고 바보처럼 자찬하는 건 아닙니다. 다만, 업계 구성원들이 그들만의 리그처럼 양분되어 있는 현재상황(= 중상급 개발자와 초급 개발자 사이에 다리가 끊어져서 서로 교류가 힘들고, 끌어 당겨주려는 노력을 하거나 매달려 보채는 일이 없는 상황)에서 가교가 될 수 있었으면 하는 마음이 책에도 담겨져 있습니다.\n\nQ> 마지막으로 하고 싶은 말이 있다면?\n여러 분들의 도움으로 인해 책이라고 하는 부끄러운 작업물을 공개하게 되었습니다. 제가 이 분야의 최고라서 책을 쓴것이 절대 아닙니다. 다만, 시장을 넓히고 영역을 넓혀서 함께 나아가고 싶은 마음에 씨앗이 되는 계기가 되었으면 싶었습니다. 그래서 서로서로 멘토가 되고 멘티가 되어 함께 격려하고 배우며 더 나은 세상을 만들어 갔으면 합니다. 아직 부족한 점이 많습니다. 많이 도와주세요. 저도 좀 더 열심히 나누며 살수 있도록 하겠습니다. 감사합니다!\n\n\n![](file:///C:/Users/RENZFL%7E1/AppData/Local/Temp/moz-screenshot-2.png)![](file:///C:/Users/RENZFL%7E1/AppData/Local/Temp/moz-screenshot-3.png)\n\n#### Comments\n\n구입을 나중에 하려고 했는데 이전 포스팅에서 책갈피를 꽂으셨다는 말에 서둘러 구입했는데,\n제 책에는 없군요.. 아쉽기는 하지만 좋은 책을 구입한것 같아서 흡족합니다.\n\n [무혹](http://digitcom.kr) | 2010-06-21 월요일 오전 11:33\n\n--\n\n(정말 보잘것 없는지라) 별건 아니지만, 주소 알려주시면 몇 장 보내드리겠습니다. 그리고 친히 메시지까지 남겨 주셔서 감사합니다. 좋은 저녁 되세요. :)\n\n [doortts](http://blog.doortts.com) | 2010-06-21 월요일 오후 8:57\n\n--\n\nㅎㅎㅎ\n아닙니다. 꼭 책갈피가 필요했던건 아닙니다.\n블로그구독하면서 이런저런 정보를 많이 얻어서 좋았는걸요..\n책 정보도 블로그에서 보고 구매했지요....\n\n 무혹 | 2010-06-22 화요일 오전 7:51\n\n--\n\nJCO에서 한 세션을 맡으셨더군요..\n테스트 가능한 소프트웨어 설계와 TDD작성 패턴이라는 주제던데\n흥미롭게 보고 있는 책의 저자분이시라 많은 기대중입니다.\n\n선약이 있는걸 취소하고 신청했습니다... ㅎㅎㅎ\n\n [무혹](http://digitcom.kr) | 2010-06-23 수요일 오전 7:33\n\n--\n\n기대가 크시면 실망도 크세요. :)\n그냥 편하게 오셔서 즐기다 가실 수 있었으면 좋겠습니다.\n\n부탁하나 드릴게요.\n그날 오시면 먼저 악수 청해 주세요. \n\n감사합니다!\n\n [doortts](http://blog.doortts.com) | 2010-06-23 수요일 오전 11:5\n\n--\n\n말주변이 없어서 인사하고 나면 뻘쭘하지 않을까 싶네요..\n그래도 그 날 꼭 악수청하도록 하겠습니다.\n\n 무혹 | 2010-06-24 목요일 오전 9:17\n\n--\n\n책이 지루해서는 안된다. 요 부분 맘에 드네요 ㅎㅎ\nTDD 책에 한번 좌절했던 터라 더더욱 기대됩니다\n\n [tack](http://twitter.com/revirth) | 2010-06-25 금요일 오후 5:46\n\n--\n\n자문 자답 보고 빵 터지고 갑니다. 쿄쿄쿄쿄~\n\n [is윤군](http://helols.pe.kr) | 2010-06-29 화요일 오전 2:44\n\n--\n\n무심코 구독기 글을 읽다가 놀래서..이번에 나온 tdd책이 알고보니 \n옛날부터 rss구독하던분의 작품이었군요..\n제가 번역책 정말 싫어해서 이거다 싶어 샀는데 글도 잘읽히고 좋은책 입니다. \n좋은책 감사드립니다...그리고 저도 꿈이 책좀 내고 싶은데 너무 어렵네요 ㅠ.ㅠ\n\n [산골](http://mckdh.net) | 2010-07-08 목요일 오전 11:57\n\n--\n\n좋게 봐주셔서 감사합니다. 예전에 책 쓰기 위해 블로그에 글 올리시는것 보았더랬습니다. 저도 다음에 만일 책을 쓰게 된다면 산골님처럼 오픈방식으로 해 볼 생각입니다. :)\n\n [doortts](http://blog.doortts.com) | 2010-07-08 목요일 오후 11:37\n\n--\n\n제가 한달 전쯤에 댓글을 달았었군요 ㅋㅋ\n암튼 구입하고 다시 댓글 남깁니다\n\n워크샵 하실때 그냥 자바가 생소하더라도 참가하는건데 하는 약간 아쉬움이 남네요 ㅎㅎㅎ\n\n [tack](http://revirth.me) | 2010-07-16 금요일 오후 7:22\n\n--\n\n안녕하세요?\n부디 책이 도움이 되셨으면 좋겠습니다.\n그리고 다음달에 한빛출판사 세미나실에서 3시간가량의 세미나를 진행할 계획입니다. \n\n나중에 보시고, 기회 되시면 오세요.\n:)\n\n그때 뵙고 인사나눌 수 있었으면 좋겠습니다.\n그럼 편안한 주말 되세요!\n감사합니다.\n\n [doortts](http://blog.doortts.com) | 2010-07-17 토요일 오후 12:42\n\n--\n\n책 잘읽고 있습니다. 우여곡절끝에 책을 읽어보게 되었습니다.\n\n아쉽게도 구입한건아니지만 그래도 학교도서관에다가 사달라고하니까 사줘서 ㅠㅠ\n\n여력이 되면 구입해야겠네요.\n\n진짜 나름 책 많이 읽은 편인데 내용도 딱딱히자도 않고 이해가 잘되서 \n\n이렇게 남기게 되네요.\n\n저도 책을 쓴다면 이렇게 쓰고 싶네요.\n\n좋은 책 써주셔서 감사합니다.^^;\n\n [공적이](http://melpis.tistory.com/) | 2010-07-19 월요일 오후 9:8\n\n--\n\n저야말로 읽어주셔서 감사합니다. \n미천한 제 책이 나아가시는데에 도움이 되셨으면 좋겠습니다.\n\n감사합니다.\n\n [doortts](http://blog.doortts.com) | 2010-07-21 수요일 오전 12:56\n\n--\n\n좋은 책 잘보았습니다. \n실제 업무에서 TDD 를 적용하고 있는데요( 생각보다 쉽지는 않지만요ㅜㅜ)\n\n뭔가 정리되어 있는 찾아 볼 수 있는 책이라서 쉽게 빠르게 읽을 수 있었습니다. \n감사합니다.\n\n 대박 | 2010-07-22 목요일 오후 3:1\n\n--\n\n안녕하세요?\n\n우선 도움이 되셨다니 다행입니다. \n실제 업무에 적용하기에, 그것도 팀 단위로 적용하기에는 어려운 점이 산재해 있는게 사실입니다.\n\n조만간 작은 세미나 같은 모임을 가져보려고 하는데요, 기회 되시면 오셔서 경험담 들려주세요.\n\n그럼 좋은 하루 되세요. :)\n\n [doortts](http://blog.doortts.com) | 2010-07-22 목요일 오후 5:17\n\n--\n",
    "attachments": [
      {
        "id": 21780,
        "name": "테스트주도개발표지.jpg",
        "hash": "94c363f4d23a754ba8e14163ec3c0e168ee22dce",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 34850,
        "containerId": "12299"
      },
      {
        "id": 21781,
        "name": "한빛에서_만들어준_배너.png",
        "hash": "33cc579b2471403122e59769fb5b27d5eb17e4ca",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 88035,
        "containerId": "12299"
      }
    ]
  },
  {
    "id": 129,
    "title": "잘하면 고효율, 못하면 가문의 원수가 되는 짝프로그래밍",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1279455766000,
    "body": "> doortts | 2010-07-18 일요일 오후 9:21 | Better SW Development | [원본](http://blog.doortts.com/129)\n\n지난 7일(수요일) LG전자 MC 연구소에서 Agile Gathering이라는 행사가 있었습니다. 연구소내에서 좀 더 나은 제품을 만들기 위해 노력하고 그 과정에서 Agile을 적용하고 실천하려 애쓰는 분들이 모인 자리였습니다.\n\n그 행사에서 \"짝프로그래밍(Pair Programming)\"이라는 주제로 1시간 가량 발표를 했습니다. 열심히 들어 주시고 많은 질의응답이 오고갔습니다. 다음은 그 때 발표했던 PPT입니다. 단순히 자료를 올리는 것 보다는 좀 더 도움이 되었으면 하는 마음에, 발표 자료에 코멘트를 조금 달아 보았습니다.\n\n**[잘하면고효율, 못하면가문의원수가되는 짝프로그래밍](http://www.slideshare.net/doortts/effective-pair-programming-with-lessons-learned \"잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)\")\n[(Effective Pair Programming with Lessons Learned)](http://www.slideshare.net/doortts/effective-pair-programming-with-lessons-learned \"잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)\")**\n\n\n* Agile Gathering 소감 *\n\n- SI에 Agile을 적용하기 힘든점이 많다고 느꼈었는데, SW제품을 생산하는 쪽이라고 해서 (적용하기에) 훨씬 나은 환경은 아닐 수 있다.\n- 힘든 환경에서도 'do make better tommorrow!'를 목표로 열심히 노력하시는 분들의 모습이 너무 멋지고 감동스러웠다.\n- LG 전자 MC연구소의 분위기가 (외부인의 입장에서는 복장부터가) 참 자유로워 보였다.\n\n번외로, 모처럼 김창준 대표님께 이런저런 이야기를 들을 수 있었습니다. 진행하신 게임에 대해서도 궁금한 점이 많았는데, 많이 해소되었고요. 특히 '지속가능한, 그리고 재현 가능한 Agile의 전파'라는 측면에서 스크럼마스터의 역할에 대해 해주신 이야기는 자신을 다시 되돌아 보게 하였습니다.\n\n#### Comments\n\n좋은 내용 감사합니다.\n\n [ParkPD](http://ParkPD.egloos.com) | 2010-07-19 월요일 오후 1:9\n\n--\n\n별말씀을요. 전 이미 박PD님께 (여러가지로) 많은 도움 받고 있는걸요. :)\n\n [doortts](http://blog.doortts.com) | 2010-07-21 수요일 오전 12:58\n\n--\n\n좋은자료 감사합니다 짝프로그래밍, 실천해볼 기회가 많지않은데 좋은자료 감사합니다  ppt자료를 사내에 공유하고싶은데 괜찮으신가요? 아니면 링크는 괜찮은가요?\n\n [오산돌구](http://dol9.tistory.com) | 2010-07-19 월요일 오후 10:13\n\n--\n\n원하시는데로 사용하셔도 무방합니다. \n\n제가 알기로는 제가 올린 사이트(슬라이드 쉐어?)는 해당 자료를 PDF로 내려받을 수도 있다고 들었습니다. 혹 안되시면 알려주세요. pdf로 보내드릴게요.\n\n부디 도움되셨으면 좋겠습니다.\n감사합니다.\n\n [doortts](http://blog.doortts.com) | 2010-07-21 수요일 오전 1:0\n\n--\n\n자료 좋네요. 특히 실패 케이스가 맘에 듭니다. ^^; 저도 코멘트 추가를 활용해 봐야겠습니다.\n\n [k16wire](http://pragmaticstory.com) | 2010-07-30 금요일 오전 7:23\n\n--\n"
  },
  {
    "id": 130,
    "title": "조금 늦은 JCO 개발자 페스티벌 후기 및 세미나 안내",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1280226523000,
    "body": "> doortts | 2010-07-27 화요일 오후 7:14 | 이생각 저생각 | [원본](http://blog.doortts.com/130)\n\n#1.\n조금 늦은 JCO 개발자 페스티벌 후기\n\n지지지난 토요일, 그러니까 7월10일 이대 ECC에서 JCO에서 주최한 개발자 페스티벌에 발표자로 참가했었습니다. \n이번 JCO는 커뮤니티 페스티벌을 표방하며 묘~하게 진행되었습니다.\n(장점도 있고 단점도 있었는데요, 첫번째 시도라 발생한 일이라고 생각하고 있습니다. )\n![IMG_0874.jpg](/files/21783)\nJCO 개발자 페스티벌이 열린 이대 ECC\n\n저는 KSUG(Korea Spring User Group)소속으로 \"테스트 가능한 소프트웨어 설계와 TDD작성 패턴\"이라는 제목으로 TDD에 대해 발표했습니다. 책을 읽지 않으신 분들도 얻어가시는 것이 있도록 간단한 내용으로 준비했습니다. 하지만, 40분 발표에 10분 질의 응답시간으로 잡힌 진행은, 역시나 턱없이 부족한 시간이었다고 생각합니다.\n\n그래서 한정된 시간내에서 지식 이외의 부분을 얻어가실 수 있는게 무엇인가 생각했고, 각자 '작은 불씨'를 살려 가셨으면 하는 마음에 조금 주제넘은 이야기를 한 것 같기도 합니다. (참고 : [http://www.okjsp.pe.kr/seq/154046](http://www.okjsp.pe.kr/seq/154046 \"[http://www.okjsp.pe.kr/seq/154046]로 이동합니다.\") )\n\n어쨌든, 스프링, AJAX, 아이폰, 안드로이드, TDD, HTML5 등등 어떠한 기술이 되었든 어떠한 상황에 놓였든, 좋은 SW를 만드는 가장 근간이 되는 프레임워크이며 라이브러리가 되고, 엔진이 되는건 역시, 자신의 가슴속에 담겨있는 '열정'과 '신념', 그리고 '용기'라고 전 믿습니다.\n\n그 날, 참 날씨 좋은 토요일이었습니다. 황금 같은 토요일을 희생해서, 개인 돈까지 들여가며 오신 분들은, 그것 만으로도 이미 남들이 가지지 못한 멋진 엔진을 하나 탑재하고 계신거라 믿습니다. 여담 하나만 더 하자면,\n\n제가 있던 방은 저 먼 끝쪽에 작은 방이었습니다. 1시에 시작하는 첫 번째 발표였구요. 거의 대부분의 분들이 지각하지 않고 시작 시간전에 앉아 계셨었습니다. 저를 다시한번 반성케 하는 부분이었습니다. 고맙고 감사하고 저또한 많은걸 배웠습니다.\n\n**[테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)](http://www.slideshare.net/doortts/tdd-testable-design-and-tdd \"테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)\")**\n\n #2. TDD 세미나 안내\n\n다음 달인 8월 26일(목)에 한빛 출판사 사옥1층 세미나실에서 조그만 세미나를 진행하게 되었습니다.\n[![TDD세미나.png](/files/21782)](http://www.hanb.co.kr/edu/view_detail.html?hi_id=369 \"[http://www.hanb.co.kr/edu/view_detail.html?hi_id=369]로 이동합니다.\")[http://www.hanb.co.kr/edu/view_detail.html?hi_id=369](http://www.hanb.co.kr/edu/view_detail.html?hi_id=369 \"[http://www.hanb.co.kr/edu/view_detail.html?hi_id=369]로 이동합니다.\")\n\n광고는 광고인지라 '실전 프로그래밍'이라고 거창하게 이름지어지긴 했지만, 그 정도까지라고 하기엔 이번에도 마찬가지로 부족할 것 같습니다. 하지만 JCO세미나 때의 40분 보다는 훨씬 많은 시간인 2시간 45분을 진행시간으로 잡았기 때문에, 그 때 보다는 좀 더 많은걸 얻을 수 있고, TDD에 대해서도 보다 현실적으로 와닿을 수 있는 기회가 되지 않을까 싶습니다.\n\n진행계획\n7:00 ~ 7:50 (50분) : TDD 기본접근 방식 안내\n7:50 ~ 8:00 (10분) : 휴식\n8:00 ~ 8:30 (30분) : 짝 프로그래밍 가이드\n8:30 ~ 8:45 (15분) : 짝 선정 및 휴식 (실습 환경확인)\n8:45 ~ 9:30 (45분) : 실습 주제 안내 및 짝 TDD 프로그래밍 실습\n9:30 ~ 9:45 (15분) : 질의/응답\n\n\n진행이 단순히 전달식이 되지 않았으면 했고, 또한 참여자가 각자 자신만의 배움을 얻어 갈 수 있었으면 하는 마음에서 짝 프로그래밍을 실습에 집어넣었습니다. 낯설음에 걱정하시는 분들도 계실텐데요, 막상 해보시면 하실만 하실겁니다. 걱정하지 말고 오세요. :)\n\n참고로 제가 '실습이 있으니 사람이 많으면 곤란하니 20명 남짓만 모아달라'고 이야기 했기때문에, 경우에 따라서는 조기 마감될 수도 있겠다는 생각이 듭니다. (최종 참석인원이 24명정도면 적당하지 않을까 생각합니다.)\n\n그럼 기회 되시는 분들은 그 때 뵙겠습니다. 더운 여름 건강조심세요! :)\n\n#### Comments\n\n세미나 참석할 인원이 100명이 넘는다는 소문도 있던데요 @.@\n\n [is윤군](http://helols.tistory.com) | 2010-07-30 금요일 오후 6:15\n\n--\n\n-_-;; 이상한 루머는 제발...\n\n [doortts](http://blog.doortts.com) | 2010-07-31 토요일 오전 12:38\n\n--\n\nㅎㅎㅎㅎㅎ\n좋은 세미나 하셔요 ~ (듣고싶어서 신청만 했어요 ㅋ 입금은 안하고 ㅎ)\n\n [is윤군](http://helols.tistory.com) | 2010-07-31 토요일 오후 5:9\n\n--\n",
    "attachments": [
      {
        "id": 21782,
        "name": "TDD세미나.png",
        "hash": "f27a64d48c97a8c8631a97634388b90d7f167e1b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 53658,
        "containerId": "12301"
      },
      {
        "id": 21783,
        "name": "IMG_0874.jpg",
        "hash": "97e0e6b0545c02c4a307181763613a01909e740b",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 41581,
        "containerId": "12301"
      }
    ]
  },
  {
    "id": 131,
    "title": "테스트주도개발(TDD)를 배워야 하는 이유, TDD를 이야기 하는 이유",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1283071007000,
    "body": "> doortts | 2010-08-29 일요일 오후 5:36 | 이생각 저생각 | [원본](http://blog.doortts.com/131)\n\n오랜 만에 글을 올립니다. 왠지 그럴듯한 이야기나 가치있다고 여겨지는 기술 내용을 써야만 할 것 같은 중압감에 글을 잘 못 적고 있었습니다. 누가 압박을 주는 것도 아닌데 말입니다.\n\n블로그 글쓰기를 다시 재개 할때는 역시 가벼운 이야기를 짧게 하면서 시작하는것이 답인것 같습니다. 그리고 이번 글은 별다른 퇴고의 단계를 거치지 않고 생각의 흐름대로 그냥 적어보려고 합니다. (어색해도 그러려니 해주세요 :)\n\n오늘 하려는 이야기는 '왜 TDD를 배워야 하는가?' 그리고 '왜 Old fashioned IT Man인 제가 이렇게 질기게 TDD를 이야기 하는가?'에 대한 이유를 이야기 하려고 합니다. 600페이지에 가까운 책을, 그것도 기초적인 내용위주의 책을 써가면서 까지 말입니다.\n\n사실 저는 약간 Geek스러워서 오래된 기술/제품 보다는 새로운 기술/경향에 더 열광하는 스타일입니다. 그런데도 나온지 10년이 넘은 기술(?)인 TDD를 이제와서 다시 이야기하려는데는 이유가 있습니다.\n\n강의때 종종 하는 말입니다만, '현실을 변화시킬 수 없는 기술'은 그 한계가 명확하다고 생각합니다. 연구실 안의 기술, 책 속의 이야기일 뿐이기 십상이니까요.\n\n어느날 문득 든 생각이 있습니다. 그간 등장했던 다양한 기술이나 테크닉이 과연 우리의 삶을, 특히 개발자의 삶을 얼마나 풍요롭게 해주었나? 하는 의문점입니다. 개발자의 삶이, 그것도 자신의 일을 천직이라 느끼고 살아가는 개발자에게 있어 일상이 어느정도 나아졌는가? 하는 질문이었습니다.\n\n아이러니 하게도 제가 그동안 배웠던 기술관련 지식중 가장 오래 남아있고, 지금까지도 유효한 지식 하나는 언제 배웠는지도 제대로 기억이 나지 않는, 장치의 속도에 대한 지식입니다.\n\n(빠르다) ------------------------(느리다)\nCPU >  메모리 > HDD > Network\n\n![cpu.jpg](/files/21785)\n\n물론 까다롭게 따지고 들어가면 레지스트리라던가 L1캐시, L2캐시에, HDD와 Network의 전송량, 응답시간특성등등으로 복잡해 지지겠지만, 기본적으로는 위의 순서를 따릅니다.\n\n어느 분야가 되었든 튜닝을 하는데에 있어 기본 원칙은 아주 분명합니다.\n그리고 저는 이 기본원칙이 튜닝의 시작과 끝을 아우른다고 생각합니다.\n\n'빠른속도의 장치를 더 많이 쓰도록 만든다' '병목이 생기지 않도록 밸런스를 맞춰준다'\n\n이 이외에는 튜닝이 아니라 '증설'이 답이 되니까요.\n이 원칙을 위해서 트릭을 쓰고 기술을 적용하는 것일 뿐입니다.\n\n기본원칙에 대한 생각이 견고해야 더 앞으로 많이 나아갈 수 있습니다. 그리고 새로운 기술을 접했을 때에도 더 빨리 더 잘 응용할 수 있게 됩니다. 기술 그 자체에만 집중하면 대부분 우왕좌왕하기 쉽곤합니다.\n\n저는 TDD가 프로그래밍의 기본적인 원칙이자 근본 기술중 하나가 될 수 있다고 생각합니다. 많은 초보자들이 특정 언어의 문법을 배운 다음에는 보통 곧바로 프로그래밍에 들어가곤 하는데, TDD를 빨리 익히면 익힐수록 더 많이 더 빨리 진보할 수 있습니다.\n\n저도 나름 어린시절부터 프로그래밍을 해봤다고 생각합니다만, 이십년 넘게 프로그래밍을 해왔던 시절을 되돌아보면 크게 두 부분으로 연대기를 나눌 수 있습니다.\n\nTDD를 모르던 시절과 TDD를 배우고나서 실천하기 시작한 시절.\n\n기간적으로는 후자의 기간이 훨씬 짧지만, 저의 프로그래밍 스타일과 프로그램을 대하는 방식, 그리고 제 삶에 있어서 여러가지 것들이 TDD를 배운 이후로 드라마틱하게 변화되었습니다.\n\n프로그램과 삶에 대한 관점이 바뀌었다고 할까요?\n프로그램이 만만치 않다고 느꼈고, 그러면서도 좀 더 즐길 수 있는 방법을 배웠고, 그리고 삶에 있어서 '실패'가 갖는 의미에 대해서도 다시 생각하게 되었습니다.\n\n제 책 첫장에도 나옵니다만, 영화감독이자 배우인 우디 앨런의 한 마디.\n\n![WoodyAllan.jpg](/files/21784)\n'때때로 실패하지 않으면, 안이하게 살고 있다는 확실한 증거이다'\n\n에 이르는 수준으로 제 삶에 있어 TDD는 확장되었습니다. :)\n\n제가 더 어린 시절에 더 빨리 TDD를 배웠으면 어떻게 되었을까? 하는 생각을 하곤 합니다.\n\n내년 부터는 언어를 막 배운 신입사원에게 TDD를 가르치려고 준비하고 있습니다. 저 혼자가 아니라 회사 차원에서 말입니다. 좋은 습관을 초반부터 만드는것이 중요하기 때문입니다. 그리고 주변의 많은 윗 분들께서도 제 생각에 동참해 주셨습니다.\n\nTDD는 배우기는 쉽지만, 마스터하긴 어려운 기술입니다. 하지만 충분히 가치있는 기술이고, 프로그래밍을 하는 우리의 삶을, 그리고 주변의 모습과 세상을 변화시길수 있는 근본 기술 중 하나라고 저는 믿기 때문에, 앞으로도 조금 더 이야기 하고 다니려고 합니다.\n\n한동안 Agile에 대해 제가 그랬던 것처럼 말입니다.\n\nps.\n외국에서 Agile 기법중 가장 크게 효과를 본 기술 Top5와 가장 배우기 어려웠던(즉 제대로 실행하기 어려웠던)기술 Top5를 조사한 적이 있었습니다. 양쪽 다 순위에 포함된 기법 두 가지가 있는데, TDD와 짝 프로그래밍입니다. 배우긴 어렵지만 배우면 효과가 뛰어난 기술 두 가지인 겁니다.\n\n제 생각은 이렇습니다.\n\n고만고만한 기술 경쟁에서 남들 다하는거 더 잘 하려고 노력해서 우위를 차지 하기는 어렵습니다. 잘해야 반보 앞서거니 뒷서거니 하면서 출혈경쟁이 되기 쉽거든요. 차라리 남들이 어려워서 못한다고 생각하는 기술이나 분야를 '우리'는 잘해야 제대로 앞서 나갈수 있는 겁니다. 그게 블루오션으로 가는 길이고요.\n\n#### Comments\n\n관점이 저와 많이 비슷하군요. 저도 후배들에게 기술적인 이야기나 전달을 할 때 기술적인 홍보에 너무 솔깃하지 말라는 이야길 하곤합니다. \n기술은 흥망성쇄가 있고 변하는것과 변하지 않는것이 있다고 이야길합니다.\n\n원리와 사상을 먼저 이해하고 기초부터 차근차근히 실력을 갈고 닦으라고 이야기합니다. \n잘 아시다시피 SI를 하다보면 이런 이야기나 관점들이 타인에게 잘 전달이 되지 않을때가 많습니다. \n고작해봤자 TDD한다고 혼자 깨작되던게 전부였지요. \n일정은 짧고 스팩은 거대한데 누구하나 짝프로그래밍이나 TDD를 논할 수도 논하지도 관심조차 갖으려고 하지 않더군요. 글의 내용이 TDD에 관한 이야기를 하셨지만 TDD와 같은 맥락에서, 원리와 사상을 먼저 이해하는데 노력해야 한다고 봅니다. \n\n최근 신입들은 신 프레임웍에만 눈이 멀어 그것이 전부인줄알고 있는 사람들이 많습니다. 이점 매우 안타깝죠. 프레임웍이나 그 기술이 없으면 어떤거 하나라도 제대로 구현할 수 없는 그들을 보면서 항상 옆에서 씁쓸함도 많이 느끼곤 했습니다. 그전에 그 기술이 가지고 있는 의도나 구조론, 또는 존재가치에 대한 이유를 먼저 알려고 노력하고 api보다는 설계위주의 사상, 예를들어 OOAD나 원리를 먼저 깨우치는 모습이 중요하지 않을까 합니다.\n\n저 같은 경우 경쟁을 위해 이 바닥에서 일해온게 아니라서 마지막 결론에 대한 관점은 글쓴이와 많이 차이가 납니다. 물론 남들이 하지 않는걸 한다는 입장은 꽤 오래전에 마음에 담아두고 있었던 관점이었는데, 이런 관점이 지금은 많이 없어졌습니다. 경쟁보다는 융화가 앞으로의 자기 발전에 더 좋다고 깨우쳐서인것 같습니다.\n\n적절한 하드웨어에 대한 비유(AMD와 InTEL의 계산방법은 틀리지만...) 그리고 글 잘보았습니다.\n신입들에게 좋은 로드맵이 되어 줄 수 있는 선배와 교육자가 되어주십시오.\n\n간만에 신선하고 관점이 90% 비슷해서 댓글을 좀 길게 달아놨습니다. 저도 제 지식을 물려줄 수 있는 이들을 찾고 있어서 요즘 고민이 많거든요:) 최근엔 개인적으로 레일즈로 TDD를 시도해 보고 있습니다. 쿨럭:)\n\n [moova](http://moova.tistory.com) | 2010-08-29 일요일 오후 6:36\n\n--\n\n제가 TDD 이야기할때 먼 처음에 하는 이야기 중 하나는, '더 나은 세상과 나와 더 나은 삶을 만들기 위해서'라고 말하곤 합니다.\n\n경쟁에서 앞서기 위해서라는 건, 그것만으로는 동기부여가 되지 않을 경우, 의사결정자 분들을 설득하기 위해서 하는 말입니다. :)\n\n저도 moova님과 생각이 비슷합니다. \n그래서 Agile을 하는거구요. \n\n좀 더 행복하고 즐겁게 함께 일하자!\n\n:)\n\n [doortts](http://blog.doortts.com) | 2010-08-30 월요일 오후 5:52\n\n--\n\n압박을 드리겠습니다.\n\"자주\"  글 써 주세요.\n\n [토비](http://toby.epril.com) | 2010-08-29 일요일 오후 6:52\n\n--\n\n:(\n\n [doortts](http://blog.doortts.com) | 2010-08-30 월요일 오후 5:55\n\n--\n\n제가 보는 TDD는 사람의 실수를 막는 하나의 방법으로 보고 있습니다. The art of unix programming에서 부록에서 나오는 이야기에  \"그가 위대한 이유는 그는 자신이 바보라는 것을 알았기 때문이다.\"라는 말이 있지요. 실수를 막아주는 것 말고도 작은 성취를 계속해서 경험하게 하는 좋은 면 등등 여러가지 좋은 점들이 있지만, 여러가지 편견과 몰이해로 관심을 두지 않는 사람이 더 많은 것 같습니다.\n전 후배에게 알고리즘과 자료구조를 항상 강조하고 있습니다.(SI에서는 거의 고려되지 않을 수도 있겠지만요.) 좀 더 앞서겠다는 생각보다는 \"좀 더 좋은 프로그램을 만들고 싶다.\"라는 욕망이 더 바람직하지 않을까 생각합니다.\n\n [Samuel](http://defree.co.kr) | 2010-08-30 월요일 오전 9:39\n\n--\n\n:) 네. 말씀하신 내용이 맞는 것 같습니다. 의견 달아주셔서 감사합니다.\n\n [doortts](http://blog.doortts.com) | 2010-08-30 월요일 오후 5:55\n\n--\n",
    "attachments": [
      {
        "id": 21784,
        "name": "WoodyAllan.jpg",
        "hash": "1c50badff12f9bec81568a4ad3d2229e5e695345",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 5459,
        "containerId": "12302"
      },
      {
        "id": 21785,
        "name": "cpu.jpg",
        "hash": "e7dbc140eedc03389614e24c104e8bb1f3e0140e",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 124574,
        "containerId": "12302"
      }
    ]
  },
  {
    "id": 132,
    "title": "[뭘, 이런걸 다?] 이클립스 자바 EE에서 HTTP 프로토콜 메시지 보기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1284388383000,
    "body": "> doortts | 2010-09-13 월요일 오후 11:33 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/132)\n\n\n\n이번주는 경기도 가평 모처의 연수원에서 신입사원 교육을 하고 있습니다. Servlet & JSP를 가르치는 과정입니다만, 바로 웹 개발을 가르치기 보다는 HTTP 프로토콜을 먼저 가르칩니다. 그런데 이왕이면, 말보다 실제 프로토콜의 메시지를 보면 더 재밌어 하지 않을까 하는 생각이 들어 이클립스에서 HTTP 프로토콜 메시지를 보는 방법에 대한 간단 매뉴얼을 만들어 보았습니다. 물론 관련 프로토콜 캡처관련 전문 툴이나 브라우저 플러그인 들이 다수 있지만, 수강생 PC에 이클립스가 이미 설치되어 있고 UI가 간결하다는 점에서 는 이클립스 내장 모니터링 툴도 나쁘지 않다고 판단하였습니다. 내일 교육 과정에서 한번 적용해 보고 괜찮으면 다른 강사들과 공유해 볼 생각입니다. :)\n\n**[이클립스에서 HTTP 프로토콜 메시지 보기]**\n\n아래 내용은 이클립스 Helios 버전을 기준으로 갈무리 했습니다만, 하위 버전인 Galileo 버전에서도 정상적으로 동작하는걸 확인했습니다. 참! 톰캣은 이클립스에서 미리 설정되어 있어야 겠죠? :)\n\n![001.png](/files/21788) \n\n\n\nindex.html 이 위와 같다고 가정합니다. (참, 간단하네요~) \n\n  \n\n![002.png](/files/21786) \n\n\n\n아! 웹 프로젝트는 또 위와 같다고 가정할게요.\n\n  \n\n[003.png](/files/21793) \n\n\n\n이클립스메뉴 => [Window] => [Pererences] 선택\n\n[004.png](/files/21795)\n\n일일이 찾아가려면 번거로우니까, 필터(filter) 박스에 대고 monitor라고 타이핑 합니다. 그러면 TCP/IP Monitor설정 화면을 바로 찾을 수 있습니다. 우측에서 [Add..]버튼을 눌러서 모니터를 추가해 봅시다.\n\n[005.png](/files/21790) \n\n\n\n\n\n로컬 모니터링 포트(Local monitoring port)는 모니터링 대상 포트(8080)와 다른 포트로 지정합니다. 일종의 프록시 처리를 하기 위해서입니다. 지금은 8081 포트로 8080 포트를 모니터링 할 예정입니다. 간편하게 사용하기 위해 '자동으로 모니터링 시작(Start monitor automatically)'도 체크한 다음 OK 버튼을 누릅니다.\n\n![006.png](/files/21797) \n\n\n\n설정 화면이 위와 같이 되어 있는지 확인해 봅니다.\n\n\n\n\n\n웹 브라우저에서 접속을 해 볼까요?\n\n![](http://blog.doortts.com/admin/entry/filePreview/cfile23.uf.1843191C4C8E2E9E43BAE6.png)\n\n그런데 **잠깐!**  이 때 주의할 점은 모니터링 대상 포트를 직접지정하는 것이 아니라, 모니터가 사용할 포트(지금은 8081포트)를 이용해서 접속해야 합니다. 내부적으로 포트 포워딩(Port forwarding)이 일어나면서HTTP 프로토콜 메시지를 캡쳐하거든요. 자, 그럼 접속해 봅시다.\n\n![008.png](/files/21787) \n\n\n\n웹 브라우저에 정상적으로 메시지가 출력되네요. 현재, 이클립스는 어떤 모습일까요?\n\n ![009.png](/files/21796)\n\n![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image021.gif)\n\nTCP/IP 모니터 탭이 자동으로 뜬 것을 볼 수 있습니다. 간단한 Request 헤더와Response 헤더의 메시지가 보이고, Response Body도 보이네요. 만약 Response Body가 텍스트로 보이지 않고 웹 브라우저처럼 렌더링 되어 보인다면, 셀렉트 박스가 Byte로 지정되어 있는지 확인해 보세요.\n\n  \n\n**이번엔HTTP 헤더를 자세히 봐 볼까요?**\n\n **** \n\n ![010.png](/files/21791)\n\nTCP/IP모니터 탭의 우측 상단의 역삼각형 모양을 누르면 메뉴가 나타납니다.\n\n  \n\n ![011.png](/files/21794)\n\n\n\n\n\n헤더보기(Show Header)를 선택합니다.\n\n \n\n ![012.png](/files/21792)\n\n\n\n짜짠!! 이제 HTTP 프로토콜의 메시지 헤더(Header)와 바디(body)를 모두 볼 수 있네요!\n\n \n\n#### Comments\n\n앗, 좋은 팁 감사합니다.\n\n [화니](http://me2day.net/lethee) | 2010-10-08 금요일 오후 4:41\n\n--\n\n별말씀을요. : ) 좋은 주말 되세요.\n\n [doortts](http://blog.doortts.com) | 2010-10-08 금요일 오후 6:43\n\n--\n\n오우 좋네요. 개인적으로 모니터링툴은 fiddler 라는 툴을 쓰는데. 이클립스에서 보여주는것도 꽤 좋은데요? ㅎㅎ\n\n 거친버스 | 2010-11-18 목요일 오후 2:42\n\n--\n",
    "attachments": [
      {
        "id": 21786,
        "name": "002.png",
        "hash": "26c962cb402cf1f7b1c0d4eec9e5eef0319771d3",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 21077,
        "containerId": "12303"
      },
      {
        "id": 21787,
        "name": "008.png",
        "hash": "7493d8c3caa8e26669a3c978f5f42f7bed124b55",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 16567,
        "containerId": "12303"
      },
      {
        "id": 21788,
        "name": "001.png",
        "hash": "5754b94e29a508ceeb8b3be128f9fc94ae04932e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14578,
        "containerId": "12303"
      },
      {
        "id": 21789,
        "name": "007.png",
        "hash": "804b05419e326b0641571ea5ecbb75a38958fd6b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15414,
        "containerId": "12303"
      },
      {
        "id": 21790,
        "name": "005.png",
        "hash": "d5428eaa4c428a1185937928a2804f616e654572",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15433,
        "containerId": "12303"
      },
      {
        "id": 21791,
        "name": "010.png",
        "hash": "f2cbacb8871615c3dcf5a84d18da9f99c9f1cf3b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 13140,
        "containerId": "12303"
      },
      {
        "id": 21792,
        "name": "012.png",
        "hash": "b9f97f2755a408daab3a41cf635874c8cbdb16fe",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 42406,
        "containerId": "12303"
      },
      {
        "id": 21793,
        "name": "003.png",
        "hash": "ef8ba0c580d2c239d90ab10303d3f31bd26403a6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 32406,
        "containerId": "12303"
      },
      {
        "id": 21794,
        "name": "011.png",
        "hash": "8d2c25c99ef52f2251a4314ac711b7f65c312ab6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 17808,
        "containerId": "12303"
      },
      {
        "id": 21795,
        "name": "004.png",
        "hash": "7d32212345b218d2bf1a9dfbf89b9af6cfc8b113",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 26612,
        "containerId": "12303"
      },
      {
        "id": 21796,
        "name": "009.png",
        "hash": "2082516bb7a9911c14f785fd513970c25a332c15",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 29968,
        "containerId": "12303"
      },
      {
        "id": 21797,
        "name": "006.png",
        "hash": "6b2a5f609360cb57c9bd70c6be1da3ca82274c7b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 28092,
        "containerId": "12303"
      },
      {
        "id": 21798,
        "name": "004.png",
        "hash": "7d32212345b218d2bf1a9dfbf89b9af6cfc8b113",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 26612,
        "containerId": "12303"
      }
    ]
  },
  {
    "id": 133,
    "title": "[dW Review] 자바 컬렉션 중 enhanced for Loop와 성능에 대한 이야기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1284947000000,
    "body": "> doortts | 2010-09-17 금요일 오전 11:47 | Better SW Development | [원본](http://blog.doortts.com/133)\n\n[IBM developerWorks](http://www.ibm.com/developerworks/kr/ \"[http://www.ibm.com/developerworks/kr/]로 이동합니다.\")에는 개발자에게 도움이 되는 양질의 자료가 종종 올라오곤 합니다. 예전엔 영문사이트에 영문자료 뿐이었는데, 이제는 한글사이트에 한글로 번역된 자료들도 많아졌습니다. 다 읽지 못할 정도로 말입니다. 최근에 본 자료중에서 [Java Collections API에 대해 모르고 있던 5가지 사항](http://www.ibm.com/developerworks/kr/library/j-5things2.html \"[http://www.ibm.com/developerworks/kr/library/j-5things2.html]로 이동합니다.\")이라는 기사가 있었습니다. 자바 개발자라면 한번쯤 봐둘만한 내용이고, 초급개발자라면 빨리 보면 볼 수록 좋은 내용이라 생각합니다.\n\n오늘은 그 내용 중에서  Enhanced for Loop(=for-each)구문과 성능에 대해서 좀 더 이야기를 해보려고 합니다.\n\n:: About 컬렉션 ::\n\n우선 아래와 같은 컬렉션이 있다고 가정하겠습니다.\n\n    List users = new ArrayList();\n    users.add( new User(\"cobb\") );\n    users.add( new User(\"Arthur\") );\n    users.add( new User(\"Eames\") );\n\n[User 엔티티를 원소로 갖는 List]\n\n아래는 코드는 컬렉션을 객체지향적으로 꺼내는 방식에 대한 코드입니다.\n\n    Iterator iterator = null;\n\n    for( iterator = users.iterator(); iterator.hasNext(); ) {\n        User user = (User)iterator.next();\n        System.out.println( user.getName() );\n    }\n\n[#1\\. Iterator 사용]\n\niterator 라는 표준 산출방식을 이용해서 객체 원소를 뽑아내는 방식입니다. 객체지향 패턴이 적용된 방식이고, 권장하는 방식인건 알지만 제 주변에서는 iterator를 사용하는 사람을 잘 보지 못했습니다. 오히려 아래와 같이 많이 쓰죠.\n\n    for(int i = 0; i < users.size(); i++ ) {\n        User user = (User)users.get(i);\n        System.out.println( user.getName() );\n    }\n\n[#2\\. Hand-Writing index 사용]\n\n만약 위 코드를 Java 5에서 부터 적용된 enhanced for loop문을 사용하면 다음과 같이 쓸 수 있습니다. 기본적으로 Iterable 인터페이스를 구현한 객체에는 다 적용가능한 코드입니다.\n\n    for( User user : users  ) {\n        System.out.println( user.getName() );\n    }\n\n[#3\\. enhanced for loop 사용]\n\n간결함으로는 세번째 향상된 for loop 문이 가장 좋아보입니다. 그리고 디자인 패턴이나 리팩터링 강의때도 대부분의 경우 세번째를 권장합니다. 작성되는 코드가 간결할 수록 좀 더 복잡한 시스템을 좀 더 쉽게 구축가능하기 때문입니다.\n\n그런데, 성능측면으로는 어떨까요? 셋 중 어느 것이 제일 나을까요?\n\n사실 코드 조각을 놓고 성능을 논하는 건 그다지 좋은 접근법은 아닙니다. 일반적으로 성급한 성능 최적화 보다는 간결하고 의미적으로 명확한 코드를 작성하는 걸 (매우)권장합니다. 하지만 C시절부터 이어진, '아낄수 있을때, 최대한 아끼고 보자' 사상으로 볼때는 세 코드는 성능에 대한 차이가 있습니다. 위 코드에서 사용자의 이름(user.getName() )을 출력하는데에 있어 가장 비용이 적게 드는 건 인덱스를 직접 지정하는 #2 방식 입니다. #1이나 #3은 대동소이합니다. 왜냐하면 enhanced for loop는 알고보면 #1 방식을 랩핑한 것이거든요. 즉, iterator라는 객체를 새로 만들어 내기 때문입니다.\n\n객체 생성은 전통적으로 다른 작업에 비해 비용이 많이 드는 작업입니다. (VM이 계속 발전하고 있다곤 하지만 말입니다). 특히  리소스가 한정된 상황, 즉 요즘 유행인 안드로이드같은 환경에서는 좀 더 민감해집니다. 단순히 CPU나 메모리만의 문제가 아니라, 그와 연관된 '배터리'의 문제까지 이어지기 때문입니다. 따라서, '최대한 아껴야 산다'는 표어가 다시 벽면에 표어로 붙게 되는거죠.\n\n[speed.jpg](/files/21799)\n\n따라서 퍼포먼스를 따진다면 #2에서 조금 바뀐 형식으로 아래와 같이 사용할 것을 권장합니다.\n\n    int size = users.size();\n    for(int i = 0; i < size; i++ ) {\n        User user = (User)users.get(i);\n        System.out.println( user.getName() );\n    }\n\n[#4\\. 컬렉션 추출시 성능을 최대한 짜내기]\n\nsize() 메소드 호출하는것 조차 반복되지 않도록 아끼는 거죠. 안드로이드같은 한정된 디바이스에서라면 위와 같이 사용해야 합니다. 안드로이드 VM(=Dalvik VM) 기준으로 약 3배정도 빠르다고 합니다. (와우!)\n\n하지만 앞에서도 말했듯이 일반적인 OO프로그래밍에서 좋은 습관이라고 부르긴 어렵습니다. 오로지 성능에 올인한 형태이기 때문입니다. 그래서 가독성이 좋아짐에도 컬렉션 추출에 enhanced for loop 문을 비추하는 상황이 벌어지는 아쉬운 상황이 발생합니다. enhanced for loop는 컬렉션 뿐 아니라 배열(array)에도 쓰이는데, 이 경우에는 또 어떨까요?\n\n:: About 배열 ::\n\n컬렉션과 비슷하게 흔히 사용되는 객체 리스트에는 배열(array)이 있습니다. 아래 코드는 안드로이드 개발자 사이트에서 소개된 코드입니다. 메소드가 zero(), one(), two() 세 개 있습니다.\n\n    static class Foo {\n        int mSplat;\n    }\n    Foo[] mArray = ...\n\n    public void zero() {\n        int sum = 0;\n        for (int i = 0; i < mArray.length; ++i) {\n            sum += mArray[i].mSplat;\n        }\n    }\n\n    public void one()  {\n        int sum = 0;\n        Foo[] localArray = mArray;\n        int len = localArray.length;\n\n        for (int i = 0; i < len; ++i) {\n            sum += localArray[i].mSplat;\n        }\n    }\n\n    public void two()  {\n        int sum = 0;\n        for (Foo a : mArray) {\n            sum += a.mSplat;\n        }\n    }\n\n\n위 세 개의 메소드 중에서는 어떤 것이 제일 성능상 빠를까요?\n\n조금 앞에서 이야기 한 바에 따르면 첫 번째에 해당하는 zero()나 두 번째에 해당하는 one()이어야 할 것 같습니다. 그런데 답은 for-each를 사용한 two()입니다. (으응?)\nzero의 경우 매 loop마다 length를 사용하는 비용을 치뤄야 합니다. 언듯 생각하면 컴파일러가 inline으로 값을 치환해서 zero()나 one()이 같아야 할 것 같지만, JIT(Just In-Time)컴파일러의 경우에도 array.length는 아직 최적화가 이루어지지 않았다고 합니다.  반면에 for-each문은 최적화가 이루어진다네요. 따라서 one() 처럼 쓰면 좀 더 빨라지고, two()처럼 쓰면 가장 빨라진다고 합니다. 특히 zero()와 two()는 차이가 많이 난다고 합니다.\n\n자, 이제 Enhanced for Loop문에 대한 결론을 내려봅시다.\n\n1\\. 쓸수 있다면 최대한 쓴다.\n2\\. 성능이 크리티컬한 영역에서 컬렉션을 대상으로 할때는 Hand writing index를 이용하는 걸 고려해 본다.\n3\\. 파워가 충분히 공급되는 서버사이드 개발일 경우에는 고민할 필요도 없다. 쓰자.\n\n\n네? 성능요? 이래서 미리미리 성능을 생각해서 코딩해야 한다는 오래된 규칙이 맞는거 아니냐고요?\n\n:)\n\n조슈아 블로쉐의 이펙티브 자바(Effective Java)에서 소개된 '신중한 최적화(Optimize Judiciously)'항목에는 다음과 같은 문구가 있습니다.\n\n우리는 최적화 작업에 대해 다음과 같은 규칙을 따른다.\n * 규칙 1\\. 하지 않는다.\n * 규칙 2(전문가에 한해). 하지 않는다. 완벽하리만큼 깔끔하고 최적화가 필요없는 해법을 찾기 전까지.\n- M.A. 잭슨\n\n작은 효율증진에 대해서는 잊어라. 97%에 해당하는 시간에 대해 이야기 하자. 미숙한 최적화는 모든 악의 근원이다.\n- 도널드 E. 크누스.\n\n(맹목적인 어리석음을 포함한) 어떤 다른 이유보다도 '효율성'을 명목으로 이루어지는 컴퓨팅 죄악이 더 많다. 그럴필요가 없음에도 말이다.\n- 윌리엄 A.울프\n\n\n\n위 문구는 안드로이드 개발자 사이트, 성능을 고려한 설계(Designing for Performance)에도 기재되어 있답니다.\n우선은 프로그램을 좋은 구조로 잘 만드세요. 그 다음에 성능을 고려하시는게 더 좋을 것 같습니다.\n\n왜냐하면, 그 반대 순서로 작업하는 건 훨씬 어렵기 때문입니다. :)\n\n[참조] Java Collections API에 대해 모르고 있던 5가지 사항\nhttp://www.ibm.com/developerworks/kr/library/j-5things2.html\n\nDesigning for Performance\nhttp://developer.android.com/guide/practices/design/performance.html\n\n#### Comments\n\nEffective Java 2nd Edition의 Item46에 보면,  \"Note that there is no performance penalty for using the for-each loop, even for arrays\"라고 되어 있는데, JVM에 따라 달라지는건가요? \n 위와 같이 loop대상객체의 크기를 한번만 계산하는 것도 알아서 해준다고 Effective Java에는 되어 있어 있는데, 배열만 그렇게 해주는 건지 모르겠네요. \n\n그리고 iterator.next()가 빠를지, get(i)가 빠른지는 RadomAccessList이냐의 여부에 따라서 달라질 것 같습니다. 그래서 randomAccessList이냐를 검사해서 get(i)와 iterator를 구분해서 쓰는 최적화 기법도 있었어요\n( http://benelog.egloos.com/1382604 에 RadomAccessList에 대해서 적어놨어요)\n\n그리고 Effective Java Item 45에 따라서 size를 구하는 코드를 쓸 때도  변수의 범위를 최소화시켜서 아래와 같이 for 구문 안으로 넣는 것을 저는 선호하고 있어요 ^^;\n\n    for(int i = 0,size= user.size(); i <  size; i++ ) {\n        User user = (User)users.get(i);\n        System.out.println( user.getName() );\n    }\n\n [benelog](http://benelog.egloos.com) | 2010-12-08 수요일 오전 6:47\n\n--\n\nRadomAccessList의 역할이 그거였군요!\n전 그냥 ArrayList 계열 한정정도라만 알고 있었거든요. :)\n\n아. 그리고 구글 안드로이드 가이드에도 상혁님 쓰신 내용이랑 비슷한 문구가 나와요. :)\n\nTo summarize: use the enhanced for loop by default, but consider a hand-written counted loop for performance-critical ArrayList iteration.\n(See also Effective Java item 46.)\n*조슈아 아저씨가 구글에 있어서인걸까요? ㅎㅎ)\n\n사실 좀 더 쥐어짜고 싶으면\nList list = new ArrayList();\n보다는\n\nArrayList list = new ArrayList();\n쪽을쓰라고도 하더군요.\n\n그래서 전 습관적으로 상위추상타입으로 쓰는것 보다는, 해당 변수가 외부로 노출될때만 쓰는걸로 이야기 해요. 그리고 왠만하면 API자체를 노출시키는건 (편리한건 알지만) 선호하진 않고요. :) (TDD실천법과 도구 부록.레벨 불균형 부분)\n\n개인적으로는 안드로계열 프로그래밍 나오면서부터 객체지향형 구조보다 성능/메모리 절약지향으로 다시 돌아가는 부분이 많아서 아쉬워요. (크~)\n\n그나저나 우리, 조만간 밥 한번 또 먹어야죠? :)\n\n [doortts](http://blog.doortts.com) | 2010-12-08 수요일 오전 10:20\n\n--\n",
    "attachments": [
      {
        "id": 21799,
        "name": "speed.jpg",
        "hash": "462b71ceb2e636a00ccaa90249d5a289f495c5ea",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 117274,
        "containerId": "12304"
      }
    ]
  },
  {
    "id": 134,
    "title": "[dW Review] 함수형 언어로 가는 길 (상편)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1285543800000,
    "body": "> doortts | 2010-09-26 일요일 오후 9:36 | Better SW Development | [원본](http://blog.doortts.com/134)\n\nIBM dW 기사중에 [바쁜 자바 프로그래머를 위한 스칼라 입문](http://www.ibm.com/developerworks/kr/library/j-scala01228.html \"[http://www.ibm.com/developerworks/kr/library/j-scala01228.html]로 이동합니다.\") 이라는 멋지고 재미있는 연재글이 있습니다. 함수형 언어 중 하나인 스칼라에 대한 소개글인데, 바로 읽기에는 조금 어렵거나 지루할 수 있습니다. 특히나 처음 함수형 언어를 접하면 저와 동일하게 '으응? 뭐래?' 라는 식으로 제대로 읽기 어려울 것도 같다는 생각이 들었습니다. 관련해서 조금 돌아가지만 대신 차분히 접근할 수 있기 위해서 추가 글을 남겨봅니다. 군데군데 개인적인 사견이 많은 글이니 혹시라도 울컥!하진 마시고 적절히 걸러가면서 보세요. :)\n\n\n붉게 빛나던 루비(Ruby)는 우리 곁을 어떻게 지나갔던가?\n\n2000년대 중반, 그러니까 2005~2007년 정도쯤에 새로운 언어로써의 루비의 인기는 대단했다. 루비 온 레일즈(Ruby on Rails)라는 걸출한 프레임워크의 인기와 함께 언어 자체가 새롭게 조명되었고 많은 엔지니어들이 루비를 배웠다. 그 안에는 나도 있었다. 물론 나의 경우는 '호기심 천국'이라는 성격이 크게 한몫 했지만 유행이라는 파도에 휩쓸려 두둥실 떠다녔던 건 부정할 수 없다.\n\n개인적으로는 적지 않은 시간을 루비에 투자했었는데, 이젠 기억도 잘 안난다. 배웠지만 안쓰다 보니 무민(無民)과 동급이 되어버린 고등학교시절의 제2외국어 같이 변했다. 아쉽다. 손은 근질 거리는데, 루비로 한 것이 없다. Toy Program만 짜다 말았다. 사무실에 함께 할 사람이라도 있었더라면 좀 달랐을까?\n\n글쎄.. 사무실 동료들에게 루비 써 본적 있냐고 물어보면 새로 나온 마스크팩이냐고 되물음 당할 가능성이 농후하다. 그게 현실이다. (비난의 의도는 전혀 없다.)\n\n[ruby.png](/files/21802)\n[미안. 난 너의 베프가 되진 못했네..]\n\n아쉽지만 적어도 우리나라에서 루비는 주류가 되지 못했다.\n\n루비뿐인가? .net도 마찬가지다. 우리나라에서 닷넷을 처음 런칭하던때, 난 큰 정부 사이트의 운영팀소속 사원이었는데 부장님께 이야기 드리고 참석했던 기억이 난다. 그때 부장님은 닷넷이 서버이름인지 새로 오픈한 PC방 이름인지도 잘 모르셨을테지만 믿고 보내주셨다. 사원입장에선 참 감사했다. 어쨌든 그때 초대형 국어사전 크기의 C#책을 받아와서 한동안 공부했었던 기억이 난다. 한동안은 개발자들 사이에서 'C# vs JAVA, 뭘 선택할거냐'에 대한 논쟁과 토론도 참 많았었는데, 지금 생각해 보면 그런 논쟁할 시간에 책이나 한 권 더 읽었더라면 조금은 더 도움이 되었었지 싶다. 어쨌든,\n\n.net도 주류가 되지 못했다.\n\n그저 자바가 그 때도 지금도 쭉 대세(였)기 때문이다.\n\n'에라이~ 대세가 뭐 그리 중요하더냐? 재밌고 즐거웠고, 견문을 넓히는데 도움이 되었으면 되었지~'\n\n라고 자기위안을 하지만, 역시나 씁쓸한건 .net으로도 변변히 만들었던 제품에 대한 기억이 없다는 거다. 그저 in-house 레벨의 토이프로그램 수준이 고작이었고, 또 마찬가지로 몇 달 배우다 그만둬버린 '살사춤(헉!)' 같은 존재가 되었다. 차라리 그 시간에 자바나 더 들어 팔걸 하는 생각이 들었다.\n\n![microsoft_.net_logo.png](/files/21803)\n[알아. 인정할게. 비쥬얼 스트디오는 끝내줬었어. 그 당시엔 특히나 말이지]\n\nJAVA, 주류이나 지루하다\n\n자바가 나온지 15년이다. 우리나라에서 본격적으로 쓰이기 시작한지도 10년이 훌쩍 넘었다. 자바는 java 2라고 불린1.2 버전이 98년에 나왔고, 그 뒤로 매 2년마다 정확히 잰듯 Major 버전업을 해왔다. 그게 JAVA 6(=1.6)이 나온 2006년까지의 일이다. (java 6 - java 2 = 4, 4 * 2 = 8년. 1.2가 98년 + 8년은 2006년. 칼같이 맞추고 있다!)\n\n현재는 2010년이다. 제대로 왔다면 java 8이 나왔어야 할 시기지만 갈팡질팡 자바는 7버전 조차도 언제 나올지 미지수다. 적지 않은 사람들이 답답하고 지루해 했다. 그래서 프레임워크를 다량으로 만들어 내기 시작했다. 언어가 부족하거나 한계가 느껴지면 자연스레 '프레임워크'가 많아지는 법이다.\n\n![frameworks.png](/files/21801)\n[자바 프레임워크만 적은 거래요. - from apache wicket ]\n\n그래도 갈증은 가시지 않았다.\n\n복잡도가 높은 시스템은 점점 많아져 갔다. 소프트웨어를 더더 잘 만들기 어려워졌다. 시스템이 감당해야 하는 규모도 점점 증가해 갔다. 마찬가지로 더더 잘 만들기는 더더더 어려워졌다. 디자인패턴도 써보고, POJO로 돌아가도 보고, 스레드 프로그래밍을 위한 패키지도 증가해 나갔고, 상태저장을 배제하는 immutable에 대해서도 관심이 높아져 갔다. 그래.. 클로저(closure)... 루비를 비롯해서 다른 언어들에선 지원해 주는 클로저 개념은 자바를 계속 괴롭혀갔다. 도메인 스페... 아. 뭐더라. 맞다. DSL(Domain Specific Language)! 누군가가 도메인주도설계(DDD)와 DSL 이야기만 하면 자바는 자꾸만 작아져 갔다. 그때마다 많은 사람들이 말했다.\n\n'자바언어의 한계가 왔다.'\n\n아니, 한편으로는 그랬으면 좋겠다고 믿기 시작했는지도 모르겠다. 그래서 대안언어 중에서 차세대 주류언어감을 찾기 시작했다. 한때, 자바진영에서 프레임워크의 춘추전국시대라고 말했다면, 지금은 JAVA 대안언어의 춘추전국시대가 아닌가 싶다. 특히, 함수형 언어(Functional Language)가 그 선봉에 서 있는 것처럼 보인다. 적어도 나에겐 말이다.\n\n그래! 함수형 언어(Functional Language)는 어때?\n\n일반적으로 함수(function)라는 개념은 '상태를 가지지 않고 각각의 호출이 상호 간섭없이 배제적으로 실행가능하다'는 특징을 갖는다. 따라서 함수는 클래스와 달리 병렬호출시에 부작용이 적다. 따라서 이런 방식을 지향하는 함수형 언어는 필요한 만큼 분할해서 처리하도록 만드는 스케일업(Scale-up)이 용이하다. 대용량처리, 스레드 처리에 강점을 갖을 수 밖에 없다.\n\n개념자체는 나온지가 적잖이 되었지만, 소위 말하는 아카데믹한 수준에서의 사용이 대부분이었다. 그러다가 근래에 들어서면서 산업영역에서도 응용해서 사용하기 시작했다. 그 대표적인 예가 스웨덴 통신사 에릭슨의 fault-tolerant(내고장성) 시스템 구축을 위해 만들어진 얼랭(Erlang)이다. Erlang의 경우 Facebook의 chat 서비스에서도 사용되고 있다. multi-core cpu환경에서 heavy trasaction처리에서 확실히 우위를 갖는다고 한다. 요즘 한참 NoSQL중 하나로 주가를 올리고 있는 Apache CouchDB 도 얼랭으로 만들어졌다. 뭐, 그 뒤로 해스켈(Haskell)을 비롯한 언어들이 만들어지고 사용되고 있다. 최근에는 JVM위에서 동작하는 스칼라(Scala)와 클로저(Clojure, j에 주의!)가 자바 개발자들 사이에서 각광받고 있다. 이에대해서는 뒤에서 따로 더 살펴볼 예정이다.\n![erlang-logo.png](/files/21800)\n[어얼~ 랭?]\n\n함수형 언어는 현재 주류를 이루고 있는 언어를 imperative (명령형) 프로그래밍 언어로 규정한다. (명령형 프로그래밍이라는 단어는 이전부터 있었다고 말하는 사람도 있지만, 함수형 언어의 대두 전까지는 그렇게 부르는 경우가 많지 않았다는 점에 주의를 기울이자.)\n\n델파이, C, C++, JAVA, C# 등등은 각각의 프로그래밍 명령어가 프로그램의 상태를 변경시키는 형식으로 일을 처리하는 대표적인 명령형 프로그래밍 언어이다. functional과 imperative, 둘 사이를 가로짓는 특징은 state(상태)와 mutable(변화하는)이라는 단어로 표현된다.\n\nstate : 상태를 전역(static)으로 저장가능하게 할 것인가? 아니면 로컬 영역 한정으로 최소화 할 것인가?\nmutable : 데이터를 주고 받을 때 전달되는 값 자체를 변경가능하게 할 것인가? 아니면 변경불가하게 하거나 클론복사(clone copy)하는 형태로 오리지널을 훼손하지 않게 만들 것인가?\n\n물론 기존 언어(자바 등)에서도 선택이 가능한 부분도 있지만, 언어 차원에서 제약을 가하는 형태로 지원할 것인가는 좀 다른 이야기다. 그 외에는 언어부류 구분 자체를 가로지을 만한 요소라기 보다는 부수적인 특징이라고 생각한다. (좀 더 복잡하게 나가자면 [일급객체(First-class object)](http://en.wikipedia.org/wiki/First-class_object \"[http://en.wikipedia.org/wiki/First-class_object]로 이동합니다.\")나 [일급함수(First-class function)](http://en.wikipedia.org/wiki/First-class_function \"[http://en.wikipedia.org/wiki/First-class_function]로 이동합니다.\")등의 개념도 나오는데, 그건 우선 넘어가자. 다음에 좀 더 이야기 할 예정이다.) 함수형 언어에 대해 의욕이 생긴다 싶으면 위키피디아를 검색해 보자. 좀 더 즐거운 자료들이 기다리고 있다. 만약 영어글과 링크들이 부담스럽다면 서점에 가서 아래 소개할 책을 들고 10분정도 시간을 들여 해당 부분을 살펴 볼 수도 있다.\n\n조엘온 소프트웨어를 넘어서(more Joel on SoftWare, 이해일 옮김)의 스물 두번째 이야기 제목 \"여러분 프로그래밍 언어는 이런거 됩니까?\" (중략)  \n\n> 함수형 언어를 이해하지 못한다면, 구글에게 엄청난 확장성을 제공한 맵리듀스(MapReduce)같은 멋진 알고리즘을 절대 생각해내지 못합니다. 사실 \"맵\"과 \"리듀스\"라는 용어부터가 리스프(Lisp)와 함수형 언어에서 왔습니다. (중략) 순수 함수형 언어로 작성된 프로그램은 사이드 이펙트가 없어서 쉽게 병렬 처리가 가능하다는 사실을 기억하는 사람에게 맵리듀스는 그다지 어려운 알고리즘이 아닙니다.\n\n(하략)  \n\n7페이지 남짓의 짧은 글이지만, 함수형 언어의 필요성과 장점을 적절하고 재미있게 설명해 주고 있다. 거기에다 덤으로 구글의 [맵과 리듀스](http://en.wikipedia.org/wiki/MapReduce \"[http://en.wikipedia.org/wiki/MapReduce]로 이동합니다.\")에 대한 개념도 살짝 볼 수 있는 좋은 글이라 생각한다.\n\n(중편으로 계속)\n\n#### Comments\n\n좋은 글이네요.. 장타에다가.. ^^\n\n그런데 first-class가 '일급'이라 번역하면 좀 어색하지 않나요?\n딱히 떠오르는 말은 없지만, '주류'가 나은 듯도 하고.. 에구 모르겠다. \n밀린 일이나 해야지.. 휘리리~\n\n [지나가는 영회](http://younghoe.info) | 2010-09-27 월요일 오전 1:58\n\n--\n\n안녕하세요 영회님! :)\n이야기 주신대로\nFirst-class를 1급 객체라고 번역하고 보고, 원 의미를 제대로 전달하기엔 부족한 단어라는 생각이 드네요. \n\n용어 관련해서 잠깐 검색을 해보니 마침 해당 단어에 대한 다른 의견을 찾았습니다.\nhttp://swear013.tistory.com/1 \n\nps.\n참! 언제 또 식사한번 하셔야죠? 일민님 오시면 함께 보셔도 좋고요.\n그럼 즐거운 한 주 되세요~\n\n [doortts](http://blog.doortts.com) | 2010-09-27 월요일 오전 11:51\n\n--\n\n아쉽게도 일민형은 올해는 못온다 하니...\n번역모임 하실 때 함께 뵐까 합니다. ^^\n\n [지나가는 영회](http://younghoe.info) | 2010-09-28 화요일 오전 12:51\n\n--\n\n잘 봤습니다. 특히 시원시원하게 읽히는 문장이 정말 맘에 들어요.^^\n\n비유도 뛰어나시고.(어얼~랭?. 속으로 따라했어요.ㅎ)\n\n함수형 언어에 관심을 두고 싶은데.\n하고싶은게 너무 많아요.\n\n자바가 익숙하고 좋은 부분도 있지만..\n(엄마한테 잘못 말해서-곰탕이 맛있어- 라고 했다가 몇주째 곰탕만 먹었던 기억처럼)\n이젠 좀 바꿨으면, 다른 것도 먹어봤으면 하는 마음에서 동감 합니다.\n\n수고하세요!\n\n [지나가는 성현](http://architect1.pe.kr) | 2010-09-27 월요일 오후 12:16\n\n--\n\n중편 기대됩니다. 얼렁 올려주세요. ^^\n\n [k16wire](http://pragmaticstory.com) | 2010-09-28 화요일 오전 12:26\n\n--\n\n정말 맛깔나게 쓰시는군요~\n\n 원상호 | 2010-09-28 화요일 오후 1:3\n\n--\n",
    "attachments": [
      {
        "id": 21800,
        "name": "erlang-logo.png",
        "hash": "dfeececa484ddc7000bc30f3ade4ba61eee3979e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15073,
        "containerId": "12305"
      },
      {
        "id": 21801,
        "name": "frameworks.png",
        "hash": "4d9510290ace4866bd04ce8385f4ce25d256bec9",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 16917,
        "containerId": "12305"
      },
      {
        "id": 21802,
        "name": "ruby.png",
        "hash": "2f4c7b62dd7876d31e23f0692e0f51eab86a8bc0",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 15253,
        "containerId": "12305"
      },
      {
        "id": 21803,
        "name": "microsoft_.net_logo.png",
        "hash": "c9e634d9d8a838e41e0ca9bff61f538c8e283037",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14182,
        "containerId": "12305"
      }
    ]
  },
  {
    "id": 135,
    "title": "[dW Review] 함수형 언어로 가는 길 (중편) - 일급객체",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1285837468000,
    "body": "> doortts | 2010-09-30 목요일 오전 1:20 | Better SW Development | [원본](http://blog.doortts.com/135)\n\nIBM dW 기사중에 [바쁜 자바 프로그래머를 위한 스칼라 입문](http://www.ibm.com/developerworks/kr/library/j-scala01228.html \"[http://www.ibm.com/developerworks/kr/library/j-scala01228.html]로 이동합니다.\") 이라는 멋지고 재미있는 연재글이 있습니다. 함수형 언어 중 하나인 스칼라에 대한 소개글인데, 바로 읽기에는 조금 어렵거나 지루할 수 있습니다. 특히나 처음 함수형 언어를 접하면 저와 동일하게 '으응? 뭐래?' 라는 식으로 제대로 읽기 어려울 것도 같다는 생각이 들었습니다. 관련해서 조금 돌아가지만 대신 차분히 접근할 수 있기 위해서 추가 글을 남겨봅니다. 군데군데 개인적인 사견이 많은 글이니 혹시라도 울컥!하진 마시고 적절히 걸러가면서 보세요. :)\n\n\n[이전글 : [dW Review] 함수형 언어로 가는 길 (상편) ](http://blog.doortts.com/134 \"[http://blog.doortts.com/134]로 이동합니다.\")\n\n앞 글에서, 함수형 언어는 다루는 데이터를 훼손하지 않고, 배타적인 실행을 최대한 보장해 주기 때문에 스레드와 병렬처리에 장점을 갖는다고 했다. 장점은 알겠고, 언어적 특징은 어떠한가?\n\n함수형 언어는 함수자체를 일급 객체(First-class object)로 간주한다.\n\n![3132595314_807fcd0708.jpg](/files/21804)\n[이게 집이야? 비행기 좌석이야?]\n\n함수형 언어를 학습하기 시작하면 시점이 언제가 되었든 언젠가 한 번은 '일급 객체(First-class object)', 혹은 '일(등)급 시민(First-class citizen)'이라는 용어를 접하게 된다. 이 단어는 크리스토퍼 스트래치(Christopher Strachey)라는 영국 컴퓨터 과학자가 시대를 앞서 앞서 60년대에 만들어 낸 단어다. 그리고 두 단어는 동일한 의미로 사용된다.\n\n어떤 객체(일반명사)가 있을때 다음 조건을 만족하면 일급 객체로 간주한다.\n\n1\\. 변수나 데이터 구조안에 담을 수 있다.\n2\\. 파라미터로 전달 할 수 있다.\n3\\. 반환값(return value)으로 사용할 수 있다.\n4\\. 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.\n\n\n자, 그럼 자바를 기준으로 일급 객체는 무엇일까?\n\n일반적인 자바 오브젝트는 1~4를 모두 만족시킬수 있다. 따라서 일급 객체가 된다. 그럼 자바에서의 함수, 즉 메소드는?\n만족 안된다. 혹시라도 몇 개는 되지 않을까? 라고 생각할 수도 있지만, 미안. 안된다. 함수의 실행 결과는 만족시킬 수 있겠지만, 함수 그 자체는 일급객체로 쓰일 수 없다.\n\n    ..\n    return doSomething(a, b);\n}\n\n\n[위 코드를 함수를 넘기는 걸로 착각하는건 아니죠?]\n\n함수가 일급 객체가 되려면 함수 자체를 파라미터로 넘기고, 결과값으로 함수가 오는 것이 가능해야 한다. 즉, 자바같은 명령형 언어에서는 안되지만 (일반적인) 함수형 언어는 함수(function)가 일급 객체 조건 네 가지를 만족시킨다.\n\n예를 들면, 다음과 같은 두 가지 자바 함수가 있다고 가정해 보자.\n\nDB 작업하기\n\ndbWork( URL url, String qry ){\n    connectToDB( url );\n    sendQry( qry );\n    closeFromDB();\n}\n\n\n네트워크 작업하기\n\nnetworkWork( String serverIP, String msg ){\n    connectToServer( serverIP );\n    sendMessage( msg );\n    disconnect();\n}\n\n\n두 작업은 하는일은 다르다. 하지만, 묘하게 비슷하다는 느낌이 든다. 그렇지만 하나로 합칠 수는 없다. 아니, 이렇게 두 코드를 함께 놓고 비교하는 이상한 상황이 아니라면 합칠수는 없을까 라는 생각 자체가 들지 않을 것이다. 혹여, 같이 놓고 본다고 해도 호출하는 함수나 넘겨주는 파라미터의 타입이 다르기 때문에 개운하진 않지만 방법이 없다는 결론에 이른다. 이게 함수를 일급 객체로 간주하지 못하는 명령형 언어의 한계다.\n\n용사의 길, 마왕의 길. 시작과 끝은 다르지만 지나온 길은 같다.\n\n![film_hellboy6_pistole.jpg](/files/21805)\n[역할은 주인공인데 모습은 최종보스... 어쩌자는 거냐..]\n\n앞의 두 메소드 코드 구조를 가상코드(seudo code)로 작성해 보자.\n\nexecute( setup, setupWith, do, doWith, after ){\n    setup( setupWith );\n    do( doWith );\n    after();\n}\n\n이제는 위 코드를 마치 일종의 설계 템플릿이라고 자신을 세뇌해 보자. 그러면 다음과 같이 코드를 작성하는 모습이 상상가능하다.\n\nexecute( connectToDB, url, sendQry, qry, closeFromDB );\n\n그리고 위와 같이 호출하면 아래와 같이 실행되었으면 좋겠다.\n\n    connectToDB( url );\n    sendQry( qry );\n    closeFromDB();\n\n네트워크 작업의 경우도 마찬가지로 적용해 보면 다음과 같다.\n\nexecute( connectToServer, serverIP, sendMessage, msg, disconnect );\n\n역시 함수 이름을 파라미터로 넘기고 execute 메소드의 뼈대에 맞춰서 대치된다고 가정한다.\n\n    connectToServer( serverIP );\n    sendMessage( msg );\n    disconnect();\n\n위와 같은 방식이 가능만 하다면, execute 메소드 하나로 다양한 작업이 가능해 진다. 좀 더 상위 레벨 수준의 설계 템플릿을 만들어서 재사용이 가능해 진다. 이런식으로 프로그래밍이 가능하다면 코드 구조가 좀 더 유연해 질 수 있지 않을까?\n\n가능하다. 함수형 언어에서는.\n\n함수형 언어에서는 위와 같은 방식으로 구현하는 것이 가능하다.예제에서는 호출만 했지만, 원한다면 반환값으로 함수를 넘기는 것도 가능하다. 아래 예제에서는 이름없는(anonymous) 함수를 만들어서 넘긴 모습이다.\n\nsum = (x, y) {\n    return { x + y };\n};\n\nsum( 1, 2 );\n\n\n[함수 그 자체를 변수에 할당해서 사용한다.]\n\n물론 자바의 리플렉션을 사용하거나 루비의 메타프로그래밍을 이용하면 비슷하게 구현할 수 있다. 하지만, 부작용도 많고 무엇보다 프로그래밍 자체가 복잡해진다. 코드가 복잡해지는 건 앞에서 말했지만, 매.후. (오타아님)  나쁜일이다. 프로그래밍 언어는 사람을 좀 더 이해하기 쉽게 만드는 방향으로 발전해 나가고 있다는 걸 기억하자. 함수형 언어는 언어차원에서 함수를 일급객체로 다룰 수 있게 지원해 준다. \n\n이게 함수형 언어들이 갖는 제1 특징이다.\n\n (하편으로 계속)\n\n- 예고 -\n1\\. 왜 함수가 일급객체이여야 하나?\n2\\. 함수형 언어의 다른 특징들과 병행성\n3\\. 스칼라 vs 클로저\n\n#### Comments\n\n가끔씩 들러서 글을 보곤하는데 많은 도움이 됐습니다.\n이번 함수형 언어도 관심이 많았는데 이렇게 도움을 주시네요.\n고맙습니다. 하편도 기대할께요~ ^^\n\n soriwa | 2010-10-07 목요일 오후 2:20\n\n--\n\n헉, 하편 기대하겠습니다.\n\n도움이 되는 정보 많네요^^\n\n alex | 2012-07-07 토요일 오후 5:52\n\n--\n",
    "attachments": [
      {
        "id": 21804,
        "name": "3132595314_807fcd0708.jpg",
        "hash": "48de9e122847fd62f7f209ebaac2b6f68a40f124",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 70540,
        "containerId": "12306"
      },
      {
        "id": 21805,
        "name": "film_hellboy6_pistole.jpg",
        "hash": "98f4684fced774bde64a1d92b12ff19d782c64c2",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 121557,
        "containerId": "12306"
      }
    ]
  },
  {
    "id": 137,
    "title": "[뜬금없는 이야기] 악당의 자바7(Villain's Java 7)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1288016882000,
    "body": "> doortts | 2010-10-25 월요일 오후 11:22 | 이생각 저생각 | [원본](http://blog.doortts.com/137)\n\nJAVA 7은 나올때가 한 참 지났다. 왜 이리 오래 걸리는건지 이해가 잘 안가지만, 그래도 이젠 유저들의 숫자가 어마어마하고 다양한 집단의 다양한 이권이 왔다갔다 하는 상황이라는 걸 따져보면 조금은 답답한 마음이 누그러 들기도 한다.\n\n현재 자바는 성공한 젊은 벤처기업 SUN에서 노련한 장사꾼 오라클의 손으로 넘어가 있는 상태다.\n\n잠깐! 말을 이어가는데 짤라서 미안한데, SUN이 젊은 벤처라고? 아니지 않나?\n\n음.. 어떻게 생각할런지 모르겠지만, 외국에선 SUN은 성공한 젊은 벤처기업의 이미지가 짙다. 구글이나 페이스북, 유투브, 플리커등의 인터넷 서비스 벤처와는 또 다른 의미로 벤처기업이 맞다. 자, 하려는 이야기는 이게 아니니까 이건 잠깐 넘어가자.\n![venture.jpg](/files/21807)\n어디까지 이야기 했더라? 아! 맞다! 현재 자바는, 취미가 요트와 비행기 수집인 세계 6대 부자에 성격이상한 낭비벽 래리 앨리슨의 손에 있다. 오라클의 그 간의 행보를 보건데, 비싼 돈 주고 썬을 인수했는데, 핵심 자산 중 하나인 자바를 그냥 놔둘리 없다. 아마 이런저런 눈치를 보고 있을 것이 분명하다. 자바를 버전7로 올리는것 보다는 자바가 어떻게 하면 돈이 될지를 사람시켜 파고 있을지도 모르겠다.\n\n그런데 사실 IT시장에서 유독 두드러지는 원리인 강자독식의 관점에서 놓고 봤을때, 지금은 자바로 돈을 어떻게 만들어 보겠다는 생각보다는 시장자체를 더욱 견고하게 만들어 버리는편이 낫다.\n\n 내가 만약 돈 좋아하는 앨리슨이라면 자바에 다음과 같은 세 개의 기능을 추가해서 당장 대대적인 홍보와 함께 자바 7을 내놓을 것이다. 이름하여 악당의 자바7 (Villain's Java 7) 이다!\n\n1\\. Objective-C와 C#에 있는 Properties 기능\n\nclass TimePeriod{\n\n     private  double  seconds;\n\n     public  double  Hours\n\n     {\n\n         get  {  return  seconds / 3600; }\n\n         set  { seconds = value * 3600; }\n\n     }\n\n }\n\n class  Program{\n\n     static  void  Main(){\n\n         TimePeriod t = new  TimePeriod();\n\n         t.Hours = 24; // setter 자동 호출. 3600 곱하기가 일어나서 저장된다.\n\n         System.out.println(\"Time in hours:  \"  + t.Hours);  // getter 자동 호출\n\n     }\n\n }  \n\n\n\n[C# 예제 변형]\n\n 2\\. 왠만한 스크립트 랭귀지들이 가지고 있는 cloure기능\n\nvar printMessage = function (s) {  var f = function () {  console.log(s + ' was pressed.'); } return f;  } \nbuttonA.onClick = printMessage('A');\nbuttonB.onClick = printMessage('B');  buttonC.onClick = printMessage('C');\n\n\n[클로저의 여러가지 사용방법 중 한가지. 함수형 언어와 명령형 언어의 중간 선택]\n\n3\\. Meta Programming 강화를 위한 일급함수 기능 (= 함수 그 자체를 변수처럼 할당하거나 인자로 넘길 수 있는 기능)\n\nf( x ) {\n    return x + 3 } g( function, x ){\n    return function(x) * function(x)\n}\n\nprint g(f, 7) \n\nPython 예제 변형. print g(f, 7) 결과로 100 이 찍힌다.\n\n왜 이런 기능을 추가하는 것이 악당의 자바7이란 말인가? 나쁘지 않지 않나?\n\n현재 판도를 보면 그렇지 않다. 한동안 자바가 숨죽이고 있는 동안 다른 대안언어들이 자신만의 색깔을 찾아나가고 있는 상황이기 때문이다. LISP계열, JVM위에서 돌아가는 언어들(Clojure, Scala, Groovy), RUBY, Python 등등이 살짝 살짝 세력을 높여가고 있는 추세이다. 그 세력 증가에는 자바에서 벗어난 자바개발자들이 상당수 차지한다. 지루하고 답답하고, 새로운 공기와 기능을 찾아서!\n\n크게 장사를 하려면 시장이 크고 그 안의 사람이 많아야 한다. 지금 당장 자바로 돈을 벌려고 하면 엄청나게 욕을 먹을 테니 우선은 자바 시장을 더 키워놓는 것이 중요하다. 핵심자사인 JVM과 자바를 적극 활용해서 플랫폼안의 개발자수를 늘릴 필요가 있다.\n\n따라서 시장을 지배하고 다른 언어들을 죽이고자 한다면 위 기능 세 개만 추가하면, (논란은 있겠지만) 왠만한 대안 언어들은 다들 대안이 채 되기도 전에 힘을 잃을 것이다.\n\nJUnit이 한동안 버전업이 없는 동안, TestNG가 좋은 기능을 여럿 소개했지만, JUnit4로 넘어오면서 TestNG의 좋은 기능 대부분의 기능을 흡수한 JUnit은 현재 자신만의 수성을 이뤄냈다.\n\n마찬가지로 위 세가지 기능을 추가한다면 자바는 왠만한 언어들을 고사시키고 더더 세를 늘려 살아 남을 것이다.\n\n다음은 왜 세가지 기능을 꼽았는지에 대한 이유다.\n\n1\\. Objective-C와 C#에 있는 Properties 기능 getter, setter를 직접 만드는 건 구시대 적이다. 귀찮다. 많은 언어들이 Properties기능을 지원해 주고 있다. getter 나 setter가 있으면 해당 메소드를 통하고, 없다면 다이렉트로 변수에 접근한다. 자바빈을 만들때도 아주 편리하다. C의 구조체를 사용하던 사람들에게도 환영받을만 하다.  \n\n 2\\. 왠만한 스크립트 랭귀지들이 가지고 있는 closure기능\n자바 유저들을 루비, JRuby, Groovy들의 유혹으로부터  격리시킬수 있다. 그리고 자바가 이들로 부터 매번 공격받던 부분 중 커다란 부분 하나가 해소될 수 있다. 게다가 이미 JAVA5부터 지원해 주고 있는 enhanced for loop와 함께 쓸수 있게 만든다면, 루비의 블럭(block)을 거의 유사하게 만들어 낼 수 있을 것이다.  \n\n3\\. Meta Programming 강화를 위한 일급함수 기능 많은 함수형 언어들의 장점으로 내세우는 기능들을 무색하게 만들수 있다. .net은 이미 람다계산(Lamda Calculus)을 지원해 주고 있다. 언어가 복잡해 지고 어렵고는 크리티컬하게 중요한 문제가 아니다. 사람들이 이 기능을 얼만큼 쓸건지도 고민할 필요 없다. 단지 지원한다는 것만으로도 다양한 응용 방법을 찾아낼 것이고, 함수형 언어들이 타격을 받을 것이다. 특히 스칼라는 직격에 가까울 것이다. 커링(curring)이나 트레이트(trait)를 배우기 위해 고생했던 사람들이라면 이정도로도 충분히 자바에 만족을 느낄 것이다.\n\n한마디로 요약하면, 프로그램 언어 시장 청소 및 자바언어 사용자를 더더욱 견고하게 끌어들이기. 시장에서 정상의 자리를 유지하기가 목표인 것이다. 추가된 세 가지 기능만으로도 그간 자바에 불만을 느끼고 새로운 언어를 찾아 다니던 대안 언어 탐험가들에게 홈커밍데이를 만들어 줄 계기가 될 것이고, 자바는 여러 대안언어들의 킬러 랭귀지가 될 것이다. (못된 자바가 되겠지. evil java?)\n\n현재의 자바도 복잡하다고 뭐라 하는 사람이 많지만, 안쓰면 그만이다. 기능이 많은데 안쓰는 거랑, 없어서 못쓰는 거랑은 또 다르다. 새로운 전자제품에 내가 쓸 수 있는 기능이 더 많아서라기 보다는 단지 기존 제품에 없는 다양한 기능이 더 많다는 이유만으로도 새 제품은 내 손안의 물건보다 매력적으로 보이는 법이다. \n\n내막을 아는 사람들에겐 욕을 먹겠지만 괜찮다. 그렇게 많이는 모를 것이다. 단지 더 많은 자바 개발자를 위해 새 기능을 추가했을 뿐 아닌가?  시장 경제란 원래 잔인하다는 점도 위안이 된다.\n\n얼마전 자바원에서 오라클에서 JAVA 7을 놓고 이런저런 이야기가 오고간걸 안다. 하지만 아직도 자바 7은 어떻게 나올지 모르겠다. 그냥 재미 차원에서, 악당의 자바 7이 된다면 어떤 모습으로 만들까 하고 생각해 봤다.\n\n:)\n\n![villain.jpg](/files/21808)\n\n#### Comments\n\n정말 제시한 세가지 기능만 추가하더라도 자바에 불만을 가지는 많은 개발자들이 만족하면 살텐데 말이야. 나도 최근에 Scala를 공부하고 있는 것이 다른 언어의 새로운 개념을 이해하고 활용해 보고자하는 욕심이 많으니 만약 자바에 도입이 된다면 좀 더 적극적으로 활용할 수 있지 않을까 생각되네..\n\n재미있는 글이었다.\n\n 자바지기 | 2010-10-26 화요일 오전 10:14\n\n--\n\n와우! 100만년만의 형님 댓글이네요!\n\n2차 클베 무사오픈했다는 글은 봤습니다.\n그리고 스칼라 스터디도 하신다니, 역시 열정이!!!\n\n조만간 객원으로 한번 놀러 갈게요.\n그때 뵈요\n\n doortts | 2010-10-27 수요일 오후 2:0\n\n--\n\n제가 래리 앨리슨이라면... \n\n\n\n맥북에어랑 아이패드를 사고 싶;;;(응?)\n\n [Outsider](http://blog.outsider.ne.kr) | 2010-10-26 화요일 오후 2:12\n\n--\n\n요트와 비행기 수집이 가능한 캐릭터 치군, 넘 약한데~\n\n [doortts](http://blog.doortts.com) | 2010-10-27 수요일 오후 2:1\n\n--\n\n요트랑 비행기는 별로 필요가 없어서요 ㅎ\n\n [Outsider](http://blog.outsider.ne.kr) | 2010-10-27 수요일 오후 2:41\n\n--\n\n제시된 기능들은 이미 몇년 전부터 Java진영에서 이야기가 나오고 있는 것들.\nJava7에 대한 동향을 확인하심이.\n\nclosure는 java7에 포함하기로 했다가 java8로 넘어갈 기세임.\n\n 나무귀신 | 2010-10-27 수요일 오후 3:11\n\n--\n\n네. 알고 있습니다. 그럼에도 몇년째 지지부진하니 답답하다는 생각이 들곤 합니다. 어떨때는 차라리 스티브잡스식의 진행방식도 나쁘진 않다는 생각이 들 정도로 말입니다.\n\n방문해 주시고 의견 남겨주셔 감사합니다.\n좋은 하루 되세요. :)\n\n [doortts](http://blog.doortts.com) | 2010-10-27 수요일 오후 5:34\n\n--\n\n상상을 해본 건 알겠는데,  \"청소 대상인 비주류 언어\"들을 공부하면서 많은 걸 배운 입장에서, 당신 말대로 된다고 해도 자바에게 양분이 된 많은 내용들을 제공한 여러 언어들, 그런 다양성들이 단지  \"시장 경제의 잔혹함\"에 쫓겨난 거라고,  \"주류가 독점하니 철거민 쫓겨나듯 쫓겨나야지!\"  이런 판단은 슬프지 싶어. \n\n그리고 언어가 복잡해지고 어렵고는 크리티컬하게 중요하지 않다면(정말?) 함수를 first class로 다루면 한 번쯤 고려하게 되는 커링은 있으면 왜 안되는거여? 그리고 루비의 mix-in을 모방한 트레이트는 함수가 first class인 것과 무슨 상관인지 궁금해 지는군. 결국 그들도 글의 주장대로라면 추가해놓고 안쓰면 그만인거 아니여? 더구나 복잡해지고 어렵고가 크게 중요하지 않다면(guy steele의 OOPSLA 발표라도 드밀고 싶군) 더더욱! 근데 그거 생각보다 중요한 문제일텐데 말이지~\n\nclosure나 function type이 있음 좋다고는 다 생각하지만, 정말 자바에게 있어야만 하는지? 그렇다면 어떻게 있어야 하는지는 생각보다 어렵고 신중해야 할 문제라는 생각이 들어. (이 문제는 \"있어야 했고 있으면 좋은\"  기능인 Generic이나 Autoboxing 때문에 더 골치가 아프기도 하다는... 개인적으로는 BGGA가 그대로 들어왔다면 '새로운 자바는 외계어에요~'가 대세였을거라는 생각이 듬) 더구나 함수형 언어의 특징 도입은 향후에도 많은 영향을 미치는 big decision이라 그냥 봐도 어려워. 기다리는 입장에서 답답한 건 맞지만. 전혀 별개의 기능을 그냥 갖다 놓으면 되는 건 아님!\n\n여하간 자바에 있음 좋지! 그러면서 청소도 하고 (응?) 그런데 Joshua Bloch이 closure 논쟁을 언급하면서 다음과 같은 말도 했더라구.\n\n\"We should keep in mind that there is already a fine programming language for the JVM the offers both of these things, and Java interoperability to boot: Scala\"\n\n무조건 끌어 안는게 능사만은 아니라는 거지. 그리고 스칼라가 (마냥 좋은 것도 아니지만) 쓸데없이 많은 기능들을 믹서기에 넣고 생각없이 그들을 섞은 건 아니라구, 어차피 비주류인데 쫓겨나면 그만이지! 보다는 다양성을 존중해주길. 불만 많은 악당의 이름을 빌린 상상이더라도 말이야. 비주류이지만 자바의 다음 행보에 많은 참고가 되고는 있잖아. \n\n아프다더니 함수형 언어 들입다 공부했군! 글(상상)이 자극적이기에 댓글도 길었어. 글고 건강 좀 챙기라고.\n\n [nephilim](http://nephilim.tistory.com) | 2010-10-31 일요일 오후 12:48\n\n--\n\n여어~ 이봐~ 혹시, 나한테 따지는건 아니지? :)\n\n나도 자바7이 그렇게는 안나왔으면 좋겠다는 뜻이야. '공생'과 '다형','다문화'가 공존했으면 하거든.\n하지만 현재 자바가 고도의 경제 전략적인 집단 손에 들어갔으니 걱정스러워서 말야.\n\n:) 안부인사 고마워~ 얼릉 나아서 또 객원으로 놀러갈게~\n\nps. 의사말로는 '대상포진'이 재발했었다고 하더라구. 고생이 심했겠다면서 의사가 나한테 위로를...-,-;;;\n\n [doortts](http://blog.doortts.com) | 2010-10-31 일요일 오후 6:56\n\n--\n\n(사실 처음 읽고서는 이해를 잘못했음..)\n\n그냥 글 자체에 하고 싶은 이야기를 좀 해보려 하던 거였는데, \n경계를 넘나들었나 보군. 젝일슨 몰입도가 높다고!\n\n [nephilim](http://nephilim.tistory.com) | 2010-10-31 일요일 오후 8:6\n\n--\n",
    "attachments": [
      {
        "id": 21807,
        "name": "venture.jpg",
        "hash": "3a734e17c6d358af4d836498c69e592eceb81606",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 100006,
        "containerId": "12308"
      },
      {
        "id": 21808,
        "name": "villain.jpg",
        "hash": "925b5dd6a78bd9593670d94047f0cac0558a6745",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 63885,
        "containerId": "12308"
      }
    ]
  },
  {
    "id": 138,
    "title": "[dw Review] 자바 DTO 개선시키기, Lombok",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1288060200000,
    "body": "> doortts | 2010-10-26 화요일 오전 12:17 | Better SW Development | [원본](http://blog.doortts.com/138)\n\n아쉽게도 많은 언어들이 자신만의 장점을 소개할 때 많이 사용하는 방법 중 하나는 자바빈(Java Bean)을 얼마나 적은 코드로 구현할 수 있는지를 보여주며 자랑으로 삼곤 한다.\n\n별거 아닌데 살짝 분하다는 생각이 든다. 그게 뭐 큰 자랑이라고!... 라고는 하지만 때때로 자랑은 자랑이다. 너무 축약되서 의미가 훼손되는 수준이 아니라면, 코드 줄 수는 적을 수록 좋은게 맞다.\n\n자바의 대표적인 노다가성 코드가 엔티티 클래스나 자바 빈계열의 DTO클래스를 만들때 발생한다. getter와 setter로 클래스의 대부분을 채우기 십상이다. 그리고 hashcode나 equals구현, toString 정도 집어넣으면 별 로직도 없는 코드가 잔뜩 길어진다. 이럴때 유용한 자바 라이브러리가 바로 Lombok([http://projectlombok.org](http://projectlombok.org/ \"[http://projectlombok.org/]로 이동합니다.\")) 이다.\n\n![lombok.png](/files/21809)\n\n[IBM DW] Java 코드에서 불필요한 코드를 제거할 수 있는 편리한 방법\n[http://www.ibm.com/developerworks/kr/library/os-lombok/index.html](http://www.ibm.com/developerworks/kr/library/os-lombok/index.html \"[http://www.ibm.com/developerworks/kr/library/os-lombok/index.html]로 이동합니다.\")\n\n\n아래 코드는 Lombok을 사용하기 전\n\n\n\n`001 **import **java.util.Arrays;\n002 \n003 **public class **DataExample {\n004 **private final **String name;\n005 **private ****int **age;\n006 **private ****double **score;\n007 **private **String[] tags;\n008 \n009 **public **DataExample(String name) {\n010 **this**.name = name;\n011 }\n012 \n013 **public **String getName() {\n014 **return this**.name;\n015 }\n016 \n017 **void **setAge(**int **age) {\n018 **this**.age = age;\n019 }\n020 \n021 **public ****int **getAge() {\n022 **return this**.age;\n023 }\n024 \n025 **public ****void **setScore(**double **score) {\n026 **this**.score = score;\n027 }\n028 \n029 **public ****double **getScore() {\n030 **return this**.score;\n031 }\n032 \n033 **public **String[] getTags() {\n034 **return this**.tags;\n035 }\n036 \n037 **public ****void **setTags(String[] tags) {\n038 **this**.tags = tags;\n039 }\n040 \n041 @Override **public **String toString() {\n042 **return **\"DataExample(\" + **this**.getName() + \", \" + **this**.getAge() + \", \" + **this**.getScore() + \", \" + Arrays.deepToString(**this**.getTags()) + \")\";\n043 }\n044 \n045 @Override **public ****boolean **equals(Object o) {\n046 **if **(o == **this**) **return true**;\n047 **if **(o == **null**) **return false**;\n048 **if **(o.getClass() != **this**.getClass()) **return false**;\n049 DataExample other = (DataExample) o;\n050 **if **(**this**.getName() == **null **? other.getName() != **null **: !**this**.getName().equals(other.getName())) **return false**;\n051 **if **(**this**.getAge() != other.getAge()) **return false**;\n052 **if **(Double.compare(**this**.getScore(), other.getScore()) != 0) **return false**;\n053 **if **(!Arrays.deepEquals(**this**.getTags(), other.getTags())) **return false**;\n054 **return true**;\n055 }\n056 \n057 @Override **public ****int **hashCode() {\n058 **final ****int **PRIME = 31;\n059 **int **result = 1;\n060 **final ****long **temp1 = Double.doubleToLongBits(**this**.getScore());\n061 result = (result*PRIME) + (**this**.getName() == **null **? 0 : **this**.getName().hashCode());\n062 result = (result*PRIME) + **this**.getAge();\n063 result = (result*PRIME) + (**int**)(temp1 ^ (temp1 >>> 32));\n064 result = (result*PRIME) + Arrays.deepHashCode(**this**.getTags());\n065 **return **result;\n066 }\n067 \n068 **public static class **Exercise {\n069 **private final **String name;\n070 **private final **T value;\n071 \n072 **private **Exercise(String name, T value) {\n073 **this**.name = name;\n074 **this**.value = value;\n075 }\n076 \n077 **public static ** Exercise of(String name, T value) {\n078 **return new **Exercise(name, value);\n079 }\n080 \n081 **public **String getName() {\n082 **return this**.name;\n083 }\n084 \n085 **public **T getValue() {\n086 **return this**.value;\n087 }\n088 \n089 @Override **public **String toString() {\n090 **return **\"Exercise(name=\" + **this**.getName() + \", value=\" + **this**.getValue() + \")\";\n091 }\n092 \n093 @Override **public ****boolean **equals(Object o) {\n094 **if **(o == **this**) **return true**;\n095 **if **(o == **null**) **return false**;\n096 **if **(o.getClass() != **this**.getClass()) **return false**;\n097 Exercise other = (Exercise) o;\n098 **if **(**this**.getName() == **null **? other.getValue() != **null **: !**this**.getName().equals(other.getName())) **return false**;\n099 **if **(**this**.getValue() == **null **? other.getValue() != **null **: !**this**.getValue().equals(other.getValue())) **return false**;\n100 **return true**;\n101 }\n102 \n103 @Override **public ****int **hashCode() {\n104 **final ****int **PRIME = 31;\n105 **int **result = 1;\n106 result = (result*PRIME) + (**this**.getName() == **null **? 0 : **this**.getName().hashCode());\n107 result = (result*PRIME) + (**this**.getValue() == **null **? 0 : **this**.getValue().hashCode());\n108 **return **result;\n109 }\n110 }\n111 }`\n\n\n\nLombok을 사용하면 동일한 내용이 아래와 같이 구현가능\n\n\n\n`01 **import **lombok.AccessLevel;\n02 **import **lombok.Setter;\n03 **import **lombok.Data;\n04 **import **lombok.ToString;\n05 \n06 @Data **public class **DataExample {\n07 **private final **String name;\n08 @Setter(AccessLevel.PACKAGE) **private ****int **age;\n09 **private ****double **score;\n10 **private **String[] tags;\n11 \n12 @ToString(includeFieldNames=**true**)\n13 @Data(staticConstructor=\"of\")\n14 **public static class **Exercise {\n15 **private final **String name;\n16 **private final **T value;\n17 }\n18 }`\n\n\n\nLombok에는 이외에도 리소스 정리 작업( close 메소드 호출 계열)을 지원해 주는 @Cleanup 기능.\n원하는 수준으로 적절히 Lock을 제공하는 @Synchronized\n등등의 기능을 제공한다.\n\n다음 JDK에서는 일부 기능을 언어차원에서 지원해 줘도 괜찮을 것 같다는 생각이 든다. :)",
    "attachments": [
      {
        "id": 21809,
        "name": "lombok.png",
        "hash": "076f5318ee967a4410e9d66876a93df79235cff6",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 105654,
        "containerId": "12309"
      }
    ]
  },
  {
    "id": 139,
    "title": "[dw Review] 미친 과학자의 에디터? 혹은 최고의 에디터! Vi IMproved",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1288193242000,
    "body": "> doortts | 2010-10-28 목요일 오전 12:16 | Better SW Development | [원본](http://blog.doortts.com/139)\n\n개발자라면, 그리고 무언가 코드를 타이핑 하는것이 자신의 직업이나 취미의 일부인 사람이라면, 텍스트 에디터에 자연히 관심을 갖게 된다. 난 예전에 한동안 [에디트 플러스](http://editplus.co.kr/ \"[http://editplus.co.kr/]로 이동합니다.\")라 는 국산에디터를 사용했었는데 매우 편리했었다. 빠른속도 하며 깔끔한 화면하며 불편함이 없었다. 유일한 불편함이라면 쉐어웨어라서 시작할때 '쉐어웨어'화면을 몇 초간 봐야 한다는 점이었는데, 그나마도 한번 띄워놓고 계속 쓰면 크게 불편하진 않았다.\n\n[editplus-s[1].gif](/files/21810)\n[ 전세계적으로 많이 애용되는 국산 에디터 Editplus] \n그러다 회사에 입사해서 유닉스 시스템 관리를 하게 되었는데, '무언가 참 별로다!' 싶은 녹색화면에서 선배들이 코드작성을 하고 있는 것을 보게 되었다. 저게 뭔 화면이냐고 물었더니 vi 라는 에디터라고 했다. 질문도 이상했고, 대답도 이상했지만 뭐 어쨌든 그랬다. 그 이상한 화면에서 선배들은 무언가 열심히 작업을 해 댔는데, 개인적으론 이거 무슨 70년대 SF 영화 찍는 것도 아니고 되도 않는 녹색화면에서 토닥토닥 쉘 스크립트를 짜는 모습을 보니 당황스러웠다. 에디트플러스 같은 GUI에디터를 놔두고, 그것도 FTP기능까지 충분히 제공하는데, 메뉴라고는 보이지도 않고 오로지 글자만 있는 화면에서 작업을 하고 있다니, 이거 무슨 질나쁜 조크인가 싶었다.\n\n뭐 어쨌든 서버작업을 하려면 어쩔수 없다면서 선배는 vi 내게 사용법을 가르쳐 주겠다 했다. 보기엔 이래도 써보면 굉장히 편리한 에디터라고 이런저런 칭찬을 해대는데, '이사람이 지금 나를 한정치산자(=법률용어. 살짝 바보) 정도로 생각하는구나'라는 생각이 들었다. 그래도 업무를 하려면 배워야 한다니 어쩔순 없었다. 텔넷으로 유닉스 서버에 접속해서 선배의 말을 따라 vi 라고 타이핑한 다음 엔터를 눌렀다. 정확히는 파일 에디팅 하는 것을 연습해 봐야 한다고 해서 vi a.txt 라고 타이핑하고 엔터를 눌렀다.\n\n터미널 화면이 깨끗하게 변하면서 커서가 좌측 상단에서 깜빡 거렸다.\n\n몇 자 타이핑을 해봤는데, 이런 젠장!! 글자가 화면에 입력되지도 않았을 뿐더러, 화면 여기저기를 커서가 날라다녔다.\n\n'뭐냐? 이 에디터는? 내가 뭘 잘못하는 건가?'\n\n기분나뻐서 종료하고 빠져나오려고 했는데, 그 순간 또 당황하기 시작했다.\n\n종료메뉴도 없고, 이거 뭘 어떻게 해야 나올수 있는거냐? 그 이상한 화면에서 빠져나올수가 없었다. 마우스는 원래부터 안 동작했으니까 뭐라 할 말도 없고. 이런저런 별짓을 다해도 그 당시 나의 상식으로는 vi 에디터 화면을 빠져나올 수가 없었다.\n그렇게 당황해하고 있는 나를 보며, 선배는 옆에서 흐뭇한 미소를 짓고 있었다. 그러더니 의기양양한 표정으로 esc 버튼을 눌러 나를 진정시키고, : 키를 누른다음 q 라고 타이핑하고 엔터를 눌렀다.\n\n다시 평온한 유닉스 터미널 콘솔화면으로 돌아왔다.\n\n'이런!!! -_-'\n\n이게 vi 라는 유닉스 에디터에 대한 나의 10년전 첫 기억이었다. 그 뒤 조금씩 적응해가면서 쓰기 시작했는데, 한 몇 개월 지나니까 vi 라는 에디터가 정말 쓰기 편하다는 무리에 나도 편승했다. 텍스트 에디팅에 있어서는 최고 였다. 화면을 마음대로 왔다갔다하면서 원하는 만큼 바로바로 작업할 수가 있었다. 마우스를 안쓴다는 점이 처음엔 힘들었는데, 시간이 지나니 그 점이 오히려 장점으로 드러나기 시작했다. 그 당시 일반 텍스트 에디터엔 흔하지 않았던 타이핑한 단어를 기억해서 자동으로 입력해주는 auto-completion기능에 화면분할, 컬럼에디팅등등 알면 알수록 굉장한 에디터라는 생각이 들었다. 그리고 현존하는 거의 모든 프로그래밍 언어 별로 문법 강조(syntax highlight)도 지원해 주었다.\n\n익숙해지자 vi 에디터로 별의별 걸 다 했다. 쉘이야 기본이고, vi로 c도 짜고 java도 짜고, 일기도 쓰고, ToDo리스트도 관리하고, 매크로 만들어서 vi용 프로그램까지 만들었다. 남들이 울트라 에디터에 열광할때 혼자 뒤늦게 vi에 열광한 꼴이라니...\n\n현재는 vi 의 개량형인 vim (=Vi IMproved)가 주로 사용되고 있다.\n\n나도 지금은 예전같이 그런 매니악한 상태는 아니지만, 아직도 윈도우 PC에는 gui 기능까지 하이브리드 형태로 들어가 있는 gVim 이 설치되어있고, 맥북에는 macVim이라는 맥용 에디터가 설치되어 있다. (물론 mac은 기반이 유닉스라 기본으로 vim이 지원된다)\n\n![macvim1[2].png](/files/21811)\n[Mac용 gui Vim인 MacVim]\n\nvi는 처음엔 당황스러운데 일정기간이상 익숙해지면 굉장히 편리해진다. 이런 면에선 emacs와 비슷하지 않나 싶다.\n\n만일 기존 에디터에 식상해 있거나, 새로운 모험가의 도전정신을 발휘해보고 싶거나, 유닉스 환경에서 에디팅을 해야 할 일이 있다면 vi는 배워볼만 하다. (부가적으로 좌뇌개발에도 도움이 되지 않을까 싶다. :)\n\n처음에 접해서 혼자 배우려면 만만치 않은데, 마침 초보자를 위한 튜터리얼이 ibm dw 기사로 제공된다.\n\nvi 입문 -- 컨닝 페이퍼 이용하기\n[http://www.ibm.com/developerworks/kr/library/tutorial/l-vi/resources.html](http://www.ibm.com/developerworks/kr/library/tutorial/l-vi/resources.html \"[http://www.ibm.com/developerworks/kr/library/tutorial/l-vi/resources.html]로 이동합니다.\")\n\n\n 친절한 선배의 지도처럼 설명이 쉽게 잘 되어 있다. 20여분이면 읽고 따라할 수 있을 정도다. 그리고 컨닝페이퍼처럼 되어 있는 부분은 출력해서 책상옆에 붙여놓기 보기에 부족함이 없다.\n\n![vicheat-final[1].png](/files/21812)\n\n자, 자신을 괴롭히는 방식으로 좀 더 새롭게 발전하고 싶다면, vi를 배워보는 것은 나쁜 선택이 아니다. 다만, 일반 업무용으로 쓰기 위해서 vi를 배우는 일은... 글쎄.. 다시한번 생각해 보길 권한다.\n\n제목에도 썼듯이, 미친과학자(mad scientist)의 에디터이거나 혹은 최고의 에디터. vi는 그런 존재의 에디터이기 때문이다.\n\n\n#### Comments\n\nVi 이전의 에디터들은 vi로 가기 위한 몸부림이었고, 이후의 것들은 vi로 다시\n\n Spike^ekipS | 2010-10-28 목요일 오후 10:6\n\n--\n",
    "attachments": [
      {
        "id": 21810,
        "name": "editplus-s[1].gif",
        "hash": "565e809c5edfad10223bc6caed92ff0477f6bdcd",
        "containerType": "BOARD_POST",
        "mimeType": "image/gif",
        "size": 22456,
        "containerId": "12310"
      },
      {
        "id": 21811,
        "name": "macvim1[2].png",
        "hash": "b3fe45ec294fa4659133ed8acf497948662b3183",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 28798,
        "containerId": "12310"
      },
      {
        "id": 21812,
        "name": "vicheat-final[1].png",
        "hash": "3a42ee293e1542319bc60f8e7ad8afb4a3ab3cda",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 222758,
        "containerId": "12310"
      }
    ]
  },
  {
    "id": 140,
    "title": "[dw Review] 오픈 소스와 오픈 마인드와 비경제개념, 셋 다 다르다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1288518698000,
    "body": "> doortts | 2010-10-31 일요일 오후 6:51 | 이생각 저생각 | [원본](http://blog.doortts.com/140)\n\n최근 IBM  [developerWorks](http://www.ibm.com/developerworks/kr \"[http://www.ibm.com/developerworks/kr]로 이동합니다.\")에 [오픈 소스 입문](http://www.ibm.com/developerworks/kr/opensource/newto/index.html \"[http://www.ibm.com/developerworks/kr/opensource/newto/index.html]로 이동합니다.\") 이라는 글이 올라왔다. 이미 오픈소스 사용이 일반개념처럼 되어 있는 내 입장에서는 '오픈소스에도 입문이라는 것이 있나?'라는 생각이 들었지만, 잠시 생각해 보니 옛날 기억이 떠올랐다. 오픈소스가 단순히 취미삼아 인터넷에 올린 무료 프로그램이라고 정도로만 생각하던 시절, 같은 팀 동료([nephilim.tistory.com](http://nephilim.tistory.com \"[http://nephilim.tistory.com]로 이동합니다.\"))의 소개로 읽게 된 글이 있다.\n\n에릭 레이먼드(Eric Steven Raymond)의 성당과 시장(The Cathedral and the Bazaar)이라는 글이다. 해커문화와 오픈소스, 그리고 동기와 경제 모델에 대해서 흥미롭게 읽을 수 있는 글로 이만한 책도 없다는 생각이 든다. 정확히는 '성당과 시장'이라는 글이 유명해져서 나중에 다른 글과 함께 책으로 엮이게 되었다. 그래서 해당 책 안에 한 챕터로 '성당과 시장'이 포함되어 있다. 나름 짠하게 감동적인 문구들도 여러가지 들어 있다. 아직 읽어본 적이 없다면, 잠깐 기뻐해도 좋다. (그만큼 재밌다는 이야기다)\n\n현재 해당 책 전문은 GNU Korea에 공개되어 있다.\n[http://korea.gnu.org/people/chsong/cb/](http://korea.gnu.org/people/chsong/cb/ \"[http://korea.gnu.org/people/chsong/cb/]로 이동합니다.\")\n\n그 중에서도 다음 두 가지 항목을 읽어보길 권한다.\n\n저자 서문: 왜 관심을 기울여야 하는가?\n[http://korea.gnu.org/people/chsong/cb/myscope.ko.html](http://korea.gnu.org/people/chsong/cb/myscope.ko.html \"[http://korea.gnu.org/people/chsong/cb/myscope.ko.html]로 이동합니다.\")\n\n성당과 시장(The Cathedral and the Bazaar)\n[](http://korea.gnu.org/people/chsong/cb/ \"[http://korea.gnu.org/people/chsong/cb/]로 이동합니다.\")[http://korea.gnu.org/people/chsong/cb/cathedral-bazaar/index.html](http://korea.gnu.org/people/chsong/cb/cathedral-bazaar/index.html \"[http://korea.gnu.org/people/chsong/cb/cathedral-bazaar/index.html]로 이동합니다.\")\n\ndeveloperWorks기사에 다음과 같은 문구가 나온다.\n\n오픈 소스 소프트웨어는 저작권 소유자의 허락이나 적절한 라이센스 없이 배포되는 소프트웨어인 “warez”가 아니다.\n\n\n오픈소스는 말 그래도 소스가 오픈되어 있어서 자신의 필요에따라 해당 소스를 이용할 수 있다는 뜻에 더 가깝다. 자신의 기술을 공개했고, 그 공개된 기술을 통해 함께 더 발전해 나가길 원하는 것이 아닐까 싶다.\n\n현재 대부분의 경우, 오픈소스라고 하면 무료(Free)나 라이센스 제한(Non-free)이 있냐 같은 사용(using)에 좀 더 촛점이 맞추어져 있지만, 그 보다는 오픈소스를 통해 자신이 무엇을 하고 싶은지, 그리고 무엇을 이루는데 사용할 것인지도 함께 고민해 봤으면 좋겠다.\n\n가끔씩 드는 생각은, 우리 나라사람이 시발점이 되는 오픈소스는 왜 잘 없을까? 라는 의문이다. 이런 저런 이유가 떠오르지만, 아마 같은 질문을 받게 되었을때 당신이 떠올리게 되는 이유와 별반 다르지 않을까 한다.\n\n[뜬금없는 안부인사]\n10월의 마지막 날 일요일, 편안한 주말 저녁이 되세요. :)\n감사합니다.\n\n변변찮은 글 읽어 주시고 구독해주시고, 때때로 댓글도 남겨주시는 분들께\n그냥 문득, 인사하고 싶어져서요. ^^;;\n\n\n#### Comments\n\n열심히 글을 읽다가 '뜬금없는 안부인사'를 보고 놀랬답니다. :)\nRSS 구독자들까지 생각해주시는 꼼꼼함 감사드립니다. \n\n10월의 마지막 마무리 잘 하세요. :)\n\n [proxies](http://www.hiten.net) | 2010-10-31 일요일 오후 8:6\n\n--\n\n:) 감사합니다.\n즐거운 11월 되세요.\n\n참! 블로그 디자인이 너무 멋지신데요~\n\n [doortts](http://blog.doortts.com) | 2010-11-02 화요일 오전 9:2\n\n--\n"
  },
  {
    "id": 141,
    "title": "[번역] 서브버전 사용자를 위한 머큐리얼(mercurial)이전 가이드",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1291521920000,
    "body": "> doortts | 2010-11-12 금요일 오후 10:58 | Better SW Development | [원본](http://blog.doortts.com/141)\n\n조엘 온 소프트웨어로 유명한 조엘이 hginit.com 이라는 사이트를 만들어서 기고한 글 중, 서브버전 사용하시는 분들을 대상으로 하는 서브버전 재교육에 해당하는 부분을 번역해 봅니다.  hginit.com의 글을 읽고 서브버전에서 머큐리얼로 이전한 입장에서, 혼자가 아닌 함께 가고 싶은 마음에 부족하지만 번역 작업을 해 봅니다. ^^; 분산 저장소를 사용하고자 하시는 분들께 도움이 되었으면 좋겠습니다. 다만, 개인적인 여건상 '내맘대로의 번역'이 될 가능성이 매.우. 높습니다. 혹 어색한 부분이 있더라도 부디 너그러운 마음으로 봐 주시면 감사하겠습니다. 영어에 익숙하신 분은 원문(hginit.com)이 더 편하게 읽히실 수도 있습니다. 그리고 지적하실 부분이 있으시면 알려주세요. 반영하겠습니다.\n\n참고로, 원저작자 조엘[(Joel Spolsky](http://www.joelonsoftware.com/))에게 사전 허락을 받진 않았습니다만 절 비난하거나 고소하진 않으리라 믿으며 번역했습니다. :)\n\n\n---\n\n서브버전 재교육(Subversion Re-education)\n\n![hginit_home.png](/files/21817)\n\n출처 : [HGINIT.com](http://HGINIT.com \"[http://HGINIT.com]로 이동합니다.\")\n\n만일 당신이 서브버전(Subversion)을 사용해 왔다면, 머큐리얼(Mercurial)은 혼란스럽다고 느낄 겁니다. 본 튜터리얼은 머큐리얼이 작동하는 방식에 있어 서브버전과 가장 크게 다른 점에 대해 다루고 있습니다. 서브버전을 사용한 적이 없다면, 그냥 다음으로 넘어가길 바랍니다.\n.\n.\n.\n\n내 회사(포그크릭)의 개발자들이 서브버전에서 머큐리얼로 이전을 결정했을때, 난 혼란스러웠다.\n\n우선적으로, 난 왜 우리가 이전하면 안되는지에 대한 갖가지 어리석은 이유를 댔다. \"우리는 중앙 서버에 저장소를 유지해야 합니다. 그래야 안전합니다.\"라고 이야기했다. 하지만 그게 말이지... 내가 틀렸다. 머큐리얼을 사용하면 모든 개발자가 자신의 하드디스크에 전체 저장소의 복사본을 갖게된다. 사실 이 편이 더 안전하다. 게다가, 거의 모든 머큐리얼을 사용하는 팀들은 중앙 저장소도 함께 사용한다. 그리고 이 저장소는 강제로 백업을 할 수도 있고, 세 곳의 보안구역으로 나누어서 각각을 (배틀스타 갤럭티카의)사일런, (스타워즈의) 스톰트루퍼, 그리고 한눈에 홀딱 반할만한 (강아지)래브라두들들(뭐 아니면 당신네 IT부서에 필요한 뭐든지 간에 그걸로)로 완성할 수도 있다.\n\n\"분산 버전 컨트롤의 문제점은 너무 쉽사리 브랜치(branch)가 만들어 진다는 점입니다. 그리고 브랜치를 만드는건 항상 문제들을 일으키죠\"라고 내가 말했다. 이것도 마찬가지로 내가 틀린걸로 판명되었다. 난 계속 얼굴에 먹칠중이었다. 서브버전에서는 브랜치를 만들면 문제가 생긴다.  왜냐하면, 서브버전은 머지(merge) 작업을 하기 위한 충분한 정보를 저장하지 않기 때문이다.  머큐리얼은 머지작업이 고통 없고 쉽다. 그래서 브랜치를 만드는 것이 흔한일이고 아무런 해가 없다.\n\n그리고는 나는 또 말했다. \"좋아요. 머큐리얼을 사용하죠. 하지만 내가 이해할 수 있을거라고는 생각하지 말아주세요.\"  난 제이콥에게 내가 서브버전에서 일반적으로 사용했던 기능들의 리스트와 그에 해당하는 머큐리얼의 기능을 쪽지로 만들어 달라고 요청했다.\n\n이 시점에서 그 쪽지를 보여줄 수 도 있지만, 난 그러지 않을 생각이다. 그 쪽지는 수 개월간 내 머리속을 엉망으로 만들었기 때문이다.\n\n만약 당신이 서브버전을 쭉 사용해왔다면, 당신의 뇌는 아마 살짝.. 음.. 어떻게 말해야 무례하지 않을려나.. 음.. 당신은 뇌가 손상되었다. 아.. 이건 별로 예의바른게 아니지.. 어.. 당신은 재교육이 조금 필요하다. 난 머큐리얼이 서브버전보다 더 복잡하다고 쭉 생각하면서 6개월동안 뇌가 손상된채로 돌아다녔다. 그렇지만 그건 내가 머큐리얼이 실제로 어떻게 동작하는지 이해하지 못했기때문이다. 그러다가 한번 이해하고 났더니, 와우! 정말 쉽다는걸 알게 되었다.\n\n그래서 난 당신을 위해서 이 튜토리얼을 썼다. 그리고 가급적 서브버전의 관점에서 설명하지 않기 위해서 주의를 기울여서 작성했다. 세상에는 뇌가 손상된 사람들이 이미 충분히 많다. 그래서, (튜터리얼의) 시작 부분에 서브버전으로부터 이전중인 당신같은 사람들을 위한 챕터를 하나 만들었다. 이 챕터에서 당신이 입은 손상을 가능한한 최대한 되돌려서 깨끗한 석판같은 상태에서 머큐리얼을 학습할 수 있도록 노력할 예정이다.\n\n만약 서브버전을 사용해본적이 없다면, 다음 챕터**([Ground Up Mercurial](http://hginit.com/01.html))**로 넘어가도 무방하다.\n\n그럼 준비되셨남? 오케이. 짧은 퀴즈로 시작해 보자.\n\n질문1. 당신은 단번에 완벽한 코드를 작성합니까?\n\n만약 \"네!\"라고 답했다면, 당신은 거짓말장이에 사기꾼이다. 탈락이다. 다시 시험보삼.\n\n새로운 코드는 버그투성이다. 그럴듯하게 동작하게 될때까진 시간이 꽤 걸린다. 그러는 동안 팀의 다른 개발자들은 트라우마에 빠질 수도 있다.\n\n다음은 서브버전이 동작하는 방식이다.\n\n- 새로운 코드를 체크인하면, 다른 모든 사람들이 그 코드를 갖게 된다.\n\n당신이 작성하는 새로운 코드들은 (늘 그렇듯) 버그가 있기 때문에, 당신에겐 두 개의 선택지가 있다.\n\n- 버그가 있는 코드를 체크인해서 다른 모든 사람들을 돌아버리게 만든다.\n- 버그를 다 제거하기 전까진 체크인을 하지 않는다.\n\n서브버전은 당신에게 항상 이런 딜레마를 준다. 방금 작성한 새로운 코드가 들어있기 때문에 저장소가 버그로 득실대거나, 혹은 새로 작성한 코드는 저장소에 들어 있지 않거나.\n\n(다른) 서브버전 유저들처럼, 우린 이 딜레마에 아주 익숙해져 있다.\n\n서브버전(을 사용하는) 팀의 맴버들은 종종 수 일에서 수 주동안이나 아무것도 체크인을 하지 않곤 한다. 서브버전을 사용하는 팀의 경우, 새로 들어온 신입들은 새로운 코드를 체크인하는걸 끔찍히 두려워하게 된다. 빌드를 깨뜨릴까봐, 혹은 선임 개발자 마이크(Mike)를 열받게 만들까봐, 혹은 어떤 다른 이유로든 말이다. 예전에 한번은, 빌드를 깨드린 어떤 체크인 때문에 마이크가 완전 열이 받아서 인턴사원의 큐비클(=칸막이 사무공간)로 폭풍돌진해 책상위의 물건들을 확 쓸어버리며 \"넌 오늘부로 끝이야!\"라고 소리를 친적이 있다. (말처럼 잘리진 않았지만, 그 불쌍한 신입은 정말 바지를 적셨다)\n\n체크인에 대한 이런 모든 두려움으로인해 사람들은 수 주 동안 버전 컨트롤의 이점을 사용하지 않고 코드를 작성한다. 그러다 결국 체크인하는 것을 도와줄 선임을 찾아 나서게 된다. 사용 안할거면 버전 컨트롤을 왜 쓰나?\n\n다음은 서브버전 사용시의 삶을 나타내는 간단한 그림이다.\n\n![](http://hginit.com/i/00-svn.png)\n\n머큐리얼의 경우, 모든 개발자는 각자의 테스트탑안에 살아있는 자신만의 저장소를 갖는다. \n\n\n\n![](http://hginit.com/i/00-hg.png)\n\n따라서 당신은 개인저장소에 자신의 코드를 커밋할 수 있다. 그리고 원할때는 언제든 버전 컨트롤의 모든 장점을 누릴 수 있다. 코드가 조금이라도 더 개선된 어떤 논리적인 시점에 도달하면, 언제든 커밋 할 수 있다. 견고한 코드가 만들어 졌다면, 새로운 코드를 다른 사람들이 사용할 수 있게 하고 싶을 것이다. 그럼 당신은 변경사항들(changes)을 개인 저장소에서 중앙 저장소로 밀어 넣는다.(=push)  사용할 준비가 되었을 때, 다른 사람들은 중앙저장소에서 (변경사항들을) 끌어올수 있고(=pull), 당신의 코드를 보게 될 것이다.\n\n머큐리얼은 새 코드 커밋이라는 행위와 다른 사람을 괴롭히는 행위를 분리해 놓았다.\n\n그리고 이건 당신이 코드를 커밋(hg com)해도 다른 사람이 당신의 변경된 코드들을 가져가는 일은 발생하지 않는다는 걸 뜻한다. 안정적으로 모든게 잘 동작하는 만족스런 변경사항들이 많이 만들어 졌다면, 그때 해당 변경사항들을 중앙 저장소로 밀어넣으면 된다. \n\n큰 개념적인 차이점 하나 더\n\n어떻게 모든 길(street)이 각자 이름을 하나씩 가지는 건지 아는가?\n\n\n\n![](http://hginit.com/i/00-tokyo.png)\n\n글쎄.. 사실, 일본에서는 모든 길이 이름을 갖진 않는다. 일본인들은 보통 길들 사이의 블럭에 번호를 매기고 아주아주 중요한 길만 이름을 붙인다. 서브버전과 머큐리얼 사이에는 이와 유사한 차이점이 있다.\n\n서브버전은 리비전들(revisions)에 대해 생각하는 걸 선호한다. 하나의 리비전은 시간상의 특정 지점에서 전체 파일시스템이 어떻게 보이는지를 나타낸다.\n\n머큐리얼에서는, 체인지셋들(changesets)에 대해서 생각한다. 하나의 체인지셋은 하나의 리비전과 다음 리비전 사이의 변경사항에 대한 간결한 목록이다.\n\n  \n\n좌측엉덩이, 왼쪽볼기짝 : 차이점이 뭔데?\n\n차이점은 이렇다. :) 당신과 내가 같은 코드를 가지고 작업하고 있다고 한 번 가정해보자. 우린 코드에 대해 브랜치를 딴 다음, 각자의 작업장소로 흩어져서는 무수히 많은 변경사항들을 개별적으로 만들어 낸다. 각자의 코드는 꽤 많은 차이가 나게 된다.\n\n우리가 머지작업을 해야 할때, 서브버전은 각자의 리비전들 - 내가 수정한 코드의 리비전, 당신이 수정한 코드의 리비전 - 을 살펴본다. 그리고 그것들을 거대한 한 덩어리로 두들겨 합칠 방법을 떠올리려 노력하게 된다. 보통은 잘 안된다. \"머지작업 충돌\"페이지들을 무수히 만들어 내게 되는데, 사실 그건 충돌이 아니고, 그저 서브버전이 우리가 작업한 내용을 이해하지 못하는 것일 뿐이다.\n\n이와 반대로, 머큐리얼을 이용할 경우 우리가 서로 떨어져서 작업하는 동안, 머큐리얼은 일련의 체인지셋들(=변경분량들)을 유지하기 위해 바삐움직인다. 그래서 우리가 서로의 코드를 합쳤으면 할때, 실제로 머큐리얼은 훨씬 더 많은 정보를 갖고 있다. 단순히 최종결과물을 보면서 '어떻게 하면 이걸 하나로 합칠수 있을까'라고 생각하는것이 아니라, 우리 둘이 각자 변경한 것이 무엇인지를 알고 그 변경사항들을 재 적용한다.\n\n이를테면, 만약 내가 어떤 함수를 약간 고치고, 그 함수를 어딘가로 옮겨버린다면, 서브버전은 이 작업단계들을 실제로 기억하지 않는다. 그렇기 때문에 합쳐야 할 시간이 왔을때, 서브버전은 '새로운 함수가 갑자기 하나 나타났군'이라고 생각할 것이다. 반면에서 머큐리얼은 각 변경작업의 단계들을 별도로 분리해 기억할 것이다. 함수 변경됨, 함수 옮겨짐. 그리고 이건 만약 (나와는 별개로 작업하고 있는) 당신이 그 함수를 조금 변경한다면, 훨씬 더 잘 우리의 변경부분들을 성공적으로 머지할 것이라는 걸 의미한다.\n\n머큐리얼은 모든것을 체인지셋 관점으로 생각하기 때문에, 당신은 이들 체인지셋으로 흥미로운 작업들을 하게 된다. 당신은 변경분을 중앙 저장소에 밀어 넣어서(push) 모든 사람들과 (소스)충돌을 일으키는 대신에 어떤 팀 동료에게만 넘겨줄(push)수도 있다.\n\n만약 이 모든게 다소 혼란스럽게 보인다 할지라도, 걱정하지 마시길. 이 튜터리얼을 진행하는 동안, 모든걸 완벽히 이해하게 될 것이다. 지금 알아야 하는 가장 중요한 점은, 머큐리얼은 \"리비전\"이 아닌 \"체인지셋\"의 관점으로 생각하기 때문에 서브버전보다 코드 머지를 훨씬 잘 할 수 있다는 점이다.\n\n그리고 그 건 당신이 브랜치를 만드는 것에대해 훨씬 더 편하게 느끼게 될 것이라는 걸 뜻한다. 머지작업이 (더이상) 악몽이 되지 않을 것이다. 재미있는 이야기 하나 들려줄까? 나랑 이야기를 나눠본적이 있는 거의 모든 서브버전 사용 팀들은 똑같은 이야기를 다양한 버전으로 내게 들려줬다. 이 이야기는 너무 흔한이야기라 나는 \"서브버전 스토리 #1\"이라고 이름 붙여야 했다.\n\n해당 이야기는 이렇다. : 어떤 시점에 팀은 코드 브랜치를 시도한다. 보통 그런식으로 고객에게 제공하는 배포버전은 개발자들이 갖고 노는 버전과는 별개의 브랜치로 분리된다. 그리고 모든 팀들은 내게 이렇게 말했다. \"브랜치를 만드는건 문제가 없었어요. 머지를 해야 할 때가 되기 전까진 말이었죠. 그리고 (머지작업은) 정말 악몽이었어요.\"  5분짜리 절차가 되었어야 할 작업이 6명의 개발자가 컴퓨터 하나를 붙들고 2주에 걸쳐 안정된 빌드(stable build)에서 개발빌드로 버그를 하나하나씩 수작업으로 재반영하는 걸로 끝이 난다. 그러고나선 거의 모든 서브버전 팀들이 내게 이렇게 말했다. 맹세컨데 \"다신 이렇게 안할겁니다\". 브랜치하는 작업은 이제 끊을려고요. 라고. 그리고 현재 그들은 이렇게 (작업)한다. : 각각의 새로운 기능들은 거대한 #ifdef문 안에 넣는다. 그렇게함으로써 하나의 트렁크(trunk)에서 작업할 수 있다. 디버그가 끝날때까진 고객들은 새로운 코드를 전혀 볼 수가 없다. 솔직히말해서, 그건 좀 웃기는 일이다. \n\n안정화 버전의 코드와 개발코드를 분리하는 것이 바로 소스코드 컨트롤이 의도하는 바다. \n\n당신이 머큐리얼로 전환했을때, 어쩌면 이런 내용을 실감하지 못할수도 있다. 그러나 브랜치가 다시 가능한 상황이 되었을때, (이젠) 두려워할 필요가 없다. 그건 (여러 개의) 팀 저장소들을 가질 수 있고, 거기에서 작은 팀의 개발자들이 새 기능을 함께 작업할 수 있다는 걸 뜻한다. 그리고 완성되었을때 중앙 개발 저장소로 합치면, 잘 동작한다  그건 (또한) QA팀들이 코드를 테스트해 볼 수 있는 QA용 저장소를 가질 수도 있다는 걸 뜻한다. 잘 동작하면, 해당 QA팀은 중앙저장소를 그 코드들을 밀어 넣을 수 있다. 다시말해서, 중앙 저장소는 항상 견고하고 테스트된 코드들을 가진다. 그리고 (마찬가지로 중앙저장소의 코드들은) 잘 동작한다. \n\n그건 (또한) 개별 저장소들에서 여러 실험들을 해 볼 수 있고, 잘 동작한다면 중앙 저장소로 머지해 넣는다. 그리고 만약 동작하지 않는다면, 해당 부분들을 버릴 수 있다. (여전히 중앙저장소의 코드들은) 잘 동작한다.\n\n\n\n(역자주) 이런 이유로 서브버전을 사용하는 팀들 중 경험있는 상당수의 팀은 샌드박스(sandbox) 저장소를 따로 운영한다.\n\n\n마지막 큰 개념상의 차이점 하나 \n\n서브버전과 머큐리얼의 주요한 마지막 개념상의 차이점은 사실 큰 건 아니다. 하지만 만약 인식하고 있지 않다면, 걸려 넘어지는 일이 발생할 것이다. 그 내용은 다음과 같다.\n\n서브버전은 기본적으로 파일들에 대해 리비전 관리를 한다. 그런데, 머큐리얼에서는 리비전 관리가 모든 하위 디렉터리를 포함한 디렉토리 전체를  대상으로 일어난다.\n\n서브버전에서 당신이 아는 주된 방식은 , 만약 당신이 하위디렉터리로 들어가서 변경한 부분들을 커밋한다면, 오로지 하위 디렉터리와 그 디렉터리 아래에 있는 변경 부분들만 커밋된다는 것이다. 이건 다른 하위 디렉터리 안에 존재하는 어떤 변경 사항들에 대한 커밋을 잠재적으로  깜빡할 수도 있다는 걸  의미한다. 반대로 머큐리얼에서는 항상 모든 명령들이 전체 트리구조에 적용된다. 만약 당신의 코드가 c:\\code에 있다면, 당신이 hg commit 명령어를 날렸을때 (당신이 현재) c:\\code에 있던 혹은 어떤 하위 디렉터리에 있던지간에, 동일한 효과를 갖는다.\n\n이건 큰 문제는 아니지만, 만약 당신이 회사 전체가 사용하는 단일 거대 저장소에 익숙하다면, 그리고 그 저장소로부터 사람들이 자신이 다뤄야 하는 하위 디렉터리들만을 체크아웃해서 작업하고 있다면, 머큐리얼로 작업하는 건 그닥 좋은 방식이 아니다. 그보다는 각각의 프로젝트를 위한 좀 더 작은 저장소들을 갖는편이 더 낫다.\n\n  \n\n마무리하며...\n\n이 부분은, 내 말을 말 그대로 그냥 받아들여야 하는 내용이다.\n\n머큐리얼은 서브버전보다 낫다.\n\n팀과 함께 소스코드를 작업하는 더 나은 방식이고,  당신이 소소코드에 대해 작업하는 더 나은 방식이다.\n\n여하튼 머큐리얼이 더 낫다. \n\n그리고 내 말을 기억하길 바란다. 만약 당신이 머큐리얼의 동작 방식을 이해한다면, 그리고 머큐리얼이 동작하는 방식으로 일한다면, 해당 방식과 싸우려고 하지 마라. 그리고 머큐리얼을 사용하면서 예전 서브버전 방식처럼 작업하려고 노력하지 마라. 대신에 머큐리얼이 당신에게 기대하는 방식대로 작업하는걸 배워라. 그러면 행복해지고, 성공하고, 먹고사는데 지장없고, 언제나 (집에서 마음편히) 리모컨으로 TV를 켜보게 될 것이다.\n\n그리고 아마 초반에, 당신은 머큐리얼을 포기하고 서브버전으로 돌아가고 싶은 유혹을 받게 될 것이다. 난 그러리라는걸 안다. 왜냐하면 당신은 마치 외국에서 살고 있는 것처럼 어색하고, 향수병이 생겨서는 모든 종류의 자기합리화에 맞닥드리게 될테니까. 이를테면 디렉터리들 단위로 작업하는 머큐리얼이 디스크공간을 너무 많이 차지할 것이라고 주장하는 식으로 말이다. 하지만 그건 오해다. 실제로는 서브버전의 디렉터리들 보다 공간을 덜 차지한다. (정말이다!) \n\n어쨌든 그리고나서는 당신은 서브버전으로 되돌아갈 것이다. 왜냐하면 서브버전 방식으로 브랜치를 시도했고, 그로인해 혼란을 겪었고, 결국 그다지 잘 동작하지 않았을 테니까. 당신은 저장소들을 복제(=클로닝)함으로써 머큐리얼식 브랜치를 했어야 했다. 서브버전에서 작업했던 식으로가 아니라 말이다. 날 믿어라. 머큐리얼의 작업처리 방식을 배우면 잘 동작할 것이다.\n\n그리고  또 당신은 제이콥 혹은 당신 사무실에 있는 제이콥과 동급의 누군가에게 \"서브버전에서 머큐리얼로의 요약명령집\"를 만들어 달라고 시킬것이다. 그리고는 hg fetch가 svn up과 비슷하다고 생각하면서 세 달쯤을 보내게 될 것이다. 실제로 hg fetch가 하는 일이 무엇인지 알지못한 채로 말이다. 아마 여러일들이 틀어질 것이고, 머큐리얼을 비난하게 될 것이다. 실제로는 머큐리얼이 어떤식으로 동작하는지 이해하지 못한 당신 자신을 비난해야 할 순간마다 말이다. \n\n난 당신이 그러리란걸 안다. 왜냐하면 내가 그랬었기 때문이다.\n\n동일한 실수를 하지마라. 머큐리얼을 배우고, 머큐리얼을 신뢰하고, 그리고 머큐리얼의 작업 처리 방식을 이해해라. 그리고나면 소스 코드 컨트롤에 있는 가장 최근의 모든 버전을 옮기게 될 것이다.\n\n어떤 벤더가 라이브러리를 하나 업데이트 했을때 당신의 경쟁자들이 그로 인해 발생한 모든 머지 충돌을 해결하느라 한 주를 바쁘게 보내는 동안, 당신은 hg merge라고 타이핑하고는 당신 자신에게 이렇게 말하게 될것이다. \"오예~ 끝내주는데~ 그냥 바로 되잖아\". 그리고나면 아마 마이크는 차분해 질거고, 인턴사원과 담배를 나눠피게 될거다. 머잖아 봄이 올거고, 그러면 근처 대학의 꼬마들은 두꺼운 파카점퍼를 얇은 A&F T셔츠랑 교환하려 할거다. 그리고 삶은 더 나아져 있을 것이다.\n\n이하 hginit.com의 다른 챕터들은 지식을 함께 나누기 위해 노력하고 계신 다른 블로거 분들의 번역기부를 기대해 봅니다. :)\n\n감사합니다.\n\n\n#### Comments\n\n번역 잘하셨네요. 재밌게 잘 읽었어요.\n\n [ben](http://www.petabytes.org) | 2010-12-05 일요일 오후 1:51\n\n--\n\n번역은.. 뭐.. 영어 원문을 보시면 아시겠지만 민망한 수준이라.. (^_^;\n\n그래도 재미있게 읽으셨다니 다행입니다.\n감사합니다.\n\n [doortts](http://blog.doortts.com) | 2010-12-06 월요일 오전 11:28\n\n--\n\n언제나 RSS로 잘 읽고 있습니다. 좋은 번역 감사드려요!\n\n [proxies](http://www.hiten.net) | 2010-12-05 일요일 오후 5:39\n\n--\n\n감사합니다. 편안하고 평온한 한 주 되시길 기원합니다.\n\n [doortts](http://blog.doortts.com) | 2010-12-06 월요일 오전 11:26\n\n--\n\n요즘 몸이 안좋다고 들었는데 괜찮으신가요?\n\n [k16wire](http://pragmaticstory.com) | 2010-12-06 월요일 오후 1:39\n\n--\n\n제가 원래 좀 골골대는 스타일인데, 이번엔 좀 오래 가네요. \n\n참! 오늘부터 '엔터프라이즈 애자일 프로젝트 관리' 읽기 시작했습니다. 고민하시고 애쓰신 흔적이 물씬 묻어나더라구요. 좋은 책 번역해 주셔서 감사합니다. :)\n\n [doortts](http://blog.doortts.com) | 2010-12-06 월요일 오후 7:45\n\n--\n\n외국사람들은 저희랑 생각하는 방식이 다르나 봐요. 읽을 때 알뚱말뚱 거리네요.\n\n [번역가](http://www.starlangs.com) | 2010-12-17 금요일 오전 10:43\n\n--\n\n이번에 회사에서 머큐리얼로 바꾼다는데 도움이 많이 되었네요. 근데 SVN쓰다가 머큐리얼 쓰려니 어려워요 ㅠㅠ;\n\n wonderer | 2010-12-29 수요일 오후 5:52\n\n--\n\n요즘 git 에 관심이 있어서 책을 보고 있는 도중에 해당 포스팅을 보게 됬네요.\n\n머큐리얼도 git 과 같은  분산 버전 관리 시스템이란 말은 들었는데\n\n아직 둘사이를  비교할 실력은 되지 않습니다만 좋은글 \n\n잘 보고 갑니다~~\n\n [멋진인생](http://run2you.tistory.com) | 2011-01-10 월요일 오후 1:28\n\n--\n",
    "attachments": [
      {
        "id": 21817,
        "name": "hginit_home.png",
        "hash": "833dc09b673b92dd83744a1833175847e8b7dec9",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 85687,
        "containerId": "12319"
      }
    ]
  },
  {
    "id": 142,
    "title": "[서평] 거침없이 배우는 자바 스크립트",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1289805065000,
    "body": "> doortts | 2010-11-15 월요일 오후 4:6 | Books | [원본](http://blog.doortts.com/142)\n\n예전, 그러니까 2003년정도 쯤으로 기억합니다. 그 때 한동안 미친듯이 자바스크립트를 들여 판적이 있었습니다. 들여팠다고는 말을 하지만, 되돌아보면 그저 자바스크립트를 이용해서 이런저런 떡칠 코드로 업무를 구현했던 기억이라고 하는 편이 맞을 것 같습니다. 구현언어는 PHP와 자바스크립트 였습니다.\n\n- 캘린더\n- 사내업무 배정시스템\n- 업무일지 쓰기\n- 보고서 양식 출력\n- ToDo 및 일정 관리\n등등등..\n\n심지어 그 당시 고객의 요청으로 자바스크립트를 이용한 음악 플레이어도 구현했었습니다. 그 당시에 음악플레이어라면 여러가지 문제로 당연히 Active-x를 써서 만들었겠지만, 제가 그쪽 기술이 없다보니 자바스크립트로 만들수 밖에 없었습니다.\n(신기한게 최근에 사이트를 가보니 여전히 잘 동작하긴 하고 있더라구요)\n\n사용자별 음악리스트 관리에, 랜덤플레이, 진행상황 막대바 표시, 버퍼링 애니메이션, 선곡기능 등등을 모두 자바스크립트로 구현했더랬습니다. 잘하시는 분들이야 그게 뭐 별거냐 하시겠지만, PHP나 자바스크립트를 첨 본 사원 나부랭탱탱이가 주변사람 도움없이 혼자 구현하기엔 정말 쉽지 않았더랬답니다. :)\n\n뭐, 그 외에도 자바스크립트를 이용한 이런저런 기능을 구현했지만,\n정말 젊은 혈기에 가능했지, 지금생각해보면 정말 무식하다는 생각밖에 안듭니다.\n\n덕분에 그 시절 이후에 저는 자바스크립트라면 학을 떼게 되었죠.  UI나 자바스크립트에서 서버개발로 전환했는데, 이건 뭐 천국이 따로 없더라구요. 디버거도 없이 무한 try and repeat 을 입에서 케첩나올때까지 반복해야 했던 환경에서 훨씬 간결한데다가 컴파일러님께서는 온갖 오류를 다 잡아주시고, 디버거(debugger)사마는 언제나 샤방샤방하게 내부를 보여주셨죠.\n\n아.. 이거 뭐 또 잡담이 길어졌군요.\n노친네도 아니고 옛날얘기만 나오면 이모냥..-,-);;;\n\n여튼 그러다가 최근엔 기억력 감퇴로 안좋은 기억이 많이 사라졌는지라, 다시 자바스크립트를 배워볼까 하는 시점에 책을 한권 접하게 되었습니다.\n\n![javascript_book.jpg](/files/21815)\n\n얇지 않은 책인데 참 재밌게 읽었습니다. 실습도 잘 되어있고, 무엇보다 책이 친절해서 좋았습니다. 저자의 이전 책인 CSS 책(한빛에서 나온 CSS비밀 매뉴얼)도 좋다고 하길래 구매하였습니다. (구해 놓고 바로 병상에 눕는 바람에 그 책은 아직 못읽었습니다.)\n\n우선 장점\n- 굉장히 친절합니다. 강의 경험이 많은 사람이 아니면 모를 초보자를 위한 배려가 잘 담겨 있습니다. 외국책치고 이렇게 친절한 책 얼마 못 봤습니다. 실제 초보자가 아니더라도 이런 배려는 기분을 좋게 만들어 줍니다. :)\n- 번역이 좋습니다. 김태곤님의 첫 번역이라고 들었는데, 외국번역물이라는 생각이 들지 않을 정도로 흐름과 문장이 좋았습니다. 번역이란 과정이 투명하게 비춰지는 유리장같이 깨끗하게 느껴졌습니다. 단어를 놓고 고심한 흔적도 여기저기서 느낄 수 있었습니다.\n- 이건 저자의 고집이기도 하고 사상일지도 모르겠지만 책에 투자한 시간 대비 이득(ROI)가 굉장히 높게 구성 되어있습니다. 기초가 중요하다곤 하지만, 우린 어쩌면 너무 많은 시간을 영영 사용하지 않을 기초이론에 시간과 종이면을 할당하고 있는지도 모르겠다는 생각이 들었습니다. 지금 손에 책이 없어서 제가 표시해 놓은 문구를 적진 못하지만, 뒤통수를 한 대 맞은 듯한 느낌을 때때로 주곤 했습니다. 디자이너를 대상으로 한 책이라는데, 왠만한 개발자보다 훨씬 더 좋은 UI의 기능을 훨씬 짧은 시간안에 만들 수 있을 것 같다는 생각이 들었습니다.\n- 실습위주의 구성입니다. 그리고 마찬가지로 아주 친절합니다.\n\n 호불호가 갈릴 수 있는 부분.\n- 호불호가 갈릴수 있는 부분입니다만, 이 책은 자바스크립트의 기초를 다룬 다음 바로 JQuery로 넘어갑니다. DOM은 getElementById와 getElementsByName 두 개 정도만 이야기한 다음 깔끔하게 넘어갑니다. 외국의 서평을 봐도 이 부분은 확실히 호불호가 갈리는 부분입니다. 사실 저한테는 이 부분은 오히려 큰 장점이었습니다. Ajax 부분조차도 기본 개념설명한 다음 '브라우저 호환문제로 시간쓰지말고, 그냥 JQuery쓰자.' 식으로 넘어갑니다.\n\n![5558484.jpg](/files/21816)\n[기존 자바스크립트 책 중에서 많은 칭찬을 받고 있는 책. DOM부분의 설명도 좋긴 하지만 확실히 쓰기엔 힘들다.]\n\n- 자바스크립트 책이긴 하지만 JQuery와 밀착되어 설명하고 있습니다.\n- 뒤로 가면 JQuery 플러그인 사용법의 설명이 많습니다. 마찬가지로 호불호가 갈릴 수 있습니다.\n- 저자가 밝힌 책의 독자 대상은 '놀랍게도' 디자이너 입니다. 따라서 자바 스크립트의 저 멀고도 먼 영역을 파고 싶은 프로그래머라면 아쉬움이 남을 겁니다. 특히 자바스크립트의 prototype을 이용한 확장이라던가 XMLHttpRequest 등은 다루고 있지 않습니다.\n\n![javascript2.jpg](/files/21814)\n[자바스크립 책 중 하드코어 한 걸 원한다면 바로 이책으로! 내용도 가격도 하드코어함!]\n\n정리하자면, 자신이 아는 자바스크립트를 정리해 보고 싶거나 빠른 시간내에서 구현에 들어가야 하는 개발자에 적당한 책이라는 생각이 들었습니다. 번역 문장도 좋아서 쉽게 읽힙니다.\n\nps. 표지는 원서의 귀여운 강이지 표지가 개인적으로는 더 맘에 들었습니다. :)\n\n![missingManual.jpg](/files/21813)\n\n#### Comments\n\n안녕하세요, 서평 남겨주신 것 보고 들어왔습니다.\ndoortts님께서 좋은 말씀을 해주신 덕분에 그간 했던 고생이 싸악 사라지는 기적(?)을 체험했습니다. ^^\n내용과 상관없이 글도 깔끔하게 잘 정리해서 쓰신 것 같습니다.\n\n좋은 말씀 감사합니다.\n\n [행복한고니](http://mygony.com) | 2010-11-17 수요일 오전 10:41\n\n--\n\n형님 안녕하십니까..ㅋㅋ\n\n책 잼있나요 ? ㅎㅎㅎ pro javascript 책도 잼있던데요 ㅎ\n그나저나 갑자기 잡습은? 우짠일로 ㅎㅎ\n\n [is윤군](http://helols.tistory.com) | 2010-11-30 화요일 오전 4:42\n\n--\n\n어얼~~ 이게 왠 100만년 만의 댓글이랴~~\n\n난 재밌게 읽었는데,\n너와는 왠지 '재밌다'의 관심점이 다를것 같다는 느낌이...\n\n자바스크립트로 OS를 만든 녀석이 보기엔..\n\n어쩌다보니 UI 이벤트를 다룰일이 생겨서 보게 되었어. 초급이 보기엔 좋은 책인것 같아. :)\n\n [doortts](http://blog.doortts.com) | 2010-11-30 화요일 오전 9:24\n\n--\n\n@.@ 저도 다른 사람 처럼 재미를 느낀답니다ㅎㅎ\nOSㅎㅎㅎ 말도 안되요 ㅎ\n\n암턴 추운 겨울 몸 건강 하시고 ㅎㅎ 따뜻한 봄날이 오면 \n한국에 한번 가보도록 하겠습니다 :-)\n\n(블로그는 언제나 관심있게 지켜 보고 있어요 ㅎㅎ)\n\n [is윤군](http://helols.tistory.com) | 2010-12-02 목요일 오전 7:55\n\n--\n",
    "attachments": [
      {
        "id": 21813,
        "name": "missingManual.jpg",
        "hash": "a92bb1a6e2a289d44f2daab8cf2bb468a9d27204",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 15946,
        "containerId": "12312"
      },
      {
        "id": 21814,
        "name": "javascript2.jpg",
        "hash": "d3d3dffa360b3ba4c59cd97b9be2e0360505874f",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 38403,
        "containerId": "12312"
      },
      {
        "id": 21815,
        "name": "javascript_book.jpg",
        "hash": "c7b1441642d46ab1a60a5f7a71a3b2ace6d27323",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 49659,
        "containerId": "12312"
      },
      {
        "id": 21816,
        "name": "5558484.jpg",
        "hash": "0cc09062f9999914126a0ae2471cebb2f39078d7",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 13112,
        "containerId": "12312"
      }
    ]
  },
  {
    "id": 143,
    "title": "[FunDev행사] TDD Practice & Agile SW Design 함께 하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1290154100000,
    "body": "> doortts | 2010-11-19 금요일 오후 5:4 | Better SW Development | [원본](http://blog.doortts.com/143)\n\n* 12월 4일에는 [어도비 공감세미나](http://adoberia.co.kr/iwt/blog/blog.php?tn=flex \"[http://adoberia.co.kr/iwt/blog/blog.php?tn=flex]로 이동합니다.\")가 있네요. *\n\n안녕하세요?\n\n12월 11일에 TDD 프랙티스와 Agile SW 설계라는 주제로 하루짜리 모임을 진행합니다.\n세미나도 아니고 스터디도 아니고 강의나 교육도 아니고,\n편하게 와서 즐기다 가는 자리라고 생각해 주시면 좋겠습니다.\n\n용기를 기르는 자리정도?  (큰 기대는 금물!)\n\n장소는 상암동 DMC에 위치한 LG CNS IT센터 교육원입니다.\n창의공간이라고 소파,TD, 게임기, 등등 꽤 놀기좋은(?) 곳에서 한 나절 동안 진행할 예정입니다.\n\n일자 : 12월 11일(토)\n시간 : 오전 10시 ~ 오후 6시\n장소 : 마포구 상암동 DMC LG CNS IT센터 11층 교육센터. (주차지원 됩니다)\n신청 : ![](http://cfile1.uf.tistory.com/image/1840A8374C9E427D0404F4)로 겸손할 필요없이 쿨하게 아래 양식을 적어 보내주시면 됩니다.\n참가비 : 없음.\n준비사항 : 단 본인을 포함하여 점심에 나눠먹을 음식을 가져오셔야 합니다. 샌드위치, 버거, 음료, 김밥, 도시락 등등:)\n\n\n신청양식\n\n이름 :\n이메일/전화번호:\n주 사용 언어 및 경력 : 예) 자바. 업계 1년차.\n개인소개 : 예) \"(주)이전\"에서아키텍트 롤을 맡고 있습니다. 등등\n\n* 반나절만 참석하시고 싶으신 분은 점심시간은 포함해서 오전/오후로 신청해 주세요. :)\n\n\n토요일이라 그럴리는 없겠지만 그래도 혹 정원을 초과하면 1일 전체 참여하시는 분에게 우선 기회를 드릴생각입니다.\n자세한 안내 메일은 인원이 차면 개별적으로 보내드리도록 하겠습니다.\n\n편한 마음으로 오셔서 다른 엔지니어들과 이야기도 나누고,\n소박하게 즐기는 작은 연말 행사가 되었으면 좋겠습니다.\n\n그리고 그런 자리가 될 수 있도록, 부족하지만 열심히 노력하겠습니다.\n감사합니다.\n\n--------이하 진행 계획안 -------\n* 예정보다는 빠른 진행을 목표로 합니다.\n\nTDD Practice & Agile SW Design\n\n10시 시작\n\n1.워밍업 : 10시\n- 단계별 TDD & Refactoring 퀴즈 레이싱 (2시간)\n . Lap Time 체크 & 리뷰\n\n2\\. 점심 : 12시\n- 각자 가져운 음식과 음료 나눠먹기 (40분) :\n\n(버퍼링 20분)\n\n3\\. Share & Joy : 1시\n- 팀 꾸리기\n- 각자 가져운 퀴즈 풀기 & 리뷰(1시간)\n- CRC 카드 기법/짝 프로그래밍 설명 (30분)\n\n(버퍼링 30분)\n\n4\\. Agile SW Design : 3시\n- 설계 (2시간30분)\n . 도메인 설명 (10분)\n . 설계 산출물 정하기\n . 설계\n . 개발\n\n5\\. 리뷰 및 마무리 : 5시 30분\n\n6시 종료\n\n\n#### Comments\n\n아... 아쉽습니다. 참석하고 싶은데 그 날 웨딩촬영날짜라 ㅠㅠ\n\n [스쿨쥐](http://swtest.co.kr) | 2010-11-30 화요일 오후 1:12\n\n--\n\n와!! 결혼하시는군요!! 축하드려요!!! :)\n\n [doortts](http://blog.doortts.com) | 2010-11-30 화요일 오후 9:14\n\n--\n"
  },
  {
    "id": 144,
    "title": "TDD 짝 프로그래밍 실습 후 체크리스트",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1290430505000,
    "body": "> doortts | 2010-11-20 토요일 오후 9:59 | Better SW Development | [원본](http://blog.doortts.com/144)\n\n때때로 TDD 짝 프로그램 실습을 진행 하곤 합니다. 시간적인 여유가 있을 경우에는 실습 후 다음과 같은 체크리스트로 점수를 측정합니다. \n\n1.  TDD의 세 가지 기본 원칙은 지키셨나요? (항목당 +1점)\n    - 테스트 코드를 작성하기 전엔 업무 코드를 작성하지 않는다.\n    - 실패하는 테스트 코드를 한 번에 한 개 이상 만들지 않는다.\n    - 현재 실패하는 코드를 만족시키는 것 이상의 업무코드를 작성하지 않는다.\n\n2.  테스트 케이스는 몇 개? (실습 난이도에 따라서 적정 갯수 이상시 적절히)\n    - 메소드당 1개 이상으로 만들었다. (+1) \n    - 테스트를 만들지 않은 메소드가 있다 (0)\n3.  테스트 케이스의 이름이 테스트 의도를 잘 나타낼 수 있게 작성되었다? (+2점) \n\n4.  assert문에 메시지 인자를 넣어서 작성했다.( +2점) \n5.  문맥전환(Role change)은 잘 하셨나요? (잘했다 +3, 1번정도 +1, 거의 잘 안되었다 0점 혹은, 롤 전환 횟수 만큼 + 점수)\n\n6.  리팩토링(정련)은 하셨나요? (녹색 막대 후 반드시 했다 +1점)\n\n7.  Red -> Green 시간 간격이 짧았다. (자신의 턴 내에서 최소 1회 이상 +1점)\n8.  드라이버가 의견 제안이나 질문을 잘 했다. (잘했다 +2점, 그냥저냥 1점, 안했다 0점)\n9.  네비게이터가 의견을 잘 받아 주었다. (+1점)\n\n10.  **변수나 클래스 이름을 설명적으로 잘 짓기 위해 함께 노력했다**(+2점)\n11.  테스트 케이스 작성에 기준이 있었다. (+1)\n\n12.  작성한 코드의 밸런스 : 작성한 테스트 케이스 숫자 / public 메소드의 숫자 + private 메소드의 숫자 만큼 + 점수\n13.  테스트가 성공했을때 짝 만의 제스처나 세러모니가 있었다. (+2점)\n\n14.  테스트 케이스를 자주자주 실행했다. (심정적 측정이긴 하지만 +1점 :)\n15.  테스트 케이스가 문맥에 맞게 적절히 작성된 것 같다. (심정적 측정이긴 하지만 +1점 :)\n16.  자세가 불편하지 않았고 개발 화면이 잘 보였다. (+1점)\n17.  초반 함께 설계하는 시간이 있었다. (+1점)\n\n18.  **기능 목록(Function List)을 만들어서 코딩시에 활용 했다. (+1)**\n19.  적절히 쉬는 시간을 함께 가졌다. (+2점)\n20.  **시간이 없어서 포기한 기능이 있다. (-2점)**\n\n단순 심정적인 측정 보다는 좀 더 나은 결과를 만들 수 있습니다.\n물론 TDD와 짝프로그래밍에 대해 설명은 선행되어야 겠죠? :)\n\n[![](http://farm4.static.flickr.com/3170/2674833047_f2a5629d55_z.jpg?zz=1g)](http://farm4.static.flickr.com/3170/2674833047_f2a5629d55_z.jpg?zz=1 \"[http://farm4.static.flickr.com/3170/2674833047_f2a5629d55_z.jpg?zz=1]로 이동합니다.\")\n\n#### Comments\n\n형의 발표자료와 블로그를 보면 항상 이 주옥같은 이미지들은 어떻게 찾아내는 걸까 궁금하답니다. 이미지 검색노하우좀 포스팅 해주세요. 혹시 직접 찍으시는건 아니겠지요;;\n\n [기선](http://whiteship.me) | 2010-11-23 화요일 오후 10:6\n\n--\n\n뭐 별거 없어. 검색에 시간을 들이면 가능함. -_-;; 주로는 구글이미지검색, 플리커 정도?\n\n [doortts](http://blog.doortts.com) | 2010-11-24 수요일 오후 1:25\n\n--\n"
  },
  {
    "id": 145,
    "title": "[dw Review] REST 서비스",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1290694186000,
    "body": "> doortts | 2010-11-25 목요일 오후 11:9 | 이생각 저생각 | [원본](http://blog.doortts.com/145)\n\n12월16일 목요일에 IBM에서 주최하는 세미나([2011 IT테크놀로지의 재발견](https://www.ibm.com/developerworks/mydeveloperworks/blogs/9e635b49-09e9-4c23-8999-a4d461aeace2/entry/294?lang=en \"[https://www.ibm.com/developerworks/mydeveloperworks/blogs/9e635b49-09e9-4c23-8999-a4d461aeace2/entry/294?lang=en]로 이동합니다.\"))의 발표 주제 중 하나는 REST이다. 사실 REST의 이야기 나온건 꽤 되었는데 한 동안 그냥 그대로 묻혀 있었기 때문에 그닥 범용화 되진 않나보다 라고 생각하고 있다. 플리커라던가 digg정도에서 사용하고 있는데, 그렇다고 해서 뭔가 특별히 우월하다는 느낌을 주는 기술은 아니다. 현재까지는 말이다.\n\n어쨌든 그런 상황에서 세미나의 발표 주제중 하나가 REST라니 급 흥미가 생겼다. 참석전에 (그리고 핑계김에) 선행 학습하는 차원에서 몇가지 사항을 미리 봐두면 좋을 것 같다.\n\n미리 봐두기 #1\n한글 위키에 따르면 [REST의 정의](http://ko.wikipedia.org/wiki/REST \"[http://ko.wikipedia.org/wiki/REST]로 이동합니다.\")는 이렇다.\n\nREST (Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다. 이 용어는 로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개되었다. 그는 하이퍼텍스트 전송 프로토콜 (HTTP)의 주요 저자들 가운데 한 사람이다. 그 뒤로 이 개념은 네트워킹 문화에 널리 퍼졌다. 엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음이다. 여기서 네트워크 아키텍처 원리란 리소스를 정의하고 리소스에 대한 주소를 지정하는 방법에 대한 개괄을 말한다.\n\n\n미리 봐두기 #2\n\n\n[튜터리얼] [REST 서비스 작성하기](http://www.ibm.com/developerworks/kr/library/tutorial/x-restatompp/ \"[http://www.ibm.com/developerworks/kr/library/tutorial/x-restatompp/]로 이동합니다.\")\n\n[dW기사] [Apache Wink 및 Ajax를 사용하여 풍부한 Java 웹 애플리케이션 빌드](http://www.ibm.com/developerworks/kr/library/wa-aj-richjava/ \"[http://www.ibm.com/developerworks/kr/library/wa-aj-richjava/]로 이동합니다.\")\n\n[dW기사] Apache Wink가 포함된 RESTful 웹 서비스,\n[Part 1: Apache Wink REST 서비스 빌드하기](http://www.ibm.com/developerworks/kr/wa-apachewink1/index.html \"[http://www.ibm.com/developerworks/kr/wa-apachewink1/index.html]로 이동합니다.\")\n[Part 2: Apache Wink REST 개발의 고급 주제](http://www.ibm.com/developerworks/kr/library/wa-apachewink2/index.html \"[http://www.ibm.com/developerworks/kr/library/wa-apachewink2/index.html]로 이동합니다.\")\n\n\nREST의 정의와 구현체 서버/클라이언트인 Apache Wink에 대한 기사들이다. REST를 독립적으로 구현할 때 유용한 이야기들이 나온다. 특히 Apache Wink Part 2에서는 Spring 프레임워크와 함께 사용하는 방법에 대한 내용도 나온다.\n\n미리 봐두기 #3\n\n리팩토링 HTML의 저자 Elliotte Rusty Harold가 쓴 글\n[Why REST Failed](http://cafe.elharo.com/web/why-rest-failed/ \"[http://cafe.elharo.com/web/why-rest-failed/]로 이동합니다.\")\n\n그리고 그의 인터뷰 내용\n[Why PUT and DELETE?](http://www.artima.com/lejava/articles/why_put_and_delete.html \"[http://www.artima.com/lejava/articles/why_put_and_delete.html]로 이동합니다.\")\n\n4개의 문법 요약\nGET은 안전한 기능을 수행하기 위해 사용한다.\nPOST는 가장 강력한 기능이지만 불안전하게 동작한다.\nPUT는 특정 URL에 자원을 생성하거나 업데이트 하는데에 사용된다. PUT 은 안전하진 않지만 대신 멱등성 (idempotence)을 갖는다.\nDELETE는 특정 URL의 자원을 제거한다.\n\nREST 발전의 한계\nHTML의 FORM 메소드로 PUT, DELETE를 지원하지 않는다.\n현재 웹브라우저에서 REST호출을 위해선 XMLHttpRequest (ajax)를 사용 수 밖에 없다.\n\n\n기타참고.\n\n멱등성(idempotence)은 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로써, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다. 멱등법칙의 개념은 추상대수학(특히, 투영 이론·닫힘 연산·함수형 프로그래밍의 참조 투명성과 연관된 성질에서)의 여러 부분에서 사용하고 있다.\n\n\n아직까지는 URI를 이용한 리소스 표시를 제외하고는 특별히 REST에서 이야기 하는 내용의 장점은 잘 모르겠다. 그래서 세미나 발표에서 어떤 이야기가 나올지 기대된다. :)"
  },
  {
    "id": 146,
    "title": "[dw Review] HTML5 학습하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1290955476000,
    "body": "> doortts | 2010-11-28 일요일 오후 11:44 | 이생각 저생각 | [원본](http://blog.doortts.com/146)\n\n12월16일 목요일에 IBM에서 주최하는 세미나([2011 IT테크놀로지의 재발견](https://www.ibm.com/developerworks/mydeveloperworks/blogs/9e635b49-09e9-4c23-8999-a4d461aeace2/entry/294?lang=en \"[https://www.ibm.com/developerworks/mydeveloperworks/blogs/9e635b49-09e9-4c23-8999-a4d461aeace2/entry/294?lang=en]로 이동합니다.\")) 의 발표 주제 중 하나는 HTML5이다. 세미나 참석전에 HTML5에 대해서 조금 학습해 두면 좀 더 몰입도 있게 즐길수 있지 않을까 해서 간략하게 HTML5에 대해서 학습해 보려고 합니다. :)\n\n\nHTML5라는 단어가 올해들어 굉장히 부각되었던것 같습니다. 특히나 잡스형님이 어도비랑 신경전을 벌이시면서 많이 언급했었죠. 구글에서 처음 HTML5를 이야기를 했을때와는 다르게 잡스형님의 발언은 여러가지 파문과 이슈를 만들었죠. 특히나 우리나라에서도 모바일 앱 개발에 대해서 다들 관심이 높은 이때에 HTML5가 (적어도 모바일 웹에선) 하나의 대안이 되리라는 기대가 큽니다.\n\n사실 예전에 HTML5라는 단어를 처음 접했을때 전 그런 생각이 들었습니다. HTML 1,2,3, 4가 있었던거야? :) 부끄럽지만, DocType선언문구를 HTML에 넣으면서도 의례 그러려니하고만 생각하고 있었지 HTML의 버전이라는 식으로는 잘 생각 안했던것 같습니다.\n\n\n...\n\n\n미리 살펴보기 #1\n\nHTML5의 정의\nHTML5는 HTML의 차기 주요 제안 버전으로 월드 와이드 웹의 핵심 마크업 언어이다. 2004년 6월 Web Hypertext Application Technology Working Group(WHATWG)에서 웹 어플리케이션 1.0이라는 이름으로 세부 명세 작업을 시작하였다. 2010년 3월 현재 WHATWG의 현재 초안 표준 상태(Draft Standard state)이며, W3C에서는 작업 초안 상태(Working Draft state)이다.\n\nHTML5는 HTML 4.01, XHTML 1.0, DOM Level 2 HTML에 대한 차기 표준 제안이다. 이것은 어도비 플래시나 마이크로소프트의 실버라이트, 썬의 자바FX와 같은 플러그인 기반의 인터넷 어플리케이션에 대한 필요를 줄이는 데 목적을 두고 있다.\n\n- from 한글판 Wikipedia([http://ko.wikipedia.org/wiki/HTML5](http://ko.wikipedia.org/wiki/HTML5 \"[http://ko.wikipedia.org/wiki/HTML5]로 이동합니다.\"))\n\n\nHTML5가 현재 최종 표준이 확정되지 않았기때문에 진행형이라고 이야기 하는 사람들도 있고, 일부는 현재까지 진행된 부분은 말 그래도 현재까지 진행된 표준이니 따르면 된다고 말하는 사람들도 있고 그렇습니다.\n\n미리 살펴보기 #2 (에센셜 소스)\n\n1\\.\n사실 HTML5에 대해서는 다음의 윤석찬님께서 작성해 놓으신 페이지인 \"[HTML5의 모든 것](http://channy.creation.net/blog/776 \"[http://channy.creation.net/blog/776]로 이동합니다.\")\" 만한 곳이 없습니다. 가이드 북에 동영상까지 내려받을 수 있습니다.\n\n2.\n외국에서 공개된 재밌는 HTML5책으로는 \"Dive into HTML5 ([http://diveintohtml5.org](http://diveintohtml5.org/ \"[http://diveintohtml5.org/]로 이동합니다.\"))\"가 있습니다. 지루하지 않게 정리가 잘 되어 있어서 학습하는데에 다른 자료가 필요없을 정도입니다.\n\n3.\nIBM developer works의 자료\n- HTML 5에 추가된 새로운 요소\n[http://www.ibm.com/developerworks/kr/library/x-html5](http://www.ibm.com/developerworks/kr/library/x-html5/ \"[http://www.ibm.com/developerworks/kr/library/x-html5/]로 이동합니다.\")\n기존 HTML에서 추가된 요소가 무엇인지 빨리 살펴볼 수 있죠.\n\n- Android와 iPhone의 브라우저 전쟁, Part 1: 새로운 돌파구, WebKit\n[http://www.ibm.com/developerworks/kr/library/os-androidiphone1](http://www.ibm.com/developerworks/kr/library/os-androidiphone1/ \"[http://www.ibm.com/developerworks/kr/library/os-androidiphone1/]로 이동합니다.\")\n모바일브라우저에서 절대적인 점유율을 차지하고 있는 WebKit과 HTML5에 대해서 알수 있습니다.\n\n\n개인적으로 흥미있게 읽었던 기사는 HTML5에서 제공하는 클라이언트단의 로컬 저장소에 대한 기능이었습니다.\n\nHTML 5의 가장 유용한 새 기능 중 하나는 로컬 스토리지의 표준화입니다. 마침내 웹 개발자들은 모든 클라이언트측 데이터를 4KB 쿠키에 맞추지 않아도 됩니다. 이제는 단순한 API로 대용량 데이터를 클라이언트에 저장할 수 있습니다. 이는 캐싱에 적합한 완벽한 메커니즘이기 때문에 애플리케이션의 속도를 극적으로 개선할 수 있습니다. 속도는 데스크탑 애플리케이션보다 훨씬 느린 연결에 의존하는 모바일 웹 애플리케이션에 중요한 요소입니다.\n.. 하략..\n\n- from [HTML 5로 모바일 웹 애플리케이션 작성하기, Part 2: HTML 5로 모바일 웹 애플리케이션에 대한 로컬 스토리지 잠금 해제하기](http://www.ibm.com/developerworks/kr/library/x-html5mobile2/ \"[http://www.ibm.com/developerworks/kr/library/x-html5mobile2/]로 이동합니다.\")\n\n\n모바일 플랫폼에서 개발하는 개발자라면 현재 두 개의 거대 모바일 OS인 안드로이드와 iOS, 두 OS에 대한 네이티브 앱 개발을 동시에 진행하는것이 쉽지 않다는 것을 잘 알고 있을 겁니다. 이런저런 요구사항이나 기반환경 요소들을 놓고 봤을때, 역시 앞으로는 HTML5가 모바일 플랫폼 앱 개발의 대세가 되지 않을까 싶습니다. 특히나 게임을 제외한 업무용 앱에서 두드러지게 말입니다.\n\n#### Comments\n\n어제 클라이언트 개발자를 채용하기 위해 면접을 보면서 느낀 것이 앞으로 모바일의 방향은 앱 보다는 다시 웹으로 회귀하지 않을까라는 생각을 한다. 아무래도 앱이 가지는 제약사항(가장 크게는 업그레이드..) 때문에 점진적으로 웹으로 방향을 바꾸지 않을까라는 생각을 하고 이를 위한 기반으로 HTML5가 주축이 되지 않을까 생각한다.\n\n뭐 이건 TDD에서 HTML5까지 상당히 다양한 영역을 넘나들고 있는데.. 도대체 너의 정체는 뭐야..? ㅋㅋ\n\n 자바지기 | 2010-11-30 화요일 오전 10:17\n\n--\n\n원래 행하지 못하는 사람이 말이 많은 법이에요. 참! 형 일하시는데 한번 구경가도 될까요? Agile은 하고 계시죠?\n\n [doortts](http://blog.doortts.com) | 2010-11-30 화요일 오전 11:9\n\n--\n\ndoortts// 그럴 목적으로 왔지만 벽에 부딪혀서 아직 제대로 실행하지 못하고 있다. 회사 구경은 나중에 한단계 발전하면 보여주기로 하고 조만간 밥이 한끼 먹자. 요즘 고민하고 있는 것도 있고, 하고 싶은 이야기도 있고 하니까..\n\n 자바지기 | 2010-11-30 화요일 오후 12:10\n\n--\n"
  },
  {
    "id": 147,
    "title": "나의 멘토는 어디에 있는가? (Where is my mentor?)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1295449713000,
    "body": "> doortts | 2010-11-29 월요일 오전 1:12 | 이생각 저생각 | [원본](http://blog.doortts.com/147)\n\n엔지니어라면 누구나 자신에게 좋은 멘토가 있었으면 하고 바란다.\n그러면 좀 더 빠르게 성장할 수 있을 것 같기 때문이다.\n\n스타워즈의 루크에겐 오비완과 요다가\n매트릭스의 네오에겐 모피우스와 오라클이\n타짜의 고니에겐 평경장이 있었던 것 처럼 말이다.  [cfile23.uf.11239A4B4D2DA78D387F98.jpg](./attachments/cfile23.uf.11239A4B4D2DA78D387F98.jpg)\n[cfile23.uf.20239A4B4D2DA78D3748BC.jpg](./attachments/cfile23.uf.20239A4B4D2DA78D3748BC.jpg)[cfile30.uf.12239A4B4D2DA78D391258.jpg](./attachments/cfile30.uf.12239A4B4D2DA78D391258.jpg)\n[알고보면 다들 기술자들]\n\n하지만 현실은 영화랑 다르다. 혼자 발버둥치다 지쳐버리는 일상이 되풀이되기 십상이다.\n\n그럼, 어떻게 해야 할까? \n글쎄.. 해결책이라기 보다는 그 동안 지내오며 보고 느낀 몇 가지 이야기를 해볼까 한다.\n\n하지 말것!  멘토가 없다는 걸 막연히 한탄만 하기\n\n[cfile25.uf.146FEA414D36F9D3255B50.jpg](./attachments/cfile25.uf.146FEA414D36F9D3255B50.jpg) [...]  흔한 착각  1.멘토는 원포인트 레슨을 해주는 사람도 아니고 과외선생도 아니다.\n본인이 혹시 당신 바라는 멘토가 그런 사람이라면 그건 단순 이기적인 욕심에 가깝다. \n2\\. 또 멘토는 자신의 곁에서 '널 언제나 지켜줄게'라는 말을 할 것만 같은 느낌으로 지속적으로 지도해주는 사람도 아니다. 1년에 한 번을 만나도 받은 가르침이 자신의 삶을 이끌어 줄 수 있다면 충분하다.\n\n3.멘토는 나 보다 뛰어난 사람?\n대부분의 사람들은 멘토를 찾을 때 자신보다 뛰어난 사람을 찾는다. 그것도 모든 분야에서 자신보다 훨씬 앞서있기를 바란다. 사실 멘토가 (뛰어나서 나쁠거야 없지만) 해당 분야에서 꼭 나보다 능력이 뛰어난 사람이어야 하는 건 아니다. 이를텐면 서울대를 나온 선생님에게 배워야만 서울대를 갈 수 있는건 아니다. (비슷한 말로는 '히딩크가 박지성보다 축구를 잘해서 감독을 하는것이 아니다'라는 표현도 있다)\n\n자신이 보지 못하는 것을 보고, 잠재력을 찾아내 줄 수 있는 사람이 나에게 필요한 멘토다.\n 4\\. 롤모델(Role Model)과 멘토도 다르다.\n\n롤모델과 멘토의 차이점은, 롤모델은 본받을 만한 어떤 사람의 '현재 모습'이고 멘토는 그 모델로 가기 위한 조언을 해주는 사람이다. 따라서 둘은 다르다.\n\n'그래 알았다 치자. 그럼 대체 나의 멘토는 어디서 찾는단 말인가? 우리팀, 우리 부서를 몰라서 하는 말인것 같은데, 당췌 배울 선배가 없단 말이다!'\n\n음...\n![mentor.gif](/files/21821)\n\nMentor is everywhere.\n\n고전적이지만 시대가 바뀌어도 변함없는 조언이 하나 있다.\n\n三人行則必有我師(삼인행칙필유아사)\n동행이 세 사람만 되도 그 안에 스승이 있다.\n\n모든 부분에서 나를 앞서는 사람을 찾아 그 사람을 스승으로 삼는 것이 아니라, 내가 배울수 있는 부분을 가진 사람이라면 누구나 나에게 스승이 되고 멘토가 될 수 있다. 나이가 많고 적음을 따지거나, 성별을 따질 필요 없다. 중요한건 겸손함과 노력하는 자세만 준비되어 있으면 주변에 멘토는 많다.\n\n만약 팀내에 없다면 회사내에서 찾고, 회사 내에서 없다면 회사 밖에서 찾고, 책에서 찾고, 모임에서 찾으면 된다. 가르침을 청하고 묻고 배우고 귀 기울이면 된다. 난 그런식으로 성장하는 많은 사람들을 봤다. 사회적 편견이나 선입관을 자제하고 용기를 내면 누구나 자신의 멘토가 된다.\n\n여기서 깜짝 퀴즈 하나.\n\n굴뚝청소를 마치고 내려운 두 아이의 이야기가 있다.\n한 아이는 얼굴에 검댕이가 묻어 있고, 한 아이는 묻어 있지 않았다.\n누가 세수를 하겠는가? ![cl.jpg](/files/21819)\n\n답은 얼굴에 검댕이가 묻지 않은 아이다. 두 아이는 서로의 얼굴을 보고는 자신의 모습을 추측하게 되기 때문이다.  즉, +가 아니면 -에서도 배운다.\n\n어쨌는 마음이 열려 있고 노력을 기울이면 멘토는 어디에나 있고, 어디에서든 배울 수 있고, 성장할 수 있다.\n\n자. 그럼 지금까지가 일반론이라면 좀 더 구체적인 이야기를 하나 해보자.\n주변에 후배만 잔뜩, 혹은 배울 사람이 없다 느낄 때 취할 수 있는 가장 쉬운 방법에 대한 에피소드이다.\n 예전 혼자 바닥을 떼굴떼굴 구르던 시절, 멘토가 생겨도 시원찮을판에 후배가 한 명 들어왔다. 그 때 내가 했던 일은 가장 빠른 시간내에 그 후배를 내 수준으로 끌어 올리는 것이었다. 지식을 전달하는 것도 중요했지만, 무엇보다 현재 내가 하고 업무처리시의 사고방식에 대해 후배가 이해하고 마찬가지로 대응할 수 있는 수준이 될 필요가 있었다. 그래서 (미안하지만) 좀 빡세게 가르쳤다. 간단한 질문에도 바로 답을 알려주지 않고 계속 질문하고 추리하게 하고 또 질문하고 추리하고 시험해 보게 하는 식으로 말이다. 후배는 날 꽤나 미워했을 거다. (안 그래도 되는데 몇 년뒤에 만나서 정말 그랬다고 내게 말해줬다. 고맙다. 이녀석아!)\n\n어쨌든, 그 결과 두 가지 사실을 알게 되었다.\n\n하나. 2년간 바닥을 굴러가며 배운걸 가르쳐서 비슷한 수준으로 만드는데 4개월이 채 안걸리는구나..(허망... 여길 떠나자...)\n둘. 멘토가 되(려고 마음먹)었더니 정말 멘토가 되었다.\n 왜 그랬을까? 멘토를 찾기만 했지만, 내가 멘토가 될 생각은 왜 못했을까? 없다고 아쉬워할 또 다른 나같은 사람에게 전해 줄 수 있는게 있는데 말이다. 부디, 멘토를 찾기만 하지 말자. 때로는 부족하다 생각이 들어도 내가 도움이 될 수 있는 사람이 있다면 스스로 멘토가 되자. 멘토는 누가 임명하는 것이 아니다. 멘토가 되려고 마음 먹으면 멘토가 될 수 있다. 그래서 멘토가 없다고 아쉬워 하는 다른이에게 도움이 되자. 그러면 그 전엔 배우지 못했을 많은 걸 배울 수 있을 거다. \n\n그리고 밴드에서 가장 연주 못하는 사람이 되는 것도 좋지만, 그걸 위해 내 밴드를 버리고, 동료를 버리고 떠나진 말았으면 좋겠다. (담론 중에 밴드에서 가장 못하는 사람이 되어라는 말이 있다. 그래야 많이 배운다는 뜻이다.) 내 밴드가 나만큼 되지 못하면 나만큼 하게 만들면 된다. 그리고 같이 성장해 나가자. 앞서거니 뒷서거니 하면서 말이다. \n![rock-band-game.jpg](/files/21825)\n\n자.. 이제 길고도 긴 이야기에 마무리를 할 시간이다.\n\n이 모든 이야기를 관통하는 중요한 자세가 하나 있다.\n\n그건 다른 사람의 의견을 존중하고 열린마음으로 받아들일 수 있는 마음가짐이다. 본인의 의견이 틀릴 수 있음을 항상 전제로 마음을 열고 상대방의 의견을 듣는 능력이다. 참고로 이건 굉장히 어려운 능력이다. 자신의 실력과 지위가 올라가면 올라 갈수록 더더 유지해 나가기 어려운 능력이다.\n\n그럼 그런 자세 유지 방법은?\n\n글쎄... 방법은 노력하는 수 밖에 없지 않을까? (나도 못하기에 노력하는 부분이라 뭐라 할 말이...)\n\nps. - 주의사항 -\n 자, 노파의 마음으로, 이 글을 읽는 분들에게 이야기 드리는 유의 사항이다.\n 다른 사람의 이야기를 들을 때 틀린부분을 찾기보다 나에게 필요한 부분을 찾아라. 내가 하는 이야기가 100% 와닿지 않을 수 있고, 일부분은 견해가 완전히 다를 수도 있다. 그리고 심지어 어떤 내용은 나의 이야기가 명백히 틀린 이야기일 수 있다. 그래도 도움이 되는 부분을 찾아라.\n\n'누가 그런거 모를까? 나도 걸러 들을 능력은 된다구!'\n\n비단 이 글 뿐아니라 다른 상황에서도 우리가 빠지기 쉬운 함정이 하나 있다.\n\n한 가지 오류로 전체를 부정해선 안된다.\n \n필요하고 도움이 되는 부분은 최대한 받아들이고, 받아들이기 어려운 부분은 보류해 놓으면 된다. '이런 사안에 저런 의견도 있었다.' 정도로 남겨 놓으면 충분하다.\n\nUML만 보더라도 강조하는 부류와 가볍게 보는 부류는 흔히 대립되곤 하는데, 양쪽의 의견은 보통 주장하는 바가 맞곤 한다. 마치 '그래 네말이 맞다. 옳거니, 네 말 또한 맞다.'식의 물렁물렁한 대답처럼 들릴 수도 있지만, 주의 깊게 들어보면 보통 주장하는 부분(Aspect of developmet)이 각각 조금 다르기 때문에 그렇다. 전체를 부정하지 말고 그 차이를 이해하는 것이 필요하다.\n\n이게 '멘토'라는 것에 대해 내가 배우고 느낀 것 들이다.\n부디 누군가에게 이 글이 도움이 되었으면 좋겠다.\n\n#### Comments\n\n좋은 글, 흥미진진하게 잘 읽었습니다. \n(재치가 넘치는 표현에 데구르르르...)\n\n멘토를 막연하게 찾기보다는 겪다보면 찾아지게 될 때도 있더라구요.\n건강하세요~ :-)\n\n zeide | 2011-01-21 금요일 오후 8:15\n\n--\n\n잘 지내시죠? 모처럼 메시지 반가웠어요. \n역시 건강이 제일 중요한것 같아요. :)\n\n조만간 다시 볼 날을 기대할게요.\n감사합니다.\n\n [doortts](http://blog.doortts.com) | 2011-01-22 토요일 오후 7:49\n\n--\n\n헉... 지난번에 댓글 달았었는데 사라졌어요 ㅠㅠ\n\n [스쿨쥐](http://swtest.co.kr) | 2011-01-26 수요일 오전 9:43\n\n--\n\n제가 달았던 답글도 사라졌어요.. -_-;; 뭘까요?\n\n [doortts](http://blog.doortts.com) | 2011-01-28 금요일 오후 11:13\n\n--\n\n잘 읽었습니다. 마스터.\n\n [fupfin](http://me2day.net/geekinside) | 2011-01-29 토요일 오후 4:58\n\n--\n\n키튼?\n\n [doortts](http://blog.doortts.com) | 2011-01-30 일요일 오후 9:48\n\n--\n\n흔한 착각 부분이 전 맘에 드네요 ㅎ\n\n복마니 받으세요 !! 행님!\n\n [is윤군](http://helols.tistory.com) | 2011-01-31 월요일 오후 2:58\n\n--\n\n먼데서 고생이 많다!\n\n새해 복 많이 받아!! :)\n\n [doortts](http://blog.doortts.com) | 2011-01-31 월요일 오후 10:50\n\n--\n\n좋은 글이네요 구글링해서 우연찮게 들어왔는데 감사합니다. ^^\n\n KTH | 2011-02-22 화요일 오후 1:31\n\n--\n\n다른 그룹 가기 직전인뎅... 우쒸....--;\n\n [수](http://cskstory.tistory.com/) | 2011-02-27 일요일 오후 4:57\n\n--\n\n감사합니다.\n\n [Minq](http://minq1205.tistory.com) | 2011-03-18 금요일 오후 1:37\n\n--\n\n좋은글 감사합니다 ^^\n페이스북에 링크 좀 걸어도 될까요?\n\n 김태준 | 2011-05-12 목요일 오후 4:7\n\n--\n\n물론이죠. 편하게 이용하세요. : ) 좋게 봐주셔서 감사합니다!\n\n [doortts](http://blog.doortts.com) | 2011-05-12 목요일 오후 4:43\n\n--\n\n안녕하세요. 좋은 글이네요^^\n느끼고, 생각하게 하는.. 좋은 글들이 많은 곳이네요~\n자주 들르겠습니다. ^^\n\n [알파걸](http://oyesji.blog.me/) | 2011-06-04 토요일 오전 1:11\n\n--\n",
    "attachments": [
      {
        "id": 21818,
        "name": "01.jpg",
        "hash": "b7e949f3733c0bddcf441de8808923d720682828",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 23250,
        "containerId": "12321"
      },
      {
        "id": 21819,
        "name": "cl.jpg",
        "hash": "effd71686b608dc723ab95df74303a7762f575be",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 39655,
        "containerId": "12321"
      },
      {
        "id": 21820,
        "name": "lament_of_the_red_bottom_monkey.jpg",
        "hash": "fc71cf5f040b1a9b359138d9c4037e604954ace4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 38227,
        "containerId": "12321"
      },
      {
        "id": 21821,
        "name": "mentor.gif",
        "hash": "47646c61037d4a1de771db60e56a111cde3c9e9b",
        "containerType": "BOARD_POST",
        "mimeType": "image/gif",
        "size": 59710,
        "containerId": "12321"
      },
      {
        "id": 21822,
        "name": "03.jpg",
        "hash": "4bd3f310966ddabc79d8c66bebe3286fc89e876c",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 17255,
        "containerId": "12321"
      },
      {
        "id": 21823,
        "name": "02.jpg",
        "hash": "f4300f52a7f56cb7e95067987c3cbd0edb8ff94f",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 24824,
        "containerId": "12321"
      },
      {
        "id": 21824,
        "name": "One-Point_Lesson_Form_W.jpg",
        "hash": "20f1664af18bc6c9f92278f8d8fdc6cce4b799ee",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 9557,
        "containerId": "12321"
      },
      {
        "id": 21825,
        "name": "rock-band-game.jpg",
        "hash": "db9d90eb247a65eb8ae8e872724a72ca464ffe1b",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 135784,
        "containerId": "12321"
      }
    ]
  },
  {
    "id": 148,
    "title": "[dw Review] 구글토크 호환 메신저를 만들고 싶다면? XMPP!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1291124956000,
    "body": "> doortts | 2010-11-30 화요일 오후 10:49 | 이생각 저생각 | [원본](http://blog.doortts.com/148)\n\n예전에 메신저를 만들었던 적이 있습니다. 정확히는 메신저를 만들기 위해서 노력했던 적이 있었습니다. 그 당시 SM 사이트에서 근무했었는데, 장해가 발생하면 밤에 곧잘 사무실로 불려가곤 했었거든요. 제가 살던데가 산본이었고, 근무지가 서초였는데, 새벽 2~3시에 전화받고 잠이 깨서는 '그럼, 상쾌한 밤공기 맡으며 한번 다녀와 볼까?'와 같은 긍정적인 생각이 드는 거린 절대 아니었죠.\n\n![](http://farm5.static.flickr.com/4013/4479253634_110b7731b6_z.jpg)\n[네? 여보세요? 네? 뭐가 안된다고요? 알았어요. 지금 가고 있어요. 기둘...]\n\n사실 장해가 발생해서 어렵게 어렵게 가도 상당수는 해결하는데 1시간 이내면 족한 문제였습니다. 정말 문제는 왕복 교통시간이 그 두 배쯤 걸린다는 것이었죠. 그래서 메신저를 만들어서 원격으로 작업을 해야겠다고 마음을 먹었습니다. 네이트온은 막혀있고 MSN메신저만 가능했었습니다. (사실 제가 MSN메신저를 이용해서 그런짓을 할려고 마음먹고 진행하고 있었다는걸 고객이 알았다면 전 바로 실업통계에 들어가는 캐릭터가 되었을 겁니다. 겁이 없었죠. 뭐, 여튼...) 그런데 그 당시에 MSN의 메신저 프로토콜은 공개되어있지가 않았더랬습니다. (지금은 공개되었나요?) 그래서 인터넷을 뒤지고 뒤져보니 몇몇 선구자들이 네트워크 패킷을 분석해서 리버싱으로 프로토콜을 추측해 작성해 놓았더군요.\n\n뭐, 공부는 한참 했지만, 결국 만드는건 실패했습니다. 작업을 시작할때쯤 사이트를 옮겼거든요. 새벽 야근은 안녕~ 하진 못했지만, 집에서 택시로 15분 거리의 사이트로 파견을 나가게 되었거든요. (명학역 근처였더라지요? :)\n\n나중엔 NATEON 호환 메신저를 만들겠다고 또 한참을 뚝딱거렸습니다. 그래도 CodeChaser라는 닉네임을 쓰시는 분이 마찬가지로 패킷 리버싱을 통해서 네이트온의 프로토콜을 분석해서 잘 정리해 놓은 문서 덕분에 어느정도 진행이 가능했더랬습니다.\n\n뭐, (하지만 마찬가지로) 공부는 한참 했지만, 결국 만드는건 실패했습니다. 취미로 하는데는 한계가 있으니까요. 그 시절에도 밤 12시에 일이 끝나던 시절이었기 때문이라고 핑계를 대봅니다. ^^;\n\n그러다 다시 1년쯤 뒤에 다시 시작한 메신저가 XMPP호환 메신저였습니다.\n\nXMPP(Extensible Messaging and Presence Protocol)\n공식사이트 : [xmpp.org](http://xmpp.org \"[http://xmpp.org]로 이동합니다.\")\n\n\nXMPP는 전세계적으로 사용하고 있는 표준 메신저 프로토콜이라서 자료도 많고 예제도 많았습니다. 더더군다나 그때가 영문책으로 EclipseRCP를 떠듬떠듬 보고 있던 시점에 마침 RCP의 예제로 쓰인 덕분에 도움받아 만들었습니다. 책보고 따라치기도 많았지만, 책의 예제가 옛버전이라 한참 공부했었습니다. 힘들었어요.\n그래도 오픈소스로 공개되었는 XMPP호환 메신저/서버들이 있었기 때문에 진행이 가능했습니다. 그리고 구글토크가 XMPP 호환 메신저라는 걸 알게되었죠. 연동 되더라구요. 버그가 있었지만 덕분에 한동안 즐겁게 보냈죠. (그 당시 전 한참 히키꼬모리.. .쿨럭..쿨럭.. :)\n\n![](http://cfs10.tistory.com/upload_control/download.blog?fhandle=YmxvZzE3NDUwNEBmczEwLnRpc3RvcnkuY29tOi9hdHRhY2gvMC8xNzAwMDAwMDAwMDEucG5n)\n[소스코드가 공개되어 있는 XMPP호환 메신저 Spark. 자바 스윙으로 만들어져 있습니다.]\n\n이제는 그때보다 자료가 많습니다. 그리고 아주 친절한 한글자료도 생겼죠. 그리고 이제는 허드슨(CI 서버)등에서도 사용할 만큼 보편적이 되었죠.\n\n[기술자료]XMPP(Extensible Messaging and Presence Protocol) 소개\n[http://www.ibm.com/developerworks/kr/library/x-xmppintro/index.html](http://www.ibm.com/developerworks/kr/library/x-xmppintro/index.html \"[http://www.ibm.com/developerworks/kr/library/x-xmppintro/index.html]로 이동합니다.\")\n\n[튜터리얼]XMPP를 사용하여 웹 기반 알림 도구 빌드하기\n[http://www.ibm.com/developerworks/kr/xml/tutorials/x-realtimeXMPPtut/index.html](http://www.ibm.com/developerworks/kr/xml/tutorials/x-realtimeXMPPtut/index.html \"[http://www.ibm.com/developerworks/kr/xml/tutorials/x-realtimeXMPPtut/index.html]로 이동합니다.\")\n\n\n사실 지금에 와서 XMPP를 마치 신기술처럼 이야기하기엔 부끄러운 이야기입니다. 몰랐을뿐 시작한지는 오래된 프로토콜이거든요.\n\n이미 7년전에 이런 기사도 있었답니다.\n\nXMPP기반 토종 메신저 첫 선\n[http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=030&aid=0000044854](http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=030&aid=0000044854 \"[http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=030&aid=0000044854]로 이동합니다.\")\n\n\n메신저를 사람과의 대화를 위해서 쓰는것도 한가지 목적이지만, 원격작업을 위해서 메신저 프로토콜을 이용해서 애플리케이션을 만드는 것도 좋은 활용법인 것 같습니다. 아마 저는 머지않아 메신저 작성을 위한 네번째 시도를 하게 되지 않을까 싶습니다. (누군가의 압박을 받지 않아도 되는) 프로그래밍은 즐거운 취미가 될 수 있거든요.\n\nps.\n참!XMPP기반 메신저와 google talk를 연동시키고 싶으시면 아래 링크를 참조하세요.\n[XMPP 기반 메신저 Spark와 google talk 연동하기](http://blog.doortts.com/75 \"[http://blog.doortts.com/75]로 이동합니다.\")\n\n그림출처\n[Fotogravirus](http://www.flickr.com/photos/fotogravirus/)님 http://farm5.static.flickr.com/4013/4479253634_110b7731b6_z.jpg\n\n#### Comments\n\nXMPP 스펙에 대한 한글 설명이 많이 부족해서 기반기술에 대한 접근이 너무 어려운것 같습니다.\nXMPP.kr 사이트는 활동안하는 듯하고...\n\n 바밤바 | 2010-12-01 수요일 오후 6:39\n\n--\n\nXMPP.kr은 사실상 기술자료를 얻는 사이트라 보기 어려운것 같습니다. 영문으로는 책도 있던데 한국에서는 상업적 수요자체가 너무 협소해서 제대로 연구되진 않는것 같아요. 대신 EclipseRCP 책을 한번 봐보세요. 번역서도 있습니다. \n\nRCP를 만드는 책이긴 하지만, 자바에 익숙하시다면 어느정도 도움이 되실겁니다.\n\n [doortts](http://blog.doortts.com) | 2010-12-01 수요일 오후 8:11\n\n--\n"
  },
  {
    "id": 149,
    "title": "2011년 새해인사",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1294120853000,
    "body": "> doortts | 2011-01-04 화요일 오후 3:0 | 이생각 저생각 | [원본](http://blog.doortts.com/149)\n\n2011년이 되었습니다. 일과 체력적인 문제로 블로그 글이 점점 줄어들어서 개인적으로 아쉬워 하고 있습니다. 한편으론 스스로 단련하지 않고 올리는 글이 될것 같아 안 올리느니만 못하다는 생각에 주저할 때도 많았습니다.\n\n그런데 어떻게 생각해 보면 그건 단지 스스로를 괴롭히는 올가미일 뿐이라는 생각이 들더군요. 자신에게 남기고 싶은 글을 쓰는 걸로 블로그를 시작했는데, 언제부턴가는 지나치게 남을 의식하고 쓰고 있다는 걸 알게되었습니다. 스스로가 뭣도 아닌데도 의식해 버리는 거였죠. 부끄럽더라구요. :)\n\n그래서 2011년에는 좀 더 스스로를 좀 더 자유롭게 만들어 주고 싶습니다. 편하게 더 자주 글을 남기려고요.\n\n또한 비록 미약하고 보잘것 없지만, 그래도 몇 안되는 분들에게라도 도움이 되었으면 하는 마음으로 지식을 공유하기 위해 노력하는 것도 잊지 않겠습니다.\n\n(비록) 실낱같이 얇을수 있지만 찾아오시고 읽어주시는 분들과 이어진 소중한 끈 감사히 여기며 살겠습니다.\n\n편안하고 좀 더 자신을 행복하게 만들어 주는 한 해 되세요.\n\n감사합니다."
  },
  {
    "id": 151,
    "title": "[dW Review] 뜨거운 감자 Apache Maven",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1296391679000,
    "body": "> doortts | 2011-01-30 일요일 오후 9:47 | Better SW Development | [원본](http://blog.doortts.com/151)\n\nApache Maven에 대해 모르고 있던 5가지 사항\n[http://www.ibm.com/developerworks/kr/library/j-5things13/index.html](http://www.ibm.com/developerworks/kr/library/j-5things13/index.html \"[http://www.ibm.com/developerworks/kr/library/j-5things13/index.html]로 이동합니다.\")\n\n\n우선 결론부터 말하자면, 위 글을 읽고 난 먼저 한숨이 나왔다. 메이븐을 이렇게까지 써야 하나.. 라는 생각이 들었다. 메이븐을 모르는 사람은 (당연하겠지만) 위 기사가 별로 도움이 안된다. 먼저 선행학습이 필요하다. 그런데 선행학습을 하더라도 메이븐에 대해 모르고 있던 5가지를 읽어서 해당 작업을 처리할 수는 있겠지만, 내 개인적으로는 느끼기엔 그건 메이븐으로 할 수 있다(Can Possible)이지 쉽게 할 수 있다(Easy Possible)은 아니라고 느꼈기 때문이다. 나중에 메이븐 학습후 다시 보게 되더라도 이 부분은 조금 고민해 보길 바란다.\n\n사실 내가 몇 년전 부터 학습하다 말다 하는 것이 몇 가지 있는데, 그 중 하나가 Maven이다. 메이븐은 애플리케이션 라이플사이클 관리(ALM)및 의존모듈 관리(dependency management)툴인데, 현재 국내 전자정부 프레임워크의 기반 툴중 하나이기도 하다. 의존성 관리도 해보고 프로젝트도 만들어서 진행해 봤는데 아쉽게도 끝까지 진행하진 못했다.\n\nMaven을 쓰다 말다 하게 되는데 몇 가지 이유가 있는데, 그 중 가장 큰 이유는 (현 시점에서) 주변사람들과 함께 작업하기 어려워서다. 혼자 쓸 줄 아는걸로는 함께 하기엔 다소 어려운 점이 있다. 이게 무슨 말인가 하면 Maven은 그 특징상 설정이 잘 되어 있다는 가정하에서 사용자(Developer)가 편하게 의존성 관리나 애플리케이션 관리(빌드, 테스트, 배포 등등)를 쉽게 할 수 있도록 도와준다. 그런데 문제는 문장내에 있는것 처럼 \"설정이 잘 되어 있다\"는 가정하에서라는 점이다. 보통 팀의 아키텍트 역할을 하는 사람이 해당 설정을 해야 하는데 학습기간 다소 필요하고, 몇 가지 기본적인 문제를 해결해 놓아야 한다.\n\n- 저장소 관리 (개별 or 공용)\n- 공용 저장소에 없는 모듈 관리\n- 플러그인에 문제 발생시 대응\n\n그리고 적어도 팀내 두 명 이상은 해당 내용을 처리할 수 있어야 한다. 아니면 팀내 고립된 기술, 고립된 담당자가 되어버리기 때문이다. 팀내 적어도 두명의 설정을 고칠 수 있는 사람이 있어야 하는데, 그게 생각보다 쉽지 않다. 더더군다나 Ant와  Ivy를 함께 써왔다던가, Maven Ant Tasks로 의존성관리만을 해왔던 팀은 Maven 으로의 이전(Transition)에 장벽이 더 크다. 게다가 그 동안 변변한 자료가 없었기에 알음알음 배우거나 인터넷에 공개되어 있는 영문 레퍼런스 북을 이용해야만 했다.\n\n그러다 최근에는 자료가 많이 늘어서 상황이 많이 나아졌다.\n\n지앤선(志&嬋) 출판사에서 메이븐 책이 내왔고 전자정부 표준 프레임워크 위키 페이지에서도 참고자료가 있다.\n\nMaven 메이븐 : Sonatype이 만든 Maven 핵심 가이드\n[http://www.yes24.com/24/Goods/4143117?Acode=101](http://www.yes24.com/24/Goods/4143117?Acode=101 \"[http://www.yes24.com/24/Goods/4143117?Acode=101]로 이동합니다.\")\n\n전자정부 표준프레임워크 위키\n[http://www.egovframe.org/wiki/doku.php?id=egovframework:dev:gettingstarted](http://www.egovframe.org/wiki/doku.php?id=egovframework:dev:gettingstarted \"[http://www.egovframe.org/wiki/doku.php?id=egovframework:dev:gettingstarted]로 이동합니다.\")\n\n아파치 메이븐 2 시작하기 (한글)\n[http://www.ibm.com/developerworks/kr/library/tutorial/j-mavenv2/section2.html](http://www.ibm.com/developerworks/kr/library/tutorial/j-mavenv2/section2.html \"[http://www.ibm.com/developerworks/kr/library/tutorial/j-mavenv2/section2.html]로 이동합니다.\")\n\n\n특히 전자정부 표준프레임워크 사이트에서는 스프링관련 자료들도 함께 얻을 수 있다. 주변 분들이 여기에 많이 투입되어서 열심히 작업하시는걸 봤다. 가끔 가서 참고 자료를 보는데 메이븐에 대해서도 좋은 자료가 많다. 특히 저장소도 제공하고 있다. 조만간 프로젝트 사례 기반의 메이븐 국내서도 발간될 예정이니 그걸 기다려 보는것도 괜찮을 것 같다. :)"
  },
  {
    "id": 152,
    "title": "[강의후기] 자바로 배우는 효율적인 객체지향 프로그래밍",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1296395709000,
    "body": "> doortts | 2011-01-30 일요일 오후 10:55 | 잊기전에 회고 | [원본](http://blog.doortts.com/152)\n\n지난 목금(1월27~28일) LG전자 MC연구소 분들과 생산기술원 분들을 대상으로 강의를 진행하였습니다.\n\n자바로 배우는 효율적인 객체지향 프로그래밍\nEffective OOP with JAVA\n\n\n제목은 거창한듯 보이지만, 실제로는 OOP와 OOAD(OO Analysis and Design)에 대해 오해하는 부분이나 지향점에 대해 이야기 하고 점검해 보는 시간이었습니다. 15명에서 20명을 생각했던 초기 예정과는 달리 서른 분 이상이 참여하시게 되었다는걸 전날 알게 되어 부랴부랴 추가적인 준비를 했습니다. 인원이 배가 되면, 추가준비가 더 필요하거든요. 안그러면 자칫 우왕좌왕 혼란스러워 지기때문입니다. 덕분에 전날은 거의 잠을 못 잤습니다. 강사가 절대적으로 관리해야 하는게 컨디션인데, 전날 제대로 잠을 안잔다는건 사실 굉장히 위험한 짓입니다. (정말 지양해야 하는 일입니다)\n\n![EffectiveOOP_PPT0.png](/files/21828)\n[PPT 2007 테마를 이용한 표지. 폰트는 공개글꼴인 서울 남산체와 서울 한강체]\n\n강의에 참가하시는 분들이 경력도 다양하시고, 기술영역도 다양하기 때문에 이틀간 어떤 내용을 어떤식으로 전달해야 가장 효과가 높을까에 대해서 고민도 많이 하고 걱정도 많이 했습니다. (엔지니어 경력 12년차 이상인 분들도 계시는데 시간 아깝거나 누가되선 안되니깐요.)\n\n![EffectiveOOP_PPT2.png](/files/21826)\n[강의 진행 컨셉]\n\n지식보다 지혜를 늘리고, 관람하듯 보기 보다는 연습을 통해 배우며, 스스로가 모르는 것이 무엇인지를 찾아낼 수 있게 하는 것. 그리고 객체지향 개발을 하는데있어 선택사항들은 어떤것이 있고, 그 때 선택해야 하는 굿 가이드는 무엇인지를 이야기할 수 있도록 만드는걸 목표로 삼았습니다.\n\n![EffectiveOOP_PPT.png](/files/21829)\n[준비했던 PPT자료의 일부, 이틀간 실습을 12개 가량 했으니 실습도 적진 않았습니다. ]\n\n사실 준비에서 강의 진행까지 우여곡적절이 많았던 강의인데, 다행히 잘 끝난것 같습니다. 참여하셨던 분들도 적극적으로 교육에 임해주셔서 좋았습니다. 저도 많이 배웠고요.\n\n자. 이하는 저의 개인 회고입니다.\n\n좋았던 점\n- 동종업계 분들에게 도움을 줄 수 있었다.\n- (다행히도) 강의를 좋게 평가해 주셔서 힘들었지만 기운이 났다.\n- 생산기술원 분들과 이야기도 많이 나누고 마지막날에는 같이 삼겹살도 먹은 것!\n\n아쉬웠던 점\n- 보안이 철저한 장소에서 이루어져서 자료공유가 쉽지 않았다. (그 흔한 사진한장 못 찍었네요)\n- 시간 부족. 각각 제출한 설계나 코드에 대해 함께 리뷰할 시간이 많지 않았다.\n- 인원. 강의 주제와 내용상 30명은 좀 많았다. 개개인과 팀들을 제대로 관리하지 못했다.\n- 몸상태.. (잘 회복이 안되네요)\n\n인상깊었던 점\n- 교육받고 나서 다시 팀에 들어가서 야근을 할 정도로 많은 분들이 교육에 열의가 있었다.\n\n아! 그리고 개인적으로 설문을 받았었는데, 몇 몇 분들이 공통적으로 인상적이었다고 말해 주신 PPT는 Death Star vs 철인28호 였습니다. \n![EffectiveOOP_PPT3.png](/files/21827)\n철인28호 스토리가 생각난다면 씁쓸한 나이신거죠.. 라고 말했는데 몇 분 계셨었습니다. ... -,-;;;\n\n다음에 같은 주제로 한 번 더 한다면 더 잘 할 수 있을 것 같습니다. 아쉬움은 남지만, 현재로서는 다음 교육을 하게 된다면, 리팩터링과 TDD를 주제로 진행하게 될 것 같습니다.\n\n마지막으로, 좋은 기회 주신 생산기술원의 엄위상([@wseom](http://twitter.com/wseom \"[http://twitter.com/wseom]로 이동합니다.\")) 그룹장님과 심우곤([@wgshim](http://twitter.com/wgshim \"[http://twitter.com/wgshim]로 이동합니다.\"))  선임님께 감사드립니다. :)\n\n#### Comments\n\n간만에 신선한 교육을 들을 수 있어서 너무 좋았습니다.\n나중에도 강사님 교육을 듣고 싶네요 ^^\n새해 복 많이 받으세요...\n\n 정학 | 2011-01-31 월요일 오후 12:38\n\n--\n\n저도 정말 듣고 싶었습니다.\n잠시 회사를 옮길 수 있다면....\n차라리 다른 회사 분들이 너굴님의 강의를 더 자주 접하는 군요. --;\n\n [수](http://cskstory.tistory.com/) | 2011-02-27 일요일 오후 4:58\n\n--\n",
    "attachments": [
      {
        "id": 21826,
        "name": "EffectiveOOP_PPT2.png",
        "hash": "8a2bf76e6c8fc5fb02ab4a6217866555d356f787",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 99260,
        "containerId": "12322"
      },
      {
        "id": 21827,
        "name": "EffectiveOOP_PPT3.png",
        "hash": "9df134332ffc70e026cfdd304ec8179638e172eb",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 128022,
        "containerId": "12322"
      },
      {
        "id": 21828,
        "name": "EffectiveOOP_PPT0.png",
        "hash": "8fd546ddadd6b60221ce338af900da0232dfad1f",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 134960,
        "containerId": "12322"
      },
      {
        "id": 21829,
        "name": "EffectiveOOP_PPT.png",
        "hash": "37fd236d494467c33684c044c2f9d3c29f3873e2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 209701,
        "containerId": "12322"
      }
    ]
  },
  {
    "id": 153,
    "title": "[dW Review] 마커 인터페이스와 객체 그래프 : 자바 객체 직렬화(Java Object Serialization)를 배우기전에 알면 좋은 사전지식",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1296478738000,
    "body": "> doortts | 2011-01-31 월요일 오후 9:56 | Better SW Development | [원본](http://blog.doortts.com/153)\n\nJava Object Serialization에 대해 모르고 있던 5가지 사항\n[http://www.ibm.com/developerworks/kr/library/j-5things1/index.html](http://www.ibm.com/developerworks/kr/library/j-5things1/index.html \"[http://www.ibm.com/developerworks/kr/library/j-5things1/index.html]로 이동합니다.\")\n\n\n자바에서 인스턴스화 된 객체를 전달하는 가장 흔한 방법은 직렬화(Serialization)이다. 직렬화를 할 때 유용한 몇 가지 이야기를 위 기사에서 하고 있다. 언제나와 마찬가지로 제대로 이해하기 위해서는 몇 가지 지식을 미리 알고 있어야 한다.\n\n마커 인터페이스\nMarker Interface\n자바에서 객체 직렬화는 Serializable 이라는 인터페이스를 implements 하면 된다. 그런데 이 인터페이스는 구현해야 할 메소드가 하나도 없다. 단지, 객체가 직렬화 대상임을 알려주는 일종의 마커(Marker) 역할을 한다. 그래서 이렇게 메소드를 하나도 가지지 않는 인터페이스를 마커인터페이스(Marker Interface)라 부른다. - 혹자는 태그(tag)인터페이스라고 부르기도 한다. -\n마커 인터페이스에는 이 외에도 Cloneable, EventListener 등이 있다. 그럼 왜 이런 인터페이스를 만드는 걸까? 아니, 이런 인터페이스를 만들면 어떻게 하겠다는 뜻일까?\n\n대부분의 경우 특정 작업을 하기 전에 해당 타입을 체크하는 용도로 사용된다.\n\n이를 테면 객체를 복제하는 작업을 하려면 Cloneable인터페이스를 마커인터페이스로 지정해 놓아야 한다. 실제 클론 메소드가 호출되는건 Object 클래스내에 들어 있다. 해당 인터페이스의 타입이 아닐경우 예외가 발생한다.\n\nclass Object{\n...\n     protected Object clone() throws CloneNotSupportedException {\nif (!(this instanceof Cloneable)) {\n              throw new CloneNotSupportedException(\n                      \"Doesn't implement Cloneable interface!\");\n          }\n          return VMMemoryManager.clone(this);\n      }\n... \n\n마커 인터페이스는 위와 같은 식으로 사용된다.\n\n객체 그래프\nObject Graph\n![serialization_diagram.gif](/files/21830)\n객체 그래프란 특정 시점에 객체들의 참조 관계를 나타낸 모습을 지칭한다. 직렬화를 할때는 참조되는 객체들도 참조 그래프에 따라 함께 직렬화가 일어난다. 일종의 직렬화의 전파(propagation)현상이 발생하는 셈이다. 따라서 직렬화 개념을 이해하려면 객체 그래프도 이해해야 한다.",
    "attachments": [
      {
        "id": 21830,
        "name": "serialization_diagram.gif",
        "hash": "a655298242e2ac20a36e4851c8921ca213f91c38",
        "containerType": "BOARD_POST",
        "mimeType": "image/gif",
        "size": 17603,
        "containerId": "12323"
      }
    ]
  },
  {
    "id": 154,
    "title": "[dW Review] 평범한 Java 도구에 대해 모르고 있던 5가지 사항",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1296481802000,
    "body": "> doortts | 2011-01-31 월요일 오후 10:50 | Better SW Development | [원본](http://blog.doortts.com/154)\n\n평범한 Java 도구에 대해 모르고 있던 5가지 사항\n[http://www.ibm.com/developerworks/kr/library/j-5things12/index.html](http://www.ibm.com/developerworks/kr/library/j-5things12/index.html \"[http://www.ibm.com/developerworks/kr/library/j-5things12/index.html]로 이동합니다.\")\n\n\n자바 SDK에는 유용한 유틸리티와 클래스들이 있는데, 말그대로 몰라서 못쓰는 것들이 많다.\n\n어차피 그 방대함으로 인해 다 알 방법은 없으니 사람들이 유용하다고 이야기 하는 것들을 하나 둘씩 늘려가는 것도 나쁘지 않다. 그런면에서 위 기사에서 소개하는 5가지도 괜찮다. 한 가지만 유용한 것을 발견해내도 도움이된다.\n\nServiceLoader 같은 경우엔 기사 내용처럼 간단한 의존성 주입 모듈을 만드는 것도 가능하다. (말 그대로 가능하다는 수준이긴 하지만)\nScanner는 구문 분석에도 좋고, System.in 과 함께 써서 명령형 유틸리티를 만들기에도 편하다.\nTimer의 경우도 굳지 스레드 프로그래밍을 하지 않고도 간단한 스케쥴러를 만들수 있다.\n\n이 외에도 몇 가지 생각나는걸 적어본다면,\n\n- Stack, Queue 를 이용하면 FILO, FIFO 구현이 쉽다.\n(이번 기회에 [자바컬렉션](http://download.oracle.com/javase/6/docs/technotes/guides/collections/reference.html \"[http://download.oracle.com/javase/6/docs/technotes/guides/collections/reference.html]로 이동합니다.\")에 대해 몇 개 정도 알고 있는지 확인해 보는 것도 나쁘지 않다.)\n- jar 커맨드 명령어를 통해서 zip 압축파일을 풀 수 있다. (예전에 서버에서 급할때 써먹었다.)\n- javap는 class 파일의 외형을 볼 수 있게 해준다. (이클립스에서 소스코드 없는 클래스를 접근할때 나오는 모습과 비슷한 코드를 보여준다)\n\n에.. 또.. 그리고 더 생각나면 그때 그때 이 페이지를 업데이트 하기로 하자. :)"
  },
  {
    "id": 155,
    "title": "[책 일부 공개] 테스트주도개발 : TDD실천법과 도구",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1296560668000,
    "body": "> doortts | 2011-02-01 화요일 오후 8:11 | Better SW Development | [원본](http://blog.doortts.com/155)\n\n**올리는 말**\n\n테스트 주도 개발(Test-Driven Development)을 학습하고자 하는 분들을 위해 출판물 \"**테스트 주도 개발: TDD 실천법과 도구**\"(2쇄본)의 일부를 공개합니다. (출판사 담당자분께는 사전에 양해를 구했습니다. 감사합니다. [조연희](http://me2day.net/shinegirl \"[http://me2day.net/shinegirl]로 이동합니다.\") 대리님! :) \n\n처음 TDD를 시작하시는 분들이 인터넷 검색 등으로 알음알음 시작하시는 것 보다는 그래도 이 편이 좀 더 낫지 않을까 하는 마음에 자료를 올리게 되었습니다. 비록 작은 나눔이고 부족한 노력의 일환이지만 보시는 분들께 조금이나마 도움이 되었으면 좋겠습니다. 그리고, 인쇄해서 보시는데 방해가 되지 않도록, 추천사, 서문, 이책을 어떻게 읽을 것인가 등등의 앞 부속은 제외하였습니다.  대신, 전문가 인터뷰 자료, 첨언이 들어간 ‘추천사’등의 추가 자료는  [tddbook.com](http://tddbook.com/ \"[http://tddbook.com]로 이동합니다.\")에 게재되어 있으니 자유롭게 이용해 주세요.\n\n![Front.png](/files/21832)\n\nDowonload : [테스트주도개발 : (고품질 쾌속개발을 위한) TDD실천법과 도구](http://code.google.com/p/tddbook/downloads/detail?name=TDD_PT.pdf \"[http://code.google.com/p/tddbook/downloads/detail?name=TDD_PT.pdf]로 이동합니다.\")\n\n[\"본 책보다 더 가치 있을 수도 있는 '부록' \" 중 (A.1~A.2)](http://code.google.com/p/tddbook/downloads/detail?name=Appendix%28A1-A2%29.pdf&can=1&q=#makechanges \"[http://code.google.com/p/tddbook/downloads/detail?name=Appendix%28A1-A2%29.pdf&can=1&q=#makechanges]로 이동합니다.\") \n\n\n\n[](http://code.google.com/p/tddbook/downloads/detail?name=TDD_PT.pdf \"[http://code.google.com/p/tddbook/downloads/detail?name=TDD_PT.pdf]로 이동합니다.\")**본 문서의 상업적 이용이나 blog.doortts.com, tddbook.com 이외의 사이트를 통한 배포 및 무단 전재는 금지합니다.**  기타 문의사항이 있으시면 아래 메일 주소를 이용해 주세요.\n\n\n\n![email.png](/files/21831)\n\n\n 그럼, 언제나 늘 건강하시고, 행복하세요.\n\n감사합니다.\n\n\n\n2011.02.01\\. 채수원 올림\n\n#### Comments\n\n1장을 공개하셨네요... 저는 이책나오자마자 구매했었지만 좋네요... 회사에 공유하고 싶습니다. ^^\n\n 이용해 | 2011-02-01 화요일 오후 9:17\n\n--\n\n혹시라도 이미 구입하신 분들께 누가 되진 않을까 싶어 죄송한 마음도 있습니다. 너그럽게 이해해 주시고, 좋게 봐주셔서 감사합니다. :) \n\n새 해 복 많이 받으세요.\n\n [doortts](http://blog.doortts.com) | 2011-02-01 화요일 오후 10:1\n\n--\n\n오 수원님 멋쟁이.\n\n [k16wire](http://pragmaticstory.com) | 2011-02-01 화요일 오후 10:57\n\n--\n\n새 해 복 많이 받으세요! \n따님에게도 안부 전해 주시고요. :)\n\n [doortts](http://blog.doortts.com) | 2011-02-02 수요일 오전 1:25\n\n--\n\n쉽지 않은 결정이셨을텐데 멋지세요~ ㅎㅎ 감사합니다.\n\n [Outsider](http://blog.outsider.ne.kr) | 2011-02-04 금요일 오후 12:50\n\n--\n\n접니다. 김군!\n\n오~ 2쇄!! ^^ 축하드립니다.\n\n새해 인사를 변변히 못했네요. \n전화할까 하다가 오랜만에 들어와 글 남깁니다.\n축복 가득한~ 한 해 되세요. \n그리고 무엇보다 건강하시길!\n\n 김군 | 2011-02-05 토요일 오후 8:47\n\n--\n\n맘씨도 훌륭하고,\n2쇄도 축하하고.... ^^\n\n [수](http://cskstory.tistory.com/) | 2011-02-27 일요일 오후 4:57\n\n--\n\n좋은 자료 정말 감사합니다. 요즘 한창 관심이 가는 분야였지만 계속 미루고만 있다가 그래도 책부터라도 읽고 싶어 찾던중 채수원님의 책을 보다가 블로그까지 오게 되었어요. 앞으로 많이 배워가겠습니다.\n\n 난이 | 2011-02-28 월요일 오후 2:58\n\n--\n\n좋은 자료 감사합니다 잘보겠습니다.!\n\n 잘치 | 2011-03-29 화요일 오후 4:32\n\n--\n",
    "attachments": [
      {
        "id": 21831,
        "name": "email.png",
        "hash": "c452961d8002d2d7b2d17cbad4f134f43bb3a9f4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 2554,
        "containerId": "12325"
      },
      {
        "id": 21832,
        "name": "Front.png",
        "hash": "1a8ee79a8eac2b4de946df541569b5461518a96b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 183756,
        "containerId": "12325"
      }
    ]
  },
  {
    "id": 157,
    "title": "감사주도개발 TDD (Thanks Driven Development)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1299495798000,
    "body": "> doortts | 2011-03-07 월요일 오후 6:23 | 이생각 저생각 | [원본](http://blog.doortts.com/157)\n\n### 요 며칠전 일본 Twitter에서 인기를 끌었던 TDD에 대한 글을 번역해 봅니다.  일종의 조크이니 심각하게 바라보진 말아주세요. :p\n\n\n\n### 感謝駆動開発 TDD\n\n### [http://d.hatena.ne.jp/gongoZ/touch/20110304/1299213582](http://d.hatena.ne.jp/gongoZ/touch/20110304/1299213582 \"[http://d.hatena.ne.jp/gongoZ/touch/20110304/1299213582]로 이동합니다.\")\n\n\n\n\n\n### 감사주도개발 TDD (Thanks Driven Development)\n\n### TDD란 무엇인가?\n\n감사(感謝, 고마움 표시)를 통해서 소프트웨어의 품질, 신뢰성, 고객만족도향상을 목표로 하는 프로그래밍 개발기법입니다.\n\n  \n\nTDD의 유용성\n\n\"감사따위로 품질이 높아진다는거냐?\" 라고 생각하시는 분들은, 감사의 파워를 이해하지 못하는 사람들입니다. 감사는 사회인뿐 아니라, 어린이도 나이있으신 분들도 살아가는 프로세스의 일부로서 당연히 사용되고 있습니다. 그것을 개발기법으로 사용한 TDD의 유용성에 대해 이야기 하고 싶습니다.\n\n  \n\n프로젝트 시작\n\n최초에 작성하는 것은 클래스의 정의도 테스트도 아닌 감사입니다.\n\n// C\n#include \n#include \n\nint main(int argc, char *argv[])\n{\n    printf(\"Thank you!!\\n\");\n    return EXIT_SUCCESS;\n}\n\n\n# Ruby\nputs 'Thank you'\n\n\n'이제부터 저는 코딩을 시작합니다. 개발환경을 주셔서 감사합니다.'라고 하는 기분을,  코드뿐 아니라 개발환경에도 전달하는 것으로 이후 프로젝트 진행에 좋은 영향을 줍니다.\n\n**예)**\n\n*   최초의 감사코드가 없었다면, 이클립스에서 '경고 없음'이 설정되어 있는 것을 몰랐을 것이다. 고마워!\n*   컴파일러옵션으로 -Wall(모든경고표시 켜기) 이 붙어있지 않은 것을 못보고 지나쳤을뻔 했다.\n\n#### \n\n\n#### 변수명규칙\n\n쓰고 버리는 임시 변수로 유명한 것은 'i,j,k'입니다.\n\nTDD에서는 임시변수에도 감사하는 마음을 담지 않으면 안됩니다.  \n\n\n\nint t;\nint h;\nint a;\nint n;\nint k;\nint s;\n\n기존의 기법에서는, i, j, k의 3종류였던 것에 비해 감사의 마음을 잊지 않는다면, 무려 6종류까지 사용 가능합니다.\n\n**예)**\n\n*   감사를 잊지 않은 덕분에, 6중 for문 작성이 가능해 졌다! 고마워!!\n\n#### 코멘트 규칙\n\n어떻게 하더라도 코드가 난해하게 기술될 수 밖에 없는 경우(정규식이나 메타프로그래밍 부분)에는 감사의 뜻을 적을 필요가 있습니다.\n\n/**\n * 잘 작동해줘서 고맙습니다.\n */\n\n비슷한 기법으로 유명한 [스피릿츄얼 엔지니어링](http://d.hatena.ne.jp/mirakui/20100301/1267464280 \"[http://d.hatena.ne.jp/mirakui/20100301/1267464280]로 이동합니다.\")  [footnote]스피릿츄얼 엔지니어링은 프로그래밍을 크게 정신세계와 물질세계로 나눈다. 스피릿츄얼 엔지니어링의 기초는 다음과 같다. '제발 작동해줘!', '절대 장애나 사고따윈 없어야 해!', '나.. 이번 릴리즈만 잘 끝나면 결혼한다구' 등의 정신세계가 물질계(네트워크, 서버, 프로그램)등에 영향을 미친다는 걸 이해해야 한다. 특히 의욕이나 집중력, 이익여부, 운빨이 더해져 물질계가 변화된다는 사상이다.[/footnote]에서는 아래와 같이 기술하고 있습니다.\n\n\n\n> 스피릿츄얼엔지니어링의 기본은'기도'입니다.\n> \n> '제발 동작해!'라고 하는 기도의 강함에 의해 좋은 코드를 만들어냅니다.\n\n스피릿츄얼엔지니어링의 디펙토 표준인 코멘트에의해 아래와 같이 프로그램이 끝납니다.\n\n// 부디 잘 되기를 기원합니다.\n\n이 코멘트가, 코드 작동의 원동력이 된다는 것은 사실 말할필요도 없습니다만,끊임없는 변화해 가는 상황에서 이런식의 '보수'적인 관점으로만 접근한건 좋지 않습니다. 왜냐하면, 이 기원이 정말로 효과를 발휘할까? 라고 하는 의문이 남기때문입니다.  기원의 강도가 생각했던 것 만큼에 다다르지 못한 경우라던가, 불안전하게 작동하게 될 가능성이 남아있습니다. \n\n그럼 어떻게 하면 좋을까요? TDD에서는, 이 '기원'에 '감사'를 추가합니다.\n\n// 기원이 효과가 있어서 감사합니다!\n\n이렇게 함으로써, \"이 코드는 실제로 동자하고 있다'고 말할 수 있는 동작실적을 얻을 수 있습니다.\n\n\"제발 동작해!'와 같은 기원에 '확실히 동작한다'와 같은 사후보고를 추가하는 것으로, 보다 유지보수성,신뢰성이 높은 코드를 구축해 가는 것이 가능합니다.\n\n\n\n**예)**\n\n*   \"잘 되길 기원합니다\"같은 식의 뭐가 뭔지 잘 모르겠던 코드도, \"고마워\"라고 하는 코멘트를 보고, 확실히 작동하는 함수였다는 것을 알았다.\n*   리팩터링 대상을 찾는 지표로서, 감사코멘트가 도움이 되었다!\n\n#### 도그푸드(Dog Food)\n\n제품을 출하하기 전에, 시험운용으로서 사내의 사람들에게 사용해보게 하는 것으로 버그 발견이라던가, 유저빌리티 확보를 노리는 걸 \"도그푸드(개밥)을 먹는다\"라고 합니다.\n\n같은 회사의 사람들이기 때문에, 어떻게해도 가볍게 응답합니다. \n\n> - XX가 작동 안해\n> \n> - 이부분은 모양이 별로\n> \n> - 사용하기 불편해\n> \n> - 바쁜데 느리게 작동하잖아!\n\n이 경우, '우리들이 만든 것을 이렇게 비난하다니'라던가\n\n'말 안해도 알고 있다고!'와 같은 말을 종종 하곤 합니다.\n\n감사주도개발에서는 그런건 터부시 합니다. 그렇습니다. 여기에서도 감사를 하는 것이 중요합니다.\n\n\n\nXX가 작동하지 않아  => 버그인가.. 발생지점을 알려줘서 정말 감사합니다! 이 부분은 모양이 별로  => 디자인을 가르쳐줘서 정말 감사합니다! 사용하기 불편해  => 끝까지 사용해보는 경우도 생각하지 않으면 안돼! 초심을 잃었어. 감사합니다. 느리다구!  => 튜닝할 우선순위를 결정할수 있었다. 감사합니다.\n\n\n\n유저의 악평도, 시점을 바꾸면 개선의 지름길인 것이다. \n\n이렇게 훌륭한 안내를, 시간을 내서 알려주신 사원분들에게 감사를 하는 것은 매우중요하다.\n\n\n\n그리고 좀더! 좀더! 많은 버그를 끄집어내는 겁니다!\n\n#### 릴리즈 후\n\n사내 검증도 끝났고, 무사납품이 가능해졌습니다.\n\n이후는 유지보수 작업입니다. 여행을 떠난 프로그램과 대면해야 하는 시점이 다시 찾아옵니다.\n\n이때, 앞에서 적은 다양한 감사가, 유지보수 작업자와 디버깅 작업자들의 마음을 받쳐주는 기둥이 됩니다. \n\n**예)**\n\n*   감사가 많은 부분을 참고로해서 점점 확장시켜 나자자! \n*   여기에 '감사'가 많다는 것은, 그 만큼 억세스한 사람도 많다는 뜻. 결국 이 부분의 퍼포먼스를 올리면 점점 좋아질거다!\n\n#### 마지막으로\n\n감사주도라 것은 개발기법으로서가 아니라, 확실히 살아가는 방법이라고 말할 수 있습니다. \n\n무언가 조금이라도 자신에게 있어 플러스가 될 수 있다면,\n\n혹은 플러스가 될 것 같은 예감이 든다면\n\n감사를 잊지 않음으로써, 언젠가는 높은 위치에 다다를 수 있습니다.\n\n그리고, 어느 사이엔가 자신이 감사받는 입장이 되는겁니다. \n\n그렇습니다. 감사라는 것은 상호간에 이루어지는 것으로 그로 인해 몇 배로, 몇 십배로 파워가 증가하는 것입니다. \n\n그대여, 부디 감사를 잊는 법이 없기를!。\n\n#### Special Thanks\n\n*   Legacy Hacks (p.36 [eXtreme HAGO LT 大会 2011 Winterより](http://atnd.org/events/11985))\n\n[http://tomohiro.me/slide/2011_xhago_winter/legacy_hacks.pdf](http://tomohiro.me/slide/2011_xhago_winter/legacy_hacks.pdf)\n\n*   Twitter / @Naoto SHINGAKI: 감사주도개발에서는 변수명에도 신경써주면좋겠어. i,j,k가 아니라 t,h,a,n,k로 정의하자구.\n\n[http://twitter.com/#!/naotos/status/43533813246197762](http://twitter.com/#%21/naotos/status/43533813246197762)\n\n\n\n#### Comments\n\n조크라고 하셨지만 많은 부분에서 배울점이 많아 보입니다.\n투덜투덜 대면서 개발하고, 공통 팀에서 이상하게 해놓는다고 싸우고,\n우린 제대로 했는데 너흰 왜 그 모양이니 하고 싸우고,\n이러는 것보다 좀더 릴렉스하면서도 위트있는 개발 분위기를 주도 할 수 있겠다는 생각이 듭니다. ^^\n\n그/러/나 우리내 프로젝트의 고질병. \n\"꿈나라 이야기하니?\"  라는 난관에 맞닥드릴 소지가 많아 보이네요. t_t\n팀웍이란 동반야근, 주말 출근이 아니라 제대로된 업무 분장 그리고 팀원간 상호배려와 이해에서\n생기는게 아닌가 싶은데 말이죠. t_t\n\n [proxies](http://www.hiten.net) | 2011-03-07 월요일 오후 9:48\n\n--\n\n맞습니다. 그런면에서 씁쓸한 미소를 짓게 블랙조크가 아닌가 싶습니다. \n\n존중을 잊지않고 그러면서도 일을 즐길 수 있을 정도로 (말씀하신대로의) 위트있는 분위기를 팀내에 유지할 수 있어야 할 것 같습니다.\n\n [doortts](http://blog.doortts.com) | 2011-03-07 월요일 오후 10:35\n\n--\n\n잘 읽었습니다.\n\n평상시는 감사의 마음을 담지만 유독 일에서는 그렇지 못한 경우가 왕왕 있는 듯해요.\n번역 감사합니다~ ㅎㅅㅎ\n\n zeide | 2011-03-07 월요일 오후 10:24\n\n--\n\n저도 많이 감사할 수 있는 사람이 되어야 겠습니다. 댓글 감사합니다.\n\n [doortts](http://blog.doortts.com) | 2011-03-07 월요일 오후 10:35\n\n--\n\n유쾌한 글 번역 감사드립니다 ㅋㅋㅋ\n저희프로젝트에도 도입해봐야겠네요 ㅋㅋㅋ\n\n 마술감자 | 2011-03-08 화요일 오후 1:16\n\n--\n\n행운을 기원합니다!\n\n [doortts](http://blog.doortts.com) | 2011-03-08 화요일 오후 10:33\n\n--\n\n감사합니다! :D\n\n [pudidic](http://twitter.com/pudidic) | 2011-03-08 화요일 오후 3:13\n\n--\n\n별말씀을요~ :)\n\n [doortts](http://blog.doortts.com) | 2011-03-08 화요일 오후 10:33\n\n--\n\n이 글 덕에 오늘 처음 웃었습니다. 감사합니다. \n(한편으론, 울적한 내 하루, 문제있다.)\n\n 재홍 | 2011-03-21 월요일 오전 2:42\n\n--\n\n:) 좋은 하루 되세요!\n\n [doortts](http://blog.doortts.com) | 2011-03-21 월요일 오후 2:25\n\n--\n\n좋은 글 잘읽었습니다.\n감사주도개발.. 실천한다고 하는데도 많이 어렵네요 ^^\n\n좋은 글 포스팅해가요~\n\n [찡구](http://zzinggu.egloos.com) | 2011-06-12 일요일 오후 10:13\n\n--\n\n유쾌한 개발법이네요.\n감사합니다. :)\n\n [Surpreem](http://surpreem.wordpress.com) | 2011-06-21 화요일 오전 10:45\n\n--\n"
  },
  {
    "id": 158,
    "title": "Git vs Mercurial (기트 대 머큐리얼.. 으응?)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1299656401000,
    "body": "> doortts | 2011-03-09 수요일 오후 3:46 | 이생각 저생각 | [원본](http://blog.doortts.com/158)\n\n사외에서는 분산 저장소를 쓰는 분들이 늘고 있습니다만, 사내 팀들의 경우 대부분 서브버전(Svn)을 쓰고있습니다. 뭐, 불과 몇 년 전만 해도 회사내에도  CVS와 SVN이 양분하는 분위기였는데 이젠 절대 다수가 SVN을 쓰고 있습니다. 좋은 현상입니다... (라고 말하기도 사실 부끄럽습니다만, 어쨌든..)\n\n그리고, 요즘 제 주변 분들 중에는 여기에서 한 발 더 나아가, 분산 저장소(DVCS)를 쓰는 분들이 점차 늘고 있습니다... (라고 말하고 보니.. 마찬가지로 여전히 부끄러운 마음이 드는군요.. 흠.. 뭐.. 어쨌든..)\n\n글을 계속 읽어가시기 전에, 혹시 '분산 저장소를 왜 쓰냐?' 라던가, '장점이 뭔데?' 라는 의문이 드시는 분들은, 제가 이전에 올렸던 번역 글을 참고해 주세요.\n\n[서브버전 사용자를 위한 머큐리얼(mercurial)이전 가이드](http://blog.doortts.com/141)\n[http://blog.doortts.com/141](http://blog.doortts.com/141 \"[http://blog.doortts.com/141]로 이동합니다.\")\n\n\n네. 그렇습니다. 최근 엔지니어 사이에서의 본격적인 유행은 분산 저장소 입니다.\n\n원래 유행이란게 그렇듯이, 남이 쓰니 나도 안쓰면 왠지 조금 뒤떨어지는 느낌인거잖아요. 결국 어느날인가는 머쓱한 표정으로, '그.. 그럼 나도 한 번 써볼까~ 분산저장소'하는 생각이 들겁니다. 그리고는 그 다음으로 떠오르는 선택지는 어떤 저장소 도구를 쓸 것인가 하는 겁니다.\n\nGit 를 쓸까? Mercurial을 쓸까?\n\n![git_mercurial.jpg](/files/21833)\n\n대략 보아하니 Git나 Mercurial이 유행의 대표주자인것 같습니다. 조금 늦게 시작하는 입장에서 아무거나 덥썩 물을 수는 없죠. 둘을 다 배우는건 좀 시간이 부족하니, 어느게 더 좋은지 알아보고 그걸 배워보기로 마음먹습니다.\n\n둘 중 어느 것이 더 나을까요?\n\n관련해서 몇 몇 그룹들이 오프라인에서, 그리고 언듯 살펴봐도 수십개의 온라인 글들에서 해당 내용을 주제로 이야기(를 가장한 치고박고..)를 하고 있습니다.\n\n마치 예전에 이클립스 플러그인으로 subclipse를 쓸 것인가? subversive를 쓸 것인가를 놓고 논쟁하던 모습과 비슷합니다. 아, 그전에도 있었네요. java냐 c# 이냐.. 아.. 그전에도 있었어요. 볼랜드냐 비쥬얼스튜디오냐.. 아.. 그전에도 있었어요. 비베냐 델파이냐.. (음.. 이건 좀 너무 나갔나..? 어쨌든..)\n\n우선, 저는 머큐리얼을 쓰고 있습니다.\n\n'이런! 내 이럴줄 알았다!'면서 순간, Git의 우수성에 대한 내용을 ADC(Angry Driven Comment)로 승화하시려는 분들은 잠시만 진정해 주세요. 머큐리얼이 좋다고 말하려는거 아닙니다.\n\n'뭐! 그럼 머큐리얼을 (속칭)까려는거냐?'라며 마찬가지로 폭풍 타이핑을 준비중이신 분들도 참아주세요.\n\n휴우.. 역시 온라인 글은 저희 집 가족모임(엄니B형, 아버지AB형, 여동생 AB형, 저만 A형)만큼이나 어렵다니깐요.\n\n다시..\n\n우선, 저는 머큐리얼을 쓰고 있습니다. 현재 팀을 꾸려서 개발을 하고 있지도 않고 개인적인 차원에서 학습을 목적으로 사용하는지라 저장소 선택에도 문제가 없었고, 사용에도 (젠장!) 문제가 없습니다. 충돌날 일이 거의 없는데다, 제가 저한테 블레임을 건다거나 브랜치를 만들 일도 없거든요. (물론 혼자서 할 수도 있지만, 제가 무슨 다중인격도 아니고...)\n\nSVN쓸때보다 좋아진 점은... 글쎄요.. 현재로써는 별롭니다. 장점은 배워서 아는게 전부랄까요? 사실 SVN 쓸때보다 오히려 더 불편합니다. 습관이 들기 전까지는 commit, update만 하고 push, pull을 까먹어서 오히려 분산환경(집/회사)에 혼란을 주었으니까요.\n\n아.. 압니다. 언급하지 않은 장점이 많은걸.. 그리고 점점 글의 내용이 위험해 지고 있죠. (이크!)\n\n지금, Git 를 쓰라는 거야? 아니면 Mercurial을 쓰라는 거야?\n혹시, 쓸 필요 없으니 관두라는 스포일러같은 발언임? \n그런건 아닙니다. 마침 이 문제를 집중적으로 다룬 사이트가 있더군요.\n\n[http://GitVsMercurial.com/](http://gitvsmercurial.com/ \"[http://gitvsmercurial.com/]로 이동합니다.\")\n\n\n네. 그렇습니다.\n\n소중한 시간, 아쉽게 쓰지 마시고, 하나라도 먼저 시작해 보세요. 그리고 경험이 쌓이시면 다른 분들께도 그 경험 공유해 주시면 더더 좋겠죠? :)\n\n참고로, 윈도우즈 OS계열에서 개발하시고, SVN에서 이전하시려 한다면, mercurial이 조금 나은것 같습니다.\n일반적인 개발자들을 기준으로 SVN -> Mercurial로의 이전과 SVN -> Git로의 이전 중\n비용(학습곡선, 적응시간 등등 포함)은 SVN -> Mercurial로의 이전 비용이 경험상/느낌상 좀 더 낮았습니다.\n\n최근 사내 교육에서 사용하는 저장소도 svn에서 mecurial로 이전했는데요, 엔지니어들이 별로 거부감없이 쉽게 쓰더라구요.\n\n아.. 뭐야.. 결국 이러기냐고요? 아.. 그런거 아니라니깐요..\n\nps.\n네버엔딩으로 진행되기 쉬운 논쟁에 관해 생각난거 더 있어요.\n키보드 배열 두벌식과 세벌식. 핸드폰 문자방식 천지인과 이지한글.\n\nps2.\n국내 유일의 DVCS책! DVCS에 대해 기초를 배우기 좋다는데, 저도 읽어보질 않아서 뭐라고 확실힌 말을...\n![gitbook.jpg](/files/21834)\n\n#### Comments\n\n글 재미있네요. 저도 Git 나 머큐리얼 중 하나는 써봐야지 생각하고 있었는데 오늘 이 글 보고 다시 생각난 김에 꼭 실천해야겠습니다.\n\n [Ben](http://www.benjaminlog.com) | 2011-03-09 수요일 오후 5:15\n\n--\n\n이야기 하신대로 실천이 제일 어려운것 같습니다. \n재밌게 읽으셨다니 감사합니다.\n\n [doortts](http://blog.doortts.com) | 2011-03-14 월요일 오전 11:7\n\n--\n\n읽으면서 정말 공감 많이 했어요 ㅎㅎ 저도 '한번 배워보자' 하고, git을 사용한지 반년정도 혼자하고있는데 그사용법은 push, pull, commit이네요 ㅎㅎ 처음에는 브랜치도만들고 로그옵션도 했는데 영...ㅋㅋ  건강하세요~~\n\n [오산돌구](http://dol9.tistory.com) | 2011-03-09 수요일 오후 8:23\n\n--\n\n언젠가는 다른 사람들과 함께 사용하는 날이 오겠죠? :)\n\n [doortts](http://blog.doortts.com) | 2011-03-14 월요일 오전 11:7\n\n--\n\n한번 읽어봐야겠네요. ㅎㅎ. 저는 겨우겨우 SVN 사용하는 것에 익숙해져가고 있는데...\n이미 또다른 버전관리 시스템들을 사용하고 계시는군요.\n\n+_+) 따라가려면 부지런히 움직여야겠습니다!\n\n [허니몬](http://ihoney.pe.kr) | 2011-03-10 목요일 오전 12:32\n\n--\n\n빨리 따라가는 것이 꼭 좋은것만은 아니에요. 아는걸 잘 하는 것도 중요하니까요.\n\n [doortts](http://blog.doortts.com) | 2011-03-14 월요일 오전 11:8\n\n--\n\n좀 실망스럽네요. 이번글... \n\n\n\n\n\n\n\n\n\n이지한글이 천지인보다 100배 낫다규요!!!!!!!!\n\n [박성철](http://me2day.net/geekinside) | 2011-03-10 목요일 오전 6:29\n\n--\n\n그런식으로 이야기 하실 줄은 몰랐습니다.\n\n\n\n\n\n\n\n이지한글은 누가 설명해 주지 않으면 못쓴다고요!\n누를때마다 손이 곱아들어서리..\n\n [doortts](http://blog.doortts.com) | 2011-03-14 월요일 오전 11:9\n\n--\n\n예전 뉴스그룹에서 vi냐 메모장이냐 emacs냐도 있었습니다. :-)\n언제나 좋은 글 감사합니다!\n\n [proxies](http://www.hiten.net) | 2011-03-12 토요일 오전 3:16\n\n--\n\nvi냐 emacs냐는 이해하는데, 메모장까지 껴서 삼파전이었던 적이 있었을 줄은 전혀 생각못했는걸요.. -,-;\n\n [doortts](http://blog.doortts.com) | 2011-03-14 월요일 오전 11:10\n\n--\n",
    "attachments": [
      {
        "id": 21833,
        "name": "git_mercurial.jpg",
        "hash": "060c7ae02cd8e28c5232a95d204e797c0eb81c90",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 17319,
        "containerId": "12327"
      },
      {
        "id": 21834,
        "name": "gitbook.jpg",
        "hash": "7d8499ef1d1225930abbed90abfac36339e23bb1",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 15740,
        "containerId": "12327"
      }
    ]
  },
  {
    "id": 159,
    "title": "P-Camp & 대안언어축제 2011 참가후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1300242031000,
    "body": "> doortts | 2011-03-14 월요일 오전 10:56 | 이생각 저생각 | [원본](http://blog.doortts.com/159)\n\n3월12일~13일, 토일 이틀간 방화동 청소년 유스호스텔에서 진행된 P-Camp & 대안언어축제 2011(이하 pna2011)에 참석했습니다. 새로운 프로그래밍 언어를 배우고 참석자들과 지식을 나누고 삶의 순간을 교류하는 것이 목적인 행사였습니다.\n\n1박2일동안 많은 분들을 뵈었고, 다양한 경험을 한 재미있는 행사였습니다.\n\n기억이 약해지기 전에 (아.. 이미 늦었..)\n후기를 작성해야지 마음먹고 적다가, 문득 함께 참석했던 아웃사이더([http://blog.outsider.ne.kr/](http://blog.outsider.ne.kr/ \"[http://blog.outsider.ne.kr/]로 이동합니다.\"))님과 대화 형태로 후기를 함께 남겨보면 어떨까 하는 생각이 들어 제안을 했습니다. 아웃사이더님은 흔쾌히 수락하셨고, 그 결과 메신저로 소감과 후기를 나누어 보았습니다. 그 내용을 다듬어서 아래에 남겨봅니다. :) 아쉽게도 저는 따로 찍은 사진이 없습니다만, 아웃사이더님이 박력(!!)있는 카메라를 가져오셨기 때문에 조만간 올리실 후기를 기대해 봅니다. :)\n\n\n\n너구리: 안녕하세요? 아웃사이더님\n\n아웃사이더: 안녕하세요 너구리님\n\n너구리: 저번 주말에는 P-Camp&대안언어축제에 다녀오셨죠?\n\n아웃사이더: 예. 작년부터 기다리던 대안언어축제에 다녀왔습니다.\n\n  주)\n대안연어축제로 잘못 읽고는 연어잡이 행사를 하는건 줄 알았다며 농담을 던지는 사람도 있었다. 너구리: 아. 정말요? 기다리셨던 건가요?\n\n아웃사이더: 작년에 참여할려고 했다가 좌절되었다 보니 그 뒤로 계속 관심있게 보고 있었습니다.\n\n너구리: 아! 맞다! 스칼라(Scala) 스터디 모임 맴버시죠?\n\n아웃사이더: 예. 스칼라라는 언어로 작년에 참여하려다가 행사가 미뤄져서 못했었습니다.\n\n너구리: 대안 언어중에서 스칼라는 안보이던데요?\n\n아웃사이더: 이번 기간에는 저희가 준비할 시간이 없어서 참가를 못했습니다.\n\n너구리: 개인적으로 스칼라에 관심 많은데 참가언어에 없어서 아쉬웠어요. 그래도 대신 좀 마음 편하게 참석하셨겠네요? : )\n\n아웃사이더: 덕분에 부담감은 없이 참여했습니다.\n\n너구리: 아웃사이더님은 처음 참가시죠?\n\n아웃사이더: 예 처음 참가입니다.\n\n너구리: 그럼 처음이시면 뭔가 기대감이라던가, 두근거림 같은게 있으셨겠어요?\n\n아웃사이더: 아예 처음이라서 그런지 사실 다른 세미나에 비해 특별히 기대하거나 그렇지는 않았던것 같습니다.\n\n어떤 행사인지 잘 모르다 보니 그랬던것 같아요.\n\n너구리: 그래도 뭔가 행사에 대해 추측/상상한 부분이 있지 않으셨어요?\n\n아웃사이더: 사실 갔다와보니 일반적인 세미나와는 많이 다른 행사였던것 같습니다.\n\n제목의 축제라는 부분을 간과했던거죠. 그냥 일반 세미나와 달리 약간 러프한 코딩을 직접 해보는 행사로 생각했었거든요.\n\n너구리: 예상과 달랐나요?\n\n아웃사이더: 막상 참가하고 나니 개발자들끼리 모여서 교류를 하는 장소에 더 가깝게 느껴졌습니다.사실 대안언어라는 주제가 좀 무색하지 않나 하는 느낌도 없잖아 있었습니다. 저는 그쪽으로만 기대하고 있었거든요.\n\n너구리: 아. 그렇군요. 전 SW공학쪽을 들어서 잘 모르겠습니다만, 그래도 언어별 세션이 있어서 실제 프로그래밍으로 진행되지 않았나요?\n\n아웃사이더: 실제 코딩을 해볼 기회는 전체 세션에서 대안언어배우기가 가장 큰 부분이는데 여러 언어를 구경해 보고 싶었는데 선택의 미스였는지 결과적인 만족감은 그리 높지 못했습니다.\n\n너구리: 대안언어 세션에 대략 몇 개 언어가 있었죠?\n\n아웃사이더: 한 8,9개 정도의 언어가 있었던것 같습니다.\n\n너구리: 전체 다 합셔서 네 시간 동안이었던가요?\n\n아웃사이더: 예 네시간이었습니다. 다만, 초기에 시간표 공유가 될때는 다른 홀에서 진행된 세션들처럼 가운데 줄이 가있는 상태로 반이 나눠져 있었습니다. 그래서 앞부분에 언어 하나 듣고 뒤에 다른 하나를 들을려고 했는데 실제로는 그렇게 진행되지 않았습니다.\n\n너구리: 아! 그럼 네 시간이 한 언어로 쭉 진행되는 형태였군요.\n\n아웃사이더: 어떤 언어는 나눠서 하고 어떤 언어는 이어서 4시간을 했습니다\n\n너구리: 약간씩 차이가 있었군요. 그런데 2시간이면 한 언어를 맛만 보기에도 쉽지 않은 시간 아닌가요? 4시간을 한 언어로 해도 쉽지 않았겠는걸요\n\n아웃사이더: 예 그렇죠.. 사실 그 시간에 언어에 대한 것을 익힌다는 것까진 기대하지 않았고요.. \"아~ 이거 재밌겠다\"정도의 느낌을 받는 정도였으면 했습니다.\n\n저 같은 경우는 루아(Lua) vs JavaScript를 듣고 하스켈(Haskell)로 이동했는데 루아(Lua) vs JavaScript는 제 기대와는 세션수준이 좀 달랐고 하스켈로 이동했을때는 이미 중간이 넘어가버려서 기초설명없이 듣다보니 잘 이해하기가 어려웠습니다.\n\n너구리: 아.. 한 번 언어선택을 미스하면 그 길로 대안 언어를 배우는건 저 하늘 멀리 가버리는 상황인거였군요\n\n아웃사이더: 제가 선택을 잘못한 부분이긴 하지만 저에게는 결과적으로 그렇게 되었습니다.\n\n너구리: 대부분은 비슷한 상황이었겁니다. 아쉽네요. 다른 언어들도 많았는데 어땠을지 궁금하고 그랬겠어요\n\n아웃사이더: 그렇다 보니 선택하지 못했던 세션에 대한 아쉬움이 있을수밖에 없더군요.\n\n미리 신중히 생각지 못한 점도 있는것 같아요. 결과적으로 대안언어 세션에서의 상황이 이렇다 보니 다른 홀에서 하는 세션에 자연스레 관심이 가더군요. ㅎ\n\n너구리: 전 개인적으로 NetLogo나 Orca등이 궁금했었습니다만, 배운게 도둑질이라고 ATDD/BDD를 들었습니다. Orca는 언어를 만드신 분이 직접 발표하셨다는걸 나중에 들었습니다. 아쉽더라구요\n\n아웃사이더: ATDD/BDD는 어떠셨나요?\n\n\n주)\nATDD: Acceptance TDD. 인수테스트 수준으로 TDD를 작성하는 것\nBDD: Behavior Driven Development, Function이 아닌 Feature를 테스트 하는 방식\n\n\n\n너구리: NHN 에서 QA로 일하시는 유석문 님이 발표해 주셨습니다.\n\n우선 이 세션은 실습을 몇 가지 했습니다만 PC가 전혀 필요없었습니다. PC없이 종이와 연필을 이용해서 제품을 개발해 보는 실습을 했습니다. 기획자와 개발자 QA로 역할을 나눠서 진행했고요, ATDD를 이용하기 전과 이용해서, 이렇게 두 번 진행했습니다. 재밌었습니다만 기술적인 접근 부분은 거의 없었어서 그게 좀 아쉬웠습니다.\n\n\n아웃사이더: ATDD를 적용 전과 후과 어떻게 다르셨나요?\n\n너구리: 개발의 목표가 좀 더 뚜렸해 졌다는 것과 그 목표가 기획자와 개발자가 함께 공유할 수 있었다는 점이 ATDD 적용 전과 후의 차이점으로 느껴졌습니다...만.. 앞에서 이야기 드렸던 것 처럼 논리적이거나 절차적으로 접근하는 부분이 좀 더 강했습니다.\n\n아웃사이더: 개발자로써 기술적인 부분이 없는건 좀 아쉬우셨겠군요...\n\n너구리: 네. 그래도 이 분야 자체가 그렇게 많이 이야기 되는 영역이 아니기 때문에 의미있고 소중한 시간이었다고 말하고 싶습니다. : )\n\n혹 못 들으신 언어중에 듣고 싶으셨던 다른 언어는 어떻게 있으셨나요?\n\n아웃사이더: 원래는 뭔가 큰 영역에 발을 들이미는것 같아서 배제하고 있었는데 막상 행사가 끝나고 나니 LISP를 들을걸 하는 생각이 들더군요.\n\n너구리: 특별히 LISP을 생각하신 이유는요? 혹시 클로저(Clojure) 때문에?\n\n아웃사이더: 프로그래밍언어를 얘기하다보면 많은 개념에 대해서 그 근원으로 LISP가 거론되기도 하고.. 최근 이슈가 많은 클로져에 대한 내용도 포함하고 있었기에 못듣고 나니 더 관심이 갔습니다. 저같은 경우 이동하다가 오히려 애매해진 터라 진득하니 LISP나 4시간 들을걸 하는 생각이 들더군요 ㅎㅎ\n\n너구리: 푸하하하. 왠지 마음이 이해가는 것 같아요 저도 여차하면 두둥실 떠다녔던지라 말이죠\n\n몇 가지만 더 여쭤볼게요. 이번 PNA2011에서 기억에 남거나 인상깊었던 부분을 꼽는다면?\n\n아웃사이더: 가장 기억남는 건 첫날 저녁에 했던 언컨퍼런스였습니다. 그런 형태의 진행에 대해서 실제로 보는 건 처음이었고, 시작하면서 이거 되겠나 싶었는데... 생각보다 점점 활발해지면서 진행되는 것이 상당히 새로운 경험이었습니다.\n\n너구리: 아. 그때는 어떤 주제에 참여하셨나요?\n\n아웃사이더: 사실 눈치보고 여기저기 기웃거리느라고 많이는 못했는데요. github로 오픈소스프로젝트 참여하기를 듣다가 누군가의 권유로 node.js에 대해서 LETS를 진행했습니다.\n\n너구리: 오오~ 직접 주제를 만들어 사람들을 모으셨군요!\n\n아웃사이더: 사실 초반에 약간 생각은 했었습니다만 대충 묻어갈려다가 권유를 받아 하게되었습니다. 결과적으로는 생각보다 많은 사람들이 모여들어서 흥미롭게 진행되었던것 같습니다.\n\n너구리: 발표자로 진행해 보니 느낌이 조금은 달랐겠어요\n\n아웃사이더: 예 그렇긴 한데요. LETS가 점점 무르익는 분위기다보니, 다른데와는 다르게 발표자와 청중이라는 개념이 좀 적은 분위기로 느껴졌고요, 점점 상당히 자연스럽게 느껴졌습니다.\n\n너구리: 그럼 정리해 보면 좋았던 점은 언컨퍼런스라는 활동이 될까요?\n\n아웃사이더: 예...\n\n너구리: 아쉬웠던 점은 대안언어 부분의 시간 배분이고요?\n\n아웃사이더: 시간배분과 세션의 타게팅이 정확히 공유되지 않았던 점 같습니다. (사실 후자는 어느 세미나나 있는 거긴 하지만요)\n\n너구리: 아! 타게팅! 맞아요. 세미나나 세션은 타게팅이 정확히 사전에 전달 될수록 좋은것 같아요\n\n아니면 즉석에서 반응해서 타게팅을 조절하던가요\n\n아웃사이더: 예.. 그부분은 발표자와 주최측에서 해야할 중요한 부분이라고 생각하지만 쉬운 문제는 아닌것 같습니다.\n\n너구리 : 행사 진행은 어떠셨나요?\n\n아웃사이더 : 이정도면 상당히 스무스하게 잘 진행된것 같다고 생각합니다. 전문 업체에서 한게 아닌걸 생각하면 더욱 그렇고요\n\n너구리: 아. 그렇게 보면 그렇네요. :) 전 사실 무념무상으로 참석했던지라 마냥 좋았거든요. 내년에도 참석하실건가요?\n\n아웃사이더: 여력이 되면 참가하려고 생각합니다.\n\n너구리: 네~ 참석자 입장에서는 내년에는 스칼라도 참석했으면 좋겠습니다.\n\n준비하실거죠? :)\n\n아웃사이더: 아마 그 분(?)은 좀더 원대한 계획을 가지고 계실듯 합니다. ㅎ\n\n\n주) 그 분: nephilim.tistory.com\n\n\n\n너구리: 그럼 긴 시간동안 타이핑 하시느라 고생많으셨습니다.\n\n아웃사이더: 하하하 고생많으셨습니다. 너구리님\n\n너구리: 네~ 얼릉 퇴근하셔서 맛있는 저녁을 드시길 바랍니다.\n\n아웃사이더: 옙 좋은 저녁 되세요.\n\n\n\n#### Comments\n\n재밌게 읽다가 허걱했습니다. \n익명성 개념에 대혼란이... 난데없는 (주)라니...\n\n [네피림](http://nephilim.tistory.com) | 2011-03-16 수요일 오후 3:5\n\n--\n\n대안언어 축제에 오셧군요 .\n\n저도 참석을 했는데 공감이 많이 갑니다.:)\n\n [DongwooKim](http://twitter.com/DongwooKim) | 2011-03-16 수요일 오후 9:40\n\n--\n\n두 분의 음성이 들리는 듯한 정겨운 대화네요. :-)\n\n Zeide | 2011-03-21 월요일 오전 9:2\n\n--\n\n후기를 이렇게 쓸수도 있군요.\n재미있고 자연스러워서 좋은 방법이네요.\n배워갑니다.\nPNA2011 참 재미있었어요~\n\n [박형근](http://codereview.co.kr) | 2011-04-05 화요일 오후 1:43\n\n--\n"
  },
  {
    "id": 161,
    "title": "[dW Review] cd : Change the Directory",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1300685009000,
    "body": "> doortts | 2011-03-21 월요일 오후 2:23 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/161)\n\n최근 IBM dW에 다소 의외의 기술문서가 올라왔다. Unix계열의 커맨드 명령어인 cd 명령어에 대한 사용법이었다. cd도 설명할 내용이 있던가? 하는 마음으로 오히려 다른 기사보다 집중해서 읽었다.\n\n디렉토리 트리의 상하 이동\n[http://www.ibm.com/developerworks/kr/aix/library/au-directorytree/index.html](http://www.ibm.com/developerworks/kr/aix/library/au-directorytree/index.html \"[http://www.ibm.com/developerworks/kr/aix/library/au-directorytree/index.html]로 이동합니다.\")\n\n\n유닉스/리눅스/맥 유저 중 콘솔(console)을 사용하는 사용자라면 cd 명령어를 밥먹듯이 쓸 것이다.\n\n우선 cd 명령어는 chnage the directory의 약자다. 그리고 cd 명령어에 대해서는 다음 정도만 알면 충분하다고 생각했다. (설명이 없는 건 위 링크 글을 참고하시길 :)\n\ncd -\ncd /\ncd ~\ncd (글자의 일부와 탭키를 이용한 자동완성)\n\ncd *(디렉터리의 일부)\n예)\n/bin/application/framework 폴더로 이동하고 싶다면\ncd /bin/app*/fra*\n\n\n\n그런데 기술문서에는 cd shuffle 이라는 기능이 소개되어 있었다. 살짝 놀랐다.\n\n/programs/v7/reports/monthly > cd v7 v8\n/programs/v8/reports/monthly >\n\n\n내용은 마찬가지로 링크를 참고하시길! (꽤 재밌음)\n\n여담이지만, 대부분의 콘솔쟁이들은 터미널을 선호하지만, 사실 콘솔이 더 편한 부분과 탐색기가 더 편한 부분은 나뉘어 있으니 살 섞어쓰는게 좋은것 같다.\n\n참고로 윈도우 탐색기에서 현재 열린 폴더로 바로 cmd 창을 띄울 일이 많다면 StEx라는 툴을 한 번 써보길 권한다. 예전에도 한 번 Stefan's Tool 이라는 내용으로 [블로그에서 소개](http://blog.doortts.com/84 \"[http://blog.doortts.com/84]로 이동합니다.\") 했었는데, 매우. 편하다.\n\n![StEx.png](/files/21835)\n\n[현재 폴더에 cmd를 띄워주는 StExBar라는 툴]\n\n기타 참조\n\n[뭘, 이런걸 다?] 윈도우즈 cmd 창에서 파일/폴더이름 자동완성 하기\n[http://blog.doortts.com/108](http://blog.doortts.com/108 \"[http://blog.doortts.com/108]로 이동합니다.\")\n\n\n#### Comments\n\n이미 알고계실지도 모르겠지만, windows vista인지 7인지 부터는 탐색기의 폴더 내부 아무데나 찍고 shift+우클릭을 하면 여기서 명령창 열기 인가 하는 메뉴가 나옵니다. 근데 소개해 주신 도구가 더 편해보이네요 ^^\n\n [kingori](http://kingori.egloos.com) | 2011-03-26 토요일 오후 2:25\n\n--\n\n와! 이런 기능이 있었군요! \n\n집PC가 윈도우즈7이거든요.해보니까 shift를 누를때만 뜨네요. 그냥뜨게 해주지 말입니다. ㅎ.\n\n감사합니다!\n\n [doortts](http://blog.doortts.com) | 2011-03-26 토요일 오후 8:40\n\n--\n",
    "attachments": [
      {
        "id": 21835,
        "name": "StEx.png",
        "hash": "a305f761ee48d358fbebf680524f49fbb3ad7633",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 16617,
        "containerId": "12329"
      }
    ]
  },
  {
    "id": 162,
    "title": "최근 읽은 IT 책들에 대한 감상평",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1300853394000,
    "body": "> doortts | 2011-03-22 화요일 오후 6:40 | Books | [원본](http://blog.doortts.com/162)\n\n근래에 읽은 IT 책들에 대한 감상평입니다. 책을 써 본 사람 입장에서 책 쓰는 것이 얼마나 어려운 일인지 잘 알지만, 그래도 감상평도 생각대로 못 쓰면 부끄럽지 않는가라는 생각에 남겨봅니다.\n\n소감 순서는 읽은 순서와는 상관없습니다.\n\n![DotNet단위테스트.jpg](/files/21840)\n\n.NET 계열은 낯설지만 주제가 주제인 만큼 나오자마자 읽었습니다.\n\n원제가 더 매력적이었죠.\n\nThe Art of Unit Testing\n\n아쉽게도 내용은 조금 푸석푸석했습니다. 원 저자의 문체 때문인지, 번역 때문인지 문장문장들이 많이 건조한 것도 푸석함에 일조했습니다. 초급개발자용 도서는 아닙니다. 순서로는 켄트벡의 TDD by Example, 혹은 (제 책) TDD 실천법과 도구 이후에 보시는 것이 좋을 것 같습니다. 그리고 마이클 페더스의 '레거시 코드' 이후의 이야기를 상당 부분 담고있습니다. (저자와 마이클 페더스와 친분이 여기저기 느껴집니다. :)\n\nFAQ부분이 들어 있는 것에는 깜짝! 놀랐습니다. 제 책에도 들어있었거든요. 내용은 전혀 달랐지만 확실히 이쪽 분야(..?)는 FAQ가 필요하다고 생각하는구나 하는 생각이 들었습니다.\n\n조금 어렵게 설명된 부분들이 많았지만, 내용자체는 괜찮았습니다.\n국내에 관련서가 적기 때문에 어쨌든 이쪽 방면을 하시는 분들은 언제가 되었든 한 번 읽게 되지 않을까 생각합니다.\n\n![UML실전에서는.jpg](/files/21837)\n\n이 책은 신판이 나온 기념으로 두 번째 읽었습니다. 내용은 이전과 완전 동일합니다. 표지도 훨씬 예뻐졌습니다만, 살짝 단점도 있습니다.\n\n- 구판보다 종이질이 얇아서 글자가 비칩니다.\n\n- 구판에는 들어있는 촌철살인 삽화들이 몽땅 빠졌습니다. (이건 아무래도 편집과정상의 실수인듯 합니다)\n\n사례를 들기 좋아하는 로버트 마틴 아저씨의 스타일이 잘 드러나 있습니다. 그의 전작 '소프트웨어개발의 지혜\nAgile Software Development, Principles, Patterns, and Practices'의 복잡 다단한 이야기를 축약한 형태로 이 책에 담고 있습니다. 본인도 전작이 다소 두꺼웠고 스스로도 개발 사상측면에서 과도기적 단계에서 쓰여진 책이란 걸 아는 것 같습니다. 전작이나 이 책에서 언듯언듯 그런 뉘양스를 풍기거든요. :)\n\n자바 개발자라면 한 번쯤 읽어볼만 합니다. 값진 교훈 몇 가지는 충분히 얻을 수 있습니다.\n\n![글로벌소프트.jpg](/files/21838)\n\n- 어쩌다보니 이 저자분의 이전 책들을 다 읽었더군요. 이걸로 세 권 째입니다.\n\n그런데, 이번 책은 솔직히 실망이 이만저만 아니었습니다. 이 정도 이력을 가지신 분이 세 번째 책 마저도 그 정도 이야기 밖에 할 이야기가 없으신건가? 하는 생각이 들었습니다. IT 업계 선배님이시고, 이력에서 주는 기대감이 컸기 때문에 실망이 더 컸습니다. \n\n오죽했으면 뭔가 이상해서 앞 두 책을 다시 읽었을 정도입니다. 두 책은 재밌게 읽었거든요. (그 당시에)\n\n'대한민국에는 소프트웨어가 없다'와 '소프트웨어 개발의 모든 것'\n\n안타깝지만 제 기준으론 전혀 발전 없이 세 번째 책을 쓰셨습니다. 달달한 슈가크림 같은 이야기와 글로벌 소프트웨어와는 별 관계없는 이야기가 대부분입니다. 그나마 글로벌 소프트웨어 관련해 거론된 부분은 i18n을 살짝 언급한 것이 전부입니다. 그 마저도 '중요하니 잘 하자' 정도입니다. \n\n그리고 후반부에 애자일에 대한 부분이 나오는데, **직접** 애자일을 해본적은 없다고 밝히면서, 하지만 애자일의 실천방법들이란게 어이없을 정도로 우습다고 폄하하고 있습니다. 뭐, 그럴수도 있습니다. 해보지 않으셨다 하셨으니 다소 오해할 법도 하죠. 그런데 바로 다음 챕터에서는 '지식과 경험'의 차이를 강조하며 세상에는 꼭 해보지도 않고 **지식만으로 왈가왈부 이야기를 하는 사람들이 넘쳐난다**는 식의 촌철 비판을 하고 있습니다. 순간.. 으응? -,-하면서 읽었습니다. \n\n만일 당신의 관리자가 이 책을 읽고 감명받았다고 말한다면, 그 관리자의 IT 경력을 한 번 의심해 볼 필요가 있습니다.\n(**추가설명**: 책의 어조가 공격적인데, 관리자들은 자신에게 누군가가 이 책의 어투처럼 공격적인 어조로 충고하듯 말해주는사람이 (주변에!!!) 없기 때문에 그 부분을 신선하게 느껴 감명받을 수도 있습니다. 하지만, 이 책에 나오는 내용이 IT업계에서 일하면서 관리자 레벨까지 올랐음에도, 자신이 미처 몰랐던 내용이었다며 감동까지 받는다면 관리자가 되기까지의 경력이 의심스럽다는 이야기입니다.)\n\n![똑바로일해라.jpg](/files/21839)\n\n37시그널즈의 창립자이자 선임개발자인 두 사람, 제이슨 프라이드와 데이비드 하이네마이어 핸슨(아.. 이름 길다)이 저자 입니다. 경영서나 자기계발서를 타겟으로 만들어진 탓인지 핸슨이 해커이며 2005년 oscon에서 Ruby on Rails로 그 해의 해커상을 받았다는 이야기는 소개에 없어서 아쉬웠습니다. (하지만 제가 편집자라도 뺏을것 같긴 합니다. 이해는 갑니다. :) \n\n책의 어조가 다소 강하지만 바로 앞의 책보다 훨씬 더 설득력이 있으며, 오히려 소프트웨어 개발에서의 글로벌화에 대한 이야기가 좀 더 구체적으로 잘 나옵니다. 물론 실천사항이 너무 많고, 성공한 사람의 '성공이유'에 대한 이야기는 이유가  적지 않기 때문에 자신에 맞게 적절히 걸러 읽을 필요가 있습니다. 그럼에도 불구하고 이 글에서 소개되는 비슷한 책들 3권 중에서는 제일 나았습니다. 편집도 깔끔하게 되었고, (IT를 안하시는 분이 번역해서 그런듯합니다만) 번역도 몇 몇 부분을 제외하곤 좋았습니다. 다만, 책 가격은 조금 의외다 싶을 정도로 비쌌던 점이 아쉬웠습니다. :)\n\n![실전J쿼리북쿡.jpg](/files/21841)\n우선, 이 책의 좋은 점은 '경험'과 그를 통해 배운 지식이 담겨있다는 점입니다. 지식에는 알면 알고 모르면 모르는 지식들이 있습니다. 이를테면, '콜럼버스가 미쿡을 발견한 해는?'같은 질문의 답이 그런 류의 지식입니다. 폄하하는 것이 아니라 분류상 그렇다는 뜻입니다. '신대륙을 가장 빠르게 발견하는 방법은?'같은 질문의 답은 경험자의 조언에 해당합니다. OX식의 답은 아니지만, 시행착오를 줄여 줄 수 있고, 뉴튼의 말처럼 거인(=선배)의 어깨위에서 바라볼 수 있게 되기 때문입니다.\n\n아.. 지식의 분류가 그렇다는거지 이 책을 극찬하려는건 아닙니다. :) JQuery책이 이 책으로 겨우 세 권째인 제가 사실 뭘 알겠습니까. 다만, 읽는 사람 입장에는 그런 류의 부분들이 많이 보였어서 좋았다는 이야기를 하고 싶었습니다. 두께가 좀 두껍고, 쿡북식으로 죽 나열되듯 진행되는 바람에 뒤로 갈수록 집중력을 유지하기 어려운 점만 빼곤 좋았습니다. 자바스크립트 하시는 분들은 한 번쯤 읽어 보시면 도움이 되지 않을까 생각합니다.\n\n![악성코드.jpg](/files/21842)\n처음 이 책을 봤을 때는 다소 의외의 분야라, 읽기가 조금 주저주저했습니다만, 몇 페이지를 읽다 보니 한참을 쑤욱~ 읽게 된 책입니다. 문체가 마치 소설이나 일기 같은 식으로 몰입도 있게 구성되어 있어서 신선했습니다. 특히 저자가 초보자로 시작해서 다양한 악성코드와 싸우면서 성장해 나가는 모습이 제 머릿속에서는 마치 드래곤볼이 연상될 정도였습니다.\n\n저야 이 분야에 지식이 거의 전무한 무지렁이라 구체적인 기술/용어들이 크게 와닿진 않았지만, 이 분야에 종사하시는 분들이라면 저 보다 몇 배는 더 흥미진진하게 읽으실 수 있을 것 같습니다.\n\n다만, 드래곤볼이 그랬듯이, 긴박한 구도의 이야기가 계속 이어지다보니 저처럼 해당 분야외의 사람이 일반관심으로 읽기에는 반복적으로 느껴지거나 오히려 탈력상태에 빠질 가능성이 있습니다. 여담이지만, 표지시안중 space invader의 붉은색 캐릭터가 표지였으면 저는 더 좋았을 것 같습니다.\n\n어쨌든 앞서 책과 마찬가지로 단순 지식이 아닌 저자의 '경험'과 '생각'이 많이 녹아 있는 책이라 읽는 내내 기분 좋았습니다. 중간중간 일반인들을 위해 설명을 달아놓은 부분들도 좋았고요. 감사합니다. :)\n\n![악성코드_그리고_분석가들_1.jpg](/files/21844)\n\n**[출처: 지앤선 공식사이트]**\n\n![인간조직.jpg](/files/21836)\n\n비슷한 분야의 세 책 중 마지막 책입니다. 우선 이 책의 많이 아쉬운 부분중 하나는 제목이었습니다. 'SW엔지니어의 변'이라고 하면 '변명'으로 흔히 읽힙니다. 자칫 시작도 하기 전에 책을 펼쳐서 읽게 되는 동기가 많이 감소되버릴 소지가 있습니다. 이 책 소감을 나열식으로 써보겠습니다.\n\n- 저자의 지식이 참 해박하다는 점에 놀랐습니다. '겸손한 개발자가 만든 거만한 소프트웨어'라는 책과 어떤 면에서 많이 비슷하다는 느낌을 받았습니다. 덴버공항 사례같은건 이야기 구성이라 재밌었습니다.\n- 다만, 한편으론 책을 읽어가면서 드는 생각은 데코레이션이 너무 강한 케익을 먹는 느낌이었습니다. 설탕과 초코렛, 생크림, 과일등이 너무 많아서 본 케익의 맛이 느끼기 어려운 그런.\n- 전체적으로 저자가 하고싶은 말이 뭔지 잘 모르겠다는 생각이 들었습니다. 저자 본인도 머리속이 너무 많은 생각으로 복잡해서 정리가 안된것 같았습니다.\n- 심지어 어떤 부분들은 지식이 깊지 못하고 시각이 다소 편향적이라는 생각도 들었습니다만, 생각해보면 책이란게 절대적 진실만을 이야기 해야하고 만인을 만족시켜야 하는건 아니니까 이 부분은 제 문제로 결론지었습니다.\n\n![컨설팅의비.jpg](/files/21843)\n\n- 절판된 책인데 인사이트 대표님께 선물로 받아서 읽게 되었습니다.\n\n우선 이 책은 사고(?)를 당해서 끝까지 읽진 못했습니다. 중반까지 읽은 내용을 기준으로 봤을 때, 매우 재밌고 흥미로웠으며 제랄드 와인버그는 참 대단하다는 생각이 들 정도로 여러가지 교훈들도 얻을 수 있었습니다. 문체나 번역도 마음에 들었고요. 절판이 안타까워 여쭤보니 다시 가다듬어 재발행할 예정에 있다고 하시네요. \n\n나오면 다시 살 생각입니다. :) 얼릉 다시 나왔으면 좋겠습니다.\n\n#### Comments\n\n세번째 책에서도 똑같은 얘기라는 것은 그 분이 개발에 손을 떼셨기 때문이 아니겠는가 생각합니다.  한 칠년전쯤 처음 그 분의 강의를 들었을때 정말 감탄했었는데 아쉽네요.\n\n june8th | 2011-03-23 수요일 오후 1:43\n\n--\n\n아마 기대가 컸기에 실망도 더 컸던것같습니다. 사실 개발관련 지식을 기대했던것도 아니었습니다. 세 번째 책마저도 반복되는 내용이 마냥 아쉬울 따름입니다.\n\n [doortts](http://blog.doortts.com) | 2011-03-23 수요일 오후 3:36\n\n--\n",
    "attachments": [
      {
        "id": 21836,
        "name": "인간조직.jpg",
        "hash": "4d16fcc73b9bc9ecb63f5e16592a24f019e3eea8",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 47852,
        "containerId": "12330"
      },
      {
        "id": 21837,
        "name": "UML실전에서는.jpg",
        "hash": "611ceeaaa02bb86568b8b7f6065fdfc81177383f",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 24304,
        "containerId": "12330"
      },
      {
        "id": 21838,
        "name": "글로벌소프트.jpg",
        "hash": "da522c754ea1590f79ebe7203c1ad743bfb6e9cb",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 22100,
        "containerId": "12330"
      },
      {
        "id": 21839,
        "name": "똑바로일해라.jpg",
        "hash": "69d0560d46bce303fc11d6dbdd51bc82a3a11455",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 47664,
        "containerId": "12330"
      },
      {
        "id": 21840,
        "name": "DotNet단위테스트.jpg",
        "hash": "cd9f67da1c7206328f06a10afc19254dd38446c7",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 38196,
        "containerId": "12330"
      },
      {
        "id": 21841,
        "name": "실전J쿼리북쿡.jpg",
        "hash": "684f154b0e9bf93a20cb1aa79c635632ad636c7a",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 31425,
        "containerId": "12330"
      },
      {
        "id": 21842,
        "name": "악성코드.jpg",
        "hash": "c75e41e066a7858859be17973e4e1ab0af61bc9a",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 70346,
        "containerId": "12330"
      },
      {
        "id": 21843,
        "name": "컨설팅의비.jpg",
        "hash": "ab7c33db911e3c7e9d7acf3122ca3ce150003752",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 30731,
        "containerId": "12330"
      },
      {
        "id": 21844,
        "name": "악성코드_그리고_분석가들_1.jpg",
        "hash": "de75d1bd47252e12c5f84af3e3fe1953a30eef78",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 91495,
        "containerId": "12330"
      }
    ]
  },
  {
    "id": 163,
    "title": "[dW Review] 혁신적인 아키텍처와 창발적 설계",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1301287341000,
    "body": "> doortts | 2011-03-28 월요일 오전 11:29 | 이생각 저생각 | [원본](http://blog.doortts.com/163)\n\n혁신적인(innovative)라는 단어는 엔지니어를 포함하여 많은 사람들에게 꽤 매력적으로 들리는 단어다. 그리고 창발적 설계(Emergent design)라는 말도 마치 무언가 폭발적으로 뿜어나오는 테크닉 같이 있어보이는 느낌을 준다. 많은 사람들이 바라는 형용사와 단어다. \"혁신적인 아키텍처와 창발적 설계\"이라는 제목으로 IBM dW에 올라오고 있는 글들은 \"능률적인 프로그래머 프로그래머 생산성의 비밀 (The Productive Programmer, 지앤선)\"의 저자이자 소트웍스사(=마틴 파울러가 과학자 직함으로 있는 곳)의 아키텍트인 닐 포트(Neal Ford)가 쓴 글이다.\n\n혁신적인 아키텍처와 창발적 설계: 설계를 위한 환경 고려사항\nPart1: [http://www.ibm.com/developerworks/kr/library/j-eaed17/index.html](http://www.ibm.com/developerworks/kr/library/j-eaed17/index.html \"[http://www.ibm.com/developerworks/kr/library/j-eaed17/index.html]로 이동합니다.\")\nPart2: [http://www.ibm.com/developerworks/kr/library/j-eaed18/index.html](http://www.ibm.com/developerworks/kr/library/j-eaed18/index.html \"[http://www.ibm.com/developerworks/kr/library/j-eaed18/index.html]로 이동합니다.\")\n\n\n현재 번역기준으로 2편까지 나온 이 글들은 몇가지 어려운 용어와 배경지식이 필요한 부분, 그리고 (아쉽게도) 쉽지 않은 번역문장으로 인해 다소 난해했다. 그럼에도 불구하고 이전에 dW의 글을 소개하는 것과 마찬가지로 몇 가지 사전 지식을 갖고 있으면 조금 더 이해하기 쉬울 것 같다.\n\n1\\. 기술적 채무(Technical Debt)\n기술적 채무라는 표현은 켄트벡의 멘토인 워드 커닝엄에 의해 널리 알려지게 된 은유표현으로 기술적 개선사항이 가능한 상황에서 현재의 비용을 써서 해결하지 않으면 이자가 붙게 되어 나중에는 동일한 수준으로 개선하는데에 더 큰 비용이 발생한다는 의미이다.\n\n린 소프트웨어로 이름을 알리 포펜틱 부부의 책(린 소프트웨어 개발의 적용, 위키북스)에도 이를 언급하고 사례가 나온다.\n\n\"코드를 변경하기 어렵게 만든다면, 그게 무엇이든 기술적인 빚이다\" - 172p\n\n인터넷에서도 이와 관련된 좋은 글을 발견할 수 있다. 소프트웨어 설계에 있어서 관련해서는 언제나 그렇듯 쉽게 풀어써서 많은 사람들에게 IT해설가로 덕망이 높은 마틴 파울러 아저씨의 글([Technical Debt](http://martinfowler.com/bliki/TechnicalDebt.html \"[http://martinfowler.com/bliki/TechnicalDebt.html]로 이동합니다.\"), [TechnicalDebt Quadrant](http://martinfowler.com/bliki/TechnicalDebtQuadrant.html \"[http://martinfowler.com/bliki/TechnicalDebtQuadrant.html]로 이동합니다.\"))도 시간을 들여서 읽어 볼만한 좋은 글에 해당한다.\n\n![techDebtQuadrant.png](/files/21845)\n\n[기술적 채무의 사분면]\n\n위 그림은 기술적 채무의 사분면을 나타내며, 각각의 사분면은 무모함(Reckless), 신중함(Deliberate), 심사숙고(Prudent), 부주의함(Inadvertent)의 조합으로 구성된다\n\n 좌측 상단부터 시계방향으로 살펴보면 다음과 같다.\n\n1\\. 무모함 + 신중함 : \"설계에 시간쓸 여유 없습니다\"\n2\\. 심사숙고 + 신중함 : \"우선 배포하고 결과에 대응해야 합니다\"\n3\\. 심사숙고 + 부주의 : \"(지나고보니) 이제야 어떻게 했어야 했는지 알게됐다\"\n4\\. 무모함 + 부주의: \"레이어로 구성한다는게 무슨 뜻이야?\"\n\n보통 이런 기술적인 빚을 해결하는데 가장 손쉬운 방법은 리팩터링(Refactoring)을 개발시점 내내 적절하게 적용하는 것이다.\n\n2\\. SLAP(Single Level of Abstraction Principle, 단일레벨 추상화 원칙)\n닐 포드 아저씨의 책에도 언급되는 내용으로 메소드 내에서도 각 라인이 추상화의 레벨이 일치하도록 작성해야 한다는 원칙이다. 아래 예제를 보자. (try 부분 위주로 보길 바란다)\n\npublic void addOrder(ShoppingCart cart, String userName,\n                     Order order) throws SQLException {\n    // ...\n    try {\n        s = c.createStatement();\n        transactionState = c.getAutoCommit();\n        int userKey = getUserKey(userName, c, ps, rs);\n        c.setAutoCommit(false);\n        addSingleOrder(order, c, ps, userKey);\n        int orderKey = getOrderKey(s, rs);\n        addLineItems(cart, c, orderKey);\n        c.commit();\n        order.setOrderKeyFrom(orderKey);\n} catch (SQLException sqlx) {\n        s = c.createStatement();\n        c.rollback();\n        throw sqlx;\n    } finally {\n        // .....\n    }\n}\n\n\n다음은 try 구문 안의 굵은 글씨로 표시한 부분만 발췌한 모습이다.\n\ntry {\n// ...\n         c.setAutoCommit(false);\n         addSingleOrder(order, c, ps, userKey);\n// ...\n}\n\n\n두 줄은 서로 목적레벨이 다르다. 윗줄은 트랜잭션을 처리하는 부분이고, 그 다음은 addOrder 메소드의 논리로직이다. 서로 추상화의 수준(Level of Abstraction)이 다른것이다. 이런식으로 작성된 코드를 SLAP원칙을 위반한 코드라고 부른다.\n\n위 코드는 리팩터링을 통해 아래와 같이 추상화 레벨을 맞춰줄 수 있다.\n\npublic void addOrderFrom(ShoppingCart cart, String userName,\n                     Order order) throws SQLException {\n setupDataInfrastructure();\n    try {\n add(order, userKeyBasedOn(userName));\n addLineItemsFrom(cart, order.getOrderKey());\n completeTransaction();\n    } catch (SQLException sqlx) {\n        rollbackTransaction();\n        throw sqlx;\n    } finally {\n        cleanUp();\n    }\n}\n\n\n\n[리팩터링 Step1]\n\npublic void addOrderFrom(final ShoppingCart cart, final String userName,\n                         final Order order) throws SQLException {\n\n wrapInTransaction(new Command() {\n        public void execute() throws SQLException{\n add(order, userKeyBasedOn(userName));\n addLineItemsFrom(cart, order.getOrderKey());\n        }\n    });               \n}\n\n\n[리팩터링 Step2]\n\nprivate메소드는 표시에서 제외하였지만, 이런식으로 addOrder를 리팩터링 해 나감으로써 SLAP위반을 제거할 수 있다. 마찬가지로 기술적 부채를 갚는 방법 중 하나이다.\n\n3\\. 관련서적 읽기\n마지막으로 dW 기사를 읽고 좀 더 잘 이해하려면, 해당 기사에서 언급한 관련 책을 읽는 것이 도움이 된다. 꼭 기사때문이 아니더라도 한 번쯤 읽어보길 추천하는 도서들이기도 하다. (참고로 닐포드의 책은 사실 내용에 조금 논란이 있는 책이긴 하다. :)\n\n- 실용주의 프로그래머\nThe Pragmatic Programmer(Andy Hunt 및 Dave Thomas 저, The Pragmatic Bookshelf, 2001년)\n\n- 린 소프트웨어 개발의 적용\nImplementing Lean Software Development: From Concept To Cash(Mary Poppendieck, Tom Poppendieck, 2006년)\n\n- 능률적인 프로그래머 프로그래머 생산성의 비밀\nThe Productive Programmer(Neal Ford 저, O'Reilly Media, 2008년)\n\n- 리팩토링: 나쁜 디자인의 코드를 좋은 디자인으로 바꾸는 방법\nRefactoring: Improving the Design of Existing Code(Martin Fowler 저, Addison-Wesley, 1999년)\n\n- GoF의 디자인패턴\nDesign Patterns: Elements of Reusable Object-Oriented Software(Erich Gamma 등, Addison-Wesley, 1994년):",
    "attachments": [
      {
        "id": 21845,
        "name": "techDebtQuadrant.png",
        "hash": "7fd00b66131af0173aef6e669409fa8f1ae03b9e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 42946,
        "containerId": "12331"
      }
    ]
  },
  {
    "id": 164,
    "title": "세상을 구하는 용기 (The Courage that save the world)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1301363538000,
    "body": "> doortts | 2011-03-29 화요일 오전 10:42 | 이생각 저생각 | [원본](http://blog.doortts.com/164)\n\n용기라는 말은 비교적 일상에서 흔히 듣는 단어다. 특히 영화나 애니메이션 같은걸 보면 주인공이 동료의 응원(Be brave!!)으로 용기를 내서 세상을 구하는 장면이 곧잘 나오곤 한다. 아니면 TV나 신문에서 사람을 구하기 위해 지하철 노선위로 뛰어 들거나 범죄자를 몸으로 막아 표창장같은 걸 타는 사람을 보기도 한다. 하지만, 현실에선 그와 달리 '용기'라는 말은 나와는 크게 관련이 없고, 쉽게 실천하기 어려운 영역인 것만 같다. 불의와 싸우고, 많은 희생을 감내하며 용기로 세상을 구하는 건 아무리 생각해도 역시 현실과는 동떨어져 있다. 그래서 아는 단어지만 쓰이지 않는 단어가 돼버렸다.\n\n나는 현재 신입사원을 비롯하여 사내의 많은 사람들에게 강의를 하고 있다. 다른 사람 앞에서 강의를 한다는 건 생각보다 그렇게 쉽진 않다. 지금도 그렇지만, 특히나 초보강사 시절엔 직급 높고 경력 높은 선배들에게 강의를 하는건 정말 긴장되는 상황이었다. 강의 참석하신 분들이 정말 그렇진 않지만  '그래, 얼마나 잘 하나 볼까?'라는 시각으로 자신을 쳐다보는 것만 같아서 더 떨렸다.  자칫 부족한 부분이 드러나서 '그럼 그렇지! 수준이 별로네'와 같은 마음속의 야유를 받게 될것 같았다. 부족함을 속이려 하면 할 수록 이런 두려운 마음이 강의에 집중을 방해해 버린다. 그리고 그 결과 강의 진행에 미묘한 혼란이 오고 결국 정말 '그럼 그렇지! 수준이 별로네'의 강의가 된다.\n\n개발기법 중에 테스트주도개발(TDD)라는 방식이 있다. 팀 개발 생산성과 품질을 높이는 기술로, 외국에서는 이제 거의 일반화된 기술이다. 국내에서도 왠만한 엔지니어라면 누구나 한 번쯤은 들어보고 시도해봤을 기술인데 기본서로 외국 책이 수 년전에 한 권 번 번역되었을 뿐, 실제 업무를 하려면 딱히 참고할 책이 없었다. 다른 분야 책은 많은데 왜 없는걸까? 아마 그 번역서 한 권이 TDD를 만든 사람이 직접 쓴 책이고, 그 내용을 뛰어넘는 책이 나오는 것이 가능할까?라는 많은 엔지니어들이 의문을 품었기 때문아닐까? 괜히 어설프게 관련책이 나온다면 좋은 소리 못듣고 얼굴에 먹칠하는 거겠지?\n\n이야기가 하나 또 있다. 앞의 이야기를 마무리도 하지 않고 자꾸 새로운 이야기를 꺼내게 되어 미안하지만, 들어줬으면 싶다. 수 년전에 회사 내에서 Agile이 처음 시도되었다. 그 때 사람들의 반대는 이루 말할 수 없을 정도였다. 관련팀에서 힘겹게 열었던 세미나는 프로젝트 경험 많은 선배님들의 비평(인지 비난인지 잘 구별안되는 발언)이 쇄도하는 자리가 되어 버렸다. 아마 또 새로운 방법론을 들여와서 우리를 괴롭히려나 보다라고 생각했던 것 같다. 잘 몰랐다면 사실 나도 그랬을 것 같다. 그 때 많은 관리분들을 비롯하여 임원분들도 해당 자리에 계셨는데, 거친 질문으로 인해 Agile 세미나를 주최하신 분은 이마에 땀이 마를 틈이 없었다. 세미나에서 뭔가 질문이 잘못된 방향으로 이야기가 흘러가는 모습에 그게 아니라고 말하고 싶었지만, 난 그때 해당 팀과 관련도 없었고, 그저 관심있어 참석한 일개 대리 사원이였을 뿐이다.\n\n살다보면 참 많은 선택의 순간이 온다. 점심은 돈까스를 먹을까? 국밥을 먹을까? 와 같은 단순한 선택도 있지만 두려움이 어깨를 누르고 손이 조금 떨리는, 용기가 필요한 선택의 순간이 오기도 한다. '모르는 걸 모른다고 말을 하고 도움을 청할까? 말까? 에이~ 내가 직급이 있는데 후배에게 어떻게..'라던가 '비록 일부 일지라도 사람들에게 도움을 줄 수 있을것 같은데 책을 써볼까? 욕먹으면 어떻하지?', 혹은 '저건 아닌데. 뭔가 잘못된 오해를 하고 있는데.. 손을 들고 이야기를 해볼까? 그런데 일개 대리 주제에 무슨..'과 같은 순간이 말이다.\n 이제 긴 이야기의 마무리이다.\n\n1\\. 아주 어려웠던 강의에서 모르는걸 모른다고 솔직히 말하고 잘하는 부분을 더 잘하기 위해 노력했다. 인정하니 편해져서 오히려 강의가 더 잘 되었고 서로의 만족도도 더 높아졌다.\n 2\\. 난 작년에 『테스트 주도 개발 TDD 실천법과 도구』이라는 책을 썼다. 내가 이 분야의 최고라서 책을 쓸 수 있던 것이 결코 아니다. 고생하며 겪은 지식을 나눌 수 있다고, 그를 통해서 뒤에 시작하는 후배들은 더 적은 시간에 더 많이 성장할 수 있을거라고 생각했기 때문이다. 많은 분들의 도움을 받았고, 또 많은 분들이 도움많이 받았다는 인사를 해 주셨다. 결과적으로는 나 스스로도 이전보다 더 나아지고 있다는 걸 알게 되었다.\n\n3\\. 수년 전 그 세미나 자리에서 손을 들고 일어나서, 하고 싶은 이야기를 했다. 떨리는 목소리를 감추기 위해 애써 노력했던 것이 기억난다. 그 뒤로 세미나를 주최하신 차장님과 둘이 사내에서 애자일확산 활동을 시작했다. 회사내 애자일 프로젝트가 첫 해 2개 프로젝트였던 것이 그 다음 해엔 24개로 그리고 작년엔 55개 프로젝트로 늘어났다. 전체에 비해 많은 숫자는 아니지만 조금씩 나아가고 있고 좀 더 많은 프로젝트와 그 안에서의 삶도 그와 함께 조금씩 더 나아지고 있다고 믿는다.\n\n어떻게 생각할 모르겠지만 난 작은 용기가 세상을 바꿀 수 있다고 생각한다. 비록 불길에 뛰어들고 불의와 싸우는 것 같은 거창한 모습은 아니지만, 스스로의 두려움을 넘어설 수 있는 작은 용기, 주변사람들에게 먼저 손을 내밀 수 있는 그런 용기가 있다면 세상은 바뀔 수 있다. 세상은 한 사람 한 사람의 세계가 합쳐서 말 그대로의 거대한 세상을 만들어 내는 것이기 때문에, 평범하고 작은 용기로도 생각보다 훨씬 더 크게 세상을 변화시킬 수 있다고 믿는다. 그리고, 그런 사람들이 더 많이 생겨나리나는 믿음으로 난 신입사원 기술 교육시간에도 엔지니어의 기본 덕목으로 '용기'라는걸 가르치고 있다.\n\n'모르는 걸 모른다고 이야기 할 수 있어야 합니다'\n\n'두려울 때는 먼저 손을 드세요. 상황이 되면 새로운 자신의 모습을 볼 수 있을 겁니다'\n\n'넘어지기도 전에 먼저 두려워 하지 마세요. 적어도 넘어지기 전까지는 숨을 크게 쉬고 힘껏 뛰어 보세요.'\n\n'옆 사람에게 먼저 인사를 건네고, 손을 내미는 것도 용기입니다.'\n\n'우린 곧잘 용기를 버리고 그 대신 타인의 삶을 살곤 합니다. 자신의 삶을 사세요.'\n\n\n\n사실 이런류의 이야기는 낯 부끄럽고, 어줍잖은 소리인 줄은 잘 알지만, 그래도 나도 가끔은 용기를 내어 이야기 하곤 한다. 누가 알겠는가? 이런 내 이야기를 들었던 사람 중에 정말 세상을 구하는 사람이 나올지. :)\n\n#### Comments\n\nRSS Reader로 언제나 좋은 글 잘 읽고 있습니다.\n감사합니다. ^^\n\n [proxies](http://www.hiten.net) | 2011-03-29 화요일 오후 3:23\n\n--\n\n언제나 친절히 달아 주시는 댓글 감사합니다. 부족함에도 너그럽게 봐 주셔서 더 감사하고요. \n\n편안한 저녁되세요. :)\n\n [doortts](http://blog.doortts.com) | 2011-03-29 화요일 오후 6:37\n\n--\n\n모르는 걸 모른다고 말할 수 있는 용기를 꺾는데엔 입시지옥이 큰 역할을 하지 않았을까요? 모른다고 인정하면 선생님에게 혼나잖아요. 맞는 일도 흔했고. 조용히 있으면 최소한 중간은 간다거나, 모난 돌이 정맞는다는 속담은 이제 그만 사라졌으면 좋겠습니다.\n\n [nulonge](http://nulonge.tumblr.com) | 2011-04-05 화요일 오후 7:0\n\n--\n\n네. 저도 nulonge님 말씀처럼 모난 돌이 정맞는 일 없이 경청하고 인정하고 나누는 모습이 좀 더 자연스러워졌으면 좋겠습니다. :)\n\n [doortts](http://blog.doortts.com) | 2011-04-11 월요일 오후 7:34\n\n--\n\n음... 이건 신문에 낸 글의 원본인가봐요? 실리면서 많이 짧아졌네.\n본사대기 중, 인사를 위한 점심 후 강남가요.\n매일매일 용기를 내서 살아볼께요. ^0^\n\n [csk](http://cskstory.tistory.com) | 2011-05-16 월요일 오전 11:7\n\n--\n"
  },
  {
    "id": 165,
    "title": "[dW Review] Java development 2.0: MongoDB",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1301531638000,
    "body": "> doortts | 2011-03-31 목요일 오전 12:18 | Better SW Development | [원본](http://blog.doortts.com/165)\n\nIBM DeveloperWorks에 올라온 기사 Java development 2.0: MongoDB를 좀 더 잘 이해하기 위한 보충설명입니다. :)\n\n\n\n**Java development 2.0: MongoDB:\n(적절한) RDBMS 이동 기능을 제공하는 NoSQL 데이터 저장소**\n[http://www.ibm.com/developerworks/kr/library/j-javadev2-12/index.html](http://www.ibm.com/developerworks/kr/library/j-javadev2-12/index.html)\n\n\n\n\n스케일 업(Scale Up) : 서버 성능을 올리는 것. CPU 증설, 램 Up~\n스케일 아웃(Scale Out): 서버 대수를 늘리는 것.\n \n샤딩(Sharding): 데이터 베이스의 수평확장(horizontal partitioning)의 일종. 일반적으로 한 테이블의 Row를 분산시키는 것. 요금테이블 -> 1월요금테이블, 2월요금테이블.. 등등으로 나눈다고 생각하면 간단합니다. 샤딩에 대해서는 조만간 따로 글을 올리도록 하겠습니다.\n\n\n기사 내용자체가 원체 쉽게 잘 쓰여 있습니다만, 그래도 아래 내용을 먼저 보시고 읽어보시면 더 더욱 쉽게 이해되실 겁니다. :)\n\n\"MongoDB의 API는 JSON 오브젝트와 JavaScript 함수의 혼합체이다.\"\n네. 그렇습니다. 따라서 콘솔상에서 자바스크립트 문법을 실행하는 것이 가능합니다.\n \n\ndoortts:~/Development/mongodb-osx-x86_64-1.8.0> ./bin/mongo\nMongoDB shell version: 1.8.0\nconnecting to: test\n\n> var a=1, b=2;\n> a+b;\n3\n\n> print ('hello mongo');\nhello mongo\n>\n\n\ndW 기사의 mongodb 실행 명령어는 오타인듯 합니다. 아래와 같이 해야 정상실행됩니다.\n\n./bin/mongod --dbpath ./data/db --vvvvvvv\n\n\n기사에도 나오지만 mongodb는 document 기반 NoSql중 하나로 기본 데이터로 json 형식을 지원합니다.\n\n**ticket** =  { officer: \"Kristen Ree\" , location: \"Walmart parking lot\", vehicle_plate: \"Virginia 5566\",  offense: \"Parked in no parking zone\", date: \"2010/08/15\"}\n\n> db.tickets.save(ticket);\n> ticket\n \n{\n    \"officer\" : \"Kristen Ree\",\n    \"location\" : \"Walmart parking lot\",\n    \"vehicle_plate\" : \"Virginia 5566\",\n    \"offense\" : \"Parked in no parking zone\",\n    \"date\" : \"2010/08/15\",\n    \"_id\" : ObjectId(\"4d92e8f3a9770dc9e1e6a027\")\n}\n\n\ntickets라는 컬렉션은 미리 지정해 놓지 않아도 위와 같이 명령을 쓰는 순간 만들어 집니다.\n\n> **db.tickets.****find();**\n\n{ \"_id\" : ObjectId(\"4d92e8f3a9770dc9e1e6a027\"), \"officer\" : \"Kristen Ree\", \"location\" : \"Walmart parking lot\", \"vehicle_plate\" : \"Virginia 5566\", \"offense\" : \"Parked in no parking zone\", \"date\" : \"2010/08/15\" }\n\n>**db.tickets.find({location:/walmart/})**\n\n{ \"_id\" : ObjectId(\"4d92e8f3a9770dc9e1e6a027\"), \"officer\" : \"Kristen Ree\", \"location\" : \"Walmart parking lot\", \"vehicle_plate\" : \"Virginia 5566\", \"offense\" : \"Parked in no parking zone\", \"date\" : \"2010/08/15\" }\n\n\nfind를 이용해서 컬렉션 안의 데이터를 검색합니다. 삭제는 remove를 이용합니다. find때와 마찬가지로 정규식을 지원합니다. i 는 대소문자 무구분!\n\ndb.tickets.remove({vehicle_plate:/virginia/i});\n\n\n다음은 Mongodb Java Driver를 이용해 만들어 본 데이터 입력에 대한 단위테스트 케이스 입니다.\n\nimport static org.junit.Assert.*;\n\n import org.junit.*;\n\n import com.mongodb.*;\n\n public class MongodbTest {\n\n \tprivate DB db;\n \tprivate Mongo m;\n\n \t@Before\n \tpublic void setUp() throws Exception {\n \t\tm = new Mongo();\n \t}\n\n \t@After\n \tpublic void tearDown() throws Exception {\n \t\tdb = m.getDB(\"test\");\n \t\tDBCollection coll = db.getCollection(\"tickets\");\n \t\tcoll.drop();\n \t}\n\n \t@Test\n \tpublic void testMongodbInsert() throws Exception {\n \t\t//Given\n \t\tBasicDBObject doc = new BasicDBObject();\n \t\tdoc.put(\"officer\",  \"Andrew Smith\");\n \t\tdoc.put(\"location\",  \"Target Shopping Center parking lot\");\n \t\tdoc.put(\"vehicle_plate\",  \"Virginia 2345\");\n \t\tdoc.put(\"offense\",  \"Double parked\");\n \t\tdoc.put(\"date\",  \"2010/08/13\");\n\n \t\t//When\n \t\tdb = m.getDB(\"test\");\n \t\tDBCollection coll = db.getCollection(\"tickets\");\n \t\tcoll.insert(doc);\n\n \t\t//Then\n \t\tDBObject dbObject = coll.find(doc).next();\n\n \t\tassertEquals(doc.keySet(), dbObject.keySet());\n \t\tassertEquals(\"Andrew Smith\", dbObject.get(\"officer\"));\n \t\tassertEquals(\"Target Shopping Center parking lot\", dbObject.get(\"location\"));\n \t\tassertEquals(\"Virginia 2345\", dbObject.get(\"vehicle_plate\"));\n \t\tassertEquals(\"Double parked\", dbObject.get(\"offense\"));\n \t\tassertEquals(\"2010/08/13\", dbObject.get(\"date\"));\n \t}\n }\n\n \n\n(function(){ var corecss = document.createElement('link'); var themecss = document.createElement('link'); var corecssurl = \"http://whiteship.me/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.83b\"; if ( corecss.setAttribute ) { corecss.setAttribute( \"rel\", \"stylesheet\" ); corecss.setAttribute( \"type\", \"text/css\" ); corecss.setAttribute( \"href\", corecssurl ); } else { corecss.rel = \"stylesheet\"; corecss.href = corecssurl; } document.getElementsByTagName(\"head\")[0].insertBefore( corecss, document.getElementById(\"syntaxhighlighteranchor\") ); var themecssurl = \"http://whiteship.me/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeRDark.css?ver=3.0.83b\"; if ( themecss.setAttribute ) { themecss.setAttribute( \"rel\", \"stylesheet\" ); themecss.setAttribute( \"type\", \"text/css\" ); themecss.setAttribute( \"href\", themecssurl ); } else { themecss.rel = \"stylesheet\"; themecss.href = themecssurl; } //document.getElementById(\"syntaxhighlighteranchor\").appendChild(themecss); document.getElementsByTagName(\"head\")[0].insertBefore( themecss, document.getElementById(\"syntaxhighlighteranchor\") ); })(); SyntaxHighlighter.config.strings.expandSource = '+ expand source'; SyntaxHighlighter.config.strings.help = '?'; SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\\n\\n'; SyntaxHighlighter.config.strings.noBrush = 'Can\\'t find brush for: '; SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\\'t configured for html-script option: '; SyntaxHighlighter.defaults['pad-line-numbers'] = true; SyntaxHighlighter.all();"
  },
  {
    "id": 166,
    "title": "당신은 애자일 전문가 입니까? (Are you an agile expert?)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1306756518000,
    "body": "> doortts | 2011-04-04 월요일 오후 6:16 | 이생각 저생각 | [원본](http://blog.doortts.com/166)\n\n저는 주 업무와 별개로 회사에서 애자일 관련 활동을 진행하고 있습니다. 애자일 관련 교육을 한다던가, 프로젝트를 찾아가서 상황에 맞게 이런저런 가이드를 하고 오기도 합니다. (남는 시간에 팀장님 및 팀원분들께 양해를 구하고 말입니다.) 사내에서는 이런 활동과 더불어 스크럼 마스터를 양성하는 사람을 Agile Coach라고 부릅니다.\n\n![coach_carter.jpg](/files/21850)\n\n[포스트 상단의 문구를 보면... IT 코치인듯... (...) ]\n\nAgile 관련 활동을 하다보면 사내, 혹은 사외에서 \"애자일 전문가\"라는 불릴때가 있습니다. 사실 그런 순간이 되면 얼굴이 화끈해집니다. \"나는 애자일 전문가인가? 애자일 전문가는 어떤 사람인가?\"라는 의문이 들기 때문입니다.\n경험도 아직 미천하고, 지식도 부족하다는 걸 잘 알기 때문에, \"열심히는 해왔지만, 사실 전문가라고 불리기엔 부족한점이 많습니다.\"라고 이야기 합니다. 사회적 학습으로 배운 겸양의 표현이라 생각하시겠지만, 솔직한 저의 마음이기도 합니다.\n\n그런데 문득, 반대로 만약 눈 앞에 애자일 전문가가 있고, 전문성을 판단해야 한다면, 어떤 질문을 할 것인가에 대해 고민해 봤습니다. 개인적인 지식에 한정되어 있고 편협한 모습이 약간 악역스럽긴 합니다만, 그래도 한번 만들어 봤습니다. 당연한 이야기겠지만, 정답은 없습니다.  : )\n\n애자일 코치를 위한 7가지 질문\n\n1\\. 당신은 왜 애자일을 선택했습니까?\n    : self motivation\n\n2\\. 애자일 선언문(Agile manfiesto) 중 생각나는 부분이 있다면 어느 부분인가요?\n    : concept & knowledge\n\n3\\. 애자일 선언문 뒤에 자리잡고 있는 원칙들(principles)을 읽어보셨는지요?\n    : basic strength in depth\n\n4\\. 애자일을 한 줄로 표현하면 뭐라고 하시겠습니까?\n    : refinement\n\n5\\. 만약 어느 팀이 단 하나의 실천법(practice)만을 적용할 여유가 있다면 무엇을 권하시겠습니까?\n    : decision making\n\n6\\. 애자일을 팀에 소개해 본 적이 있습니까?\n    : propagation\n\n7\\. 애자일 관련해서 실패하신 사례가 있다면 들려주시겠습니까?\n   : experience\n\n\n애자일을 하신다면 한 번 적어보세요. 누구에게 보여주기 위해서라기 보다, 스스로를 가늠해 보기 위해 사용하시면 좋을 것 같습니다. :p\n\n#### Comments\n\n애자일 코치 테스트 인가요. ^^\n\n [k16wire](http://pragmaticstory.com) | 2011-06-01 수요일 오후 1:37\n\n--\n\n\n안녕하세요. 좋은 글 잘 보고 있습니다. ^0^\n\n\n 질문 자체가 \n\n 무엇을 모르는 가를 모르는 가? 에 대한 좋은 대답이라고 봅니다. \n\n 그렇기에 4번에 대한 대답은 \n\n \"알고 있다고 생각하지만, 실상 모르고 있었다.를 알게 해 주는 것.\"\n\n 흔히 말하는 \"본보기\"  가 아닌 가라고 생각합니다.\n\n 그래서 요즘에는 Agile을 말하기에 앞서 과정을 보여주고 차이를 느끼게 하는 것 부터 시작합니다.\n\n Agile 도입을 위해 너무 많이 고려하고 고민하는 것 자체가 Agile 하지 않은 것 같기도 하구요.  :-)  \n\n 예린아빠 | 2011-10-19 수요일 오후 12:40\n\n--\n",
    "attachments": [
      {
        "id": 21850,
        "name": "coach_carter.jpg",
        "hash": "ad86db738dc568ec3d5c971d4b7d91a963dcf381",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 146435,
        "containerId": "12339"
      }
    ]
  },
  {
    "id": 169,
    "title": "개인적으로 권장드리는 TDD 코드 작성 스타일",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1303384507000,
    "body": "> doortts | 2011-04-21 목요일 오후 8:15 | Better SW Development | [원본](http://blog.doortts.com/169)\n\n코드를 많이 작성하지는 않지만 코드를 보지 않거나 작성하지 않고 넘어가는 날은 없는것 같습니다.\n그리고 작성하는 코드는 TDD로 작성하기 위해 노력합니다.\nTDD가 불편하지 않고 안하면 불안한 단계까진 온것 같습니다. : )\n\n이런저런 시도를 많이 했었는데요, 요즘엔 TDD진행에 있어 어느 정도 (개인적으로) 정제된 형태가 된것 같습니다. 자세한 이야기는 따로 정리하기로 하고요, 우선 몇 가지만 이야기해 보겠습니다.\n\n#1.\n테스트 케이스는 무조껀 //Given //When //Then으로 작성하고 있습니다. 제가 제 책에도 써 놓았지만, 저도 mockito 개발자의 열변에 동참합니다. :)\n\n\n\n\"저처럼 어리석은 짓을 하지 마시고, 바로 오늘부터 //given //when //then 템플릿을 쓰기 시작 하세요.\n\n삽질하기엔 인생은 너무 짧답니다. 소프트웨어 장인 레벨 85에 빨리 올라가고 싶으시죠? 이렇게 한번 해보세요. 우선 먼저, 개발 주기를 하나 선정해서 그 동안에 이 템플릿을 써보세요. 그러고 나서 결과가 맘에 들지 않는다면 전액 환불해드립니다!\n\n정말 진지하게 말씀드리는 건데요, 생각할 필요도 없습니다. 지르세요!\" \n\n- Mockito 개발자\n\n\n\n#2\n1년전 책을 쓸 시점과 비교해서 바뀐 스타일 중 하나는 Lombok 라이브러리와 Infinitest의 적극사용입니다.\n**Lombok** : http://projectlombok.org/\n**Infinitest**: http://infinitest.github.com/\n\nLombok은 getter/setter로부터의 해방과 equals구현을 고민하지 않아도 되기 때문에 assertEquals가 훨씬 간결하고 쉽게 됩니다.\nInfinitest는 JUnitMax같이 이클립스에서 저장을 할때마다 자동적으로 테스트를 수행해주는 이클립스 플러그인입니다. 개인적으로는 JUnitMax 보다 더 편하게 쓰고 있습니다. 우선 박력있는 녹색막대도 매력적이고요.\n\n![infinitest.png.png](/files/21846) \n\n특히 Lombok의 경우 많은 경우에 있어 [Unitils](http://www.unitils.org/ \"[http://www.unitils.org/]로 이동합니다.\")까지 쓰지 않아도 될만큼 편합니다.\n 적극 사용 권장합니다. : )\n\n#### Comments\n\n감사~ 본격적으로 tdd해보려하는데 저 템플릿 써봐야겠군요 ㅎㅎㅎ\n\n [Outsider](http://blog.outsider.ne.kr) | 2011-04-22 금요일 오전 11:58\n\n--\n\n프로젝트에 맞추려다보니.. 실력이 미흡해서 환경 구성도 어렵네요..\n그래도 열심히 해보려구요~\n좋은 글 감사합니다~\n\n ^^ | 2011-05-13 금요일 오후 6:31\n\n--\n",
    "attachments": [
      {
        "id": 21846,
        "name": "infinitest.png.png",
        "hash": "0af761d44fd30216c1e46905fb7059bee493a5af",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 12104,
        "containerId": "12334"
      }
    ]
  },
  {
    "id": 170,
    "title": "[dW Review] 자바 동시성 처리 학습 팁",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1303999814000,
    "body": "> doortts | 2011-04-28 목요일 오후 9:37 | Better SW Development | [원본](http://blog.doortts.com/170)\n\n저의 주 사용언어는 자바입니다. 자바 외에도 이런저런 언어를 사용했지만, 해당 언어가 가지는 미묘한 아키텍처적인 특징들을 찾는데 많은 시간을 쓰진 않았던 것 같습니다. 사실 자바언어도 아직 제대로 알려면 멀었다고 생각합니다.\n\n특히 멀티쓰레딩/동시성 관련 부분은 봐도 봐도 어려운 부분인것 같습니다. 해당 분야를 프로그래밍시에 자주 쓰지 않았기 때문인 것도 그 이유중 하나인 듯 합니다. 예전에 Kent Beck에게 멀티쓰레드 영역의 TDD에 대해 물어봤던 적이 있습니다. 수 십년 프로그래밍 경험을 가진 그로부터도 사실 뾰족한 대답을 듣진 못했습니다. 우선은 예외로 하고 넘어간다는 식으로 답변을 들었던 기억이 납니다.\n\n사실 절차적으로 쭈욱~ 흘러가면 끝나는 식으로 짜여진 프로그램을 놓고, 멀티 쓰레드환경의 경쟁조건(race condition)이란걸 따져보며 살펴보기 시작하면 골치 아픈게 한 두가지 아니라는 걸 알게 됩니다. 특히 동시성 문제의 경우 '에라 모르겠다 syncronized 걸어버리고 끝내자!'라고 마음먹고 대충 써버리면 프로그램이 참 후지게 동작하기 시작합니다.\n\n![doortts_1290430098_36984_me2photo.png](/files/21849)\n\n[형! 그 정도는 내가 짤게! 이클립스 단축키정도는 나도 쓸 수 있다고! - 우리집 수동이]\n\n사실 복잡한 프로그램이 아니면 몇 가지 원칙만으로도 어느정도까지 견뎌낼 수 있습니다.\n\n- 멀티쓰레드/동시성 문제는 비용을 지불한 준비가 되어있기 전까진 직접 작업을 최대한 회피한다. (...)\n- 객체의 상태저장을 최소화 하고, 가능하다면 immutable 객체로 만든다.\n\n물론 관련 전문 서적을 읽는 것이 좋죠.\n\n![6212333.jpg](/files/21847)\n\n![6412501.jpg](/files/21848)\n\n그럴 여유까지 되지 않는다면 최근 IBM DW에 나온 기사 중에서 이와 관련해서 쉽게 잘 설명해 주는 두 글을 읽는 것도 많은 도움이 됩니다.\n\n멀티코어 시스템의 Java 동시성 버그 패턴\n[http://www.ibm.com/developerworks/kr/library/j-concurrencybugpatterns/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/j-concurrencybugpatterns/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/j-concurrencybugpatterns/index.html?ca=drs-]로 이동합니다.\")\n\n멀티스레드 프로그래밍에 대해 모르고 있던 5가지 사항\n[http://www.ibm.com/developerworks/kr/library/j-5things15/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/j-5things15/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/j-5things15/index.html?ca=drs-]로 이동합니다.\")\n\n\n특히 자바개발자의 50%만이 키워드를 알고 있으며 실제 사용법에 대해서는 10% 미만만이 알고 있다는 volatile 키워드에 대한 부분은 두 기사에서 모두 다루고 있으며, 상호 보완적으로 설명이 잘 되어있습니다.\n\ni++ 이 실제로는 read - update - write의 세가지 원자성으로 구성되어 있다는 것을 아는것 만으로도 여러가지를 느끼게 해줍니다.\n\n동시성에 관심이 있고 배우고 싶다면, 관련 책을 보는 것도 방법입니다만, 기초내용을 튼튼하게 학습하기에 좋은 곳으로는 자바 공식사이트만한 곳이 없습니다. 영어도 쉽고 예제도 많아서 생각보다 보기 쉽습니다.\n\nJAVA Lesson: Concurrency\n[http://download.oracle.com/javase/tutorial/essential/concurrency/index.html](http://download.oracle.com/javase/tutorial/essential/concurrency/index.html \"[http://download.oracle.com/javase/tutorial/essential/concurrency/index.html]로 이동합니다.\")\n\n\n그리고 IBM DW기사에도 언급되어 있지만 Double Checked Locking, Wait Not In Loop, Unconditional Wait, Mismatched Wait and Notify, Two Locks Held While Waiting 등등의 대표적인 동시성 버그 패턴들을 함께 학습하면 더 좋습니다.\n\nstatic ClassA field;\nstatic ClassA createSingleton() {\n    if (field == null) {\n        synchronized (lock) {\n            if (field == null) {\n                ClassA obj = new ClassA(); // obj초기화\n                field = obj; //필드에 할당\n            }\n        }\n    }\n    return field;\n}\n\n\n[대표적인 버그패턴 Double Checked Locking]\n\n느닷없는 깜짝 퀴즈!\n다음 코드의 문제점은 무엇입니까? 또 어떻게 하면 개선 가능할까요?\n간단한 문제지만 안에 담겨있는 메시지는 작지 않으니까 꼭 한번 고민해 보세요. : )\n\nclass HelloRun implements Runnable{\n \t@Override\n \tpublic void run() {\n \t\tSystem.out.println( \">>>\"  + Thread.currentThread().getName() +  \": started\");\n \t\tif( Thread.currentThread().getName().equals(\"one\") ){\n \t\t\tstepA();\t\n \t\t} else {\n \t\t\tstepB();\n \t\t}\n \t}\n\n \tprivate synchronized void stepB() {\n \t\t\tSystem.out.println(\"started B\");\n \t\t\tSystem.out.println(\"Do something\");\n \t\t\tSystem.out.println(\"end B\");\n \t}\n\n \tprivate synchronized void stepA() {\n \t\t\tSystem.out.println(\"started A\");\n \t\t\tSystem.out.println(\"Do something\");\n \t\t\tSystem.out.println(\"end A\");\t\t\n \t}\n\n \tpublic static void main(String[] args) {\n \t\tHelloRun helloRun = new HelloRun();\n\n \t\tThread t1 = new Thread(helloRun, \"one\");\n \t\tThread t2 = new Thread(helloRun, \"two\");\n \t\tt1.start();\n \t\tt2.start();\n \t}\n }\n\n \n\n#### Comments\n\n퀴즈 코드에서 어떤 문제점이 있는지요? stepA(), stepB() 에서 synchronized 는 불필요하다는 생각 외에는... 궁금해서 여쭙니다.\n\n 원상호 | 2011-04-29 금요일 오전 10:54\n\n--\n\n꾸우님이 트랙백으로 답 달아 주셨습니다. :)\n\n [doortts](http://blog.doortts.com) | 2011-04-30 토요일 오후 8:39\n\n--\n\n앗.. 나도 저런 강아지 키우고 싶다!!!\n\n [영회](http://younghoe.info) | 2011-04-29 금요일 오후 12:58\n\n--\n\nㅎㅎㅎ 정말 저 대신 좀 코딩해줬으면 싶어요.\n\n [doortts](http://blog.doortts.com) | 2011-04-30 토요일 오후 8:38\n\n--\n\nvolatile를 알고 있는 개발자도 적지만 올바로 알고 있는 개발자는 훨씬 적죠.\n제가 volatile를 알고 있는 개발자 중 정확히 이해하는 사람을 지금까지 한 명 만나 봤습니다.\n저 글을 읽고 이해할 수 있는 사람이 얼마나 될지도 모르겠네요.\n\n아! 그리고 퀴즈요!\n두 메서드가 동시에 동기화 되는 게 문제라는 건 동기화하는 목적에 따라 맞을 수도 있고 문제가 안 될 수도 있다고 봅니다. 질문이 틀렸어요!!! 벌로 떡볶이 쏘세요.\n\n@영회\n하이! 새신랑! 잘 지냄?\n\n [박성철](http://me2day.net/geekinside) | 2011-05-02 월요일 오후 5:44\n\n--\n\nvolatile을 이용하면 DCL을 해결할 수 있다는걸 이해하는 수준이면 충분하지 않을까요? 많이 모른다는건 많이 안쓴다는 이야기이기도 하니까요. 그리고 퀴즈는 두 메소드가 mutually exclusive하기 때문에 틀리지 않았어요! (출제자의 의도를 파악하는것도 중요하다구요!!)\n\n하지만, 떡볶기는 쏠게요~~ ㅎㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2011-05-02 월요일 오후 6:17\n\n--\n\npublic class 가 아닙니다!!!!! -.-;;;\n\n [is윤군](http://helols.tistory.com) | 2011-05-03 화요일 오전 6:50\n\n--\n\n아... 예리하다...\n\n [doortts](http://blog.doortts.com) | 2011-05-03 화요일 오후 5:2\n\n--\n\n예. 자바 5 이후에 volatile을 사용하면 DCL이 정상 동작한다는 사실 정도만 알면 다행인데 volatile만 붙이면 모든 동시성 문제가 해결된다고 말하고 다니는 사람이 많더라구요. 사실 volatile을 아는 사람 대부분이 그런 식이었어요.\n\n [박성철](http://me2day.net/geekinside) | 2011-05-03 화요일 오전 9:9\n\n--\n",
    "attachments": [
      {
        "id": 21847,
        "name": "6212333.jpg",
        "hash": "1e90b6a75e585c0ac2244ea88524c6af67dc8437",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 24748,
        "containerId": "12335"
      },
      {
        "id": 21848,
        "name": "6412501.jpg",
        "hash": "0d90b440de388fa3f7fed70a4e193f7b1185e291",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 14572,
        "containerId": "12335"
      },
      {
        "id": 21849,
        "name": "doortts_1290430098_36984_me2photo.png",
        "hash": "c4b69a610d53a25c31c283df8a7cc9b0c17e01a0",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 222864,
        "containerId": "12335"
      }
    ]
  },
  {
    "id": 171,
    "title": "메시지코드를 이용해 만든 예외(Exception)처리에 대한 단위 테스트",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1304134923000,
    "body": "> doortts | 2011-04-29 금요일 오전 10:23 | Better SW Development | [원본](http://blog.doortts.com/171)\n\n특정 업무 규칙 검증을 위해 하나의 BizException을 만들고 메시지, 혹은 메시지 코드를 이용해 예외처리를 하는 코드를 가끔씩 보곤 합니다. 이를테면 다음과 같은 식으로 코드를 작성한 경우입니다.\n\n     private void checkInvalidate(Purchase purchase){\n         if(purchase == null ) throw new PurchaseException(\"구매 정보가 없습니다.\");\n\n         if(purchase.getItem() == null) {\n             throw new PurchaseException(\"구매할 상품이 없습니다.\");\n         }\n\n         if(purchase.getItem().isSelling() == false) {\n             throw new PurchaseException(\"판매가 마감되었습니다.\");\n         }\n     }\n \n\n[소셜 커머스 사이트의 오늘의 딜 구매항목 체크메소드..라고 가정]\n\n이런 경우 작성할 수 있는 테스트 케이스는 몇 가지 종류가 있습니다. 다음은 그 한가지 예 입니다.\n\n     @Test(expected=PurchaseException.class)\n     public void testRegister_구매상품_선택_누락() throws Exception {\n         //Given\n         Purchase purchase = new Purchase(null);\n\n         //When\n         this.shoppingService.register(purchase);\n     }\n \n\n[구매 상품 누락시 적절한 업무 예외가 발생하는지 여부를 점검하는 코드]\n\n이 정도만 해도 괜찮습니다만, 구매할 상품이 지정되지 않았거나 구매 진행시점에 판매가 마감된 상황등을 테스트할 때도 비슷한 모양의 테스트 코드가 사용되기 때문에 Test의 정밀조준(Pin-point Targeting)이 이루어지지 않습니다.\n\n     @Test(expected=PurchaseException.class)\n     public void testRegister_판매마감된_상품_구매() throws Exception {\n         //Given       \n         Item item = TestFactory.saleClosedItem();\n         Purchase purchase = new Purchase(item);\n\n         //When\n         this.shoppingService.register(purchase);\n     }\n \n\n[판매가 마감된 경우에 대한 처리를 테스트 하는 코드. 앞의 테스트 코드와 동일한 그물로 잡아낸다.]\n\n위 코드 시리즈의 경우, 머리속으로 예상한 상황과는 다른 이유에 의해 PurchaseException이 발생해도 구분해 낼 방법이 없습니다. 이런 경우를 막기 위해서 메시지, 혹은 메시지 코드를 직접 비교하는 테스트 코드를 작성해 보겠습니다.\n\n     @Test\n     public void testRegister_판매마감된_상품_구매() throws Exception {\n         //Given       \n         Item item = TestFactory.saleClosedItem();\n         Purchase purchase = new Purchase(item);\n\n         //When\n         try {\n             this.shoppingService.register(purchase);           \n         } catch (PurchaseException pe) {\n             if( !pe.getMessage().equals( \"판매가 마감되었습니다.\"  ) ){\n                 // Then\n                 fail();\n             }\n             return;\n         }\n         //or Then\n         fail();\n     }\n \n\n[메시지 (코드)를 직접 비교해서 처리하는 테스트 케이스]\n\n우선 위 테스트 코드는 동작은 하지만 사실 몇 가지 찜찜함이 남습니다. (찜찜하지 않으면 안됩니다!)\n\n- 테스트 코드 내에 if구문을 이용한 메시지 캡처링(Message Capturing) 스타일을 사용했습니다. 이 경우 코드가 복잡해 지거나 테스트 코드 자체에 버그가 생기기 쉽습니다. (이크! 저도 한 번 생겼어요!)\n\n- 또한 fail 발생 조건을 계속 따라가봐야 하는 일이 발생하고 verify또한 명확하지가 않습니다.\n\n어떻게 해야 할까요?\n\n우선 (일반적인 설계자들이 제시하는) 가장 이상적인 방법은 설계를 조금 수정하는 겁니다. 다른 종류의 업무적인 예외상황이 같은 예외타입으로 발생하는 것은 좋지 않으니까, 경우에 맞는 예외클래스를 만들어 냅니다. 즉, 업무 규칙을 분석해서 예외 클래스를 적절히 재 구성해야 합니다.\n\n     @Test(expected=ClosedSaleException.class)\n     public void testRegister_판매마감된_상품_구매() throws Exception {\n         //Given       \n         Item item = TestFactory.saleClosedItem();\n         Purchase purchase = new Purchase(item);\n\n         //When\n         this.shoppingService.register(purchase);\n     }\n \n\n[새로 만든 예외 클래스 ClosedSaleException. 객체 지향이 의례 그렇듯 조금 더 분화되고 나뉜다]\n\n물론 예외코드를 enum 비슷하게 만들고, 동일한 예외로 쓰면 안될까요? 라고 물을 수도 있는데, 여기서 중요한건 에러코드문제가 아니라 예외발생상황 테스트를 어떻게 할 것이냐이기 때문에 해당 접근은 적절하지 않습니다.\n\n그런데 경우에 따라서는 매번 예외를 분화해서 만들기 곤란하거나 어려운 경우도 있습니다. 그럴때는 JUnit4에서 지원하는 Rule중에서 ExpectedException을 씁니다.\n\n     @Rule\n     public ExpectedException thrown = ExpectedException.none();   \n\n     @Test\n     public void testRegister_판매마감된_상품_구매() throws Exception {\n         //Given       \n         Item item = TestFactory.saleClosedItem();\n         Purchase purchase = new Purchase(item);\n\n         //Expect\n         thrown.expect(PurchaseException.class);\n         thrown.expectMessage(\"판매가 마감되었습니다.\");\n\n         //When\n         this.shoppingService.register(purchase);\n\n         //Else\n         fail();\n     }\n \n\n[ExpectedException을 사용한 경우. Expect, Else로 구분한다] \n앞의 if문을 이용한 경우보다 코드가 좀 더 간결해 진 걸 알 수 있습니다. 아쉬운 점은 JUnit의 Rule을 잘 모른다면 써야 할 생각을 떠올리지 못한다는 점입니다. 설계와 개발은 밀접하게 연결되어 있고, 때로는 Low Level 라이브러리와도 밀접하게 영향을 주고 받습니다. 잘 분화된 상위설계, 혹은 디테일한 아키텍처 프레임워크나 라이브러리, 어느 한 쪽만을 가지고는 좋은 설계와 코드가 나오기 어렵습니다. 어떻게 대응해야 할지, 사실 뾰족한 방법이 없습니다. 양쪽 방향을 다 공부하고 학습하고 적용해 보면서 Better way를 찾아볼 수 밖에요.\n\n위에 나열한 코드들도 사실 어떤게 정답이다! 라고 할 수없습니다. 무책임하게 들릴지도 모르겠지만 상황에 맞게 적절히 사용할 수 밖에 없습니다. 상황에 적절함이라는건 또 어떻게 알수 있는 건가?라는 의문이 들텐데요, 마찬가지로 학습을 통해 선임자들이 겪었던 실수의 반복을 줄이고 그 과정에서 얻게 된 스스로의 경험을 통해 이를 수 밖에 없는 것 같습니다.\n\n하지만 경험의 레벨를 떠나 어느 상황이 되었든, 기본적으로 고민하고 노력해야 하는 건, 우리가 작성하는 코드들은 읽기 편해야 한다는 점입니다. 물론 테스트 코드 포함해서 말입니다. 그리고 읽기 편하다는 건 자신에게만이 아니라 다른 사람들에게도 마찬가지여야 하고요.\n\n어쨌든, 이 글은 테스트 코드에 대한 이야기이니 이에 대한 제 경험을 이야기 해 본다면, 복잡한 테스트 코드는 곧잘 더 복잡한 업무코드를 만들어 내는 지름길이 되곤 했답니다. : )\n\nps.\nJUnit4의 Rule에 대해서는, 많은 분들이 좀 더 유용하게 쓰셨으면 하는 마음에 '책 일부 공개'라는 글([http://blog.doortts.com/155](http://blog.doortts.com/155 \"[http://blog.doortts.com/155]로 이동합니다.\"))에 PDF를 링크로 걸어놓았습니다. Rule를 포함해서 JUnit4의 몇 가지 고급 기능들에 대한 설명이 들어있으니 한 번 살펴보세요."
  },
  {
    "id": 172,
    "title": "[dW Review] 데이터 교환 표준형식 정하기 YAML & JSON",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1304173502000,
    "body": "> doortts | 2011-04-30 토요일 오후 11:25 | Better SW Development | [원본](http://blog.doortts.com/172)\n\n예전에는 데이터 교환에 XML을 많이 썼다면 요즘에는 JSON을 많이 씁니다. 아니, 많이 쓰는걸 넘어서서 JSON이 대세인것 같습니다. XML이 한참 잘 나갈때는 모든 설정파일들을 왠지 XML로 만들어야 할 것만 같았습니다.\n\n\n\n\n \n \n     \n         \n     \n     \n         \n             \n             \n                 \n                 \n             \n         \n     \n     \n         \n     \n \n\n\n\n[ibatis XML 구성 파일인 ibatis-config.xml]\n\n한참 XML을 광범위하게 쓰던 시절.. 그런데 어찌된 일인지 아무리 주입식 교육을 받아도 XML이 편한건지는 잘 모르겠다는 생각이 들곤했습니다. 복잡한 형태의 Document를 만들때는 그렇다고쳐도, 단순히 키/값 쌍으로 이루어진 데이터를 이용할때도 XML을 사용하는 건 확실히 가독성에 대한 정신적 시험에 들곤 합니다. 그런 사람이 비단 저 뿐만은 아니었겠지요.\n\n데이터 교환에 있어서 대안을 찾아보는 시도는 꽤 오래전부터 진행되었습니다.\n\nXML Matters: YAML improves on XML (2002년기사)\n[](http://www.ibm.com/developerworks/kr/library/x-matters48/index.html \"[http://www.ibm.com/developerworks/kr/library/x-matters48/index.html]로 이동합니다.\")[http://www.ibm.com/developerworks/xml/library/x-matters23.html](http://www.ibm.com/developerworks/xml/library/x-matters23.html \"[http://www.ibm.com/developerworks/xml/library/x-matters23.html]로 이동합니다.\")\n\n\nYAML은 괜찮은 시도였습니다. 스스로가 XML과 다른 마크업 언어로부터 배운 교훈들을 반영한 언어라고 말했던것 처럼 꽤 읽기 편하면서도 문서구조를 어느정도 지원해 줬습니다.\n\nYAML(YAML Ain't Markup Language)\n[http://www.yaml.org/spec/history/2001-05-26.html](http://www.yaml.org/spec/history/2001-05-26.html \"[http://www.yaml.org/spec/history/2001-05-26.html]로 이동합니다.\")\n\n\nRFC가 공개된 시점이 2001년이니 지금으로부터 무려 10년전에 만들어 졌네요. 처음에는 약어가 Yet Another Markup Language이었으나 후에 재귀적인 문장 YAML Ain't Markup Language으로 바뀌었습니다. : )\n어쨌든 10년전에 만들어졌는데 주변에서 그다지 안쓰는 것 보니 아마 앞으로도 그다지 안 쓸것 같습니다. XML 쓰거나 JSON 쓰거나 둘 중 하나로 갈 듯 싶습니다.\n\nJSON RFC(2006년)\n[http://www.ietf.org/rfc/rfc4627.txt?number=4627](http://www.ietf.org/rfc/rfc4627.txt?number=4627 \"[http://www.ietf.org/rfc/rfc4627.txt?number=4627]로 이동합니다.\")\n\n\n그런데 사실 YAML은 스스로 JSON과의 관계를 다음과 같이 밝히고 있습니다.\n\n\"JSON은 YAML의 서브세트입니다. JSON 배운 사람은 쉽게 더 확장 가능한 YAML로 넘어올수 있다지요!\"\n\n이건 \"내가 사실 네 형이다!\"급의 발언입니다. 그러면서 추가로 설명을 다음과 같이하고 있습니다.\n\n\"JSON과 YAML은 둘 다 사람이 읽기 편한 데이터 교환 포맷을 목표로 합니다. 다만, JSON은 간결함과 범용성에 초점을 맞추고 있고, YAML은 그와 동시에 임의의 고유 데이터 구조들에 대한 직렬화를 지원합니다\"\n\n\n[출처 : 1.3\\. Relation to JSON [http://yaml.org/spec/1.2/spec.html#id2759572](http://yaml.org/spec/1.2/spec.html#id2759572 \"[http://yaml.org/spec/1.2/spec.html#id2759572]로 이동합니다.\")]\n\n그리고 YAML 1.2기준으로 YAML파서는 JSON을 정상 파싱해 낸다고 하네요.\n재밌는건 YAML은 자신의 공식사이트([http://yaml.org/](http://yaml.org/ \"[http://yaml.org/]로 이동합니다.\"))를 YAML 구조로 만들어 놨다는 점입니다.\n\nYAML은 다음과 같은 XML을 그 아래와 같이 표현해 냅니다.\n\n\n\n  \n    \n    \n    \n  \n  \n    \n        2002-10-04\n        \n        \n        Draw\n    \n    \n        2002-10-06\n        \n        \n        White\n    \n  \n\n\n\n---\nplayers:\n  Vladimir Kramnik: &kramnik\n    rating: 2700\n    status: GM\n  Deep Fritz: &fritz\n    rating: 2700\n    status: Computer\n  David Mertz: &mertz\n    rating: 1400\n    status: Amateur\n\nmatches:\n  -\n    Date: 2002-10-04\n    White: *fritz\n    Black: *kramnik\n    Result: Draw\n  -\n    Date: 2002-10-06\n    White: *kramnik\n    Black: *fritz\n    Result: White\n\n\n괜찮네요.\n\n제가 이렇게 YAML소개를 했으니 YAML에 대해 관심이 조금 올라가셨을 수 있습니다. 그렇다면 다음 글을 읽어보시길 권해드립니다. YAML파는 이야기 아닙니다. :)\n\nXML Matters: Ajax: XML의 다양한 대안들 (한글)\n[http://www.ibm.com/developerworks/kr/library/x-matters48/index.html](http://www.ibm.com/developerworks/kr/library/x-matters48/index.html \"[http://www.ibm.com/developerworks/kr/library/x-matters48/index.html]로 이동합니다.\")\n\n\n위 기사에는 특정 포맷/언어를 이야기 하지 않고, 우선 XML의 대안들의 기준에 대해 이야기 합니다.\n\n무엇을 선택하여야 하는가?\n- 우선, 가장 단순한 방식 또는 가장 복잡한 방식으로 포맷을 사용할 수 있다.\n- 생성, 읽기, 파싱, 프로세스 중에서 어떤 것이 가장 복잡한 것인지를 파악해야 한다. 예를 들어, XML은 그 자체로 복잡한 편이지만, 파서가 브라우저에 이미 있기 때문에 파싱은 오히려 단순하다.\n- 복잡성은 데이터의 유형에 상당히 많이 의존한다. 스프레드시트나 데이터베이스처럼, 고정된 구조를 갖고 있는가? 워드 프로세싱 문서나 블로그 포스트처럼 유연한(loosely) 구조를 갖고 있는가? 항공기 매뉴얼 같은 대형 문서인가, 응답 코드 같은 작은 데이터 조각인가? 데이터 세트가 크다면, 이것을 한 번에 보낼 것인가, 아니면 필요할 때마다 작은 조각 단위로 보낼 것인가? 큰 데이터를 작은 조각 단위로 나누는 것은 얼마나 어려우며, 받는 쪽에서, 작은 조각들을 올바르게 조합하려면 얼마나 많은 정보가 필요한가?\n\n\n자신에게 맞는걸 선택하라는 이야기인거죠. 이때 다음과 같은걸 고려하라고 이야기 합니다.\n\n- 장황함/대역폭(특별한 경우를 제외하고는, 이러한 요소는 여러분이 생각하는 것만큼 중요하지 않다.)\n- 가독성(작성 가능성, 관리성)\n- 파싱 난이도(클라이언트 측과 서버 측)\n- 파싱 속도(네이티브 대 스크립팅)\n- 정보 손실(ordered pairs -> dictionary -> sets)\n- 유연성(가끔은, 덜 유연한 것이 더 나을 때도 있다.)\n- 언어 이식성(얼마나 많은 언어들을 사용할 수 있는가?)\n- 정확성(포맷에 어느 정도 순응하는가?)\n- 라운드 트리핑 (Round-Tripping) (Markdown -> XHTML -> Markdown, 얼마나 많은 데이터 손실이 있는가?)\n\n\n요즘 대세에 맞춰서 단순 키/값 교환의 경우 JSON을 선택하시는 것이 좋지만, 애플리케이션을 만든다면 근간이 되는 데이터 구조선택에 좀 더 고민할 필요가 있는것 같습니다. 무조건 XML은 제외도 별로 좋은건 아니겠죠? : )\n\n\n\n  {\n     \"이름\":  \"테스트\",\n     \"나이\":  25,\n     \"성별\":  \"여\",\n     \"기혼\":  true,\n     \"주소\":  \"서울특별시 양천구 목동\",\n     \"특기\":  [\"농구\",  \"도술\"],\n     \"가족관계\":  {\"#\":  2,  \"아버지\":  \"홍판서\",  \"어머니\":  \"춘섬\"}\n     \"회사\":  \"경기 안양시 만안구 안양7동\"\n  }\n\n \n\n\n\n[읽기 편한 JSON! 하지만 한계도 많다. 그리고 꼭!! 쌍 따옴표를 키/값 모두에 적길 권장한다!]\n\n데이터 구조 선정에 참고할만한 기타 기사\n\n웹 프로젝트를 위한 간단한 JSON 제어기 빌드하기\n[http://www.ibm.com/developerworks/kr/library/wa-jsoncontroller/index.html](http://www.ibm.com/developerworks/kr/library/wa-jsoncontroller/index.html \"[http://www.ibm.com/developerworks/kr/library/wa-jsoncontroller/index.html]로 이동합니다.\")\n\nAjax 마스터하기, Part 10: 데이터 전송에 JSON 사용하기 (한글)\n[http://www.ibm.com/developerworks/kr/library/wa-ajaxintro10/](https://www.ibm.com/developerworks/kr/library/wa-ajaxintro10/ \"[https://www.ibm.com/developerworks/kr/library/wa-ajaxintro10/]로 이동합니다.\")\n인상깊은 문구: \"거듭 말하지만, 여러분은 우선 name/value 쌍을 사용하는 것을 늘 생각해야 한다. 이것은 대부분의 비동기식 애플리케이션에서 생기는 문제들에 대한 가장 간단한 솔루션이고, JavaScript에 대한 기본적인 지식만 있어도 간단히 해결된다.\"\n"
  },
  {
    "id": 173,
    "title": "[dW Review] Java Database Connectivity에 대해 모르고 있던 5가지 사항",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1304175359000,
    "body": "> doortts | 2011-04-30 토요일 오후 11:55 | Better SW Development | [원본](http://blog.doortts.com/173)\n\n예전에는 JDBC를 직접 이용해서 개발을 했던 적이 있었습니다. 누가 잘 짰다는 코드가 있으면 그걸 받아다가 만들기도 했고, 직접 개선해서 라이브러리화 해서 쓰기도 했습니다. 그러다 프레임워크라는 것들이 나오기 시작하면서 DB를 다루는 부분들은 대부분 라이브러리를 이용하는 걸로 바뀌었습니다. 그래서 오히려 요즘엔 JDBC에 대해서 배울일이 거의 없어졌습니다. 좋기도 하고 나쁘기도 한 일인것 같습니다. 비슷한 상황으로는 예전에는 자바 배울때 컴파일하는 방법도 열심히 배웠었습니다만, 요즘엔 그냥 이클립스등의 IDE를 쓰면 알아서 하니까 몰라도 됩니다. 마찬가지로 좋은 일이기도 하고 나쁜일이기도 합니다.\n\n물론 튜닝을 위해서 특정 옵션을 주어야 하거나, 빌드 작업을 하는 담당자일 경우 다시 명령행에서 부터 치열하게 배워야 하지만 극소수에 불과합니다.\n\nIBM기사중에서 어떤 기사를 리뷰할까 검색하다가 재밌는 기사가 하나 보였습니다. \"5가지 시리즈\"라고 불리는 시리즈들이 있는데 그 중 하나인 JDBC에 대해 모르고 있던 5가지 사항이라는 기사입니다.\n\nJava Database Connectivity에 대해 모르고 있던 5가지 사항\n[http://www.ibm.com/developerworks/kr/library/j-5things10/j-5things10.html](http://www.ibm.com/developerworks/kr/library/j-5things10/j-5things10.html \"[http://www.ibm.com/developerworks/kr/library/j-5things10/j-5things10.html]로 이동합니다.\")\n\n\n기사 소개문구는 이렇습니다.\n \" JDBC 또는 Java™ Database Connectivity는 전체 JDK에서 가장 많이 사용되는 패키지 중 하나이지만 아직까지도 최신 기능을 비롯한 다양한 기능을 충분히 활용하는 Java 개발자는 소수에 불과합니다.\"\n\n우선 아마 많은 분들이 JDBC가 무엇의 약어였었는지부터 다시 되새겨 보게 되지 않을까 생각합니다. 스프링 프레임워크를 쓰시는 분들은 JDBC템플릿을 거의 쓰실테고, 더 나아가서는 JPA계열의 ORM을 쓰실테지만, 옛 기억을 되살려보면서 한 번 읽어보시는 것도 좋을 것 같습니다. 저를 포함해서 대부분의 개발자들의 JDBC지식은 대략 JDBC 2.0정도까지의 지식이지 아닐까 싶습니다. 현재 스펙으로는 JDBC 4.0까지 나왔는데 몇 버전까지의 기능을 아시는지도 확인해 보시는 것도 재밌을 것 같습니다. 다만, JDBC는 스펙일뿐이라서 벤더들이 드라이버를 지원해주어야 정상적으로 사용할 수 있습니다. JDBC 4.0 스펙이 2006년에 나왔습니다만, 지원하는 벤더들이 많지 않다고 합니다.\n\n심지어 자바 공식사이트의 최신 문서에는 아직 JDBC 3.0까지만 소개되어 있습니다. 3.0은 1.5(java5)랑 같이 나왔고, 1.6때 JDBC 4.0이 같이 나오기로 했었는데 확인 안했더니 어떻게 된 일인지 지금으로서는 모르겠네요. (어쩌면 오라클이 4.0드라이버를 지원 안해서 일수도 있습니다. 흠..)\n[http://download.oracle.com/javase/6/docs/technotes/guides/jdbc/](http://download.oracle.com/javase/6/docs/technotes/guides/jdbc/ \"[http://download.oracle.com/javase/6/docs/technotes/guides/jdbc/]로 이동합니다.\")"
  },
  {
    "id": 175,
    "title": "JCO 2011에서 MongoDB with Play! 라는 제목으로 발표합니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1308402566000,
    "body": "> doortts | 2011-06-18 토요일 오후 10:9 | Better SW Development | [원본](http://blog.doortts.com/175)\n\n내일 코엑스에서 열리는 2011년 JCO ([http://www.kjdc.org](http://www.kjdc.org/))에서 \"MongoDB with Play!\"라는 제목으로 발표를 진행합니다\n시간은 4시 15분 부터 약 50분간 진행할 예정입니다. (트랙2 세션4)\n\nMongoDB의 큰 카테고리에 속하는 NoSQL이라던가 MongoDB에 대한 내용은 13:05분부터 진행되는 김형준님의 \"클라우드 시대의 데이터베이스 NoSQL 개념 및 사례(트랙4, 세션2)\"와 이용혁님의 LBS with MongoDB (몽도디비를 이용한 위치기반서비스, 트랙2, 셰션4)에서도 들으실 수 있습니다.\n\n저는 JVM Based Web Framework중 구글 구룹스에서 가장 활발한 Top 5 프로젝트에 속하는 Play Framework ([playframework.org](http://playframework.org \"[http://playframework.org]로 이동합니다.\")), 간편한 사용법으로 NoSQL의 기대주로 떠오르고 있는 MongoDB ([mongodb.org](http://mongodb.org \"[http://mongodb.org]로 이동합니다.\")). 이 두 오픈소프 프로젝트에 대해 짧게 소개하고 함께 연동해서 짧은 시간안에 서비스를 만들어 내는 과정을 보여드릴 예정입니다.\n\n짧은 시간이라 얼마나 많은 걸 보여드릴수 있을지 모르겠지만, 각각 기능들을 급하게 소개하기 보다는 좀 더 생각할 꺼리를 남겨서 더 고민하고 더 찾아보아야 겠다는 마음이 들 수 있는 시간이 되는, 생각을 변화시키는 시간이 되었으면 합니다.\n\n그럼 편안한 주말 되시고, 내일 뵐 수 있는 분들은 내일 뵙겠습니다.\n\n:D\n\n![MongoPlay1.png](/files/21851)\n\n![MongoPlay2.PNG.png](/files/21853)\n\n![MongoPlay3.png](/files/21852)\n\n#### Comments\n\n발표 잘 하셨습니까? ㅎㅎ 저도 듣고 싶었는데 ㅠㅠ 흑흑;;\n\n [is윤군](http://helols.tistory.com) | 2011-06-22 수요일 오전 9:3\n\n--\n\n여어~ 윤군!\n\n고생이 많아~ 먼곳에서!\n고생해서 만든 시스템\n잘 썼어~\n\n여름에 한국올 줄 알고 기대했는데\n좀 아쉬워~~\n\n크~~흑~\n\n스크린 캐스트라도 만들어 볼게~\n\n [doortts](http://blog.doortts.com) | 2011-06-22 수요일 오후 2:7\n\n--\n\n바쁘실텐데 스크린 캐스트는 pass하시고 ㅎㅎ\n담에 만나면 ㅎㅎ 이야기 해주세요 ㅎ 라이브로 ㅎ\n\n건강하시구요!! :-)\nfeedback 1등 먹으셨던데요 ㅎ\n\n [is윤군](http://helols.tistory.com) | 2011-06-22 수요일 오후 4:39\n\n--\n\nfeedback 1등이라...\n난 그냥 시킨대로 페이지 안내 했을 뿐이고...\n사람들은 그저 채팅하면서 놀았을 뿐이고..\n\n\"몽고행 비행기 추락..  \"  이런 댓글도.. -_-;;\n\n그런데 참!\n피드백 페이지는 이제 JCO끝났으니 계속 down 상태로 놔두는 건가?\n\n [doortts](http://blog.doortts.com) | 2011-06-22 수요일 오후 9:59\n\n--\n\nSDEC인가 그 머 다음주에 하는 컨퍼런스에서도 쓸꺼라고 .. 하던데요..그래서 아마 계속 살려둘 것 같구요 ㅎㅎ 기능 강화 시키고 있어요 ㅋㅋ 일등 페북로그인 기능넣기?ㅎㅎ\n\n [is윤군](http://helols.tistory.com) | 2011-06-23 목요일 오전 8:10\n\n--\n",
    "attachments": [
      {
        "id": 21851,
        "name": "MongoPlay1.png",
        "hash": "fabc1ca0d52bfa1ed976baa221fb34123f234ef1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 108195,
        "containerId": "12340"
      },
      {
        "id": 21852,
        "name": "MongoPlay3.png",
        "hash": "5b0d0cd875fa8fe4f22f6bd13355691bae05a141",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 411483,
        "containerId": "12340"
      },
      {
        "id": 21853,
        "name": "MongoPlay2.PNG.png",
        "hash": "9a66d6cf5321bf0e5c335543a97960b80213e6d1",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 448780,
        "containerId": "12340"
      }
    ]
  },
  {
    "id": 176,
    "title": "JCO 2011 \"MongoDB with PLAY!\" 발표자료",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1309127400000,
    "body": "> doortts | 2011-06-27 월요일 오전 2:18 | Better SW Development | [원본](http://blog.doortts.com/176)\n\n지난 6월 19일 COEX에서 진행되었던 JCO 2011에서 제가 진행했던 세션 \"MongoDB with PLAY!\"의 발표자료입니다.\nNoSQL/MongoDB관련해서는 세션들이 이미 있었어서 저는 MongoDB보다는 Play Framework을 중심으로 다뤘습니다. MongoDB는 MongoDB자체의 Feature들 보다는 쓰기 편한 Data Store정도로 보았습니다.\n\n사실 두 제품보다 좀 더 중심이 주제는 \"생산성\"이었고요.라이브 코딩으로 진행하는 부분은 역시나 어렵지만 재밌었습니다. 다만 제가 욕심을 과도하게 부렸어서 시간을 10여분 가량 더 쓰고도 다 보여드리지 못한 부분은 아쉬운 점이었습니다.\n\n마지막 타임이었기도 하고 쫓기듯 진행하진 않으려 했었는데, 그래도 그 와중에 여유마저 잃지는 않은 걸 다행으로 생각합니다. :D MongoDB와 Play Framework에 대해서는 차후에 블로그에서 좀 더 다루도록 하겠습니다.\n\n준비하시고 진행하셨던 분들 모두 고생많으셨습니다. 저도 많이 배웠습니다.\n감사합니다.**[Mongodb with play](http://www.slideshare.net/doortts/mongodb-with-play \"Mongodb with play\")**\n\n\n\nView more [presentations](http://www.slideshare.net/) from [doortts](http://www.slideshare.net/doortts)\n\n\n\n#### Comments\n\n그날 발표 정말 잘 들었습니다. ^^\n요즘 play framework 짬짬이 공부중인데, 막히는 부분이 많이 있습니다.\n시간이 허락되었더라면, 만드는 과정을 보고 따라해보고 싶었는데, 그 점이 너무 아쉬웠어요. ^^;\n블로그에 관련자료 올려주시면 공부하는데 많은 도움이 될 듯 합니다. ^^\n\n [사자고구미](http://sajagogumi.tistory.com) | 2011-06-27 월요일 오후 12:22\n\n--\n\n부끄러운 발표, 경청해 주셔서 감사합니다. 저도 시간이 부족하다는 핑계로 많은걸 보여드리지 못해 많이 아쉬웠습니다. Play Framework관련해서는 조만간 학습한 자료를 공개하도록 하겠습니다. 그럼 좋은 하루 되세요!\n\n [doortts](http://blog.doortts.com) | 2011-06-28 화요일 오후 10:34\n\n--\n\n저도 발표 잘 들었습니다.^^\n정말이지 그날은 시간이 조금만 더 있었으면 하는 마음이 들더군요.\n좋은 자료 감사합니다.^^\n\n [서영아빠](http://westzero.net) | 2011-07-03 일요일 오전 12:52\n\n--\n\n저도 발표 잘 들었습니다\n\n [jogo do sonic](http://sonic.jogosloucos.com.br/) | 2011-08-30 화요일 오후 4:6\n\n--\n"
  },
  {
    "id": 177,
    "title": "[dW Review] 닐포드의 \"혁신적인 아키텍처와 창발적 설계\"",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1309271871000,
    "body": "> doortts | 2011-06-28 화요일 오후 11:37 | Better SW Development | [원본](http://blog.doortts.com/177)\n\n쏘트웍스(ThoughtWorks = 생각한데로 이루어지리라!)의 엔지니어인 닐 포드가 IBM DeveloperWorks(개발자가 흥하리라!)에 부정기적으로 연재하던 기고 글 \"혁신적인 아키텍처와 창발적 설계\"시리즈가 지난 1월 18일에 올라온 \"Emergent design in the wild(한글번역은 '미지의 창발적 설계'로 되어있는 글)\"을 끝으로 마무리가 되었다.\n\n어느 정도의 사람들이 얼마만큼 관심을 기울이고 있었는지는 모르겠지만, 개인적으로는 경험많은 엔지니어의 긴 시간에 걸쳐 작성된 글이 마무리가 되었다는 데에 묘한 뿌듯함과 감동을 느낀다. 2년이면 아마 모르긴 몰라도 작성자 자신도 여러가지 내/외적인 변화를 겪기에 충분한 시간이 아니었을까 싶다. 원문 영어는 사실 좀 만만치 않은 문장들이 섞여 있지만, 다행스럽게도(정말??) 시리즈의 일부가 한글로 번역되어 제공되고 있다.\n\n혁신적인 아키텍처와 창발적 설계: 미지의 창발적 설계\n창발적 설계의 시점, 이유 및 방법\n[http://www.ibm.com/developerworks/kr/library/j-eaed19/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/j-eaed19/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/j-eaed19/index.html?ca=drs-]로 이동합니다.\")\n\n\n시리즈의 첫 글에서 애플리케이션 아키텍처와 엔터프라이즈 아키텍처를 구분해 정의하는 것 부터 시작해, 다양한 기술 내외적인 이야기를 다뤘었다. 때로는 지루하기도 하고 때로는 고개를 끄떡이게 만들어주기도 하는 글들로 이루어져 있다.\n\n위 링크로 적어놓은 마지막 연재글에는 (개인적으로는 별로 좋아하지 않는) 럼스필드의 문구로 시작한다.\n\"우리는 우리가 모르는게 있다는 것을 안다. 그런데 어떤 것들은 우리가 모르는게 있다는 것을 모른다.\"\n\n어느정도 지식을 쌓은 다음에는 자신이 모르는 것이 무엇인지를 발견하는 것이 굉장히 중요하다.\n닐 포드의 이 마지막 연재글은 그 간 약 18회에 걸쳐 연재했던 자신의 글을 요약정리하면서 끝내고 있다.\n\n번역이 다소 매끄럽진 않지만, 그건 원문의 영향도 크다는 것을 감안해서 힘들지만 차분하게 읽어보기를 권한다. 어쩌면 혹자는 늘 그래왔던 진부한 이야기라 칭할 수도 있겠지만, 오래된 엔지니어의 경험담과 통찰의 일부를 이렇게 적은 노력으로 쉽게 듣을 수 있다는 건, 대륙 너머의 이름모를 후배 엔지니어들에게는 작은 축복 일 수도 있다."
  },
  {
    "id": 178,
    "title": "[dW Review] MongoDB + Morphia Project",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1309360365000,
    "body": "> doortts | 2011-06-30 목요일 오전 12:12 | Better SW Development | [원본](http://blog.doortts.com/178)\n\nMongoDB는 도큐먼트(document)라 불리는 JSON like 데이터 구조를 기반으로 동작한다. JSON이 아니라 like라 부르는 이유는 JSON과 동일하지 않고 좀 더 확장된 몇 가지 키워드와 문법을 자체적으로 지원하기 때문이다. (참고: [데이터 교환 표준형식 정하기 YAML & JSON](http://blog.doortts.com/172 \"[http://blog.doortts.com/172]로 이동합니다.\"))\n\nJSON 구조자체가 심플하기때문에 MongoDB의 데이터 구조도 (물론 상대적이지만)가독성 높은 형태로 유지된다. 그런데 사실 살짝 아쉬운 부분이 하나 있는데 바로 자바 기반개발시에는 보통 데이터구조의 기반으로 JavaBeans스러운 엔티티(Entity)를 흔히 쓴다는 점이다. 데이터 스토어와 연결시키는 방식으로 ORM(객체관계맵퍼)툴이 스포트라이트를 받았던 것도 마찬가지 이유였다.\n\n뜬금없는 여기서 잠깐!\n\nEntity는 엔터티라 읽어야 하는것 아닌가? 라고 그 와중에 문맥을 끊어서 불편함을 느낄수 있는 독자를 위한 한 마디.\n발음상은 엔터티가 맞는데 외래어 표기상 엔티티라고 해야 한다고 한다. 그래서 우리는 WikiLeaks를 위키리크스..라고 읽어야 하는 딜레마에 빠지는 거다.. (젝일!)\n\n\nMongoDB를 자바 드라이버를 이용해서 사용한다면, 문서를 만들어서 저장하려면 다음과 같은 식의 코드가 나온다.\n\n\n\n{\n    \"name\"  :  \"MongoDB\",\n    \"type\"  :  \"database\",\n    \"count\"  : 1,\n\n     \"info\"  : {\n                x : 203,\n                y : 102\n              }\n\n  }\n\n\n\n[위와 같은 문서를 저장하려 한다고 가정했을 때 eofir 아래와 같은 자바코드가 필요해진다.]\n\n\n\nclass MyEntity {\n     String name;\n     String type;\n     int count;\n     Info info;\n\n     public MyEntity(String name, String type, int count, Info info){\n         this.name = name;\n         this.type = type;\n         this.count = count;\n         this.info = info;\n     }\n\n  ...getters...\n  ...setters...\n }\n\n == runtimeCode ==\n\n MyEntity entity = new MyEntity(....);\n\n ...\n\n BasicDBObject doc = new  BasicDBObject();\n\n doc.put(\"name\",  myEntity.getName());\n doc.put(\"type\",  myEntity.getType());\n doc.put(\"count\", myEntity.getCount());\n\n BasicDBObject info = new  BasicDBObject();\n\n info.put(\"x\", myEntity.getInfo().getX());\n info.put(\"y\", myEntity.getInfo().getY());\n\n doc.put(\"info\", info);\n\n coll.insert(doc);\n\n\n\n[뭔지 몰라도 괜찮다. 그냥 좀 복잡하구나.. 정도로만 이해되어도 OK!]\n\n즉, Entity를 MongoDB를 이용해 영구저장하려면, Helper클래스를 따로 만들거나 아니면 꽤나 번잡스러워진다. 물론 이런 생각을 당.연.히! 다른 개발자들도 생각했다. ORM은 아니만 비스무리 한걸 만들었다. 바로 Morphia라 불리는 라이브러리다. Morphia사이트([](http://code.google.com/p/morphia/)[code.google.com/p/morphia](http://code.google.com/p/morphia/ \"[http://code.google.com/p/morphia/]로 이동합니다.\"))에 가보면 바로 한 줄로 Morphia가 뭘 하는건지 설명해 놓았다.\n\nMorphia is a lightweight type-safe library for mapping Java objects to/from MongoDB:\n모피아는 자바 객체와 몽고DB를 연결해 주는 경량 타입세이프 라이브러리\n\n\nMorphia를 이용하면 위쪽의 코드가 대략 아래와 같은 식으로 바뀐다.\n\n@Entity\nclass MyEntity {           ... 위와 동일\n    @Embedded\n    Info info;\n    ... 이하 위와 동일\n}\n\n== runtimeCode ==\n\nMyEntity entity = new MyEntity(....);\n\nMorphia morphia = new Morphia();\nmorphia.map(MyEntity.class).map(Info.class);\nDatastore ds = morphia.createDatastore(\"myDB\");\n\nds.save(myEntity);\n\n\n\n이론상(..)으로는 자바 Entity 저장이 훨씬 간단해 진다.\n\n그리고 한가지 여담을 덧붙이자면, 원래 지난 JCO에서 발표하려던 주제의 초기 제목은 MongoDB with Play! by Morphia with Siena 였다. ([Siena](http://sienaproject.com \"[http://sienaproject.com]로 이동합니다.\")에 대해서는 추후에 여력되면 다시..)  시간관계상, 그리고 주제관계상 결국 Morphia와 Siena는 발표에서 빠졌었지만, MongoDB와 자바 Entity를 사용한다면 한 번쯤 봐둘만한 프로젝트들이다.\n\n이렇게 이야기 해도 막상 사이트가서 레퍼런스나 튜토리얼을 보는 것이 쉽지 않은데, 마침 최근 dW 기사로 Morphia의 기사가 소개되었다.\n\nMorphia 및 MongoDB를 통한 도메인 모델 지속성\nMorphia를 사용하여 MongoDB로 맵핑된 Java 도메인 모델의 지속, 로드, 삭제 및 쿼리\n[](http://www.ibm.com/developerworks/kr/library/j-morphia/index.html?ca=drs-)[http://www.ibm.com/developerworks/kr/library/j-morphia/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/j-morphia/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/j-morphia/index.html?ca=drs-]로 이동합니다.\")\n\n\n한글우리말로 친절히 번역된 기사가 나왔으니 뭘 더 바라겠는가!\n\n아직은 Morphia자체가 Experimental에 더 가까운 관계로 국내에서 업무적으로 사용한 실사례를 들어보진 못했다. 즉, 쓰지 말고 기다려 보자는 아니고, 아직까진 사례를 만들어서 교훈이 필요한 상황이라고 생각하면 좋겠다. 사실 이쯤되면 늘상 떠오르는 아쉬운 점 하나가 있다.\n\n\"만들기는 커녕 가져다 쓰는것도 이리 어려우니 우리는 언제쯤 그들을 앞서나갈 것인가?\"\n\n뭐.. 차차 나아지겠지.. 라며 혼잣말로 위안을 삼아본다.\n\nPs.\nMongoDB가 편리성으로 주목을 많이 받았지만, 반면에 성능적/기능적 한계로 인해 요즘엔 오히려 Redis([redis.io](http://redis.io/ \"[http://redis.io/]로 이동합니다.\"))가 급 부상하고 있는것 같다. 오히려 더 간결하기도 하고 말이다. 다음 관심은 Redis로 확정이다! :D\n\n#### Comments\n\n외래어 표기등에 신경을 쓰시는 것 같아서 한가지 더 첨언을 하자면..\n'한글로 친절히 번역된 기사' ->  '한국어(혹은 우리말)로 친절히 번역된 기사'가 옳습니다.\n\n B | 2011-06-30 목요일 오전 9:36\n\n--\n\n아! 감사합니다. :D 이야기 주신대로 우리말이라는 표현이 더 좋을 것 같다는 생각이 들었습니다.\n\n [doortts](http://blog.doortts.com) | 2011-06-30 목요일 오후 2:47\n\n--\n\n까칠한 B님이시군요..!! ㅋ\n\n [is윤군](http://helols.tistory.com) | 2011-07-02 토요일 오후 6:10\n\n--\n\n아.. 글 제목을 보는 순간, 역시.. 라는 단어가 떠올랐습니다. ^^\n조금전까지 gae + play 실습을 해보고, MongoDB 관련모듈인 morphia 정보를 찾아보려던 중이였습니다.\n이미 올려주셨군요. 잘 읽었습니다. ^^\n한가지 질문드리고 싶은 부분이 있는데요. 구글 데이터스토어인 BigTable과 MongoDB 의 사용상 편리함이나 성능이나.. 간단 비교를 부탁드려도 될까요?\n한가지를 정해서 쭉 공부해보고 싶은데, 고수님의 조언을 듣고 싶습니다.\n\n [sajagogumi](http://sajagogumi.tistory.com) | 2011-07-01 금요일 오전 12:45\n\n--\n\n안녕하세요?\n댓글이 있는걸 미처몰랐습니다. 죄송합니다.\n\n아. 우선 이야기주신 부분은 저도 뭐라 이야기 드릴 수 있는 분야가 아니라서 뭐라 드릴 말씀이 없네요.\n\n다만 play와 mongodb를 사용하는 것은 '가능하다'수준이지 효율적인지 여부는 아직 나와있는 자료가 없습니다.\n\n저의 경우도 mongodb를 선택한 것은 데이터를 저장하고 유지 관리하는데 있어서의 사용상 편리함이 주된 이유였고요. \n\nmongodb의 경우 관련 정보를 접하게 되면 공유하도록 하겠습니다.\n\n현재 관련해서는 '다음'에서 발표한 자료가 있으니 참고하시면 좋을 것 같습니다.\n\nMy아고라 MongoDB 적용사례 \nhttp://www.platformday.com/2011/pages/introduce#l11\n\n그럼 좋은 하루 되세요.\n감사합니다.\n\n [doortts](http://blog.doortts.com) | 2011-07-31 일요일 오후 7:48\n\n--\n"
  },
  {
    "id": 179,
    "title": "[dW Review] LAMP 애플리케이션을 조정하는 다섯 가지의 간단한 방법",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1309444885000,
    "body": "> doortts | 2011-06-30 목요일 오후 11:41 | Better SW Development | [원본](http://blog.doortts.com/179)\n\n한때 AMP라 불리는 개발세트가 있다. Apache webserver + MySQL + Php의 앞 글자를 따서 AMP라고 불렀다. 최근에는 리눅스 OS까지 붙여서 LAMP라 부른다. 하지만, 발음은 마치 RAMP처럼 들리기 때문에 오히려 단어가 더 친근하게 느껴지기도 한다.\n\nPHP는 자바가 웹 애플리케이션 개발언어로 인기를 얻게 되면서 한동안 웹 애플리케이션 개발 시장에서 저평가 받다가, 2000년대 중후반을 넘어서며 프레임워크들의 발전/발명과 함께 다시금 인기가 증가한 묘한 개발언어이다.(물론 개인적인 느낌탓일 수도 있겠지만 어쨌든.) 아마 국내에서 ASP가 초큼 무시당하다가 싸이월드가 ASP로 만들어진 초거대 서비스임을 자처하면서 ASP 개발자들이 자부심을 느꼈던 것과 비슷하게, 전세계 7억명이 넘는 사람들이 사용하는 페이스북이 PHP로 되어있다는 사실이 PHP인기 지속의 한 원동력이 되기도 했다.\n\n게다가 PHP가 버전 5를 들어서며 객체지향 프로그래밍 지원도 강력해 져서 더 높은 수준의 OO개발이 가능해졌다.\n\n(아. 근데 내가 지금 하려는 이야기가 이건 아닌데...)\n\n![mostpopularframework2011.jpg](/files/21854)\n\n출처: http://www.php-developer.org/most-used-php-framework-the-popular-top-7-list-in-year-2011/ [인기로는 Zend이지만, 떠오르는 기세로는 Yii나 Codeigniter를 꼽고 싶다]\n\n이번달 올라온 IBM dW기사중에  \"LAMP 애플리케이션을 조정하는 다섯 가지의 간단한 방법\"이라는 기사가 있다.\n\n LAMP 애플리케이션을 조정하는 다섯 가지의 간단한 방법\n[http://www.ibm.com/developerworks/kr/library/os-5waystunelamp/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/os-5waystunelamp/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/os-5waystunelamp/index.html?ca=drs-]로 이동합니다.\")\n\n\nPHP와 MySQL 중심의 기사이긴 하지만 사실 그 근간에 있는 내용들은 다른 애플리케이션을 작성할때도 참고로 삼을 만한 조언들이 몇 가지 있다.\n그리고 그 조언들 중 또 몇 가지는, 2:8의 법칙처럼 간단하면서도 크게 효과를 볼 수 있는 접근 방법이기도 하다.\n그럼, 어떤 메시지인지 살펴보자.\n\n1\\. 파싱과 컴파일은 비용이 많이 드는 작업이니까 줄일수 있으면 좋다.\n다르게 해석하면 오퍼레이션 단계를 줄이거나 없애는 것이 도움이 된다.\n: dW 기사에서는 \"opcode 캐시\"라는 내용에서 확인 가능.\n\n2\\. 로드밸런싱. 즉, 헤비한 트래픽이 발생하는 건 티어(tier)를 분리시킨다.\n: \"데이터베이스 최적화 -> 데이터베이스를 자체 시스템에 넣기\"에서 내용 확인가능\n\n3\\. 적절한 모델링과 인덱스가 만들어져야 한다.\n: \"올바르게 테이블 설계 및 인덱스\" 에서 확인 가능\n\n4\\. 캐시 적극사용\n: \"opcode 캐시\", \"효율적인 데이터 캐시\" 항목에서 내용 확인\n\n약간 중구난방같은 느낌의 팁들이긴 하지만 어쨌든 어떤 애플리케이션을 만들든, 한 번쯤은 고민해 볼 만한 내용이다.\n\n음.. 그런데 혹시 팁 치고는 내용의 수준이 너무 낮다고 여겨지는가?\n그런 느낌이 드는 것 치고는 현장에서는 훨씬 더 흔히 무시되는 경우가 많다는 걸 알아줬으면 좋겠다.\n\n때로는 우선 내 주머니 안부터 살펴보는 습관이 필요한 법이다. :D\n\n{lang: 'ko'}\n\n#### Comments\n\nLAMP는 제가 하던 회사가 초기(2000년도 전후)에 회사 웹 서비스 구축 기술 스택으로 내세웠던 이름이죠. 한동안 높은 생산성 덕에 잘 써먹었지만 (물론 MySQL은 거의 안 쓴) 고유의 성능 문제를 해결할 길이 없어 포기... 암튼 나중에 저 이름이 퍼지는 거 보면  \"사람들 생각이 다 거기서 거기군\"하는 생각이...\nopcode 캐시로 성능을 많이 높일 수 있기는 하지만 불안해요. 코드가 변경된 걸 인식하지도 못하고 메모리 누수가 생기기도 하고 꼬이기도 하고... 애플리케이션 설정도 매번 초기화 되기 때문에 메타 프로그래밍이 어렵고 opcode 캐시도 무척 불안해요. 리눅스, 윈도, 솔라리스 이외에서는 설치도 잘 안 되요.\n원래 php의 기업용 시장의 전략은 java나 .net의 프론트엔드 기술로 자리매김하는 거였는데 갑자기 ror이 뜨는 바람에 symfony나 cakephp 같은 놈이 득세를...\n\n [박성철](http://me2day.net/geekinside) | 2011-07-01 금요일 오전 9:31\n\n--\n\n상표등록이라도 하지 그러셨어요~ \n\n뭐. 사실 이야기 하신대로, 외국이나 우리나라나 생각하는거 거의 비슷해요. 다만 그들과 우리가 처한 상황이 다르다보니, 그리고 닭이냐 달걀이나 논란이겠지만 어쨌든 지금은 따라가기도 벅찬 수준인 경우가 많은것 같아요. 그러다 보니 무의식중에 국내 엔지니어가 평균적이고 상대적으로 외국 엔지니어들에 비해 못 미치는 느낌을 주는것 같고요.\n\n실제론 그렇지 않은데 말입니다.\n\n [doortts](http://blog.doortts.com) | 2011-07-02 토요일 오후 5:10\n\n--\n\n새로운 방향을 제시하면 이미 많은 이들이 다 알고 있다고 이야기한다. 다 알고 있는 기술이지만 실상 필요할 때 적용하지는 않는다. 이것이 우리의 현실인 듯.. 알고 있으면 적절한 곳에 활용해야지 왜 한가지 방법으로만 개발하냐고?\n\n아무리 하찮다고 생각하는 것이라도 실제 사용할 때 의미가 있고, 가치가 있는 법..\n\n 자바지기 | 2011-07-01 금요일 오전 9:40\n\n--\n\n맞아요.\n아는게 중요한게 아닌데 말입니다.\n행하지 않는 도는 길이 아니라 했던것 처럼 말이죠.\n\n부족하지만 실천하기 위해 열심히 노력하며 살아보아요.형! :D\n\n [doortts](http://blog.doortts.com) | 2011-07-02 토요일 오후 5:12\n\n--\n\nCakephp에서 Yii로 갈아타고 개발중인데!!\n내름 흡족하면서.. 개발하고 있어요.. \n\n아직 개발중이라.. 운영하면서 생기는 문제는 ㅋ 파악은 못했지만..ㅋ\n다만 apc 적용하려고 하구 있는데.. 머가 좀 문제가 있어서 ㅋ 아직 보류중이구요..;\n\n예전에는 Java가 최고라는 어리석은 생각에서 다른 언어에 대한 편견이 있었는데.. \n이젠 언어가 좋던 나쁘던..ㅋ 즐겁게 코딩하면 장땡이라는 생각으로 바뀌더라구요.. (가끔 짜증날땐 있지만요@.@)\n\n무튼 PHP 관련 블로깅 보니까..ㅋㅋ 반가운걸요 ㅎㅎ\n혼자 막 동떨어진 기분이 막 들려던 참이었거든요 ㅋㅋ\n\n [is윤군](http://helols.tistory.com) | 2011-07-02 토요일 오후 6:2\n\n--\n\n좋은 정보를 주셔서 감사합니다\n\n [jogo do sonic](http://sonic.jogosloucos.com.br/) | 2011-08-30 화요일 오후 4:6\n\n--\n",
    "attachments": [
      {
        "id": 21854,
        "name": "mostpopularframework2011.jpg",
        "hash": "63e2d48d528848a224415ef29c499aa4e015aba9",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 21786,
        "containerId": "12344"
      }
    ]
  },
  {
    "id": 181,
    "title": "[dW Review] 혁신적인 아키텍처와 창발적 설계: 재사용 가능한 코드 활용하기 #1",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1312035132000,
    "body": "> doortts | 2011-07-30 토요일 오후 4:52 | 이생각 저생각 | [원본](http://blog.doortts.com/181)\n\n7월 IBM developerWorks에 올라온 기사 중에 \"혁신적인 아키텍처와 창발적 설계: 재사용 가능한 코드 활용하기\"라는 글이 있습니다. 닐포드의 글인데, 이미 [마지막회](http://blog.doortts.com/177 \"[http://blog.doortts.com/177]로 이동합니다.\")가 올라온 다음에 오히려 예전 글이 번역되어 올라왔습니다. 원문도 어렵지만, 번역글도 만만치는 않네요. :(\n\n혁신적인 아키텍처와 창발적 설계: 재사용 가능한 코드 활용하기\n[](http://www.ibm.com/developerworks/kr/library/j-eaed11/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/j-eaed11/index.html?ca=drs-]로 이동합니다.\")[http://www.ibm.com/developerworks/kr/library/j-eaed11/](http://www.ibm.com/developerworks/kr/library/j-eaed11/ \"[http://www.ibm.com/developerworks/kr/library/j-eaed11/]로 이동합니다.\")\n\n\n이전 리뷰들과 비슷하게 함께 알아두면 좋을 것들에 대해 몇 가지 이야기 해볼까 합니다.\n\n우선은 린  개발에서 설계상의 결정사항 늦추기에 대한 이야기입니다.\n\n닐 포드는 평소 본인의 글에서 \"린 소프트웨어 개발\" 이야기를 종종하곤 했습니다.\n\n![5721634.jpg](/files/21855)\n\n[린 소프트웨어 개발의 적용, 위키북스]\n\n린 관련된 책이 국내에 많이 있지만, 대부분은 일본 도요타의 생산성 관련 책들이고 SW와 연관된 책은 몇 권 없습니다. 그중에서 포펜딕 부부가 쓴 \"린 소프트웨어 개발의 적용\"은 제가 개인적으로 무척 좋아하는 책입니다. 우선, 이야기가 많아서 재밌습니다. :D 그리고 이 책은 LG전자 내에서 Agile Gentleman League를 이룬 세 분이 책의 번역자 이기도 합니다. (AGL은 개인적인 표현입니다. :)\n\n이 책을 보면 위 글에서 닐 포드가 언급한 린소프트웨어 개발의 7가지 원칙 중 네 번째 원칙으로 \"확정을 늦춰라\"의 이야기가 나옵니다.\n\n- 불확정요소가 많은 소프트웨어 개발에서 변경하기 어려운 중대한 설계상의 결정은 최대한 늦춰야 한다.\n\n언듯보면 미루라는 뜻의 '회피'나 '지연'처럼 보이기도 합니다만, 실제 의미는 최대한 많이 살펴보고 다양한 해결책을 시도해서 조금이라도 더 구체화에 대한 노력을 기울인 다음에 더이상 미룰수 없는 시점이 된 다음에 결정하라는 뜻입니다. 계속 변경이 일어나서 설계 충격이 오는 것을 줄여보기 위한 노력입니다. 프로토타입을 빨리 만들어서 피드백을 받는 쪽과 일정부분 충돌 나는 사상처럼 보일 수도 있습니다만, 여기서 말하는 건 고객의 요구사항이 아닌 설계자의 설계상의 결정 쪽에 좀더 무게를 둡니다.\n\n그래서 이 내용을 좀 더 보충하기 위해 아이젠 하워의 명언을 들어 설명합니다.\n\n\"나는 전투를 준비함에 있어 계획(plan)은 언제나 쓸모가 없다는 것을 알게 되었다. 그러나 계획을 세우는 것(planning)은 꼭 필요한 일이다\"\n\n계획을 세우는 것과 확정하는 것의 차이를 말하는 문장입니다. 그리고 계획을 세우는 것도 중요하지만, 계획과 달라질 수 있다는 것을 기정사실로 세우고 민첩하게 반응할수 있어야 합니다. 즉, 소프트웨어의 경우 변경이 일어날 수 있음을 가정하고 변경이 용이한 구조를 염두에 두어야 한다는 뜻입니다. 물론 예측과 예측에 대한 대비 비용간의 균형은 가장 어려운 부분중 하나인지라 특별한 답은 없습니다.\n\n개인, 혹은 팀의 경험이 쌓여가면서 좀 더 정확도가 높아지는 방향으로 발전해 나간다는걸 알아야 합니다.",
    "attachments": [
      {
        "id": 21855,
        "name": "5721634.jpg",
        "hash": "b959bf821df2112c71c46f7c70287200de207f76",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 14118,
        "containerId": "12345"
      }
    ]
  },
  {
    "id": 182,
    "title": "개발 생산성(productivity)을 높이라구요?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1312095908000,
    "body": "> doortts | 2011-07-31 일요일 오후 1:26 | 이생각 저생각 | [원본](http://blog.doortts.com/182)\n\n대부분의 기업들은 생산성(productivity)에 대해 관심을 기울입니다. 왠만한 규모의 회사라면 생산성 관련 전문조직을 꾸려놓고 있습니다. 제 주변만 보더라도 팀이름에 \"생산성 혁신\"이라는 단어가 들어간 팀을 가진 회사가 여럿입니다.\n\n관리자나 임원들은 특히나 생산성에 관심이 많습니다. 생산성은 조직의 실적과도 관계가 높으니까요. (조직의 실적은 본인의 실적이기도 하죠 :)\n\n그러다 보니 때로 어떤 이야기가 나오게 되냐하면\n\n\"저 팀(혹은 조직)은 XX 기간 안에 YY 만큼을 해냈는데, 왜 여기는 그렇지 못하느냐?\"와 같은 식의 다소 공격적 어조의 발언도 나오게 됩니다. 그러면서 해당 조직의 생산성에 의구심을 표명하다던가, 아니면 증가 방향에 대한 압박을 받게 되죠.\n\n\n\n![clip_image001.jpg](/files/21856)\n\n[단지 퍼포먼스를 측정하는 중입니다.]\n그런데, 사실 많은 사람들이 이야기 하는 \"생산성\"에는 곧 잘 두 가지의 큰 오해가 있습니다.\n\n첫째. 생산량(output volume)과 생산성(productivity)을 혼동합니다.\n\n타 조직과 비교해 가며 개발 생산성을 높이라고 하지만, 사실 알고보면 생산성이 아닌 생산량을 말하는 경우가 많습니다. \"알고봤더니 몇 개월 만에 얼마얼마를 만들어낸 조직은 대부분 늦게까지 일하거나 야근, 휴일근무등등으로 도배가 되어 있었더라\"와 같은 이야기는 아주 흔한 이야기입니다. 즉, 우리도 더 많이 일해서 더 많이 만들라는 이야기인데 이건 생산성을 높이라는게 아니죠. 생산량을 늘리라는 이야기입니다. 생산성은 동일한 작업 시간 대비 유효한 결과물을 뜻하기 때문입니다. 오버타임 근무를 할 경우 일반적으로 생산성은 오히려 낮아지게 되어있습니다. 시간내 집중도 및 작업량 대비 결함 발생율이 달라지기 때문입니다. 어떤식으로 달라질런지는 연구논문을 들지 않더라도 쉽게 유추 가능하실 겁니다.\n\n어쨌든 저는 평균 근무시간이 긴 팀일 수록 생상성은 낮은 팀으로 간주해야 한다고 생각합니다. 그리고 그렇게 인식하는 문화를 만들어야 하는 것이 업계가 발전해 나가는 방향이라고 봅니다. \n둘째. 소프트웨어는 완성될 한 개를 위해 대부분의 시간과 비용이 쓰이고, 하드웨어는 완성된 시제품의 복제에 대부분의 시간과 비용이 들어갑니다.\n\n(이 항목에 대해 예외나 논란이 있을 수 있다는걸 알지만) 일반적으로 SW는 복제에 비용이나 결함이 거의 발생하지 않습니다. HW는 노력을 기울여 만든 시제품에는 없는 다양한 문제들이 복제단계, 즉 대량생산단계에서 발생해서 비용을 유발합니다. 그리고 이 단계에서의 문제점을 제거하고 효율을 높이는 걸로 생산성을 논합니다. 이건 산업간의 근본적인 차이를 나타내는 중요한 점 중 하나인데, 우리는 곧잘 이 부분에 대한 인식이 희박합니다. 그래서 다른 산업에서 들여온 방법론이 이상하게 현장에선 제대로 적용되지가 않거나 오해해서 적용하기가 쉽습니다. 재고, 복제 불량율, 반품율, 보존기간 등등의 요소가 판이하게 다르니까요. 생산라인 풀가동과 작업자의 두뇌 풀가동이 서로 연관이 없는 산업은 수치화된 생산성 측정과 개선이 훨씬 간단합니다. SW영역은 그렇지 않다는 걸 이해해야 합니다.\n\n만약 한 명의 작업자(=개발자)가 동일한 if문을 하루에 100개 작성했는데, 하루에 200개 만들면 생산성이 두 배로 높아졌다고 보는 것이 공장제 산업기준의 생산성입니다. 당연히 IT영역과는 맞지 않습니다.\n\n그럼 소프트웨어 개발에 있어 진정한 의미로서의 \"생산성\"을 높이는 방법에는 어떤것이 있는지 알아볼 필요가 있습니다.\n\n그건 다음에 다시 이어서 쓰겠습니다. :)\n\n여담입니다만, 글의 내용을 짧게하고 급 내용을 줄이는 이유는, 제가 요즘 글 쓰는데 살짝 슬럼프 인것도 있고, 또 하나의 글을 쓰기위해 너무 오래 걸려서 몇 달에 걸쳐 지리하게 쓰다 말다 하는 글들이 있어서 그렇습니다. 여기에는 SNS(twitter, me2day)등을 통해 에너지를 곧잘 방출해 버리는 것도 한 가지 이유가 아닌가 합니다.\n\n호흡을 짧게해서, 조금씩이라도 자주 올릴 수 있도록 연습하려고 합니다. 양해해 주세요. (^_^);;\n\n\nhttp://www.ipc.co.ir/64/section.aspx/62\n\n#### Comments\n\n내가 바라는 게 바로 생산량이야! 라고 말하는 윗분에게도 한 말씀 부탁해요 ^^\n\n [박성철](http://gyumee.egloos.com) | 2011-08-04 목요일 오후 10:20\n\n--\n\n그건 차라리 쿨! 하잖아요! :D\n\n [doortts](http://blog.doortts.com) | 2011-08-05 금요일 오후 1:2\n\n--\n",
    "attachments": [
      {
        "id": 21856,
        "name": "clip_image001.jpg",
        "hash": "2c76ec3593793ffd79ef9e237acdf28b7572cfac",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 31401,
        "containerId": "12346"
      }
    ]
  },
  {
    "id": 183,
    "title": "[dW Review] 안티 오브젝트 및 협력적 확산 (Antiobject & Collaborative Diffusion)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1312103753000,
    "body": "> doortts | 2011-07-31 일요일 오후 6:15 | Better SW Development | [원본](http://blog.doortts.com/183)\n\n앞선 리뷰 \"[혁신적인 아키텍처와 창발적 설계: 재사용 가능한 코드 활용하기, Part 1\"](http://blog.doortts.com/181 \"[http://blog.doortts.com/181]로 이동합니다.\")에서 살짝 이어지는 내용입니다.\n\n혁신적인 아키텍처와 창발적 설계: 재사용 가능한 코드 활용하기\n[http://www.ibm.com/developerworks/kr/library/j-eaed11/](http://www.ibm.com/developerworks/kr/library/j-eaed11/ \"[http://www.ibm.com/developerworks/kr/library/j-eaed11/]로 이동합니다.\")\n\n\n위 글에서 흥미를 끄는 단어가 하나 있는데, 안티 오브젝트(Antiobject)라는 표현입니다. 그 예로 패크맨 이야기가 나오는데, 이전에 어디선가도 들어본 적이 있는 내용이었습니다.\n\n(본문이 굉장히 어렵게 쓰여져 있지만) 사실 글에서 이야기는 하려는 바는 객체 지향적인 사고가 너무 일반화되면, 오히려 문제가 더 어렵게 풀릴수도 있다는 이야기입니다. 그 예로 든 것이 패크맨 게임입니다. 언급된 내용은 오리저널 논문의 제목은 \"협력적인 확산 : 안티오브젝트와 협력적인 확산([Collaborative Diffusion: Programming Antiobjects](http://www.google.co.kr/url?sa=t&source=web&cd=3&ved=0CEMQFjAC&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.71.5457%26rep%3Drep1%26type%3Dpdf&rct=j&q=Collaborative%20Diffusion&ei=8wc1TtemJcrKiAK47Zm6CA&usg=AFQjCNFoBz0X_URcw7ko_fVBOEBles0NBQ&sig2=2E87N9oJ45vnha7TRAVEyQ&cad=rja \"[http://www.google.co.kr/url?sa=t&source=web&cd=3&ved=0CEMQFjAC&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.71.5457%26rep%3Drep1%26type%3Dpdf&rct=j&q=Collaborative%20Diffusion&ei=8wc1TtemJcrKiAK47Zm6CA&usg=AFQjCNFoBz0X_URcw7ko_fVBOEBles0NBQ&sig2=2E87N9oJ45vnha7TRAVEyQ&cad=rja]로 이동합니다.\"))\"으로 되어 있습니다.\n\n![pacman_game-1973.gif](/files/21857)\n\n[1973년도에 만들어진 패크맨 게임. 적은 리소스로 만들어진 훌륭한 AI(스러운) 게임인것 같습니다]\n\n패크맨 게임은 미리 만들어진 미로내에서 고스트(ghost)가 사용자가 조정하는 패크맨을 뒤쫓는 게임입니다. 대학원생들에게 해당 게임을 구현하도록 숙제를 내줬더니 고스트를 어떻게 프로그래밍할 것인가에 대해 여러가지 방안이 나왔다고 합니다. 학생들의 기본적인 접근 전략은 크게 다음과 같았다고 합니다.\n\n1\\. 브라운 운동 (Brownian Motion: 유체 미립자의 불규칙한 운동)\n - 매 순간 갈 길을 랜덤하게 결정. 돌아다니다보면 어쨌든 만난다. 단점: 고스트들이 무뇌로 보임\n\n2\\. 조준사격(Point and Shoot)\n - 방향을 정해서 장애물이 나타나거나 갈림길이 올때까지 꾸준히 움직인다. 단점: 패턴이 보이면 역시 멍청해 보임\n\n3\\. 증분식 접근(Incremental Approach)\n- 매 순간 패크맨에게 가까운 쪽으로 움직인다. 유클리드 기하학과 방정식을 이용한다. 단점: 장애물처리라던가 막다른 골목에 쳐박혀 버둥대고 있을 수 있다.\n\n\n위 세 가지 기본 접근방법들 기반으로 조합해서 좀 더 나은 방법들을 사용하기도 합니다. 그런데, 고스트들을 하나의 객체로 잡고 일종의 인공지능스러운 알고리즘을 부여하려고 하니, 객체가 복잡해지고 메소드도 많아지고, 그러면서도 명쾌한 방법이 잘 나오지 않았다고 합니다. 게다가 이런식의 접근은 CPU도 상당히 사용하게 되는 방식이고요. (그러면서 최근 게임들의 인공지능에 대한 이야기도 나오는데, 재밌습니다. 게임쪽에서 일하시는 분들은 한 번쯤 읽어볼 만한 내용들이 많습니다.)\n\n![pacman01.png](/files/21859)\n\n[ㅎㅎㅎ 바보들~ 나잡아 봐라~~]\n\n닐 포드는 기사에서 원본 패크맨시스템은 열악한 시스템 조건속에서 해당 문제를 어떻게 유연하게 풀었는지에 대해 이야기합니다. 고스트를 객체로 삼는 것이 아닌, 배경타일에 속성을 부여한 방법입니다. 고스트들이 아무렇게나 움직이다가 게이머가 조종한 패크맨의 흔적냄새를 맡으면 뒤따라 갑니다. 제가 읽었던 예전 내용(아.. 어디였는지 왜 기억이 안날까요? 괴롭..)에 따르면 패크맨이 지나가는 순간 매 타일은 숫자를 가집니다. 예를 들면 현재 패크맨이 있는 자리는 10이고 오른쪽으로 한 칸 움직이면 이전 타일은 9를 가지고 현재 타일은 다시 10을 가지는 식으로 매 타일이 패크맨 이동의 흔적 냄새를 가지는 거죠. 고스트는 숫자가 높은 쪽으로 움직이는거고요.\n\n일반적인 \"객체\"지향 사고를 벗어나니까 좀 더 문제가 우아하게 풀리는 겁니다. 물론 여기서 말하는 객체지향 사고란 우리의 심리적인 접근을 말합니다. 흔히 \"능동적으로 움직이는 것 처럼 보이는 것이 객체다\"라는 선입관을 말합니다.\n\n여튼 이런식의 접근을 안티오브젝트라고 부릅니다. 흔히 객체라고 생각하는 것이 객체가 아니고 오히려 다른 것이 객체이거나 논리 모델이 될 수 있다는 접근입니다. 단어 자체는 무슨 \"반-객체지향 사상\"처럼 들립니다만, 딱히 그런뜻은 아닙니다.\n\n그리고 조금더 들어가서 이야기 하자만, 해당 논문에는 좀더 나은 모델을 제시합니다. 바로 \"협력적인 확산(Collaborative Diffusion)\" 모델입니다.\n\n고스트들 하나만을 기준으로는 위에서 말한 냄새쫓아가기가 효과적이지만, 여러개의 고스트가 있을때는 한 길만 쫓아오는 바보 고스트들이 생길 수 있습니다. 그건 확산방정식을 이용해서 풀어내는 이야기를 설명 하고 있습니다. 효율적으로 접근하려면 기본적으로 패크맨의 현 위치가 산꼭대기에 해당하고 나머지 고스트들은 정상을 향해 다가가는 식으로 접근합니다. 그리고 각각의 고스트들이 서로 협력을 해서 효과적으로 접근하는 방법을 이야기합니다.\n\n![pacman03.png](/files/21861)\n\n[확산 방정식을 이용하고 고스트들 간에 협력해서 접근할 수 있도록 조정합니다.]\n\n![pacman02.png](/files/21858)\n\n[... 어.. 이건 아니지...]\n\n패크맨 뿐 아니라 축구게임에서 공과 선수들의 움직임에 대해서는 좀 더 응용된 형태로 설명을 하고는 있는데, 논문자체의 방정식 같은건 어려우니까 넘어가겠습니다.\n\n결과적으로 말하고 싶은 건, \"추상적인 설계를 하는데 있어서 이런 선입관을 버리고 무엇을 추상화 할 것인지에 대해 다양한 사고를 해야 한다\" 정도로 받아 들이면 되겠습니다. \n\n아. 그리고, 이번에도 사족한가지 더.\n\nIBM dW의 기사 \"혁신적인 아키텍처와 창발적 설계\"시리즈는 좋은 기사이긴 한데 참 여러가지로 어려운 내용이 거듭되는 것 같습니다. 번역기사도 참 어렵네요.\n\n\n#### Comments\n\n제가 조기축구를 오래 해서 그런지 협력적인 확산이 굉장히 와닿네요^^ 보통 팀웍이라고들 말하는데 혹시 협력적인 확산이 비유하자면 동일한 목표(수비할때 공 빼앗기)에 대한 전술적인 팀웍이라고 이해해도 될런지요? ^^\n\n [스쿨쥐](http://swtest.co.kr) | 2011-08-03 수요일 오후 9:45\n\n--\n\n생각해보니 그런 표현도 의미적으로는 통할 것 같네요. :)\n\n협력적인 확산(diffusion)은 목표를 향해 접근할때 접근하는 객체들이 경우의 수(=역할)를 골고루 나눠가지는 스타일이니까요.\n\n [doortts](http://blog.doortts.com) | 2011-08-03 수요일 오후 10:12\n\n--\n",
    "attachments": [
      {
        "id": 21857,
        "name": "pacman_game-1973.gif",
        "hash": "5432a81e6273c96c778c2bc769a9df5fb8bd0221",
        "containerType": "BOARD_POST",
        "mimeType": "image/gif",
        "size": 9436,
        "containerId": "12347"
      },
      {
        "id": 21858,
        "name": "pacman02.png",
        "hash": "1626cb5f241835e514c28932b223bbd7e359c589",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 62824,
        "containerId": "12347"
      },
      {
        "id": 21859,
        "name": "pacman01.png",
        "hash": "e0693ead1691dcb3367a41ead9808f63cd84a97c",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 58867,
        "containerId": "12347"
      },
      {
        "id": 21860,
        "name": "300px-Ghost_tracks_pac-man.png",
        "hash": "1afddce92cefeb9749a0ebe8100f2e752c4258de",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 131994,
        "containerId": "12347"
      },
      {
        "id": 21861,
        "name": "pacman03.png",
        "hash": "2a1a9220b2f9cb546bd9f0fcff5b63b92947052e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 259638,
        "containerId": "12347"
      }
    ]
  },
  {
    "id": 184,
    "title": "[dW Review] Java 개발자를 위한 Javascript",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1312108497000,
    "body": "> doortts | 2011-07-31 일요일 오후 7:34 | Better SW Development | [원본](http://blog.doortts.com/184)\n\nJava development 2.0: Java 개발자를 위한 Javascript\n[http://www.ibm.com/developerworks/kr/library/j-javadev2-18/](http://www.ibm.com/developerworks/kr/library/j-javadev2-18/ \"[http://www.ibm.com/developerworks/kr/library/j-javadev2-18/]로 이동합니다.\")\n\n\n굳이 분류하자면 저는 자바 서버사이드 개발자에 가깝습니다만, 최근 자바스크립트를 조금씩 다시 공부하고 있습니다. 이전에 [잠깐 언급](http://blog.doortts.com/142 \"[http://blog.doortts.com/142]로 이동합니다.\")했었습니만, 개발하는 내내 텍스트 에디터와 브라우저를 놓고는 try-and-repeat을 무한 반복하는 형태의 개발에 학을 뗀 경험이 있었기에, 서버 개발의 컴파일러와 IDE의 도움을 받는 방식으로 돌아선 이후로는 다시 돌아보고 있지 않았습니다.\n\n하지만, 세상은 계속 변해갔고 요즈음엔 오히려 자바스크립트가 주류 중에서도 최상위 주류가 되고 있습니다.\n\n![jslibrary.png](/files/21863)\n\n[자바스크립트 관련 라이브러리 및 프레임워크. 몇 개나 알고 계세요? 어디서 보도듣도 못한 비주류? 이러시면 곤란합니다]\n\n저도 자바스크립트는 잘 모릅니다. 그러니 열심히 공부해야죠. 관심있는 분야는 자바스크립트의 TDD와 node.js입니다. 최근 가입한 스터디 그룹인 FRENDS (http://wiki.frends.kr)에 계신분들은 이쪽분야에서는 가장 앞서 계신 분들이라는 생각이 들었습니다. 여튼 일종의 자바스크립트 변환 언어인 커피스크립트(http://pragprog.com/book/tbcoffee/coffeescript)를 스터디분들과 나눠서 공부하려 하고 있습니다. 이제 막 첫 책이 나온 상황이라 어느정도 효용이 있을지는 의문입니다만, 두고 봐야 할겠죠.\n\n하여튼, 어느새 alert('hello world')나 찍던 시절은 가버린 것 같습니다.\n\n사실 자바스크립트는 컴파일언어가 아니라서 작성시에 오타나 간단한 논리적인 오류도 들어나지 않는 점이 좀 어렵습니다. 관련해서 여쭤봤는데, 딱히 답은 없는 것 같더라구요. 에디터와 브라우저가 여전히 주요 도구인 상황입니다. (혹 효과적인 작성 스타일을 아시는 분이 계시면 좀 알려주세요. :)\n\n그래도 (제 기준으로) 10년전에 비해 조금 나아진 부분들은 있더군요.\n\n우선 디버깅도구가 늘었습니다. 그 중 가장 유명한 Firefox의 firebug는 이젠 없어서는 안되는 도구가 되었죠. IE의 경우 IE8부터 지원되는 개발자도구 (F12)가 비슷한 일을 해주고 있고요. 그리고 구글 크롬의 개발자 도구도 firebug 못지 않은 좋은 도구도 이야기 되고 있습니다. 기사에서도 크롬의 콘솔기능을 이용하는 방법을 알려주고 있죠.\n\n[JsLint](http://www.jslint.com/ \"[http://www.jslint.com/]로 이동합니다.\")라는 것도 있습니다.\n\n![jslint.gif](/files/21862)\n\n일종의 자바스크립트 코드 정적 분석툴입니다. 흔히 하는 실수나 문제점들을 찾아줍니다. 다른 정적언어의 도구들에는 미치지 못하지만, 그래도 많은 양의 스크립트 코드가 있다면 눈으로 보는 것 보다는 좀 더 낫겠죠.\n\nIDE로는 Apatana Studio가 있습니다. 단독으로 사용할 수도 있고, 이클립스 플러그인으로 사용할 수도 있습니다. 기본문법이나 jQuery의 경우 어느정도 자동완성도 지원해 줍니다.\n\n뭐 그렇다 하더라도 아직은 도구가 조금 부족해 보입니다. 비주얼스튜디오 쓰시는 분들을 조금 봤는데, 자바스크립트 개발도구로는 최고 수준인것 같았습니다... 만 역시 참 비싼툴인데다 낯설어서 그저 그런가 보다만 하고 있습니다.\n\n뭐, 기타 다른 부분은 공부하면서 더 알아보도록 하겠습니다.\n\n어설프게 이것저것 손대다가는 어느것 하나 잘하는 것 없게 되버리는 것을 알기때문에 조금 조심스럽습니다만, 당분간은 자바스크립트쪽을 공부할 생각입니다. 결과는 그때 그때 공유하겠습니다. : )\n\n비오는 7월 마지막 날인 일요일, 편안한 주말 저녁 되시길 바랍니다.\n왠지 또 모처럼 인사드리고 싶네요.\n\n고맙습니다. 그리고 감사합니다.",
    "attachments": [
      {
        "id": 21862,
        "name": "jslint.gif",
        "hash": "4ee764af98cc0883195f9ccf5682f5be696ed919",
        "containerType": "BOARD_POST",
        "mimeType": "image/gif",
        "size": 5790,
        "containerId": "12348"
      },
      {
        "id": 21863,
        "name": "jslibrary.png",
        "hash": "e4e2fc9370c79f0de012d70ca9bfbd73d4d8e78a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 141160,
        "containerId": "12348"
      }
    ]
  },
  {
    "id": 187,
    "title": "[뭘, 이런걸 다?] localhost의 특정 포트를 named host처럼 접근하기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1314088754000,
    "body": "> doortts | 2011-08-23 화요일 오후 5:39 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/187)\n\n*** 아래 내용은 정상적으로 동작하지 않을 수 있습니다. 그럼에도 올리는 이유는, 말 그대로 정상 동작하지 않는 경우와 이유를 찾아내 보고 싶은 마음에서 입니다. 이점을 참고해서 읽어주세요. 동작여부를 댓글로 달아주시면 제작자에게 메일 보내 보겠습니다. ***\n\n예를 들면, 팀에서 myservice.com 이라는 도메인에서 웹 애플리케이션을 만들고 있다고 가정해 보겠습니다.\n\nlocal에서 작업할때 127.0.0.1이나 localhost를 접속 host명으로 사용하곤 하는데 \nport까지 써야하면 모양이 좋지 않습니다. 그리고, 예전엔 특정 configuration에 설정이\n개발환경과의 차이때문에 배포후에 문제가 생기곤 했던 시절도 있습니다.\n\n이런 경우, named host를 이용해서 좀 더 우아하게(..그런게 이바닥에 어울리는 단어인가는 논외로 하고..) 개발 작업스타일에 대한 소개입니다.\n\n*** 윈도우 환경 기준입니다. ***\n\n톰캣을 띄운다고 가정해 보겠습니다.\n기존에 서비스가 있어서, 혹은 어떤 다른 이유로 이번 톰캣은 **포트를 8888로** 잡았습니다.\n\n이제 브라우저에서 접근하려면 URL의 host를 아래와 같이 적어야 합니다.\n\n\n\n**http://127.0.0.1:8888/blog**\n\n\n\n이제 named host로 지정해 보겠습니다.\n\n작업 후에는\n**http://local.myservice.com/blog**\n와 같은 식으로 접속하는 것이 목표입니다.\n\n물론 localhost로 써도 되지만, 좀 더 서비스 느낌이 나도록 \nlocal.myservice.com 으로 해보겠습니다. 다음 파일을 메모장 등의 에디터로 엽니다.\n\n\n\nC:\\Windows\\System32\\drivers\\etc\\host\n\n\n\n아래와 같이 서비스 호스트명의 alias를 정합니다.\n\n\n\n# localhost name resolution is handled within DNS itself.\n\n127.0.0.1       localhost\n\n**127.0.0.2    local.myservice.com**\n\n\n\n이제\n[](http://www.rouvali.com/ \"[http://www.rouvali.com/]로 이동합니다.\")[http://www.rouvali.com](http://www.rouvali.com/index.php?id=53 \"[http://www.rouvali.com/index.php?id=53]로 이동합니다.\") 사이트로 가서\nWindows Port Forwarding Service를 다운 받아 설치합니다. \n\n![PortForward.png](/files/21865)\n\n \n인스톨 끝나면 설정 파일이 자동으로 열립니다.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n**[컴퓨터 관리 -> 서비스]**에서 forwarder가 시작되었는지 확인한 다음, 정지되어 있으면 시작시킵니다.\n\n![PortForward_2.png](/files/21864)\n\n이제 브라우저 url 창에서 아래와 같은 url로 접속하면\n\n\n\nhttp://local.myservice.com\n\n\n\n \n내부적으로는\n127.0.0.1:8888 로 접속하게 됩니다.\n\n또한 host alias는 127.0.0.2로 했기 때문에, 기존에 127.0.0.1로 사용하던 alias들과도 충돌이 발생하지 않습니다.\n\n네. 이상입니다. :D\n끝~~\n\nps.\n**win7에서는 보안패치 관련해서 관리메뉴 진입시 에러가 날 수도 있습니다\n[http://mastmanban.tistory.com/531](http://mastmanban.tistory.com/531 \"[http://mastmanban.tistory.com/531]로 이동합니다.\")**\n\n#### Comments\n\n좋은 정보 공유 감사합니다. \n내용에 좀 추가를 하자면.. = 제 삽질기..\n컴퓨터에 MSXML parser가 설치되어있지않다면 읽지 못해서 제대로 작동을 안하더군요. ㅋ\n전 설치한 후에 제대로 작동하였습니다. \n\nhttp://www.microsoft.com/en-us/download/search.aspx?q=msxml 다운로드 링크\n\n참고로 설치폴더에 설정파일과 로그 파일이 있습니다. \n\n [실효최대출력](http://tistoryblog.kgreens.org) | 2014-05-30 금요일 오후 5:7\n\n--\n",
    "attachments": [
      {
        "id": 21864,
        "name": "PortForward_2.png",
        "hash": "cea932e4533a638265c6dfd79c18a2dcf654158e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 13004,
        "containerId": "12349"
      },
      {
        "id": 21865,
        "name": "PortForward.png",
        "hash": "e48d9b8f095a6c9a05db7b376495f263bddc6afa",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 84922,
        "containerId": "12349"
      }
    ]
  },
  {
    "id": 188,
    "title": "[dW Review] What is Watson ?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1314634533000,
    "body": "> doortts | 2011-08-30 화요일 오전 1:12 | 이생각 저생각 | [원본](http://blog.doortts.com/188)\n\nWatson과 헬스케어\n[http://www.ibm.com/developerworks/kr/industry/library/ind-watson/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/industry/library/ind-watson/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/industry/library/ind-watson/index.html?ca=drs-]로 이동합니다.\")\n\n\nIBM dW에 'Watson과 헬스케어'라는 기사가 올라왔습니다. Watson에 관심이 없는 사람이라면, 이게 뭔소린가? 할텐데, 사실 올해 초에 Watson 동영상을 접하고는 전 말 그대로 '와우!!!'를 감탄하며 기절하는 줄 알았습니다.\n\n이게 뭔 호들갑이냐? 할텐데요, Watson과 제퍼디(jeoperdy) 이벤트는 인류역사상 최고의 체스선수라 일컬어지는 게리 카스파로프를 딥블루가 이긴 사건에 맞먹는 사건이라고 생각합니다.\n\n몇 년을 준비해 왔던 인간과 컴퓨터의 퀴즈쇼 대결이 바로 그 이벤트입니다. 이번에도 IBM의 박사들과 공학자들이 이루어냈습니다. 처음엔 이건 무슨 돈ㅈㄹ에 할일없는 쑈냐? 했었는데요, 동영상과 관련된 자료들을 찾아보면 볼 수록 그게 아니라는 걸 알게 되었습니다.\n\n자 아래 동영상을 한 번 보세요. 일련의 시리즈물 중 하나입니다. 즉, 원하시면 더 찾아볼 수도 있다는 이야기죠. : )\n\n\n\n특히 watson을 의료분야에 응용할 수 있다면, 인류의 수명이 바뀔 수 도 있고요, 금융이나 밀리터리 분야에 쓰인다면, watson을 소유한 나라(현재는 미국이죠...)를 다른 나라가 이겨낼 수 있을까 싶기도 합니다.\n\n인간의  joke를 알아듣는데다, 초당 수십억개의 정보를 다루고 적절히 판단할 수 있다는 기계가 있다는 건...\n\n인류에게 있어\n비약적인 도약의 기회, 혹은 무시무시한 괴물과의 공존,\n아니면 둘 다 일 겁니다. :)\n\n너무 비약이 컸나요? 글쎄요..\n유투브에서 동영상들을 다 보신다면 생각이 조금은 바뀌지 않을까 싶습니다.\n\n#### Comments\n\n대단하기도 하고 한편으론 섬뜩하기도 하네요.\n매트릭스의 시작일까요 ㅜㅜ\n\n [수몽](http://soomong.net) | 2011-08-30 화요일 오전 9:31\n\n--\n\n맞아요. 매트릭스라던가 터미네이터의 skynet이 점점 농담이 아니게 되가는 것 같아요.\n\n [doortts](http://blog.doortts.com) | 2011-08-30 화요일 오후 3:31\n\n--\n"
  },
  {
    "id": 189,
    "title": "[dW Review] node.js",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1314714600000,
    "body": "> doortts | 2011-08-30 화요일 오후 10:46 | Better SW Development | [원본](http://blog.doortts.com/189)\n\nNode.js란?\n[http://www.ibm.com/developerworks/kr/library/os-nodejs/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/os-nodejs/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/os-nodejs/index.html?ca=drs-]로 이동합니다.\")\n\n\nIBM dW기사로 나온 node.js에 대한 기사입니다. 사실 훨씬더 일찍 나왔어야 하는 기사입니다. 왜냐하면 우리나라 분위기와는 달리 외국에서는 node.js에 대한 이야기가 훨씬 더 북적북적 많이 되고 있는 상황입니다. 2010년에 이어서 2011년에 주목해야 하는 기술을 뽑는다면 TOP3에 들어갈만한 기술일 겁니다.\n\n구글 크롬은 구글에서 만든 브라우저라는 걸로 유명하지만, 그 내부적으로는 v8이라 불리는 고성능 자바스크립트 엔진의 출현이 더 많은 엔지니어들에게 충격을 줍니다. 나름 꽤 빠르다던 firefox 진형은 깜놀해서 자신의 엔진을 새롭게 개발하게 되었고, IE는 좀 더 심하게 조롱을 당하면서 마찬가지로 MS의 엔지니어들을 분발시켰습니다.\n\n이와는 별개로 v8 javascript engine이 자바스크립트를 고속으로 해석해낸다는 점 + javascript의 functional language로써의 특징과 자바스크립트 고유의 이벤트 기반의 동작방식을 응용해서 서버프로그래밍 프레임워크가 나옵니다. 그게 바로 node.js입니다.\n\n언제나 그렇듯 IBM 기사의 내용은 앞 부분이 훅~ 빠져있기때문에 잘 이해하기 위해서는 선행 학습이 필요합니다.\n\n몇 가지 추천 링크를 적어보면 이렇습니다.\n\noutsider님의 블로그 (한글이좋죠~ : )\n[node.js는 무엇인가? #1](http://blog.outsider.ne.kr/480 \"[http://blog.outsider.ne.kr/480]로 이동합니다.\")\n[node.js는 무엇인가? #2](http://blog.outsider.ne.kr/481 \"[http://blog.outsider.ne.kr/481]로 이동합니다.\")\n\nnode.js 공식사이트 (뭐든 공식사이트는 기본이죠~)\n[http://nodejs.org/](http://nodejs.org/ \"[http://nodejs.org/]로 이동합니다.\")\n**OctoberSky.js: 국내 node.js 커뮤니티** \n- 가이드 문서와 튜터리얼들: [https://github.com/octoberskyjs/home](https://github.com/octoberskyjs/home)\n- 커뮤니티 페이지: [www.facebook.com/octoberskyjs](http://www.facebook.com/octoberskyjs)\n\n따라하기식으로 배우는 node.js 튜터리얼\n[http://dailyjs.com/tags.html#lmawa](http://dailyjs.com/tags.html#lmawa \"[http://dailyjs.com/tags.html#lmawa]로 이동합니다.\")\n굉장히 쉽게 잘 되어 있고 ,밑에 달린 코멘트들의 질답도 읽어볼만 합니다. 더불어 관련 프레임워크들도 배우게 됩니다.\n\n\n사실 node.js가 뜨게 된데는 그 성능상의 놀라움 때문이 큰데요, 한때는 이벤트 기반의 non-blocking I/O 서버인 [nginx](http://nginx.org/ \"[http://nginx.org/]로 이동합니다.\")와의 성능대결도 화제이곤 했습니다만, 지금은 node.js를 nginx와 mixin 해서 함께 사용하기도 하는군요.\n\nnode.js on nginx\n[http://wellconsidered.be/nodejs-on-nginx](http://wellconsidered.be/nodejs-on-nginx \"[http://wellconsidered.be/nodejs-on-nginx]로 이동합니다.\")\n\nnode.js + nginx - And now?\n[http://stackoverflow.com/questions/5009324/node-js-nginx-and-now](http://stackoverflow.com/questions/5009324/node-js-nginx-and-now \"[http://stackoverflow.com/questions/5009324/node-js-nginx-and-now]로 이동합니다.\")\n\n\n효율을 높이기 위해 static 파일등의 front-end 처리와 proxy 기능은 nginx가 처리하고 애플리케이션 기능을 node.js가 처리하는 방식입니다. 이런 방식의 절대적인 효용에 대해서는 아직은 조금 더 지켜봐야 하는 것 같습니다만 다양한 시도는 좋은 것 같습니다. : )"
  },
  {
    "id": 190,
    "title": "[dW Review] PaaS? 파스?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1314797965000,
    "body": "> doortts | 2011-08-31 수요일 오후 10:39 | Better SW Development | [원본](http://blog.doortts.com/190)\n\n![PAS.jpg](/files/21866)\n\n원래 사람들은 약자를 만들기 좋아한다. 그리고 기술쟁이들은 일반인들보다 (내 기준으론) 몇 배는 더 많은 용어와 약어 만들기를 좋아하는 것 같다. 심지어는 다른 사람이 먼저 만들어낸 개념과 단어 조차도 자기 마음에 안든다며 따로 만들어내기도 한다. 내가 보기인 개그맨들이 유행어 띄우기에 집착하는 것 만큼이나 IT 컨설턴트들과 그 주변인들은 새로운 용어 만들기에 집착하는 것 같다.\n\n자. 이번엔 PaaS다.\n\nJava PaaS 논쟁\n[http://www.ibm.com/developerworks/kr/library/j-paasshootout/index.html](http://www.ibm.com/developerworks/kr/library/j-paasshootout/index.html \"[http://www.ibm.com/developerworks/kr/library/j-paasshootout/index.html]로 이동합니다.\")\n\n\nPaaS는 Platform as a Service의 약자다. 그 동안 많은 약자들을 봤지만 부정관사 a 까지 약어로 쓴 건 이 시리즈에서 처음 봤다. (한마디로 독한거다. 이녀석들!)\n\n간단히 말하자면 \"플랫폼은 우리가 제공할테니 넌 그 위에서 너 만들고 싶은 걸 만들어.\" 이런 건데,\n기사를 읽어보면 GAE(Google App Engine)이라던가, Amazon Elastic Beanstalk (Amazon EB)등이 나온다.\n\n여차하면, 뭐냐? 이것들은.. 할 수도 있는데\n\n그런데, 이렇게 말하면 놀릴지도 모르겠지만 10년도 전에 이미 난 PaaS 유료 사용자었다. (응???)\n그당시 서비스 업체의 광고는 대략 'php3 전격 지원! mysql 20M제공! 도메인과 연결도 해드려요!'였다. 에이~ 이거 뭐 놀리는거냐? 할텐데, 그게 PaaS다. 업체는 이미 환경을 다 준비해 놓고 난 내 규모에 맞게 비용을 지불하고 그 위에서 홈페이지를 만들고 내가 만들고 싶은 걸(=예를 들면 끝말잇기 같은 걸)만들었다.\n\n여튼, php 같은 경우엔 PaaS를 구성해 놓고 사용자를 모집하기가 쉬웠지만, 자바같은 경우에는 JVM이라는 독특한 구조와 그로인해 발생하는 running 상태에서 애플리케이션을 단독으로 추가제거하기 어려운 WebContrainer의 존재로 인해 PaaS를 구축하기가 쉽지 않다. 몇몇 업체들이 제공하고는 있지만, 상당히 제한적으로 운영되고 있는 것이 현실이다.\n\n기사에서도 그런이야기가 나온다. GAE의 경우 자바이지만 완전히 자바플랫폼이라 불리기 어렵다고 말하고 있다.\n\n그럼에도 불구하고 이쪽 분야(PaaS)는 클라우드 유행과 함께 계속해서 발전해 나갈 것이다. 물론, 아직 우리나라의 클라우드란건 웹하드 수준을 벗어나고 있지 못하지만, 애플리케이션만 만들면 하드웨어에 대한 염려도 없고(물론 비용에 대한 염려는 사라지지 않겠지만 어쨌든) 개발 플랫폼 설정등도 고민하지 않고, 확장성(scalability)도 골머리 앓을 필요 없이 그냥 서비스를 운영할 수 있게 되는 PaaS는 관심 가져볼만 하다.\n\n특히 벤처를 꿈꾸는 사람이라면 더더욱.\n\n참고로 위에서 이 시리즈라고 표현한 건 IaaS, PaaS, SaaS 시리즈를 의미한다.\n직접 설명할 수도 있겠지만, 마침 잘 설명된 기사가 있어 링크로 대신한다.\n\n가상 인프라용 클라우드 서비스 , Part 1: IaaS(Infrastructure-as-a-Service) 및 Eucalyptus\n[http://www.ibm.com/developerworks/kr/library/os-cloud-virtual1/](http://www.ibm.com/developerworks/kr/library/os-cloud-virtual1/ \"[http://www.ibm.com/developerworks/kr/library/os-cloud-virtual1/]로 이동합니다.\")\n\n\n아! 그리고 이건 참고의 참고!\n\n흔히 이야기 하는 아마존의 EC2는 IaaS로 가상의 서버 환경을 제공하는 거라 보면 되고, EB는 그 위에 구축해 놓은 운영환경쯤으로 생각하면 된다.\n\n그럼 8월의 마지막 날 보람차게 보내셨기를 기원하면, 전 이만 총총! ^^;\n\n\n#### Comments\n\n파스 이미지가 주는 임팩트 짱이네요. ㅋㅋ\n\n [영회](http://younghoe.info) | 2011-09-01 목요일 오전 10:25\n\n--\n",
    "attachments": [
      {
        "id": 21866,
        "name": "PAS.jpg",
        "hash": "dac64557b317d90da59dfe7613271a1997e8ebcf",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 36016,
        "containerId": "12352"
      }
    ]
  },
  {
    "id": 192,
    "title": "엔지니어들이 빠지는 일급 함정 #1: 신기술과 엔지니어",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1316345400000,
    "body": "> doortts | 2011-09-18 일요일 오후 4:58 | 이생각 저생각 | [원본](http://blog.doortts.com/192)\n\n엔지니어들이 빠지는 일급 함정 #1: 신기술과 엔지니어\nEngineer's First-Class Pitfalls #1 High Tech & Engineer\n\n생각보다 많은 사람들이 곧 잘 신기술에 현혹되어서는 해당 기술을 맹목적으로 연마하고 이것이 머지않아 주류가 될거라 말하곤 합니다.\n\n하지만, 제가 보기에 상당수는 그 기술이 (정말) 왜 필요한건지, 그리고 그 기술이 현재 레거시(legacy system)를 바꿀만큼 파괴적이고 매력적인지 어떤지는 잘 모르는 것 같습니다. 실제로 API와 특징을 줄줄 이야기하는 것 치고는 아주 간단한 근원적 질문에도 헛점이 드러나곤 합니다. '그건 좀 알아봐야 할 것 같은데요'와 같은 말로 대답을 흐리는데, 질문에 따라서는 실망스러울 때가 있습니다. 대답을 못하면 안되는 질문이 있기 때문입니다. 그런 질문에 답을 못하는 경우는 대개, 관련분야의 레거시에서 실제로 일을 해 본 적이 없기 때문인 경우가 많습니다.\n\n더 나아가, 반짝이는 기술의 빛에 눈이 멀어 과거를 부정하는 편에 서는 경우도 있습니다. 사실 발전하려면 과거의 유물들을 부정하는 것에서 시작하는 것도 나쁘진 않습니다만, 경험과 지식을 갖추고 이야기해 주었으면 좋겠다는 생각이 들때가 있습니다.\n\n경험이 부족하다 보니 생기는 상황이 하나 또 있는데, 바로 '앵무새 엔지니어(parrot engineer)'가 되는 겁니다. 기술을 만든 사람이나 그 사람의 주변사람, 혹은 컨설턴트의 문서와 설명이 자신이 가진 해당 영역 기술지식의 대부분이 되는 겁니다. 결과적으로는 그들의 말을 옮겨서 전해주는 것이 전부인 경우입니다. 신기술의 특성상 어느 정도까지는 이해하지만, 그게 너무 심화되거나 반복되면 오히려 사람까지도 식상해지게 만듭니다. \n사실 이건 저 조차도 자유로울 수 없는 이야기인지라 조금은 조심스럽습니다만, 어쨌든 적어도 우리 모두, 스스로 자각은 하고 있어야 할 것 같습니다.\n\n----------\n첨하는 글\n----------\n어떤 식으로든 피드백이 있으리라 생각했었고, 마침 댓글이 달려 덧글을 남기게 되었습니다.\n\n표현상으로든 단어적으로든\n\n우선, 읽으실때 심기 불편하게 해드린 것 같아 죄송하다는 사죄인사 먼저 드립니다.\n\n혹시라도 제가 특정 분야의 고수라던가 뛰어난 사람인것 같이 표현했다면, 제가 표현이 서투른 탓이니 너그럽게 봐주세요.\n\n어떻게 생각하실지 모르겠지만, 전 '고수가 되자'는 생각은 없습니다. 굳이 인생의 목표를 찾자면, 다 같이 즐겁게 지내며, 좋아하는 일 계속 할 수 있으면 좋겠다 정도일 겁니다.\n\n우려 표현하신대로, 스스로의 글에서 자유로운 사람도 아닙니다.\n\n다만,\n다른 사람 등 뒤에 뭍은 얼룩 보면서,\n난 깨끗한가? 돌아보고, 깨끗하네. 가자. 하는 식으로 그저 모른척 피해가는 사람이 많아 늘 아쉽곤 했습니다.\n\n저 조차도 그래왔습니다만, 나이를 먹어가며, 후배가 늘어가며 때론, 과연 그게 옳은 태도인가?라는 생각이 들곤 합니다.\n\n어쩌면 감정 건드리게 되고 본의아니게 오해사더라도,\n등 두드려 털어주고, 또 나는 어떤지 물어서 털어달라 부탁하며,\n그러다 혹여 오해 생기면 노력해 풀어가면서\n서로 같이 좀 더 나아진 모습이 되기 위해 노력하며 살고 싶은 마음이 큽니다.\n(생각만큼은 그게 그렇게 잘 되진 않더라구요. ^^;)\n\n제 글이\n비난과 비판의 애매한 경계로 들릴 수도 있겠지만, 나름 고민끝에 어려운 글 올렸습니다.\n\n다시한번,\n읽으실때 심기 불편하게 해드린 점에 대해선 죄송스럽게 생각합니다.\n\n부디 마음 푸시고, 편안한 밤 되셨으면 좋겠습니다.\n그리고, 마찬가지의 따뜻한 충고 감사합니다.\n\nps. 반성하는 의미로 표현을 조금 더 순화해보았습니다.\n\n#### Comments\n\n맞는 말입니다. 하지만 그런 말은 해서는 안됩니다.\n왜냐하면 더 잘하는 누군가가 당신을 바라볼 때 똑같은 생각을 하고 있을 것이기 때문입니다. 그리고 그 더 잘하는 사람은 당신에게 저런 말을 내뱉지 않을 것입니다. 진정한 고수이기 때문이죠.\n\n tgh | 2011-09-19 월요일 오후 11:54\n\n--\n\n표현상으로든 단어적으로든\n\n우선, 읽으실때 심기 불편하게 해드린 것 같아 죄송하다는 사죄인사 먼저 드립니다.\n\n혹시라도 제가 특정 분야의 고수라던가 뛰어난 사람인것 같이 표현했다면, 제가 표현이 서투른 탓이니 너그럽게 봐주세요.\n\n어떻게 생각하실지 모르겠지만, 전 '고수가 되자'는 생각은 없습니다. 굳이 인생의 목표를 찾자면, 다 같이 즐겁게 지내며, 좋아하는 일 계속 할 수 있으면 좋겠다 정도일 겁니다.\n\n우려 표현하신대로, 스스로의 글에서 자유로운 사람도 아닙니다.\n\n다만,\n다른 사람 등 뒤에 뭍은 얼룩 보면서,\n난 깨끗한가? 돌아보고, 깨끗하네. 가자. 하는 식으로 그저 모른척 피해가는 사람이 많아 늘 아쉽곤 했습니다.\n\n저 조차도 그래왔습니다만, 나이를 먹어가며, 후배가 늘어가며 때론, 과연 그게 옳은 태도인가?라는 생각이 들곤 합니다.\n\n어쩌면 감정 건드리게 되고 본의아니게 오해사더라도,\n등 두드려 털어주고, 또 나는 어떤지 물어서 털어달라 부탁하며,\n그러다 혹여 오해 생기면 노력해 풀어가면서\n서로 같이 좀 더 나아진 모습이 되기 위해 노력하며 살고 싶은 마음이 큽니다.\n(생각만큼은 그게 그렇게 잘 되진 않더라구요. ^^;)\n\n제 글이\n비난과 비평의 애매한 경계로 들릴 수도 있겠지만, 나름 고민끝에 어려운 글 올렸습니다.\n\n다시한번,\n읽으실때 심기 불편하게 해드린 점에 대해선 죄송스럽게 생각합니다.\n\n부디 마음 푸시고, 편안한 밤 되셨으면 좋겠습니다.\n그리고, 마찬가지의 따뜻한 충고 감사합니다.\n\nps. 반성하는 의미로 표현을 조금 더 순화해보았습니다.\n\n [doortts](http://blog.doortts.com) | 2011-09-20 화요일 오전 1:0\n\n--\n\n고수라고 뭐 다른게 있을까 싶기도 한데요~?!\n그리고 진정한 고수라서 내뱉지 않는게 아닌것 같은데요?\n\n [is윤군](http://helols.tistory.com) | 2011-09-28 수요일 오전 7:9\n\n--\n\n많은 반성(?)과 다짐을 하고 갑니다.\n\n항상 잘보고 있습니다! ^^\n\n 거친버스 | 2011-09-20 화요일 오전 10:31\n\n--\n\n감사합니다.\n\n저도 이렇게 글로 써서라도 늘 스스로의 반성과 다짐을 잊지 않기 위해 노력하려 합니다.\n\n [doortts](http://blog.doortts.com) | 2011-09-20 화요일 오전 11:48\n\n--\n\n뜩흠!!\n\n [Outsider](http://blog.outsider.ne.kr) | 2011-09-20 화요일 오전 10:45\n\n--\n\nMe Too!!\n\n [doortts](http://blog.doortts.com) | 2011-09-20 화요일 오전 11:46\n\n--\n\n조심스러운 부분이, 시니어 개발자와 신입 개발자 간 충돌 양상 중에서도 자주 겹치게 되는 그림이라는 생각을 하게 됩니다. 보통은 시니어 개발자들이 안전빵으로 들고 있는 것 버티는게 이미 숙련된 사람들이 있어서 안전하고 별 사고도 안치고 기존에 얻어온 가치들을 계속 유지할 수 있습니다. 아마 저 대사 읊는 시니어 개발자들 미워하는 신입 개발자들도 많을거다 생각합니다.;\n\n시니어 개발자들이 쉽게 할 수 있는 말은 '검증된 솔루션이냐?' 와 '기존 대비 얼마나 좋은데?' 입니다. 그리고 이에 대한 증거들을 신입 개발자들 (혹은 새로운 것을 소개하는)에게 강요합니다. 하지만 '도와주지 않는' 경우가 많습니다. 레거시 경험 가지고 BMT 해보려면 사실 신입의 경험으로는 어려운 점이 많죠. 새로운 것이니 벌써 숙련되었을 리는 만무하고, 튜닝 안되고 해당 기술을 이해 못한 상태에서의 파라메터 설정으로는 기존 기술보다 성능 안나오는 경우도 있을거고, 그리고 시니어에게 들고 가면 '거 봐라. 새로운 거 뭐 있어' 핀잔 들을 수 있고요.\n\n좀 더 발전적인 논의를 할, 다른 대화 방법이 있을 것 같습니다. '같이 검증해보자' 라던가, '같이 공부해보자' 라던가. 혹은 위에의 경우 처럼 대답을 못할 질문에 대해서 '답을 찾으려면 어떻게 해야 하는가' 라던가.\n\n [[1002]](http://twitter.com/free1002) | 2011-09-20 화요일 오전 11:4\n\n--\n\n네. 이야기 하신 경우가 종종 생기는 것 같습니다. \n\n새로운 걸 시도하고 싶어하는 쥬니어 엔지니어는 시니어들을 설득하기엔 여러가지로 조금씩 미숙하고,\n\n그걸 바라보는 시니어 엔지니어는 그런 '미숙함'을 핑계로 기회와 도움을 주지 않는 상황 말입니다.\n\n다만 가끔은 목적이 목표와 달라서 간극을 만드는 상황은 참 싫더라구요.\n\n- '기술' 그 자체를 써보고 싶어서 해보자는 경우와\n- 새롭게 배우고 적응하기 싫어서, 혹은 막연한 두려움에 거부 이유를 찾아내려 하는 경우\n\n둘 중 어느쪽이든, 좀 더 나은 SW개발이 목표인 상황에서는 좋지 않은 것 같습니다.\n\n [doortts](http://blog.doortts.com) | 2011-09-20 화요일 오전 11:45\n\n--\n\n말씀하시는 바가 맞긴 한데, 약간의 느슨함이 없으면 일하는 맛이 안날 것 같습니다. ^_^;\n새 기술의 도입에 있어서는, 필연적으로 try &  error 도 있는거고, 단기적인 비효율도 있을거고, 맹목도 있다가도, 그러다가 '離' 도 있을 것이라 생각합니다.\n주의를 기울이고 경계를 하고 '반성'을 해야 하는 것인지는 모르겠습니다. 그냥 팀 구성에서 적절히 두 성향이 균형이 맞아지고, 의사결정과 리스크 관리 방식이 합리적일 수 있다면 두 성향 다 잘 살릴 수 있지 않을까 하는 근거없는 낙관론 하나 던져봅니다.;\n\n [[1002]](http://twitter.com/free1002) | 2011-09-21 수요일 오후 1:29\n\n--\n\n글이 다듬어지지 않아 오해의 소지를 불러 일으킬 수 있다 치더라도, 저는 이글이 비판받아야하는 이유를 모르겠네요.\n말씀하신 촛점이 그런 생각은 고수가 되는 과정이며, '벼도 익을수록 고개를 숙이니' 자제하는 것이 좋겠다는 뜻인 것은 알겠습니다.\n\n하지만, 개인은 모두가 말할 수 있는 권리가 있다는 흔한 변론은 치우고라도,\n자기가 아는 바를 가지고 여기저기 부딪혀보며 성장해나가는 것은 노력하는 자의 자연스러운 모습입니다.\n또한 생각을 꺼내어 공유하여 다른 사람이 같은 실수를 반복하지 않을 수 있다면, 그 것으로 충분히 가치가 있습니다.\n\n제 생각에 이 글을 고수가 읽었다면 '나는 알지만 말하지 않는다.'는 말 대신에\n'ㅎㅎ 그런 생각도 하셨군요. 저도 그랬지요.'라는 말로 응원 했으리라 생각합니다.\n\n JD | 2011-09-20 화요일 오후 1:20\n\n--\n\n팀 동료나 그동안 같이 일해왔던 사람들이 이 글을 보면 내 얘기를 하는건 아닌가 뜨끔해하고 상처 받게 될수도 있겠지요^^\n\n 지나가다 | 2011-09-20 화요일 오후 1:59\n\n--\n\n안녕하세요.\n이런 얘기들은 이미 많이들 말씀 하셨고, 자기 다짐 혹은 반성적인 태도 쯤으로 보시면\n그렇게 건방지거나 한 표현은 아닌거 같습니다.\n매번 듣고 보는 글이지만\n나이가 들고, 직급이 올라 갈수록 공감되고, 글이 와 닿는 무게가 무거워 지는 기분이네요.\n\n [gt1000](http://gt1000.tistory.com) | 2011-09-20 화요일 오후 1:25\n\n--\n\n죄송합니다. 반성하고 있습니다 ㅠㅠ 항상 많이 배우고있습니다^^\n\n [스쿨쥐](http://swtest.co.kr) | 2011-09-21 수요일 오전 8:29\n\n--\n\n조금 다른 분야에서 일하다가 이쪽 관련 분야로 업을 옮긴지 얼마 안되어\n무엇이 옳은 일인지도 모르고 남들 따라하기 일쑤였는데\n스스로를 뒤돌아보게 합니다.\n당신의 말씀이 옳던 그르던 중요하지 않습니다.\n굳어지고 무뎌졌던 나의 사상을 건드려 움직이게 한 것에 대해 감사드립니다.\n\n hogata | 2011-09-23 금요일 오후 8:58\n\n--\n\n다듬어지지 않은 원글을 보고 싶네요. 지금 글을 봐서는 도무지 뭐가 문제였는지 모르겠네요.\n\n [박성철](http://me2day.net/geekinside) | 2011-10-02 일요일 오후 12:20\n\n--\n\n생각을 많이 하게되는 글이네요. \n저는 글 중에 \"대답을 못하면 안되는 질문이 있기 때문입니다\"  문장이 마음에 와 닿았습니다.\n\n해왔던 것들, 그리고 해나가야할 것들, 하고 싶은 것들에 잊지말아야할 문장인 것같습니다.\n\n\n samedi.yam | 2013-11-01 금요일 오전 10:38\n\n--\n"
  },
  {
    "id": 193,
    "title": "[dW Review] MongoDB 탐구",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1317287418000,
    "body": "> doortts | 2011-09-29 목요일 오후 6:10 | Better SW Development | [원본](http://blog.doortts.com/193)\n\n\n\n**MongoDB 탐구**\n[http://www.ibm.com/developerworks/kr/library/os-mongodb4/](http://www.ibm.com/developerworks/kr/library/os-mongodb4/ \"[http://www.ibm.com/developerworks/kr/library/os-mongodb4/]로 이동합니다.\") \n\n\n\nIBM DW에 올라온 기사입니다. 부제가 재밌네요. \n\n**\"이 데이터베이스 관리 시스템이 매우 인기 있는 이유를 확인한다.\"**\n\n확실히 MongoDB가 인기가 있긴 합니다. 아래 그림은 몇 가지 NoSQL 계열들에 대한 지난 12개월간의 Google Trends입니다.\n\n![google_trend_nosql.png](/files/21868)\n\n**[redis를 기준으로 mongodb, cassandra, couchdb, memcached의 비율을 찾아봤습니다.]** \n뭐냐. 이 뜬금없는 트랜드 조사는. 맴캐시드는 왜 낀거야? 이런 질문을 말아주세요. 그냥 그러려니 해주세요. : )\n\n아! 그리고 몽고DB  관련해서는 국내 번역서가 한 권 나와있습니다.\n\n![mongodb_cover.jpg](/files/21867) 얇고 내용도 가벼워서 쉽게 읽기에 좋습니다. 다만, 약 1년전 버전 기준으로 작성된 내용이라 현재 버전과는 조금 틀릴 수 있습니다. 이를테면 도큐먼트의 최대 사이즈가 책에는 4M로 나와있지만, 현재는 16M까지 지원한다던가, 예전에는 지원하지 않던 저널링(Journaling)이 최신 버전에서는 기본으로 지원한다던가 뭐 그런 식으로 말입니다. 하지만 MongoDB 운영자가 될 생각이 아니라면 위 책 정도로도 컨셉을 이해하기엔 충분합니다. 운영자가라면 어쩔수 없이 공식사이트의 레퍼런스를 봐야 합니다. 어쨌든...\n\nIBM의 기사도 번역서의 시작부분과 많이 유사합니다. 즉, 단순히 관심으로 살펴보고 싶다면 한글로 번역된 IBM기사도 괜찮습니다.\n\n아! 마지막으로 한가지 더!\n\n이건 여담입니다만,\nMongoDB의 Mongo의 유례는 뭐냐? 라고 묻는 분들이 있었는데\n\n\"자바 커피를 좋아했던 개발자가 자바이름 지은 것 처럼, 몽고간장을 좋아했던 개발자가 지은것 아니냐?\"라는 의견에 혼자 빵 터졌었습니다.\n\n찾아보니 humongous에서 따왔답니다. 굳이 우리나라 말로 번역 하자면 '겁나 큰' 정도쯤 되는 속어라고 하네요. :)\n ",
    "attachments": [
      {
        "id": 21867,
        "name": "mongodb_cover.jpg",
        "hash": "30fad39e329f1ee8fac0a030b7ac130aa69a4452",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 35487,
        "containerId": "12354"
      },
      {
        "id": 21868,
        "name": "google_trend_nosql.png",
        "hash": "c8e4b6d0501917586694670aab449db6d2201df7",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 148857,
        "containerId": "12354"
      }
    ]
  },
  {
    "id": 194,
    "title": "점점 더 마음에 들어가는 텍스트 에디터 Sublime Text 2",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1317309157000,
    "body": "> doortts | 2011-09-30 금요일 오전 12:12 | Better SW Development | [원본](http://blog.doortts.com/194)\n\n올해 초부터 Sublime Text 2라는 에디터를 간간히 쓰고 있습니다.\n[http://www.sublimetext.com/2](http://www.sublimetext.com/2 \"[http://www.sublimetext.com/2]로 이동합니다.\")\n\n![pythonHeroLarge.png](/files/21869)\n\n대략 이렇게 생겼습니다. 특이한점은 windows, linux, mac용 모두 제공하고, 강력한 번들기능으로 유명한 Textmate의 bundle을 호환 지원합니다.\n\n상용이긴 합니다만, unlimited trial을 제공하며 하루에 한번정도 구매 안내 팝업이 뜨는걸 제외하고는 별다른 제약도 없습니다. 가격은 59$인데요, 최근 textmate를 구매하지 않았다면 아마 이 제품을 구입했을 겁니다. distraction free라고 해서 최근 에디터들이 지원하고 있는 순수 검은 바탕에 타이핑만 나오게 하는 기능도 제공하고요, 그리고 무엇보다 개발자가 거의 매달 꾸준히 업데이트를 하면서 멋진 기능들을 계속 추가하고 있습니다.\n\n에디터를 커스터마이징 하는 설정이 정말 '천상 프로그래머용 에디터다'라는 생각이 들 정도로 다소 매니악 하긴 합니다만, 어렵진 않습니다. (vi만 하겠습니까~)\n\n대안 에디터를 찾고 계시다면 한 번 사용해 보시길 권합니다. 매니아들을 위해서는 vintage 모드라고 해서 vi 키 바인딩도 지원합니다. (이클립스에 vim 플러그인 쓰는 분들 계시죠? ㅎㅎㅎ) 이런식의 반짝이는 아이디어들이 많이 녹아있는 꽤 괜찮은 텍스트 에디터랍니다. :)\n\n#### Comments\n\n오호 좋은 어플 소개 감사합니다 ^^ 바로 설치했어요 ㅋ\n\n [수몽](http://soomong.net) | 2011-09-30 금요일 오후 2:46\n\n--\n\n마음에 드셨으면 좋겠어요~ :)\n\n [doortts](http://blog.doortts.com) | 2011-09-30 금요일 오후 9:7\n\n--\n\n우오오~ 실제로 써보니 너무 좋아요~ ^^ 오늘 설치하고 완전 매력에 빠져들고 있어요.\n\n 오리궁뒤 | 2011-10-18 화요일 오전 10:13\n\n--\n\n크~ 그지? 우분투에서는 더 좋아~\n\n [doortts](http://blog.doortts.com) | 2011-10-18 화요일 오후 10:42\n\n--\n",
    "attachments": [
      {
        "id": 21869,
        "name": "pythonHeroLarge.png",
        "hash": "d772568ac3357b343dd1fd064a1fba16838bb836",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 284846,
        "containerId": "12355"
      }
    ]
  },
  {
    "id": 195,
    "title": "[dW Review] 내 PC 안 어디에 뭐가 들었나?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1317386852000,
    "body": "> doortts | 2011-09-30 금요일 오후 9:47 | 이생각 저생각 | [원본](http://blog.doortts.com/195)\n\n한 때 구글이 구글 데스크탑이라는 개인 PC 검색 솔류션을 내 놓으면서 데스트탑 검색이 붐을 이루었던 적이 있었다. \"내 PC를 뭐 특별히 검색을 해야 해? \"라고 생각이 들 수도 있지만, PC가 HDD의 용량이 늘어나면서 보관되는 자료의 양도 예전과 다르게 많이 늘었다.\n\n보통 업무용 PC의 경우 각종 문서와 자료들이 난무하는데, 정리를 잘 하는 사람들은 자신만의 폴더체계를 각종 카테고리 번호와 함께 잘 관리한다. 흡사 Yahoo의 디렉터리 서비스를 보는것 마냥 개인 PC를 공용 파일서버처럼 쓰는 사람들도 많이 봤다. 그런데 일반적으로는 시간이 지나면 어디에 어떤 문서가 존재하는지 잘 생각이 안난다.\n\n검색을 한다고 하긴 하는데, 대부분은 파일명 위주의 검색이라 내용과 파일명의 유사성이 떨어지면 일일히 비슷한 문서들을 찾아서 열어봐야만 한다. 이점에 기인해서 마치 웹에서 검색을 하듯이 파일명뿐 아니라 자료내부의 컨텐츠까지 검색할 수 있게 해주는 것이 데스크탑 검색의 요점이다.\n\n한때 \"구글 데스크탑\"을 필두로 MS의 \"Windows Deskop Search\"등 다양한 개인PC 검색 프로그램들이 나왔다. 우리나라에도 \"네이버 내PC\"라던가 엠파스의 데스크탑 검색등등이 있었고, 서로 광고를 많이 했다. 하지만 지금은?\n\n서로 경쟁하던 제품들은 다들 사라졌다. 네이버 내PC 검색, 엠파스 검색등등은 이미 한참 전에 서비스를 종료했고, 이번달 2일에는 최후의 보루였던 구글 데스트탑 검색도 서비스를 종료했다. (http://googledesktop.blogspot.com/)\n\n점차 웹이 생활 깊숙히 들어오고, 요즘에는 클라우드니 뭐니 해서 자료도 점차 내 PC에 저장하지 않는 추세도 한몫 거들었는데, 결과적으로는 특별한 경우를 제외하고는 내PC를 검색할 일이 많이 줄어 든건 사실이다. 그나마도 요근래의 OS (윈도우 VISTA, 윈도우7, 맥OS)들은 데스크탑 검색 프로그램 수준까지는 아니더라도 인덱싱을 통한 짧은 시간안에 파일들을 찾아주는 기능들이 내장되어 있기 때문에 이런 전용 검색 프로그램의 수요는 더더 많지 않아졌다.\n\n오픈 소스 데스크탑 검색 엔진\n[http://www.ibm.com/developerworks/kr/library/os-desktopsearch/](http://www.ibm.com/developerworks/kr/library/os-desktopsearch/ \"[http://www.ibm.com/developerworks/kr/library/os-desktopsearch/]로 이동합니다.\")\n\n\n그래서 데스크탑 검색엔진은 방향을 조금 특화하고 있는데, 이를 테면 위 기사를 보면 이미지 검색이라던가 좀 더 정교한 검색을 가능하게 해주는 식으로 특화 영역을 잡고 있다. 어쨌든 개인 사용자는 자신의 PC 성능에 조금 민감한 편이라 위와 같은 검색 프로그램이 자신의 PC에 상주해서 동작해, 성능이 느려지면 못참아 한다.\n\n개인적으로 데스크탑 검색 프로그램은 그나마 앞으로는 팀 공용 파일서버 같은 곳에서 쓰이는 식으로 명맥을 유지 하지 않을까 생각한다. : )\n\nps.\n그 외에도 개인 데스크탑을 검색해서 인덱싱을 하는 것은 개인정보 보안문제에도 치명적일 수 있어서 이래 저래 말이 많았었다. 당신 PC안에서 잠들어 있는, 당신도 잊고 있던 동영상이나 사진의 존재를 인덱스 파일은 알고 있을 수 있기 때문이다."
  },
  {
    "id": 196,
    "title": "[dW Review] 웹 애플리케이션 자동화 테스트",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1317391254000,
    "body": "> doortts | 2011-09-30 금요일 오후 11:0 | 이생각 저생각 | [원본](http://blog.doortts.com/196)\n\n테스트 자동화는 QA들이 이루고자 하는 궁극의 단계중 하나입니다. 버튼 하나만 누르면 수십 수백개의 테스트가 알아서 돌고 결과를 알려준다는 건 제가 생각해도 짜릿합니다.\n\n예전에 옆 팀에서 win runner라는 자동화 툴을 사서 썼었는데 저한테 가끔씩 이런 말을 하곤 했었습니다.\n\n\"이게 한 copy에 얼마짜린줄 알아?\"\n\n정확히 기억은 안나지만 하여튼 그당시 제 기준으론 상상을 초월하는 가격이었습니다. (제 기억에 1000만원이하는 아니었습니다.) 단일 소프트웨어를 그정도 받을 수도 있구나 라고 처음 생각했었습니다. 그 뒤에 로드런너(load runner)라는 부하툴을 사용했었는데요, win runner만든 회사(머큐리얼)에서 부하 테스트 전용으로 win runner의 기능 일부를 차용해서 만든 소프트웨어 였습니다. 뭐 것도 만만치 않게 비쌌습니다만, 몇 대의 PC로 몇 십명의 동시 테스트, 부하테스트 인원을 대체할 수 있었기때문에 가격값은 했던것 같습니다. 그런데 문제는 말이죠, win runner나 로드런너나 단순 레코딩은 간단했지만, 변수값을 변경하면서 실행하도록 스크립트를 짜는 것은 쉽지가 않았습니다. 전문 인력을 키워서 그것만 전담하게 만들어야 했을 정도라 다른 일반 개발자들은 사용할 엄두를 쉽게 못냈습니다.\n\n시간은 흘러흘러 웹이 대두되면서, 그리고 오픈소스가 확산되면서 오픈소스 웹 테스트 툴도 많이 나왔습니다. 최근 가장 유명한 건, 역시 셀네늄(selenium)인 것 같습니다. 그 외에도 몇 가지 있었습니다. (이클립스 TPTP라던가 MS Stress라던가)\n목적이 조금씩 다르고 UI도 다르고 주 사용목적도 다르긴 합니다만, 어쨌든 웹 애플리케이션용 자동화 테스트 도구로 나름 열심히 써봤습니다. (전 대체 뭘 하는 사람인걸까요? -_-) 이번 IBM 기사에는 Sahi라는 자동화 도구를 소개하고 있네요.\n\nSahi로 웹 애플리케이션 테스트 자동화\n[http://www.ibm.com/developerworks/kr/library/wa-sahi/](http://www.ibm.com/developerworks/kr/library/wa-sahi/ \"[http://www.ibm.com/developerworks/kr/library/wa-sahi/]로 이동합니다.\")\n\n\nSahi Pro라는 상용제품도 있는데, 글쎄요.. 흠..\n\n자. 여기부터는 전적으로 저 개인의 경험과 생각입니다. 절대적인건 아니니까 걸러서 들어주세요. (무슨 말을 하려고!!!)\n\n- 웹 UI테스트는 쉽지 않았습니다. 쉽지 않다는 건 여차하면 수동 테스트에 비해 ROI가 크게 높지 않을 수 있다는 걸 뜻합니다.\n- 사용자 동작을 그대로 녹화만 하는 UI 레코딩 툴들도 Robust 정도가 높지 않았습니다. 환경이 조금만 변해도 제대로 안 돌아가는 경우가 많았습니다.\n- 사용자의 동작을 스크립트로 짜서 실행하는 툴들도 있었습니다. (대표적 셀레늄) 마찬가지로 스크립트 작성이 쉽지 않았고, 유지보수의 문제가 있었습니다. 브라우저별로 조금씩 스크립트가 달라져야 하는 경우도 있었습니다.\n- 즉 UI 자동화 테스트는 기술적으로 테스트가 가능하냐 안하냐, 할 수 있냐 없냐의 문제보다 지속가능하냐, 유지가능하냐의 문제를 더 고려해야 했습니다.\n- 그리고 학습이 상당히 필요해서 스크립트 만들어서 옆 동료 던져줘 봐야 소용없는 경우가 많습니다. 그래서 스크립트 방식은 웬만한 팀이나 인력이 아니라면 권장하고 싶지 않습니다.\n- UI 변경이나 리팩터링시에 스크립트나 레코딩을 다시 작성해야 하는 경우에는 일이 더 복잡해지도 했습니다.\n\n그래서 제 개인적으로 내린 결론은 'UI 테스트 자동화는 완성품에 대한 사용자 액션 레코딩이 그나마 제일 유용하다'입니다.\nUI를 단위테스트처럼 작성하는건 개발 도중엔 매우 비추합니다. 출시 후에도 변경에 대한 비용은 단단히 각오해야 합니다.\n\n그리고 마지막으로,,\n\n어설픈 무료제품은 쓰지 마세요. 감당이 안됩니다.\n\n#### Comments\n\n전적으로 동감합니다.\n화면기반 테스트를 자동화 하면,\n두 유형의 반응이 있더군요.\n하나는 이제 화면 테스트 자동화를 했으니 단위테스트는 이것으로 대체!(성공 말고 실패했다면 어떻게 추적하시게요?)\n또 하나는 아.. 이 에러는 내가 손으로 해도 알 수 있으니 내가 모르는 뭔가 심오한 에러를 뱉어주게(넣은게 이정도인데\n어떻게 알아서 에러를 잡아내라는거죠...)\n그 외 기타 의견은 나중에 만나서 이야기하시죠.\n잘 봤습니다. \n(입력하면서 비밀번호를 한자리 넣어봤거든요... 경고창에서\n비밀번호는 한자리 이상 넣으셔야 합니다. 라는데,\n한자리 이상이면 한자리도 포함하는게 아닌지요..^^)\n\n 성현 | 2011-10-02 일요일 오전 12:28\n\n--\n\n성현님!! \n개인적으로 이야기 들려주시는 것도 좋지만, \n이분야는 특히 전문분야시잖아요~\n언제 한번 정리해서 공유해 주세요~\n\n다들 도움되고 좋아할거에요~~\n\n기대할래요~\n\n [doortts](http://blog.doortts.com) | 2011-10-02 일요일 오후 12:17\n\n--\n"
  },
  {
    "id": 197,
    "title": "[뭘, 이런걸 다?] USB 메모리를 우분투 Live CD로 만들기 (초간단!)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1317556795000,
    "body": "> doortts | 2011-10-02 일요일 오후 8:59 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/197)\n\n예전엔 우분투(ubuntu) 같은 리눅스를 설치하려고 CD를 굽곤 했었는데요, 요즘엔 USB 부팅을 많이 지원하기 때문에 굳이 CD로 구울 필요가 없어졌습니다. \"**남는 USB 메모리를 우분투 Live CD로 만들기**\"입니다.\n\n1.우분투 공식 사이트, 혹은 우분투 한국 사용자 모임(www.ubuntu.or.kr)에서 ISO 이미지를 내려받습니다.\n\n2\\. [Universal USB Installer](http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3 \"[http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3]로 이동합니다.\") 를 내려받아 실행합니다.\n\n3\\. ISO 이미지 파일과 USB 드라이브 경로를 선택하고 create 를 누릅니다.\n\n![Universal-USB-Installer.png](/files/21870)\n\n4\\. 침착하게 기다리면 끝!\n\n![Universal-USB-Installer2.png](/files/21871)\n\n이제 이 USB로 다른 PC에서 우분투 Live로 부팅해 우분투를 쓰거나 install 할 수 있습니다.\n\nps.\nUniversal USB Installer 대신 [UNetbootin](http://unetbootin.sourceforge.net \"[http://unetbootin.sourceforge.net]로 이동합니다.\")를 사용해도 동일합니다.",
    "attachments": [
      {
        "id": 21870,
        "name": "Universal-USB-Installer.png",
        "hash": "87e2d2fabd55dca7e6af0fc01dad2d1be857f149",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 30932,
        "containerId": "12358"
      },
      {
        "id": 21871,
        "name": "Universal-USB-Installer2.png",
        "hash": "cea41a49172f09754616b191ef8b2ced1b529ba2",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 25638,
        "containerId": "12358"
      }
    ]
  },
  {
    "id": 199,
    "title": "잘 못하는 것에 대한 즐거움",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1318772137000,
    "body": "> doortts | 2011-10-16 일요일 오후 10:35 | 이생각 저생각 | [원본](http://blog.doortts.com/199)\n\n어느 한 기술 영역이 뒤떨어지진 않도록 노력은 해 왔습니다만, 어느날 보니 제가 거의 지식이 없는 개발 영역이 있다는 걸 알게 되었습니다. 바로 UI와 자바스크립트(Javascript) 입니다. 이 두 영역은 겨우 문법알아서 간신히 쓰고 있는 수준이지, 기술에 대한 연차는 뭐라 매길수 조차 없는 수준입니다. CSS는 참고해서 넣고, 자바스크립트는 간단한 호출이나 jQuery를 가져다 샘플 참조해서 단순히 쓰는(using) 수준이거든요. 뭐. 한마디로 초보인거죠.\n\n관련내용 : [[서평] 거침없이 배우는 자바 스크립트](http://blog.doortts.com/142 \"[http://blog.doortts.com/142]로 이동합니다.\")\n\n그러던 와중에 지난 7월부터  우연히 FRENDS([http://frends.kr](http://frends.kr/ \"[http://frends.kr/]로 이동합니다.\"))라는 프론트앤드 개발자 스터디에 참석하게 되었습니다. 뭣 모르고 참석했습니다만, 참가한 첫날부터 기술적 충격이 이루 말할 수 없었습니다. 참여하신 분들의 수준이 어찌나 높으시던지, 무슨 말인지 이해도 안되는 단어들이 난무할 정도였습니다. 네. 그랬습니다. 계신분들의 나이고하를 떠나 프론트앤드 기술에 대해 제가 제일 잘 모르고 제일 잘 못하더군요. 멍하면서 두려우면서 - 따라갈 수 있을까? - 즐거웠습니다.\n\n![frends-iphone-540x405.jpg](/files/21872)\n\n**[짤방?]**\n\n그렇게 해서 자바스크립트 공부를 하기 시작했는데요. 공부를 하면 할 수록 재밌더군요. 잘 모르는 부분이니까 그 만큼 많이 배운다는 느낌이 들기 때문인것 같기도 합니다. 모르는 것, 잘 못하는 걸 배우는 것은 생각보다 어렵고 힘들지만 그만큼 재미도 있는것 같습니다. 다행히 주변에 좋은 분들도 많이 계시고 먼저 나아가신 분들이 인터넷에 올려놓은 자료도 많아, 도움 많이 받고 있습니다. 참 고마운 일입니다.\n\n저도 배우게 되는 지식, 열심히 배워 열심히 나누도록 하겠습니다. \n아직 프론트 앤드쪽에 대해서 아는게 미천한지라, 깊은 지식은 못되겠지만, 그래도 저와 비슷한 경로로 뒤을 밟게 될 누군가를 위해서 조금씩이라도 나눔을 실천할 생각입니다. :D\n\nps.\n최근엔 FRENDS 스터디 분들이 많이 바빠지셨고, 저도 만만치 않다 보니 일주일에 하루 모이는 것도 쉽지 않더라구요. 평일 업무 마치고 만나려니 저 같은 경우엔 체력적으로도 쉽지 않고요. 이래저래 좀 아쉽습니다. 그리고 스터디 발표를 위해 시간을 내서 스터디 준비하는 것도 생각보다 쉽지 않았습니다. 그래서 일과 후가 아닌 다른 시간대(좀더 기운과 정신이 쌩쌩한 시간대)를 찾아 다른 분들과 함께 프론트 앤드 관련 학습을 진행해 볼까 합니다. 현재는 마의 시간대라 불리는 토요일 오후(1시~4시)정도 생각하고 있습니다만, 조금 유연하게 움직여 볼까도 생각중입니다. 관련해서는 조만간 글을 따로 올릴 생각입니다만 혹, 함께 스터디 하실 분 계시면 메일이나 댓글로 미리 알려주세요. 따로 연락드릴게요. : ) \n\nps2. 여기부턴 개인기록 넋두리.\n.\n.\n.\n.\n.\n.\n. \n\n.\n\n사실 최근엔 일이 많아져서 매우 바쁘게 살고 있습니다. 그렇게 된지 한 몇 달 되었습니다. 다들 그렇겠지만, 어쨌든 제 입장에서는 이 정도로 바쁜 시절도 참 오랜만인것 같습니다. 제가 원체 체력이 저질이라 곧잘 속칭 갤갤~ 거리는데, 아직 쓰러지진 않았네요.-,-);;  시간이 부족해서 점심을 삼각김밥이나 빵으로 제 자리 앉아 때우기도 일수 였고, 추석때도 이틀만 쉬었고(아.. 내내 나오셨다고요? 죄송합니다..), 창립기념일도 나오고, 그리고 거의 매 주말 출근을 했었습니다. 주말내내 회사를 안 간 건 이번 주가 두 달 반 만에 처음인것 같아요. : )\n\n그런데 그렇게 회사에 올인하다보니 오히려 살짝 반동심리가 생기더라구요. '이러다간 큰일나겠다. 내인생이 없어지고 있잖아~!!' 싶었던걸까요? 어쨌든 시간을 쪼개서 학습에 시간을 쓰려 노력하기 시작했습니다. 사내에 스터디도 만들고, 12시에 끝나는 날은 늦더라도 잠을 좀 줄여 공부하고, 점심시간을 쪼개서, 아침시간에 일찍 나와서 공부하기도 했습니다. 한 번은 사내 필수 교육을 받으러 간 날이 있었는데, 공부할 내용 프린터 출력물을 들고 쉬는 시간마다 꺼내서 보고, 실습 얼른 마치고 컨닝페이퍼 꺼내보듯 보고 그러기도 했습니다. 쓰고보니 좀 궁상맞긴 하네요. ;;; (그런데 나이도 있고, 머리도 떨어져서 그런지 많이 남지는 않아요;;;)\n\n뭐, 아마 누가 시켜서 했으면 이렇겐 못했을 것 같습니다만...\n\n어쨌든 모르는 부분을, 그리고 심지어 '이정도로 모를 수 있나?'싶은 부분을, 떠듬떠듬이지만 배워나가니 참 재밌습니다. 예전에 새벽 5시반이면 출근을 해야 하던 시절에 어두운 언덕길을 쓰레기 청소차와 함께 올라가며, 눈물이 주륵. 아! 내가 무슨 부귀영화를 누리겠다고 이리살고 있나? 라고 한탄하면서도 한편으론, '젠장! 그래도 일이 적성엔 맞네.. 어쩌지..' 했던 시절이 떠오르더군요. 힘들었지만 많이 배웠던 시절이거든요.\n\n\n아.. 또 넋두리네요. 블로그는 본인좋자고 쓰는것이면서 동시에 RSS라는 미디어 형태상, 따로 읽으시는 분들도 있으시니 때때로 묘~ 한~ 느낌입니다. 자칫하면 의도와 관계없이 '**재수없~**'이렇게 되거든요. -,-;; 언제든 혹시라도 오해하진 말아주세요.\n\n**'저 그렇게 나쁜 사람 아니에요~ ㅎㅎㅎ' \n\n **\n\n#### Comments\n\n수원님이 잘 모르신다고 하니까 이 말이 떠올랐습니다. ^^;;\n\n지식의 깊이가 있는 사람은 10개중 9개는 모른다고 한다.\n( 즉. 자기가 제대로 알고 있는 분야의 지식만큼 알고 있지 않으면 나머지는 모른다는 것 )\n하지만 지식이 얕은 사람은 10개중 9개를 안다고 한다.\n( 지식이 얕으므로 그만큼 알면 다 아는 것 )\n\n [수몽](http://soomong.net) | 2011-10-17 월요일 오전 9:25\n\n--\n\n-_-;; 왜 이러세요.. 지금 이지메 하시는거죠?\n\n [doortts](http://blog.doortts.com) | 2011-10-17 월요일 오후 2:27\n\n--\n\n수원님  \"나눔을 실천\"  기대 할게요.\n\n [상피리](http://blog.sangpire.pe.kr) | 2011-10-17 월요일 오후 12:59\n\n--\n\n노력하겠습니다. :)\n\n [doortts](http://blog.doortts.com) | 2011-10-17 월요일 오후 2:28\n\n--\n\n피곤이 느껴지실 때는 6년근 홍삼입니다!!\n\n [parkpd](http://parkpd.egloos.com) | 2011-10-21 금요일 오후 5:57\n\n--\n\n안그래도 진지하게 고민중입니다.어디가 좋을지 다음에 뵐때 알려주세요.ㅎ\n\n [doortts](http://blog.doortts.com) | 2011-10-24 월요일 오전 1:15\n\n--\n\n오.. 스터디 하고 싶네요. 프렌즈 스터디 저도 신청하려고 했었는데 공고 나자마자 마감되어 버려서..;\n\n [lump3n](http://lump3n.com) | 2011-10-23 일요일 오후 1:54\n\n--\n\n이메일 남겨주시면 스터디 진행때 안내 메일 드릴게요. :)\n\n [doortts](http://blog.doortts.com) | 2011-10-24 월요일 오전 1:14\n\n--\n\n스터디가 진행중인지 모르겠네요^^ 늦지않았다면 함께하고싶습니다~ 그럼 좋은 하루 되세요~:) 메일주소는 planetes81@gmail.com 입니다~:)\n\n Woong | 2011-11-01 화요일 오전 9:45\n\n--\n",
    "attachments": [
      {
        "id": 21872,
        "name": "frends-iphone-540x405.jpg",
        "hash": "c9d3fb03e29eee1da156761dc660909bb42bfcc8",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 72086,
        "containerId": "12359"
      }
    ]
  },
  {
    "id": 200,
    "title": "DEVIEW 2011 \"NHN 애자일 개발 어떻게 진행하고 있나?\"에 참여합니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1318775008000,
    "body": "> doortts | 2011-10-16 일요일 오후 11:23 | 이생각 저생각 | [원본](http://blog.doortts.com/200)\n\n이번주 화요일(18일)에는 DEVIEW 2011이라는 개발자 컨퍼런스가 열립니다.\n[http://www.deview.kr/2011/about/guide.html](http://www.deview.kr/2011/about/guide.html) \n\n![deview2011.png](/files/21873)\n\nNHN이 주최하고 SK커뮤니케이션즈, KTH, 한국마이크로소프트에서 공동 참여하는 행사로 개발자라면 혹할만한 좋은 내용이 많이 있습니다.\n\n비록 무료 행사이긴 하지만, 평일에 진행하는 행사라 과연 어느정도 인원이 신청하고 참석할까 궁금하기도 하고 내부에서는 걱정도 했었습니다만, 참석 신청사이트를 오픈한지 7시간여만에 3000명 모집이 마감되고 말았습니다. 다들 놀랐습니다. 그리고 대다수가 학생이 아닌 직장인이라는 결과에도 한 번 더 놀랐고요.\n\n빠른 마감으로, 혹은 참석하지 못하는 상황으로 많은 분들이 아쉬워 하셨습니다만, 본 컨퍼런스는 현장중계를 하고 추후에도 동영상으로 제공할 예정이기 크게 서운해 하진 않으셔도 될 것 같습니다. :)\n\n에... 그리고.. 저도 행사에 참여합니다. (^_^);;;\n\n** \"NHN 애자일 개발 어떻게 진행하고 있나?\"** 13:00~ 14:30\n[http://www.deview.kr/2011/track/E_01.html](http://www.deview.kr/2011/track/E_01.html) \n\"본 세션은 마치 박람회장에 온 사람들이 자신들이 원하는 부스에 방문하여 원하는 상품의 설명을 듣는 것 처럼 진행될 예정입니다**. NHN에서 애자일 개발을 전파하는 생산성혁신랩의 전문가들이 3개의 부스를 오픈하게 되며 참석자들은 3번의 이터레이션 동안 각 부스를 돌아다니며 원하는 내용을 고루 들을수 있습니다.** 각 부스에서 다루게 될 내용은 반복점진 개발방법으로 대표되는 애자일 프로세스, CI, TDD등과 같은 애자일 실천법에 대한 내용이며 짧은시간에 NHN의 애자일 개발 노력을 생생하게 들을수 있는 세션이 될거라 기대합니다.\" - 세션소개 中\n\n위 설명에서 나온 3개의 부스 중에서 애자일 프로세스 부스의 담당으로 메인 발제자 황상철님과 함께 짝을이뤄 진행할 예정입니다.\n\n살짝 팁을 하나 드리자면, 본 세션은 동영상 중계가 되지 않을 예정입니다. 그리고 살짝 인원제한도 있습니다. 짧은 시간안에 애자일의 다양한 부분들, 특히 잘 보기 어려운 다른 회사의 애자일 방식에 대해 보고 느낄 수 있는 시간이 되리라 생각합니다. 일반론적인 이야기가 아닌 굉장히 솔직하고, 굉장히 직접적인 이야기를 들으실 수 있을겁니다. 그리고 용기있으신 분은 부스에서 '미인'을 얻진 못하시겠지만, ??을 얻으실 순 있을겁니다. 혹시 보시면 아는척 해주세요. 부스에서 제 블로그의 너구리 그림이랑 비슷하게 생긴 사람을 찾으시면 됩니다. (눈 밑 다크서클???)\n\n: )\n\n#### Comments\n\n12:50에왔는데 마감되어 들어가지 못하고 있네요 흑....\n\n DongwooKim | 2011-10-18 화요일 오후 1:3\n\n--\n\n아.. 그러셨군요... 저도 아쉽네요...\n혹시라도 제가 미리 알았으면 입장권드렸을텐데...\n뭐, 다음에 또 기회가 있겠죠. : )\n\n오늘 재밌게 즐기다 가셨길 바랍니다.\n고맙습니다.\n\n [doortts](http://blog.doortts.com) | 2011-10-18 화요일 오후 10:42\n\n--\n",
    "attachments": [
      {
        "id": 21873,
        "name": "deview2011.png",
        "hash": "e14f961c49c2a36271ee772145617b03ae27dc33",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 213854,
        "containerId": "12360"
      }
    ]
  },
  {
    "id": 204,
    "title": "DEVIEW 2011 참가 후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319383700000,
    "body": "> doortts | 2011-10-23 일요일 오후 11:26 | Better SW Development | [원본](http://blog.doortts.com/204)\n\n이전 글 \"DEVIEW 2011 [\"NHN 애자일 개발 어떻게 진행하고 있나?\"](http://blog.doortts.com/200 \"[http://blog.doortts.com/200]로 이동합니다.\")에 참여합니다.\"에서 이야기 드렸던 DEVIEW 2011 사진으로 보는 발표후기 입니다.\n\nNHN 생산성혁신랩이라는 네이버 포탈본부 소속의 전사조직 랩의 맴버들이 발표자로 참여했습니다. 메인 발제자는 황상철(수석)님이셨습니다.\n\n우선 짧막한 소감을 먼저 이야기 드리자면, 사람이 참 많았습니다. 그런데 세션에 인원제한(90명)이 있었어서 많은 분들이 아쉬워 하셨었습니다. 발표했던 저희들도 매우 아쉬웠습니다. 그리고 좀 더 시간이 있었으면 더더 오밀조밀하게 재밌게 진행할 수 있었을텐데 하는 아쉬움이 남네요. 관련해서는 [XPer 모임](http://xper.org \"[http://xper.org]로 이동합니다.\")에서 **Remake 형식**으로 다시 한 번 진행해 보기 위해 논의중입니다. :D\n\n\n\n참고로 DEVIEW 자료는 아래에서 확인 가능합니다.\n공식사이트: [http://deview.kr/2011/](http://deview.kr/2011/) \n발표슬라이드: [http://www.slideshare.net/deview/](http://www.slideshare.net/deview/)\n\n참고로 이전 [Post](http://blog.doortts.com/200 \"[http://blog.doortts.com/200]로 이동합니다.\")에서 이야기 드렸던 것 처럼,\nE, F 트랙을 제외한 DEVIEW의 다른 세션들은 11월초에 동영상이 공개될 예정입니다.\n다른 세션에 참석못하셨던 분들은 조금만 기다리시면 되겠습니다. :)\n\n![2011deview.jpg](/files/21878)\n**멀티비전으로 보여지는 DEVIEW 2011 로고\n ![deview00.jpg](/files/21882) 부스 세미나가 진해오딘 E트랙 핸즈 온 랩 룸** \n\n![deview01.jpg](/files/21879)\n\n**체크인 중인 모습. 본인이 생각하는 애자일을 그림으로 그려서 주변 사람들과 공유하는 시간입니다.**\n\n![deview02.jpg](/files/21881)\n\n**체크인 중인 모습들 (룸의 왼쪽편)**\n\n![deview03.jpg](/files/21877)\n\n**TDD부스를 운영하신 두 분 과장님과 가운데 있는 저 :)**\n\n![deview04.jpg](/files/21880)\n\n여긴 애자일 프로세스 부스. 황상철 수석님(화면 좌)과 함께 진행했습니다. 저는 화면 추즉에 팔짱끼고 서서 이야기 했습니다.\n\n![deview05.jpg](/files/21884)\n\n**TDD 부스 진행 중. NOMAD엔지니어로 활동 중이신 세 분 입니다.**\n\n![deview06.jpg](/files/21875)\n\n**애자일에 대한 느낌에 대한 어느 분의 그림**\n\n![deview07.jpg](/files/21874)\n\n**애자일에 대한 느낌에 대한 어느 분의 그림2**\n\n![deview10.jpg](/files/21883)\n\n**애자일에 대한 느낌에 대한 어느 분의 그림3** \n\n[deview08.jpg](/files/21876)\n**회고때 나온 포스트 잇 중 하나. 대체로 비슷한 의견이 많았습니다.**\n\n기타  DEVIEW 2011에 대한 다른 링크들. **애자일 세션이야기**가 나오는 링크만 조금 추려봤습니다. : )\n\n**일상다반사**\n\n[http://alica_park.blog.me/30121218562](http://alica_park.blog.me/30121218562 \"[http://alica_park.blog.me/30121218562]로 이동합니다.\")\n\n**실용주의이야기 - 발표자 황상철님 블로그**\n\n[http://pragmaticstory.com/1838](http://pragmaticstory.com/1838 \"[http://pragmaticstory.com/1838]로 이동합니다.\")\n\n**웹으로 말하기**\n\n[http://mytory.co.kr/archives/1955](http://mytory.co.kr/archives/1955 \"[http://mytory.co.kr/archives/1955]로 이동합니다.\")\n\n**열이아빠의 RIA 이야기**\n\n[http://olpost.com/v/3069878](http://olpost.com/v/3069878 \"[http://olpost.com/v/3069878]로 이동합니다.\")\n\n**박피디의 게임 개발 이야기**\n\n[http://parkpd.egloos.com/3752908](http://parkpd.egloos.com/3752908 \"[http://parkpd.egloos.com/3752908]로 이동합니다.\")",
    "attachments": [
      {
        "id": 21874,
        "name": "deview07.jpg",
        "hash": "6b4fdfbc51925366ceaeed785921c94288e1a177",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 34902,
        "containerId": "12361"
      },
      {
        "id": 21875,
        "name": "deview06.jpg",
        "hash": "c97741c91dd7f1c2121d6a6135f01605eb5f1a74",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 38693,
        "containerId": "12361"
      },
      {
        "id": 21876,
        "name": "deview08.jpg",
        "hash": "148413c9d4715933a998225eb826c9d11845d033",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 48909,
        "containerId": "12361"
      },
      {
        "id": 21877,
        "name": "deview03.jpg",
        "hash": "492ac4aa113eda7f934bbba36ac02b98707839bb",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 61604,
        "containerId": "12361"
      },
      {
        "id": 21878,
        "name": "2011deview.jpg",
        "hash": "abab4a01d5beb021b7c0ef95ff32b1096154b893",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 43199,
        "containerId": "12361"
      },
      {
        "id": 21879,
        "name": "deview01.jpg",
        "hash": "e94d5fd1a0ef94ef74d56f3f23d889f5b197b713",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 69520,
        "containerId": "12361"
      },
      {
        "id": 21880,
        "name": "deview04.jpg",
        "hash": "0088a38316c2fd77e6bd77fb1a77c85bed369fdd",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 68466,
        "containerId": "12361"
      },
      {
        "id": 21881,
        "name": "deview02.jpg",
        "hash": "53cb8827e60e6b07d1437247b0b58b80415892d0",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 72284,
        "containerId": "12361"
      },
      {
        "id": 21882,
        "name": "deview00.jpg",
        "hash": "4ca2c2d49e51c148140724dd293cce2b43eacad4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 53085,
        "containerId": "12361"
      },
      {
        "id": 21883,
        "name": "deview10.jpg",
        "hash": "3c4cf55636e32fd62d694b3a2edc44188206dea1",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 46466,
        "containerId": "12361"
      },
      {
        "id": 21884,
        "name": "deview05.jpg",
        "hash": "d630a64d7df70f2f36b3981af6b05afd9ad06769",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 61359,
        "containerId": "12361"
      }
    ]
  },
  {
    "id": 205,
    "title": "기간한정 자바스크립트 학습모임 Octobersky.js",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319386362000,
    "body": "> doortts | 2011-10-24 월요일 오전 1:12 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/205)\n\n\"[10월의 하늘](http://www.nanumlectures.org/ \"[http://www.nanumlectures.org/]로 이동합니다.\")\"이라는 지식기부 모임이 있습니다. \n\n\n\n\n\n은 전국 중소도시의 도서관에서 해당 지역의 청소년들을 대상으로 개최되는 ‘도서관 과학 강연’ 행사입니다. \n\n은 기획에서 준비, 당일 강연 및 행사진행에 이르는 전 과정이 오로지 기부자들의 재능 나눔으로 이루어집니다. 이를 통해 재능 기부자들에게는 이웃과 사회를 위해 봉사하고 자신이 가진 재능을 사회적 재능으로 확산시킬 수 있는 기회를 제공하며, 참여 청소년들에게는 과학이 주는 즐거움을 맛보고 우주와 자연이 주는 경이로움을 체험할 수 있도록 하는데 목적이 있습니다. 나아가 재능을 나누는 사람과 그 재능을 전달받는 사람이 서로 따듯한 교감을 나눔으로써, 본 행사를 통해 실천된 재능기부 문화를 사회 전반으로 확산시키고, 지속적인 생명력을 갖도록 하자는 비전을 가지고 있습니다. \n\n- 10월의 하늘 소개 페이지 중에서 \n\n\n\n비록 제 자신이 지식기부 나눔을 적극적으로 하고 있지는 못하지만, 진행하시는 분들의 노력과 취지를 소개하고 널리 알리며, 그 뜻을 지지한다는 뜻에서 이번 기간한정 자바스크립트 학습 모임을 **Octobersky.js**라고 이름지었습니다. 일종의 오마주(Hommage)입니다. :D\n\n학습모임의 진행 주제는 미리 살짝 예고를 드렸던대로 크게 세 가지입니다.\n\n-  **자바스크립트 고급 **\n-  **node.js** [http://nodejs.org/](http://nodejs.org/)\n-  **DART** [http://www.dartlang.org/](http://www.dartlang.org/) 그리고 이게 무슨 마트 타임세일은 아니지만, 그래도 기간한정(10회)으로 몰입해서 진행할 예정입니다. 사실, 생각과 준비는 시간적으로 한참 되었습니다만 이런저런 문제, 특히 저의 회사 일상생활(...젝일)로 인해 늦어졌습니다. 적어도 octobersky.js라는 이름은 부끄럽지 않게 10월이 가기전에 시작할 예정입니다.\n\n현재 계획으로는 이번주에 멤버 모집을 마치고 예비모임을 가질 예정입니다. 사내멤버/사외멤버 Joint 방식, 시간과 진행방법에 다소 논의가 있어 조금 늦어지고 있습니다. :(\n\n그리고 병행해서 [http://dailyjs.com/](http://dailyjs.com/) 의 교육용 튜터리얼들에 대한 번역기재를 허락 받아서 현재 번역중에 있습니다. 다만, 해당 튜터리얼이 쓰인 시점과 현시점 사이의 간극(버전업 및 상황 변화)으로 인해 차이나는 부분들을 손보느라 -마찬가지로- 조금 늦어지고 있습니다. 조만간 사이트를 통해 공개하도록 하겠습니다. :)\n\n스터디 장소에서 진행되는 내용을 공유하기에는 물리적/시간적으로 어렵겠지만, 부산물에 대해서는 공유하도록 하겠습니다. 부디 지치지 않도록 응원해주세요. 크~ :D\n\n- 추가 -\n현재는 목표를 하나로 바꿔서 node.js 학습 및 공유 모임이 되었습니다.\n\n#### Comments\n\n저에게 아쉽게도 뒤늦게 이 글을 봤네요. 직접 참여하고 싶은데, 다음에 좋은 기회가 오겠죠? ㅎㅎ\n이런 자리 마련해주셔서 감사합니다.\n\n 요 | 2011-12-09 금요일 오전 11:8\n\n--\n\n지금도 늦지 않았어요. 시간 제한 같은 것 없으니까, 룰대로 '학습하시고 댓글달기' 진행하시면 됩니다. : )\n\n [doortts](http://blog.doortts.com) | 2011-12-09 금요일 오후 2:5\n\n--\n"
  },
  {
    "id": 206,
    "title": "[node.js 따라배우기 00] 온라인 스터디 오리엔테이션",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319559207000,
    "body": "> doortts | 2011-10-26 수요일 오전 1:13 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/206)\n\nOctoberSky.js 스터디 활동의 일환으로 금주 금요일부터 \"node.js 따라배우기\"를 시작합니다.\n\n**왜 하필이면 node.js인가?**에 대해서는 학습해 나가면서 차차 알아가 보기로 하고 우선 진행 먼저 합니다. :)\n\n그리고 **node.js 따라배우기**는 오프라인 스터디와는 별개로 온라인상으로 진행될 예정입니다. (오프라인 스터디는 현재 인원문제로 두개로 쪼개야 하나 어째야 하나 머리아파 하고 있습니다.) 온라인 스터디의 큰 주제는 [node.js](http://nodejs.org \"[http://nodejs.org]로 이동합니다.\")와 재미진 자바스크립트 라이브러리들을 이용해서 nodepad라는 앱을 만드는 내용입니다. \n\n제가 이쪽분야 전문가가 아니고 저도 배우는 입장인지라, 이 따라배우기는 http://dailyjs.com의[ node.js 튜터리얼](http://dailyjs.com/tags.html#lmawa \"[http://dailyjs.com/tags.html#lmawa]로 이동합니다.\")을 기반으로 진행되며, 각각의 라이브러리들의 설명과 진행은 최신 상태에 맞게 업데이트 해서 진행할 예정입니다.\n\n본 따라배우기 번역강좌는 **총 22부 + 알파**로 진행될 예정이며 현재 목차는 다음과 같습니다.\n\n\n\n**Part 1: 소개** (Introduction)\n\n**Part 2: 설치와 애플리케이션 뼈대 만들기** (Installation and Skeleton App)\n\n**Part 3: RESTful 메소드와 테스트** (RESTful Methods and Testing)\n\n**Part 4: 템플릿, 파셜, 그리고 문서 생성과 수정** (Templates, Partials, Creating and Editing Documents)\n\n**Part 5: 인증과 세션, 접근제어 미들웨어** (Authentication, Sessions, Access Control Middleware)\n\n**Part 6: 인터페이스 기본** (Interface Basics)\n\n**Part 7: 노드 라이브러리 버전들, 제이드 트릭, 에러페이지** (Node Library Versions, Jade Tricks, Error Pages)\n\n**Part 8: 나타났다 사라지는 메시지와 헬퍼들** (Flash Messages and Helpers)\n\n**Part 9: 기억해주세요!** (Remember Me)\n\n**Part 10: 마크다운** (Markdown)\n\n**Part 11: 향상된 테스트** (Better Testing)\n\n**Part 12: 몽구스 업데이트 하기** (Updating Mongoose)\n\n**Part 13: 스타일러스** (Stylus)\n\n**Part 14: 이메일** (Email)\n\n**Part 15: 노드 버전과 npm 퍼블리싱** (Node Versions, npm Publishing)\n\n**Part 16: 노드와 익스프레스 업데이트 하기** (Updating to Node and Express)\n\n**Part 17: UI개선** (UI Improvements)\n\n**Part 18: 풀 텍스트 검색** (Full Text Search)\n\n**Part 19: 빽~본! 제이에스** (Backbone.js)\n\n**Part 20: 백본 제이에스 퍼시스턴스** (Backbone.js Persistence)\n\n**Part 21: 커넥션 관리** (Connection Management)\n\n**Part 22: Backbone.js로 검색하기** (Searching with Backbone.js)\n\n\n\n**저도 그렇고, 참여하시는 분들도 그렇고, 학습의욕과 번역및 업데이트 의욕을 높이기 위해 나름의 스터디 진행방식을 정해봤습니다. 일종의 안전장치 역할도 목적으로 가집니다. :)**\n\n\n\n**스터디 진행방식 :D\n **\n1\\. 우선 이번 온라인 스터디에 참여하실 분들은 본 글에 간단한 댓글을 남겨주세요. \n2\\. 그리고 이 글 끝에 있는 **선행학습**을 금요일까지 마칩니다. (좀 늦어져도 사실 큰 상관은 없어요 ^^)\n3\\. 금요일에 게재되는 Part 1의 글 읽기를 마치거나 따라하기를 마치시면 댓글로 간단한 OK 코멘트를 남겨주세요.\n4\\. 열 분 정도 OK 코멘트가 달리면 다음 따라배우기가 게재됩니다.\n5\\. 마찬가지로 새로 게재되는 글에 OK 코멘트를 남겨주시고, 열 분 정도가 되면 또 다음 번역 글을 게재합니다.\n\n\n\n자신이 어디까지 읽었는지나 따라했는지에 대한 마킹이라고 생각하시고 편하게 코멘트 남기시면 되겠습니다. 물론 의견이나 질문, 틀린부분에 대한 내용을 남겨주시면 더 좋고요.\n\n\n자! 사전 학습하시면 좋은 내용들입니다!\n\n\n\n**선행학습 목록 (참여자 필수!!!)**\n\n**Node.js** (글 안에 링크된 글들도 꼭 읽어보세요)\n[](http://blog.doortts.com/189)[http://blog.doortts.com/189](http://blog.doortts.com/189 \"[http://blog.doortts.com/189]로 이동합니다.\")\n\n**Nodejs - A quick tour** (그림책 보듯이 슥~ 넘기세요~)\n[](http://www.slideshare.net/the_undefined/nodejs-a-quick-tour-v6)[http://www.slideshare.net/the_undefined/nodejs-a-quick-tour-v6](http://www.slideshare.net/the_undefined/nodejs-a-quick-tour-v6 \"[http://www.slideshare.net/the_undefined/nodejs-a-quick-tour-v6]로 이동합니다.\")\n\n**Introduction to Node.js with Ryan Dahl**\n\n[http://www.youtube.com/watch?v=jo_B4LTHi3I](http://www.youtube.com/watch?v=jo_B4LTHi3I \"[http://www.youtube.com/watch?v=jo_B4LTHi3I]로 이동합니다.\") \n\n#### Comments\n\n참여해봅니다!!!\n\n cyzest | 2011-10-26 수요일 오전 9:9\n\n--\n\n참여합니다\n\n Lsi | 2011-10-27 목요일 오전 7:36\n\n--\n\n오.. 참여하고 싶어요!!\n\n coens | 2011-10-27 목요일 오전 11:37\n\n--\n\n참여하고 싶습니다!\n\n [wafe](http://wafe.kr) | 2011-10-28 금요일 오전 12:15\n\n--\n\n저도 참여하고 싶습니다. 잘부탁드립니다.\n\n beat203 | 2011-10-28 금요일 오후 6:3\n\n--\n\n저두 참가 신청해봅니다.. 잘부탁드리겠습니다..^^\n\n [코마살부](http://coma333.tistory.com) | 2011-10-28 금요일 오후 6:45\n\n--\n\n참여합니다.~\n\n [습](http://sblab.tistory.com) | 2011-10-28 금요일 오후 7:31\n\n--\n\n참여합니다!\n\n [daclouds](http://me2day.net/daclouds) | 2011-10-28 금요일 오후 7:58\n\n--\n\n참여합니다~\n\n [Mr. 하늘](http://mr.hanul.co) | 2011-10-30 일요일 오후 10:28\n\n--\n\n저도 참여하고싶습니다.. 늦게들어온만큼 더욱더 열심히하겠습니다.\n\n [뽀구](sieliebe@naver.com) | 2011-10-31 월요일 오전 9:44\n\n--\n\n잼나 보이는데요 저도 참여 합니다.\n\n X | 2011-11-01 화요일 오전 10:15\n\n--\n\n늦엇지만...참여합니다.\n\n 하느리 | 2011-11-01 화요일 오후 5:31\n\n--\n\n전혀 늦지 않았습니다. :)\n반가워요~\n\n [doortts](http://blog.doortts.com) | 2011-11-01 화요일 오후 7:55\n\n--\n\n참여 합니다 ^^\n\n 김선겸 | 2011-11-01 화요일 오후 10:17\n\n--\n",
    "attachments": [
      {
        "id": 21885,
        "name": "makeupmind.PNG",
        "hash": "cc4caf7b92b66f9ecfab40035d37330935269ea8",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 18469,
        "containerId": "12363"
      }
    ]
  },
  {
    "id": 207,
    "title": "[node.js 따라배우기 01] Webapp을 만들어 봅시다! : 노드패드(Nodepad)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319737168000,
    "body": "> doortts | 2011-10-28 금요일 오전 2:19 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/207)\n\n첫 번째 따라배우기를 시작합니다. 아마, 익숙하지 않은 분들은 많은 것들이 낯 설게 느껴지실 겁니다. 하지만 당황하지 마시고,  우선은 그런가 보다 하고 넘어가시는 것도 괜찮습니다. 그리고 번역은 크게 오해가 안생기는 수준에서 빠르게 진행할 예정이라 다소 어색할 수 있습니다. 매끄럽지 못하더라도 양해해 주세요. (댓글로 지적해 주시는 부분은 수정할게요~ ^^) 자 그럼 part 01은 비교적 편한 마음으로 쉽게 읽으시면 되겠습니다.\n\n\n원본 [http://dailyjs.com/2010/11/01/node-tutorial/](http://dailyjs.com/2010/11/01/node-tutorial/ \"[http://dailyjs.com/2010/11/01/node-tutorial/]로 이동합니다.\")\n\n파트1, \"웹앱(Webapp)을 만들어 봅시다!\"에 오신걸 환영합니다. 본 시리즈는 \"Node.js\"를 이용해서 웹 애플리케이션(이하 웹앱)을 만들어보는 따라배우기(tutorial)시리즈입니다. 본 시리즈는 node.js를 이용해서 웹앱을 만드는 과정을 따라가면서, 자신만의 애플리케이션을 만들 때 접하게 될 모든 영역을 다룰 예정입니다.\n\n우리가 만들 앱은 Nodepad(노드패드)라 불리는 웹 노트패드입니다. 특별한 점은 없지만, (개념이)잘 정의되어 있고 이해하기 쉽습니다.\n\n **프레임워크와 도구 선택하기**\n\n현대의 웹 애플리케이션들은 몇몇 컴포넌트들에 의존합니다.\n\n- 스토리지: 관계형 데이터베이스, NoSQL\n\n- 저장라이브러리: 단순형, ORM\n\n- 웹 서버\n\n- 패키지 매니저\n\n- 서버-사이드 프레임워크\n\n- 클라이언트-사이드 프레임워크\n\n- 테스팅 라이브러리\n\n- 버전 컨트롤\n\n선택은 전적으로 컨택스트(context)에 달려있습니다. 저는 배포 환경에 맞춰 특정 기술들을 사용해 왔습니다. 그리고 전 오픈소스 소프트웨어를 만들 때 사람들이 쉽게 설치할 수 있는 제품을 선호합니다. 이번 경우에 저의 선택은 제 자신의 전문영역과 독자들이 관심 있어 하는 기술에 대한 피드백을 기초로 정할 예정입니다.\n\n  \n\n**서버-사이드(Server-Side)**\n\n노드(node.js)로 웹앱을 만드는 것은 어떤 식으로든 프레임워크가 관계됩니다. 만약 우리의 주간 아티클 Node Roundup을 읽었다면 뛰어난 프레임워크들이 수 없이 많이 존재한다는 걸 잘 알 겁니다. 어떤 것들은 Rails나 Django를 Node로 완벽 포팅하는 걸 목표로 삼기도 하고, 또 어떤 것들은 라우팅과 HTTP영역에 집중하고 있습니다. [Rails](http://rubyonrails.org/ \"[http://rubyonrails.org/]로 이동합니다.\")[스러운](http://rubyonrails.org/ \"[http://rubyonrails.org/]로 이동합니다.\") 프레임워크의 한 예는  [Geddy](http://github.com/mde/geddy \"[http://github.com/mde/geddy]로 이동합니다.\")입니다. 좀 더 간결한 걸로는  [Sinatra](http://www.sinatrarb.com/ \"[http://www.sinatrarb.com/]로 이동합니다.\")  스타일의 프레임워크인  [Express](http://github.com/visionmedia/express \"[http://github.com/visionmedia/express]로 이동합니다.\")(엑스프레스)가 있습니다. Exprees는 2009년 6월에 시작되서 지금까지 꾸준히 업데이트 되고 있습니다.\n\n더 큰 사이즈의 프레임워크들은 보통 모델/뷰/컨트롤러 추상화를 통해 리소스와 파일간의 one-to-many 맵핑을 제공합니다. 프로젝트는 다음과 같이 구성될 예정입니다.\n\n- 모델: user.js, note.js\n\n- 컨트롤러: users.js, notes.js\n\n- 뷰: index.html (아이템 목록), edit.html, new.html\n\n모든 프레임워크가 다 MVC인건 아닙니다. 또한 node.js 월드에는 마이크로 프레임워크(microframeworks)라 불리는 것들이 많습니다. 저도 처음에는 Express가 마이크로 프레임워크라 생각했었습니다만, Express는 모든 스택을 다루는 추상층을 제시하고 있습니다. 네, 마이크로 프레임워크라 불리기엔 조금 더 뚱뚱하죠.\n\n제 생각엔 Express가 이번 프로젝트에 적절한 것 같습니다. 상식적인 수준내에서 어떤 프레임워크이든 잘 쓸 수 있긴 합니다만, Express 번들이면 지나치게 무겁지 않는 수준에서 즐겁게 작업하기에 충분합니다.\n\n \n\n**프론트엔드(Frontend)**\n\n어떤 종류의 UI 프레임워크는 인터페이스 개발시에 필요한 잡다구리한 일들을 줄여줍니다. 자바 스크립트 UI 프레임워크들은 지난 수년사이에 폭발적으로 증가했습니다. 다음과 같은 종류의 프레임워크들이 우리 프로젝트에 사용가능합니다.\n\n- 풍부하고(Rich), 데스크탑스러운 프레임워크: [Cappuccino](http://cappuccino.org/ \"[http://cappuccino.org/]로 이동합니다.\")(카푸치노), [SproutCore](http://www.sproutcore.com/ \"[http://www.sproutcore.com/]로 이동합니다.\"), Ext.js\n\n- 저 수준 기능들을 제공하는 프레임워크: jQuery, Prototype, MooTools\n\n- 저 수준과 리치 UI툴이 혼합된 프레임워크: YUI\n\n- 저수준 프레임워크 위에 올려진 인터페이스에 특화된 라이브러리: Scriptaculous, jQuery UI\n\n제 생각에 SproutCore(스프라우트 코어)와 Cappuccino는 이번과 같은 프로젝트에 적용하기에는 다소 무거운 것 같습니다. 지금은 jQuery UI와  [Aristo theme](http://github.com/taitems/Aristo-jQuery-UI-Theme \"[http://github.com/taitems/Aristo-jQuery-UI-Theme]로 이동합니다.\")가 잘 어울릴 것 같습니다. 무겁다는 느낌을 주지 않고도 훌륭한 결과를 얻을 수 있습니다.\n\n \n\n**테스팅(Testing)**\n\n[CommonJS Unit Testing Specification](http://wiki.commonjs.org/wiki/Unit_Testing/1.0 \"[http://wiki.commonjs.org/wiki/Unit_Testing/1.0]로 이동합니다.\")에 대해서는 “프레임워크를 만들어 봅시다”에서 언급했었습니다. [Nodeunit](http://github.com/caolan/nodeunit \"[http://github.com/caolan/nodeunit]로 이동합니다.\")은 CommonJS의 assert 모듈에 기반합니다. 그리고 이전에 작성했던 단위테스트들과도 매우 흡사합니다. \n\n한편, [Expresso](http://visionmedia.github.com/expresso/ \"[http://visionmedia.github.com/expresso/]로 이동합니다.\")(엑스프레소)는 서버를 좀 더 깔끔하게 테스트 할 수 있도록 assert.response를 제공합니다. Expresso는 Express와 동일한 저자(TJ Holowaychuk)가 만들었습니다. 그러니 이런 류의 기능을 제공한다는 건 사실 놀라운 건 아니죠. (테스트에 대해서는) 어느 쪽 노선을 따를지는 아직 결정 못했습니다. 앱을 만들어 가면서 둘 다 써보고 결정하겠습니다.\n\n \n\n**저장소(Storage)**\n\n저장소는 지난 2년간 미친듯이 변했습니다. 제가 처음 일을 시작 했을 때는 관계형 데이터베이스 아니면, 객체 데이터베이스(\n\n#### Comments\n\nOK\n\n [daclouds](http://me2day.net/daclouds) | 2011-10-28 금요일 오후 8:11\n\n--\n\ngood luck!\n\n [doortts](http://blog.doortts.com) | 2011-10-29 토요일 오후 12:2\n\n--\n\nOK\n\n [백기선](http://whiteship.me) | 2011-10-28 금요일 오후 10:2\n\n--\n\ngood luck 2!\n\n [doortts](http://blog.doortts.com) | 2011-10-29 토요일 오후 12:2\n\n--\n\nOK\n\n [코마살부](http://coma333.tistory.com) | 2011-10-31 월요일 오전 11:37\n\n--\n\nOK\n\n [wafe](http://wafe.kr) | 2011-11-01 화요일 오전 12:46\n\n--\n"
  },
  {
    "id": 208,
    "title": "Social Study - node.js 소개 동영상 함께 보기 후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319971750000,
    "body": "> doortts | 2011-10-29 토요일 오후 4:54 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/208)\n\nnode.js 함께 배우기 온라인 모임의 일환으로 지난 금요일 밤에는  [Introduction to Node.js with Ryan Dahl 동영상](http://www.youtube.com/watch?v=jo_B4LTHi3I \"[http://www.youtube.com/watch?v=jo_B4LTHi3I]로 이동합니다.\") 함께 보기 시간을 가졌습니다. 저도 외부 모임에 참석했다가 부랴부랴 집으로 와서 11:30분 부터 다른 분들과 함께 시청했습니다.\n\n함께라고는 하지만, 모양만 놓고 보면 각자 자신의 장소에서 각자 온라인 동영상을 각자 감상하는 것이었습니다.\n\n사실 스터디 모임을 만드는 데에는 여러가지 이유가 있겠지만, 주요한 이유중 하나는, 혼자서 할때 겪게되는 여러가지 어려움, 이를테면 물어보고 이야기 나눌 대상이 없다던가 격려해주고 도움받고 응원해줄 사람이 없다던가 하는 점을 해소하고자 스터디를 많이 결성하게 됩니다. 뭐니뭐니 해도 스터디 모임이라면 역시 오프라인에 모여서 얼굴보며 하는것이 좋다고 생각합니다만, 최근 [프랜즈 스터디때의 경험](http://blog.doortts.com/199 \"[http://blog.doortts.com/199]로 이동합니다.\")을 놓고봐도 그렇고 오프라인 모임은 장점이 크지만 그만큼 힘든점도 많습니다.\n\n조직내에서 Agile 확산활동을 할때도 느낍니다만, 조직의 성과와 끈끈한 Team Spirit이라는 측면에서 보았을때, 함께 한다는 느낌, 즉 **소속감과 동일 목표 유지를 위한 ****서로간의 ****지속적인 피드백은 즐겁게 일하면서도 유의미한 결과를 만들어 내는데 있어 굉장히 중요한 요소**입니다.\n\n온라인 모임도 마찬가지의 '**무언가**'를 제공해야 조금이라도 '탈력'을 줄여줄 수 있다고 생각합니다. 그래서 facebook 코멘트 달기를 비롯하여 이런저랑 장치들을 준비하고 있고, 생각하고 있습니다. \n\n(아.. 이놈의 잡설은 대체.. )\n\n하여튼 넘어가고요, 지난 금요일 밤의 온라인 모임은 node.js 소개 동영상을 동아리방에서 팝콘들고 영화보듯이 즐겁게, 그리고 집중해서 보는 시간을 갖는 것이 목적이었습니다. 1시간이 넘는 분량의 동영상이라 혼자 보다보면, 집중력을 잃기도 쉽고, 자막있는 동영상도 아닌지라 중간 중간 '뭔소리냐?' 하는 부분이 나오기 십상이니까요.\n\n![5267105904_a6f5ca9299_z.jpg](/files/21886)\n\n**(...)**\n\n한 장소에서 볼 수는 없으니 보면서 같이 이야기라도 나눌 곳이 필요했습니다. node.js 스터디니 이왕이면 node.js를 이용한 채팅방을 준비해 보자는 생각이 들더군요. 전날부랴부랴 [joyent](http://www.joyent.com/ \"[http://www.joyent.com/]로 이동합니다.\")에 node paas를 할당받아 node.js로 구현된 채팅방을 만들었습니다. 그리고 시간맞춰 들어가 떠들며 다른분들과 함께 동영상 보는 시간을 가져봤습니다. :D\n\n[nodechat.png](/files/21887)\n**[동영상 감상 끝나고 뒷담(??)시작하는 부분...]**\n\n지금은 대화내용이 계속 쌓이다보니 앞부분의 내용은 지나가서 서버에 로그로만 남아있습니다만, 아래 사이트에 접속해 보시면 일부나마 살펴보실 수 있습니다. (혹, 어려워 하시는 분이 계실까 싶어 대화방 참여자 분들께 미리 이야기를 드리고 동영상 보면서 중간준간 내용들을 조각조각 올렸습니다.) 아래는 그 대화방 URL 입니다. \n\n[octobersky.no.de](http://octobersky.no.de \"[http://octobersky.no.de]로 이동합니다.\")\n\nnode.js를 만든 '라이언 달'이 만들어 놓은 [소스](http://github.com/ry/node_chat/tree/master \"[http://github.com/ry/node_chat/tree/master]로 이동합니다.\")를 한글아이디 가능하게라던가, 서버에 ip로그가 찍히게 등등 쪼금 수정해서 띄웠습니다. (소스 설명이라던가, joyent에 node paas 만드는 법은 따로 이야기 하는 시간 가져보겠습니다. 현재는 오프라인 모임때로 생각하고 있습니다. :)\n\n**자. 동영상 함께보기 이벤트 소감**\n가입도 없고 그냥 댓글달고 불특정 다수와 함께 하는 모임이지만,  함께 시간맞춰서 동영상 보고, 보고나서 이야기 나누고 하니까 재밌더라구요. 시간도 훌쩍~ 가고요~ 다음에도 또 비슷한 이벤트를 진행해 보려고 생각중입니다. \n\n자바스크립트를 학습하고 나누는 모임인 OctoberSky.js 많이 응원/참여해 주세요.\n\n그럼 편안한 주말 되시길 기원합니다.\n감사합니다.\n\n아참! 몇 번 이야기 드렸듯이 이 모임은 기간 한정모임이에요~ \n왜냐구요? 엔딩 없는 영화는 재미없잖아요? ㅎㅎ~\n\n#### Comments\n\n죄송합니다.. 금요일 저녁에 일이 있어서 같이 참여하지 못했습니다..ㅠ.ㅠ 고생들 하셨습니다.. 혼자라두 열심히 봐야 겠네요..\n\n [코마살부](http://coma333.tistory.com) | 2011-10-31 월요일 오전 9:47\n\n--\n",
    "attachments": [
      {
        "id": 21886,
        "name": "5267105904_a6f5ca9299_z.jpg",
        "hash": "63977225cb7eff3a4f9c1724c5cf33c4255d0100",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 113814,
        "containerId": "12365"
      },
      {
        "id": 21887,
        "name": "nodechat.png",
        "hash": "633143c84aa15ad06370ba3a7229340329eeaedd",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 383617,
        "containerId": "12365"
      }
    ]
  },
  {
    "id": 209,
    "title": "[node.js 따라배우기 02] 설치와 애플리케이션 뼈대 만들기 (Installation and Skeleton App)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320028200000,
    "body": "> doortts | 2011-10-30 일요일 오후 8:22 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/209)\n\n\n\n\n\n이번부터는 조금 난이도가 올라갑니다. 번역 이외로 주석이나 박스 설명으로 원문에 없는 내용들을 많이 추가했습니다만, 그래도 처음 접하시는 분들은 다양한 기술이 나와서 혼란스러우실 수 있습니다. 하지만 본문에도 적었듯이, 모르는 내용이 나온다고 당황하지 마세요. 차차 알게 되실겁니다. node.js의 정체도 아직 본 스터디에서는 직접 언급하지 않았잖아요? :D (그런 내용은 오프라인 모임때 다룰 예정입니다.)\n\n그리고 그냥 **읽기만 하면 좀 더 어렵습니다**. 앞으로의 스터디를 대비해서라도 이번 따라배우기 글은 꼭 직접 따라해 보시길 권합니다. 학습을 마치신 다음엔, 앞서와 마찬가지로 댓글로 소감이나 추가내용 OK 메시지 등등을 달아주시면 되겠습니다.\n\n자! 그럼 굿,럭! 입니다.\n\n\n\n[Part 01\\. Webapp](http://blog.doortts.com/206 \"[http://blog.doortts.com/206]로 이동합니다.\")[을 만들어 봅시다](http://blog.doortts.com/206 \"[http://blog.doortts.com/206]로 이동합니다.\")!에 이은 따라배우기 두 번째 입니다. 본 시리즈는 \"Node.js\"를 이용해서 웹 애플리케이션(이하 웹앱)을 만들어보는 따라배우기(tutorial)시리즈입니다. 본 시리즈는 node.js를 이용해서 웹앱을 만드는 과정을 따라가면서, 자신만의 애플리케이션을 만들 때 접하게 될 모든 영역을 다룰 예정입니다. \n\n[Part 01](http://blog.doortts.com/206 \"[http://blog.doortts.com/206]로 이동합니다.\")에서는 본 시리즈를 소개하고 Node 프로젝트에서 쓸 적당한 라이브러리를 선택에 대해 다뤘습니다. 이번에는 기본 툴과 라이브러리를 설치를 다룹니다. 그리고 뼈대가 되는 앱을 만든다음 생성된 코드를 살펴볼 예정입니다.\n\n \n\n**준비물(Requirements)**\n\n본 프로젝트는 다음과 같은 라이브러리/제품이 필요합니다.- 동작하는 Node( node.js 인스톨)\n    -  MongoDB\n    -  npm\n\n왜 이런 기술을 선택했는지는 마찬가지로 [Part 01](http://blog.doortts.com/206 \"[http://blog.doortts.com/206]로 이동합니다.\")을 참고해주세요.\n \n\n**Node 설치**\n\nNode.js가 설치되어 있지 않으면 [다운로드](http://nodejs.org/#download \"[http://nodejs.org/#download]로 이동합니다.\")(nodejs.org) 받아서 압축을 푸세요. 패키지 매니저를 쓸 수도 있습니다.  \n  \n\n압축 푼 다음 해당 디렉터리에서 아래와 같이 실행\n\n**MacOS**\n\n\n\n./configure\n\nmake\n\nsudo make install\n\n\n\n \n\n**Ubuntu 리눅스**\n\n\n\nsudo apt-get update\n\nsudo apt-get install g++ curl libssl-dev apache2-utils\n\n./configure\n\nmake\n\nsudo make install\n\n\n\n혹 필요에 따라서는 .bash_profile에 아래 내용을 추가합니다.\n\n\n\n**export NODE_PATH=/usr/local/lib/node_modules**\n\n\n\n \n\n**MS윈도우즈**\n\n\n\n\n\nhttp://nodejs.org/#download 에서 node.js 바이너리 다운로드\n\nnodjs package manager인 npm은 현재 cygwin을 써야합니다.\nhttps://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-%28Windows%29\n\n개인적으로는 무료 소프트웨어인 virtualbox에 우분투 설치를 권장합니다. : )\n\n관련해서는 [http://blog.doortts.com/207](http://blog.doortts.com/207) 하단의 **\"**둘다 설치하기 싫으신 MS윈도우즈 사용자 분들에게...\"를 읽어주세요.\n\n\n\n **MongoDB**\n\nMongoDB를 데이터베이스로 쓰려고 합니다. 설치하기도 쉽고 이미 컴파일된 바이너리를 바로 다운받아도 됩니다. [http://www.mongodb.org/downloads](http://www.mongodb.org/downloads)\n\nsudo mkdir -p /data/db 로 data 파일이 저장될 디렉터리를 만들고, 압축 푼 디렉터리 하위의 bin 디렉터리에서 mongod 라고 실행하면 바로 서버가 기동합니다. 윈도우 사용자의 경우 c:\\data\\da로 만들면 됩니다. 관련해서는 MongoDB 퀵 스타트 가이드([http://www.mongodb.org/display/DOCS/Quickstart](http://www.mongodb.org/display/DOCS/Quickstart))를 참고하시거나 [책](http://www.yes24.com/24/Goods/5161478?Acode=101 \"[http://www.yes24.com/24/Goods/5161478?Acode=101]로 이동합니다.\")을 구매해서 보면 좋습니다.  그리고 잘 찾아보시면 관련 교육도 있습니다. :D \n\n**npm (node package manager)**\n\nnpm은 노드 패키지들을 빠르고 쉽게 관리할 수 있게 도와줍니다. (패키지 관리자쯤 되는거죠? 필요한 모듈을 자동으로 다운로드 받아서 설치까지 해줍니다.) 추천하는 설치방법은 스크립트를 다운로드 받아서 npm 인스톨 명령어를 수행하는 겁니다. 단 쓰기 권한이 있는 데서 실행하세요.\n\n만약 본인 PC에 설치하고자 한다면..\n\nMac / Ubuntu\n\n\n\nsudo chown -R $USER /usr/local\n\ncurl http://npmjs.org/install.sh > install.sh\n\nsudo sh install.sh\n\n\n\n**관련 패키지들** **(Packages)**\n\n\n\nnpm install express mongoose jade less expresso\n\n\n\n다운로드 해서 설치까지 시간이 조금 걸리니까 침착하게 기다립니다.\n\n만약 express가 설치가 안되었다면 아래 명령어로 다시 설치합니다.\n\n\n\nnpm install -g express\n\n\n\n* 경우에 따라서는 권한이 부족해서 실행 안될수 있습니다. 이럴때는 sudo npm install -g express로 실행하시면 됩니다.\n \n\n**기본적인 Express 앱 with MongoDB**\n\nmongod로 서버 기동\n\n\n\n예)\n\n~/dev/mongodb/bin 에서\n\n./mongod\n\n\n\n몽고DB를 띄우면 사용하는 포트가 표시될 겁니다. 기본은 27017입니다. mongoose 에서 쓸 거니 까 잘 적어두세요. \n\nExpress는 앱 작성을 위한 커맨드라인 유틸리티를 제공합니다. 적당한 디렉터리로 이동한 다음, 스켈레톤 앱을 생성하기 위해 다음과 같이 타이핑합니다.\n\n\n\nexpress nodepad\n\n\n\n 실행결과\n\n\n\n| \n\nexpress nodepad\n\n\n\n   create : nodepad\n\n\n\n   create : nodepad/package.json\n\n\n\n   create : nodepad/app.js\n\n\n\n   create : nodepad/views\n\n\n\n   create : nodepad/views/layout.jade\n\n\n\n   create : nodepad/views/index.jade\n\n\n\n   create : nodepad/public/javascripts\n\n\n\n   create : nodepad/public/images\n\n\n\n   create : nodepad/public/stylesheets\n\n\n\n   create : nodepad/public/stylesheets/style.css\n\n |\n\n 자. 그럼 nodepad 폴더로 들어가서 아래와 같이 타이핑 해 봅시다. \n\n\n\n node app.js \n\n실행결과\n\n| \n\nExpress server listening on port 3000 in development mode\n\n |\n\n 이제 웹브라우저로 [http://localhost:3000](http://localhost:3000/)에 접속해 보세요.\n\n\n\n****\n\n**![express_welcome.png](/files/21889)**\n\n**[Express Welcome!! 웹앱서버 기동!]\n\n뼈대코드 분석(Skeleton Analysis)** \n\n| \n\n/**\n\n\n\n * Module dependencies.\n\n\n\n */\n\n\n\nvar express = require('express'); \n\n\n\nvar app = module.exports = express.createServer();\n\n |\n\n app.js의 첫줄은 기본적은 CommonJS 입니다. express 모듈이 필요하고 app이 만들어지고 익스포트(export)됩니다. 익스포트하는건 테스트하기 쉽게 만들기 위해섭니다. 우선 이해 안되더라도 걱정하지 마세요.\n\nExpress는 최근 많이 변했습니다. 그러니 옛날 튜터리얼을 볼 때 유의하세요. API가 많이 다릅니다. 첫 릴리즈 이후 미들 레이어에 해당하는 connect가 추가되었습니다. connect는 특정 HTTP 스택 전체와 웹 프레임워크를 교체 가능하게 만들어 줍니다. 설정도 많이 바뀌었습니다. (뭐?? 어쩌라구!!)\n  \n\n코드는 아래와 같이 보일겁니다.\n\n\n\n| \n\napp.configure(function() {\n\n\n\n  app.set('views', __dirname + '/views');\n\n\n\n  app.use(express.bodyDecoder());\n\n\n\n  app.use(express.methodOverride());\n\n\n\n  app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));\n\n\n\n  app.use(app.router);\n\n\n\n  app.use(express.staticProvider(__dirname + '/public'));\n\n\n\n});\n\n |\n\n 기본적으로 Express 앱은 배우 간단합니다. view 경로가 지정된걸 유의 깊게 보세요. 스태틱 파일 핸들러가 staticProvider. express.bodyDecoder 로 설정되어 있습니다. 이 부분은 application/x-www-form-urlencoded로 디코딩 됩니다. 이를테면 form 으로 말입니다. methodOverride 미들웨어는 Express앱이 RESTful 앱처럼 동작하게 만듭니다. PUT 같은 HTTP 메소드들으을 hidden input을 통해 사용할 수 있게 됩니다. 이렇게 하는 것이 좋은 생각인지에 대해서는 아직 많은 논쟁이 있고, Holowaychuk이 이 부분을 선택 옵션으로 만든 것도 그 때문일 겁니다.\n\n \n\n\n\n| \n\n옮긴이 주- 실제 최근 버전에서는 아래와 같은 코드가 생성됩니다.\n\n\n\napp.configure(function(){\n\n\n\n  app.set('views', __dirname + '/views');\n\n\n\n  **app.set('view engine', 'jade');**\n\n\n\n  app.use(express.bodyParser());\n\n\n\n  app.use(express.methodOverride());\n\n\n\n  app.use(app.router);\n\n\n\n  app.use(express.static(__dirname + '/public'));\n\n\n\n});\n\n\n\n \n\n\n\nView 엔진으로 jade라는 것이 설정되어 있는 부분이 조금 다릅니다만, 이에 대해서는 아래에서 좀 더 설명하겠습니다.\n\n |\n\n앱의 주요 몸통부는 jade 템플릿을 사용해 HTML로 만들었습니다. (옮긴이 주: 현재는 jade 템플릿 엔진사용 선언을 configure에서 지정하는 대신 app.get에서는 따로 지정하지 않습니다. 한 번 실제로 따라해 보시면 아! 하실 겁니다. :)\n \n\n\n\n| \n\napp.get('/', function(req, res){\n\n\n\n  res.render('index', {\n\n\n\n    title: 'Express'\n\n\n\n  });\n\n\n\n});\n\n |\n\n메소드 호출은 route에 정의되어 있고 HTTP문법 GET과 / 를 따릅니다. 다시 말하자면, 이 작은 코드 덩어리는 POST의 / 에는 응답할 수 없다는 뜻입니다. 마지막 몇 라인이 흥미로운데요, 해당 앱이 탑 레벨 모듈로 동작하는지 여부를 실제로 체크하기 때문입니다. \n \n\n\n\n| \n\nif (!module.parent) {\n\n\n\n  app.listen(3000);\n\n\n\n  console.log(\"Express server listening on port %d\", app.address().port)\n\n\n\n}\n\n |\n\n다시 한번 말하지만, 이건 테스트를 쉽게 하려고 만든 거니까 괴상하게 보여도 걱정하진 마세요.\n\n(옮긴이 주: 현재 코드에서는 parent를 확인하는 코드가 없어져서 더 깔끔합니다)\n\n \n\n**MongoDB연결하기 (Connecting Up MongoDB)**\n\nMongoose는 MongoDB의 컬렉션(collection)을 간단한 클래스로 편리하게 감쌀 수 있습니다. 우선 라이브러리를 읽어 들이고, 그 다음엔 데이터베이스 인스턴스와 커넥션을 맺어야 합니다. \n\n\n\n| \n\nvar mongoose = require('mongoose');\n\n\n\nmongoose.connect('mongodb://localhost/nodepad');\n\n\n\n… (이하생략)\n\n |\n\n \n\n저는 모델 파일(models.js)을 다음과 같이 만들었습니다. \n\n\n\n| \n\nvar mongoose = require('mongoose'); \n\n\n\n//스키마 정의 (어쨌든 DB니까 데이터 모델링이 필요합니다)\n\n\n\nvar Schema = mongoose.Schema,\n\n\n\n    ObjectId = Schema.ObjectId;\n \n\n\n\n//사용할 문서 정의\n\n\n\nDocument = new Schema({\n\n\n\n  properties: ['title', 'data', 'tags'],\n\n\n\n  indexes: [\n\n\n\n    'title'\n\n\n\n  ]\n\n\n\n});\n\n\n\n \n\n\n\n// 몽구스에게 만들어진 문서 알려주기\n\n\n\nmongoose.model('Document', Document);\n\n\n\n \n\n\n\nexports.Document = function(db) {\n\n\n\n  return db.model('Document');  // ‘Document’라는 문서모델에 접근한다.\n\n\n\n};\n\n |\n\n(옮긴이 주- 몽구스 사용방법은 뒤에서도 계속 나오니까 지금은 우선 skip 합니다.)\n\n모델들을 다음과 같이 app.js내에서 사용할 수 있습니다.\n\n\n\nDocument = require('./models.js').Document(db);\n\n\n\n데이터베이스 인스턴스가 전달되면 db.model 은 mongoose.model('Document', ...)선언에 근거해서 모델 인스턴스를 리턴할 겁니다. 저는 모델들을 각자의 파일로 만들어 넣는 것이 Mongoose가 좀 더 확실하게 동작하게 만들고 애플리케이션의 컨트롤러 코드를 따르기 쉽게 만든다고 생각합니다.\n\n \n\n**템플릿들(The Templates)**\n\n코드 생성기는 기본적으로  [Jade](http://jade-lang.com/ \"[http://jade-lang.com/]로 이동합니다.\") (Node의 템플릿 엔진, http://jade-lang.com/)를 사용하고 다음과 같은 템플릿을 만들어냅니다. \n\n\n\n| \n\nh1= title\n\n\n\np Welcome to #{title}\n\n |\n\n  \n\n**jade 예제**\n\n\n\n| \n\njade 템플릿\n\n | \n\n변환된 HTML코드\n\n |\n| \n\n!!! 5\n\n\n\nhtml(lang=\"en\")\n\n\n\n  head\n\n\n\n    title= pageTitle\n\n\n\n    script(type='text/javascript')\n\n\n\n      if (foo) {\n\n\n\n         bar()\n\n\n\n      }\n\n\n\n  body\n\n\n\n    h1 Jade - node template engine\n\n\n\n    #container\n\n\n\n      - if (youAreUsingJade)\n\n\n\n        p You are amazing\n\n\n\n      - else\n\n\n\n        p Get on it!\n\n | \n\n\n\n\n\n\n\n\n\n  \n\n\n\n    Jade\n\n\n\n    \n\n\n\n      if (foo) {\n\n\n\n         bar()\n\n\n\n      }\n\n\n\n    \n\n\n\n  \n\n\n\n  \n\n\n\n    Jade - node template engine\n\n\n\n    \n\n\n\n      You are amazing\n\n\n\n    \n\n\n\n  \n\n\n\n\n\n |\n\n \n\njade 템플릿은 Haml(하믈)과 유사합니다.  \n\n\n\n**Haml?**\n\n\n\nHaml은 Rails앱에서 view를 만들어내는 도구입니다. 관련해서는 [http://haml-lang.com/](http://haml-lang.com/) 를 참조하세요.혹은 [http://aproxacs.springnote.com/pages/1019962](http://aproxacs.springnote.com/pages/1019962) 에서 한국어로 된 설명을 볼 수 있습니다. 다음은HAML 코드 샘플입니다.\n\n\n\n \n\n\n\n#profile\n\n\n\n  .left.column\n\n\n\n    #date= print_date\n\n\n\n    #address= current_user.address\n\n\n\n  .right.column\n\n\n\n    #email= current_user.email\n\n\n\n    #bio= current_user.bio\n\n\n\n \n\n\n\n위와 같은 코드를 아래처럼 만들어 준다는 군요.\n\n\n\n\n\n\n\n  \n\n\n\n    \n\n\n\n    \n\n\n\n  \n\n\n\n  \n\n\n\n    \n\n\n\n    \n\n\n\n  \n\n\n\n\n\n\n\n  \n\n만약 플레인 HTML 템플릿을 좋아한다면, 대안으로 [ejs](http://embeddedjs.com/ \"[http://embeddedjs.com/]로 이동합니다.\")를 사용할 수도 있습니다. \n\n\n\n**EJS **[http://embeddedjs.com/](http://embeddedjs.com/ \"[http://embeddedjs.com/]로 이동합니다.\")\n\n\n\n임베디드 자바스크립트. EJS는 데이터와 템플릿을 조합해서 HTML을 만들어 냅니다. 샘플예제는 위 링크를 참조하세요. : )\n\n\n\n  \n\n**테스트 실행하기(Running Tests)**\n\nExpress는 테스트 뼈대도 만들어 줍니다. 테스트는 expresso라고 치면 실행됩니다.\n \n\n**작업 소스코드 얻기**\n\n작업한 코드는 [https://github.com/alexyoung/nodepad](https://github.com/alexyoung/nodepad) 에서 얻을 수 있습니다.\n\n **결론**\n\n이제 기본이 되는 Node 개발환경을 npm, mongodb와 설치하는 것에 편해져야 합니다. Express 앱 뼈대를 갖고 있고 어떻게 동작하고 Expresso 테스트를 어떻게 실행해야 하는지 알게 되었습니다. 다음 파트에서는 앱에 살을 좀 붙여보겠습니다. \n\n\n\n휴우~ 고생많으셨습니다. 정신 하나도 없으시죠? \n중간중간 관련되서 도움되는 글들도 올리고 오프라인 모임도 때때로 할 예정이니까 넘 걱정하진 마세요~\n자! 그럼 질문이 있으시거나, 실습 다 마치신 분들은 댓글 남기시면 되겠습니다!\n\n\n\n#### Comments\n\nOK\n\n [daclouds](http://me2day.net/daclouds) | 2011-11-01 화요일 오전 12:53\n\n--\n\nOK\n\n [whiteship](http://whiteship.me) | 2011-11-03 목요일 오후 3:27\n\n--\n\nOK\n\n 하느리 | 2011-11-03 목요일 오후 4:31\n\n--\n\nOK\n\n [wafe](http://wafe.kr) | 2011-11-04 금요일 오전 1:1\n\n--\n",
    "attachments": [
      {
        "id": 21889,
        "name": "express_welcome.png",
        "hash": "36d753fc702287ffe51af0a105feb7f559818060",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 11262,
        "containerId": "12369"
      }
    ]
  },
  {
    "id": 210,
    "title": "[dW Review] 클라우드 컴퓨팅의 가능성과 위험 소개",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319985138000,
    "body": "> doortts | 2011-10-30 일요일 오후 11:32 | Better SW Development | [원본](http://blog.doortts.com/210)\n\n\n\n* dW Review, 이번 달은 조금 짧게 리뷰할 예정입니다. 너그럽게 봐주세요~ :) \n\n\n\n클라우드가 대 유행입니다. 작년에는 그 개념이 사회적으로 퍼지는데 있어서 대 유행이었다면, 올해는 구체적인 구현물들이 나오면서 대 유행을 이어가고 있습니다. 초반에는 클라우드(cloud)라는 이름처럼이나 참 모호하게 느껴졌는데, 이제는 대략 방향들이 보이기 시작하는 것 같습니다. 기본적으로 굴지의 기업들은 다들 클라우드로 이전하고 있으니까요. 기업을 움직이는 힘은 우선 그 원동력이 '돈(Money)'입니다. 클라우드가 돈을 벌게 해주거나 비용을 줄여주거나 (그게 그거인것 같지만 어쨌든) 둘 중 하나를 도와 줄것으로 예상되기 때문에 선점하거나 적용하기 위해 애쓰고 있습니다.\n\n관련해서 정리도 잘 되어 있고 유의할 점도 잘 나와있는 dW 기사가 있어 소개합니다.\n\n\n\n**아키텍처 선언문: 클라우드 컴퓨팅의 가능성과 위험 소개**\n[http://www.ibm.com/developerworks/kr/library/ar-archman10/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/ar-archman10/index.html?ca=drs-)\n\n\n\n위 링크된 글  내용 에서 인상깊었던 문장을 조금 추려봤습니다.\n\n\n\n*   지난 해에는 클라우드 컴퓨팅과 관련된 과대 선전이 증가했었다.\n*   주로 SaaS(Software as a Service)라고 불려지는 클라우드 컴퓨팅은 때로는 EaaS(Everything as a Service)라고 부르기도 한다. \n\n*   고객은 최대 활동 시간에 필요한 완전한 용량을 알 필요도 없고 구입할 필요도 없다.\n*   고객은 그들이 사용한 것에 대해서만 비용을 지불한다. 고객은 그들이 필요로 하는 최대 용량이나 서버를 구입하지 않아도 된다\n*   서비스를 실행하는 데이터 센터는 규모가 크고 대형 사용자 그룹 간에 자원을 공유하므로 인프라 비용(전기, 건축 등)이 줄어든다. 따라서 고객에게 전가되는 비용이 더 작아진다.\n\n\n\n그리고 데이터 보안과 서비스 업체의 폐업시도 고려할 것을 이야기 하고 있습니다. 특히 데이터 보안같은 경우엔, 우리나라의 정서상 '내 것', 그 중에서도 '내 건물안에 내 상자안에 들어 있는 내 것'의 생각이 강해서 과연 salesforce.com과 같은 서비스가 우리나라에 어느정도 정착될 수 있을까는 조금 의구심이 듭니다만, 점점 나아지리라 생각됩니다. 따지고 보면, 우리가 보내는 온갖 개인 메일, 문자 메시지, 사진들도 다 어느 회사에서는 맘먹으면 다 들여다 볼 수 있는 세상에 이미 살고 있으니까요.\n\n사실 제가 처음 클라우드의 개념, 정확히는 사회를 어떻게 바꾸어 나갈것인가에 대한 견해를 접한건 수년 전 니콜라스 카(Nicholas Carr)의 아래 책을 통해서였습니다. 외국에서도 꽤 이야기 된것으로 알고 있습니다. \n\n![6656655.jpg](/files/21888)\n니콜라스 카의 경우 2003년도 5월 HBR(Harvard Business Review)에 \"IT Doesn't Matter\"라는 중의적 문구의 글을 실으면서 유명과 악명을 동시에 날렸었죠. 이 책도 전기산업과 IT 산업을 비교하면서 다소 파격적으로 이야기 했습니다. 처음엔 읽으면서 '와~~~!!' 했는데 나중엔 조금 지루해지기도 하고, 다소 강한 어조로 인해 살짝 거리를 두고 읽었습니다만, 어쨌든.\n\n굳이 저 책까지는 아니더라도, dW 기사로 올라온 클라우드 관련 글들은 찾아서 한번쯤 읽어보시길 권합니다. :)",
    "attachments": [
      {
        "id": 21888,
        "name": "6656655.jpg",
        "hash": "f9f2633c6f0396335395ef7cebf1df79e7adeffa",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 12187,
        "containerId": "12366"
      }
    ]
  },
  {
    "id": 211,
    "title": "[dW Review] 자바스크립트 초보자를 위한 학습자료",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1319989008000,
    "body": "> doortts | 2011-10-31 월요일 오전 12:36 | Better SW Development | [원본](http://blog.doortts.com/211)\n\n\n\n* dW Review, 이번 달은 조금 짧게 리뷰할 예정입니다. 너그럽게 봐주세요~ :) \n\n\n\n최근 node.js와 구글 Dart 언어를 중심으로 한 스터디 OctoberSky.js를 시작했습니다. 온라인/오프라인 동시에 진행하고 있는데요, 참여하시는 분들중에는 자바스크립트 자체가 아직은 조금 낯선 분들도 계십니다.\n\n그리고 낯설진 않지만, 다양한 경로(?)로 배워서 체계가 약한 사람들도 있고요. \n\n도움이 될만한 몇 가지 학습자료를 소개해 봅니다.\n\n웹\n\n\n\n**JavaScript 언어 시작하기, 파트 1: JavaScript 언어의 기초**\n\n[http://www.ibm.com/developerworks/kr/library/wa-javascriptstart/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/wa-javascriptstart/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/wa-javascriptstart/index.html?ca=drs-]로 이동합니다.\")\n\n**JavaScript 언어 시작하기, Part 2: 이벤트, 쿠키, 타이밍 등**\n\n[http://www.ibm.com/developerworks/kr/library/wa-javascriptstart2/index.html?ca=drs-](http://www.ibm.com/developerworks/kr/library/wa-javascriptstart2/index.html?ca=drs- \"[http://www.ibm.com/developerworks/kr/library/wa-javascriptstart2/index.html?ca=drs-]로 이동합니다.\")\n\n**겸손한 Javascript 및 Ajax 코드 작성 안내서**\n\n[http://www.ibm.com/developerworks/kr/library/wa-aj-unobtrusive/index.html](http://www.ibm.com/developerworks/kr/library/wa-aj-unobtrusive/index.html \"[http://www.ibm.com/developerworks/kr/library/wa-aj-unobtrusive/index.html]로 이동합니다.\")\n\n**Java development 2.0: Java 개발자를 위한 Javascript**\n\n[http://www.ibm.com/developerworks/kr/library/j-javadev2-18/index.html](http://www.ibm.com/developerworks/kr/library/j-javadev2-18/index.html \"[http://www.ibm.com/developerworks/kr/library/j-javadev2-18/index.html]로 이동합니다.\")\n\n오늘날 Javascript가 중요한 이유와 Chrome에서 Javascript 사용법등\n\n**클리어보스(ClearBoth)의 자바스크립트 자료**\n\n[http://www.clearboth.org/lecture/](http://www.clearboth.org/lecture/) [](http://www.clearboth.org/category/javascript/ \"[http://www.clearboth.org/category/javascript/]로 이동합니다.\") 클리어보스는 지식을 나누기 위해 노력하고 함께하는 매우 훌륭한 모임입니다. 양질의 번역과 좋은 강좌들을 무료로 제공하고 있습니다. 여유되시면 모임 소개 한번 읽어보세요. :) [http://www.clearboth.org/about/](http://www.clearboth.org/about/) \n\n\n\n책\n\n\n\n**자바스크립트 완벽 가이드 **\n\n[http://www.yes24.com/24/Goods/2943930?Acode=101](http://www.yes24.com/24/Goods/2943930?Acode=101 \"[http://www.yes24.com/24/Goods/2943930?Acode=101]로 이동합니다.\")\n\n일명 코뿔소 책, 읽으신 분들은 다들 추천! but 1260페이지의 압박!\n\n이런건 사실 레퍼런스 책으로 옆에 두고 필요할 때 찾아 보는 책에 가깝죠. \n\n(저도 이번에 주문했답니다!)\n\n**더글라스 크락포드의 자바스크립트 핵심 가이드**\n\n[http://www.yes24.com/24/goods/3071412?scode=032&OzSrank=7](http://www.yes24.com/24/goods/3071412?scode=032&OzSrank=7 \"[http://www.yes24.com/24/goods/3071412?scode=032&OzSrank=7]로 이동합니다.\")\n\n원서 제목은 JavaScript : The Good Parts\n\n외국에서는 원체 유명한 책이고, 저자가 무려 JSON만든 크락포드 아저씨!\n\nBut 초보자라면 바로 무릎꿇고 울게 만드는 난이도.\n\nnode.js 개발자인 라이언달이 이 책만 봤어도 평생 잘못쓰고 있던 실수 하나는 미리 알았을 텐데 말입니다. \n\n(지난 금요일밤에 같이 채팅하며 동영상 보신 분들은 다들 아시죠? ㅋ~)\n\n책 관련해서는 아래 링크도 봐주세요. :)\n\n[서평] 거침없이 배우는 자바 스크립트\n[http://blog.doortts.com/142](http://blog.doortts.com/142) \n\n\n\n기타 좋은 자료 있으면 댓글이나 facebook 코멘트로 남겨주세요. :D\n\n다만, 너무 많은 자료는 너무 적은 자료 만큼이나 효용이 떨어집니다.\n그때 그때 웹 기사를 읽고, 책은 하나 옆에 끼고 차분히 보는 것이 (제 기준으로는) 효과적이지 않을까 사료됩니다. \n\n그럼, 활기찬 한 주 시작되세요!"
  },
  {
    "id": 212,
    "title": "[dW Review] 혁신적인 아키텍처와 창발적 설계: 테스트 주도 설계",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320056700000,
    "body": "> doortts | 2011-10-31 월요일 오전 1:37 | Better SW Development | [원본](http://blog.doortts.com/212)\n\n\n\n* dW Review, 이번 달은 조금 짧게 리뷰할 예정입니다. 너그럽게 봐주세요~ :) \n\n\n\n꽤 괜찮은 TDD관련 글입니다. 영문의 경우 그냥 훝어 읽었는데, 한글로 다시보니 많이 새롭습니다.(응??)\n\n여하튼... 언제나 그러한, 조금은 매니악한 닐포드의 글 되겠습니다.\n\n\n\n**혁신적인 아키텍처와 창발적 설계: 테스트 주도 설계, Part 1**\n\n[http://www.ibm.com/developerworks/kr/library/j-eaed2/index.html](http://www.ibm.com/developerworks/kr/library/j-eaed2/index.html \"[http://www.ibm.com/developerworks/kr/library/j-eaed2/index.html]로 이동합니다.\")\n\n테스트를 통한 설계 진행 및 개선\n\n**혁신적인 아키텍처와 창발적 설계: 테스트 주도 설계, Part 2**\n\n[http://www.ibm.com/developerworks/kr/library/j-eaed3/index.html](http://www.ibm.com/developerworks/kr/library/j-eaed3/index.html \"[http://www.ibm.com/developerworks/kr/library/j-eaed3/index.html]로 이동합니다.\")\n\n테스트를 통한 설계 진행 및 개선에 관한 추가 정보\n\n\n\n**인상깊은 문구**\n\n\n\n*   TDD 코딩을 위한 주문은 \"**테스트를 작성할 수 있는 가장 간단한 것은?**\"이라는 질문이다.\n*   테스트를 통해 드러나는 유익한 특성 중 하나는 응집력이 높은 메소드이다.\n*   테스트에서 적당한 반복은 허용해야 한다\n*   개발자가 새로운 기능을 개발하기 위한 최초의 테스트를 작성할 때 성공보다는 오히려 실패할 테스트를 작성해보도록 권장한다. \n*   TDD 버전이 사후 테스트 코드(=업무코드 작성한 다음에 테스트 코드를 작성하는 것)보다 3배 이상 간결하다. \n\n\n\n**Composed method 패턴**\n\n\n\n*   식별 가능한 하나의 태스크를 수행하는 메소드로 프로그램을 나눈다.\n*   같은 추상 레벨에 있는 메소드에 모든 연산을 유지한다.\n*   그러면 자연스럽게 프로그램이 다수의 작은 메소드로 나뉘며, 각 메소드의 길이는 몇 행에 불과하다. \n\n"
  },
  {
    "id": 213,
    "title": "[Node.js 따라배우기] Node.js TDD 프레임워크 Expresso 매뉴얼 번역",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320157553000,
    "body": "> doortts | 2011-11-01 화요일 오후 10:1 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/213)\n\n# \n\n\n\n따라하기 실습에서﻿ 사용하는 node.js 웹 프레임워크는 [express](http://expressjs.com/ \"[http://expressjs.com/]로 이동합니다.\") 입니다. express는 왠만한 웹 애플리케이션 프레임워크 수준입니다. 보면 볼수록 괜찮다는 느낌이 드는 프레임워크인데요, 놀랍게도 firejune이라는 분께서 매뉴얼을 한글로 번역해 놓으셨습니다. [Node.JS용 MVC 프레임워크 Express - 문서 번역](http://firejune.com/1694#p_tb \"[http://firejune.com/1694#p_tb]로 이동합니다.\"). node.js관련해서 이런저런 사이트를 언급했었는데요, 이런 사이트도 있었는 줄 몰랐습니다. 이 외에도 이분의 블로그에는 node.js 관련된 좋은 내용이 참 많이 있습니다. 참고하시면 많은 도움 되실겁니다. 기회봐 여쭤봐서 오프라인 세미나때 초청해 볼 생각입니다. (잘 되야 할텐데 말입니다.ㅎㅎ) \n\n여튼 그에 필 받아서 저는 Express에서도 쓸수 있고, 우리의 따라배우기 강좌에도 나오는 node.js 테스트 프레임워크인 [Expresso 매뉴얼](http://visionmedia.github.com/expresso/ \"[http://visionmedia.github.com/expresso/]로 이동합니다.\")을 번역해 봅니다. 지금은 그냥 한번 쭉~ 훓어 보시고, 따라배우기 스터디 도중 중간중간 필요하실때 참고 하시면 될 것 같습니다. :D\n\n참! 훅~딱~ 번역해서 오역/오타 있을수 있습니다. 눈에 띄시면 코멘트로 남겨주세요~\n\n\n\nExpresso\n 원문: [http://visionmedia.github.com/expresso/](http://visionmedia.github.com/expresso/) [Expresso](http://github.com/visionmedia/expresso)는 [nodejs](http://nodejs.org/)에서 사용하는 자바스크립트[TDD](http://en.wikipedia.org/wiki/Test-driven_development) 프레임워크입니다. . Expresso는 매우 빠르며, 기본 단정문 이외의 추가적인 단정문(assertion) 메소드와 코드 커버리지 레포트, CI 지원 등을 갖추고 있습니다. .\n\n## Features\n\n*   경량\n*   직관적인 비동기 지원 \n*   직관적인 테스트 러너 실행\n*   [node-jscoverage](http://github.com/visionmedia/node-jscoverage)를 통한 테스트 커버리지 지원\n*   코어 `assert` module 사용과 확장지원\n*   `assert.deepEqual()의 별칭으로 ``assert.eql()` 사용\n*   `assert.response()` http response 유틸리티\n*   `assert.includes()`\n*   `assert.isNull()`\n*   `assert.isUndefined()`\n*   `assert.isNotNull()`\n*   `assert.isDefined()`\n*   `assert.match()`\n*   `assert.length()`\n\n## 설치 \n\nexpresso와 node-jscoverage를 설치하려면 다음과 같은 명령어를 사용한다. node-jscoverage가 먼저 컴파일 된다.\n\n```\n$ make install\n```\n\n커버리지 레포트 없이 expresso 단독으로 설치하려면 다음과 같이\n\n```\n$ make install-expresso\n```\n\nnpm을 이용해서 설치하려면 아래와 같이\n\n```\n$ npm install expresso\n```\n\n## 예제들\n\n테스트 케이스를 정의하기 위해 함수들을 export 합니다. \n\n```\nexports['test String#length'] = function(){\n     assert.equal(6, 'foobar'.length);\n };\n```\n\n혹은, 다수의 테스트를 실행하기 위해서 테스트들을 포함하고 있는 객체를 export 하고 싶을 수도 있습니다. \n\n```\nmodule.exports = {\n     'test String#length': function(beforeExit, assert) {\n       assert.equal(6, 'foobar'.length);\n     }\n };\n```\n\n괄호로 된 키 값을 설정하고 싶지 않다면 다음과 같이 합니다. \n\n```\nexports.testsStringLength = function(beforeExit, assert) {\n     assert.equal(6, 'foobar'.length);\n };\n```\n\n콜백 함수로 전달 된 인자는 `beforeExit`와 `assert입니다.각각의 테스트 함수에서 (\"this\")는 테스트할 객체를 지칭합니다.`beforeExit` 인자로 함수를 전달해서 테스트를 끝내기 전에 넘긴 해당 함수를 실행할 수 있습니다. 실제로 테스트가 잘 수행되었는지 확인할때 요긴합니다. `beforeExit` 는 this에 대한 exit 이벤트를 리스닝하는 단축 명령어에 해당합니다.` 두번째 파리미터인 `assert` 는 테스트 대상 객체에 대한 `assert` 입니다. 비동기 콜백에서 단정문들이 올바른 테스트와 연결되는 것을 확실하게 만들어 줍니다.\n\n```\nexports.testAsync = function(beforeExit, assert) {\n     var n = 0;\n     setTimeout(function() {\n         ++n;\n         assert.ok(true);\n     }, 200);\n     setTimeout(function() {\n         ++n;\n         assert.ok(true);\n     }, 200);\n\n      // 테스트가 끝나면, exit 이벤트가 호출된다.  \n     this.on('exit', function() {\n         assert.equal(2, n, 'Ensure both timeouts are called');\n     });\n\n      // 대안으로, beforeExit를 단축명령어로 사용할 수 있다.\n     beforeExit(function() {\n         assert.equal(2, n, 'Ensure both timeouts are called');\n     });\n };\n```\n\n## 단정문 유틸리티들 Assert Utilities\n\n### assert.isNull(val[, msg])\n\n`val은` `null이어야 한다!`\n\n```\nassert.isNull(null);\n```\n\n### assert.isNotNull(val[, msg])\n\n`val`은 `null이 아니다!`\n\n```\nassert.isNotNull(undefined);\n assert.isNotNull(false);\n```\n\n### assert.isUndefined(val[, msg])\n\n`val은` `undefined 상태이어야 한다.`\n\n```\nassert.isUndefined(undefined);\n```\n\n### assert.isDefined(val[, msg])\n\n`val은` `undefined상태가 아니어야 한다.`\n\n```\nassert.isDefined(null);\n assert.isDefined(false);\n```\n\n### assert.match(str, regexp[, msg])\n\n`str이 정규표현식(``regexp)과 일치해야 한다.`\n\n```\nassert.match('foobar', /^foo(bar)?/);\n assert.match('foo', /^foo(bar)?/);\n```\n\n### assert.length(val, n[, msg])\n\n`val의 길이(`length)`는` `n이어야 한다.`\n\n```\nassert.length([1,2,3], 3);\n assert.length('foo', 3);\n```\n\n### assert.type(obj, type[, msg])\n\n`obj는 ``타입이 같아야 한다.`\n\n```\nassert.type(3, 'number');\n```\n\n### assert.eql(a, b[, msg])\n\n객체 `b는` 객체 `a와 같아야` 한다. 코어 `assert.deepEqual()메소드`의 별칭에 해당한다. ==를 사용하는 assert.equal()와는 정 반대다. \n\n```\nassert.eql('foo', 'foo');\n assert.eql([1,2], [1,2]);\n assert.eql({ foo: 'bar' }, { foo: 'bar' });\n```\n\n### assert.includes(obj, val[, msg])\n\n`obj가 ``val을 포함해야 한다. 배열(``Array`s)과 문자열(`Strings)을 지원한다.`\n\n```\nassert.includes([1,2,3], 3);\n assert.includes('foobar', 'foo');\n assert.includes('foobar', 'bar');\n```\n\n### assert.response(server, req, res|fn[, msg|fn])\n\nlisten()을 호출하지 않고 주어진 server에서 단정문을 수행한다.  expresso에 의해 내부적으로 수행되고 모든 응답이 완료되면 서버가 중단된다. (listen을 하면 외부 입력을 받게 되므로 해당 메소드를 호출하지 않고 내부적으로 진행된다는 뜻) 이 메소드는 어떤 http.Server 인스턴스와도 동작하고, 따라서 _[Connect](http://senchalabs.github.com/connect/ \"[http://senchalabs.github.com/connect/]로 이동합니다.\")_[and](http://senchalabs.github.com/connect/ \"[http://senchalabs.github.com/connect/]로 이동합니다.\") 나 [Express](http://firejune.io/express/ \"[http://firejune.io/express/]로 이동합니다.\") 서버들과도 잘 동작한다.\n\n**`req`** 객체는 다음과 같은 것들을 담을 수 있다:\n\n*   `url`: 요청 URL\n*   `timeout`: 밀리초 단위의 타임아웃\n*   `method`: HTTP 메소드 (GET/POST)\n*   `data`: 요청 바디(request body)\n*   `headers`: 헤더 객체\n\n**`res`** 객체는 단정문을 위한 응답을 받는 콜백 함수가 될 수도 있고, 다음과 같은 프로퍼티를 가진 객체로써 응답(response)에 대해 몇몇 단정문을 실행하는 데에 쓰일 수도 있다.\n\n*   `body`: 응답 몸체(response body)에 대한 단정문을 수행한다. 정규식이나 문자열이 될 수 있다.\n*   `status`: 응답 상태코드(status code)에 대한 단정문을 수행한다. \n*   `header`: 헤더항목들의 일치여부를 확인한다. (지정되지 않은 헤더 항목은 무시. 정규식, 혹은 문자열 사용가능)\n\nres를 넘길때 추가적인 단정문 처리를 위해 네번재 인자로 콜백함수를 넘길 수 있다. \n\n아래 코드는 위에서 설명한 내용에 대한 예제이다.\n\n```\nassert.response(server, {\n     url: '/', timeout: 500\n }, {\n     body: 'foobar'\n });\n\n assert.response(server, {\n     url: '/',\n     method: 'GET'\n }, {\n     body: '{\"name\":\"tj\"}',\n     status: 200,\n     headers: {\n         'Content-Type': 'application/json; charset=utf-8',\n         'X-Foo': 'bar'\n     }\n });\n\n assert.response(server, {\n     url: '/foo',\n     method: 'POST',\n     data: 'bar baz'\n }, {\n     body: '/foo bar baz',\n     status: 200\n }, 'Test POST');\n\n assert.response(server, {\n     url: '/foo',\n     method: 'POST',\n     data: 'bar baz'\n }, {\n     body: '/foo bar baz',\n     status: 200\n }, function(res){\n     // 모두 완료. 필요하다면 추가적인 테스트 수행\n });\n\n assert.response(server, {\n     url: '/'\n }, function(res){\n     assert.ok(res.body.indexOf('tj') >= 0, 'Test assert.response() callback');\n });\n```\n\nresponse 단정문 함수는 응답이 없거나 타임아웃(기본 30초)이 발생하면 실패로 간주한다. \n\nexpresso(1)\n\n단일 테스트 스위트(=파일)을 실행하려면 다음과 같이\n\n```\n$ expresso test/a.test.js\n```\n\n몇몇 테스트 스위트들을 추가하길 원할 경우에는 다음과 같은 식으로 \n\n```\n$ expresso test/a.test.js test/b.test.js\n```\n\n모든 테스트 스위트 안에서 특정한 것들만을 지정해서 테스트 하고 싶다면, 즉 화이트리스트(whitelist)테스트를 하고 싶으면 다음과 같이 수행한다. \n\n```\n$ expresso --only  \"foo()\"  --only  \"bar()\"\n```\n\n혹은, 다음과 같은 식으로 한번에 호출도 가능하다.\n\n```\n$ expresso --only  \"foo(), bar()\"\n```\n\n와일드카드 사용(Globbing)도 가능하다.\n\n```\n$ expresso test/*\n```\n\n아무것도 지정하지 않고 expresso를 호출하면 기본적으로는 _test/*_ 를 호출한다. 따라서 아래 명령은 바로 위의 명령과 동일하다.\n\n```\n$ expresso\n```\n\n만약 테스트 실행전에 require.paths에서 지정된 패스를 변경하고 싶다면, `-I ("
  },
  {
    "id": 214,
    "title": "[Node.js 따라배우기] 그래서, Node.js는 무엇인가?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320243632000,
    "body": "> doortts | 2011-11-02 수요일 오후 10:3 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/214)\n\n\n\n\n\n스터디 시작 [오리엔테이션](http://blog.doortts.com/206 \"[http://blog.doortts.com/206]로 이동합니다.\")에서 링크 걸어넣고 node.js에 대한 글들을 읽어보세요! 라고 이야기 드리고 스터디를 시작했었습니다. 그런데 그렇게만 했더니, 생각보다 많은 분들이 **'그런데 그래서 node.js가 뭔가요?'**라고 의문을 가지시는 것 같습니다. 그래서 따라하기 스터디를 좀 더 진행하기전에 node.js의 정체에 대해 되살펴보는 시간을 가지려고 합니다. 부디, 차분히 읽어보시길 권합니다. \n\n마찬가지로 각종 코멘트 환영합니다. :D\n\n\n\n**한글 위키피디아의 정의**\n\n\n\n**Node.js**는 [V8 (자바스크립트 엔진)](http://ko.wikipedia.org/wiki/V8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%97%94%EC%A7%84) \"V8 (자바스크립트 엔진)\") 위에서 동작하는 [이벤트](http://ko.wikipedia.org/w/index.php?title=%EC%9D%B4%EB%B2%A4%ED%8A%B8_%EA%B8%B0%EB%B0%98_%EC%84%A4%EA%B3%84&action=edit&redlink=1 \"이벤트 기반 설계 (존재하지 않는 문서)\") 처리 [I/O](http://ko.wikipedia.org/wiki/%EC%9E%85%EC%B6%9C%EB%A0%A5 \"입출력\") [프레임워크](http://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC \"소프트웨어 프레임워크\")이다. [웹 서버](http://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84 \"웹 서버\")와 같이 확장성 있는 네트워크 프로그램 제작을 위해 고안되었다.\n\nNode.js는 [파이썬](http://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%EC%8D%AC \"파이썬\")으로 만든 [Twisted](http://en.wikipedia.org/wiki/Twisted_(Software) \"en:Twisted (Software)\"), [펄](http://ko.wikipedia.org/wiki/%ED%8E%84 \"펄\")로 만든 [펄 객체 환경](http://en.wikipedia.org/wiki/Perl_Object_Environment \"en:Perl Object Environment\"), [루비](http://ko.wikipedia.org/wiki/%EB%A3%A8%EB%B9%84_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) \"루비 (프로그래밍 언어)\")로 만든 [이벤트머신](http://ko.wikipedia.org/w/index.php?title=%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%A8%B8%EC%8B%A0&action=edit&redlink=1 \"이벤트머신 (존재하지 않는 문서)\")과 그 용도가 비슷하다. 대부분의 [자바스크립트](http://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8 \"자바스크립트\")가 웹 브라우저에서 실행되는 것과는 달리, Node.js는 서버 측에서 실행된다. Node.js는 일부 [CommonJS](http://ko.wikipedia.org/w/index.php?title=CommonJS&action=edit&redlink=1 \"CommonJS (존재하지 않는 문서)\") 명세를 구현하고 있으며, 쌍방향 테스트를 위해 [REPL](http://en.wikipedia.org/wiki/Read-eval-print_loop \"en:Read-eval-print loop\") 환경을 포함하고 있다.\n\n\n\n* CommonJS에 대해서는 따로 포스팅을 통해 설명드릴게요.\n \n\n**Node Beginner's Guide의 정의**\n\n\n\nNode.js는 실질적으로 **서버사이드 자바스크립트 실행환경**과 **라이브러리**, 이렇게 두 가지로 이루어져 있습니다.\n\n\n\n**Nodejs.org 사이트의 설명**\n\n\n\n\n\nNode의 목표는 확장이 용이한 네트워크 프로그램을 쉽게 만들 수 있도록 **방법**을 제시하는 것입니다. [\"hello world\" 웹서버 예제](http://nodejs.org/ \"[http://nodejs.org/]로 이동합니다.\")는, 많은 클라이언트 연결을 동시적으로(concurrently) 다룰 수 있습니다. Node는 새로운 커넥션이 만들어질 때, 해당 내용에 대해 통지를 받아야 하는 운영체계에 (epoll, kqueue, /dev/pool, 혹은 select같은 것을 통해) 알려준 다음, 대기상태로 들어갑니다. 만약 누군가가 새로운 연결을 하면, (다시) 콜백을 실행합니다. 각각의 연결에 있어 단지 작은 힙 (메모리) 할당만 일어납니다.\n\n\n\n이런 방식은 오늘날의 OS 스레드(thread)를 사용하는 좀 더 흔한 동시성 모델에 반대됩니다. 스레드 기반 네트워킹은 상대적으로 비효율적이고 사용하기 매우 어렵습니다. [이것](http://www.kegel.com/c10k.html \"[http://www.kegel.com/c10k.html]로 이동합니다.\")과 [이것](http://bulk.fefe.de/scalable-networking.pdf \"[http://bulk.fefe.de/scalable-networking.pdf]로 이동합니다.\")을 한번 읽어보세요. Node는 부하가 큰 시스템에서 각각의 연결에 2mb의 스레드 스택을 사용하는 시스템 보다 메모리 효율이 훨씬 좋습니다. 더욱이, **Node의 사용자들은 프로세스 데드락 걱정에서 자유롭습니다.** (Node는 Lock이란 게 없습니다.) Node에는 I/O를직접 수행하는 함수가 거의 없습니다. 그렇기 때문에 프로세스가 절대 블럭(block)되지 않습니다. 블럭이 없기 때문에, 전문가가 아닌 프로그래머들도 빠른 속도의 시스템을 개발할 수 있습니다.\n\nNode는 루비의 이벤트 머신([Event Machine](http://rubyeventmachine.com/ \"[http://rubyeventmachine.com/]로 이동합니다.\"))이나 파이썬의 트위스티드([Twisted](http://twistedmatrix.com/ \"[http://twistedmatrix.com/]로 이동합니다.\")) 같은 시스템에 영향을 받았고 유사하게 설계되었습니다. 다만 Node는 조금 더 발전된 이벤트 모델을 취합니다. 라이브러리 같은 방식 대신에 마치 언어 구조([language construct](http://en.wikipedia.org/wiki/Language_construct \"[http://en.wikipedia.org/wiki/Language_construct]로 이동합니다.\"))처럼 이벤트 루프 기능을 제공합니다. 전형적 형태로는, 스크립트 시작부분에 콜백으로 행위를 정의하고, 끝부분에 EventMachine::run() 같은 블록킹 콜을 호출해서 서버를 시작합니다. Node에서는 이벤트-루핑-시~작! 같은 것이 없습니다. Node는 입력받은 스크립트를 실행한 다음, 간단하게 다시 이벤트 루프에 빠집니다. Node는 더 이상 수행할 콜백이 남아있지 않을 때 이벤트 루프를 빠져나옵니다. 이런 동작은 마치 사용자에게는 보이지 않는 브라우저상의 자바스크립트 이벤트 루프와 유사합니다.\n\n**HTTP는 Node의 퍼스트 클래스 프로토콜입니다.** Node의 HTTP 라이브러리는 저자의 웹 서버 개발 경험과 작업 경험을 넘어서서 점점 성장하고 있습니다. 예를 들면, 대부분의 웹 프레임워크에서 데이터를 스트리밍하는 일은 불가능합니다. Node는 Node 자신의 HTTP [파서](http://github.com/ry/http-parser/tree/master \"[http://github.com/ry/http-parser/tree/master]로 이동합니다.\")와 API에서 이런 문제들을 해결하기 위한 시도를 했습니다. Node의 순수한 이벤트처리 기반구조와 연결하면, 웹 라이브러리나 웹 프레임워크를 위한 좋은 기반을 만들어 냅니다.\n\n하지만 멀티 프로세서 동시성 처리의 경우는 어떤가요? 멀티 코어 컴퓨터용 프로그램들을 확장하기 위해서는 스레드들이 필요하지 않을까요? child_process.for()를 통해 프로세스들을 시작할 수 있습니다. 그러면 다른 프로세스들이 병렬로 처리하려 할 겁니다.\n\n\n\n\n\n\n이게 node.js의 정체입니다. **'무슨소리!! node.js는 그게 다가 아니라고!'**라고 말할 수도 있지만, 그건 node.js와 node.js가 만들어낸 에코시스템을 혼동하는 겁니다.\n\n자, 조금만 더 살펴보겠습니다. 이하는 저의 개인 의견입니다. :D\n \n **Node.js에 대한 오해와 진실**\n\n\n\n**1.Node.js는 프론트앤드 개발이다!**\n- 아닙니다. 노드는 자바스크립트 언어를 쓸 뿐이지 서버사이드 개발입니다. Node.js를 만든 라이언 달(Ryan Dahl)도 서버 개발자입니다. 그것도 아주 코어한.\n\n\" In the past year I think I have finally come to understand the ideals of Unix: file descriptors and processes orchestrated with C\" - Ryan Dahl\n\n**2.자바스크립트를 주로 하던 프론트 앤드 개발자가 이제 쉽게 서버 개발을 할 수 있다!**\n- 아닙니다. 프론트 앤드 개발을 하던 개발자에게 자바, 아파치, 톰캣 등등을 배우지 않고 서버 개발, 그 중에서도 I/O 특화된 개발을 할때 좀 더 쉬운 환경을 제공하지만, 역시 I/O및  서버사이드 기술 개념을 학습하지 않으면 제대로된 개발을 하기 어렵습니다. 무슨말인가 하면, node.js 공식 사이트 [문서 페이지](http://nodejs.org/docs/v0.5.10/api/ \"[http://nodejs.org/docs/v0.5.10/api/]로 이동합니다.\")의 API 이름들을 살펴보시면 바로 이해가 되실겁니다.\n \n\n**3.Node.js가 대 유행이다!**\n\n아래는 javascript, node.js, python, ruby에 대한 구글 트랜즈입니다.\n\n![node.png](/files/21890)\n\n비교 영역이 잘못됐잖아! 라고 말할 수도 있겠습니다만, 어쨌든 사람들이 찾는 빈도를 보시만, python이 0.35일때 node.js는 소수 두자리까지 이하의 수준입니다. 우리 주변에 python 쓰는 사람이 몇이던가요? \n \n\n**4.그럼 왜 배우냐??**\n- 가능성에 대한 투자입니다. 그리고 지식영역의 확장을 위해서입니다. node.js는 그 자체도 자체지만 node.js가 만들어낸 플랫폼과 에코시스템의 성장이 예사롭진 않습니다. 특히 npm과 더불어 I/O를 사용하는 서버모듈의 개발과 설치가 매우 간편해졌습니다. 그리고 성능도 괜찮고요.\n하지만 현실에서 이걸 얼마만큼 쓰게 될지는 말 그대로 미지수입니다. 그럼에도 투자해 볼만한 가치가 있다고 생각합니다. \n \n\n**5\\. node.js의 최고 장점은 성능 아닌가요?**\n- 물론 몇몇 벤치마킹에 의하면 node.js의 성능이 뛰어난 건 맞습니다. 하지만 예전에 mysql이 처음 나왔을때를 떠올려보면 그 때도 그랬습니다. mysql이 단순 트랜잭션처리가 오라클에 비해 수 배에서 수 십배까지 좋게 나왔었습니다. 하지만 성능때문에 mysql을 쓰겠다며 바로 넘어가는 경우는 드물었습니다. 만약 아파치 웹 서버보다 50%쯤 빠른 서버가 나온다면 사람들이 다 그 서버로 옮길까요? 아마 그렇다 하더라도 한동안은 아닐겁니다. 마찬가지입니다. node.js를 서버 성능으로만 놓고 따르려 한다면 위험한 생각일 수 있습니다. 엔지니어라면 대부분 약간씩은 성능지상주의 성향이 있긴 하지만, 성능만으로 node.js를 평가한다면, 만일 더 나은 성능의 무언가가 자바같은 메이저(=사람이 많은) 쪽에서 나온다면, 그 순간 가치가 급락해 버릴겁니다. (제 생각엔) node.js는 기반시스템으로 놓고 접근해야 합니다. (자바스크립트로 I/O를 다를 수 있다는 건 엄청난 매력이니까요.) node가 스스로를 하부로 시스템의 일부로 내리고, npm과 함께 에코시스템을 구축해서 확장의 문을 열어놓은 것은 매우 훌륭한 선택이었다고 봅니다.\n\n참고로, Node.js 생태계에서 구축된 모듈들은 아래 페이지에서 확인 가능합니다.\n[https://github.com/joyent/node/wiki/modules](https://github.com/joyent/node/wiki/modules)\n\n자! 이런저런 이야기들에도 불구하고, 당분간은 신기하고 재밌을 겁니다. 왜냐하면 어쨌든 새로운 세상이기 때문입니다! :D\n\n참고로 다음 강좌가 곧 올라옵니다. 진도 챙겨주세요! 아!! 천천히 따로 하신다고요? 에이~ 다 같이 할때 함께 진행하세요~ 밀리면 초등시절 방학숙제 마냥 감당 안됩니다~ ㅎ~\n\n\n\n**광고!**\n\n온라인 스터디 도와주실 분을 찾습니다.\n \n- facebook에 있는 [스터디 페이지](http://www.facebook.com/pages/OctoberSkyjs/101524936627596 \"[http://www.facebook.com/pages/OctoberSkyjs/101524936627596]로 이동합니다.\") 함께 관리\n- 댓글 관리 (진도댓글 확인하고 좋아요 눌러주기 같은) :D \n- 관련 아티클 번역 \n 댓글이나 메일로 알려주세요!\n혜택은? 음.. 책 선물? 오프라인 모임때 일정맞춰 드리기? 음.. 여튼 좋은 혜택 드릴 수 있도록 좀 더 고민해 보겠습니다. ^^;;  \n\n\n\n\n\n#### Comments\n\n블로그에서 매번 좋은 내용 보고 있습니다.. 저도 도와 드릴 만한게 있을까요!?\n\n [상피리](http://blog.sangpire.pe.kr) | 2011-11-03 목요일 오후 1:4\n\n--\n\n페북으로 친구신청했습니다. :D\n\n [doortts](http://blog.doortts.com) | 2011-11-03 목요일 오후 2:49\n\n--\n\nOK\n\n [daclouds](http://me2day.net/daclouds) | 2011-11-08 화요일 오전 11:12\n\n--\n",
    "attachments": [
      {
        "id": 21890,
        "name": "node.png",
        "hash": "696b7e9e8135f26b2b2733c759add805873f8988",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 44957,
        "containerId": "12371"
      }
    ]
  },
  {
    "id": 215,
    "title": "[node.js 따라배우기 03] RESTful 메소드와 테스팅",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320282000000,
    "body": "> doortts | 2011-11-03 목요일 오후 4:50 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/215)\n\n[[node.js 따라배우기 02] 설치와 애플리케이션 뼈대 만들기 (Installation and Skeleton App)](http://blog.doortts.com/209 \"[http://blog.doortts.com/209]로 이동합니다.\")에 이은 따라배우기 세 번째 입니다. 본 시리즈는 \"Node.js\"를 이용해서 웹 애플리케이션(이하 웹앱)을 만들어보는 따라배우기(tutorial)시리즈입니다.  node.js를 이용해서 웹앱을 만드는 과정을 따라가면서, 자신만의 애플리케이션을 만들 때 접하게 될 모든 영역을 다룰 예정입니다.  \n\n\n\n - Part 1: [소개](http://blog.doortts.com/207 \"[http://blog.doortts.com/207]로 이동합니다.\") (Introduction)\n\n- Part 2: [설치와 애플리케이션 뼈대 만들기](http://blog.doortts.com/209 \"[http://blog.doortts.com/209]로 이동합니다.\")(Installation and Skeleton App)\n\n이번 파트에서는 지난 강좌의 뼈대만 있는 앱을 완성시켜볼 예정입니다. 간단한 Document 모델을 추가했었습니다. 이제 살을 조금 붙어봅시다. 이번 따라하기는 git 저장소에서 코드를 체크아웃 해서 진행합니다. [](https://github.com/alexyoung/nodepad/blob/39e66cb9d11a67044495beb0de1934ac4d9c4786/app.js \"[https://github.com/alexyoung/nodepad/blob/39e66cb9d11a67044495beb0de1934ac4d9c4786/app.js]로 이동합니다.\")[여길](https://github.com/alexyoung/nodepad/blob/39e66cb9d11a67044495beb0de1934ac4d9c4786/app.js \"[https://github.com/alexyoung/nodepad/blob/39e66cb9d11a67044495beb0de1934ac4d9c4786/app.js]로 이동합니다.\") 방문하시면 이번 따라하기 실습의 완성 코드를 보실 수 있습니다.\n\n**(옮긴이 주)** 전체 실습의 단계별 코드들을 보고 싶으시면 다음 주소를 이용하시면 됩니다.\n[https://github.com/alexyoung/nodepad/commits/master](https://github.com/alexyoung/nodepad/commits/master)\n사용하는 모듈들의 업데이트에 따라서 실제 코드들도 업데이트 되고 있는 걸 보실 수 있습니다.\n대표적으로 mongoose의 사용법, express 구조 등이 그렇습니다. 따라하기에서는 현재 버전기준에 맞춰 진행할 예정입니다.\n \n\n **로깅(Logging)**\n\n\n\n자, 로깅을 추가해 봅시다. Express는 로거를 가지고 있으며, app.configure 블럭에서 설정 가능합니다. use를 쓰는걸 잊지말아주세요.\n\n\n\n| \n\n app.configure(function() {\n\n app.use(express.logger());\n\n // 지난 강좌의 설정 옵션들...\n\n}); \n\n |\n\n\n\n환경에 따라서 로깅설정을 조금 고치는 게 좋습니다. 마찬가지로 전 이렇게 수정해 보았습니다. \n\n| \n\napp.configure('development', function() {\n\n app.use(express.logger());\n\n app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));\n\n});\n\n \n\napp.configure('production', function() {\n\n app.use(express.logger());\n\n app.use(express.errorHandler());\n\n});\n\n |\n\n\n\n**API** \n\nCRUD((Create, Read, Update, Delete)기반의 RESTful API를 사용해서 HTTP 프로토콜로 문서(document) 접근 방식을 모델링 할 수 있습니다. \n\n- **GET /documents**  \n\n#### Comments\n\nOK\n\n [백기선](http://whiteship.me) | 2011-11-11 금요일 오후 6:33\n\n--\n\nOK\n\n sjune | 2011-11-14 월요일 오전 1:28\n\n--\n"
  },
  {
    "id": 216,
    "title": "[node.js 따라배우기] Node v0.6 릴리즈 내용",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320491445000,
    "body": "> doortts | 2011-11-05 토요일 오후 7:31 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/216)\n\nnode.js가 드디어 0.6 stable 버전을 릴리즈 했네요. 마침 식탁에 앉아서 입에 빵 물고 우물대다가, 라이언 달의 트윗을 듣고(?)는 접속해서 대충 살펴봤습니다. 우선 v0.6은 node.js의 세 번째 안정(stable)버전입니다. (참고로, node도 근래의 version numbering 추세인 홀수는 개발 버전, 짝수는 안정 버전이라는 컨벤션 룰을 따르고 있습니다.)  \n\n  \n\n**v0.4과 v0.6의 주요 차이점**\n\n**1\\. 소켓용 [ I/O Completion Ports](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx \"[http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx]로 이동합니다.\")를 이용한 네이티브 윈도우즈 환경 지원 **\n - MS의 지원을 받아서 Native API를 지원하는 node.js를 만들고 있다더니 드디어 만들어 냈네요. 속도가 꽤 올랐습니다. 이건 뒤쪽에서 다루겠습니다. 그리고, MS의 지원을 받았다는 게 뭔가 했더니  I/O Completion Ports기술이더군요.  \n\n I/O Completion Ports는 멀티 프로세스 시스템에서의 복수개의 비동기 I/O 요청을 처리하기 위한효율적인 스레드 모델을 제공하는 기술입니다. 하나의 프로세스가 하나의 I/O Completion port를 만들면, 시스템은 요청들을 처리하기 위한 하나의 연관 큐(queue) 오브젝트를 만듭니다.  해당 큐는 오로지 요청들을 처리(서비스)하는 것이 목적입니다. 즉, I/O 요청을 받고나서 스레드를 생성하는 것이 아니라 미리 할당받은 스레드 풀과 결합되어 있는  I/O completion ports를 사용함으로써 더 빠르고 효과적으로 더 많은 숫자의 동시성을 가진 비동기 I/O를 다를수 있습니다... 라는 군요.\n\n\n\n**2\\. 멀티 프로세스간의 로드 밸런싱 기능 통합** ([문서](http://nodejs.org/docs/v0.6.0/api/cluster.html \"[http://nodejs.org/docs/v0.6.0/api/cluster.html]로 이동합니다.\"))\n- Node는 기본적으로 싱글 프로세스에 싱글 스레드로 동작하게 되어있습니다. 따라서 멀티코어 시스템의 장점을 살리고 부하를 분산하기 위해서 node 인스턴스들을 클러스터(cluster)로 구성할 필요가 생길 수 있습니다. 다음은 간단한 예제코드입니다. \n\n```\nvar  cluster  =  require('cluster');\n var  http  =  require('http');\n var  numCPUs  =  require('os').cpus().length;\n\n if  (cluster.isMaster)  {\n   // Fork workers.\n   for  (var  i  =  0;  i  <  numCPUs;  i++)  {\n     cluster.fork();\n   }\n\n   cluster.on('death',  function(worker)  {\n     console.log('worker '  +  worker.pid  +  ' died');\n   });\n }  else  {\n   // Worker processes have a http server.\n   http.Server(function(req,  res)  {\n     res.writeHead(200);\n     res.end(\"hello world\\n\");\n   }).listen(8000);\n }\n```\n\n위와 같이 서버를 띄우면 worker들이 이제 8000번 포트를 공유하게 됩니다. \n\n```\n%  node server.js\n Worker 2438  online\n Worker 2437  online\n```\n\n \n\n**3\\. Node 인스턴스간에 더 나은 IPC 지원**\n* IPC : interprocess communications, 프로세스간 통신\n\n - spawn()으로 만들어진 node 인스턴스들, 그리고 일반적인  ChildProcess 프로세스간에 통신 하는 방법을 개선했습니다.  `child.send(message, [sendHandle])` 로 보내고  `'message'`이벤트로 자식 프로세스에서 잡아내는 방식입니다. 예제를 보겠습니다. :)\n\n다음은 부모쪽. \n\n```\nvar  cp  =  require('child_process');\n\n var  n  =  cp.fork(__dirname  +  '/sub.js');\n\n n.on('message',  function(m)  {\n   console.log('PARENT got message:',  m);\n });\n\n n.send({  hello:  'world'  });\n```\n\n 그리고, 아래는 sub.js라고 가정합니다. \n\n```\nprocess.on('message',  function(m)  {\n   console.log('CHILD got message:',  m);\n });\n\n process.send({  foo:  'bar'  });  \n```\n\n\n\n채널을 이용해서 이렇듯 메시지를 주고 받습니다. \n다만, 유의점으로는 각 자식 노드들은 각각 새로운 V8 인스턴스가 됩니다. 각각의 자식 노드를 만들때마다 대략 기동시간 30ms에 메모리 10M가 가량이 필요하다는 이야깁니다. (이건 크롬 브라우저에서 탭 늘릴때도 거의 동일합니다) 즉, 자식 노드를 생성하는데는 한계가 있다는 이야기가 되겠습니다. :)\n\n **3\\. 커맨드라인 디버거 개선** ([문서](http://nodejs.org/docs/v0.6.0/api/debugger.html \"[http://nodejs.org/docs/v0.6.0/api/debugger.html]로 이동합니다.\"))\n\n  - v0.4.1.2에 비해서는 대폭 개선되었습니다. 표현식과 변수의 값이 어떻게 바뀌는지 살펴보는 watchers 기능을 비롯하여 Stepping, Breakpoints, Info, Execution control 들등 훨씬 나아졌습니다... 라고는 하지만 기존 디버깅이 원체 볼품없었어서 뭐라 하긴 좀 힘들긴 하네요. -,-; 살짝 코드나 한 번 볼까요?\n\n현재 가정은 **myscript.js 파일안에 3번째 줄에 실제로 debugger; 라고 타이핑 해 놓았다**는 가정입니다. (네.. 그렇습니다. 이클립스의 마우스로 행을 찍어서 실행하는 방식은 이런 식에 비하면 거의 SF 수준이죠 -,-)\n\n다음은 myscript.js 파일 \n\n```\n// myscript.js\n x =  5;\n setTimeout(function  ()  {\n   debugger;\n   console.log(\"world\");\n },  1000);\n console.log(\"hello\");\n```\n\n  아래는 debugging 방법 주의! (복잡해 보이면 그냥 훅~ 지나가세요.)  \n\n```\n%  node debug myscript.js\n <  debugger  listening on port  5858\n connecting...  ok\n break  in  /home/indutny/Code/git/indutny/myscript.js:1\n   1  x  =  5;\n   2  setTimeout(function  ()  {\n   3    debugger;  // 여기서 멈춥니다! 왜? 디버깅 모드로 실행했으니까!\n\n debug>  cont\n <  hello\n break  in  /home/indutny/Code/git/indutny/myscript.js:3\n   1  x  =  5;\n   2  setTimeout(function  ()  {\n   3    debugger;\n   4    console.log(\"world\");\n   5  },  1000);\n debug>  next\n break  in  /home/indutny/Code/git/indutny/myscript.js:4\n   2  setTimeout(function  ()  {\n   3    debugger;\n   4    console.log(\"world\");\n   5  },  1000);\n   6  console.log(\"hello\");\n debug>  repl\n Press Ctrl +  C to leave debug repl\n >  x\n 5\n >  2+2\n 4\n debug>  next\n <  world\n break  in  /home/indutny/Code/git/indutny/myscript.js:5\n   3    debugger;\n   4    console.log(\"world\");\n   5  },  1000);\n   6  console.log(\"hello\");\n   7\n debug>  quit\n %\n```\n\n   \n\n**4\\. 압축을 위한 zlib  바인딩 내장**\n\n아래와 같은 식으로 모듈에 접근합니다.\n \n\n\n\n```\nvar  zlib  =  require('zlib');\n```\n\n\n\n다음은 파일스트림을 zlib스트림으로 읽어서 압축과 해제 파이프라인 처리하는 예제입니다. \n\n```\nvar  gzip  =  zlib.createGzip();\n var  fs  =  require('fs');\n var  inp  =  fs.createReadStream('input.txt');\n var  out  =  fs.createWriteStream('input.txt.gz');\n\n inp.pipe(gzip).pipe(out);\n```\n\n압축/해제는 다음과 같은 식으로 간단하게 처리 가능합니다. \n\n```\nvar  input  =  '.................................';\n zlib.deflate(input,  function(err,  buffer)  {\n   if  (!err)  {\n     console.log(buffer.toString('base64'));\n   }\n });\n\n var  buffer  =  new  Buffer('eJzT0yMAAGTvBe8=',  'base64');\n zlib.unzip(buffer,  function(err,  buffer)  {\n   if  (!err)  {\n     console.log(buffer.toString());\n   }\n });\n```\n\n유의사항은 zlib 인코딩은 비용이 많이 들기 때문에 유의해야 한답니다. 속도/메모리/압축에 대한 트레이드 오프(tradeoffs)에 대해서는  [레퍼런스](http://nodejs.org/docs/v0.6.0/api/zlib.html \"[http://nodejs.org/docs/v0.6.0/api/zlib.html]로 이동합니다.\")를 참고하세요. **기타등등...**\n\n윈도우즈 지원을 위해서 코어 아키텍처를 많이 손봤다고 합니다. 그러면서 유닉스 시스템에서의 성능을 저하시키게 되는 것이 아닐까 걱정했다는 군요. 다행히도 그렇게 되진 않았다고 하네요.\n\n\n\n|  | v0.4.12 (linux) | v0.6.0 (linux) |\n| http_simple.js /bytes/1024 | 5461 r/s | 6263 r/s |\n| io.js read | 19.75 mB/s | 26.63 mB/s |\n| io.js write | 21.60 mB/s | 17.40 mB/s |\n| startup.js | 74.7 ms | 49.6 ms |\n\n\n\nhttp와 io 벤치는 높을 수록 좋고, startup은 낮을 수록 좋다고 하니까 전체적으로는 개선되었다고 봐야하겠네요.\n\n3개의 부하발생 머신으로 10 gigabit Ethernet (10 Gbit/s) 네트워크 환경에서 600개의 클라이언트로 접속하는 테스트를 했을 때의 결과랍니다.\n\n다음은 윈도우즈 환경에서의 테스트 결과입니다.\n\n\n\n|  | v0.4.12 (windows) | v0.6.0 (windows) |\n| http_simple.js /bytes/1024 | 3858 r/s | 5823 r/s |\n| io.js read | 12.41 mB/s | 26.51 mB/s |\n| io.js write | 12.61 mB/s | 33.58 mB/s |\n| startup.js | 152.81 ms | 52.04 ms |\n\n\n\n윈도우즈 환경에서의 성능이 엄청나게 뛰었는데요, 0.4때는 Cygwin을 이용했지만 0.6은 native API를 이용했기 때문이랍니다. (뿌듯하겠어요. 라이언 달 :)\n\n그래도 아직 중간쯤 정도 진행된 수준이고 개선의 여지가 남아있답니다. npm 이 native로 돌지 않기 때문에, 여전히  MS Visual Studio 환경에서 node 모듈들을 설치/동작시키는데는 애로점이 많은것 같습니다.\n\n0.4과 0.6 사이에서 바뀐 API들은 아래에서 확인가능합니다.\n\n[API changes between v0.4 and v0.6](https://github.com/joyent/node/wiki/API-changes-between-v0.4-and-v0.6 \"[https://github.com/joyent/node/wiki/API-changes-between-v0.4-and-v0.6]로 이동합니다.\")\n\n코어 API는 거의 건드리지 않았기때문에 큰 고통은 없을 거랍니다. 릴리즈 주기를 좀 더 드라마틱하게 조여보겠다며 다음 릴리즈는 내년 1월을 예정한답니다. 궁극적으론 구글 크롬과 V8 자바스크립트 엔진의 6주 릴리즈 사이클과 맞추길 희망한답니다.\n\n개인적으로는 윈도우즈 환경에서 node.exe 프로세스가 죽지 않는 버그(?)가 해결되어서 좋습니다. :) \n\n마지막으로 아래는 공식 사이트의 요약내용입니다.\n\n**2011.11.04, Version 0.6.0 (stable)**\n\n\n\n*   print undefined on undefined values in REPL (Nathan Rajlich)\n*   doc improvements (koichik, seebees, bnoordhuis, Maciej Małecki, Jacob Kragh)\n*   support native addon loading in windows (Bert Belder)\n*   rename getNetworkInterfaces() to networkInterfaces() (bnoordhuis)\n*   add pending accepts knob for windows (igorzi)\n*   http.request(url.parse(x)) (seebees)\n*   #1929 zlib Respond to ‘resume’ events properly (isaacs)\n*   stream.pipe: Remove resume and pause events\n*   test fixes for windows (igorzi)\n*   build system improvements (bnoordhuis)\n*   #1936 tls: does not emit ‘end’ from EncryptedStream (koichik)\n*   #758 tls: add address(), remoteAddress/remotePort\n*   #1399 http: emit Error object after .abort() (bnoordhuis)\n*   #1999 fs: make mkdir() default to 0777 permissions (bnoordhuis)\n*   #2001 fix pipe error codes\n*   #2002 Socket.write should reset timeout timer\n*   stdout and stderr are blocking when associated with file too.\n*   remote debugger support on windows (Bert Belder)\n*   convenience methods for zlib (Matt Robenolt)\n*   process.kill support on windows (igorzi)\n*   process.uptime() support on windows (igorzi)\n*   Return IPv4 addresses before IPv6 addresses from getaddrinfo\n*   util.inspect improvements (Nathan Rajlich)\n*   cluster module api changes\n*   Downgrade V8 to 3.6.6.6\n\n\n\n\n\n#### Comments\n\nOK\n\n [daclouds](http://me2day.net/daclouds) | 2011-11-08 화요일 오전 11:5\n\n--\n"
  },
  {
    "id": 218,
    "title": "번역을 통한 학습의 장단점 - 기술번역 중심-",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320588189000,
    "body": "> doortts | 2011-11-06 일요일 오후 11:3 | Better SW Development | [원본](http://blog.doortts.com/218)\n\n결과물은 부끄럽습니다만, 티스토리 블로그를 만든 이후로 때때로 번역글을 올리고 있습니다. 부족한 영어실력이지만, 그래도 다른 엔지니어들과 함께 하고 싶은 마음, 그리고 원 저작자들의 지식공유에 대한 고마움에 조금씩이라도 올려보고 있습니다. 공부도 많이 되었습니다만, 사실 초반엔 쉽지 않았습니다. (이 놈의 영어!)\n\n그 중에서 기억에 남는건 연말을 상당기간 할애했던\n\n\n\n\n\n[번역 통합] 허드슨을 이용한 지속적인 통합 (Continuous integration with Hudson), 2008년 말 ~ 2009년 초\n\n[http://blog.doortts.com/80](http://blog.doortts.com/80 \"[http://blog.doortts.com/80]로 이동합니다.\")\n\n\n\n\n\n그리고 구어체가 심해서 얼마 안되는 분량임에도 한참 걸렸던\n\n\n\n\n\n[번역] 서브버전 사용자를 위한 머큐리얼(mercurial)이전 가이드, 2010년 12월\n\n[http://blog.doortts.com/141](http://blog.doortts.com/141 \"[http://blog.doortts.com/141]로 이동합니다.\")\n\n\n\n\n\n이렇게 두 개 입니다.\n\n허드슨 번역의 경우, 국내에 많이 알려지지 않았던 시점이고, 저도 낯설어서 용어때문에 버벅댔던걸로 기억합니다. (그 당시에 아티팩트를 뭘로 번역해야 하나 고민하다 그냥 아티팩트로 얼버무렸었죠.) 지금은 시간이 많이 흘러서 버전이 많이 바뀌었지만, 그래도 많은 분들이 도움 받았다고 이야기 해주셔서 저도 고맙곤 했습니다.\n\n최근에 [OctoberSky.js](http://www.facebook.com/pages/OctoberSkyjs/101524936627596 \"[http://www.facebook.com/pages/OctoberSkyjs/101524936627596]로 이동합니다.\")라는 이름으로 사람들과 함께 [node.js](http://nodejs.org \"[http://nodejs.org]로 이동합니다.\") 스터디를 하면서 신나게 이런저런 것들을 번역하고 있습니다.  :D (이야기 나온김에, 스터디 함께 진행하시는 분들, 그리고 번역에 동참해 주시는 분들께 다시 한번 감사인사를!)\n\n문득 생각이 나서 번역을 통한 학습에 대해 정리해 봤습니다. :)\n\n**번역을 통한 학습의 장단점 - 기술번역 중심-**\n\n**장점**\n \n\n- 그냥 읽을 때 보다 자세히, 반복적으로 읽게 되어서 이해도가 높아진다.\n . 특히 어떤 경우에는 저자의 생각 흐름을 맞추어야 하기 때문에 사고의 흐름에 따라 이해하는 방법을 배운다.\n- 문장 실력이 는다. (특히 국어 실력)\n- 영어 실력이 (쪼금) 는다.\n- 학습의 목표가 분명하기 때문에 집중할 수 있다.\n- 결과물을 통해 다른 사람에게 기여할 수 있다. (♡)\n\n \n**단점**\n \n\n- 읽기만 할 때 보다 시간이 (꽤) 많이 든다!\n- '기술'이 아닌 '문장'에 집착하게 되기도 한다. (쪼잔해 지는 내마음)\n- 특별한 보상은 없다.\n\n \n**유의사항 + 팁**\n* 단점을 주의하는 것은 이미 포함되었다 치고 *\n\n \n\n- 번역이 목적이 아니라 학습이 목적이므로 코드나 실습은 반드시 따라 해 보아야 한다.\n- 상업번역이 아닐 경우에는 적절한 수준에서 퀄리티를 타협한다.\n- 초반에는 짧고 의미 있는 글 위주로 하는 것이 좋다.\n- 상업 번역이 아닐경우 번역자체에 대해 욕하는 사람은 없으니, 겁낼 필요 없다. \n- 라이선스를 확인한다. \n\n \n사실 라이선스는 좀 애매할 때가 있습니다. 기술 번역의 경우 비 상업물에 대한 비 상업적인 번역일 경우 관례적으로 용인합니다. 하지만, 메일이나 트윗으로 문의하면 좀 더 좋겠죠. Creative Commons글의 경우 특별히 저자에게 고지하지 않고원문 링크만로도 OK일때가 많습니다.\n\n\n**하지만, 뭐니뭐니 해도 이런저런걸 떠나서 한번 쯤 해보시길 권합니다. 많은 걸 배울 수 있습니다!**\n\n아무래도, 저자 다음으로 해당 내용을 많이, 그리고 착실히 읽은 건 역시 '역자'가 아닐까요? :D\n **- 추가 내용 - **\n번외로, 스티브 잡스의 전기를 놓고 벌이는, 소위 슈퍼번역대전..이라 불리는 아래 이이기도 한번 봐보세요. 꽤 흥미진진합니다. [http://cafe.daum.net/Psychoanalyse/Glqj/418](http://cafe.daum.net/Psychoanalyse/Glqj/418)\n\n#### Comments\n\n번역하신 것들 잘 읽었습니다.\n저도 공부 삼아 번역이나 해볼까 생각만 했지,\n실제로는 몇 번 진행하다가 말았는데 다시 또 도전해 봐야겠네요.\n\n 준성 | 2011-11-07 월요일 오후 7:37\n\n--\n"
  },
  {
    "id": 219,
    "title": "왜 Node.js 인가?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320802183000,
    "body": "> doortts | 2011-11-08 화요일 오후 2:56 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/219)\n\n\n\n함께 스터디에 참여하고 계신 이병주(@PillarLee)님이 올려주신 번역글입니다.\n[http://yambbam.kr/docs/why-node.js-single-thread-event-loop-javascript.html](http://yambbam.kr/docs/why-node.js-single-thread-event-loop-javascript.html)\n위 주소에도 올리셨는데, 무료계정이라 트래픽이 작아 어찌될지 모르겠다고 제 블로그에 올려서 함께 보자 하셔서 옮겨 올립니다. 병주님과 함께 문장을 다듬기로 했습니다만, 현재 원문 링크 사이트가 깨져서 문장 다듬기는 진행하지 못했습니다. 조금 거칠더라도 양해해 주세요. :D\n\n\n\n\n\n **왜 Node.js 인가?**\n\n작성자 : Maynak Gupta\n\n작성일 : 2010년 10월 14일 \n\n번역자 : [@PillarLee](http://twitter.com/PillarLee)\n\n원문링크 : [http://beakkon.com/geek/node.js/why-node.js-single-thread-event-loop-javascript](http://beakkon.com/geek/node.js/why-node.js-single-thread-event-loop-javascript)\n\n![](http://yambbam.kr/docs/images/why-node.js-single-thread-event-loop-javascript_files/node.jpg)\n\n\n**왜 Node 인가?**\n\n **\n\n**이벤트 중심**인 **Node.js** 또는 **Node**는 프로그래머가 [Evetned, non-blocking I/O](http://beakkon.com/geek/node.js/what-is-node.js-evented-non-blocking-io-javascript) 주도 접근법을 사용하여 웹 어플리케이선의 코드를 작성할 수 있게 해준다.  Node는 구글의 엄청나게 빠른 [V8 자바스크립트 엔진](http://code.google.com/p/v8/)을 기반으로 만들어졌다. 이 자바스크립트 엔진은 매우 **빠른 동적 프로퍼티 접근**, **머신코드의 동적 생성**, **고효율 가비지 컬렉션**으로 잘 알려져 있다.  이 자바스크립트 엔진은 Node.js가 끔찍하게 빠른 속도로 실행될수 있게 한다. 그러므로, Node는 **비동기 입출력**을 수행하는데 정말로 빠르다(네트워크, 서버의 하드디스크, 데이터베이스 입출력이나 파일 업로드하는 경우)\n\n** \n\n\n\nNode가 매우 빠르고, non-blocking 입출력을 제공한다는 것 외에도, Node는 **싱글 쓰레드 / 이벤트 루프**에 기반들 둔다. 그리고 그것은 Node.js의 장점이 되는 또다른 주요한 요소이다.\n\n**Node.js에서 Single thread / Event loop는 무엇을 의미하는가?**\n\n가장 잘 알려진 웹 서버인 아파치와 NGINX가 동시 접속을 어떻게 처리하는지 이해해보자.\n\n아래에 두 웹서버를 비교하는 벤치마크가 있다.\n\n![](http://yambbam.kr/docs/images/why-node.js-single-thread-event-loop-javascript_files/nginx-vs-apache-reqs-sec.png)\n\n\n*Note: 위의 벤치마크는 실제 상황의 예제가 아니다. 로컬호스트에서 스태틱 파일을 다룬 결과이다.\n\n위의 벤치마크는 실제 상황과 같지는 않지만 두 서버의 성능 통계를 잘 보여준다. 아파치와 NGINX 초당 매우 많은 수의 요청을 처리할 수 있는 것처럼 보이지만, 동시 요청의 수가 증가함에 따라, NGINX에 비해 아파치의 성능이 크게 떨어지는 것을 볼수 있다.  그리고 NGINX는 여전히 동시 접속수가 증가할때에도 성능의 저하가 없이 거의 같은 속도를 유지한다.\n\n같은 벤치마크에 대해서, 두 서버의 메모리 사용에 관한 관점에서 본 그래프를 살펴보자.\n\n![](http://yambbam.kr/docs/images/why-node.js-single-thread-event-loop-javascript_files/nginx-vs-apache-memory-consumption.png)\n\n*Note: 위의 벤치마크는 실제 상황의 예제가 아니다. 로컬호스트에서 스태틱 파일을 다룬 결과이다.\n\n위 그래프는 증가하는 동시 요청수에 대한 두 서버의 메모리 사용을 나타낸다. 두 서버 모두 많은 수의 동시 접속을 처리할 수 있지만 서버의 자원, 즉 **메모리** 사용에는 눈에 띄는 큰 차이가 있다. 그래프를 보면 아파치가 NGINX보다 같은 동시 요청 수에 대해 **훨씬 더 많은 양**의 메모리를 사용한다는 것은 분명하다. NGINX는 동시 요청을 매우 효율적인 **이벤트 루프 - 싱글 쓰레드** 방식으로 처리한다. 반면에 아파치는 복수 개의 **쓰레드**를 (각 접속 당 하나) **쏟아낸다**. 이 쓰레드들이 많은 양의 메모리를 사용하고, 그 결과 서버에 많은 수의 동시 요청이 발생할 경우 아파치는 정말 비효율적이게 된다. NGINX는 접속 당 새로운 쓰레드를 실행하는 대신에 이벤트 루프를 사용함으로써 매우 안정적으로 유지된다.\n\n**Context swithcing**은 쉽지가 않았다, 실제 상황에서 테스트 했을 때, 두 서버 모두 자원을 사용하고 증가 된 응답 시간을 보였다. 그러므로, **대규모 동시성**에 대해서는, 새로운 쓰레드들을 운영체제에 쏟아낼 수가 없다. 이를 처리하기 위해서, **싱글 쓰레드** 실행에 기반을 둔 **Node**는 서버에 만들어지는 모든 새로운 리퀘스트를 처리하기 위해 복수개의 쓰레드를 실행하는 대신에 **이벤트 루프**를 사용한다. 그리고 이것은 context switching에서 어떤 자원도 낭비하지 않음으로써 Node.js를 매우 강력하게 만든다. 따라서, Node.js는 **대규모 동시성**을 처리할 때나 **가장 저 레벨** 베이스를 제공할 때 매우 효율적이기 때문에 그 결과 프로그래머들은 Node 위에서 **스트림**을 할 수 있고 **데이터를 버퍼에 저장할 필요가 없다**. 단지 이것만이 아니라, Node.js는 프로그래머가 이벤트 기반 알고리즘으로 코드를 짤수 있게 해준다. Node.js는 또한 개발자들이 코드와 업무를 병렬로 실행하는데 힘을 실어주며 non-blocking 입출력을 제공한다. 아키텍쳐적 이점들을 가지는것 외에도, **Node**(매우 빠른 구글의 V8 자바스크립 엔진 기반으로 만들어진)는 **Node.js**를 빛처럼 빠르게 만든다.\n\n**Why Node.js over Others available?**\n\nNode.js를 사용하기 전에 다른 방법들을 알아보고 왜 이벤트 기반 접근법이 오늘날 프로그래머들 사이에서 잘 알려지지 않았는지 알아보자. 이것에 관한 세가지 기본적인 이유가 있다.\n\n*   **문화적 선입견** : 첫 번째 이유는 **non-blocking 입출력**을 사용하는 것에 대한 문화적 선입견이다. 어느 언어를 배우든지 맨 처음으로 짜보는 프로그램은 다음과 같다.\n\n    | \n\n    1\n\n    2\n\n     3\n\n    4\n\n     5\n\n    6\n\n    7\n     \n\n     | \n\n    \n\n    `//문자열 출력`\n\n    `puts(``\"Please Enter Your Green Name\"``);`\n\n     `//입력을 받기 위해 대기`\n\n    `var` `green_name=gets();`\n\n     `//문자열 출력`\n\n    `puts(``\"Your Green Name is: \"``+green_name);`\n\n    \n\n     |\n\n    위의 코드는 입력 요구 알고리즘을 기반으로 한다. 코드를 짜는 이런 접근법은 코드를 **막아(blocking)버린다**. 위의 코드에서 사용자는 'green name'을 입력하도록 요구 받고 사용자가 입력할 때까지 기다린다. 코드가 **멈춰버린다!**이 코드는 사용자가 'green name'을 입력할 때 까지 어떤 것도 할 수가 없다. 만약 같은 코드를 다음과 같이 작성한다면..\n\n    | \n\n    1\n\n    2\n\n     3\n\n    4\n\n    5\n\n    6\n\n    7\n     \n\n    8\n\n     | \n\n    \n\n    `//문자열 출력`\n\n    `puts(``\"Please Enter Your Green Name\"``);\n     `\n\n    `//콜백 함수 정의`\n\n    `gets(` `function` `(green_name) {`\n\n    `puts(``\"Your Green Name is: \"``+green_name);`\n\n    `});\n     `\n\n    `//기다리지 않고 다른 일을 처리한다.`\n\n    \n\n     |\n\n    이것은 이벤트 기반의 프로그래밍 접근법이다. 이 프로그래밍 접근법을 사용함으로써 프로그래머들은 [evented non-blocking I/O](http://beakkon.com/geek/node.js/what-is-node.js-evented-non-blocking-io-javascript)를 얻을 수 있다. 이런 유형의 프로그래밍 접근법이 **막기 - 멈추기 - 코딩 접근법 **처럼 잘 알려지지 않은 유일한 이유는 사람들이 이런 방식의 코딩 접근법이 어렵고 더 복잡하다고 생각하기 때문이다(**실제로는 사실이 아니다**). 그래서, 이벤트 주도 방식으로 어플리케이션을 코딩하는 것에 대한 선입견이 존재한다.\n\n*   **부족한 인프라 **: Node의 방식으로 코딩을 하지 않는 또 다른 이유는 인프라의 부족이다. 만약 당신의 코드가 이벤트 중심으로 작동할 필요가 있다면, 절대 입출력을 막아서는 안되고, 당신의 코드가 싱글 쓰레드에 기반일 때 데이터베이스가 응답하는 것을 기다릴 수가 없고, **멈출 수도 없다**. 대부분의 프로그래밍 라이브러리들은 이벤트 주도 프로그래밍 접근법을 지원할 수가 없다. 예를 들어: POSIX는 비동기 I/O를 지원하지 않는다. 지원하는 다른 것들은 같은 것을 얻기 위한 충분한 메뉴얼을 제공하지 않는다. **C**는 클로저와 익명 함수를 가지고 있지 않다. MySQL는 비동기 커넥션을 지원하지 않는다. 기타 등등. 이것들이 이벤트형 코드를 짜는데 어렵게 만든다. \n\n*   **너무 많은 인프라** : [이벤트 주도 프로그래밍](http://en.wikipedia.org/wiki/Event-driven_programming)을 위한 플랫폼을 제공하는 라이브러리들이 있다. 루비의 Event Machine. [파이썬의 Twisted](http://www.twistedmatrix.com/), Qt의 이벤트 루프가 그들이다. 비록, 이런 라이브러리들이 이벤트 프로그래밍을 위한 플랫폼에 non blocking I/O를 제공하고, 이 라이브러리들을 사용하면 효율적인 서버를 짜는 것이 상대적으로 간단할지라도, 사용자들은 이들을 어떻게 사용해야 할 지를 자주 헷갈려하는 경향이 있다. 예를 들어, 루비로 개발할 때 많은 라이브러리들을 가지고 있지만, 루비의 이벤트 머신 라이브러리는 MySQL 라이브러리와 조합될 수가 없다. 왜냐하면 모든 쿼리를 막아버리기 때문이다.\n\n다행스럽게도,  Node를 사용한다면 이벤트 기반 어플리케이션을 개발이 더 이상 어려운 일이 아니다. Node는 매우 효율적이고, **순수한 이벤트 기반**,**non-blocking** 웹 어플리케이션을 만들기 위한 인프라를 제공하고, 동시성 문제를 매우 효과적으로 처리할 수 있다. 이는 Node가 **CommonJS 모듈**시스템을 사용하고, **non-blocking I/O**를 제공하며, 구글에서 개발한 미친 스피드의 **V8 자바스크립트 엔진**에서 돌아가기 때문이다.  Node.js는 이벤트 기반 프로그래밍을 정말 쉽고, 매우 효율적이고, 빛과 같이 빠르게 만든다.\n \n\n**Node.js를 시작하려 한다면, [Node.js 설치하기](http://www.beakkon.com/geek/node.js/install-node.js-on-ubuntu-linux)를 읽어봐라.\n\n번역: @PillarLee 이병주** [http://yambbam.kr/docs/why-node.js-single-thread-event-loop-javascript.html](http://yambbam.kr/docs/why-node.js-single-thread-event-loop-javascript.html)\n\n#### Comments\n\n좋아요!\n\n [is윤군](http://helols.tistory.com) | 2011-11-09 수요일 오전 10:56\n\n--\n"
  },
  {
    "id": 220,
    "title": "[특별번역] 바우즈(Vows), node.js를 위한 비동기 행위 주도 개발(BDD) 프레임워크",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320824348000,
    "body": "> doortts | 2011-11-09 수요일 오후 12:4 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/220)\n\nnode.js용 테스트 프레임워크로 [expresso](http://visionmedia.github.com/expresso/ \"[http://visionmedia.github.com/expresso/]로 이동합니다.\") 만은 조금 부족한 듯 하고, 조만간 모종의 부탁도 받을 것 같아서 관련 프레임워크들을 알아보았습니다. 몇가지 중에서 우선 [Vows](http://vowsjs.org \"[http://vowsjs.org]로 이동합니다.\")를 학습한 다음, 괜찮은 것 같아 특별 번역 페이지를 만들었습니다. 디자인이 예뻐서 디자인을 그대로 살려서 번역하고 싶더라구요.\n\n단, 이번에 '특별번역'이라 이름 붙은 이유는 단순 번역이 아니라, 평소 BDD(Behavior Driven Developmen)에 대한 생각과 나름의 노하우를 녹이기 위해 노력하며 번역 하였기 때문입니다. 첨부파일로 덧 붙인 소스코드를 실행해 보시면 좀 더 감이 오시지 않을까 생각합니다. 물론 번역 내용을 쭉~ 따라나가면서 보셔야 더 좋습니다.\n\n\n\n**[](http://doortts.com/vows/ \"[http://doortts.com/vows/]로 이동합니다.\")[](http://doortts.com/vows/ \"[http://doortts.com/vows/]로 이동합니다.\")Vows 번역페이지[](http://doortts.com/vows/ \"[http://doortts.com/vows/]로 이동합니다.\")****로 이동>>[](http://doortts.com/vows/ \"[http://doortts.com/vows/]로 이동합니다.\") [Go!](http://doortts.com/vows/ \"[http://doortts.com/vows/]로 이동합니다.\")!** \n\n\n\n[실습용 첨부파일]\n\n\n\n예제1) 0으로 나누기\n\n[divide-by-zero-test.js](/files/21900)\n\n**예제2> 배열테스트**\n[array-test.js](/files/21894)\n**예제3> 테스트 스위트**\n[the-good-things.js](/files/21898)[the-good-things-test.js](/files/21892)\n**예제4> 파일 비동기 테스트**\n[file-test.js](/files/21895)\n\n\n\n BDD가 처음이신 분들을 위해 BDD가 뭔지부터 먼저 살짝 되살펴볼까요? :)\n\n\n\n**BDD (행위주도 개발)**\nBDD는 책임관계자의 관점에서 보는 애플리케이션의 행위(동작) 중 가치 있는 기능부터 개발하는 방식이다.\n\nBDD는 세가지 측면에서 TDD와 차이점이 있다.\n\n- 첫째, BDD는 사용자(고객)에 좀 더 가까운 고수준의 기능영역을 우선적으로 다룬다.\n- 둘째, BDD는 '무엇을 테스트 할 것인가?' 즉, '현재 시스템에 들어 있지 않은 기능 중 가장 먼저 구현돼야 하는 기능은 무엇인가?\"에 대한 질문이 된다.\n- 셋째, 테스트 메소드 작성에 집중할 수 있는 자연 언어(natural language)적인 문장을 이용하며 그렇게 표현할 수 있는 템플릿을 제공한다.\n\n- TDD실천법과 도구 中 (^^;\n\n\n\n위 내용 중 첫째와 셋째를 만족시키기 위해서 테크니컬한 기술문장이 아닌, 사용자 관점의 문장으로 작성되어야 하고, 문장 자체도 자연스럽게 읽히는 조건들로 구성되며, 해당 조건들의 테스트 결과가 표시되어야 합니다. \n\n그런데 아시다시피 외국어, 특히 영어의 경우 주/술/목 구조로 인해 BDD 템플릿을 그대로 한글로 사용하면 어색하게 되기 십상입니다. ATDD(Acceptance TDD)도 동일한 문제를 겪고 있습니다. 문장적인 템플릿(보통 Given/When/Then)을 사용하지만, 그걸 한글로 표현 했을때는 어색해 지거나, 자연어 구조가 아닌, 명사 나열 구조가 되기 쉽습니다.\n 하지만 BDD의 장점을 살리고, 테스트의 요점과 문맥을 유지하려면 \"번역\"작업에 필요한 테크닉들이 필요합니다. \n흔한 방법으로는 문장자르기와 서술 구조 반전 입니다. (관련해서는 따로 또 포스팅을 해 보겠습니다.)\n\n다음은 실행 결과들인데요, 한 번 살펴보세요. 한글임에도 구조상 큰 어색함은 없으실 겁니다. :)\n\n![1\\. bash-4-1.jpg](./attachments/1\\. bash-4-1.jpg)\n\n![1\\. bash-3.jpg](./attachments/1\\. bash-3.jpg)\n\n![1\\. bash-1.jpg](./attachments/1\\. bash-1.jpg)\n\n![1\\. bash-2.jpg](./attachments/1\\. bash-2.jpg)\n\n아! 그리고 오프라인 모임을 준비하고 있습니다. 장소문제로 조금 시간이 들어가고 있는데요, 조만간 공지글을 올리도록 하겠습니다. 현재 오프모임 예정일은 11월 19일(토)입니다. :)",
    "attachments": [
      {
        "id": 21891,
        "name": "1. bash-4-1.jpg",
        "hash": "c3989a59ed8113211620327be51a170134eed0ac",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 28673,
        "containerId": "12376"
      },
      {
        "id": 21892,
        "name": "the-good-things-test.js",
        "hash": "c03de1cd2fc04a665b5b3f680f31de253f96c33f",
        "containerType": "BOARD_POST",
        "mimeType": "application/octet-stream",
        "size": 1301,
        "containerId": "12376"
      },
      {
        "id": 21893,
        "name": "1. bash-2.jpg",
        "hash": "40998236b3cf193f9f96473ea4299385bc396a46",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 23382,
        "containerId": "12376"
      },
      {
        "id": 21894,
        "name": "array-test.js",
        "hash": "be679c8a76c49339432f08f0bb70d7dd4db1d576",
        "containerType": "BOARD_POST",
        "mimeType": "application/octet-stream",
        "size": 1001,
        "containerId": "12376"
      },
      {
        "id": 21895,
        "name": "file-test.js",
        "hash": "26077e68b90f69bc27629568c2d84f5a1268461a",
        "containerType": "BOARD_POST",
        "mimeType": "application/octet-stream",
        "size": 767,
        "containerId": "12376"
      },
      {
        "id": 21896,
        "name": "1. bash.jpg",
        "hash": "8227ef0f9a7d2a273add74043a477527fae1831c",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 26323,
        "containerId": "12376"
      },
      {
        "id": 21897,
        "name": "1. bash-1.jpg",
        "hash": "6193ae34ef85899d54586bc58d8ec90e59afb9a8",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 36608,
        "containerId": "12376"
      },
      {
        "id": 21898,
        "name": "the-good-things.js",
        "hash": "0c015bb6c5a4fb38f5a2c77330197d1332a10678",
        "containerType": "BOARD_POST",
        "mimeType": "text/plain; charset=UTF-8",
        "size": 486,
        "containerId": "12376"
      },
      {
        "id": 21899,
        "name": "1. bash-3.jpg",
        "hash": "bdd8f3f9f509d6e414fa6396efc3211b2e97e816",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 33939,
        "containerId": "12376"
      },
      {
        "id": 21900,
        "name": "divide-by-zero-test.js",
        "hash": "ab6baa86bd83f4b8ac8468d94d04b84aa8b11cfa",
        "containerType": "BOARD_POST",
        "mimeType": "text/plain; charset=UTF-8",
        "size": 944,
        "containerId": "12376"
      }
    ]
  },
  {
    "id": 221,
    "title": "OctoberSky.js 오프라인 모임을 진행합니다. (/^_^)/~",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320924378000,
    "body": "> doortts | 2011-11-10 목요일 오후 8:26 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/221)\n\n일전에도 살짝 언급했던것 처럼, 스터디 오프라인 모임을 갖고자 합니다. 비록 온라인에서 서로 얼굴 잘 모르고 진행하지만, 그래도 따라하기 위해 열심히 노력하고 계신 분들을 위해 자리를 마련했습니다. \n페이지 관리와 스터디를 도와주고 계신 세 분([페북 페이지 참조](http://www.facebook.com/pages/OctoberSkyjs/101524936627596 \"[http://www.facebook.com/pages/OctoberSkyjs/101524936627596]로 이동합니다.\"))께서 많이 도와주셨고 첫 모임에서 발표도 기꺼이 응해주셨니다. 그리고 준호님도 Guest로 참여해 주시기로 하셨습니다. (모든 분께 감사합니다 :) \n\n\n\n\n\n**일시**\n - 11월 19일 (토), 오전 11시~ 오후3시 (4시간)\n\n**장소**\n - 압구정 컨시어지 아카데미, 서울 강남구 신사동 648-11 \n\n**대상**\n\n- OctoberSky.js 스터디에 진도 체크 댓글 한번 이상 등록하신 분 ^^;\n\n**진행**\n\n**- 간략한 발표 듣기**  \n\n . Cloud9 IDE에서의 개발 - 형주 님\n\n . 자바스크립트 코어 - Prototype Chain & Closure - 병주 님\n\n . ECMAScript 변천사 - 응준 님\n\n . node.js 적용 경험담 듣기 - 준호 님\n\n\n**- 진행한 스터디 진도 만큼 함께 살펴보기 **\n\n당일 회비 5000원 있습니다. :D\n\n **그리고 인원파악을 위해 onoffmix에 신청 페이지를 만들었습니다.\n[http://onoffmix.com/event/4427](http://onoffmix.com/event/4427 \"[http://onoffmix.com/event/4427]로 이동합니다.\")**   \n\n\n\n\n\n  아직 못하신 분들은 이참에 밀린 학습 이어가시고, 궁금하시거나 공유하실 내용 있으시면 댓글로 달아주세요. 직접 작업하신 소스코드 공유도 환영합니다.\n\n스터디는 혼자 할 수도, 함께 할 수도 있지만, 함께 하고 함께 나눌 때 더 가치를 갖는다 생각합니다. 저는 스터디에 참여하시는 분들을 위한 최소한의 동기부여와 안전장치가 될 수 있도록 노력하겠습니다.  :)\n\n감사합니다.\n\n "
  },
  {
    "id": 222,
    "title": "[Node.js 따라배우기] 온라인 스터디 중이신 분들께 알려드립니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1320987600000,
    "body": "> doortts | 2011-11-11 금요일 오후 2:0 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/222)\n\n스터디 및 node.js 관련 자료들을 facebook에 따로 페이지를 만들어서 함께 올리고 있습니다.\n잘 모르시는 분들이 계신것 같아서 공유합니다.\n\n**OctoberSky.js 페북 페이지**\n[http://www.facebook.com/pages/OctoberSkyjs/101524936627596](http://www.facebook.com/pages/OctoberSkyjs/101524936627596) 페이지를 페북의 '좋아요' 버튼 누르시면 소식이 등록될때마다 받아보실 수 있습니다. \n\n:)\n\n "
  },
  {
    "id": 223,
    "title": "[메뉴얼] Jade - 템플릿 엔진 for Node.js",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1321236719000,
    "body": "> doortts | 2011-11-12 토요일 오후 11:5 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/223)\n\n따라배우기에서 Jade 템플릿 엔진을 사용하고 있습니다. 전반적으로 사용되는데다, 배워놓으면 괜찮을 듯 해서 메뉴얼을 번역했습니다. 사용법이 아닌 컴파일 설치등의 일부 매니악한 부분은 제외했습니다.\n\nJade가 뭐냐고 물으신다면 node.js용으로 만들어진 view 템플릿 엔진이라고 생각하시면 되겠습니다. Jade 문법에 맞게 작성하면 해당 내용을 html이나 자바스크립트로 만들어 줍니다. 관련해서는 **[Part 3: RESTful 메소드와 테스트](http://blog.doortts.com/215 \"[http://blog.doortts.com/215]로 이동합니다.\")**에서 일부 설명해 놓았습니다만, 역시 정석으로 배우면 더 좋겠죠? : ) \n\n# Jade - template engine\n\n제이드는 [Haml](http://haml-lang.com/)로부터 큰 영향을 받은 고성능 템플릿 엔진이며 [node](http://nodejs.org/)를 위해 자바스크립트로 구현되었다.\n\n## 기능들\n\n*   클라이언트 사이드 지원\n*   뛰어난 가독성\n*   유연한 띄어쓰기\n*   블럭 확대(block-expansion)\n*   믹스인(mixins, 섞어쓰는 것)\n*   스태틱 인클루드(static includes)\n*   속성 인터폴레이션(attribute interpolation)\n*   보안을 위해 코드는 기본적으로 이스케이프 처리된다.\n*   컴파일과 런타임시에 문맥에 맞는 에러 출력\n*   커맨드 라인을 통해 jade 템플릿을 컴파일 할 수 있음\n*   html 5 모드 (_!!! 5_ doctype)\n*   선택적인 메모리 캐싱\n*   다이내믹과 스태틱 태그 클래스 조합\n*   필터를 이용한 트리구조 파싱 parse tree manipulation via _filters_\n*   템플릿 상속\n*   외부 모듈로 [Express JS](http://expressjs.com/)  지원\n\n*   객체, 배열, 그리고 열거형이 아닌것들에 대해서도   `each` 를 이용하여 투명하게 이터레이션 지원\n*   블럭 코멘트\n*   tag를 이용한 접두어처리 없음\n*   AST 필터\n\n*   필터들\n    *   :stylus 는  [stylus](http://github.com/LearnBoost/stylus)가 인스톨 되어 있어야 한다.\n\n    *   :sass 는  [sass.js](http://github.com/visionmedia/sass.js)가 인스톨 되어 있어야 한다.\n\n    *   :less 는  [less.js](http://github.com/cloudhead/less.js)가 인스톨 되어 있어야 한다.\n\n    *   :markdown 은 [markdown-js](http://github.com/evilstreak/markdown-js)  혹은  [node-discount](http://github.com/visionmedia/node-discount)가 설치되어 있어야 한다. [](http://github.com/visionmedia/node-discount) \n    *   :cdata\n    *   :coffeescript 는 [coffee-script](http://jashkenas.github.com/coffee-script/)가 인스톨 되어 있어야 한다.\n\n*   [Vim Syntax](https://github.com/digitaltoad/vim-jade)\n*   [TextMate Bundle](http://github.com/miksago/jade-tmbundle)\n*   [스크린캐스트 보기(추천!!)](http://tjholowaychuk.com/post/1004255394/jade-screencast-template-engine-for-nodejs) \n*   [html2jade](https://github.com/donpark/html2jade) converter\n\n## 구현체들\n\n*   [php](http://github.com/everzet/jade.php)\n*   [scala](http://scalate.fusesource.org/versions/snapshot/documentation/scaml-reference.html)\n*   [ruby](http://github.com/stonean/slim)\n\n## 설치\n\nnpm을 이용한다.\n\n```\nnpm install jade\n\n```\n\n## Public API\n\n\n\n     var  jade  =  require('jade');\n\n     // Compile a function\n     var  fn  =  jade.compile('string of jade',  options);\n     fn(locals);\n \n\n\n\n### Options\n\n*   `self`  로컬 값을 포함하기 위해 `self` 네임스페이스를 사용한다. 기본값은 false\n*   `locals`  로컬 변수 객체\n*   `filename` Used in exceptions, and required when using includes\n\n*   `debug` Outputs tokens and function body generated\n*   `compiler` Compiler to replace jade's default\n*   `compileDebug` When `false` no debug instrumentation is compiled\n\n## 문법\n\n### Line Endings\n\n**CRLF** 와  **CR** 은 파싱되기 전에  **LF**로 변환된다.\n\n### Tags\n\n태그는 앞에 나오는 간단한 단어다.\n\n```\nhtml\n\n```\n\n예를 들면 위 태그는 `` 로 변환된다.\n\n태그는 id값을 가질 수 있다.\n\n```\ndiv#container\n\n```\n\n위 코드는 다음과 같이 변환된다. ``\n\n클래스는 어떻게 할까?\n\n```\ndiv.user-details\n\n```\n\n다음처럼 렌더링 된다.  ``\n\n클래스가 복수개 일때는?그리고 id도 붙어 있으면? 물론 가능하다.\n\n```\ndiv#foo.bar.baz\n\n```\n\n는 다음과 같다.  ``\n\ndiv div div 은 확실히 짜증난다. 다음처럼 해보자\n\n```\n#foo\n .bar\n\n```\n\n위 코드는 이미 오랜기간 우리가 작성해왔던 코드에 대한 꼼수다. 결과는 다음과 같다.\n\n```\n``\n\n```\n\n### 태그 텍스트(Tag Text)\n\n태그 뒤에 내용을 표시한다.\n\n```\np wahoo!\n\n```\n\n렌더링하면 `wahoo!` 가 된다.\n\n꽤 쓸만하다. 그럼 긴 텍스트 문장일 경우엔 어떻게 할까?\n\n```\np\n   | foo bar baz\n   | rawr rawr\n   | super cool\n   | go jade go\n\n```\n\n위 코드는 다음처럼 렌더링 된다. `foo bar baz rawr.....`\n\n인터폴레이션(interpolation, 중간중간 끼워넣어 완성시키는 것)은? 당근! 만약 다음과 같은 값  `{ name: 'tj', email: 'tj@vision-media.ca' }`  을 컴파일 함수로 넘긴다면, 아래와 같은 일을 할 수 있다.\n\n```\n#user #{name}  \n\n```\n\n결과는 `tj `\n\n옮긴이 주석\n인터폴레이션의 뜻을 좀 명확히 보기 위한 다른 언어 인터폴레이션의 예\n\n```\n\"#{animals} on a #{transport}\".interpolate({ animals:  \"Pigs\", transport:  \"Surfboard\"  });\n\n 출력은\n \"Pigs on a Surfboard\"\n```\n\n\n\n특정 이유로   `#{}`  를 출력하고 싶다면? 이스케이프 처리해라!\n\n```\np \\#{something}\n\n```\n\n위와 같이하면 다음 처럼 된다.  `#{something}`\n\n이스케이프 처리하지 않길 바랄때 다음과 같이 #대신 !를 쓴다.   `!{html}`,\n\n```\n- var html =  \"\"\n | !{html}\n\n```\n\n위 html 변수안의 코드는 이스케이프 처리되지 않는다.\n\n중첩된 태그들 또한 선택적으로 텍스트 블럭을 사용할 수 있다.\n\n```\nlabel\n   | Username:\n   input(name='user[name]')\n\n```\n\n혹은 바로 태그 텍스트를 불일 수 있다.\n\n```\nlabel Username:\n   input(name='user[name]')\n\n```\n\n오직 텍스트만 쓸 수 있는   `script`, `style`, 그리고  `textarea`  같은 태그들은 긴 문장이라도 앞에   `|`  문자를 붙일 필요가 없다.\n\n```\n   html\n     head\n       title Example\n       script\n         if (foo) {\n           bar();\n         } else {\n           baz();\n         }\n\n```\n\n반대로, 텍스트 블럭의 을 나타내기 위해 마지막에 '.'을 붙일 수도 있다.\n\n```\n   p.\n     foo asdf\n     asdf\n      asdfasdfaf\n      asdf\n     asd\n\n```\n\n출력:\n\n```\n     foo asdf\n     asdf\n       asdfasdfaf\n       asdf\n     asd\n     \n\n```\n\n끝에 '.'을 붙일 때 공백을 주면 Jade파서는 무시한다. 일반 문자로 간주하게 된다.\n\n```\np .\n\n```\n\n출력:\n\n```\n.\n\n```\n\n만약 이스케이프 문자(\\)를 찍고 싶으면 두개를 붙인다. 즉, 다음처럼 출력하고 싶다면\n\n```\nfoo\\bar\n\n```\n\n아래 처럼 쓴다.\n\n```\np.\n   foo\\\\bar\n\n```\n\n### 주석(Comments)\n\n한 줄 주석은 자바스크립트 코멘트랑 같다. '//'를 붙이고 한 줄로 쓴다.\n\n```\n// just some paragraphs\n p foo\n p bar\n\n```\n\n출력은 다음처럼 된다.\n\n```\n\n foo\n bar\n\n```\n\n하이픈을 붙이면 파싱할 때 제외한다.\n\n```\n//- will not output within markup\n p foo\n p bar\n\n```\n\n출력\n\n```\nfoo\n bar\n\n```\n\n### 블럭 주석(Block Comments)\n\n블럭 주석은 일반적으로 다음과 같다.\n\n```\n   body\n     //\n       #content\n         h1 Example\n\n```\n\n출력은\n\n```\n\n   \n \n\n```\n\nJade는 조건절 주석도 잘 지원한다.\n\n```\nhead\n   //if lt IE 8\n     script(src='/ie-sucks.js')\n\n```\n\n출력:\n\n```\n\n   \n \n\n```\n\n### 중첩(Nesting)\n\nJade는 일반적인 방식으로 태그 정의에 중첩을 지원한다.\n\n```\nul\n   li.first\n     a(href='#') foo\n   li\n     a(href='#') bar\n   li.last\n     a(href='#') baz\n\n```\n\n### \n\n```\n\n   foo\n   \n   bar\n   \n   baz\n   \n  \n```\n\n### 블럭 확장(Block Expansion)\n\n블럭 확장은 한줄짜리 중첩 태그를 만들 수 있게 해준다. 다음 예제는 위 예제와 동일하다.\n\n```\n   ul\n     li.first: a(href='#') foo\n     li: a(href='#') bar\n     li.last: a(href='#') baz\n\n```\n\n### 속성들(Attributes)\n\nJade는 현재 속성 구분자로 '(' 와 ')'를 사용한다.\n\n```\na(href='/login', title='View login page') Login\n\n```\n\n속성의 값이  `undefined`  나  `null`  이면 표시되지 않는다.\n\n```\ndiv(something=null)\n\n```\n\nboolean 속성도 지원한다.\n\n```\ninput(type=\"checkbox\", checked)\n\n```\n\n코드가 붙은 boolean 속성은 코드의 값이   `true` 일 때만 속성이 표시된다.\n\n```\ninput(type=\"checkbox\", checked=someValue)\n\n```\n\n여러 라인에 걸쳐서도 잘 동작한다.\n\n```\ninput(type='checkbox',\n   name='agreement',\n   checked)\n\n```\n\n콤마가 없는 여러 라인일 경우도 잘 된다.\n\n```\ninput(type='checkbox'\n   name='agreement'\n   checked)\n\n```\n\n펑키한 공백? 된다:\n\n```\ninput(\n   type='checkbox'\n   name='agreement'\n   checked)\n\n```\n\n콜론도 된다.\n\n```\nrss(xmlns:atom=\"atom\")\n\n```\n\n `{ id: 12, name: 'tobi' }` 값을 나타내는 user라는 로컬 변수가 있다고 가정해보자. 앵커 태그가 \"/user/12\"를 가르키길 원한다면, 자바스크립트의 문자열 연결방식을 사용할 수 있다.\n\n```\na(href='/user/' + user.id)= user.name\n\n```\n\n혹은 jade은 인터폴레이션을 쓸 수도 있다. 왜냐하면 루비를 쓰거나 커피스크립트를 쓰는 사람들이 일반적으로 쓰는 것 같아서 나도 추가했다.\n\na(href='/user/#{user.id}')= user.name\n\n`class`  속성은 배열을 받는 특별 케이스다.   `bodyClasses = ['user', 'authenticated']` 를 다음처럼 넘길 수 있다.\n\n```\nbody(class=bodyClasses)\n\n```\n\n### HTML\n\n인라인 HTML도 잘 동작한다. 파이프 문법을 이용해서 수직으로 글자를 내려 쓸 수 있다.\n\n```\nhtml\n   body\n     | Title\n     | foo bar baz\n\n```\n\n파이프를 생략하기 위해 끝에 .을 붙여서 Jade에게 텍스트 블럭임을 알려줄 수 있다.\n\n```\nhtml\n   body.\n     Title\n     foo bar baz\n\n```\n\n위 코드는 아래와 같다\n\n```\nTitle\n foo bar baz\n \n\n```\n\n위와 같은 규칙은 어턴 텍스트가 있던 jade에서는 동일한 규칙으로 동작한다.\n\n```\nhtml\n   body\n     h1 User #{name}\n\n```\n\n### Doctypes\n\n독타입을 추가하려면   `!!!`, 혹은 선택적으로  `doctype`  을 붙인다.\n\n```\n!!!\n\n```\n\n위 내용은   _transitional_ doctype이 된다.\n\n```\n!!! 5\n\n```\n\n혹은\n\n```\n!!! html\n\n```\n\n혹은\n\n```\ndoctype html\n\n```\n\n독타입은 대소문자를 가리지 않는다. 따라서 다음 내용은 동일하다.\n\n```\ndoctype Basic\n doctype basic\n\n```\n\n독타입 문자열을 전달 할 수도 있다.\n\n```\ndoctype html PUBLIC  \"-//W3C//DTD XHTML Basic 1.1//EN\n\n```\n\n결과:\n\n```\n"
  },
  {
    "id": 224,
    "title": "[node.js 따라배우기 04] 템플릿, 파셜, 그리고 문서 생성과 수정",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1321236697000,
    "body": "> doortts | 2011-11-13 일요일 오후 7:39 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/224)\n\n안녕하세요? 따라배우기 네 번째 입니다. 이번에는 번역이 조금 힘들었습니다. 몇 가지 이유가 있는데, 예전 원본글이 쓰였을때와는 버전들이 조금씩 어긋나는데 그걸 맞추는 작업을 해야 했고, 저 혼자만의 공부가 되지 않기 위해서 관련 자료들도 함께 추가해야 했기 때문입니다. 그리고 보기도 편하고, 자료로서의 가치도 함께 유지하기 위해 중간 중간 원문을 크게 해치지 않는 범위내에서 내용을 좀 추가하였습니다. 슬슬 창번(=창작번역)으로 가기 시작한걸까요? :D\n\n아마 이 글 보다 나중에 등록될 예정이지만, 여유가 되신다면 다음 글을 먼저 보시고 진행하시면 이해하기엔 더 좋습니다.\n\nJade - 템플릿 엔진 for Node.js [메뉴얼 번역]\n[http://blog.doortts.com/223](http://blog.doortts.com/223 \"[http://blog.doortts.com/223]로 이동합니다.\")\n\n뭔 따라 해 보다가 모르겠다 싶을 때 보셔도 큰 상관은 없습니다.\n\n그리고 이번부터는 본격적으로 코드 전체가 나오지 않기 시작합니다. 전체 소스코드를 중간 중간 살펴볼 필요가 있습니다. 아래 주소를 적극! 이용하세요!\n\nnodepad 최종소스코드\n[https://github.com/alexyoung/nodepad](https://github.com/alexyoung/nodepad \"[https://github.com/alexyoung/nodepad]로 이동합니다.\")\n\n자, 그럼 이번에도 화이팅! 입니다.\n\n\n 원문 페이지 : [http://dailyjs.com/2010/11/22/node-tutorial-4/](http://dailyjs.com/2010/11/22/node-tutorial-4/)\n \"Webapp을 만들어 봅시다! Nodepad\" 파트4에 오신걸 환영합니다. 본 시리즈는 \"Node.js\"를 이용해서 웹 애플리케이션(이하 웹앱)을 만들어보는 따라배우기(tutorial)시리즈입니다. node.js를 이용해서 웹앱을 만드는 과정을 따라가면서, 자신만의 애플리케이션을 만들 때 접하게 될 모든 영역을 다룰 예정입니다. 이전 내용\n\n\n\n**[Part 1: 소개](http://blog.doortts.com/207 \"[http://blog.doortts.com/207]로 이동합니다.\")** (Introduction)\n\n**[Part 2: 설치와 애플리케이션 뼈대 만들기](http://blog.doortts.com/209 \"[http://blog.doortts.com/209]로 이동합니다.\")** (Installation and Skeleton App)\n\n**[Part 3: RESTful 메소드와 테스트](http://blog.doortts.com/215 \"[http://blog.doortts.com/215]로 이동합니다.\")** (RESTful Methods and Testing)\n\n\n\n이번 파트에서는 추가할 내용이 많습니다. 그러니까 우선은 일어나서 차을 한잔 먼저 타오시면 좋을 것 같습니다. 튜터리얼의 끝에 (혹은 git으로부터 코드를 체크아웃 해온다면 지금 바로) 아래와 같은 모습의 앱을 보게 될 겁니다.\n\n[nodepad3.png](/files/21901)\n\n\n이 튜터리얼안에서 모든 코드를 다루진 않습니다. 몇 몇 코드 예제들은 축약해서 담았고, CSS는 제외했습니다. git 저장소에 들어 있으니까 필요하다면 다운로드 받아서 에디터로 열어볼 수 있습니다. \n\n \n\n엑스프레소 업데이트 하기 (Updating Expresso)\n\n엑스프레소는 계속 업데이트 되고 있습니다. 현재 최신버전은 0.9.0 입니다.\n\n\n\n(옮긴이 주)\n\n관련해서는 한글로 매뉴얼을 번역해 놓았으니 참고하세요. :)\n\n[Node.js 따라배우기] Node.js TDD 프레임워크 Expresso 매뉴얼 번역 ([http://blog.doortts.com/213](http://blog.doortts.com/213 \"[http://blog.doortts.com/213]로 이동합니다.\"))\n\n\n\n\n\n필요하다면 npm update expresso 명령어로 엑스프레소를 업그레이드 하세요.\n\n(옮긴이주. 최근 따라하기 시작하신 분들은 업데이트할 내용이 없을 겁니다)\n\n \n\n**엑스프레소(expresso)?**\n\n  \n\n엑스프레소는 node.js용 자바스크립트 TDD 프레임워크입니다. 사이트의 설명에 의하면 Expresso는 빠르고 추가적인 테스트 메소드와 코드 커버리지 레포팅, CI지원 등의 기능을 가진다고 합니다. 이하 특징입니다.\n\n  \n\n- 경량\n\n- 직관적인 비동기 지원\n\n- 직관적인 테스트 실행\n\n- node-jscoverage를 통한 테스트 커버리지 지원과 레포팅\n\n- 코어 assert 모듈을 사용하거나 확장함\n\n- assert.deepEqual()의 축약으로 assert.eql()\n\n- assert.response() http response 유틸리티\n\n- assert.includes()\n\n- assert.isNull()\n\n- assert.isUndefined()\n\n- assert.isNotNull()\n\n- assert.isDefined()\n\n- assert.match()\n\n- assert.length()\n\n \n\n \n\n**템플릿 렌더링 (Rendering Templates)**\n\n문서 목록을 보여주는 메소드(/documents)는 수정할 수 있는 문서 목록을 렌더링해야 합니다. 그렇게 하기 위해, 적절한 render 호출을 추가합니다.\n\n다음 코드는 app.js 의 일부입니다.\n\n\n\n\n\nres.render('documents/index.jade', {\n\n  locals: { documents: documents }\n\n});\n\n\n\n\n\n 위 코드와 함께 쓰는 Jade 템플릿(index.jade)은 다음과 같습니다. \n\n \n\nul\n\n  - for (var d in documents)\n\n    li= d.title \n\n  \n\n \n\n  \n\n**제이드(Jade)**\n\nJade를 처음 쓰게 되면 좀 낯설게 느껴집니다만 실제로는 매우 쉽게 요령이 붙습니다. 다음 기억해야 할 키 요소입니다.\n\n \n\n-  들여쓰기는 태그 중첩(nesting)을 의미합니다.\n\n-  등호(=) 표시는 변수 포함을 의미합니다.\n\n-  부등호(!=) 표시는 이스케이프(escape)되지 않은 변수를 포함했다는 뜻입니다. \n\n(옮긴이 주: 이스케이프:  등의 특수문자를 &lt; &gt; 등으로 변환하는 것)\n\n-  하이픈(-)은 자바스크립트 포함을 허용합니다.\n\n \n\n일반적으로 가능한 한 많이 이스케이프 하는 것이 좋습니다. 크로스사이트스크립트(XSS) 공격의 가능성을 줄여주기 때문입니다.\n\n**파셜 (Partials)**\n\n제이드와 expresso는 파셜(=재사용 가능한 작은 템플릿 조각)을 쉽게 만들 수 있게 해줍니다. 다음은 새로운 문서 템플릿입니다. \n\n**views/documents/new.jade**\n\n \n\nh2 New Document\n\nform(method='post', action='/documents')\n\n  !=partial('documents/fields', { locals: { d: d } })\n\n \n\n파셜은 partial(템플릿파일이름, 옵션) 메소드를 호출하면 렌더링됩니다. 결과물은 이스케이프(escape)되지 않습니다. 방금 우리가 봤던 HTML 태그들은 사용자 정의 필드 안에서 이스케이프 될 것이기 때문입니다. 따라서 여전히 안전합니다.\n\n**생성/수정 폼(New and Edit Forms)**\n\n마음을 흔들만한 어썸~한 Ajax 인터페이스를 만들기 전에, 간단한 템플릿들을 만들어 봅시다. 우리의 REST API는 생성(create) 메소드와 업데이트(update) 메소드를 정의했습니다. 따라서 사용자 인터페이스를 제공하기 위해 이에 대응하는 new와 edit 메소드를 만들어야 합니다.\n\n저는 보통 폼을 세 개의 템플릿으로 쪼갭니다. 하나는 폼 필드들을 담고 있는 재사용 가능한 파셜입니다. 다른 두 개는 new와 edit 템플릿으로, 필드들을 감싸기에 적당한 폼 코드를 가지고 있습니다. \n\nnew 폼은 위에서 썼습니다. Edit 폼은 다음과 같습니다.\n\n**views/documents/edit.jade**\n\n \n\nh2 Edit Document\n\nform(method='post', action='/documents/' + d.id)\n\n  input(name='document[id]', value=d.id, type='hidden')\n\n  input(name='_method', value='PUT', type='hidden')\n\n  !=partial('documents/fields', { locals: { d: d } })\n\n  \n\n\n\nnew와 동일하지만 숨겨진 input 필드가 있습니다. _method 필드가 POST를 put 라우팅으로 처리할 수 있게 해줍니다. 지난번에 살펴봤던 RESTful API를 따릅니다.\n\n필드에 해당하는 파셜은 간단합니다.\n\n**views/partials/documents/fields.jade**\n\n\n\n\n\ndiv\n\n  label Title:\n\n    input(name='document[title]', value=d.title || '')\n\ndiv\n\n  label Note:\n\n    textarea(name='document[data]')\n\n      =d.data || ''\n\ndiv\n\n  input(type='submit', value='Save')\n\n  \n\n\n\n\n\n이 시점에서 Jade에 대한 느낌이 와야 합니다. 저는 haml이나 Jade의 팬이 아닙니다만, 보시다시피 이런 예제들은 문법이 꽤 간단하다는 걸 알 수 있을겁니다. \n\n\n\n\n\n(옮긴이 주)\n\n그래서 Jade 관련해서는 따로 [페이지](http://blog.doortts.com/223 \"[http://blog.doortts.com/223]로 이동합니다.\")를 만들었습니다. node와 express를 쓴다면 한 번 배워 볼만합니다.\n:)\n\n\n\n\n\n**New와 Edit에 대한 백엔드 메소드 (New & Edit Back-end Methods)**\n\nnew와 edit에 대한 서버사이드 메소드는 문서를 읽어들여서 폼을 렌더링 하는 겁니다.\n\n\n\n\n\napp.get('/documents/:id.:format?/edit', function(req, res) {\n\n  Document.findById(req.params.id, function(d) {\n\n    res.render('documents/edit.jade', {\n\n      locals: { d: d }\n\n    });\n\n  });\n\n});\n\napp.get('/documents/new', function(req, res) {\n\n  res.render('documents/new.jade', {\n\n    locals: { d: new Document() }\n\n  });\n\n});\n\n\n\n\n\nnew 메소드는 폼 템플릿을 유지하기 위한 빈 문서를 만듭니다.\n\n**몽고 IDs (Mongo IDs)**\n\n템플릿이 d.id를 참조한다는 걸 눈치채셨나요? 몽구스(Mongoose)는 기본적으로 ObjectID 데이터타입을 갖는 _id 필드를 만듭니다. 제가 보기엔 별로 좋은 것 같진 않아서, getter에 해당하는 메소드를 만들어 mode.js에 추가했습니다. 다음은 model.js의 일부입니다.\n\n \n\n  Document.virtual('id')\n\n    .get(function() {\n\n      return this._id.toHexString();\n\n}); \n\n\n\ntoHexString 을 사용해서 4cd733fb20a558cee5000001 와 같은 나이스~한 ID값을 갖게 되었습니다. \n\n(옮긴이 생각. 나이스~한 ID? 대체 어딜봐서???-_-)\n\n\n\n\n\n(옮긴이 주)\n\n위 코드는 현재 버전에 맞게 바꾼 코드입니다. :)\n\nnodepad앱이 버전차이에 따라 어떻게 바뀌었나 보려면 [여길](https://github.com/alexyoung/nodepad/commit/d1c029b55bedc751e4aca4716f7c557c62c8075c#diff-1 \"[https://github.com/alexyoung/nodepad/commit/d1c029b55bedc751e4aca4716f7c557c62c8075c#diff-1]로 이동합니다.\")\n\n결국 최종적인 model.js가 어떻게 되었나 보려면 [여길](https://github.com/alexyoung/nodepad/blob/master/models.js \"[https://github.com/alexyoung/nodepad/blob/master/models.js]로 이동합니다.\")\n\n  \n\n\n\n\n\n **업데이트와 삭제(Update and Delete)**\n\n업데이트와 삭제 메소드는 둘 다 우선 문서를 먼저 읽어 들이고, 그 다음 save 혹은 remove를 합니다. 일반적인 패턴은 다음과 같습니다.\n \n\n\n\napp.put('/documents/:id.:format?', function(req, res) {\n\n  // 문서 읽어오기\n\n  Document.findById(req.body.document.id, function(d) {\n\n    // 무언가 작업하기\n\n    d.title = req.body.document.title;\n\n    d.data = req.body.document.data;\n\n  \n\n    // 변경된 내용 저장\n\n    d.save(function() {\n\n      // 요청한 포맷에 맞게 응답\n\n      switch (req.params.format) {\n\n        case 'json':\n\n          res.send(d.__doc);\n\n         break;\n\n  \n\n         default:\n\n          res.redirect('/documents');\n\n      }\n\n    });\n\n  });\n\n});\n\n\n\n\n\n삭제(Delete)도 기본적으로 동일하다. save 대신에 remove를 호출하게 됩니다.\n\n**자바스크립트를 이용한 삭제(Delete JavaScript)**\n\n우리가 Express를 이용해서 만들고 있는 API 중에서 쫌 괴상한 부분은 del 메소드입니다. POST의 파라미터로 _method=\"delete\"가 있는걸 볼 겁니다. 대부분의 프레임워크들은 클라이언트 쪽의 자바스크립트를 사용해서 이 부분을 구현합니다.\n\n첫 번째 따라하기에서 이야기 했듯인 우리는 jQuery를 쓸 생각입니다. layout.jade 템플릿을 수정해서 jQuery를 포함시킬 수 있습니다. 다음 코드를 보겠습니다.\n\n\n\n\n\n!!!\n\nhtml\n\n  head\n\n    title= 'Nodepad'\n\n    link(rel='stylesheet', href='/stylesheets/style.css')\n\n    script(type='text/javascript', src='https://ajax.googleapis.com/\n\n      ajax/libs/jquery/1.4.4/jquery.min.js')\n\n  body!= body\n\n    script(type='text/javascript', src='/javascripts/application.js')\n\n  \n\n\n\n\n\n끝 부분에 우리가 만드는 자바스크립트를 포함하고 있습니다. Express는 public 폴더를 이용해서 정적 파일(html, js, image 등의 변화없는 파일)을 서비스 합니다.\n\n클라이언트 측 삭제 자바스크립트는 다음과 같은 식으로 동작합니다.\n\n1\\.   confirm()을 사용해서 해당 문서를 삭제하길 원하는지 여부를 체크한다.\n \n\n2\\.   _method라는 이름의 히든 입력 폼을 동적으로 끼워 넣는다. 이때 _method의 값은 delete로 한다.\n\n3\\.   폼을 submit한다.\n\n물론 jQuery를 쓰면 쉽다. 저는 위 내용을 명령어 체인 한방으로 다음처럼 작성했습니다.:\n\n\n\n\n\n $('.destroy').live('click', function(e) {\n\n  e.preventDefault();\n\n  if (confirm('Are you sure you want to delete that item?')) {\n\n    var element = $(this),\n\n        form = $('');\n\n    form\n\n      .attr({\n\n        method: 'POST',\n\n        action: element.attr('href')\n\n      })\n\n      .hide()\n\n      .append('')\n\n      .find('input')\n\n      .attr({\n\n        'name': '_method',\n\n        'value': 'delete'\n\n      })\n\n      .end()\n\n      .submit();\n\n  }\n\n});\n\n  \n\n\n\n\n\n \n\n(옮긴이 주)\n\n위 코드는 아래 코드 하단부에서 확인 가능\n\n[https://github.com/alexyoung/nodepad/blob/master/public/javascripts/documents.js](https://github.com/alexyoung/nodepad/blob/master/public/javascripts/documents.js \"[https://github.com/alexyoung/nodepad/blob/master/public/javascripts/documents.js]로 이동합니다.\")\n\n \n\nlive이벤트 델리게이트를 사용했습니다. 덕분에 클라이언트 측 HTML을 인라인 자바스크립트로 어지럽히지 않을 수 있었습니다. (옮긴이 주. inline 자바스크립트 : 폼에 onClick이벤트 같은 항목을 넣는 것)\n\n**방문자 첫 페이지(index page)**\n\n /documents로 리다이렉팅 하는걸 기본 액션으로 정했었습니다. document 인덱스 액션은 현재 다음과 같습니다.\n\n\n\n\n\nh1 Your Documents\n\np\n\n  a(class='button', href='/documents/new') + New Document\n\nul\n\n  - for (var d in documents)\n\n    li\n\n      a(class='button', href='/documents/' + documents[d].id \n\n        + '/edit') Edit\n\n      a(class='button destroy', href='/documents/' \n\n        + documents[d].id) Delete\n\n      a(href='/documents/' + documents[d].id)\n\n        =documents[d].title\n\n\n\n\n\n위 내용은 Jade에서 반복문을 사용법의 한가지 예 입니다. 좀 더 선호하는 방식은 파셜의 컬렉션 지원방식을 사용하는 것입니다만, Jade에서 템플릿을 사용할 때 블록을 다루는 방법을 보여주기에는 적절하다고 생각합니다.\n\n**결론(Conclusion)**\n\n이제 기본동작은 하는 nodepad가 만들어졌습니다. 다음 시리즈를 이어가지 전에 최신 버전의 nodepad 를 살펴보고 어떤 쿨~한 기능을 넣으면 좋을지 생각해 보세요.\n\n파트4가 끝났습니다. 다음 따라배우기는 \"Part 5: 인증과 세션, 접근제어 미들웨어 (Authentication, Sessions, Access Control Middleware)\"입니다. 오프라인 모임 전에 파트5까지 진도가 나갈 수 있기를 희망해 봅니다.  \n\n파트4가 끝났습니다. 다음 따라배우기는 \"Part 5: 인증과 세션, 접근제어 미들웨어 (Authentication, Sessions, Access Control Middleware)\"입니다. [오프라인 모임](http://blog.doortts.com/221 \"[http://blog.doortts.com/221]로 이동합니다.\") 전에 파트5까지 진도가 나갈 수 있기를 희망해 봅니다.\n",
    "attachments": [
      {
        "id": 21901,
        "name": "nodepad3.png",
        "hash": "6f0959ef2c9eedf03cbb150747c822d166fdd54b",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 23940,
        "containerId": "12379"
      }
    ]
  },
  {
    "id": 225,
    "title": "[node basic] npm faq",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1321415293000,
    "body": "> doortts | 2011-11-14 월요일 오전 2:8 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/225)\n\n\n\n\n\n* 현재 따라배우기가 조금 어렵다는 이야기가 있어서 기본내용을 배우는 시리즈를 올려보려고 합니다. 첫 번째는 npm에 대한 FAQ입니다. 짧고도 재밌으니까 꼭 읽어보세요! * \n\n\n\n\n\nnpm은 노드 패키지 매니저 입니다. node 모듈들을 자동으로 설치해 주죠. 그런데 npm에 대해서는 그다지 많은 이야기가 없는 것 같습니다. 자료를 찾아보다가 npm FAQ가 재밌고도 학습에 도움이 되어서 함께 보실수 있도록 번역해 봅니다.\n\nnpm 공식사이트인 [npmjs.org](http://npmjs.org \"[http://npmjs.org]로 이동합니다.\")로 접속하거나 커맨드 라인에서 npm faq라고 타이핑하면 볼 수 있습니다. 전 npm 1.0 커맨드라인 버전을 기준으로 작업하였습니다. :)\n\n\n\nnpm faq - frequently asked question\n\n**HTML로 된 문서는 어디에서 볼 수 있죠?**\n\n \n\nhttp://npmjs.org/doc/, 혹은 다음과 같이 실행:\n\n   npm config set viewer browser\n\n이제 man 페이지가 아닌 웹 브라우저로 문서를 엽니다.\n\n \n\n**npm이 동작을 안해요.**\n\n \n\n질문이 아닌데요?\n\n\n\n       \n\n**왜 동작을 안할까요?**\n\n \n\n저도 아직 모르겠네요. \n에러 출력을 읽으세요. 그리고 뭔 소린지 모르겠으면, 하라는 대로 하시고, 필요한 정보와 함께 버그로 올리세요. \n\n \n\n**npm은 내려받은 것들을 어디에 두나요?**\n\n \n\n**npm help folders** 라고 실행해보세요.\n\n- **npm root** 명령어를 사용하면 모듈이 어디로 가는지 볼 수 있어요. **npm bin** 이라고 치면 실행파일들은 어디로 가는지 볼 수 있고요.\n- 글로벌(Global)로 설치한 것들은 로컬(local)과 다른 곳에 있어요. 만약 뭔가 설치할때 -g 플래그를 주었으면 실행파일은 **npm bin -g** 에 해당하는 위치로 그리고 모듈들은 **npm root -g** 에 대항하는 위치로 가요.\n \n\n \n\n  \n\n**어디서든 쓰고 싶으면 어떻게 인스톨 하죠?**\n\n\n\n글로벌 인스톨을 하세요. 인스톨 할때 -g 혹은 --global 태그를 명령어 뒤에 붙이면 되요.\n\n\n\n \n\n**제가 뭔가를 글로벌로 설치했거든요. 그런데 'require()'를 쓸수가 없어요.**\n\n \n\n로컬로 설치하세요.\n\n \n\n  \n\n**싫어요!**\n\n \n\n[npm link](http://blog.nodejs.org/2011/04/06/npm-1-0-link/ \"[http://blog.nodejs.org/2011/04/06/npm-1-0-link/]로 이동합니다.\") 를 살펴보세요. 맘에 들거에요.\n\n\n\n**안할래요. 전 0.x 버전대의 스타일 '모든걸 글로벌로!' 스타일을 원해요.**\n\n\n\n\n\nOK. 알았어요. 이렇게 해보세요.\n\n echo 'export NODE_PATH=\"'$(npm root -g)'\"' >> ~/.bashrc\n\n. ~/.bashrc\n\nnpm config set global true\n\n추천 하고 싶진 않네요. 이런식으로 하면 많은게 잘 안될거에요. 깨진다고 불평하기 전에 npm help config와 npm help global을 확실히 읽고 이해해야 해요. 잘못했다는 생각이 들면, 다음처럼 해서 되돌리세요.\n\nnpm config delete global --local\n\n\n\n**'npm'이 약어라면, 왜 대문자로 표시하지 않죠?**\n\n\n\n많은 사람들의 믿음과는 달리 'npm'은 사실 \"Node Package Manager\"의 머리글자를 딴 약어가 아니에요. 재귀적인 \"npm is not an acronym\"에 대한 재귀적인 [바크로니믹](http://en.wikipedia.org/wiki/Bacronym \"[http://en.wikipedia.org/wiki/Bacronym]로 이동합니다.\")이에요. ninaa라고 이름지었으면 머리글자를 딴 약어가 맞겠지만, 그렇지 않으니까 약어가 아닌거죠. \n\n\"NPM\"은 사실 머리글자를 딴 약어가 맞죠. (좀 더 정확하게 말하자면 [capitonym](http://en.wikipedia.org/wiki/Capitonym \"[http://en.wikipedia.org/wiki/Capitonym]로 이동합니다.\")이고요) National Association of Pastoral Musicians (국립 목회 음악가 협회)를 나타냅니다. http://npm.org/ 를 보면 좀 더 알 수 있습니다.\n\n소프트웨어 쪽에선 \"NPM\"은 크리스 로덴이 만든 non-parametric mapping 유틸리티를 뜻합니다. http://www.cabiatl.com/mricro/npm/ 을 보세요.\n\n열매를 맺게 만들어준 첫번째 씨앗은 \"pm\"이라고 이름붙은 bash 유틸리티였습니다. \"pkgmakeinst\"의 축약형 후손이었죠. bash 함수였는데 다양한 종류의 것들을 다양한 플랫폼에 설치하는데 쓰였고, 야후의 yinst 사용에 흔히 쓰였죠. 만약 npm이 무언가에 대한 약어였다면, node pm 혹은 new pm 이었을겁니다.\n\n따라서, 진지하게 이야기하면, \"npm\"프로젝트는 앞서 말한 커맨드라인 유틸리티로부터 이름을 따온겁니다. 그리고 QUERTY 키보드 레이아웃을 사용하는 오른손잡이 프로그래머가 반찌 끼우는 손가락(약지, 중지)만으로 쉽게 타이핑할 수 있도록 정한겁니다. 커맨드 라인은 늘 그렇듯 당연 소문자구요.\n\n\n\n \n\n**설치된 패키지들의 목록을 보려면 어떻게 하나요?**\n\n \n\nnpm ls\n\n \n\n**패키지는 어떻게 찾죠?**\n\n \n\nnpm search\n\n인자들은 grep (유닉스 명령어) 이에요. npm search jsdom 하면 jsdom 패키지를 보여줘요.\n\n \n\n  \n\n**npm은 어떻게 업데이트 하죠?**\n\n\n\nnpm update npm -g\n\n인자없이 npm update 만 실행하면 로컬 패키지들을 모두 업데이트 할 수 있어요. 글로벌 패키지들은 npm update -g 라고 하면되요.  \n\n\n\n 만약 정상설치 안되면 다음처럼 실행해 보세요. curl http://npmjs.org/install.sh | sh \n\n\n\n\n\n **'패키지'는 뭔가요?**\n\n\n\n\n\n패키지는\n\na) package.json 파일에 설명이 쓰여져 있는, 프로그램이 들어 있는 폴더 \nb) (a)를 포함하고 있는 gzipped tarball\nc) (b)가 되는 url\nd) (c)로 등록되어 퍼블리싱된 @\ne) (d)를 지칭하는 @\nf) (e)를 만족시키는 \"latest\" 태그가 붙은   (예. express@latest )\ng) clone했을때 (a)가 되는 git url\n\n패키지를 퍼블리싱 하지 않았을지라도, 단지 node 프로그램 작성을 원한다면 (a), 그리고 tarball로 팩킹한 후 다른 곳에서 쉽게 인스톨 하길 원할 경우(b) 여전히 많은 장점을 얻을 수 있어요.  \n\nGit url도 해당 경우가 될 수 있어요. \n\n           git://github.com/user/project.git#commit-ish\n\n           git+ssh://user@hostname:project.git#commit-ish\n\n           git+http://user@hostname/project/blah.git#commit-ish\n\n           git+https://user@hostname/project/blah.git#commit-ish\n\n commit-ish 는 어떤 태그든, sha 든, 혹은 git 체크아웃을 용 인자가 되는 브랜치 등 뭐든 될 수 있죠. 기본값은 master 에요.\n\n\n\n **어떻게하면 npm과 함께 node를 인스톨 할 수 있을까요?**\n\n\n\n못해요. 다음중 하나를 시도해 보세요.\n\no   http://github.com/isaacs/nave\n\no   http://github.com/visionmedia/n\n\no   http://github.com/creationix/nvm\n\n  \n\n**어떻게 하면 npm을 개발용으로 쓸 수 있을까요?**\n\n\n\nnpm help developers 그리고 npm help json 살펴보세요\n\n  \n\n개발 폴더를 npm link 하길 가장 원할 것 같습니다. 그렇게 하는건 끝내주게 쉬워요.\n\n사설 레지스트리를 만들려면, npm help registry를 살펴보세요.\n\n\n\n **의존성을 url 목록으로 만들수 있나요?**\n\n\n\n네. root 폴더에 package.json을 가진 단일폴더로 만들고, 그 폴더를 gzipped tarball 묶은 url 혹은 gir url이 될 수 있습니다. (위쪽 부분의 \"패키지가 뭔가요?\" 부분을 보세요) \n\n\n\n**재 설치 하지 않아도 되고 dev 폴더에 symlink를 만들 순 없나요?**\n\n\n\nnpm help link를 보세요.\n\n\n\n \n\n **패키지 레지스트리 웹사이트. 대체 그게 뭐요?**\n\n \n\nnpm help registry 를 보세요.\n\n \n\n **비보안 채널에 대한 경고는 어떻게 처리 하나요?**\n\n\n\nnode 0.4.10 전까지는 큰 파일들을 HTTPS로 보내는데 문제가 있었습니다. 해당 버전의 node에서는 기본적으론 HTTP로 퍼블리싱한다는 뜻입니다.\n\n\n\n**패스워드를 까먹어서 퍼블리싱을 못해요. 어떻게 리셋하죠?**\n\n\n\n[http://admin.npmjs.org/reset](http://admin.npmjs.org/reset%20 \"[http://admin.npmjs.org/reset ]로 이동합니다.\") 을 보세요.\n\n **ECONNREFUSED가 많이 발생하는데요. 뭐가문제죠?**\n\n\n\n레지스트리가 다운 되었거나 node의 DNS가 찾지 못하는 거에요. Cygwin 단계별 문서의 단계들을 모두 따라하지 않았을 경우 많이 발생해요. 레지스트리가 다운되었는지 확인하려면, http://registry.npmjs.org/-/short 를 브라우저로 열어보세요. 어떤 이유로 인터넷 연결이 안되는 건지 알려줄거에요.\n\n만약 레지스트리가 다운되었다면, 이메일로 알려주거나 이슈를 등록해서 알려주세요. 제가 때려서 말을 듣게 해 놓겠습니다.\n\n\n\n \n**npm은 누가 만드나요?**\n\n\n\nnpm view npm author\n\nnpm view npm contributors\n\n \n\n\n**여기에 없는 질문이나 요청은 어디서 하죠?**\n\n\n\n메일링 리스트나 이슈로 등록해 주세요.\n\no   npm-@googlegroups.com\n\no   http://github.com/isaacs/npm/issues \n\n\n\n**왜 npm은 절 미워할까요?**\n\n\n\nnpm은 누굴 미워할만한 재주가 없어요. 모두를 사랑해요. 특히 당신을요.\n\n \n\nSEE ALSO\n\n       o   npm help npm\n\n       o   npm help developers\n\n       o   npm help json\n\n       o   npm help config\n\n       o   npm help folders"
  },
  {
    "id": 226,
    "title": "[node basic] npm: 글로벌 vs 로컬 설치 (Global vs Local installation)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1321947090000,
    "body": "> doortts | 2011-11-22 화요일 오후 4:31 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/226)\n\n\n\nnpm으로 무언가를 설치할때 전역(global)으로 설치하는 것이 좋을지, 지역(local)적으로 설치하는 것이 좋을지 조금 고민되곤 합니다. 이럴때 기준이 되는 이야기입니다. 이번주는 미친듯이 바뻐서 진도가 조금 느려졌습니다. : )\n\n\n\n원문: [http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/)\n\n  \n\n**두 개의 경로**\n\nnpm 1.0에서는 무언가를 설치할 때 두 가지 방식이 있다.\n\n1. **전역적으로**(globally) – 이 경우 모듈들은 {prefix}/lib/node_modules 에 위치하게 되고 실행파일들은 {prefix}/bin 에 위치한다. {prefix} 는 보통 /usr/local 쯤이 된다. 매뉴얼 페이지(man pages)는 {prefix}/share/man 에 설치된다.\n\n2. **지역적으로**(locally) – 현재 디렉터리에 패키지를 설치한다. 노드 모듈은 ./node_modules 에 그리고 실행파일들은 ./node_modules/.bin/ 에 설치되고, 매뉴얼 페이지는 전혀 설치되지 않는다.\n\n** **\n\n**뭘 선택해야 하나?**\n\n패키지를 전역적으로 설치할지 지역적으로 설치할지는 global 설정에 따라 다르다. 커맨드 라인에서는 –g 로 대체가능하다.\n\nGlobal 변수들이 좋진 않지만 어떤 경우엔 필요한 것과 비슷하게, 글로벌 패키지들은 중요하지만 필요하지 않으면 최대한 피하는 것이 좋다.\n\n흔히 넘버 원 규칙은 다음과 같다.\n\n1. require('A')를 사용해서 만약 당신의 프로그램에서 필요한 A를 설치한다면, 프로젝트의 루트 위치에서 로컬방식으로 설치해라.\n\n2. 만약 쉘에서 사용하길 원하는 무언가를 설치한다면, 즉 커맨드라인 혹은 그 비슷한 형태로 사용하고 싶다면, 전역적으로 설치해라. 그렇게 해서 바이너리 파일들이 PATH 환경변수 안에 포함되게 만들어라.\n\n **선택이 어려울 경우**\n\n물론, 어떤 경우에는 두 가지가 모두 필요할 때가 있다. 커피스크립트와 익스프레스는 둘 다 라이브러리 뿐 아니라 커맨드라인 인터페이스도 가지고 있는 좋은 예가 된다. 이런 경우, 다음 중 하나를 선택할 수 있다.\n\n1. 두 곳에 모두 설치한다. 솔직히 말해서, 디스크의 공백이 부족하진 않지 않은가? 정말, 그렇게 해도 무방하다. 그냥 다 조그마한 자바스크립트 프로그램들일 뿐이다.\n\n2. 글로벌로 설치하고 npm link coffee-script 혹은 npm lin express 해라. (물론 당신의 플랫폼에서 심볼릭 링크를 지원할 경우에말이다) 그러면 모든 심볼링크들을 업데이트 하기 위해서 글로벌 카피본만 업데이트 해주면 된다.\n\n이 첫 번째 옵션이 내 의견으로는 최고다. 간단하고, 확실하고, 명확하다. 두 번째는 여러 개의 서로 다른 프로젝트에서 동일한 라이브러리를 재사용 할 생각이라면 매우 간편한 방법이다.\n\n당신은 환경 변수를 이용하는 다른 방법도 있다고 생각할 수 있을 것이다. 하지만 그런 방법은 별로 추천하지 않는다.  취향을 따르길 바란다.\n\n \n\n**약간의 예외: 항상 cwd를 하진 않는다**.\n\n*cwd : change working directory\n\n다음과 같은 작업을 한다고 가정해보자:\n\n```\ncd ~/projects/foo     # 프로젝트로 이동\n npm install express   # ./node_modules/express\n cd lib/utils          # 근처로 이동\n vim some-thing.js     # 무언가를 수정하고 작업을 진행 \n\n```\n\n 이런 경우에 npm은 redis를 ~/projects/foo/node_modules/redis 에 설치할 것이다. Git이 git 저장소 내에서 동작하는 방식과 비슷하다. npm은 node_modules 폴더가 정의된 패키지 내 어디에서든 작동한다.\n\n**테스트 러너들과 대상**\n\n만약 의존 관계의 것들에 의해 설치된 커맨드라인 프로그램을 당신 패키지의 scripts.test 커맨드가 사용할지라도, 걱정할 필요 없다. 어떤 라이프사이클이 있는 스크립트를 실행할 때라도 npm은 ./node_modules/.bin 을 PATH 환경변수의 맨 앞에 위치시킨다. 따라서 프로그램이 전역적으로 설치되지 않았어도 잘 동작한다.\n\n```\n{  \"name\"  :  \"my-program\"\n , \"version\"  :  \"1.2.3\"\n , \"dependencies\": {  \"express\":  \"*\",  \"coffee-script\":  \"*\"  }\n , \"devDependencies\": {  \"vows\":  \"*\"  }\n , \"scripts\":\n   { \"test\":  \"vows test/*.js\"\n   , \"preinstall\":  \"cake build\"  } }\n```"
  },
  {
    "id": 227,
    "title": "Agile korea 2011이 내일 열립니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1322211106000,
    "body": "> doortts | 2011-11-25 금요일 오후 5:51 | 이생각 저생각 | [원본](http://blog.doortts.com/227)\n\n**#1.**\n내일 (26일,토요일)은 상암동에서 Agile Korea라는 애자일 컨퍼런스가 열립니다.\n\n[h](http://agilekorea.org/?page_id=83 \"[http://agilekorea.org/?page_id=83]로 이동합니다.\")[ttp://agilekorea.org/?page_id=83](http://agilekorea.org/?page_id=83 \"[http://agilekorea.org/?page_id=83]로 이동합니다.\")\n\n회사나 기업에서 준비하는 컨퍼런스가 아닌, 커뮤니티의 사람들이 모여 준비한 컨퍼런스 입니다.\n\n국내에서 순수 애자일만을 주제로 멀티 트랙을 가진 컨퍼런스가 개최된다는 것 만으로도 사실 가슴뛰는 일입니다. 사실 최초의 seed가 된 건 저의 친구이자 멘토이자 동료인 [황상철](http://pragmaticstory.com \"[http://pragmaticstory.com]로 이동합니다.\")님의 발언으로 부터였습니다.\n\n\"국내에서도 애자일 컨퍼런스를 개최하고 싶다.\"\n\n말하면 이루어 진다더니 그렇게 된 걸까요? :)\n\n현재 황상철님을 비롯하여 많은 분 들이 오거나이저로 행사를 준비하고 계십니다. 저도 일원 중 하나로 부족하나마 일을 돕고 있습니다. 오셔서 보실때, 어쩌면 처음이라 다소 서툴수는 있겠지만, 너그러운 마음으로 봐주셨으면 좋겠습니다.\n\n**#2**\n세션중에 '[애자일 실천법에 대한 만담](http://agilekorea.org/?page_id=97 \"[http://agilekorea.org/?page_id=97]로 이동합니다.\")'이라는 세션이 있습니다. 황상철님과 함께 진행하는 세션인데요, '만담'이라는 방식을 선택한 이유는 이렇습니다.\n\n- 애자일은 테크닉과 문화가 결합한 독특한 형태이다.\n- 단순히 내용을 전달하는 것을 넘어 함께 참여하고 함께 만들어 가는 세션을 만들어 보고 싶다.\n- 그리고 좀 더 편하게, 좀 더 깊숙하게 현실에 대해 이야기 하고 싶다. \n그래서 좀 더 도전적인 방법을 선택했습니다. \n구체적으로 무슨 이야기를 어떻게 하려 하는지는 [황상철님이 올리신 글](http://pragmaticstory.com/1849 \"[http://pragmaticstory.com/1849]로 이동합니다.\")을 보시면 좀 더 이해가 되실 것 같습니다. \n\n**#3**\n아! 그리고 광고 하나 더! \n\n컨퍼런스 마무리 후에 OST라는 행사가 열리는데요, 제가 host를 맡은 테이블의 주제는 이렇습니다.\n\n**\"인생이 피곤한 사람들을 위한 쉼터\"\n **\n하루 종일 머리를 많이 쓰셨다면, 이 시간에는 우리의 정서를 다듬어 보는 시간을 가져볼 생각입니다.\n\n**#4**\n자! 그럼 참여하시는 분들은 내일 뵙겠습니다.\n다행히도 내일은 날도 오늘 보다는 좀 더 따뜻해 진다고 하네요.\n\n그럼 편안한 금요일 저녁 되세요.\n감사합니다. "
  },
  {
    "id": 228,
    "title": "node.js 아티클 번역 및 공동 작업 공간을 만들었습니다. :)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1322478333000,
    "body": "> doortts | 2011-11-28 월요일 오후 8:5 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/228)\n\nnode.js 아티클 번역 및 공동 작업 공간을 만들었습니다. :)\n함께 참여하실 분들은 아래 내용을 읽어주세요.\n \n\n====================================\n\n \n\n1\\. 드랍박스([dropbox.com](http://dropbox.com \"[http://dropbox.com]로 이동합니다.\")) 이메일 아이디를 저게 댓글이나 메일로 알려주세요. 없으신 분은 이번 기회에 하나 만드시는 걸 추천!\n\n \n\n2\\. 제가 해당 이메일로 폴더(translation)를 공유를 합니다.\n\n \n\n3\\. 현재 번역중인 것들을 보시고, 번역할 것을 todo 아래에 적당한 폴더를 만들어 넣어둡니다. (번역되었으면 좋겠다 싶은 것도 상관없습니다.)\n\n \n\n4\\. 둘러보면, 누가 무엇을 번역하고 있는지 확인 할 수 있습니다. :)\n\n 5\\. 작업하고 싶은 걸 doing으로 옮깁니다.\n\n  \n\n6\\. 해당 번역 폴더 최상위 폴더에는 readme.txt를 만들어 간략한 정보를 넣어주세요.    (translation/sustaining/vows/readme.txt 참고)\n\n \n\n7\\. 완료된 번역물은 sustaining 폴더로 옮깁니다.\n\n \n\n8\\. 번역물 공개는 본인의 블로그에 올리거나 octoberskyjs.no.de에 올려달라고 요청합니다.\n\n \n\n9\\. 함께, 열심히, 행복하게 살아 갑니다. :)"
  },
  {
    "id": 229,
    "title": "[dW Review] 리얼타임 웹을 위한 기초 기술들",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1322572733000,
    "body": "> doortts | 2011-11-29 화요일 오전 2:58 | Better SW Development | [원본](http://blog.doortts.com/229)\n\n어느덧 11월 말이 되었습니다. dW 리뷰를 하는 입장에서 이번 달은 살짝 기분이 좋습니다. 왜냐하면 모처럼 dW 아티클도 많은 달이었고, 무엇보다 어렵지 않으면서도 딱 필요한 이야기들이 많이 실렸었기 때문입니다. 그중에서도 HTML5가 조명을 받으면서 함께 관심을 받은 기술 중에 WebSocket이라는 기술이 있는데, 마침 저도 관심있던 분야라 더 좋았습니다. :)\n\n웹 세상의 근간을 이루는 HTTP 통신은 사실상 request -> response로 이루어져 있고, 기본적으로 stateless 통신입니다. 클라이언트는 오로지 request만 할 수 있고, 서버는 오로지 reponse만 할 수 있다는 한계는 여러가지 제약을 만들어 냅니다. 그 제약을 넘어서기 위한 노력에 대한 이야기 입니다. 실시간으로 반응하는 리얼타임 웹 애플리케이션에 흥미가 있다면 매우 즐겁게 읽을 수 있는 글입니다.\n\n\n\n**Reverse Ajax, 파트 1: Comet 소개**\n\n[http://www.ibm.com/developerworks/kr/library/wa-reverseajax1/](http://www.ibm.com/developerworks/kr/library/wa-reverseajax1/index.html   \"[http://www.ibm.com/developerworks/kr/library/wa-reverseajax1/index.html ]로 이동합니다.\")\n\n**Reverse Ajax, 파트 2: WebSocket**\n(몇 가지 서버 제한조건은 있지만) 강력한 솔루션\n\n[http://www.ibm.com/developerworks/kr/library/wa-reverseajax2/](http://www.ibm.com/developerworks/kr/library/wa-reverseajax2/index.html \"[http://www.ibm.com/developerworks/kr/library/wa-reverseajax2/index.html]로 이동합니다.\")\n\n\n\n**파트1에서 알아 둘 내용**\n- polling\n- piggyback  polling\n- Comet (long polling & Streaming mode)\n\n**파트2에서 알아 둘 내용 **\n-  WebSocket\n\n- FlashSocket\n\n- 스레딩 및 비블로킹 I/O\n\n아직 웹소켓의 응용이 많이 이루어지고 있지는 않지만, 향후 많은 곳에서 응용가능하게 될 기술이라 생각합니다. : )\n\n "
  },
  {
    "id": 230,
    "title": "[dW Review] DB서버에 SSD를 쓰면 어떨까?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1322604060000,
    "body": "> doortts | 2011-11-29 화요일 오전 3:1 | Better SW Development | [원본](http://blog.doortts.com/230)\n\nSSD(Solid State Drive)가 보편화되면서 서버 시장에서 HDD를 SSD로 교체하는 분위기가 있다. 특히나 데이터를 다루는 DB서버의 디스크를 SSD로 바꿈으로써 성능상의 이점을 취하는 방식이다. 이와 관련된 IBM dW기사가 있다.\n\n우선 먼저 리뷰라고 함은 해당 리뷰를 읽는 이에게 도움이 되어야 한다는 측면에서 이야기 해 본다면, 아래 dW링크는 읽지 말거나, 아니면 읽더라도 그냥 가볍게 훑어 보길 바란다. 왜냐하면 정독해 읽기 거북할 정도로 번역이 별로였고, DBA가 아닌 일반 개발자가 보기엔 내용이 Geek스럽기 때문이다. 피곤하고 시간이 아깝다. : (\n\n\n\n**SSD(Solid-State Drive): 데이터 세상 바꾸기**\n[http://www.ibm.com/developerworks/kr/data/library/dmmag/DMMag_2011_Issue3/Storage/index.html](http://www.ibm.com/developerworks/kr/data/library/dmmag/DMMag_2011_Issue3/Storage/index.html?ca=drs-)  \n\n\n\n그냥 정리해서 이야기 하면 이렇다.\n\n\n\nDB서버에 SSD를 쓰면 좋다. 혹여, 크게 좋아지거나 눈에 띄는 향상이 없다 하더라도 HDD나 FC(Fibre Channel) 드라이브보다는 나을 것이다. 그러니 쓸수 있으면 쓰자. 단, SSD를 쓴다면 DBA들도 DBMS관리 전략에 변화를 주어야 할 것이다. IO비용을 낮추기 위해 썼던 방법들이 크게 영향을 주지 않게 변할 수 있기 때문이다.\n\n\n\n끝. :)"
  },
  {
    "id": 231,
    "title": "[dW Review] 이클립스는 어떻게 배워야 할까?",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1322660640000,
    "body": "> doortts | 2011-11-30 수요일 오전 2:1 | Better SW Development | [원본](http://blog.doortts.com/231)\n\n자바 개발자라면 늘 가까이 하는 개발도구로 뭘 뽑겠는가? 몇몇은 vim을 뽑겠지만(이런 긱들!!) 대다수는 이클리스를 꼽을 것이다. 나 같은 경우는 언제부터 쓰기 시작했는지 가물가물할 만큼 예전부터 썼기 때문에, 그리고 새로운 버전이 나올때마다 맨 처음 하는 일은 \"New and Noteworthy\"를 보는 일이라 새로 생긴 유용한 기능들을 편하게 쓰는 편이다.\n\n하지만 지금 새로 이클립스를 접하는 개발자라면, 아마 지금 내가 비쥬얼스트디오 2010을 실행해서 화면을 보는 것과 비슷한 '막막함'을 느끼지 않을까 싶다. 어찌어찌 쓰긴 하더라도 아는게 뭔지 모르는게 뭔지도 잘 모르고 일부분만 쓰게 될 것 같다.\n\n대학생들이 개발하면서 많이 사는 책이 \"자바 세상을 덮친 이클립스\"라는 책이라 들었다.\n\n![eclipse.jpg](/files/21902)\n\n예전에 서점에 훑어 봤는데, 3판이라는 부제에 걸맞게 잘 쓰여져 있었던 걸로 기억한다. 여유가 된다면 사서 옆에 놓고 틈날때마다 조금씩 보는 것도 좋을 것 같다. 다만, 개발을 해야 하는데 개발 도구 책을 보고 있는 데는 한계가 있기 마련이고, 설사 옆에 있다 하더라도 생각만큼 잘 안보게 되는 것이 현실인것 같다.\n\n앞에서도 이야기 했지만, 매번 이클립스가 새버전이 출시되면 바뀐 부분을 요약해서 알려주는 페이지가 \"New and Noteworthy\"이다.\n\n\n\n**이클립스 3.7 인디고의 New and Noteworthy**\n[http://download.eclipse.org/eclipse/downloads/drops/R-3.7-201106131736/eclipse-news.html](http://download.eclipse.org/eclipse/downloads/drops/R-3.7-201106131736/eclipse-news.html)  \n\n\n\n매 출시때마다 한 번씩 봐두면, 장담컨데 확실히 도움이 될 거다. 뭐하는데? 개발시간 줄여주는데! :)\n\n이번달 IBM dW기사로는 다소 옛날버전인 3.4의 JDT기능들에 대한 이야기가 나오는데, 아마 대부분의 개발자들은 해당 기능이 있었는지 잘 몰랐던 부분이 많지 않을까 생각한다.\n\n\n\n**Eclipse V3.4 완전 정복, Part 3: JDT 텍스트 편집기 팁과 비결**\n[http://www.ibm.com/developerworks/kr/library/os-eclipse-master3/](http://www.ibm.com/developerworks/kr/library/os-eclipse-master3/) \n\n\n\n책만은 못하겠지만, 봐두면 도움이 되는 좋은 팁들이 많이 들어있다. : )",
    "attachments": [
      {
        "id": 21902,
        "name": "eclipse.jpg",
        "hash": "b8c8424ad5c3e63d75c97dcf8e0e8c5168b46028",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 22308,
        "containerId": "12387"
      }
    ]
  },
  {
    "id": 232,
    "title": "[node.js 따라배우기 05] 인증과 세션, 접근제어 미들웨어",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1323101516000,
    "body": "> doortts | 2011-12-06 화요일 오전 1:11 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/232)\n\n\n\n휴우~ 이번엔 조금 텀이 길었죠? 그래도 중간중간 많은 일들이 있었답니다. : ) \n\n번역도 스터디 맴버분들과 함께 하기 시작했고요, 이런저런 도움도 많이 받고 있습니다. 그리고 꽤 기대해도 좋으실 자료가 곧 공개될 예정입니다. (두둥!) 참! 그리고 이번 파트5는 번역부터 했기 때문에 우선 내용을 공개한 뒤에 계속 조금씩 수정될 것 같습니다. 그리고 파트6도 곧바로 공개될 예정입니다. \n\n여러가지로 기대해 주세요! (/^_^)/~\n\n\n\n원문 페이지: [http://dailyjs.com/2010/12/06/node-tutorial-5/](http://dailyjs.com/2010/12/06/node-tutorial-5/ \"[http://dailyjs.com/2010/12/06/node-tutorial-5/]로 이동합니다.\")\n\n \"Webapp을 만들어 봅시다! Nodepad\" 파트4에 오신걸 환영합니다. 본 시리즈는 \"Node.js\"를 이용해서 웹 애플리케이션(이하 웹앱)을 만들어보는 따라배우기(tutorial)시리즈입니다. node.js를 이용해서 웹앱을 만드는 과정을 따라가면서, 자신만의 애플리케이션을 만들 때 접하게 될 모든 영역을 다룰 예정입니다. \n\n\n\n**[Part 1: 소개](http://blog.doortts.com/207 \"[http://blog.doortts.com/207]로 이동합니다.\")** (Introduction)\n\n**[Part 2: 설치와 애플리케이션 뼈대 만들기](http://blog.doortts.com/209 \"[http://blog.doortts.com/209]로 이동합니다.\")** (Installation and Skeleton App)\n\n**[Part 3: RESTful 메소드와 테스트](http://blog.doortts.com/215 \"[http://blog.doortts.com/215]로 이동합니다.\")** (RESTful Methods and Testing)\n\n[Part 4: 템플릿, 파셜, 그리고 문서 생성과 수정](http://blog.doortts.com/224 \"[http://blog.doortts.com/224]로 이동합니다.\")(Templates, Partials, Creating and Editing Documents)\n\n\n\n컴퓨터가 mongo 데몬을 자동으로 띄우지 않는다면 이번 튜터리얼을 시작하기 전에 띄우는 것을 잊지 마세요.\n\n**인증(Authentication)**\n\n우리는 서비스가 가능한 앱을 만들었습니다. 하지만, 어떤 종류가 되었든 인증시스템이 없다면 쓸 수 없습니다. 대부분의 제품화된 시스템과 클라이언트 프로젝트들은 인증이 필요합니다. 그리고 OpenID와 OAuth같은 흥미로운 시스템들이 있지만, 대부분의 상업 프로젝트들은 자신만의 로그인 시스템을 갖는걸 선호합니다.\n\n보통은 세션으로 이 부분을 처리합니다.\n\n\n\n*   어떤 유저가 유저이름과 패스워드를 입력합니다.\n*   해당 패스워드는 해싱 알고리즘과 소금으로 암호화됩니다. (소금? 하하하!)\n*   암호화된 값을 데이터베이스의 사용자 레코드의 값과 비교합니다.\n*   일치하면, 해당 유저를 확인해주는 세션키가 생성됩니다.\n\n\n\n우리는 사용자들과 세션들을 관리하기 위해 다음과 같은 것들이 필요합니다.\n\n *   데이터베이스에 들어있는 유저들(=유저정보)\n*   로그인한 유저의 아이디를 저장할 수 있는 세션들\n*   패스워드 암호화\n*   유저 로그인이 필요한 경로에 접근을 제한할 방법 \n\n**익스프레스(Express)에서의 세션들**\n\n익스프레스는 데이터 저장 매커니즘으로 지원받는 Connect 세션 미들웨어에 의존합니다. 메모리기반을 비롯하여 connect-redis, connect-mongodb를 포함한 서드파티 저장소들이 존재한다. 대안적인 옵션은 cookie-sessions인데 사용자의 쿠키안에 세션데이터를 저장합니다.\n\n세션은 다음처럼 설정가능합니다.\n\n \n\napp.use(express.cookieDecoder());\n\napp.use(express.session()); \n\n\n\n \n\n설정 할 때는 이런 설정 옵션들을 정확한 곳에 위치시키는 것이 중요합니다. 그렇지 않으면 세션 변수들이 요청 객체 안에 생기지 않습니다. 저는 설정을 bodyDecoder와 methodOverride 사이에 두었습니다. 전체 소스는 GitHub를 참조하세요.\n\n이제 우리의 HTTP 응답자는 req.session 에 접근할 수 있을겁니다.\n\n \n\napp.get('/item', function(req, res) {\n\n  req.session.message = 'Hello World';\n\n});\n\n \n\n**MongoDB 세션들**\n\nnpm install connect-mongodb를 이용해서 [connect-mongodb](https://github.com/masylum/connect-mongodb \"[https://github.com/masylum/connect-mongodb]로 이동합니다.\") 을 설치하세요. connect-mongodb는 다른 세션 스토어(store)와 비슷하게 동작합니다. 애플리케이션 설정하는 동안에 커넥션에 대한 상세한 부분을 구체화 할 필요가 있습니다.\n\n\n\n\n\napp.configure('development', **function**() {\n\n  app.set('db-uri', 'mongodb://localhost/nodepad-development');\n\n});\n\n \n\n**var** db = mongoose.connect(app.set('db-uri'));\n\n \n\n**function** mongoStoreConnectionArgs() {\n\n **return** { dbname: db.db.databaseName,\n\n           host: db.db.serverConfig.host,\n\n           port: db.db.serverConfig.port,\n\n           username: db.uri.username,\n\n           password: db.uri.password };\n\n}\n\n \n\napp.use(express.session({\n\n  store: mongoStore(mongoStoreConnectionArgs())\n\n}));\n\n\n\n\n\n만약 API 작성자가 연결 옵션에 대한 표준 포맷을 결정할 수 있다면 이 코드의 대부분은 필요치 않게 될 겁니다. 저는 몽구스(Mongoose)로부터 연결에 대한 상세한 부분들을 추출해 내는 함수를 작성했습니다. 본 예제에서, db는 몽구스 커넥션 인스턴스를 담고 있습니다. 몽구스는 URI들을 통해 제공되어야 하는 커넥션 상세정보를 기대합니다. 그리고 저는 그 방식을 좋아하는데요, 왜냐하면 포맷을 기억하기 쉽기 때문입니다. 저는 app.set을 사용해서 환경에 따른 연결 문자열을 저장해왔습니다.\n\n익스프레스 애플리케이션들을 작성할 때 app.set('name', 'value')을 사용하는 건 좋은 생각입니다. 설정 정보에 접근하는 데는 app.get 보다는 app.set('name') 이 사용된다는 것만 기억하세요.\n\n이제는 몽고 콘솔에서 db.sessions.find() 를 실행하면 생성된 세션들이 리턴 될 것입니다.\n\n**접근 제어 미들웨어**\n\n익스프레스는 로그인 유저들에게 접근을 제어하는 우아한 방법을 제공합니다. HTTP 핸들러들이 정의 될 때, 추가적인 라우트 미들웨어 파라미터들이 지정될 수 있습니다.\n\n\n\n\n\n**function** loadUser(req, res, next) {\n\n **if** (req.session.user_id) {\n\nUser.findById(req.session.user_id, **function**(user) {\n\n **if** (user) {\n\n        req.currentUser = user;\n\n        next();\n\n} **else** {\n\n        res.redirect('/sessions/new');\n\n      }\n\n    });\n\n} **else** {\n\n    res.redirect('/sessions/new');\n\n  }\n\n}\n\n \n\napp.get('/documents.:format?', loadUser, function(req, res) {\n\n  // ...\n\n});\n\n\n\n\n\n이제 로그인 유저가 필요한 모든 경로에 loadUser 를 추가함으로써 해당 경로의 접근 처리를 할 수 있게 되었습니다. 미들웨어 그 자체는 평범한 경로 파라미터들과, 또한 next를 갖습니다. (next는 특정 로직에 기반한 경로 핸들러를 실행하는데 사용될 수 있습니다.) 우리 프로젝트에서 한 유저는 세션에서 user_id 를 사용해 읽어들입니다. 만약 유저가 간단하게 next 호출로 찾아지지 않을 경우 브라우저가 로그인 화면으로 리다이렉트 됩니다.\n\n** RESTful 세션 모델링**\n\n저는 문서들과 비슷한 방식으로 세션들을 모델링 했습니다. new, create, 그리고 delete 경로가 있습니다.\n\n \n\n // 세션들\n\napp.get('/sessions/new', function(req, res) {\n\n  res.render('sessions/new.jade', {\n\n    locals: { user: new User() }\n\n  });\n\n});\n\n \n\napp.post('/sessions', function(req, res) {\n\n  // 유저를 찾아서 현재 유저 세션 변수에 세팅한다.\n\n});\n\n \n\napp.del('/sessions', loadUser, function(req, res) {\n\n  // 세션 제거\n\n  if (req.session) {\n\n    req.session.destroy(function() {});\n\n  }\n\n  res.redirect('/sessions/new');\n\n});\n\n \n\n**유저 모델(User Model)**\n\nUser 모델은 Document 모델보다 좀 더 복잡합니다. 왜냐하면 인증 관련 코드들을 포함해야 하기 때문입니다. 제가 사용한 전략은 이렇습니다. (아마도 이전에 OO 웹 프레임워크들에서 본적이 있으실 겁니다)\n\n *   패스워드들은 (더 짜지게) 소금(salt)을 곁들여 암호화된 포맷으로 저장된다.\n*   인증은 데이터베이스에 있는 해당 유저의 암호와 암호화된 평문 암호를 서로 비교하는 걸로 처리한다.\n*   ‘가상’의 password  속성은 등록 편의와 로그인 폼을 위해 평문 패스워드를 드러낸다.\n*   이 속성은 저장하기 전에 해당 패스워드를 자동으로 암호화하는 셋터(setter)를 가진다.\n*   각각의 이메일 주소가 오직 한 명의 사용자를 위해 쓰이는 걸 확실히 하기 위해 유니크 인덱스를 사용한다.\n*   패스워드 암호는 Node의 기본 암호 라이브러리를 사용한다. \n\n  \n\n \n\nvar crypto = require('crypto');\n \n\nmongoose.model('User', {\n\n  methods: {\n\n    encryptPassword: **function**(password) {\n\n      return crypto.createHmac('sha1', this.salt).update(password).digest('hex');\n\n    }\n\n  }\n\n});\n\n \n\nencryptPassword 는 소금을 곁들여 sha-1 해시처리된 패스워드 인스턴스 메소드이다. 이때의 소금은 패스워드 셋터에서 패스워드를 암호화하기 전에 생성된다.\n\n\n\n\n\nmongoose.model('User', {\n\n  // ...\n\n \n\n  setters: {\n\n    password: **function**(password) {\n\n      this._password = password;\n\n      this.salt = this.makeSalt();\n\n      this.hashed_password = this.encryptPassword(password);\n\n    }\n\n  },\n\n \n\n  methods: {\n\n    authenticate: **function**(plainText) {\n\n      return this.encryptPassword(plainText) === this.hashed_password;\n\n    },\n\n \n\n    makeSalt: **function**() {\n\n      return Math.round((new Date().valueOf() * Math.random())) + '';\n\n    },\n\n \n\n    // ...\n\n\n\n\n\n소금은 원하는 뭐든 될 수 있는데, 저는 여기서 상당히 랜덤한 문자열을 생성해냈습니다.\n\n(이크!! ‘소금’이 너무 많이 나와서 농담이 지루해 지려고 하네요 -_- 옮긴이 주)\n\n**사용자 저장과 등록**\n\n몽구스는 레코드들이 저장될 때 save  메소드 오버라이드를 이용해서 해당 작업들을 편하게 해줍니다.\n\n \n\nmongoose.model('User', {\n\n  // ...\n\n  methods: {\n\n    // ...\n\n \n\n    save: function(okFn, failedFn) {\n\n      if (this.isValid()) {\n\n        this.__super__(okFn);\n\n      } else {\n\n        failedFn();\n\n      }\n\n    }\n\n \n\n    // ...\n\n \n\n저는 실패한 저장 메소드를 허용하기 위해 save 를 오버라이드 해왔습니다. 이렇게하면 실패한 등록의 처리도 좀 더 간단해집니다.\n\n \n\napp.post('/users.:format?', function(req, res) {\n\n  var user = new User(req.body.user);\n\n \n\n  **function** userSaved() {\n\n    switch (req.params.format) {\n\n      case 'json':\n\n        res.send(user.__doc);\n\n      break;\n\n \n\n      default:\n\n        req.session.user_id = user.id;\n\n        res.redirect('/documents');\n\n    }\n\n  }\n\n \n\n  **function** userSaveFailed() {\n\n    res.render('users/new.jade', {\n\n      locals: { user: user }\n\n    });\n\n  }\n\n \n\n  user.save(userSaved, userSaveFailed);\n\n});\n\n \n\n지금 당장은 아무런 에러 메시지도 표시되지 않습니다. 다른 튜터리얼에서 해당내용을 처리할 예정입니다. 사실 이런식의 유효성검증 은 꽤 바보 같겠지만, 본 애플리케이션에서 인덱스는 매우 중요합니다.\n\n \n\nmongoose.model('User', {\n\n  // ...\n\n \n\n  indexes: [\n\n    [{ email: 1 }, { unique: true }]\n\n  ],\n\n \n\n  // ...\n\n});\n\n \n\n이렇게 하면 유저가 중복으로 저장되는 것을 방지할 겁니다. 포맷은 [MongoDB의 ensureIndex](http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes \"[http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes]로 이동합니다.\")와 동일합니다. \n\n**결론**\n\n이제 우리는 다음과 같은 것을 가지게 되었습니다.\n\n\n\n*   MongoDB 세션들\n*   sha1 패스워드 암호를 지원하는 User 모델\n*   문서 접근 제어용 라우팅 미들웨어\n*   유저 등록과 로그인\n*   세션 관리\n*   저는 기본적인 로그인 폼을 포함하도록 Jade 템플릿을 업데이트했습니다.\n\n\n\n  \n\n하지만 그럼에도 몇몇 빠뜨린 것들이 있습니다.\n\n\n\n*   문서 소유자 계정에 대한 처리는 고려하고 있지 않다\n*   테스트가 적절하게 동작하지 않는다. Expresso 테스트에서 세션을 다루는 방법을 이해하는데 어려움을 겪고 있기 때문입니다.\n\n\n\n이것들에 대해서는 향후 튜터리얼 시리즈에서 다룰 예정입니다."
  },
  {
    "id": 233,
    "title": "[node.js 따라배우기 06] 인터페이스 기본 (Interface Basics)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1323312556000,
    "body": "> doortts | 2011-12-06 화요일 오후 5:11 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/233)\n\n 이번 번역은 함께 Octoberskyjs 스터디를 진행하고 있는 김주회님([@ByJuhoi](http://twitter.com/ByJuhoi \"[http://twitter.com/ByJuhoi]로 이동합니다.\") )께서 수고해 주셨습니다. : )\n\n\n“웹 앱(Web App)을 만들어 봅시다” 파트6에 오신걸 환영합니다. 본 시리즈는 [Node](http://nodejs.org/)를 사용하여 웹 앱을 만들어 보는 튜토리얼(tutorial)입니다. 이 시리즈는 자기만의 어플리케이션을 만들 때 직면하게 될 모든 부분들을 당신에게 알려줄 것입니다. 이 튜터리얼들은 [lmawa](http://dailyjs.com/tags.html#lmawa)  링크에 있습니다. [](https://github.com/alexyoung/nodepad/tree/03fe9b272fea1beb98ffefcf5f7ed226c81c49fd)\n\n\n\n**[Part 1: 소개](http://blog.doortts.com/207 \"[http://blog.doortts.com/207]로 이동합니다.\")** (Introduction)\n\n**[Part 2: 설치와 애플리케이션 뼈대 만들기](http://blog.doortts.com/209 \"[http://blog.doortts.com/209]로 이동합니다.\")** (Installation and Skeleton App)\n\n**[Part 3: RESTful 메소드와 테스트](http://blog.doortts.com/215 \"[http://blog.doortts.com/215]로 이동합니다.\")** (RESTful Methods and Testing)\n\n[Part 4: 템플릿, 파셜, 그리고 문서 생성과 수정](http://blog.doortts.com/224 \"[http://blog.doortts.com/224]로 이동합니다.\")(Templates, Partials, Creating and Editing Documents)\n\n**[Part 5: 인증과 세션, 접근제어 미들웨어](http://blog.doortts.com/232 \"[http://blog.doortts.com/232]로 이동합니다.\")** (Authentication, Sessions, Access Control Middleware)\n\n\n\n컴퓨터 시작 시 mongo 데몬이 자동으로 실행되는 것이 아니라면 이 튜터리얼을 시작하기 전에 실행시키기 바랍니다.\n\n우리는 이전 파트에서 인증과 세션에 대해서 살펴봤습니다. 특히 원활한 접근 제어를 만들기 위해 미들웨어라는 멋진 개념을 사용했습니다. 이번 주에는 jQuery를 사용하여 더욱 재미있는 인터페이스를 만드는 법을 설명할 것입니다.\n\n \n\n**인터페이스 디자인**\n\n저는 앱을 개발하기 전 인터페이스를 설계할 때 보통은 개략적인 아이디어로 계획을 세웁니다. 이것이 일반적으로 알려진 탑-다운 방식의 설계입니다. 우선 그 인터페이스가 작동할 것 같으면 그 다음에 간단한 인터페이스와 테스트에 대한 API를 개발합니다. 지금까지 우리가 이 튜토리얼 시리즈에서 해왔던 것처럼 말입니다.\n\n저는 모눈종이와 샤프펜슬 그리고 좋은 지우개를 가지고 인터페이스에 대해 스케치하는 것을 좋아합니다. 제가 계속 개략적으로 스케치를 하다 보니 저의 동료들은 그것이 설계가 끝나지 않았다는 것을 알고 있습니다. 그 스케치는 우리가 그 프로젝트에 대해 토의하면서 발전하게 될 아이디어들입니다.\n\n[nodepad-sketch.jpg](/files/21903)\n\n\n간략히 스케치한 Nodepad는 다음 사항들을 제시하고 있습니다. \n\n\n\n*   인터페이스는 마치 데스크탑의 어플리케이션처럼 두 개의 패널이 있고 하나는 노트의 목록을, 다른 하나는 노트의 내용을 위해서 사용됩니다.\n*   저장 버튼이 하단에 있긴 하지만 자동-저장 기능이 더 좋을 것입니다.\n*   노트를 한번 클릭하면 내용을 읽어오고, 더블-클릭하면 제목을 수정할 수 있게 합니다.\n*   이메일과 비밀번호를 변경하기 위해서 계정설정(account setting)이 필요합니다.\n*   우리는 이미 JSON을 지원하기 때문에 편집할 때 XMLHttpRequest를 사용할 수 있습니다.\n\n\n\n \n\n**속임수(Cheating)**  인터페이스를 설계할 때 가장 중요한 것 중 하나는 가능한 많이 속이는 것입니다. 저는 프로그래밍을 할 때 이미 잘 짜여진 라이브러리가 있는데 같은 기능을 구현하기 위한 코드를 작성하기 위해 시간을 소비하지 않습니다. 설계 또한 마찬가지라고 할 수 있습니다. 필요한 모든 아이콘을 그릴 필요는 없으며, 또한 레이아웃에도 쓸데없는 시간을 소비할 필요가 없습니다.\n\n요즘은 CSS 프레임워크부터 [Cappuccino](http://cappuccino.org/ \"[http://cappuccino.org/]로 이동합니다.\") 같은 무거운 GUI 프로젝트까지 사용 가능한 많은 솔루션들이 있습니다. 우리는 Nodepad를 만들기 위해 가장 많이 쓰이고 있는 [jQuery UI](http://jqueryui.com/ \"[http://jqueryui.com/]로 이동합니다.\")를 사용할 것입니다. 그것은 견고한 테마와 결합했을 때 더 큰 효과가 있을 것입니다.\n\n테마로는 [Aristo](http://taitems.tumblr.com/post/482577430/introducing-aristo-a-jquery-ui-theme \"[http://taitems.tumblr.com/post/482577430/introducing-aristo-a-jquery-ui-theme]로 이동합니다.\") ([demo](http://www.warfuric.com/taitems/demo.html \"[http://www.warfuric.com/taitems/demo.html]로 이동합니다.\"))를 사용하기로 결정했습니다. 그것이 꼭 최고의 테마라고는 할 수 없지만, 많이 사용해 봤고 꽤 괜찮아 보인다는 생각이 듭니다.\n\n**Aristo와 jQuery UI를 포함시키기**\n\n[Github에서 Aristo](https://github.com/taitems/Aristo-jQuery-UI-Theme \"[https://github.com/taitems/Aristo-jQuery-UI-Theme]로 이동합니다.\")를 다운로드하여 public/stylesheets/aristo 에 놓습니다. 그리고 나서 views/layout.jade 템플릿에서 jQuery UI와 새로운 stylesheet를 읽어오기만 하면 됩니다:\n\n\n\n\n\n```\n\n link(rel='stylesheet',  href='/stylesheets/aristo/jquery-ui-1.8.5.custom.css')\n script(type='text/javascript',  src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js')\n\n```\n\n\n\n\n\n**페이지 구조**\n\n우리의 인터페이스는 두 개의 컬럼과 헤더, 편집을 위한 문서의 몸통 부분 그리고 문서를 관리하기 위한 몇몇 버튼들이 필요합니다. Jade에서는 다음과 같습니다.\n\n\n\n\n\n```\ndiv(class='outline-view',  id='left')\n   div(id='DocumentTitles')\n     ul(id='document-list')\n       -  for  (var  d  in  documents)\n         li\n           a(id='document-title-'  +  documents[d].id,  href='/documents/'  +  documents[d].id)\n             =documents[d].title\n\n   ul(class='toolbar')\n     li\n       a(href='/documents/new')\n         +\n     li\n       a(href='#',  id='delete-document')\n         -\n\n div(class='content-divider')\n\n div(class='content')\n   div(id='editor-container')\n     textarea(name='d[data]',  id='editor')\n       =d.data  ||  ''\n\n ul(id='controls',class='toolbar')\n   li\n     a(href='#',  id='save-button')  Save\n```\n\n\n\n\n\n처음 부분에서 outline-view는 문서의 목록을 포함하는 div입니다. 이것은 전에도 본 적이 있는 코드입니다. 이것들을 absolute로 위치시켰고 문서 목록과 버튼 툴바의 사이즈를 조절하기 위해서 resize와 focus라는 JavaScript를 사용합니다.\n\n선택된 문서는 CSS gradient를 사용하여 보여줍니다.\n\n브라우저가 CSS3 gradient를 지원하지 않아도 상관 없습니다. 다만 좀 어두운 색으로 보여줄 뿐 괜찮게 보일 것입니다.\n\n\n\n```\n.outline-view  ul  .selected  {\n   color:  #fff;\n   background-color:  #8897ba;\n   background:  -webkit-gradient(linear,  left  top,  left  bottom,  from(#b2bed7),  to(#8897ba));\n   background:  -moz-linear-gradient(top,   #b2bed7,   #8897ba);\n }\n```\n\n\n\n**문서 선택하기**\n\n우리의 API는 JSON 데이터를 돌려 받기 위해 URL에 .json 을 추가하여 다시 호출합니다. 우리는 서버로부터 문서를 읽어오기 위해 몇몇의 간단한 jQuery 이벤트 핸들링만을 사용합니다.\n\n\n\n\n\n```\n$('#document-list li a').live('click',  function(e)  {\n   var  li  =  $(this);\n\n   $.get(this.href  +  '.json',  function(data)  {\n     $('#document-list .selected').removeClass('selected');\n     li.addClass('selected');\n     $('#editor').val(data.data);\n     $('#editor').focus();\n   });\n\n   e.preventDefault();\n });\n\n```\n\n\n\n이것은 문서 제목이 클릭 됐을 경우 실행하게 될 클릭 핸들러를 바인드한 것입니다. JSON 응답으로부터 받은 data 값이 txetarea에 채워집니다. 일반적인 이벤트에 비해서 live는 문서 목록이 변경되는 경우에 위임을 설정하기 위해 사용되곤 합니다.\n \n\n\n\n**문서 저장**\n\n저는 동적인 인터페이스를 만들 때 간단한 명명 규칙을 사용하여 데이터베이스 ID를 기반으로 id 속성을 설정하는 것을 좋아합니다. Nodepad에서는 DOM id를 다음과 같이 사용합니다: document-844ce17994ba1b87d359000001\\. 데이터베이스 ID를 찾으려면 쉽게 하이픈(-)으로 분할하여 마지막 부분을 가져오면 됩니다.\n\n규칙이 정해지면 아주 소량의 jQuery 플러그인을 사용해서 아이템의 ID를 추출할 수 있습니다.\n\n\n\n\n\n```\n$.fn.itemID  =  function()  {\n   try  {\n     var  items  =  $(this).attr('id').split('-');\n     return  items[items.length  -  1];\n   }  catch  (exception)  {\n     return  null;\n   }\n };\n\n```\n\n\n\n### 이것은 저장 버튼이 눌렸을 때 아주 간단히 문서를 저장하게 합니다.\n\n\n\n```\n$('#save-button').click(function()  {\n   var  id  =  $('#document-list .selected').itemID(),\n       params  =  {  d:  {  data:  $('#editor').val(),  id:  id  }  };\n   $.put('/documents/'  +  id  +  '.json',  params,  function(data)  {\n     // Saved, will return JSON\n   });\n\n```\n\n\n\n### 사실상 jQuery에는 put에 대한 HTTP 동사가 없기 때문에 다음과 같이 정의했습니다.\n\n\n\n```\n$.put  =  function(url,  data,  success)  {\n   data._method  =  'PUT';\n   $.post(url,  data,  success,  'json');\n };\n\n```\n\n\n\n###   \n\n\n\n**진행사항**\n\n사실 지금까지 어떤 jQuery UI도 사용하지는 않았지만 다음 파트에서는 다루게 될 것입니다. 지금까지 우리는 좀 더 친숙하고 쓸만해 보이기 시작하는 간단하고 작은 에디터를 만들었습니다.\n\n아직 브라우저 테스트 할 시간이 없어서 Webkit 이나 Firefox에만 충실했습니다.\n\nNodepad 최근 커밋은 [dd40b](https://github.com/alexyoung/nodepad/tree/dd40b5917bf1e59597395425941cc74607110791 \"[https://github.com/alexyoung/nodepad/tree/dd40b5917bf1e59597395425941cc74607110791]로 이동합니다.\") 입니다.\n\n업데이트: library, binary 그리고 운영체제에 대하여 테스트한 상세사항을 포함하여 Nodepad README를 변경했습니다. 이것은 문제가 발생하는 사람들에게 도움이 될 것입니다.",
    "attachments": [
      {
        "id": 21903,
        "name": "nodepad-sketch.jpg",
        "hash": "a1bcbf6a320413672f1a79b9a3f297d55458ffa2",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 89668,
        "containerId": "12390"
      }
    ]
  },
  {
    "id": 234,
    "title": "현재 제 블로그에서 발행된 글 중에서 구글리더로 제대로 읽히지 않는 글들이 있습니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1323338027000,
    "body": "> doortts | 2011-12-08 목요일 오후 4:1 | 이생각 저생각 | [원본](http://blog.doortts.com/234)\n\n현재 제 블로그에서 발행된 글 중에서 구글리더에서 제대로 구독되지 않는 글들이 있다는 걸 알게 되었습니다.\n원인을 찾고 있습니다만, 잘 모르겠네요. :(\n\n문제를 해결하면 이야기 드리겠습니다.\n\n그 때까진, 가끔씩 블로그를 직접 방문해 주세요. (이번 기회에 연말연시 덧글도!!)\n\n어찌되었든간에, 불편을 끼쳐드려 죄송합니다....\n\n...만, 한편으론 문득 의외로 '이것도 나쁘진 않지 않나?'라는 괴상한 생각도 드네요. :D\n\n ps. 아! 생각해 보니 이 글도 발행이 안되면 정작 구독자들은 알 수가 없겠군요!\n\n#### Comments\n\n구글리더 에서 보고 왔습니다.^^\n\n [sangpire](http://blog.sangpire.pe.kr) | 2011-12-11 일요일 오전 2:14\n\n--\n\n되다 안되다 해서 뭔가 확인해 보고 있는데요, 전문 공개할때, FEED 하나의 사이즈가 일정크기 이상으로 커질 때 문제가 발생하는 것으로 보입니다. : )\n\n [doortts](http://blog.doortts.com) | 2011-12-12 월요일 오후 1:39\n\n--\n"
  },
  {
    "id": 235,
    "title": "새 프로젝트(nFORGE)에 합류 그리고 첫 번째 회고",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1323878185000,
    "body": "> doortts | 2011-12-15 목요일 오전 12:56 | 이생각 저생각 | [원본](http://blog.doortts.com/235)\n\n \n\n**#1\\. 새 프로젝트에 합류했습니다. :)**\n\n저는 최근 [nFORGE](http://dev.naver.com/projects/nforge \"[http://dev.naver.com/projects/nforge]로 이동합니다.\")라는 프로젝트에 합류했습니다. 이제 갓 2주 되었네요.  \n\nnFORGE가 뭐하는 프로젝트냐? 하실텐데요, 간단히 말하면 Trac, Redmine같은 \"협업 개발 플랫폼\"을 만드는 프로젝트입니다. 오픈소스 프로젝트이고요, 제품 자체는 PHP로 만들어져 있습니다. 현재 주요 기능으로는 프로젝트 문서화, 코드 저장소와 연동을 통한 이슈관리, 코드리뷰기능, 마일스톤 관리 등이 있습니다. 설치형도 제공하기 때문에 기업이나 조직에서 가져다가 나름의 개발센터를 구축할 수도 있습니다.\n \n\n지난 월요일에 3.2버전을 릴리즈 했고, 현재는 마이너 패치 작업을 진행 중입니다만\n\n패치작업이 마무리 되는대로 차기 프로젝트(**N4, 가칭**)가 시작될 예정입니다. 지금도 약간의 진도는 나가 있는 상태입니다만, 어쨌든 제가 합류한 이유는 새롭게 시작하는 프로젝트 새로운 힘이 되기 위해서입니다. \n\n우선 저는 이 팀에서  아키텍트 + 스크럼마스터의 역할을 맡게 되었습니다. 새 맴버로서 좀 더 팀으로서의 모습도 갖추고 nFORGE라는 제품도 좀 더 제품답게 만들기 위해 노력을 기울일 예정입니다. 그리고 오늘은 (합류 후 첫 번째) 프로젝트 회고를 하였습니다. 그 동안 한번도 해본적이 없었기때문에 맴버들이 조금 낯설어 하는 것 같긴 했습니다만, 나름 괜찮은 분위기로 진행되었습니다. 사진도 같이 올려볼까 생각했다가, 몇 가지 이유로 말았습니다. 다음엔 동의를 구하고 한 번 올려보도록 해보겠습니다.\n\n 어쨌든 새로 합류한 저의 목표는 구성원들이 즐겁게 일하면서도 의미있는 결과물을 만들어 내는 것입니다. 그러기 위해 필요한 모든 노력을 기울일 예정입니다. (물론 저도 같이 개발할거고요.:)\n\n \n \n\n**#2\\. 우리 프로젝트는 실패했다.**\n\n회고때 진행했던 내용 중 재미있는것 하나 소개해 드릴게요. 일반적으로 회고때 하는 것(좋았던것/아쉬웠던것/흥미있었던 것)도 하긴 했지만, 저희는 다름과 같은 질문에 대한 내용을 적어보는 시간도 가져 보았습니다.\n\n**\"왜 우리 프로젝트가 결국 실패했나? 그리고 본인이 이 프로젝트를 떠나게 된 이유는?\"**\n\n실제 실패한 것 아니고요, 맴버들도 떠나지 않았습니다. : ) 다만 상황을 가정해 보자는 것이엇습니다. 일명 미래회고(Future Retrospective)입니다. [박준표](https://twitter.com/#!/PyoPark \"[https://twitter.com/#!/PyoPark]로 이동합니다.\")님의 아이디어에서 유래했고요, 개인 욕구를 살펴보기 위해 프로젝트 이탈이유를 적는 부분을 나름 추가해 보았습니다. 말하기 어려운걸 가상상황(!)을 빌미로 슬쩍 적어 볼 수 있는 장치가 되고, 동시에 프로젝트에서의 개인적인 욕구도 좀 더 자세히 살펴볼 수 있는 방법입니다. \n\n아쉬웠던 점에 나오지 않았던 내용들이 좀 더 나왔고요, 자신안에 내재된 이야기를 꺼내 좀 더 이어나가는데 도움이 되었습니다.\n\n  **\n\n#3\\. 실체와 광고?\n 사실 nFORGE 팀은.... 제가 합류해서 이제 4명입니다. 조금 작죠? (^_^) 당분간은 현 인원이 유지될 예정이고요, 내년 봄에 차기 제품인 N4가 출시될 예정입니다. (N4에 대해서는 기술이라던가 방향이라던가에 대해 따로 이야기 할 시간을 가져보겠습니다. 우선 기반언어가 PHP는 아니에요.)\n\n사실 인원만 놓고 보면 팀이라기 보다는 파티(party)에 더 가깝습니다. 그리고 실제 소속은 \"생산성혁신랩\"이라는 랩 소속입니다. 그래도 독립적으로 움직일 예정이라 팀(Team)은 팀입니다. : )\n\n굉장히 작은 팀인 저희가 어떤 모습으로 어떤걸 어떻게 만들어 낼 지 기대해 주세요. :D 중간 중간 광고나 피드백 요청도 드리겠지만, 저도 최대한 내부 정보를 공개하는 방향으로 솔직 재밌는(..엣?) 이야기들 많이 털어놓을 수 있도록 해보겠습니다. \n\n**\n\n#### Comments\n\nnForge 사용자로서 반가운 일이네요 ^_^\n\n [mOer](http://ethdemor.wordpress.com) | 2011-12-15 목요일 오전 9:35\n\n--\n\n쓰고 계시다니 저도 반갑네요~ : )\n\n [doortts](http://blog.doortts.com) | 2011-12-17 토요일 오후 3:13\n\n--\n\n전자정부 표준프레임워크 오픈 커뮤니티 에서도 쓰고 있죠~\n\n 정지범 | 2012-05-24 목요일 오후 1:53\n\n--\n"
  },
  {
    "id": 237,
    "title": "<행사안내> NHN 공개 개발자 교육 \"레거시 코드에서 작업하기 with TDD, 젠킨스 워크샵\"",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1324270730000,
    "body": "> doortts | 2011-12-19 월요일 오후 1:58 | 이생각 저생각 | [원본](http://blog.doortts.com/237)\n\n안녕하세요? 좋은 행사가 있어 안내글 올립니다.  좋은 일도 하고 교육도 받는 NHN 공개 개발자 교육 \"레거시 코드에서 작업하기 with TDD, 젠킨스 워크샵\"이 12월27일 (화)에 진행됩니다. \n\n컨퍼런스나 발표처럼 짧은 시간에 끝내는 것이 아니라 반나절 동안 집중적으로 교육을 진행하는 행사입니다. \n\n강사님들은 해당 분야에서 오랫동안 일해 오신 분들이며 \n기대하셔도 좋을 컨텐트로 구성되어 있습니다. \n\n[http://onoffmix.com/event/4856](http://www.google.com/url?sa=D&q=http://onoffmix.com/event/4856&usg=AFQjCNGutmZWr3_1rU7fOfS74K9sZI62hQ) \n\n이렇게 집중적으로 교육으로 진행되는 경우는 \n흔치 않은 기회이고 또 언제 다시 열릴지 모르는 행사라 생각합니다.\n\n레거시코드를 다루는 방법, 그 안에서 TDD의 활용법 \n그리고 젠킨스(구 허드슨) 서버를 기초부터 플러그인 개발까지 \n현업 담당자 분들의 노하우를 전해듣는 소중한 기회 놓치지 마세요~ \n\n: )"
  },
  {
    "id": 238,
    "title": "[dW Review] 함수형 사고: 결합 및 컴포지션, Part 1",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1325272686000,
    "body": "> doortts | 2011-12-31 토요일 오전 4:18 | Better SW Development | [원본](http://blog.doortts.com/238)\n\n\n\n함수형 언어에 대해서 이야기 하고 있진 않지만, 함수형 사고(thinking)에 대해서 이야기 하는 아티클입니다.\n\n**함수형 사고: 결합 및 컴포지션, Part 1**\n[](http://www.ibm.com/developerworks/kr/library/j-ft5/index.html)[http://www.ibm.com/developerworks/kr/library/j-ft5/index.html](http://www.ibm.com/developerworks/kr/library/j-ft5/index.html \"[http://www.ibm.com/developerworks/kr/library/j-ft5/index.html]로 이동합니다.\")  \n\n\n\n2011년 마지막 달의 IBM dW 리뷰입니다. 아직까지는 조금 뜨드미지근한 함수형 언어에 대한 접근을 다룬 기사입니다. 우선, 아쉬운 점은 번역이 참.... (잠시 묵념)\n\n어려운 내용이 아닌데 어려운 번역때문에 내용이 어려워졌습니다. :(\n\n본문을 읽기전에 다음 몇 가지 안내를 읽고 보시고 읽으시면 조금쯤은 더 나아지길 기원합니다. (응?)\n\n- 우선 이 글에서 이야기 하는 함수형 사고의 특징으로 유도하고 있는 점은 클래스의 목적이자 특징 중 하나인 '상태저장'을 최소화 하기 위한 노력입니다. 클래스를 만들되 필드 변수를 억제하고 오로지 함수의 인자만으로 처리하는 방식입니다. 그러다 보니 예전 C에서 전역상태를 만들지 않기 위해 해야만 했던 인자(argument)로 필요한 정보 넘기기가 이루어집니다. \n그러다 보니 리팩터링 전에는 인자가 하나였던 isFactor가 함수형 사고를 기반으로 리팩터링 했더니 인자 두 개가 되었습니다.  isFactor(int number, int potential_factor)\n\n- 결합이라고 표현하는 내용은 실제 원문은 커플링(coupling)입니다. 번역이 맞긴 한데 현업에서 결합이라고 잘 안쓰기 때문에 오히려 더 어렵게 느껴집니다. 상속을 통한 커플링과 객체를 독립적으로 구성해 놓고 가져다 쓰는 컴포지션(composition)을 대조하는 식으로 리팩터링을 진행합니다.\n\n- 클래스 네트워크라고 표현한 부분은 상속구조에서의 상위 클래스와 하위클래스 사이의 정보 전달을 의미합니다. 이런 구조에서 하위 클래스로의 정보 전달은 따로 '다운스트림'이라고 표현했습니다.\n\n앞에서도 이야기 했지만 간단한 내용인데 번역으로 인해 조금 어렵습니다. 아쉽네요. 그래도 2편을 기대하며 참고 읽어볼만은 합니다. (다만 2편은 그루비 이야기가 나오는데 것도 쫌...)"
  },
  {
    "id": 239,
    "title": "[dW Review] Reverse Ajax, Part 3: 웹 서버와 Socket.IO",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1325294400000,
    "body": "> doortts | 2011-12-31 토요일 오전 4:33 | Better SW Development | [원본](http://blog.doortts.com/239)\n\n\n\n12월 IBM dW 기사중에서 개인적으로 가장 마음에 드는 기사입니다. :D\n사실 12월 IBM dW기사의 절반은 Dojo 이야기인데, 제가 Dojo엔 별 관심이 없다보니, 빼고나면 소개할 만한 글이 몇 개 없습니다.\n\n**Reverse Ajax, Part 3: 웹 서버와 Socket.IO**\n[](http://www.ibm.com/developerworks/kr/library/wa-reverseajax3/index.html)[http://www.ibm.com/developerworks/kr/library/wa-reverseajax3/index.html](http://www.ibm.com/developerworks/kr/library/wa-reverseajax3/index.html \"[http://www.ibm.com/developerworks/kr/library/wa-reverseajax3/index.html]로 이동합니다.\")  \n\n\n\n본 기사는 크게 2가지로 의미를 찾을 수 있습니다. \n\n**첫째는 \"Comet 및 WebSocket용 서버 솔루션\"에 대한 비교표 입니다.**\n톰캣, Jetty, Grizzly 및 Glassfish, JBoss등의 서버들에 대해 각각의 버전별 지원여부를 조사해서 보여줍니다. Jetty가 특히 여러가지로 눈에 띄는데 여튼 신선하기보다는 조사 시간을 많이 줄여주는 좋은 기사입니다. 덤으로 서블릿 3.0의 지원여부도 알려주고 있습니다.\n\n**둘째는 (약간 아이러니 하게도) 참고자료 섹션의 링크들입니다.**\nWebSocket을 비롯하여 리얼타임 웹 서비스 구성을 위한 다양한 참고 자료들이 기재되어 있습니다. 관심있다면 주의깊게 읽어볼만한 (나름 엄선된) 좋은 기사들입니다. 특히 저의 눈을 끌었던 부분은 [Jetty Continuations](http://wiki.eclipse.org/Jetty/Feature/Continuations \"[http://wiki.eclipse.org/Jetty/Feature/Continuations]로 이동합니다.\")에 대한 자료였습니다. 2009년 1월에 제가 Jetty의 Eclipse 프로젝트 안으로 들어갔다는 내용에 대한 소개([http://blog.doortts.com/85](http://blog.doortts.com/85))를 했을때도 이미 기술 수준이 상당했는데 이젠 무시무시하다는 생각까지 듭니다. \n\n여하튼 IT세계엔 배울게 너무 많습니다. 누구 말처럼, 의사보다 학습량이 훨씬 크다는 이야기가 맞는것 같습니다. 일을 하면서도 이렇게 꾸준히 봐야 하니까 말입니다. :)"
  },
  {
    "id": 240,
    "title": "[dW Review] 기술 동향 설문 IBM Tech Trends 2011",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1325342993000,
    "body": "> doortts | 2011-12-31 토요일 오후 11:49 | Better SW Development | [원본](http://blog.doortts.com/240)\n\n\n\n올해 마지막으로 소개할 기사는, 정확히는 기사가 아닌 기술동향 설문 보고서 입니다. : )\n [IBM Tech Trends 2011페이지](https://www.ibm.com/developerworks/mydeveloperworks/files/app/file/110ccd08-25d9-4932-9bcc-c583868c9f31?lang=ko \"[https://www.ibm.com/developerworks/mydeveloperworks/files/app/file/110ccd08-25d9-4932-9bcc-c583868c9f31?lang=ko]로 이동합니다.\")\n\nIBM이 93개국 25개 산업군에 존재하는 4000여명의 IT전문가들을 대상으로 향후 2년(24개월)의 기술 동향에 대한 설문을 한 결과입니다. 설문 영역은 크게 네 가지 분야로 집중했고, 각각은 \"비즈니스 분석(Business analytics), 모바일 컴퓨팅, 클라우드 컴퓨팅, 소셜 비즈니스\"입니다. 11페이지(본문은 9페이지)짜리의 간략한 설문 결과 보고서이지만 한 번쯤은 봐둘만한 내용이라 생각합니다. 관련해서는 간략하게 요약해 살펴보겠습니다.\n\n\n\n![tt2011_01.png](/files/21904)\n\n**비즈니스 분석\n **\n![tt2011_02.png](/files/21906)\n비즈니스 분석이 사용될 영역에 대한 설문입니다. \"자동화\"에 대한 영역이 1위를 차지했는데 특히 이 부분은 BRIC(Brazil, Russia, India and China)이 US보다 높게 나왔다고 합니다. US는 자동화 영역이 이미 상당수 적용되어 상대적으로 낮은 것으로 이해된다는군요. 2위는 분석한 것들을 좀 더 효과적으로 전달하기 위해 프로세스를 개선하는 것, 3위는 오늘날 우리가 사용하는 생산성 도구들로부터 좀 더 효율을 끌어내는 것, 4위는 업무 분석 도구들의 사용법에 대한 교육 제공이었습니다. \n\n하지만 제 개인적으로는 뭐니뭐니 해도 이쪽 영역, 즉 분석쪽에서 올해 가장 쇼킹한 것은 IBM Watson의 출현이었습니다.\n참고: [What is Watson ?](http://blog.doortts.com/188 \"[http://blog.doortts.com/188]로 이동합니다.\") \n\n**모바일 컴퓨팅\n **\n![tt2011_03.png](/files/21907)\n\n안드로이드가 발군의 1위군요.\n\n![tt2011_03_1.png](/files/21909)\n\n집중영역은 보시는 바와 같이 기업용 앱, 산업특성 앱, 그리고 모바일로의 핵심 애플리케이션 확대가 1,2,3위를 차지하고 있습니다. 그림에는 나오지 않지만 보고서 본문에 따르면 설문 응답자의 3/4이 모바일 컴퓨팅 영역에서 현재 일하고 있답니다. 그리고 전체 앱 개발의 85%까지 성장하리라고 보고 있습니다. 반면에 모바일 채택에 있어 가장 큰 걱정을 끼치는 부분은 보안과 프라이버시, 그리고 다중 플랫폼 지원에 대한 비용이라고 대답했습니다.\n\n**클라우드 컴퓨팅**\n \n[tt2011_04.png](/files/21908)\n**클라우드 기술 적용에 대한 Top 5 동기**\n\n단연 1위는 유연성과 확장성이 차지했고, 대동 소이한 2,3,4위는 각각 운영비용 절감, 효율성, 자산비용절감이었습니다. 이외에 본문에 따르면, 40%의 응답자들은 현재 자신의 조직이 클라우드 컴퓨팅에는 관여되어 있지 않다고 말했고, 대다수(75%)의 응답자들은 향후 2년 내에 자신의 조직이 클라우디 인프라를 구축을 시작하게 될 것이라고 대답했답니다.\n그리고 모바일의 성장과 클라우드의 성장이 동반되는 것으로 보고 있습니다.\n\n**소셜 비즈니스**\n소셜 비즈니스는 비즈니스적인 가치를 만들기 위해 사람들 사이의 네트워크를 강조하고 있는 분야입니다.효과적인 소셜 비즈니스를 하기 위해서는 공유, 투명성, 혁신, 그리고 향상된 결정 선택으로 특정지어진 문화를 내포해야 합니다. 그렇다보니, 이 분야는 기업측면에서는 내/외적인 보안문제와도 밀접한 연관되게 됩니다. 설문 결과를 보겠습니다.\n\n[tt2011_05.png](/files/21905)\n좀 더 소셜하게 되기 위해 어떤 계획을 세우고 있나?\n\n1위와 2위를 합치면 84%인데, 요약하면 확대하겠다!가 된다. 그리고 20%는 소셜 마켓에 대한 분야다. 내부는 당연히 기업내에서의 자유로운 의견 교환, 협업등에 사용될테고, 외부는 고객과의 좀 더 긴밀한 접근 통로로 사용될 예정이라 보면 된다.\n\n이상으로 간략하게 보고서를 살펴봤는데, 당연한 말이지만 이쪽 내용에 관심있는 사람들은 앞서 말했듯이 한 번 읽어보시길 원합니다.",
    "attachments": [
      {
        "id": 21904,
        "name": "tt2011_01.png",
        "hash": "c918fb30f15c2b0c9aae7b6592e9921dc01d1282",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 18365,
        "containerId": "12395"
      },
      {
        "id": 21905,
        "name": "tt2011_05.png",
        "hash": "d4d9a174ef478cb882e8c99983b4e13fdc5b6566",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 25307,
        "containerId": "12395"
      },
      {
        "id": 21906,
        "name": "tt2011_02.png",
        "hash": "d42682efe7a2880539c28d4afbfe448c8995e6c5",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 49262,
        "containerId": "12395"
      },
      {
        "id": 21907,
        "name": "tt2011_03.png",
        "hash": "d349d9186bb55beee7ac807df1f6a82a03dabf83",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 38754,
        "containerId": "12395"
      },
      {
        "id": 21908,
        "name": "tt2011_04.png",
        "hash": "aec5a7bd941b0b3d9edfcfe09b0d7143737fb47e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 51257,
        "containerId": "12395"
      },
      {
        "id": 21909,
        "name": "tt2011_03_1.png",
        "hash": "54ad86aa8403122f6f8743ed529c8405da71ae41",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 45105,
        "containerId": "12395"
      }
    ]
  },
  {
    "id": 241,
    "title": "2011 개인 SNS글 중 기억하고 싶은 생각, 그리고 나누고 싶은 메모",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1325369700000,
    "body": "> doortts | 2012-01-01 일요일 오전 2:53 | 이생각 저생각 | [원본](http://blog.doortts.com/241)\n\n2011년에 [트위터](http://twitter.com/doortts \"[http://twitter.com/doortts]로 이동합니다.\")와 [미투](http://me2day.net/doortts \"[http://me2day.net/doortts]로 이동합니다.\")에 남겼던 짧은 글들을 조금 정리해 보는 시간을 가졌습니다. 보통 트위터는 공개된 발언이라고 생각하고 미투는 개인친교라고 생각하면서 글을 남겼습니다. 그 중 '기억하고 싶은 생각', '나누고 싶은 말들'이라 할만한 것을 몇 가지 찾아서 문장 조금 다듬어 남겨봅니다. 뭐, 어느새 새해가 되었고, 이런저런 이유로 조금 늦었지만 그래도 결산의 의미로 정리해 적어보았습니다. \n\n순서는 1월부터 시간순으로 정리했습니다. : )\n \n\n- 상식적인 수준에서 '**악**'이라 여길만한 것도 뒤에 법을 뒤에 업고는 마치 스스로가 '**정의**'인듯 칭하며 약자를 괴롭히는 사회 풍조가 참 싫다.\n\n- 무식하면 용감하다고 했는데 그 말이 맞다. 그런데 때때로 그런 용기가 세상을 변화시키곤 한다. 생각만으로는 아무것도 안 변한다.\n\n- 아는 건 많지만 잘하는 건 적고, 말은 많지만 행동하진 않는 시대에 우린 살고 있다.\n\n- \"**저희(회사/팀)는 Agile을 합니다**\"는 어떻게 해석해야 할지 잘 모르겠다는 생각이 들곤 한다.\n\n- 동종업계일 경우 많은 기업들이 비슷한 목표로 비슷한 문제를 겪고 비슷한 댓가를 치룬다음 비슷한 교훈을 얻는다. 뭔가 비효율적이긴 한데 경쟁을 그만둘 순 없으니 딱히 답은 없어보인다.\n\n- 투자는 아끼고 큰 수확을 바라는(혹은 마음속으론 기대하는) 경우가 있다. 이를테면 \"**예산이 없어서 많이 지원은 못해. 그래도 최대한 잘 해 주길 믿네**\" 와 같은 식으로 말이다. 이럴때면 마음에선 \"**많이 지원 못받아서 크게 성과는 못냅니다.**\"라고 대답해 주고 싶곤 한다.\n\n- 내 주변엔 늘 미남미녀들이 많곤 했다. 솔직히 그 비율이 믿기 어려울 정도로 높았는데 최근 그 비밀이 풀린듯하다. ... 건강검진때 교정시력이 0.6으로 나왔다.\n\n- 매 순간 삶과 죽음이 교차하고 있다는 걸 종종 망각하는 덕분에 우린 참 오만하게 살 수 있는 것 같다.\n\n- 성능을 우선적으로 고려하는 웹 개발자들이 항상 마음에 두어야 하지만 곧 잘 잊곤 하는 질문 : \"static file\"로 대체 가능한가?\n\n- 애정있는 상대에게 상처를 주면 자신도 똑같이 상처받는다. 그런 자신이 미워서 모순적으로 상대방에게 더 상처주는 행동을 선택할때도 있다. \n\n- (멋있게 보일 수는 있겠지만) 유명한 사람들의 말이나 명언을 인용/반복하는 사람은 '**자신만의 이야기**'가 없거나 스스로의 이야기로 다른 사람을 직접 설득시키지 못하는 사람이라고 생각한다. 그래서, 서툴거나 부족해도 자신의 이야기를 하는 사람들이 더 멋진 것 같다.\n\n- 나중으로 미룬 일은 나중에도 더 나중으로 밀릴가능성이 높고 결과적으로 시기적절하게 실행되지 못하고 끝날 가능성이 높다. 그런면에서 GTD는 (정신적 측면에서) 효율적이다.\n\n- 안해서 못하는 건지, 못해서 안하는 건지 구별 못할 때가 많다. 시작점 없는 이 고리를 끊기 위해서는 누군가의 희생이 필요하다. 결코 쉬운 일이 아니지만, 주변에서 도와주면 희생을 최소화 할 수 있다.\n\n- 의외로 지하철은 책을 읽거나 글을 쓰거나 코딩하기에 꽤 좋은 곳이다. 한산한 지하철이면 더 좋고, 특히 지금같이 더운 여름엔 더더 더욱! 단, 앉아서 갈 경우 한정.\n\n- 안 될거라고 말하면서 안 하는 것이 많고 할 거라고 말하고 안 하는 것이 또한 많다. 그럼 대체 실제로 하건 뭐란 말인가?\n\n- 도구가 중요하지 않다고들 하지만, (내 생각엔) 좋은 도구는 일을 좀 더 즐겁게 만들어 준다. :D\n\n- IT 엔지니어가 쉽게 할 수 있는 '**투자**'중 하나는 내게 필요한, 그리고 가능성 있어 보이는 소프트웨어를 '**구입**'하는 것이다. 나중에 그 SW가 더 좋은 SW로 업그레이드되어 돌아오길 기대하며 말이다.\n\n- '**혁신(Innovation)**'은 단어가 주는 느낌 때문에 어느날 갑자가 발생하는 것으로 오해하는 경향이 있다. 관심과 노력으로 매일매일 1mm씩 바꾸어 나가다 어느날 돌아보니 100m쯤 차이가 난다는 걸 발견하는게 바로 '**혁신**'이다.\n\n- TDD 코딩을 위한 주문은 \"**테스트를 작성할 수 있는 가장 간단한 것은?**\"이라는 질문이다. \n\n- 구글 Dart는 언어적으로 좋아보이긴 하지만 '**언어자체 에 대한 홍보**'보다 '**응용 사례 확보**'에 노력을 기울이는 편이 개발자들에게 더 크게 어필될 것 같다.\n\n- 누군가 자신에게 '**틀렸다**'라고 말을 하면 굉장히 기분나뻐 하거나 크게 화를 내는 사람들이 있다. 답이 틀린게 나쁜거라고 오해하는 것 같은데, 안그랬으면 좋겠다. 당황하지 말고, 잠시 시간을 내서 되살펴보는 시간을 갖는 것도 좋은 대처이다.\n\n- 한 가지 일을 집중해서 한 날은 능률이 높고, 여러가지 일을 집중해서 한 날은 두통이 온다. 난 그걸 '**컨택스트 스위칭 비용**'이라고 부른다.\n\n- 우리가 생각해 볼 교훈 한 가지. \"목장 맴버의 대다수가 박사고 교수고 발명가면, 소는 누가 키우나?\" \n\n- 신규 서비스에 NoSQL을 쓸 것인가? 아니면 MySQL같은 RDBMS를 쓸 것인가?에 대한 고민은 본인의 서비스가 사람들에게 (무지)많이 쓰이고 나서 고민해도 늦지 않다. 그리니 우선은 코드부터 좀 작성을...\n\n- 일반인과 Geek의 차이점 하나. 일반인은 Geek한 사람을 보면 무의식 중에 피하려 하고, Geek은 자신보다 Geek 한 사람을 보면 무의식 중에 닮으려 한다.\n\n- SNS가 주류가 된 인터넷의 묘한 특징 하나는 본인이 세상 어디에 있던지, 그리 어느 시점이던지 항상 비슷한 정도의 친밀감과 거리감을 동시에 느낄 수 있다는 점이다.\n\n- 부족한 점을 개선하기위해 에너지를 소모하는 사람/조직이 한 분야에서 Outstanding한 모습을 보이긴 매우 어렵다. 더군다나 평범한 사람이나 조직일 경우엔 더더욱 그러하다. 시간과 자원은 언제나 한정돼 있는 법이고 단점 극복에 들어가는 비용은 대개 ROI가 낮다. 단점이 장점을 희석시킬만큼 치명적이지 않다면 차라리 단점을 인정하고 장점에 더 투자해라.\n\n\n\n#### Comments\n\n잘 읽었습니다.\n\n 김군 | 2012-01-02 월요일 오후 8:34\n\n--\n\n감사합니다. 새해 복 많이 받으세요! :)\n\n [doortts](http://blog.doortts.com) | 2012-01-04 수요일 오후 6:1\n\n--\n\n올해도!! 복 마이 받으세요 :-) \n\n [is윤군](http://helols.tistory.com) | 2012-01-05 목요일 오전 9:42\n\n--\n"
  },
  {
    "id": 242,
    "title": "[node.js 따라배우기 07] 노드 라이브러리 버전들, 제이드 트릭, 에러페이지 (Node Library Versions, Jade Tricks, Error Pages)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1326207573000,
    "body": "> doortts | 2012-01-10 화요일 오후 11:59 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/242)\n\n\n\n오랜만의 포스팅입니다. 이번 번역은 함께 octoberskyjs 스터디를 진행하고 있는 송형주님(@[hyungjoo_](http://twitter.com/hyungjoo_ \"[http://twitter.com/hyungjoo_]로 이동합니다.\"))께서 수고해 주셨습니다. 송형주님의 블로그([http://nodejs-kr.org/insidejs](http://nodejs-kr.org/insidejs/)/)에는 node.js 모듈들이 소개되고 있으니, 관심있으신 분들은 꼭 한번 살펴보세요. 그리고 무엇보다 연말/연초로 많이 바쁜시기였으셨을텐데 고생많으셨습니다. 고맙습니다. : )\n\n“웹 앱(Web App)을 만들어 봅시다” 파트6에 오신걸 환영합니다. 본 시리즈는 [Node](http://nodejs.org/)를 사용하여 웹 앱을 만들어 보는 튜토리얼(tutorial)입니다. 이 시리즈는 자기만의 어플리케이션을 만들 때 직면하게 될 모든 부분들을 당신에게 알려줄 것입니다. 이 튜터리얼들은 [lmawa](http://dailyjs.com/tags.html#lmawa) 링크에 있습니다. [](https://github.com/alexyoung/nodepad/tree/03fe9b272fea1beb98ffefcf5f7ed226c81c49fd)\n\n\n\n**[Part 1: 소개](http://blog.doortts.com/207 \"[http://blog.doortts.com/207]로 이동합니다.\")** (Introduction)\n\n**[Part 2: 설치와 애플리케이션 뼈대 만들기](http://blog.doortts.com/209 \"[http://blog.doortts.com/209]로 이동합니다.\")** (Installation and Skeleton App)\n\n**[Part 3: RESTful 메소드와 테스트](http://blog.doortts.com/215 \"[http://blog.doortts.com/215]로 이동합니다.\")** (RESTful Methods and Testing)\n\n[Part 4: 템플릿, 파셜, 그리고 문서 생성과 수정](http://blog.doortts.com/224 \"[http://blog.doortts.com/224]로 이동합니다.\")(Templates, Partials, Creating and Editing Documents)\n\n**[Part 5: 인증과 세션, 접근제어 미들웨어](http://blog.doortts.com/232 \"[http://blog.doortts.com/232]로 이동합니다.\")** (Authentication, Sessions, Access Control Middleware)\n**[Part 6: 인터페이스 기본](http://blog.doortts.com/233 \"[http://blog.doortts.com/233]로 이동합니다.\")**(Interface Basics) \n\n\n\n### 패키지 버전 (Package Versions)\n\n제가 사용하는 Node와 Mongo 버전을 포함한 [Nodepad README](https://github.com/alexyoung/nodepad/blob/f2261c510c987b35df1e6e000be6e1e591cd9d6d/README.textile)를 업데이트 했습니다. 그 파일에는 제가 사용한 다른 패키지들의 버전들도 포함되어 있습니다. 만약 코드 실행에 문제가 있다면 그것은 이를 해결하는데 도움이 될 것입니다. 저는 Nodepad 코드를 Mac OS와 Debian에서 테스트했습니다.\n\n여러분이 코드를 수정할 때마다 (Jade 템플릿 코드 제외) Node를 재실행 실켜야 하는 것 또한 기억해주세요.\n\n우리는 패키지 설치를 위해서 npm을 이용했고, 특정 버전의 패키지가 설치될 수 있도록 경로명을 설정할 것입니다. 이를 위해서는 다음과 같이 실행하면 됩니다. (역자주-현재 express 최신 버전은 3.0 알파 버전까지 나와 있다.)\n\n\n\n```\nnpm install express@1.0.0\n\n```\n\n\n\n설치된 모듈을 사용하기 위해선 다음과 같이 입력합니다.\n\n\n\n```\nvar  express  =  require('express@1.0.0');\n\n```\n\n\n\nnode 명령을 실행 후, 커맨드라인에서 다음과 같이 입력해서 모듈 동작을 확인할 수 있습니다.\n\n\n\n```\n>  express  =  require('express@1.0.0')\n {  version:  '1.0.0'\n ,  Server:  {  [Function:  Server]  parseQueryString:  [Function]  }\n ,  createServer:  [Function]\n }\n\n```\n\n\n\n### \nJade 트릭(Jade Tricks)\n\n이전 튜터리얼에서는 Jade를 이용했을 때는 모든 속성을 하드 코딩했습니다. Jade 코딩 시에 클래스와 ID를 셀렉터를 이용해서 간단히 입력하면, 많은 수고를 덜 수 있습니다.\n\n\n\n```\ndiv#left.outline-view\n   div#DocumentTitles\n     ul#document-list\n       -  for  (var  d  in  documents)\n         li\n           a(id='document-title-'  +  documents[d].id,  href='/documents/'  +  documents[d].id)\n             =documents[d].title\n\n```\n\n\n\ndiv#left.outline-view는 ID 셀렉터와 class명이 결합한 것임을 기억하세요.\n\nJade의 디폴트 태그는 div이므로, 앞의 예제는 다음과 같이 줄일 수 있습니다.\n\n\n\n```\n#left.outline-view\n   #DocumentTitles\n     ul#document-list\n       -  for  (var  d  in  documents)\n         li\n           a(id='document-title-'  +  documents[d].id,  href='/documents/'  +  documents[d].id)\n             =documents[d].title\n\n```\n\n\n\n### \n에러 페이지 (Error Pages)\n\nExpress에서는 app.error 를 통해 자체 에러 핸들러를 정의할 수 있습니다. \n\n\n\n```\n// 에러 핸들링\n function  NotFound(msg)  {\n   this.name  =  'NotFound';\n   Error.call(this,  msg);\n   Error.captureStackTrace(this,  arguments.callee);\n }\n\n sys.inherits(NotFound,  Error);\n\n // 이 메서드의 결과로 500.jade가 렌더링 될 것이다.\n app.get('/bad',  function(req,  res)  {\n   unknownMethod();\n });\n\n app.error(function(err,  req,  res,  next)  {\n   if  (err  instanceof  NotFound)  {\n     res.render('404.jade',  {  status:  404  });\n   }  else  {\n     next(err);\n   }\n });\n\n app.error(function(err,  req,  res)  {\n   res.render('500.jade',  {\n     status:  500,\n     locals:  {\n       error:  err\n     } \n   });\n });\n\n```\n\n\n\n에러 핸들러는 error, req, res, next 이렇게 4개의 인자를 갖습니다. next 메서드는 error 인자를 다음 에러 핸들러로 넘기는데 사용됩니다. 위 예제에서 404 에러 핸들러는 NotFound 이외의 에러들은 다른 에러 핸들러로 넘깁니다. 그리고 다른 모든 에러들은 두번째 에러 핸들러로 전달되며, 이들은 500 에러로 여깁니다.\n\n브라우저에서 /bad 주소를 입력하면, 우리가 만든 500 에러 페이지가 보여질 것입니다. render 메서드 호출시, 옵션 인자로 HTTP 상태 코드를 넘긴 것을 기억하세요. 여기서 status 코드를 넘기지 않으면 404나 500 에러 대신에 200 상태 코드가 반환됩니다. \n \n\n### Mongoose 코드 내부에서 에러 처리하기 (Error Handling within Mongoose Code)\n\nnext 메서드는 우리가 작성한 애플리케이션 내부의 모든HTTP 처리 메서드(역자주. 원문은 HTTP verb method라고 되어 있음)에서 이용 가능합니다. 우리는 이 메서드를 자체 404 페이지를 렌더링 하는 데 사용합니다.\n\n\n\n```\napp.get('/documents/:id.:format?/edit',  loadUser,  function(req,  res,  next)  {\n   Document.findById(req.params.id,  function(d)  {\n     if  (!d)  return  next(new  NotFound('Document not found'));\n     // Else render the template...\n\n```\n\n\n\n위 코드가 Mongoose 코드 내부에서 에러를 처리하기 위해 제가 찾아낸 가장 쉬운 패턴입니다. Mongoose 콜백 함수내에서 간단히 throw new NotFound를 사용하면  Express의 에러 핸들러를 트리거 하는 대신에 애플리케이션을 중단시킬 수 있습니다.\n \n\n### 결론 (Conclusion)\n\nNode 애플리케이션을 배포할 때 패키지 버전에 대해 정확히 기록하는 것은 중요합니다. 많은 주요 패키지들이 여전히 활발히 개발 중에 있어서 배포가 쉽지 않기 때문입니다.\n\nExpress는 템플릿과 함께 자체 에러 핸들러를 쉽게 생성할 수 있게 해줍니다. 콜백 함수 내에서 HTTP 상태 코드를 정확하게 넘기고 next(exception)을 사용해야 하는 점을 꼭 기억하세요.\n\n이 튜터리얼을 적용한 Nodepad 버전은 [commit 929f564](https://github.com/alexyoung/nodepad/tree/929f5642ca1b2fa664df517457e056c92490d892)에 있습니다."
  },
  {
    "id": 244,
    "title": "[뭘, 이런걸 다?] 크롬 브라우저 콘솔 폰트 크기 바꾸기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1328842866000,
    "body": "> doortts | 2012-02-10 금요일 오전 11:50 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/244)\n\n크롬 브라우저의 콘솔기능을 자주 이용하는 분들 중에서 작은 폰트 사이즈로 인해 고통받는 분들을 위한 팁입니다. :)\n\n**다음 위치로 이동합니다.**\n\n윈도우즈 환경\n\n\n\n%AppData%\\..\\Local\\Google\\Chrome\\User Data\\Default\\User StyleSheets \n\n\n\n맥OS\n\n\n\n ~/Library/Application Support/Google/Chrome/Default\n\n\n\n**Custom.css 파일이 보일겁니다.**\n해당 파일안에 설정을 해주시면 됩니다. 아래는 제가 사용하는 형식입니다.\n\n\n\nbody.platform-mac .monospace, body.platform-mac .source-code {\n\n    font-size: 13px !important;\n\n    font-family: Menlo, monospace;\n\n}\n\nbody.platform-windows .monospace, body.platform-windows .source-code {\n\n    font-size: 14px !important;\n\n    font-family: Consolas, Lucida Console, monospace;\n\n}\n\nbody.platform-linux .monospace, body.platform-linux .source-code {\n\n    font-size: 12px !important;\n\n    font-family: monospace;\n\n}\n\n\n\n **끝! :D**\n\n참고: http://www.chromium.org/user-experience/user-data-directory "
  },
  {
    "id": 245,
    "title": "NHN 신입사원 교육 후기 (TDD교육과 팀 프로젝트)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1329803064000,
    "body": "> doortts | 2012-02-21 화요일 오후 2:44 | 이생각 저생각 | [원본](http://blog.doortts.com/245)\n\nNHN도 신입사원 교육을 합니다. 꽤 적지 않은 기간 교육을 시키죠. 이번 신입사원 차수의 경우에는 작년 하반기에 인턴으로 이미 일을 했던 신입들입니다. 처근 저는 후반기 SW엔지니어링 교육 과정들 중에서 테스트주도개발(TDD)과정과  팀 과제 지도 강사로 참여했습니다. 어제 과제 발표를 마지막으로 이번 차 수에서의 제 역할은 끝났습니다.\n\n**간단한 후기를 남겨 봅니다. **\n\n- 27명, 한 반 이었고 여자는 1명이었습니다. (남고 분위기?)\n- 역시 신입은 신입이라 그런지 풋풋합니다. (예외는 있음. 미안~ㅋ)\n- 무엇보다 놀라점은 TDD로 만들어낸 팀 프로젝트의 단위 테스트 케이스 수준이 전반적으로 굉장히 우수합니다.\n(제가 잘 가르쳐서 그런거라고 믿고 싶어요.ㅎㅎ) 기존 선배들은 긴장 좀 해야 할 것 같습니다.\n- 소감 발표때 TDD가 도움이 되고 참 좋다는 걸 알게되었다는 이야기가 많았습니다. \n- 그리고 마음이 급해지니까 어렵다는 이야기도 많았고요.\n- 교육 끝나고 '차장님, 감사합니다'라고 보낸 어느 신입의 문자에 저도 고마운 마음이 들었습니다.\n\n추가로, **팀 과제 진행 환경**을 살짝 이야기 하면\n\n- UI는 없이 엔진만 개발\n- 설계 방식과 개발 방식은 가이드를 해줌\n- 요구사항을 제공하고 기능목록부터 작성하도록 함\n- 적지 않은 스트레스 환경과 시간압박 상황하에서의 대처능력을 요구했음 \n- Hudson CI 서버를 구축해서 복잡도와 테스트 케이스 깨짐에 대해서 지속적으로 모니터링 하도록 유도함\n- 개발환경은 이클립스, Maven, EclEmma, CheckStyle, Subversion (subclipse, subversive는 알아선 선택)\n\n![IMG_3142.png](/files/21911)\n\n**[팀 과제 결과 발표하는 모습]**\n\n(본인들은 정작 잘 모르겠지만) 이번 신입들은 제 기준으로 봤을 때 가장 발전되고 적지않은 기간동안 연마된 TDD Best Practice들을 배웠습니다. 살짝 부연설명을 하자면, 제가 **TDD실천법과 도구**라는 책을 출간한 것이 2010년 6월입니다. 그리고 그 책을 쓰기 위해 1년여의 시간을 들였기 때문에 실제적으로는 지금으로부터 2~3년전의 '저의 지식'을 담고 있습니다. TDD라는 것이 특별히 유행을 타거나 최신기법이 필요로 하는 부분은 아닙니다만, 시간은 흘렀고 저도 경험이 늘었고 그 당시에 비해 추가적으로 생각이 살짝 바뀐 부분들, 그리고 새로 배운 좀 더 우아한 방법들, 실패하지 않기 위한 기법들 등등이 있습니다.\n\n![L.jpg](/files/21910)\n\n언제 그런 부분들을 책으로 정리할까, 아니면 오프라인 강의를 할까 고민중입니다만, 우선은 기회가 있을 때 그 때 그 때 전달하고는 있습니다. (책으로 전달하기에는 또 분량이 책을 쓸 만큼은 안되는 것 같고요)\n\n이번 신입교육에도 그랬고요. 너무 신입이라는 점이 조금 아쉽습니다만, 반면에 기존 선배들 보다는 흡수력이 더 빠른 장점은 있죠\n \n물론 한정된 시간이고, 신입의 수준이 있기 때문에 전부를 전달 해 줄 수는 없었습니다만, 가능한 범위내에서 해당 내용들을 전달해 최대한 전달해 주었습니다. 아마, 중간에 포기하지만 않는다면 기존 선배들보다 훨씬 짧은 기간동안에 훨씬 잘 할 수 있는 기초는 배운 셈입니다.\n\n교육 이라는 것은 '모르는 걸 배우는 것'도 있지만 '시행착오를 줄이고 경험을 전달받아 특정 레벨에 도달하는 시간을 줄이는 것'도 있습니다. 그런면에서 이번 신입들은 본인들은 잘 모르겠지만 소중한 것들을 많이 배웠습니다. (아. 정확히는 그랬어야 합니다.ㅎㅎ)\n\n작년에는 신입교육을 하지 않았었는데 2년 만에 다시 신입 교육을 했더니, 풋풋한 신입을 보며 또 저도 많이 배웁니다. \n\nps.\n'이바닥에서 일 한지 올해가 햇수로 13년째입니다.'라고 이야기를 했더니 다들 절 살아있는 유물 보는듯한 표정을 짓더군요. -,-);  신입들이 경력 20년 넘으신 분을 보면 산삼보듯 할까요?\n\n#### Comments\n\n20년 넘어서 30년까지 고고~하시죠 ㅎㅎ\n\n [ologist](http://www.ologist.co.kr) | 2012-02-23 목요일 오전 7:58\n\n--\n\n같이 가시죠~ ㅎ\n\n [doortts](http://blog.doortts.com) | 2012-02-23 목요일 오후 6:51\n\n--\n\n'살아있는 화석'!!\n처럼 오래오래 이바닥에 계시면 좋겠습니다!!\n\n [허니몬](http://ihoney.pe.kr) | 2012-02-23 목요일 오전 8:26\n\n--\n\n이건 응원이여~ 악담이여~~ ㅎㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2012-02-23 목요일 오후 6:51\n\n--\n\n그 발전된 개념을 보고 잡습니다~~~ ㅋㅋㅋㅋ \n\n [짱가](http://architect.tistory.com) | 2012-03-16 금요일 오후 2:33\n\n--\n",
    "attachments": [
      {
        "id": 21910,
        "name": "L.jpg",
        "hash": "94c363f4d23a754ba8e14163ec3c0e168ee22dce",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 34850,
        "containerId": "12400"
      },
      {
        "id": 21911,
        "name": "IMG_3142.png",
        "hash": "e3f85c3dc523c7b6294ab79ce74f8cd034674721",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 356998,
        "containerId": "12400"
      }
    ]
  },
  {
    "id": 246,
    "title": "좋다는 그 기술이 안 좋게 느껴지는 이유",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1329865800000,
    "body": "> doortts | 2012-02-22 수요일 오전 2:18 | 이생각 저생각 | [원본](http://blog.doortts.com/246)\n\n흔히 사람들이 쓰기 어려워 하거나 곧 잘 실수하거나 문제를 만들곤 하는 제품이나 라이브러리, 프로그래밍 언어들이 있다. 이런 경우 해당 분야 전문가나 경험자들은 종종 '**잘 쓰면 전혀 문제없다**'고 말한다. 틀린 이야기는 아니다.\n\n그런데 다소 비평적으로 들리긴 하겠지만 사실 '**잘 사용해도 안 좋은 기술**'은 거의 없다. 그보다는 '**많은 ****주의를 기울일 필요 없이 쉽게 써도 문제가 없어야'** 좋은 기술이라고 난 생각한다. \n\n열심히 공부해도 잘 안되는 건 안되는 거다. 많은 사람들이 어려워 하면 어려운거다.  어느 정도 인정은 했으면 좋겠다. \n\n물론 '**좋은 기술**'이라는 말 자체가 상당히 모호하고 상황 의존적인 표현이지만, 좀 더 대중적으로 구분할 필요가 있다.\n\n원래 쉬운 거랑 익숙해 져서 쉬운 걸 말이다. \n그리고 원래 좋은 거랑 잘 써야 좋은 걸 말이다.\n\nps.\n이 글을 읽으시는 분 중에서 혹시 그런 제품/경험/기술이 있다면 어떤 것이 있으세요? \n \n\n#### Comments\n\n매우 공감. 전 스프링을 들고 싶네요 ㅎ(돌 날라오면 쉴드 쳐주세요 ㅋ)\n\n 차민창 | 2012-02-22 수요일 오후 2:0\n\n--\n\n나도 약간 그렇거든. ㅎㅎ 같이 맞자구!\n\n [doortts](http://blog.doortts.com) | 2012-02-22 수요일 오후 2:8\n\n--\n\n자... 두 분 더 나은 솔루션 기대하겠습니다. (손에 돌을 든다)\n\n [박성철](http://me2day.net/geekinside) | 2012-03-02 금요일 오후 9:55\n\n--\n\n익숙해지고 잘써야 쓸만한 것들\nMS Windows 제품들, Android 폰\n\n잘 쓰면 좋을수도 있는데, 없어도 괜찮은거\nJava의 Checked Exception\n\n있으면 편하긴한데, 실수로 부작용 생기기 쉬운 별거 아닌데 골칫거리인거\nJava의 autoboxing\n\n잘써도 그지같은 JAXP, java.net.URL, java.util.Calendar\n\n그리고 절대 잘 쓸수 없는 AspectJ 와 m2eclipse 의 조합 (이건 AspectJ 쓰는건 문제가 없는데, m2eclipse의 AspectJ 지원이 엉망이라서, 뭐하나 수정하면 수동 clean build 안하면 적용이 안됩니다. 이건 제가 잘못 쓰는건가해서 SpringRoo가 생성한 프로젝트 가지고 테스트 해봤는데, 같은 결과가. 대충 찾아보니 m2eclipse 개발팀이 자기들은 AspectJ 안쓴다고 나몰라라 하는듯. 제가 잘못 알고 있는거면 알려주세요 ^^).\n\n잘쓰면 정말 괜찮은 녀석은 Java의 generics. 근데 잘 써도 남들이 못알아 보면 낭패죠.\n가령...\npublic class IterableToCollectionMapper<E, T extends Iterable<? extends E>, NE, F extends Function1<? super E, NE>, R extends Collection<NE>>\n\t\timplements Function2<F, T, R>\n{\n\tprivate final CollectionCreater<NE, ? extends R>  collectionCreater;\n\n\tpublic <CC extends CollectionCreater<NE, ? extends R>>  IterableToCollectionMapper(final CC collectionCreater)\n\t{\n\t\tthis.collectionCreater = collectionCreater;\n\t}\n\n\t@Override\n\tpublic R apply(final F function, final T source)\n\t{\n\t\t//...\n\t}\n}\n\n\n Kevin | 2012-02-22 수요일 오후 10:35\n\n--\n\n퍼나르고 싶은 덧글입니다.\n\n그리고 잘써도 그지같은 Calendar 부분에선 혼자 빵 터져서 막 웃었습니다. 맞아요. ㅎㅎ \n\n\n\n [doortts](http://blog.doortts.com) | 2012-02-23 목요일 오전 11:6\n\n--\n\n근데 Homepage에 제 블로그 주소 \n넣으면 차단되었다고 하면서 댓글 등록 안되네요? ㅡ_ㅡ? 아니 제가 왜? ㅡ_ㅡ;;;\nblog쩜lckymn.com <== 여기다 써도 같은 결과라서 쩜처리...ㅡ_ㅡ;\n티스토리 아직도 이러네...ㅡ_ㅡ;;;\n\n Kevin | 2012-02-22 수요일 오후 10:38\n\n--\n\n기술은 아니구요. 코딩 할 때 특별한 경우 아니면 vim을 쓰는데 강력하고 익숙해 지면 편하다고 주위에 권장 하지만 불편한 분들도 많더라구요 ㅎ\n\n [김개발](http://developk.im) | 2012-03-06 화요일 오전 9:1\n\n--\n\n'많은 주의를 기울일 필요 없이 쉽게 써도 문제가 없어야' 좋은 기술이라고 난 생각한다.\n매우 공감합니다.\neffective c++ 에 비슷한 이야기가 나옵니다.\n좋은 API는 똑바로 쓰기는 쉽고 잘못쓰기에는 어렵게 만들어야 한다.\n\n 초보 | 2012-08-16 목요일 오전 10:59\n\n--\n"
  },
  {
    "id": 247,
    "title": "[node.js] Connect 2.0 소개",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1330480218000,
    "body": "> doortts | 2012-02-28 화요일 오후 2:57 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/247)\n\n\n\n우리의 미치광이 개발자 [TJ Holowaychuk](http://tjholowaychuk.com/ \"[http://tjholowaychuk.com/]로 이동합니다.\")가 Connect 2.0 을 공개하였습니다. Express의 근간이 되는 모듈이죠. 곧 Express 3.0이 나올예정인데요, Express 사용자라면 한번쯤 봐두면 도움이 될 겁니다. : )\n\n\n\n### [Connect 2.0](http://tjholowaychuk.com/post/18418627138/connect-2-0)\n\n새로운 코어 미들웨어와 여러가지 개선사항, 그리고 새로운 문서들([docs](http://www.senchalabs.org/connect/))과 함께 하는 Connect 2.0입니다.\n\n```\nvar  app = connect()\n   .use(connect.logger('dev'))\n   .use(connect.static('public'))\n   .use(function(req, res){\n     res.end('hello world\\n');\n   })\n\n  app.listen(3000);\n\n```\n\n### HTTP and HTTPS\n\n기존  `connect.Server`는 노드의 코어인  `net.Server`를 상속했는데요, HTTP와 HTTPS를 모두 제공하기가 어려웠습니다. 이전에는 connect.createServer()였습니다만 이제 새로운 connect() 는 간단한 자바스크립트 함수입니다. 따라서 이젠 아래와 같은 식으로  app.listen()호출을 생략하고  app을 노드의 net.Server로 간단히 넘길 수 있습니다. \n\n```\nvar  connect = require('connect')\n   , http = require('http')\n   , https = require('https');\n\n var  app = connect()\n   .use(connect.logger('dev'))\n   .use(connect.static('public'))\n   .use(function(req, res){\n     res.end('hello world\\n');\n   })\n\n http.createServer(app).listen(80);\n https.createServer(tlsOptions, app).listen(443);\n\n```\n\n### Body parsers\n\n bodyParser()미들웨어는 이제 단순히 `json()`, `multipart()`, 그리고 `urlencoded()` 를 추가하는데 쓰는 축약표현에 불과합니다. 해당 함수들은 파싱된 값들을  req.body 에 담습니다. 그리고 `multipart()`는 업로드를 위해 `req.body``와 ``req.files`를 제공합니다.\n\n==  bodyParser 소스코드 == exports = module.exports = function bodyParser(options){ var _urlencoded = urlencoded(options) , _multipart = multipart(options) , _json = json(options); return  function bodyParser(req, res, next) { _json(req, res, function(err){ if (err) return next(err); _urlencoded(req, res, function(err){ if (err) return next(err); _multipart(req, res, next); }); }); } }; \n\n### Core compression\n\nNode 0.6.0에서 빠른 네이티브 압축능력들을 제공하는 관계로, 이제 우리도 gzip과 deflate를 지원하는 `compress()`  미들웨어를 갖게 되었습니다.\n\n### Cookie parser \n\ncookieParser() 미들웨어는 이제 싸인된 쿠키들(signed cookies)과 `secret을 `받아들입니다. 해당 기능은 session({ secret: string })을 session()미들웨어로 넘길 필요성을 교체하였습니다. 싸인된 쿠키들은 req.signedCookies를 통해서, 그리고 싸인되지 않은 쿠키들은 req.cookies를 통해 사용가능합니다.\n \n\n### Error delegation\n\n이전의 몇몇 코어 미들웨어는 에러 상황들에 직접 응답해야 했었습니다.. 해당 사항들은 단순히 next(err) 를 함게 쓰는 걸로 변경되었습니다. 이렇게 변경함으로써 에러 핸들링 미들웨어를 추가함으로써 커스터마이즈된 행동들을 지정하는 것이 가능해졌습니다.\n\n```\napp.use(function(err, req, res, next){\n   if  (4  == err.status /  100) {\n     // render a client-error page\n   } else  {\n     // render a server-error page\n   }\n });\n\n```\n\n### Session\n\n앞서 언급했던 것처럼 session()은 더이상 secret을 필요로 하지 않습니다. .maxAge 쿠키는 null이 기본값이었는데요, 브라우저 세션쿠키가 된다는 뜻이고요, 방문자가 브라우저를 닫으면 만료됩니다.\n\n### Third-party middleware\n\n서드파티 미들웨어는 완벽하게 동작 합니다만 이번 Connect 릴리즈는  Express 2.x 와 호환되지 않습니다. 곧   Express 3.0 이 나올예정입니다.\n\n### Changelog\n\n공개된 API에 영향을 주지않는 것들을 포함해서 다음과 같은 중요한 변경이 이루어졌습니다. 마찬가지로 [Mocha](http://visionmedia.github.com/mocha)를 사용해서 테스트를 다시 다 작성했습니다.\n\n*   쿠기만으로 동작하는 세션을 위한  `cookieSession()` 미들웨어 추가\n*   gzip/deflate 지원을 위한 `compress()` 미들웨어 추가middleware for gzip / deflate support\n*   X-Forwarded-Proto 인증을 위한  `session()` “proxy” 세팅 추가 \n*   \"application/json\" 파싱용 `json()` 미들웨어 추가 \n*   \"application/x-www-form-urlencoded\" 파싱을 위한  `urlencoded()` 미들웨어 추가\n*   \"multipart/form-data\" 파싱을 위한 `multipart()` 미들웨어 추가\n*   `cookieParser(secret)` 지원. 이 미들웨어를 통하면 싸인된 쿠기에 접근할 수 있음\n*   cookieParser()가 싸인된 쿠키를 지원함\n*   cookieParser()가 직렬화된 JSON 쿠키를 지원함\n*   Connect의 기본 엔드포인트(default end-point)에서  err.status를 지원함\n*   staticCache()에 X-Cache MISS / HIT가 추가됨\n*   퍼블릭 `res.headerSent`에 `res._headerSent` 노드를 먼저 체크하는 것이 추가됨\n*   `basicAuth()`는 req.remoteUser에서 req.user로 변경됨\n*   Changed: `session()` 기본값이 브라우저 세션 쿠키로 변경됨\n*   Changed: 소문자 쿠키이름을 더이상 지원하지 않음\n*   Changed: `bodyParser()`가   `json()`, `urlencoded()`, `multipart()`를 이용함` `\n*   Changed: `errorHandler()`는 이제부터는 개발시 모드 전용 미들웨어가 됨\n*   Changed: 미들웨어에서 에러가 발생할 수 있으면 `next()`를 이용해서 애플리케이션이 로깅과 핸들링을 단일화 할 수 있음\n*   `http[s].Server` 의 상속관계를 제거함. 이제부터는 그냥 함수니까 http, https 둘 다 제공하는 앱을 만드는게 더 쉬어짐\n*   Removed: `.createServer()` 제거됨 (`connect() `사용하삼)\n*   Removed: `session()`에서 `secret`옵션을 제거함 cookieParser(secret) 사용하삼 \n*   Removed: `connect.session.ignore` 배열지원 제거\n*   Removed: `router()` 미들웨어 제거\n*   Fixed: set-cookie only once for browser-session cookies\n*   Fixed FQDN support 수정됨. 앞에 “/” 붙이지 마세요\n*   Fixed 404 XSS attack vector. Closes #473\n*   Fixed **HEAD** 가  Connect 의 엔드포인트에 의해 생성된 404s 와 500s 를 지원하도록 변경됨"
  },
  {
    "id": 248,
    "title": "[node.js] 토요일밤에 node.js 동영상 함께 보기 이벤트!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1330668324000,
    "body": "> doortts | 2012-03-02 금요일 오후 3:5 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/248)\n\n미루고 미뤄왔던 [octoberskyjs](http://www.facebook.com/octoberskyjs \"[http://www.facebook.com/octoberskyjs]로 이동합니다.\") 모임의 node.js 동영상 함께 보기 두 번째 이벤트입니다.\n\n라이언 달이 야후에서 발표한 자료이고요, 지난번에 봤던 PHP 그룹에 발표했던 내용보다 좀 더 깊이있게 들어가는 내용(설계원칙, 실행스택에 대한 설명등)이 나옵니다. 물론 이전과 겹치는 부분도 좀 있습니다만 들을만 합니다. : )\n\n그럼 토요일 밤에 모여서 재잘대며 함께 공부해 볼까요?\n(참가의사 댓글 완소환영!!!) \n\n**동영상**\n[Ryan Dahl: Introduction to Node.js](http://www.youtube.com/watch?v=M-sc73Y-zQA \"[http://www.youtube.com/watch?v=M-sc73Y-zQA]로 이동합니다.\")\n\n**동영상에서 사용한 슬라이드**\n[http://nodejs.org/cinco_de_node.pdf](http://nodejs.org/cinco_de_node.pdf) \n\n**시간**\n내일 토요일(3월3일) 밤 11시\n\n**장소**\noctoberskyjs 채팅방 (작년말에 joyent에 띄워 놓은게 아직 살아있네요! ㅎㅎ)\n[octobersky.no.de](http://octobersky.no.de \"[http://octobersky.no.de]로 이동합니다.\") \n\n기타참고자료\n\n**2010 jsconf 봄 자료**\n[http://nodejs.org/jsconf2010.pdf](http://nodejs.org/jsconf2010.pdf)  \n\n**2010 jsconf 가을 자료** \n[9 Challenges in Node.js](http://nodejs.org/jsconf-eu-2010.pdf \"[http://nodejs.org/jsconf-eu-2010.pdf]로 이동합니다.\")\n \n\n#### Comments\n\njeyent 사용료 계속 내신 거에요?\n\n [박성철](http://me2day.net/geekinside) | 2012-03-02 금요일 오후 9:38\n\n--\n\n아직까진 무료로 사용하고 있습니다.\n\n [doortts](http://blog.doortts.com) | 2012-03-02 금요일 오후 11:22\n\n--\n"
  },
  {
    "id": 253,
    "title": "node.js를 학습하는 사람이라면 꼭 봐둬야 할 Node.js 소개 동영상 해설",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1331307092000,
    "body": "> doortts | 2012-03-10 토요일 오전 12:17 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/253)\n\n\n\n지난 토요일(3월3일)에 node.js 기간한정 학습공유 모임인 [OctoberSky.js](http://www.facebook.com/octoberskyjs \"[http://www.facebook.com/octoberskyjs]로 이동합니다.\")의 동영상 함께 보기 이벤트를 가졌었습니다.\n\n[[토요일밤에 node.js 동영상 함께 보기 이벤트!](http://blog.doortts.com/248 \"[http://blog.doortts.com/248]로 이동합니다.\")]\n\n정리도 할겸해서 해설문서를 만들어 보았습니다. \n\nRyan Dahl이 2010년 JSconf에서 발표한 동영상입니다. 라이언 달의 초기 발표라 그런지 엄청 떨면서 이야기를 하는데다가 말도 어버버~ 하는 경우가 많습니다만, Node.js를 본격적으로 학습해 볼 생각이 있으시다면 한 번 꼭 보시길 권장하는 동영상입니다. 동영상 보실 때 도움이 될 수 있도록 라이언의 발표 문장에 주석과 해석을 담았습니다. **따라서 동영상과 함께 보시길 강력히 권장합니다.**   번역과 주석이 섞여있고 개인적인 의견도 다수 들어있습니다.  너그럽게 봐주세요. : )\n\n\n\n**pdf 직접 다운로드: [node-js-introduction-doortts.pdf](/files/21912)**\n\n**[Ryan Dahl의 Node.js 소개 동영상 해설 by doortts](http://www.slideshare.net/doortts/ryan-dahl-nodejs-by-doortts \"Ryan Dahl의 Node.js 소개 동영상 해설 by doortts\")**\n\n [](http://www.slideshare.net/doortts) \n\n",
    "attachments": [
      {
        "id": 21912,
        "name": "node-js-introduction-doortts.pdf",
        "hash": "8e9011eca3e7f1ea716f7e50755d6399d51093b9",
        "containerType": "BOARD_POST",
        "mimeType": "application/pdf",
        "size": 1802167,
        "containerId": "12403"
      }
    ]
  },
  {
    "id": 258,
    "title": "불신풍조 만연 프로그래밍 vs 너님 잘못임 프로그래밍",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1334748987000,
    "body": "> doortts | 2012-03-21 수요일 오후 1:37 | Better SW Development | [원본](http://blog.doortts.com/258)\n\n얼마전에 있어던 모 서비스의 장애에 대한 이야기입니다.\n  \n\n어느날 갑자기  [svn](http://ko.wikipedia.org/wiki/%EC%84%9C%EB%B8%8C%EB%B2%84%EC%A0%84) 서버가 정상적으로 동작하지 않는 사건이 발생했습니다. 현상을 조사해 봤더니 서버 인증파일을 읽어들일때 파싱(parsing)이 실패해서 계정 정보를 읽어들어야 하는 SVN이 정상동작하지 않는 것이었습니다.\n\n인증파일을 조사해 봤지만 처음엔 별다른 이상한 점이 보이지 않았습니다. 그런데 가만 살펴보니 파싱 문제가 생긴 부분 윗줄에 적혀있는 계정 ID의 맨 앞에 공백이 하나 살짝 붙어 있는 걸 발견했습니다.\n\n**'이것때문이었나?'**\n\n[vi](http://ko.wikipedia.org/wiki/Vi)로 계정파일을 직접 열어서 ID앞에 붙어있는 공백을 지워봤습니다.\n\n![Wait, I'll fix it.jpg](/files/21921)\n\n**- I'll FIX IT!!**\n\n  \n\n그러자 서비스가 다시 정상적으로 동작하기 시작했습니다.\n\n**'아! 이런! 이거였군!'**\n\n첫 글자가 공백인 unix id가 존재한다는 건 말이 안되고, 더더군다나 계정파일에 들어가는, 발생할 수 없는 (발생해선 안되는?) 상황이 발생한 것이었습니다.\n\n그래서 당연한 수순으로 SVN에서 사용하는 계정 정보의 생성시점에 대해 알아보았습니다. 그 결과 계정정보는 해당 서비스에서 직접 만드는 것이 아니고, 연계서비스에서 일정 시간마다 배치로 넘겨받아서 파일에 작성하는 식이라는 걸 알게 되었습니다. \n\n그러는 사이 또 얼마간의 시간이 지났고, 다시 서비스가 다시 동작하지 않게 되었습니다. 파일을 열어보니 문제를 일으킨 ID에 다시 공백이 붙어 있는걸 볼 수 있었습니다. 계정정보를 새로 넘겨받아서 인증 파일이 다시 갱신되어버린 겁니다.\n\n**'다시 배치가 돌았군. [cron job](http://en.wikipedia.org/wiki/Cron)을 살펴봐서 주기가 얼마인지 확인해보자'**\n\n\n\n15 * * * * batchxxx \n\n\n\n  \n\n**15분 간격(****Every 15 Minutes)**\n\n**'이제부턴 앞으로 15분 간격으로 파일을 열어서 공백을 계속 없애야겠군.... 이 아니라 이런식이라면 앞으로 15분 이내에 대책을 세우지 않으면 또 서비스가 멈춰버리고 말아!!'**\n\n  \n\n![15minutes.jpg](/files/21918)\n\n**...** \n\n우선은 옆자리 대리님을 시켜서 코드를 임시로 고치게 만들고 다시 고민에 들어갔습니다.\n\n**\"서.. 설마, 연계 쪽 서비스에서 가입시에 아이디 앞에 공백을 붙여 가입할 수 있었던 건가?\"**\n\n만약 정보를 저희쪽으로 넘겨준 쪽에서 서비스 가입시에 정말 그런 일이 일어난다면, 그건 예사로운 문제가 아니었습니다.\n\n**\"음.. 하지만, 예전엔 없던 현상인데 갑자기 왜 이런일이? 최근 그 쪽(?)에서 뭔가 코드를 변경하면서 이런 일이 발생한걸까?\"**\n\n연락을 해서 그 쪽(.. 자꾸 그 쪽이라고 쓰려니 어색+귀찮군요. ... 여튼)에 실제 DB에 저장된 정보를 확인해 달라고 요청했습니다. 공백이 들어간 ID가 있는지 여부를 말입니다.\n\n확인결과는 **\"공백이 ID 앞에 들어가 있는 ID는 없음. 그것뿐 아니라 중간이나 뒤에 들어가 있는 경우도 없음. 즉, 우리쪽 문제는 아님\"**으로 연락을 받았습니다.\n\n하지만 저희쪽은 계정정보 자체를 생성하지 않기 때문에, 곤란한 상황에 빠졌습니다. \n\n![jack crying.jpg](/files/21920)\n\n**넘겨주는 쪽과 넘겨 받는 쪽**\n\n저희 입장에서는 소위 말하는 spec에 맞춰 넘겨받는 걸 기대했기 때문에 spec에 맞춰있지 않은 데이터를 가정하고 있지가 않았습니다. 그런데 보내주는 쪽에선 '우린 문제없다'인 상황이니...\n\n더더더 코드를 파고 들어가서 살펴보면 원인을 알아낼 수 있었겠지만, 그럴만한 여력이나 인력이 없었기에 쉬운 방법을 택했습니다. 저희쪽 코드를 수정해서 넘겨받은 데이터에 공백이 있을 경우 trim을 하는 것으로 말입니다. 우선 현상적인 문제는 해결되었습니다만, 석연친 않은 엔딩인거죠.\n\n물론, 경험이 많으신 분들이 곧잘 이렇게 말하십니다.\n\n**\"당연히 이런저런 검사를 했어야지! 스팩? 절대 믿으면 안되아! 넘겨주는 데이터를 어떻게 믿남? 방어형(defensive) 프로그래밍 몰라?\"**\n\n  \n\n**방어형 프로그래밍**\n\n에.. 그러니까... 모르진 않습니다만...\n\n한때 저도 방어형 프로그래밍의 중요성을 이야기 했었고 열심히 터렛코드(turret code)를 작성했었습니다. 하지만 결국 만들어진 코드를 보면 로직은 얼마안되는데 방어 코드들만 잔뜩인 어지러운 모양이 되곤 했었습니다. 시간이 지날수록, 그리고 문제 생길때마다 if 조건이 하나씩 더 붙게 됩니다. \n\n문득 문득 이런 생각이 들곤 했었습니다. \n\n**\"이럴거면 스펙을 왜 만드나? 넘겨받은 데이터를 활용하는 건 넘겨준 쪽 모듈에 대한 신뢰를 기반으로 이루어져야 하는거 아닌가?\"**\n\n그래서 한 번은 새로운 코드를 작성할 때, 눈 딱 감고 방어형 코드들을 전.혀. 작성하지 않았습니다. 네트워크 자체의 신뢰성 의문에 대한 코드를 제외한 모든 방어코드를 뺐습니다. 처음엔 그래도 별 문제 없는 것 같았는데, 때때로 null 넘어오기 시작하고 공백 들어오고 있어야 하는 필드값 없고~ 이런 저런 문제가 생기더군요. 그리고 야단도 맞았습니다. 프로그램의 기초가 안되어 있다며 말입니다. 사실 지금 생각해보면 안되어 있긴 했었죠. ㅎㅎ\n\n뭐, 여튼 그 상황에서 저의 대응은 이랬습니다.\n\n![2086.serious business.jpg](/files/21917)\n\n**\"고쳐주세요. 값 넘기기 전에 검사해서.. 음..  넘겨주세요.\"**\n\n넘겨주는 모듈을 만든쪽도 사실 100% 과실없음은 아니다 보니 뭐라뭐라 하면서 고쳐줍디다. 그리고 저도\n\n**\"고치자. 값 넘기기 전에 검사하고 넘기자\"**\n\n로 응대했습니다.\n\n**믿는 사회 밝은 사회**\n\n즉, 넘겨주는 모듈을 작성하는 쪽에 그렇게 요청했고, 저도 넘겨주기 전에 발생할 수 있는 예상외 상황에 대한 검사코드를 작성했습니다. 이런식으로 작업을 한 부분이 많은 건 아니었지만 (원체 타격이 커서..-,- 여하튼)  나름 꽤 괜찮았습니다. 코드, 함수, 메소드 시작지점에서 각종 if문이 사라졌고, 로직이 끝난 다음 필요하다 생각되는 정도로만 신뢰코드를 넣었습니다. 대표적으로 trim 코드라던가 null 대신 [null object](http://martinfowler.com/refactoring/catalog/introduceNullObject.html)를 넘긴다던가 하는 식으로 말입니다. \n\n**그리고 보통 신뢰코드를 작성하는 것이 방어코드를 작성하는 것 보다 덜 지저분 하고 비용이 덜 듭니다.** 왜냐하면 받는 쪽에서는 작성자가 아니면 해당 데이터가 어떤 방식으로 가공되어 넘어오는지 예측하기가 훨씬 힘들기 때문에 이것저것 찔러보듯 다양한 경우를 가정하고 방어하게 됩니다. (열 경찰이 도둑 하나 못 잡는다 격언대로죠)\n\n여튼 작은 방식의 변화로 불신풍조 만세~! 를 벗어나는 상황을 만드는 노력을 했습니다. **'믿지 말자. 너님 잘못!'**에서 **'남탓하지 말자. 내가 잘하자. 넘겨주는 데이터를 믿을 수 있도록 신뢰를 주자!'**로 말입니다.\n\n별것 아닐 수 있지만, 이것 또한 저에게 많은 인사이트를 주었습니다. 이건 언어자체가 [DbC](http://en.wikipedia.org/wiki/Design_by_contract)를 지원하고 안하고의 기술적인 문제가 아니라, 사람과 조직에 대한 신뢰 문제의 하나라는 걸 느끼게 되었습니다. \n\n  \n\n**역사는 반복된다더라더라더라**\n\n여튼 다시 최근의 장애 상황으로 돌아가 보겠습니다.\n\n현재 해당 서비스는 땜빵코드로도 잘 돌아가고 있습니다. 특별히 건드리는 일이 없다면 앞으로 새로운 버그가 생기기 전까지는 문제없이 돌아갈 겁니다. 하지만 이런 히스토리가 있다는 걸 뒤에 오는 사람들은 모르겠죠. (부끄러워서 알려주기도 싫어!) 그리고 공백이 있는지 검사하는 코드와 트림코드를 볼 겁니다. 그리고 그와 비슷한 친구들 수준의 코드들을 볼겁니다. 그리고는 제가 **기존 코드 선배님들아!**의 코드들을 봤을 때와 같은 대사들을 또 할 겁니다.\n\n**\"아... 이건 완.전. (쓰)레거시인데~~ 척 보기에도 위.. 위험해 보여. 최대한 건들지 말아야겠어...\"**\n\n라고 말입니다. 그럴때 부디 혹여라도 Hall of un-fame(이라고 읽고 주석이라고 불리는 곳)에서 저와 제 옆 자리 대리의 이름을 보게 되는 일은 생기지 않길 바랄뿐입니다.\n\n  \n\n![hani_co_kr_src_comment.png](/files/21919)\n\n**이미지출처**: [http://me2day.net/rainygirl/2012/02/06/pyamvg6-3j9](http://me2day.net/rainygirl/2012/02/06/pyamvg6-3j9)\n\n \n\n#### Comments\n\n혹시 그래서 개발자svn 계정 업데이트 시간이 15 분인가요? \n시간이 공교롭개도 같군요\n\n winpro | 2012-05-03 목요일 오후 8:31\n\n--\n\n정말.. 공교롭군요.. ㅎㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2012-05-04 금요일 오후 3:11\n\n--\n",
    "attachments": [
      {
        "id": 21916,
        "name": "a.aaa.jpg",
        "hash": "41db7e0cc79b2697b2ac077fa26b5c90e082b742",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 39188,
        "containerId": "12407"
      },
      {
        "id": 21917,
        "name": "2086.serious business.jpg",
        "hash": "556918596afaa97d47f0da01b14a72ee1f27cae5",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 16134,
        "containerId": "12407"
      },
      {
        "id": 21918,
        "name": "15minutes.jpg",
        "hash": "07e9042beb411c2a19842538172f32322dad125c",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 14787,
        "containerId": "12407"
      },
      {
        "id": 21919,
        "name": "hani_co_kr_src_comment.png",
        "hash": "cbdc4d6d70aec93ccebda8c9f4feca9e19bac712",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 14034,
        "containerId": "12407"
      },
      {
        "id": 21920,
        "name": "jack crying.jpg",
        "hash": "3199a78f5e3c792f65bc353c12cb6701ef1c5842",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 39342,
        "containerId": "12407"
      },
      {
        "id": 21921,
        "name": "Wait, I'll fix it.jpg",
        "hash": "344621ecf3e66519c26e300000f902fdf1e9c0e0",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 65457,
        "containerId": "12407"
      }
    ]
  },
  {
    "id": 259,
    "title": "누가 로저 래빗을 모함했나? (개발생산성을 높이라구요? #2)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1332489273000,
    "body": "> doortts | 2012-03-23 금요일 오후 4:54 | 이생각 저생각 | [원본](http://blog.doortts.com/259)\n\n![rogerRabbit.jpg](/files/21915)\n\n**[Who Framed Roger Rabbit (1988)]**\n\n\n\n[관련글] **개발 생산성(productivity)을 높이라구요?** [http://blog.doortts.com/182](http://blog.doortts.com/182) \n\n\n\n무언가 일을 하는데 있어서 '잘' 하는 것은 참 중요합니다. \n \n그냥 빨리 하는 것이 중요할 때도 있지만, 기본적으로는 무언가 일을 할때 제대로, 잘 하는 것이 중요합니다. 적지 않은 기간동안 많은 비용을 치루고, 또 치루는 것을 보면서, 때로는 치루지 않고 잘 넘어가는 것을 보면서 느낀 점입니다.\n 제가 이렇게 말할 수 있는 데는 제가 하는 일과도 연관되어 있습니다. 저는 개인이나 조직이 일을 진행할때 어떻게 하면 '잘' 할 수 있는 지를 찾아내서 알리는 일을 하고 있기 때문입니다. : )\n\n저는 뛰어난 개인 이나 조직의 특성을 연구하고 관찰하고, 그 안의 DNA를 발췌해서 전달한 다음 다시 관찰하고 다시 수정해서 반영하는 일을 합니다. 그러다보니 중간 중간 뽑혀져 외부로 나온 것이 Agile이고 TDD이고 Play Framework이었고 MongoDB였었습니다. \n\n그런데 그건 외부로 드러난 현상에 가깝고, 실제로는 앞서 말했듯이 '잘' 하는 방법을 찾고 그걸 막는 문제(blocker)를 찾아서 사람과 조직을 좀 더 유연하고 우수하게 만드는 것이 제가 하는 일의 기본방향입니다. 그리고 실제로 그렇게 해서 절대 '생산량'이 아닌 상대 '생산성'을 높인 사례들을 만들어가기도 하고 때로는 제대로 하지 못해 혹독한 비용을 치루기도 하면서 자연스레 '잘' 하는 것이 '참' 중요하구나 라고 더더 느끼게 되었습니다. \n\n**그런데, 왜 잘하는 것이 중요할까요? \n **\n너무 뻔한 질문 처럼 들리기도 합니다만, 어쨌든 요즘 같은 급변하는 세상속에서는 '속도'가 훨씬 중요한것 아닐까요?\n\n속도를 부정하는 건 아닙니다만, '잘'한다는 것은 기본적으로 '지속성'과 연관이 깊습니다. 한번 불타오르고 사그라들어 재가 되어버리면 '지속'가능하지 못한 방법일 뿐더라 부작용도 큽니다. 그래서 무언가 장기적으로 일을 할 때에는 당장의 효과에 앞서 '지속성'에 관심을 기울여야 합니다. 예를 들자면,\n\n- 일을 많이 빨리 하는데만 집중한 조직은 '조직 이름'은 오래 갈 수 있어도 조직 구성원은 오래 남아 있기 어렵습니다. (물리적인 것 뿐아니라 정신적인 면까지 포함해서 말입니다. :)\n\n- 또 프로그램의 작성법만 배워서 무조껀 열심히 프로그램을 짜면 결국 돌이킬 수 없는 기술적 빚더미(technical debt)위에 올라서서 현재를 버리고 새롭게 재개발 해야 하는 상황이 발생합니다. 대부분의 재개발은 원래 개발만큼의 비용이 들지만, 보통 그렇다고 기존보다 2배 더 많은 기능이 생기거나 2배 더 편해지진 않습니다.\n\n- 이건 스포츠 경기와도 비슷한 데요, 축구의 경우 무조껀 열심히, 빨리 운동장을 뛴다고 결과적으로 좋은 경기가 되고  좋은 선수가 되지 않는 것과도 유사합니다. 물론, 경기 뒤에 고생했다면 등을 두드려주는 심정적인 위안은 될 수 있겠죠.\n\n그런데 사실 여기엔 한 가지 결정적인 갈등적인 요소가 있는데요, 바로 **'잘' 하려면 시간과 돈이 든다**는 점입니다. 그리고 최초의 마찰력을 이겨내고 움직이는데까지는 시간과 돈 뿐 아니라 '좋은 자질'의 사람들도 함께 필요한데요, 마찬가지로 가속도가 생기기 전까진 계속 비용 투자가 필요합니다. 정지상태에 남으려는 관성을 이겨내서 계속 속도를 높여 앞으로 나갈 있게 되려면 개개인에게 속칭 **Do Things Right DNA**가 생겨야 합니다.\n\n그걸 바탕으로 기술, 도구, 프로세스가 함께 발전되고 전달되어 세대를 거쳐 꾸준히 계속 계승되어야 비로서 그 사람의, 그 조직의, 그 회사 만의 고유한 DNA로 남게 됩니다. 한때의 유행이나 바람이 안되고 말입니다.\n\n![geek-girl.jpg](/files/21914)\n\n**[....??]**\n\n여러모로 이런저런 생각을 해 봐도, 현재 일을 보다 '잘' 하기 위해 노력하는 일은 그냥 그대로 따르는 것에 비해 쉬운 일이 아니고 또한 그런 분위기와 문화가 조직의 DNA로 남는 데는 비용이 많이 드는 일인 건 맞습니다 : )\n\n그러다보니 종종 비용논리, 시장논리, 효율논리로 무시되곤 합니다. 생산성보다는 생산량이 더 중요해지고 눈에 보이는 숫자들과 그래프등의 지표가 무기가 되어 공격을 받곤 하죠. 그리고 이런 숫자나 지표에 집중하게 되는데, 사실 이런 것들은 상대적으로 측정하기 쉽고 개선이 용의합니다. 즉, 어려운 환경에서 선택하는 손쉬운 방법 1번이 되는 거죠. 흔히 '측정할 수 없으면 개선할 수 없다'란 말이 정설처럼 받아들여지는 분야들이 있습니다만, 그렇다고 측정할 수 없는 것들은 중요하지 않다는 것은 아니란 걸 잊으면 곤란합니다.\n\n그리고 한편으론 이렇듯 측정하기 쉬운 것을 목표로 삼는 건 매우 위험한 일이 되기도 합니다. 특히나 '조직'측면에선 더더욱 그런 위험이 큽니다.\n\n이를테면 다음 중 어느것이 더 측정하기 쉬울까요?\n \n\n**\"2배의 비용을 들여서 2배 많은 물건을 만드는 것이 유리한가, 2배 더 감동적인 혹은 2배 편리한 물건을 만드는 것이 유리한가?\"\n\n **\n\n![Fotolia_14209170_XS.jpg](/files/21913)\n\n**[이미지출처: [how-to-spark-employee-engagement-and-business-productivity](http://corevalues.com/collaboration/how-to-spark-employee-engagement-and-business-productivity/)]**\n\n당연히 2배 더 많은 물건을 만드는 것이 더 측정하기 쉽고 접근하기 쉬울겁니다만, 결국 조직을 가치 있는 조직을 만들고 더 멀리 더 오랫 동안 나아가게 만드는 건 제가 본 경우엔 측정하기 쉬운 쪽이 아니었습니다. \n\n사실, 이런저런 이야기 계속해야 진부한 이야기이고요, 제가 하려는 이야기는 이렇습니다. : )\n \n혹시라도 '잘'하는 것 보다 '많이 하는 것'에 시달리고 계시다면, 그리고 뭔가 석연치 않다고 느끼고 계시다면 기운내세요.\n\n우리의 선배의 선배의 선배들이 이미 많은 비용을 치루고 그 댓가로 우리에게 전달해 준 이야기들은 그들이 우리에게 준 선물이고 가치 매기기 어려운 가치 있는 이야기들 입니다. 때로는 그게 'SW공학'이라는 이름으로 우리에게 전달 되기도 하고 엔지니어링 테크닉으로, 때로는 Agile이나 Entrepreneur 같은 가치와 단어로 전달되기도 합니다.\n\n그리고 좋은 점은 마치 오랜 속담을 듣는데 돈을 내진 않지만, 값진 교훈을 주는 것 처럼 원한다면 언제든 자신에게 큰 가치를 주는 것이 될 수 있다는 점입니다.\n\n: )",
    "attachments": [
      {
        "id": 21913,
        "name": "Fotolia_14209170_XS.jpg",
        "hash": "c0460ca7c54a9359d3c8e7140e66585e1f225300",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 63084,
        "containerId": "12404"
      },
      {
        "id": 21914,
        "name": "geek-girl.jpg",
        "hash": "b90ccfafabcd3d41ba5f514097a0098d491c5d8d",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 18880,
        "containerId": "12404"
      },
      {
        "id": 21915,
        "name": "rogerRabbit.jpg",
        "hash": "5d24a440ce70b535e6b08179437d59781612469d",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 70115,
        "containerId": "12404"
      }
    ]
  },
  {
    "id": 262,
    "title": "이쁜 자식 매 하나 더 준다는 심정으로 쓰는 node.js 이야기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1334252172000,
    "body": "> doortts | 2012-04-13 금요일 오전 2:36 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/262)\n\n이쁜 자식 매하나 더 준다는 심정으로 글을 적습니다.\n\n그냥 밤에 쓰는 거고 생각나는 대로 쓰는거니 그냥 그려려니 하고 읽어주세요. \n\n아침에 읽으면 전날쓴 연애편지 같은 느낌 나겠죠. 흠흠..\n\n전 node.js 좋아해요. :)\n\n.\n\n.\n\n.\n\n하.지.만..\n\nnode.js를 본격! 서버스택으로 사용하는 데는 현재 아쉬운 점들이 있습니다. (그리고 계속 더더더 나오고 있고요.)\n\n  \n\n**1. **\n\n우선 node.js가 네트워크 라이브러리 스택인지라 서버로 사용하기엔 편의성이 많이 부족하고요, 옵션도 뭐 거의 없다 시피합니다. apache나 niginx보다가 node.js 보면, 이건 뭔가 싶을 정도..\n\n그리고 필요한건 process.ENV로 넣으라는데... 차라리 json으로 configuration 파일을 만들겠습니다. (아.. 이건 아닌가...)\n\n**2. **\n\n결국 **웹앱 만들려면** [express](http://expressjs.com), [meteor](http://www.meteor.com/), [batman](http://batmanjs.org/) 같은걸 써야 하는데 한마디로 춘추전국시대입니다. but 해당 사이트엔 부도 수표같은 부실 문서들이 잔뜩! 아무리 오픈소스라 코드가 보인다지만 코드 읽으며 작성자의 SF미드 pilot 드라마 같은 정신세계를 추측하고 있노라면 어느새 한숨이..\n\n\n\n  return function errorHandler(err, req, res, next){\n\n    res.statusCode = 500;       // 에러 핸들러 넘겼더니 떡 하니 무조껀 500 internal로 하드코딩해서 처리! 야~야~!!\n\n    if (dumpExceptions) console.error(err.stack);\n\n    ...\n\n\n\n[ connect middleware 중에서]\n\n**3. **\n\n**해보지 않으면 알 수 없는** 중학교 영어 학습법 같은 실험들(try and repeat, again, again, again, again~)\n\n    이를테면, 다음 a, b 둘 중 어느걸 써야 할까요?\n\n\n\n    a. \n\n    buffer.slice(start, end).toString(encoding) \n\n    \n\n    b. \n\nbuffer.toString(encoding, start, end) \n\n\n\n    a 가 b보다 10배쯤 느립니다.  왜이런가 하고 찾아봤더니...\n\n    [http://geochap.wordpress.com/2011/05/03/node-buffers/](http://geochap.wordpress.com/2011/05/03/node-buffers/)\n\n    뭐. 이런 시리즈가 또 주르륵... \n\n**4.**\n\n 때때로 기원을 알 수 없는 google **v8엔진**.\n\n V8은 공식사이트에서 ES5 스펙대로 구현했다고 말해놓고\n\n[ http://code.google.com/p/v8/](http://code.google.com/p/v8/)\"V8 implements ECMAScript as specified in ECMA-262, 5th edition...\"\n\n어디 듣도보도 못한 것들도 막 지원..\n\n[http://kangax.github.com/es5-compat-table/non-standard/](http://kangax.github.com/es5-compat-table/non-standard/)\n\n\n\n\n\nvar buf = new ArrayBuffer(32); \n\nif (buffer.byteLength == 16) {  \n\n  console.log(\"Yes, it's 16 bytes.\");  \n\n} else {  \n\n  console.log(\"Oh no, it's the wrong size!\");  \n\n}  \n\n\n\nIE의 JScript 생각이 살짝 날 정도..\n\n거기다 이걸 잘했다 해야 할지 어떨지 모르겠지만, 각종 **data 타입도 v8은 '내가 제일 잘나가!'**식으로..\n\n  \n\n이를테면 자바스크립트의 number는 내가 알기론 분명 range가 64bit 부동소수점,즉 정수로는 +-2^53 (-9007199254740992~9007199254740992)인데 크롬은 **떡~하니** 2^1024까지 자체 지원! \n\n  \n\nnode.js도 v8기반이니 그걸 따라가는데.. \n\n이걸.. 좋아해야 하나... 이봐들.. 스.. 스펙을 쫌!!!!!\n\n**5. **\n\nv8엔진도 서버용으로 만들어진것이 아닌지라 **메모리관리에 한계**가 있습니다. 현재 v8은 얼마까지 가능? \n\n[http://code.google.com/p/v8/issues/detail?id=847](http://code.google.com/p/v8/issues/detail?id=847)\n\n역시.. 응용 애플리케이션 서버용으로 쓰려면 요령이...\n\n**6. **\n\n좋아! 그럼 난 v8을 넘어서서 raw memory에 쓰겠어!라고 마음을 먹고 **buffer**를 쓴다 해도 bug 님이 기다리시고. \n\nc에서 heap 다루듯 다루니 position 계산 잘못하면 garbage data와 말 그대로의 buffer-overflow님을 만날 수 있음. \n\njava의 collection은 23세기 기술쯤처럼 보이기 시작하네요.\n\n거기다가 buffer쓰는 이유가 뻔할텐데 binary encoding 타입으론 쓰지 말라는 알수 없는 공식문서의 멘트\n\n\"`'binary'` - .... This encoding method is **deprecated** and should be avoided in favor of `Buffer` objects where possible. This encoding **will be removed** in future versions of Node.\"\n\n[http://nodejs.org/api/buffer.html#buffer_buffer](http://nodejs.org/api/buffer.html#buffer_buffer)\n\nascii를 쓰면 1bit가 짤리고 base64를 쓰면 30%가 늘고, hex를 쓰니 배가되는데...\n\n**7. **\n\n그리고 v8은 **어쨌든 VM이기 때문에 GC(Garbage Collec****tion)**가 일어납니다. 아마 머지않아 이 문제는 좀더 크게 다뤄지게 될겁니다.  \n\n[jvm쓰면서 eden이 어떻고 old가 어떻고](http://java.sun.com/docs/hotspot/gc/) 하던 시절을 또 만나게 되겠죠. 결국 골방에 앉아서는 이따구 [https://developers.google.com/v8/embed](https://developers.google.com/v8/embed) 같은걸 머리 쥐어뜯으며 읽는 사람(여기 한명요!)들이 생기게 되겠죠.\n\n**8. **\n\n**윈도우 개발자는 여차하면 바보**가 됨.\n\nnpm된지 이제 몇 달 안되었고, 아직도 기본모듈에서 버그들이 수두룩..\n\nfs.read fs.unlink도 제대로 안되던게 쪼~금 해결된게 불과 며칠전..\n\n  \n\n[http://blog.nodejs.org/2012/04/09/version-0-6-15-stable/](http://blog.nodejs.org/2012/04/09/version-0-6-15-stable/)\n\nOS별 path separator는 아예 만들어 놓지도 않아서 기본 모듈 사용할때도 아래와 같은 코드 작성해서 끼워넣어야 함\n\n\n\nvar PATH_SEPERATOR = PATH_SEPERATOR || (process.platform == 'win32' ? '\\\\' : '/');\n\n\n\n'윈도우즈 환경은 이런 뭐..! 안할래염~' 하는 마음이 여차하면 듬\n\n**'윈도우즈도 중요한 플랫폼이다. 적극 지원할 계획이다'고 ryan은 말했지만** 정작 joyent 정규직 직원 두 명 중 한 명 인 ryan은  windows는 쓰지도 않는 골수 POSIX 유저. (다른 한 명인 isaac은 말할 것도 없음... 심지어 npm 도움말을 [man page](http://en.wikipedia.org/wiki/Man_page)로 만들고 그 다음에 [웹으로 포팅](http://npmjs.org/doc/)해 놓았을 정도. 기본 정신세계부터가 windows쪽과는 거리가 멈.  [http://blog.doortts.com/225](http://blog.doortts.com/225) 중에서 'npm'이 약어라면, 왜 대문자로 표시하지 않죠? 항목참조)\n\n그리고 npm install xxx 했더니 make 찾길래 gcc 설치했더니 이젠 python 깔라고 하는건 대체...\n\nOS를 전.혀. 고려하고 있지 않은 다채로운 모듈들! (어디다 좀 써놓으삼!)\n\n  \n\n[msysgit](http://code.google.com/p/msysgit/)에 unix util로는 당췌 해결이 안됩니다.\n\n**9. **\n\n**20년전 개발환경으로 컴백..** (아니.. 30년전인가...)\n\n92년도에도 터미널에서 printf로 찍으며 개발했던것 같은데, [3년뒤면 타임머신 자동차로 하늘을 날아야](http://movie.daum.net/moviedetail/moviedetailMain.do?movieId=10003) 할 것 같은 2012년에 vi로 파일 열고 console.log 명령으로 변수 찍고 있는 자신을 발견..\n\n자리에 일어나서 때때로 복고춤이라도 한번씩 추어야 할까요..\n\n거기다 **디.버.깅**..\n\n댄니 발달된 debugging 환경이란게 겨우 크롬브라우저..[https://github.com/dannycoates/node-inspector](https://github.com/dannycoates/node-inspector) 딴에는 잘 해보겠다고 eclipse도 띄워봤는데 [https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger](https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger) 여전히 에디팅은 sublime text 씁니다. 상용 IDE인 intellij도 써봤는데 debugging할때 object inspect가 안되서 당황하며 포기. (**update**: 최근 버전에서는 object inspect 지원된다고 적혀있네요.)\n\n개발자 ryan은 어떻게 하나 봤더니 [gdb](http://sources.redhat.com/gdb/)를 쓰세요 드립! 아.. 맞다.. 얘는 POSIX 매니아였지...\n\n.\n\n.\n\n.\n\n. \n\n아...\n\n  \n\n이크! 시간이! 이제 자야겠네요. \n\n  \n\n잘 아는양 주절주절 써댔지만, 사실 자바스크립트 + node.js 시작한지가 그닥 오래되지 않아서, 여전히 모르는게 많고 어색어색합니다.\n\n  \n\n에.. 또 기타 다른 이야기는 또 할게요. :)\n\n  \n\n  \n\nps. 아.그리고... 아침이 일어나서 회사가서 봤더니 이 글이 부끄러워지면 지울지도 몰라요. ㅎㅎㅎ\n\n  \n\n-- 아침에 추가 --\n\n생각보다 많이 부끄럽진 않네요. ㅎㅎ\n\n  \n\n**update**\n\nES5 strict mode는 2011년 8월이후 버전(크롬13)이후 부터 지원함. 따라서 node도 현재는 strict mode를 지원합니다.\n\n#### Comments\n\n공감가내요!!ㅎㅎ\n\n [오터넷](http://dhrod0325.blog.me) | 2012-10-11 목요일 오후 10:10\n\n--\n\nGC에 문제점이 있을수 있다고 쓰셨는데 \n대표적으로 어떤 문제가 있는 건가요?\n자바에서 메모리 신경안쓰고 잘써서 특별히 어떤 문제가 있는지 알고 싶어요.\n\n 쿨봉 | 2013-06-03 월요일 오후 5:40\n\n--\n"
  },
  {
    "id": 263,
    "title": "어떤 일을 오래 할 수 있는 어떤 방법",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1334392008000,
    "body": "> doortts | 2012-04-14 토요일 오후 5:26 | 이생각 저생각 | [원본](http://blog.doortts.com/263)\n\n모든 일들이 그러하듯, 즐기지 못하면 오래가지 못한다. 그런데 그렇다고 즐기기만 하면 그것 또한 오래가지 못한다. \n\n \n\n가치를 만들어야 한다. 다만, 가치를 만들되, 타인에게도 유용한 가치여야 한다. \n\n그렇지 않다면 이번엔 다른 사람들이 당신을 멈추게 만들지도 모른다.\n\n  \n\n전부 타인에게 유용한 가치일 필요는 없지만, 만약 그 부분이 보이지 않는다면 찾아야 한다. \n\n찾았으면 아낌없이 공유하자. 그 과정에 드는 시간과 노력을 아까워할 필요는 없다.\n\n  \n\n당신처럼 즐길 수 있는 사람을 찾아낼 수 있게 될 것이다. 그러면 동지가 되고 같이 할 사람이 생기는 것이다.\n\n그리고 어떤 누군가는 같이 하진 못해도 노력에 응원을 보낼지도 모른다.\n\n  \n\n결국 관심가지는 사람이 늘게되면 쉽지 중지되지 않는다. 아주 여러가지 이유로.\n\n  \n\n이게 어떤 일을 오래할 수 있는 어떤 방법이다.\n\n  \n\n그리고 그게 내가 수 많은 시행착오 끝에 배운 작은 교훈이다.\n\n  \n\n.\n\n.\n\n.\n\n몇 자 안되는 글, 행여나 어설픈 설교로 가르치려 드는듯 보일까 싶어 조심스럽지만, 인생 수업료 들여 배운 몇 가지 교훈 중 하나인지라, 남기고 공유해서 한 명이라도 공감하고 바뀐다면 나름 의미가 있겠다 생각되어 남겨봅니다.\n\n#### Comments\n\n잘 읽었습니다. \n\"커뮤니티가 돈 없다고 기업에 손 벌리는 모습은 좋지 않다\"라는 것으로 제게 와 닿았습니다. 요즘 제가 그래요. 기존에 만들어 놓은 것으로 가치를 얘기하기엔 부족해서 매일 노력합니다. \n이젠 팀으로 함께만들고 공유를 해야하는데 쉽지는 않네요. \n좋은 봄날 되세요.\n\n [kenu](http://www.okjsp.pe.kr) | 2012-04-17 화요일 오전 11:31\n\n--\n\nokjsp, 이제 남아있는 몇 안되는 커뮤니티인지라 더 많은 사람들이 기대게 되는 것 같습니다. 애정과 노력 기울이신 만큼 잘 되었으면 좋겠습니다.\n\n그리고..\n\nkenu님이 완전 성공하셔서 많은 후배들의 role 모델이 되셨으면 좋겠습니다. 정말로요.\n\n다음번에 모이실땐 저도 불러 주세요~ : )\n\n [doortts](http://blog.doortts.com) | 2012-04-17 화요일 오후 10:51\n\n--\n"
  },
  {
    "id": 264,
    "title": "OctoberSkyJs 근황 및 모임 안내, 향후 계획 등등의 이야기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1334815790000,
    "body": "> doortts | 2012-04-19 목요일 오후 3:9 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/264)\n\n안녕하세요?\n\n한동안 node.js 모임인 OctoberSkyJs 모임 근황이야기 드립니다. 공식 페북페이지 [www.facebook.com/octoberskyjs](http://www.facebook.com/octoberskyjs) 에는 먼저 살짝 이야기 드렸던 내용입니다.\n\n**#1\\. node.js 공식사이트에 한국 커뮤니티로 등재**\n\n별건 아니지만 OctoberSkyJs 모임이 node.js 공식사이트의 로컬커뮤니티 사이트로 등재되었습니다. :)\n\n![octoberskyjs_in_nodejs_org.png](/files/21922)\n\n뭐, 특별한 의미보다는 좀 더 많은 분들이 한글 자료를 보다 쉽게 접근 할 수 있도록 준비한 내용 중 하나입니다.\n\n**#2\\. 단축 도메인 nodejskr.org**\n\n **** \n\n그리고 [nodejs.org](http://nodejs.org)에 커뮤니티로 등록할 때 핑계김에 한 페이지 짜리 학습용 가이드 페이지를 접근하기 쉽도록 도메인도 하나 연결했습니다.  \n\n앞으로 기억 안나실때는 [nodejskr.org](http://nodejskr.org) 로 접근하시면 됩니다. 공식사이트의 이름 nodejs 뒤에 kr만 붙였습니다. 그리고 단체를 나타내는 꼬리단어로 org를 붙였고요.\n\n**#3\\. 세 번째 모임 안내.**\n\n세 번째 5월 12일 토요일에 진행될 예정입니다.\n\n 현재 장소 섭외는 마쳤고요, 짧은 발표를 하실 분들을 먼저 섭외중에 있습니다. 세미나라기 보다는 함께 이야기 하고 나누면서 한나절 보내는 시간을 생각하고 있습니다. 발표자에 대한 자격같은건 없으니까 공유하고 싶은 내용 있으신 분들은 알려주세요. 회비(약 2만원) 감면 및 우선등록 해 드리겠습니다. 자신의 생각이나 아이디어, 지식이 맞는지도 확인해 보고 논의해 볼 수 있는 좋은 자리이니까 부끄러워 마시고 알려주세요.\n\n공유 발표 신청은 **octoberskyjs@gmail.com**으로 보내주세요. 내용 겹치지 않도록 조율정도만 할 예정입니다.\n\n**#4\\. OcotberSkyJs 모임의 향후 계획**\n\n**올해의 전반적인 계획은 node.js를 더 쉽고 편하게 많은 분들이 사용할 수 있도록 돕는 겁니다**. 그러기 위해서\n\n- 가이드 페이지의 자료를 늘리기\n\n- 가이드 페이지 contribution으로 참여하실 분들 늘리기.\n\n- OctoberskyJs 모임 활동 늘리기 \n\n- 가이드 페이지의 링크가 깨져서 읽기 어려운 일을 막기 위해 snapshot을 pdf 등으로 만들어 제공하기\n\n등등의 활동을 하려고 합니다. \n\n**#5\\. 몇 가지 도움 요청 및 안내**\n\n**- 활동에 도움주실 분은 페북페이지 [http://www.facebook.com/octoberskyjs](http://www.facebook.com/octoberskyjs)에 남겨주시거나 메일주세요.**\n\n  특히 snapshot을 pdf 같은 ebook으로 만들어 놓은 부분은 도움이 많이 필요합니다. 예를들면, 컨텐츠 pdf로 넣는데 확인 받는 메일 주고받기, 간략하나마 book형태로 pdf로 만들기 위해 기본적인 편집작업 등등..\n\n**- 아! 그리고 혹시 이미 node.js 모임이나 커뮤니티 활동을 하고 계신분들, 혹은 추천할 만한 모임등을 알려주시면 가이드 페이지에 링크 달아 놓도록 하겠습니다. **\n\n**- 마지막으로, node.js 기반으로 서비스를 하고 계시거나 준비중이신 분이 계시면 메일이나 댓글 주세요. **\n\n업무로 하시는 분들이 서로 교류하실 수 있는 자리를 따로 만들어 보도록 하겠습니다. 필요로 하시는 분들에게는 소개도 시켜드리고요. : )\n\n#### Comments\n\n행님 축카드려요 ㅎㅎㅎ\n\n [is윤군](http://helols.tistory.com) | 2012-04-20 금요일 오후 12:9\n\n--\n\n아. 이게 뭐 그런 종류는 아니라서 말이지.. 흠... 무슨 인증딴것도 아니고. --; 여튼 관심은 고마워 : )\n\n [doortts](http://blog.doortts.com) | 2012-04-20 금요일 오후 1:26\n\n--\n",
    "attachments": [
      {
        "id": 21922,
        "name": "octoberskyjs_in_nodejs_org.png",
        "hash": "03a63bf0496feef52a67ab8d8215d7f79fb87447",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 26941,
        "containerId": "12408"
      }
    ]
  },
  {
    "id": 265,
    "title": "OctoberSkyJs 세 번째 모임 후기",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1336911822000,
    "body": "> doortts | 2012-05-13 일요일 오후 9:23 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/265)\n\n어제(5.12.토)는 node.js 학습커뮤니티인 OctoberSkyJs의 세 번재 오프라인 모임이 있었습니다.\n\n**사전 안내페이지**\n\n[http://www.facebook.com/octoberskyjs/posts/424422624252307](http://www.facebook.com/octoberskyjs/posts/424422624252307)\n\n장소는 [남산](http://blog.naver.com/PostView.nhn?blogId=ntok2010&logNo=70130990439&parentCategoryNo=50&viewDate=&currentPage=1&listtype=0&from=postList)[ 커피쉬](http://blog.naver.com/PostView.nhn?blogId=ntok2010&logNo=70130990439&parentCategoryNo=50&viewDate=&currentPage=1&listtype=0&from=postList)라는 곳을 추천받아서 진행했는데요 처음 가 보는 곳이라 조금 걱정했습니다만, 다행히 괜찮았습니다. 명동역에서 내려서 가는 길에 살짝 헤맸습니다만, 무리없이 도착은 했습니다. (다른 분도 한 분 장소를 못찾아서 조금 헤매셨습니다)\n\n저희는 2층을 통째로 빌려서 오전 11시부터 6시까지 먹고 놀면서 있었습니다. : )\n\n![IMG_3377.jpg](/files/21926)\n\n\n\n이런 분위기입니다. 바닥도 좋고 분위기도 좋았습니다. 일하시는 분도 참 친절하게 대해 주셔서 좋았습니다. : )\n\n다만 좌식이라 시간이 지나자 허리가 아프다고 호소하시는 분들이 조금 계셨어서 안타까웠습니다.\n\n![IMG_3378.jpg](/files/21927)\n\n\n\n공유 발표주제는 \n\n**- Node.js Happy Hacking, [박난하](https://twitter.com/#!/nanhapark) 님**\n\n**- 노드 불신 자바 개발자의 노드 개발 및 삽질 이야기, [박성철](http://me2day.net/geekinside) 님**\n\n**- Flow Control in Node.js, [송형주](https://twitter.com/#!/hyungjoo_) 님**\n\n**- Javascript Web Application 개발 경험기, [이병주](https://twitter.com/#!/PillarLee) 님**\n\n난하님의 경우 소개때 몇몇 분들이 '**다른 분들은 실명으로 자기 소개했는데 저분은 닉네임(나나)으로 소개하시는군요**'라고 오해를 하셨습니다. 하하하! 원래 오해 많이 받으신다네요.\n\n편하게 오시라고 이야기드렸음에도 전체적으로 다들 너무 준비를 잘하셨어서, 심지어 몇 몇 분들은 '이건 웬만한 컨퍼런스세션 이상의 발표였다'며 놀라움과 감탄을 표시 하셨습니다. 제 생각도 그러했고요.  \n\n- 난하님은 직접 만드신 [nodeman](https://github.com/nanha/nodeman)과 [node.js black edition](https://github.com/nanha/nodejs_black_edition)을 예로 사용하셔서 inside node.js에 대해 재밌는 짤방과 함께 높은 이해도의 지식으로 전달해 주셨습니다. 아마 국내 어디 다른데서는 들어 볼 데가 없을 유니크한 발표였습니다. \n\n- 그리고 전날 술을 먹어서 밤에 그냥 대충 준비해서 부족해도 봐달라고 하신 형주님의 경우에도 '술을 안먹었으면 그럼 대체 어떤 수준으로 발표자료가 나올뻔 한거냐?'라며 사람들이 놀릴 정도였습니다. \n\n- 성철님도 뭔가 '준비 작업하다 망했다'고 이야기 하셨지만 [vert.x](http://vertx.io/)를 이용한 참신/놀라운 결과물에 가장 많은 질문을 받은 인기발표가 되었습니다. \n\n- 병주님은 병특이 끝나가는 young & handsome guy이신데요,javscript mv* 프레임워크중 하나인 [backbone.js](http://documentcloud.github.com/backbone/), [requireJs](http://requirejs.org/) 를 이용해서 사이트를 구축한 경험담을 공유해 주셨습니다. backbone.js를 사용한 국내 서비스가 어디 또 다른 데가 있을까 싶습니다.\n\n예상보다 열띈 진행에 무려 한시간을 넘게 예정시간을 넘겼던 점은 조금 아쉽습니다만, 끝나고도 거의 한 시간넘게 node.js에 대해 토론을 하고 헤어졌습니다.\n\n **** \n\n**마무리**\n\n **** \n\n5월의 토요일이란 것이 참 개인희생이 없으면 만들기 어려운 시간일 수 있습니다. 그럼에도 많은 분들이 기술에 대한 열정과  관심, 그리고 지식을 함께 나누고 배우는 것에 대한 열린 마음으로 함께 하셨습니다. \n\n적지 않은 분들이 이렇게 이야기 하셨었습니다.\n\n**'이 기술, 나 혼자만 하거나 주변에 하는 사람이 없는 줄 알았는데 이렇게 모여보니 이곳 저곳에서 많은 시도가 이루어지고 있고 하시는 분들을 알게 되어서 용기가 되었다'**\n\n커뮤니티란 의미에 맞게, 서로 도우며 함께 성장하고, 그 안에서 각자의 가치(value)를 키워갈 수 있는 좋은 기회가 계속 이어졌으면 좋겠습니다. 저도 부족하나마 앞으로도 열심히 노력해야 겠다는 생각을 하게 되었습니다. 그리고 오신 분들 모두 고생 많으셨고요, 아마 이런 열정이라면 다들 어디서 무얼 하시든 멋지게 잘 하실것 겁니다. (제가 회사 사장님이면 상줬을 것 같습니다. ㅎㅎ)\n\n  \n\n감사합니다. : )\n\n이하 당일 사진입니다.\n\n![IMG_3372.jpg](/files/21923)\n\n남자들이 너무 많다! 라고 하자 바로 **살사모임**을 안내해 주신 [대완](http://ryudaewan.wordpress.com/)님이 전 참 좋았습니다. ㅎㅎㅎ 성격도 넘 좋으시고.\n\n![IMG_3374.jpg](/files/21925)\n\n이 사진을 보고는 누군가는 '난민들..?'이라고 하셨습니다. (...)\n\n![IMG_3376.jpg](/files/21924)\n\n이 사진은 제가 '이거 무슨 세미나나 모임이 아니라 언듯보면 직장인 회식자리 같네요.하하!'라고 했더니, 사진에 계신 분 중 한분이신 관계자(!!)분께서 맛있는 맥주를 쏘셨습니다!! (^_^)/ 덕분에 **국내 최초 음주 세미나**가 되었습니다!!\n\n  \n\nps. 함께 이야기 나누고 들어주시고 맛있는 맥주도 무제한으로 제공해 주신 '윤종석'님 감사합니다.: )\n\n ",
    "attachments": [
      {
        "id": 21923,
        "name": "IMG_3372.jpg",
        "hash": "b5f1d2231bc46af939f865fa35a721d6fe7d038d",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 84064,
        "containerId": "12409"
      },
      {
        "id": 21924,
        "name": "IMG_3376.jpg",
        "hash": "bf999a90a8eb63708bbc41ba5af254e82944db5d",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 99464,
        "containerId": "12409"
      },
      {
        "id": 21925,
        "name": "IMG_3374.jpg",
        "hash": "911f4e4cd69b2cf3e099bb8fa0bdcd5abb65e552",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 108469,
        "containerId": "12409"
      },
      {
        "id": 21926,
        "name": "IMG_3377.jpg",
        "hash": "b438ae18e362533fb33fce6c0c850f2e8993d66c",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 128377,
        "containerId": "12409"
      },
      {
        "id": 21927,
        "name": "IMG_3378.jpg",
        "hash": "3fe986b6a97b9522f421036351e09c2f2bdb08af",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 124072,
        "containerId": "12409"
      }
    ]
  },
  {
    "id": 267,
    "title": "nForge 오픈소스 개발에 참여하실 분을 찾습니다",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1338431047000,
    "body": "> doortts | 2012-05-31 목요일 오전 11:24 | Better SW Development | [원본](http://blog.doortts.com/267)\n\n작년말에 [nForge 프로젝트에 합류했다](http://blog.doortts.com/235)는 소식을 이야기 드렸었습니다. 그 후 한 동안 조용했는데요, 사실 이런저런 우여곡절이 많았었습니다. 회사가, 그리고 저도 nForge를 포기 하게 되는 상황이 되지 않기 위해 많은 노력을 기울였습니다. 결과적으로 전 팀이 바뀌었지만 다행히 nForge를 계속 개발 가능하게 되었습니다. 기본 목표였던 Java 전환 계획은 계속 진행되고 있습니다. 현재는 한창 탄력받아 진행하고 있고요, 이에따라 단기간에 걸쳐 두 명 더 인력을 보충하려고 합니다.\n\n\n\n**기간**: 6월~10월 (4개월)\n\n**개발**: [nForge](http://dev.naver.com/projects/nforge) (오픈소스)\n\n**필요기술**: 자바, 자바스크립트\n\n**위치**: 분당 정자동 그린팩토리\n\n\n\n**매력포인트!**\n\n#1\\. **오픈소스 개발**! 만든 후 일부만 사용하는 숨겨진 SW가 아닌 누구나 사용할 수 있는 제품에 참여할 수 있음!\n\n#2\\. **새로운기술(Bleeding edge technology)**이라 할만한 기술요소들을 사용해 개발하고 있어 정말 많이 배울 수 있음!\n\n#3. **맴버들이 아주 좋음**! 현재는 세 명. 저. 그리고 [황상철](http://pragmaticstory.com/)님, [이응준](https://twitter.com/#!/semtlnori)님\n\n**안내사항!**\n\n- 액수는 정해야 하지만, 급여를 받게 됩니다. (이중취업은 안되어요)\n\n- 4개월간 단기로 참여합니다. (nhn 정식입사가 아닌점은 참 아쉽습니다)\n\n문의사항이나 참여 있으신 분은 아래 주소로 메일주세요.\n\n![sw.email.png](/files/21928)\n\n참여원하시는 분은 메일보내실때, 간략한 자기 소개 적어주시면 더 좋아요. : )\n\n#### Comments\n\n비정규직을로 만드는건 개발인원문제락고 이해를 하더랃도 네이버의 오픈소스 의지가 약한것 같네요 대부분 초기에 개발이 중단된 채로 있고 회사내에서도 그리 긍정적인 분위기는 아닌가 싶네요\n\n 네모 | 2012-05-31 목요일 오후 3:58\n\n--\n\n조그만 기회일지라도 누군가에겐 혜택이 될 수 있도록 준비하고 만드는 것이 참여한 한 사람으로서의 목표이고 책임이라는 생각에 부족하나마 열심히 노력하고 있습니다. \n\n:D\n\n많은 분들께 도움이 될 수 있는 오픈소스가 되도록 더욱 더 분발하겠습니다. \n\n\n [doortts](http://blog.doortts.com) | 2012-06-01 금요일 오전 12:49\n\n--\n",
    "attachments": [
      {
        "id": 21928,
        "name": "sw.email.png",
        "hash": "c7cc093a20373b92b1923a7169b1b71c7328d9ea",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 385,
        "containerId": "12410"
      }
    ]
  },
  {
    "id": 268,
    "title": "들여쓰기 100년 전쟁, Tab vs Space, 2글자 vs 4글자",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1340032134000,
    "body": "> doortts | 2012-06-19 화요일 오전 12:8 | 이생각 저생각 | [원본](http://blog.doortts.com/268)\n\n  \n\n![spacechange.png](/files/21931)\n\n- [방금전 트위터에 올린 글](https://twitter.com/doortts/status/214723277845835776)\n\n코딩 컨벤션을 정하는 것은 굉장히 단순하면서도 굉장히 어려운 일인것 같습니다. 별것 아닌것 같은 규칙 하나가 개발에 대해 짜증을 만들게 하기도 하고, 편하고 즐겁게 만들어 주기도 하니까요.\n\n그 중에서도 매우 오랫동안 논란의 끝에 있는 것 하나는 \n\n  \n\n\n\n**띄어쓰기를 Tab으로 할꺼냐? 아니면 Space 할거냐? **\n\n**2자리로 할거나 4자리로 할거냐?**\n\n\n\n  \n\n의 논쟁입니다.\n\n이건 텍스트 에디터를 사용해서 프로그래밍이라는 걸 하기 시작한 이후부터 시작된 이른바 100년 전쟁에 가까운 논쟁입니다.\n\n저 먼 옛날 Tab이 시작되었던 터미널과 Emacs, vi부터 이야기를 시작할 수도있겠지만, 그런건 좀 지나가고, tab, untap정도는 자연스럽게 처리되는 상식적인 수준의 모던 에디터들을 사용한다는 가정하에서 이야기 해 보겠습니다.\n\n  \n\n그 중 에서도 특히 Tab과 Space 중 어느 것을 들여쓰기 문자, 띄어쓰기 문자로 사용할 것인가에 대해 이야기를 집중해 보겠습니다. \n\n  \n\n(좋은 에디터들은 Tab과 띄어쓰기, 줄 이어쓰기에 각각 다른 간격을 줄 수 있는 시절이니까요)\n\n**엄격주의자(rigorist)적인 측면에서 좀 더 이야기를 해보겠습니다.**\n\n  \n\n우선 들여쓰기(indentation)는 문맥(context)가 깊어지거나 이어주는 다음 줄이 현재 줄보다, 혹은 현재줄이 윗 줄보다 얼만큼 안쪽으로 들여쓰여질 것인가를 나타냅니다. 그리고 띄어쓰기는 말 그대로 간격을 얼만큼 줄 것인가에 대한 이야기로 엄격히는 이 둘은다릅니다. 실제로 들여쓰기와 띄어쓰기를 구분해서 지정할 수 있는 에디터들이 있습니다. (대표적으로 [Jetbrains](http://www.jetbrains.com/)의 intellij를 베이스로 하는 에디터들이 그렇습니다)\n\n  \n\n뭐, TAB은 '띄여쓰기'에 쓰이는 가장 대표적인 문장기호입니다. 단순히 간격을 띄운다고 생각하면 됩니다.\n\n사실 이렇게 까지 구분해서 쓰는 건 조금 강박스럽습니다.\n\n**일반적인 보통사람 개발자 수준에서 이야기를 해 보겠습니다.**\n\n예전엔 8자리 띄워쓰기를 하는 경우도 있었지만, 지금은 보통 4자리 띄어쓰기가 기본입니다.\n\n그러다 최근에는 스크립트 랭귀지 계열을 필두로 2자리 띄어쓰기가 많이 쓰이는 추세입니다.\n\n![4space.png](/files/21930)\n\n**4자 띄어 쓰기**\n\n![2space.png](/files/21929)\n\n**2자 띄어쓰기**\n\n흔한 이유는 web개발시 html tag가 기본적으로 들여쓰기가 심하게 일어나기 때문이기도 하고,\n\n클로저(closure)를 사용하는 언어들에서는 특히 들여쓰기가 많이 일어나기 때문에 줄당 평균 글자수를 확보하는 차원에서 2자리 띄어쓰기를 선호하는 경우가 많습니다.\n\n하지만 시대의 흐름을 떠나 C, JAVA, C# 계열은 4자리 띄어쓰기가 기본으로 굳건히 자리잡고 있습니다.\n\n전 4자리를 선호합니다. 왜냐하면 줄당 평균 글자수를 강제로 줄여주는 효과가 있기 때문에, 좀더 간결하게 작성하도록 유도해 주고, 폰트나 화면이 작은 경우 윗줄이나 아랫줄이 코드를 읽는데 눈이 덜 혼란스럽기 때문입니다.\n\n이건 어디까지나 '**타인의 취향**'에 가까운 부분이니 그러려니 해주세요. : )\n\n**그럼 탭(Tab) 문자 vs 공백(space)문자 중에서는 어떤 것을 사용하는 것이 좋을까?**\n\n마찬가지로 취향의 문제에 가까운 부분이긴 합니다.\n\n다만, 띄어쓰기가 언어의 핵심요소인 언어들이 있기 때문에, 공백과 탭을 섞어서 쓰는건 어느 편이든 공통적으로 금해야 한다고 말합니다.\n\n  \n\n\n\n**ㅎ.. 얼릉 마무리 하고 집에가고 싶어졌습니다. 다음은 각각에 대한 선호자들의 논리입니다.**\n\n**한번 보시고 이 글을 읽으시는 분은 어떤 편을 선호하시는지 알려주세요.** \n\n\n\n  \n\n  \n\nTab vs Space\n\n\n\n **Tab이 좋다**\n\n--------------\n\n- 자신의 취향에 맞게 간격을 조절해서 볼 수 있다.\n\n- 공백 4자리는 탭에 비해 4배의 공간을, 2자리를 쓴다해도 2배의 전산 자원을 탭에 비해 소모한다.\n(이게 전 세계적으로 따져보면 어마어마한 양의 전산 자원 낭비, 마그네틱 소재의 낭비기 된다)\n\n- 나중에 띄어쓰기를 편집할때도 편하다. (백스페이스 한 번에 띄어쓰기 하나씩이 훅훅 지워진다)\n\n**Space가 좋다**\n\n------------\n\n- 에디터와 상관없이 항상 동일하게 보인다.\n\n- 예쁘게 정렬할 수 있고 깨지지 않는다.\n\n  예)\n\nvar name    = 'John'\n\n     , address = 'Chicago'\n\n     , tel     = '012-12310213';\n\n- 창 분할 에디터 사용할 때 유리하다\n\n\n\n4글자 vs 2글자\n\n\n\n**4글자 띄어쓰기**\n\n----- \n\n- 4글자가 익숙하다\n\n- 2글자는 글자가 작으면 들여쓰기가 잘 눈에 띄지 않는다.\n\n- 남들이 4글자 쓰더라.\n\n- 한 줄에 더 적은 글자가 들어가도록 유도해 준다.\n\n**2글자 띄어쓰기**\n\n-----\n\n- 4글자는 간격이 멀어서 읽기가 불편하다.\n\n- 4글자에 비해 절반만 자리를 차지한다.\n\n- 남들이 2글자 쓰더라.\n\n- 한줄에 더 많은 글자를 타이핑 할 수 있다.\n\n**기타 계열**\n\n-------\n\n- 그래서 우린 3글자 띄어쓰길 한다. - some c/c++ 유저\n\n- 우린 상관없다. 어차피 출시때는 코드 줄이기(minify)나 코드 난독화(Obfuscation) 쓴다.\n(그래서 디버그때 코피터진..)\n\n- 전통적으로 tab은 8자인거다!\n\n- 20년 전에도 싸웠던 내용이다. 이제 그만 좀...\n\n- 프로젝트에서 누군가 정한것이 정답! 내 뇌는 유연하다!\n\n\n\n  \n\n**참고...**\n\n**An Eternal Holy War** [http://www.jwz.org/doc/tabs-vs-spaces.html](http://www.jwz.org/doc/tabs-vs-spaces.html)\n\n**tabs or spaces?** [http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=3978](http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=3978)\n\n**Tabs Versus Spaces** [http://c2.com/cgi/wiki?TabsVersusSpaces](http://c2.com/cgi/wiki?TabsVersusSpaces)\n\n그 외 수많은 포럼들...\n\n#### Comments\n\n전 4자띄기..지만 필기할때나\n프로그래밍 할때나 내어쓰기가 나을 거 같아요 ㅋㅋ\n\n ㅋㅋ | 2012-07-07 토요일 오후 10:58\n\n--\n\n전 이클립스가 기본으로 만들어주는대로......\n\n [오터넷](http://dhrod0325.blog.me) | 2012-10-11 목요일 오후 10:4\n\n--\n\n텝이 좋습니다.\n텝으로 통일하면 에디터 설정으로 2-space로 할지 4-space 변경이 쉽습니다.\n하지만, 기존 코드가 있는 경우 (ex. Kernel, Android 등) 거기에 맞추는게 우선이겠죠.\n\n Mei | 2013-06-13 목요일 오후 1:28\n\n--\n",
    "attachments": [
      {
        "id": 21929,
        "name": "2space.png",
        "hash": "8ec5ead87448b77687ab139b7d3ccf4badbfe22a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 43759,
        "containerId": "12411"
      },
      {
        "id": 21930,
        "name": "4space.png",
        "hash": "c17c7174a51b9c2eba08d24b6ea777d61fe87827",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 43768,
        "containerId": "12411"
      },
      {
        "id": 21931,
        "name": "spacechange.png",
        "hash": "ee0a9aae58acbab53f06974a626c99820cdffbce",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 72899,
        "containerId": "12411"
      }
    ]
  },
  {
    "id": 270,
    "title": "nodeconf 2012 instant wrap-up 자료",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1341518679000,
    "body": "> doortts | 2012-07-06 금요일 오전 5:4 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/270)\n\n현재 저는 포틀랜드에서 열린 nodeconf 2012를 참석한 다음 San Francisco로 이동해서 일을 하고 있습니다. 날씨가 끝내주게 좋은데 호텔에 콕! 처박혀서 말입니다. (3초간 묵념)\n\n한국에서 [nodeconf](http://nodeconf.com)를 참여하신 분이 5명이고 그 중 4명이 [OctoberSkyJs](http://www.facebook.com/octoberskyjs) 멤버였습니다. (Wow!)\n\n매일 저녁 wrap-up시간을 가졌고, 자료를 올렸습니다.\n\n우선 먼저 한 번 살펴보세요.\n\n[nodeconf 2012 first day wrap-up](https://github.com/octoberskyjs/home/blob/gh-pages/nodeconf2012_day01.md)\n\n[nodeconf 2012 second day wrap-up](https://github.com/octoberskyjs/home/blob/gh-pages/nodeconf2012_day02.md)\n\n자세한 후기나 참관기는 멤버들이 아마 각자 따로 올리지 않을까 생각해 봅니다.\n\n멤버들과의 최종후기만 먼저 가감없이 옮겨 보면 이렇습니다.\n\n\n\n*   사전에 준비를 하고 매일 저녁 정리하거나 하는 모습이 참 좋은 것 같다.\n*   좀 충격이었다. 형식없고 정리안되어있고 가족적이고 축제같고. 부럽기도 하고. 내용은 둘째치고 그런 풍토를. voice박스에서 노래 못 불러서 아쉬움. 진행이 좀 미숙한 건 아쉬운 점. 미리 프로그램을 알 수 있었으면 좋았을걸\n*   대단하다. 한국에서는 재현하기 어려운 컨퍼런스 분위기. 스텝의 참여가 좋다. 청중이 좋다. 반응 분위기 좋다.\n*   한국은 뭐하나 보자, 잘하나 보자 하는 식으로 참가자가 참여가 잘 안한다. 바람잡이 심어야 하나?\n*   숙제 한 가득 가지고 간다.\n*   매우 유익했다.\n*   프로그램 안 알려줘서 아쉽다.\n*   한국에서도 노드컨프 아시아 같은 행사를 만들어야 겠다\n*   내용이 정말 좋았던 것 같다. 거의 탑 수준. 왜 그런가 생각해봤는데 일단 관심있는 주제들이고 그 방면에 경험있는 사람들이 얘기해주고 (실제로 해본 사람들이) 굉장히 몰입할 수 있어서 컨퍼런스 수준이 내용면에서 굉장히 좋았다. 진행은 꽝. 아 700달러. 돌아가면 할 숙제가 많다. wrap-up을 같이 할 수 있어서 정말 좋았다. 이런 wrap-up을 빨리 하는게 훨씬 좋다(경험상). 같이 참여해주셔서 감사.\n*   너무 오고 싶었던 컨퍼런스여서 오니 좋다. 그냥 있다는 것 만으로도 진행이 어쨌든 그냥 막 좋다. node와는 특별한 연이 있는 것도 있고. node가 좀 미숙한 감도 있는데 그것도 매력. 독일에서 컨퍼런스 하는거봤는데 열악한 환경에서 잘 하더라. 그거보니까 별거 아니란 생각이 들고 여기도 딱히 세련된 것은 없고. 내용은 집에서 동영상봐도 되지만 현지의 분위기를 느끼고 해외개발자들과 어울리는 것이 좋다. 혼자 있으면 와서 밥먹자고 데려가고 그럼. 하나도 못 알아들어도 이렇게 좋은데 다 알아들으면 얼마나 좋을까. 영어공부를 해서 다시 와야겠다. (nodeconf가 아니라도) 돈은 좀 많이 들었지만 오길 잘했다.\n\n\n\n"
  },
  {
    "id": 272,
    "title": "새 책을 쓰기 시작했습니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1348626375000,
    "body": "> doortts | 2012-09-26 수요일 오전 11:26 | Books | [원본](http://blog.doortts.com/272)\n\nLG CNS에서 Agile 확산 활동을 하다가 NHN으로 넘어 온지 이제 1년 조금 넘었습니다.\n\nNHN으로 일자리를 옮기게 된 큰 이유중 하나는 SDS에서 Agile을 확산을 위해 노력하셨던 [황상철](http://pragmaticstory.com/)님과 함께 일을 하기 위해서였습니다. 저는 LG에서, 상철님은 삼성에서 Agile 활동을 했었습니다. 그런데 NHN이라는 곳에서, 그리고 한 팀에서 같은 일을 같이 하게 된다면 어떤 일들을 할 수 있고, 어떤 일들이 펼쳐질지 기대가 되는 마음으로 말입니다. 지금 생각해보면 무슨 생각이었나 싶기도 합니다. \n\nAgile이라는 '**좀 더 사람에 관심을 두고 좀 더 효율적으로 일을 해보자는 운동(movement)**'을 그저 국내에서 각자 하고 있었다는 이유만으로, 어찌보면 그저 하나의 단어 뿐인 'Agile'이라는 단어 하나 놓고, 아직 낯설음이 더 큰 어떤 사람과 함께 일하기 위해 회사를 옮긴 셈이었으니까요.\n\n네. NHN에서 일한지 이제 1년 조금 넘었습니다.\n\n현재 상철님은 저에게 있어, 배울점 많은 훌륭한 동료이자 절친이라 부를 친구가 되었습니다. NHN으로 옮겨서 인생의 +-가 많이 생겼지만, 이 점 하나는 확실히 다른 많은 마이너스를 상쇄할만한 충분히 큰 플러스가 되었습니다.\n\n당연하겠지만, 저희 둘은 함께 자주 이야기를 나누곤 하는데요, 그럴때면 종종 Agile, 팀, 조직, 그리고 다양한 사례와 시각에 대한 내용들을 이야기 하게 됩니다. 그리고 '잡담'처럼 한 번 하고 사라지기엔 아쉬운 내용들이 너무 많다는걸 서로가 알게 되었습니다. 그래서 함께 의견을 모아 결심하게 되었습니다.\n\n**내년 2월까지 제 친구이자 동료인 황상철님과 함께 애자일 개발에 대한 책을 쓰려 합니다.**\n\n어떤 일을 이루는 방법은 굉장히 많은 길이 있습니다. 저희는 애자일이라는 도구를 사용해서 우리가 추구하는 좋은 팀과 좋은 개발을 향해 좀 더 쉽고 빠르게 나아지고 나아갈 수 있다고 믿습니다. 겪어왔던 경험이 그렇고 들은 이야기들이 그렇고 읽은 이야기들이 또 그렇습니다.\n\n저희 둘이 능력이 뛰어나서라던가, 아니면 자신감으로 책을 쓰겠다고 마음먹은건 아닙니다. 좀 더 노력을 기울여서 번거로운 일들을 저희가 모으고 정리해서 이야기 드릴 수 있다면, 적어도 의지있는 일부에게만이라도 도움을 줄 수 있고, 더 적은 비용으로 조금 더 나은 개발을 하실 수 있지 않을까 하는 생각에서 책을 쓰고자 마음먹었습니다.\n\n부족한 점이 많습니다. 그래서 도움이 필요합니다.\n\n사례를 모으고 경험을 모으는 일들이 중요합니다.\n\n애자일 관련해서 하고 계신일, 하고 싶으신 일, 실패의 이야기, 성공의 이야기 뭐든 좋습니다.\n\n알려주시고 귀뜸 주시면 메일로든 아니면 직접 찾아가든 이야기 나눠보고 싶습니다.\n\n그동안 저희가 정리했던 내용들과 함께 잘 묶어서 많은 분들이 볼수 있도록 준비하겠습니다.\n\n많이 도와주세요.\n\n그럼 늘 건강하고 행복한 엔지니어 라이프 되셨으면 좋겠습니다.\n\n즐거운 한가위 되시는 것도 잊지 마시고요. ^_^)\n\n감사합니다.\n\n#### Comments\n\nTDD책 쓰고 다시는 책 안 쓰시겠다면서요 ㅋㅋㅋㅋ\n그래도 응원하겠습니다! 혹시 도움이 필요하다면 언제든지 연락 주세요. ㅎㅎ\n\n [강성희](http://twitter.com/paranoiase) | 2012-09-26 수요일 오후 3:1\n\n--\n\n꼬드김에 넘어갔습니다. ㅎㅎㅎ 사실 성희님은 초대 멤버 넘버1이세요!! 도움 주신다니 말씀만이라도 너무 고맙습니다. 연락드릴게요!! \n\nps.덜컥 일만 벌리고 어찌될런진 모르겠어요.\n\n [doortts](http://blog.doortts.com) | 2012-10-04 목요일 오후 5:56\n\n--\n\n안녕하세요 저술은 잘 진행되시는지 괜찮으면 지금까지 경험을 바탕으로 직간접적으로 같이 얘기하면 좋겠습니다^^\n\n [ologist](http://www.ologist.co.kr) | 2012-10-30 화요일 오전 7:3\n\n--\n"
  },
  {
    "id": 273,
    "title": "한국에서 node.js 컨퍼런스가 열립니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1350634269000,
    "body": "> doortts | 2012-10-19 금요일 오후 5:11 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/273)\n\n[OctoberSkyJs](http://www.facebook.com/octoberskyjs)의 멤버들과 관련 기술에 관심있으신 분들이 힘을 모아서 순수하게 커뮤니티 차원에서 국내 최초로 node.js 컨퍼런스를 준비하고 있습니다. \n\n[nodeconf.kr](http://nodeconf.kr)\n\n현재는 티징사이트 상태로 공개되어 있습니다만 곧 스피커 추가 모집과 일정 안내등의 자세한 내용이 게시될 예정입니다.\n\n다들 고생이 많답니다. 많은 기대와 응원 부탁드려요!\n\n아래 내용은 준비 미팅에서 나온 컨퍼런스 준비 스태프들의 컨퍼런스에 대한 기대와 바람을 가감없이 적은 내용입니다. \n\n  \n\n\n\n**준비 미팅에서 나온 각자의 기대 혹은 바람**\n\n\n\n- node 커뮤니티의 컨퍼런스 준비 과정 오픈하고 사례로 만들자\n\n\n\n    - 장고 커뮤니티의 후기 보기\n\n\n\n- (소심한 성격)참여해보고 싶은 계기\n\n\n\n- 노드 구인 구직의 장소\n\n\n\n- 만남의 장이 되었으면 좋겠다\n\n\n\n- 노드 하는 사람들 만나기, 사람들의 관심이 이어질 수 있는 계기\n\n\n\n- 노드로 이러저러한 것을 알리는 계기, 주제가 다양하게\n\n\n\n- 커뮤니티의 느낌을 가질수 있는 형식이었으면..\n\n\n\n- 국내 node.js의 현황을 알 수 있는 자리가 되었으면..\n\n\n\n    - 그리고 그런 사람들과 만나서 이야기를 들어봤으면 좋겠다.\n\n\n\n- 타 영역 개발자에 대한 node.js의 홍보 \n\n\n\n    - MS 잡지에 실렸으면..\n\n\n\n    - 스탭으로 참석...\n\n\n\n- 실험을 해볼 수 있는 기회\n\n\n\n    - 모임을 만들고 어떤 만남과 반응이 있을지.. 가까워지기도 하고 멀어지기도 하고..\n\n\n\n- 네트워킹\n\n\n\n    - 어떤 사람이 어디서 어떤 작업을 하고 있다\n\n\n\n    - 나는 이런생각으로 이런걸 하고 있다와 같은 이야기를 나눌 수 있는..\n\n\n\n- node.js, 그게 뭐냐? 그걸로 뭘 할 수 있냐?  그걸 해소 할 수 있었으면...\n\n\n\n- node.js, 좋아하는 사람들이 많이 왔으면\n\n\n\n    - 웹개발자 이외에는 아는 사람이 많지도 않은 듯\n\n\n\n- 많이 안왔으면 좋겠다\n\n\n\n    - 처음이니까 정말 좋아하는 사람들이 왔으면\n\n\n\n- 참가해야 해야하는 이유를 신청때 이야기 하면 선정해 주자\n\n\n\n그리고 추가로 제 개인적인 욕심은 : )\n\n\n\n- (주류 근방에라도 합류할 수 있게) node.js가 국내에서 job(=산업)을 만들어 낼 수 있으면 좋겠다. \n\n\n\n- 행사 준비에 참여한 사람들, 커뮤니티 사람들에게 즐거운 축제?가 될 수 있으면 좋겠다\n\n\n\n다들 열정가득하면서도 순진한 엔지니들, 그리고 자원 봉사가분들이라는 생각이 들었습니다.\n\n(스탭은 선물 빵빵하게 줘여~ 이런거 하나라도 나올줄 알았는데 말이죠.. ㅎㅎ)\n\n  \n\n그럼, 많은 기대와 응원 부탁드려요!\n\n감사합니다!\n\n: )"
  },
  {
    "id": 274,
    "title": "node.js 컨퍼런스 발표자로 지원하세요! (부제: 컨퍼런스의 발표자가 된다는 것)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1350967952000,
    "body": "> doortts | 2012-10-23 화요일 오후 1:52 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/274)\n\nPlayNode로 이름이 정해진 [node.js korea 컨퍼런스](http://nodeconf.kr)에서 발표자를 모집하고 있습니다.\n\n![nodeconf.png](/files/21932)\n\n[이미지는 무단 도용! from [here](https://twitter.com/nanhapark/status/260603322623459328/photo/1)] \n\n  \n\n사실, 규모를 떠나서 어떤 컨퍼런스에서 발표자가 된다는 건 결과적으로 여러가지의 의미를 갖게 됩니다.\n\n개인적으로는 준비할 시간, 경험이나 학습에 대한 정리, 그리고 무엇보다 다른 사람들 앞에서 자신의 이야기를 하고 그 반응을 받아들일 수 있는 '용기'가 필요합니다.\n\n  \n\n그리고 어떤 조직이나 단체에 속해 있는 경우에는 그 조직이나 단체에 대한 이미지를 일정부분 개인이 대표하게 되는 것도 생각해야 합니다.\n\n**하지만 무엇보다 중요한 건 발표자가 아니면 얻을 수 없는 중요한 경험과 교훈을 얻을 수 있게 된다는 점입니다!**\n\n때때로 컨퍼런스 발표를 보면 멋지게 잘 해서 부럽다! 멋지다! 라는 생각을 갖게 하는 경우도 있고, 그 반대인 경우도 있고 그렇습니다. 그래서 발표잘하는 사람의 영광보다는 그렇지 않은 사람에 대한 비난의 두려움이 커서 지원 자체를 포기하는 경우가 많습니다.\n\n  \n\n'내 수준에 뭘... ' 이라던가 '내 경험이 미천해서..', 혹은 '이정도 주제로는 발표하기가...'라는 식으로 말입니다.\n\n  \n\n그런데 사실 그런 평가는 자신이 하는게 아니라 다른 사람이 해야 하는 부분입니다. 우선은 먼저 지르고 평가받는 것도 나쁘지 않습니다. : ) 약간 딴 이야기이지만, 안철수 아저씨도 그런 방법을 많이 쓰셨고, 덕분에 많이 성장했다고 들었습니다.\n\n  \n\n그래도 이왕이면 (스티브잡스처럼은 아니더라도) 멋지게 발표를 잘 하면 좋죠.  그런데 그게 가능할지 두려운거죠.\n\n  \n\n사실 발표에 대한 아주 기본적인 진실은 이렇습니다.\n\n **** \n\n**발표 경험이 많을 수록 더 잘 할 가능성이 높다!**\n\n당연한 이야기입니다. 누가 모르나요. 그런데 사실 묘한 아이러니는 자신의 첫 번째 발표는 어떻게 할것인가? 라는 점입니다. 발표 경험이 없잖아요. 첫 발표에서부터 잘 해서 많은 사람들에게 좋은 인상을 주기는 사실 쉽지 않거든요. \n\n  \n\n그런데 이것 또한 뻔하고 간단한 방법이 있습니다.\n\n작은데서 먼저 작게 시작하는 걸로 경험을 쌓는 겁니다. 팀 내 발표, 작은 세미나, 스터디 그룹등등에서 말이죠. 작은 실패와 작은 성공을 반복해서 하면 점점 더 잘 할 수 있게 됩니다. 물론 준비와 노력이 바탕에 되는 건 기본이겠죠? : )\n\n잡담과 서론이 길었습니다! node.js에 관심이 있었고 다른 사람들과 이야기를 나눠보고 싶으신 분은 발표자로 신청하세요! \n\n  \n\n다음에 더 성숙해지면.. 이라는 핑계로 미루면 평생 그런 기회는 안온답니다. \n\n(좀더 읽어 볼만한 글: [나의 멘토는 어디에 있는가? ](http://blog.doortts.com/147))\n\nnode.js 발표자 지원 링크는 [**여기**!](http://nodeconf.kr) 입니다.\n\n\n\n[nodeconf.kr](http://nodeconf.kr) 에 링크로 걸려있는 발표자 지원 문구..\n\nnode.js에 대해 공부하거나 적용해본 내용, 혹은 다른 사람들과 함께 나누고 싶은 사례 등에 대해 발표하실 분을 찾습니다. \n\n저희 모임(OctoberSkyJs)내의 멤버 분들이나 주변 분들 이외에 아직 드러나지 않은 사례와 node.js를 사용하고 계신 개발팀/개발자 분들을 찾아서 먼저 기회를 드렸으면 하는 마음에 공개적으로 스피커를 모집하게 되었습니다.\n\nnode.js를 이용해 작업하신 내용에 대한 경험담, 기술에 대한 노하우등을 다른 node.js 개발자 분들과 함께 이야기 나누고 피드백 받을 수 있는 시간 가지셨으면 좋겠습니다. (핑계김에 이런저런 홍보하시고 인맥도 넓히시는 자리가 되도 좋고요! :D)\n\n\n\n-- 2012.11.16일 추가 --\n\n혹시라도 오해하실수 잇겠다 싶어 설명을 추가합니다.\n\n이 글은 node 컨퍼런스를 발표연습으로로 쓰시라는 의도는 아니었습니다. \n\n스스로 실력이 부족하다 생각해서 미리 포기하시거나 하지 마시고 도전하시라는 의미였습니다. : )",
    "attachments": [
      {
        "id": 21932,
        "name": "nodeconf.png",
        "hash": "6c006293e308f78dbf7a720838cf0b456a2e5c31",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 401230,
        "containerId": "12415"
      }
    ]
  },
  {
    "id": 275,
    "title": "node.js 컨퍼런스 PlayNode 신청이 내일 오후 2시부터 시작됩니다!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1352123426000,
    "body": "> doortts | 2012-11-05 월요일 오후 10:50 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/275)\n\nnode.js 컨퍼런스 PlayNode 신청이 내일 오후 2시부터 시작됩니다!\n\n[http://onoffmix.com/event/10254](http://onoffmix.com/event/10254)\n\n혹은\n\n[nodeconf.kr](http://nodeconf.kr)\n\nnode.js 관심있으신 분이라면 여러가지로 더 없이 좋은 기회이니 놓치지 말고 꼭 신청하세요!\n\n  \n\n.\n\n.\n\n.\n\n여의치 않으면 까짓꺼 휴가 하루 내는 겁니다! 언제 또 이렇게 node.js 하는 사람들이 대거로 모일 수 있겠습니까~ 자신에게 투자는 누가 해주는게 아니죠! 스스로 하는겁니다! 지르세요!\n\n![apply.png](/files/21933)\n\n**[왠지 그냥 캡처해서 화살표 넣고 싶었습니다! ㅎ]**",
    "attachments": [
      {
        "id": 21933,
        "name": "apply.png",
        "hash": "db891a1813658ad11c14d3ae3204d0822922b5cd",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 307594,
        "containerId": "12416"
      }
    ]
  },
  {
    "id": 277,
    "title": "2012년 회고 #1 - PMI(Plus/Minus/Insight)",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1357040739000,
    "body": "> doortts | 2013-01-01 화요일 오후 8:45 | 잊기전에 회고 | [원본](http://blog.doortts.com/277)\n\n새해 첫 날이지만 밀린 2012회고를 짧게나마 적고 지나가야겠다는 생각이 들었다.\n\n좋았던 점 / 잘한 점\n\n\n\n- 또 한 해 살아 남았다? \n\n- 개발자노트와 nFORGE라는 도구를 만들었는데 많이 배웠다.\n\n- 팀 인원이 적었지만 즐겁게 지낼수 있는 좋은 팀이었다.\n\n- 어쩌다보니 새로 온 회사에 얼마 되지도 않았는데 두 쌍의 커플을 결혼으로 골인시킴!\n\n- 7월 포틀랜드에서 열린 node.js 컨퍼런스가서 committer들을 꼬셔서 11월에 한국으로 불렀던 점\n\n- node.js 한국 컨퍼런스 PlayNode 성공적으로 개최!\n\n\n\n아쉬운 점\n\n\n\n- 블로그에 글을 많이 못 썼네요\n\n- 체력의 급격한 저하\n\n- 욕심을 부려서 많은 일을 하려했던 점. 그래서 스트레스도 받고 마무리가 아쉬운 일들이 생기게 된 점\n\n- 개발자 혹은 엔지니어로서 어느정도 성장했는지는 잘 모르겠음\n\n- 여름즈음에 방황(?)했던 일\n\n\n\n배운 점\n\n\n\n- 혼자 보다는 여럿이 함께 하는 것이 더 힘들지만 혼자서는 할 수 없는 더 큰 일을 할 수 있다!\n\n- 사회생활에서는 인간관계라는 것이 참 중요하구나!\n\n"
  },
  {
    "id": 278,
    "title": "2012년 회고 #2 -  개인 SNS글 중 기억하고 싶은 생각, 그리고 나누고 싶은 메모",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1357043763000,
    "body": "> doortts | 2013-01-01 화요일 오후 9:36 | 잊기전에 회고 | [원본](http://blog.doortts.com/278)\n\n[작년 글](http://blog.doortts.com/241)에 이어서 정리해 보는 2012년 회고 #2 -  개인 SNS글 중 기억하고 싶은 생각, 그리고 나누고 싶은 메모!\n\n2012에는 트위터는 비슷하게 사용했지만 '미투'서비스는 사용이 확 줄어들면서 '페이스북'사용이 크게 많이 늘었습니다. 그 중 '기억하고 싶은 생각', '나누고 싶은 말들'이라 할만한 것을 몇 가지 찾아서 문장 조금 다듬어 남겨봅니다. 뭐, 어느새 새해가 되었고, 이런저런 이유로 조금 늦었지만 그래도 결산의 의미로 정리해 적어보았습니다. \n\n\n\n- 직장생활 10년이 넘었지만, 그 동안 (나를 포함해) 어느 누구도 자기 자신이 '**비 이성적으로 행동하며 말이 안통하는 사람**'이라고 생각하는 사람은 본 적이 없다. 그런데 주변에 그런 사람 본적 있냐고 물어보면 대부분 있다고 대답한다. (...?!)\n\n- 내 안의 어떤 자아끼리의 대화 \n\nA: 일정계획 세우려니 머리가 아프네. 어차피 계획세운대로 잘 안될것 같은데.. 흥~ \n\nB: 어차피 운전이 내맘처럼 안된다고 빙판길에서 운전대를 놓을 순 없잖아. \n\nA: 아...?!\n\n- 가끔 '이 사람은 일을 안하는 걸까?' 라는 의구심이 들 정도로 다양한 활동을 하는 사람들이 있다. 그런데 가만히 살펴보면 대개는 당신 생각과는 달리 실제로 그렇다. (..으응?) ㅎㅎㅎ\n\n- 그럴려고 그런건 아닌데 옆에 앉은 여자분이 전화 상대방에게 '어디로오라구? 목성토성역?'이라고 말하는 바람에 그만 혼자 뿜어버렸다. 미안요\n\n- 실패경험 없이 성공한 사람들은 실패하는 사람들의 이유를 **오해**하곤 한다.\n\n- 과학자들은 실패를 '데이터'라고 부르는데 우린 왜 이렇게 실패를 두려워하고 피하려하는가?\n\n- 사람이 일을 너무 열심히 하다보면 정작 '즐겁게 사는 방법'을 까먹게 된다. 그러다 결국 나중에는 다시 재현해 내지 못하는 지경에 이른다.\n\n- **초심**을 잃으면 원래 마음이 불안하고 조급해 지는 법이다. : )\n\n- 때때로 드는 생각. '이미 대부분의 수레바퀴는 만들어져 있다. 어디있는지, 어느게 적당한지를 몰라서 바보같이 다시 만들고 있을 뿐'\n\n- 비슷한 동네에 사는 사람들은 생각도 비슷한 법이다. **클린룸에서 면벽수행**으로 나온 아이디어가 아니라면 '내 아이디어네, 니 아이디어네'하면서 자랑하거나 서운해 하거나 할 필요 없다.\n\n- nhn이라는 단어를 타이핑 할 때 한영 변환을 하지 않아 곧잘 실수로 ㅜㅗㅜ 이라고 타이핑을 하곤 한다. 그리고는 그때마다 한 번씩 피식.. 웃는다. '울지마!' 이러면서.\n\n (註: 이건 팀 해체되고 회사 분위기 어수선하고 그런시점에 쓴.. )\n\n- 다른 여자들보다 자신이 더 많은 걸 자신의 남자에게 요구한다고 생각하는 여자는 없다. \n\n- 구글 크롬브라우저는 현재 버전이 무려 18인데도 여전히 배경색과 배경 이미지 인쇄를 지원하지 않는다. 어떤 의미론 참 강직하다만, 이런데는 쓸데없이 강직한 모습 보이지 말아줘. \n\n (註: 현재는 크롬이 버전23\\. 여전히 배경인쇄가 없다 -_-)\n\n- 열광하는 것이 많은 사람의 인생과 열광하는 것이 적은 사람의 인생은 그 열렬함의 강도와 분야를 떠나 타인에게 보여주는 **에너지**가 확실히 다르다.\n\n- 사회적 통념상 '성공했다' 생각되는 사람이 정작 본인의 마음이 평안하지 못하고 자유롭지 못한 것(처럼 보이는 것)을 볼때면 '그럴거면 **소중한 인생**(=말 그대로의 Life Time)을 써가며 뭣하러 악착같이 성공했는가?'싶은 마음이 든다.\n\n- 우리가 무엇을 판단할 때 옥석을 잘 가리지 못하는 이유 중 하나는 '돌'을 쳐다보지 않고 '돌'을 쳐다보는 **주변사람들의 얼굴**을 쳐다보고 결정하기 때문이다.\n\n- 우리가 만드는 수 많은 (프로그래밍적인) 죄악은, '무지'가 아닌 '무시'에서 기인한다. 지식이 있고 능력이 있기 때문에 기회가 되거나 마음만 먹으면 언제든 '제대로' 할 수 있다고 믿곤 하지만, 평소에 안하면 평생 못한다. 그게 내가 본 현실이다.\n\n- 어떤 분야에 대해 공부를 많이 해서 지식이 많은 것과 실제 해당 분야의 일을 능숙하게 수행하는 것에는 큰 차이가 있다. 이건 축구에 대한 지식만으로는 좋은 플레이어가 될 수 없는 것과 같은 이치이다.\n\n- 나이 먹어가면서 아는 것이 많아지니 겁나는 것도많아지지만 아이러니하게도 **사고치는**** 속도나 규모**가 점점 빨라지고 커지는 것 같다. (묵념)\n\n (註: 우리나라에서 node.js 컨퍼런스를 개최하겠다고 선언하고 일을 진행하던 즈음에 쓴 글)\n\n- 자신에게 **따금한 이야기**를 해 줄 수 있는 가족 이외의 사람이 옆에 있다면 그건 큰 축복이다. 하지만 대부분은 그렇게 생각하지 않고 그런 사람과는 관계를 형성하지 않으려고 노력한다.\n\n- 많은 경우에 있어 좋아하는 걸 '일'로하면 하기 싫은 부분도 해야 한다. **취미**로 하면 안해도 되는 그런 부분을 말이다. 따라서 취미를 일로 삼을 때는 잘 생각해 보아야 한다. \n\n- 엔지니어링에 대해 소박한 마음으로 멋진 SW를 만드는 엔지니어를 보면 참 좋다!\n\n- '회사'라는 조직은 곧잘 서로가 **서로를 복제하는 것이 생존 전략**이고 그걸 이루기 위해 곧잘 자신을 포함한 다른 사람의 인생까지도 소모해 버리곤 한다. 전략의 성공/실패 여부와는 별개로 조금 안타까운 일이다.\n\n- 내가 못을 만들어 공개하면 다른 사람이 망치를 만들고, 또 다른 사람이 망치와 못으로 책상을 만들고, 또 다른 사람들이 책상을 모으고 칠판을 붙여 교실을 만드는 것이 **오픈소스 개발**이다.\n\n- 정리해 놓은 것이 너무 많아져서 다시 정리가 필요해진 상황. 뭔가 아이러니하네..\n\n- 종의 생존이 다양성에서 근거하듯 **SW개발방식**도 Best Way 한 가지만 있었더라면 지금처럼 발전하진 않았을 것이다. 하지만 그걸 알면서도 안 그랬으면 어땠을까 할 때가 있다. 때론 마치 엔딩없는 드라마를 십수년째 보는 느낌이라 가끔씩은 지친달까..\n\n- 지금은 '대항해시대' 같은 느낌의 '**대스타트업 시대**!' 저비용으로 창업하기엔 환경적으로 괜찮은 시절인것 같다.\n\n (註: 이건 2013년에도 이어지는 내용일 될 것 같다!)\n\n- 상당수의 경우, 학자(학생)나 현업개발자나 제대로된 SW를 만들어내지 못한다. 한 쪽은, 아는 건 많은데 (동작)하는 게 적고 다른 한 쪽은, 하는 건 많은데 아는 게 적다.\n\n- 오늘 하루 정말 열심히 살았는데 문득 든 생각. 열심히 하는게 중요한게 아니다. 잘 하는게 중요하다. (젝일!)\n\n- gmail 안 읽은 메일을 0개로 만들었다. 이게 몇년 만이더냐!\n\n- 두 종류의 사람이 있다. 좋아하는 걸 하기 위해 지금은 싫어하는 일을 참고 하는 사람과 좋아하는 걸 하기 위해 다른건 다 포기하고 좋아하는 것만 하는 사람. 전자는 어느 샌가 싫어하는 일이 익숙해져 살고, 후자는 크게 성공하거나 크게 욕을 먹는다.\n\n- 자신에게 따금한 이야기를 해 줄 수 있는 가족 이외의 사람이 옆에 있다면 그건 큰 축복이다. 하지만 대부분은 그렇게 생각하지 않고 그런 사람과는 관계를 형성하지 않으려고 노력한다. 상대에게 애정이 없으면 아픈 말 못한다. 일반적으로 '우호 관계 상태'를 선택하고 침묵 하기 때문이다.\n\n- '솔직(쿨)하게 의견을 표시했을 뿐'이라는 식으로 면죄부를 받았다 생각하겠지만 그것이 타인을 상처주는 것에 대한 변명이 될순없다. 단지 본인 편한대로 이야기하고 배려하지 않았을 뿐이다. 그리고는 본인은 뒷끝없다는 식으로 마무리하는 사람들은 최강 언쿨!\n\n- 사람들은 종종 **호기심**에 눈이 멀어 자기 자신을 과대평가하는 경향이 있다. 이를테면 \"난 정말 괜찮으니까 이야기해봐봐!\"와 같은 식으로.\n\n- 비판만 하지 말고 대안을 이야기하라며 오히려 아랫사람을 나무라는 경우가 있는데, 아랫사람이 문제도 알려주고 대안까지 알려주면대체 당신은 그 자리에 왜 앉아 있는건가?\n\n- 독서량이 줄어든 이유를 알았다! 회사랑 집이 너무 가까워 졌기 때문이다! (책은 지하철에서 읽어야 제맛!)\n\n- 우리는 \"지식\"을 늘이는 것 만큼이나 \"지혜\"를 늘리기 위해 노력해야 한다. 너무 뻔한 이야기라 와닿지 않는다는 생각이 드는가? 그렇다면 현재 우리나라 정치인들을 떠올려 보시길.\n\n- 가르치는 사람 입장에서 '지식'과 '지혜' 중 어느 것에 집중할 것인지 결정해야 한다. 지식은 개인이 노력하는 만큼 지속적으로 성장할 수 있다. 하지만 지혜는 그렇지 않다. 우리 선배들이 집중해야할 것은 지혜를 전하는 것이다. \n\n (註: 교육기관 NHN Next의 선배에게 한 이야기)\n\n- 오늘은 12월31일. 사무실 저편의 누군가가 조심스레 물었다. \"내일… 쉬는 날이죠?\" 순간 하던 일을 다들 멈추고 잠시 침묵. 그리고 누군가 자신없는 목소리로 대답. \"쉬는 날… 아닌가요? \" (…) … 뭐.. 뭐지.. 이사람들은… -_-;;;\n\n"
  },
  {
    "id": 279,
    "title": "누가 내 시간들을 가져갔는가? RescueTime!",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1357228485000,
    "body": "> doortts | 2013-01-04 금요일 오전 12:54 | Better SW Development | [원본](http://blog.doortts.com/279)\n\n예전에도 이야기 드렸습니다만 전 개발생산성(~~생산량이 아니고~~)에 관심이 많습니다. 그런데 저도 때때로 한주 바쁘게 살았는데 주간보고를 쓰려고 보니 '**이거 뭐 딱히 굵직굵직한게 없네~**'(혹은 다른말로는 '내세우기 어려운 격무로 한주를... 젠장!')이라는 상황에 직면하곤 합니다.\n\n이럴때면 구차하게 짜잘한일 적기 조금 부끄럽습니다만, 어느 정도 진지하게 써야 합니다. 그런데 이게 성격에 안 맞을 수도 있습니다.\n\n막말로 어느날인가는 눈딱 감고 당당하게 **\"네! 이번주 놀았습니다!\"**라고 말할 수도 있습니다. 너무 대놓고 이야기하면 관리자가 오히려 그 당당함에 놀라 **'그.. 그래. 한주 정도는 설설 일할수도 있지! 일도 좀 쉬면서 해야 하는거지. 흠흠'** 이럴 수도 있겠죠.\n\n(대신 1회용 카드라 자칫 계속 쓰면 '이제 그만 나오고 전문적으로 쭉 쉬게!' 이런일이 생길 수도...)\n\n여튼 뭐 그건 그렇다 치고 대체 나는 회사에서 하루종일 주 5일을 뭘 하길래 이리 바쁘고 한 주가 훅딱!가는 걸까? 궁금해 질 수 있습니다.\n\n이런 사람들을 위한 서비스가 있더군요.\n\n![rescuetime.png](/files/21935)\n\n**[본격 내시간 어디갔냐? 추적서비스, RescueTime, [https://www.rescuetime.com](https://www.rescuetime.com/)]**\n\n자신의 노트북, PC등에 앱을 설치하면 어떤 앱을, 그리고 웹 브라우저일 경우 어떤 사이트를 어느정도 사용하는지 기록을 해서 1주일에 한번씩 자신에게 '생산성'을 측정해서 메일을 보내줍니다. 좀 더 자세한 내용을 알려주는 유료버전도 있는데, 우선은 간단하게 어떤데에 얼마나 시간을 쓰고 생산성이 얼마인지 알려주는 건 무료입니다.\n\n사용한지는 한 달 반 정도 되었는데요, 생각보다 꽤 괜찮습니다. \n\n(조금 적나라하긴 합니다만) 대략 아래와 같은 보고서가 매주 메일로 옵니다.\n\n![rescuetime_report.png](/files/21936)\n\n**[개발은 얼마 안하고 hwp를 이렇게 많이 쓰다니!!! 난 누군가? 여긴 어딘가?] **\n\n자신의 삶이 궁금하신 분들은 한번씩 써보시면 좋을 것 같습니다.\n\n참고로 유료 서비스 선택중에 굉장히 무서운 'Supervisor모드(=팀원들의 보고서를 볼 수 있는)'서비스도 있는데 생각만 해도 아찔 하군요. (자칫 재미로 시작했다가 비장한 '인간시장' 다큐찍는 수가 있습니다)\n\n부디 어디까지나 자신을 위한 자신만의 서비스로 즐기시기 바랍니다.\n\n그럼 계사년 새 해 복 많이 받으세요!! : )\n\n  \n\n#13년 2월25일추가\n\n때로 불타는(활활~) 주에는 아래처럼 나오기도..\n\n적게 일했지만 생산성은 더 좋아졌네요 ^^;\n\n![RescueTime20130225.png](/files/21934)",
    "attachments": [
      {
        "id": 21934,
        "name": "RescueTime20130225.png",
        "hash": "b0eb7a8e72cd353a59fcf2baaacf37ae2b402912",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 43111,
        "containerId": "12419"
      },
      {
        "id": 21935,
        "name": "rescuetime.png",
        "hash": "6d39e8a3bc153b510b3356b2ba4972a2eaff0d76",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 98866,
        "containerId": "12419"
      },
      {
        "id": 21936,
        "name": "rescuetime_report.png",
        "hash": "2fb19d2c78ac768b88310bb6bcae5294d0be1a2e",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 103793,
        "containerId": "12419"
      }
    ],
    "comments": [
      {
        "id": 2,
        "type": "NONISSUE_COMMENT",
        "authorId": "doortts",
        "authorName": "너굴",
        "createdAt": 1479384068000,
        "body": "정말인건가요?"
      },
      {
        "id": 3,
        "type": "NONISSUE_COMMENT",
        "authorId": "doortts",
        "authorName": "너굴",
        "createdAt": 1479385530000,
        "body": "![yona-logo.png](/files/21955)[chap3-handout.ppt](/files/21956)\r\n\r\n으응?",
        "attachments": [
          {
            "id": 21955,
            "name": "yona-logo.png",
            "hash": "8133367bff3da8b9a84cd149c840cc50471116f2",
            "containerType": "NONISSUE_COMMENT",
            "mimeType": "image/png",
            "size": 2459,
            "containerId": "3"
          },
          {
            "id": 21956,
            "name": "chap3-handout.ppt",
            "hash": "bad58d41be4b5187a1e3ace1ef9c723ed30b1b12",
            "containerType": "NONISSUE_COMMENT",
            "mimeType": "application/x-tika-msoffice",
            "size": 755200,
            "containerId": "3"
          }
        ]
      }
    ]
  },
  {
    "id": 280,
    "title": "무료 e북, 애자일 초심자를 위한 '애자일 SW개발 101'이 공개되었습니다.",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1357806406000,
    "body": "> doortts | 2013-01-10 목요일 오후 5:26 | Better SW Development | [원본](http://blog.doortts.com/280)\n\n작년에 NIPA 소프트웨어 공학센터의 미녀박사님 '이세영'님을 주축으로 다른분들과 함께 작업해서 만든\n\n무료 e북, 애자일 초심자를 위한 '애자일 SW개발 101'이 공개되었습니다.\n\n링크는 [여기](http://www.software.kr/mbs/swkr/jsp/board/view.jsp?spage=1&boardId=143&boardSeq=888076&mcategoryId=&id=swkr_040100000000)!\n\n생각보다 잘 만들어졌고 생각보다 아쉬운점이 많은 가이드 북이지만, 애자일로 프로젝테를 진행해 보고자 하는 분들에게 조금이나마 도움이 될 수 있으면 좋겠다는 작은 바람입니다. ^^;\n\n![agile101_cover.jpg](/files/21937)\n\n#### Comments\n\n좋은 자료입니다 :)\n\n [archmond](http://archwin.net) | 2013-01-11 금요일 오전 9:19\n\n--\n",
    "attachments": [
      {
        "id": 21937,
        "name": "agile101_cover.jpg",
        "hash": "0d12192ca52732dfb3609f450428b08c60ce4f08",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 34844,
        "containerId": "12420"
      }
    ]
  },
  {
    "id": 281,
    "title": "[뭘, 이런걸 다?] 주기적으로 git 저장소에서 코드 가져오는 쉘",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1363073561000,
    "body": "> doortts | 2013-03-12 화요일 오후 4:32 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/281)\n\ngithub 등의 특정 git 저장소를 이용해서 개발할 경우 지속적으로 최신 코드를 반영해서 테스트를 해야 할 때가 있습니다.\n\n![git_project.png](/files/21938)\n\n이럴때 개발 테스트 서버에서 주기적으로 저장소로부터 코드를 받고 싶으면 아래와 같은 간단한 쉘로 처리할 수 있습니다. (아래 예제는 30초마다)\n\n\n\n## pullpoll.sh\n\nPOLLING_TIME=30\n\nwhile :\n\n  do\n\n      git remote show origin | tail -1 | grep \"up to date\"\n\n      if [ \"$?\" = 1 ]; then\n\n        echo \"===================\" >> pull.log\n\n        date +\"%F %R\" >> pull.log\n\n        git pull >> pull.log\n\n      fi\n\n      sleep $POLLING_TIME\n\ndone\n\n\n\n실행은\n\nnohup sh pullpoll.sh > /dev/null",
    "attachments": [
      {
        "id": 21938,
        "name": "git_project.png",
        "hash": "cfe038ef90560a823dacd8d246c7042622029ca4",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 39618,
        "containerId": "12421"
      }
    ]
  },
  {
    "id": 282,
    "title": "개발중인 nFORGE는 지금? Rebuild & Reloaded",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1363701275000,
    "body": "> doortts | 2013-03-19 화요일 오후 10:54 | Better SW Development | [원본](http://blog.doortts.com/282)\n\n한동안 안 썼더니 글을 잘 못쓰겠네요. ^^;\n\n그냥 짧막하게 쓸게요.\n\nnFORGE\n\n관련 이전 이야기: \n\n- [http://blog.doortts.com/267](http://blog.doortts.com/267)\n\n- [http://blog.doortts.com/235](http://blog.doortts.com/235)\n\n이런저런 우여곡절을 겪으며 nFORGE 개발을 진행하고 있습니다. 올해는 이제 수확도 하고 다음 작물도 준비해야 하는 해인지라 할일이 많습니다. ^_^);\n\n- 올 1월에는 사실 이런저런 팀 내/외적인 문제로 인해 nFORGE 개발이 거의 중단되다 시피 했었습니다. 속상하고 아쉽고 미안하고 뭐 그렇습니다.\n\n- 1월말/2월초에는 개발 팀 원이 저와 [@semtlnori](https://twitter.com/semtlnori) , 단 두 명까지 줄어드는 위기를 겪었지만 다행히도 프론트엔드 개발자 한 명, 개발 업무를 서포트 해 주실 PM님 한 분이 합류하셨습니다. 센터의 디자이너분도 한 동안 fulltime에 가깝게 도와주시고 계십니다.\n\n  \n\n- 팀을 새로 정비하고 마음도 정비해서 2월부터는 리빌드에 가까운 수준으로 개발을 재개하고 있습니다. 저도 [Task Board 만드는 걸](http://readme.skplanet.co.kr/?p=3585) 잠시 중단하고 nFORGE 기존 기능 개발/개선하는걸로 작업을 변경했습니다. 우선 내부의 문제 코드들을 정비하는 것 부터 시작했습니다. ([https://github.com/nforge/nforge4/commits/master](https://github.com/nforge/nforge4/commits/master))\n\n![fix_modify_change.png](/files/21940)\n\n[고치고 수정하고 변경하고 고치고 수정하고...]\n\n\n\n- 현재는 내부 구조 리팩터링과 모델링 개선을 하고 있습니다. 사실 여전히 몇몇 부분은 위험요소와 난관이 있습니다. 이 부분은 추후에 정리해서 공개하겠습니다.\n\n[http://www.facebook.com/doortts/posts/464050630329927](http://www.facebook.com/doortts/posts/464050630329927)\n\n\n\n- 얼마전부터 NHN NEXT에서 nFORGE의 알파테스트를 진행하고 있습니다. 부족한 부분이 많습니다만, 우선먼저 학생들이 전공수업을 들을때 저장소 기능위주로 사용하고 있습니다. 아래 디자인인데요, 학생들이 마음에 들어 한다네요. \n\n\n\n![nextforge.png](/files/21939)\n\n  \n\n- 알파 테스트가 끝나면 내부 테스트를 거치고 공식 버전 넘버링을 붙여 소개할 예정입니다만 아직 몇 개월 남았습니다.\n\n  \n\n        - 이런저런 이벤트로 사실 조금 지치는 부분도 없잖아 있습니다만, 힘내서 많은 사람들에게 도움이 될 수 있는 제품이 되록 계속 노력하겠습니다. (이건 저 스스로에게도 같이 하는 말이에요 ^_^) 힘내라!\n\n  \n\nps.\n\n아참! 제품 코드를 리빌드 하면서 이름도 브랜드도 다시 만들고 있습니다. 실제 공식 출시할때는 다른 이름과 다른 디자인으로 등장할 예정입니다! \n\n  \n\nps2.\n\nLessons & Learned는 다양한 영역에서 엄~청나게 쌓이고 있습니다. 잘한 부분/ 못한부분/ 성공한 부분/실패한 부분은 잘 정리해서 올해 중으로 공유하는 시간 가지도록 하겠습니다. (저희 팀이 가지는 공식적인 목표?의의? 중 하나가 다른 개발자를 돕는 일을 한다 + 선행삽질 후 경험과 자료를 대/내외 공유전파한다.. 이기도 하거든요. 그러다 보니 이래저래 고생도 많고 어떻게 보면 비효율적인 부분들도 종종 생긴답니다. 부디 너그럽게 봐주세요. ^^;;;)\n\n\n\n#### Comments\n\n멈췄나 했더니 다시 달리시는군요... 무사히 런칭하시고 경험공유 기대할께요 화이팅입니다 ㅎㅎ\n(근데 hive쓰나요? 태그가...)\n\n [Outsider](http://blog.outsider.ne.kr) | 2013-03-20 수요일 오전 1:22\n\n--\n\n예리한 눈! ㅎㅎ\n\n [doortts](http://blog.doortts.com) | 2013-03-20 수요일 오후 3:50\n\n--\n\nnForge 3.2를 쓰다가 업그레이드 하려고 살펴보니 아직 개발 중이시더군요. 3.2에 있는 기능들이 채워지면 사용하려고 기다리고 있습니다. 잘 부탁드려요. ^^\n\n 정철우 | 2013-03-20 수요일 오후 10:32\n\n--\n\n저도 잘 부탁드릴게요! ^^;;\n\n [doortts](http://blog.doortts.com) | 2013-03-21 목요일 오전 10:30\n\n--\n\nhttps://github.com/nforge/nforge4 에서 찾을 수 없던데\n알파버전 테스트가 끝나면 공개될까요?\n\n [권태성](http://tskwon.tistory.com/) | 2013-07-08 월요일 오전 9:38\n\n--\n",
    "attachments": [
      {
        "id": 21939,
        "name": "nextforge.png",
        "hash": "fdf9efd69905b7c710a78092dec354333e86305a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 169783,
        "containerId": "12422"
      },
      {
        "id": 21940,
        "name": "fix_modify_change.png",
        "hash": "7e16d4f022a72f071c335d4d8e33954d248d1cac",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 476681,
        "containerId": "12422"
      }
    ]
  },
  {
    "id": 284,
    "title": "OctoberSkyJs 2013년도 1차 node.js 스터디 정리",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1364646741000,
    "body": "> doortts | 2013-03-30 토요일 오후 9:32 | node.js (OctoberSkyJs) | [원본](http://blog.doortts.com/284)\n\nnode.js 스터디 모임으로 시작된 [OctoberSkyJs](http://facebook.com/octoberskyjs)는 올해 해 수 로 세 번째 해를 맞이하였습니다.\n\n2011년 가을(이름 그대로 10월)에 만들어 졌고 작년에는 멤버들이 단합해서 국내 첫 컨퍼런스([playnode](http://nodeconf.kr))를 개최 진행했었습니다. \n\n작년에는 월별 모임과 사례공유, 컨퍼런스등을 진행했다면 올해는 다시 내실을 다지는 차원에서 년 초부터 스터디를 진행하고 있습니다. \n\n  \n\n1차 스터디는 node.js internel을 학습하는 걸 목표로 매주 토요일 오전, 약 30여명의 멤버들과 반장님이신 [김주회](https://twitter.com/ByJuhoi)님의 리딩으로 장장 9주에 걸쳐서 진행되었습니다. 지난달 16일(3월16일)을 끝으로 1차 스터디가 마무리 되었죠. 9주 진행되는 동안 1번도 빠지지 않으셨던 분들이 반장님을 비롯해서 3분 정도계셨는데 대단하다고 멋지다는 생각이 들었습니다. (저는 한 번 빠졌.... 쿨럭..)\n\n진행된 스터디때의 사진을 살짝 봐볼까요? \n\n[](./attachments/)\n\n참고로, 커뮤니티 공식 페이지인  [facebook.com/octoberskyjs](http://facebook.com/octoberskyjs) 에 가보시면 좀 더 다양한 이야기들을 보실 수 있으세요. ^^;\n\n  \n\n그리고 전체적인 스터디 만족도 부분에 있어서는 설문에 참여한 대부분의 멤버들이 5점 평가척도에서 만족(4점)이상의 평가를 해 주셨는데요, 스터디 종료 설문결과도 일부 항목에 대해 살짝 봐볼까요? \n\n\n\n**7\\. 이번 스터디에 참여하면서 좋았던 점은 무엇인가요?**\n\n- 무엇보다 같은 생각을 공감할 수 있었던 분들을 만나 정보를 공유할 수 있었던 점 만으로도 충분히 제겐 가칭있는 알이었다고 생각합니다.\n\n- 서로의 경험을 공유할수 있어서 좋았습니다\n\n- 토요일 스터디 좋습니다\n\n- 노드를 배울 수 있었던 점\n\n- 생각치도 못한 plan b 주제들의 퀄리티가 좋았던 점\n\n- 스터디원들의 적극적인 참여와 발표\n\n- 다양한 지식공유\n\n- 자유주제발표\n\n- Nodejs에 대해서 좀더 심층적으로 다가갈 수 있어서 좋았습니다. 무엇보다 플랜 B의 발표가 더욱 도움되었고 그 발표에서 얻는 정보가 가치있다고 느껴졌습니다.\n\n- 코어에 대한 깊은 이해를 다질 수 있었던 것\n\n- 다른 분들의 경험을 들을 수 있어서 좋았습니다.\n\n\n\n저도 실제 내용이나 또 동기적인 측면에서 굉장히 도움이 많이 되었고 참여하신 다른 분들도 마찬가지로 많이 느끼셨던 것 같습니다. 저희가 시작할때 뒤 늦게 참여하시게 된 분들께 제안으로 시작했던 것이 속칭 Plan B 라고 불렸던 자유주제 발표였습니다. 그리고 부득이하게 발표를 빠지게 되시는 분들의 시간을 대체하는 것도 각자 준비하고 있던 Plan B 발표였고요. 이 부분들의 내용들이 굉장히 좋았고 호응도 좋았습니다. 다만 Plan B로 인해 오히려 발표 불참에 대한 허들이 낮아진건 아닌지에 대한 작은 우려도 있었습니다.\n\n  \n\n\n\n**9\\. 다음 스터디에 참여하게 된다면 어떤 점이 개선이 되었으면 좋을까요?**\n\n- 기간을 격주로 하는? 사실 큰 불만은 없습니다\n\n- 반장님 고생하신거\n\n- 단순히 스터디를 띄어넘는 무언가가 있었으면 합니다.\n\n- 시간대가 좀 늦어졌으면 좋겠습니다.\n\n- 이런 스터디 모임 방식도 괜찮을 것 같습니다.\n\n    * 노드 필수 모듈들(express, mongoose 등등)에 대한 분석 & 매뉴얼 한글화\n\n    * 현재 github에 리포트된 이슈사항을 해결해 머지해보기;;;\n\n- 메뉴얼만 읽기보다 범위가 넓다면 작은 부분이라도 비즈니스 로직 분석도 함께 시행 되면 좋겠다고 느꼈습니다.\n\n- 10시 시작만 되어도 참 좋을 것 같아요.\n\n- 인터넷 속도만 개선되면 좋겠습니다  \n\n\n\n(메뉴얼 읽는 모임은 아니었는데, 중간에 살짝 분위기가 그렇게 흘러간 적이 있었는데 아마 그렇게 보였나 보다...라며 살짝 아쉬움에 변명을 해 봅니다. ^^;;;)\n\n그리고 저희가 주로 모였던 곳은 강남역 에이블 스퀘어였는데요 여기가 다 좋은데 인터넷이 참 느리더라구요. 음냐... 저도 핸드폰 테더링 인터넷하고 그랬었네요. \n\n비롯해서 여러가지로 다음 스터디때는 좀 더 개선해 볼 여지가 많이 남아 있는걸 알 수 있었습니다.\n\n\n\n** 10\\. 기타 스터디와 관련된 많은 의견 부탁 드립니다.**\n\n- 다시 한번 노드 스터디가 시작돤다면 하는 아쉽움이 많이 드네요~~~\n\n- http://nodeknockout.com/ 이런 행사좋을꺼 같아요\n\n- 같이 무언가를 만든다던가 하루는 실습만을 해번다던가 잘하시은 분의 강의 형태로 몇번은 하는 것이 좋을 것 같습니다.\n\n- 반장 주회님 수고많으셨습니다. 덕분에  즐겁게 스터디 참여 할 수  있었던 것 같습니다. 이런 좋은 자리와 기회 만들어주셔서 감사합니다\"\n\n충분히 잘 해왔다고 생각합니다. 반장님도 잘 리드하셨고, 수고하셨습니다!!\n\n\n\n스터디 시작 준비는 제가 했지만 사실 이번 스터디를 전적으로 이끈 것은, 꾸준하고 묵묵히 반장님 역할을 해주신 [주회](https://twitter.com/ByJuhoi)님 이셨습니다. 9주면 사실 적지 않은 기간인데요, 그 동안 발생했던 이런저런 돌발상황을 잘 컨트롤 하시면서 한 번 빠지는 날 없이 스터디를 잘 리딩해 주셨습니다. 뭔가 멤버들이 모여서 공로상패라도 드려야 하는게 아닌가 싶어요. (작년 node 컨퍼런스때도 오거나이저로 적극 활동해 주셨고 사실 OctoberSkyJs 커뮤니티 운영자 세 분 중 한 분이시기도 하시죠!)\n\n  \n\n이제 1차 스터디는 끝났습니다. 3월 중순 이후로 현재는 조금 쉬면서 2차 스터디를 위한 설문을 진행중인데요, 관심있으신 분은 모임 공식 페이지 [facebook.com/octoberskyjs](http://facebook.com/octoberskyjs)를 참고하셔서 설문에 응해주시면 되겠습니다.\n\n마지막으로 1차 스터디 종료 회식 사진인데요, 누가 그러더군요. 참 건전하다고.. ㅎㅎㅎ 낮 12시에 한 종료회식... 크~ 저희 모임은 건전해도 너~무~ 건전하죠~\n\n![487492_368872819892805_2108289570_n.jpg](/files/21945)\n\n다음에는 마지막 모임은 저녁에 맥주라도 하면서 마무리 해야겠어요. 술을 잘 못하는 저도 그 때는 코가 삐뚫어지게 코..콜라라도 먹어야 겠어요. (노.. 농담입니다 ㅎㅎ)",
    "attachments": [
      {
        "id": 21941,
        "name": "18397_355141034599317_1865502838_n.jpg",
        "hash": "3e1e0c6c81f011b0f1b9eadcfc9c863a1d26ea67",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 49615,
        "containerId": "12423"
      },
      {
        "id": 21942,
        "name": "484718_346459722134115_1553120069_n.jpg",
        "hash": "fb5bbc67ed4e6189cefbb952c8e6b01dc0086790",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 72169,
        "containerId": "12423"
      },
      {
        "id": 21943,
        "name": "317063_339368056176615_242988631_n.jpg",
        "hash": "e6e42aee4d771f18760866b0aa46e4c7d8cbe2e4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 70820,
        "containerId": "12423"
      },
      {
        "id": 21944,
        "name": "75538_361613437285410_641270477_n.jpg",
        "hash": "9819fa6da15be2411c2c17b8ad9bb0e5d8db23f1",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 53622,
        "containerId": "12423"
      },
      {
        "id": 21945,
        "name": "487492_368872819892805_2108289570_n.jpg",
        "hash": "a405fcd2622fd1e72a54d62936c7d81ab32ed500",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 55490,
        "containerId": "12423"
      },
      {
        "id": 21946,
        "name": "522682_368863136560440_1111282421_n.jpg",
        "hash": "f6adccae676ef8bc8206890fc485887c799b7538",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 68370,
        "containerId": "12423"
      },
      {
        "id": 21947,
        "name": "563489_355131214600299_1051557821_n.jpg",
        "hash": "da088cdbb7801c44ab5b120906a8747285709bd2",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 61173,
        "containerId": "12423"
      },
      {
        "id": 21948,
        "name": "299838_361594060620681_1330836428_n.jpg",
        "hash": "0e59917457dde3ca2dfaf950a489f7339836ed82",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 57848,
        "containerId": "12423"
      },
      {
        "id": 21949,
        "name": "269272_346474392132648_345855740_n.jpg",
        "hash": "a3660df8dbc0e5346ea9c1ef9c792aaa86dff62e",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 50832,
        "containerId": "12423"
      },
      {
        "id": 21950,
        "name": "253161_358273000952787_80107419_n.jpg",
        "hash": "ba0410f5f416346f70a1f71a2ed5fed2c77e96a4",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 57547,
        "containerId": "12423"
      },
      {
        "id": 21951,
        "name": "598699_346487145464706_1717456866_n.jpg",
        "hash": "82de32401c468d8cc0572a7bb1d4fe3ebd1a7ee3",
        "containerType": "BOARD_POST",
        "mimeType": "image/jpeg",
        "size": 102831,
        "containerId": "12423"
      }
    ]
  },
  {
    "id": 285,
    "title": "[뭘, 이런걸 다?] git에서 특정 commit에 들어간 수정 파일을 다른 commit으로 옮기는 방법",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1365041651000,
    "body": "> doortts | 2013-04-04 목요일 오전 11:14 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/285)\n\ngit add . 이나 git commit -a 를 자주 쓰다보면 자칫 실수로 원하지 않는 파일이 커밋에 포함되어 버리는 경우가 있습니다. \n\n  \n\n상황\n\n![git_rebase.png.png](/files/21952)\n\n원래는 26d0ab1에 포함되어야 할 파일이 96a41e9 커밋에 포함되어 버림. \n\n(그냥 가도 되긴 하지만 게으르면서도 집착증세가 있는 나란 동물...)\n\n되돌리기 작업 시작!\n\n  \n\nrebase 옵션으로 한 단계 뒤로 돌아가서 시작. 원하는 commit을 pick 한다.\n\n지금 같은 경우엔 26d0ab1 와 96a41e9 를 선택한다.\n\n  \n\n\n\n    git rebase -i 96a41e9ef2d9747e7b34ae424b0c845ab7092ee4^\n\n\n\n불필요한 파일을 staged에서만 지움\n\n\n\n    git rm --cached project/Build.scala\n\n\n\n재 커밋 후 rebase 계속\n\n\n\n    git commit --amend\n\n    git rebase --continue\n\n\n\n특정 commit에 파일을 추가하고 수정커밋 \n\n\n\n    git add project/Build.scala\n\n    git commit --amend\n\n\n\n  \n\nrebase 계속\n\n\n\n    git rebase --continue  \n\n\n\n유의점\n\n이미 최신 코드들을 중앙저장소로 넣은 상태라면\n\ngit push --force 명령어로 넣어야 하는데, 이런경우 수 많은 사람들에게 불편을 끼칠 수 있습니다.\n\n(모든 사람에게 I'm so sorry but I'm allergy! 라고 말을 해야 하는 상황)\n\n견뎌낼 수 있는 수준인지 확인할 필요가 있다. 안되면 아쉽지만 포기!\n\n#### Comments\n\ngit에선 이런 게 다 되는군요 허허\n\n [wafe](http://wafe.kr) | 2013-04-10 수요일 오전 5:33\n\n--\n",
    "attachments": [
      {
        "id": 21952,
        "name": "git_rebase.png.png",
        "hash": "141ff764566364683285a6718266807a61f37af5",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 57199,
        "containerId": "12424"
      },
      {
        "id": 21953,
        "name": "git_rebase.png",
        "hash": "df0a8fc7f5fdb463f710c593e4e56a46629ee48a",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 49241,
        "containerId": "12424"
      }
    ],
    "comments": [
      {
        "id": 1,
        "type": "NONISSUE_COMMENT",
        "authorId": "doortts",
        "authorName": "너굴",
        "createdAt": 1479302019000,
        "body": "정말인가요?"
      }
    ]
  },
  {
    "id": 286,
    "title": "[뭘, 이런걸 다~] 어떤 개발자의 맥 환경",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1366187939000,
    "body": "> doortts | 2013-04-17 수요일 오후 5:38 | [뭘, 이런걸 다?] | [원본](http://blog.doortts.com/286)\n\n\n\n이런 내용을 올리는게 다른 분들에게 도움이 될런지는 모르겠지만\n\n혹시나 하는 마음에 올려봅니다. ^^)\n\n그리고 최신 변경 내용은\n\n[https://github.com/doortts/env-of-mac](https://github.com/doortts/env-of-mac)\n\n에서 볼 수 있습니다.\n\n\n\n개인 정리 차원에서 스스로 맥 노트북을 어떻게 세팅해서 사용하는지 한 번 적어 봤습니다.\n\n이름하여..\n\n.\n\n.\n\n.\n\n상대적이면서도 절대적인 개인취향이 반영된\n\n# [](https://github.com/doortts/env-of-mac/blob/master/README.md#---)어떤 개발자의 맥 환경\n\n[blog.doortts.com](http://blog.doortts.com/)\n\n# [](https://github.com/doortts/env-of-mac/blob/master/README.md#1---)1\\. 기본 설정들 변경\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#dock----)dock 에서 불필요한 아이콘들 제거\n\n안 쓰는 앱들은 Dock에서 지우자 (앱이 지워지는 건 아니니까 don't worry)\n\n```\n독에서 지울 앱 아이콘에 마우스 오른쪽 버튼 -> options \n -> 독에 유지하기(keep in dock) 선택해제\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#----1)입맛에 맛게 트랙패드 조정\n\n아.. 이 올드한 나의 입맛이란..\n\n[![](https://raw.github.com/doortts/env-of-mac/master/media/Trackpad_setting01.jpg)](https://raw.github.com/doortts/env-of-mac/master/media/Trackpad_setting01.jpg)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#function-key--)Function key를 일반키로 설정\n\n구식 개발자라 단축키 하나가 아쉬운 상황인지라.. 볼륨 키우고 백라이트 조절 등이 필요 할때는 fn 키랑 조합으로 사용하면 되니까 무방.\n\n```\n설정 -> 키보드 -> 키보드 : '모든 F1, F2 등의  키를 표준 기능 키로 사용' 선택\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#--)화면 닫을때 암호물어보기\n\n안 그러면 내 정보는 공공재 된다.. (아.. 어차피 이미 늦었나.)\n\n```\n설정 -> 보안 및 개인정보 -> 잠자기 또는 화면보호 시작\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#----2)한영 키보드 전환을 빠르게\n\n```\n설정 -> 키보드 -> 키보드단축키 -> (좌측) 키보드 및 텍스트 입력 \n -> '이전 입력소스 선택' 과 '입력 메뉴에서 다음 소스 선택' 단축키를 서로 교환함\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#key-hold-repeat--)key hold시에 repeat이 동작하게 만들기\n\n```\ndefaults write -g ApplePressAndHoldEnabled -bool false \n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#spotlight--)spotlight 단축키 변경\n\n개인의 취향. 개발자 입장에서는 각종 기존 단축키들과 충돌나는게 아까워서.\n\n```\n키보드 -> 키보드 단축키 -> spotlight 를 F12로 변경\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#---1)잠금화면 메시지 설정\n\n잠금화면에서 자신의 이름이나 이메일 등이 표시되도록. 분실시 찾아줄 수 있게\n\n```\n설정 -> 보안 및 개인정보 -> 일반 -> 잠금 메시지 설정\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#dashboard--)dashboard 사용안함으로 변경하기\n\n위젯 안쓸꺼면 괜히 공간 및 자원만 쓰니까 없애자. 터미널창에서 아래 명령어 실행.\n\n```\ndefaults write com.apple.dashboard mcx-disabled -boolean YES \n\n killall Dock \n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#mac-----)MAC에서 한글 마지막 글자 잘림현상 해결\n\n```\n설정 -> 언어 및 글자 -> 글자(text) -> '자동으로 영문철자 수정' 해제\n\n```\n\n# [](https://github.com/doortts/env-of-mac/blob/master/README.md#2---)2.자주 쓰는 도구들 설치\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#appstore-----)appstore 에서 기존 구매 앱들 설치\n\n이미 산거라도 쓸데 없는건 설치하지 않기!\n\n*   PopClip : text 선택시 이런저런 사용가능한 action 이 popup으로 뜸\n*   Yoink : 임시 스택 of everything\n*   Caffeine : 화면이 꺼지지 않게 유지\n*   Wunderlist : 할일 관리\n*   Monosnap : 캡처도구\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#btt-better-touch-tools-)BTT (Better Touch Tools) 설치\n\n[http://blog.boastr.net/](http://blog.boastr.net/)\n\n```\nthree finger swipe up/down -> command + up/down 으로 설정\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#evernote-)Evernote 설치\n\n[https://evernote.com/](https://evernote.com/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#ms-intellipoint-)MS intellipoint 설치\n\nwhy? MS 마우스 사용자들에게 감도를 높여줌\n\n```\n설정 -> Microsoft Mouse -> pointer options -> IntelliPoint pointer Speed\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#sublime-text-2-)sublime text 2 설치\n\n[http://www.sublimetext.com/2](http://www.sublimetext.com/2)\n\nTextMate를 오픈소스화 시킬 정도의 파급력을 가진 최고의 에디팅 툴\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#chrome-)chrome 설치\n\n워낙 extention들이 좋은게 많아서..\n\n추천 extention\n\n*   CrxMouse : Mac 크롬을 지원하는 마우스 제스처\n*   TweetDeck : twitter와 facebook을 동시에 지원\n*   Vimium : h,j,k,l\n*   Neater Bookmarks : 내 bookmark 간단 검색\n\n[https://www.google.com/intl/en/chrome/browser/](https://www.google.com/intl/en/chrome/browser/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#brew-)brew 설치\n\nMac용 Command installer. 앞으로는 커맨드로 왠만한 도구들을 설치\n\n```\nruby -e  \"$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)\"\n\n```\n\n### [](https://github.com/doortts/env-of-mac/blob/master/README.md#brew----git-)brew를 통해 git 설치\n\n```\nbrew git install\n\n```\n\n참고: [http://mxcl.github.io/homebrew/](http://mxcl.github.io/homebrew/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#keyremap4macbook-)KeyRemap4MacBook 설치\n\nwhy? 오른쪽 command를 한영전환으로 변경. 키 반복입력을 빠르게 만들기.\n\n다운로드: [http://pqrs.org/macosx/keyremap4macbook/](http://pqrs.org/macosx/keyremap4macbook/)\n\n```\nchange command_r to command_r, send Delete를 해제하고\n change command_r to command_r, 'when you type command_r only send command + space' 를 선택\n\n Key repeat에서 wait 타임을 83 -> 30으로 변경\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#totalfinder--)TotalFinder 설치 (유료)\n\nMac의 이상?불편?한 finder를 개선시켜줌\n\n[http://totalfinder.binaryage.com](http://totalfinder.binaryage.com/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#ms-office-2011--)MS office 2011 설치 (유료)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#dropbox-)dropbox 설치\n\n[www.dropbox.com](https://www.dropbox.com/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#asepsis-)Asepsis 설치\n\nmac에서 finder로 이동시 만들어지는 .DS_Store파일 생성을 막아준다\n\n[http://asepsis.binaryage.com](http://asepsis.binaryage.com/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#alfred-)Alfred 설치\n\nApp Launcher (no gomin, go install)\n\n[http://www.alfredapp.com/](http://www.alfredapp.com/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#bartender--)Bartender 설치 (유료)\n\n메뉴바 아이콘이 길어지는 걸 해결\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#iterm2-)iterm2 설치\n\n기본 터미널보다 우수함.\n\n[http://www.iterm2.com/](http://www.iterm2.com/)\n\n대체제: [http://tmux.sourceforge.net/](http://tmux.sourceforge.net/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#gcc--)gcc 컴파일러 설치하기\n\n공식 이름은 XCode(Apple) Command Line Tools\n\nXCode를 설치해도 되지만 XCode 안쓰는데도 2기가 짜리를 설치할 필요가 없으니 gcc/git 등의 command tool만 설치!\n\n[http://142.23.40.11/big/X/xcode461_cltools_10_86938245a.dmg](http://142.23.40.11/big/X/xcode461_cltools_10_86938245a.dmg)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#retina-twitter-app)retina twitter app\n\n레니타 맥 유저 한정\n\n[https://twitter.com/edincik/status/271993729760509952](https://twitter.com/edincik/status/271993729760509952)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#oh-my-zsh-)oh my zsh 설치\n\nshell이라면 zsh !! bash 안녕~! (but 저사양 맥북에서는 때때로 느려질때도..)\n\n```\ncurl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh\n\n```\n\n참고: [https://github.com/robbyrussell/oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)\n\n### [](https://github.com/doortts/env-of-mac/blob/master/README.md#zsh-command-syntax-highlighting-)zsh command syntax highlighting 만들기\n\n[https://github.com/zsh-users/zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#appcleaner-)appcleaner 설치\n\n설치된 앱을 깨끗하게 지우자\n\n[freemacsoft.net/appcleaner](http://www.freemacsoft.net/appcleaner/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#quickresapp-)QuickResApp 설치\n\n화면 해상도 변경을 편하게\n\n[quickresapp.com](http://www.quickresapp.com/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#developer-color-picker-)Developer Color Picker 설치\n\n개발자용 컬러 피커. 색을 다루는 개발자라면!\n\n[http://panic.com/~wade/picker/](http://panic.com/~wade/picker/)\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#go2shell----mac-appstore)go2shell 설치 후 설정 (mac appstore)\n\nfinder에서 현재 폴더로 터미널 띄우기\n\n```\nopen -a Go2Shell --args config\n\n```\n\n## [](https://github.com/doortts/env-of-mac/blob/master/README.md#mou-)MOU 설치\n\nMarkdown Editor\n\n[http://mouapp.com](http://mouapp.com/)\n\n#### Comments\n\n실제로 엄청 유용한 정보들이네요. ㅎㅎ\n감사합니다. ^^\n\n [Matthew Kim](http://whitebear.tistory.com) | 2013-04-18 목요일 오전 12:29\n\n--\n\n별 것 아닌 내용임에도 인사 댓글남겨 주셔서 감사합니다.\n: )\n좋은 하루 되세요.\n\n [doortts](http://blog.doortts.com) | 2013-04-18 목요일 오후 8:16\n\n--\n\n좋은 정보 감사드립니다 :)\n\n [rkJun](http://rkjun.wordpress.com) | 2013-04-21 일요일 오후 7:29\n\n--\n"
  },
  {
    "id": 287,
    "title": "개인 생존신고 및 Project HIVE 개발 상황",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1371049995000,
    "body": "> doortts | 2013-06-13 목요일 오전 12:13 | 이생각 저생각 | [원본](http://blog.doortts.com/287)\n\n안녕하세요?\n\n한동안 조용했었습니다.\n\n짤막하게 생존신고합니다.\n\n**개인생존신고**\n\n------------\n\n- 지난달부터 공식적으로 Lab 기술리더(Technical Leader)가 되었습니다. 기존과 다른점은 없습니다.\n여전히 한사람의 개발자이고 개발팀과 프로젝트의 책임자(=팀이나 제품을 욕할때 대상이 될 사람)입니다.\n\n- 사건사고가 끊이지 않지만 열심히 살고 있습니다. 그리고 열심히 개발하면서 조용히 지내고 있습니다.\n\n- 팀원들이 자신의 소중한 삶의 적지않은 일부를 투자하는 일인 만큼 팀 개발업무에서 보람과 가치를 찾을 수 있도록 열심히 노력하고 있습니다...만 그건 어디까지나 제 생각인거고 당사자들이 어느 정도 삶이 나아지고 있는지는 아직 모르겠습니다. 그저 꾸준히 노력 계속해야 겠죠. ^^;\n\n- node.js 한국 공식 커뮤니티인 OctoberSkyJs ([facebook.com/octoberskyjs](http://facebook.com/octoberskyjs)) 2차 스터디도 잘 마무리 되었습니다. (매주 토요일 오전에 모이는 나름 빡센 스터디죠. 한 달간 쉬고 다시 node.js로 돌아와서 세 번째 스터디 시작예정입니다)\n\n**Project HIVE소식**\n\n**---------------**\n\n- 2월부터 시작해서 새로이 소스 베이스를 대대적으로 뜯어고쳐가며 만들고 있는 [Hive Project](http://github.com/nforge/hive)의 사내 릴리즈 및 nhnnext 설치버전의 메이저 업그레이드가 이번주 금요일로 예정되어 있습니다. 칭찬과 욕 중에서 어느쪽이 더 클지는 모르겠지만 둘 다  일 거라는 것만 확실시 됩니다. ^^;\n\n조만간 정식 넘버링을 붙여 공식 릴리즈를 할 수 있기를 기대합니다... ^^ \n\n여러가지로 우여곡절이 많은 프로젝트입니다만 '의미있고 많은 사람들에게 도움 될 수 있도록' 팀원 모두 열심히합심해서 작업하고 있습니다. 응원과 기대 부탁드립니다.\n\n![hive_preview.png](/files/21954)\n\n**[개밥먹는 장면 스크린샷]**\n\n**날씨**\n\n----\n\n- 더위 조심하세요! 지난 현충일에 전 더위먹고 주말을 내내 겔겔거렸습니다.\n\n \n\n \n\n#### Comments\n\ndoortts 님의 3,4 년 된 팬(?) 으로서 좋은 결과 있기를 바라겠습니다~ \n\n [Genie](http://jinself.tistory.com) | 2013-07-22 월요일 오전 10:31\n\n--\n\n왠지 마구 부끄럽네요. 댓글 감사합니다. ^^ 열심히 할게요.\n\n [doortts](http://blog.doortts.com) | 2013-08-21 수요일 오전 10:49\n\n--\n\n실제로 사용해 보니 매우 좋네요... ^^\n개발자 분들의 성의가 느껴져서 더 좋은 것 같습니다...\n\n황상철 수석님 이직할 때 만해도\n프로젝트가 무척 걱정스러워 보였는데\n위기를 잘 극복하고 살아남아서 내 일처럼 매우 기쁩니다.\n\n좋은 결과 기대하겠습니다...\n\n [Genie](http://jinself.tistory.com) | 2013-08-24 토요일 오전 11:3\n\n--\n",
    "attachments": [
      {
        "id": 21954,
        "name": "hive_preview.png",
        "hash": "1ac13a8bee5aeda5e891074bcf96ab60bc36846d",
        "containerType": "BOARD_POST",
        "mimeType": "image/png",
        "size": 120143,
        "containerId": "12426"
      }
    ]
  },
  {
    "id": 288,
    "title": "협업 SW개발 플랫폼 Yobi",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1385697346000,
    "body": "> doortts | 2013-11-29 금요일 오후 12:55 | Better SW Development | [원본](http://blog.doortts.com/288)\n\n지난달 DEVIEW에서 발표한 \"협업 SW개발 플랫폼 Yobi\" 세션 발표 동영상 및 자료 입니다.\n\n[http://deview.kr/2013/detail.nhn?topicSeq=18](http://deview.kr/2013/detail.nhn?topicSeq=18)\n\nYobi 자체에 대한 소개보다는 개발과정에서 있었던 일들과 어려웠던 점들에 대해 이야기 하고 있습니다.\n\n: )\n\n#### Comments\n\n젊으신 분 일 거라 예상했었는데 사진으로 뵈니 연배가 있으시군요 ... ^^;;\n\n소년은 늙기 쉽고 학문은 이루기 어려우니 ...\n\n라는 문구가 불현듯 떠오르네요...\n\n\n오래 전에 doortts 님이 Trac 에 대해 포스팅한 글 이\n\n제 마음 속에 남아있다가\n\n어느날 Trac 플러그인 개발을 시작하게 된 일말의 방아쇠 역할이 되었습니다.\n\n\n저는 이제 눈이 침침하고 머리도 슬슬 빠져서 개발은 접고 생업으로 돌아가야겠습니다.\n\n아무쪼록 좋은 결과 있기를 바라겠습니다.\n\n [Genie](http://jinself.tistory.com) | 2014-03-07 금요일 오전 5:15\n\n--\n\n안녕하세요? 실제로 뵌적은 없지만 넷상에서는 댓글로 블로그로 가끔 뵙곤 했었죠?\n\n개발은 접고 생업으로 돌아가신다니 아쉽고 궁금합니다.\n언제 시간이 되시면 한 번 식사안하시겠어요?\n\n: )\n\n쥐메일로 메일주세요.\n계정은 doortts 입니다.\n뵙고 식사대접해 드리고 싶습니다.\n\n\n\n [doortts](http://blog.doortts.com) | 2014-04-22 화요일 오후 10:42\n\n--\n\n아... 댓글 주신건 한참 전에 봤는데요,\n세월호 참사때문에 오랜동안 패닉 상태여서 이제야 댓글 답니다 ㅠ.ㅠ\n\n저는 생존 경쟁에서 도태한 사십대 백수 개발자여서 송구스럽게도 누군가 만난다는게 현재는 부담스럽네요 ... ^^;;\n\n저는 여름(?) 님 팬이기 전에 nForge 의 아주 오래된 팬이기도 합니다.\n그리고, 황상철 수석님의 오래된 팬이기도 하구요...\n\n최근에 황상철 수석님이 저술하고 있는 저서의 북 리뷰어로 참여했더랬습니다.\n\n언젠가 여름(?)님이 책을 저술하시게 될 때 북 리뷰어로 참여하게되는 영광을 얻게 되길 간절히 기원합니다.\n\n제 메일 주소는 386@mail.com 입니다.\n\n나이 듬으로 인해 개발자 일을 하지 못하고 있더라도\n제가 개발자의 정체성을 가지고 있는 한은 해당 메일 주소를 보유하고 있을 것 입니다.\n\n언젠가 저술 하시게 되면 북 리뷰어의 기회를 제게도 주시길 기원합니다~~~\n\n여름(?) 님 의 건승을 빕니다 !!!\n\n\n\n아침에 술이 깨면 세월호 분향소에 한 번 더 들려야 겠습니다...\n\nLes Miserables...\n\n [Genie](http://jinself.tistory.com) | 2014-05-01 목요일 오전 2:32\n\n--\n"
  },
  {
    "id": 289,
    "title": "Yobi v0.5",
    "type": "BOARD_POST",
    "author": "doortts",
    "authorName": "너굴",
    "createdAt": 1398175349000,
    "body": "> doortts | 2014-04-22 화요일 오후 11:2 | Better SW Development | [원본](http://blog.doortts.com/289)\n\nnode.js 기반의 [개발자노트](https://github.com/nforge/devnote) 개발을 중단하고\n\n본격적으로 Yobi ([yobi.io](http://yobi.io))개발에 뛰어든지 어느덧 1년 반이 훌쩍 넘었습니다.\n\n이런저런 우여곡절을 겪으면서도 열심히 개발해 나가고 있습니다.\n\n오늘자로 팀에서 메이저 버전에 해당하는 yobi v0.5 버전을 릴리즈했습니다.\n\n[https://github.com/nforge/yobi/releases/tag/v0.5](https://github.com/nforge/yobi/releases/tag/v0.5)\n\n버전은 아직 1.0 미만이지만 이번 버전은 여러가지로 의미가 있고 기존에 비해 여러가지로 한 단계를 넘어선 버전입니다.\n\n(v0.5라고는 하지만 저희팀에 버전에 좀 짠 경향이 있습니다. 현재 yobi v0.5는 회사내부에서만도 200개 이상의 프로젝트와 300명 이상의 개발자들이 단일 가상서버 환경에서 큰 문제없이 잘 쓰고 있습니다)\n\nYobi가 어떤 하나의 제품으로서, 그리고 개인적으로 나름 목표한 수준이 있다고 했을때 v0.5는 그 분기점에 해당하는 버전입니다. 아직 불편한 점이 많이 있고 부족한 부분들이 꽤 있지만 차차 개선되리라 생각합니다.\n\n개발을 진행함에 있어 여전히 힘든 점은 많고 난관도 있지만, 어떤 작은 소명감.\n\n하나의 SW로서 SW를 만드는 사람들에게 도움이 될 수 있다는 믿음으로 열심히 임하고 있습니다.\n\n주어진 기회에 감사하면서요.\n\n  \n\n아직까지는 이런저런 이유로 홍보에 다소 소극적이지만\n\n다음주에 릴리즈될 v0.5.1과 5월 중순경에 릴리즈 될 v0.5.2를 기점으로 좀 더 넓고 다양하게 홍보 활동을 할 예정입니다.\n\n  \n\n어느날인가 우연히 어딘가에서 Yobi라는 제품을 마주하게 되었을 때 저희팀원들의 마음과 열의가 함께 전달되었으면 좋겠습니다.\n\n흠흠.. 좀 뜬금없지만...\n\n**'감사합니다. 좋은 하루 되세요!'**\n\n: )\n\n "
  }
]
}
