나는 이미 책을 쓰고 있었다.


old-book 폴더에 들어있는 폴더는 2010년 11월에 쓰다만 책이고, myBook 폴더 바로 밑에 들어있는 책이 요즘 다시 쓰고 있는 책이다. 책은 예전에 박재성님이 쓰신 스프링 책과 비슷한 컨셉이다.

초보자를 위한 스프링 기반의 자바 웹 개발

이게 핵심이다. 어떤 한 주제를 깊게 파는 책이 아니라, 이클립스, 메이븐, 스프링, iBatis, Hibernate, JSP, HTML, CSS, JavaScript를 활용해서 웹 애플리케이션을 구현하는 전체적인 흐름과 구조를 보여주기 위한 책이다. 따라서 초보자도 누구나 따라서 자바로 웹 개발을 해볼 수 있는 책을 써볼 계획이다.

혹시라도 내가 파일만 만들고 뻥을 치고 있다고 생각할까봐. 1장 파일을 찍어봤다. 6월 27일로 나온다. 이미 저 날짜보다 하루, 이틀 전에 쓰고 몇번 더 수정한 파일이지만 드랍박스라서 최종 일자만 나온다. 그 쯔음에 어떤 출판사에게서 내게 책을 쓰자고, 계약을 하자는 제안을 받았지만, 나는 적어도 초벌은 쓰고나서 계약할 심산이었기 때문에, 안쓰고 있다고 거짓말을 했다.

쓰고 있다고 말하면 어떻게해서든 계약을 해버릴 것 같았기 때문에 두려웠다. 거짓말을 한 것은 죄송하지만, 내가 잘못했다는 생각이 들진 않는다.(거짓말이 다 나쁜건 아니니까.) 내가 준비가 됐을때 계약을 해야지 출판사의 압박을 받아가면서 책을 쓰고 싶지도 않았고, 출판사의 기획의도에 나의 책을 끼워맞출수 있는 능력은 내게 없기 때문에, 계약이 무의미 하다고 생각했다.

그런데, 오늘 그 출판사에서 내가 잘 아는 어떤 분과 비슷한 컨셉의 책을 계약했다는 이야기를 들었다. 그 분이 내가 저 책을 쓰고 있는지 알고 있는지 어떤지는 말하지 않겠지만…

그게 중요한게 아니라.

나중에, 내 책이 비겁한 책으로 비춰질까봐 걱정됐다. 열심히 쓴 책인데, 마치 내가 저술 계획을 가로챈 모양이 될까봐 어떻게 해야되나..참 고민이 많았다. 오늘 계약 소식을 듣기 전부터 이미 그런 조짐을 알고 있었는데, 오늘에서야 그게 확정이 된 것이다.

이럴 때 가장 쉬운건, 때려치는 거다. 지금 쓰고 있던걸 버리는거다.

그럼 그 분은 열심히 자기 책 써서 또 대박이 나실테고, 나는 내가 쓰던거 그냥 버리고 영어 공부나 열심히 하면 된다. 그런데, 남자가 칼을 뽑았으면 무라도 썰라고 했는데, 중간에 포기한건 이미 한번으로 족하지 않을까 싶어서, 자존심이 좀 상했다.

요즘 이런 고민을 하느라, “무소의 뿔처럼 혼자서 가라.”라는 글을 외우고 또 외우고 있다

결론은, 그 분이 어떤 책을 쓰시던 나는 내가 가던대로 내 방식대로 계속해서 쓰고 원래 계획대로 초벌이 끝나면 출판사를 알아볼 생각이다.

쓰고 있다는 증거로, 1장 버전 0.1을 공개해 두겠다.
나는 비겁하지 않다.
그리고 난 내 책을 계속해서 쓰겠다.
올해 안에 내는 걸 목표로!

[자바 7] Fork/Join 프로그래밍

http://www.javacodegeeks.com/2011/02/java-forkjoin-parallel-programming.html

http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html

http://www.ibm.com/developerworks/java/library/j-jtp03048/index.html

http://www.coopsoft.com/ar/ForkJoinArticle.html

