Toby형이 글을 자주 올린다. 구체적인 기술을 다루는 이야기라 댓글이 많지 않았는데, 모처럼
viz란 분이 논쟁을 부르는 댓글을 올렸다. 그랬더니 Toby형 뿐 아니라
entworks님까지 몰려 왔다. 흥미롭게 이어지던 글은 아쉽게도
노이즈로 바뀌었다.
frankly speaking ID를 쓰는 분이 어구가 담고 있는 뉘앙스까지 담아낸 듯하다.
franklyspeaking 이란 분의 글을 보면 대단한 경력이 있어 자랑하고픈 듯하다. 그렇지만,
보편적인 문제 제기를 이해하지 못한다. 한 수 위라는 듯한 말투인데 그랬다면 Toby 형 주장의 오류를 드러낼 능력이 있어야 한다. 현장 경험을 중언부언 올린 댓글은 길기만 할 뿐이다. 기억에 남는 내용을 굳이 꼽으면 바로 이 부분이다.
JavaEE는 서버사이드 소프트웨어에서 풀어야될 문제들을 대부분 해결해놓은건데 제가 우습게 볼 이유가 없습니다. 스프링은 어떻게 보면 좀 우습게 보입니다.
Java EE와 스프링이 마치 상호배타적(Mutually Exclusive)인양 쓰고 있다. 일단, 스프링을 잘 모르는데 감정이 있는 듯하다.
스프링은 이름을 정말 못짓는다는 생각이 듭니다. 이름을 못 지으니 의미가 분명하지 않고 비즈니스 어플리케이션 개발자들을 헷갈리게 만드는 프레임워크라고 보입니다.
그런데 예를 정말 잘못 선택했다.
예를 들면, prototype scope나 client proxy라는 이름 자체가 그것의 실제로 의미하는바를 전혀 클리어하게 나타내지 못하고 있습니다.
미안하지만
Prototype은 소프트웨어 개발 분야 최고의 정리 중의 하나인 GoF 패턴 이름을 빌린 보편적인 이름이다. Proxy는 어떤가? 역시 GoF에서 왔고,
JDK에도 등장하는 어휘다. 스프링은 특정 개발팀 하나를 위해 작명하지 않기 때문에 보편 지식에서 용어를 정의했을 테니, 패턴이나 메커니즘 표현에 대한 배경 지식이 부족하면 어렵게 느낄 수 있다. 스프링에서 나쁜 작명을 찾으려고 한다면, 웹 MVC 모듈에서 찾을 수 있는 비슷비슷한 Template 메소드 이름을 권하고 싶다.
좋은 작명을 위해 고민하라며 쓴 글을 보자.
그런 클리어하지 못한 이름들이 의미하는 바를 외우고 쓰게하는 보다는, 웹 서버 프로그램은 request, session을 다루고
request scope는 보통 thread-safe하다고 외워서 쓰게 만드는게 훨씬 직관적이고 기억하기 쉽죠.
스프링의 IoC는 웹과는 무관하다. 웹에서 쓰도록 Request와 Session 스코프를 제공하긴 IoC 자체가 웹에 종속한 내용이 아니다. Toby 형을 두고 경험 운운하는데, 아무래도 웹만 경험해서 이런 글을 쓰지 않았을까 짐작된다.
설사 경험이 많다 하더라도 개념은 확실히 빈약하다. 다음 글을 보자. 도대체 무슨 말인가?
사실 서버 프로그래밍의 이슈는 concurrency, transaction, caching, coherence,
scalability, load balancing이지 dependency injection따위가 아닌데, 시스템 프로그래머들이
이런거 많이 가려주고, request, session, thread safety같은것들 가려주는 annotation들을
제공해주니까 비즈니스 어플리케이션 개발자들은 그냥 외워서 쓰면 되는겁니다.
coherence는 왜 튀어나왔는지 모르겠지만, concurrency, transaction, caching 등등이 서버 프로그래밍의 이슈란다. 서버 프로그램이란 표현이 매우 모호하지만 대충 넘어가자. dependency injection은 서버 프로그래밍 이슈가 아니란다. 시스템 프로그래머가 가려준다는 말은 앞에 나열한 이슈를 해결해준다는 말이라고 번역하자. request, session, thread safety도 annotation으로 가려준단다. 세 가지도 서버 프로그래밍의 이슈인가? 짐작건대 시스템 프로그래머가 다루는 이슈는 주로 WAS 같은 미들웨어 성격의 내용이다. 그렇다면, WAS가 Dependency Injection은 제공하지 않을까? 마지막 말처럼 비즈니스 애플리케이션 개발자는 그냥 외워서 쓰면 되던가? 그렇다면, 스프링은 등장하지 않았을 것이다.
기술적인 글을 대할 때도 이렇게 난잡하게 이야기하는 풍토는 내가 속한 SI환경을 드러내는 현상이다. 계획 없이 무턱대고 개발하던 시기를 막 지나는 중이기에 우리 SI 환경은 문제를 진지하게 고민하고, 토론하고 공유하고 개선하는 일은 드물다. 자바나 JSP 등의 기술을 다룬 책 이외에 본격적으로 설계를 다루는 책조차 아직은 보기 어렵다.
하지만, 인스턴스의 스코프(Scope) 문제를 깊이 있게 다루며, 애노테이션 도입에 따른 자바 언어의 진화에 따른 파급효과도 함께 언급한
Toby 형 글처럼 고민한 내용이 쌓이고, 나뉘고 토론을 통해 발전하는 과정이 바로 미래를 여는 순간이라고 믿는다. 같은 시간에 독선적 프로그램을 만들어 타인에게 피해를 주는 구시대 프로그래머 역시 과거에 배운 짧은 지식과 경험을 음미하며 인생을 보낼 것이다.
독선적 프로그램은 연동하는 프로그램을 작성하는 다른 이를 고통스럽게 한다. 독선적 프로그램을 무책임하게 남에게 넘겨주며 자리를 옮기는 이도 있다. 독선적 프로그램을 양산하여 판매하는 이도 있다. 아는 사람은 뻔히 아는 현실을 무시하고 IBM이나 오라클을 넘어섰다는 그 회사 코드를 보니 스프링 웹 MVC를 패키지 그대로 복사하고 org.springframework 부분만 자사 도메인으로 바꾼 부분을 확인할 수 있었다. 언젠가는 그 회사 패키지가 너무 느려서 APM으로 확인해보니 대부분의 SQL에 DECODE로 사용해 Full Scan을 유발했고, 자사 인력이 해결하지 못해 당시 프로젝트 DB 전문가가 쿼리를 만들어줬다. 이 회사의 무책임한 작태에 대해서는 말을 참기 힘들지만, 직원들이 받을 상처를 생각하면 조심스럽다.
가끔 '차세대 프로젝트' 경험을 자랑하는 개발자를 만난다. 관리자를 했다면 인정해줄 만하다. 많게는 수백 명을 통제하는 일은 쉽지 않다. 하지만, 개발자는 어떨까? 차세대 프로젝트건 소규모 프로젝트건 일정 비율의 사람은 중요한 일을 하고, 일정 비유의 사람은 적당히 일하고, 일부는 문제를 만든다. 도리어 차세대 프로젝트는 워낙 규모가 커서 사람도 많고, 여러 회사를 통해 처음 모인 서먹한 관계라 상당수가 다른 사람이 짜고 있는 코드가 있는 줄도 모르고, 바로 옆에서 거의 비슷한 코드를 짜면서 세월을 보내기도 한다. 증권 차세대 경험을 내세우면 제멋대로 짜는 이를 만난 일이 있다. 그가 짠 코드의 버그 탓에 오류가 발생했다. 일년 가까이 코딩을 손대지 않던 터라 문제가 있는 파일 이름을 알려주고 원인을 물었다. 버그가 있는 줄도 모르던 그에게 당신 코드에 버그가 있다고 말해줬더니 '자신이 요즘 얼마나 바쁜가'에 대해 설명한다. (SI 경험 탓에 포기하고) 처음 보는 코드에서 Stack Trace를 토대로 버그를 찾았다. 암호처럼 짠 코드지만 문제 소지가 있는 부분만 찾아 테스트해 보니 대략 20~30분이 걸렸다. 이를 모르던 개발자는 다음 날, 버그와 아무 관련이 없는 코드를 들먹이며, 그 내용을 수정해서가 아닌가 싶다고 근거 없는 추측을 아무 부끄러움 없이 말했다.
한동안 이런 상황을 탓하며 살았다. 마치 역사책을 훑듯 눈높이를 확장해서 보면 초창기에 겪는 시행착오일 수 있다. 그리고 미래로 나아가는 하루를 살려면, 더 솔직하게 모르는 내용을 꺼내서 잘게 쪼개고 하나씩 차분히 정리할 때다.