본문 바로가기

Back-End

(91)
ES2015 이후의 비동기 제어 흐름 패턴( Asynchronous Control Flow pattern ) -node.js ES2015 이후의 비동기 제어 흐름 패턴 아직 자바스크립트를 사용해보지 않아, 콜백지옥이 얼마나 심각한지는 모른다. 뭐 무튼 불편하니까 계속 대안이 나오고 있지 않을까? 이번 포스팅에서 유명한 대안책인 Promises, Generators / async, await ( ECAMA 2017 ) 에 대해 알아볼 것이다. PromisesPromise는 비동기 작업의 결과를 제어할 수 있는 object를 반환해주는 함수이다. ( 말이 이해하기 힘들다.... 그냥 비동기 작업의 결과가 성공/실패일 때 제어할 수 있도록 제공해주는 함수이다.) promise.then([onFulfilled], [onRejected]) 기존의 콜백 지옥asyncOperation(arg, (err, result) => { if(err..
7. Aggregation Framework에 관하여 - mongodb Aggregation Framework이번 포스팅에서는 몽고디비에서 데이터를 분석을 어떻게 하는지 알아볼 것이다. Pipeline, Stages and TunablesAggregation framework란 몽고디비에서 collection에 있는 document를 분석할 수 있게 도와주는 도구이다. Aggregation framework는 파이프라인 개념에 기초를 두고 있다. 처음 input은 collection을 받는다. 그리고 각각의 stage는 document를 input,output으로 사용한다. ( stream of documents ) Aggregation 파이프라인의 각각의 stage는 데이터 처리 단위이다. Tunables(?)는 필드를 변경하거나, 정렬하거나, 연산 등 다양하게 필드를 변..
1. Asynchronous Event-Driven 프로그래밍에 관하여 - Mastering Node.js Asynchronous Event driven 프로그래밍에 관하여Node는 event-driven, asynchronous I/O를 이용하여 프로세스가 blocking 되는걸 방지해준다. 이번 포스팅에서는 Node를 이용하여 어떻게 이벤트 드리븐 프로그래밍을 구현하는지 알아볼 것이다. 1. 노드가 timers, callbacks, I/O events를 어떻게 다루는지 2. Promises, Generator, asyns/await를 이용하여 어떻게 동시성을 제어하는지 이 포스팅의 예제를 살펴보면, Node가 왜 성공했는지 살펴볼 수 있다고 한다...(?) Node`s Unique design Event loopEvent loop는 Javascript 코드가 돌고 있는 thread에서 동작한다. 이벤트를 ..
0.노드란 무엇인가? - Mastering Node.js Events for everything 운영체제에게 파일을 열어달라고 요청하면, 해당 작업은 즉각적으로 실행될 것이다. 하지만, 네트워크, 인터넷을 통한 작업은 이 전의 작업처럼 빠르거나 신뢰할 수 없다. 개발자들은 소프트웨어가 느려지지 않도록 이러한 작업들을 잘 처리해야 한다. 보통 C, Java 개발자들은 thread를 통해 해결한다. pthread_t my_thread; int x = 0; /* Make a thread and have it run my_function(&x) */ pthread_create(&my_thread, NULL, my_function, &x);Click me Node는 Javascript에서 thread 개념이 필요없다고 우리에게 보여주고 있다. Thread에 관해서 고려..
스프링 5에서 Reactive Programming 하기 (1) Reactive Programing 사용예시Reactive 환경에서 message-driven communication에 대한 이해는 필수다. Reactive Programming에 대한 이해를 위해 하나의 예시를 살펴보자. 마이크로서비스 패턴에서 게이트웨이 필수이기 때문에 예시에 포함시켰다. ( API Gateway, Service Registry에 대해 더 알고 싶다면 제 블로그의 Microservices 카테고리를 참고해주세요 ) 응답성(responsive)를 위해서, 주문이 접수되면 바로 response를 return하고 async로 payment service를 호출한다. 최종 notifcation은 메일을 통해 전송이 된다.
RxJava란? Observable,Observerd 좋은 어플리케이션을 만들기 위해서는 3가지 요소를 고려하여야 한다. Responsiveness, Elasticness, Resilience이다. RxJava 설정하기 io.reactivex.rxjava2 rxjava 2.1.0 RxJava는 어떻게 동작하는가?Dzone에 있는 모든 문서를 가져와주는 어플리케이션을 예시로 살펴보자. public class DzoneDBDao { private static DzoneDBDao service = new DzoneDBDao(); public static DzoneDBDao get() { return service; } DZoneDoc[] getAllDocFromDB() { return produceDocs(); } private DZoneDoc[] produce..
토비의 스프링 7장(1) - SQL과 DAO의 분리 4,5,6장을 살펴보면서 스프링의 3대 핵심 기술인 IoC/DI, 서비스 추상화, AOP에 대해 간단히 살펴봤다. 스프링이 자신의 핵심 기술을 다양한 분야에 적용했듯이, 스프링을 사용하는 개발자도 스프링이 제공하는 3가지 기술을 필요에 따라 스스로 응용할 수 있어야 한다. SQL과 DAO의 분리UerDao에서 반복적인 JDBC 작업 흐름을 템플릿을 이용해 제거했다. 그리고 다른 부분과의 연결을 인터페이스를 통해 DI 되기 때문에 다이나믹하게 관계를 설정할 수 있다. 즉, DAO에는 깔끔하게 다듬어진 순수한 데이터 액세스 코드만 남게 했다. 하지만, DB테이블과 필드정보를 고스란히 담고 있는 SQL 문장이 남아있다. DB의 테이블, 필드 이름과 SQL 문장의 변경으로 UserDAO를 수정하게 될 수도 있다..
토비의 스프링 6장(3) - 다이나믹 프록시와 팩토리 빈 프록시 패턴 / 데코레이터 패턴6-1장에서 트랜잭션 코드와 비즈니스 코드를 분리했었다.( http://happyer16.tistory.com/entry/%ED%86%A0%EB%B9%84%EC%9D%98-%EC%8A%A4%ED%94%84%EB%A7%81-6%EC%9E%A51-AOP-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%B6%84%EB%A6%AC ) 위의 구조를 다시 그린 후에 프록시에 대한 개념을 살펴보면 이해하기 편하다. 프록시와 타킷아래 그림은 위의 구조와 같은 것이다. 프록시(Proxy) : 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 대리자 ( UserServiceTx )타..
토비의 스프링 6장(2) - 고립된 단위 테스트 고립된 단위 테스트단위 테스트는 당연히 작은 단위어야 한다. 쉽고, 빠르고, 명확하기 때문이다. 복잡한 의존관계 속의 테스트 UserService 테스트를 위해 필요한 구조DB와 데이터를 주고 받기 위한 UserDaoJdbc트랜잭션 처리를 위한 Transaction Manager메일 전송을 위한 MailSender문제점간단한 UserService 테스트를 위해서는 DB, Transaction 등 의존 관계를 명시해줘야 한다. 테스트하기 복잡하고, 환경에 영향을 받는다. 테스트 대상 오브젝트 고립시키기 단위테스트 vs 통합테스트둘 중에 어떤걸 써야할까?항상 단위 테스트를 먼저 고려한다외부 리스소를 사용해야 하는경우만 통합 테스트. 외부와의 의존관계는 모두 차단하고 필요에 따라 목 오브젝트 등의 테스트 대역..
토비의 스프링 6장(1) - AOP 트랜잭션 코드의 분리 지난 포스팅http://happyer16.tistory.com/entry/5%EC%9E%A52-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%B6%94%EC%83%81%ED%99%94?category=692836에서 UserService에서 트랜잭션이 필요했다. 스프링에서 제공해주는 인터페이스를 썼음에도 불구하고 비즈니스 로직에 길고 더러운 코드가 있어 찝찝함을 감출 수 없다. 개요등장배경스프링이 도입하려는 이유장점 ( 예제로 선언적 트랜잭션 기능을 살펴보자 )메소드 분리[ 리팩토링 전 - 서로 정보도 주고 받지 않고 관련이 없는 트랜잭션 코드 / 비즈니스 코드가 섞여 있다. ]..