용로그
article thumbnail
[Spring] Resilience4j를 활용하여 CircuitBreaker 적용하기
Spring Framework 2023. 11. 10. 20:40

들어가며 이번 글에서는 자바 진영의 서킷 브레이커(CircuitBreaker) 라이브러리인 Resilience4j를 사용하여 외부 서버 통신에 대한 장애를 처리하는 방법을 살펴보겠습니다. 서킷 브레이커 패턴에 대한 내용은 이 글을 참고해 주세요. Resilience4j Resilience4j에는 여러 가지 코어 모듈이 존재합니다. 이 중에서 CircuitBreaker를 활용할 것이기 때문에 이 부분만 자세히 살펴보도록 하겠습니다. CircuitBreaker Resilience4j의 CircuitBreaker는 CLOSED, OPEN, HALF OPEN으로 이루어진 일반적으로 3가지의 일반 상태와 DISABLED 및 FORCED OPEN으로 이루어진 2가지의 특수 상태를 제공합니다. CircuitBreak..

article thumbnail
[Spring] Server-Sent Event를 이용한 실시간 클라이언트 동기화
Spring Framework 2023. 11. 9. 23:50

들어가며 서비스를 개발하다 보면 클라이언트의 요청이 없어도 서버에서 자체적으로 데이터를 전달해줘야 할 때가 있습니다. 대표적으로 알림과 같은 기능이 있는데요, 사이드 프로젝트를 진행하면서 비슷한 요구사항을 만났습니다. PR 수동 동기화 기능을 개발하였는데, 이때 동기화된 PR을 다른 유저들도 실시간으로 볼 수 있어야 하기 때문에 화면을 보고 있는 모든 클라이언트에게 변경 사항을 전달해줘야 합니다. 여기서 Server Sent Event(SSE)라는 것을 사용하여 이 문제를 해결할 수 있습니다. 이번 글에서는 Spring에서 SSE를 활용하여 클라이언트에게 직접 데이터를 전송하는 방법을 알아보겠습니다. SSE란? SSE(Server-Sent Events)는 웹 애플리케이션에서 서버로부터 비동기적으로 전송받..

article thumbnail
[Spring] 로컬 캐시(Local Cache) 도입으로 성능 개선하기
Spring Framework 2023. 11. 9. 16:43

들어가며 집사의 고민 서비스의 기능 개발이 거의 마무리되면서 기존 코드 또는 기능의 퀄리티를 올리기 위한 작업 중 캐시를 적용하자는 의견이 나왔습니다. 이번 글에서는 집사의 고민 팀에서 사용하는 캐시와 분석한 내용을 공유하려고 합니다. 캐시는 웹사이트, 브라우저, 앱이 더 빠르게 로드되도록 돕기 위해 데이터를 임시로 저장해 놓은 공간입니다. 요청한 데이터를 캐시에서 찾을 수 있으면 Cache Hit, 찾을 수 없다면 Cache Miss가 발생합니다. 글로벌 캐시 vs 로컬 캐시 글로벌 캐시(Global Cache) 서버가 여러대로 분산되어 있는 분산 환경에서 적합한 캐시 전략입니다. 당연하게도 별도의 캐시 서버를 두고 공유하여 사용하기 때문에 서버 간 데이터 공유가 쉽다는 장점이 있습니다. 반면, 로컬캐..

article thumbnail
[Spring Boot, OAuth 2.0] 스프링 부트 + OAuth 2.0 사용하기 - Feat. Github API
Spring Framework 2023. 7. 13. 20:50

서론 서비스를 개발하는 중 다른 서비스(구글, 네이버, 카카오, 깃허브..)의 소셜 로그인이 필요하거나 또는 일부 API를 필요로 하는 상황이 많았습니다. 특히 외부 서비스에서 제공하는 데이터들을 크롤링 할 수도 있지만, 법적인 문제가 발생할 수도 있고요. 하지만 꽤나 많이 사용되는 부분임에도 불구하고, 많은 게시글 중 스프링 부트에서 소셜 로그인 또는 API 사용법을 명확하게 기술해놓은 글이 없었습니다. 그래서 이번에 아무것도 없는 제로(0)의 상태에서 Github API를 사용해서 데이터를 가져와보도록 하겠습니다. 이 글을 토대로 개념을 이해한다면 깃허브가 아닌 서비스들에서도 충분한 정보를 제공받을 수 있습니다. OAuth 내부 동작 순서 및 개발 흐름 OAuth 동작 원리는 약간 복잡합니다. Res..

article thumbnail
[Spring] 필터(Filter)와 인터셉터(Interceptor) 역할과 차이
Spring Framework 2023. 6. 16. 23:54

