가용성이란?먼저 가용성은 무엇일까? 위키피디아에 따르면 서버와 네트워크, 프로그램 등의 정보 시스템이 정상적으로 사용 가능한 정도를 말한다.즉, 사용자가 정상적으로 서비스를 사용할 수 있는 시간이라고 생각해도 된다.공식에서 알 수 있듯이 다운타임이 적을 수록 고가용성에 가까워진다. 왜 가용성은 중요할까?한번 가정을 해보자.만약 배가 고파 음식 주문을 하려고 할 때 사용할 수 있는 2가지 앱이 있다. 하나의 앱은 사용 중에 자주 튕기고 하나의 앱은 그렇지 않는 경우 어떤 서비스를 이용하고 싶은가? 즉 가용성은 사용자가 느끼는 서비스의 신뢰로 이어지고 이는 곧 사용자 손실과 직결될 수 있다.그러면 이렇게 중요한 가용성에 영향을 미치는 것은 무엇일까? 언제 다운타임이 발생하여 가용성이 저하될까 생각해보자. 내..
검색 기능의 성능 이슈로 Full Text Index를 사용하기로 하면서 적용 방법에 대해 알아보았다.Full Text Index는 MySQL 등 DBMS에서 제공하는 전문 검색용 인덱스이다. 하지만 이 기능을 도입하면서 몇몇 문제 상황을 마주쳤는데, 어떻게 해결하였는지 작성하고자 한다. 참고기존 구현은 QueryDSL이 아닌 Specification과 Criteria API를 Like 쿼리로 사용하여 구현이 되어있었다.if (keyword != null && !keyword.trim().isEmpty()) { String likeKeyword = "%" + keyword.trim() + "%"; Predicate titlePredicate = criteriaBuilder.like(root.get("ti..
이전 포스팅에서 쿼리 개선을 통해 검색 API를 개선했다.하지만 여전히 속도가 느렸고 해당 API는 사용자가 회원가입을 하지 않아도 볼 수 있는 유일한 페이지에 사용되기 때문에 이 부분에서 속도가 너무 오래 걸릴 경우 서비스 이탈율이 심각해질 것이라고 생각했다. 기존 구현기존 검색 쿼리는 동적으로 검색 조건 쿼리를 생성하는데, 그중에서도 키워드 조건이 들어올 경우 Like 절을 통해 4가지의 컬럼에 대해 스캔을 한다. 다른 조건은 모두 id 값을 기준으로 조회하기 때문에, 인덱스를 탈 수 있지만 Like 절은 전방일치만 인덱스를 타기 탈 수 있다.하지만 우리 요구사항에는 %moly% 처럼 전체 포함된 것을 검색해야 했기에 적절하지 않았다. 실제로 10만건의 템플릿, 30만건의 소스코드의 더미데이터를 넣고..
5차 요구사항은 쿼리 성능 개선이었다.주요 요구사항은 다음과 같았다.핵심 테이블에(핵심 기능에서 read/write 되는 테이블) 대량의 데이터를 쌓고 성능을 개선한다.데이터를 10만/100만건 생성한 뒤, 쿼리 성능을 테스트한다.대량의 데이터에서도 기능이 잘 동작할 수 있도록, 쿼리 성능 개선을 위한 인덱스를 설정한다. 우리 서비스 중 요구사항을 받고 가장 고민이었던 API는 바로 "검색"이었다.데이터의 갯수가 크지 않은 현재 운영 서버에서 평균 API 처리 속도가 10초를 넘어갔었다. 또 100만건의 템플릿 더미데이터를 넣었을 경우에는 평균 26초에서 많게는 35초가 넘어가는 성능을 보였기 때문에 사용성에 있어서 치명적이라고 생각했다. 나 같은 경우에도 사이트 렌더링 속도가 5초 이상 또는 그 이하..
레벨 4 미션 톰캣 구현하기 미션 중 기존 요구사항의 코드는 애플리케이션 단과 서블릿 컨테이너 단이 명확하게 분리되어 있지 않았다.기왕 톰캣 구현하기를 하는 것이니만큼 서블릿 컨테이너는 애플리케이션이 무엇인지 상관없이 제 역할에만 집중하도록 하고 싶었다. 따라서 아래와 같이 여러 애플리케이션에서 org.apche 를 사용할 수 있도록 패키지를 분리하고자 하였다. 패키지를 분리하면서 Context라는 워딩 때문에 나는 Spring의 Application Context가 저 그림의 Context에 해당하는 것이라고 생각했다. 그런데 ApplicationContext과 ServletContext는 다른 레벨의 개념이라는 것을 알게 되어 명확히 하고자 글을 작성한다. ServletContextServletC..
저번 글을 통해 톰캣의 전체적인 구조와 주요 컴포넌트들에 대해 파악할 수 있었다.이번 글에는 톰캣의 Coyote, Catalina에 대해 알아보려고 한다. Catalina란Catalina는 Tomcat의 핵심 구성 요소로 Java 서블릿 스펙을 구현하는 서블릿 컨테이너 구현체이다. Tomcat이 웹 서버 기능과 서블릿/JSP 컨테이너를 모두 포함하는 전체 패키지라면, Catalina는 Tomcat 내에서 서블릿 컨테이너 전체를 관리하고 구현하는 시스템이라고 생각하면 된다.따라서 Catalina는 서블릿의 초기화, 실행, 소멸 등 전체 생명주기 등 컨테이너 내의 모든 서블릿의 라이프사이클을 관리한다. 이때 Catalina는 Engine 자체를 나타내는 것이 아니고 주요 5개 컴포넌트(Server, Ser..
레벨 4의 첫 미션은 "Tomcat 구현하기" 였다. 그동안 내가 알고 있던 Tomcat은 Web Application Server 중 하나로, 스프링 부트가 톰캣을 내장하고 있다는 정도였다.이번 미션을 통해 Tomcat의 구성 요소와 역할 등등에 대해 더 자세하게 공부하고자 글을 작성하게 되었다. 이번 글에서는 톰캣의 역할과 전체적인 구조에 대해 다루고자 하니 참고바란다.톰캣톰캣이란먼저 톰캣이란 무엇일까? Tomcat은 Apache 재단에서 릴리즈한 Web Application Server이다.이때 Apache는 같은 재단에서 릴리즈한 Web Server인데, 때문에 나는 톰캣이 웹 서버의 역할을 전혀 하지 않는 줄 알고 있었다.(정확히 말하자면 명확히 구분되어 사용하는 줄 알았다) Tomcat의 주요..
톰캣 구현하기 미션 중 특정 API 요청을 처리하고 리다이렉션을 해야하는 요구사항이 있었다.MDN 문서를 통해 학습을 하면서 응답에 302 Found를 반환할 경우 자동으로 리다이렉션 처리가 되는 것을 알았다. 300대의 다른 응답도 모두 리다이렉션이 가능한지 찾아보면서 300 Multiple Choices와 수동 리다이렉션에 대해 알게 되었다.Multiple Choices 이라는 의미가 궁금하기도 하고 수동 리다이렉션에 대해 학습해보고자 작성한다 리다이렉션 종류라다리렉션의 종류는 총 3가지로 나뉜다.영구 리다이렉션일시 리다이렉션특수 리다이렉션영구 리다이렉션영구 리다이렉션은 기존 URL이 사용되지 않아야 할 때 사용된다.즉, API 자체가 제거(또는 다른 API로 컨텐츠가 이동)되거나 도메인이 제거되는 ..
책 "nginx 쿡북"을 참고했습니다. 엔진엑스 주요 설정 파일과 디렉터리/etc/nginx/엔진엑스 서버가 사용하는 기본 설정이 저장된 루트 디렉터리엔진엑스는 이곳에 저장된 설정 파일의 내용에 따라 동작/etc/nginx/nginx.conf엔진엑스의 기본 설정 파일로, 모든 설정에 대한 진입점워커 프로세스 개수, 튜닝, 동적 모듈 적재와 같은 글로벌 설정 항목을 포함다른 엔진엑스 세부 설정 파일에 대한 참조를 지정/etc/nginx/conf.d/의 모든 설정 파일을 포함하는 최상위 http 블록을 가짐/etc/nginx/conf.d/기본 HTTP 서버 설정 파일을 포함하는 디렉토리디렉터리 내 파일 중 이름이 .conf로 끝나는 파일은 앞서 언급한 /etc/nginx/nginx.conf 파일이 가진 최상..
CORS 알았다고 생각하면 끝인 줄 알았지? 진짜 정확하게 알았어? 는 제 얘기입니다. 제가 기존까지 알고 있던 CORS는 대강 이정도였습니다.기존에 CORS에 대한 내 지식CORS 등장 배경기존에 브라우저에서는 SOP라는 단일 오리진 정책이 있었다. 이는 동일한 오리진인 경우에만 요청을 주고 받을 수 있게 하는 정책이다.하지만 웹이 발전함에 따라 다른 오리진 간에도 요청을 주고 받는 일이 필요해졌고 이때 등장한 것이 CORS이다.CORS란크로스 오리진 어쩌고 정책으로 두 서버가 오리진이 달라도 요청을 주고 받을 수 있게 하는 허용하는 정책이다.브라우저는 CORS를 위반했는지를 여러가지 방법으로 검사한다.그중에 하나가 preflight 요청인데 미리 본요청을 보내기 전에 OPTION이라는 Http Me..