서버 8

Node.js Event Loop

들어가며 회사에서 Node.js를 레거시로 쓰고있다. 그러나 nodejs에 대해서는 매우 대강 알고 있었다. 그래서 이번 기회에 nodejs의 event loop에 공부하고 적어보려한다 Libuv Node.js의 이벤트 루프는 Libuv를 기반으로 동작한다. https://nodejs.org/ko/docs/guides/dont-block-the-event-loop (노드 공식문서) Libuv는 리눅스에서 epoll를 기반으로 동작한다. 결국은 node js의 이벤트 루프 동작방식을 이해하려면 epoll에 대해서 알아야 한다. epoll 기반지식 epoll를 이해하려면 file descriptor, i/o select function에 대해서 알아야 한다. File descriptor file descri..

서버 2023.07.09

소규모 팀에서의 Spring 사용법 (패키지 구조, 테스트 코드를 중심으로)

들어가며 스타트업에서 3년 가량 스프링을 사용해오면서 여러 패키지 구조를 검토하고 사용해봤다. 참고로 이 글은 내가 3년차나 되니까 이렇게 설계하는게 좋으니까 그렇게 해야돼! 이런 글이 절대로 아니다. 지극히 주관적으로 생각했을때 이 구조가 좋더라는 내 생각을 작성한 글이다. 계층형 구조 스프링을 처음 접하면 일반적으로 많이 사용하게 되는 구조다. 스프링 입문 인터넷 강의, 서적 등에서 많이 언급되는 구조다. 계층형 구조의 장점은, 파악하기 쉽다는 것이다. 너무나 익숙하니까... 당연하다. 단점은 카테고리 (패키지)가 적기 때문에 클래스가 많아질 수록 개발 해야 될 클래스를 찾기 어렵다. 도메인형 구조 계층형 구조보다 더 나은 구조 없나?.. 둘러보다 사용해본 구조다. 각각의 도메인 (coupon, me..

서버 2023.07.03

CPU Burst, IO Burst

들어가며 PC의 CPU Burst, IO Burst 작업에 대해서는 얼핏 들어 본적 있었다. 그러나 직접 테스트를 통해 어느정도 차이가 나는지 테스트를 해본적은 없었다. 테스트를 통해 얻은 지식과 이론으로만 알고있던 지식의 차이는 크다고 생각했기 때문에 더 깊은 지식을 알고 싶어서, 간단한 테스트를 진행했다. 왜 이런 결과가 나올까? 1. 메모리와 디스크 구성요소의 차이 메모리는 전기적인 부품이기 때문에 다른 주소값을 읽어들일 때, 마이크로초 단위로 포인터를 이동시킵니다. 그러나 디스크는 헤드의 이동과 원반의 회전 두가지 물리적 이동이 필요하기 때문에, 메모리보다 느립니다. 속도 차이는 적게는 10만배 많게는 100만배 이상 차이가 발생합니다. 2. 버스의 속도차이 데이터를 전송하여 연산을 하기 위해 메..

서버 2023.06.29

linux file descriptor

file descriptor란? 리눅스 시스템에서는 모든 것이 파일이다. 리눅스에서는 프로세스가 파일에 접근할 때 File Descriptor 라는 개념을 이용하여 접근한다. POSIX를 구현한 시스템은 모두 File Descriptor 개념이 있다. (일부 윈도우 운영체제 버전은 POSIX를 구현하지 않고 있다) 왜 알아야하지? 왜 file descriptor에 대해서 알아야할까? 이유는 서버가 장애로 이어질 수 있는 원인들중 하나이기 때문이다. 참고로 file 이라는 단어가 들어갔다고 해서, 폴더안에 담기는 파일만을 의미하지는 않는다. 위에서 설명했다시피 소켓도 파일의 일종으로 리눅스 관점에서 볼 수 있기 때문에, 백엔드 개발자와 연관이 깊은 리눅스의 자원이라고 할 수 있다. 리눅스에서는 프로세스당 ..

서버 2023.06.05

간단하고도 빠른 서버 성능 최적화 (node js를 중심으로)

이전에 Nginx를 사용해서 이미지 캐싱 서버를 따로 구축하여 사이트 속도를 개선했는데도 불구하고 아직 우리 사이트 속도는 사용자가 원활하게 사용하기에는 느렸다. 다른 이커머스 사이트를 보면 로딩 없이 사이트 전체 내용을 바로 확인할 수 있던데, 왜 안될까? 분석 결과 원인은 api의 속도가 느리기 때문이었다. 문제긴 한데 어떻게 api 속도를 빠르게 할 수 있을까? 이미지뿐만 아니라, api 서버에서 가져오는 데이터도 캐싱할 수 있지 않을까? 라는 생각이 문득 전에 공부했던 경험을 통해 들었고 적용 해보기로 했다. api 서버에서 가져오는 데이터를 캐싱하는 방법은 여러 가지다. 대표적으로 Global Caching, Local Caching 두 가지 전략으로 나눌 수 있다. Global Caching은..

서버 2023.05.04

HTTP 프로토콜이 만들어진 이유

페이스북 커뮤니티에 해당 글 공유 후기 생활코딩이라는 페이스북 커뮤니티에서 해당 포스팅을 올리고 많은 분들이 공유를 해주셨습니다. 그리고 응원 메시지를 보내주셨습니다. 감사합니다 행복해요 ㅎㅎ 이 글을 작성하는 이유 이 글은 저와 같이 백엔드 개발자를 준비하시는 분들이 읽는다는 생각으로 적었습니다. 저는 백엔드 개발자를 준비하면서, http와 관련된 코드를 작성할일이 자주 있었습니다. 예를들면 Get, post method, url, Response code와 같은 것들입니다. 저는 스프링을 통해서 http를 사용하고 있습니다. 아래 이미지는 http 프로토콜을 사용한 회원가입 코드입니다. @PostMapping(path = "/users") public ResponseEntity userAdd(User..

서버 2022.09.11

Scale out에 적합한 로그인 환경에 대해 검토한 글

소개 세션 불일치 문제는 유저의 쿠키에 있는 세션 데이터와 서버가 가지고 있는 세션 데이터가 일치하지 않는것을 말합니다. 문제 상황 시나리오 아래 사진을 보시면 파란색, 오렌지색 서버가 있습니다. 트래픽의 증가로 인해 하나의 서버를 Scale out한 상태이기 떄문에 서버가 두 대로 늘어났습니다. 사용자 A는 제 어플리케이션을 이용하기 위해 요청을 시도합니다. 사용자 A가 로드밸런서에게 로그인을 요청합니다. 로드밸런서는 알고리즘에 맞게 파란색 서버에게 로그인을 요청합니다. 파란색 서버는 로그인을 성공한 유저 A의 쿠키에 자신만 해독할 수 있는 세션 데이터를 로드밸런서를 통해 유저 A에게 전달합니다. USER A가 오렌지색 서버를 통해 마이페이지를 이용해서 개인정보를 확인하기 위해 로드밸런서에게 요청을 보..

서버 2022.09.11

서버의 장애를 대비한 확장 방법 검토하기

Scale out vs Scale up 저는 프로젝트의 개발 목표 중 하나인 대규모 트래픽을 처리하기 위한 앱을 만들기 위해서 두가지 방법을 생각했습니다. Scale out과 Scale up 서버 확장 방식입니다. 전자는 서버 하나의 성능을 올리는 방식이고, 후자는 서버의 개수 여러개로 늘리는 방법입니다. 서비스의 특성상 Scale out이 적합하다고 판단했습니다. 이유는 최악의 상황을 가정했을때, 하나의 서버가 하드웨어 성능 문제로 트래픽을 감당하지 못해서 사용자가 원하는 데이터를 받는 속도가 매우 느려지게 될 것이라 생각했기 때문입니다. 실제로 2014년도 말에 도서정가제 시행으로 인해 할인 도서 구매량이 급증하면서 온라인 서점이 마비되는 일이 있었습니다. 추후에 이러한 일이 벌어지지 않는다는것을 예..

서버 2022.09.11