자바의 Thread 프로그래밍을 조금 더 간편하게 도와줄 API가 추가된다. 조금 일정 영역에 특화된 API로 보인다. request-response 형태의 웹 요청 처리용으로는 어떨지 모르겠지만… 어떤 작업이 여러 독립적인 하위 작업으로 나뉘어 처리가 가능한 작업일때 Fork/Join을 적용할 수 있겠다. 가장 흔히 등장하는 예로, merge sorting과 배열에서 가장 큰 값을 찾아내는 작업이 있는데, 조금 더 실무에 가까운 예제가 언뜻 머리에 떠오르지 않는다. 이런건 어떨까… 1년간 거래된 상품 중에서 가장 많이 팔린 상품을 찾는 작업이라던지.. 가장 많은 댓글이 달린 볼르그 글을 찾는 작업은 어떨까..

거래 내역이 엄청나게 많을 테니까 월별로 쪼개서 가장 많이 팔린 상품 데이터를 찾아내고 각 월별로 찾아낸 상품 정보를 다시 합쳐서 그 안에서 다시 또 가장 많이 팔린 상품을 찾아내면 되겠다. 댓글 많이 달린 글 찾기도 마찬가지다.

갑자기 Map/Reduce가 떠오른다. Fork/Join 이라는 단어를 봤을 때 부터 떠올랐던 단어들이다. 하둡 책 1장에 Map/Reduce 설명이 잘 나와있는데, Fork/Join은 Map/Reduce와 거의 같아 보이지만, 그것 보다 더 많은 제어권을 개발자에게 주는 것처럼 보인다. 그렇게 차이를 보이는 핵심 개념이 Fork/Join에 예제에 자주 등장하는 Threshold라는 것인데, 이것을 기준으로 Fork 할지 말지를 결정하게 된다. Threshold 값 이하의 리소스는 단순 처리하며, 그 이상의 경우에만 병렬 처리를 하도록 설정한다. 물론 뭐 이것도 코딩하기 나름이겠지만 보통 저런식으로 하게 마련일텐데, 저 형태 자체를 템플릿-콜백 스타일로 만들어 볼 수 있지 않을까 싶다.

코딩하는 방법은 제일 위에 있는 링크에 잘 나와있어서 굳이 내가 다시 정리해야 할 필요는 못 느끼겠다. 그냥 한번 돌려본 스크린 캡춰로 대신한다.

맨 위에 있는 글이 가장 정리가 잘 되어 있고, 주요한 링크들이 많다. 그 아래 두개의 링크는 너무 오래된 글들이라서 API가 지금과는 다르지만, 주요 개념 파악하기는 좋다. 그보다 조금 더 근본적인 개념이 알고 싶다면 맨 마지막 링크를 보는게 좋다.


봄싹 스웨거 4월 모임 메모

중구난방으로 정리한 지난 스터디 메모장..

——————

jps

jstats

자바옵션으로 줄 수 있는 verbosegc

http://www.javaspecialists.eu/archive/Issue191.html

verbosegc로 찍은 로그 분석기, hp jmeter

jProfiler 추천함

String 처리가 성능에 미치는 영향 -> StringBuffer, StringBuilder

로깅이 성능에 미치는 영향 -> SLF4J

워크로그는 응답 처리 다 끝난 다음에 찍힌다.

웹 로그 분석 툴

Serial Collector는 주로 클라이언트 애플리케이션에서 사용.

G1은 JDK7에서 지원. JDK6에서도 early access로 사용 가능.

Serial Collector: mark-sweep-compact

Parallel Collector: young 영역을 paraller하게, old 영역은 mark-sweep-compact

Parallel Compacting: old 영역을 mark-summary-compaction

Concurrent Mark Sweep: old 영역을 CMS 사용. CPU 많이 먹음. 그리고 특정 조건에서 컴팩션이 발생하는데… 그게 m-s-c보다 더 오래 걸린다.

G1은 copy 방식이 아니라 move 방식이라 훨씬 빠르다.

GC 튜닝 방법

– 메모리 크기 선택

어떻게? 여러 서버에 각기 다른 메모리 크기 할당한 뒤, full GC 수행 시간과 빈도 측정.

– GC 방식 선택

– GC 옵션 선택

– VM 타입, Heap 크기, Young 크기와 비율(-XX:NewRatio 2나 3 해보자), Perm 크기, 쓰레드 크기(-Xss)

부하 생성: Grinder, JMeter

BTrace: 동적 모니터링 툴

http://kenai.com/projects/btrace/downloads/directory/releases/release-1.2

btrace pid 스크립트_이름

