레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시

10/15/2013

RabbitMQ prefetchCount and txSize in spring-rabbit

 Due to following implementation in SimpleMessageListenerContainer of spring-rabbit(1.1.2-RELEASE at this point) library, you should always change txSize as well if you want to decrease prefetchCount for some reason, otherwise txSize will override prefetchCount value.

    protected BlockingQueueConsumer createBlockingQueueConsumer() {
        BlockingQueueConsumer consumer;
        String[] queues = getRequiredQueueNames();
        // There's no point prefetching less than the tx size, otherwise the consumer will stall because the broker
        // didn't get an ack for delivered messages
        int actualPrefetchCount = prefetchCount > txSize ? prefetchCount : txSize;
        consumer = new BlockingQueueConsumer(getConnectionFactory(), this.messagePropertiesConverter, cancellationLock,
                getAcknowledgeMode(), isChannelTransacted(), actualPrefetchCount, this.defaultRequeueRejected, queues);
        return consumer;
    }


7/31/2013

OSCON 2013 참관 후기

감사하게도 회사에서 OSCON 2013을 보내줘서(티켓 + 호텔 + 랜트카를 포함한 전부!!) 블리자드 본사로 온 이후로 처음 소프트웨어 개발 관련 컨퍼런스를 다녀왔다.
생각해보면 한국에 있을때도 네이버나 몇몇 작은 규모의 개발자 컨퍼런스는 다녀왔었지만, 이런 국제규모의 개발행사는 처음 참여한 듯.

미국에 2011년에 왔으니까 올해로 3년째 접어들고 있는데, 의외로 놀랐던 건 왠만한 세션들은 내용을 영어로 듣고 이해하는데 거의 문제가 없었다는 것.
몇몇 외계어 같이 들리는 세션들은 영어 자체가 문제가 아니라 발표자들이 사용하는 용어가 생소하고 내가 그 분야에 대한 도메인 지식이 없기 때문인 듯. 한국어로 하는 개발자 컨퍼런스를 가도 해당 내용을 모르면 이해를 못하는 것과 마찬가지의 경우랄까. ( 라고 스스로를 위로했다 )



어쨌든,  포틀랜드에서 열린 이번 행사는 7월 22~26이었는데, 나는 22/23일은 생략하고 24~26일 티켓으로 참석했다. 다양한 형태의 OSCON 티켓이 있었는데, 지난 해에 참석했던 Todd한테 물어봤을 때 그가 말하길 보통 월/화는 Introduction to ~~ 류거나 대부분 OSCON 스폰서 세션이라고 했기 때문에 굳이 참석하지 않아도 될 것 같았다. 컨퍼런스 가기 전에 회사에 마무리해야 하는 일도 좀 있었고...

대략 몇가지 세션들에 관해서 이야기해보자면...

구글의 Go 언어에 대한 세션이 꽤 많았다. 단지 구글이 점심을 제공하는 스폰서라서라기보다는, 아마도 구글이 만들었고 또한 가장 Go를 많이 쓰고 있는 회사기 때문이 아닐까 싶었다.

빅데이터가 트랜드인 요즘, Hadoop/HDFS/R 등등의 빅데이터 관련 기술 및 분석언어/툴/도구에 대한 세션이 많았고, 또한 당연히 이런 빅데이터 클러스터들을 관리하기 위한 도구들, 이를테면 Chef나 Puppet, 그리고 클라우드 서비스들에 대한 내용들이 상당부분을 차지했다.

