나는 주로 스프링이 제공하는 테스트 컨텍스트 프레임워크 JUnit 확장 기능을 이용하여 테스트 코드를 작성한다. service 로직 -> DAO 로직 -> myBatis query 또는 DAO 로직 -> myBatis query 와 같이 두 가지 케이스의 테스트 코드를 많이 작성하게 되는데 이번에 service layer에 해당하는 클래스만 테스트 코드를 작성하는 방법에 대해서 알아보게 되었고, 토비의 스프링 3.1 스터디 기간에 학습했던 mockito를 사용해 보기로 했다. Mock 객체를 쉽게 제공하고 사용할 수 있는 여러 프레임워크가 있는데 그 중 mockito가 인기가 좋다고 한다. 사실 다른 Mock 프레임워크를 사용해 보지 못해 잘 알지는 못하지만 다른 분들의 경험적 지식과 구글 트렌드 조사를..
와이어 샤크를 이용하여 내 PC와 서버간의 통신 패킷을 확인하고 싶을 때가 있다.나는 주로 프로토콜 통신이 어떤 원리로 이뤄지는지를 확인 해보고 싶어 사용한다.헌데 가끔 와이어 샤크를 이용할라 치면 필터 설정을 잊어 먹을 때가 많다.매번 검색하는 것도 귀찮으니 내 블로그에 와서 바로 확인 할 수 있도록 간단하게 정리를 하자. 와이어 샤크에는 다양한 기능들이 많은데 난 딱 한 가지 기능만 사용한다.그것이 바로 Capture Filter 이다. 다음은 실제 캡쳐를 해봄으로써 어떻게 설정을 하는지 알아본다.캡쳐를 할 대상은 개발 장비에 있는 테스트 웹 페이지이다.1. Capture > Options 클릭 > Capture할 랜카드 체크 2. Capture할 랜카드를 더블 클릭하면 창이 하나 뜬다. 3. "Ca..
기존에 개발되어 있는 소스 코드를 보다 보니 implements java.io.Serializable과 같이 Serializable 인터페이스를 구현하는 VO(Value Object) 클래스들이 많이 보인다. 혹시 RMI(Remote Method Invocation) 통신이나 네트웍 통신을 할 때 직렬화를 사용하여 연동을 하나? 싶었지만 아니였다. 원인을 알고 싶었지만 개발된지 이미 5년이 넘은 시스템이고, 개발자는 5대째 계승되고 있는 시점이다. 결국 Serializable interface가 왜 구현되어 있는지는 모르겠지만 아마 습관적으로 붙이지 않았나 싶다. 이런 코드를 보니 나 조차도 Serializable에 대해 자세히 알고 있나라는 생각을 가지게 되었고, 한번쯤은 정리를 해봄으로써 확실히 알아..
test.co.kr 이라는 사이트에서 dev.co.kr 이라는 사이트에 있는 정보를 Ajax 기술을 이용하여 요청을 보낼 때 cross domain policy에 의해 브라우저가 요청을 막는다.즉, 도메인이 다르면 요청을 보낼 수 없다. 위와 같은 상황을 우회하여 해결할 수 있는 방법은 jquery에서 jsonp를 이용하는 것이다.한 가지 주의해야 할점은 jsonp는 HTTP GET 방식만 지원한다. jsp 파일 $(document).ready(function() { }); function getJsonTest1() { $.getJSON("http://jsonp.localhost:8081/jsonpTest?id=user&callback=?", function(data) { alert(data.id + "..
이번에 인턴 사원 멘토링을 맡게 되면서 교육을 진행하고 있는데 재귀함수에 대해서는 잘 이해를 못하는 것 같아 시퀀스 다이어그램을 그려보았다.재귀함수를 어떻게 그리면 좋을까 생각한 끝에 아래와 같은 결과물이 나왔는데 인턴 사원이 잘 이해할 수 있을랑가 모르겠다. [시퀀스 다이어그램]
StarUML에서 시퀀스다이어그램을 그릴 때 몇 가지 셋팅이 필요한데 매번 까먹어서 이곳에 정리한다. 시퀀스 다이어그램을 그리기 위해서는 다음과 같이 진행Model Explorer 에서 클릭 오른쪽 마우스 Add Diagram -> Sequence Diagram 생성 UML 파일 생성 후 수정을 하게 되면 backup 파일이 생기게 되는데 안 생기게 하기 위해서는 다음과 같이 한다.자동 백업파일 생성 해결은 Option -> General -> Create backup file의 체크를 해제
369 게임 알고리즘을 작성해 보았다. 문제는 우리가 아는 게임과 동일하다. 3 이라는 숫자를 부르면 박수 한 번.6 이라는 숫자를 부르면 박수 한 번.9 이라는 숫자를 부르면 박수 한 번.33 이라는 숫자를 부르면 박수 두 번.369 라는 숫자를 부르면 박수 세 번. 위의 문제에 대한 알고리즘은 무엇일까? 주어진 숫자의 자릿수마다 3, 6, 9라는 값이 포함되어 있는지 확인 후 count를 하면 된다. String의 indexOf를 이용하여 값의 포함 여부를 확인하려고 했지만 너무 쉬운 것 같아 다르게 문제를 풀어보았다.
몇일전에 클러스터드 인덱스와 넌 클러스터드 인덱스에 대해서 나에게 물어보신 분이 계셨다.헌데 내 기억 속에는 클러스터드 인덱스는 테이블 당 1개만 생성할 수 있다는 것만 기억날 뿐 다른 것은 기억나지 않았다. 그래서 내 기억 속에 오랫 동안 자리 잡기를 바라는 마음으로 이곳에 정리한다. 클러스터드 인덱스와 넌 클러스터드 인덱스는 간단하게 다음과 같이 정리할 수 있다. 클러스터드 인덱스 넌 클러스터드 인덱스 차이 물리적으로 행을 재배열 물리적으로 재배열 하지 않는다. 크기 인덱스 페이지 용량이 넌 클러스터드 인덱스 페이지 용량보다 작다. 클러스터드 인덱스 페이지 용량보다 크다. 선택도 30% 이내에서 사용해야 좋은 선택도 3% 이내에서 사용해야 좋은 선택도 최대 갯수 테이블당 1개 테이블당 249개 위에서..
웹 애플리케이션을 개발할 때 세션을 이용하여 사용자 로그인 정보를 저장하고, 사용자의 로그인 상태를 유지할 수 있게 개발하는 방법은 많은 개발자가 알고 있다.하지만 로그인 상태를 유지하기 위해서 서블릿 컨테이너인 tomcat이 내부적으로 어떻게 동작하는지 모르는 분들이 계셔서 이곳에 정리를 해보려고 한다. 로컬에 톰켓 설치 후 구동 HTTP request, response 헤더를 확인해야 하기 때문에 크롬의 개발자 도구를 이용한다. 크롬 개발자 도구의 Network 탭을 선택한 후 http://localhost:8080/login.jsp 접속 HTTP 헤더 정보를 보면 Response Headers에 쿠키 정보를 client로 전달한 것을 볼 수 있다. JSESSIONID 값이 톰켓에서 발급하는 쿠키 정..
자바의 접근 제어자는 다른 클래스로부터 정보와 데이터의 접근을 제어한다.public : 어떤 클래스에서도 접근이 가능private : 외부의 어떤 클래스에서도 접근이 불가능protected : 같은 패키지 및 상속 받은 클래스에서 접근 가능.default : 같은 패키지에 있는 클래스에서만 접근 가능 여기서 protected, default 접근제어자를 사용할 때 주의해야 할 점은 꼭! 같은 패키지여야만 한다는 것이다.예를 들어 A 패키지에 존재하는 Board 클래스에 default 접근제어자로 선언되어 있는 add 메소드가 존재하고, A 패키지 하위에 B 패키지가 존재한다면. B 패키지 안에 있는 NoticeBoard 클래스에서 A 패키지에 있는 Board 클래스의 add 메소드에 접근할 수 없다. 즉..
정규표현식은 특정한 규칙을 가지는 문자를 표현하는데 사용하는 형식 언어이다.정규표현식을 잘 모를 때에는 validation 체크가 상당히 고단하고, 지루했지만 정규표현식을 자유 자재로 다룰 줄 알게 되면 상당한 시간을 단축할 수 있고, 유용하며 코드가 깔끔해 진다. 가끔 표현식을 까먹는 경우가 있어 이곳에 표로 정리를 하고, 각 표현식에 대한 테스트 케이스를 만들어 보았다. 표현식 설명 ^ 문자열의 시작 $ 문자열의 종료 . 임의의 한 문자 (문자의 종류 가리지 않음) 단, \ 는 넣을 수 없음 * 앞 문자가 없을 수도 무한정 많을 수도 있음 + 앞 문자가 하나 이상 ? 앞 문자가 없거나 하나있음 [] 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 ..
XSS (Cross Site Scripting) 공격을 통해 웹 사이트의 보안을 취약하게 할 수 있는 툴이 있다.Burp Suite 라는 툴인데, 이 툴을 이용하게 되면 javascript를 이용한 validation체크를 우회할 수 있다.이 말은 웹 사이트의 보안을 유지하려면 client단에서의 javascript 유효성 체크뿐만 아니라 서버단에서의 유효성 체크도 해야 한다는 것이다. 간혹 우리 개발자들은 바쁘고 시간이 없다는 이유로 클라이언트의 유효성 체크만 하고 넘어가는 경우가 비일비재하다. 물론 나 또한 그런 경험이 있다. Burp Suite의 동작 원리는 간단하다.1. local PC 웹 브라우저에서 naver.com HTTP request2. proxy server(Burp Suite)3. 네..
개인 프로젝트인 스프링 3.1 기반의 웹 애플리케이션에 시큐리티를 추가해 보기로 했다. 최종 구현 목표는 DB로 인증 및 URL 관리를 하는 것이며 일단 단계적으로 시큐리티가 어떤 기능을 지원하는지를 알아가기 위해서 오늘은 프로퍼티를 이용한 인증 및 권한 부여 방법에 대해서 설명하려고 한다. 먼저 스프링 시큐리티를 적용하기 위해서는 pom.xml에 라이브러리를 추가한다. org.springframework.security spring-security-core ${spring.security.version} org.springframework.security spring-security-config ${spring.security.version} org.springframework.security spri..
maven package를 실행했는데 JUnit으로 만든 테스트 케이스를 실행하지 못하는 현상이 있었다.혹시 @Ignore 애노테이션이 붙어 있어서 그런 것일까?아님 컴파일된 테스트 클래스가 test-classes에 없어서?이클립스 설정 문제 때문에? 발생 가능한 모든 상황들을 다 확인해 보았지만 위의 문제로 인한 것은 아니고, pom.xml에 dependency로 JUnit이 정의되어 있지 않아서 였다. Java Build Path에는 JUnit 라이브러리가 추가되어 있는데 왜 pom.xml에 JUnit 라이브러리를 추가해야 하는지 의문이 들었지만 곧 해답을 찾을 수 있었다. 이클립스의 메이븐 플러그인은 Java Build Path의 라이브러리를 참조하지 못하고, pom.xml에 정의되어 있는 라이브러..
FTP 모듈을 사용하게 될 일이 생겨 예전에 만들었던 FTP 프로그램을 메이븐 프로젝트로 옮기게 되었다. 내가 만든 FTP 모듈은 NetComponents-1.3.8.jar 라이브러리를 필요로 하는데 메이븐 중앙 리포지토리에서는 해당 라이브러리를 관리 안하고 있었다. 결국 아래와 같은 명령어를 이용하여 .m2\repository 디렉토리에 NetComponents-1.3.8.jar를 추가하여 문제를 해결 할 수 있었다. mvn install:install-file -Dfile=C:\NetComponents-1.3.8.jar -DgroupId=com.oroinc -DartifactId=NetComponents -Dversion=1.3.8 -Dpackaging=jar -DgeneratePom=true 빨간색..
차기 프로젝트에서는 CI 툴을 사용하고자 Jenkins 사용법에 대해서 알아봤다.빌드 방법은 maven을 이용해 war 생성 후 tomcat manager를 통해 war를 업로드 하는 식이다. 1. 먼저 Jenkins를 설치한 후 웹 사이트에 접속한다. 2. 시스템 설정Jenkins 관리 > 시스템 설정 메뉴 접속 후 다음과 같이 JDK, Maven, 이메일, SVN 버전 설정을 한다.이메일 서버는 gmail을 이용하였다. 3. 새로운 Job을 클릭Job 이름 입력 후 Build a maven2/3 project 라디오 버튼 클릭 4. 소스 코드 관리 설정은 다음과 같이 한다.나는 naver SVN 저장소를 이용했다. 사실 우리 회사 SVN 서버가 가끔씩 말썽을 일으키는 경우가 있는데 회사 프로젝트도 네..