• 교착 상태(膠着狀態, 영어: deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다. 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, 전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 


  • 프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. 


프로세스 상태



커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다.

  • 생성(create) : 프로세스가 생성되는 중이다.
  • 실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다.
  • 준비(ready) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
  • 대기(waiting) : 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
  • 종료(terminated) : 프로세스의 실행이 종료되었다.


  • 스레드와 멀티스레드


스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.


  • 해시맵


HashMap이란 Map인터페이스의 한종류로써 Key와 Value 값으로 데이터를 저장하는 형태를 가지고 있다.


Map은 키(Key), 값(Value) 을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는 데 사용된다.


쉽게 말해 key, value 값으로 저장하는 List 와 비슷하다.


  • REST


Representational safe transfer (REST)는 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍처이다.

REST 원리를 따르는 시스템은 종종 RESTful이란 용어로 지칭된다.

영어의 접미사인 ful이란 단어는 가득한 풍부한이라는 뜻이다. REST가 가득하다는 뜻이다.


REST는 요소로는 크게 리소스,메서드,메세지 3가지 요소로 구성된다.


예를 들어서 “name이 sanghyun인 users를 생성한다” 라는 호출이 있을 때


"users" 는 생성되는 리소스, 

"생성한다" 라는 행위에 POST 메서드,

"name이 sanghyun인 users" 는 메시지가 된다


이를 REST 형태로 표현해보면


HTTP POST , http://localhost/users/


1
2
3
4
5
{  
   "users":{  
      "name":"sanghyun"
   }
}
cs


REST에서는 행위에 대한 메서드를 HTTP 메서드 그대로 사용한다.

HTTP 에는 여러가지 메서드가 있지만 REST에서는 CRUD(Create Read Update Delete)에 해당 하는 4가지의 메서드만 사용한다.

REST의 리소스

REST는 리소스 지향 아키텍쳐 스타일이라는 정의 답게 모든 것을 리소스 즉 명사로 표현을 하며, 각 세부 리소스에는 id를 붙인다.

즉 사용자라는 리소스 타입을 http://localhost/users라고 정의했다면, sanghyun이라는 id를 갖는 리소스는 http://localhost/users/sanghyun 의 형태이다.
REST의 리소스가 명사의 형태를 띄우다 보니, 명령(Operation)성의 API를 정의하는 것에서 혼돈이 올 수 있다.

예를 들어서 “Push 메서지를 보낸다”는 보통 기존의 RPC(Remote Procedure Call)이나 함수성 접근해서는 /localhost/sendpush 형태로 잘못 정의가 될 수 있지만, 이러한 동사형을 명사형으로 바꿔서 적용해보면 리소스 형태로 표현하기가 조금더 수월해 진다.

“Push 메시지 요청을 생성한다.”라는 형태로 정의를 변경하면, API 포맷은 POST/localhost/push 형태와 같이 명사형으로 정의가 될 수 있다. 물론 모든 형태의 명령이 이런 형태로 정의가 가능한 것은 아니지만, 되도록이면 리소스 기반의 명사 형태로 정의를 하는게 REST형태의 디자인이 된다. 

REST API의 간단한 예제

그러면, 간단한 REST API의 예제를 살펴보도록 하자 간단한 사용자 생성 API를 살펴보면

1. 생성

다음은 http://localhost/users 라는 리소스를 이름은 sanghyun, 취미는 game 이라는 내용(메시지)로 HTTP Post를 이용해서 생성하는 정의이다. 

HTTP Post, http://localhost/users/


1
2
3
4
{  
   "name":"sanghyun",
   "hobby":"game"
}
cs

2. 조회

생성된 리소스 중에서 http://localhost/users 라는 사용자 리소스중에, id가 sanghyun인 사용자 정보를 조회해오는 방식이다. HTTP Get을 사용한다.

HTTP Get, http://localhost/users/sanghyun



3. 업데이트

http://localhost/users 라는 사용자 리소스중에, id가 sanghyun인 사용자 정보에 대해서, 취미를 “piano”로 수정하는 방식이다. 수정은 HTTP 메서드 중에 PUT을 사용한다.

HTTP PUT, http://localhost/users/sanghyun


1
2
3
4
{  
   "name":"sanghyun",
   "hobby":"piano"
}
cs


4. 삭제

http://localhost/users 라는 사용자 리소스중에, id가 sanghyun 사용자 정보를 삭제 한다.

HTTP DELETE, http://localhost/users/sanghyun



API 정의를 보면 알겠지만 상당히 간단하다. 단순하게 리소스를 URI로 정해준 후에, 거기에 HTTP 메서드를 이용해서 CRUD를 구현하고 메시지를 JSON으로 표현하여 HTTP Body에 실어 보내면 된다. POST URI에 리소스 id가 없다는 것을 빼면 크게 신경쓸 부분이 없다. 


HTTP


Web-Browser(브라우저)같은 응용프로그램을 통해 


Web-Client(사용자)와 Web-Server(서비스제공자)사이 


데이터를 전송하는 프로토콜이다.



1. HTTP는 TCP/IP를 이용하는 응용 프로토콜이다.


   컴퓨터와 컴퓨터 간 데이터 전송


2. HTTP는 연결 상태를 유지하지 않는 프로토콜이다.


   연결이 지속적이지 않기에 Web-Client와 연결 종료 후


   추가적인  Web-Client의 요청시 어떤 Web-Client이 요청인지 모른다는 점 발생해


   Cookie, Session, URL Rewriting, Hidden Form Field로 해결



   HTTP와 반대로 연결 상태 유지는 프로토콜은 FTP, Telnet이 있다.(TCP/IP)

   


3. HTTP는 연결 상태를 유지하지 않는 프로토콜이기 때문에 


   요청/응답(request/response)방식으로 동작한다.


   


참고 :


https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4

http://bcho.tistory.com/953

'전체 > 개발지식' 카테고리의 다른 글

Spring 개발 구성 및 파일 디렉토리 구조  (0) 2018.10.04
open <tag> in XML mapper - mybatipse plugin 사용하기  (3) 2018.02.21
Servlet 정의  (0) 2017.05.15
Maven을 쓰는이유  (1) 2017.05.12
Mybatis를 쓰는 이유  (1) 2017.05.12

+ Recent posts