사용자 개인 정보를 서버에 전송할 때 HTTPS로 적용해 달라는 요청이 들어온 적이 있었다.그래서 주민등록번호나 회원 아이디, 패스워드 등을 서버로 전송하는 페이지에 한해서 HTTPS로 적용되게 URL을 변경하였다. 헌데, 다음과 같은 문제가 발생하였다.1. 회원 약관 페이지 접근 http://test.co.kr/userAgreement.do2. 약관 페이지에서 회원 정보 입력 페이지 이동 https://test.co.kr/userReg.do3. 회원 정보 입력 페이지에서 휴대폰 인증 버튼 클릭 시 ajax로 http://test.co.kr/userAuthMobilePhone.do 요청 위와 같이 휴대폰 인증 버튼 클릭 시 서버로 요청을 보내지도 못하고, ajax 에러 메시지가 출력된다.error, No..
흔히 웹 프로젝트를 생성하면 다음과 같은 구조의 폴더가 만들어지고, 이클립스에 내장되어 있는 tomcat WAS 서버를 기동하면 생성한 프로젝트의 소스를 기반으로 웹 애플리케이션이 구동되는 줄 알 것이다. 하지만 이클립스에서는 멀티 프로젝트를 고려하여 Deployment Assembly 메뉴를 제공하고, tomcat WAS 기동 시 특정 디렉토리 영역에 프로젝트 소스를 배포한다.그 장소가 다음과 같다. 예를 들어 어떤 서비스를 개발하는데 그 서비스에는 관리자 페이지와 사용자 페이지 두 개의 사이트를 제공해야 한다고 하자.프로젝트 설계 시 대게 아래와 같이 두 개의 프로젝트(관리자, 사용자)를 생성할 것이고, 각 프로젝트에서 공통으로 참조해야할 프로젝트를 추가적으로 생성할 것이다.ADMIN project ..
대게 서비스 개발 완료 후 상용 장비에 배포할 때 한 대에 하는 것이 아닌 여러 대의 장비에 배포한다.헌데, @Scheduled 애노테이션의 cron 표현식을 자바 코드 안에 넣게 되면 같은 시간에 여러 대의 장비에서 배치가 구동 될 것이기 때문에 문제가 발생한다. 그래서 프로퍼티로 크론 표현식을 분리했다. 다음은 SpEL 설정 부분인데 @Scheduled(cron = "#{appConfig['cron.time']}) 와 같이 하면 SpEL에서 값을 가져오지 못하고 오류가 발생한다. 오류가 발생되는 이유는?SpEL로는 설정 분리가 안 되는 것인가?잘 모르겠다. ㅠㅠ (알고 계신분이 계시다면 comment 부탁 드립니다.) 여하튼 다음과 같은 표현식을 통해서만 크론 표현식을 프로퍼티로 분리할 수 있다.
공통 상수 값을 인터페이스에 정의하는 이유가 예전부터 궁금했었다.처음에는 메소드가 필요 없어서 interface로 설계를 했나라고 그러려니 했었는데 다른 사람이 만들어놓은 소스를 보다보니 그 이유를 알게 되었다. 아래 코드는 다른 사람이 작성한 코드의 일부분이다.public class MdnChangeServlet extends HttpServlet implements CodeDefinition { CodeDefinition 인터페이스에는 static 상수 값이 정의되어 있고, MdnChangeServlet에서 상수 값을 사용하기 위해 인터페이스를 구현했다.static으로 정의되어 있는 상수 값을 굳이 인터페이스 구현을 통해서 사용하려는 목적은 CodeDefinition.IS_CHECK 와 같이 코드를 ..
토비의 스프링 책을 보다 SpEL을 알게 되었고, 이를 샘플 프로젝트에 설정해 보았다.간단하게 끝날 줄 알았던 설정이 1시간 동안의 삽질을 선물해 주었고, 이런 삽질을 다른 분들은 겪지 마시길 바라며 SpEL 설정 시 조심해야 할 사항에 대해서 간략하게 정리해 본다. 기존 프로퍼티 설정은 전용 태그인 를 이용하였는데, 책을 보니 명시적이고, 이해하기 쉬우며 오류도 잘 잡아주는 SpEL 사용을 적극 권장하기에 이를 도입하기로 결정 프로퍼티 설정이 담겨 있는 설정 파일은 다음과 같이 xml 형식으로 되어 있다. (db-config.xml)database configcom.mysql.jdbc.Driverjdbc:mysql://localhost:3306/spring3lng198211111111 자. 이제 SpE..
자바 1.5에서부터 제너릭 기능이 추가 되었다. 내가 아는 제너릭은 타입 캐스팅의 비용을 줄이고, 런타임시에 발생하는 오류를 줄이며, 가독성이 좋은 코드를 만들기 위해 나온 기술이라고 알고 있다.또 한 가지 제너릭을 통해 메소드의 return 타입의 제약을 해소하고, 타이트하게 문법을 체크하는 정적 타입 언어의 특성에서 동적 타입 언어와 같은 느슨한 스타일의 언어로 변화되기를 원하는 것 같다. 정적 타입 언어는 IDE툴을 이용하여 컴파일 타임에 문법 체크 및 오류를 사전에 발견할 수 있는 장점이 있다. 그러나 문법의 타이트한 체크로 인해 코드양이 많아진다.이런 단점을 자바에서는 제너릭을 이용해 해소하고 있다. 동적 언어는 런타임 시에만 문법 오류를 확인할 수 있고, 강력한 개발 도구도 많지 않다.또한 동..
스프링을 공부하다 보면 빈, 빈 팩토리, 애플리케이션 컨텍스트, 스프링 컨테이너, IoC 컨테이너 등 다양한 용어들이 나온다. 궁극적으로 이 용어들이 가리키는 것은 스프링 설정 xml 파일을 말한다.단순하게 스프링 xml 설정 파일을 가리키는 것 뿐이라면 왜 이렇게 많은 용어들이 탄생했고, 또 사용되어져 있는지 궁금하지 않을 수 없다. 솔직히 난 불편하다. (아주 쬐금~)가정 먼저 개발자들간의 커뮤니케이션 시 위에서 언급한 용어들을 무분별하게 사용하다보니 혼란스럽다.또한 애플리케이션 컨텍스트의 용어는 흔히 tomcat server.xml에 정의한 context를 말하는 것 같다. 물론 용어들을 세분화하면 각 용어들이 뜻하는 바를 정확하게 설명할 수 있겠지만 조금은 불편하게 사실이다. 여하튼 내 불만에 대..
내가 블로그를 쓰는 이유? 새롭게 배운 지식과 경험 그리고 생각들을 이곳에 작성함으로써 시간이 흘러 까먹더라도 이곳에 들어와 글을 읽으며 저 깊숙한 곳에 있는 기억과 지식들을 끄집어 내기 위해서이다. 다른 한 가지 이유는 어떤 한 가지 사건과 경험 그리고 배움들을 구체화된 글로 작성함으로써 나의 생각을 정리하고, 이를 통해서 다른 사람들에게 보다 잘 설명할 수 있는 기틀을 만들어 나가기 위해서이다. 마지막으로 내 꿈을 실현할 수 있는 한 가지 도구로써의 가치가 있기 때문이다.지식을 얻고, 그것을 글로 표현하며 정리하고, 이를 토대로 사람들에게 더 좋은 정보를 알려줄 수 있는 것.그것이 내 꿈을 향해 나아갈 수 있게 해주는 하나의 도구로써 가치가 있는 것이다. 2년 넘게 일기를 쓰는 습관을 들여서 그런 건..
오픈 소스를 사용하다보면 특정 클래스가 어떤 방법으로 코드가 구현되어 있는지 궁금할 때가 있다. 난 이클립스에 jad를 추가하여 decompile된 class파일을 보았는데 코드가 깔끔하게 나오지 않아서 불편했다. 또 다른 방법은 프로젝트 Java build path > Libraries에서 jar attached source를 하여 다운로드 받은 소스를 연결하는 방식이 있다.헌데 이 방법은 완전 노가다이다.한번만 노가다를 하면 괜찮지만 새로운 프로젝트를 생성하면 동일한 노가다를 또 해야 한다. 메이븐은 소스 다운로드 및 jar attached source를 자동으로 해준다는 것을 최근에 알게 되었다. 멋지다. ^^이런 좋은 기능이 있다는 걸 이제서야 알다니. 소스 다운로드 방법은 goal 에 다음을 추..
관계형 테이터베이스 테이블과 객체 사이의 mapping 처리를 해주는 것을 ORM(Object relational Mapping)이라고 한다. 쉽게 말해 SQL문 작성 없이 간단한 매핑 설정으로 데이터베이스의 테이블 데이터를 Java 객체로 전달 받을 수 있는 것이다. ORM을 이용하면 개발을 좀 더 편하게 할 수 있고, service layer에 집중할 수 있다. ORM을 사용하고 있는 JPA, 하이버네이트 예제 코드를 보면 상당히 편리하고 다양한 기능을 제공하고 있는데 이 기술을 사용하려면 학습 비용이 다른 오픈 소스보다 높다고 생각된다. 각 프로젝트 규모나 성격에 맞게 ORM, SQL Mapper 둘 중 하나를 선택하면 되겠지만 현재 우리 프로젝트 환경에는 iBatis가 적절한 것 같다.
현재 프로젝트에서는 commons dbcp pool과 tomcat jdbc pool을 사용하고 있다. 몇일 전에 스터디 그룹에서 나왔던 얘기가 apache commons dbcp는 하드웨어 멀티 코어를 제대로 활용하지 못해서 성능이 떨어지고, 소스 버전 업데이트는 거의 이뤄지지 않는다고 한다.몇 가지 더 알아보니 commons dbcp는 하나의 쓰레드를 사용하기 때문에 멀티쓰레드 안전성을 보장하고자 전체 connection pool에 대한 lock을 건다고 한다. dbcp의 단점에 비해서 tomcat jdbc pool은 하드웨어의 멀티 코어를 충분히 활용하고 성능이 좋다고 한다.성능이 좋다는 기준이 dbcp보다 좋은 건지 다른 컨넥션 풀링보다 좋다는 건지는 모르겠지만 어느 정도의 안전성을 보장한다는 의미..
maven의 의존 라이브러리(jar) 파일들을 다운로드 받으면 내 로컬 PC의 C:\Users\namkyu\.m2\repository 디렉토리에 저장 된다.하지만 내 로컬 PC 개발 환경은 D드라이브의 dev 폴더로 집중하기 때문에 C 드라이브에 라이브러리가 저장되는 것이 싫었다. 그래서 바꿨다.일단 maven home > conf 디렉토리로 이동하여 settings.xml 파일을 open 한다. root 엘리먼트 하위에 보면 localRepository 엘리먼트가 보이는데 여기에 변경할 디렉토리 경로를 입력해 주면 된다.D:\dev\local_repository 이제는 이클립스에서 위에서 수정한 settings.xml을 지정해 주자.이클립스 > window > Preferences 클릭좌측의 tree ..
[*.do에서 /* 로 바꾸게 된 이유]스프링 3.1 샘플 프로젝트의 web.xml(DD) 구성 시 url-pattern을 *.do와 같이 설정하였다. 이유는 단순하다.프로젝트를 진행할 때 항상 *.do를 사용했기 때문이다. 하지만 REST 방식의 웹 어플리케이션을 구성하기 위해서는 다음과 같은 URL 형식을 제공해야 하는데 현재는 *.do와 같이 되어 있기 때문에 pattern을 /* 와 같이 변경해야만 했다.http://localhost:8080/user/list [현상]이제 내가 만들어 놓은 프로젝트는 REST 방식을 지원하는 spring web application이 되었다.허나 controller mapping url을 호출하면 404 에러가 발생하면서 아래와 같은 로그가 찍힌다.No mappi..