본문 바로가기
언어/Java

[Java] 동기식 처리와 비동기식 처리 ( feat. 블록킹 논블록킹을 곁들인 )

by Geunny 2025. 1. 11.
반응형

https://webheck.tistory.com/entry/Java%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B0%A9%EC%8B%9DAsynchronous-processing-model

 

[Java]동기와 비동기 방식(Asynchronous processing model)

출처 - https://poiemaweb.com/js-async 취업을 준비하던 중 서버 비동기 연동 경험 이란 문구를 보게 되었다. 맨날 동기 비동기 연동이라는 단어를 많이 들어 봤으나 막상 개념을 머릿속에서 꺼내 보자니

webheck.tistory.com

 

 

위 글은 내가 개발자가 되기전에 내 나름대로 공부하고 나름대로 이해했다고 작성한 무려 5년전에 작성한 글이다.

해당글을 다시 읽어보면 잘못된 점이 매우 많고 제대로 공부하지 않고 작성한 매우 책임감 없는 글이지만,

해당글은 내 블로그 유입 통계중 가장 위에 존재하는 글이다.

작지만 소중한 조회수중 해당글이 1위를 달리고 있다...

 

자 이제 개발을 시작한지 만 5년차가 되어가는 과정에서 해당 글을 조금더 옳은 개념으로

리뉴얼 하여 작성하려고 한다.

 

동기식/비동기식 처리?

먼저 이를 이해하려면 각 단어의 뜻을 이해해야 한다.

Synchronous(동기) 와 Asynchronous(비동기)의 단어를 살펴보면 

Synchronous의 Syn는 그리스어로 '함께'이란 뜻이고 chrono는 '시간'이라는 뜻이다.

즉 어떤 처리가 이루어지는 시간이 함께 이루어 지는지 아닌지에 대한 개념으로 볼수 있다.

내가 이전 글에서 작성하며 테스트 했던 예제 코드들은 엄연히 동기/비동기식 처리에 대한 개념은 맞으나

그림적인 측면에서는 동기/비동기식이라고 설명하기에는 어렵다.

 

동기식 처리와 비동기식 처리의 개념을 확실히 이해 하려면

프로그램의 작업(Task) 이 여러개가 요청 되었을 때 해당 작업들이

어떤 순서로 동작되는 지에 대한 개념을 중점으로 보아야 한다.

 

출처:   https://inpa.tistory.com/entry/ 👩‍💻-동기비동기-블로킹논블로킹-개념-정리   [Inpa Dev 👨‍💻:티스토리]

동기(Synchronous)

출처:   https://inpa.tistory.com/entry/ 👩‍💻-동기비동기-블로킹논블로킹-개념-정리   [Inpa Dev 👨‍💻:티스토리]

비동기(Asynchronous)

 

즉 요청된 작업들의 순서가 앞선 작업들이 끝난 이후 다음 작업이 진행되면 동기처리

앞선 작업에 상관없이 요청한 시점에서 동작하면 비동기처리 로 이해해도 된다.

즉, 동기식 처리는 한번에 작업만 동작하고, 비동기식은 여러 작업이 동시에 수행될 수 있다.

 

이전 글에서 작성한 내용을 기반과 Java 의 관점으로 다시설명하면 다음과 같다.

 

Java 의 main 클래스는 main Thread 에서 동작하게 된다.

고로 main 메소드에 작성된 일반적인 자바 소스코드는 main 스레드라는 하나의 작업 내에서 이뤄지게 된다.

package Synchro_Asynchro;

public class Synchro {
	public static void main(String[] args) {
		
		method1();
		method2();
		method3();
		
	}
	
	public static void method1() {
		System.out.println("method1");
	}
	public static void method2() {
		System.out.println("method2");
	}
	public static void method3() {
		System.out.println("method3");
	}
	
}

 

위 Java 코드는 하나의 스레드(main Thread) 에서 각각의 작업(method1~3) 이

