REST API


이번에는 elasticsearch의 활용방법을 소개하겠습니다. 그 전에 elasticsearch의 노드와 통신을 하는 방식을 설명하겠습니다. elasticsearch는 REST API를 제공하여 클러스터와 통신을 합니다. 간단히 REST API를 소개하고 데이터를 다뤄보겠습니다.
REST API는 2000년도에 로이 필딩 (Roy Fielding)의 논문에서 공개되었습니다. 웹을 관통하는 HTTP의 주요 저자였던 필딩은 웹의 설계에 비해 제대로 활용되지 못하는 점을 보완하고 최대한 활용하기위해 공개하였습니다. 웹페이지 제작이나 API개발을 해보신 분들은 REST API에 대해 알 것이라 생각합니다. 현재 우리가 사용하는 많은 수의 웹페이지는 REST API를 통한 페이지간의 통신을 활용하여 제작되어 있습니다. 또한 데이터를 불러오거나 통신에도 REST API를 사용합니다.

빨간색 부분은 대표적인 REST API를 통해 만들어진 예시라고 볼 수 있습니다.

REST API는 데이터 통신과 밀접한 관련이 있는만큼 데이터베이스의 기본인 CRUD와 관련된 모든 작업이 가능합니다. CREATE API인 POST, READ API인 GET, UPDATE API인 PUT (PUT은 요즘 POST로 대체해서 사용하는 경우도 많습니다.) DELETE API인 DELETE가 있습니다.
그리고 REST API는 자원(URI), 행위(verb), 표현(representation)으로 구성됩니다. 자세한 설명은 아래에서 진행하겠습니다.


1. POST

- 새로운 정보를 넣고자 할 때, 다음과 같은 방식의 API를 수행합니다. 예를 들어 회원 시스템을 관리한다고 합시다.

POST /members/1

API자체에 동작 수행의 이름을 넣는 경우도 있지만 REST API제작에는 가이드라인이 존재합니다.

  • 첫번째, URI는 정보의 자원을 표현해야 한다.
  • 두번째, 자원에 대한 행위는 HTTP method (GET, POST, PUT, DELETE)를 통해 표현한다.

즉, 우리는 members라는 자원에 1번 자원 (URI)를 추가(POST)하는 것입니다. 이번에는 넣은 데이터를 확인해봅시다.


2. GET

- 흔히 페이지 URL을 통해 드러나는 API는 GET방식을 통해 접근하는 경우입니다. 보안상의 이슈가 크지 않은 경우에는 일반적으로 GET방식을 활용하여 웹 링크상에 직접적으로 파라미터들이 드러나는 경우가 많습니다.

대표적인 예시로 네이버 검색이 있습니다. 클라이언트가 검색하고자 하는 문구를 query에 담아서 데이터베이스 상에서 탐색하여 값을 반환합니다. 간단하게 API를 분석하면 search.naver라는 API가 존재하고 해당 API의 파라미터로는 where, sm, fbm, ie, query가 존재하는 것을 알 수 있습니다.

POST방식을 통해 존재하는 회원 정보를 탐색하기 위해 아래와 같은 API를 작성할 수 있습니다.

GET /members/1



3. PUT / DELETE
- PUT과 DELETE는 같이 설명하겠습니다. 데이터가 존재하면 중간중간 수정이 이뤄지고 삭제가 이뤄지기도 합니다. 이때 활용하는 것이 PUT과 DELETE입니다. 하지만 PUT은 요즘 POST와 혼용되어 사용되는 경우가 많습니다.

특정 회원 데이터를 수정한다면 아래와 같이 API를 작성합니다.

PUT /members/1

위처럼 작성하고 내부에는 가져오는 파라미터를 활용하여 작업을 수행하는 방식이 이뤄집니다.
DELETE도 마찬가지로 수행해주면 됩니다. DELETE는 그 자체로 삭제 연산을 가지므로 따로 작업을 수행하지 않고 단순히 API로만 처리하는 경우가 많습니다.