"An Overview of Open Source in East Asia" 라는 세션은 발표자가 한국사람들이길래 무슨 이야기를 하려나 하고 들어봤다. 발표자는 박민우/진성주 두 분으로 한국에서 직접 발표를 위해서 비행기를 타고 날라왔던 듯. 다른 한국분이 하는 Rust관련 세션도 있었던 것 같았으나 Rust는 전혀 관심밖이고 한동안 내가 사용할 일이 있을거란 생각이 들지 않았고 다른 세션과도 시간이 겹쳐 생략.
내용은 아시아에서 진행되는 주요 오픈소스 프로젝트들을 소개하면서, 비록 영어라는 언어장벽과 경우에 따라서는 시간차 때문에 영어권 오픈소스 커뮤니티와 의사소통이 잘 안되는 점도 있지만, 그럼에도 불구하고 열심히 하고들 있다라는 것과 영어 못하는 아시아 오픈소스 개발자들 만나도 천천히 침착하게 이야기를 들어달라 라는 식으로 진행되었다. 비교적 작은 컨퍼런스 룸에서 진행되었지만 적지 않은 사람들이 참석해서 아시아권 오픈소스 프로젝트들에 대한 관심을 보였던 것 같다. 그 중에서도 한국은 '싸이' 때문에 최근에 더 유명해진 듯?
같이 갔던 주호님이 발표자 두분이랑 트위터로 알던 사이였고 같이 식사를 하기로 이야기가 되어 있던 터라, 나도 거기 끼어서 이런저런 한국이야기/미국이야기들을 서로 주고받고 페이스북 친구도 맺고, 즐거운 시간이었다.

내가 소속한 팀/부서의 서버 댓수나 사이즈가 페이스북이나 넷플릭스 정도의 사이즈는 아니지만, 종종 추가 QA인스턴스를 설치해야 한다든가 하는 것들을 일일이 수작업으로 진행해야 하서 불편한 점이 많았고(물론 내부적 구현된 VM 매니저를 통해서 VM을 생성하긴 하지만, 그 안의 tomcat/apache/기타 인프라등은 죄다 수작업 업데이트/설정변경 -_-;), 또한 지금 하고 있는 일들이 회사 내 다른 팀들이 내외적으로 사용하는 API들을 제공하는 터라 Facebook 쪽의 scalable configuration management 랑 Netflix API 세션을 들었다.

Facebook쪽 발표는 15K+ 이상의 클러스터 노드들을 달랑 4명의 엔지니어들이 관리할 수 있는 걸 목표로 한 자신들이 왜 Chef를 도입했고, whitelist_node_attrs 과 같이 configuration 들을 어떻게 유지하고 의미있는 데이터로 관리하기 위해 자신들이 무엇을 했는가에 대해서 쭉 설명을 했다.
사실 Chef나 Puppet은 동냥귀로 단어 자체를 듣긴 했지만 실제로 대규모 사이트에서의 use case를 보는 건 처음이었는데, 세션에 참가하는 동안 돌아와서 팀내 공유를 위한 프리젠테이션을 준비하는 과정에서 상당히 많은 내용을 알게 되었는데, 미리 알고 들었더라면 훨씬 더 낫지 않았을까 하는 아쉬움이 있었다.

Netflix의 경우 Netflix REST API를 어떤 식으로 설계했고, 천여가지의 다른 디바이스들을 지원하기 위해서 Java Backend API layer에다가 Groovy + RxJava를 붙여서 사용한다는 것과, scalability를 위해서 AWS로 서버들을 이전한 것, Asgard/Hystrix 같은 자신들이 만든 툴 들의 소개 등등, 꽤나 흥미로웠다.
Hystrix 와 같은 툴들은 팀 내의 유사한 문제를 위해서 도입하면 꽤나 쓸만할 것 같았음.