com.sun.tools.attach.VirtualMachine

http://www.j6a.ru/classcom_1_1sun_1_1tools_1_1attach_1_1_virtual_machine.html

Instrument

ASM

http://toby.epril.com/?p=828

프로파일링 툴은 운영서버에서만 사용해야 한다. 그런데 BTrace는 특정 몇몇 클래스에만 적용해 볼 수 있다.

kill -3 스레드덤프

[봄싹 스웨거] 3월 모임 안내

봄싹 스웨거 스터디가 벌써 3회까지 왔습니다. 앞으로 9회가 남았군요. 든든한 스폰서 덕분에 장소 걱정은 덜었지만, 원래 모임 취지와는 달리 발표 지원이 잘 안되고 있으며, 홍보가 잘 안되서 인지 참석자가 늘고 있지 않으며, 여전히 운영 부담이 저에게 집중되고 있습니다. 좀 나누고 싶진 한데 이제 부회장님도 생겼으니 차차 나아질 것으로 기대합니다.

애니웨이.. 이번 주 토요일 오전 10시 토즈 강남 2호점입니다.

3월 스웨거에 준비된 주제는 다음과 같습니다.

  • 인문학
  • 정규식
  • 스프링 3.1 빈 프로파일

발표가 끝나면 자유롭게 질문/답변을 하거나 토론을 즐길 수 있습니다.

http://www.springsprout.org/study/4494/meeting/4927

모임에 참석하는 방법이나 스터디 참여 방법은 봄싹 홈페이지 첫 화면의 봄싹 이용 가이드를 참고하시기 바랍니다.

참가 신청이 잘 되지 않으면 그냥 오셔도 무관합니다. 아직 자리는 많습니다.

스프링 3.1 빈 프로파일과 Environment

최근 스프링소스 블로그에 계속해서 스프링 3.1 m1에 추가한 최신 기능을 소개하는 글이 올라오고 있습니다. 회사를 옮긴 뒤로는 도무지 블로깅할 시간이 나지 않아서 많이 뜸해졌지만, 퇴근 길에 시간이 좀 생겨서 읽은 내용을 간략하게 요약해 봅니다. 시간나면 하나씩 실습해보고 올리겠습니다.

http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/

이 글이 시작인데, XML 기반 설정에서 빈 프로파일을 사용하는 방법을 설명하고 있습니다. 여기서 사용한 예제 코드도 공개했고, 해당 블로그 글에서 간략하게 소개해 주고 있는데, 개발 단계에서 사용하는 DataSource와 배포 단계에서 사용하는 DataSource  빈이 다를 때 빈 프로파일을 사용해서 해결하는 방법을 보여줍니다.

이 글을 읽으면서 두 가지에 감동했는데, 하나는 읽는 사람을 몰입시키는 순탄한 글솜씨와 아주 깔끔한 기능 설계입니다. 저도 이런 기능이 필요함을 느끼고 어떻게 해결해야 하나 고민을 했었는데 이것처럼 깔끔한 방법을 고안하진 못했었습니다. 역시 스프링소스 개발자들은 능력자라는 생각이…

http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

이번 글은 첫번째 글에 이어지는 내용으로, 첫번째 글에서 했던 작업을 똑같이 자바 설정으로 하는 방법을 소개합니다. 3.1에는 본격적으로 자바 설정을 강화하려는 움직임이 너무도 뚜렸하게 보입니다. 인터페이스까지 활용해서 빈 프로파일을 활용하는 방법을 보는 순간.. 또 한번 감동했습니다.

http://blog.springsource.com/2011/02/15/spring-3-1-m1-unified-property-management/

이 글까지가 사실 상 하나의 묶음입니다. 빈 프로파일과 Environment로 묶음 이유도 그 때문입니다. 이전까지 시스템 프로퍼티와 Environment 프로퍼티를 사용할 수 있었는데 3.1 m1ㅂ 부터는 이 둘과 커스텀 프로퍼티 소스까지 묶어서 Environment라는 인터페이스로 사용할수 있어서 플레이스 홀더 활용성이 높아졌습니다. 그리고 이전까지 살펴봤던 빈 프로파일도 Environment에서 설정합니다.

그럼데 아직도 스프링  3.1 m1에서 살펴볼 주요 기능이 남았습니다.

  • 피쳐스팩과 MVC 자바 설정
  • 캐시 추상화