동기 (Synchronous)
- 동작 방식: 작업들이 순차적으로 처리됩니다. 하나의 작업이 끝나야 다음 작업이 실행됩니다.
- 특징:
- 코드가 작성된 순서대로 실행되며, 각 작업이 끝날 때까지 기다립니다.
- 처리 시간이 오래 걸리는 작업이 있으면, 그 작업이 끝날 때까지 다른 작업은 중단됩니다.
비동기 (Asynchronous)
- 동작 방식: 작업들이 병렬적으로 실행될 수 있습니다. 작업이 완료되지 않더라도 다른 작업이 먼저 실행될 수 있습니다.
- 특징:
- 시간이 오래 걸리는 작업이 있어도 프로그램이 그 작업을 기다리지 않고 다른 작업을 계속 진행합니다.
- 콜백(callback), 프로미스(Promise), async/await 같은 메커니즘을 사용하여 결과가 나왔을 때 작업을 처리합니다.
차이점 요약
- 동기: 순차적으로 작업이 진행되며, 하나의 작업이 완료될 때까지 기다림.
- 비동기: 동시에 여러 작업을 처리할 수 있으며, 완료되지 않은 작업을 기다리지 않음.
1. 동기 코드 주의점
동기 방식은 코드가 순차적으로 실행되므로, 잘못된 사용이 프로그램의 성능에 영향을 줄 수 있습니다.
- 긴 작업을 동기 코드로 처리하지 말 것: 동기 함수가 오래 걸리는 작업(예: 파일 읽기, 네트워크 요청, 데이터베이스 쿼리 등)을 실행할 경우, 해당 작업이 완료될 때까지 프로그램 전체가 멈출 수 있습니다. 사용자 인터페이스(UI)가 멈추거나 응답하지 않는 상황을 초래할 수 있습니다.
- 해결 방법: 비동기 처리를 사용하는 것이 좋습니다.
- 입력에 민감한 프로그램은 동기 처리에 신중해야 함: 사용자 입력에 빠르게 반응해야 하는 애플리케이션(예: 웹사이트나 앱의 버튼 클릭 처리)은 동기 코드 사용 시, 사용자의 입력이 지연될 수 있습니다.
2. 비동기 코드 주의점
비동기 코드는 효율적이지만, 구조나 흐름을 잘못 설계하면 복잡한 버그나 문제가 발생할 수 있습니다.
- 콜백 지옥 (Callback Hell): 비동기 코드에서 콜백(callback) 함수가 중첩되면 코드 가독성이 떨어지고, 유지보수가 어려워집니다. 이를 "콜백 지옥"이라고 합니다.
- 해결 방법: Promise와 async/await를 사용해 중첩을 줄이고 코드를 더 간결하게 만들 수 있습니다.
- 에러 처리: 비동기 작업 중 발생하는 에러를 처리하지 않으면 문제가 누적되어 버그가 발생할 수 있습니다. try/catch 또는 catch()를 사용해 오류를 명확히 처리해야 합니다.
- 해결 방법: Promise에서는 .catch(), async/await에서는 try/catch를 사용해 에러를 처리합니다.
- 경쟁 조건 (Race Conditions): 비동기 작업이 병렬로 실행될 때, 예상하지 못한 순서로 작업이 완료되면 데이터가 잘못 처리될 수 있습니다.
- 해결 방법: 순서가 중요한 작업에는 Promise.all(), Promise.race() 또는 async/await를 사용해 적절히 제어합니다.
- 비동기 호출의 누락: 비동기 함수 호출 후 await를 빠뜨리면, 프라미스가 처리되지 않은 상태에서 다른 작업이 먼저 실행될 수 있어 예상치 못한 결과가 나올 수 있습니다.
- 해결 방법: 비동기 호출에는 항상 await를 사용하거나, 프라미스의 결과를 적절히 처리합니다.
3. 상태 관리 문제
- 공유 자원 동시 접근 문제: 비동기 코드에서는 여러 작업이 동시에 실행되므로, 공유 자원(예: 변수, 객체)에 동시 접근 시 데이터 불일치 또는 충돌이 발생할 수 있습니다.
- 해결 방법: 중요한 데이터를 변경할 때는 적절한 동기화 기법을 사용하거나, 공유 자원을 최소화하는 것이 좋습니다.
- UI와 데이터 일관성: 비동기 작업이 UI 업데이트와 엮여 있을 때, 비동기 작업이 완료되기 전에 UI를 업데이트하면 일관성이 깨질 수 있습니다.
- 해결 방법: 작업의 완료 시점에 맞춰 UI를 업데이트하고, UI와 데이터를 연동할 때 신중하게 처리해야 합니다.
4. 비동기 처리 시 성능 문제
- 너무 많은 비동기 요청: 비동기 처리를 남발하면 서버나 클라이언트가 한 번에 너무 많은 요청을 처리해야 하여 과부하가 걸릴 수 있습니다. 예를 들어 API 요청을 너무 많이 보내면 네트워크 병목 현상이 발생할 수 있습니다.
- 해결 방법: 요청을 최적화하거나, 요청 횟수를 제한하는 로직을 추가합니다. 필요하면 throttling이나 debouncing 같은 기법을 사용합니다.
5. 코드 가독성 및 유지보수성
- 비동기 코드는 동기 코드보다 직관적이지 않을 수 있으므로, 개발자 간 협업 시 가독성이 떨어질 수 있습니다.
- 해결 방법: 가능한 async/await와 같은 최신 문법을 사용해 동기적으로 보이는 비동기 코드를 작성하면 가독성이 향상됩니다.
결론
동기와 비동기 프로그래밍을 사용할 때는 프로그램의 구조, 성능 요구사항, 오류 처리 방식을 고려해야 합니다. 특히 비동기 작업에서는 작업의 완료 순서와 에러 처리를 신경 써서 코드를 작성해야 안정적이고 유지보수하기 쉬운 프로그램을 만들 수 있습니다.
반응형
'Node.js' 카테고리의 다른 글
Node.js ) fetch() (0) | 2024.10.17 |
---|---|
Node.js ) 프라미스 / 어싱크 / 어웨이트 (0) | 2024.09.25 |
Node.js ) Query (0) | 2024.09.04 |
Node.js ) DBMS (0) | 2024.09.03 |
Node.js ) pug 설치 (0) | 2024.09.03 |