일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 코드 스테이츠 백엔드 교육과정
- 코드스테이츠 백엔드 교육과정
- 팬텀 리드
- 매일메일
- MVCC
- 백내장 다초점렌즈 삽입술
- Gamsgo
- css
- 백엔드
- 해시
- CodeState 후기
- 자바
- 겜스고
- Code States 백엔드 합격 후기
- 백내장 금감원
- HLB
- 코테 합격후기
- 코드스테이츠 백엔드 후기
- Spring
- 금융감독원
- 백준 알고리즘
- 백내장
- 금감원
- 금융감독원 민원신청
- 금감원 백내장 민원
- 메서드
- 보험금 지급거절
- 에이치엘비
- Java
- 코드스테이츠 백엔드 부트캠프 합격
- Today
- Total
개발하는 동그리
[매일메일] 동기와 비동기의 차이점은 무엇인가 본문
동기와 비동기는 호출하는 함수의 작업 완료를 기다리는지 여부의 차이가 있습니다.
함수 A가 동기로 함수 B를 호출하면 A는 B의 작업이 완료될 때까지 기다려야 합니다. 따라서 작업이 순차적으로 진행됩니다. 반면, 함수 A가 비동기로 함수 B를 호출하면 A는 B의 작업 완료를 신경 쓰지 않고 따로 동작합니다. 따라서 작업이 순차적으로 진행되지 않습니다.
블로킹과 동기는 어떤 차이가 있나요? 🤔
두 개념은 유사하면서도 다른데요. 동기 호출에서는 호출된 함수가 작업을 완료할 때까지 호출한 함수가 기다립니다. 즉, 작업이 순차적으로 진행되는 것을 의미합니다. 반면, 블로킹은 함수가 호출된 후, 호출한 함수의 결과를 기다리기 위해 실행을 멈추는 상태를 의미합니다. 즉, 제어권이 반환되지 않고 대기하는 상황입니다.
1. 동기(Synchronous)
- 동기 호출에서는 호출한 함수가 호출된 함수가 작업을 완료할 때까지 기다립니다. 즉, 순차적으로 작업이 진행됩니다. 동기적인 호출에서는 제어권이 호출된 함수에 잠깐 넘어갔다가 작업이 끝나면 다시 호출한 함수로 돌아오는 방식입니다. 그래서 동기 호출은 작업이 선택된 순서대로 실행됩니다.
2. 블로킹(Blocking)
- 블로킹은 함수가 자원을 기다리거나, 다른 작업의 결과를 기다리는 상태를 의미합니다. 즉, 작업을 대기하는 상태인데, 이 상태에서 프로그램은 더 이상 진행되지 않고 멈추게 됩니다. 블로킹은 자원을 기다릴 때 발생하며, 예를 들어 I/O 작업(파일 읽기/쓰기, DB 쿼리 등)을 기다리는 경우가 대표적입니다. 블로킹은 그 자체로 호출된 함수의 실행 흐름을 막는 상태입니다.
차이점:
• 동기는 호출한 함수가 호출된 함수의 작업을 기다린다는 의미로, 작업 순차적 실행을 나타냅니다. 동기적 호출에서는 작업이 선택된 순서대로 진행되며, 하나의 작업이 끝나야 그 다음 작업이 진행됩니다.
• 블로킹은 자원을 기다리는 상태를 의미합니다. 자원(예: 네트워크 응답, 파일 읽기, 데이터베이스 응답 등)이 준비되기 전까지 대기하는 상태입니다. 즉, 호출한 함수는 멈춰 있지만, 반드시 순차적으로 실행되는 것과는 다릅니다. 호출된 함수가 작업을 완료할 때까지 기다리지만, 그 작업이 블로킹 상태일 수도 있고, 비블로킹 상태일 수도 있습니다.
스프링에서 비동기 처리는 어떻게 하며 무엇을 주의해야 하나요?
- 스프링에서는 @Async 어노테이션을 사용하여 비동기 처리를 수행할 수 있습니다. 해당 어노테이션을 사용하기 위해서는 몇 가지 주의할 부분이 있는데요. 기본적으로 @Async 가 적용된 메서드에서 발생하는 예외는 호출자에게 전파되지 않습니다. 비동기 메서드에서 예외를 정상적으로 처리하기 위해서는 별도의 비동기 예외 처리기를 사용해야 합니다.
- 또한, @Async 어노테이션은 프록시 기반으로 동작하기 때문에 같은 클래스 내부에서 직접 호출하는 경우 별도의 스레드에서 메서드가 실행되지 않습니다. 그리고, 비동기 메서드 내에서 생성한 트랜잭션은 상위 트랜잭션과 무관한 생명주기를 가집니다.
- 스프링에서 @Async 어노테이션을 사용하면, 비동기적으로 메서드가 실행되도록 지정할 수 있습니다. **@Async**는 메서드를 호출한 후, 그 메서드가 끝날 때까지 기다리지 않고 새로운 스레드에서 실행됩니다. 이때 스프링은 비동기 처리를 백그라운드 스레드에서 실행하고, 원래 호출한 스레드는 계속 다른 작업을 처리합니다.
- @Async 어노테이션을 사용하면, 메서드 실행이 비동기적으로 처리되고 기다릴 필요 없이 즉시 결과를 리턴할 수 있습니다.
@Async 핵심 포인트
- @Async는 메서드를 비동기적으로 실행하도록 지시합니다.
- 비동기 메서드는 다른 스레드에서 실행됩니다.
- @Async는 CompletableFuture, Future, ListenableFuture와 같은 비동기 처리 결과를 반환할 수 있습니다.
- @Async를 사용하면 메서드 실행 중 다른 작업을 기다리지 않고, 다른 처리를 할 수 있습니다.
동기와 비동기의 차이
- 동기: 메서드를 호출하면 결과를 받을 때까지 현재 스레드가 멈추고 기다립니다.
- 비동기: 메서드를 호출하면 결과를 받을 필요 없이, 메서드는 백그라운드 스레드에서 실행되고, 호출한 스레드는 기다리지 않고 계속 진행합니다.
- 스프링에서는 @Async 어노테이션을 사용하면 메서드가 별도의 스레드에서 비동기적으로 실행되며, 메서드가 완료되기를 기다리지 않고 다른 작업을 계속 진행할 수 있게 됩니다.
https://www.maeil-mail.kr/question/77
매일메일 - 기술 면접 질문 구독 서비스
기술 면접 질문을 매일매일 메일로 보내드릴게요!
www.maeil-mail.kr
'매일 공부 > Backend CS' 카테고리의 다른 글
[매일메일] 데이터베이스 커넥션 풀(Connection Pool)을 사용하지 않으면 어떤 문제가 발생 (0) | 2025.04.03 |
---|---|
[매일메일] 단위 테스트와 통합 테스트의 차이점 (2) | 2025.04.01 |
[매일메일] TCP 3-way handshake에 대해서 설명 (0) | 2025.03.27 |
[매일메일] 동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애인가 발생한 경우 조치 (0) | 2025.03.26 |
[매일메일] @Component, @Controller, @Service, @Repository의 차이점 (0) | 2025.03.25 |