spring 기반으로 되어 잇는 웹 어플리케이션의 web.xml에 대한 정리정리의 목적은 곧 있을 스프링 3.1 교육을 위해 머리로 알고 있는 것들을 기록으로 남겨 좀더 자세하게 정보를 전달하기 위함이다. 일단 web.xml은 서블릿 배포 서술자 (DD) 라고 부른다.영어로는 Deployment Descriptor DD의 용도는 WAS 구동 시 /WEB-INF 디렉토리에 존재하는 web.xml 파일을 읽어 들여 웹 어플리케이션 설정을 구성하기 위함이다. 가령 스프링, 스트럿츠 등 다양한 프레임워크를 사용하여 웹 어플리케이션을 구성하거나 로그, 인코딩 설정 등 초기 셋팅을 위한 설정 파일이라고 생각하면 된다.결국 설정을 위한 설정 파일이라고 정리되는 것인가? ㅋ DD 파일의 title 정도라고 생각하면 좋..
콜렉션 클래스들은 저장된 객체들에 대한 순차적 접근을 제공한다.그러나, 순차적 접근이 모두 끝나기 전에 콜렉션 객체에 변경이 일어날 경우 순차적 접근이 실패되면서 ConcurrentModificationException 예외를 return하게 되는데 이를 fail-fast 방식이라고 부른다. Enumeration은 순차적 접근 시 콜렉션 객체에 변경이 일어나도 이를 무시하고, 끝까지 동작하는 반면에Iterator는 fail-fast 방식으로 동작한다. 아래는 fail-fast 동작에 대한 테스트 코드이다. 테스트 결과자바 콜렉션 프레임워크에 포함되어 있는 List, Vector, HashTable 등은 모두 fail-fast 방식으로 동작 Enumeration 인터페이스만 fail-fast 방식이 아님
@RunWith() 스프링의 테스트 컨텍스트 프레임워크 JUnit 확장 기능 지정 Junit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하기에 @Test 마다 오브젝트를 생성한다. 이와 같은 Junit의 특성으로 인하여 ApplicationContext도 매번 새로 생성되기 때문에 테스트가 느려지는 단점이 있다. 그러나 @RunWith 애노테이션은 각각의 테스트 별로 오브젝트가 생성 되더라도 싱글톤의 ApplicationContext를 보장한다. @RunWith() 대신 AbstractJUnit4SpringContextTests를 상속받아 사용할 수 있음. @ContextConfiguration() spring bean 메타 설정 파일의 위치를 지정할 때 사용되는 애노테이션이며..
화면 입력, 수정, 상세 보기 페이지를 개발할 때 다음과 같이 두 가지 방법을 생각해 볼 수 있다. 첫 째는 insert.jsp, update.jsp, detail.jsp 세 개의 파일을 생성하여 각각의 화면 구성을 file 단위로 분리하는 것이고 둘 째는 memberInfo.jsp 와 같이 하나의 파일에 if(flag)와 같은 조건문을 추가하여 분리하는 것이다. 하지만 위의 두 가지 방법은 큰 문제가 있다. 코드의 중복이 발생하고, 당장은 개발이 편하고 고민할 거리가 없다고 생각하겠지만 이후 유지보수에 상당한 비용이 발생하게 되기 때문이다. 그럼 어떻게 하면 코드의 중복이 발생하지 않고, 유지보수의 어려움을 최소화 할 수 있을까? 나의 생각은 다음과 같다. 회원 가입 페이지 접근 시 memberInfo..
스프링 메타 애노테이션 이란? 스프링에서는 기본적으로 클래스 선언부 위에 @Component 애노테이션이 붙어 있으면 스프링 빈으로 생성한다.하지만 실무에서는 다음과 같이 한다.Controller 클래스에는 @ControllerService 클래스에는 @ServiceDAO 클래스에는 @Repository 위의 3가지 애노테이션도 스프링 빈으로 생성해주는 애노테이션들이다. 분명 위에서 설명하기를 @Component 애노테이션이 스프링 빈으로 생성해준다고 했는데 왜 위의 3가지 애노테이션도 빈으로 생성해 주는 걸까?이유는 @Component 애너테이션이 메타 에노테이션으로 달려 있기 때문이다. 이말이 무슨 말이냐하면@Target(ElementType.TYPE)@Retention(RetentionPolicy...
경제학 강의를 보고 있다. 강사의 강의 스타일이 상당히 독특하고, 재미있다. 무엇보다도 설명을 쉽게 해 이해도가 높다.허나 아무리 이해도가 높아도 시간이 지나면 다 잊어 버리는 나를 알기에 이제부터라도 그 내용을 정리하고자 한다. 오늘의 주제는 "기회비용1" 이다. 기회 비용은 총 3개로 강의가 이뤄져 있기 때문에 이후에도 2번 더 포스팅을 할 것이다. 경제학이라는 학문이 최초로 나오게 된 것은 아담 스미스가 논문으로 작성한 "국부론"이 그 시작이었다. 그 시절의 학자들은 국부론을 처음 접할 때에는 철학으로 분류를 하였지만 내용을 읽다 보니 이 책은 철학으로 분류하면 안 되겠다고 판단하여, 이를 경제학으로 분류하기 시작했다. 이것이 최초의 경제학 책이다. 아담 스미스의 국부론은 예전에도 많이 들어왔던 터..
API에 있는 HashMap 클래스의 모든 메소드에 대해서 테스트 케이스를 작성해 보았다. 나 요즘 테스트 코드 작성하는 재미에 푹 빠진 것 같다. 아래는 소스 코드 게시판인 github gist를 이용하여 코드를 보여주고 있다.
synchronized 키워드를 사용하는 전형적인 3가지 케이스에 대해서 테스트 코드를 작성해 보았다. 첫 번째는 메소드에 synchronized 키워드를 추가하여 메소드 lock을 걸어주는 방법두 번째는 synchronized(객체)와 같이 객체의 레퍼런스 변수를 이용하여 lock을 걸어주는 방법세 번째는 synchronized(this)와 같이 메소드 구현부에 자기 자신의 객체에 대한 lock을 걸어주는 방법 테스트는 Junit을 이용하여 구현하였고, Junit으로 Multithread test 코드 작성 시 Program Argument 영역에 아래 옵션을 추가해 줘야 한다. 실행할 class 선택 후 오른쪽 마우스 클릭 > Run As > Run Configurations...Argument 탭으..
junit 테스트 메소드를 여러 개 생성하였을 때 특정 메소드에서만 테스트를 진행하고 싶을 때가 있다. 그럴 때에는 메소드 명에 살포시 커서를 올려 놓은 후 ctrl + F11을 누르도록 하자. 또 다른 방법은 @Ignore 애노테이션을 이용하여 테스트를 제외시킬 수 있다.
간혹 아래와 같이 html table을 merge한 후 화면에 보여줘야 하는 경우가 있다. 전에는 for문 돌리며 if 처리를 통해 해결했는데 다음과 같이 DOM을 이용하면 코드를 이해하기 쉽고, 유지보수하기 편해진다. 다음은 샘플 코드이다. 여기서 중요한 부분은 꼭 merge할 cell은 정렬이 되어 있어야 한다는 것이다. (DB에서 query 조회 시 order by를 이용하여 정렬 처리) 정렬이 안 되어 있는 상태에서 merge를 하게 되면 다음과 같이 원하지 않는 결과를 가져올 수 있다. 이유는 코드를 확인해 보면 안다.
radio 버튼 처리를 위한 테스트 코드를 작성해 보았다. 초기 로딩 화면은 다음과 같다. 테스트 코드는 다음과 같다. mWeb inApp HTML5 this is M area mobile web this is I area inapp this is H area html5 여기서 한가지 고민되는 부분이 있었다. radio 버튼을 클릭할 때마다 text를 변경하며 노출해야 하는데 위의 테스트 코드와 같이 hide(), show()를 이용하여 처리를 하다보면 버튼 항목이 추가되었을 때 늘어난 항목 만큼 조건절에 모두 추가해 줘야 한다. 그래서 루프를 이용하여 다음과 같이 처리하였다. 조금은 코드가 깔끔해 졌다. ^^ 개발을 하다보면 시간에 쫓겨 이와 같은 고민을 하지 못하고, 그냥 지나쳐 버리곤 했는데 학습 ..
시간이 지나면 xml namespace에 대해서 자꾸 까먹어 블로그에 정리 한다.XML 문서 내에서 유일한 엘리먼트 이름이나 속성 이름을 제공하기 위해 사용된다.XML은 사용자가 자유롭게 엘리먼트를 정의할 수 있는 장점을 가지고 있지만 사용되는 엘리먼트가 XML 문서에서 중복될 수도 있다.이름이 같은 엘리먼트에 의해 발생할 수 있는 이름 충돌을 해결하기 위해 사용되는 것이 namespace이다.네임스페이스를 사용하기 위해 "xmlns"라는 속성을 사용한다."xmlns" 속성값은 네임스페이스를 식별하기 위한 네임스페이스 이름이며, XML문서 내에서는 유일해야 한다. 엘리먼트 이름은 기본 네임스페이스를 선언하는 엘리먼트 명을 지정하고 xmlns 속성은 기본 네임스페이스를 지정하기 위한 속성이다. 기본 네임스..
jquery를 이용하여 checkbox 핸들링 테스트를 해보았다. 체크 박스 전체 석택체크 박스 전체 해제체크 되어 있는 값 추출서버에서 받아온 데이터 체크하기 (콤마로 받아온 경우) 1번째 checkbox2번째 checkbox3번째 checkbox4번째 checkbox 한 가지 고민스러운 것은 서버에서 받아온 데이터가 콤마가 아닌 리스트 형태일 경우 어떻게 처리하는 것이 좋을까 이다. service layer에서 리스트 형태의 checkbox 데이터를 콤마 형태로 가공한 후 view에 던져줘야 할까?아니면 리스트로 받은 데이터를 view에 던져주어 데이터 가공 작업을 위임할까? okjsp에 질문올려서 다른 분들은 어떤 방법을 사용하고 있는지 알아봐야 겠다.
tree를 이용하여 화면을 개발하였는데 jquery를 잘 모르다보니 초반에 너무 삽질을 많이 했다. 지금은 웬만큼 익숙해졌지만 좀 더 간결하고 깔끔하게 짤 수 있는 방법을 찾기 위해 지속적인 테스트를 해보려고 한다. 브라우저는 크롬을 사용하였고, console.log 를 이용하여 디버깅을 하였다. 이제는 jquery selector에 대한 부담이 없어졌다. 이제 클라이언트 개발도 어느 정도 자신감이 생기기 시작했고, 두려움이 사라지고 있다. 물론 이것만 알았다고 해서 자만하지 말고, 더더욱 발전할 수 있도록 반복 숙달하자. 결과 화면
Array 객체에서 특정 요소를 넘겨주면 해당 요소가 Array 객체에 존재하는지 알고 싶었다. 자바의 contains 메서드가 존재하지 않을까 찾아보니 javascript Array객체에서 제공하는 메서드는 없었고 대신 prototype을 이용하여 함수를 구현하는 예제는 있었다. prototype이 뭘까 궁금하여 그 특성에 대해서 정리해 보았다.자바스크립트의 모든 객체는 프로토타입이라고 불리는 또 다른 객체를 내부적으로 참조할 수 있다. - 모든 function 에는 Prototype 객체를 가르키는 prototype 이라는 프로퍼티가 존재 객체의 속성을 액세스 했을 때 그 객체의 속성에서 못찾으면 prototype 속성에서 찾는다. - prototype은 각 객체간 프로퍼티를 공유할 수 있게 하기 위..