![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b7RYhC/btsFAtOgNgW/1wCVA16InZBlYirAkpNMIk/img.png)
gRPC와 REST는 API 설계에 사용되는 2가지 방법이다. API는 정의 및 프로토콜 세트를 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘인데, gRPC에서는 한 구성 요소(해당 클라이언트)가 다른 소프트웨어 구성 요소(해당 서버)의 특정 함수를 직접 또는 간접적으로 호출하는 반면 REST에서는 함수를 직접적으로 호출하는 대신 클라이언트가 서버의 데이터를 요청하거나 업데이트를 요청한다. 해당 정의가 무슨 뜻인지 이해됐다면 해당 포스팅을 넘어가도 좋지만 개념이 조금이라도 흔들린다면 이 글을 읽고 도움이 되길 바란다. RPC(Google Remote Procedure Call)란 네트워크로 연결된 서버 상의 프로시저(함수, 메서드 등)를 원격으로 호출할 수 있는 기능이다. 원격지..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bGp6Pj/btsE6CSKDPN/bOtwTyVeviYZc7dpgUbw4K/img.png)
@Async와 ThreadPoolTaskExecutor는 스프링 프레임워크에서 비동기 처리를 위해 사용되는 중요한 요소이다. 성능 개선의 예제로 비동기 작업의 예시를 많이 봤을 것이다. 알아도 손해볼 거 없는 내용이니 간단한 예제 코드를 학습해보자. @Configuration @EnableAsync public class AsyncConfig { @Bean(name = "threadPoolTaskExecutor") public ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(30); taskE..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/sTUBo/btsE3prV0fo/oxeIi8d9xtzKauVXBKIHp0/img.png)
Java5에서 추가된 Future는 비동기 작업의 결과를 나타내는 인터페이스다. Future는 작업이 아직 완료되지 않았더라도 결과에 접근할 수 있는 방법을 제공한다. 예제 코드 import java.util.concurrent.*; public class FutureExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executor = Executors.newSingleThreadExecutor(); // 비동기 작업 생성 Future future = executor.submit(() -> { Thread.sleep(2000); // 비동기 작업 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/tHdJ2/btsDfQrkT2C/a0sRHyk6gjJCbp9J0Q7691/img.png)
200개가 넘는 국가에서 2000개가 넘는 IP를 통해 수십만건의 요청(공격)이 1분동안 발생했다. 유효한 API 요청이였지만 파라미터 값이 모두 널(null) 값 이기에 일반적으로 제공하지 않는 요청이였다. 이것이 DDOS 공격인가 싶었다. 이전에 토이프로젝트로 만들어둔 RateLimiter를 사용할 때인가 싶었지만, 수천개의 IP에서 보내는 것이기에 룰이 애매했다. https://github.com/sh970901/TOTORO 이로 인해 JVM OOM(Out Of Memory)이 발생하였고 서비스는 장애가 났다. 이정도 TPS에 뻗을만한 일인가 싶었다. SEO 이후에 자주 이런 비정상요청이 있었지만 서비스가 뻗은 것은 처음이였다. 생각해보니 늘 요청하는 API는 달랐고 이번에 공격받은 API는 처..
MDC란 Mapped Diagnostic Context 의 약자로 일부 특징의 데이터를 Map 형태로 저장하는 메커니즘으로 흔히 사용하는 slf4j, logback, log4j2 등 Logger에서 MDC를 제공해준다. MDC : 현재 실행중인 쓰레드에 메타 정보를 넣고 관리하는 공간 MDC는 로그에 메타데이터를 맵으로 관리할 수 있게 해준다. 쉽게 말하자면 MDC 는 로그에 컨텍스트를 남기는 용도라고 생각하면 된다. 그렇다면 멀티 쓰레드 환경에서 요청 쓰레드 별로 식별가능한 로그를 남기는 것이 가능하다. MDC.put(k,v) , MDC.get(k) 를 이용하여 저장하고 읽을수가 있다. map과 같은데 특징은 이 map이 쓰레드 단위로 생성된다. Filter, Interceptor, AOP 등을 이용하..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cem8pk/btspk8Uj1bA/gg9iFchZ7V5tMBWW3oAAek/img.png)
ThreadLocal은 JDK 1.2부터 제공된 오래된 클래스다. 이 클래스를 활용하면 스레드 단위로 로컬 변수를 사용할 수 있기 때문에 마치 전역변수처럼 여러 메서드에서 활용할 수 있다. 다만 잘못 사용하는 경우 큰 부작용(side-effect)이 발생할 수 있기 때문에 다른 스레드와 변수가 공유되지 않도록 주의해야 한다. Heap 영역은 일반적으로 모든 thread에서 접근 할 수 있지만 stack은 thread 하나당 만들어 지는 메모리 영역으로 thread간 접근이 불가능하다. 따라서일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다. { int a = 10; ... // 블록 내에서 a 변수 사용 가능 } // 변수 a는 위 코드 블록이 끝나면 ..