본문 바로가기

전체

(9)
레거시 시스템을 DDD(도메인 주도 설계) 기반으로 재설계한 이야기 1편 https://liasn.tistory.com/10 솔루션 업체 개발자에서 교육 스타트업으로 이직 회고(with. F-Lab 멘토링) ▶ 들어가며 코로나 때문에 불안한 취업 시장에서 퇴사와 이직을 결심하고 그 끝에 만족스러운 결실을 맺은 올해 상반기는 인생에서 가장 보람찬 시간이었다고 생각 든다. 솔루션 업체에서 신 liasn.tistory.com 나는 F-Lab이라는 교육 스타트업으로 이직을 했고 최근에는 레거시 시스템을 개선한 새로운 프로덕트를 오픈하였다. 이번 글에서는 기존 레거시 시스템을 Domain Driven Design을 기반으로 새롭게 바꿔 나가면서 겪었던 경험을 이야기하고자 한다. 그전에 DDD는 뭘까? DDD(Domain Driven Design)는 비즈니스에서 나타나는 도메인의 프로세..
솔루션 업체 개발자에서 교육 스타트업으로 이직 회고(with. F-Lab 멘토링) ▶ 들어가며 코로나 때문에 불안한 취업 시장에서 퇴사와 이직을 결심하고 그 끝에 만족스러운 결실을 맺은 올해 상반기는 인생에서 가장 보람찬 시간이었다고 생각 든다. 솔루션 업체에서 신입 개발자로 시작해 F-Lab 멘토링(에프랩 멘토링)을 받아 교육 스타트업으로 이직한 나의 이야기를 공유해보려고 한다. ▶ 전 직장은 어땠나? 어린 시절부터 컴퓨터를 가지고 노는 게 재밌고 흥미가 많아서 자연스럽게 전공 또한 컴퓨터 쪽으로 갔다. 그리고 첫 직장을 QoS 솔루션과 보안 관제 플랫폼을 제공하는 업체의 개발자로 취업했다. 자바와 스프링을 사용하고 Mybatis, Elasticsearch 등의 기술을 사용했다. 그리고 업력이 꽤 오래되었고 그만큼 코어 엔진의 기술력을 가진 회사였다. 매출도 지속적으로 성장하고 나름..
Redis Session 병목 해결 및 최적화하기 https://liasn.tistory.com/7 nGrinder로 성능 테스트 과정에서 발견한 Redis Session 병목 애플리케이션 서버를 개발하고 '나의 서버는 어느 정도의 트래픽을 처리할 수 있을까?'라는 고민을 할 수 있습니다. 하지만 여러 개의 브라우저를 띄워 동시에 요청을 보내는 방법은 한계가 있 liasn.tistory.com 이전 글에서 'TPS 수치가 0이 되는 시점에 CPU 사용량의 대부분을 차지하는 스레드가 모두 위의 스택 정보를 가진다면 병목 현상은 WAS에서 Redis Session을 만료 처리하는 과정에서 발생한다.'라는 가설을 세웠는데 이번 글에서는 가설 입증을 위해 병목이 왜 발생했고, 해결 방법은 무엇이고, 해결하면 병목이 사라지는지를 확인해 보도록 하겠습니다. 발생 ..
nGrinder로 성능 테스트 과정에서 발견한 Redis Session 병목 애플리케이션 서버를 개발하고 '나의 서버는 어느 정도의 트래픽을 처리할 수 있을까?'라는 고민을 할 수 있습니다. 하지만 여러 개의 브라우저를 띄워 동시에 요청을 보내는 방법은 한계가 있어 성능 테스트 도구를 이용하는 것이 좋습니다. 그래서 저는 네이버의 nGrinder를 통해 클라우드 환경에 구축해놓은 서버가 얼마만큼의 트래픽을 받을 수 있는지 성능 테스트를 진행했습니다. nGrinder 성능 테스트 스크립트 작성 먼저 nGrinder를 통해 테스트를 하기 위해서는 테스트 시나리오를 짜고 시나리오에 맞는 스크립트 코드를 작성해야 합니다. 저는 사용자의 아이디와 비밀번호를 입력하여 로그인하는 기능을 테스트하고 싶어 다음과 같이 작성하였습니다. ... class TestRunner { public stat..
MySQL 실행 계획 분석으로 성능 개선한 이야기 MySQL을 DB로 사용하여 개발할 때 내가 작성한 쿼리가 실제 어떻게 수행이 되고 성능은 어느 정도인지 확인이 필요할 때가 있습니다. 성능이 느리다면 쿼리를 개선하거나 구조를 다시 짜는 리팩터링을 통해 성능을 끌어올릴 수도 있구요. 제가 프로젝트를 진행하면서 만든 쿼리의 실행 계획을 분석하고 성능 개선을 한 사례를 말씀드리겠습니다. 간단한 사례 제가 진행한 프로젝트에는 캠핑용품 유형 데이터가 존재합니다. 캠핑용품 유형이란? 캠핑용품에는 텐트, 코펠, 버너, 테이블, 의자와 같이 여러 가지 유형이 존재하는 데 그 유형을 나타내는 데이터입니다. 그래서 실제 테이블은 id와 name 칼럼으로 구성되어 있고 id를 통해 유형 데이터의 유일함을 표현할 수 있도록 Primary Key 제약 조건을 걸고 사용 중이..
로컬 캐싱에서 글로벌 캐싱으로 변경한 이유 애플리케이션 서버의 조회 성능을 끌어올리기 위한 방법 중 캐싱이 있습니다. 제가 스프링 기반 프로젝트를 진행하면서 왜 로컬 캐싱을 적용했고 글로벌 캐싱으로 변경했는지 알아보겠습니다. 캐싱이란? 캐싱은 어떤 요청에 대한 결과를 임시적으로 저장하는 행위를 말합니다. 예를 들어, A라는 매개 변수로 메소드를 호출했을 때 그 결과를 임의의 공간에 임시 저장하고 똑같은 A라는 매개 변수로 메소드 호출이 들어왔을 때 실제 작업이 수행되지 않고 임시 저장 중인 결과를 반환하는 형태입니다. 주목적은 성능 향상과 동시에 부하 방지라고 말씀드릴 수 있습니다. 나의 프로젝트에 캐싱이 필요한 이유는? 저의 프로젝트에는 캠핑용품 유형 데이터가 존재합니다. 유형에는 텐트, 의자, 코펠, 버너와 같은 여러 가지가 될 수 있는데요...
나는 왜 MySQL Replication을 적용했을까? 많은 트래픽이 흐르는 상황에서 서버의 성능을 올리기 위해 애플리케이션 서버를 늘리는 방법을 선택할 수 있습니다. 하지만 서비스를 운영하기 위해선 애플리케이션 서버뿐만 아니라 데이터를 저장하는 역할인 DB 서버 또한 필요로 합니다. 애플리케이션 서버의 부하는 위와 같은 방법으로 해소가 가능하지만 DB 서버는 어떨까요? 실제로 DB 서버는 데이터를 Disk에 직접 쓰고, 읽는 I/O 작업이 일어나기 때문에 애플리케이션 서버보다 훨씬 큰 병목 지점이 될 수 있습니다. 애플리케이션 서버를 아무리 늘려도 데이터에 직접 액세스 하는 부분에서 똑같이 병목이 발생하면 서비스 전체의 병목은 그대로이기 때문에 DB 서버도 부하를 분산하여 큰 트래픽에 대응하는 것이 좋습니다. MySQL Replication MySQL은 R..
Scale out 확장 구조에서 Session 불일치 문제와 해결 방법 저번 글에서 서버의 확장은 어떤 것들이 있는지 알아봤습니다. 서버의 확장? Scale up과 Scale out이란? 웹 서버 애플리케이션을 개발하고 운영하다 보면 여러 가지 상황을 마주하게 됩니다. 그중 하나는 서버의 처리 능력보다 많은 양의 트래픽이 들어오는 상황 서버를 배포하고 운영 중인데 서버 liasn.tistory.com Scale out 확장을 선택하면 데이터 정합성 문제를 반드시 해결해야 합니다. 그렇다면 실제 프로젝트에선 어떤 식으로 발생할까요? 저의 웹 서버 애플리케이션은 로그인에 대한 인증 기능을 세션 기반으로 구현했습니다. 이때, Scale out을 통해 여러 대의 서버로 요청을 처리하도록 분산 서버 환경을 만들면 각 서버 별로 로그인 세션 정보가 다른 세션 불일치 문제가 발생합니다...