REST API란?

|

1. REST API

1) REST API란?

  • REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이필딩의 박사학위 논문에서 최초로 소개되었습니다.
  • 웹의 장점을 최대로 활용할수 있는 아키텍처로서 REST를 발표했습니다.

2) REST의 구성

  • 쉽게 말해 REST API는 다음이 구성으로 이루어져 있습니다.
  • 자원(RESOURCE) - URI
  • 행위(VERB) - HTTP METHOD
  • 표현(REPRESENTATIONS)

3) REST의 특징

  • 1) 클라이언트 / 서버구조 : 일관적인 인터페이스로 분리되어야 한다. 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.
  • 2) 무상태(stateless) : 각 요청 간 클라이언트의 콘텍스트가 서버에 저장되어서는 안된다. 단순 API 서버는 들어오는 요청만을 단순히 처리합니다. 세션정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 요청을 단순히 처리하면 됩니다.
  • 3) 캐시처리가능 : WWW에서와 같이 클라이언트는 응답을 캐싱할 수 있어야 한다. 잘 관리되는 캐싱은 클라이언트-서버 간 상호작용을 부분적으로 또는 완전하게 제거하여, 성능을 향상시킨다.
  • 4) 계층화(Layered System) : 클라이언트는 보통 대상 서버에 직접 연결 되었는지, 또는 중간 서버를 통해 연결되었는지를 알 수 없다. 중간 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공함으로써 시스템 규모 확장성을 향상시키는데 유용하다.
  • 5) 자체 표현구조(Self-descriptiveness) : REST의 또 다른 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 표현할 수 있는 구조로 되어있습니다.

4) REST API 디자인 가이드

  • REST API 설계 시 가장 중요한 항목은 다음의 2가지로 요약할 수 있다.
  • 첫 번째, URI는 정보의 자원을 표현해야 한다.
  • 두 번째, 자원에 대한 행위는 HTTP METHOD(GET,POST,PUT,DELETE)로 표현한다.

4-1) REST API 중심 규칙

  • 1) URI는 정보의 자원을 표현해야 한다 ( 리소스명은 동사보다는 명사를 사용 ) GET /members/delete/1
  • 위와 같은 방식은 REST를 제대로 적용하지 않은 URI입니다. URI는 자원을 표현하는데 중점을 두어야합니다. DELETE와 같은 행위에 대한 표현이 들어가서는 안됩니다.

  • 2) 자원에 대한 행위는 HTTP method(GET,POST,PUT,DELETE)로 표현
  • 위의 잘못 된 URI를 HTTP Method를 통해 수정해 보면 DELETE /members/1
  • 으로 수정할 수 있겠습니다.
  • 회원정보를 가져올 때는 GET, 회원 추가 시의 행위를 표현하고자 할 때는 POST METHOD를 사용하여 표현합니다.

  • 3) POST, GET, PUT, DELETE 의 4가지 METHOD를 가지고 CRUD를 할 수 있다.
  • POST : POST를 통해 해당 URI를 요청하면 리소스를 생성합니다
  • GET : GET를 통해 해당 리소스를 조회합니다. 리소스를 조회하고 해당 도큐먼트에 대한 정보를 가져온다
  • PUT : PUT를 통해서 해당 리소스를 수정합니다.
  • DELETE : DELETE를 통해 리소스를 삭제한다.

  • 다음과 같은 식으로 URI는 자원을 표현하는데에 집중하고 행위에 대한 정의는 HTTP METHOD를 통해 하는 것이 REST한 API 설계하는 중심 규칙입니다.

5) REST의 주요한 목표

  • 구성 요소 상호작용의 규모 확장성
  • 인터페이스의 범용성
  • 구성 요소의 독립적인 배포
  • 중간적 구성요소를 이용해 응답 지연 감소, 보안을 강화, 레거시 시스템을 인캘슙레이션

큐, 스택이란?

|

자료구조

1) 큐

  • 큐는 컴퓨터 자료구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO 구조로 저장하는 형식을 말한다
  • 영어단어로 QUEUE는 표를 사러 일렬로 늘어선 사람들로 이루어진 줄을 말하기도 하며, 먼저 줄을 선 사람이 먼저 나갈수있다.
  • 나중에 집어 넣은 데이터가 먼저 나오는 스택과는 반대되는 개념이다.
  • 프린터의 출력 처리나, 윈도 시스템의 메시지 처리기, 프로세스 관리 등 데이터가 입력된 순서대로 처리해야할 필요가 있는 상황에 이용된다.

큐의 종류

  • 원형큐 : 큐를 위해 배열을 지정해 놓고, 큐를 쓰다보니 배열의 앞부분이 비게된다는 점을 활용해서 배열의 맨 마지막 부분을 쓰면 다시 제일 처음부터 다시 큐를 채우기 시작하는 형태의 큐입니다.
  • 우선순위큐 : 우선순위 큐는 말 그대로 원소들에게 우선순위를 매겨서 넣을 때의 순서와 상관없이 뺄 때에는 우선순위가 높은 원소부터 빼내는 것입니다.
  • 데크 : 일반적인 큐는 뒤에서만 삽입이 이루어지고, 앞에서만 자료를 꺼내올 수 있지만, 데크는 양쪽에서 모두 삽입/인출이 가능하다.