Database나 Persistent Layer의 경우 MySql/PostgreSQL 자체를 설명하거나 MongoDB등과 같은 NoSQL솔루션과 각 상황에 따른 best practice를 설명하는 세션 외에도, Pivotal 쪽 엔지니어가 진행했던 RDBMS의 ACID와 NoSQL(구체적으로 세션에서는 Redis)의 BASE(Basically Available, Soft state, Eventually consistent) 성질을 하나로 묶어 활용하는 방법을 다뤘던 "Deploying Polyglot Persistent Applications" 이 무척 와 닿았다. 사실 현업에서 게임플레이 데이터라든지 기타 방대한 데이터 처리를 하는 데 있어 이미 RDBMS(오라클이든 MySQL이든)의 한계를 느끼고는 있으나(batch insert만 매일 몇시간이 걸린다든가, 한달 이상된 데이터들은 따로 보관한다든가 등등) 그렇다고 트랜잭션의 개념이 아예 없거나 RDBMS에 비해 제한적인 NoSQL을 덜컥 현업에 도입해서 RDBMS 대신 쓰자는 의견에는 동의할 수 없는 엔지니어들이 많을 텐데, 이 세션은 어떻게 RDBMS와 NoSQL 솔루션들을 함께 사용하면서도 각자의 장점을 취할 것인가에 대한 주제였던 터라 꽤나 흥미로웠다.

박민우/진성주 님 말고도 중간중간에 NHN 비즈니스 플랫폼에서 오신 두분, 그리고 삼성전자쪽 부스에서 타이젠을 비롯한 이런저런 이야기를 같이 했던 분들, 그 외 아무리 봐도 딱 차림이 한국회사쪽 개발자 같고 다른 세션에서도 여러번 본 것 같은데 어디 분들이신지 도저히 알 수가 없었던 많은 분들.. 아무튼 만나서 반가웠습니다. ㅎㅎㅎ

OSCON 에서 배운 것 이외에도, 오레곤의 포틀랜드를 방문한 것이 이번에 처음이었는데, 깨끗하고 대중교통이 잘 발달된 안전한 도시라는 느낌을 받았다.
거리 곳곳에 홈리스들이 좀 있긴 했지만, 최소한 낮에는 위험할 것 같다는 느낌은 없었고, 유명한 부두 도넛도 먹어보고 시내관광도 하고, Powell 서점도 들르고, 스타벅스에 들러서 거기서 아주 유명하다는 와인을 한병 사다가 부두 도넛이랑 함께 먹는 사치도 누렸다.
그러고보니 오리너구리 OOP책을 썼던 Timothy A. Budd 씨가 오레곤 주립대에서 일하고 있었던 것 같은데...
남한의 두배 면적의 사이즈에 인구는 1/10도 안되는 사람들이 살고 있고, 첨단과학관련 연구단지와 회사가 많고, 시에틀이랑도 가깝고, 무엇보다도 Sales tax가 없는게 정말 마음에 들엇다. 평생은 모르겠지만 언젠가 포틀랜드쪽 회사에서 일할 기회가 있다면 한 1~2년 정도는 일 해 보거나 오레곤 주립대 같은곳에서 공부해 보는 것도 좋을 것 같았다. (학생놀이)



회사에서 컨퍼런스를 갔다 오면 한국의 회사들도 그러하듯 일명 '전파 교육' 형태로 간단하게 프리젠테이션을 하도록 권하고 있는데, 안한다고 험악한 분위기가 연출되거나 하는 건 아니지만 대부분의 엔지니어들이 기꺼이 다녀와서 프리젠테이션을 하고 있고, 또 워낙 얘내들이 말하는 걸 좋아해서(한국 사람들의 평균에 비해?) 안하는 애들을 본 적이 없는지라 나도 오늘 오전에 OSCON 2013 Wrap Up 이라는 내용으로 Facebook, Netflix API, Spring Framework Updates 3개의 주제로 대략 35분 정도의 프리젠테이션을 마쳤다.
지금 생각해보니 한시간짜리 tech talk 인데 Joe가 한 10여분 하고 내가 30분 이상을 써버려서 뒤에 발표했던 주호님은 시간이 많이 부족하셨을 듯.
늘 그러하듯 영어 프리젠테이션, 특히 기술관련 프리젠테이션은 참 어렵다는 걸 다시 한번 느끼며.. OSCON 2013 참관 후기 끝.

저녁에 집에 가면 찍었던 사진 몇장이라도 함께 올려야겠다. 맥OS용 MS Live Writer 수준의 블로깅 툴이 나오면 좀 더 열심히 블로깅을 할 수 있지 않을까라는 생각도 들지만.. 그놈의 Mars랑 Ecto는 영 마음에 들지 않는단 말이지.

