본문 바로가기

자바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.
컴파일과 빌드의 차이 IDE에 익숙해진 초보 프로그래머들에게는 컴파일과 빌드의 차이는 애매모호하다. 잡지를 만드는 과정을 예로 들어 이해해보자. 어느날 PanGyo는 마음에 드는 잡지를 발견했다. 다만 아쉬운 점은 그 잡지가 영어로된 잡지여서 친구들과 같이 읽을 수 없다는 점이었다. 그래서 PanGyo는 영어로된 잡지를 한글로 번역해 출판하기로 마음먹었다. 출판하는 과정을 하나씩 살펴보자. 잡지는 영어로된 여러 기사들로 이루어져 있고, 각 기사에는 잡지내 다른 기사를 참조하는 경우가 잦다. 첫번째로 할 일은 각 기사를 한글로 번역하는 일이다. 기사를 영어에서 한글로 번역하면 친구들과 같이 읽을 수 있다. 두번째로 할 일은 원래 기사와 번역된 기사를 연결짓는 일이다. 예를 들어 "영문기사 A"가 번역되어 "한글기사 가"가 된 .. 2021. 7. 23.
로깅을 어떻게 해야할까? AOP를 공부하다보면 대표적인 Cross cutting concern의 예시로 로깅이 언급된다. 컨트롤러 어노테이션을 달고 다니는 오브젝트의 메서드들을 프록시로 감싸서 실행시간을 측정하는 것이 대표적인 로깅의 예시인데, 별로 마음에 들지 않는다. 아래 예시를 보자. 예제 수준의 로깅 코드다. 로깅 메세지를 보면 "-----(대충몇개)----> Respons : {} ~" 식으로 되어 있다. 그러면 거대한 시스템의 경우 초당 수십만개의 로그가 쌓이는데, 저렇게 로깅을 해도 될까? 유튜브 채널 EO에 우아한형제들 전 CTO, 현 CEO인 분이 나와서 얘기하시기를, 평시 리퀘스트는 초당 만개, 이벤트 시에는 200만개가 넘게 들어온다고 한다. 그러면 저런 문자열이 리퀘스트 *2 개만큼 생기고, 컨트롤러 로깅뿐.. 2021. 7. 15.
AssertJ - isEqaulTo와 isSameAs의 차이 isSameAs : 메모리상 같은 객체를 가리키는지 비교 (주소 비교) isEqualTo : 객체가 같은 값을 가지고 있는지 비교한다. 사소해보이지만 이런거 정리 안해놓으면 이거 때문에 헤멜 수 있다. 그리고 이렇게 되새겨 놓으면 무심코 쓰다가 무의식적으로 “아 이거 아닌데” 하고 알아차릴 수 있다! 2020. 12. 29.