이동국님의 마이바티스 책이 나왔다.

http://www.yes24.com/24/Goods/8744450?Acode=101

국내 최초를 넘어 세계 최초 마이바티스 저서다. 와우…

내가 사용할 프레임워크를 선택할 자유가 있다면 나는 언제나 하이버네이트를 쓰기 때문에 아이바티스나 마이바티스는 잘 모른다. 그런데도 굳이 내 책에 아이바티스를 넣었던 이유는 한국에서는 아이바티스가 대세니깐 나같이 특이한 경우가 아닌 이상에야 하이버네이트를 접할 기회가 많지 않을꺼라는 판단에서였지만, 난 결국 하이버네이트도 넣고 말았다. 내 책인데 그정도는 내 맘대로 해야지.

게다가 아래와 같은 링크를 보면 에이콘 출판사의 마케팅이 부럽다.

http://www.yes24.com/24/Goods/8780194?Acode=101

어떻게 보면 내 책이야말로 전자정부 표준 프레임워크에 가장 가까운 책일꺼 같지만 뭐 이런 얘길 하고 싶었던건 아니니까 패스하고.

내 책에서 다루는 주제를 전문적으로 깊게 다룬 책들이다. 다 모으면 대충 3500p, 15만. 돈도 돈이지만 3500p를 언제보냐는거지… 그리고 저 책을 하나씩 보면 실제로 자바 웹 개발이 가능한가? 그렇치 않다. 스프링만 알면 스프링으로 웹 개발 할 수 있을 꺼 같지만, “스프링만 안다”는게 사실상 불가능하다. 스프링 MVC가 기반하고 있는 서블릿&JSP를 모르면 동작 원리를 이해할 수도 없고 각종 디자인패턴과 객체지향 원칙을 모르면 스프링이 왜 좋은지도 알 수 없다. 그뿐인가, 메이븐을 모르면 프로젝트 만들거나 빌드도 못할꺼고, 이클립스 모르면 그걸 가지고 편하고 빠르게 코딩하지도 못할꺼다. 더 욕심을 내서 Git이나 SVN 사용법을 모르면 협업을 못할꺼고, 이슈트래커나 위키를 쓸지 모르면 아무것도 기록하지 못하고 결국 기억력에 의존한 힘겨운 프로젝트가 될꺼다.

대신 내 책 230p를 1.4만에 보면 다 조금씩 모자라겠지만 당장 자바 웹 개발은 시작할 수 있다. 그렇게 시작부터하고 모자르는 부분은 해당 분야의 전문 서적을 참고하는 방식으로 공부하는게 어떻겠냐고 쓴거지만… 각종 오타와 악평으로 곤혹을 치르는 중이다.

이번 책에서 이클립스랑 메이븐을 다뤘으니까 이제 툴 관련 화면이나 사용법과 기초적인 프로젝트 생성 방법및 프레임워크 연동 방법을 빼고 다음 책에서는 조금 더 실무에 가까운 코드만 가지고 500p쯤 써볼까 싶다.

나한테 그럴만한 자극이나 동기나 여유가 생긴다면 말이지…

하아… 책쓰기는 멘탈 수련하기인가..

월요일 아침부터 기분이 상쾌하진 않지만 이젠 뭐 익숙해져서 그런지 크게 맘 상하지도 않는다. “인터넷에 흩어져있고 찾기 귀찮은 여러가지 내용을 잘 정리하는” 일은 뭐 쉬운일인가. 그것도 나름 가치있고 힘든 일이지. 물론 인터넷에 흩어져있는걸 짜집기해서 쓴 책도 아니고, 내가 각종 툴과 프레임워크에 입문자 일때 이런걸 알았다면 더 빨리 적응할 수 있었을텐데 싶은 내용을 쓴건데 그렇게 보이기도 하나보다.

그래도 별이 한개가 아니라 두개라니.. 참 다행이다. 만약 이 시점에서 별을 한개 받았다면 내 책은 평균 별이 세개가 아니라 두개가 됐을테니깐.. 책쓰기는 멘탈 수련이 아니라 멘탈 없애기가 아닌가 싶다. 나에게 자존심이나 자존감 따윈 없는거다. 별 두개도 감사한거다.

나에게 티끌만큼이라도 남아있는 멘탈이 있다면 탈탈 털어 가시옵소서….

내심(마음만으로) 차기작을 준비하고 있었지만… 그것까지 탈탈 털어 가주시옵소서…

내가 다시는 책 쓸 마음이 들지 않도록… 절대로 워드에 코드를 타이핑 하는 일이 없도록 도와주시옵소서…

[쉽게 따라하는 자바 웹 개발] 193페이지 수정합니다.

193페이지 코드가 엉망이었네요… 죄송합니다. 제 원래 원고에 있는 본문은 다음과 같습니다. 제가 최종 리뷰를 제대로 못했네요. 죄송합니다.

 

