달력

52024  이전 다음

  • 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
Apache와 Tomcat을 연동하기 위해서는 보통 mod_jk나 proxy_ajp 를 사용하는 두가지 방법이 있습니다.
회사에서는 mod_jk를 주로 사용합니다. 실제로 아직은 mod_jk 방법을 권장하고 있기는 합니다. 이유는 다양한 옵션이 있다는 것이죠. 하지만 mod_jk의 다양한 옵션을 사용해서 튜닝을 하는 경우가 아니라면 제가 볼때는 비슷합니다.

  1. Windows에서 mod_jk를 이용해서 Apache, Tomcat 연동하기 - Windows에서 mod_jk를 이용해서 Apache, Tomcat 연동하기
  2. Linux에서 mod_jk를 이용해서 Apache, Tomcat 연동하기 - Linux에서 mod_jk를 이용해서 Apache, Tomcat 연동하기
  3. Windows에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기 - Windows에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기
  4. Linux에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기 - Linux에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기

방법간에 차이가 크지 않지만 아무래도 방법과 OS간의 차이가 조금씩은 있어서 정리해둡니다.
mod_jk와 proxy_ajp방식의 성능차를 비교했던 자료가 있었는데 개인적인 실수로 지워져 버려 올리지 못하는건 아쉽네요. ^^

'환경' 카테고리의 다른 글

[메모] svn ignore 제거하기  (0) 2009.01.19
[메모] 405 Method Not Allowed 에러..  (0) 2009.01.19
[xml] xml을 가지고 쉽게 xsd생성하기  (0) 2008.07.04
[팁] 키보드 비프음 없애기  (0) 2008.06.28
[AppFuse] FAQ에서 몇가지..  (0) 2008.06.28
Posted by fromm0
|
위키 정비를 하면서 그동안 미뤄뒀던 자료 보강을 계획하고 있습니다.
위키에 옮기지는 않았지만 문서로 만들어뒀던 자료가 좀 있거든요..

먼저 올린 자료는 "Jersey로 RESTful 웹서비스 구현하기" 입니다.
일단 간단한 설명과 소스만 올려두었습니다. 특별히 복잡할게 없어서 주절주절 설명을 달아놓지는 않았으나 참고하는데 무리는 없으리라 생각됩니다.


질문은 이 글에 해주시면 됩니다.

Posted by fromm0
|
업무적인 요건사항도 있거니와 기존에 API를 처리하던 방법에 내심 비효율적이라는 생각이 많아서 최근 다른 것들과 더불어 RESTful 웹서비스를 보고 있습니다.

◈ 기존에 API를 위해 사용했던 방식
  1. SOAP기반의 웹서비스로 처리
  2. 단순히 webwork와 같은 프레임워크를 사용하여 필요시 XStream과 같은 라이브러리로 xml이나 json으로 데이터를 변환해서 처리

1번의 경우 xml형태의 처리는 가능하나 json형태는 방법이 없는 것으로 알고 있습니다. 그리고 간혹 느끼지만 어려운 부분이 많기도 하구요.
2번의 방식은 라이브러리를 사용하기는 하나 처음부터 끝까지 개발자가 다 만져야 하고 경우에 따라 각각의 API가 통일성이 없을수 있습니다.

RESTful 웹서비스를 구현하기 위해서 자바에서는 Jersey를 사용하면 굉장히 쉽게 구현이 가능합니다.
공부하기 시작한 것이긴 하지만 가장 간단하게 구현하는 방법을 살펴보겠습니다.

web.xml 파일 수정
<?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>rest</display-name>
    <servlet>
        <servlet-name>JerseyWebApplication</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JerseyWebApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

먼저 개발환경을 보면 JDK는 1.6.0_10 이고 tomcat은 6.0.18 입니다.
Jersey를 사용할때 web.xml 파일에 추가되는 항목은 servlet와 servlet-mapping 두가지입니다.

데이터를 담을 bean 생성하기
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")
public class Person {
    private String id = "";
    private String name = "";
    private List<Family> familyList = null;

    .... 각각의 getter와 setter메서드

}

public class Family {
    private String name = "";
    private String relation = "";

    .... 각각의 getter와 setter메서드

}

xml형태로 응답하는 RESTful
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import openframework.common.model.Family;
import openframework.common.model.Person;

import com.sun.jersey.spi.resource.Singleton;

@Singleton
@Path("/person")
public class PersonBean {
    @GET
    @Produces("text/xml")
    public Person getPersonMessage() {
        Person person = new Person();
        person.setId("123");
        person.setName("TEST");

        Family family = new Family();
        family.setName("ttt");
        family.setRelation("형");
        List<Family> familyList = new ArrayList<Family>();
        familyList.add(family);
        person.setFamilyList(familyList);

        return person;
    }
}

