본문 바로가기

WEB12

분산환경에서 서비스의 중단없이 배포하기. 이전 시간에서 Jenkins를 통해 배포 자동화를 구현했습니다. 자동으로 테스트, 빌드 과정을 거치고 실행 스크립트를 통해 실행 중인 애플리케이션 프로세스를 종료하고, 새로 빌드된 애플리케이션을 실행시키는 것으로 동작합니다. 하지만 이러한 동작 방식에는 두 가지 문제가 있다고 생각했습니다. 첫 번째는 애플리케이션을 종료하고 다시 애플리케이션을 실행하는 시간 동안 서버가 중단되는 현상이 발생한다는 점입니다. 두 번째는 애플리케이션을 실행시킬 때 문제가 발생하는 경우 대처할 방법이 없다는 것입니다. 이런 문제를 어떻게 해결할 수 있을까요?? 롤링 배포 제가 먼저 생각한 방법은 롤링 배포 방식입니다. 무중단 배포의 가장 기본적인 방식으로 사용 중인 인스턴스 내에서 한 개씩 점진적으로 인스턴스를 교체하는 방식입.. 2021. 12. 28.
Jenkins를 통한 CI & CD 구축하기. 저희 프로젝트를 배포하기 위해 리눅스 서버에서 Git pull을 하여 코드를 받아온 뒤 빌드하여 jar파일을 실행시켜야 했습니다. 이는 굉장히 반복적이고 귀찮은 과정이기에 배포와 테스트 자동화의 필요성을 느끼게 되었습니다. 먼저 CI와 CD에 대해 알아봅시다. CI (Continous Integration) CI는 개발자들을 위한 자동화 프로세스인 지속적인 통합을 의미합니다. 우리는 보통 원격 저장소에 공용 레포지토리를 생성하여 작업하게 됩니다. 이때 개인이 작업한 내용이 신뢰성을 가질 수 있도록 단위 테스트, 빌드 등 부가적인 작업이 이루어져야 합니다. CI를 성공적으로 구현하는 경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 레포지토리에 통합되게 됩니다. CD (.. 2021. 12. 24.
캐싱적용해서 읽기 작업 성능 개선하기. Cache란 자주 사용하는 데이터를 미리 복사해 놓는 임시공간으로서 다시 이 데이터를 필요로 할 때 보다 빠르게 참조할 수 있습니다. 현재 진행 중인 프로젝트에서 성능 개선을 위해 캐시를 도입하기로 했습니다. 대규모 트래픽을 처리해야 하는 상황에서 데이터베이스 서버에 동일한 요청을 여러 번 처리하게 하는 것은 비효율적이라고 생각했습니다. Local Cache vs Global Cache 캐시를 사용하기 전에 먼저 어떤 캐싱 전략을 사용할지 고민했습니다. 캐싱 전략에는 크게 Local Cache, Global Cache가 있습니다. Local Cache는 서버 내부 저장소에서 데이터를 관리하는 것입니다. 서버 내에서 동작하기 때문에 속도가 빠르지만 각 서버 간의 데이터 공유가 안된다는 단점이 있습니다. 이.. 2021. 12. 21.
DTO, Entitiy간의 변환은 어디서 일어나야 할까? 프로젝트 구조에 대한 고찰. 프로젝트를 진행하면서 프로젝트 구조에 많은 생각을 했습니다. 먼저 레이어드 아키텍처에 대해 알아봅시다. 레이어드 아키텍처는 간단히 이야기하자면 책임과 성격이 다른 것을 구별해 레이어별로 분리하는 것을 이야기합니다. 각 계층은 자신의 계층의 책임에만 충실해야 합니다. 웹 애플리케이션을 만들 때 일반적으로 사용하는 3-계층 레이어는 다음과 같습니다. 웹 애플리케이션을 만들 때 일반적으로 사용하는 3-레이어 아키텍처의 구분은 다음과 같습니다. 프레젠테이션 계층은 애플리케이션 앞단에서 Dispatcher의 역할을 수행합니다. Controller가 이 계층에 해당한다고 볼 수 있습니다. 서비스 계층은 비즈니스 로직을 처리하는 영역입니다. 프레젠테이션 계층과 데이터 액세스 계층 사이를 연결하고 두 계층이 직접적으로.. 2021. 12. 13.
분산 환경에서 발생하는 세션 불일치 문제 해결하기. 로그인을 구현하는 방법으로 크게 세션 기반 인증방식과 토큰 기반 인증방식이 있습니다. 토큰의 경우 클라이언트에서 관리하기 때문에 탈취당했을 경우 저희가 손쓸 방법이 없습니다. Refresh Token을 사용해 이를 어느 정도 보완하는 방법도 있지만 저희는 서버에서 관리하는 세션이 조금 더 보안에 유리하고, 세션을 사용함으로써 다양한 기능(동시 접속 계정 수 제한, 특정 디바이스 로그아웃 등)들을 구현할 수 있을 거라 판단해 세션 기반 인증 방식을 선택했습니다. 하지만 세션 기반 인증 시스템에도 단점은 존재합니다. 바로 다수의 서버 환경에서 사용 시 세션 불일치 문제가 발생할 수 있다는 점입니다. 이런 세션 불일치 문제를 해결하기 위해 여러 가지 방법을 생각해봤습니다. 1. Stickey Session 가.. 2021. 12. 4.
OAuth 2.0 OAuth 2.0 OAuth는 외부 서비스의 인증 및 권한 부여를 관리하는 범용적인 프로토콜입니다. 외부서비스에 아이디와 비밀번호를 제공하지 않고 인증하기 위해 탄생되었습니다. OAuth는 인증뿐만 아니라 권한도 관리합니다. 사용자의 권한에 따라 접근할 수 있는 데이터가 다르도록 설정할 수 있습니다. 현재 대다수가 사용하고있는 OAuth는 2.0 버전입니다. OAuth 2.0에서 크게 바뀐 점은 다음과 같습니다. 1. 모바일 애플리케이션에서도 사용이 용이해졌습니다. 2. 반드시 HTTPS를 사용하기때문에 보안이 강화되었습니다. 3. Access Token의 만료기간이 생겼습니다. OAuth2 용어 정리 Resource Owner: 사용자 (User) Client: Resource Server에서 제공하는.. 2021. 10. 4.
JWT 토큰 기반 인증 시스템 기존의 인증 시스템에서는 서버 측에서 유저들의 정보를 관리했습니다. 하지만 서비스의 규모가 커짐에 따라 서버 기반 인증 방식의 문제가 보이기 시작했습니다. 이로 인해 현대 웹 서비스에서는 인증받은 사용자들에게 토큰을 발급하고, 서버에 요청을 할 때 헤더에 토큰을 함께 보내도록 하여 유효성 검사를 하는 토큰 기반 인증 시스템이 나오게 되었습니다. 세션 기반 인증 시스템의 가장 큰 단점으로는 다수의 서버 환경에서 사용 시 문제가 발생하기 쉽다는 점입니다. 모든 서버들이 같은 세션 스토리지를 공유하고 있어야 하기 때문입니다. 토큰 기반 인증 시스템은 이러한 점을 보완할 수 있습니다. 토큰 기반 인증 시스템의 주요한 이점은 사용자 인증에 필요한 모든 정보를 토큰 자체에 포함하고 있기 때문.. 2021. 10. 4.
로드 밸런서 (Load Balance) 서버를 운영하다 보면 갑작스레 이용자들이 몰리거나, 서비스 확장 등 여러 가지 이유로 인해 더 많은 서버 용량과 성능을 필요로 할 때가 있습니다. 이런 경우 서버를 확장하기 위한 방법으로 스케일 업과 스케일 아웃이 있습니다. 스케일 업 (Scale-Up) 스케일 업은 기존의 하드웨어를 보다 높은 사양으로 업그레이드하는 것을 말합니다. 성능이나 용량 증가를 위해 서버에 디스크를 추가하거나 CPU, 메모리를 업그레이드시키는 것을 말합니다. 이처럼 하나의 서버의 능력을 증가하기 때문에 수직 스케일링이라고도 합니다. 서버를 추가하는 방법이 아니다 보니 여러 대의 서버를 두는 것보다 데이터 정합성 이슈에서 자유롭습니다. 스케일 아웃 (Scale-Out) 스케일 아웃은 장비를 추가해서 확장하는 방식을 말합니다. 기.. 2021. 10. 2.
쿠키(Cookie), 세션(Session) HTTP는 Stateless, Connectionless 프로토콜입니다. 서버는 클라이언트의 상태를 저장하고 있지 않기 때문에, 대표적인 예시로 로그인이 필요한 페이지에서 매 요청마다 로그인 정보를 보내야 하는 경우가 발생할 수 있습니다. 이와 같은 문제를 쿠키와 세션을 통해 보완할 수 있습니다. 쿠키 쿠키는 서버가 웹 브라우저에 전송하는 작은 데이터입니다. 즉 클라이언트에서 보관하는 데이터입니다. 브라우저는 쿠키를 저장해 놓았다가 동일한 서버에 재 요청 시 요청 헤더에 쿠키를 함께 전송합니다. 쿠키의 특징 이름, 값, 만료일(저장 기간 설정), 경로 정보로 구성되어 있습니다. 만료일을 설정하지 않으면 브라우저 메모리에 저장되어 브라우저 종료시 쿠키는 사라집니다. 만료일을 설정하면 파일로 저장이되어 브라.. 2021. 10. 1.