BackEnd 16

CircuitBreaker 로 예방하는 장애 전파(2)

이번 포스팅에서는 지난 포스팅에 이어 CircuitBreaker를 실제로 구현하는 것에 대해 알아보도록 하겠습니다. 📌CircuitBreaker를 지원하는 라이브러리의 종류 1. Netflix Hystrix Netflix 에서 개발한 라이브러리로 MSA 환경에서 서비스 간 통신이 원활하지 않을 경우 각 서비스가 장애 내성과 지연 내성을 갖게 하는 라이브러리이지만 현재는 deprecated 된 상태로 더 이상의 업데이트가 없으며 공식 문서에서도 Resilience4j 의 사용을 권장하고 있습니다. 2. Resilience4j Netflix Hystrix로부터 영감을 받아 개발된 Fault Tolerance 라이브러리 Java 전용으로 개발된 라이브러리 입니다. 📌CircuitBreaker의 코어 모듈 Re..

BackEnd/SpringBoot 2023.12.12

CircuitBreaker 로 예방하는 장애 전파(1)

📌 들어가며 소프트웨어는 모두 실패한다 - 버너 보겔스(아마존 부사장) 아무리 열심히 설계하여 개발하고 QA를 진행한다 하더라도 대고객 시스템의 경우 혹은 대고객이 아니더라도 예상치 못한 장애를 마주하는 경우가 발생합니다. 여러 개의 작은 독립적인 마이크로서비스로 분할하는 아키텍처 패턴이 많아지는 요즘, 단일 서브 도메인의 장애가 전체 시스템에 영향을 줄 수 있어 예상치 못한 장애 상황이 발생할 수 있습니다. 이렇게만 보면 MSA 아키텍처로 설계하는 것 자체가 잘못된 것은 아닐까 하는 생각이 들 수 있습니다. 하지만 이는 '완벽한 시스템을 만들기보다, 실패에 유연하고 빠르게 대응 가능한 시스템을 설계해야 한다.' 라는 의미로 해석할 수도 있습니다. 따라서 MSA 환경에서는 단일 서브 도메인(마이크로서비스..

BackEnd/SpringBoot 2023.12.10

Spring Transaction 에 대한 이해

📌 들어가며 코드리뷰를 진행하다 보면 항상 나오는 얘기 중 하나가 바로 '트랜잭션 관리를 어떻게 할것인가' 에 대한 내용입니다. 그만큼 Exception이 발생했을 때 어떻게 할 것인가에 대한 내용이 중요한 만큼 이에 대한 대처 중 하나인 Transaction에 대해 정리해 보도록 하겠습니다. 📌 Transaction 의 정의 트랜잭션은 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 뜻합니다. 즉, 병행 제어 시 처리되는 작업의 논리적 단위입니다. Transaction은 하나의 흐름으로 하나의 실행이 성공하거나 실패하면 모든 연산들을 동일하게 처리합니다. A, B, C의 연산을 한 묶음이라고 할 때 A는 정상 작동 됐지만, B가 실패한다면 A의 작업 이력도 이전으로 돌립니다. ..

BackEnd/SpringBoot 2023.09.20

[Spring] 어노테이션의 정의와 동작원리

📌 들어가며 SpringBoot를 이용해 개발을 하다보면 정말 많이 사용하게 되는 것 중 하나가 어노테이션입니다. 종류도 매우 다양하며(@RestController, @Component.. 등) Personal 어노테이션을 만들 수도 있습니다. 오늘은 이러한 Spring에서 어노테이션의 정의와 동작원리에 대해서 알아보도록 하겠습니다. 📌 Annotation 의 정의 어노테이션에 대한 정의를 자바 공식 문서에서 찾아보면 https://docs.oracle.com/javase/tutorial/java/annotations/ Lesson: Annotations (The Java™ Tutorials > Learning the Java Language) The Java Tutorials have been writ..

BackEnd/SpringBoot 2023.09.18

[JPA] 자바에서 복합키 사용하기

📌 들어가며 테이블을 설계하다 보면 주로 detail 관련 테이블에 id + 순번으로 복합키를 생성하게 되는 경우가 많습니다. 이번 포스팅에서는 복합키를 사용하는 테이블을 자바에서 Entity로 개발하는 방법중 가장 흔히 쓰이는 @EmbeddedId 어노테이션에 대해 포스팅하려고 합니다. 📌 EmbeddedId Embeddable Object를 Id로 사용하는 방식으로 주로 아래와 같이 코딩하여 사용합니다. @Embeddable @Getter @NoArgsConstructor @AllArgsConstructor public class OrderItemId implements Serializable { @Column(name = "ord_id") private Long orderId; @Column(nam..

BackEnd/JPA 2023.09.17

스프링 부트 로컬 캐시 적용하기

📌 들어가며 백엔드 개발을 할 때 가장 신경쓰게 되는 것은 아무래도 API의 성능일 것입니다. 많은 트래픽을 받아도 안정적인 속도로 동일한 결과를 사용자에게 제공해 주어야 하기 때문입니다. 이번 포스팅에서는 이러한 API의 성능을 높일 때 사용되는 방법중 하나인 캐시를 적용하는 방법을 알아보고자 합니다. 캐시를 적용하기 위해 Redis를 사용하기도 하는데요 해당 포스팅에서는 스프링부트의 자체 캐시(로컬 캐시)를 사용해 보도록 하겠습니다. 📌 캐시란? 캐시는 자주 사용하는 데이터를 저장해두고 재활용하는 기술을 뜻합니다. 일반적으로 캐시는 일시적인 특징이 있는 데이터 집합을 고속 데이터 스토리지 저장합니다. 따라서 이후에 해당 데이터에 대한 동일한 요청이 있을 경우, 데이터의 원본 스토리지 위치로 액세스할 ..

BackEnd/SpringBoot 2023.06.25

@Embeddable @Embedded 어노테이션에 대해 알아보자

📌 들어가며 @Embeddable 과 @Embedded 어노테이션은 Entity가 단순할 때에는 잘 사용하지 않지만 Entity 가 복잡해질 수록 가독성과 공통적인 의미를 갖고 있는 컬럼을 하나의 객체로 사용하기 위해 자주 사용하게 되는 어노테이션입니다. 이번 포스팅에서는 해당 어노테이션의 사용법에 대해 정리해보도록 하겠습니다. 📌 @Embeddable , @Embedded 어노테이션 사용하기 Embeddable 어노테이션을 사용하는 가장 흔한 예시인 User Entity를 정의하면서 해당 어노테이션의 사용법을 알아보겠습니다. 우선 두 어노테이션은 @Embeddable : 값 타입을 정의하는 곳에 표시 @Embedded : 값 타입을 사용하는 곳에 표시 다음의 위치에서 사용하게 됩니다. 그럼 예시로 Us..

BackEnd/JPA 2023.04.24

Feign Client 를 활용하여 외부통신 연동하기

📌 들어가며 백엔드 API 개발을 하다보면 외부 서비스와 연동해야 하는 일이 많이 생깁니다. 특히 현재 주문/결제 도메인팀에 있다보니 더더욱 비즈니스 로직에서 외부통신을 해야하는 경우가 많이 생기는 것 같습니다. 이번 포스팅에서는 외부통신을 도와주는 많은 라이브러리들(HttpClient, WebClient) 중 Feign Client 에 대해 알아보고자 합니다. 📌 Feign Client Feign Client란 Netflix에서 개발한 Http Client입니다. (HttpClient는 Http 요청을 간편하게 만들어서 보낼 수 있도록 돕는 객체) 처음에는 Netflix에서 자체적으로 개발을 진행(Spring Cloud Netflix Feign)했지만 현재는 오픈소스 프로젝트인 OpenFeign으로 전..

BackEnd/SpringBoot 2023.04.22

@Transient 어노테이션에 대한 이해

📌 들어가며 이번 포스팅에서는 @Transient 어노테이션이 무엇인지, 그리고 그 쓰임에 대하여 정리하고자 합니다. 새롭게 합류한 도메인팀의 스프링부트 로직에서 @Transient 가 다수 발견되어 정리하게 되었습니다. 📌 @Transient 란 @Transient는 엔티티 객체의 데이터와 테이블의 컬럼(column)과 매핑하고 있는 관계를 제외하기 위해 사용합니다. 주로 보안정보나 굳이 테이블에 저장할 필요는 없지만 도메인 로직 또는 비즈니스 로직상 계산을 위해 필요한 경우 해당 어노테이션을 활용합니다. 더 정확히 표현하면 JPA의 가장 큰 특징 중 하나인 영속성 컨텍스트 대상에서 제외시키기 위하여 사용됩니다. 또한 JPA 의 컬럼 매핑 레퍼런스 어노테이션은 Field, Property 방식을 지원하..

BackEnd/JPA 2023.04.20

DDD - 애그리거트

들어가며 애그리거트는 DDD에서 굉장히 자주 등장하는 용어입니다. 항상 개발을 공부할 때마다 느끼는 것은 정의가 천차만별 이라는 것입니다. 이번 포스팅에서는 이 '애그리거트'의 정의와 간단한 예시를 알아보고자 합니다. 📌 애그리거트의 등장 배경 보통 DDD에 대한 설명을 할 때 설명의 예시가 되는 시스템으로 '온라인 쇼핑몰'에 대한 예시를 많이 들고 있습니다. 개인적으로는 온라인 쇼핑몰 e-커머스 시스템이 고객, 주문, 결제, 상품 등 다양한 서브 도메인들로 이루어져 있기 때문이 아닐까 싶습니다. 저 또한 e-커머스 시스템을 예시로 들도록 하겠습니다. e-커머스 시스템을 상위 수준에서 모델을 정리하면 다음과 같을 수 있습니다. 이러한 상위 수준에서의 모델을 개별 객체 수준으로 나타내면 다음과 같습니다. ..

BackEnd/DDD 2023.02.04