[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

2016년 2월 23일 화요일

[DB]ODBC Access Driver 사용시에 Inner Join에 대한 "쿼리식의 연산자가 없는 구문 오류입니다." 오류..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Access(.mdb)를 사용하기 위해서 ODBC로 등록해서 JDBC로 연결할 때 평소하던 것 처럼 쿼리문을 짰는데 오류가 떨어졌다. 쿼리상으로는 문제가 없는데 Access Driver가 해당 쿼리에 대해서 지원을 하지 않는 것으로 보였다.

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 'b.categoryid=a.categoryid INNER JOIN role AS c ON b.roleid=c.roleid' 쿼리식의 연산자가 없는 구문 오류입니다.

아래와 같은 쿼리이다.

SELECT a.title, b.sid, b.points, b.pattern, b.base, c.rolename
FROM itembank AS b
INNER JOIN category AS a
ON b.categoryid=a.categoryid
INNER JOIN role AS c
ON b.roleid=c.roleid
WHERE a.parent=?

INNER JOIN이 1개만 있을때는 오류가 없는데 INNER JOIN을 2번하면 오류가 나오는데 ODBC 드라이버가 그런건지 몰라도 FROM절에서 INNER JOIN을 제대로 인식하지 못하는 것 같다. 그래서 다음과 같이 괄호로 묶어 주어야 한다.

SELECT a.title, b.sid, b.points, b.pattern, b.base, c.rolename
FROM (itembank AS b
INNER JOIN category AS a
ON b.categoryid=a.categoryid)
INNER JOIN role AS c
ON b.roleid=c.roleid
WHERE a.parent=?

만약 INNER JOIN이 하나 더 붙으면 괄호를 또 감싸주어야 한다.

하튼 왜 디비를 MDB를 쓴다고 결정해놔서 이 고생을... ㅡ..ㅡ

[Tool]Subversion의 Attempted to lock an already-locked dir 에러 발생시..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

이클립스에서 서브버전(Subversion)연동해서 개발하다가 다음과 같은 에러가 발생했다.

사용자 삽입 이미지

org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locked dir이라는 SVNClientException이 발생했다. 그냥 잘 쓰고 있었는데 특정파일이 lock이 걸렸다고 커밋이 안되는 것이었다.  이건 업데이트등의 어떤 액션을 하다가 실패를 해서(정상적인 종료가 안되어서) lock이 걸려버린 것으로 추정한다.

사용자 삽입 이미지

서브버전(이클립스에서는 서브클립스)의 [Team]  - [Cleanup] 메뉴를 실행하고 다면 다시 커밋을 할 수 있다. Cleanup액션은 비정상적으로 SVN의 액션이 종료되었을 때 이것을 정리해 주는 명령어이다. 이렇게 하면 Revert한것처럼 수정된 파일도 커밋하기전의 원래 파일로 돌아온다.

[DEV]포트 넘버(Port Numbers) 정리..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

뻔하면서도 막상 필요할때 여기저기 찾아다니는거 귀찮아서 간단한 거지만 일단 정리...

  • FTP - 21
  • SSH - 22
  • Telnet - 23
  • SMTP - 25
  • Time - 37
  • DNS - 53
  • HTTP - 80
  • POP3 - 110
  • SFTP - 115
  • IRC - 194
  • HTTPS - 443

0 ~ 1023 포트는 잘 알려진 포트(Well Known Ports)이고 1024 ~ 49151 포트는 등록된 포트(Registered Ports) 49152 ~ 65535 포트는 동적/개인적 포트(Dynamic and/or Private Ports)로 나뉘어 진다.

포트넘버에 대한 정확한 리스트는 Internet Assigned Numbers Authority에서....

My Comment..
햄의 이런 글을 보자면, 티끌모아 태산이라는 속담이 딱 맞는듯..
보통.. 나를 포함한 대부분의 사람들은.. 인터넷에서 쉽게 구하는 것들에 대해서는..
"그냥 찾아보면 되지 머.." 라고 생각을 하지.. 지금처럼 정리를 할 생각은 안하니까..
소소한것도 의심하고, 정리하고, 짚고 넘어가는게.. 좋은 자세인 듯..
오늘도 하나 배운다..

[Book] Professional 소프트웨어 개발..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Professional 소프트웨어 개발 - 4점
스티브 맥코넬 지음, 윤준호 외 옮김/인사이트


이 책은 "Code Complete"로 유명한 스티브 맥코넬이 지은 책이고 특정기술이 아닌 소프트웨어 개발에 대한 얘기를 한 책이다. 어떻게 보면 방법론적인 부분과도 관련이 있다고 해야할까.... 기술적인 것들도 중요하지만 나는 이런 부분도 관심이 많기 때문에 좀 편히 읽어보고자 집어 들었다.

스티브 맥코넬은 국내에서도 컴퓨터학과에 한 과목씩 있는 소프트웨어공학이라는 측면으로 개발이라는 업무에 접근하고 있다. 결론부터 말하면 단순히 컴퓨터학이 아니라 소프트웨어공학이라는 측면으로 접근해야 한다는 것이다. 건축,토목등에 공학사나 기술사들이 있는 것처럼 IT도 그런 체계적인 것이 있어야 하고 그것을 위해서 소프트웨어 공학이 필요하다고 얘기하고 있다.

현재의 대부분의 조직들은 소위 말하는 "일단 작성하고 고쳐보는 개발(code and fix development)" 즉 설계나 계획없이 일단 짜고보는 방법을 취하고 있고 이것은 장기적으로 보았을 때 훨씬 비효율적인 방법이고 이 방법을 취하는데 딱히 훈련이 필요하지 않기 때문에 취하지만 이런 시도는 비용과 일정을 늘리기만 한다.

일반적으로 개발은 프로세스 기반과 책임기반이 있는데 프로세스 기반은 잘 정의된 프로세스와 효율적인 시스템을 통해서 좋은 결과를 만들어 내는 것이고 책임기반은 한명의 실력있는 인재에게 프로젝트의 관리자를 맡기고 전권을 줌으로써 동기부여를 시켜서 프로젝트를 성공적으로 이끄는 것이다. 이 두가지는 좋은 방법이지만 많은 조직들은 프로세스 사칭조직의 형태를 띄어서 프로세스 형태를 그 본질보다 훨씬 중요하게 생각해서 오히려 개발자들이 일을 즐기지 못하게 만들거나 책임사칭 조직의 형태를 띄워서 책임조직의 동기부여에 따른 긴 근무시간을 혼동하여 개발자들에게 긴 근무시간을 강요하게 되어버린다.

이제 소프트웨어 개발이 공학이어야 하는 이유는 과학은 이론을 연구하는 것이고 공학은 과학의 이론을 현실에 적용하는 것을 연구하는 사람인데 우리 개발자들은 공학에 더 가깝다는 것이다. 그렇기 때문에 과학적인 접근만으로는 현실에서 한계가 생긴다는 것이다. 그래서 공학적인 접근이 필요하고 이 공학을 연구한 사람한테 자격증 혹은 면허를 줌으로써 점점 체계적인 시스템을 갖춰 나갈수 있다는 것이다.

내가 느끼기엔 위의 한 얘기가 결국 이 책에서 스티브 맥코넬이 얘기하고자 하는 바이고 개발자의 성향분석이나 여러가지 수치적 데이터, 여러가지 방법론등을 통해서 얘기하고자 하는 바를 뒷받침하고 있기는 한데 그런 부분에 대한 사전지식이 없어서인지 뒷받침자료로 제시하고 있는 그래프나 수치적 데이터가 오히려 말하고자 하는 논지를 산만하게 느껴지게 만드는것 같고 이론과 실무에 대해서 얘기하고자 한거지만 오히려 이책 자체가 실무와는 좀 동떨어진 이론적 얘기를 하는 것 같은 인상이다.

좋은 말이기는 한데 특별한 건 없다고 할까나?

어쨌든 이 책에서 인상깊었던 몇가지 글들

"같은 방식으로 일하기를 반복하면서, 다른 결과를 바랄 수는 없다."


우리는 능력이라는 것이 경험과 지식을 조합한 것이라는 걸 알게 되었다. 지식이 경험에서 우러나온 것이 아니라면 정말 최신의 지식을 소유한 것이라 말할 수 없고, 마찬가지로 최신 지식을 알고 있지 않다면, 좋은 경험을 쌓는 다는 것은 결국 불가능하다. 개인의 지식과 경험 레벨이 서로 일치하지 않는다면, 개인의 최종 능력은 일반적으로 경험과 지식 중 더 낮은 쪽에 가까워 진다.

더블어 IEEE에서 제정한 소프트웨어공학 윤리강령과 업무 규범이란 것도 있다는 걸 알았다. 취지는 참 좋은데 현실에선.. 흠...


[DB]이클립스에서 DBEdit로 Access(.mdb) 연결하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

자바에서 DB를 Access(.mdb)로 작업을 하다보니까 쿼리브라우저 같은게 필요했다. 오라클작업할 때는 오렌지나 토드등이 있고 MS-SQL쓰면 쿼리브라우저가 제공이 되는데 Access를 쓰니까 쿼리테스트를 할 수가 없었다.(내가 못찾는건지 모르겠지만.... ㅡ..ㅡ) 자바 소스에서 쿼리를 날릴수는 있지만 간단한 쿼리는 그냥 작성한다고 하지만 좀 복잡해 지면 쿼리가 맞는지 테스트 해볼 수 있어야 한다.

그래서 이클립스에서 디비를 연결하는 플러그인중하나인 DBEdit를 사용했다. 어차피 JDBC로 연결하기 때문에 꼭 DBEdit가 아니어도 상관이 없을 듯 하다. DBEdit는 이 곳에서 다운받을 수 있다.(설치에 관해서는 굳이 언급하지 않겠다.)

DBEdit

DBEdit 퍼스펙티브에서 MDB를 연결하기 위해서 새로운 Connection을 만든다.

저번에 포스팅한 JDBC-ODBC를 이용한 MDB연결에서는 ODBC등록을 통해서 JDBC연결을 했는데 여기서는 JDBC 드라이버 파일을 등록하지 않으면 연결 할 수가 없었다. 그래서 여기서는 ODBC를 사용하지 않고 일반적인 JDBC연결을 사용한다. 여기서 사용한 것은 StelsMDB 1.0이다. StelsMDB는 MDB용 JDBC드라이버인데 상용드라이버이다.



그래서 구입하지 않은  Trial버전에서는 한번에 50건의 쿼리만 실행할 수 있고 Select쿼리는 첫 1,000건만 가져올 수 있는데 쿼리테스트 용도로는 크게 문제가 안된다고 생각한다.

StelsMDB 파일

압축을 풀면 위와같은 폴더가 나오는데 examples는 StelsMBC를 사용하는 예제 코드가 들어 있고 mdbdriver에 JDBC용 jar파일들이 들어 있다. 여기서는이 jar파일들을 사용할 것이다.

DBEdit Connection Configuration : Common

 다시 DBEdit의 커넥션 생성으로 돌아와서 JDBC연결을 위한 설정을 해준다.

JDBC Driver - jstels.jdbc.mdb.MDBDriver
Server URL - jdbc:jstels:mdb:D:\test\Database.mdb
User와 Password의 경우는 필요한 대로 입력해 주면 된다.

DBEdit Connection Configuration : Classpath

Classpath탭으로 가서 Add Archive로 아래의 StelsMDB가 제공하는 jar파일 4개를 추가해 준다.

StelsMDB JDBC jar

이렇게 추가하고 연결을 하면 MDB연결이 완료된다.

연결된 MDB

Tables 뷰에서 디비구조를 볼수가 있고 해당 테이블을 더블클릭하면 테이블의 내용을 볼 수 있다.

Instant SQL 테스트

그리고 우리가 바라는 쿼리테스트는 Instant SQL에서 쿼리를 테스트해볼 수 있고 결과값도 잘 나온다.


덧) Trial버전은 한번에 50건을 다 사용하면 이클립스 한번 껐다 켜주면 된다.
그리고 확실히 프로젝트에서 사용할때는(실제로는 ODBC쓰고 쿼리테스트만 stels mdb를 사용하니까 드라이버가 달라서 복잡한 코드에서는 따로 돌아간다. 서로 지원하는 양식이 좀 달라서..... 그리고 확실히 지원안되는게 많다. 쿼리가 좀 복잡해 지면 stels mdb에서 지원안된다고 나오는것들이 있다. 분명히 맞는데 안된단다. 이런점 참고하고 써야지 싶다.

[Talk][캠페인] 개발자 좀 살려주세요! (Save The Developer!)..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

예전에 조현진님Save The Devleoper라는 해외 캠페인을 한글로 번역해서 하는 것을 보고 그 취지가 공감이 되서 나도 달아야지 하고는 링크만 적어두고는 그냥 방치만 하고 있다가 어제 alankang님의 블로그에 갔다가 이 캠페인을 하시는 걸 보고 나도 바로 달았다.

전에는 배너정도랑만 한글화 되었었던것 같은데 그 뒤로 여러사람이 참여하면서 페이지도 따로 만들어지고 배너랑 취지에 대한 설명도 많이 추가가 되고 캠페인이 제법 그럴싸해 졌다.


캠페인 - 개발자 좀 살려주세요 제발!
 

Save The Developer!라는 이 캠페인
은 W3C 표준을 지원하지 않은 Internet Explorer 6을 표준지원 브라우저로 업그래이드 하기를 권장하는 캠페인이다.

이 캠페인은 Internet Explorer 6 사용자가 브라우저를 업그레이드하도록 권장하는 것에 그 목적이 있습니다. Internet Explorer 6은 이미 시대에 뒤떨어졌고, 이 브라우저의 존재 때문에 많은 웹 사이트 개발자들이 보다 복잡힌 환경을 고려하여 웹 사이트를 제작해야 합니다. 이로 인해 개발자들은 과중한 업무와 스트레스에 시달리고 있습니다.
새로운 브라우저들이 여러분의 웹 서핑을 보다 즐겁게 만들어 드릴 것입니다.
사람 하나 살리는 셈 치고, 브라우저를 업그레이드 해주세요!
 
웹사이트 개발을 하다보면 위 5가지 브라우저에서는 다 잘 나오는데 유일하게 IE6에서만 레이아웃이 보지도 못하게 깨져버리는 것을 많이 경험하게 되고 별수 없이 IE6을 위한 Hack을 넣거나 추가적인 작업을 많이 해야하는 경험을 하게 된다. 다 만들어놓고 이 작업은 꽤나 피곤한 일이다. 이걸 번역하신 분도 그렇고 alankang님도 말씀하시는 것처럼 이 캠페인은 사용자에게 얻어지는 장점에 대해서는 크게 부각되어 있지 않다.

하지만 IE6을 버리는 일은 웹의 발전을 위해서도 아주 중요한 일이라고 생각한다. 서로 협조해서 좀 더 편해지자는 정도? IE6이 없어진다면 개발자들의 공수는 훨씬 줄어들 수 있을 것이고 장래적으로 생각하면 이 공수를 다른 곳에 들여서 더 많고 좋을 것을 만들 수 있을지도 모르는 것이도 IE6이 발목을 잡아서 뭔가 새로운 것을 하기 어려운 문제도 없어질 것이다.

어떤 프로그램을 쓰느냐는 각자의 선택이긴 하지만 표준외에도 IE7이 IE6보다 좋지 않다는 것은 크게 공감할 수 없다. IE6보다 느리다는 것도 그렇고 탭브라우저의 편리함은 사용해 보면 비교할 수 조차 없다. 그럼에도 IE6이 훨씬 편하다는 사람도 많지만... 그래서 캠페인이 약간은 비굴모드로 하는 것이 아닌가 생각한다. 약간은 유머러스하면서도 브라우저 업글해서 우리좀 살려달라는 것이다... 제발.. ㅠ..ㅠ

이건 파이어폭스 좋으니까 파폭 써라고 하거나 구글이 짱이야 하는 특정벤더에 얽매이는 편협한 캠페인이 아니다. 이렇게 다양한 선택권이 있고 다른 것들을 잘 모르는 사람들한테는 IE7이라는 대안도 있으니 웹의 발전을 위해서 웹브라우저를 업그래이드해 달라고 하는 것이다. 나쁜 것을 권하는 것도 하는 것이 아니니 서로 윈-윈하는 방법을 좀 취해달라는 것이다. (IE가 강제 업글을 해주면 참 좋은데... ㅎ)

IE6 업글 좀 해주세요.. 굽신굽신..


My Comment..
흠.. 이 글은 어차피 시간도 오래 지난 글이기도 하고.. 지금 상황에서는..
좀 안맞긴하지만, 핵심은 같은듯 하다.. 업그레이드.. 글구 좀..
획일화.. 표준화..??.. 되었으면 좋겠다.. 2008년 글인데.. 그 때쯤에.. 나도..
생각을 했다.. 개발에 대한 퍼포먼스 머 이런거 말구.. 걍 단순한..
파폭이다.. 오페라다.. 크롬이다.. IE에 대한 버전별에 대한 중구난방..
지대로 짜증.. 가뜩이나 개발 못할 때였는데.. [지금도 못하긴하지만.. ㅠㅜ]
브라우저가 여러개니.. 아오.. 완전 미췬;; 더욱이 그 때는..
모든 사업 자체가 공기업 프로젝트였는데.. 공기업 특성상.. 버전을 업글도 안하고..
한글 2002나 오피스 2007이 나왔을 시점에도.. 여전히 97과 2003 을 쓰던..
분들이었으니.. 환장할 노릇.. 무튼 머 그런 단순한 생각으로 짜증도 나고..
좀 정책적으로 어떤 틀이 마련 되었으면 하던 시절.. ㅋㅋㅋ.. 햄 글을 보다보니..
추억이 떠오르능구나.. [추억만 떠오름 안되는데.. ㅡㅡ..]



[Book] Head First Servlets & JSP - 상상력을 자극하는 몰입의 학습법..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Head First Servlets & JSP - 10점
케이시 시에라 외 지음, 김종호 옮김/한빛미디어


개발서적중에는 많은 시리즈가 있는데 Head First는 그 독특한 구성과 함께 꽤 인기있는 시리즈에 속한다. 사실 난 헤드퍼스트 시리즈는 처음 봤다. 학교 교재로 헤드퍼스트 디자인패턴을 사용했던 적이 있지만 사실 별로 보지는 않았었다. 자바를 좀 마구잡이로 쓰다가 이제 방향도 좀 잡히고 초급을 넘어서기 위한 지식습득의 방향이 잡혔기 때문에 서블릿을 제대로 익히기 위해서 골랐다. 서블릿 책중에 이책을 가장 많이 추천들 하길래.... 서블릿은 진작부터 했어야 했는데...

먼저 헤드퍼스트책으로 얘기하자면 기술서적이라는 특성상 딱딱할 수 밖에 없는 한계를 가볍게 깨뜨린 구성으로 대화형식을 많이 사용한다. 간단히 예를 들자면 A란걸 설명한 뒤에 여자나 남자가 나와서 "근데 이렇게 하면 이렇지 않나요?"하면 "그렇죠. 그래서 B가 있습니다!!!" 하는 식이다. 때때로 중원고수니 어쩌느니 하면서 약간은 썰렁한 농담도 등장한다. 이런 특싱이 Head First라는 특색있는 시리즈의 성공에 꽤 큰 역할을 했다. 개발서적은 항상 무겁고 어려운 얘기를 딱딱하게 다루어 왔기 때문에(사실 그런 얘기만 해도 책이 1,000p가 넘어가는 책이 허다하니까...) 읽는 사람으로써는 갈수록 이해하기가 어려워져서 다 읽지 못하고 책을 덮게 되는 경우가 많은데 헤드퍼스트의 대화체는 내용을 방해하지 않으면서도 책을 약간은 가볍게 접근할 수 있게 도와주는 듯 하다.(내용이 가벼운건 절대 아니다.)

제목이 서블릿&JSP이지만 이 책은 서블릿에 중점을 둔 책은 아니다. 책의 초반부에도 나오듯이 이 책은 Sun Microsystems의 인증시험인 자바 웹개발 인증인 J2EE 14. SCWCD라는 시험을 겨냥해서 만든 책이다. 수험서처럼 이 책으로 공부해서 SCWCD를 딸 수 있게 하는 것이 이책의 목표이다. 시험얘기가 많이 나오지는 않지만 SCWCD를 따로 준비하고 있지 않은 사람들도 자바 웹개발에 대한 개념과 기술을 이해하는데 이 책은 제법 괜찮다.(솔직히 셤이라는게 사람들이 덤프를 봐서 그렇지 제출의도만을 봤을때는 핵심을 아는지를 묻고자 하는 것이기 때문에....) 단순히 서블릿뿐만 아니라(책 제목에 써 있어서 그런지 몰라도 난 왜 이책을 서블릿 관련 책 정도로만 생각하고 있었는지 모르겠다.)

자바 웹개발에 대한 모든 것을 다룬다. 기본이라고 할 수 있는 서블릿과 JSP를 통해서 어떻게 돌아가는지 MVC는 무엇인지 그리고 웹어플리케이션과 컨테이너가 어떤식으로 구동되고 관리되는지 얘기해준다. 시험을 위해서 때문인지 보통 다른 책에서는 얘기하지 않는 보이지 않는 컨테이너쪽 뒷단의 동작방식까지도 많이 짚어주고 있고 단순 기술 뿐만 아니라 전체 그림을 설명해주려는 것이 많이 느껴졌다. JSP다음의 당연한 수순대로 EL과 JSTL, 배포, 보안, 필터, 디자인 패턴까지 말그대로 모든 것을 다 다루고 있다. 자바쪽 책을 많이 본것은 아니지만 다른 곳에는 나와있지도 않았던 많은 설명들이 이 책에서는 아주 자세하게 잘 나와있기 때문에 개인적으로 자바 웹개발에 거의 필수 책이나 다름 없다고 생각한다. 물론 아예 모르는 상태에서는 좀 어려울지도 모르겠다.

그리고 헤드퍼스트 특유의 구성에 따라 순서가 잘 잡혀있는 느낌이다 한가지를 설명하고 이어서 그것의 문제나 예외사항을 언급하고 그걸 해결할 수 있는 기술에 대해서 설명해주기 때문에 개념의 이해를 순서대로 이해하기에 아주 좋다.

마지막으로 이건 개인적인 취향인데 이책은 수험서(?)를 목표로 했기 때문에 계속 해서 반복학습의 효과를 노린다. 책후기를 쓸때마다 난 레퍼런스적인 책을 좋아한다고 많이 얘기했었는데 그 때문에 나는 나중에 다시 찾아보기 위해서 책을 읽으면서 줄을 긋고 표시하는 습관이 들었는데 이 책의 독특한 구성때문에 그게 쉽지 않다. 어떤 개념을 설명해줘서 내가 줄을 치고 조금 더 읽으면 살짝 살 붙혀서 또 설명하고 또 살붙혀서 또 나오고 하는 반복이 계속 된다. 그러다 보면 의도와 다르게 비슷한 내용이 중복되서 줄을 긋게 되는 안타까움이.... 내용만으로 봤을때는 최고라고 생각한다.

My Comment..
이 책도 아마.. 햄때문에 보게 된 책인거로 기억한다.. 근데.. 그 때도 여전히..
개념이 없던 상태라서.. 애들이 당췌 먼소리를 하는건가 했었다..
그래서 어느정도 보가다 중도 포기했던 듯한.. 근데 햄의 포스팅을 보면..
JSTL 태그도 나왔었구나.. 지금 봤다면, "아.. 그래 이거야.. 이렇게 썼지.." 했을지도..
역시 명언.. 아는만큼 보이는거야..

[JAVA]Tomcat 5.5에서 Root의 index페이지 바꾸기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Tomcat이 버전 5.5대에서는(같을거라고 생각하지만 5.0은 사용을 안해봐서...) 톰캣을 설치하면 해당 주소로 접근하면 디폴트로 아래와 같은 페이지가 나타난다.

Tomcat

많이 본 화면일 것이다. 근데 이 페이지가 버전 4.x대처럼 jsp로 되어 있는 것이 아니라 서블릿 형태로 되어 있기 때문에 쉽게 변경되지가 않는다.

톰캣설치폴더\webapps\ROOT\WEB\INF 아래 있는 web.xml을 열어보면 아래와 같은 코드가 있다.
Xml

<servlet>
    <servlet-name>org.apache.jsp.index_jsp</servlet-name>
    <servlet-class>org.apache.jsp.index_jsp</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>org.apache.jsp.index_jsp</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
</servlet-mapping>

이 서블릿이 설정된 부분이 디폴트로 보여줄 페이지에 대한 서블릿이다. 위 코드를 web.xml에서 삭제해 준다. 물론 이부분만 지운다고 해서 해결이 되지 않는다.

사용자 삽입 이미지

톰캣설치폴더 아래 work\Catalina\localhost\_\org\apache\jsp 에 가보면 위의 index에 대한 컴파일된 서블릿 파일이 존재하는 것을 볼 수 있다. 이 2개의 파일을 날려주어야 한다. 날려주지 않으면 계속 이 index 서블릿이 돌아가게 된다.

사용자 삽입 이미지

이제 ROOT폴더 아래 있는 index.jsp가 Root에 접속했을때 실제로 보여질 페이지이다. 이상태에서는 위의 스크린샷에서 본것과 똑같은 형태로 index.jsp가 보이지만 이 파일의 내용을 수정해 주면 index.jsp를 원하는대로 사용할 수 있다.

[TOOL]Eclipse 단축키 정리..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

요즘 좀 집중해서 이클립스에 익숙해 지려고 노력중이다. 이제는 이클립스라는 툴의 개념도 꽤 잡았고 많이 손에 붙은 편이지만 단축키를 손에 많이 안 익었었는데 이클립스의 기능에는 정말 많은 것들이 있지만 일단 기본적으로 툴의 익숙하다고 말할 때 가장 중요한 점은 단축키의 사용이 아닐까 생각한다. 은근히 마우스로 손이 왔다갔다 하는 것은 시간을 많이 소비하고 번거로워서.....

오래전부터 이클립스 단축키 리스트를 출력해서 가지고 있기는 했는데 단축키가 한두개도 아니고 단축키를 다 외우고 있는것도 아니니까 손에 잘 붙지가 않았다. 하지만 이제는 단축키의 필요성이 더 커졌고 내가 뭐가 필요한가도 가닥이 잡혔기 때문에 필요한거 위주로 정리하면서 손에 붙게 하고 있는 중이다.

이 포스팅은 아마 계속 추가되고 정리될 포스팅이다.


Editing


  • Ctrl + D : 줄 삭제
  • Ctrl + Alt + 위/아래 : 줄 복사
  • Ctrl + Shift + Enter : 현재 줄에 새줄 추가
  • Shift + Enter : 다음줄에 새줄 추가
  • Ctrl + Right : 다음문자로 이동 (Ctrl + Left : 이전 문자로 이동 )
  • Ctrl + Shift + / : 주석처리 (Ctrl + Shit + \ 주석 풀기)
  • Ctrl + / : 라인별로 주석처리
  • Ctrl + Shift + O : import 정리
  • Ctrl + L : 원하는 라인으로 이동
  • Alt + Shift + 방향키 : 블록선택하기
  • Ctrl + J : 점증적 검색 - Ctrl + J 입력후 원하는 단어 입력하면 이클립스 하단바에 찍히고 바로 검색 가능
  • Ctrl + K : 다음 찾기(Ctrl + Shift + K 이전 찾기)  - 현재 블럭설정된 단어 찾기
  • Ctrl + H : 검색 다이얼로그(메서드, 타입, 패키지 등 검색 가능)
  • Tab : 들여쓰기 (Shift + Tab : 내어쓰기)
  • Ctrl + Space : 코드어시스트 (키보드 Type3를 쓸 경우에는 왼쪽 Ctrl을 누른 상태에서 오른쪽 Ctrl을 누르고 왼쪽 Ctrl을 뗀 후에(오른쪽 Ctrl은 누른 상태) Space를 눌러준다.)
  • Shift + Alt + T : 리펙토링 메뉴 띄우기



Navigation


  • Ctrl + Shift + E : 에디터안에서 열린 파일간의 이동
  • Ctrl + E : 에디터안에서 열린 파일간의 이동(작은 레이어로 뜬다.)
  • Ctrl + F6 : 에디터안에 열링 파일간 이동하는데 F6누를때마다 하나씩 순차적으로 넘어감.
  • Ctrl + E : 퀵 에디터간 이동
  • Ctrl + F7 : 뷰간 전환
  • Ctrl + F8 : 퍼스펙티브 간 전환
  • F12 : 어디서든 에디터로 포커스 됨



Information


  • Ctrl + Shift + R : 리소스 찾기
  • Ctrl + O : 레이어로 현재파일의 Outline 보여줌
  • Ctrl + T : 레이어로 계층구조 보여줌
  • Ctrl + Shift  + Space : 메서드의 괄호안에서 누르면 파라미터 타입 볼 수 있음.
  • Ctrl + 1 : 에러난 곳(빨간 줄 표시)에서 누르면 레이어로 해결방법이 나옴.
  • F3 : 해당 메서드나 클래스가 정의된 곳으로 이동
  • Ctrl + Shift + G : 해당 메서드, 객체, 변수가 사용(호출)된 모든 곳을 찾는다.



etc...


  • Ctrl + Shift + L : 단축키 리스트
  • Ctrl + 3 : Quick Access
  • Ctrl + M : 화면 최대화
  • Ctrl + W : 파일에디터 닫기
  • Alt + Shift + X, R : Run on Server
  • F11 or Ctrl + F11 : 최근 실행한 Run 실행

My Comment..
과거 햄의 블로그에서 이러한 단축키에 대해서 언급한 글이 또 있었다..
그래서 링크 해둔다.. [TOOL]OKJSP 세미나 : 이클립스 기본..

[Book] Eclipse를 활용한 Java 프로젝트 실무..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Eclipse를 활용한 Java 프로젝트 실무 - 6점
류대석.범지훈 외 지음/제이에스팩토리㈜

원래는 이클립스라는 툴에 더 깊이 알기 위해서 이 책을 집어 들었는데 책을 보고나서 얘기하자면 이클립스라는 툴에 집중한 책은 아니다. 제목에도 나타나듯이 자바프로젝트 실무에 대한 부분에 오히려 더 초점이 맞추어져 있다고 할 수 있다.

그래서 이 책에서 정한 어떤 요구사항아래에서 프로젝트를 진행하는 시작부터 운영까지 모든 것을 차례차례 설명하고 있다. 시작부분에서는 약간 당황(???)했다. 마치 소공(소프트웨어 공학)처럼 프로젝트 진행을 진행되고 업무프로세스가 어떻게 되는지가 이론적 설명으로 나온다. 물론 이 부분은 프로젝트를 진행가는 각 단계마다 자세한 이론 설명이 함께 되고 있다.

착수 - 요구사항 분석 - 설계 - 개발 - 테스트 - 운영시스템 구축 - 프로젝트 종료에 이르는 각 단계에 따라서 진행되고 있기 때문에 제대로(?) 된 프로젝트가 어떤 흐름으로 진행되는 지 감을 잡기에는 괜찮은 책이라고 생각된다. 오히려 아주 초보가 아니라면 이클립스를 배우는데는 큰 도움은 안되지 않나 싶다.(얻을게 없다는 건 아니고 이클립스의 각 기능에 대해서 초점을 맞춰진 것은 아니기 때문에....)

SI에 맞춰진 것처럼 국내 SI환경에서 가장 많이 쓰는 환경으로 구축이 되어 있다. 이클립스에 struts, ibatis로 프로젝트를 진행하고 이클립스의 간단한 셋팅후에 개발단계에서는 스트럿츠에 대한 설명과 모델링하는 방법, iBatis에 대한 설정과 어떻게 작성하고 개발을 하는지에 대해서 간단한 게시판정도의 구현을 통해서 예제코드를 함께 보여주면서 보여주고 있다. 게시판이 웹개발에서는 반 이상이기 때문에 흐름을 이해하기에는 최적으로 구성되지 않았나 하는 생각도 든다.

유닛테스트와 i18n, 로깅에 대한 설정도 빠뜨리지 않았고 운영시스템에서 로드밸런싱같은 시스템 구축을 어떻게 해야할지도 자세하게 설명하고 있다.(이 부분은 개인적으로 궁금했던 부분이었기 때문에 많은 도움이 되었다.)

계속 말했듯이 이클립스란 툴을 익히기 보다는 프로젝트를 진행할때 흐름을 파악하지 못한 사람이 파악하기에는 제일 좋은 듯 하다. 프로젝트 전체를 다 다루었기 때문에 500페이지가 안되는 분량으로 모두를 자세히 담기는 쉽지 않은데 본 느낌으로는 집중할 때 집중하고 간략히 소개해야하는 부분은 간략히 잘 분배한 느낌이다. 나쁘지는 않았던 책...

[DB]JDBC와 ODBC로 Java에서 MS Access(.mdb) 연결하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

MDB를 별로 좋아하지는 않지만 상황에 따라서 솔직히 편할때가 있는 것도 사실이고 뭐 MDB로 해야된다는데 어쩌랴... Java에서 MDB를 연결해야 하는데 알아보니 여러가지가 방법이 있었는데 여기서는 윈도우즈에서 제공하는 ODBC를 이용해서 연결하는 방법을 사용한다.(윈도우즈서버에서만 가능하다는 얘기다.)

[제어판] - [관리도구] - [데이터 원본 (ODBC)]에 들어간다.

사용자 삽입 이미지

"시스템 DSN"탬에서 새로운 ODBC를 연결하기 위해서 추가버튼을 누른다.

사용자 삽입 이미지

여기서는 MDB를 사용할 것이므로 mdb용 드라이벌를 선택한다.

사용자 삽입 이미지

데이터 원본 이름에 원하는 디비의 이름을 넣고 이제 MDB를 연결하기 위해서 데이터베이스의 "선택"을 눌러서 들어간다.

사용자 삽입 이미지

사용할 MDB를 찾아서 지정하고 이제 다시 ODBC Microsoft Access 설정화면에서 "고급"을 눌러서 들어간다.

사용자 삽입 이미지

사용할 로그인 아이디와 비밀번호를 지정한다. 이렇게 하면 ODBC의 등록과정이 완료된다.


이제 자바쪽에서 JDBC를 이용해서 연결할 차례다.
Java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DBConnection {    
    private String DB_URL = "Jdbc:Odbc:Testdata";
    private String DB_USER = "test";
    private String DB_PASSWORD= "test";
    
    Connection conn = null;
    
    public Connection getConnection() {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
        
        try {
            Properties props = new Properties();
            props.put("charSet", "8859_1" ); 
            props.put("user", DB_USER);
            props.put("password", DB_PASSWORD);

            conn = DriverManager.getConnection(DB_URL, props);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

여기서는 연결을 위한 설명이라서 연결부분의 코드만 가져왔다. disconnect를 예제소스에서 뺐다는 말이다.

jdbc 연결 URL로는 "Jdbc:Odbc:데이터원본이름"을 사용하고 username과 password는 ODBC등록할 때 사용한 것을 적는다.(근데 없어도 잘 돌아가는것 같다.. ㅡ..ㅡ) 드라이버 클래스는 "sun.jdbc.odbc.JdbcOdbcDriver"를 사용한다.

그리고 여기서는 Properties를 사용하였는데 이건 mdb의 한글문제때문이다. mdb는 한글을 8859_1로 사용하기 때문에 한글을 안깨지고 받아오기 위해서는 Connection을 연결할 때 charSet을 8859_1로 설정해 주어야 한다.
Java

DBConnection dbConn = new DBConnection();
Connection conn = null; 
PreparedStatement psmt = null;
ResultSet rs = null;
    
try{        
    String sql = " SELECT username FROM member ";
    conn = dbConn.getConnection();  
    psmt = conn.prepareStatement(sql);        
    
    rs = psmt.executeQuery();
            
    while (rs.next()) {
        String username = new String(rs.getString("username").getBytes("8859_1"), "euc-kr");
    }  
}catch(Exception e){
    e.printStackTrace();
}finally{
    dbConn.disConnection(rs,psmt, conn);
}

이제 Connection을 사용해서 Select 쿼리를 날리는 부분이다. import등의 필요없는 부분은 빼버렸다. 결과적으로는 14번째 라인만 보면 된다. 영문이나 숫자는 괜찮지만 한글의 경우 디비커넥션에서 사용할 때 Access에서 한글을 8859_1(ISO-8859-1)을 사용했기 때문에 여기서도 받아온 스트링을 14번 라인처럼 엔코딩을 변경해 주어야 받아온 한글이 깨지지 않고 표시된다.
(특이하게도 문서의 encoding이 euc-kr이든 utf-8이든 동일하게 위처럼 euc-kr로 인코딩을 해주어야 한글이 깨지지 않는다.)

INSERT나 UPDATE등 자바쪽에서 mdb로 한글을 넣을때도 동일하게 인코딩 타입을 변경해서 넣어주어야 한다. 당연히 인코딩은 반대로 해서...

String str = new String("한글".getBytes("euc-kr"), "ISO-8859-1");

위처럼 하면 된다. ( ISO-8859-1와 8859_1는 동인한 인코딩이다.)

디비를 mdb를 쓰면 한글을 넣고 빼는 일은 빈번할테니까 위 2가지를 메서드로 따로 만들어두면 편할것이다. (뭐 일일이 인코딩을 바꿔주면서 넣는걸 편하다고 할 수는 없지만... ㅡ..ㅡ)

[TOOL]Eclipse에서 Resource is out of sync with file system 발생할 때..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

이클립스를 쓰다가 "Resource is out of sync with file system."라는 생소한 에러를 만났다. Tomcat을 구동할려고 하니까 동일한 메시지의 에러가 나오고 파일을 만질려고 해도 똑같은 에러가 발생했다.

사용자 삽입 이미지

처음 보는 에러고 에러메시지를 보아도 정확한 의미를 잘 이해할 수가 없어서 약간 당황하기는 했지만 해결법은 무척 간단하다.

Project뷰에서 F5를 눌러서 프로젝트폴더를 새로고침을 해주면 해결된다 ㅡ..ㅡ
(너무 단순한 해결이라 포스팅도 왠지 민망하네)

My Comment..
eclipse 내에서도 종종 꼬이는 경우가 있는 듯.. 그래서 햄 말대로.. Refresh 내지는..
Team > Cleanup 을 해주면.. 잘 돌아갈 때가 있다능..
다만 Cleanup 을 할 때.. eclipse svn 사용자가 여러명이라면, 권한 문제가 발생해서..
충돌 내지는 Cleanup 안되거나 그런 문제가 발생하므로.. 본인의 권한 및..
여타 사용자들의 권한을 확인해보고 진행하는게 서로에게 좋다..

왜냐믄.. 나도 하려고보니 다른 사람이 이미 해놔서.. 파일에 대한 권한들이..
싹 바뀌어서.. 무슨 에러인지도 모르고.. 겁니 열받았던 기억이 있기 때문.. ㅡㅡ..

[JAVA]Eclipse에 Struts 2 셋팅하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Struts 2는 MVC Model 2에 기반한 Web Application Framework(WAF)이다. 국내 SI업계에서는 거의 장악한 Struts의 후속 프레임워크이다. 머 스트럿츠2에 대해서 소개하는 건 아니라서(사실 잘 모르기 때문에 은근슬쩍...) 생략하기로 하고 자세한 내용은 다른 루트를 통해서 검색해 보시길....

사용자 삽입 이미지

Struts2를 사용하려면 기본적인 셋팅을 약간 해야되기 때문에 Eclipse에서 셋팅하는 법을 보자. 일단 프로젝트를 만들자 프로젝트를 만드는 것은 기본적인 자바프로젝트랑 동일하다.

사용자 삽입 이미지

웹어플리케이션이므로 Dynamic Web Project으로 만든다.

사용자 삽입 이미지

여기서는 Server를 Tomcat 5.5를 사용한다. 이클립스의 톰캣설정에 대한 부분은 여기서는 생략하고 넘어간다. (서버설정이 되어 있다는 전제하에서.....) 프로젝트를 만들었으면 이제 Struts2를 올려야 한다.Struts2는 다운로드 페이지에서 받을 수 있다. 다운로드 받은 파일의 압축을 풀고 안에 lib안에 보면 스트럿츠2에서 필요한 jar들이 들어 있다.

사용자 삽입 이미지

많은 jar파일들이 있는데 스트럿츠2를 구동하는데 이 모든 jar가 다 필요한 것은 아니다. 기본적으로 필요한 파일들은 다음과 같고 나머지는 다른 플러인등을 위한 파일들이다.

  • antlr-2.7.2.jar
  • commons-beanutils-1.6.jar
  • commons-chain-1.1.jar
  • commons-logging-1.0.4.jar
  • commons-logging-api-1.1.jar
  • commons-validator-1.3.0.jar
  • freemarker-2.3.8.jar
  • ognl-2.6.11.jar
  • oro-2.0.8.jar
  • struts2-core-2.0.11.2.jar
  • struts-core-1.3.5.jar
  • xwork-2.0.5.jar
위의 파일들을 WebContent/WEB-INF/lib 에 복사를 한다.

WebContent/WEB-INF/에 있는 web.xml 을 다음과 같이 수정한다.
Xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
    Struts2Setting</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

이제 struts.xmlstruts.properties 2개의 파일이 필요하다. 만들어진 웹어플리케이션이 배포될 때의 이 2개의 파일의 위치는 WebContent/WEB-INF/classes/ 이다. 이클립스에 src폴더 아래 있는 것은 자동으로 classes로 배포하기 때문에 src폴더 안에 넣으면 된다. 이클립스의 Project뷰에서는 java파일 말고는 생성되지 않기 때문에 Navigator뷰에서 만들어 넣으면 된다.(이걸 어디다 넣어야 되는지 몰라서 어찌나 고생했는지....)

사용자 삽입 이미지

struts.xml
Xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="default" extends="struts-default" namespace="">
    </package>
</struts> 


struts.properties
Xml

struts.i18n.reload=true
struts.devMode = false
struts.configuration.xml.reload=true
struts.continuations.package = org.apache.struts2.showcase
struts.custom.i18n.resources=globalMessages
#struts.action.extension=jspa
struts.url.http.port = 8080
#struts.freemarker.manager.classname=customFreemarkerManager
struts.serve.static=true
struts.serve.static.browserCache=false
struts.multipart.maxSize=2097252

이렇게 하면 스트럿츠2를 구동하기 위한 셋팅은 완료되었다. (아~ 글 길다... ㅡ..ㅡ) 그럼 이제 돌려보자... 셋팅이 잘 되었는지 봐야되니까...

다음과 같은 PrintStringAction.java 파일을 만든다.(팩키지생성같은 설명을 생략한다.) 이 파일이 비즈니스로직을 담당한다.
Java

package ex.struts;

public class PrintStringAction {
    private String greetings;
    
    public String execute() throws Exception {
        greetings = "Hello World!";
        return "success";
    }
    
    public String getGreetings() { return greetings; }
    public void setGreetings(String greetings) {
        this.greetings = greetings;
    }
}

그리고 WebContent/ 아래에 printString.jsp를 만들어 준다. 이 jsp파일이 뷰단을 담당한다.
Html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page contentType="text/html; charset=utf-8" %>
<% request.setCharacterEncoding("utf-8"); %>
<% response.setContentType("text/html; charset=utf-8"); %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>pringtString</title>
  </head>
    
  <body>    
    <s:property value="greetings" />
  </body>
</html>

이제 struts.xml파일에 위 2파일에 대한 맵핑을 추가한다.
Xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <package name="default" extends="struts-default" namespace="">
        <action name="printString" class="ex.struts.PrintStringAction">
            <result>/printString.jsp</result>
        </action>
  </package>
</struts> 

이제 프로젝트를 실행하면 된다. Run As. > Run on Server를 실행하고 주소에 printString.action을 실행한다.

사용자 삽입 이미지

위처럼 Hello World! 가 찍히면 struts 셋팅이 완료된거다.

셋팅에만 집중했기 때문에 다른 부분에 대한 설명은 거의 하지 않았다. 다른것들은 나중에...

[JS]prototype.js에서 HTML엘리먼트 생성에 Template 객체 사용하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

prototype.js에서는 Template이라는 정해진 형식의 문자열을 생성해 주는 객체를 제공하고 있다. Template는 어떤 정해진 문자열(또는 HTML)을 반복해서 찍어낼 때 아주 유용하다.(한번만 사용할꺼라면 당연히 Template를 쓸 일이 없기 때문에...)

사용법은 아주 단순하다.
JavaScript

var tpl = new Template('<div><ul><li>test</li></ul></div>');
tpl.evaluate("");

해주면 된다. 물론 저코드는 아무동작도 안한다.  템플릿 결과로 나온 걸로 어떤 액션을 주지 않았기 때문에 tpl.evaluate("")의 결과값으로 Template로 만든 String이 리턴되기 때문에 저런식으로 만든 HTML을 원하는 위치에 삽입해 주면 된다. 위 코드에서는 사용법을 예시로 들기 위해서 evaluate()의 파라미터로 빈문자열("")을 파라미터로 주었는데(없으면 에러가 나기 때문에...) 머 다른 변수를 주어도 상관이 없다.

저 정도만으로는 그다지 유용하지 않은데 당연히 그럴리가 없다. 템플릿안에 #{fieldName}라는 식별자를 통해서 객체의 값을 받을 수 있다.
JavaScript

var tpl = new Template('<div><ul><li>#{id}</li><li>#{nickname}</li><li>#{job}</li></ul></div>');
var obj = { id:'rockdoli', nickname:'Outsider', job:'Web Developer'};

tpl.evaluate(obj);
// output : <div><ul><li>rockdoli</li><li>Outsider</li><li>Web Developer</li></ul></div>

위 처럼 탬플릿에 #{fieldName}를 사용할 경우 넘겨받은 객체에서 해당 이름으로 값을 찾아서 해당 값으로 교체한다 원하는 이름과 매치되는 값이 없을 경우에는 아무값도 넣지 않는다. 이걸 사용하면 원하는 엘리먼트를 자유롭게 생성해 낼 수 있다.  prototype.js의 Enumerable을 이용해서 다음과 같이 사용할수가 있다.(이렇게 하는게 제일 편한듯...)
JavaScript

var tpl = new
Template('<div><ul><li>#{id}</li><li>#{name}</li><li>#{age}</li></ul></div>');
var obj = [{id:'1', name:'Steve', age:'24'},
           {id:'2', name:'Mike', age:'30'},
           {id:'3', name:'Julie', age:'19'}]
obj.each(function(w) {
    tpl.evaluate(obj);
});

위처럼 사용하면 원하는 위치에 값을 바꿔가면서 쉽게 반복해서 찍어낼 수 있다.

var tpl = new Template('<div><ul><li>#{id}</li><li>\\#{nickname}</li><li>#{job}</li></ul></div>');

escape도 있는데 위처럼 역슬래시 2개(\\)르 사용하면 #{nickname}부분은 해당값으로 치환하지 않고 #{nickname}가 그대로 찍힌다.

[Book] 스트럿츠 2 프로그래밍..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

스트럿츠 2 프로그래밍 - 8점
현철주.민상기.정광선 지음/에이콘출판


내가 꿈에도 그리던(?) WAF(Web Application Framework)에 드디어 발을 디밀었다. 스프링이냐 스트럿츠2냐는 어려운 선택이지만 일단 스트럿츠2를 택했다. 국내에 아직 스트럿츠2에 대한 책은 별로 나오지 않았다. 이 책과 다른책 2권인 것으로 알고 있다(현재로서는...) MVC Model 2에 대한 전반적인 개념이해는 충분히 가지고 있었고 최근 프로젝트에서 MVC Model 1으로 진행하면서 어떤게 필요하고 불편한지도 어느정도 느끼고 있던 터였다. 내가 있는 환경에서는 프레임워크를 거의 사용하지 않고 몇몇 사업에서 사용한다고 하더라도 그냥 얹어만 놨지 그 프레임웍에서 제공하고 있는 것을 이용해서 개발하지는 않기 때문에 난 아직 프레임워크를 접할 기회를 갖지 못했었다.

그러다 이번에 진행하는 사업에서 얘기가 진행되다가 "스트럿츠2 올릴까?"해서 주저없이 "예"하고 그 담날부터 이 책을 봤다. 보고난 후의 느낌이라면 "이걸 왜 안써!!" 정도???  아주 대략적인 개념만 가지고 있었지만 보면서 내내 "그래 이렇게 개발해야지"하는 생각이 계속 났다. (물론 이 얘기는 책 얘기가 아니라 스트럿츠2 얘기다.) 처음에는 익숙하지 않아서 좀 해맬수도 있지만 MVC의 완전한 분리, 그리고 가장 좋게 느껴진것은 인터셉터와 예외처리들... 프레임워크라면 당연히 개발방법을 어느 정도 강제함으로써 사람이라면 어쩔수 없이 할수 밖에 없는 실수를 줄여주고 개발의 속도를 높여준다. 

난 실수를 줄여주는 부분에 훨씬 관심이 갔다. 따로 모듈을 만든다고 하더라도 보안처리, 예외처 등을 처리하다보면 개발하는 것 만큼 복잡해지고 또 한번에 하지 못하고 지적받을때마다 하다보면 어딘 추가되고 어딘 안되고 나중엔 어디가 어디까지 처리됐는지도 헷갈려버리는 상황에 처하기 일쑤고 그러면 자연히 누락된 부분이 생길수 밖에 없다. 안생기는게 더 신기할 정도다... 그런 부분을 프레임워크안에서 제공해주는 기능으로 전체관리를 해준다는 것은 정말 매력적으로 보였다.(실제 해보면 또 장점이 있고 단점이 있겠지만... 아~ 그리고 물론 프레임워크 안써도 필터를 쓸수 있기는 하지만.....)


이제 책 얘기를 좀 해볼까? 책의 목차는 상당히 잘 되어 있는 편이다. 대부분 스크린샷을 제공하고 있고 세세한 부분까지 설명해 주기 때문에 개념을 잡고 이해하는데 큰 도움이 된다. 아주 간단한 예제를 통해서 스트럿츠2가 어떤식으로 동작되는 지를 가르쳐준다음 각 고급기능에 대해서 상세하게 설명해 주는 것도 상당히 괜찮았다. 난 책을 읽으면서는 왠만하면 코딩을 잘하지 않는 편인데 이번에는 바로 실무에 써먹어야 되기도 했고 나에겐 새로운 영역이었기 때문에 상당히 많은 예제들을 따라해 보았다. 설명하려고 하는 부분에 대한 이해만 도울수 있는 정도의 적절한 예제가 제공되고 있는 느낌이고 처음엔 무슨 소린가 하더라도 한번 예제를 따라해 보면 대부분 이해를 할 수가 있었다. 백문이불여일타라고 하지 않는가... ㅎㅎㅎ

거의 모든 설명의 패턴이 동일하다 처음에 어떤 기능인지를 대략적으로 설명한뒤에 거기에 필요한 부연설명들을 한다. 그리고 이걸 위해서 어떻게 동작할 예제를 만들것인지를 말해주고 동작구조에 대한 그림과 함께 동작방식을 얘기하고 따라할 수 있는 소스를 제공한다. 그리고 그 뒤에 소스에 대한 설명을 한다. 이걸 죽~ 따라하면 이해하는데 전혀 무리가 없을 정도로 자세하다.

각 기능별로 설명과 예제가 함께 있기 때문에 레퍼런스로 활용하기에도 괜찮을듯 하고 많이 쓰는 Ajax, 파일처리, 유효성검사, i18n, 로깅등에 대해서도 자세하게 다루고 있기 때문에 스트럿츠2를 사용하는데 필요한 것은 거의 대부분 담고 있는듯 하다. 그리고 사업들에는 많이 필요할듯한 대표적인 플러그인들도 간단히 예제와 함께 설명해 주고 있다. 물론 플러그인들 부분은 실제로 활용을 하려면 별도의 자료를 찾아봐야 할듯 하다.(이건 뭐 양이 많으니 단점이라고 얘기한것은 아니다.)


이렇게 몇권 나오지 않은 것중에서 고를때는 선택권은 없지만 과연 이중에 좋은 책이 있을가 하는 생각에 망설이게 되는데 스트럿츠2를 입문하기에 적절한 책이라고 생각한다. 다만 아쉬운 점은 이렇게 각 기능을 죽~ 설명한 다음에 대부분의 책에서 마지막으로 나와야 할 종합예제. 더 구체적으로 말하면 서버사이드쪽에서 설명하기도 좋고 이해하는 쪽에서도 좋다고 생각하는 게시판예제!!! 이게 없다. 단편적으로는 거의 이해를 하고 책보면 따라할 수 있을텐데 보는 내내 계속 찜찜하던 것은 개발을 하면 한 페이지에도 수많은 기능들이 필요한데 이렇게 됐을때 이런 것들이 어떻게 유기적으로 구성되어야 하는지가 머릿속에 잘 그려지지가 않았다. 마지막에 게시판 예제같은 것이 하나 제공됐으면 딱 이해됐을텐데....

그 리고 이 책은 마치 매뉴얼처럼 아주 객관적으로만 설명하고 있다. 이게 있지만 이거보단 이렇게 하는게 더 좋다고 생각한다든가 하는 등의 저자의 주관적인(?) 얘기는 거의 들어있지 않다. 그러다 보니 스트럿츠2의 태그라이브러리를 이용하면 Ajax등도 간단하게 쓸 수 있는데 나같이 의심많은 놈은 복잡한 코드를 이렇게 자동으로 찍어주는게 별로 신용이 가지 않았고 결과물을 어느정도까지 커스터마이징이 가능할 지도 감이 잘 오질 않았다. 처음 접하는 입장으로써 이걸 써야되나 말아야 되나 하는 고민들..... 특히 나같은 경우는 prototype.js를 사용하는데 스트럿츠2에서 제공하는 것은 Dojo를 이용하고 있었다. ㅡ..ㅡ

Ajax 에서 많이 사용하는 첫 셀렉트박스를 선택하면 두번째 셀렉트박스의 옵션값이 설정되는 것도 아주 간단히 <s:doubleselect />태그를 이용해서 만들수 있는데 자바스크립트를 직접 다루는 것을 더 좋아하는 나로써는 그냥 이걸 이용하는게 좋을지 하는 등의 고민은 직접 해야한다. ㅡ..ㅡ (물론 책이 모든 고민을 해결해 주는 것은 아니지만...ㅎㅎㅎ)

My Comment..
이 책 표지를 보니 생각이 어렴풋이 난다.. 나도 아마 플젝때문이었을 텐데..
스트럿츠2 프레임워크를 쓴다고 해서.. 개념이라도 확인해봐야겠다고 해서..
찾던 중.. 햄이 책을 읽고 있었던가.. 책이 햄 옆에있었던가 해서.. 보게 되었던..
문제는 조금 보다가.. 인터넷으로 찾아서.. 예제를 돌려보고.. 그 패턴 자체를..
이해하고 넘어갔던 기억이.. ㅋㅋㅋ..

[JS]prototype.js에서 DOM이 로드되었는지 확인하는 Event 처리하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

아마 이런 얘기는 계속 하게 될텐데 여태까지는 HTML안에 속성을 이용해서 자바스크립트를 호출했지만(대표적인 예로 onclick="") 이제는 자바스크립트를 분리해서 HTML 외부에서 이벤트리스너를 등록하는 것이 일반적인 추세이다. 그중에서도 자바스크립트작업을 할 때 가장 시작점이 되는 것이 DOM이 로드되었는지 확인하는 것이다. DOM이 로드된 후에야 이벤트 리스너를 등록하던지 DOM을 핸들링 하던지 할테고 DOM이 로드되기 전에 핸들링하려고 하면 에러메시지나 나올테니까.....

<body load="init()">

위와 같은 형태가 가장 기본적인 형태의 DOM이 로드되는 것을 확인하는 형태이다. 위에 말했듯이 이런 식으로 HTML과 자바스크립트를 혼용하는 것은 보기도 좋지 않고 점점 사용하지 않으려는 추세이다.

window.onload = function() {
    // 초기화 코드
}

이런 형태가 자바스크립트를 이용해서 할 수 있는 DOM이 로드되었는지를 확인할 때 사용하는 코드이다. 이렇게 사용하면 HTML에 자바스크립트 호출을 섞지않고 사용할 수 있다. 하지만 프로토타입은 이벤트 리스너를 등록할 수 있는 메서드를 제공하고 있다.

Event.observe(element, eventName, handler)


이것을 이용해서 DOM이 로드 되었는지를 확인할 수 있는 이벤트를 지원하고 있다.

document.observe('dom:loaded', function() {
    // 초기화 코드
});

dom:loaded라는  이벤트를 프로토타입 1.6부터는 지원해서 DOM 로드완료를 확인할 수 있다. 여기서 dom:loaded는 순수하게 DOM이 로드되었는지만을 확인한다. img등 다른 리소스들은 다 로드되지 않았을 수도 있지만 DOM자체는 모두 로드되었다. 이렇기 때문에 초기화 코드(초기화를 위한 특별한 기능이나 다른 이벤트리스너의 등록....)를 사용하기에는 딱 좋다.

그리고 window.onload의 경우는 한 문서에서 단 한번밖에 사용할 수 없다. 자바스크립트의 입장에서 본다면 window객체에 onload변수라고 볼 수 있기 때문에 2번 정의하면 2번째 정의한 것이 첫번째 것을 덮어써버리고 첫번째 정의한 것은 동작하지 않는다.(변수라고 생각하면 당연한 얘기다...) 하지만 dom:loaded를 사용하면 이런 일이 없다. 정의된 순서대로 여러번 정의하더라도 덮어쓰지 않고 모두 동작한다. 외부 자바스크립트를 많이 불러쓸 경우에 서로 덮어쓰는 문제를 방지할 수 있다.

덧) 별거 아닌 코드인데 할때마다 좀 헷갈린단 말야...

[JS]prototype.js의 Enumerable의 each() 사용하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

prototype.js에서는 Enumerations을 다루기 위한 Enumerable이라는 클래스를 제공하고 있고 Enumerable에 포함된 수많은 메서드가 있지만 그중에 each()는 단연 돋보인다. 기본적으로 Enumerable에서 each()가 대부분의 메서드의 로직의 기본이기도 하다. 나도 쓴지는 얼마 안됐는데 이거좀 최고다..ㅋ

다른 언어에 많이 있는 foreach같은 거랑 비슷한 메서드로 Iteration기능을 담당하고 있다. API를 보면 each()에 대한 정의가 다음과 같이 되어 있다.

each(iterator[, context]) -> Enumerable

솔직히 정의는 나중에 알고보면 아~ 그런가보다 하지 처음에 보면 이해하기가 어렵다. 사용법은 완전 직관적이다. 배열이나 컬렉션등을 놓고 그냥 each로 루프를 돌려주면 된다.

var arr = ['11', '22', '33', '44', '55'];
arr.each(function(a) {
    alert(a);
});

위에처럼 사용한다. 배열에 each로 확장해 주고 안쪽에 function을 넣어서 필요한 기능을 수행한다. 반드시 function이 들어가야 되는 것은 아니지만 대개의 경우는 function을 수행할 꺼라고 생각한다. function을 사용할 때 첫번째 파라미터로는 순회돌면서 현재의 엘리먼트가 튀어나온다. 위의 예에서는 alert로 11부터 55까지 5번의 alert() 발생한다.

var arr = ['11', '22', '33', '44', '55'];
arr.each(function(a, idx) {
   alert(idx);
});

function에 2번째 파라미터를 사용하면 인덱스번호를 받을 수 있다. 여기서 인덱스는 대개의 배열처럼 0부터 시작한다. 위의 예에서는 0~4까지 5번의 alert()가 발생한다.

한눈에 보아도 for(i=0; i< length;i++)보다 훨씬 사용하기가 편하다. JSON배열도 마음것 순회할 수 있고 prototype.js에서는 컬렉션등이 Enumerable이랑 연계가 되기 때문에 배열처럼 생겼다 싶으면 그냥 다 each()를 사용해 주면 된다. HTML 엘리먼트의 객체들도 each를 이용해서 편리하게 사용할 수 있고 배열상수를 쉽게 만들수 있는 함수도 제공하고 있다. 내부에서는 다들 each()를 사용하기는 하지만 Enumerable이 제공하는 다른 메서드들과 같이 사용하면 복잡한 순회문 또는 이중,삼중으로 해주어야 하는 순회문을 상당히 직관적으로 간단히 작성할 수 있다.

순회를 할때는 필요한게 2가지 있는데 바로 순회 멈춤과 순회를 건너뛰는 기능이고 대부분의 언어에서는 break와 continue라는 명령어로 사용하고 있다. each()에서는 throw $break;와 return;을 사용해 주면 된다.
throw $break;를 사용하면 순회자체가 종료되고 return; 하면 다음 순회로 바로 건너뛴다. 1.5버전에서는 throw $continue;를 사용했었는데 이제는 사용하지 않고 그냥 return;을 사용하면 된다.

그리고 each()를 사용할 때 또 고려해야 될 문제중에 하나가 this에 대한 부분이다. 클래스를 만들어서 사용할 경우 멤버변수나 멤버함수의 경우에는 this지시자를 통해서 사용하는데 each()안에 들어가는 순간은 this가 해당 클래스가 아닌 each에서 순회도는 아이템을 가르키게 된다. 이럴땐 바인드를 사용하면 된다.


1
2
3
4
5
6
7
var arr = ['11', '22', '33', '44', '55'];

 arr.each(function(a, idx) {

    alert(idx);

 }.bind(this));

이렇게 bind()를 사용하면 each()내에서 this가 바인드한 Object를 가르키게 된다. bind()를 꼭 this에다가 사용해야 하는 것은 아니다.