[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년 3월 24일 목요일

[Book] 스매싱 북..

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

스매싱 북 - 6점
스매싱 미디어 지음, 웹액츄얼리코리아 옮김/웹액츄얼리코리아(주)

스매싱 북은 웹디자인관련 정보를 전하는 유명한 사이트인 Smashing Magazine에서 여러 저자들이 다양한 주제들에 대해서 집필한 책입니다. 스매싱 매거진이 웹디자인과 웹개발을 모두 표방한다고 얘기하고 있기는 하지만 웹디자인(퍼블리싱 포함)쪽에 많이 치중되어 있다고 생각하는데 그런 부분은 책에서도 동일합니다. 그런 면에서는 개발자보다는 웹디자이너에게 좀더 유용한 책이 될 듯 합니다. 개인적으로 국내에서는 웹디자이너들이 웹에 대한 마인드가 좀 부족하다고 생각하고 있습니다.(개인적인 느낌이니 디자이너분들이 흥분하시는 일은 없었으면 좋겠습니다.) 웹디자인과 일반 디자인은 약간 다른 면이 있는데 보통 디자이너들은 웹도 출판물과 동일하게 보는 느낌이 꽤 있는데 그런 면에서 스매싱북은 웹디자인이라는 면을 잘 설명해주고 있기에 개념을 잡기에 좋다고 생각합니다.

"최신 웹어플리케이션에서의 사용자 인터페이스 디자인" 챕터는 웹사이트에서 UI를 어떻게 구성하고 디자인해야 하는지 설명해 주고 있고 "CSS 레이아웃의 예술과 과학"에서는 CSS로 레이아웃을 구성하는 방법을 설명해 주고 있는데 여러가지의 레이아웃형태에 대한 설명은 참고할 만 하지만 기존의 CSS에 대해서 많이 모른다면 이겨서 설명해 주는 CSS기법만으로는 좀 부족하다고 생각합니다. "웹 타이포그래피"챕터는 국내에서는 아직 타이포그래피가 많이 발전하지 않았기 때문인지 몰란던 내용도 많았고 꽤 흥미로왔습니다. 사실 국내에서 여기서 말하는 수준의 고민을 하면서 타이포그래피까지 결정하는 곳이 얼마나 있을지는 모르겠지만 한번 알아두면 좋을 만한 내용들로 되어 있습니다.

"최신 웹사이트를 위한 사용성 원칙" 챕터는 UX에 대한 사용자가 어떤 식으로 웹사이트를 사용하고 그래서 웹사이트의 메뉴나 폼등의 웹사이트 구성을 어떻게 해야하는지 설명해 주고 있습니다. "컬러 사용을 위한 가이드" 챕터는 책을 어떻게 조합하고 사용해야 하는지에 대해서 말해주고 있는데 다양한 예시들과 방법들이 있기는 하지만 내용이 그리 깊게 느껴지지는 않았습니다. "웹사이트 성능 최적화" 챕터는 많이 알려진 웹사이트 최적화 기법들을 설명해주고 있는데 내용자체는 그리 깊지 못하기 때문에 이부분에 대해서 알고 싶다면 웹사이트 최적화 기법 - UI 개발자를 위한 필수 지침서초고속 웹사이트 구축같은 책을 보는 것이 더 나을것 같았습니다. 또한 스매싱북같은 주제의 책에서 Apache 설정에 대한 부분은 이해를 하겠는데 PHP설정이나 MySQL에 대한 설정부분까지 짧게 다룬 건은 오히려 내용을 더 깊지 못하게 한것 같은 느낌이 있습니다.

"판매를 위한 디자인" 챕터는 웹사이트에서 물건이나 서비스를 판매할때에 대한 전력을 설명하는 부분으로 AIDA(주의: Attention, 흥미:Interest, 욕구:Desire, 행위:Action)원칙과 여러가지를 설명해주고 있는데 이런 전략에 대해서는 잘 모르기도 했고 달리 알고 있지 못했기 때문에 흥미로운 부분이 있었습니다. "주목받는 웹사이트 만드는 비법" 챕터는 어떻게 하면 웹사이트를 주목받게 할 수 있게 하는지에 대한 부분인데 중요한 내용들이기는 하지만 어떤 부분에서는 좀 뻔한 일반론이라 보는 사람에 따라 차이가 있을듯 합니다. "인터뷰 전문가에게 배우는 통찰력" 챕터는 웹디자인데 대한 여러가지 질문에 대해서 여러면의 디자이너들의 대답들을 모아놓은 챕터인데 제가 디자이너가 아니라 그런지 그냥 한번 읽어볼 정도의 내용입니다.

내용은 알찬 내용과 일반론이 좀 섞여있는 느낌이고 전문적인 내용보다는 약간 개념적인 부분에 대한 설명이 많기 때문에 어렵지 않게 읽을 수 있습니다. 큰 임팩트가 있는 느낌은 없고 너무 디자인쪽에 쏠려 있어서 인지 스매싱 매거진이라는 평소의 권리를 생각했을때는 기대보다는 좀 못한 부분도 있습니다. 왠지 처음 발간되었을때는 반드시 사야할 책정도로 생각했는데 사실 그정도까진 아닌것 같습니다.

저는 오히려 마지막 "무대 뒤: 스매싱 매거진 이야기"라는 제목으로 스매싱 매거진이 생겨난 이야기를 하는 부분이 가장 인상적이었습니다. 47살의 스벤 렌나르츠와 24살의 비탈리 프리드먼이 온라인에서 만나서 스매싱 매거진을 가볍운 마음으로 만들었고 여러가지 사건을 통해서 점점 키워나가서 지금의 스매싱 매거진까지 나오는 부분은 개인적으로 꽤 인상적이었습니다.



[Book] Head First Design Patterns - 스토리가 있는 패턴학습법..

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

Head First Design Patterns - 8점
에릭 프리먼 외 지음
서환수 옮김
한빛미디어

언젠가부터 꽤나 많은 신뢰를 갖게 된 헤드퍼스트 시리즈로 이 디자인 패턴 책은 워낙 유명한 책이긴 합니다. 이제 읽었다는게 민망할 정도로 유명한 책이죠. 사실 이 책은 제가 대학교 3학년때인가 교재였습니다. 그때 들은 디자인패턴(정확히 수업명은 잘...) 강의해서 강사로 오신분이 이 책을 교재로 선정해서 구입했었습니다. 그때는 개발도 잘 몰랐고 디자인 패턴은 더더욱 몰랐기에 이건 뭔가 하면서 대충 봤었었는데 지금 생각하면 강사도 꽤 괜찮았고 열심히 봐둘걸 생각하며 이제야 봤습니다.

다른 헤드퍼스트 시리즈처럼 이 책도 이해하기 쉽게 설명을 잘 해주고 있습니다.  옵저버패턴, 데코레이터패턴, 팩토리패턴, 싱글턴패턴, 커맨드패턴, 어댑터패턴, 퍼사드패턴등 여러가지 패턴을 간단한 것부터 경우의 케이스를 다 만들어서 발전시켜나가면서 이해하기 쉽게 하도록 구성되어 있습니다. 헤드퍼스트시리지의 좋은 점이라면 역시 스토리를 가지고 하나를 설명하면서 사람들이 궁금해 할만한 점이나 확장해서 활용할 만한 것을 적절할 타이밍에 설명해 준다는 점인것 같습니다.

저는 패턴에 익숙한 편은 아니고 패턴 매니아도 아니지만 패턴의 중요성을 점점 느껴가고 있습니다. GoF로부터 시작해서 오랫동안 쌓인 개발의 노하우들이 패턴이라는 형태로 만들어졌기 때문에 모든 걸 패턴으로 해결해 보고자 하지는 않더라도 패턴을 이해하는 것은 OOP를 이해하는 것의 연장선에 있다고 생각하고 있습니다. 그리고 이 책에서 강조하는 것처럼 패턴을 이해하면 다른 개발자하고 의사소통을 훨씬 간단히 할 수 있다는 점도 중요한 부분이라고 생각합니다.

패턴은 OOP개발을 하면서 오랫동안 쌓인 노하우로 만들어진 것이기 때문에 간단한 팁처럼 한번 보고 이해할 수는 없는것 같지만 개념과 구조를 이해해주고 개발을 하거나 프레임워크등의 소스를 읽을때 적용해 보려고 한다면 크게 도움이 될 듯합니다. 한번에 다 이해를 할 수 있으면 좋겠지만 OOP에 대한 경험이 그리 많지 않은 저로써는 잘 이해가 안되는 부분도 있고 한꺼번에 여러가지 패턴을 이어서 보니까 잘 외워지지 않기도 했기 때문에 틈이 날때마다 참고해 보면서 봐야할 것 같습니다. 사례와 클래스에 대한 구조도 잘 나와있는 편이라 참고해 보기도 좋을듯 합니다.



[Book] 프리젠테이션 젠 디자인..

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


프리젠테이션 젠 디자인 - 8점
가르 레이놀즈 지음
정순욱 옮김
에이콘출판

가르 레이놀즈의 지난 번 책인 프리젠테이션 젠 - 생각을 바꾸는 프리젠테이션 디자인의 두번째 책입니다. 지난 번 책이 발표자료는 어떻게 해야 하는지에 대해서 설명하는 책이었다면 이번 책은 이름에서도 알수 있듯이 좀더 구체적으로 프리젠테이션 젠에서 설명한 발표자료를 어떻게 디자인 해야하는지 구체적으로 설명해주는 책이라고 할 수 있습니다.

프리젠테이션 젠을 읽을때는 제가 발표라는 것을 할일이 전혀 없었지만 그사이에 시간이 좀 흐르다보니 발표라는 것을 할일이 슬슬 생기고 있는데 생각과 달리 어떻게 만들어야 할 지 잘 감이 안오는 터라 좀더 제대로 발표자료를 만들기 위해서 이 책을 읽었습니다.

그전에는 그렇게 까지 정확히 생각해 보지는 않았지만 프리젠티이션이라는 것을 디자인이라고 보고 있고(전혀 몰랐던 것은 아니지만 좀더 컨텐츠라는 면으로 바라보고 있었습니다.) 그때문에 이 책에서도 디자인에 대한 얘기를 하고 있기는 한데 꽤 구체적으로 가이드라인을 주고 있기 때문에 이해하기는 어렵지 않았습니다. 다만 디자인이라는 것이 획일적인 가이드라인으로 통해서 만들어지는 것은 아니기 때문에 그 실천을 통해서 좀 더 괜찮은 결과물이 나오기 까지는 많은 시간이 필요할 것으로 생각됩니다. 가르 레이놀즈도 마지막 장에서 지속적인 개선에 대해서 강조하고 있습니다.

프리젠테이션에서 중요한 부분중 하나인 글꼴부분에 대해서 글꼴에는 어떤 종류가 있고 보통 어떤 것들을 많이 사용하고 자신은 어떤 폰트를 선호하는지 설명해주고 있고 사진은 어떻게 배치해야 하는지 색상은 어떻게 선정해야 하는지(제가 디자인쪽은 문외한이라 색에 대한 설명은 저에겐 더 인상적이었습니다.) 아주 구체적인 테크닉을 알려주고 있어서 기본내용을 참고하는 것만으로도 프리젠테이션을 만드는데 큰 도움이 될 것이라고 생각하고 있습니다. 책 내내 여러가지 프리젠테이션을 예시로 보여주고 있기 때문에 프리젠테이션을 참고해보는 것만으로도 디자인을 할때 도움이 될 것 같습니다.(1편처럼 마지막에 우수 프리젠테이션에 대한 예제들도 실려있습니다.) 어떻게 디자인을 해야 사람들이 내용에 집중하고 전달을 잘 할 수 있는지도 구체적으로 설명해주고 있습니다.

다만 타이포그래피라는 것인 한글에 비해서는 영문이 훨씬 발전되어 있다고 생각하고 있는데 아무래도 번역서이기 때문에 한글폰트에 대한 추가적인 설명같은 것이 없다는 점은 좀 아쉬운 점이고 예제로 나오는 프리젠테이션의 상당부분도 한글로 번역되어서 제공되는데 프리젠테이션을 디자인이라고 생각했을때 한글로 된 타이포그래피는 (제 눈에는) 그다지 이뻐보이지 않았기 때문에 원본의 타이포그래피가 어떠했는지 비교해보지 못했지만 디자인과 타이포그래피를 참고할 때 좀 아쉬운 부분이었습니다. 원본그대로였다면 디자인의 조화로움정도를 참고할 때 비슷한 느낌의 타이포그래피를 재현할 수 있었을 텐데요.

보통 회사에서 프리젠테이션은 글자가 빽빽하거나 디자인이라고는 배경정도에만 들어가있는 정도가 거의 대부분인 것 같습니다. 별로 좋아보이지 않는 글자가 빽빽한 디자인은 만드는 사람들도 그렇지만 사실 가르 레이놀즈가 말하는 프리젠테이션의 방식을 회사내에서 했을때도 먹힐지는 잘 모르겠지만(만드는 사람들의 문제도 있겠지만 받아들이는 사람들도 그런타입의 PT를 좋아하는것 같아서요.) 일반인을 대상으로한 외부에서는 꽤 효과가 있을 것이라고 생각하기에 프리젠테이션에 대해서 고민하는 사람들은 참고해 볼만한 책이라고 생각합니다.


My Comment..
과거에는 그나마 공공사업을 하면서 PPT 통한 제안서[갑에게 사업에 대한 전략을 설명 및 제안하는 파워포인트 문서] 작업을 많이 해왔다.. 그러다보니 자연스럽게 PT 작업도 하게 되었는데 지금은 완전 그런 문서를 본지가 엄청 오래됬다.. 그나마 와이프가[웹 디자이너] 집에서 작업을 한다고, 가지고오면 그 때 어깨넘어로 보는 정도라고 해야될까.. 무튼 당장은 아니더라도 조금 더 나이가 들어서 발표를 하려면 봐두면 좋을 성 싶다.. 다만, 책을 보진 않았지만, 책에서 말하는 PT 의 개념과 공공사업 및 갑 앞에서 발표하는 PT 의 개념은 상당히 틀릴 듯 하다.. 우리 나라는 보여지는 것에 너무 민감하기 때문에..



[JAVA]Spring MVC로 애노테이션(Annotation)을 사용하여 Hello World 예제..

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

햄의 글을 들어가기 전에 내 글을 잠시 적는다.. 별 다른 것은 아니고 이전 Spring 관련 된 글도 그렇고 지금 글도 Spring 관련된 것이어서 카테고리를 추가할까 생각을 했다.. 프레임워크 내지는 Spring 으로.. 근데 안하고 그냥 [JAVA] 에 포함하기로 했다.. Spring 이라는 것이 프레임워크가 맞기는 하지만 [JAVA] 에 관련 된 부분이라고 판단이 되기 때문이다.. 만약 내가 다른 언어 혹은 SQL 관련된 프레임워크를 만지게 되거나 그런 글을 갖고 온다면, 다른 언어 혹은 SQL 카테고리에 포함시키게 될 맥락과 같다..

공부하고 있는 Toby's 스프링 3는 아직 Spirng MVC까지 진도를 나가지 않았지만 MVC 설정을 해야할 필요가 있었던 관계로 항상 다른 사람들이 셋팅해준거 쓰다가 처음으로 한번 셋팅해 보았습니다. 아무래도 스프링은 개발자에게 너무나도 다양한 선택권을 주고 있기 때문에 전체적인 원리를 이해하고 있지 못하는 상황에서는 초기 셋팅은 꽤나 어려움으로 다가왔습니다. 여러가지 접근법이 있지만 개인적으로는 이제 패러다임이 애노테이션으로 넘어갔다고 생각하기 때문에 애노테이션을 이용해서 프로젝트를 설정했습니다. 기본부터 차근차근....

아직 스프링에 대한 이해도가 높지 못하기 때문에 설정에 일부 불필요한 부분이 있을 수 있고 자세한 설명은 (저도 잘 모르는 관계로) 어느정도 생략하고 넘어갑니다.


Xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>outsider.ne.kr</groupId>
    <artifactId>helloworld</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>helloworld</name>
    <url>http://maven.apache.org</url>

    <properties>
        <java.version>1.6</java.version>
        <spring.version>3.0.5.RELEASE</spring.version>
        <org.slf4j.version>1.6.1</org.slf4j.version>
        <downSource>true</downSource>
        <downJavadoc>true</downJavadoc>
        <wtpContextName>helloworld</wtpContextName>
    </properties>

    <dependencies>
        <!-- Spring dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.spring-library</artifactId>
            <type>libd</type>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>  <!-- declare the exclusion here -->
                    <groupId>javax.servlet</groupId>
                      <artifactId>com.springsource.javax.servlet</artifactId>
                </exclusion>
            </exclusions> 
        </dependency>
    </dependencies>

    <repositories>
        <repository> 
            <id>com.springsource.repository.bundles.release</id>
            <name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
            <url>http://repository.springsource.com/maven/bundles/release</url>
        </repository>
        <repository>
            <id>com.springsource.repository.bundles.external</id>
            <name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
            <url>http://repository.springsource.com/maven/bundles/external</url>
        </repository>
        <repository>
            <id>com.springsource.repository.libraries.release</id>
            <name>SpringSource Enterprise Bundle Repository - SpringSource Library Releases</name>
            <url>http://repository.springsource.com/maven/libraries/release</url>
        </repository>
        <repository>
            <id>com.springsource.repository.libraries.external</id>
            <name>SpringSource Enterprise Bundle Repository - External Library Releases</name>
            <url>http://repository.springsource.com/maven/libraries/external</url>
        </repository>
    </repositories>
</project>

Maven을 사용하고 있는 관계로 프로젝트 관리를 위한 pom.xml입니다.(필요없는 부분은 지웠습니다.) pom.xml의 양이 많기 때문에 다 설명하기는 어렵기 때문에 간단히 설명하면 Spring 3.0.5.RELEASE 버전을 사용하며 간단한 Hello World코드이기 때문에 스프링프레임워크가 전부 필요하진 않지만 차후 확장을 위한 기본 골격이기에(일일이 의존성까지 맞추기도 어렵고 해서) SpringSource Enterprise Bundle Repository에서 Spring 3.0.5 RELEASE를 모두 가져오도록 했으며 EBR에서 라이브러리를 가져오도록 <repository>를 추가했습니다. 


Xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HelloWorld</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext*.xml</param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.properties</param-value>
    </context-param>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/app/*</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

web/WEB-INF/web.xml 파일입니다. <context-param>을 이용해서 스프링의 applicationContext.xml를 설정하고(여러가지 applicationContext를 사용하도록 applicationContext*.xml과 같이 작성하였습니다.) log4j에 대한 프로퍼티 파일을 지정하였습니다. vaule에 classpath:를 지정하였기 때문에 해당 파일을 클래스패스에서 찾게 되기 때문에 소스폴더인 src폴더 바로 아래에 위 파일들을 위치해두면 컴파일시에 클래스패스에 포함되게 됩니다. 리스너는 ContextLoaderListener를 지정하고 요청을 처리하기 위해서 DispatcherServlet을 spring이라는 이름으로 등록해주고 이 서블릿은 /app/*에 매핑합니다.

Xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <context:component-scan base-package="kr.ne.outsider.helloworld.web" />

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

web/WEB-INF/spring-servlet.xml 파일입니다. web.xml에서 DispatcherServlet을 spring이라는 이름으로 등록했기 때문에 spring-servlet.xml이라는 파일명을 사용했습니다. 다른 파일명을 사용하려면 web.xml에서 서블릿을 등록할 때 contextConfigLocation를 이용하여 파일을 지정해 주어야 합니다.

<context:component-scan>에서는 annotation을 찾을 패키지명을 지정합니다. 여러개를 지정할 경우에는 콤마(,)를 이용합니다. DefaultAnnotationHandlerMapping는 type레벨에서 @RequestMapping을 처리하고  AnnotationMethodHandlerAdapter는 메서드레벨에서 처리하는데 사용합니다. 이 2가지는 DispatcherServlet을 사용할 경우 디폴트로 사용되지만 다른 핸들러맵핑을 합께 사용하려고 하면 지정하여야 합니다. InternalResourceViewResolver에서 prefix와 suffix를 주어서 Controller에서 이름만 지정해주고 뷰로 사용할 JSP를 찾도록 하였습니다.


Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// HelloWorldController.java
package kr.ne.outsider.helloworld.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloWorldController {
    
    @RequestMapping(value="/helloworld", method=RequestMethod.GET)
    public ModelAndView example() {
        return new ModelAndView("helloworld", "message", "Hello World");
    }
    
}

헬로월드를 출력할 컨트롤러 파일입니다. 로직은 필요없기 때문에 소스는 컨트롤러만 구성했으며 컨트롤러를 사용하기 위해서 @Controller를 지정하고 /helloworld에 대한 GET요청을 받아서 Hello World를 출력하도록 @RequestMapping를 설정했습니다.

Html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Hello World</title>
    </head>
    <body>
        ${message}
    </body>
</html>

web/WEB-INF/views/helloworld.jsp 파일입니다. 여기서 HelloWorldController에서 message에 지정한 "Hello World"를 출력합니다. 이제 http://localhost:8080/helloworld/app/helloworld 에 접근하면 Hello World가 찍히는 페이지를 볼 수 있습니다.(context명때문에 URL이 이쁘진 않군요 ㅎㅎ) 혹 참고용으로 프로젝트 소스를 함께 올려놓습니다.


스프링소스에서 제공하는 샘플을 참고해도 많이 도움이 될 것 같습니다.


[Book] 페이스북 이펙트 - 전 세계 5억 명을 연결한 소셜네트워크 페이스북의 인사이드 스토리..

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

페이스북 이펙트 - 10점
데이비드 커크패트릭 지음
임정민.임정진 옮김
에이콘출판

얼마전에 소셜네트워크 영화를 보고 꽤 많은 것을 느꼈기에 이어서 책을 집어들었습니다. 사실 이 책이 처음 나왔을 때 페이스북 이펙트라는 것이 저에게는 약간은 마케팅적인 단어로 느껴졌기에 페이스북이 어떤 영향을 끼치고 있고 그 파급력을 이용하려면 어떻게 해야 하는가에 대한 마케팅책같은 느낌이 있었습니다. 하지만 이 책은 그 부제대로 마크 주커버그가 하버드에서부터 시작해서 어떻게 페이스북을 만들고 현재까지 키워나갔는지에 대한 아주 디테일한 부분까지 다뤄주고 있는 페이스북 일대기라고 할 수 있습니다.

이 책의 저자인 데이비드 커크패트릭이 이 책을 쓰기 위해서 휴직을 할 정도로 노력한 던데 그동안 자세히 알지 못하던 페이스북의 성장에 대한 자세한 내용과 그 가운데 페이스북의 상황과 임원진들의 고민과 노력을 생생하게 전해주고 있기 때문에 매우 흥미진진하게 읽을 수 있었고 IT 혹은 창업에 관심이 있는 사람이라면 그 가운데서 많은 인사이트를 느낄 수 있는 부분이 많았습니다.

저도 페이스북은 제대로 쓰기 시작한지는 몇달정도밖에 되지 않았습니다. 사실 페이스북의 성장세는 꽤 오래전부터 바라보고 있었지만 국내에서는 아무래도 여건상 생생한 소식을 듣기 어려운 면도 있었고 지금은 국내에서도 많은 사람이 사용하지만 몇년전에도 가입해도 친구가 없으니 사이트에 들어가도 할 수 있는게 없어서 금방 지루해져서 잘 사용하지 않다가 요즘은 주변에 하는 사람이 많아져서 다시 사용하고 있습니다. 그때는 페이스북은 도데체 어떻게 사용해야 하는 걸까... 왜 인기가 좋은 것일까 하는 생각이 들었지만 지금에 와서 책도 보고 하니 꽤 많은 부분이 이해가 되었습니다. 페이스북 자체가 다른 SNS와는 다르게 오프라인의 인맥을 온라인에서 연결해주는 데 그 당초 목적이 있다 보니까 오프라인의 인맥이 페이스북에 없는 저로써는 페이스북에 정착하기가 어려웠던 것이 당연한 것이었습니다.

소셜네트워크 영화를 보면서 어렴풋이 가진 생각을 이 책에서는 많은 부분 확신이 들게 했습니다. 페이스북 이펙트에서는 에두왈도 세브린은 몇페이지 거의 나오지도 않습니다. 영화가 주커버그와 분쟁들에 대해서 집중하고 있다면 이 책은 오직 페이스북의 성장에만 관심을 가지고 있습니다. 왈도의 초기자금이 없었다면 페이스북을 시작하기가 수월치 않았을 수도 있겠지만 사실 초기자금만 제공했을 뿐 왈도와 주커버그의 마인드는 완전히 달랐습니다. 아마 왈도는 어느정도 키워서 수익 좀 내고 적당히 파는 정도에 만족하는 정도였을까 하는 생각입니다. 그리고 왈도가 뉴욕에서 변변찮은 광고만 몇개 따고 있을때 팔로알토에서 지금에 와서는 증명해낸 그 성공의 방향을 위해서 밤낮없이 노력한 주커버그나 션파커, 모스코비츠가 같은 대우를 받는게 옳다고는 생각하지 않습니다.(영화는 극적인 대비를 위해서 왈도의 주식비율을 엄청나게 하락시켰지만 책대로라면 왈도의 주식비율이 하락한 뒤에도 10%정도였습니다. 당시 모츠코비츠는 6~7%정도인것 같습니다.)


페이스북 하면 항상 주커버그만 떠올랐지만 페이스북이 그 위치까지 오는데는 정말 많은 사람이 있었습니다. 저는 개인적으로 션파커와 모스코비츠에 많은 인상을 받았습니다. 냅스터를 만든 션파커는 정말 페이스북과 주커버그 모두에게 지대한 영향을 끼쳤다고 생각하고 있고 영화보다 책에서는 션파커가 훨씬 멋지게 그려집니다. 주커버그다 벤쳐캐피탈의 투자를 최대한 피한 것이나 회사의 운영에 대한 지위를 계속 지킬수 있었던 점. 회사를 팔지 않고 성장시킬수 있었던 것 모두에 션파커가 끼친 영향력은 대단하다고 생각하고 있습니다. 또한 개발자도 아니었던 모스코비츠가 페이스북을 하버드 기숙사에서 보고 프로그래밍책을 사서 공부해서 같이 개발에 들어가서 CTO자리까지 올라가고 페이스북이 커지가 독학출신인 자신의 한계를 깨닫고 물러난 것도 참 대단한 사람이라는 생각이 들었습니다.

이 페이스북의 성장과정을 읽어가면서 그동안 좀 잊고 있었던 듯한 생각들을 많이 곱씹어보게 되었습니다. 개발자로써 또 약간은 Geek스런 성향을 가진 사람으로써 주커버그가 외치던 수익보다는 성장을 외치고 단순한 수익을 좀 내는 것 보다는 진짜 서비스를 만들고자 했던 것에 적극 동감하고 세세하게는 "광고는 쿨하지 못해"라거나 사용자의 사용성을 헤치는 광고는 거부하는 행동들은 그 사상에 공감하면서도 어느순간 상당부분 타협(?)해버린 저의 생각을 뒤돌아보게 했습니다. 물론 수익이라는 것이 나쁜 것이라는 것은 아니지만 그 둘사이에 주관을 갖지 못하고 상황에 따라 왔다갔다 하는 경향이 많이 있었는데 손만 뻗으면 상당한 수익을 가질수 있음에도 자신의 주관을 그대로 지켜나가서 결국 5억명이라는 유저를 거느리게 된 주커버그를 보면서 많은 감명을 받을 수 있었습니다.

지금은 플랫폼 시장이라는 것이 너무 자연스러워 져서 잊고있었지만 몇년전에 주커버그가 f8이라는 플랫폼을 발표했을때 "천재다"라는 생각을 했던 것이 문득 떠올랐습니다. 이런 새로운 도전들.... 저도 공감하고 있는 "경쟁이 더 나은 환경을 만든다"는 생각들이 쌓이고 모여서 현재의 페이스북이 만들어졌다고 생각합니다. 저에게 이 책은 그냥 한 성공한 회사의 성공스토리도 아니었고 성공하려면 주커버그처럼 해야된다는 가이드라인 같은 것도 아니었습니다. (물론 천재이긴 하지만) 개발자인 주커버그가 개발자적인 사상을 성공까지 만들어내는 삶의 스토리 자체로 많은 영감을 주는 책이라 읽는내내 참 재밌게 있었습니다. 안봤으면 후회할 뻔 했네요 ㅎ


My Comment..
책은 둘째치고 어서 영화를 봐야 될텐데.. 좀 받아달라고 했으니 조만간 볼 수 있겠다.. 보고나면, 나만의 감상평을 올려야겠다.. 물론, 감상평 할만한게 있을 때.. 그다지 느낀게 없다면 올리지 말아야지.. ㅎㅎㅎ..

[Book] 프로그래머의 길, 멘토에게 묻다..

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

프로그래머의 길, 멘토에게 묻다 - 10점
데이브 후버 & 애디웨일 오시나이 지음
강중빈 옮김
인사이트

처을 출간되었을때 꽤 인상깊은 제목의 책이었고 이 책에 대한 많을 글들을 보다가 이제야 읽어보았습니다. 이 책의 원제는 "Apprenticeship Patterns : Guidance for the Aspiring Software Craftsman"이고 번역서의 단어대로라면 "견습생 패턴 : 소프트웨어 장인을 열망하는 사람들을 위한 가이드라인"정도라고 할 수 있습니다. 개발자의 방향을 제시해 주는 책들로는 대표적으로 실용주의 프로그래머가 있고 사랑하지 않으면 떠나라!등의 책들도 있습니다. 이 책도 비슷한 맥락을 가지고 있지만 패턴화하고 각 패턴의 연결점들을 제시하고 있다는 점에서 큰 차이점이 있습니다.

저자의 경험적인 내용들이 묻어있고 각 패턴의 연결점을 잘 제시해 주고 있기 때문에 어렵지 않게 읽을 수 있습니다. 저자가 책의 초반에도 밝히고 있듯이 이 책이 그동안 대부분의 개발자들이 모르고 있던 내용을 제시하고 있는 것은 아닙니다. 다른 책이나 온라인을 통해서 이미 많이 알려진 방법들도 상당히 있지만 의식적으로 혹은 무의식적으로 자기발전을 위해 하던 행위들에 이름을 주고 한 패턴에서 다른 패턴으로의 진행에 대해서 설명해 줌으로써 좀더 쉽게 개발자들이 견습과정을 효율적으로 할 수 있도록 한다는 점에서 상당히 인상적이었습니다. 막연히 설명된 방법보다 같은 내용에 네이밍된 패턴을 제시함으로써 현재 제가 하고 있는 혹은 잘 못하는 일들에 대해서 구체적인 구분을 할 수 있고 쉽게 개선할 방향을 정하기 좋았습니다.

이 책이 말하는 견습생은 단순히 신입개발자만을 의미하는 것은 아닙니다. 사실 거의 모든 개발자를 대상으로 하고 있는 것이나 다름없고(초반부터 노력한다면 당연히 그 효과는 더 좋다고 생각합니다.) 그 목표점이 장인(Craftsmanship)에 대한 것이고 개발자로써 마스터의 경지로 나아가기 위한 것이라는 점에서 여기서 제시하고 있는 것들은 개발을 하면서 평생 숙지하고 따라하면서 그 효과를 볼 수 있을 꺼라고 생각합니다.

저같은 경우에는 그래도 개발을 하는 몇년동안 나름대로 개발자로써의 발전을 위해서 꽤 많은 시간을 투자했다고 생각하고 있는데 그런 부분에서 이 책이 제시하는 패턴들은 내가 했던 행위들이 그래도 방향을 잘 잡아서 하고 있구나 하는 것과 내가 잘 못하는 것들에 대해서 명확히 구분해 주는 효과가 있었습니다. 저 같은 경우에는 "가장 뒤떨어진 이가 되라", "독서목록", "마음맞는 사람들", "멘토를 찾아라", "배운 것을 기록하라", "부숴도 괜찮은 장난감", "열정을 키워라", "배운 것을 공유하라"같은 패턴들은 그래도 나름 잘 다져놓고 있었던 부분이라고 생각하고 "첫 번째 언어", "무지를 드러내라", "무지에 맞서라", "더 깊이 파고들어라"같은 패턴들은 제가 잘 못하는 부분으로 좀더 노력해야 하는 부분이라고 생각됩니다.

이 책은 말그대로 소프트웨어 장인을 위한 길을 제시하는 것이지 연봉을 높이거나 명예를 얻기위한(그게 부수적인 것이 될지라도) 길을 제시하는 책은 아닙니다. 외국도 국내와 크게 다를 것은 없는지 책에서도 개발에 대한 열정을 가지고 있는 사람이 그다지 많지 않고 또 조직 문화가 이런것을 장려하지 않고 있다는 것을 밝히고 있습니다. 때로는 사람들이 이상하게 볼 수도 있다는 것등... 책대로의 표현이라면 평균적인 프로그래머보다 나은 사람이 되는 것이 목표가 아닙니다.

저자의 경험을 토대로 하고 있기 때문인지 저로써는 많은 부분에서 고개를 끄덕이며 보았습니다. "당신이 동료들에 비해서 얼마나 더 큰 열정을 지녔는지 의식하면서 스스로 열정을 숨기고 지내게 되었다."에 대한 길을 열정을 드러내라라는 부분은 내가 조직내에서 하고있는 거의 그대로였기에 쾌 큰 공감을 가지게 되었고 저같은 경우는 알게 된것을 블로그에 적어서 공유하려고 하는 편인데 저자인 데이브는 무지를 드러내기 위해서 블로그를 사용한다는 저와는 약간 다른 관점은 꽤 인상적이었습니다. 특히 "10개짜리 눈금의 스스로 9정도라고 생각하지만 가끔을 눈금이 100까지도 가겠구나라고 깨닫게 만드는 사람들을 만난다"라는 부분에서는 저는 가끔이 아닌 자주이긴 하지만 요즘 많이 느끼는 부분이기에 특히 인상적이었습니다.

이런 방향을 제시하는 책은 너무 많이 볼 필요는 없지만 어차피 봐도 그때의 상황에 따라 받아들이는 것이 다르고 어차피 머릿속에 다 담을수는 없기 때문에 일정주기로 봐주면 내가 제대로 가고 있는지 무엇을 더 해야하는지 방향을 잡기에 좋다고 생각하는데 간만에 나중에 다시 읽어도 좋을법한 책을 만난것 같습니다.


My Comment..
책의 내용처럼 모든 것을 맞춰서 시행하고 적용할 수는 없지만, 블로그를 시작한 것처럼 내가 내 위치에서 실행할 수 있는 것들은 실행해보고, 시행착오를 겪으면서 천천히 접근하다보면 좋은 결과가 있으리라.. 


[JAVA]Spring Framework에서 SLF4J의 설정 문제..

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

간단하게 Spring MVC설정을 하려고 해서 아주 간단한 프로젝트였으므로 Spring Framework와 로깅, JUnit만으로 간단하게 구성하려고 하였으나 의존성 라이브러리 설정에서 문제를 겪으면서 잘 설정이 되지 않았습니다. 이것때문에 엄청난 삽질을 했는데 일단 해결을 하고 나니 로깅 프레임워크에 대한 지식이 전무했기 때문에 발생한 일이었습니다.(그래도 삽질 해보고 나니 어렴풋이나마 이해를 하게 되었습니다. 역시 개발은 삽질부터인가요? ㅎㅎㅎ)


Xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- Spring dependencies -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>org.springframework.spring-library</artifactId>
    <type>libd</type>
    <version>3.0.5.RELEASE</version>
    <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
            <groupId>javax.servlet</groupId>
              <artifactId>com.springsource.javax.servlet</artifactId>
        </exclusion>
    </exclusions> 
</dependency>

<!-- logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.org.apache.log4j</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.jcl</artifactId>
    <version>1.6.1</version>
</dependency>

위는 프로젝트에 제가 설정한 pom.xml의 일부입니다. SpringSource Enterprise Bundle Repository에서 Spring Framework 3.0.5.REASE 전체를 가져왔으며 로깅을 위해서 slf4j를 가져왔습니다. 결과적으로는 이상한 의존성을 끌어와 버린 것인데 왜 이런 의존성라이브러리를 가져왔냐 하면 이전에 여러번 했던 프로젝트에 있던 pom.xml을 참고했는데 그 pom.xml에 slf4j가 있었기 때문에 그대로 slf4j를 사용했던 것입니다. 사실 처음에는 앞의 com.springsource.slf4j.org.apache.log4j부분만 있었는데 제가 구성한 것에는 이상하게 LogFactory오류가 나서 그것을 해결하던 와중에 com.springsource.slf4j.jcl을 추가했던 것입니다.

여기서 사용되는 각 로깅 라이브러리에 대한 이해도가 전혀 없다 보니 그냥 문제를 해결하기 위해서 막 끼워넣다보니 위와같은 상황이 발생했고 위와 같이 의존성을 가진 상태에서 WAS를 실행시키면 서버를 실행시키다가 엄청난 랙이 걸린 후에 OutOfMemory : Java Heap Space 오류가 로깅쪽에서 발생하면서 죽어버립니다. Arawn의 도움으로 문제를 파악한 바로는 slf4j와 jcl의 바인딩이 꼬여서 인스턴스 생성이 무한루프에 빠지면서 결국 메모리 오류까지 이어지는 것으로 보입니다.

  • Log4j : Apache의 프로젝트로 Ceki Gulcu가 만든 자바기반의 로깅 유틸리티입니다.
  • JCL (Jakarta Commons Logging) : Log4j, LogKit, JDK1.4같은 다른 로킹툴에 대한 추상화 계층을 제공하는 로그 인터페이스입니다.
  • SLF4J (Simple Logging Facade for Java) : log4j나 logback, java.util.loggin같은 여러가지 로깅프레임워크를 위한 간단한 facade나 추상화를 제공합니다.

각 라이브러리의 특징을 보면 JCL과 SLF4J의 역할이 동일한 것으로 보이는데 (봄싹 메일링에 질문해보니) 저같은 경우에는 slf4j의 log4j와 jcl 바인딩을 둘 다 사용해서 문제가 된 것이었습니다.

log4j바인딩과 jcl바인딩이 모두 존재하는 의존성 그래프

slf4j 의존성 그래프를 보면 JCL에 대한 의존과 Log4j에 대한 의존성이 동시에 존재하는 것을 볼 수 있습니다.(그렇게 셋팅했으니 당연한 얘기지만요 ㅡㅡ;;)

이 부분에 대해서는 Whiteship님의 블로그에 아주 잘 정리가 되어 있습니다. 처음 봤을때는 무슨 말인지 잘 몰랐는데 좀 삽질하고 찾아보고 나니 상당히 명확해 졌습니다. JCL을 사용하던지 Log4j를 사용했어야 했던 것이었는데요. 저같은 경우에는 스프링이 JCL에 의존하고 있는 관계로 SLF4J만 가져왔을때 JCL에 대한 의존성 때문에 오류가 난 것은 해결하려고 JCL을 가져온 것이 문제였던 듯 합니다.

새로 pom.xml을 설정한 뒤의 slf4j 의존성 그래프

Whiteship님의 블로그에 나온대로 의존성을 설정하고 나면 이제 의존성 그래프가 JCL에 대한 의존성은 SLF4j가 받아주고 Log4j만 사용하도록 사용하도록 되었습니다.(아직 다 이해못해서 제대로 설명(?)한건지 잘 모르겠군요.)