본문 바로가기

스프링3

JVM 스레드에 대한 고찰 및 스레드풀 튜닝 전략 애플리케이션의 응답성을 높이고 자원을 효율적으로 사용하기 위해 쓰레드풀에 대해 알아봤다. 웹서버 위에서 동작하는 웹애플리케이션은 리액티브 모델이 아닌 이상 리퀘스트 당 쓰레드를 할당하여 동작한다. 그렇다면 쓰레드를 어떻게 관리하는 것이 좋을까? 쓰레드는 일반적으로 동시에 여러개를 사용하므로 그때그때 생성하여 사용하기 보다는 쓰레드를 미리 생성하여 저장하고, 필요할 때 가져다 쓰고, 사용 후 반납하는 전략을 사용한다. 이러한 풀링 전략은 쓰레드 외에도 Integer의 -127~128 범위와 같은 자주 사용되는 객체를 효율적으로 사용하기 위해 사용되기도 한다. 그렇다면 쓰레드를 효율적으로 관리하기 위해선 "쓰레드풀에 쓰레드를 얼마나 생성하는 것이 좋을까?"에 대해 생각해보아야 한다. 이를 위해선 쓰레드 개수.. 2022. 9. 2.
로깅을 어떻게 해야할까? AOP를 공부하다보면 대표적인 Cross cutting concern의 예시로 로깅이 언급된다. 컨트롤러 어노테이션을 달고 다니는 오브젝트의 메서드들을 프록시로 감싸서 실행시간을 측정하는 것이 대표적인 로깅의 예시인데, 별로 마음에 들지 않는다. 아래 예시를 보자. 예제 수준의 로깅 코드다. 로깅 메세지를 보면 "-----(대충몇개)----> Respons : {} ~" 식으로 되어 있다. 그러면 거대한 시스템의 경우 초당 수십만개의 로그가 쌓이는데, 저렇게 로깅을 해도 될까? 유튜브 채널 EO에 우아한형제들 전 CTO, 현 CEO인 분이 나와서 얘기하시기를, 평시 리퀘스트는 초당 만개, 이벤트 시에는 200만개가 넘게 들어온다고 한다. 그러면 저런 문자열이 리퀘스트 *2 개만큼 생기고, 컨트롤러 로깅뿐.. 2021. 7. 15.
Field Injection 대신 Constructor Injection을 사용해야 하는 이유 이 글을 작성하기 위해 주입받은 포스트는 다음과 같다. yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/ 이번 공부용 프로젝트를 만들면서 test code를 제외한 모든 코드에 @Autowired를 사용하지 않았다. github.com/kh0712/dailysup 필드 주입 대신 생생자 주입을 사용하는 이유는 순환 의존을 방지해서 안전하다 등 어렴풋이만 알고 있었는데 확실하게 정리해보자. 필드 주입을 사용하면 생기는 문제는 다음과 같다. 첫 번째로 의존 관계를 final로 설정할 수 없다. 런타임에 객체의 의존성이 바뀌는 경우는 흔치 않다. 필드를 final로 선언한다면 런타임시 의존성이 바뀌어 원하지 않는 결과가 나오는 일을 방지할 수 있.. 2021. 3. 21.