기본 콘텐츠로 건너뛰기

라벨이 Tomcat인 게시물 표시

[ JAVA ] Spring + Tomcat 에서 한글 (UTF-8) 설정하기.

  스프링 프레임워크와 Tomcat을 사용하는 환경에서 한글을 UTF-8 로 처리하는 방법은 여러 가지가 존재한다. 그 중에서 일반적으로 사용할 수 있는 방법을 정리해 놓도록 한다.    우선 당연한 것이겠지만 원본 소스 코드의 문서 인코딩이 당연히 UTF-8 이어야 한다. Windows Preference 에서 Workspace의 텍스트 파일 인코딩을 UTF-8로 설정하면 된다.   Tomcat의 Server.xml 에서 Connector에 URIEncoding을 UTF-8로 설정하면 된다. ... <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" /> ...   스프링 프레임워크에서 기본적인 POST 에서 한글 처리 방식으로 Filter를 설정하면 된다. web.xml 아래와 같이 설정이 가능하다. ... <!-- 모든 Filter 들 중에서 가장 처음에 존재하여야 함 (단, String 기반의 JSON 반환에서는 적용되지 않음) --> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>enc

[ TOMCAT ] 하나의 웹 어플리케이션을 여러 개의 인스턴스로 구동해 보기 (테스트용)

  이전 게시글에서 Tomcat 수동 배포에 대해서 검토를 해 보았으니 이번에는 하나의 웹 어플리케이션을 하나의 Tomcat Engine 으로 Instance 만 여러 개를 만들어 구동하는 방법에 대해서 알아 보도록 한다. Tomcat Multiple Instance 개념   하나의 Tomcat 으로 여러 개의 인스턴스를 만들어서 사용하기 위해서는 약간의 개념(?)을 이해해야 한다. 제일 먼저 Tomcat 의 구조를 이행해야 하므로 간단하게 알아보도록 하자.   위의 그림은 Tomcat 의 기본 폴더 구조를 나타내는 것이다. 각 폴더의 의미는 다음과 같다. lib - Tomcat Engine 이 사용하는 외부 라이브러리 (*.jar) 관리 폴더 bin - Tomcat 실행/종료와 관계되는 스크립트 관리 폴더 conf - Tomcat 에 올라갈 웹 어플리케이션에 대한 설정 파일 관리 폴더 logs - Tomcat 의 로그 관리 폴더 temp - Tomcat Engine 에서 사용하는 임시 파일 폴더 webapps - 웹 어플리케이션이 배포되는 어플리케이션 관리 폴더 work - JSP 파일이 Servlet 으로 컴파일된 클래스 (*.class) 관리 폴더   폴더들이 상당히 많이 존재하지만 정작 Tomcat 만을 위해서 존재하는 폴더는 "lib" 와 "bin" 폴더 뿐이다. 따라서 웹 어플리케이션의 서비스를 운영하는데 사용되는 폴더들은 나머지 "conf", "logs", "temp", "webapps", "work" 폴더가 된다.    여기서 헷갈리지 않아야 하는 것은 어플리케이션이 하나의 인스턴스이고 인스턴스가 생성되어 실행이 되려면 하나의 JVM 에서 처리가 되어야 한다. 따라서 Multiple Instance 라고 하는 것은 결국 여러 개의 JVM을 운영하겠다는 것이고 여기에 각

