자바 커뮤니티 공동 3 세미나

자바 개발자를 위한 ‘共感(공감)을 찾아서 세번째

 

지난 2 세미나에 이어서 OKJSP, JBoss User Group, KSUG 공동 주최하고,

한국어도비시스템즈가 후원하는 자바 개발자를 위한개발 공감’ 세번째 세미나가

진행됩니다. 최근 IT 업계를 선도적으로 이끌어 가고 있는 모바일과 시장에서 차별화된

전략을 갖추실 있는 유용한 기술과 정보들을 자리에서 들으실 있는 기회입니다.

특별히, T스토어 주최 안드로이드 앱 공모전에서 금상을 수상한 블투맞고’ 개발자이신

김재철님을 초대하여 개발자 여러분과 함께할 수 있는 공감 세션을 마련했습니다.

 


행사 안내



 


AGENDA




특별 경품


5분께 화제의 서적 '안드로이드 프로그래밍 정복(김상형 저)'을 드립니다.



등록 : http://adoberia.co.kr/iwt/blog/blog.php?tn=flex&id=540


Java Spring Framework를 활용하는데 발생한 문제이다.  

@Controller 어노테이션을 가지고 한글과 영어가 섞인 문자열을 반환하기 위해 @ResponseBody 어노테이션을 이용해 다음과 같이 코딩했다. 

 

@Controller
@RequestMapping("/foo")
public class Foo {
    @RequestMapping(value="/foobar", method=RequestMethod.GET)
    @ResponseBody
    public string getFoobar() {
      // Do something that returns some UTF-8 stuff (probably some XML).
    }
}

 

그리고 문자 인코딩 필터 설정을 아래와 같이 했다. 

 

<filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
</filter>

<filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

 

 

하지만 위 설정은 Request에 대해서만 CharacterEncodingFilter가 먹힌다고 한다. 그래서 Response에 대해서도 UTF-8이 될 수 있도록 설정할 필요가 있다.

 

<bean  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
   <property name="messageConverters">
      <list>
         <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
            <property name = "supportedMediaTypes">
               <list>
                  <value>text/plain;charset=UTF-8</value>
               </list>
            </property>
         </bean>
      </list>
   </property>
</bean>

 

위 설정은 @Controller에서 @ResponseBody로 지정시 반환값에 한글이 있으면 깨지는 현상을 방지하기 위해 사용한다.

 

명확히 이해하고 사용하는 건지 모르겠지만 분명 저렇게 하면 한글이 안깨지고 잘 반환한다.

 

참고글 

1. https://issues.springsource.org/browse/SPR-6443

2. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/filter/CharacterEncodingFilter.html

3. http://dev.firnow.com/course/3_program/java/javajs/20100719/455191.html

 