Elasticsearch 사용해보기


이제 본격적으로 elasticsearch를 사용해봅시다. 이전처럼 ubuntu를 통해 elasticsearch와 kibana를 실행하고 localhost:5601로 접속하여 키바나 툴을 실행해줍시다.


키바나에 접속하면 좌측상단의 햄버거 버튼(작대기 3개)를 누르면 메뉴가 나옵니다. 메뉴 하단에 Management의 Dev Tools를 클릭합시다.

Dev Tools에 들어가면 위와 비슷한 화면이 나타납니다. 좌측은 API를 입력하는 콘솔의 역할을 하고 우측은 해당 API의 수행 결과를 나타냅니다. 이제 REST API를 통해 elasticsearch를 활용해봅시다.


0. Intro
간단하게 데이터베이스를 구축하고 실습을 진행해보도록 하겠습니다. 때마침 당근마켓의 인턴 공고에서 elasticsearch를 활용한다는 것을 보았으니 간단한 물품 데이터베이스를 만들어봅시다. 인덱스 이름은 product로 합시다.
일반적으로 분류의 편의를 위해 카테고리는 id로 관리합니다. 여러분들이 알아보기 쉽게 이름을 적었지만 실제 저장할때는 괄호안의 숫자를 입력해주세요. 마땅한 id패턴이 안 떠올라서 대충 적었습니다...

product_id product_name category_bid category_mid category_sid price user_id
1 생수500mlX20 식품/생필품 (1) 식품 (10) 커피/음료 (101) 16,600 13
2 칫솔 30입 식품/생필품 (1) 생필품 (11) 욕실용품 (113) 11,500 22
3 카메라 컴퓨터/전자/디지털 (2) 디지털 (22) 카메라 (221) 580,000 13
4 노트북 컴퓨터/전자/디지털 (2) 컴퓨터 (20) 노트북 (205) 1,732,000 10
5 화장지 30롤X2 식품/생필품 (1) 생필품 (11) 화장지/물티슈 (113) 21,500 3



1. Create (POST)

- 데이터를 생성하는 과정에서는 POST방식을 활용합니다. 여러 개를 동시에 넣는 방식도 존재하지만 우선 노가다적으로 데이터를 넣는 과정을 수행합니다. 기본적이 작성 방식은 아래와 같습니다.

//[code] POST [index name]/[type name]/[id number] { "sourc1": "data1", ... } //[Example] POST product/productlist/1 { "product_id":1, "product_name":"생수 500ml X 20", "category_bid": 1, "category_mid": 10, "category_sid": 101, "price": 16600, "user_id":13 }

데이터를 입력하면 우측 결과창에 다음과 같이 나오면 정삭적으로 데이터 입력이 된 것입니다.

result에 "created"가 나타난 것을 알 수 있습니다. 여기서 주목할 점은 "_version"입니다. 엘라스틱서치는 해당 데이터의 변경된 과정을 버전으로 관리합니다. 따라서 완전히 새롭게 데이터를 생성하지 않는한 _version이 기록된 상태로 데이터가 저장됩니다.


2. Read (GET)

- 이번에는 넣은 데이터가 제대로 들어갔는지를 확인해봅시다. 여러 개를 확인하는 multisearch가 있지만 여기서는 하나하나 GET method를 통해 확인합시다.

//[code] GET [index name]/[type name]/[index number] //[Example] GET product/productlist/1

위의 예제처럼 검색하고자 하는 index를 입력하면 됩니다. 노트북 데이터가 잘 들어갔는지 확인해봅시다. index넘버가 4인 것을 확인했으므로 4번 인덱스 데이터를 확입합니다.

데이터가 아주 잘 저장되어 있습니다. 이제 PUT과 DELETE 작업을 수행해봅시다.


