반응형

1. 개요

마이크로서비스 아키텍처와 같이 작은 서비스들로 이루어진 환경에서 복잡한 트랜잭션과 데이터 일관성을 효과적으로 관리하기 위해 SAGA 패턴이 사용됩니다. 이 패턴은 여러 서비스 간의 트랜잭션을 조율하고 데이터 일관성을 유지하기 위한 강력한 도구로 활용됩니다.

 

분해된 큰 트랜잭션:

SAGA 패턴은 큰 트랜잭션을 작은 단위의 작업으로 분해합니다. 각 작업은 개별적인 서비스로 구현되며, 작은 범위의 트랜잭션을 조율하는 것이 가능해집니다.

 

단위 작업의 트랜잭션:

각 단위 작업은 자체적인 트랜잭션을 가집니다. 이러한 작은 트랜잭션은 각 서비스 내에서 안전하게 수행

될 수 있습니다.

 

SAGA 관리 로직:

SAGA 패턴은 전체 트랜잭션의 흐름을 관리하는 로직을 필요로 합니다. 이 로직은 각 단계의 작업이 순차적으로 진행될 수 있도록 조율하며, 작업의 완료 여부를 확인합니다.

 

복잡한 트랜잭션의 관리:

다중 서비스 간의 복잡한 트랜잭션을 분해하고 조율함으로써 전체 시스템의 확장성과 견고성을 높일 수 있습니다.

 

구현의 복잡성과 주의사항:

SAGA 패턴은 구현이 복잡하며, 각 작업이 성공적으로 완료되지 않을 경우 컴펜세이팅 트랜잭션을 관리해야 합니다. 따라서 신중한 계획과 테스트가 필요합니다.

 

2. 종류 

 

추가/수정 패턴 (Compensating Transaction Pattern): 

이 방식은 특정 작업에 대한 성공적인 완료가 보장되지 않을 경우, 이전 작업을 취소하는 로직을 구현합니다. 이전 작업을 취소하는 로직을 "보상 트랜잭션" 또는 "컴펜세이팅 트랜잭션"이라고 합니다. 이러한 컴펜세이팅 트랜잭션들이 순차적으로 실행되며, 일련의 작업들의 트랜잭션을 조율하게 됩니다.

 

사가 로깅 패턴 (Saga Logging Pattern): 

이 방식은 각 단계의 트랜잭션 상태와 진행 여부를 기록하는 로깅 메커니즘을 사용하여 트랜잭션의 상태를 추적합니다. 각 작업이 시작되고 완료될 때 로그를 남기고, 다음 작업으로 진행 여부를 확인할 수 있도록 합니다.

 

3. 장단점

 

장점

분산 시스템에서 트랜잭션 조율: 마이크로서비스 아키텍처와 같은 분산 시스템에서 여러 서비스 간의 트랜잭션을 조율하는데 유용합니다. 각 서비스의 트랜잭션을 분리하여 더 작은 범위에서 관리하고, 전체 시스템의 유연성과 확장성을 향상시킵니다.

부분 실패에 대한 대응: 일부 서비스에서 오류가 발생하여 트랜잭션이 실패할 경우, 해당 작업만 롤백하고 다른 작업은 계속 진행할 수 있습니다. 이로써 전체 트랜잭션을 망가뜨리지 않고 일부 실패를 처리할 수 있습니다.

변경의 용이성: 각 단위 작업은 개별적인 서비스로 구현되므로, 각 서비스의 변경이 다른 서비스에 영향을 덜 주며 유지보수가 용이합니다.

 

단점

구현 복잡성: SAGA 패턴은 복잡한 구조를 가지며, 작은 단위의 트랜잭션과 그에 따른 컴펜세이팅 트랜잭션을 구현해야 합니다. 이로 인해 개발과 유지보수가 어려울 수 있습니다.

컴펜세이팅 트랜잭션 처리의 어려움: 각 작업이 성공적으로 완료된 후 다음 작업으로 진행하는 것이 아니라, 중간에 실패할 경우 이전 작업을 롤백하고 컴펜세이팅 트랜잭션을 실행해야 합니다. 이런 컴펜세이팅 트랜잭션의 구현은 복잡하고 예외 처리가 중요합니다.

장애 복구 어려움: 트랜잭션 조율 중에 실패가 발생하거나 일부 서비스가 다운되면 전체 SAGA 트랜잭션이 실패할 수 있습니다. 이러한 상황에서의 복구 작업은 복잡하고 신중한 처리가 필요합니다.

응답 시간 지연: 각 작업이 별도의 트랜잭션으로 실행되기 때문에 전체 SAGA 트랜잭션이 완료될 때까지 시간이 걸릴 수 있습니다. 이로 인해 응답 시간이 지연될 수 있습니다.

 

 

