본문 바로가기

자바5

JVM 스레드에 대한 고찰 및 스레드풀 튜닝 전략 애플리케이션의 응답성을 높이고 자원을 효율적으로 사용하기 위해 쓰레드풀에 대해 알아봤다. 웹서버 위에서 동작하는 웹애플리케이션은 리액티브 모델이 아닌 이상 리퀘스트 당 쓰레드를 할당하여 동작한다. 그렇다면 쓰레드를 어떻게 관리하는 것이 좋을까? 쓰레드는 일반적으로 동시에 여러개를 사용하므로 그때그때 생성하여 사용하기 보다는 쓰레드를 미리 생성하여 저장하고, 필요할 때 가져다 쓰고, 사용 후 반납하는 전략을 사용한다. 이러한 풀링 전략은 쓰레드 외에도 Integer의 -127~128 범위와 같은 자주 사용되는 객체를 효율적으로 사용하기 위해 사용되기도 한다. 그렇다면 쓰레드를 효율적으로 관리하기 위해선 "쓰레드풀에 쓰레드를 얼마나 생성하는 것이 좋을까?"에 대해 생각해보아야 한다. 이를 위해선 쓰레드 개수.. 2022. 9. 2.
BufferedWriter를 Integer와 쓸 때 유의점 알고리즘을 풀다가 자꾸 틀렸다. 분명 쉬운 문제인데? 찬찬히 읽어보니 로직은 문제가 없었다. 콘솔에서 돌려보니 범인은 BufferedWriter 정수가 나와야하는데 공백이 나온다. BufferedWriter 는 OutputStreamWriter를 데코레이터 패턴으로 조합해 사용한다. java.io에서 Reader/Writer는 문자열을 받아서 character 배열로 쪼갠 다음 byte로 인코딩해서 Stream으로 전달하는 책임을 가지는 객체이다. 따라서 숫자 역시 문자열로 취급되어 각 문자로 쪼개져 인코딩이 되는 줄 알았다. OutputStreamWriter를 보면 입력으로 들어온 문자열을 문자(CharBuffer)로 쪼개서 바이트로 인코딩하는 부분이 있다. 하지만 웬걸, Integer 들어오면 그대로.. 2021. 9. 29.
로깅을 어떻게 해야할까? AOP를 공부하다보면 대표적인 Cross cutting concern의 예시로 로깅이 언급된다. 컨트롤러 어노테이션을 달고 다니는 오브젝트의 메서드들을 프록시로 감싸서 실행시간을 측정하는 것이 대표적인 로깅의 예시인데, 별로 마음에 들지 않는다. 아래 예시를 보자. 예제 수준의 로깅 코드다. 로깅 메세지를 보면 "-----(대충몇개)----> Respons : {} ~" 식으로 되어 있다. 그러면 거대한 시스템의 경우 초당 수십만개의 로그가 쌓이는데, 저렇게 로깅을 해도 될까? 유튜브 채널 EO에 우아한형제들 전 CTO, 현 CEO인 분이 나와서 얘기하시기를, 평시 리퀘스트는 초당 만개, 이벤트 시에는 200만개가 넘게 들어온다고 한다. 그러면 저런 문자열이 리퀘스트 *2 개만큼 생기고, 컨트롤러 로깅뿐.. 2021. 7. 15.
orElseGet()과 orElse()의 차이 cfdf.tistory.com/34 java, optional의 orElse와 orElseGet의 차이 java8의 optional api 많이들 사용하실텐데요. 어찌보면 당연하지만 햇갈리는 내용에 대해 다뤄보겠습니다. 마무리 연산인 orElse와 orElseGet의 차이입니다. 귀찮으신분들을 위해 요약을 먼저 하자면 orE cfdf.tistory.com orElse와 orElseGet에 대해 흥미로운 글을 봤다. 무심코 넘겼던 부분인데 둘은 꽤 중요한 차이가 있다. orElse(Value)는 Value가 메모리 상에 존재한다고 가정하므로, Value가 함수의 리턴값이라면 Optional 내부 값이 null이건 말건 함수를 실행시켜 Value을 가져온다. 다음의 예제를 보자. orElse문 안의 Valu.. 2021. 3. 27.
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.