[ JAVA ] JVM Shutdown 상황에서도 로그를 출력해 보자.

  현재 진행 중인 프로젝트는 Java Agent 를 이용해서 JVM 상에 구동되는 Application의 성능을 측정하기 위한 Custom Profiler를 구성하는 것이기에 Logging 정보가 상당히 중요하고, JVM Shutdown 되는 시점을 Hooking 하여 Agent 의 서비스들이 제대로 종료하는지를 검증하여야 한다.   그런데 JVM Shutdown Hooking 을 하게 되면 그 시점에 java.util.logging.LogManager 를 사용하고 있다면 Logger 들이 모두 Clear 되어 버리기 때문에 완전히 종료되는 시점까지 Logging 을 처리할 수 없다. *** 지금부터 언급하는 상황들은 java.util.logging.LogManager를 사용하는 경우에 해당하는 것이므로 다른 logging 처리를 하는 경우에는 해당되지 않는다. 다만 처리되는 상황이 궁금한 경우는 참고가 될 수도 있다. 왜? Logger 가 모두 Clear 되는 것일까?   가장 먼저 문제가 되는 LogManager를 역 추적해 보도록 하자. 우선 어플리케이션에서 JVM Shutdown 을 Hooking 하는 방법은 아래와 같다. // JVM Shutdown Hook Thread를 설정한다. Thread shutdownThread = new Thread(new Runnable() { @Override public void run() { try { LOGGER.info("JVM Shutdown called"); shutdown(); LOGGER.info("JVM Shutdown complete"); } catch (Exception e) { LOGGER.log(Level.SEVERE, "JVM Shutdown completed with errors", e);

[ TOMCAT ] 웹 어플리케이션 수동 배포 해 보기. (간략)

  개발하는 동안에 보통 Eclipse에 Servers 에 Tomcat 을 등록하고 Maven 을 이용해서 배포를 하고 사용하게 된다. 그러나 상황에 따라서는 Eclipse 를 이요하지 않고 Tomcat 에 직접 배포를 해서 테스트를 해야하는 상황이 발생하게 된다. 이 글을 작성하게 된 것도 Eclipse에서 Tomcat 를 실행하면 아무 문제 없는데 테스트 서버에 배포가 되어 실행이 되면 Tomcat 실행 중에 오류가 발생하는 것 때문에 임시로 간략하게 테스트 한 것을 정리해 놓도록 한다.   Tomcat 은 설치 버전이 아니라 Zip 배포 버전을 사용하였고, 위치는 D:\Tomcat7 이며, 웹 어플리케이션은 test-apps (프로젝트 명)라고 가정하고 테스트를 진행하도록 한다. (단, 하기의 내용은 실제 각 개발자의 환경에 따라서 다를 수 있으므로 반드시 맞는 방법이라고 할 수는 없다) 배포 대상 생성 및 복사   Eclipse에서 빌드를 하여 War 파일과 배포 폴더를 생성한다. 보통은 Eclipse에서 Maven 을 이용하여 빌드를 하게 되므로 빌드 후에 해당 프로젝트의 Target 폴더를 확인하면 War 파일과 배포 폴더가 생성된 것을 확인할 수 있다. 배포는 War 파일이 아니라 배포 폴더 (test-apps) 를 이용하도록 한다.   배포 폴더를 복사하여 Tomcat 폴더의 "webapps" 밑에 넣도록 한다. ( 보통은 WebContent / Library / Classes 들을 배포하지만, Maven 빌드릉 통해서 해당 항목들이 모두 배포 폴더와 War에 포함되어 있으므로 폴더채로 복사를 하면 된다) Context 설정 (server.xml 파일)   Tomcat 폴더 밑의 conf 폴더에 server.xml  파일이 존재한다. 이 파일에 Tomcat 이 구동되었을 때 사용할 어플리케이션 Context 를 설정해 주어야 한다. server.xml  파일을 열고 "<Host>...<

[ JAVA ] Eclipse 와 Tomcat 연동 Port 사용중이라는 오류 (특정상황 피해가기)