6/03/2011

Spring3에서 @RequestMapping시 URI tempate이 제대로 먹히지 않는 경우

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);  
  model.addAttribute("owner", owner);  
  return "displayOwner"; 
}
The URI Template "/owners/{ownerId}" specifies the variable name ownerId. When the controller handles this request, the value of ownerId is set to the value in the request URI. For example, when a request comes in for /owners/fred, the value fred is bound to the method parameter String ownerId.

The matching of method parameter names to URI Template variable names can only be done if your code is compiled with debugging enabled. If you do not have debugging enabled, you must specify the name of the URI Template variable name in the @PathVariable annotation in order to bind the resolved value of the variable name to a method parameter.

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html




요약 : Spring3에서 아래와 같이 작성을 해주면 /owners/1234 와 같이 URL이 GET으로 호출되는 경우 String ownerId 에 1234 라는 값이 자동으로 저장된다. 하지만 이건 debug enabled로 컴파일 되었을 때의 경우이고(디버깅용으로 생성된 정보를 이용해서 매칭해 준다는 거지), 제대로 하려면 @PathVariable("ownerId") 처럼 해줘야 한다는 것. 이 경우 실제 변수명은 꼭 ownerId가 아니어도 상관없다.(당연)  즉, String ownerId 이든 String theOwner이든 앞에 @PathVariable("ownerId") 만 URI tempate의 것과 맞으면 값을 할당됨.

은근히 처음 방법으로 코딩해 놓은 것들을 많이 찾아볼 수 있는데, 항상 디버깅 정보를 넣은 채로 컴파일이 되는 건 아니니까 항상 이름을 명시해주는 방식으로 코딩하자.

-P.S-
그러고보니 이 블로그에 이런 내용을 쓰는건 진짜 백만년만인듯...

5/06/2009

멀쩡하게 잘 돌아가던 Spring기반 어플에서 "SEVER: Error listenerStart"오류 발생할 때

Spring + Tomcat으로 잘 돌리던 어플에서 어느날 갑자기 start를 해보니


“SEVERE: Error listenerStart”…

“SEVERE: Context [/xxxxx] startup failed due to previous errors”,


와 같은 오류가 뜰 때가 있다.

Context[ ]

같은 내용이 뜨면 web.xml 설정을 잘못 해줬거나 TOMCAT_HOME/config/Catalina/localhost/???.xml 의 설정이 잘못된 것이겠지만

위와 같이 나온다면 거의 십중팔구 WEB-INF 밑의 web.xml 내용 중


<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>xxxxxx.root</param-value>
</context-param>

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/classes/config/log4j.properties</param-value>
</context-param>

<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>1000</param-value>
</context-param>


쪽 설정의 오류다.

아마도 로컬의 eclipse + wtp에서는 잘 되는데 통합 빌드 서버로 옮긴 다음에 문제가 발생할 가능성이 큰데 그 이유는 많은 경우 local 과 server 간의 log4j 설정등의 차이로 인해

ant build 시 **/log4j.properties 같은 것들을 exclude 시켜버려 web.xml 에서 설정된 log4jConfigLocation 의 위치에 log4j.properties 파일이 없기 때문이다.


실제로 이렇게 되면 화면에 뭐 별다른 오류도 안뜨고 사람 환장할 지경이 되는데… 설정부터 꼼꼼하게 다시 체크해 보시길.

1시간 삽질기 끝 –_-;

3/26/2009

2009년 3월 27일 읽은 책

최근 도서를 아예 읽지 않는건 아닙니디만 포스팅을 뜸하게 하고 있습니다. 도서 중 몇권은 사두고 펴보지 않은 것들도 있네요.

일단 정리도 할 겸 적어봅니다.


1. 헬로, 안드로이드



헬로, 안드로이드 - 8점
에드 버넷 지음, 한정민 옮김/ITC(아이티씨)