3. Update (PUT/POST)

  • 1번 시나리오 : 10번 유저가 자신이 올린 노트북이 너무 팔리지 않아서 가격을 1,632,000원으로 10만원 인하하여 재등록을 했습니다. 이를 데이터베이스에 적용해주세요.
  • 2번 시나리오 : 모든 생필품의 category_mid가 11에서 12로 변경되었습니다. 이를 데이터베이스에 적용해주세요.

- 데이터 수정과정은 조금 까다롭습니다. 들어가는 과정이 1단계 더 필요하기 때문이죠. 각 데이터에 저장된 필드에 직접 접근하여 추가, 수정을 하는 방법이 있고, 프로그래밍 방식인 javascript의 형태로 전체 데이터에 동시적인 수정작업을 하는 것도 가능합니다. 우선 첫번째 시나리오인 노트북 가격을 인하하는 방식을 진행해봅시다!
우선 위에서 간단히 언급했듯이 PUT과 POST는 혼용해서 사용되는 추세입니다. 역시나 엘라스틱서치도 6.x버전 이후부터는 POST를 PUT대신 사용할 수 있습니다.

- POST를 활용한 update 방식은 2가지가 있습니다.

//[code 1] POST [index name]/[type name]/[index number] { 수정내용 } //[code 2] POST [index name]/[type name]/[index number]/_update { "doc": { 수정 필드 지정 } }

첫번째 코드처럼 작성하면 데이터가 수정되는 것은 맞지만 데이터가 통째로 갈아엎어집니다. 즉, 매우 위험한 수정방식이죠. 까닥 잘못하면 데이터 누락의 위험성이 발생할 수 있는겁니다. 그래서 2번째 코드처럼 특정 필드만 수정을 진행하는 방식으로 코드를 짭니다. 1번 시나리오 코드를 작성해봅시다.

POST product/productlist/4/_update { "doc": { "price": 1632000 } }

데이터가 잘 수행되었는지 확인해봅시다.

데이터가 문제없이 잘 수정되었습니다! 이제 2번째 시나리오를 수행해봅시다.

- 2번째 시나리오는 모든 생필품 중간 카테고리 id를 11에서 12로 변경하는 것입니다. 물론 위의 방식으로 필드를 수정할 수 있지만 코드를 활용한 방식도 가능합니다.

//[code] POST [index name]/[type name]/[index number]/_update { "script": { "inline": script content } } //[Example] POST product/productlist/2/_update { "script": { "inline": "if(ctx._source.category_mid==11){ctx._source.category_mid=12}" } }

자세한 코드 분석은 적용 결과를 보면서 알려드리겠습니다.

우선 적용이 잘된 것을 확인할 수 있습니다. 그렇다면 script 코드는 어떻게 작성한 것일까요? 우선 전체 데이터는 ctx로 받아옵니다. ctx 객체에서 _source부분에 우리가 수정 적용하고자하는 필드들이 있죠. 그 필드들 중 원하는 필드(category_mid)를 지정했다고 생각하시면 됩니다.


4. DELETE (DELETE)

  • 시나리오 : 4번 데이터인 노트북 데이터가 가격 인하 끝에 판매가 완료되었습니다! 축하해주세요! 그럼 이제 그 상품 데이터를 삭제합시다!

- 삭제 API는 이름이 같습니다. 그리고 수행방식도 매우 간단하죠.

// [code] DELETE [index name]/[type name]/[index number] // [Example] DELETE product/productlist/4

삭제가 완료된 index를 검색하면 found : false를 반환하는 것을 알 수 있습니다.

이렇게 해서 간단하게 엘라스틱서치 활용을 알아봤습니다!
아직은 대량의 데이터를 다루는 방식을 익히지 않아 답답한 것도 있겠지만 뒤에 갈수록 더 많은 스킬들을 얻을 수 있게 될 겁니다!

반응형

'Infra > ELK' 카테고리의 다른 글

[ELK] Elasticsearch의 구조  (0) 2021.07.09
[ELK] WSL을 통한 ELK 설치 및 실행  (0) 2021.07.08