메이븐 멀티모듈 프로젝트로 개발을 하게 되면 jar 또는 war와 같은 형태로 서브 모듈을 구성하게 된다. jar 파일에는 대게 공통적으로 사용되는 java 코드들을 몰아 넣고, 메이븐 빌드 시 war 프로젝트의 WEB-INF/lib 디렉토리에 배포하여 사용되어지는데 jsp, css, js 같은 파일들도 이와 같이 사용하기 위해서는 어떻게 해야 하는지에 대해서 찾아보았다. 방법은 간단하다. (servlet 3.0에서만 가능)다음과 같이 META-INF 하위에 resources 디렉토리를 생성한 후 그 안에 여러 프로젝트에서 공유할 resource를 추가해 주면 된다.META-INF/resources/image/test.pngMETA-INF/resources/css/test.cssMETA-INF/resou..
javascript 라이브러리를 가져다가 이클립스 프로젝트에 추가하게 되면 프로젝트에 빨간 X 표가 들어오는 경우가 있다.물론 큰 문제가 되지는 않지만 이 빨간 X 표시로 인하여 java 파일에 오류가 있는지 확인을 못하는 경우가 있다.확인을 하지 못하는 이유는 이미 내 프로젝트에 javascript로 인하여 빨간 X표시가 나는 것을 당연하게 받아들이고 있는 상태이고, 어느 순간 Java파일에 에러가 발생하는 경우 이를 인지하지 못하는 상황이 발생하기 때문이다. 이로 인하여 서버가 구동이 안 되거나 잘못된 Java 파일을 commit 하는 경우가 발생할지도 모른다.그렇기에 javascript로 인하여 발생되는 빨간 X 표시는 가급적 없애도록 하는 편이 좋다. 설정은 간단하다.1. 프로젝트 선택 후 우 클..
Apache HTTP Client를 이용하여 multipart/form-data content-type으로의 요청을 서버로 보내는 유틸을 개발하게 되었다.흔히 웹 브라우저에서 파일 첨부를 한 후 "저장하기" 버튼을 클릭했을 때의 동작을 Java 코드로 구현하는 것 뿐이다. client와 server코드를 완성한 후 서버측으로 다음과 같은 정보로 요청을 보냈다.request URL : http://localhost:8080/file/upload업로드 파일 : test.txt, test1.txt 로그 레벨을 DEBUG로 설정한 후 파일 업로드 요청을 보내게 되면 다음과 같은 request raw 데이터가 남게 된다.실제 client 에서는 다음과 같은 데이터를 서버로 보내게 되는 것이다. multipart/..
요즘 자바8이 대세이고, 앞으로를 위해 hello world를 찍어보고자 한다. 지금 사용하고 있는 이클립스 버전이 indigo(3.7)인데 안타깝게도 1.7까지 밖에는 지원하지 못하는 관계로 kepler(4.3)을 설치하게 되었다. 설치만 하면 바로 자바8 코딩이 가능할 줄 알았지만 플러그인을 설치해야지만 가능하니 marketplace에서 다운을 받도록 하자. "Java8"로 검색하기만 하면 "Java 8 support for Kepler SR2"가 나오니 해당 플러그인을 설치하기만 하면 된다. 메이븐 프로젝트를 생성하고, Java Build Path에서 JDK8 라이브러리를 추가해 주고, Java Compiler에서 컴파일 레벨을 1.8로 지정해주기만 하면 설정 끝~ 람다 표현식을 쓴것과 안 쓴것을 ..
리눅스에서 ifconfig 명령어를 치면 -bash: ifconfig: command not found 와 같은 메세지가 출력된다.이와 같은 오류 발생 시 ifconfig 파일이 존재하는 디렉토리의 패스를 지정해 줘야 하는데 2가지 방법이 있다. 로그인한 계정의 홈 디렉토리로 이동하여 .bash_profile을 vi 편집기로 다음과 같이 수정하면 된다. 1번째 방법PATH=$PATH:$HOME/bin --> PATH=$PATH:$HOME/bin:/sbin 패스 구분자 : 를 추가해 준 후 ifconfig 명령어가 존재하는 /sbin 디렉토리를 추가해 주면 된다. 2번째 방법export sbin=/sbinexport 명령어를 이용하여 패스를 추가해 줄 때에는 JAVA_HOME 또는 CATALINA_HOME..
태그 라이브러리 파일을 jar 파일에 포함시키기 위한 설정에 대해서 정리한다.메이븐 project의 src/main/resources 디렉토리 하위에 META-INF 디렉토리를 생성한 후 jar에 포함시키고자 하는 tld 파일을 모두 추가해 준다. 위와 같이 tld 파일을 추가한 후 mvn package goal을 실행하면 tld 파일이 jar파일에 포함되어진다.다음과 같이 포함시킬 파일과 포함시키지 말아야 할 파일을 구분할 수도 있다. src/main/resources **/*.tld **/*.xml **/*.properties
예전 스프링 스터디를 하면서 bean 에리먼트의 parent 어트리뷰트를 정의하는 것을 배운적이 있다. 사실 그때까지만해도 이 기능을 사용할 일이 있을까라는 생각을 했는데 오늘 난 이 기능을 사용하게 되었고 유용함을 느꼈다. 내가 사용하게 된 계기는 interceptor의 property 에 validator bean을 추가하는 과정에서 중복이 발생한다는 것이였다.예를 들어 /a 라는 URL 패턴으로 접근하는 요청에 대해서 A라는 인터셉터가 동작하고 A라는 인터셉터에서는 valid_1, valid_2, valid_3 가 동작해야 한다./b 라는 URL 패턴에서는 B라는 인터셉터가 동작하고 valid_1, valid_2, valid_4 가 동작해야 한다.여기서 확인할 수 있는 것은 valid_1, vali..
spring에서 제공해 주는 util:map 기능을 사용하여 xml 파일에 다음과 같이 에러 코드를 정의해 주었다. 이와 같이 선언하게 되면 key, value 는 String 타입으로 지정되어 HashMap 객체에 저장이 된다. 아이러니한건 스프링 DI 방식을 이용하여 다음과 같이 객체 주입을 해도 예외가 발생되지 않는 다는 것이다.@Resource(name = "loginCheckErrorCodes")private Map loginCheckErrorCodes; 에러가 발생될 것이라 예상을 하게된 이유는 DI로 주입 받는 Map 클래스의 key 타입이 Integer로 되어 있기 때문이다. 자동으로 type conversion이 발생되어 key 타입이 Integer형으로 바뀐것일까? 만약 type con..
RequestParamMethodArgumentResolver.class 파일의 소스 코드를 이클립스 안에서 확인해 보고 싶었다.찾고자 하는 파일이 이클립스의 Project에 존재한다면 CTRL + SHIFT + R 단축키를 이용하여 쉽게 찾을 수 있다. 만약 jar 파일 안에 존재하는 class 파일이라면?CTRL + SHIFT + T 를 이용하여 쉽게 찾을 수 있다. stackoverflow 물어보면 다 나온다.http://stackoverflow.com/questions/7567887/how-to-find-class-name-inside-a-bunch-of-jars
현재 진행하고 있는 프로젝트에서 Tiles를 사용하고 있는데 다음과 같이 defaultLayout의 left를 동적으로 바꿀 수 있는 방법에 대해서 얘기가 나왔다. 흔히 tiles를 이용할 때 사용하는 방법은 다음과 같이 새로운 definition을 정의한 후 body와 left를 put하는 방법을 이용한다. 하지만 특정 요구 사항으로 인하여 xml 설정이 아닌 코드를 이용하여 left 영역을 동적으로 바꿀 수 있는 방법을 찾아야 했다. 찾아보니 ViewPreparer 인터페이스가 있었고, 해당 인터페이스를 구현하면 tiles definition을 렌더링하기 전에 execute 메소드가 실행된다. 해당 메소드 안에서 다음의 코드와 같이 putAttribute 메소드를 이용하여 layoutId 변수 값에 ..
HTTP request 시 json 스트링을 서버에 넘겨주고, 서버는 interceptor에서 먼저 HTTP request body에 있는 json 스트링을 읽어와 값에 대한 체크를 진행하는 로직을 개발하고 있었다. json 스트링 검증 후 spring controller에서 @RequestParam 으로 데이터를 받으려고 할 때 다음과 같은 예외가 발생java.lang.RuntimeException: java.io.EOFException: No content to map to Object due to end of input interceptor에서 request body의 데이터를 이미 읽어 들였기 때문에 나오는 증상이다.시퀀스 다이어그램으로 표현하자면 다음의 4번에 해당하는 부분에서 예외가 발생된다...
다음과 같이 self closing을 사용하여 외부 자바스크립트를 불러오게 되면 문제가 발생한다.문제라 함은 브라우저에서 해당 외부 자바스크립트의 함수를 호출하지 못하는 것.self closing이란 와 같은 문법을 말한다. Start tag는 존재하지만 End tag는 존재하지 않는 것이다. 여하튼 개발을 하다 이와 같은 문제를 겪게 되었고 왜 브라우저가 정상적으로 자바스크립트를 로딩하지 못하는지에 대해서 확인을 해보았다. self closing 은 원래 XHTML 에서 사용하는 문법이라고 하며 다음과 같이 엘리먼트를 꼭 slash를 이용하여 self-closing해야 한다고 적혀 있다.XHTML requires that tags like and get an extra slash to make them..