스프링 프레임워크는 여러개의 중복되는 작업을 제거할 수 있도록 도와주는 많은 기능을 제공한다. 그 중 가장 대표적인 것들이 필터(Filter)와 인터셉터(Interceptor)이다. 이 둘의 역할과 차이가 무엇인지 알아보자. Filter 필터(Filter) 디스패처 서블릿에 요청이 전달되기 전/후에 어떠한 작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링 컨텍스트의 영역이 아닌, WAS 같은 톰캣 영역에서 관리된다. 호출 순서는 다음과 같다. 필터를 설정하려면 javax.servlet 패키지의 Filter(Interface)를 구현해야하는데, 이 클래스가 구성하고 있는 메서드는 총 3개이다. void init(FilterConfig) void doFilter(ServletRequset, ..

article thumbnail
[Spring] CustomException이 아닌 Exception 적절하게 처리하기
Spring Framework 2023. 5. 9. 00:31

서론 개발을 하다가 문득 궁금한게 생겼다. CustomException이 발생하면 내가 설정한대로 예외가 터져줬지만, 그렇지 않은 예외들이 발생하면 모두 INTERNAL-SERVER-ERROR를 띄워줬다. 이게 맞는걸까? 우리는 보통 애플리케이션에 커스텀 예외(Custom Exception)을 선언하고 각각의 도메인에 맞게 사용한다. 예를 들면 ApplicationException이 RuntimeException을 상속받고 해당 Exception이 터지면 커스텀 해놓은 상태코드를 반환하고 그렇지 않는다면 그에 맞는 상태코드를 반환해야 할 것이다. 예를 들면 JPA를 사용해서 개발하다가 DataIntegrityViolationException 이런 예외를 한 번쯤 만나본적 있을 것이다. 이 예외는 일반적으..

article thumbnail
[Spring] 스프링 프레임워크 의존성 주입 방식
Spring Framework 2023. 4. 24. 17:32

스프링 프레임워크에서는 객체간의 낮은 결합도를 제공하기 위해 DI(Dependency Injection)을 제공한다. 이 기능은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받기도 하고, 런타임에 의존관계가 결정되기 때문에 유연한 구조를 가진다. 의존성 주입의 종류 Field Injection 변수에 @Autowired 어노테이션을 붙이게 되면 스프링 프레임워크에서 해당 객체를 자동으로 스프링 빈으로 등록한다. @Service @AllArgsConstructor @Transactional(readOnly = true) public class MissionService { @Autowired private SessionService sessionService; } 하지만 인텔리제이에서는 필드에 @Aut..

article thumbnail
[Spring] 스프링 프레임워크란? 개념/특징/동작 원리
Spring Framework 2023. 4. 20. 22:09

다들 스프링 프레임워크를 잘 사용하고 있는 와중 동작 원리에 대해 고민해본적이 있는가? 우리가 흔히 사용하고 많은 도움을 주는 프레임워크의 동작 원리 정도는 알아두자. Spring Framework란? 자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로서 엔터프라이즈급 어플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다. 엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 뜻이다. 일반적인 프레임워크의 경우 과도한 엔지니어링 기술을 탑재하여 무겁고 고가의 WAS를 갖추어야만 동작했지만 스프링 프레임워크는 엔터프라이즈 개발에서 필요로 하는 기술을 포함하고 있지만 가볍고 단순히 환경에서 사용할 수 있다. Spring Framework 특징 아래에는 Spri..

article thumbnail
[Spring Boot, Database] Spring Boot + Redis 제대로 활용하기(2)
Spring Framework 2023. 1. 18. 19:44

저번 포스팅에서는 레디스라는 데이터베이스 자체에 대해서 자세히 알아보았다. 이번 포스팅에서는 스프링 부트에서 레디스를 사용하는 법을 알아보자. Spring Boot에서 레디스 설정하기 스프링 부트에서 레디스를 사용하려면 build.gradle 파일에 레디스 의존성을 추가해줘야 한다. implementation 'org.springframework.boot:spring-boot-starter-data-redis' 그리고 사용할 레디스의 호스트와 포트를 지정해준다. application.yml 파일에 지정하며, 로컬에서 레디스를 사용한다면 localhost, 다른 서버나 도커 등을 사용한다면 그에 맞는 호스트로 설정해준다. default port는 6379이다. spring: redis: host: loca..

article thumbnail
[Spring] 트랜잭션과 @Transactional 정리
Spring Framework 2023. 1. 14. 20:52

이번 포스팅에서는 우리가 흔히 사용하는 @Transactional 어노테이션에 관련해서 자세하게 기술하려고 한다. 우선 트랜잭션의 기본적인 개념부터 알아야 @Transactional을 더 잘 이해할 수 있으므로 데이터베이스상에서의 트랜잭션의 개념을 먼저 알아보자. 트랜잭션의 정의 데이터베이스 상에서 트랜잭션을 정의하는 바는 다음과 같다. 데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다. 트랜잭션의 특징 트랜잭션의 특징은 크게 4가지로 나뉜다. 원자성 (Atomicity) 일관성 (Consistency) 독립성 (Isolation) 지속성 (Du..