본문 바로가기

프로그래밍/자바41

JUnit 4 기능 찾아보기 JUnit를 공부하는 중에 사용되는 기능들을 빠르게 찾아보기 위해서 정리를 했습니다. JUnit 4 버전을 기준으로 작성을 하였고, 관련된 JUnit 3에서의 사용법도 조금 적었습니다. 1. 테스트 케이스(TestCase) 만들기 - 메소드에 @Test 아노테이션을 붙이면 됩니다.- JUnit3 에서는 TestCase 클래스를 상속해서 test로 시작하는 메소드를 만들면 됩니다. 2. 픽스쳐 만들기 - @Before, @After 아노테이션으로 사전, 사후 실행될 메소드를 지정합니다. 매 테스트 메소드 마다 전후에 실행됩니다.- @BeforeClass, @AfterClass는 테스트 케이스 클래스에서 처음과 끝에 한번만 실행됩니다. 이 아노테이션이 지정된 메소드는 static 메소드여야 합니다. 그 이유.. 2018. 5. 3.
Oracle JDK 라이센스와 OpenJDK Oracle 사이트에서 내려받은 Java SE JDK 8 을 사용중 이었습니다. JRE 업데이트 알림이 떠서 업데이트 하고 마지막 화면에서 JDK 8이 2019년 1월 부터 기업 사용자에게 업데이트가 유료화 된다는 내용이 있어서 Oracle JDK의 라이센스에 대해 알아봐야 겠다는 생각이 들었습니다. 먼저 알아본 결과부터 말하자면 명확히는 잘 모르겠다는 것입니다. 이것저것 찾아본 내용을 정리해서 적어봅니다. 기사들을 찾아보니 Java가 Sun에서 Oracle 로 넘어가고 나서 유료화에 대한 우려가 나오기 시작했고, 2016년말 영국의 한 언론이 오라클이 기업에 대해 자바 라이센스를 위반했다고 과금을 시작했다는 기사가 나와서 이슈가 되었었다고 합니다. 오라클 홈페이지에는 Java SE 가 무료라고 나와 있.. 2018. 4. 26.
자바 MD5, SHA-256, AES256 암호화 하기 java.security 라이브러리를 사용해서 MD5, SHA-256 으로 해시 하는 방법과 AES-256 으로 암호화 하고 복호화 하는 방법을 알아 봅니다. MD5와 SHA-256은 단뱡향 암호화로 비밀번호를 암호화 하거나 데이터 전송등에서 무결성을 체크하는데 사용됩니다. MD5는 128bit로 서로 다른 값에 같은 해시가 발생하는 충돌이 확인 되었고, 빠르게 해시가 가능하므로 비밀번호를 만드는데는 안전하지 않다고합니다. 이제는 SHA-256을 사용하기는 권장하고 있습니다. MD5이던 SHA-256 이던 적절한 길이의 salt와 bcrypt, scrypt 또는 pbkdf2와 같은 느린 알고리즘을 적용하여 무작위 대입 공격에 대한 대비를 해야만 안전한 비밀번호를 만들 수 있습니다. 이글의 예제 에서는 M.. 2018. 4. 25.
자바(Java) - static import 사용하기 자바 클래스의 static 메소드는 클래스에 대한 인스턴스의 생성없이 메소드를 사용할 수 있습니다. 예로 절대값을 구하는 java.lang.Math 클래스의 abs() 메소드는 다음과 같이 클래스명.메소드로 바로 사용합니다. int i = Math.abs(-3); JDK 1.5부터는 이러한 정적(static) 메소드를 더욱 쉽게 사용하기 위해서 static import 를 지원합니다. import static java.lang.Math.abs; int i = abs(-3); 정적 메소드를 import static 을 사용해서 import 한후에 클래스명 없이 abs(); 처럼 바로 사용할 수 있습니다. 주의해야 할 것은 같은 클래스 내에 동일한 이름의 메소드가 있으면 클래스 자신의 메소드가 우선합니다. .. 2018. 4. 23.
Java 에서 난수(random number) 생성하기 Java에서 난수를 발생시키는 방법은 두 가지가 있습니다. java.lang.Math 클래스의 정적메소드인 random() 메소드를 사용하는 방법과 java.util.Random 클래스를 사용하는 방법 입니다. 발생되어지는 난수는 Pseudo Random Number(의사 난수) 입니다. 이상적인 난수에 가까운 난수 입니다. 난수를 발생시킬때는 seed값에 대한 이해가 필요합니다. seed 값이란 간단히 말해서 난수를 발생하는데 기준이 되는 값이라고 생각하면 될것 같습니다. 예로 난수를 발생하는 객체 두 개를 동일한 seed로 생성하면 두 객체가 발생하는 난수는 같은 값이 동일한 순서로 발생되어 집니다. 동일한 조건하의 반복되는 시뮬레이션 등에 사용되어질 수 있겠습니다. 대부분의 경우는 현재 시간등 계속.. 2018. 4. 20.
자바문법 - 배열 사용하기 자바(java) 언어에서 배열을 사용하는 방법을 알아 보겠습니다. 배열은 여러개의 데이터를 저장할 수 있는 자료 구조로, 순서를 나타내는 정수형 배열 첨자를 사용해서 데이터에 액세스 할 수 있습니다. 자바 배열은 한번 크기가 정해지면 크기를 변경할 수 없습니다. 1. 배열 변수의 선언은 다음과 같습니다. [] 가 배열 기호 입니다. 정수를 저장할 수 있는 배열 변수 입니다. int[] values; // or int[] values = null; 배열은 객체이므로 변수만 선언할 경우 실제 객체가 없으므로 null 입니다. 2. 배열을 생성합니다. new 연산자를 사용해서 만듭니다. 앞에서 만든 변수에 객체를 만들어서 대입하는 방법과, 선언과 동시에 생성하는 방법 입니다. // 10개의 정수를 저장할 수 .. 2018. 4. 18.
Tomcat 필터 맵핑 제외하기 - Url Rewrite Filter 이용 Tomcat의 web.xml 파일에서 필터 맵핑 부분을 보면 아래와 같은 형태가 됩니다. TestFilter /* 이렇게 필터에 맵핑되는 URL중에 특정 URL을 필터에서 제외하기 위한 방법을 찾아 보았습니다. 하지만 필터 맵핑에서 URL을 제외하는 방법을 없다는 것을 알게 되었습니다. 필터를 직접 만들었다면 필터내에서 호출된 URL이 특정 URL일 경우 다른 방식의 처리를 하도록 코딩을 할 수 있겠지만, 소스가 없는 필터라는 처리가 힘들것 입니다. 그래서 찾은 것이 URL Rewrite Filter 입니다. 이 필터는 특정 URL에 대한 요청을 다른 곳으로 redirect 또는 forward 할 수 있습니다. 이 필터를 사용함에 있어서 유의할 점은 필터의 적용 순서 입니다. Rewrite 필터가 다른 .. 2018. 4. 17.
이클립스 local histroy 사용법 및 저장위치 이클립스에서 파일을 수정해서 저장할 때마다 이전 내용의 복사본이 로컬 히스토리에 저장되어 집니다. 이 저장된 이전 기록은 언제든지 현재의 내용과 비교하거나 교체할 수 있습니다. git, svn 같은 코드 저장소를 사용하고 있다면 거기에 더 좋은 기능이 있겠지만, 코드 저장소를 사용하지 않아도 로컬 히스토리를 이용하면 실수로 변경하거나 삭제하였을때 도움이 됩니다. 로컬 히스토리 사용법에 대해 알아보겠습니다. 1. 변경사항 비교하기 좌측 파일 트리에서 비교할 파일에 마우스 오른쪽키를 누르고, Compare With -> Local History... 를 선택합니다. History 탭이 열리고 저장했던 날짜와 시간의 히스토리가 보여집니다.(이미지에서는 History 탭이 우측에 보이지만, 기본설정에서는 에디터.. 2018. 4. 17.
루프 도중 안전하게 삭제하기 데이터를 ArrayList에 담아서 작업 도중 유효성 검사 등을 통해서 조건에 맞지 않는것을 삭제하려고 합니다. 루프(loop)를 돌면서 유효성을 체크해서 삭제를 하는데, 일반적인 for 루프를 사용하면 예외가 발생하거나 원하는 결과를 얻지 못할 수 있습니다. 삭제를 해버리면 내부적으로 루핑을 돌기 위해 사용하는 list의 크기와 처리해야할 항목을 가리키는 인덱스의 불일치 때문에 에러 또는 논리적인 오류가 발생합니다. List list = new ArrayList(); list.add("apple"); list.add("banana"); list.add("melon"); for(String str : list) { if("melon".equals(str)) { list.remove(str); } } Sy.. 2018. 4. 17.
Stack Trace 바로 확인할 수 있는 개발용 에러 페이지 만들기 자바로 웹 개발시 에러가 발생하면 서버나 브라우저의 에러 페이지가 아니라 커스텀 에러페이지를 보여주도록 설정을 합니다. 이 설정은 web.xml 파일에서 아래와 같이 해 줄 수 있습니다. 500 /WEB-INF/views/error.jsp 보안 때문에 모든 에러에 동일한 에러페이지를 설정하기도 하고, 에러코드 별로 다른 에러페이지를 설정하기도 합니다. 실제 에러페이지의 내용은 보안 목적상 에러 내용을 통해서 서버 정보를 취득하지 못하도록 간단한 에러발생 알림만 보여주게 만듭니다. 디버깅에 필요한 정보들은 로그파일에 남기게 됩니다. 물론 로그 파일에도 디버깅을 위한 최소한의 정보만 남기고, 개인정보 등 민감한 정보가 남지 않도록 주의해야 합니다. 이번에 볼 내용은 개발용으로만 사용되어야 할 것으로, 에러 .. 2018. 4. 17.
Maven 저장소와 의존성 관리 Maven은 빌드 툴이지만 라이브러리 의존성 관리 툴로 더 많이 사용되고 있는것 같습니다. 스프링 프레임웍이나 전자정부 표준 프레임웍을 사용하게 되면 프로젝트의 기본 빌드 설정을 그대로 사용해서 별로 문제가 되는게 없으므로 손댈 것이 별로 없었던것 같습니다. 대부분 필요한 라이브러리를 추가하거나 하기 위해서 저장소(repository)와 의존성(dependency) 부분만을 많이 사용하게 됩니다. 이 글에서는 저장소(repository)와 의존성(dependency)을 사용하는 부분에 대해서 알아보겠습니다. Maven은 단독으로 설치해서 사용할 수도 있습니다. http://maven.apache.org 에서 다운로드 받아서 설치하면 됩니다. 여기서는 직접 설치하지 않고, Eclipse에 기본으로 포함되어.. 2018. 4. 17.
Spring Tool Suite에서 Organize Imports 단축키 Ctrl+Shift+O가 동작 하지 않을 때 자바소스에서 다른 패키지의 클래스를 사용하기 위해서 import 를 사용하게 됩니다. 개발중에 이것저것 import 하다 보면 나중에 사용되지 않는 import 가 생깁니다. 이것을 한번에 정리해주는 기능이 Eclispe의 Organize Imports 입니다. 메뉴에서 Source -> Organize Imports (Ctrl + Shift + O)를 선택하면 사용하지 않는 import 를 자동으로 제거해 줍니다. 이 기능은 현재 java 파일 소스가 선택된 상태에서 실행을 하면 현재 소스에만 적용이되고 프로젝트를 선택한 상태에서 실행을 하면 프로젝트내의 모든 java 파일에 대해서 실행이 됩니다. STS(Spring Tool Suite)도 이클립스를 기반으로 Spring Framework를 사용하기 .. 2018. 4. 17.
내가 메이븐(Maven) (빌드 툴, 의존성 관리도구)을 사용하는 이유 메이븐(Maven)은 빌드 툴이자 의존성 관리도구 입니다. 나는 이것을 자바를 사용하는 웹 프로젝트에만 사용합니다. 다른 프로젝트에는 사용해 본적이 없습니다. 전에는 이클립스를 이용해서 자바 웹 프로젝트를 만들때 프로젝트 위저드의 "Dynamic Web Project" 템플릿을 사용해서 생성을 해서 사용을 했었습니다. 이때 프로젝트 폴더의 구조는 아주 직관적인 구조였습니다. 단순했다고 할 수 있겠습니다. 이 경우 필요한 라이브러리(jar 파일)들은 /WEB-INF/lib 폴더에 넣어서 컨텍스트 전용으로 배포할 것과 WAS 에서 제공되어질 것을 직접 수동으로 관리를 하였습니다. 프로젝트가 오래되어 질수록 문서가 잘 정리되어 있지 않으면 라이브러리 버전 관리가 잘 안되는 경향이 있었습니다. 요즘은 형상관리도.. 2018. 4. 17.
Eclipse 선택된 변수들이 반전 표시가 안될 때 Eclipse 사용시 소스에서 변수를 더블클릭해서 선택하면 동일한 변수들이 모두 반전되어 표시됩니다. 어느날 갑자기 이 기능을 동작하지 않는것입니다. 쓸때는 아무 생각없이 그냥 사용하던 기능인데, 갑자기 안되니까 매우 불편한것 같습니다. 다시 반전 표시가 되도록 하려면 방법은 두 가지가 있었습니다. 1. Eclispe 툴바에서 Toggle Mark Occurrences (Alt+Shift+O) 아이콘을 눌러 기능을 켭니다. 2. 메뉴에서 Window -> Preferences 를 선택합니다. Preferences 창에서 Java -> Editor -> Mark Occurrences 를 선택합니다. 필요한 항목에 체크를 하고, "Apply" 버튼을 누른후 "OK" 버튼을 누릅니다. 왜 갑자기 기능이 동작을.. 2018. 4. 17.
ArrayList 정렬(Sort) 하기 ArrayList에 포함된 요소들을 정렬하는 방법을 알아보겠습니다. 대부분의 웹 애플리케이션들은 데이터베이스에서 정렬된 데이터를 조회하여 ArrayList에 담아서 사용하므로 ArrayList 자체를 정렬할 일은 잘 없습니다. 하지만 가끔씩 리스트를 직접 정렬해야 할일이 생깁니다. ArrayList 를 정렬하는데는 Collections.sort() 메소드를 사용합니다. 이 sort() 메소드의 인자로 정렬할 리스트를 넘기게 되는데, 오버로딩된 두 가지 버전의 메소드가 있습니다. 첫 번째는 하나의 인자를 받는데, Comparable 인터페이스를 구현하고 있는 요소를 가지는 리스트를 인자로 주게 됩니다. 두 번째는 두개의 인자를 받는데, 첫 번째 인자는 리스트 객체이고, 두 번째 인자는 리스트내의 각 요소를.. 2018. 4. 12.