서비스에는 별다른 비즈니스 로직이 없기 때문에, 단순히 DAO로 위임합니다. MemberDao에도 listByName 이라는 기능이 없으니 MemberDao에 다음 코드를 추가합니다.

List<Member> listByName(String name);

마지막으로 MemberDaoHibernate에 listByName을 다음과 같이 하이버네이트 Criteria를 사용해서 구현할 수 있습니다.

@SuppressWarnings(“unchecked”)

public List<Member> listByName(String name) {

return getCriteria()

.add(Restrictions.like(“name”, name, MatchMode.ANYWHERE))

.list();

}

Restrictions.like() 메서드를 사용해서 구현했습니다.

[쉽게 따라하는 자바 웹 개발] 오탈자

updated 2013.03.29

– Dark-Ryu님 추가 제보 반영

– 훈님 제보 반영

============================

updated 2013.03.27

– Dark-Ryu님 제보 반영

p193 전문 수정

============================

updated 2013.02.20

– Dano님 제보 반영

============================

지금까지 발견한 오탈자입니다. 계속해서 재보해주시면 제가 이 글을 갱신하겠습니다.

같은 랩 동료 중에서 제 책을 참고하여 신입사원 교육을 준비하고 계신분께서 꼼꼼히 오탈자를 찾아주셨어요. 흑.. 어찌나 감사한지… +_+

혹시 오탈자 검수 필요하시면 제가 연결해드릴테니 관심있으신 출판 관계자분께선 연락주세요. 개발자라서 기술적인 내용도 검토가능하시고 국어도 잘하시고 꼼꼼하십니다.

그럼 오탈자 나갑니다.

p25: L4,L5,L6 의 디스크는 플로피 디스크 또는 디스켓으로 바꾸고 화면 1.28. 에 표시를 해주시는 것이 좋겠다.

p27 의 1.4.3. RESTful 웹 서비스, IE를 사용할 때는 json 파일이 다운로드 될 수 있다고 언급 추가하기. 브라우저마다 json 응답 처리 방식이 달라서 발생하는 문제임.

p46, “사실 이 네 가지 정보는 입력하지 설정하지 않아도 되는” -> 입력하지 빼기

p54, “그래서 전혀 자바 클래스 로더가 D1과 D2를 전혀 다른 라이브러리로” -> 앞에나온 전혀 빼기

p54, “또 다른 해결책으로는 한 쪽의 추이 의종성” -> 의존성

p56, “제외시키는 방법은 앞서 살펴봤s는데” -> s빼기

p56, “<optional>ture</optional>” -> true

p59, 코드 줄맞춤

p60, “JUnit 4.8.2만 사용할” -> 4.10

p61, “누구랑 충돌이 될지 볼 수 있어서” -> 서 빼기

p61, “어렵지 않은 편이었습니다. 더구나 메이븐이” -> 더구나 빼기

p65 l1, “디렉토리 밑에 target 이라는” -> 디렉토리 밑의

p65 l2, “소스 코드 컴파일을 한” -> 소스 코드를 컴파일 한

p65 l3, “테스트 코드 컴파일을 한” -> 테스트 코드를 컴파일 한

p71, “프로젝트 우클립” -> 우클릭

p73:L6,L13 hi…가 아니라 Hello Eclipse, Maven, Spring, iBatis and Hibernate

p90, 화면 3.14. 서블릿 클래스 만들기 -> 그림이 잘못되서 다른 그림으로 바꿔야겠습니다. 나중에 다시 찍어서 보내드릴께요.

p90 화면 3.14. 의 Name 항목의 값이 HelloServelt이라고 되어있음. HelloServlet으로 고쳐야 함 (위와 동일함)

p96, “스프링에서 제공하는 서블릿 DispatcherSerelt” -> DispatcherServlet

p101, “스프링이 제공하는 DispatcherSerlvlet” -> DispatcherServlet

p106, “3. DispatcherSerlvet는” -> DispatcherServlet

p112, 중간쯤에 “구돌될 때 실행할 SQL을 jdbd” -> jdbc

p116 코드 줄맞춤

p122 Line 2 InternalResolseViewResolver -> InternalResourceViewResolver

p123, “먼저 @RequetMapping에 문자열 대신” -> @RequestMapping

p123, “매개변수로 Member와 BinidingResult를” -> BindingResult

p123, “BindingResult는 Member 타입의 객체로 요청에 들어있는 값을 바인딩할 때” -> “BindingResult는 요청에 들어있는 값을 Member 타입의 객체로 바인딩할 때”

p124, “reulst.hasError()” -> “result.hasError()”

p125, “catch(Exception e)” -> “} catch(Exception e)” 닫기 괄호 누락

P126 L5 Aotomicity -> Atomicity

p130 L5 ‘member/toby’ -> ‘/member/toby’

P138~139 @SessionAttribute –> @SessionAttributes

p145, “불과 몇시간이 필요하지” -> “불과 몇시간 필요하지”

p146, “패키지를 만듭시다,” -> “패키지를 만듭니다.”