SAGA 패턴은 복잡한 분산 시스템에서 효과적인 데이터 일관성과 트랜잭션 관리를 위한 방법이지만, 그 구현과 관리가 쉽지 않을 수 있습니다. 사용 시에는 장점과 단점을 고려하여 상황에 맞게 적용해야 합니다.

반응형

'이론 정리' 카테고리의 다른 글

Blocking/Non-blocking, Sync와 Async: 개념과 예시  (0) 2023.08.17
[OOP] 객체지향 프로그래밍  (0) 2021.02.27
한글 인코딩  (0) 2019.06.04
가상화 ( IO )  (0) 2018.02.11
가상화 ( 서버 )  (0) 2018.02.11
반응형

Blocking/Non-blocking, Sync와 Async: 개념과 예시

 

 

자바 프로그래밍에서는 동시성 처리와 작업의 순서에 따라 다양한 작업 처리 방식이 사용됩니다. 이러한 작업 처리 방식을 이해하고 활용하는 것은 프로그램의 효율성과 성능에 큰 영향을 미칩니다. 이번 포스팅에서는 Blocking과 Non-blocking, 그리고 Sync와 Async에 대한 개념과 자바에서 사용되는 라이브러리 예시를 살펴보겠습니다.

Blocking(블로킹)과 Non-blocking(논블로킹)

 

Blocking (블로킹): 

정의
블로킹은 특정 작업을 요청한 함수나 쓰레드가 그 작업이 완료될 때까지 대기해야 하는 상태를 말합니다.
예시
예를 들어, 레스토랑에서 주문을 하면 주문한 음식이 나올 때까지 계속 기다려야 하는 것과 유사합니다. 이러한 상태에서는 주문을 한 사람이 다른 일을 하지 못하고 음식이 나올 때까지 기다려야 합니다.

 

 

Non-blocking (논블로킹): 

정의
논블로킹은 특정 작업을 요청한 후, 그 작업의 완료 여부와 상관 없이 다른 작업을 계속 수행할 수 있는 상태를 의미합니다.
예시
논블로킹 상황에서는 레스토랑 주문을 예로 들면, 주문을 하고 나서 다른 일을 계속 할 수 있습니다. 주문이 처리되는 동안에도 다른 고객이 주문을 할 수 있습니다.

 

Sync(동기)와 Async(비동기)

 

Sync(동기): 
정의
동기는 요청한 작업이 완료될 때까지 다음 작업을 수행하지 않는 방식을 의미합니다. 즉, 한 작업이 끝나야 다음 작업이 시작됩니다.
예시
주문을 처리하는 동안 다른 작업을 처리하지 않고, 그 주문이 끝난 후에 다음 주문을 받는 상황과 유사합니다.

 

 

Async(비동기):

정의
비동기는 하나의 작업이 끝나지 않았더라도 다음 작업을 병렬적으로 처리할 수 있는 방식을 의미합니다.
예시
주문을 비동기 방식으로 처리하면서 다른 요청도 병렬적으로 처리하는 상황과 유사합니다.


 

이렇게 보면, 'Blocking'과 'Sync', 그리고 'Non-blocking'과 'Async'가 서로 비슷한 개념처럼 보이지만, 사실은 각각 다른 측면을 다루고 있습니다. 'Blocking'과 'Non-blocking'은 작업을 어떻게 대기하는지, 'Sync'와 'Async' 는 작업을 어떻게 처리하는지에 초점을 맞춥니다.

 

즉, 'Blocking'과 'Sync'는 대기하는 방식과 작업 처리 방식에서 차이가 나지만, 결국에는 둘 다 '대기'를 의미합니다. 반면, 'Non-blocking'과 'Async'는 각각 대기하지 않고 다른 작업을 병렬로 처리할 수 있는 방식을 나타냅니다.

 

자바 사용 예시

1. Blocking

java.io 패키지: InputStream 및 OutputStream 클래스는 블로킹 방식으로 입출력 작업을 처리합니다.

 

2. Non-blocking

java.nio 패키지: ByteBuffer, Channel, Selector 등을 통해 비동기 입출력 작업을 처리합니다.

 

3. Blocking Sync
java.util.concurrent 패키지: Semaphore, CountDownLatch, CyclicBarrier 등을 사용하여 동기화 기능을 구현할 수 있습니다.

 

4. Non-blocking Async
CompletableFuture: 자바 8부터 제공되는 CompletableFuture를 활용하여 비동기 작업을 처리합니다.

java.util.concurrent 패키지: ExecutorService, ScheduledExecutorService 등을 통해 비동기 작업을 처리하는 방식을 구현할 수 있습니다.

 

실제 예시로 살펴보기

1. 블로킹 동기 (Blocking Sync): 식당에서 주문을 받을 때 주문이 완료될 때까지 주문한 사람은 대기합니다.

