토요일, 2월 22, 2014

[B급 프로그래머] 2월 3주 소식 정리

2월 1주 소식이 엄청난 인기를 끌었기에 기운내어 3주 소식을 정리해보았다.

  1. 웹 개발
  2. 개발/관리 도구
  3. 고성능 서버/데이터베이스
  4. 기타 읽을거리

따뜻한 3월에 다시 독자 여러분들을 찾아 뵙겠다.

EOB

토요일, 2월 15, 2014

[B급 프로그래머] 루비의 해시 기본값은?

한 동안 NULL 관련 글을 올리지 않았더니 손가락이 근질거려 도저히 못 참겠다. 그래서 오늘은 알면 별거 아니지만 모르면 멘붕이 오는 내용을 하나 소개하겠다. 먼저 다음 루비 코드를 보자.

    def initialize(server_info)
      server_default_info = {}
      server_default_info['id'] = 'root'
      server_default_info['name'] = 'root user'
      server_default_info.each() { |k, v| server_info[k] ||= v }
      @server_info = server_info
    end

위 코드가 무슨 일을 하려 드는지 독자 여러분들은 이미 알고 있을 것이다. server_info에서 넘어오는 정보에 id와 name이 없을 경우 기본값으로 채우는 간단한 작업을 한다. 뭐 더 좋은 방법도 있겠지만, 설명을 위해 단순화한 예제이므로 코드 품질에 대해서는 민원을 넣지 않기 바란다.

자, 그렇다면 5분을 줄테니 위 코드에서 문제점을 하나 찾아보자.






문제점을 발견했는가? 힌트가 필요한 독자라면 Ruby Hash Awesomeness – Part 1을 읽어보고 다시 한번 위 코드를 뚫어지게 쳐다보자.

답은 바로 다음 행이다. 어떤 경우에는 정상적으로 동작하지만 어떤 경우에는 || 메소드가 없다고 죽어버린다. 위 힌트를 읽어보면 알겠지만, 이 문제는 해시를 만들 때, 키-값을 초기화하는 방법이 두 가지기 때문이다. 하나는 특정 키에 대해 아예 값이 없는 경우({} 사용)고 다른 하나는 특정 키에 대해 빈 값이 있는 경우(new 사용)다(독자 여러분들은 다시 한번 NULL의 악몽이 떠오를 것이다).

      server_default_info.each() { |k, v| server_info[k] ||= v }

명시적으로 Hash를 만들 수 있다면 아무 문제도 없겠지만, 만일 상위 수준의 라이브러리에서 Hash를 임의로 만들 경우라면 이야기는 180도 달라진다. 구체적으로 예를 들어볼까? 루비의 YAML과 JSON 라이브러리를 사용해 파싱 결과로 Hash를 얻을 경우 Hash 생성을 위해 YAML은 new를 사용하지만 JSON은 {}를 사용한다는 사실을 알면 갑자기 등골이 오싹해질테다.

자, 이제 결론을 내릴 때가 왔다. 위 코드가 안 죽게 만들려면 어떻게 해야 할까? server_info[k]가 {} 인지 확인하는 루틴을 넣어, 참이면 그냥 값을 바로 대입하게 만들면 된다. 힌트를 아주 충분히 줬으므로 정상 동작하는 코드 수정은 독자 여러분에게 맡기겠다.

EOB

토요일, 2월 08, 2014

[B급 프로그래머] 2월 1주 소식 정리

입춘도 지나 슬슬 봄기운이 느껴지는 시점이다. 오늘도 프로그래머를 위한 각종 소식을 정리해보았다.

  1. 웹 개발
  2. 개발/관리 도구
  3. 고성능 서버/데이터베이스
  4. 기타 읽을거리
EOB