Web/Basic

[Web] 블로킹(blocking)과 논블로킹(non-blocking) + 콜백(callback) 함수

생각많은 프로그래머 2024. 2. 23. 22:13

2024.02.23 - [Web/Basic] - [Web] 동기방식과 비동기방식

 

[Web] 동기방식과 비동기방식

효율적인 데이터 처리와 통신은 웹 개발에서 매우 중요하다. 이번에는 웹 통신 방식에서 중요한 두 개념인 동기 방식과 비동기 방식의 차이를 설명하고, 웹 애플리케이션 개발에서 두 방식의 장

bio-logisch.tistory.com

 

앞서 다룬 동기/비동기 방식과 관련하여 꼭 알아둬야 하는

개념이 있는데, 바로 블로킹(Blocking)과 논블로킹(Non-blocking)이다.

 

동기와 비동기가 작업을 요청하는 쪽과 작업을 처리하는 쪽,

두 주체 간의 관계를 이야기하는 용어라면

블로킹과 논블로킹은 작업을 요청하는 쪽에서 

통신 시 어떻게 동작하는지를 표현하는 용어라 할 수 있다.

 

동기 방식으로 통신할 때 작업을 요청하고 있는 쪽에서는

작업이 완료될 때까지 실행을 멈추고 대기하고 있어야 한다.

이때의 '대기'상태를 지칭하는 것이 '블로킹'이다.

 

동기와 블로킹의 차이점은,

동기두 주체 간 동기화되는 관계를 의미하고 

블로킹동기화를 위해 기다리고 있는 상태를 의미한다. 

 

작업을 요청하는 쪽은 작업을 처리하는 쪽에 요청하고

우선 다른 일을 진행하는데, 이 상태를 '논블로킹'이라 한다.

논블로킹은 작업을 요청한 쪽에서 작업 완료에 대해서는

신경쓰지 않은 채 실행을 계속 해나가는 것을 말한다. 

 

이때는 작업을 처리하는 쪽에서 작업을 요청하는 쪽에 

처리여부를 알려 주며, 이것을 콜백(Callback)이라고 한다. 

 

정리하면, 비동기작업을 처리하는 쪽에서

작업 완료에 대해 작업을 요청한 쪽으로 알려주는 '관계'를 말하고,

논블로킹이란 작업 완료 여부와는 무관하게 작업을 요청한 쪽에서

요청 후 '대기하지 않는 행위 자체', 그 상태를 의미한다.

 

웹 페이지를 새로고침하지 않고 서버로 정보를 보내거나

서버의 정보를 가져오는 것은 웹 브라우저가

웹 서버와 비동기로 상호작용하여 얻어진 결과이다.

 

비동기 방식은 개념 자체가 관계에 집중된 것으로,

서버와 클라이언트 간의 효율적인 데이터 교환과

빠른 응답 속도를 제공하는 역할을 담당한다.

 

 

 

콜백(Callback)

 

논블로킹에서 콜백은 비동기 작업이 완료되었을 때

실행되는 함수나 메서드를 말한다.

 

 콜백 함수 간단한 예시 

function abc() {
    console.log("kkk");
}

function action(name){
    name();
}

action(abc); //콘솔 출력 : kkk

// 여기서 콜백함수는 action함수의 매개변수로 전달된 abc함수에 해당함
// 이렇게 특정 함수의 매개변수로 전달된 함수가 있고, 전달된 함수가
// 필요한 시점에 호출되어 특정 작업을 수행하도록 하는 것이 콜백함수의 역할임

// 참고) 함수 abc의 매개변수로는 함수 말고도 string도 올 수 있음

 

 논블로킹에서의 콜백 함수 예시 

 

비동기 작업이 완료되었을 때 이벤트가 발생하면

미리 등록한 콜백 함수가 호출된다. 

 

아래 예시에서는 JavaScript를 사용하여

논블로킹 I/O 작업을 수행하고,

작업이 완료되면 콜백 함수가 호출되도록 했다.

// 비동기적으로 파일을 읽는 함수
function readFileAsync(filePath, callback) {
    // 가정: 비동기적으로 파일을 읽는 작업
    setTimeout(function() {
        // 파일을 읽은 후 콜백 함수 호출
        callback(null, "파일 내용...");
    }, 1000); // 예시로 1초 뒤에 파일 읽기 완료
}

// 파일을 읽는 비동기 작업 시작
console.log("파일을 읽는 작업을 시작합니다...");
readFileAsync("example.txt", function(err, data) {
    if (err) {
        console.error("파일을 읽는 도중 오류가 발생했습니다:", err);
    } else {
        console.log("파일을 성공적으로 읽었습니다. 내용:", data);
    }
});
console.log("비동기 작업이 백그라운드에서 실행됩니다...");

 

이 코드에서 readFileAsync() 함수는 비동기적으로

파일을 읽는 작업을 수행한다. 파일을 읽은 후에는

미리 등록한 콜백 함수가 호출되고,

읽은 파일 내용을 인자로 전달한다.

 

이러한 방식으로 콜백 함수를 사용하여

비동기 작업이 완료되었을 때 결과를 처리할 수 있다.

 

예시에서 콜백 함수는 CompletableFuturethenAccept 메서드에서

사용되었다. 콜백 함수는 비동기 작업이 완료되었을 때 실행되는 함수이며,

이 경우에는 파일을 성공적으로 읽은 후에 실행된다. 

.thenAccept(fileContent -> {
    System.out.println("파일을 성공적으로 읽었습니다. 내용: " + fileContent);
})

 

위의 코드에서 thenAccept 메서드에 전달된 람다 표현식이

콜백 함수이다. 파일을 성공적으로 읽은 후에 실행되며,

파일의 내용을 받아서 출력하는 역할을 한다.

이 함수는 CompletableFuture가 완료되었을 때

실행되므로 비동기적인 동작을 수행한다.