반응형

Back-End/Spring framework 30

SSE를 활용해 웹에서 실시간 데이터 구독 기능 구현

프로젝트를 진행하다가 서버에서 주기적으로 발행하는 데이터를 클라이언트에서 실시간으로 받아 표시해주어야하는 기능을 구현할 일이 생겼다. 제일 먼저 생각났던건 웹소켓이었는데 물론 웹소켓으로도 구현은 가능하지만 웹소켓에서 지원하는 양방향 통신까지는 필요가 없고 서버 -> 클라이언트 방향으로의 단방향만 지원하면 돼서 다른 기술을 찾아보다가 SSE를 알게 되었다. SSE는 Server Send Events의 약자로 HTML5부터 사용하능한 표준 스펙이다. 말 그대로 서버에서 주기적으로 발행하는 이벤트를 클라이언트(브라우저)에서 구독할 수 있는 기술로 접속연결만 HTTP로 하고 자체 프로토콜로 통신하는 웹소켓과 달리 전체 과정을 HTTP로 수행한다. 사용하는 방법은 간단하다. 먼저 원리를 알기 위해 SSE 스펙에 ..

Spring Boot Managed Dependency 버전 변경

Spring Boot는 Spring Framework와 달리 프레임워크 빌드, 런타임 등에 필요한 의존성을 자동으로 관리해주는게 큰 장점중에 하나인데요. Spring Boot에서는 관련 있는 기능 및 의존성을 묶어 하나의 의존성으로 제공하고 개발자들은 필요한 의존성만 선택하여 사용하면 됩니다. 그 안에서 일어나는 라이브러리 간의 호환성, 중복되는 라이브러리로 인한 충돌 등으로부터 자유로워지죠. 이를 Spring Boot 진영에서는 Managed Dependency라고 부르며 아래 링크에서 어떤 의존성들을 관리하고 있는지 볼 수 있습니다. https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html 다만 가끔은..

Spring Boot Tomcat Access Log 필터링

Spring Boot Embedded Tomcat을 사용하면 Access Log를 남길수 있습니다. 기본적으로는 비활성화 되어있고 server.tomcat.accesslog.enabled 옵션을 true로 주면 활성화 할 수 있습니다. Access Log는 해당 서버로 들어오는 모든 요청들을 로깅하는데 이 중 로그로 남기고 싶지 않은 건들이 있을 수 있습니다. 저의 경우엔 외부 모니터링 서버에서 헬스체크를 위해 헬스체크 URL을 1초에 한번씩 호출했고, 엑세스 로그가 과도하게 남는 케이스였습니다. 톰캣 Access Log 스펙 중에, HttpServletRequest 객체의 Attribute 내 특정 키가 포함되있거나, 되있지 않을 경우 해당 요청에 대해서는 로깅을 하지 않도록 설정할 수 있는 기능이 있..

Docker Compose 를 이용해 Spring Boot + MySQL 서비스 구축 (기초)

이 글은 개인적으로 공부를 목적으로 여러 블로그, 문서를 참조하며 작성하여 부정확하거나 내용이 부실할 수 있는점 양해드리며 잘못된 부분이 있다면 댓글로 알려주시면 감사하겠습니다 :) 간단한 웹 서비스를 구축한다고 가정한다. 간단하면서 일반적으로, 백엔드 애플리케이션 + DB와 프론트에 Nginx를 두는 구조를 많이 사용한다. docker 환경에서는 백엔드 애플리케이션, DB, Nginx를 각각 설정하고 컨테이너화 하여 관리할 수 있다. 다만 서버 장비가 증설된다면 각 컨테이너 설정을 다시 해주어야하는 번거로움이 존재한다. Docker Compose는 한 서비스를 위한 여러 컨테이너를 관리를 하나의 파일에서 할 수 있고 여러 컨테이너들을 동시에 실행시킬 수 있다. 이를 통해 위와 같이 매번 컨테이너를 설정..

Spring Boot 애플리케이션 Docker 컨테이너로 배포 (기초)