p153 “sample/ibatis/Member.xml” 에서 → “sandbox/..

p162 제공합니다. 이미 1장의 –> 이미 3장의

p166, “여기서 ‘lastpath’라는 접두어” -> ‘classpath’

P175 Relation Missmatch -> Relation Mismatch

p193, 코드 오탈자 수정(http://whiteship.me/?p=13705)

개선사항

JDK 버전 1.7을 사용하고 있을 때 프로젝트 import 시 문제 해결 방법 or JDK 1.6 설치 관련 내용 추가.

[쉽게 따라하는 자바 웹 개발] AS 1. 메이븐 관련 이슈 정리

(전체 화면에 720hd 화질 선택하시면 코드까지 잘 보이실 겁니다.)

첫번째 애프터 서비스로 프로젝트 import시 발생하는 메이븐 관련 이슈 원인과 그 해결책을 설명한 동영상을 올렸습니다.

먼저, 메이븐 의존성을 제대로 못가져오는 문제인데요. 이 문제로 두분이 봄싹 그룹스에 질문을 올려주셨습니다.

jkee님: https://groups.google.com/forum/?fromgroups=#!topic/springsprout/KMkA8iGUtkQ

chicken-hit님: https://groups.google.com/forum/?fromgroups=#!topic/springsprout/EmBvNPe3nUY

이 두분은 프로젝트를 import 하고나서 메이븐 프로젝트를 빌드하는 과정 중에 Update Maven Dependencies라는 과정이 있는데.. 그 때 필요한 의존성을 받아오다가.. 네트워크 상황이 안좋거나, 메이븐 중앙 저장소가 바쁘거나해서.. 필요로하는 의존성을 못가져온 경우입니다.

이때 의존성을 못가져오는 경우가 두가지가 있는데..

  • 완전히 jar 파일 자체를 못가져온 경우.
  • 또는 jar파일을 가져오다가 중간에 멈춘 경우.

첫 번째 경우라면 메이븐 의존성을 다시 업데이트 하도록 Maven -> Project Update(이전에는 Update Dependencies라는 메뉴가 있었는데 이걸로 대체되었나봅니다.)를 실행하면 받아오실 수 있는데요. 두번째 경우라면 그렇게 해도 다시 받아오지 않을수 있습니다. 따라서 그럴 떄는 로컬 메이븐 저장소(보통 유저 홈디렉토리/.m2/repository)에서 해당 의존성 디렉토리를 삭제하시고 다시 프로젝트 업데이트나 아에 프로젝트를 삭제하고 추가하면 메이븐 의존성을 제대로 받아올 수 있습니다만.. 백프로 확신을 못하는거죠. 그때 다시 받아올 때 또다시 네트워크 상황이 좋치 않거나, 메이븐 중앙 저장소가 바쁘면.. 같은 일이 재발할 수 있습니다.

그래서 최후의 수단으로는 로컬 메이븐 저장소에 직접 JAR 파일들을 경로에 맞춰서 넣어주시는건데요. 그건 방금 제 로컬 저장소를 압축한 repository.zip 파일을 받아서 여러분의 로컬 저장소에 덮어써 주시는 겁니다.

http://whiteship.me/book/repository.zip

이 파일을 받으셔서 여러분의 홈 디렉토리/.m2/repository에 복사해 넣으신 다음에 프로젝트 import를 다시 해보세요. 그럼 메이븐 관련 문제는 잘 해결될 겁니다.

신순웅님: https://groups.google.com/forum/?fromgroups=#!topic/springsprout/QrvoPfpE7pM

신숭웅님의 이슈는 처음에 제가 잘못보고 이것도 메이븐 의존성 관련 이슈인줄로 착각했습니다. 그런데 다시 로그를 보니까 이건 메이븐 의존성 문제가 아니라 메이븐 빌드를 실행할때 실행할 goal을 아무것도 적지 않았을 때 발생하는 로그였습니다.

그래서 이건 이슈가 아니라.. 지금 뭔가 빌드를 잘못실행하고 계신걸로 추정이되고요. 무얼 하셨을 때.. 제 책의 어느 부분을 따라하고 계실때 발생한 에러인지 조금 더 전후 상황 정보가 필요한 상황입니다.

어쨌든 지금 저 로그는 제가 방금 동영상에서도 설명드렸지만, 메이블 빌드를 아무런 goal없이 실행할 때 발생하는 로그로… 문제 상황은 아니고, 단순히 메이븐 빌드를 잘못 사용하고 계신걸로 추정됩니다.

부디 제 책을 읽고 계신분들이 무사히 제 책을 즈려밟고 올라서시기를 기원하며 그럼 이것으로 첫번째 애프터 서비스를 마치겠습니다.

제 책을 보시다가 궁금하시거나 개선하면 좋을 부분들은 계속해서 봄싹 그룹스에 의견을 남겨주시면 저 말고도 다른 분들의 의견이나 도움도 받으실 수 있으니까요. 어려워 마시고 편하게 글 남겨주세요.

감사합니다.