[엘라스틱서치] 데이터 갱신(update)하기, PUT과 POST 비교

    PUT과 POST를 비교하여 데이터를 저장하는 것을 한적이 있는데 이번에는 PUT과 POST를 활용하여 데이터를 갱신(update)하는 것을 실습해본다. 해당 포스팅의 내용은 키바나를 연결하여 console 창에 테스트를 진행하며, 만약 사용하는 방법을 모르고 있다면

     

    [키바나] 설치 및 엘라스틱서치 연동

     

    위의 내용을 확인하여, 우선 키바나를 설치하고 콘솔창을 활용하는 법을 익히도록 하자

     

    PUT 명령어로 갱신

    PUT로 데이터를 갱신하는 방법은 다음과 같다.

    PUT /<index>/<type>/<id>
    {
    내용...
    }

    PUT으로 데이터를 입력해보았으면 위 내용이 입력하는 방법과 동일한 것을 알 수 있을 것이다. PUT은 데이터가 있으면 UPDATE로 수정을 하고, 없을 경우 INSERT를 실행하는 즉 INSERT_OR_UPDATE 명령어이다.

     

    이전에 POST로 작성한 내용을 GET으로 가져와봤는데 여기서 확인해야 될 것은 version 값(1로 되어 있음)과 _source에 있는 description 내용을 확인해보자

     

    이번에는 PUT을 사용하여 기사의 내용을 변경(description 부분만 수정하여 실행)하였다. 우측에 보면 version이라는 값이 2로 된 것을 확인할 수 있고, result가 updated가 되어 있다.

     

    다시 GET으로 데이터를 가져와보니 다음과 같이 version이 최종적으로 +1 증가하였고, description이 바뀌어 있어서 갱신이 된 것을 확인할 수 있다. 이처럼 PUT은 쉽게 삽입과 갱신을 할 수 있다. 문제는 이렇게 자동적으로 갱신을 하게 되면 내가 예상하지 못한 결과가 나올 수 있다는 것을 명심해야 한다. (물론 result와 version을 관리하여 철저히 체크하면 사실 그러한 문제도 사라지긴 한다)

     

     

    POST로 데이터 갱신하기

    이번에는 POST를 활용하여 실습을 해보도록 한다. 

    POST /<index>/_update/<id>
    {
    	"doc":{
        	변경할컬럼:값
        }
    }

    POST로 갱신하는 방법은 PUT과 달리 특정 컬럼만 수정할 수 있다. 

    위와 같이 POST 명령어로 날짜값만 갱신하는 것을 실습해보자. 갱신이기 때문에 version값도 +1 증가하며, 결과가 updated 되었다고 표시된다.

     

    GET으로 확인한 결과 다른 컬럼은 건드리지 않고, version은 +1되었고, regdate가 수정된 것을 확인할 수 있다. 그리고 PUT도 특정 컬럼만 변경할 수 없는가? 궁금해하실 분이 있을 것 같아서 확인해드리면

     

    PUT으로 날짜값만 입력을 하면....

     

    이렇게 특정 컬럼만 변경되는 것이 아니라 모든 컬럼들을 날리고, 해당 컬럼만 저장이 되는 구조이다. 즉, PUT으로 하는 경우 내부적으로 데이터를 모두 비운 후 다시 insert를 하는 구조라고 인식을 하면 된다. 

     

    위 내용들을 보면 알 수 있듯 뭐가 정답이다 할 수 없다. 개발자의 성향, 데이터의 저장 형태 등을 통해서 그때그때 달라지며 데이터의 저장에 따라 POST 혹은 PUT 둘중 하나가 더 좋을 수 있어도 엔지니어 혹은 개발자가 선호하는 방법이 있다면 결과적으로는 엔지니어 성향에 따라 가는 경우가 많다. 

     

    물론 극한의 데이터 구조 및 퍼포먼스의 영향을 심각하게 많이 받는 데이터 구조라면 (물론 이럴 경우 엘라스틱을 쓰는게 맞는지 모르겠지만) 선호하지 않는 operation이라도 써야 되는 상황이 올 수 있을 것이다.

     

     

    댓글

    Designed by JB FACTORY