스프링 시큐리티 필터가 2번 중복적용된 문제 해결

Intro JWT 토큰 값을 읽어서, 상황에 따라 인증하거나 만료되었다면 리프레시 토큰을 사용해 새로운 토큰을 발급받는 역할을 하는 JwtAuthFilter 를 만들어 등록해두었다. 시큐리티 필터체인에서 아래와 같이, AuthorizationFilter 이전에 등록해서 작동하도록 해 두었는데 http.addFilterBefore(jwtAuthFilter, AuthorizationFilter::class.java) 요청이 올 때마다 자꾸 해당 필터를 두번씩 거치는 문제가 있었다. 원인 간편하게 Bean으로 등록 해두고 사용하려고 클래스에 @Component 어노테이션을 붙여서 사용했는데 그게문제였다. 아래는 스프링 부트 도큐먼트에서 Filter에 관한 내용이다 https://docs.spring.io/sp..

Programming/JPA ⁄ Spring 2024.01.23
[Spring Boot] 정적자원 캐싱하는방법

Intro 가족들이 필요로해서 만들었고, 운영한지 이제 한 2년정도 된 스프링부트로 만든 토이 프로젝트가 있다. 리액트를 필두로 몇년째 이어지는 프론트엔드 춘추전국시대에 특별히 마음에 들거나 잘하는 프론트엔트 프레임워크가 없다보니, 사용하고 싶은 프론트엔드 스펙이 정해지면 그때 떼낼 생각으로 최대한 API콜 위주로 하며 thymeleaf로 개발했고, 아직까지는 큰 불편없이 쓰고 있다. 지금까지는 부트스트랩 jQuery vue.js 등의 라이브러리를 대부분 CDN에서 받아오도록 해놨었는데 이제부터는 소스코드에 포함해 배포하기로 했다. 오프라인이나 내부망에서 사용할 프로젝트는 아니기때문에 특별히 변경해야 할 이유는 없었지만 그래도 어플리케이션의 전체적인 구동을 통제하에 두고싶은 마음에 해보았다. 문제 그런데..

Programming/JPA ⁄ Spring 2024.01.23
SpringBoot 2.x 버전 프로젝트 생성 방법

Intro 새로운 프로젝트 요청이 왔는데, Java 11 을 사용해 스프링부트로 프로젝트를 만들어야 하는 요구사항이 명시되었다. 그런데 스프링부트 3버전대의 등장 이후 2.x 버전으로 프로젝트를 생성한 적이 한번도 없었어서 이제야 알았는데 Spring Initializr 에서 스프링 부트 2.x 버전이 모두 제거되었다. 스프링 3.0 부터는 최소 JDK 요구 사항이 17이기 때문에 Spring Initialzr 에서는 이제 더이상 17 아래의 자바 버전들도 취급을 안해준다. 자바 버전은 17, 21만 선택 가능하다. 스프링부트는 2버전 선택이 불가능하다 당연하겠지만 start.spring.io 에 들어가서 생성하려 해도 마찬가지다. https://start.spring.io/ 이정도에서 끝나는게 아니고 ..

Programming/JPA ⁄ Spring 2024.01.08
[Java] Carriage return 그리고 Line feed

Intro HWPX 이야기 이 사건은 사용자가 요청하는 정보에 해당하는 HWPX 파일을 서버에서 실시간으로 만들어서 사용자가 다운로드 받을 수 있도록 제공하는 기능을 구현하던 중 발생했다. hwpx파일은 엑셀처럼 기본적으로 zip 파일로 되어 있어, 파일 확장자를 .zip으로 변경한 뒤에 압축을 풀면 내부 파일 구조를 확인 할 수 있다. Contents 폴더, META-INF 폴더, Preview 폴더가 있는데 그 중 Contents 폴더의 section0.xml 이 내용물을 담고있는 핵심 파일이다. 그런데 문제는 마음대로 바꾸고 싶은대로 바꾸면 한컴오피스에서 파일이 열리지 않았다. 줄바꿈, 탭문자등이 들어가면 어김없이 프로세스가 죽어버린다. 그들이 정의해놓은 포맷에 맞게 기입해야만 한다. 예) 줄바꿈 ..

Programming/Java 2024.01.05
[Java] Serializable 인터페이스 이해하기

Intro 데이터를 한 시스템에서 다른 시스템이나 네트워크로 전송하거나 데이터를 파일에 저장할 때, 그 데이터를 전송가능한 형태로 변환해야 한다. 객체는 입체 형태지만, 데이터가 이동하는 통로는 0과 1로만 이루어진 일차원의 세상이기 때문이다. 이 과정을 직렬화(serialization)라고 하며, 데이터의 직렬화의 방법은 XML이나 JSON등 우리가 흔히 아는 것 외에도 정말 많은 방법들이 있다. 자바에서는 Serializable 인터페이스를 구현하여 이를 수행할 수 있게 된다. 자바 내에서의 직렬화는 객체의 상태를 바이트 스트림으로 변환하여 파일에 저장하거나 네트워크를 통해 전송할 수 있도록 하는 과정이다. 자바 플랫폼 내에서만 데이터를 주고받는다면 아래의 강점을 지니고 있기 때문에 여전히 많이 사용..

Programming/Java 2023.11.08