반응형

Back-End 78

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_..

Java / Servlet 비동기 기술 흐름 with Spring

1. Servlet 3.0 이전기존 알고 있었던과 같이 1 Request per 1 Thread 할당 방식이다.오래걸리는 무거운 작업은 @Async 를 활용해 비동기로 처리할 수 있었지만 이는 말 그대로 해당 스레드 내부에서 유효할 뿐 해당 작업이 끝나기 까지 그 스레드가 반환되지 못하는건 매한가지였다.톰캣의 NIO 지원은 HTTP Connection 관련 부분을 비동기로 처리하는 것 뿐 서블릿 동작과는 별개의 문제이 방식의 문제점은 짧게 끝나는 작업이 오래 걸리는 작업이 스레드를 오래 점유하여 덩달아 오래걸리게 되는 문제가 있었다.2. Servlet 3.0Servlet 3.0 부터는 이런 문제점을 어느정도 해결하여 오래 걸리는 작업을 별로 스레드에 할당하여 처리하고,해당 스레드는 빨리 반환하여 다른 요..

Java CompletableFuture 개념 및 간단한 활용 사례

Future 는 비동기 작업 수행의 결과를 담고있는 자바의 인터페이스이다.ListenableFuture 는 Spring 에서 제공하는 인터페이스로 Future에 콜백을 등록해 사용할 수 있도록 한 방식이다.자바 8 때 소개된 CompletableFuture 는 여러 비동기 작업을 결합하고 처리하는데 기존 방식에 비해 훨씬 편하게 수행할 수 있다.아래는 간단히 반환값이 없는 2개 비동기 작업을 수행하는 예시이다.CompletableFuture .runAsync(() -> log.info("runAsync")) .thenRun(() -> log.info("thenRun"));반환값이 있는 비동기 작업은 아래와 같이 할 수 있다.CompletableFuture .supplyAsync(() -> 1) // 비..

[짧은정리] 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들에 findAll,..

Kotlin 프로퍼티 (Properties and Fields)

보통 객체지향 프록그래밍에서 클래스를 정의할 때 객체의 상태는 멤버변수 (필드)로 행위는 메소드로 표현합니다.그리고 보통 멤버변수가 있으면 객체의 값을 설정하고 가져오는 (setter / getter) 메소드가 동반되는 경우가 많은데요.코틀린에서는 이런 요소를 아우르는 프로퍼티라는 개념이 제공됩니다.즉 프로퍼티는 getter, setter와 같은 접근자를 포함하고있는 필드입니다.프로퍼티 정의프로퍼티를 정의하는 전체 문법은 아래와 같습니다.(var/val) [: ] [= ] [] []var / val : 프로퍼티 선언을 위한 예약어. var는 초기화 후 값 변경이 가능한 프로퍼티, val은 초기화 후 값 변경이 불가능한 프로퍼티propertyName: 프로퍼티명Propert..

Back-End/Kotlin 2021.09.07

Kotlin 생성자 개념과 사용법 정리

코틀린에서 생성자를 정의하는 여러가지 방법에 대해 정리합니다.코틀린 생성자는 크게 주 생성자(primary constructor)와 부 생성자(secondary constructor)로 나뉘고 각각 제약이 조금씩 다릅니다.1. 주 생성자 (Primary constructor)기본적으로 constructor 키워드를 통해 생성자를 정의할 수 있습니다.constructor 키워드 앞에 접근 제한자를 지정할 수 있습니다.constructor 키워드 자체를 생략할 수도 있습니다. 단, 이경우엔 접근 제한자는 지정할 수 없습니다.이렇게 선언하는 생성자를 주 생성자라고 합니다.class Person constructor(name: String, age: Int)// 접근 제한자 지정class Person priva..

Back-End/Kotlin 2021.09.07