본문 바로가기

전체 글11

Road to Clean Code - 1편 (깨끗한 코드) 개요 해당 포스팅은 스터디장님의 제안으로 시작되었습니다. 더 나아가 개발자들의 바이블이라는 '클린 코드'를 아직까지 못 읽었다는 부끄러움과 함께 바쁘지만 틈틈이라도 읽어보자라는 마인드로 시작했습니다. 이번 계기로 깨끗한 코드를 만들 수 있는 개발자로 한 걸음 성장할 수 있기를 기대합니다. 대부분의 책은 1장이 가장 중요하다고 생각합니다. 1장을 읽으면서 느낀 생각은 이 책도 마찬가지라는 생각이었습니다. 1장에서는 필자, 즉 Robert. C Martin이 강조한 클린 코드를 왜 집필했고, 왜 사용해야 하는지에 대한 개괄이 등장합니다. 지금부터 1장을 요약해보면서 저자가 왜 그토록 깨끗한 코드를 강조하는지에 대해 알아보겠습니다. 코드의 필요성에 대해 먼저 생각해보자 최근 특정 사이트를 만들어 주는 플랫폼들.. 2021. 4. 20.
내가 만든 서비스는 얼마나 많은 사용자가 이용할 수 있을까? - 3편(DB Connection Pool) 개요 지난 시간 현재 AGORA 서비스의 단일 피드 조회 기능에 대한 성능 테스트를 진행해보았습니다. 이번 시간에는 데이터베이스의 Connection Pool의 크기를 조절해보면서 발생하는 성능 변화에 대해 알아보겠습니다. 먼저 Connection Pool이 무엇인지 알아볼까요? Connection Pool은 무엇일까요? Connection? 연결? 어떤 연결을 의미할까 생각하실 수 있을 것입니다. 여기서 말하는 Connection이란 WAS와 데이터베이스 사이의 연결을 의미합니다. 해당 클라이언트와 서버 사이의 연결을 위해서는 아래 그림과 같이 3-way-handshaking이라는 작업이 필요합니다. 3-way-handshaking은 3번의 패킷 교환을 통해 소켓을 형성하고 통신을 준비하는 과정을 의미.. 2021. 1. 14.
내가 만든 서비스는 얼마나 많은 사용자가 이용할 수 있을까? - 2편(nGrinder를 활용한 성능테스트) 개요 지난 시간 서비스의 성능을 알기 위해서 Throughput과 Latency 성능지표가 필요하다고 알게 되었습니다. 이번 시간에는 서비스의 성능 지표를 확인하기 위해서 부하를 발생시키는 방법에 대해 알아보겠습니다. 또한 AGORA 서비스에 실제 부하를 발생시켜서 단위 성능 테스트를 진행하고 AGORA 서비스의 현재 성능을 분석해보도록 하겠습니다. 먼저 부하를 발생시키는 도구에 대해서 알아볼까요? nGrinder에 대해서 알아보자! nGrinder는 네이버에서 The Grinder라는 성능 테스트 도구를 기반으로 제작한 오픈소스 성능 테스트 솔루션입니다. 스크립트 생성과 테스트 실행, 모니터링 및 결과 보고서 생성을 통합된 Web UI를 통해 사용할 수 있으므로 성능 테스트를 보다 쉽게 할 수 있습니다.. 2020. 12. 27.
내가 만든 서비스는 얼마나 많은 사용자가 이용할 수 있을까? - 1편(성능 테스트란?) 개요 Agora 프로젝트를 서버 배포에 성공하고, 서비스가 얼마나 많은 사용자를 감당할 수 있을지 알고 싶어 졌습니다. 이를 위해 성능 테스트를 진행해보았습니다. 이번 포스팅 시리즈는 성능 테스트를 진행하면서 겪은 성능적인 이슈와 이를 분석하고 해결해나가면서 겪은 경험을 공유하고자 시작하였습니다. 먼저 성능 테스트는 어떤 작업일까요? 지금부터 성능 테스트에 대해서 알아보겠습니다. 성능 테스트는 왜 해야 할까요? 성능 테스트는 말 그대로 서비스의 성능적인 부분을 측정하기 위해 실행되는 작업입니다. 애플리케이션의 성능을 측정한다는 것은 점진적인 부하를 가하는 과정 속에서 더 이상 처리량이 증가하지 않을 때, 그 수치를 측정하고 해석하는 것을 의미합니다. 그렇다면 이러한 행위는 왜 하는 걸까요? 성능 테스트의.. 2020. 12. 18.
지속적인 통합(Continuous-Integration) & 지속적인 배포(Continuous-Deploy) 적용하기 - 1편(CI란 무엇인가?) 개요 최근 프로젝트 완성이 얼마 남지 않아 배포에 관하여 검색하면서 CI/CD라는 단어를 만나게 되었습니다. 이전에 배포 경험이 아예 없었던 건 아니지만, CI/CD라는 개념을 통해 놀라울 정도로 편해진 배포 경험을 나누고자 포스팅을 하려고 합니다. 그럼 CI부터 CD까지 차례대로 알아보겠습니다. CI가 무엇일까요? CI란 지속적인 통합(Continuous Integration)을 의미합니다. CI를 알기 위해서 단어 하나하나 차례대로 알아봅시다. 먼저 통합(Integration)은 개발 과정에서 어떤 행위를 의미할까요? 요즘 대부분의 개발자는 소스코드가 담긴 레포지토리를 Git을 통해 버전 관리를 하며, 더 나아가 GitHub이나 GitLab과 같은 클라우드 원격 저장소에서 관리하고 있습니다. 이러한 .. 2020. 12. 3.
다중 서버 환경에서 Session은 어떻게 공유하고 관리할까? - 4편(Redis vs Memcached) 개요 지난 시간 세션 저장소로 In-Memory Database를 사용하기로 하였습니다. 하지만, In-Memory Database에는 다양한 데이터베이스들이 존재합니다. 각각의 데이터베이스는 저장하는 데이터의 형태 및 특성에 따라 분류됩니다. 과연 세션 객체를 저장하기 위해서 어떤 데이터베이스가 적합할까요? 지금부터 어떤 데이터베이스에 세션을 저장하는 것이 적합할 지에 대해 하나하나 알아보도록 하겠습니다! 세션 객체는 어떤 형태로 구성되어 있을까? 데이터베이스를 선정하기 전에 어떤 형태의 데이터가 저장되는지가 중요하다고 언급하였습니다. 그렇다면 우리가 저장해야 할 데이터인 세션 객체가 어떤 형태로 구성되어 있는지 알아야겠죠? 우선, 세션 객체에 대해서 간단히 알아봅시다. 세션 객체는 Key에 해당하는 .. 2020. 7. 8.
다중 서버 환경에서 Session은 어떻게 공유하고 관리할까? - 3편 (Disk based database vs In-Memory database) 개요 지난 시간 다중 서버 환경에서 별도의 세션 스토리지를 구성하여 정합성 이슈를 해결하기로 하였습니다. 여기서 생각해볼 문제가 있습니다. 웹 서비스의 특성상 대부분의 요청은 인가된 사용자가 보내는 요청인지 확인하는 절차가 선행되어야 합니다. 즉, 대부분의 요청에서 로그인한 사용자인지 아닌지 확인하기 위해 매번 세션 스토리지를 방문해야 합니다. 이러한 특성을 고려한다면 세션 스토리지를 선정할 때, 성능에 영향이 미치지 않도록 빠르게 데이터를 찾아서 제공할 수 있는 데이터베이스를 사용해야 하겠죠? 지금부터 어떠한 데이터베이스가 세션 스토리지에 적합한지 알아보겠습니다. 매번 왕복하기에 디스크는 너무 느린걸? 데이터베이스는 데이터가 어느 곳에 저장이 되는가를 기준으로 디스크 기반의 데이터베이스와 In-Memo.. 2020. 6. 27.
다중 서버 환경에서 Session은 어떻게 공유하고 관리할까? - 2편(Sticky Session, Session Clustering, Session Storage 분리) 개요 지난 시간에 서버의 성능을 업그레이드하는 두 가지 방법을 알아보았습니다. 그중 스케일 아웃을 하면 여러 대의 서버가 각각 세션 저장소를 독립적으로 갖게 되므로 정합성 이슈가 발생하였습니다. 이번 시간에는 스케일 아웃을 하였을 때 세션을 어떻게 공유하여 정합성 이슈를 해결하는지에 대해 알아보겠습니다. Multi Server 환경에서 Session이 어떻게 구성되는지 다시 한번 볼까요? 보시는 바와 같이 세션은 서버 1대에 하나의 저장소가 형성됩니다. 지난 시간에 알아보았듯이 나누어진 세션 저장소에 대한 별도의 처리가 없다면 각각의 세션들은 정합성 이슈를 발생시킵니다. 위 그림처럼 여러 대로 나뉜 서버가 하나의 서비스를 운영하기 위해서는 4개의 분리된 세션을 하나의 시스템처럼 동작하게 하거나, 고정된 .. 2020. 6. 17.
Model 클래스에는 Setter가 꼭 필요한가? 개요 Model(DTO, VO 등) Object를 사용하면서 private 접근 제한자로 멤버 변수를 선언하고 접근자(getter)와 설정자(setter)를 통해서 객체의 멤버에 접근하는 것이 습관이 되어가던 찰나, "VO 나 DTO를 변경할 필요가 없다면 굳이 setter를 선언할 필요가 있을까?"라는 피드백을 받게 되어 생각해보게 되었습니다. 생각 없이 사용해온 접근자와 설정자를 왜 써야 하는지부터 알아보겠습니다. 직접 멤버 변수에 접근하지 않고 왜 번거로운 getter와 setter 메서드를 만들어서 사용하는 거야? java 서적을 보면, '클래스의 멤버 변수는 private 접근 제어자를 사용하고, getter와 setter를 통해 객체의 멤버 변수에 접근해야 한다.'는 말을 많이 접할 수 있습니.. 2020. 6. 9.
다중 서버 환경에서 Session은 어떻게 공유하고 관리할까? - 1편 (Scale-Up / Scale-Out이란?) 개요 지난 시간 세션과 쿠키를 이용한 로그인에 대해 알아보았습니다. 이러한 개념을 바탕으로 로그인 기능 개발을 들어가기 전에 생각해볼 문제가 생겼습니다. 현재 프로젝트의 사용자가 많아져서 가용 중인 서버로 수많은 클라이언트들을 감당할 수 없는 환경에 이르면 어떻게 해야 할까요? 지금부터 서버가 대량의 트래픽을 해결하는 방법에 대해서 알아보겠습니다. Scale-Up / Scale-Out에 대해 알아보자! 스케일 업이란 단일 서버(하드웨어)의 성능을 증가시켜서 더 많은 요청을 처리하는 방법을 의미합니다. 즉, 단일 하드웨어의 성능을 높이기 위해 CPU, 메모리, 하드디스크 등을 업그레이드하거나 추가하는 것을 의미합니다. 반면, 스케일 아웃은 동일한 사양의 새로운 서버를 추가하여 성능을 증가시키는 방법을 말합.. 2020. 5. 25.
HTTP 는 Stateless 한데 로그인은 어떻게 구현할 수 있을까? (세션/쿠키를 이용한 인증) 개요 소셜 네트워크 서비스 'AGORA'를 제작하면서 가장 먼저 개발한 기능은 회원가입/로그인 입니다. 혼자 사용하거나 모든 정보가 공개된 웹 어플리케이션이 아니라면 대부분의 웹 어플리케이션은 회원가입과 로그인 기능이 구현되어 있습니다. 이러한 인증 기능은 왜 필요할까요? 각각의 클라이언트는 웹 서비스에서 개별적인 컨텐츠를 소비합니다. 그러므로 Client에서 API를 요청하였을 때, 서버는 누구의 요청인지 정확하게 식별해야만 합니다. 즉, 서버는 각 클라이언트의 개인적인 정보들을 보관하고 이를 클라이언트의 요청에 맞추어 제공해야만 합니다. 이러한 과정 속에 '인증'(Authentication)이 이루어지지 않는다면 개인정보가 유출되거나 변조되는 등의 취약점이 발생할 수 있습니다. 지금부터 기본적이지만 .. 2020. 5. 11.