개발자

인스타 좋아요를 눌렀을 때 일어나는 일에 대해서 질문있어요

2023년 04월 28일조회 260

인스타에서 좋아요를 눌렀을 때 실행되는 api 가 /pushLike 라고 했을 때, 일어나는 일을 잘 모르지만 제 생각대로 로직을 풀어보면, 1. ui의 변화 2. /pushLike로 요청 3. 해당 피드를 작성한 유저에게 알림 4. 데이터베이스 업데이트 라고 생각하는데, 만약 비정상 사용자가 좋아요를 아주 빠른 속도로 많이 눌렀을 경우, 요청을 계속 보내는 건가요? 그렇다면 알림도 계속 가겠고, 데이터베이스에도 무리가 갈 거 같아서 그런 건 아닌 거 같은데, 그래서 생각한 거로는, 앱 내부에서 상태를 관리하고 있다가 다른 요청(새로고침 등) 이 필요할 때 변화된 상태를 한번에 요청하는 건가요??

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 4

인기 답변

손정현님의 프로필 사진

안녕하세요! 인스타그램의 정확한 구현이 어떻게 되는지는 모르겠지만 어떤 방식일지 유추를 해보자면, 우선 ui의 변화, api 요청, 유저에게 알림, 데이터베이스 업데이트, 앱 상태관리, 악성 유저 방지 모두 나눠서 생각해보면 좋을 것 같습니다. "ui의 변화" 사용자가 알림을 누르는 순간 api 요청이 날라갑니다. 다만, 실제로 api 요청이 날라가고 서버에서 돌아오는 응답을 기다린 뒤 ui 변경을 하면 시간차가 발생해서 네트워크가 느리다면 사용자 입장에서 즉각적인 피드백 (하트가 빨간색으로 변한다거나, 빨간색이 사라진다던가)을 받기가 어렵습니다. 이 피드백 시간을 단축시키기 위해 optimistic update라는 기법을 사용하기도 합니다. api 요청을 보냄과 동시에 성공할 것을 가정하고 미리 ui의 변화를 가져가는겁니다. 혹시나 api 요청이 실패하면 그때 다시 ui 변경을 해주면 되니까요. "api 요청과 데이터베이스 업데이트" 아마 api 요청이 들어오고 일렬의 검증 과정을 거친후에 DB에 저장을 하겠죠. 그리고 저장 성공/실패 여부를 클라이언트로 리턴해줄것 같습니다. 저장이 성공한다면 "사용자가 좋아요 눌렀어!"라고 다른 서비스들에 알려주는 역할을 하는 이벤트를 발행해줄겁니다. "유저에게 알림" 알림은 위에서 발행한 "사용자가 좋아요 눌렀어!"라는 이벤트가 발행되길 기다리고 있다가, 실제로 발행되면 사용자에게 알림을 보내도록 구현되어 있을 것 같아요. 즉, 좋아요를 누른다고 바로 해당 유저에게 알림을 보내는게 아니라 어느정도 시간차가 있을 수 있어요. 이렇게 이벤트 기반으로 백엔드에서 서비스끼리 통신하는 패턴은 널리 사용되고 있습니다. "악성 유저 방지" 악성 유저 방지는 여러 단계에서 구현이 될 것 같습니다. 예를 들면, 프론트엔드에서 동일한 요청이 n초안에 n개가 들어올 경우 요청을 하나로 처리하게끔 로직을 구현할수도 있어요. 또는, 백엔드에서 n초에 특정 ip, device, userId로 정해진 만큼의 요청만 받을 수 있도록 구현할수도 있구요. "앱 상태관리" 이거는 사실 인스타그램 소스 코드를 직접 봐야지 어떻게 상태를 관리하는지 알 수 있을 것 같습니다. 그래도 유저 상호작용으로 인한 즉각적인 ui 변화는 새로고침 같은 다른 요청을 기다리지는 않는것 같아요. 물론 위에 설명된 예시는 많은것들이 함축된거라 여러 자료와 세션을 찾아보시면서 공부하시면 좋을 것 같습니다. 참고하면 좋을법한 링크들 첨부할게요 :) - http://highscalability.com/blog/2022/1/11/designing-instagram.html - https://medium.com/backchannel/war-stories-3696d00207ff - http://highscalability.com/blog/2012/4/9/the-instagram-architecture-facebook-bought-for-a-cool-billio.html#comment17572905 - https://movment.tistory.com/83

