일정표를 봤을 때 이번 공감세미나는 여러가지 기술 트랜드 보다는 자바 자체에 초점을 맞춘 분위기였다.
자바 탄생 이야기 - 김영수
이 세션은 제목대로 자바가 만들어진 과정에 대한 이야기로 자바 10주년을 기념해서 2005년에 나온 Hello World(s) -- From Code to Culture: A 10 Year Celebration of Java Technology라는 책의 내용을 정리해서 발표한 세션이었다. 1991년 제임스 고슬링은 변화의 시기에 맞추어서 무언가 해보기 위해서 Green 팀을 구성해서(사무실의 문이 녹색이었다고 한다.) 네트워크 기반의 무언가를 만들려고 했다. 그리고 사무실 밖에 있는 오크나무의 이름을 따서 OAK라는 프로토타이핑 프로젝트를 시작해서 여러 다바이스를 핸들링하려고 했는데 고슬링의 아이디어를 위한 언어가 없어서 만들기로 한다.(NO LANGUAGE FOR HIS IDEA THEN MAKE IT.)
1992년 팀의 멤버는 13명이 되고 회사의 디자이너인 Joe Palrang이 만든 캐릭터를 가져와서 Duke를 자바의 캐릭터로 만들었다. 이런 것으로 보아 단순이 코드만 짠 것이 아니라 캐릭터까지 도입해서 과감하게 진행을 했다. 고슬링이 만든 언어를 보고 C++의 빌 조이가 "C++과 비슷한 언어 아니냐"고 하자 고슬링은 "C++를 많이는 사용하지만 좋아하는 사람은 별로 없다(almost nobody liked it)라고 대답했다고 한다. OAK의 릴리즈 준비를 하는 과정에서 OAK가 이미 등록된 이름이라 여러 후보를 검토하다가 Java라는 이름으로 결정을 하고 1995년 5월 23일 SunWorld Conference에서 공개를 하고 썬의 적극적인 지원아래 이후 여러 컨퍼런스 등을 통해 홍보를 시작하고 그 뒤 부터는 커니터들이 참여하면서 퍼지기 시작한다.
약간은 지루한 세션이었다고 생각한다. 저 책을 보지 않아서 정확한 내용은 모르고 탄생과정이 스펙타클하지 않았는지는 모르지만 그래도 흥미로운 요소들이 많았으리라고 생각하는데 세션은 좀 지루했다. 자바의 탄생 과정을 탄탄하게 엮어서 설명했다기 보다는 책의 내용은 단편적으로 짚으면서 진행하다보니 듣는 입장에서는 진행과정이 잘 안이어지고 좀 지루하게 느껴지지 않았나 싶다. 그래도 탄생과정에 대해서는 잘 몰랐던 사실들을 알게 되어서 좀 나았다.
Java: The Good Parts - 박성철
이번 세션은 더그의 JavaScript: The Good Parts의 제목을 본따서 지은 제목이었고 자바의 특징을 하나씩 살펴보면서 이야기 해보자고 하셨다. 세션은 semtlnori님이 블로그에 프로그래밍 언어들을 한문장으로 소개한 글을 시작했는데 여기서는 각 언어의 정의를 정리해놨지만 마지막에 자바는 한문장으로 정리된 글을 찾을 수 없었다고 나와있다. 여기에 대한 답변을 하기 전에 자바의 특징을 살펴보았는데 자바 백서를 보면 앞에는 언어에 대한 이야기이고 뒤에는 JVM에 대한 이야기인데 설계당시 둘을 따로 구분하지는 않았겠지만 지금은 구분하므로 둘을 나눠서 설명하셨다.
언어로서의 자바를 먼저 살펴보면 자바는 단순함과 친숙함을 목표로 C/C++에서 WTF적인 요소를 뺀 것이라고 할 수 있다. 자바는 경고하고 안전하다고 할 수 있는데 여기서 견고성이란 정적(static) 타입의 언어에서 오는 장점이고 안정성은 엄격한(strong) 타입에서 오는 장점이다. (정적타입과 엄격한 타입은 약간 다르지만 보통은 같이 얘기한다.) 정적 타이핑에 대한 반대의견들이 있는데 보통 정적타이핑은 버그를 탐지하기에는 불충분하기 때문에 단위테스트를 작성해야 하고 단위테스트를 작성하고 나면 정적 타입확인 과징이라는 것이다. 거기에 정작 타이핑은 유효한 프로그램을 오류로 분류하기도 하므로 오히려 해롭다고 할 수 있다. 이에 대해서 해외에서 논문으로 연구한 내용이 있는데 파인썬 오픈소스 라이브러리 중 코드양은 적으면서 테스트가 잘 작성된 것 프로젝트들을 골라서 하스켈로 변환한뒤 컴파일하자 오류가 발생했다는 연구 결과가 있다. 정적 타입의 또다른 장점은 도구지원이다. IDE를 통해서 자동완성/자동제안을 지원하면 쉽게 리팩토링할 수 있으며 보일러 플레이트 코드를 자동 생성하거나 정적 코드분석을 할 수 있다.
자바의 또 하나의 특징은 객체중심의 프로그래밍이라는 것이다. OOP는 시뮬라67에서부터 시작되었는데 코드를 레고블럭처럼 생각하고 구조에 신경쓰기 위해서 만든 것이고 실제로는 스몰토크부터 시작되었다고 할 수 있는데 스몰토크는 객체지향을 메시징으로 보고 각 부분을 생물의 세포로 보고 있다. 알란 케이는 OOP에 대해서 정의해 달라는 말에서 메시징이 핵심이라고 했는데 자바에서는 그게 인터페이스이므로 인터페이스를 안쓰면 시뮤라67 스타일이 된다고 할 수 있다. 패키지는 디렉토리, 이름영역, 모듈이라고 할 수 있는데 응집의 단위이다. 자바의 기본 가시성은 package-private나 package-protected라고 보통 부르는데 이름이 없어서 잊혀진 존재이다. package-private는 public < protected < package-private < private정도의 가시성을 갖는데 계층관계에서는 보이지 않지만 패키지 사이에서는 보이는 가시성이다. 자바가 기본 가시성으로 package-private를 선택한 것을 보면 패키지를 단순한 그룹으로 보지 않았다는 것을 알 수 있다.
그 외에는 자바 1.1에서 추가된 내부클래스(inner class)가 있는데
두번째는 JVM에 대한 이야기인데 자바는 파이썬하고 똑같이 컴파일한 뒤 VM위에서 동작하는 인터프리터 언어라고 하셨다. 자바는 클래스로더로 동적로딩, 동적 바인딩을 위해서 인터프리터를 선택했고 LISP에서 가비지 컬렉터의 개념을 가져와서 도입했다. 그리고 코드의 메타데이터를 다루는 기술인 리플렉션을 통해서 다른 프로그램을 생성하거나 조작하는 프로그램을 작성하는 메타프로그래밍을 할 수 있다. 메타프로그래밍으로는 선행처리, 컴파일러 확장(Lombok 처럼), 스프링의 Di + AOP등이 있다. 그리고 JVM은 다언어 프로그래밍(Polyglot)인데 이제 JVM은 자바만의 VM이 아닌 상황이 되었고 바이트코드라면 원천을 따지지 않고 실행한다.
자바에 대한 기초가 많이 없는 나로써는 자바에 특징에 대한 여러가지 관점을 들을 수 있어서 어느정도 흥미로왔지만 자바의 기초에 대해서 깊게 들어간 것은 아니었기 때문에 어떤 면에서는 너무 기초적이거나 추상적일 수도 있었다고 생각한다. 흥미롭다면 흥미롭지만 사람들의 반응을 보면 또 너무 뻔하다면 뻔한 얘기일 수도 있었겠다는 생각이 든다. 또 한편으로는 추상적/개념적인 얘기가 아니라 더그의 JavaScript: The Good Parts처럼 실제 코드를 이용한 좋은 점을 설명했으면 깊이도 있고 좋지 않았을까 싶기도 한다.
챔피언이 사랑한 언어, Java - 양수열
1996년에 처음 자바를 접했는데 당시에는 Java라고 쓰고 Innovation이라고 읽었다. 정적인 웹페이지만 보다가 웹에서 듀크가 춤추는 것을 처음 보았을 때는 깜짝 놀랐고 그 당시에는 새롭고 혁신적인 언어였다. 그 당시 자바는 새롬게 성장하는 기술로 웹과 함께한 언어였기 때문에 혁신을 좋아하는 젊은 엔지니어들이 많이 관심을 가졌고 좋은 취지에 공감해서 자바 개발자 커뮤니티를 만들기도 했다. 당시의 키워드로는 Distibuted Object, OOP, Garbage collector, Enterpirse, SOA, CBD등이었다.
하지만 이제는 2012년이고 이제는 Java라고 쓰고 Platform이라고 읽는다. 오늘날의 자바는 성숙한 기술이면서 언어에서 플램폼으로 바뀌었고 구식이면서 오래된 엔지니어들이 있는 기술이게 되었다. 그럼 우리는 어디로 가야하는가? 아마 WAS는 영원할 것이다. 과거 메인프레임의 시대가 끝난뒤에도 메인프레임을 유지하는 곳이 많았기 때문에 IBM은 노령의 엔지니어를 메인프레임 유지보수를 큰 비용을 주고 고용하고 있는데 WAS도 비슷하게 계속 유지될 것이다. 자바 플랫폼위에 새로운 언어를 사용할 수도 있고 요즘은 데이터 분석기술이 많이 중요해 지고 있다고 생각하기 때문에 이쪽으로 스킬업을 해도 도움이 될 것이라고 본다. 이제는 완전히 새로운 새상이 왔고 개발자가 창조가가 되었으면 글로벌 시장이 열렸고 혼자서도 회사를 할 수 있는 세상이 되었다. 개발자들이 이 과도기를 잘 헤쳐나가서 좋은 세상을 만들기를 기대한다.
그냥 무난한 세션이었다. 한편으로는 과거에는 자바가 혁신이었다는 말에 어쩌면 당연한 말이었지만 새삼 깨닫게 되었다. 양수열님이 오랫동안 자바를 사용하면서 생각했던 내용들을 그냥 에세이처럼 들려준 세션으로 그냥 웃으면서 가볍게 이야기 듣듯이 들은 세션이었다. 그런 목적도 아니었겠지만 특별히 큰 인사이트를 주거나 하는 세션은 아니었다.
자바 기반 시스템의 개발 및 운영에 도움이 되는 툴들 - 이상민
제목 그대로 여러가지 도구에 대해서 설명한 세션이었다. 우리나라에서는 이클립스만 거의 쓰지만 해외 컨퍼런스를 가면 넷빈즈를 상당히 많이 쓰고 있고 사용 IDE인 IntelliJ도 상당히 좋다. 보통은 JDK나 JRE만 설치해서 쓰지만 JDK에는 상당히 좋은 도구들이 많이 들어있다.
- jps : jps는 java process 목록을 제공하는 도구로 보통은 이름만 나오기 때문에 톰캣을 여러개 띄운 경우 구분할 수 없는데 이때는 jps -v를 사용하면 실행옵션을 함께 볼 수 있다. ps -ef | grep java를 하는 것보다는 jps가 훨씬 간단하고 jstat과 다른 점은 자신의 계정으로 실행한 것만 보인다는 것이다.
- jstat : jvm의 상황을 모니터링하는 도구로 운영서버에 절대 영향을 안주기 때문에 리얼서버에서 사용해도 문제가 없다. 유용한 옵션으로는 gc상태를 모니터링하는 -gcutil과 jvm의 메모리 점유 상황을 모니터링하는 -gccapacity가 있다.
- javap : 자바 클래스 파일을 분석해 준다. javap className을 실행하면 해당 클래스에 선언된 변수와 메서드 정보등을 출력해 주고 javap -c className을 실행하면 해당 클래스의 opcode(JVM을 위한 중간코드)를 출력해준다.
- jstack : 쓰레드 덤프(thread dump)를 발생시켜서 덤프 발생시점에 어떤 쓰레드가 어떤 작업을 수행하는 지 제공하는 덤프파일을 생성한다. 하지만 jstack는 경우에 따라 프로그램에 Hang이 발생할 수 있으므로 사용하지 않는 것이 좋고 쓰레드 덤프는 kill -3 pid를 사용할 것을 권장한다.(-3 옵션을 빼먹거나 -9를 사용하지 않도록 주의해야 한다.)
- jmap : 힙덤프(heap dump)를 발생시켜서 덤프발생시점에 어떤 객체가 어떤 값을 갖고 있는지를 저장한다. 운영시에 jmap을 실행하면 자바 프로세스가 멈추므로 꼭 필요한 경우(메모리 릭 같은)에만 사용해야하고 jmap -dump:format=b, file=filename pid같은 옵션을 사용한다.
- jhat : 힙덤프를 분석해준다.
- jconsole, jvisualvm : 뒤에서 얘기할 비쥬얼 vm이 낫다.
테스트 도구에는 여러가지가 있는데 유닛테스트에는 JUnit이 대표적이고 UI 테스트에는 Selenium이나 NHN의 Guitar가 있다. 인수 테스트도구로는 Fitness와 NTAF가 있고 성능테스트 도구에는 Load Runner만 있는게 아니고 상용툴로는 Microfocus사의 qa load나 무료툴인 grinder, jmeter등이 있다. 로드러너 아니면 안되는줄 아는 사람이 많은데 참고로 로드러너는 엄청 비싸다.
프로파일링 도구는 프로그램의 성능, 메모리 사용량, 코드 커퍼리지 등을 확인할 수 있는 도구인데 성능저하를 많이 발생시키기 때문에 운영서버에서는 사용하면 안되고 개발자PC나 개발서버에서만 사용해야 한다. 크게 상용툴과 무료툴로 나뉘지만 상용툴을 쓰기를 권장하고 자바 프로그래머라면 IDE처럼 항상 옆에 끼고 있어야 하는 도구이고 대부분의 상용도구들은 IDE와 연계할 수 있고 라인단위로 걸린시간과 메모리까지 파악할 수 있다. 프로파일링 도구로는 microfocus사의 devpartner for java, quest사의 jprobe, ej-technologies의 jprofiler, yourkit 등이 있다.
모니터링 도구로는 국산제품이 많은 APM에는 Jennifer, webtune, pharos가 있다. 그 외에 JMX(Java Management Extension)를 사용할 때는 무료툴로도 충분한데 visual vm과 jconsole이 있다. visual vm은 JRE에 포함된 jvisualvm과 별도로 설치하는 visual vm으로 나뉘는데 버전업이 가능하고 사용이 편한 visual vm이 더 낫다.
트러블슈팅 도구를 보면 쓰레드덤프 분석도구에는 대표적으로 TDA가 있는데 어플리케이션의 성능이나 기능상에 문제가 있을 경우에 사용하면 된다. 힙덤프 분석도구에는 IBM Heap analyzer나 MAT이 있고 Tracing 도구에는 Btrace나 byteman이 있다. CI도구는 지속/반복적으로 빌드를 수행해주는 도구로 Hudson과 Jenkins가 있는데 Hudson의 핵심개발자가 나와서 만든게 Jenkins이므로 그냥 Jenkins를 사용하면 된다. 그외에 크루즈 컨트롤이 있다. 프론트앤드 도구에는 웹페이지를 최적화해주는 도구인 야후의 yslow가 있지만 요즘은 브라우저에 빌드인된 도구도 충분히 좋다. 발표자료는 이상민님이 블로그에 올려주셨다.
이번 공감세미나에서 거의 유일하게 기술세션이라고 할 수 있다. 뭐 워낙 발표도 잘하시고 농담도 잘 하시니 즐겁게 들었다. 상당수의 도구는 알고 있는 도구이기는 했지만 한방에 분야별로 정리를 해주었기 때문에 도구를 선택할 때 꽤 도움이 될듯하다. 특히 도구들에 대해서 잘 몰랐다면 이상민님이 좋은 도구를 다 골라주었기 때문에 아주 유용했을 것 같다. 나로써는 다른 부분보다는 JDK에 포함된 도구들을 설명해 준것이 크게 도움이 되었다. 여기 꽤 많은게 있다는 것을 알고 있지만 익숙하지 않아서 자주 쓰진 않는데 여러가지 상황별로 JDK도구들을 사용해야 할때 도움이 될 것 같다.
자바 개발 안티 스타일 - 스프링을 이용한 레거시 코드 중심으로 - 윤여진
이 세션은 요약하지 않는다. 머 이리저리 깊게 얘기하고 싶지도 않다. 특정인을 머라하는 것 같아 신경쓰이긴 하지만 머 그냥 느낀대로 딱 까놓고 얘기하면 발표 참 쉽게 하신다 싶은 생각이 들었다. 제목과는 전혀 다르게 "토비의 스프링 3"책에 나온 초난감 DAO를 리팩토링하는 과정을 그래도 PT로 만들어서 설명해 준 세션이라서 솔직히 난 그냥 딴짓을 했다. 그냥 "토비의 스프링 3"책을 그룹스터디 한다면 초난감 DAO 장을 정리해서 보여준 발표정도였다.
Epilogue
최근에 메일링등에서 너무 최신기술만 다루지 말고 자바 자체에 대해서도 관심을 가지자라는 말을 들었었는데 그때는 꽤 공감했었지만 막상 자바를 주제로 한 세미나를 듣자 만족감이 그리 높지는 못했다. 뭐랄까 세미나의 의도가 정확히 어땠는지는 알 수 없지만 자바에 집중하다보니 세미나가 전체적으로 추상적인 내용이나 개념적인 내용이 상당후가 되어버린것 같다. 개인적으로는 기본적인 내용(쉽다라는 의미는 아니다.)을 중심으로 기술세션들을 기대했는데 대부분이 추상적인 얘기를 하는 세션들이 되다보니 듣는 입장에서는 만족도가 좀 떨어진게 아닌가 쉽다. 그렇다고 뭐 괜히 갔네.. 이런건 아니다. ㅎ
제가 Inner class를 리스프에서 가지온 개념이라고 말했다면 미친 겁니다. 그렇지도 않고 그렇게 생각해본적도 없습니다. 죄송합니다. 헛소리를 많이했나보네요.
제가 잘못적었을 수도요.. ㅠㅠ
수정했습니다. ㅎㅎㅎㅎ
즐겁게 읽었는데, 마지막에 그냥 그랬다고 하니 즐겁게 읽은 내가 뻘줌합니다 ㅎㅎ
마지막 소감이니까요.. ㅎㅎ