[자바스크립트] 프락시 패턴
흔히 **프락시(Proxy)**라고 한다면 클라이언트와 서버 사이의 중간 역할을 담당한다고 이해합니다. 이 경우에 프락시는 클라이언트가 서버에 직접 접근하지 않도록 가상화 또는 캡슐화할 수 있습니다. 직접적으로 클라이언트가 서버에 접근하지 않기 때문에 우리는 서버의 기능을 노출할 필요가 없게 됩니다. 자바스크립트로 코딩할 때 위와 같은 프락시 패턴을 활용할 수 있습니다. 하나하나 살펴보겠습니다.
이벤트 관리
하나의 안에 3개의 버튼이 있고, 이에 대해 각각 이벤트를 부여해야하는 경우를 생각해봅니다.
보통의 각각의 버튼에 이벤트를 부여하는 방식으로 간단하게 문제를 해결할 수 있습니다.
위의 방식은 매우 간단하게 이벤트를 생성하고 작성할 수 있습니다. 하지만 엘리먼트가 많아지고, 이벤트 버블링과 캡처링 등 복잡한 상황이 발생하게 되면 관리하는데 불편함을 줄 수 있습니다. 그러나 프락시 패턴은 이러한 문제를 심플하게 해결해줍니다.
먼저 하나의 객체를 생성합니다. 위의 객체는 분산된 이벤트를 하나로 묶은 모습입니다.
이렇게 이벤트 각각을 "아이디" : "각각의 이벤트" 형태로 묶은 다음 버튼의 부모 엘리먼트에 이벤트를 부여합니다.
코드를 살펴보면 기존엔 3개의 엘리먼트 각각에 이벤트를 부여했습니다. 그러나 이제는 하나의 엘리먼트에 이벤트를 부여하고, 3개의 자식 엘리먼트의 이벤트를 관리할 수 있게 됐습니다. 또한 이벤트 전체를 하나의 객체로 관리하기 때문에 관리의 편리함도 생겼습니다. 이렇게 간단한 경우를 살펴봤으니 조금 더 깊게 들어가보겠습니다.
캐시를 통한 상태 저장
프락시는 중간자의 역할을 감당하기도 하지만 캐시라는 중요한 특징도 가지고 있습니다. 캐시를 통해 저장하고자 하는 상태를 관리할 수 있습니다.
위의 예시에서 alert 명령이 아닌 서버 요청 이벤트를 버튼에 부여해봅시다. 만약 사용자가 버튼을 반복적으로 누른다면 서버에 부담을 줄 수 있습니다. 하지만 이를 티 안나게 막을 수 있는 방법이 바로 캐시입니다.
캐시 역할의 변수 cache를 생성했고, 요청이 발생하면 cache 변수에 해당 키를 추가합니다. 해당 키는 1초 후에 삭제됩니다. 만약 사용자가 1초 안에 여러번 클릭을 한다면 수 많은 요청은 무시하고 1번만 요청을 하게 됩니다.
위의 코드를 조금만 수정하면 반복적인 요청을 제어할 뿐 아니라 요청을 취소하는 경우도 생각해볼 수 있습니다. 우리가 웹서핑할 때 잘못 클릭하는 경우가 생기곤 합니다. 그럼 창이 바뀌기 전에 다른 버튼을 클릭합니다. 이 경우 사용자 입장에선 한 개의 페이지만 조회하겠지만 서버에는 2번의 요청이 진행됩니다. 이를 프락시 패턴으로 처리할 수 있습니다.
위의 코드는 요청이 바로 진행되지 않고, 0.6초 후에 요청이 진행됩니다. 0.6초 안에 다른 요청이 발생하면 기존 요청이 아닌 두번째 요청을 즉시 진행하게 됩니다.
잦은 요청 통제하기
때로는 수 많은 요청을 하나하나 처리하는게 비효율적일 수 있습니다. 예를 들면 채팅 서버입니다. 사용자가 쓴 채팅 하나하나마다 요청을 보낸다면 카카오톡 서버는 지금보다 몇 배는 더 커져야할겁니다. 하지만 프락시 패턴을 활용하면 사용자의 여러 메시지를 마치 하나인 것처럼 처리할 수 있고, 또한 서버에 부담도 덜 줄 수 있습니다.
이제 처음 예시로 만든 버튼이 각각 자신의 아이디값을 메시지 형태로 서버로 보낸다고 가정합니다.
프락시 패턴은 여기에서 두 가지 변수를 더해줍니다. 첫번째 변수는 **요청이 진행 중인지를 확인하는 변수(isPending)**와 두번째는 요청이 진행 중일 때 사용자가 요청한 **메시지 배열(messages)**입니다.
proxyRequest 함수는 사용자가 응답받기도 전에 온 요청에 대해서는 저장하고, 응답이 완료되면 메시지 묶음(배열)으로 서버에 전송합니다. 이렇게 하면 서버는 메시지를 하나씩 요청할 때보다 훨씬 더 효율적으로 작동할 수 있게 됩니다.
More from Howdy의 블로그
See all posts특별한 법칙은 아니지만 자주 생각하려는 법칙이 있다. 향기의 법칙이라고 명명한 이 법칙은 무척이나 간단하다. 어떠한 상황에서든 상대를 유혹하라는 것이다. 원하는 것이 있다면 상대방이 원하도록 유혹하는 것이다. 이는 아주 간단한 원칙인데 동시에 매우 달성하기 어려운 법칙이기도 하다. 향…
향기의 법칙
하루가 멀다하고 사고가 터지는 것이 인간사. 인간이 만든 것 중 무엇이 대단하다 말할 수 있을까. 무엇이 완전하다 말할 수 있을까. 무엇이 영원하다 말할 수 있을까. 영원한 것은 단 하나도 없고 먼지가 쌓이지 않는 것도 단 하나도 없다. 기회 역시 영원하지 않아서 영원할 것 같은 젊음…
영원하지 않다
이카루스는 태양에 가까이 가면 안된다는 것을 알았으나 높게 날았다. 깃을 붙인 밀납이 녹아 깃이 떨어져 나가고 나서야 그는 자신의 미래를 보았다. 자유로 향하는 날개를 얻었을 때 태양을 향해서도 바다를 향해서도 안됐다. 고도를 유지하며, 섬세하게 바람을 타지 않는다면 어디로든 날아갈…
자유의 날개
인간이 보편적으로 누리는 권리는 대부분 거래를 통해 획득했다. 참정권은 군복무, 참전으로 얻었고, 링컨의 노예제 해방을 위해선 산업화된 사회에서의 흑인 인권이 필요했다. 반면 노예를 사용하는 것이 경제적 이득이 되는 남부군의 입장에서는 당시 기준으로 재산권 침해에 해당한다고 보았기에…
Comments