JSON형태로 응답하는 RESTful
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import openframework.common.model.Family;
import openframework.common.model.Person;

import com.sun.jersey.spi.resource.Singleton;

@Singleton
@Path("/person")
public class PersonBean {
    @GET
   @Produces("application/json")
    public Person getPersonMessage() {
        Person person = new Person();
        person.setId("123");
        person.setName("TEST");

        Family family = new Family();
        family.setName("ttt");
        family.setRelation("형");
        List<Family> familyList = new ArrayList<Family>();
        familyList.add(family);
        person.setFamilyList(familyList);

        return person;
    }
}

응답을 xml로 하느냐 json으로 하느냐가 영향을 끼치는 것은 사실 @Produces 라는 애노테이션 부분밖에 없습니다. 그외 로직적인 부분은 모두 동일합니다.
실제 응답 메시지를 보면 다음과 같습니다.

☞ XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <familyList>
        <name>ttt</name>
        <relation>형</relation>
    </familyList>
    <id>123</id>
    <name>TEST</name>
</person>

☞ JSON
{"familyList":{"name":"ttt","relation":"형"},"id":"123","name":"TEST"}


테스트에 사용한 소스
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class Test {
    public static void main(String[] args) {
        URL url = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        try {
            url = new URL("http://localhost:8080/rest/person");
            isr = new InputStreamReader(url.openStream());
            br = new BufferedReader(isr);
           
            while( br.ready() ){
                System.out.println(br.readLine());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

필요한 jar파일들

위 파일은 jersey 홈페이지인 http://jersey.dev.java.net/ 에서 모두 받을 수 있습니다.
실제 위 예제는 가장 간단한 형태로 업무에 사용하기 위해서는 좀더 많은 것을 고려해야 하고 적용해야 합니다.

앞으로 조금씩 내용을 보충하도록 하겠습니다.
기술적인 것도 기술적인 것이지만 REST라는 개념에 대해서도 좀더 공부를 해야 겠습니다. ^^
Posted by fromm0
|
최근 업무상 XML을 다루는 일이 조금씩 잦아지고 있습니다.
당장 필요한 것이 XML스키마 파일에서 자바빈을 추출하는 일인데요.. JAXB라는 기술이 있군요. JDK 1.6에는 기본적으로 포함되어 있는 API입니다.

단 제가 필요한 기능은 앞서 언급했듯이 XML 스키마에서 자바빈을 추출하는 거라 실제로 필요한 것은 xjc 라는 바인딩 컴파일러입니다. 이 툴은 http://java.sun.com 에서 배포하는 Java Web Services Developer Pack 에 포함되어 있습니다.

Java Web Services Developer Pack은 http://java.sun.com/webservices/downloads/webservicespack.html 에서 다운로드 가능합니다. 설치하면 다음과 같은 형태의 디렉토리를 보여줍니다.

명령창에서 다음 명령어로 실행하면 됩니다.
xjc -p <target_package> -d <dir> <스미카파일명>

JAXB 프로젝트 페이지인 https://jaxb.dev.java.net/ 에 좀더 쉽게 처리할 수 있도록 eclipse 플러그인을 제공합니다. eclipse 플러그인 페이지는 https://jaxb-workshop.dev.java.net/plugins/eclipse/xjc-plugin.html 입니다.
아직 eclipse 의 Update Manager용 URL로 설치하는 방식이 아닌 단순 배포방식으로 설치해야 하지만 제가 필요한 자바빈 추출기능은 문제없이 사용됩니다. ^^

■ eclipse의 JAXB메뉴

■ 파일을 생성할 디렉터리와 추출시 사용할 패키지 정보를 입력

■ 기타 옵션 셋팅

■ 생성된 소스의 대략적인 형태

▶ 참고 URL
1. http://kr.sun.com/developers/techtips/e2004_1221.html


Posted by fromm0
|
Spring 2.5.6과 JUnit 4.5 로 테스트 코드를 작성할 때 테스트를 실행할 때 다음과 같은 에러가 발생합니다.

java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:240)
    at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
    at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:54)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:52)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)

제가 사용한 JUnit 의 jar파일은 junit-4.5.jar 인데 이 파일을 사용하면 발생한다는 군요.
이 에러를 해결하기 위해서는 JUnit 4.4를 사용하시거나 junit-dep-4.5.jar 파일을 사용해야 합니다.

● 참고 : http://jira.springframework.org/browse/SPR-5145

