인프런 커뮤니티 질문&답변
insert , upsert 질문드립니다.
작성
·
21
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
안녕하세요 ! 질문 잘 해주셨어요 ~
질문해주신 내용에 답변 드려볼게요 !
"결과가 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에서 PUT과 POST는 데이터 저장 시 그 기능이 조금 다릅니다.
PUT:
- 특정한
id를 지정하여 도큐먼트를 생성하거나 수정합니다.
- 만약 지정한
id가 이미 존재한다면 도큐먼트를 업데이트합니다.
- 예:
PUT /users/_create/1
- 특정한
POST:
- 주로 도큐먼트 생성 시 사용되며,
id를 자동 생성할 때 유용합니다.
- 하지만, POST도
_create/<id>경로로 사용하면,id를 지정할 수 있습니다.
- 동일한
id를 사용 시 기존 도큐먼트가 존재할 경우 에러를 반환하지는 않습니다.
- 주로 도큐먼트 생성 시 사용되며,
결국 Elasticsearch 내에서 동일한 id에 대한 요청이 들어오면 도큐먼트는 덮어씌워지게 됩니다. 이는 일반적인 HTTP 메서드 사용과 유사한 동작을 보이지만, 데이터 덮어쓰기 측면에서 Elasticsearch의 동작을 이해해야 합니다.
UPDATE vs UPSERT 퍼포먼스 및 실무
UPDATE로 일부 필드 수정:
- UPDATE API는 일부 필드만 수정을 한다는 점에서 데이터를 효율적으로 처리할 수 있습니다.
- 특정 필드만 전환이 필요한 경우 선호됩니다.
- UPDATE API는 일부 필드만 수정을 한다는 점에서 데이터를 효율적으로 처리할 수 있습니다.
UPSERT:
- 존재하지 않는 경우 문서 삽입, 존재하는 경우 일부 필드를 업데이트할 수 있습니다.
- 복잡한 로직 구현이 가능하나 성능 측면에서는 UPDATE보다 상대적으로 비용이 큽니다.
- 존재하지 않는 경우 문서 삽입, 존재하는 경우 일부 필드를 업데이트할 수 있습니다.
실무에서는 UPDATE를 통해 필요한 일부 필드만 수정하는 것이 데이터 효율 측면에서 선호될 수 있습니다. 특히, 데이터가 큰 경우 전체를 새로 쓰는 방식보다는 필요한 부분만 갱신하는 것이 성능 향상에 유리합니다.
이에 대한 구체적인 사례를 알고 싶다면 다음 링크를 참고하시면 좋습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




