1. 교착상태(Deadlock)
1. 교착상태란?

둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 서로 무한정 기다리는 현상
2. 교착상태 발생의 필요 조건
- 상호 배제 : 한 번에 한 개의 프로세스만이 공유 자원을 사용할 수 있어야 한다.
- 점유와 대기 : 하나 이상의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.
- 비선점 : 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.
- 환형 대기 : 공유 자원과 자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 위에 있는 프로세스의 자원을 요구해야 한다.3. 해결 방법
- 예방 : 교착상태 발생의 네 가지 조건 중 어느 하나를 제거함으로써 수행 / 자원 낭비가 심한 가법
- 회피 : 교착상태가 발생하지 않는 안전한 상태(Safe State)에서만 자원을 할당하는 방법
- 발견 : 시스템에 교착상태가 발생했는지 점검하여 교착상태에 있는 프로세스와 자원을 발견하는 것
- 회복 : 교착상태를 일으킨 프로세스를 종료시키거나 프로세스에 할당된 자원을 선점(preempt)하여 프로세스나 자원을 회복하는 것
2. HTTP Method
| HTTP 메소드 | 안전성 | 멱등성 |
| GET | O | O |
| POST | X | X |
| PUT | X | O |
| PATCH | X | X |
| DELETE | X | O |
1. 안전성
호출해도 리소스가 변경되지 않는 성질.GET 메소드는 데이터를 조회하는 기능을 수행하기 때문에 리소스를 변경 및 수정하지 않으니 안전한 HTTP 메소드.
2. 멱등성
요청을 한 번을 호출하든 여러 번을 호출하든 그 결과가 동일함을 의미.
동일한 요청을 한번 보내는 것과 여러번 연속으로 보내는 것이 같은 효과를 가지고 서버의 상태도 동일하게 남을 때 HTTP 메서드가 멱등성을 가진다고 말한다.
3. GET
GET 은 데이터를 여러 번 조회해도 같은 결과가 조회되므로 멱등을 만족하는 메서드이다.
멱등적이지 않은 GET 설계
조회수 기능을 추가하면서 게시글을 조회하면 조회수도 올리도록 구현한다면?
GET 요청을 여러 번 보낼 경우 서버의 데이터 상태는 매번 바뀌게 됨 => 멱등성을 가지지 않는 것이며 이는 HTTP 스펙에 부합하지 않게 API를 구현했다고 볼 수 있음!
이런 경우에는 조회수 칼럼의 값을 증가시키는 요청을 PATCH 요청으로 따로 분리하는 것이 맞다
4. DELETE
DELETE 는 단순 삭제 기능이므로 멱등성을 가진다.
멱등적이지 않는 DELETE 설계
게시글을 삭제할 때 정확한 게시글 ID가 아닌 최신 게시글 삭제라는 구조로 구현한다면?
DELETE 요청을 보내게 되면 매번 마지막 게시글을 삭제하기 때문에 매번 서버의 상태가 변하게 됨 => 멱등성을 가지지 않는 것
이런 경우에는 POST를 쓰는게 스펙상으로 맞음!
5. POST
POST메서드는 새로운 리소스를 생성하거나 서버의 특정 처리를 요청할 때 주로 사용된다.
예를 들어
POST /orders
동일한 주문 생성 요청을 여러 번 수행하면 새로운 주문이 여러 개 생성될 수 있다.
1회 요청 → 주문 A 생성
2회 요청 → 주문 B 생성
3회 요청 → 주문 C 생성
따라서 POST는 기본적으로 멱등성을 보장하지 않는다.
6. PUT
PUT 메서드는 리소스를 덮어씌우거나 새로 추가하는 방식. 요청을 여러번해도 서버의 상태는 동일하므로 멱등하다.
PUT /users/1
{
"name": "Eunkong",
"age": 26
}
동일한 요청을 여러 번 수행해도 최종적으로 /users/1 의 상태는 동일하다. 따라서 PUT은 멱등성을 가진다.
7. PATCH
PATCH 메서드는 리소스의 부분적인 수정을 할 때 사용됨.
기본적으로 멱등성을 가지지 않지만 구현을 PUT 과 동일한 방식으로 한다면 멱등성을 가지게 되는 특징을 가진다.
예를 들어 값을 직접 지정한다면
age = 26
여러 번 수행해도 age는 계속 26이므로 멱등하게 구현할 수 있다.
반면
viewCount += 1
와 같이 기존 값을 기준으로 변경한다면 요청을 수행할 때마다 결과가 달라지기 때문에 멱등하지 않다.
'CS & Algorithm > CS' 카테고리의 다른 글
| [CS] Java의 예외와 스프링의 트랜잭션 (0) | 2026.08.23 |
|---|---|
| [CS] 트랜잭션과 리스트 자료구조 (0) | 2026.08.23 |
| [CS] Java equals와 hashCode, Spring DI (0) | 2026.08.19 |
| [CS] 인덱스와 해시 테이블 (0) | 2026.08.19 |
| [CS]프로세스와 스레드 , TCP의 3-way handshake (0) | 2026.08.18 |
