강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

나마스테님의 프로필 이미지
나마스테

작성한 질문수

실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)

도큐먼트 저장, 조회, 수정, 삭제하기

insert , upsert 질문드립니다.

작성

·

22

0

안녕하세요, 도큐먼트 저장,조회,수정,삭제하기 영상을보고 궁금한게 있어 질문드립니다 .

id를 직접 지정해서 저장하는경우
PUT /users/_create/1
{
"name:"testPUT"
}

POST /users/_creat/1
{
"name:"testPOST"
}

이러면 결과가 PUT으로 할때나 POST로 할때나 결국 마지막꺼로 덮여씌워지는데 그냥 doc가 덮여져서 저장됐다 생각하면 될까요? 또 PUT이나 POST나 기능이 동일한데 일반 HTTP 메서드와 비슷하게 생각하면 되는걸까요?

두번째 질문으로는 UPSERT의 경우나 UPDATE ( 일부필드만수정 ) 의 경우

UPDATE로 age만 고치나 UPSERT로 그냥 전체 기존값을 쓰고 age만 바꿔서 하나 결과값은 동일한데

퍼포먼스차이나 실무에서는 그냥 update보다는 해당 Id에 다시 insert한다던가 어떠한 식으로 진행되는지 궁금합니다.

답변 2

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 ! 질문 잘 해주셨어요 ~

질문해주신 내용에 답변 드려볼게요 !

"결과가 PUT으로 할때나 POST로 할때나 결국 마지막꺼로 덮여씌워지는데 그냥 doc가 덮여져서 저장됐다 생각하면 될까요? 또 PUT이나 POST나 기능이 동일한데 일반 HTTP 메서드와 비슷하게 생각하면 되는걸까요?"

-> /users/_create/{id} 는 PUT이든 POST든 HTTP 메서드에 관계없이 동일하게 동작해요 !

create 엔드포인트는 해당 id가 이미 존재하면 에러를 반환하고, 존재하지 않을 때만 새로 저장하는 방식이에요 ~

그래서 말씀하신 것처럼 마지막 걸로 덮어씌워지는 게 아니라, 두 번째 요청에서 이미 id가 존재한다는 에러가 발생하게 돼요 !

덮어씌우는 동작은 create가 아니라 PUT /users/_doc/{id} 를 사용할 때 일어나는 거예요! 그리고 Elasticsearch에서 create 엔드포인트에 PUT과 POST 모두 사용 가능한 건, 일반적인 HTTP 메서드 의미(PUT=멱등, POST=비멱등)보다는 Elasticsearch 자체적으로 두 메서드를 동일하게 처리하도록 구현해둔 것으로 이해하시면 돼요 :)

"UPSERT의 경우나 UPDATE ( 일부필드만수정 ) 의 경우 UPDATE로 age만 고치나 UPSERT로 그냥 전체 기존값을 쓰고 age만 바꿔서 하나 결과값은 동일한데 퍼포먼스차이나 실무에서는 그냥 update보다는 해당 Id에 다시 insert한다던가 어떠한 식으로 진행되는지 궁금합니다."

-> 실무에서는 일반적으로 일부 필드만 수정할 때는 POST /users/_update/{id} 를 사용하는 걸 권장해요 !

UPSERT(PUT /_doc/{id})로 전체 데이터를 다시 넣는 방식은 모든 필드 값을 다 알고 있어야 하고, 혹시라도 빠진 필드가 있으면 해당 필드가 사라져버리는 위험이 있어요 !

반면 update는 변경하고 싶은 필드만 지정해서 보내면 나머지 필드는 그대로 유지되기 때문에 훨씬 안전해요 ! 퍼포먼스 측면에서도 전체를 덮어쓰는 것보다 일부만 수정하는 게 더 효율적이구요! 그래서 특정 필드만 바꾸는 상황이라면 update를 쓰는 게 실무에서도 더 일반적인 방식이죠 :)

추가로 궁금하신 점 있으시면 또 질문 남겨주세요~~

0

안녕하세요, 인프런 AI 인턴입니다. 나마스테님.

Elasticsearch의 도큐먼트 조작 관련하여 좋은 질문을 해주셨습니다! 제공해 주신 질문에 대한 답변을 드리겠습니다.

Elasticsearch에서의 PUT vs POST

Elasticsearch에서 PUTPOST는 데이터 저장 시 그 기능이 조금 다릅니다.

  1. PUT:

    • 특정한 id를 지정하여 도큐먼트를 생성하거나 수정합니다.
    • 만약 지정한 id가 이미 존재한다면 도큐먼트를 업데이트합니다.
    • 예: PUT /users/_create/1
  2. POST:

    • 주로 도큐먼트 생성 시 사용되며, id를 자동 생성할 때 유용합니다.
    • 하지만, POST도 _create/<id> 경로로 사용하면, id를 지정할 수 있습니다.
    • 동일한 id를 사용 시 기존 도큐먼트가 존재할 경우 에러를 반환하지는 않습니다.

결국 Elasticsearch 내에서 동일한 id에 대한 요청이 들어오면 도큐먼트는 덮어씌워지게 됩니다. 이는 일반적인 HTTP 메서드 사용과 유사한 동작을 보이지만, 데이터 덮어쓰기 측면에서 Elasticsearch의 동작을 이해해야 합니다.

UPDATE vs UPSERT 퍼포먼스 및 실무

  • UPDATE로 일부 필드 수정:

    • UPDATE API는 일부 필드만 수정을 한다는 점에서 데이터를 효율적으로 처리할 수 있습니다.
    • 특정 필드만 전환이 필요한 경우 선호됩니다.
  • UPSERT:

    • 존재하지 않는 경우 문서 삽입, 존재하는 경우 일부 필드를 업데이트할 수 있습니다.
    • 복잡한 로직 구현이 가능하나 성능 측면에서는 UPDATE보다 상대적으로 비용이 큽니다.

실무에서는 UPDATE를 통해 필요한 일부 필드만 수정하는 것이 데이터 효율 측면에서 선호될 수 있습니다. 특히, 데이터가 큰 경우 전체를 새로 쓰는 방식보다는 필요한 부분만 갱신하는 것이 성능 향상에 유리합니다.

이에 대한 구체적인 사례를 알고 싶다면 다음 링크를 참고하시면 좋습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

나마스테님의 프로필 이미지
나마스테

작성한 질문수

질문하기