글쓴이 : 지돌스타(http://blog.jidolstar.com/700)  

이 글은 JPetStore라는 간단한 쇼핑몰 웹애플리케이션을 Eclipse에서 테스트하기 위한 방법을 소개한다. JPetStore는 원래  MS에서 소개된 샘플이나 나중에 java진영에 컨버팅되면서 더 유명해진듯 하다. 그러므로 JPetStore는 java만을 위한 것이 아님을 알고 접근하는 것이 좋겠다.

Spring Framework에 번들로 제공하는 JPetStore샘플은 Spring을 학습하는데 많이 유용하다. Spring 서적을 통해 학습한 내용을 실습한다는 차원에서 접근하면 좋겠다. Spring framework 2.5iBatis로 구성된 예제를 참고했다.

Eclipse 갈릴레오(JEE), JDK 1.6.0.18, Tomcat 6.0 , MySQL 5.0, Window 7 환경에서 테스트했음을 밝힌다. 즉, 이들 환경을 구축하는 방법은 모두 생략한다.


1. Spring 2.5 버전을 다운로드
현재 Spring 3.0 버전이 배포되고 있지만 JPetStore의 경우 2.5버전에만 있다. 다운로드 받을때는 2.5 최상위 버전을 다운로드 받되 뒤에 dependencies가 붙은 압축파일을 받도록 하자. 이 압축파일은 spring 2.5에 의존하는 lib나 예제들이 수록되어 있다. JPetStore 샘플도 여기에 있다.



다운로드 받으러 가기 : http://www.springsource.com/download/community

위 주소로 접속하면 첫화면에서 개인정보를 넣으라고 할것이다. 그냥 무시하고 download page 링크를 찾아 클릭하길 바란다. 다운로드를 완료하면 아무데나 압축을 풀면 되겠다.


2. 배포파일(war) 만들기
다운로드를 받아 samples/jpetstore 로 들어가면 아래와 같은 폴더 및 파일을 볼 수 있다.

원래는 ANT를 설치한 상태에서 ANT 스크립트를 담은 build.xml 만을 이용해 내부에 있는 명령인 "clean", "build", "warfile" 명령들을 이용해 최종배포파일인 war파일을 만들 수 있다. 하지만 그렇게 하면 많은 부분 불편하므로 spring 배포자가 이와 더불어 warfile.bat와 build.bat를 추가해서 ANT 환경을 구축해야하는 번거로움을 없애줬다. warfile.bat만 더블클릭으로 실행하면 자동으로 war를 만들어준다.

warfile.bat 구조은 다음과 같다.
build.bat warfile

이것은 위 build.bat를 실행하고 "warfile" ANT 스크립트 명령을 실행하는 것을 의미한다.

build.bat 내용은 다음과 같다.
"%JAVA_HOME%/bin/java" -cp ../../lib/ant/ant.jar;../../lib/ant/ant-launcher.jar;"%JAVA_HOME%/lib/tools.jar" org.apache.tools.ant.Main %1

build.bat는 JDK 설치경로에 ANT관련 jar를 복사해서 ANT를 실행할 수 있도록 해주는 것이 주 목표인것이다. 마지막에 org.apache.tools.ant.Main %1은 1개의 parameter를 받아 실행하겠다는 의미이다. 결국 %1이 warfile.bat의 "warfile" 문자열로 대체되어 build.xml의 warfile명령을 실행하도록 하는 것을 의미한다.

이제 warfile.bat만 두번 클릭해서 실행하면 된다. 혹시 제대로 실행이 되지 않을지도 모른다. 이것은 JDK 경로 설정이 잘못되었기 때문인데 build.bat에 자신의 JDK 경로를 아래와 같이 추가해보고 warfile.bat를 재실행해보길 바란다.

set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_18
"%JAVA_HOME%/bin/java" -cp ../../lib/ant/ant.jar;../../lib/ant/ant-launcher.jar;"%JAVA_HOME%/lib/tools.jar" org.apache.tools.ant.Main %

이제 %JAVA_HOME% 변수를 제대로 설정했기 때문에 이제 war파일을 제대로 만들 수 있게 된다.

만약 모두 지우고 war를 새로 만들고 싶다면 warfile.bat에서 warfile을 all로 수정하자.
build.bat all

이 모든과정을 이해하기 위해 build.xml에 있는 ANT 스크립트를 한번 훑어보는 것을 추천한다.

모든 과정을 마쳤다면 다음과 같이 .classes, dist 폴더가 추가되었을 것이다.


dist 폴더로 들어가면 jpetstore.war가 있다. 또한 war/WEB-INF/lib가 생성되어 그안에 필요한 jar가 복사된 것도 확인하자.


3. Eclipse에서 프로젝트 만들기

2가지 방법중 하나만 사용하면 되겠다. 먼저 Eclipse를 실행하기 바란다.


3.1. Web Project를 직접 만들기
File > New > New Project로 들어가 아래처럼 Dynamic Web Project를 선택한뒤 Next 버튼을 누른다.



Project name으로 jpetstore를 입력하고 Target runtime은 Tomcat 6.0을 선택하면 되겠다. Finish 버튼을 누른다.

2번 항목에서 samples/jpetstore 폴더로 가서 src와 war 내에 있는 파일을 각각 복사해 Eclipse내에 생성된 src와 WebContent 폴더에 파일을 복사한다.



3.2 war파일을 이용해서 프로젝트 만들기

이것은 3.1 방법외에 또 다른 방법이다.

2번 항목에서 samples/jpetstore/dist 폴더가 생성되었고 그 안에 jpetstore.war 를 생성했었다. 이것을 이용해 프로젝트를 생성한다. 이클립스에서 File > Import 를 들어가 아래처럼 WAR file을 선택한다.


아래 그림처럼 WAR file 경로(samples/jpetstore/dist)를 찾아 jpetstore.war를 선택하고 web project 이름과 target runtime을 설정한다. Finish 버튼을 누른다.


이렇게 프로젝트를 생성하면 src에는 아무것도 없다. 이 상태에서 실행해도 되지만 실제로 우리는 이클립스라는 개발툴을 활용하고 있으므로 java소스도 가져와야겠다. 그러므로 samples/jpetstore/src 에 있는 내용을 프로젝트의 src에 복사하도록 하자. Project Explorer에는 다음처럼 보여야 하겠다.



4. 실행해보기
3번 항목으로부터 만들어진 프로젝트는 이제 테스트해볼 수 있는 준비가 마련되었다.

이클립스에서 Window > Show View > Other 를 선택하면 아래와 같은 창이 나오고 거기서 Server를 선택한다.


이클립스 View 창에 아래처럼 Servers가 추가되어 있는 것을 확인할 수 있을 것이다. 테스트할 서버를 추가하자. 먼저 빈공간에 오른쪽 버튼을 눌러 New>Server를 선택한다.

아래와 같은 창이 나오면 Tomcat v6.0 Server를 선택한다.(필자는 Tomcat 6.0이 이미 설치되어 있으므로...) Next를 누른다.


다음과 같은 창이 나오면 우리가 만든 jpetstore 프로젝트가 왼쪽에 나오는데 이것을 선택한뒤 Add> 버튼을 눌러 Configured 부분에 추가한다. 이로써 우리 프로젝트는 Tomcat 서버위에서 하나의 웹애플리케이션으로 동작할 수 있게 된다. Finish 버튼을 누른다.


만들어진 서버에 jpetstore가 올라가 있음을 아래처럼 Servers View에서 확인할 수 있다. 이제 아래 그림처럼 실행버튼을 눌러 서버를 실행한다. 단, Tomcat 서버가 이미 실행되고 있으면 중지시킨뒤 해야하겠다.


참고로 필자는 서버 설정시 Ports를 80으로 지정한뒤 실행했다.



http://localhost/jpetstore 를 웹브라우저 주소창에 넣으면 아래와 같은 화면을 볼 수 있겠다. 만약 Ports가 8080이면 http://localhost:8080/jpetstore로 접속하자. 내용을 보면 이 jpetstore 애플리케이션은 Spring과 iBatis로 만들어졌음을 보여주고 있다. Enter the Store 버튼을 누르면 실제 Store로 입장할 수 있게 된다.


5. 데이타베이스(MySQL)과 연동
아직 설정이 완료된 것은 아니다. 데이타 베이스 설정이 남아 있기 때문이다. JPetStore의 이곳저곳 들어가보면 MySQL 접속문제로 에러가 발생하는 것을 알 수 있을 것이다.

Spring Framework는 데이터베이스와의 연동을 위한 ORM(Object-Relation Mapping)을 지원하여 iBatis, Hibernate, JPA와 같은 영속성 프레임워크와 연동을 지원한다. 본 JPetStore는 그중에 iBatis를 이용하게 된다. 근간으로는 모두 JDBC와 같은 추상층을 사용하기 때문에 DB종류에 상관없이 간단한 프로퍼티 설정만으로 DB접속이 가능하며 JPetStore 예제는 hsqldb, mysql, oracle, postgres로 테스트 할 수 있도록 하고 있다.

필자는 많은 DB중에 MySQL 환경이 이미 구축되어 있으므로 이것을 사용하도록 하겠다. 다른 DB도 거의 비슷하므로 따로 설명은 필요 없겠다.


5.1 JDBC MySQL 드라이버 설치

MySQL 데이타베이스에 접근하기 위해 JDBC 드라이버를 다운로드 받아 프로젝트내에 포함시켜야 한다. 먼저 아래 링크에서 다운로드 받자.

http://dev.mysql.com/downloads/connector/j/

압축을 푼 뒤, mysql_connector_java 로 시작하는 jar 파일이 존재할 것이다. 이것은 프로젝트 내에 WebContent/WEB-INF/lib에 복사한다. 여기서 lib는 JPetStore를 동작시키기 위한 프레임워크 및 라이브러리 jar가 포함되어 있다. Spring, iBatis도 있는 것을 확인하자.



5.2 MySQL 계정정보 설정
프로젝트내 WebContent/WEB-INF/jdbc.properties 는 JDBC 접속정보를 설정할 수 있도록 되어 있다.

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpetstore
jdbc.username=jidolstar
jdbc.password=mypassword

위와 같은 설정은 5.1 항목에서 추가한 mysql driver에서 제공하는 MySQL 드라이버 클래스 사용한다는 것을 지정하고 있다. 또한 url, username, password를 설정하고 있다. 3306는 데이타 베이스 접속하기 위한 기본 포트번호 이며 그 뒤에 붙은 jpetstore는 접속할 DB 명이다. 그러므로 이들 정보는 필요에 따라서 수정해서 사용하면 되겠다.

5.3 MySQL DB를 만들고 테이블 생성
다운로드 받은 Spring Framework 폴더에 samples/jpetstore/db에 들어가면 총 4가지 자동 테이블 생성 코드가 있다. 여기서 mysql 폴더에 sql문이 존재한다.


먼저 MySQL에 "jpetstore" 이름을 가진 DB를 먼저 만든다.  jpetstore-mysql-schema.sql 을 열어보면 use jpetstore 부분이 맨 처음에 있다. 만약 DB 이름이 다른 이름을 가진다면 jpetstore 대신 다른 이름을 넣으면 되겠다. 그런 다음 위 두개의 sql 파일을 이용해 콘솔창에서 다음과 같이 해당 DB에 테이블과 데이터를 넣을 수 있다.
> mysql -uroot -p < jpetstore-mysql-schema.sql
Enter password: ***********
> mysql -uroot -p < jpetstore-mysql-dataload.sql
Enter password: ***********

물론 MySQL을 위한 클라이언트 애플리케이션(SQLGate나 SQLyog등)을 사용해도 되겠다.

이제 JPetStore는 모든 페이지에서 제대로 동작하게 될 것이다. 이를 이용해 Spring과 iBatis에 대해 공부하면 되겠다.

참고글

글쓴이 : 지돌스타(http://blog.jidolstar.com/688)

AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)는 OOP(Object Oriented Programming)의 한계를 극복하는데 매우 좋은 개념이다.

[출처]Toby's Epril : http://toby.epril.com


위 그림은 AOP 예를 간단히 보여주고 있다. 계좌이체, 입출금, 이자계산을 담당하는 Class는 핵심모듈로 구분된다. 보안, 로깅, 트렌젝션과 같은 것은 핵심을 보조하는 횡단모듈로 구분된다. OOP만으로 하다보면 핵심안에 횡단이 섞이는 현상이 발생하기 쉽다. 가령, 로깅기능이 계좌,입출금,이자계산에 모두 섞여서 나중에 유지보수 및 확장성이 매우 힘들게 된다. 그 예로, 핵심기능에 문제가 발생했을때 관리자에게 문자로 메시지를 보내는 기능도 포함한다고 하자. 그럼 핵심기능에 문자라는 횡단기능을 추가해서 더 복잡해지는 상황이 발생한다. AOP는 이러한 문제를 깔끔하게 해결해준다. 그러니깐 핵심모듈 Class내에 횡단모듈 Class가 섞이지 않도록 하는 것이 AOP의 핵심이다라고 할 수 있다. 일종의 Class 단일책임의 원칙을 실현할 수 있다.

Java 진영에서 엔터프라이즈급 웹애플리케이션을 제작하면서 AOP 개념을 사용하지 않고서는 확장/유지보수이 매우 어려울지 모른다. Spring framework는 AOP를 지원함으로서 보다 좋은 확장성과 유지보수의 유용성을 보장한다. 또한 다른 클래스에 대한 의존성 없는 클래스 제작이 좋아져 보다 완벽한 단위테스트가 가능해지는 장점도 있다.

.net 계열에서는 Spring.NET에서 AOP를 지원해준다.

하지만 AOP가 장점만 있지는 않을 것이다. 필연적으로 Proxy개념을 도입해 기존 클래스를 감싸서 다른 클래스와의 의존성을 더해주는 형태이므로 속도적인 측면에서 이득은 별로 없다.
AOP는 컴파일, 클래스 로딩, 런타임 3가지 형태로 적용(이 과정을 Weaving이라 함)하는 방법이 있다. 자바 Spring AOP는 Proxy개념을 도입하기 때문에 런타임시 기존 클래스를 감싸서 다른 클래스와의 의존성을 더해주는 형태이므로 속도적인 측면에서는 이득이 별로 없을 수 있지만 장점이 더 많기 때문에 잘 사용된다.

AOP에 대한 개념을 알기 위해 다음 글들이 매우 좋은 것 같다. 참고 바란다.


Java 진영에서 Spring Framework로 AOP에 관심을 가지면 다음 링크 정도는 알고 있어야 하지 않을까 생각한다.


다음글은 Spring 을 통한 AOP를 개발하기 위한 참고 글들이다. 좋은 참고가 될 것이다.


간단한 테스트를 하려면 Eclipse에 AJDT, SpringIDE를 설치하고 아래 소스로 감각을 익힐 수 있지 않을까 생각한다. 소스는 원래 http://whiteship.me/1173 의 소스를 약간 변경한것이다. Spring Framework 3.0을 다운받아 사용했다.


Eclipse에서 Java Project를 만들고 그 프로젝트에 Import 시켜서 테스트 하면 되겠다. 단, SpringAOPAspectJ는 반드시 AJDT 플러그인이 설치되어 있어야 컴파일/실행이 가능하겠다.

AOP는 웹애플리케이션에서는 큰 이득이 있겠으나 일반 애플리케이션에서는 속도 및 용량 측면에서 이득보다 실이 더 많을 수 있을지 모르겠다는 판단이 든다. 더 공부해 봐야겠다.

글쓴이 : 지돌스타(http://blog.jidolstar.com/687)

+ Recent posts