웹 어플리케이션을 개발할 때 Eclipse 에서 Servers 로 Tomcat을 등록해서 Web Application을 구동시키는 것이 일반적인 방법이다. 그러나 어떤 경우에는 지정한 포트가 이미 사용중이라는 오류를 만나게 될 수 있다. 이 상황을 구글에서 찾아보면 대부분의 해결 방법이 아래와 같이 제시된다. "사용중인 포트를 확인해서 사용 중인 다른 어플리케이션을 죽여라" 또는 "다른 포트로 변경해서 사용하라" C:\> netstat -ano | find "8080" C:\> taskkill /f /pid:... 일반적인 상황에서는 맞는 말이다. 그러나 제목에 언급한 것과 같이 "특정상황" 이 발생한 상황에서는 이런 해법은 전혀 도움이 되지 않는다. 여기서 말하는 특정 상황이라는 것은 Eclipse에서 Server 탭의 "Start" 버튼을 눌러서 실행을 하게 되면 다른 어플리케이션에서 사용하지 않는 포트임에도 불구하고 이미 사용중인 포트라는 오류가 발생한다는 것이다. 포트를 바꾸면 바꾼 포트가 사용중이라는 오류가 발생하게 된다. 위의 상황을 유추하면 Eclipse 가 Tomcat 구동 명령을 전달할 때 뭔가 문제가 있을 것 같다는 생각으로 해결법을 찾기 시작했지만 구글 검색을 통해서도 별다른 해결 방법을 찾지 못하고 있었다. 이런 상황에서는 대략 아래와 같은 특징들이 발생한다. 포트를 바꿔도 바뀐 포트로 사용중이라는 오류가 발생한다. Debug 모드로 실행하면 제대로 실행되는 경우가 있다. (그러나 Start 로 실행하면 오류가 발생한다) 처음 시스템을 부팅하고 JDK를 재 설치를 한 후에 Eclipse를 실행하면 제대로 실행된다. 단, 재 부팅하고 나면 다시 오류가 발생한다. (이 상황은 이해가 되지 않는다 ㅠㅠ) 더 많은 상황들이 존재하지만 딱히 연관되어 있다고 볼 수는 없기 때문에 생략하도록 한다. 위의 특징들 때문에

[ JAVA ] Tomcat 에서 Sessions.ser (지정된 경로를 찾을 수 없습니다) 오류가 발생하는 경우.

현재 진행 중인 프로젝트에서 불특정하게 IOException이 발생하며 Session이 깨지는 증상이 있어서 로그를 확인해 보니 Sessions.ser 파일이 존재하는 폴더가 없는 문제가 발생하고 있었다. 대 부분 Eclilpse에서 서버를 운영하므로 해당 서버에서 server.xml 을 열고 다음과 같이 Context 내에 PersistentManager를 지정하면 해당 문제가 해결된다는 것이 구글에 많이 올라와 있다. <Context ...> <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/> </Context> 현재는 설정 후 동일 증상 발생여부를 확인하고 있다.

[ JAVA ] Spring Framework 설정하기.

  대표적인 프레임워크인 Spring Framework 을 자바환경에서 설정하는 방법을 정리해 보도록 한다. 실제로 구성해 본 적이 없기 때문에 자바 개발 초보의 입장에서 진행하도록 한다.   가장 먼저 할 작업은 이클립스를 설치하는 것이다. 이 글을 쓰는 시점에는 Eclipse Kepler JEE 버전을 사용하고 있다. 그러나 여러 가지 프로젝트를 구성하려고 한다면 JEE 버전의 이클립스를 사용하는 것이 좋다. 물론 다른 버전이라도 상관이 없을 듯 하다. (단지, 지원되지 않는 프로젝트 템플릿이 있다면 추가로 설정해야 하고 필요한 것들을 설치해야 하는 수고가 따른다. 근데 버전이 굉장히 많구나.. -_-) 설치가 다 되어 환경 설정이 끝난 상태라면 이클립스를 실행하도록 한다. Install Spring IDE Plugin   실행된 이클립스에서 아래와 같이 새로운 소프트웨어 설치 메뉴를 실행하도록 한다.   아래와 같이 열린 "설치" 다이얼로그 화면에서 "Work with" 항목에 있는 "Add" 버튼을 누른다. 다른 옵션들은 별도로 변경하지 않는다.   열린 "Add Repository" 다이얼로그 화면에서 아래와 같이 Name 과 Location 값을 입력한다.   "OK" 버튼을 누르면 지정한 정보에 속하는 활용 가능한 플러그인 목록이 보여지게 된다. 아래와 같이 기본적인 선택을 하도록 한다. (Integrations / Spring IDE, Uncategorized 를 선택하지 않는 이유는 선행 설치가 필요한 다른 플러그인을 요구하며, 현재로서는 그다지 큰 필요가 없기 때문이다. 향후에 다시 설치가 가능하다)   "Next" 버튼을 누르면 아래의 그림과 같이 설치될 내용이 보여지게 된다.   위의 설치 목록을 보면 "Will not be installed" 와 &quo