개발자로서 살아남기 52

서버 개발자로 살아남기 - HAProxy vs NGINX

개요 현재 사내에서 사용하는 API 서버 중 HAProxy를 사용있는 서버가 있다. 구축 된 이후 인수인계 받은 서버라, 다 구현 되어 있지만 최근 인증서 교체를 위해 여러가지 알아보던 중 HAProxy에 대해 정확한 히스토리를 알 지 못하여, 이에 대해 리서치 후, 비슷한 역할을 수행하는 NGINX도 비교하여 정리한다. HAProxy Haproxy 는 L4, L7 과 같은 하드웨어 로드밸런서를 대체하기 위한 오픈소스 소프트에어로 이름처럼 Reverse Proxy 를 기반으로 로드밸런싱을 하기에 매우 강력하고 또 가벼운 어플리케이션이다. HA (High Availability) 라는 이름처럼 고가용성을 위하여 설계되었다. 로드밸런서에 대한 설명 : https://code-killer.tistory.com..

서버 개발자로 살아남기 - Nginx

개요 원래는 HAproxy를 공부하여 포스팅하려 했는데, 공부하다보니, 로드밸런서 역할로의 비교대상인 Nginx가 있었다. 그래서 Nginx vs HAproxy로 포스팅하려고, Nginx를 공부하다 보니, Apache가 있었고, 내용이 재미있어서 따로 포스팅하려고 한다. HAproxy 포스팅하면서 Nginx와 비교까지 진행해봐야겠다 배경 Nginx 이전 Apache는 요청이 들어오면 connection을 생성하는데, 클라이언트 요청이 올 때 마다 새로운 프로세서 or 쓰레드를 생성한다. 그러나, 새로운 프로세서 or 쓰레드를 생성하는데 시간이 많이 걸리기 때문에 미리 만들어 놓는PreFork 방식을 이용한다. 근데 만약 1만명 이상의 접속자가 동시에 요청을 날린다면, 1만개의 프로세스나 쓰레드를 생성하여..

JPA - saveAll vs save (2)

