동기와 비동기

김재현·2024년 1월 31일
0

TIL

목록 보기
77/88

'비동기처리'라는 개념을 들었다.

비동기는 무엇일까? 동기는 무엇일까?

동기적? 비동기적?

동기란

그림과 같이 동기적인 프로그램에서는 작업이 순차적으로 실행된다.
한 작업이 완료되기 전에 다음 작업이 실행되지 않는 것이다.

비동기란

반면 비동기적인 프로그램에서는 작업이 순차적으로 실행되지 않는다.
대신, 여러 작업이 동시에 시작되고 완료되는 것이다.

비동기 프로그램 작동 원리

  • 비동기 프로그래밍의 이벤트 루프 동작 순서
  1. 코드 실행: 실행 스택에 코드가 추가되어 실행
  2. 비동기 작업 등록: 비동기 작업이 등록되면 해당 작업은 백그라운드에서 실행
  3. 비동기 작업 완료: 비동기 작업이 완료되면 콜백 함수가 생성되고, 해당 콜백 함수는 태스크 큐에 추가
  4. 이벤트 루프 실행: 실행 스택이 비어있을 때, 이벤트 루프가 태스크 큐에서 콜백 함수를 꺼내와 실행
  5. 반복: 이러한 과정을 반복하여 비동기 작업을 계속해서 처리

비동기적 프로그램의 필요성

  • 비동기 프로그램의 장점
  1. 성능 향상: 특히 네트워크 호출이나 파일 I/O와 같이 시간이 오래 걸리는 작업
  2. 응답성 향상: 긴 작업이 실행 중이더라도 사용자는 다른 작업 가능
  3. 자원 효율성: 대기 시간이 발생할 때 CPU 및 기타 리소스를 다른 작업에 할당
  4. 병렬성: 멀티코어 및 멀티스레드 시스템에서 더욱 효과적으로 작동

그동안 내가 사용해왔던 코드는 동기적으로 작성된 코드이기 때문에 작업을 순차적으로 처리해나갔다.
그렇기 때문에 인증 메일이 발송이 완료되기까지 기다렸다가, 사용자에게 응답이 가는 문제가 있었다.

하지만 이것을 비동기적으로 처리한다면..!! 완료되기까지 기다리지 않고 바로 응답을 줄 수 있는 것이다!!

Spring에서의 비동기 함수

Spring에서는 2가지 방식으로 활용할 수 있다.

간단하고 쉽게 적용 할 수 있는 @Async과,
복잡하지만 좋은 성능을 낼 수 있는 WebFlux를 사용한 리액티브 프로그래밍이 있다.

@Async 어노테이션

이것은 Spring이 @Async 어노테이션을 제공하여, 메서드를 비동기적으로 실행할 수 있게 만든 스레드 기반의 비동기 방식이다.

이 어노테이션을 메서드에 추가하면 Spring은 해당 메서드를 비동기적으로 호출하고 새로운 스레드에서 실행한다.

@EnableAsync 와 함께 아래와 같이 메서드에 달아준다면, 그 메서드가 비동기적으로 처리된다.

	@Async
	public void signup(SignupRequestDto signupRequestDto){
			...
	}

이 때 각 요청마다 새로운 스레드가 생성되어 성능에서의 이슈가 발생할 수 있다는 문제가 있다.
그 문제는 아래에서 해결 할 수 있다.

WebFlux를 사용한 리액티브 프로그래밍

Spring WebFlux는 리액티브 프로그래밍을 지원하기 위한 이벤트 기반의 비동기 방식 모듈이다.
(WebFlux는 Reactor 라이브러리를 기반으로 하며, Flux와 Mono라는 리액티브 타입을 제공)

작업이 요청되었을 때 콜백 함수를 등록하여 작업이 완료될 때까지 기다리지 않고, 이벤트가 발생하면 콜백 함수가 실행된다.(= 넌블로킹 I/O)

넌블로킹 I/O를 사용하여 적은 수의 스레드로 더 많은 요청을 처리(동시 처리)하기 때문에 대용량 트래픽 관리 및 확장성이 용이하다.

    public static void main(String[] args) {
        SpringApplication.run(WebFluxExampleApplication.class, args);
    }

    @GetMapping("/hello")
    public Mono<String> hello() {
        // 비동기적으로 "Hello, World!"를 반환하는 Mono를 생성하여 반환.
        return Mono.just("Hello, World!");
    }

출처


관련 포스팅

profile
I live in Seoul, Korea, Handsome

0개의 댓글