본문 바로가기

All

(30)
JPA를 이용하여 cursor 기반 페이징 구현 언젠가부터 무한 스크롤을 이용한 페이징 방식이 우리들에 스며들기 시작했다. 이는 과거의 1, 2, 3... 의 페이지를 클릭하여 다음 콘텐츠를 보는 것이 아니라, 페이스북처럼 마지막 콘텐츠를 보게 되면 다음 페이지가 로딩되어 보이는 것을 의미한다. 그러나 SNS에서는 일반적으로 사용하는 Offset 기반의 페이징을 사용하게 되면 문제가 생길 수 있다. Offset Based Pagination SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 0, 10; SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 10, 10; SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 20, 10; 위의 쿼리를 해석해보면 최신 게시글의 ..
Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까? 위 그림은 DZone 게시글 중 하나인 Spring WebFlux를 이용한 Boot2와 Spring MVC를 이용한 Boot1을 비교한 그래프이다. 해당 그래프에서는 두 가지 특징을 볼 수 있다. 첫 번째로는 유저가 적을 때에는 성능에 별반 차이가 없다. 두 번째로는 유저가 늘어나면 늘어날수록 극명한 성능 차이를 보여주고 있다. 어떻게 이런 차이가 일어날 수 있을까? 본글은 아래의 구성을 가지고 있다. I/O Event-Driven Spring Framework 먼저, 1과 2를 통해서 원리를 알아본 다음 3에서 이를 접목시켜서 위의 그래프가 나올수 있는 이유를 설명할 것이다. I / O Why was Spring WebFlux created? Part of the answer is the need f..
Ahea 2019 상반기 세미나 회고 Ahea 2019 상반기 세미나 작년에 이어 생애 두 번째 세미나의 발표자로 서게 되었다. 원래 작년 하반기에도 IoC를 주제로 발표를 준비했지만 스터디 그룹의 여건상 불발되었다. 이후 스터디 그룹 내실을 다져 2019.05 중으로 발표 계획을 잡았고, 다시 주제부터 시작해서 발표 준비를 하기로 했다. 공식적인 스터디는 2019.02부터 시작하게 되었다. (물론 2, 3월은 큰 다짐만 하고 4월부터 본격적으로 진행을 했다) 처음에는 DDD를 주제로 발표하려고 책을 읽었는데 쉽게 쓰여진 책임에도 불구하고 내용 자체도 추상적이고 호불호도 강한 주제라는 생각에 서둘러 주제를 바꿨다. 그리하여 나온 주제는 소프트웨어를 이용하여 대용량 트래픽 다루기 였다. Client Side LoadBalancing, Spri..
Spring Cache 구현 원리 Spring Cache 구현방식에 대해서 살펴보자. 최근 회사에서 spring-cache의 @Cacheable을 사용하게되었다. 사용하다 보니 토비의 스프링에서 본 관심사의 분리와 AOP와 겹쳐서 머릿속의 생각을 코드와 글로 써보려 한다.글로 다 표현하기에는 한계가 있는 듯하니 Github source와 함께 보면 좀 더 도움이 될 것 같다. 그리고 Test code도 작성하였으니, 이걸통해서 Test를 하면 될 것 같다. (단, cache의 유무만 중요하기에 assert문은 작성하지 않고, log만 찍었다.)요구사항은 다음과 같다. 나는 글로벌 게임을 만들고 있고, 유저들에게 웹사이트에서 랭킹을 보여주어야 한다. 단, 이용자는 100만명을 넘기때문에 모든 이용자를 Scan해서 순위를 실시간으로 보여주기..
Dubbo Spring Boot Apache Dubbo고성능, 가벼운 Java 기반 오픈 소스 RPC 프레임워크Interface 기반의 원격 호출(remote call)fault tolerance, load balancingService 자동 등록 및 감지 (Service Registry)RPC란?Remote Procedure Call외부 서비스를 함수나 메소드를 통해 호출하는 형태부가설명 분산서비스시 외부 서비스는 주로 HTTP를 통해 호출을 한다. 그리고 Application 레벨에서 header, body를 조작한다. 그러나 RPC는 마치 메소드를 호출하듯이 외부 서비스를 사용할 수 있는 간편함을 가지고 있다.백문이 불여일타! 직접 코드를 작성해보자. 필자는 Spring boot와 편의상 maven 멀티모듈 구조를 통해서 코드를 ..
BigDecimal의 toString(), toPlainString(), toEngineeringString() BigDecimal먼저 BigDecimal에 대해서 간단히 알아보도록 하자. BigDecimal은 큰 수를 표현하거나 부동소수점을 해결할 수 있는 클래스이다.거두절미하고 코드를 보자.@Test public void primitive() { System.out.println(2.0 - 1.1); } 위 코드에서는 무엇이 출력이 될까? 0.9가 나오길 기대하겠지만, 위코드는 0.8999999999999999 라는 이상한 값을 반환한다. 자바 기본서를 보던 옛날로 돌아가보자. 우리는 첫장에서 primitive type들에 대해서 공부를 했을 것이다. 그리고 각각의 type은 고유의 bit 크기를 가지고 있다. double같은 경우에는 32bit이고 이는 4.94065645841246544E-324 ~ 1.79..
IoC (DI, Service Locator...) IoCInverse of Control는 제어권을 개발자가 아닌 제 3자가 가지게 하는 것이다.그렇다면 우리는 왜 제어권을 3자에게 위임해야 하는가? 이에 대한 답을 찾기전에 과거로 돌아가보자. 과거 많은 형태의 오픈소스들이 나오고 있었고, 이들의 공통적인 이슈는 서로 다른 객체를 어떻게 연결할 것인지에 대한 문제였다. 이를 해결할 한 가지 방법으로 IoC가 제시되었다. 즉, IoC의 주된 목적은 Application의 Dependency를 제거해서 느슨한 결합을 제공하는 것이다. 그럼 Dependency란 무엇일까? Dependency (computer science) or coupling, a state in which one object uses a function of another object ..
Spring Boot + ELK + Redis 분산서비스는 여러개의 서비스가 존재한다. 그래서 서비스 수마다 로그가 분산되어서 각 서버에 저장이 된다.이는 운영시 특정 로그를 볼 때 불편하기 마련이다.그래서 우리는 분산된 로그를 ELK의 도움이 받아 로그를 모아보려한다.Service먼저 3개의 서버가 존재하고, 각 서버에 Spring Applcation, logstash(shipper)가 설치되어 있다.각 Spring Application은 log파일을 생성하고, logstash는 생성된 log파일을 읽은 뒤 특정한 곳으로 보내는 역할을 한다. 여기서는 Redis로 보내게 된다.Queue지금처럼 서비스의 개수가 적거나 Log수가 적으면 굳이 중간에 Redis같은 Queue 역할을 둘 필요 없이 ElasticSearch로 전송하면 되지만, 항상 만약을..