2. 논블로킹 동기 (Non-blocking Sync): 식당에서 주문이 처리되는 동안에도 다른 손님이 주문을 할 수 있습니다.

3. 블로킹 비동기 (Blocking Async): 웹 서버에서 클라이언트의 요청을 처리하는 동안 다른 요청을 처리하지 않습니다.

4. 논블로킹 비동기 (Non-blocking Async): 웹 서버에서 클라이언트의 요청이 처리되는 동안에도 다른 요청을 처리할 수 있습니다.

 

자바에서는 위와 같은 라이브러리와 패키지를 활용하여 다양한 작업 처리 방식을 구현할 수 있습니다. 이를 통해 다양한 상황에 맞게 동작하는 프로그램을 개발할 수 있습니다.

 

 

반응형

'이론 정리' 카테고리의 다른 글

SAGA 패턴  (0) 2023.08.22
[OOP] 객체지향 프로그래밍  (0) 2021.02.27
한글 인코딩  (0) 2019.06.04
가상화 ( IO )  (0) 2018.02.11
가상화 ( 서버 )  (0) 2018.02.11
반응형

환경 : SpringBoot 2.7, Intellij

목표 : profile 환경 변수를 기준으로 서로 다른 Property 를 적용

 

1. spring.config.activate.on-profile 을 사용하여 적용될 profile 을 명시

 

application.yml

default:
  string: default

custom:
  string: noProfile

application-custom.yml

custom:
  string: custom

spring:
  config:
    activate:
      on-profile: custom

application-local.yml

spring:
  config:
    activate:
      on-profile: local

 

 

 

2. 적용할 profile 환경 변수 설정

 

Edit Configurations -> Active profiles 설정

 

 

 

3. 결과

 

3.1) profile 설정 X

default.string = default

custm.string = noProfile

 

3.2) profile : local

default.string = default

custm.string = noProfile

 

3.3) profile : custom

default.string = default

custm.string = custom

 

 

반응형

'Java' 카테고리의 다른 글

[SpringBoot] Gradle 변수 Property 활용  (0) 2022.05.30
[MyBatis] List 형식 멤버 변수 조회  (0) 2021.02.12
[Spring] Web Cache 적용  (0) 2020.12.19
[SpringBoot] H2 연동  (0) 2020.07.21
[Spring] App 구동 후 자동 작업 실행  (0) 2020.02.23
반응형

작성일자 : 2022.06.19

환경 : vue 2, webpack-dev-server 4.8.1

시나리오 : 프록시를 활용하여 CORS 해결

 

관련 포스팅 : https://osc131.tistory.com/118

 

[Spring Boot] CORS 해결

[Spring Boot] CORS 해결 작성일자 : 2019.07.07 환경 : Spring Boot 2.1.6 다른 도메인에서의 자원을 호출하는 행위에 제한이 없을 경우 안전하지 않습니다. CORS (Cross-Origin Resource Sharing)는 이렇게..

osc131.tistory.com

 

1. webpack-dev-server 확인

 

package-lock.json 

"webpack-dev-server": {
	"version": "4.8.1"
    ...
    ...
}

사용하고 있지 않을 시 모듈 추가 필요

 

 

2.Proxy 설정 추가

 

vue.config.js

module.exports = {
  devServer: {
    proxy: {
	// /api 및 /api/* 요청에 대해 프록시 설정
      '/api': {	
        target: 'http://localhost:8080', // 프록시를 설정할 도메인
        changeOrigin: true,
      }, 
    },
  },
}

 

위 설정 이후 http://localhost:8080/api/* 에 대해 CORS 가 허용됨

 

 

* 주의 : 프록시 설정 이후 요청할 때 도메인 정보는 생략해야함

ex)

    const uri = '/api'; // 'http://localhost:8080/api' 로 작성 시 프록시 적용 X
    fetch(uri, {method: 'get'})
        .then(response => response.json())
        .then(response => {
            alert(response);
        })
반응형
반응형

작성일자 : 2022.05.29

환경 : SpringBoot, Gradle

시나리오 : Gradle 에서 할당한 변수를 서버 사이드에서 Property 로 활용

 

 

1. Gradle 설정 추가

build.gradle

...

processResources {
	filesMatching('**/application.properties') {
		expand(project.properties)
	}
}

...

해당 설정 추가 이후 gradle build 에 processResources 작업이 추가된다.

 

 

2. 변수 선언

build.gradle

...

version = '0.0.1-SNAPSHOT'
ext {
	index = '1'
	string = "gradleString"
}

...

 

 

3. property 설정

application.properties

...

version=${version}
gradleIndex=${ext.index}
gradleString=${ext.string}

...

