Spring61 [Spring] 동일한 패키지 클래스 생성으로 라이브러리 직접 수정하기 😤 배경 프로젝트에는 회사에서 개발한 자사 라이브러리를 사용하는데, 자사 라이브러리 특정 클래스에 문제가 발생해서 수정이 필요한 상황이 발생했다. 그때 라이브러리를 직접 수정하는 방법에 대해서 알게 되었고 해당 내용을 공유하고자 한다. 📌 문제 해당 상황을 최대한 비슷하게 재연해보았다. 1. external-lib external-lib라는 외부 라이브러리를 사용한다. 해당 모듈에는 ShibaHolic 이라는 클래스를 가지고 있다. public class ShibaHolic { public void getShibaHolic() { problem(); System.out.println("성공"); } private void problem() { System.out.println("문제 발생"); } } S.. 2023. 10. 7. @TempDir 활용해서 파일 테스트 코드 작성하기 🤔 배경 외부 서비스에서 매일 특정 시간에 배치를 통해 전달되는 csv 파일을 읽는 배치 프로그램을 구현한 뒤, 파일 읽는 부분을 검증하기 위해 단위 테스트 코드를 작성하려고 하는데.. 파일 관련 테스트 코드는 처음이라 "파일은 어떻게 반복적인 테스트 코드를 작성해야 될까?"라는 고민을 하게 되었고, 관련 내용을 찾아보며 알게 된 @TempDir이라는 걸 활용해 보게 되었다. 해당 경험을 바탕으로 @TempDir을 통한 테스트 코드 작성 법에 대해 공유해보고자 한다. 1. @TempDir 이란 - Junit에서 지원하는 임시 디렉터리를 생성용 테스트 어노테이션 - 개별 테스트 또는 테스트 클래스의 모든 테스트에 대해 임시 디렉터리를 만들고 정리할 수 있다. - 테스트할 때 직접 파일을 생성하고 삭제하는 .. 2023. 9. 25. Spring 인텔리제이 Service, Common, Batch 모듈 분리하기 (Maven) 🙄 배경 토이 프로젝트와 회사 프로젝트에서 Spring, IntelliJ, Maven을 기반으로 모듈 분리를 하면서 알게된 모듈 분리 방법과 모듈 분리 과정에서 겪을 수 있는 문제를 해결하는 설정 방법에 대해 공유하고자 한다. 👍 모듈 분리를 해야 하는 이유? - 의존성 최소화 예를 들어, 동일한 모듈에서 배치 서비스를 개발할 때는 스프링 시큐리티가 필요 없을 수 있는데, 이때 동일한 모듈이라는 이유로 강제로 스프링 시큐리티 의존성을 포함하게 되면서 개발/테스트 과정에서 시큐리티 때문에 영향을 받을 수 있다. 모듈을 분리하면 필요한 최소 의존성만 관리함으로써 이러한 의존성 관련 문제/영향을 고려하지 않아도 된다. - 유지보수 특정 모듈에 장애가 발생한다면 해당 모듈만 확인하면 되기 때문에 문제를 해결하기.. 2023. 9. 17. 스프링 배치가 제공하는 기본 ItemReader 상속해서 사용하기 🤔 배경 프로젝트 배치 모듈 개발 컨벤션을 정하는 과정에서 처음에 Job 설정 파일에 관련된 모든 Bean(Job, Step, ItemReader, 등)을 넣자고 했을 때 "그러면 Chunk 기반 Step을 구성 중에 ItemReader와 ItemWriter 중 하나는 스프링에서 제공하는 기본적인 클래스를 사용하고, 하나는 기능이 복잡해서 별도로 만든다고 하면 어떻게 하는 게 좋을까?" 라는 질문이 나왔다. 예를 들면, ItemReader는 구현이 단순해서 FlatFileItemReader를 사용하고, Writer는 복잡해서 별도 클래스에 ItemWriter를 구현한다는 의미이다. 해당 질문을 듣고 나는 "ItemReader는 설정 파일에 Bean으로 등록하고, Writer는 별도 클래스로 빼는 게 맞는.. 2023. 9. 10. WebSecurity ignoring()에 대한 오해와 미적용 문제 해결 방법 😬 배경 회사 프로젝트에서 특정 요청을 필터에서 제외해야 하는 경우가 있었다. 필자는 스프링 시큐리티 WebSecurity ignoring() 메서드에 특정 패턴이 보안(필터링)에 걸리지 않도록 추가했다. 하지만 이전에 등록한 필터에 계속해서 걸리게 되었고, 관련 원인을 파악하고 해당 케이스를 어떻게 해결할지 고민한 내용에 대해서 작성해 본다. WebSecurity ignoring() 기능이란? 스프링 시큐리티에서는 애플리케이션에 구성한 보안적 요소(필터, 패턴, 권한 등)를 무시할 수 있도록 WebSecurity의 ignoring() 기능을 제공한다. 해당 기능에 등록된 패턴들은 보안적 요소를 거치지 않고 바로 통과한다. 따라서 인증/인가가 필요하지 않은 정적 리소스에 대한 요청은 해당 기능 활용한다... 2023. 9. 10. 외부 라이브러리 내부 sendRedirect() 사용 우회 방법 📌 배경 sendRedirect()는 한 번만 호출이 가능하다는 특징을 가지고 있다. 만약 하나의 Response에서 sendRedirect()를 두 번 이상 호출을 시도하는 경우, java.lang.IllegalStateException : Cannot call sendRedirect() after the response has been committed 메시지와 함께 예외가 발생하게 된다. 그런데 만약 특정 외부 라이브러리의 어떤 기능이 HttpServletResponse를 매개변수로 받아서 내부적으로 sendRedirect를 호출하는 경우, 라이브러리 사용자는 sendRedirect를 막거나 우회할 수는 없는 걸까? 예시 ) cors 문제 발생, 특정 도메인 경로로 가는 게 마음에 들지 않는 경우 .. 2023. 8. 26. nginx에서 서버로 도메인 전달하기 😥 배경 클라이언트로부터 받은 요청의 도메인 정보를 바탕으로 특정 처리를 해야 하는 요구사항이 추가되었다. 필자는 도메인 값은 Request에서 getServerName()을 통해 쉽게 확인할 수 있다는 걸 알고 있어서 이를 바탕으로 요구사항을 빠르게 처리하려고 했다. 하지만 getServerName()에는 서버의 ip 주소(172.xxx.xxx.xxx)만 받는 것을 확인하게 되었고, 결국 요청을 보내는 클라이언트 웹 서버(nginx) 설정 까지 확인하게 되었다. ✂️ 서비스 구성도 서비스는 외부에서 도메인 뒤에 /api ... 로 시작하는 요청이 들어오는 경우, nginx에서 proxy_pass 설정을 통해 내부 IP 백엔드 서버(172.xxx.xxx.xxx:8080)로 요청을 보내는 구조를 가지고 있.. 2023. 8. 26. @Transactional 특징, 사용방법, 주의점 😤 배경 스프링에서 트랜잭션 처리가 필요한 경우, 나는 간단하게 JPA와 함께 @Transactional 어노테이션을 클래스 혹은 메서드에 설정해 왔다. 그러던 중 최근 운영 중인 서비스에서 Transaction Lock 이슈가 발생하면서 문득 이렇게 막 사용하는 게 옳은 일인가를 고민하게 되었고, 조사 및 정리 차원에서 해당 내용에 대해 작성하게 되었다. 해당 포스팅에서는 @Transactional 개념과 원리보다는 특징, 사용 방법, 주의점에 대해서 간단하게 설명하고자 한다. 1. 특징 @Transactional은 다음과 같은 특징을 가지고 있다. - AOP를 통해 구현되었다. - 어노테이션이 선언된 클래스에 트랜잭션이 적용된 프록시 객체가 생성된다. - CheckedException 또는 예외가 없.. 2023. 8. 15. 이전 1 2 3 4 5 6 7 8 다음