학습
PHP 비동기 프로그래밍 (async)
PHP 비동기 프로그래밍 (async) — 고급
비동기 프로그래밍 (async) in PHP
1. 도입 (왜 배워야 하는가)
비동기 프로그래밍은 웹 애플리케이션에서 사용자 경험을 크게 향상시키는 중요한 기술입니다. 특히, 사용자가 웹사이트에서 정보를 요청할 때마다 페이지가 새로 고쳐지는 것을 피할 수 있게 해줍니다. 예를 들어, 쇼핑몰에서 사용자가 장바구니에 상품을 추가할 때 비동기 처리를 통해 페이지를 새로 고치지 않고도 즉시 반영할 수 있습니다.
비동기 프로그래밍을 사용하지 않으면, 사용자는 요청을 보낼 때마다 페이지가 새로 고쳐지는 지연을 경험하게 되어 불편을 느낄 수 있습니다. 이는 사용자의 이탈로 이어질 수 있으며, 최종적으로 비즈니스에 부정적인 영향을 미칠 수 있습니다.
2. 핵심 개념 설명
비동기 프로그래밍은 동시에 여러 작업을 처리할 수 있게 해주는 프로그래밍 방식입니다. 이는 마치 동시에 여러 가지 일을 하는 것과 비슷합니다. 예를 들어, 요리사가 여러 요리를 동시에 준비할 수 있는 것처럼, 비동기 프로그래밍은 여러 작업을 동시에 처리합니다.
- Promise: 비동기 작업의 결과를 나타내는 객체입니다. 작업이 완료되면 결과값을 반환하거나 오류를 발생시킵니다.
- Callback: 비동기 작업이 완료되었을 때 실행될 함수를 의미합니다.
- Async/Await: 비동기 코드를 더 간결하게 작성할 수 있도록 도와주는 구문입니다.
| 용어 | 정의 |
|---|---|
| Promise | 비동기 작업의 결과 또는 오류를 나타내는 객체 |
| Callback | 비동기 작업 완료 시 호출될 함수 |
| Async/Await | 비동기 코드를 더 직관적으로 작성할 수 있게 하는 구문 |
3. 기본 코드 예제
비동기 프로그래밍의 가장 기본적인 사용법을 보여주는 예제입니다.
<?php
function fetchData($url) {
return new Promise(function($resolve, $reject) use ($url) {
// 비동기 작업을 모사하기 위해 sleep 사용
sleep(2); // 2초 대기
if ($url) {
$resolve("데이터를 성공적으로 가져왔습니다: " . $url);
} else {
$reject("URL이 유효하지 않습니다.");
}
});
}
fetchData("https://api.example.com/data")
->then(function($data) {
echo $data; // 데이터 출력
})
->catch(function($error) {
echo $error; // 오류 출력
});
?>
실행 결과:
데이터를 성공적으로 가져왔습니다: https://api.example.com/data
코드 한 줄씩 동작 설명:
fetchData함수가 호출되면, 새로운 Promise 객체가 생성됩니다.- 내부적으로 2초의 지연을 주어 비동기 작업을 모사합니다.
- URL이 유효하다면,
resolve가 호출되어 데이터를 반환합니다. - 비동기 작업이 완료되면,
then메서드를 통해 결과를 출력하고, 오류가 발생하면catch메서드를 통해 오류 메시지를 출력합니다. - 올바른 코드: Promise를 반환하도록 수정해야 합니다.
- 올바른 코드:
catch메서드를 추가하여 오류를 처리해야 합니다. - 비동기 프로그래밍은 사용자 경험을 향상시킵니다.
- Promise와 Callback을 사용하여 비동기 작업을 처리합니다.
- Async/Await 구문을 통해 코드를 간결하게 작성할 수 있습니다.
- PHP에서의 Guzzle 사용법
- 비동기 프로그래밍을 활용한 REST API 개발
- PHP에서의 WebSocket을 통한 실시간 데이터 처리
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니에 상품 추가
사용자가 장바구니에 상품을 추가할 때 비동기 요청을 사용하여 페이지를 새로 고치지 않고도 상태를 업데이트합니다.
<?php
function addToCart($itemId) {
return new Promise(function($resolve) use ($itemId) {
// 데이터베이스에 상품 추가 로직
sleep(1); // 비동기 작업을 모사
$resolve("상품 ID {$itemId}가 장바구니에 추가되었습니다.");
});
}
addToCart(101)
->then(function($message) {
echo $message; // 상품 추가 메시지 출력
});
?>
예제 2: 사용자 프로필 정보 업데이트
사용자가 자신의 프로필 정보를 업데이트할 때 비동기 처리를 통해 즉시 결과를 보여줍니다.
<?php
function updateProfile($userId, $profileData) {
return new Promise(function($resolve) use ($userId, $profileData) {
// 프로필 업데이트 로직
sleep(1); // 비동기 작업을 모사
$resolve("사용자 ID {$userId}의 프로필이 업데이트되었습니다.");
});
}
updateProfile(1, ['name' => '홍길동'])
->then(function($message) {
echo $message; // 업데이트 메시지 출력
});
?>
5. 흔한 실수와 주의사항
실수 1: Promise를 반환하지 않는 경우
function fetchData($url) {
// Promise를 반환하지 않음
sleep(2);
return "데이터를 가져왔습니다: " . $url;
}
실수 2: 비동기 작업 중 오류 처리 누락
fetchData("https://api.example.com/data")
->then(function($data) {
echo $data;
});
// 오류 처리 누락
6. 정리
다음에 학습하면 좋은 주제: