본문 바로가기

분류 전체보기101

세션을 생성하는 getSession()에 대해 알아보기 배경 팀원이 작성한 프로젝트 코드 중 일부에서 세션 존재 여부를 검증하기 위해 조건문으로 getSession()을 사용하는 경우가 있었다. 처음에는 대수롭지 않게 넘어갔지만, 해당 로직이 로그인하지 않은 상태인데 접근할 수 있는 영역에 존재해서 로그인을 하지 않았음에도 불구하고 세션을 발급하는 문제가 생겼다. getSession() 세션 기반 인증 방식을 가진 애플리케이션에서 HttpServletRequest.getSession()을 통해 우리는 간단하게 session 정보에 접근할 수 있다. session에 접근해서 세션 정보를 확인 할 수도 있고, 세션을 무효화(invalid) 시킬수도 있다. 하지만 파라미터가 없는 getSession()은 숨겨진 기능이 존재한다. 바로 세션을 생성하는 것이다. Ht.. 2023. 10. 22.
[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.
인텔리제이 한글 깨짐 UTF-8 설정 인텔리제이 콘솔 한글이 깨지는 경우, 다음과 같은 3단계 설정을 통해 문제를 해결 할 수 있다. 1. File Encoding 설정 File > Settings > File Encodings 2. VMOptions 설정 Help > Edit Custom VM Options... -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 해당 옵션들 추가 3. 캐시 초기화 File > Invalidate Caches... Invalidate and Restart 버튼을 누른 뒤 재실행 된 인텔리제이로 다시 콘솔을 확인하면 한글 깨짐 문제가 해결된 것을 볼 수 있다. 2023. 9. 2.
외부 라이브러리 내부 sendRedirect() 사용 우회 방법 📌 배경 sendRedirect()는 한 번만 호출이 가능하다는 특징을 가지고 있다. 만약 하나의 Response에서 sendRedirect()를 두 번 이상 호출을 시도하는 경우, java.lang.IllegalStateException : Cannot call sendRedirect() after the response has been committed 메시지와 함께 예외가 발생하게 된다. 그런데 만약 특정 외부 라이브러리의 어떤 기능이 HttpServletResponse를 매개변수로 받아서 내부적으로 sendRedirect를 호출하는 경우, 라이브러리 사용자는 sendRedirect를 막거나 우회할 수는 없는 걸까? 예시 ) cors 문제 발생, 특정 도메인 경로로 가는 게 마음에 들지 않는 경우 .. 2023. 8. 26.