본문 바로가기

프로그래밍/Spring

Log4j CVE-2021-44228 취약점을 프로젝트에서 직접 점검하고 보완하는 방법 2021년 12월 13일 한 주를 시작하는 월요일에 가뜩이나 급작스런 상황이 벌어졌다. 그것은 Apache 재단에서 배포하는 log4j2(log4j 2.X 버전)에 제로데이 취약점이 발견되었기 때문이다. 제로데이 취약점이란 라이브러리를 개발한 개발자보다 해당 라이브러리를 사용하는 사용자가 먼저 발견한 취약점을 얘기한다. 라이브러리를 개발한 개발자가 발견한 취약점이면 대응방안을 발표하고 이를 수정 보완한 업데이트 버전이 올라오기 때문에 큰 문제가 발생하지는 않겠지만 개발자가 아닌 사용자가 먼저 취약점을 발견했을 경우 개발자 입장에서는 취약점의 존재 자체를 모르기 때문에 취약점을 발견한 사용자가 이를 악용할 소지가 있기 때문이다. 다행히도 이번 취약점은 log4j 를 개발한 Apache 재단 및 이를 사용하..
@DataJpaTest 와 P6Spy 를 같이 사용하기 이 글에서 사용된 Source는 Github에 올려두었습니다. 사용된 DB는 H2 Database이며 관련 Database 스키마는 src/main/resources/sql 에 있는 schema.sql 파일을 보시면 됩니다. src/main/resources 에 있는 application.yaml 파일에서 spring.datasource 부분을 독자분들의 Database 환경에 맞춰서 적용하세요. SpringFramework를 이용하는 개발을 진행하면서 SQL 문을 보기 위해 사용했던 라이브러리로 log4jdbc-log4j2 라이브러리를 주로 사용했었다. 그러나 okky를 통해 p6spy를 알게 되면서 한번 이 라이브러리를 적용해볼려고 기존에 공부용으로 만들어놓은 프로젝트에 이 라이브러리를 적용하게 되었..
Spring Boot 를 Docker 에 올려보자(feat. Spring Boot 2.3) (2) 지난 글에서는 Spring Boot App을 layer 가 있는 형태로 만든뒤 이를 Docker 이미지로 만드는 방법을 알아보았다. 이번에는 그보다 더 간단한 방법을 하나 알려주려 한다. 저번 방법은 Dockerfile 자체는 프로그래머가 직접 만들어야 했지만 지금 소개할 방법은 그런 과정도 없이 만드는 것이다. 바로 BuildPack을 이용하는 방법이다. Cloud Foundry나 Heroku를 이용해본 개발자라면 BuildPack을 이용해본 경험이 있을것이다(참고로 나는 아직 이용해본 경험이 없다. 다만 클라우드 교육을 받을 당시 Cloud Foundry 에서 BuildPack을 이용해 개발하는 실습은 해본적은 있지만 그때 딴짓을 해야 할 상황이 있어서 제대로 듣지도 못했다..ㅠㅠ..) 단순하게 설명..
Spring Boot 를 Docker 에 올려보자(feat. Spring Boot 2.3) (1) Spring Boot를 이용해서 만든 App을 Docker 이미지로 만드는 작업에 대한 글을 쓰도록 하겠다. 사실 이 주제는 검색해보면 관련 글들이 많이 나와 있다. 다만 개인적으로 이번에 이 글을 쓰는 이유는 Spring Boot 2.3 부터 Spring Boot App을 Docker Image로 만드는 작업을 Maven 플러그인과 Gradle 플러그인을 이용해서 공식지원하게 되어 글을 쓰게 되었다. 일단 관련 내용은 여기를 클릭하면 볼 수 있다. Docker Image는 Layer로 표현되는 계층구조로 되어 있다. 이것을 이용해서 같은 Layer 계층은 재활용해서 사용할 수 있는 구조로 되어 있다. Spring은 이를 활용하기 위해 Jar 파일을 만들때 App을 4개의 계층으로 분리해서 만드는 방법을..
Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (10) - 예외처리 이번 글은 이 연재의 마지막으로 해당 템플릿에서의 예외처리에 대해 설명하도록 하겠다. 우리가 만든 Spring Application에서는 이런저런 이유로 예외가 발생할 수 있다. 비즈니스적인 로직으로 인해 발생하는 예외도 있고 Runtime 예외도 있다. 예외가 발생할 경우 try-catch를 이용해서 발생시점에서 해당 예외에 대한 처리를 할 수 있지만 비즈니스적으로 이러한 예외처리를 해야 하는게 아니라면 발생된 예외는 호출한 곳으로 계속 던져지게 된다. 단계별로 예외가 계속 던져지게 되면 최종적으로는 Controller 까지 도달하게 되며 Controller에서도 예외 처리를 안하게 되면 Controller 에서는 다시 예외를 던져서 Spring에서 정해져있는 ExceptionResolver 객체에서 ..
Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (9) - XplatformView 분석 이전 글까지는 Xplatform에서 넘어온 DataSetList과 VariableList를 Controller의 메소드 파라미터에서 자바 객체로 변환해주는 HandlerArgumentResolver 인터페이스 구현 클래스에 대해 설명했다. 지금까지의 내용이 Xplatform에서 넘어온 데이터들을 Spring에서 사용하기 위해 적절하게 데이터를 변환한 작업이었고 지금부터 설명한 내용은 Spring에서 나온 데이터를 Xplatform에서 사용가능한 데이터로 변환하는 작업에 대해 설명하고자 한다. 이해를 돕기 위해 설명하자면 자바에서 제공하는 List 객체로 나온 결과물을 Xplatform에서 제공하는 DataSet 클래스 객체로 변환하는 것이다. 이 부분에서도 또한 Java의 Reflection 기능을 사용..
Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (8) - HandlerMethodArgumentResolver 분석(4) 저번 글에서는 HandlerMethodArgumentResolver 인터페이스를 구현한 클래스인 XplatformArgumentResovler 클래스에서 @RequestDataSet 어노테이션이 붙었을 경우에 대한 처리를 설명했다. 이제 3개의 어노테이션 중 마지막인 @RequestVariable 어노테이션에 대한 설명을 하도록 하겠다. 먼저 이 부분에 대한 전체적인 골격에 대한 설명을 하도록 하겠다 else if(annotationClass.equals(RequestVariable.class)) {// @RequestVariable 어노테이션에 대한 처리 RequestVariable requestVariable = (RequestVariable)annotation; String variableName ..
Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (7) - HandlerMethodArgumentResolver 분석(3) 저번 글에서는 @DataSet 어노테이션을 이용해서 DataSet 객체를 사용자가 지정한 파라미터 타입으로의 변환에 대한 대강의 윤곽을 잡았다. 약간 요약식으로 여기서 다시 한번 언급한다면 DataSet에 저장되어 있는 insert-update, delete 레코드들을 각각 변환시키는데 이때 사용자가 Collection 인터페이스 계얄 타입으로 파라미터를 설정했는지 확인해서 그 내부에 정의한 Generic 클래스 타입으로 변환한다고까지 얘기했었다. 다만 저번글에서는 이 변환 부분에 대해 구체적인 설명을 하진 않고 XplatformReflectionUtils 클래스에서 정의한 staric 메소드들을 사용하는 것으로 설명했다. 이번글은 이 static 메소드들에 대한 구체적인 설명을 진행해보고자 한다. 이 ..