안드로이드 관련문서를 본적은 있지만 매번 튜토리얼 찾아보면서 하기도 귀찮고, 사실 이런식으로 하면 시간이 좀 많이 걸립니다.

할수만 있다면 괜찮은 스승이나 교재를 가지고 처음부터 끝까지 연관성있는 내용으로 쭉 훑어보는게 최고죠.

전체가 10장으로 이루어져 있는 이 서적은 6장까지의 내용이 게임 '스도쿠' 를 만드는 내용으로 채워져 있고 나머지 부분에 SQLite 나 센서사용법, 웹브라우저 써먹기, 쓰레드, OpenGL 의 내용으로 채워져 있습니다.

내용은 정말로 "Hello, Android" 의 수준이며 안드로이드 입문자에게 권장할만합니다.

Java 에 대해 어느정도 익숙하고 Eclipse를 사용하고 있는 독자라면 주말동안 충분히 따라하면서 볼 수 있을겁니다.

번역서라서 그렇겠지만 내용치고는 가격이 좀 높은 것이 단점이라면 단점이겠습니다.


2. 스프링 2.5 프로그래밍


웹 개발자를 위한 스프링 2.5 프로그래밍 - 10점
최범균 지음/가메출판사

구입한지는 좀 되었지만 그나마 최근에 와서야 나름 내용을 다 봤다라는 수준( 책을 쭉 읽어보면 모르는 내용이 거의 없고 업무에도 적용해 본? )이 되어서 정리해봅니다.

Spring 2.5 프레임워크를 다루는 서적이고 국내에서 출간된 서적 중 몇 안되는 스프링 서적 중 하나입니다.

출간된 최근 서적 중 2.5 버전을 다루는 거의 유일한 서적이고, 내용이나 가격면에서 흠잡을만한데가 별로 없는 잘 만들어진 입문서입니다.


3. 빌 게이츠, Nextpage


빌 게이츠, Next Page - 6점
메리 조 폴리 지음, 양승민 옮김/엘도라도


원제가 "Microsoft 2.0: How Microsoft Plans to Stay Relevant in the Post-Gates Era" 인 이 서적은 빌게이츠가 직접 집필한 서적이 아닙니다.('미래로 가는 길' 이나 '생각의 속도'  는 빌게이츠가 저자로 되어 있죠)

현재와 미래의 MS와 제품전략, 비즈니스 모델 등에 대해서 알고 싶은 사람들이라면  읽어볼만한 서적입니다. 사실 전 MS에 대해서는 거의 아는 게 없어서(다른 회사에 대해서도 마찬가지지만) 정보습득을 위해 이 책을 골랐는데 나름 괜찮은 선택이었던 것 같습니다. 윈도우모바일/윈도우/검색/온라인서비스/XBOX/라이센스 정책 등 MS의 서비스에 대한 내용 뿐만 아니라 현 MS의 핵심인재들에 대한 설명도 함께 곁들이면서 누가 포스트 게이츠 시대의 MS를 이끌 것인지에 대한 견해도 함께 밝히고 있습니다. (그 중에 제가 아는 인물은 스티브 발머, 레이 오지 딱 두명이더군요. -_-;;;)

정가는 13,000원으로 분량이나 번역서인 점, 그리고 내용등을 감안하면 비싸다는 생각은 안듭니다. 다만 원제와 비교해 볼때 번역본의 제목인 "빌게이츠, Nextpage" 는 다분히 출판사의 낚시성 떡밥강화의 성격이 강해보이는 점이 불만이라면 불만입니다.

요즘 포스팅을 모두 medium쪽으로 하고 있습니다

안녕하세요? 어쩌다보니 그냥 한번 써보기로 한 medium.com 에다가 죄다 최근 포스팅을 하고 있습니다. 현재 도메인인 potatosoft.com 은 제가 대학때인가 사회 취업한지 얼마 안됐을때부터 유지해 온 도메인이고, 블로그 시스템은 그...