큐의 용도

  • 어떠한 작업/데이터를 순서대로 실행/사용하기 위해 대기시킬 때 사용한다.
  • 서로 다른 쓰레드 사이 또는 프로세스 사이에서나 네트워크를 통해 자료를 주고받을 때 자료를 일시적으로 저장하는 용도로 많이 사용된다.

2) 스택

  • 후입선출 구조(LIFO)의 자료구조, 스택은 일종의 바닥이 막힌 상자라고 보면 된다. 나중에 넣은 물건이 위에 있으므로 먼저 꺼낼 수 있다.

스택의 특징

  • 스택에서 데이터를 확인하려면 가장 위의 데이터부터 확인해야 한다.
  • 배열과 달리 스택은 상수 시간에 i번째 항목에 접근할 수 있다.
  • 스택에서 데이터를 추가하거나 삭제하는 연산은 상수 시간에 가능하다.

스택의 용도

  • 재귀알고리즘
  • 웹브라우저 방문기록(뒤로가기)
  • 실행취소

프로레스, 스레드, 멀티스레드?

|

프로세스란?

  1. 프로세스란 단순히 실행중인 프로그램이라고 할 수 있습니다.
  2. 즉, 사용자가 작성한 프로그램이 운영체제에 의헤 메모리공간을 할당받아 실행 중인것을 이야기합니다.
  3. 이러한 프로세스는 프로그램에 사용되는 데이터와 메모리등의 자원 그리고 스레드로 이루어집니다.

스레드란?

  1. 스레드란 프로세스내에서 실제로 작업을 수행하는 주체를 말합니다.
  2. 모든 프로세스에는 한개 이상의 스레드가 존재하여 작업을 수행합니다.
  3. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 합니다.

멀티스레드란?

  1. 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행하게 됩니다.
  2. 하지만 멀티쓰레드란 하나의 프로세스내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미합니다.
  3. 또한, 멀티프로세스는 각 프로세스가 독립적인 메모리를 가지고 별도로 실행되지만, 멀티스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유한다는 점이 다릅니다.
  4. 멀티스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유하므로, 시스템자원의 낭비가 적습니다.
  5. 또한, 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋아집니다.

멀티스레드의 장단점

장점

  1. 응답성 : 예를 들어 채팅프로그램을 멀티스레드화 하면, 채팅의 일부분이 전송이 되지 않거나 큰 파일을 전송하고 있어도, 사용자는 다른 스레드를 통해서 다른 사용자와 대화가 가능하다.

  2. 자원공유 : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용프로그램 같은 주소공간내에서 여러개의 다른 활동성 스레드를 가질 수 있기 때문입니다.

  3. 경제성 : 멀티 프로세스처럼 여러개의 프로세스에 메모리와 자원을 할당하면 비용이 많이 발생하지만, 스레드는 한 프로세스 내에서 자원 ( 데이터, 메모리 등 의 자원)을 공유하기 때문에 경제적입니다.

  4. 쓰레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 힙(Heap) 영역을 이용하여 데이터를 주고받을 수 있다. 또한 멀티쓰레드에서는 쓰레드간에 스택영역(메모리의 값이 아닌 주소만 보관)과 힙 영역을 공유합니다.

  5. 데이터 영역과 힙 영역을 통해 데이터 교환이 가능하다. 쓰레드 사이에서의 데이터 교환에서는 특별한 기법이 필요없다.

단점

  1. 멀티스레드를 기반으로 할 경우, 동일한 자원에 접근할 수 있기 떄문에 프로그래밍시 신경써줘야한다.

  2. 서로 다른 쓰레드가 데이터와 힙 영역을 공유하기 때문에 어떤 쓰레드가 다른 쓰레드에서 사용중인 변수나 자료구조에 접근하여, 엉뚱한 값을 읽어오거나 수정할 수 있습니다. 그렇기 멀티스레드 환경에서는 동기화 작업이 필요합니다.

  3. 동기화 작업을 제대로 하지 않으면, 락 문제가 일어날 수 있고, 데이터 병목 현상이 일어날수있습니다.

힙 영역

  • 자바에서 힙영역은 사용자가 동적으로 할당할 수 있는 공간입니다. 그래서 new 명령으로 생성하는 인스턴스는 모조리 힙영역에 보관이 됩니다. 할당받은 메모리 주소를 잃어버려 가바지 컬렉션에 의해서 지워질 떄까지 혹은 jvm이 종료될때까지 유지가 됩니다.

멀티스레드와 멀티프로세스의 차이

  1. 멀티스레드는 하나의 프로세스에서 여러개의 쓰레드가 동작하며, 모든 스레드가 모두 같은 주소공간에서 동작하여 같은 메모리를 공유합니다.
  2. 결국 멀티스레드는 하나의 프로그램안에서의 병렬처리의 이점을 맛볼수있고, 멀티프로세싱은 여러 개의 프로그램들을 병렬로 처리할 수 있습니다.

