JVM - 클래스 로더 JVM - 메모리 구조 JVM - 실행 엔진 (JIT 컴파일러) JVM - 실행 엔진 (GC)
GC Log 확인하기
GC Log 남기기 java -jar ~~~ -Xlog:gc*:file=gclog/gc.log.$(date +%Y-%m-%d):time,tags:filecount=5,filesize=10m 위와 같이 JVM을 실행시킬 때 GC 로그를 남기는 옵션을 지정해줄 수 있다. 위 명령어를 통해 어떤 로그가 남는지 확인해보자. GC Log [2024-...
CircuitBreaker와 조금 더 친해져보기
서킷브레이커가 필요한 상황 마이크로서비스 환경에서 다른 서버에게 이벤트가 아닌 동기 통신(HTTP, gRPC)요청이 실패된다면 어떻게 해결해야할까? 일반적인 방법은 다시 요청해보는 것이다. 상대 서버와 통신 중 네트워크 문제가 발생했을 수도 있고, 상대 서버가 일시적으로 가용하지 못한 경우가 있을 수 있기 때문이다. 만약 다시 요청해서 해결되는 ...
Easel(트위터 클론 프로젝트)의 기술 회고
새롭게 접한 기술 스택 gRPC 동작원리 gRPC는 왜 빠르게 동작하는가? gRPC Gateway가 필요한 상황 Kafka 카프카의 구성요소 및 구조 컨슈머의 내부 동작 원리 프로듀서의 내부 동작 원리 이벤트 전송 간 오류가 발생했을 때 어떻게 ...
Generic 과 조금 더 친해지기
제네릭이란? 상속관계에 대한 타입 안정성을 지키고 유연하게 타입을 확장할 수 있도록 도와주는 기능이다. public class MyCustomList<T> { public void addElement(T element) { list.add(element); } } 위와 같이 제네릭 타입을 매개변수로 받...
Gradle 의존성 땡기는 방법 2가지 비교 (api, implementation)
Gradle이 대세인 요즘 라이브러리 의존성을 땡겨받는 방법 중 크게 두 가지가 있다. api(의존성 어쩌구 저쩌구) implementation(의존성 어쩌구 저쩌구) 두 방식의 차이점은 의존성 연쇄에 대한 것에 있다. api 구문 api 구문은 의존성이 연쇄되어 의존성이 끊어지지 않고 이어진다는 것이다. 예를 들자면 아래와 같다. ...
Docker, Docker Compose로 Kafka 사용하기
참고 자료 참고 자료 1. Docker Compose 설치하기 $ sudo hdiutil attach Docker.dmg $ sudo /Volumes/Docker/Docker.app/Contents/MacOS/install $ sudo hdiutil detach /Volumes/Docker 위 명령어를 바탕으로 Docker Compose를...
유연한 시스템 설계 방법 톺아보기와 자문자답
참고 자료 참고 자료 유연한 시스템이 왜 필요한 것인가? 사용자가 많아지게 되면 서비스를 제공할 수 있는 가용 서버를 늘려 트래픽에 대응할 수 있어야한다. 하지만 어떤 조직이던간에 우리가 사용할 수 있는 자원은 필연적으로 한정되어있다. 따라서 자원을 효율적으로 사용하여 가용할 수 있는 서버를 늘리는 것이 우아하게 사용자의 요구를 처리할 수 ...
테스트 대역과 테스트 피라미드
참고 자료 마틴 파울러 - 테스트 대역 JesusValera 테스트 대역이 왜 필요한가? 테스트하고자 하는 대상이 있을 때 이 로직이 다른 객체와 의존관계가 있을 때 의존관계의 로직 결함으로 인해 테스트가 실패할 수 있다. 따라서 실제 동작하는 것처럼 보이는 별개의 객체를 만드는 방식을 적용하는데 이 객체를 테스트 더블 이라고 한다. ...
스프링을 잘 쓴다는 것은 애노테이션을 많이 아는 것
의존성 주입 관련 애노테이션 @Autowired @Qualifier @Inject (deprecated) @Named (deprecated) @Primary @Value @Import @DependsOn @ConstructorProperties @Lookup @AliasFor ...