코루틴이 대체 뭔데최근 컴퓨터 밑바닥의 비밀 에 대한 책을 읽으면서 고급 프로그래밍을 위한 공부를 하던 도중 동시성 프로그래밍에 대한 내용과 코루틴에 대한 부분이 등장했고 해당 챕터를 읽으면서 이해를 하는데 있어서 꽤나 애를 먹었다. 동시성 프로그래밍을 달성하기 위한 개념적인 것들과 코루틴에 대한 기본적인 이해는 어렵지 않다고 하지만 실질적인 동작 흐름을 시간단위로 쪼개서 생각을 했을 때 과연 어떠한 방식으로 동작하는 것인가 에 대한 부분을 정확하게 정의하고 넘어가야 겠다는 생각을 하게 되었고 시간 단위로 쪼개서 프로세스의 실행흐름을 살펴보는 과정을 가지기로 했다. 우선 코루틴을 이해하기 위해서 가장 중요한 부분은 동시성 프로그래밍과 병렬성 프로그래밍에 대한 이해에서 부터 시작된다고 생각한다. 동시성 프..
Null 처리에 관한 탐구와 Optionalnull 처리를 어떤 방식으로 진행 해야 할 것인가에 대한 부분은 언제나 고민이 된다.함수형 프로그래밍을 도입하며 객체지향적 개발을 지향하는 현 시점의 프로그래밍 기법이 과연 null 을 명시적으로 처리하는 완벽한 방법을 제공하지 않는다는 것이 어쩌면 놀랍기도 하다.물론 null 처리를 위한 Optional 이라는 강력한 기능이 추가되었지만 이 기능이란것이 생각보다 많은 부분에서 사용되지 않는다는점, 이미 진행된 프로그래밍에 적용함으로써 일관성을 해칠 수 있다는 점에서 사용을 꺼리게 된다.또한 애초에 모든 null 처리를 Optional 로 진행하는 것을 권장하지 않다 보니 명시적 null 처리를 진행해야 하는 부분이 반드시 발생한다는 것을 생각해보면 Optio..
배포 단위 : Component자바의 경우 JAR 파일, 이러한 배포 단위를 서로 링크하여 실행 가능한 단일 파일로 생성할 수 있으며 배포의 단위를 컴포넌트 라고 정의한다.그럼 "링크한다" 는 것은 배포 가능한 파일들을 단일 파일로 패키징하는 과정을 의미하고 이 과정을 통해서 프로그램의 배포 및 실행을 더욱 편리하게 만들 수 있다. 우리는 이 과정을 빌드도구 ex) Gradel, Maven 혹은 플러그인을 사용하여 수행한다.하지만 이 과정을 도와주는 위와 같은 툴은 링킹을 도와주는 도구 일 뿐 실제로 링커의 역할을 하지는 않는다. 링커 : Linker링커는 하나이상의 목적파일을 가져와서 이를 단일 실행 프로그램으로 병합하는 프로그램이다.주 기억장치에 메모리 확보 후 할당, 연결(Linking), 재배치(..
멀티코어 프로세서가 발전하면서 애플리케이션의 속도는 멀티 코어 프로세서를 얼마나 잘 활용할 수 있도록 소프트웨어를 개발하는가에 따라 달라질 수 있다. 여러가시 서비스를 동시에 제공하는 마이크로서비스 아키텍처의 선택이 지난 몇 년간 증가한것을 통해 이러한 추세를 확인할 수 있다. 위와 같은 서비스를 제공함에 있어서 동시간 여러 서비스의 응답을 기다리는 동안 연산이 블록되거나 귀중한 CPU 클록 사이클 자원을 낭비하고 싶지 않다면 동시성을 필요로 하는 상황 즉 조금씩 연관된 작업을 같은 CPU에서 동작하는 것 또는 애플리케이션의 생산성을 극대화 할 수 있도록 코어를 바쁘게 유지하는 것이 목표라면 원격 서비스나 데이터베이스 결과를 기다리는 스레드를 블록함으로 연산 자원을 낭비하는 일 등을 피해야만 한다. 위와..
자바로 프로그램을 개발하면서 NullPointerException 을 한번쯤은 무조건 겪는다. 모든 상황에서 null 이라는 표현을 사용하면서 치뤄야 할 당연한 대가이면서 어떻게 해결 할 수 없는 것이라고 생각 할 수도 있다. 하지만 명령형 프로그래밍을 통해서 null을 처리하고 싶다면 관점을 조금 다르게 접근하는 방법이 필요하다. 값 이 없다. 기존의 프로그래밍은 값이 없는 상태를 null 로 표현해서 처리 했다. 하지만 null 처리는 NullPointExceptions을 모든상황에서 완벽하게 대응할 수 있는 방법이 아니다. 개발자가 실수로 null 처리를 하지 않았고 개발을 진행하는 과정에서 운이 좋게 NullPointException 이 터지지 않았다고 해서 실제 서비스를 제공 할 때도 NullP..
수년 전까지 대규모 애플리케이션은 수십 대의 서버, 기가바이트의 데이터, 수초의 응답 시간, 당연히 여겨졌던 몇 시간의 유지보수 시간 등의 특징을 가졌지만 오늘날에는 다음과 같은 세 가지 이유로 상황이 변하고 있다. 빅데이터 : 엄청난 양의 빅 데이터를 처리할 일이 많아졌다. 다양한 환경 : 모바일 디바이스부터 수천 개의 멀티 코어 프로세서로 실행되는 클라우드 환경까지 다양하게 분포되어있다. 사용 패턴 : 언제 어디서나 접근 가능한 밀리초 단위의 응답 시간을 기대하는 서비스가 많아졌다. 위와 같은 이유로 패러다임에 맞게 설계된 애플리케이션은 발생한 데이터 항목을 바로 처리함으로 사용자에게 높은 응답성을 제공한다. 리액티브 애플리케이션과 시스템 개발의 핵심 원칙 반응성 (responsive) : 리액티브 ..
실무 개발자 질문 예전에 취업준비생 이었을 때 마지막 최종 면접을 보면서 받은 질문이 있다. "JUnit 5 를 사용하셨던데 왜 JUnit 5 를 이용하셨고, 테스트 케이스를 작성하신 이유가 있을까요?" → "테스트를 할 때 JUnit 5 를 많이 사용해서 진행한다고 해서 사용했고 특별한 이유는 없었습니다." 여기 까지의 답변만 봐도 탈락이지만 좀 더 질문을 받았다. "그럼 왜 테스트 케이스를 만들어서 사용하는 걸 까요?, 굳이 작성 할 필요가 있을 까요?" 잘 기억이 나지 않지만 이리저리 짱구를 돌리다가 내 놓은 대답은 그냥 얼버무린 대답이었다. 나는 테스트 케이스를 왜 작성해야 하는지도 모른체, JUnit 5 을 이용해서 테스트 케이스를 작성했다. 테스트 케이스는 왜 작성 할 까? 이 질문에 대해서 ..
항상 for 문을 사용해서 개발을 했었는데 실무에서 사용된 코드를 보니 많은 곳에서 stream이 사용된다는 것을 확인했다. 그래서 stream 에 대한 정리가 필요 할 것 같아 stream 기능에 대해 공부 해보기로 했다. stream의 핵심은 사용방법이 아니고 가독성과 효율성 사이 트레이드 오프 관계의 이해이다. stream 기능은 Java 8 부터 지원하는 기능이다. 2014년에 Java 8 이 처음 나왔는데 아직까지 많이 사용되는 버전중에 하나인것을 생각해보면 상당히 잘 만들어진 자바 버전인것 같다. 컬렉션 요소 하나하나를 람다식으로 처리할 수 있도록 하는 stream 기능은 개발자가 직접 반복자를 정의해서 처리하지 않고 내부 반복자를 통해서 처리 할 수 있도록 하여 코드의 가독성을 높여주고 있다..