자바에서 스레드를 실행하는 방법

Thread 클래스로부터 직접 생성

  • java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성 하려면 Runnable을 매개값으로 갖는 생성자를 호출해야 한다. Runnable은 작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체라고 해서 붙여진 이름이다. Runnable에는 run() 메소드 하나가 정의되어 있는데, 구현 클래스는 run()을 재정의해서 작업 스레드가 실행할 코드를 작성해야 한다.
// 1번 방법
Runnable task = new Task();
Thread thread = new Thread(task);

// 2번 방법, 쓰레드 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용한다
Thread thread = new Thread(new Runnable() {
    public void run() {
        // 스레드가 실행하는 코드!!
    }
});

// 3번 방법, 람다식을 매개값으로 사용하는 방법
Thread thread = new Thread(() -> {
    // 스레드가 실행할 코드
})

Thread를 상속받은 자식 클래스로부터 생성

  • Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수도 있다. Thread 클래스를 상속한 후 run 메소드를 overriding해서 스레드가 실행할 코드를 작성하면 된다.

public class WorkerThread extends Thread {
    @Override
    public void run(){
        // 스레드가 실행할 코드
    }
}

Thread thread = new Thread(){
    public void run(){
        // 스레드가 실행할 코드
    }
}

thread.start();

Thread 우선 순위

  • 동시성과 병렬성
    • 동시성은 멀티작업을 위해서 하나의 코어에서 멀티스레드가 번갈아가며 실행하는 성질을 말하고, 병렬성은 멀티 작업을 위해 멀티코어에서 개별 스레드를 동시에 실행하는 성질을 말합니다. 싱글코어 CPU을 이용한 멀티스레드 작업을 하나의 코어가 번갈아가면서 스레드를 실행하기 때문에 마치 보기에는 동시에 실행하는 것처럼 보이지만, 사실은 빠르게 번갈아가면서 실행하고 있습니다.
  • 스레드 스케쥴링
    • 스레드의 개수가 코어보다 많을 경우 스레드를 어떤 순서로 실행해야 하는지 결정해야 하는데, 이것을 스레드 스케줄링이라고 합니다.
  • 자바의 스레드 스케쥴링
    • 우선 순위 방식과 순환할당 방식을 사용합니다
    • 우선 순위 방식은 프로그래머가 스레드의 순서를 결정할 수 있습니다. 프로그래머가 지정한 우선 순위대로 실행상태를 더 많이 가져갈수 있습니다. 반대로 순환 할당 방식은 프로그래머가 따로 스레드를 제어하지 않을 경우 자바 프로그램 내에서 자동으로 순서를 결정해서 실행합니다.

데몬 스레드

  • 주 스레드의 작업을 돕는 보조적인 역활을 수행하는 스레드입니다.
  • 주 스레드가 종료되면 데몬 스레드는 강제적으로 종료됩니다.
    • 워드 프로세서의 자동저장 기능, 미디어플레이어의 동영상 및 음악 재생, 가비지 컬렉터 등등

스레드풀

  • 스레드폭증
    • 병렬처리 작업이 많아지면 스레드의 개수가 증가한다
    • 스레드 생성과 스케쥴링으로 인해 CPU가 바빠지고, 메모리 사용량이 늘어난다
    • 따라서 애플리케이션의 성능이 급격히 저하된다
  • 스레드풀
    • 작업처리에 사용되는 스레드를 제한된 개수만큼 미리 생성
    • 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다
    • 작업 처리가 끝난 스레드는 작업결과를 애플리케이션으로 전달합니다
    • 스레드는 다시 작업큐에서 새로운 작업을 가져와 처리한다

TIL 금일 공부

|

1. 알고리즘

  • 백준 오프라인 문제풀이 복습

2. 기술면접

  • 쓰레드란 무엇인가?

3. SPRING BOOKMARK 프로젝트 진행상황

  • 개발스펙 : java 8, spring boot

TIL 금일 공부

|

1. 알고리즘

  • 백준 오프라인 문제풀이 강의 ( 일요일 3 ~ 6시 )

2. 기술면접

  • http란 무엇인가?

3. SPRING BOOT JPA 쇼핑몰 프로젝트 진행상황

  • ~~회원가입 처리 ~~
  • 회원,비회원 카트 담기
  • ~~회원,비회원 주문 ~~
  • 회원,비회원 주문내역 확인
  • 페이징 처리 2019.03.10
  • 검색기능 추가( querydsl )
  • backEnd단 유효성검사 처리 2019.02.27일 완료
  • FrontEnd단 유효성검사 처리(jquery validation plugin 사용)
  • 썸네일 업로드 혹은 이미지 리사이즈
  • 페이스북 혹은 gmail 연동작업
  • 이메일 연동 작업 ( 비밀번호 찾기 )
  • jpql N+1 문제
  • 기능별 수정삭제 기능
  • aws 배포후 테스트, 문제가 없을 경우 travis ci를 사용해서 배포자동화 작업