명령어 간략 정리 docker images # 이미지 목록 조회 docker ps # 실행중인 컨테이너 목록 조회 (-a 옵션 시 종료된 컨테이너 목록도 보여줌) docker kill CONTAINER_ID # 컨테이너 종료 도커 이미지 빌드 명령어 docker build --tag [repo:tag] [Dockerfile path] e.g. docker build --tag myservice:0.1 컨테이너 실행 관련 명령어 docker run IMAGE_ID # 이미지ID 기반 새 컨테이너 생성하여 실행 docker run repo:tag # 레파지토리&태그에 해당하는 이미지 기반 새 컨테이너 생성하여 실행 docker start CONTAINER_ID # 기존 생성된 특정 컨테이너를 실행시킴 doc..

[짧은정리] Gradle Multi Module 구성 시 참고사항

멀티 모듈 구성 시 보통 common 모듈을 두고 나머지 모듈 (e.g. API 모듈, Batch 모듈, ..) 에서 common 모듈을 참조하도록 구성한다. common 모듈에 작성한 공통 로직 + 의존성을 타모듈들에서 중복없이 사용하기 위함이다. 이 때 common 모듈에 dependency를 `implementation`으로 잡을 경우 common을 참조하는 타 모듈에선 common의 코드들만 노출되고 common의 dependency들은 노출되지 않는다. 예를 들어 common 모듈에 JPA Starter 의존성을 implementation으로 잡으면 api, batch 모듈에선 JPA 관련 코드가 노출이 안되는 것이고 JPARepository 등을 상속받아 구현된 Repository들에 find..

Spring Cloud Gateway 기본 활용법

0. Spring Cloud Gateway 란? Netflix OSS의 API Gateway 컴포넌트인 Zuul을 Spring 진영에서 직접 만든 API Gateway 입니다. Zuul은 기본적으로 블록킹 방식으로 동작했었는데요. (Zuul 1.x) 이를 개선하기 위해 Zuul 2.x에서 논블록킹 방식을 도입했습니다. Spring 진영에서는 Zuul의 동기방식이었던 단점을 보완하며 Spring 생태계에 더 적합한 형태의 비동기 API Gateway를 만든것이 바로 Spring Cloud Gateway 입니다. This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 5, Spring Boot 2 ..

Spring Security + JWT를 활용한 토큰 기반 인증 구현 (with Spring Boot)

Spring Security는 Spring Framework 기반 웹 애플리케이션의 보안을 담당하는 프레임워크입니다. Spring Security is a framework that provides authentication, authorization, and protection against common attacks. With first class support for both imperative and reactive applications, it is the de-facto standard for securing Spring-based applications. 웹 보안은 기본적으로 요청하는 사용자를 식별하는 인증(Authenticate)과 인증된 사용자가 보호된 리소스에 접근할 권한이 있는지 확인..

스프링 부트 (Spring Boot) 와 의존성 관리

스프링 부트의 강력한 장점 중 하나는 스프링, 써드파티 라이브러리 의존성을 관리해주는 부분이라고 생각합니다. 의존성 관련 내용에 앞서 스프링 부트가 무엇인지 간략하게 소개하겠습니다. 스프링 부트 (Spring Boot)란? 스프링 부트 공식 홈페이지에서는 다음과 같이 소개하고 있습니다. Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run". 상용 수준의 독립실행형 스프링 애플리케이션을 쉽게 만들 수 있도록 해주는 기술로 대표적으로 다음과 같은 기능을 제공합니다. 독립 실행형 애플리케이션 제작 Create stand-alone Spring applicat..

Java Bean Validation 사용하기

Java Bean Validation는 공식 사이트에서는 오브젝트 레벨의 제약 선언 및 유효성 검사 기술을 제공하는 것을 목표로 하고 있는 기술이라고 합니다. The technical objective of this work is to provide an object level constraint declaration and validation facility for the Java application developer, as well as a constraint metadata repository and query API. 실제로 프로그래밍을 하다보면 어떤 객체의 값이 비었는지, 공백인지, 날짜가 이전인지 등의 유효성 검사를 빈번하게 수행하게 되고 이로 인해 유효성 검사 로직들이 여러 곳에 흩어지게 ..