everydayminder
아파치 log4j 보안 취약점 (CVE-2021-45105) 최근 10년 이내 최악의 보안 취약점이라고 알려진 아파치 log4J 취약점 문제(CVE-2021-44228)가 밝혀진지 몇 일이 지나지도 않았는데, 추가 문제가 보고되었다. CVE-2021-44228은 원격 코드 실행에 대한 취약점이고 장애등급은 Critical이지만, 이번에 보고된 CVE-2021-45105는 Denial Of Service(DOS) 취약점이고 장애등급은 High이다. 문제점 아파치 Log4J 공식 사이트에서는 이 문제를 아래와 같이 기술하고 있다. Apache Log4j2 versions 2.0-alpha1 through 2.16.0 did not protect from uncontrolled recursion from se..
log4j 취약점에 대해 제로데이 어택으로 구분될만큼 심각한 보안문제로 log4j CVE-2021-44228가 보고 되었다. 이와 관련한 내용을 정리해 본다. 제로데이 어택 앞서 말한 제로데이 어택이란 무엇일까? 어떤 보안상 문제가 발견되고, 그 문제가 미처 공표되기도 전에 해당 문제점을 목표로 행해지는 위협/공격을 말한다. 취약점이 발견되고, 아직 패치 등이 적용되기 전에 이뤄지는 공격이므로 마땅한 대처 방안이 없고, 피해 규모도 가늠할 수 없는 상태를 말한다. 즉, 빨리 해결책이 나올 때까지 기다리고, 그 패치를 적용하는 것 외에는 뾰족한 방법이 없다. log4j란? log4j는 자바 애플리케이션에 로그를 쉽게 기록할 수 있도록 도와주는 라이브러리 구현체 중 하나이다. 공식사이트) https://lo..
stub, mock, spy의 차이는? 테스트 코드를 작성하다 보면, 한동안 Stub과 Mock의 차이를 생각하지 않고 써왔던 것 같다. Martin Fowler의 원본 글을 읽어보면서 내용을 정리해둬야 나중에 방향성을 잡을 때 도움이 될 것 같다. Mocks Aren't Stubs by Martin Fowler 아래 링크가 원문이다. https://martinfowler.com/articles/mocksArentStubs.html 용어 정리 + 개인 의견 원문 글에도 자세히 나오지만, 원문에 소개된 개념을 정리한다. Meszaros uses the term Test Double as the generic term for any kind of pretend object used in place of a ..
java DNS TTL 설정 자바에서 DNS 설정하는 여러가지 방법에 대해 확인해 보자. 배경 - DNS 기반 redundancy layer DNS에 여러 A 레코드를 두고, DNS lookup을 하면 그 중 하나의 A 레코드를 반환하도록 한다. 이렇게 하여 서비스의 부하 분산, 지역 분산 및 혹시 모를 장애 대비도 할 수 있다. 그런데, DNS에 기반한 위 가정에 맞추려면, java 애플리케이션의 경우 꼭 챙겨야 하는 설정이 있다. DNS Client Cache 설정 어떤 URL이 주어지면, DNS에 대한 질의를 하고자 하는 클라이언트와 그에 대한 답을 하는 서버로 역할이 나눠진다. 실행하는 자바 애플리케이션이 어떤 주소를 확인하기 위해 매번 DNS 질의를 해야 한다면 (아무리 패킷이 작더라도) 그만큼..
만약, 내 맥북에 여러 버전의 자바(java)가 설치되어 있는데, 그 위치를 모두 확인하고 싶다면 다음의 명령어를 사용하면 된다. $ /usr/libexec/java_home -V Matching Java Virtual Machines (3): 14.0.1, x86_64: "OpenJDK 14.0.1" /Library/Java/JavaVirtualMachines/openjdk-14.0.1.jdk/Contents/Home 11.0.7, x86_64: "AdoptOpenJDK 11" /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home 1.8.0_192, x86_64: "Java SE 8" /Library/Java/JavaVirtualMac..
Javascript를 jsfiddle에서, SQL을 dbfiddle/sqlfiddle에서 확인하는 것처럼 Spock framework을 체험할 수 있는 사이트를 발견했다. 기존에 프로젝트가 셋업이 되어 있다면 그 프로젝트 파일에서 확인해 보면 좋겠지만 간단하게 확인하는 용도로는 나쁘지 않을 것 같다. 사이트: http://meetspock.appspot.com meetspock 이라는 이름이 뜻하는 것처럼, 간단히 체험해 볼 수 있다. 처음에 접속하면 다음과 같은 화면이 뜬다. 사이트 둘러보기 1에 표시한 영역에는 Spock 코드를 작성하면 된다. 사이트에 접속하면 화면과 같은 샘플코드가 먼저 작성되어 있다. 테스트 코드를 작성 한 후, 2에 표시된 바와 같이 "Run Script"를 실행하면 테스트 결..
본 글에서는 SpringBoot와 Spock Test Framework를 연동하는 방법에 대해 소개한다. 구성 환경 (의존성) SpringBoot: 2.4.2 Default JUnit: 5.x Spock: 1.3 Groovy: 2.5 만약, 이후에 다른 버전으로 테스트 한다면, 그에 맞는 설정 방법을 다시 확인해야할 것이다. 기본 틀잡기 Spring Initializer(https://start.spring.io/)를 활용하여, 일단 기본적인 프로젝트를 다음과 같이 설정해 보았다. plugins { id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java..
여러 버전 java 사실 개발하면서 Java의 버전을 계속 바꿀 일은 별로 없는 것 같다. 프로젝트마다 바꿀 일도 없고, 회사 정책이 바뀌지 않는한 기존의 버전을 사용할 가능성이 높다. 또한, 기존에 java 8을 사용한 프로젝트라면 특별한 이유가 없는 한 Java8을 유지보수할 가능성이 높다. Java의 버전 릴리즈 주기가 6개월로 짧아지면서, 여러 버전을 설치하고 사용하고자 할 때 jenv를 사용하면 좋을 것이다. (Python처럼) 3년 주기의 Java LTS 버전을 감안하면, production에서는 현재로서는 Java11이 유용한 선택지가 될 것이다. https://en.wikipedia.org/wiki/Java_version_history jenv: Java용 Pyenv Python 개발 환경..
한 서버에 아파치 톰캣 여러 개 띄우려면? 이런 경우가 발생한다. 한 서버에 포트를 달리해서, tomcat을 여러 개 띄워야 하는 경우가. 개발시 servlet context만 달리해서 검사하곤 했는데, servlet context를 root로 fix해서 개발된 소스를 받아들게 되었다. (절대경로로 root context만 고려해서 작성된 소스코드) 두 개의 사이트를 띄워야 하는데, 둘 다 root context로 동작하게 되어있다. tomcat을 띄우고자 서버 두 개를 쓰는 것은 오버하는 것이고, 한 번에 두 개 혹은 그 이상의 tomcat을 띄워서 배포해 보자. 본 설정은 tomcat 6.x를 기반으로 설정하였다. Tomcat 설치 http://tomcat.apache.org로부터 설치 파일을 다운로..
1. Web Application 배포 $CATALINA_HOME/webapps에 web application 디렉토리를 통쨰로 복사하면 배포가 된다. 또한, war 파일을 복사해도 배포가 된다. (설정이 잘 되어 있다면) tomcat이 war 파일을 압축 풀고, 배포하는 것을 확인할 수 있다. 2. Context 설정 만약, webapps/test 라는 디렉토리가 있다면, context명은 test이다. 배포를 하기 위해, web application 형태의 test 디렉토리를 통째로 복사했을 수도 있고, test.war 파일을 통해 배포했을 수도 있다. 이 때, context명을 $CATALINA_HOME/conf/server.xml에, 또는 $CATALINA_HOME/conf/context.xml에..
JUnit에서 작성한 어떤 테스트케이스가 Exception을 던지고, 그 Exception이 던져진 것이 맞는 상황임을 검증하고자 한다면, JUnit3에서는 public void testDivideByZeroV3() { try { int a = 3/0; } catch(Exception e) { assertSame(e.getClass(), ArithmeticException.class); } } 반면, JUnit4에서는 @Test(expected=ArithmeticException.class) public void testDivideByZeroV4() { int a = 3/0; } 예외 처리만으로도 JUnit4가 JUnit3보다 간략하다는 것을 확인할 수 있다.
"우리나라 정서상 어렵다, 현실에 맞지 않다"는 말들을 하기도 하고, 듣기도 한다. Rod Johson이 그의 저서 "Expert one-on-one J2EE Design and Development"에서 XP 기법을 소개하면서, 그 기법의 모든 것을 따르지는 않더라도 테스트 지향 개발 방법은 바람직하다고 하였다. 테스트에 대한 XP의 기법은, 코드를 작성하기 전에 먼저 테스트 코드를 작성하자 모든 코드는 단위 테스트 코드를 가져야 하고, 각 단위 테스트는 자동으로 실행될 수 있어야 한다. 버그가 발견되면 버그를 고치기에 앞서, 버그를 다시 재현해 내는 테스트 케이스를 정의한 후에 고쳐야 한다. 테스트 코드를 먼저 작성하는 것이 더 유용하다는 관점에 대해서는, 테스트 문서는 스펙 문서에 근거할 뿐만 아니..
Eclipse에 내장된 기능으로도 특정 객체의 hashCode()와 equals()를 작성할 수 있다. 사용법은, 마우스 오른쪽 클릭하여 나오는 context 메뉴로부터 Source > Generate hashCode() and equals() ... 를 클릭하면 된다. 그러면, 다음과 같은 코드가 생성될 것이다. @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((link == null) ? 0 : link.hashCode()); result = prime * result + ((menuCode == null) ? 0 : menuCode.hashCode()); result = ..
FindBugs - EQ_COMPARETO_USE_OBJECTS_EQUALS 사용자가 compareTo()를 override 했을 경우, 볼 수 있는 warning이다. FindBugs의 code inspection에 따르면, This class defines a `compareTo(...)` method but inherits its `equals()` method from `java.lang.Object`. Generally, the value of compareTo should return zero if and only if equals returns true. If this is violated, weird and unpredictable failures will occur in classes s..
import org.springframework.validation.BindException; import org.springframework.validation.ValidationUtils; import org.springframework.web.bind.ServletRequestDataBinder; ... //MultiAcitionController의 bindObject()를 다음과 같이 override한다. protected BindException bindObject(HttpServletRequest request, Object command, Validator validator) throws Exception { ServletRequestDataBinder binder = createBinder..