saveAll()과 save()의 내부구현 save() 메서드의 구현 코드이다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } saveAll() 메서드의 구현 코드이다. @Transactional @Override public List saveAll(Iterable entities) { Assert.notNull(entities, "Entities must not be n..

JPA - saveAll vs save (1)

JPA에서 여러개의 데이터를 DB에 INSERT 할 때saveALL()을 이용하면 성능 좋게 사용할 수 있다. save() 사용 save() 메서드의 구현 코드이다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } entityManager를 통해 새로 들어가면 persist, 기존에 있다면 merge 을실행한다. Mysql 문법으로 보면 아래와 같다. INSERT INTO ..

서버 개발자로 살아남기 - 서블릿 컨테이너에 대해

Servlet 컨테이너란? Servlet 컨테이너는 말 그대로 Servlet을 담고 관리해주는 컨테이너다. 자세히는 Client의 Request를 받고, Response을 할 수 있게 웹 서버와 소켓을 만들어 통신한다. 대표적인 Servlet 컨테이너로 Tomcat(톰캣)이 있다. 톰캣도 마찬가지로 웹 서버와 소켓을 만들어 통신하며 JSP와 Servlet이 작동할 수 있는 환경을 제공한다. Servlet 컨테이너의 역할 웹 서버와의 통신을 지원한다. 서블릿 컨테이너는 서블릿과 웹서버가 통신할 수 있게 네트워크 통신에 필요한(Socket) 등을 API로 제공한다. 서블릿 생명주기(LifeCycle) 관리 서블릿 컨테이너는 서블릿의 생성과 파괴를 관리한다. 서블릿의 생명주기(LifeCycle) 서블릿 cla..

서버개발자로 살아남기 - 서블릿(Servlet)에 대해서

개요 현업에서 Spring boot를 사용하고 있기도 하고, 개인적으로 이 프레임웤에 대한 궁금증이 많기 때문에 기초부터 정리하면 좋겠다 라는 생각이 들어 차근차근 하나씩 정리해보려고 한다. Servlet 이란? 서블릿(Servlet)을 간단히 정의하자면 JAVA를 사용하여 웹을 만들기 위해 필요한 기술이다. 웹의 관점에서 본다면 Client의 요청을 처리하고, 이에 대한 결과를 다시 전송하고, Servlet Class의 구현 규칙을 따른다. 일반적으로 Web Server는 정적인 페이지만 제공한다. (Web Server) 만약 사용자가 요청한 시점에, 사용자가 작성한 데이터에 따라 다른 페이지를 보여줘야한다면?(WAS) 즉 **동적인 페이지를 제공해야한다면 서블릿(Servlet)이 필요하다. 예를 들어..

중첩 루프 조인(NESTED LOOPS JOIN)에 대해

NLJ, Nested Loop Join 은 중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이다. NESTED LOOP JOIN은 Driving Table로 한 테이블을 선정하고 이 테이블로부터 where절에 정의된 검색 조건을 만족하는 데이터들을 걸러낸 후, 이 값을 가지고 조인 대상 테이블을 반복적으로 검색하면서 조인 조건을 만족하는 최종 결과값을 얻어낸다. Driving Table , Driven Table Driving Table이란 JOIN을 할 때 먼저 액세스 되어 주도하는 테이블이다. 즉 조인을 할 때 먼저 액세스 되는 테이블을 Driving Table이라 하고, 나중에 액세스 되는 테이블을 Driven Table 이라 한다. 결정 방식은 옵티마이저(효율적인 방법으로 SQL 수행할 ..

서버 개발자로 살아남기 - 멀티 쓰레드 환경에서 Singleton 초기화 - DCL(Double Checked Locking)

Singleton 패턴은 전체 중 하나의 인스턴스만 존재해야 한다. 싱글 쓰레드를 사용하는 경우에는 문제가 되지 않지만, 멀티 쓰레드 환경에서 Singleton에 접근 시 초기화 관련해서 문제가 있다. 아래코드는 단순하게 구현한 멀티쓰레드 환경에서의 Singleton 초기화 방법이다. class Foo { private Singleton instance; public Singleton getInstance() { if(Objects.isNull(instance)) { instance = new Singleton(); } return Singleton; } } 위 코드는 멀티쓰레드 환경에 적합하지 않다. 쓰레드가 getInstance()에 동시에 접근하면 여러번 초기화 되는 문제가 발생하기 때문이다.(상호..

서버 개발자로 살아남기 - REST API

REST API란? REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 **웹의 장점을 최대한 활용할 수 있는 아키텍처** 로써 REST를 발표했다고 한다. REST의 구성요소 자원(Resource): URI 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다. 자원을 구별하는 ID는 ‘/groups/:group\_id’와 같은 HTTP URI 이다. Client는 URI를 이용해 자원을 지정하고 해당 자원의 상태(정보)..

Connection timeout VS Read timeout

개요 현재 운영하고 있는 게임서버에서 다른 서버의 API을 호출하는 일이 잦은데, 새로운 게임 오픈 이후, 유저 수가 많아져 자연스럽게 API 호출하는 일이 더 많아졌다. 새 게임 오픈 전에는 간헐적으로 timeout Exception이 발생하여 크게 신경 안쓰고 있었는데, 오픈 이후 급격하게 timeout Exception이 증가하였다. 다른 서버 담당자 분께 해당 Exception에 대해 문의드렸는데, connection timeout인지, Read timeout인지를 물어보셨는데, 이 2개의 차이를 정확히 몰라 찾아보고 말씀드렸고, 이를 정리하였다. Timeout 이란? 프로그램이 특정한 시간 내에 성공적으로 수행되지 않아서 진행이 자동적으로 중단되는 것 응답을 무한정 wait 하면 전체 프로그램에..

728x90