Posted by fromm0
|

[eclipse] 시작시 에러

자바 2008. 11. 23. 22:25

eclipse를 사용하다보면 특별히 바꾼것도 없는데 위처럼 시작시 위처럼 에러가 발생하는 경우가 있다.
대부분 검색해서 문제를 해결하곤 했는데, 역시 정리를 해두지 않으니 자주자주 검색을 해야 된다..

eclipse.ini 파일을 열어보면 대개 다음과 같다.

-vmargs
-Dosgi.requiredJavaVersion=1.5

다음처럼 변경해주면 된다.

-vm
D:\MyLucy\Java\jdk1.6.0_10\bin\javaw.exe
-Dosgi.requiredJavaVersion=1.5


Posted by fromm0
|
Ganymede에 Subversive설치하기 위해서는 다른 플러그인과는 조금 다르게 두군데에서 파일을 받아야 합니다.
Subversive가 eclipse 프로젝트로 등록은 되어 있으나 사용하는 SVN connector가 라이센스 문제로 아직 eclipse 사이트에서 받을 수가 없기 때문입니다.

eclipse의 Subversive프로젝트의 다운로드 페이지는 http://www.eclipse.org/subversive/downloads.php 입니다.
Subversive가 eclipse 하위 프로젝트라 Help > Software Updates... > Available Software > Ganymede > Collaboration Tools 에서 선택가능합니다.

SVN Connector 는 http://www.polarion.com/products/svn/subversive.php?src=eclipseproject 페이지를 보시면 Update Manager 를 통해 http://www.polarion.org/projects/subversive/download/eclipse/2.0/ganymede-site/http://www.polarion.org/projects/subversive/download/eclipse/2.0/ganymede-site/ 를 추가해서 받으시면 됩니다.


Posted by fromm0
|
제가 운영하는 위키는 jspwiki 엔진을 사용합니다.
현재 사용중인 버전이 2.6.3인데.. 최근에 2.8버전이 릴리즈되었네요..

기존버전과의 차이점이라고 하면 UI 부분에 많은 개선이 있어 보입니다.
기존에는 소스코드를 표현하기 위해 별도의 플러그인을 설치했었는데.. 2.8에서는 아에 기본적으로 스타일(%%prettify)을 제공하고 있습니다.

최근 저희회사에 오픈소스 지원을 해주는 부분이 있어 현재 신청을 해둔 상태인데, 호스팅을 지원받게 될 것으로 보입니다. 만약 호스팅을 실제로 지원받게 된다면 2.8을 셋팅해서 올려야 되겠습니다.

  1. 2.8에서 새로운 사항
  2. jspwiki 에서 제공하는 각종 스타일

Posted by fromm0
|
꽤 오래전(메일을 보니 올해 2월) EasyMock 문서를 번역해서 링크를 등록해달라고 요청한 적이 있었습니다.
2월이니 꽤나 오래전 일인데.. 오늘. 답장이 왔네요..

Hello DongGuk Lee,
sorry that it took so long. I have added your translation to the website.
Thanks,
Tammo Freese

EasyMock 홈페이지 들어가보면 아래처럼 링크를 볼 수 있습니다.
페이지 URL은 http://www.easymock.org/EasyMock2_3_Documentation_ko.html 입니다.


제 위키에 걸어놨던 링크는 http://openframework.or.kr/framework_reference/easymock/2.3/Documentation_ko.html 입니다.

Posted by fromm0
|
bean에 특별히 toString()메서드를 구현하지 않을때 디버깅을 실시하면 대개 아래와 같이 표현됩니다.


특별한 경우가 아니라면 person옆의 + 를 클릭하면 실제 변수들에 할당된 값을 보여주기 때문에 어려움은 없습니다만 Expressions에 등록된 값들이 많은 경우에는 아무래도 + 를 펼쳐보기가 귀찮은게 사실입니다.
많은 개발자들이 toString() 메소드를 구현해서 본인만의 형식으로 보기도 하지만 직접 toString() 을 구현하지 않는 개발자도 많죠.


Preferences에서 Java > Debug > Detail Formatters 를 선택하시면 위와 같은 화면이 나옵니다.
아래처럼 클래스는 선택하고 본인만의 toString() 메소드를 구현할수 있습니다. 물론 소스에 직접 적용하지는 않습니다.


다시 디버깅을 해보면 아래처럼 나옵니다. 소스에 별다른 영향없이 본인이 원하는 형태로 toString()를 구현할 수 있습니다. 장점이 있을지.. 그다지 필요없는 기능일지는.. 알아서 판단하시길.. ^^


Posted by fromm0
|