Programming/Spring

Programming/Spring

[SpringBoot] Spring Boot 2.3.8 도커 컨테이너 만들기 (BuildPack)

Spring Boot 2.3 버전부터 내장 애플리케이션을 Docker Image로 만드는 라이브러리가 포함되어 배포되었다. 내 기억에 초기에는 Jib를 사용했었던 것 같은데, 2.3.8 버전을 사용해보니 BuildPack을 사용하도록 변경되어있었다. BuildPack에 대한 내용은 아래 사이트를 참고하자. buildpacks.io/ Cloud Native Buildpacks Cloud Native Buildpacks transform your application source code into images that can run on any cloud. buildpacks.io 백문이불여일견 기존에 개발하고 있던 프로젝트(2.2.6)를 한번 2.3.8로 버전을 올리고, 내장된 BuildPack 라이브러리..

Programming/Spring

[Spring Cloud] Spring Cloud Gateway - 다운스트림 로그 확인

회사에서 Spring Cloud Gateway를 기반으로 Gateway 서버를 개발하고 잘 운영하고 있었는데, B2B로 서버를 납품했을 때 문제가 발생했었다. 부산에서 제주도에 위치한 서버 API를 호출하는데, 지연 시간이 적게는 5초에서 길게는 15초에서 20초 사이였다. 사실 서버의 문제라기 보다는 네트워크 망의 문제인 것 같은데, 납품되는 곳이 제주도에 위치한 IDC 센터이고, 국정원에서 보안감사를 하고 있어서 패킷 덤프 뜰 수도 없어, 일단 Gateway 서버와 다운 스트림(엣지 뒤에 있는 서비스 서버) 간의 request response 시간대를 보고자 로그를 볼 필요성이 있었다. 감사하게도, Spring Cloud Gateway에서는 해당 기능을 제공하고 있다. cloud.spring.io/s..

Programming/Spring

[Spring Boot] Filter (2) -Response Body Modify

2020/07/15 - [Programming/Java] - [Spring Boot] Filter (1) - Request Body Modify [Spring Boot] Filter (1) - Request Body Modify 스프링 기반으로 서버를 개발하다가, 특정 API를 통해 송 수신되는 모든 데이터를 암호화해야 하는 니즈가 생기게 되었다. 다음은 스프링을 조금 공부해봤다고 하는 사람들은 대다수 알만한 스�� johnmarc.tistory.com 이전 글에서 말했듯이 특정 API를 통해 송수신되는 모든 데이터를 암호화해야 하는 니즈로 인해, 들어오는 요청 데이터를 복호화하는 필터 클래스를 작성하였고, 이번에는 요청을 처리한 결과의 응답 데이터를 암호화하는 필터 클래스를 작성해보겠다. 먼저 @Res..

Programming/Spring

[Spring Boot] Filter (1) - Request Body Modify

스프링 기반으로 서버를 개발하다가, 특정 API를 통해 송 수신되는 모든 데이터를 암호화해야 하는 니즈가 생기게 되었다. 다음은 스프링을 조금 공부해봤다고 하는 사람들은 대다수 알만한 스프링 MVC에서의 요청 처리 구조 사진이다. 보는 것과 같이 요청을 가장 먼저 처리하는 부분은 바로 filter 이다. filter layer에서 요청 데이터를 복호화하고, 이를 그대로 뒷단으로 넘겨서 로직을 처리할 수 있도록 구조를 생각해보았다. 스프링 부트의 기본 웹 서버인 Tomcat은 서블릿 기반으로 웹 요청을 처리하기에, 스프링 부트에서 Http 요청은 javax.servlet.http 패키지 하위에 있는 HttpServletRequest 클래스 객체로 넘어오게 되며, javax.servlet.http 패키지에서..

Programming/Spring

[SpringBoot] Dockerizing a Spring Boot Application

스프링 부트 기반의 어플리케이션을 Docker Container에 올리는 방법을 설명해보겠다. Dockerizing이라는 말은 대상 어플리케이션을 Docker Image로 만들어 Docker에서 Container로 구동 가능한 형태를 만드는 것을 의미한다. 먼저 간단하게 Spring Boot Application을 만들어보자. File -> New Project -> Spring Initializer Next Dependencies -> Web -> Spring Web Click Next 간단하게 hello world를 리턴하는 Controller를 만들어본다. package com.tistory.johnmark.demo; import org.springframework.web.bind.annotatio..

Programming/Spring

[Spring Boot] Java Servlet Filter for Logging Request Parameter

Java, Tomcat, Spring (Spring Boot) 환경에서 Client가 전송한 Request Body를 로깅하고 싶은 경우가 있다. HttpServletRequest 객체의 Stream은 한번 읽히면 Tomcat 내부적으로 다시 읽지 못하도록 보안적으로 막혀있다. 로깅을 위해 Request 객체의 Stream을 받아 Paramter들을 가지고 특정 로직을 구현하고, Controller 단으로 Requset를 넘기면, Data Biding 모듈이 데이터를 바인딩하지 못하고 has already been called for this request 라는 메시지와 함께 Exception이 난다. 이를 해결하기 위해서 대안은 HttpServletRequestWrapper 클래스를 구현하는 것이다. ..

Programming/Spring

[Spring Boot] Spring Security with REST API Login AS JSON

최근 기존에 NodeJS와 Typescript, NestJS으로 이루어진 API 서버를 Java와 Spring Boot 환경으로 마이그레이션 작업을 진행하고 있다. 그중 Spring Security를 적용하면서 REST API 형태로 JSON으로 Login 요청을 날리면 Spring Security에서는 데이터를 받지 못하고 해당 요청을 Block 하는 이슈가 있어서 이를 확인하고 해결한 과정을 기록해본다. Spring Security는 여러개의 Filter들이 묶여서 동작하는 Filter Chain으로 이루어져 있다. 그렇다면 Login을 담당하는 Filter는 어떤 것일까? SecurityConfiguration 클래스를 작성하다 보면 다음과 같은 메소드를 볼 수 있을 것이다. package com...

Programming/Spring

[SpringBoot] Redis Channel Subscribe with MessagePack

Spring Boot 환경에서 Redis로부터 MessagePack으로 압축되어 전송된 문자열을 복호화 하느라 며칠 삽질을 했었다. 최신 릴리즈 버전과 관련 자료도 없었기에 더 고생을 했는데, 나 같은 사람이 더 이상 발생하지 않길 빌며 공유해본다. 😅 Spring Boot에서 Redis를 사용하고 있고, 특정 Channel을 Subscribe 하고 있을 때, Publish 되어 전송되는 메시지가 MessagePack 방식으로 압축이 되어있는 경우 다음과 같이 압축을 해제하여 메시지 원문을 받을 수 있다. * MessagePack 이란? MessagePack: It's like JSON. but fast and small. MessagePack for CLI What is it? This is Messa..

JohnMark
'Programming/Spring' 카테고리의 글 목록