MyBatis는 ORM이 아니다.

구 iBatis, 현재 MyBatis는 ORM(Object Relational Mapping이 아니다.

http://en.wikipedia.org/wiki/Object-relational_mapping

http://www.mybatis.org/

이 두개 링크만 봐도 알 수 있지만, MyBatis 홈페이지에도 ORM이라는 말은 전혀 나오지 않는다. 그런데도 일부 MyBatis와 JPA 류를 같은 ORM이 아닌가 혼동하는 분들이 있다.

ORM은 간단하게 말해서 Object와 Relataion 간의 불일치 문제(단위, 상속, 데이터 타입)등등 여기 나와있는 문제를 해결해주는 도구다.

MyBatis가 저기 나열된 문제 중에 뭘 해결해주는가? 없다. ORM이 아니다. 그냥 자기 홈피에 써있는데로 단순한 데이터 맵퍼일 뿐이다.

무늬만 계층형 아키텍처

“DAO 단에서 화면에 필요한 데이터를 미리 다 준비해서 가져온다.”

Dao, Service, Controller가 별개의 클래스로 구성되어 있고 또 인터페이스까지 만들어 놨다고 해서 계층형 아키텍처를 지키고 있는 아니다.

나도 잘 몰랐거나 오해했던 내용을 사부님과 이야기 나누며 다시 개념을 정리하고 있다. 이야기의 시작은 OSIV 패턴을 사용하는게 게층형 아키텍처를 위반한 것이냐 아니냐 였다. 나는 위반했다는 입장이었고, 사부님은 아니라는 것이었다. 결론부터 말하자면 내가 틀렸다.

우선 나의 생각은 이랬다. 어떤 블로거의 글처럼, 뷰 단에서 DB 쿼리가 발생할 수 있으니 DAO 계층에서 할 일을 뷰 단에서 한 것이나 마찬가지이고, 그래서 계층형 아키텍처가 깨졌다고 주장했다.

하지만 사부님은 간단하게 반론을 제기했다. 그렇다면 Transparent Persistence(TP) 기술 자체가 계층형 아키텍처를 위반한 것이라는 건데, 예를 들어 서비스 계층에서 Lazy loading하는 것도 그럼 계층형 아키텍처 위반이냐?

오히려 내 생각에 반전을 일으키는 말씀을 하셨다. TP 때문에 오히려 계층형 아키텍처가 굳건해 진다는 것이다. TP가 없었다면 오히려 도메인 객체만 전달하는게 아니라, 서비스나 컨트롤러 혹은 뷰 단에서 필요한 데이터를 전달하게 되는 것이고, 그렇게 되면 계층 간에 필요한 데이터가 무엇인지 분명히 알고 있어야 하기 때문에 그로인한 결합도가 생긴다는 것이다. 맞는 말이다. 계층 간에 주고받는 데이터가 구체적일 수록 변경에 민감하게 반응하게 될 것이다. 결국 겉으로만 분리되어 있고 실제로는 데이터를 중심으로 강하게 결합된 구조가 된다. 화면에서 보여줄 데이터가 바뀌면 결국 컨트롤러, 서비스, DAO 전부 바뀌게 되는 것이다. 그런데 JPA를 사용하면 얼마든지 TP가 가능하기 때문에 도메인 객체만을 주고 받게 되고, 그렇게 되면 데이터 중심의 개발 방법에 비해서 변경될 여지가 적다. 결국 유지보수성이 뛰어나다.

결국 TP는 계층형 아키텍처의 취지에 완벽하게 부합하는 것이다. 그리고 OSIV는 TP를 뷰 랜더링 시점까지로 연장시켜줄 뿐, 어차피 거의 기본적으로 서비스 계층의 오퍼레이션 마다 TP가 적용되고 있다. 그리고 애초에 뷰단에서 쿼리가 날아갔을 때 뷰단에서 JDBC Connection 객체를 가지고 코딩한 것도 아니고 그저 도메인 객체 그래프를 가지고 네비게이션 했을 뿐 아닌가? 코드 레벨에서 전혀 계층형 아키텍처를 위반하지도 않았다.

이야기는 계속 이어져서, 데이터 중심 개발 방법과 도메인 중심 개발 방법의 차이점과 특징에까지 이르렀다. 그리고 도메인 중심 개발 방법에서도 도메인 계층을 벗어날 때 DTO를 사용하자는 집단과 그러지 말고 그냥 도메인 객체 그대로 쓰자는 집단의 주장과 흐름까지도 이야기를 들었다.

“화면에서 어떤 데이터를 보여줄지 DAO가 다 알고 그에 맞게 SQL을 미리 다 짠다면 이미 DAO가 뷰 단과 강한 결합이 생겼다는 증거다. 이런건 계층형 아키텍처가 아니다.”

데이터 중심 개발을 하면 위에서 예를 든 것처럼 계층간의 결합도가 높아서 변경될 여지가 많다. 하지만 모든 계층에서 도메인 객체를 사용한다면 이야기는 달라진다. 모든 데이터는 이미 도메인 객체에 들어가서 메모리에 들어가 있다는 가정하에 도메인 객체를 네비게이션 하면서 비즈니스 로직을 처리하고 뷰에서 랜더링을 하는 것이다. 따라서 필요한 데이터가 도메인 객체 네비게이션으로 참조할 수 있는 한도 내에서는 전혀 코드를 변경할 필요가 없다.

“DAO, Service, Controller, 뷰를 전부 도메인 모델만 공유한 상태에서 각자 다른 팀에서 개발한다고 가정하고 코딩을 하면 도메인 중심 개발 방법에 가장 잘 맞는 형태의 코드가 나올 것이다.”

결국 OSIV로 얻을 수 있는 장점은 다음과 같다.

1. 개발 속도 향상

2. 이상적인 계층 구조 확보

3. 적절한 엔티티 캐시 활용

그러나 전제가 더 중요하다. “도메인 중심 개발 방법”을 적용했을 때에야 이런게 의미가 있지, 앞서 말한것처럼 “데이터 중심 개발 방법”을 사용하면서 하이버네이트나 OSIV를 사용하겠다는 것은 권장하지 못할 시도인것 같다. 그래가지고는 오히려 하이버네이트에 대한 악담과 비화만 늘어날 뿐이다.

사부님이 권장하는 하이버네이트 개발 스타일은 다음과 같다.

1. Entity 캐싱을 하고 join fetch 없이 개발

2. 매번 같이 다니는 연관 관계면 아에 매핑을 eager fetching으로 튜닝

3. 가끔씩 같이 다닌다면 런타임시 join fetch

도메인 중심 개발을 할 때 DTO를 쓰자는 입장은 화면단에서 도메인 객체에 setter 호출로 데이터를 조작할 수 있다는 것을 위험하다고 여겨서 함수형 언어에서 주로 사용하는 immutable한 객체를 만들어 넘기도록 DTO를 권장했다. 심지어 OSIV를 사용하는 경우에는 PT에서 도메인 객체를 수정하면 DB에 update 쿼리가 날아가기까지 했었다. 하지만.. 아드리안 콜리어가 등장해서 Aspectj 한줄로 뷰단에서는 setter 호출 불가, DAO 호출 불가 정책을 만들어 적용할 수 있다는 사실을 전파하자. 요즘은 DTO 사용하자는 집단이 조용해짐. 그냥 도메인 객체를 여러곳에서 사용하는 것으로… 고고씽…

위의 내용은 토비의 스프링 9장에 잘 나와있기도 하다. 722페이지부터 읽어보면 될듯하다. 이미 책으로 써주셨는데, 채팅으로 저자 직강을 듣고나니 감회가 새롭다. 문제다. @_@;; 점점 바보가 되가나봐…

이런.. 또 오랜만에 부정행위를 저질렀다.

사실 얼마전까지 부정헹위을 저질렀다는 사실조차 거의 몰랐었는데, 다시 한 번 부정행위를 저지르게 되니 이번엔 좀 더 또렸하게 되새겨진다.

대학교 다닐 때 처음 들었던 자바 수업의 학점이 D+인가.. C+인가 그렇다. 난 못하지 않았다. 아니 오히려 잘했다에 매우 가까웠다. 난 이과가 아니다. 문과였고, 내가 졸업한 학부 역시 경상대 소속이었다. 따라서 내 주변 학우들은 프로그래밍언어를 배우는게 굉장히 난색을 표했었고, 난 이상하게 이과 성향이 강한 문과생이었기 때문에 잘 적응할 수 있었다. 경영통계수학, 경영학원론, 경제학개론, 정보관리시스템 등의 수업 보다는 훨씬 재밌었고 마치 오아시스 같은 전공 수업이었다.

당연히 난 열심히 했다. 또 이 수업의 장점은 한창 술 마시고 놀 시기에, 날 놀 수 있게 해줬다. 교수님은 학부 수업 시간 마다 10분짜리 쪽지 시험을 봤었는데, 그 시험만 보면 나가 놀아도 된다고 했었다. 그래서 정말 난 그 시험만 보고 맨날 나가 놀고 공부는 술마시고 나서 했었다. 공부한걸로 시험보고 또 나가서 술마시고 놀았다. 얼마나 좋은 수업인가!!

중간고사와 기말고사는 엄청나게 빡쌨다. 도무지 3시간 동안 풀수 없는 분량의 문제를 내놓고 풀라고 시켰다. 대부분의 학우들은 1, 2시간동안 풀다가 포기하고 나가기 일쑤다. 3시간이 마치 타임머신이라도 된 듯 순식간에 지나가고 미뤄뒀던 문제에 매달리며 신경을 곤두세우다가 시험이 끝나곤 했다.

대충 70~80점을 받았다. 하지만 이 성적이 해당 클래스에서는 탑5안에 드는 성정이었다. 다시 말하지만 자랑질이 아니다. 문과생들과 겨룬것이기 때문에 전혀 자랑할께 아니다. 고등학교때까지만 해도 물론 나도 문과생이긴 하지만 국어책 보다는 수학책을 더 좋아했었다. 근데 수2는 도무지 @_@.. 암튼.

그래서 난 당연히 A+를 받아야 했지만, 나는 부정행위을 저지르고 말았다. 그래, 이 이야기가 시작된 이유도 바로 ‘부정행위’ 떄문이다.

친구 숙제를 도와줬었다. 그런데 그 교수님은 정말 눈썰미가 뛰어났던데다가 cheating에 매우 예민한 교수님이었다. 나의 코딩 수준과 은폐 실력은 많이 모잘랐다. 당연히 걸렸다.

두 명을 도와줬다. 세명이 불려갔다. 나는 A+을 포기하고 D+인지 C+을 받았다. 변명하고 싶지도 않았고 변명한다고 달라질것 같지도 않았다. 인정하고 받아들였다. 나머지 두 친구는 F를 받아야 할 처지에 놓였다. 한 명은 그 상황에서도 타협을 해, D+를 받아냈다. 다른 한 명은 울음을 터트렸지만 달라진건 없었다. 그런데 나중에 들어보니 D+를 받았댄다. 뭔 상관인가~ ㅋㅋ

후아.. 그런데 웃긴건, 1학년 때 처음 들었던 컴퓨터 입문인지 머시기 교양 수업에서도 비슷하게 친구들 숙제를 도와줬었다가 부정행위로 걸린적이 있는데, 그때 그 수업도 그 교수님의 수업이었다.

암튼 그 뒤로 그 교수님과 재미나게 얽혀서 잘 지내다가 뒤끝이 매우 안좋게 끝나버렸다. 암튼 그건 다른 이야기고, 오랜만에 부정행위를 저지르고나니.. 나의 고질병이 아닌가 싶기도하다.

내 주변인은 나의 이런 특성을 이용하지 말았으면 좋겠다. 내가 나서서 도와주겠다고 하더라도.. 이렇게 말을 했으면 좋겠다.

“지금 나 무시하냐. 죽이되든 밥이되든 내가 알아서 할 수 있다!”

이렇게… 간지나게 말이다. 그럼 미안해서 내가 밥이라도 살텐데 말이다.

ps: 목숨이 걸린일도 아니고 그깟 학점따위 가지고 양심을 좀먹는 행위를 했다는게 부끄럽다. 지금도 부끄럽다. 미안하다 기선아. 앞으론… 흠…


번역료 측정이 잘못됐다.

번역 이야기를 하다보니 이전부터 생각해둔게 있어 글을 분리해서 적어 볼까 한다. 내가 번역을 하고 있다고 하면 사람들이 가장 먼저 물어보는게 바로 “얼마나 받는가?”라는 질문이다.

출판사와 계약서를 쓸 때 이 부분에 대해서는 항상 비밀로 한다. 외부에 공개하면 안된단다. 그런데 막상 새로운 역자를 꼬시거나 역자들과 이야기 하다보면 자연스래 어느정도 되는지 이야기하게 된다. 그렇다고해서 그게 무슨 문제가 되는지는 모르겠다.

공사장에서 노가다를 할 때 이틀에 7만원을 받았었다. 주말 토,일을 공사장에가서 벽돌을 나르고 시멘트를 나르고 청소를 하면 점심때 밥을 준다. 밥은 공짜다. 먼지가 많아 힘들지만 나름 체력도 단련되고 돈의 소중함을 느낄수 있는 일자리다.

이렇게 적는다고 해서 뭐가 달라지는가…

번역을 하면 장당 계약을 할 수도 있고 인세 계약을 할 수도 있는데 보통 장단 계약을 한다. 모바일 계열 책이 아니면 잘 팔리지 않는 요즘 한국 IT 출판 업계를 생각하면 그게 어쩜 번역자에게 더 유리할 수도 있다. 장당 얼마인지는 말하지 않겠지만 평범한 개발자가 버는 돈을 시간단위로 환산한 금액에는 턱없이 모자를 것이다. 그렇다고 적은 돈도 아니고 어찌보면 딱 적당할 수도 있다. 대신 번역이 끝나고 책이 나오는 순간에 해냈다는 성취감을 맛볼 수 있으며 끈기를 기를 수 있다. 또 해당 책을 진득하게 볼 수 있으니 아주 ‘잘’까지는 아니어도 ‘대충’이나마 해당 주제에 대한 지식을 습득할 수 있다.

어쨋든 번역은 돈만 보고 하기에는 무리가 있다. 다른 업계는 어떤지 모르겠지만 IT 서적 번역 중에 내가 경험한 번역료 측정 방법은 세가지다.

  • 1. 건당
  • 2. 원문 장당
  • 3. 번역문 장당

1. 건당

이코인을 받을 때 대충 건당으로 받은 것 같다. 물론 페이지 수가 많으면 이코인을 많이 받고 페이지 수가 적으면 조금 받았지만 그 기준이 애매했다. 원문 PDF 파일 같은게 아니라 단순 웹 페이지라 ‘장’을 계산하기 애매한 경우가 있어서 아마도 번역한 원고를 기준으로 세페이지 이내면 얼마 넘으면 얼마 또한 대여섯 페이지 넘으면 얼마.. 이런식으로 측정했던 것 같다. 어차피 받는돈이 이코인이었지마나 나름 쏠쏠했다. 몇건만 하면 책 몇권은 쉽게 살 수 있었다.(캬캬캬 도무지 얼만지 상상이 안되게 적었지만.. 괜찮단 얘기다.)

2. 원서 원고 장당

현재 출판사에서는 이 방법을 가장 많이 사용하고 있다. 원서 페이지당 얼마를 준다. 그 페이지에 글자수가 얼마나 있든 상관없다. 난 이게 불만이다. 내가 번역했던 하이버네이트 책의 1장은 글자만 있다. 그림이나 코드가 한 줄도 없다. 엄청나게 힘들다. 코드가 많이 들어있는 장에 비하면 번역랴이 두배에 달할지도 모른다. 또 글자만 있는 장은 보통 난이도가 높다. 코드는 대충 눈대중으로 보면 어떤 내용일지 상상이 되니까 쉽다. 근데 말이 많으면 어렵다. 난 그때부터 이런 측정 방법이 바꼈으면 좋겠다는 생각을 했다.

3. 번역 원고 장당

대학교때 잠시 매우 페이가 좋은 번역을 할 수 있었다. 예산이 풍부한 곳에서 진행한 번역이었는데 번역료 계산 방법이 독특했는데 지금 생각해보면 가장 이상적이었다. 내가 번역한 것을 원고지 형태로 변환해 원고지 장단 번역료를 지급해줬다. 워드에서 한페이지를 원고지 보기로 변환해보면 대충 A4 한장 꽉차게 번역한 내용이 원고지로 3~4장 정도 나온다는 걸 알 수 있다. 그런데 장단 번역료가 2번 방법의 번역료와 비슷하거나 많았다. 이정도면 번역만 해도 먹고 살만하겠구나 싶었지만 지금은 그 일이 없어졌다. ‘돈’이 되서 그런지.. 다른 업체에 일을 맡긴것인지 예산이 없어 자체 해결하는지 모르겠지만 언제든지 요청이 오면 다시 하고픈 알바다.

이 글을 읽다보면 혼란스러울 수 있다. 돈 때문에 번역하는게 아니라면서 왜이렇게 번역료에 집착하냐고?

난 돈 때문에 번역하는게 아니라고는 했지만 그렇다고 그릇된 가치평가를 받으면서 일을 하고 싶지는 않다. 번역료가 짜도 상관없다. 어차피 대동소이한 번역료이고 내가 번역하는 목적은 뿌듯함, 끈기, 성취함, 학습이 주요 목적이다. 그렇다고 원치않는 일(용어 고민, 감수, 일정압박, 번역이 개판이라고 욕먹기)이 따르는 번역을 하면서 페이를 안받을 순 없지 않은가. 페이는 적든 많든 받아야된다. 그런데 되도록이면 올바른 측정 방법이면 좋겠다.

내가 원하는 측정 방법은 3번이다. 2번의 문제점은 너무 분명하다. 그림과 코드가 많은 책은 번역하기 쉽다. 말이 많은 책은 번역하기 어렵다. 그런데 장당 받는 돈은 똑같다. 비합리적이지 않은가. 공동번역으로 가면 문제는 더 복잡하다. 누군 그림과 코드가 많은 곳을 번역하고 누군 말이 많은 곳을 번역한다. 번역량을 조절하면 되지만 페이가 달라진다. 거의 절반의 돈을 받고 일하는 거나 마찬가지다.

그러니 번역료는 번역한 원고를 기준으로 책정하는게 맞다고 생각한다. 그래야 역자가 번역하기 쉬운 책을 골라 번역하는 현상도 줄일 수 있고 말이 많은 책이어도 좋은 책이라면 번역할 용기를 낼 수 있지 않을까 싶다.

그밖에도 원고료 측정에 고려해야 할 요소들이 몇가지 더 있는것 같다. 번역자의 실력, 경험에 대한 가치를 고려해야 한다. 누군 감수하는데 한시간이면 충분할 정도로 번역하고 누구는 대여섯시간의 감수가 필요한 수준으로 번역을 해도 같은 페이를 받는다면 어찌될까. 지금은 어떻게 되고 있는걸까? 다른 역자들이 얼마나 받는지 몰라서 난 모르겠다. 내가 허접하고 발전이 없으니 게속 같은 돈이겠거니 생각하는게 속 편할지도..?

역자가 얼마나 마감일을 잘 지키느냐 역시 중요한 포인트다. 하지만 고려하는지 어쩌는지 모르겠다. 역자의 편의를 많이 봐주고 있는 것 같긴한데… 뭐.. 기일이 별로 중요하지 않을 수도 있으니.. 흠.

역자의 역할도 중요하다. 역자에게 감수까지 맡길 계획이라면 페이를 더 줘야 하는것 아닐까? 근데, 과연 감수까지 할 수 있는 역자가 얼마나 될까. 그정도는 출판사에서 외주를 주던, 자체 감수자를 키워서 해결해야 하지 않을까.

어쨋든 생각해보면 올바른 가치평가를 위해 고민해야 할 것들이 제법인데 한국 IT 출판 업계와 역자들은 참 착하다. “원고 장당 얼마”라는 단순한 원칙을 계속해서 유지하고 있다니…

맘에 안들지만 그렇다고 안할 순 없다. 소일거리로 번역만큼 재밌고 유익한 일을 아직 못찾았기 때문이다. 그래서 난 그냥 이 시스템을 최대한 활용할까 한다.  IT 출판 업계가 2번을 고집하는한 나는 앞으로 번역하기 쉬운책만 골라서 번역할 생각이다. 근데;; IT 서적은 대게 번역하기 쉬운책들이 많다. ㅋㅋㅋ 비겁하다고 비난해도 좋지만 책 한 권이라도 번역한 다음에 비난해 달라!!

ps: 참.. 혹시 번역하고 싶으신 분들은 각 IT 서적 출판사에 직접 연락하셔도 되는데,, 그게 좀 왠지 어렵다고 느껴지시는 분들은 저한테 간단하게 번역한 문서를 첨부해서 메일로 보내주시면 제가 아는 출판사(위키북스, 에이콘, 한빛) 쪽으로 소개시켜 드릴께요. 언제든지 도전하세요.ㅋㅋ 특히 대딩들.. 괜히 신입생때부터 면접준비 같은거 하지마시고.. 그 시간에 번역하면서 수양이나 하세요.

[번역] 띄어쓰기

  • 여러가지 -> 여러 가지
  • 받아들일테지만 -> 받아들일 테지만
  • 불러 일으킬 -> 블러일으킬
  • 한가지 -> 한 가지
  • 것들 보다 -> 것들보다 (조사는 붙여 쓴다.)
  • 갱신하는데 -> 갱신하는 데 (~하는 데는 띄어 쓴다.)
  • 새로고침 -> 새로 고침
  • 일반화 되어가고 -> 일반화되어가고 (~되다는 붙여 쓴다.)
  • 들어있는 -> 들어 있는 (합성어 아님)
  • 상호 작용 -> 상호작용 (~작용은 합성어)
  • 치우쳐있다 -> 치우쳐 있다.
  • 패이지 라는 -> 페이지라는
  • 할당 받은 -> 할당받은
  • 사용자 마다 -> 사용자마다
  • 수백만명 -> 수백만 명 (단위는 띄어 쓴다.)
난 번역으로 먹고 살 수 없다. 한 시간에 한 장을 할까말까한 실력, 그나마도 교정이 많이 필요한 수준이다.
번역은 대학교 3학년 일때부터 꾸준히 해왔으니 개발 경력보다 오래됐고 스터디 경력과 비슷한 5년 정도인 것 같다. 물론 처음부터 책 번역을 할 생각은 없었고 취미 삼아 관심가는 주제의 글을 찾아 번역해서 이코인을 모아서 책을 샀다. 그때 모아둔 이코인으로 최근에도 공짜로 책을 산적이 있다. 한빛출판사에 오라일리 기사를 번역해주면 되는건데 요즘도 진행중인것 같다. 나같이 별로 돈이 없는 대딩들에겐 책을 살 수 있는 좋은 방법이니 시도해보면 좋겠다. 공부도하고 책도 생기니 얼마나 좋은가..
어쿠.. 광고하려던게 아닌데.. 어쨋든 핵심은 5년이나 번역을 하고 있는데 실력이 안는다는 것이다. 최근데 ‘번역의 탄생’을 읽었는데 정말 많은 도움을 받을 수 있는 책이다. 이 책을 읽고나서 번역한 문장들은 아주 조금 나아졌다는 생각이 들지만 그래도 이 책의 내용이 하두 많아서 그새 잊어버린게 많다. 언젠가 날 잡고 위키에 정리하거나 출력해서 심심할 때 보고 다니면 좋겠다.
게다가 제대로 된 교정을 받아 본적이 없다. 그나마 하이버네이트 책을 번역할 땐 대엽님이 검수 역할을 맡아 이것저것 손을 봐주셔서 조금 더 나은 번역 방법과 번역의 기초를 연마할 수 있었지만 대엽님이 전문 검수자도 아니고 공동 역자 중 한 명일 뿐이었는데 너무 많은 짐을 드리는 것 같았다.
그래서 이번에 번역할 땐 내가 받는 피드백을 하나 하나 잘 정리해 둘까한다. 분명히 또 잊어버리고 해매겠지만 내가 자주 고민하고 틀리는 어법이나 표현방법 중심으로 정리해두면 조금은 나아지지 않을까.