profile picture

익명

작성자

2023년 04월 30일

아 백엔드에서 특정 ip를 막는 방법도 있겠네요. 많은 식견을 얻었습니다 감사합니다. !!

가즈아님의 프로필 사진

1 푸쉬라니크 api 호출 2 데이터베이스 업뎃 2-1 작성유저에게 알림 서비스 호츌 3 리턴받아 ui 이벤트 발생 이순서가 아닐런지요

profile picture

익명

작성자

2023년 04월 30일

답변 감사합니다 !!

연양갱님의 프로필 사진

안녕하세요 API의 요청 순서에 대해서는 위에분께서 답변을 상세히 잘 해주셨기 때문에, 따로 말씀드릴 것은 없을것 같네요. 저는 비정상 사용자로 인한 어뷰징에 대해서 말씀 드려보고자 합니다. 실제로 DB는 성능 비용이 크기 때문에 여러번 요청이가면 크게 무리가 올 수 있습니다. 그래서 실제로 Application 서버를 scale out해 여러 서버로 분산을 시키거나 DB또한 여러 서버를 운용하여 과부하를 해소할 수 있습니다. 또한 DB만 사용하면 성능면으로 무리가 갈수 있으므로, Redis와 같은 In-Memory DB를 이용하여 캐시를 구현해 오라클과 Mysql과 같은 RDBMS와 분산하여 데이터를 저장 관리 할 수 있습니다. In-Memory는 휘발성이지만 자료의 입출력 속도가 빠르므로 성능 개선에도 유용합니다. 또한 비정상 사용자의 경우는 특정한 구간동안 비정상적인 요청이 들어올 경우 비정상 사용자로 구분하거나, 차단을 하는 방법으로 더이상 요청을 못하도록 막게 될것같네요

profile picture

익명

작성자

2023년 04월 30일

답변 감사드립니다 !!

커리어리 AI 봇님의 프로필 사진

인스타그램에서 좋아요를 눌렀을 때, 발생하는 일은 정확하게 알 수 없지만, 일반적으로 좋아요를 누르면 해당 피드 작성자의 서버로 /pushLike와 같은 API 요청이 전송됩니다. 이 API 요청은 데이터베이스에 좋아요 정보를 업데이트하는 역할을 합니다. 그리고 이 API 요청이 성공하면, 해당 피드 작성자에게 알림이 전송됩니다. 비정상 사용자가 많은 속도로 좋아요를 누르는 경우, 일부 앱에서는 이를 방지하기 위해 방어 메커니즘을 사용합니다. 예를 들어, 하루에 좋아요를 누를 수 있는 횟수에 제한을 둘 수도 있습니다. 이 외에도 서버에서 요청을 처리하는 속도를 제한하거나, 사용자의 활동 패턴을 분석해서 비정상적인 행동이 감지되면 일시적으로 기능이 제한될 수도 있습니다. 좋아요 버튼을 눌렀을 때, 화면에 바로 반영되지 않는 이유는 해당 API 요청이 완료되기 전까지 대기 상태에 있기 때문입니다. 이 때, 일부 앱에서는 로딩 스피너와 같은 UI 요소를 통해 사용자에게 작업이 진행 중임을 알려주기도 합니다. 좋아요와 같은 기능은 앱에서 상태를 관리하고 필요한 경우 서버로 업데이트를 전송하는 방식으로 구현할 수도 있습니다.

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!