build.gradle 에서 선언한 processResources 작업에서 알맞은 Property 에 Gradle 변수를 할당

 

 

4. 확인

In controller

@Value("${version}")
private String version;
@Value("${gradleIndex}")
private Integer gradleIndex;
@Value("${gradleString}")
private String gradleString;

...

System.out.println(version);
System.out.println(gradleIndex);
System.out.println(gradleString);

...

 

 

반응형

'Java' 카테고리의 다른 글

[Spring] Profile 기준 Property 구분 적용  (0) 2023.06.28
[MyBatis] List 형식 멤버 변수 조회  (0) 2021.02.12
[Spring] Web Cache 적용  (0) 2020.12.19
[SpringBoot] H2 연동  (0) 2020.07.21
[Spring] App 구동 후 자동 작업 실행  (0) 2020.02.23
반응형

 

 

함수(Function) : 특정 독립된 기능/작업을 수행하는 코드조각

메소드(Method) : 클래스, 구조체, 열거형에 포함되어있는 함수

반응형

'용어 정리' 카테고리의 다른 글

Parameter(매개변수) / Argument(인수)  (0) 2021.03.10
익명 함수 / 일급 객체  (0) 2021.03.09
상수 / 리터럴  (0) 2021.03.09
함수 표현식 / 함수 선언식  (0) 2021.03.05
ECMAScript / JavaScript  (0) 2021.02.11
반응형

 

 

Parameter(매개변수) : 함수의 입력 변수 명(Variable) 

Argument(인수) : 함수의 입력 값(Value)

 

ex)

function sum(int a, int b){

    return a+b;

}

sum(1, 2);

 

파라미터 : a, b

아규먼트 : 1, 2

 

 

반응형

'용어 정리' 카테고리의 다른 글

함수 / 메소드  (0) 2021.03.10
익명 함수 / 일급 객체  (0) 2021.03.09
상수 / 리터럴  (0) 2021.03.09
함수 표현식 / 함수 선언식  (0) 2021.03.05
ECMAScript / JavaScript  (0) 2021.02.11
반응형

작성일자 : 2021.03.10

 

화살표 함수란?

ES6 에서 추가된 문법으로, function 키워드 대신 화살표를 사용하여 보다 간략하게 함수를 선언하는 방법

 

this 에 바인딩할 객체가 함수가 어떻게 호출되었는지에 따라 동적으로 결정되는 일반 함수에 비해, 화살표 함수는 this, arguments, super 등이 정적으로 결정되며 따라서 prototype 에서 활용하거나, 객체의 메소드, 생성자로는 적합하지않다.

 

 

ex)

일반 함수 선언

화살표 함수 선언

  function(...arg){
      expression
  }

  (...arg) => {
      expression
  }

  function(a, b){
      return a+b;
  }

  (a, b) => a + b

  function(n){
      return n*2;
  }

  n => n*2

 

 

반응형

'Javascript' 카테고리의 다른 글

javascript example  (0) 2021.02.11
[Vue] 컴포넌트간 데이터 통신  (0) 2020.09.11
[vue] vue-router 사용  (0) 2020.09.08
[Vue] Component 사용  (0) 2020.09.06
[Vue] Vue Project 생성  (0) 2020.09.03
반응형

익명 함수

말 그대로 이름이 없는 함수, 즉시 호출 함수를 통해 실행하거나 변수에 함수를 저장하여 실행한다. 함수를 선언할 때 사용하여 함수의 호이스팅을 막을 수 있으며, 코드를 좀 더 간결하게 유지할 수 있음  

 

 

일급 객체

아래 조건을 만족하는 객체, 자바스크립트에서 모든 함수는 일급 객체이다.

 

1. 변수나 데이터에 할당할 수 있음

2. 파라미터로 전달할 수 있음

3. 리턴값으로 반환할 수 있음

 

반응형

'용어 정리' 카테고리의 다른 글

함수 / 메소드  (0) 2021.03.10
Parameter(매개변수) / Argument(인수)  (0) 2021.03.10
상수 / 리터럴  (0) 2021.03.09
함수 표현식 / 함수 선언식  (0) 2021.03.05
ECMAScript / JavaScript  (0) 2021.02.11
반응형

상수

변하지 않는 변수

 

리터럴

변하지 않는 데이터

 

 

final int x = 1;

이 떄 x 는 상수, 1 은 리터럴이 된다. 공통적으로 고정된 값을 가리키는 의미로 사용

반응형

'용어 정리' 카테고리의 다른 글

Parameter(매개변수) / Argument(인수)  (0) 2021.03.10
익명 함수 / 일급 객체  (0) 2021.03.09
함수 표현식 / 함수 선언식  (0) 2021.03.05
ECMAScript / JavaScript  (0) 2021.02.11
코딩 스타일  (0) 2019.09.07

+ Recent posts