
Data 모으기 사용할 다건의 data 목록을 마련할 때 상황에 따라 서로 다른 source 에서 조회해야 하는 경우가 있습니다. 예를 들면 data 가 일부 캐싱되는 경우를 들어봅시다. 10개의 data 를 조회하는데 일부는 캐시에서 조회가 가능할지도 모릅니다. 그리고 나머지는 DB 에서 조회해서 채워야 할 것 입니다. 이런 경우 캐시와 DB 라는 두 개의 data source 로 부터 필요한 data 목록을 조회하게 됩니다. 꼭 이런 경우가 아니더라도 우리의 data 아키텍쳐 상으로 여러 이유를 들어 data source 여러 곳에서 data 조회가 필요한 경우는 쉽게 생각할 수 있습니다. Data Source 우선순위 너무 복잡한 상황을 전제하지는 않을 예정이지만 기본적인 요구사항들은 짚어보려고 합..

실패한 작업 가끔 일련의 작업을 하나의 트랜잭션 마냥 수행해야 하는 경우가 있습니다. 분산처리나 분산 트랜잭션 등의 주제라면 또 다른 얘기가 되지만, 좀 더 단순하게 코드 레벨의 문제들을 마주할 경우가 있죠. 각 작업은 실패할 수 있고 하나라도 실패하는 경우 지금까지 수행한 작업들에 실패 처리를 하는 코드를 어떻게 짜면 좋을까요? 일단 하나의 작업에 대해서 실패를 대비하고 실패 시 처리방안을 마련하는 방법은 바로 try-catch 일 것입니다. 그러면 쉽게 생각해서 일련의 작업을 위한 try-catch 를 여러 번 사용하면 되지 않을까요? 중첩 Try Catch 하나의 작업은 다음과 같이 실패를 다룰 수 있습니다. try { // 실패할 가능성이 있는 작업 } catch (Exception e) { //..

After GC, Post GC Memory는 프로그래밍에 꽤 중요하고 기술적인 부분입니다. 만약 독자께서 malloc, calloc, free 등에 어색함이 없다면 더욱 Memory를 다루는 것에 기술적인 특징들을 공감하실 수도 있겠습니다. 그래서 또 Memory를 다룬다는 점은 꽤 신중하고 기교가 높아야 했으며 문제가 복잡해질수록 이 과정에서의 버그나 Side-effect의 해결이 쉽지 않습니다. 이런 고통(?)에 대한 공감은 어렵지 않은 일이죠. 그래서 등장한 것이 바로 Garbage Collection 입니다. Garbage Collection은 무려 1959년에 John McCarthy에 의해 Lisp에서 등장하는 역사를 가지고 있습니다. 벗어나는 이야기지만 Robert C. Martin은 Th..

변경에 강한 패턴 생뚱맞은 도입이지만 좋은 코드란 무엇일까요? 여러 설명들을 들 수 있지만 그중 꽤 많이 거론되는 덕목은 변경하기 용이한 코드입니다. 코드의 작성 시점에서 변경은 미래에 일어날 일입니다. 지금 그 요구를 다 안다면 기다릴 것 없이 코드에 반영하면 되지만 그렇지 않기 때문에 변경이 용이할 수 있다는 점은 쉽지는 않습니다. 한편으로는 그렇기에 코드를 변경하는 케이스들을 일반화하여 코드를 작성하는 시점에 어떤 변경 패턴을 대비하곤 합니다. 그리고 그런 방법 중에 Middleware 패턴을 코드 수준에서 이용해 보려고 합니다. 코드 흐름과 변경 먼저, 코드를 변경하는 패턴 중에는 코드가 진행하는 흐름에 대한 패턴을 짧게 살펴볼까 합니다. 대표적으로 then 의 의미를 사용하는 방식들을 찾아볼 수..

위상정렬 위상정렬 은 부분 순서를 갖는 집합을 정렬하는 방법입니다. 우리에게 익숙한 순서가 부여되는 집합인 전순서 집합에는 자연수, 실수 등이 있습니다. 이들은 임의의 원소를 두 개 꺼내면 둘 사이의 순서를 언제나 결정할 수 있는 게 특징입니다. 이와 다르게 모든 임의의 두 원소 사이에 순서를 결정하지 못하는 집합도 있습니다. 하지만 뭔가 집합에 포함된 순서가 있으면서도 말이죠. 알쏭달쏭 하지만 그런 문제는 일상에 많습니다. 흔히 드는 예시는 수강신청입니다. 수강하려는 과목들 사이에는 딱히 순서가 없지만, 어떤 과목에는 선수과목이 있곤 합니다. 이런 경우 부분적으로 발생하는 순서를 고려해서 수강 계획을 짜야하죠. 이처럼 작업관리에서는 흔하게 부분 순서를 갖는 문제를 쉽게 마주합니다. 이를 정렬할 수 있는..

Monad 어떤 것을 설명하는 방법에는 몇 가지가 있습니다. 그것의 정의를 가지고 설명할 수도 있고 그것이 갖는 특성을 나열하며 설명할 수도 있습니다. Monad 를 설명할 때는 어떤 방법이 좋을까요? 사실 이 글을 쓰기 전 Monad 를 이해하기 위해 꽤 많은 설명들을 대하였습니다. bind :: m a -> (a -> m b) -> m b return :: a -> m a 이런 설명은 너무 단순하거나 수학적이어서 그 조건을 만족한 것이 어떤 기능을 할 수 있는지 상상하기가 어려웠습니다. Maybe is Monadic jQuery is Monadic Stream (in Java) is Monadic 이런 설명들은 그 사용 예들을 살피며 Monad 가 어떻게 기능하는 패턴이 있는지 대충 느끼게 해주지만 ..

Web Component 이 글은 Web Component 에 대한 소개의 글은 아닙니다. 이를 위한 Custom Element 나 Shadow DOM 의 기술을 설명하는 글도 아닙니다. 이 글에서는 transclude 한 컴포넌트 디자인이 어떤 의미를 지닐 수 있는지를 논의해보고 싶습니다. 자바스크립트나 함수적인 프로그래밍에 익숙한 분들은 클로져나 람다 등에 익숙하실 것 같습니다. 제가 느끼기에 transclude 는 이런 기술들의 근본과 차이가 크지 않으며 이를 통한 활용이 좀 더 높은 추상화를 가능하게 도와주는 도구라고 생각합니다. Web 에서 가장 많이 사용되는 element 는 컴포넌트 일 것입니다. 이 요소는 매우 단순한 요소인데 어떻게 많이 쓰이면서도 요소가 제공하는 요구사항을 더 추가하거나..

Java의 HashMap에 대하여 딱 이만큼만에서 소개했드시 HashMap은 유용한 자료형이다.저번시간에는 HashMap의 이론적인 방법을 소개했다면 이번에는 효과적으로 사용하는 방법을 알아보자.HashMap에서 모든 Key와 Value를 print하기HashMap에서 모든 Key와 Value를 print하는 다양한 방법이 있다. 하나씩 알아 보자.모든 key를 print 하는 방법Set keys = productPrice.keySet();//print all the keys for (String key : keys) { System.out.println(key); }// or keys.forEach(key -> System.out.println(key));좀 더 간결한 람다 표현식인 forEa..