순차적으로 작성된 메서드 실행 순서에 따라 실행되게 되므로

이는 동기식 처리라고 말할 수 있다.

 

 

그렇다면 이번에는 비동기식 처리의 소스를 다시한번 봐보자.

package Synchro_Asynchro;

public class Asynchro {
	public static void main(String[] args) {
	
	
		Thread t = new Thread(()->{
			method1();
		});
		Thread t2 = new Thread(()->{
			method2();
		});
		Thread t3 = new Thread(()->{
			method3();
		});
		
		
		t.start();
		t2.start();
		t3.start();
		
	}
	
	public static void method1() {
		System.out.println("method1");
	}
	public static void method2() {
		System.out.println("method2");
	}
	public static void method3() {
		System.out.println("method3");
	}
}

 

해당 작업은 이전 블로그 글과 같이 위에 예시와는 다르게 호출한 순서대로 메서드가 실행되지 않는다.

이를 이해하기 위해서는 앞서서 Java 에서 Thread.start() 메서드가 동작하는 과정을 이해해야 한다.

 

Java 에서 Thread 의 start() 메서드는 스레드를 Runnable 상태로 전환한다.

이 상태는 스레드가 실행될 준비가 되었음을 의미하지만, 실제로 언제 실행될지는 운영체제의 스케줄러가 결정한다.

 

스레드가 start() 호출로 Runnable 상태가 되면, JVM과 운영체제는 어떤 스레드가 CPU를 점유할지 비결정적으로 선택한다.

따라서, t.start(), t2.start(), t3.start()를 순서대로 호출했더라도 실제로 실행되는 순서는 보장되지 않는다.

 

즉 main 스레드는 각 각 메서드 호출을 서로 다른 스레드에 위임하고 각 스레드는

Runnable 이 된 상태로 운영체제 스레드에 의해 비동기적으로 실행하게 된다.

 

 

그렇다면 블록킹과 논블록킹은 또 뭐지?

동기처리와 비동기처리를 알아봤다면 이제는 블록킹과 논블록킹이다.

 

블록킹과 논블록킹의 그림은 이전 내가 작성했던 아래 그림들이

블록킹과 논블록킹을 설명해 주고 있다.

블록킹 처리 방식

 

논블록킹 처리 방식

블로킹과 논블록킹은 단어에서 알 수 있듯이 다른 요청의 작업을 처리하기

위해 현재 작업을 block(차단, 대기) 하냐 안하냐의 유무를 나타내는 프로세스의 실행 방식이다.

 

동기/비동기가 전체적인 작업에 대한 순차적인 흐름 유무라면,

블로킹/논블로킹은 전체적인 작업의 흐름 자체를 막냐 안 막냐로 볼 수 있는 것이다.

예를 들어, 파일을 읽는 작업이 있을 때, 블로킹 방식으로 읽으면 파일을 다 읽을 때까지 대기하고,

논블로킹 방식으로 읽으면 파일을 다 읽지 않아도 다른 작업을 할 수 있다. 

 

 

 

아래는 동기/비동기처리와 블록킹/논블록킹 처리를 도식화 하여 나타낸 글이다.

자세한 설명은 Inpa Dev 님의 블로그에서 자세하게 정리되어 있어 해당 글을 참고하길 바란다.

출처:   https://inpa.tistory.com/entry/ 👩‍💻-동기비동기-블로킹논블로킹-개념-정리   [Inpa Dev 👨‍💻:티스토리]

 

참고 : https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

 

👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은

inpa.tistory.com

 

'언어 > Java' 카테고리의 다른 글

[Java] record type  (0) 2022.12.06
[Java] KST 시간변환  (0) 2022.08.16
[JUnit5] 테스트 코드 시작해보기 - 2  (0) 2022.07.15
[JUnit5] 테스트 코드 시작해보기 - 1  (0) 2022.06.15
[Java] 컬랙션 프레임워크 커스텀 정렬  (0) 2020.09.18

댓글