상품관리

`use strict`;

// 비즈니스 로직 파일 참조
const business = require(`./module`);

// Server 클래스 참조
class goods extends require(`../server.js`) {
    constructor() {
        super(
            "goods",
            // 부모 클래스 생성자 호출
                process.argv[2]
                ? Number(process.argv[2])
                : 9010,
            ["POST/goods", "GET/goods", "DELETE/goods"]
        );
        this.connectToDistributor("127.0.0.1", 9000, (data) => { // Distributor 접속
            console.log("Distributor Notification", data);
        });
    }

    // 클라이언트 요청에 따른 비즈니스 로직 호출
    onRead(socket, data) {
        console.log("onRead", socket.remoteAddress, socket.remotePort, data);
        business.onRequest(socket, data.method, data.uri, data.params, (s, packet) => {
            socket.write(JSON.stringify(packet) + '¶');
        });
    }

}

new goods(); // 인스턴스 생성

회원관리

`use strict`;

// 비즈니스 로직 파일 참조
const business = require(`./module`);

// Server 클래스 참조
class members extends require(`./server.js`) {
    constructor() {
        super(
            "members",
            // 부모 클래스 생성자 호출
                process.argv[2]
                ? Number(process.argv[2])
                : 9020,
            ["POST/members", "GET/members", "DELETE/members"]
        );

        this.connectToDistributor("127.0.0.1", 9000, (data) => { // Distributor 접속
            console.log("Distributor Notification", data);
        });
    }
    // 클라이언트 요청에 따른 비즈니스 로직 호출
    onRead(socket, data) {
        console.log("onRead", socket.remoteAddress, socket.remotePort, data);
        business.onRequest(socket, data.method, data.uri, data.params, (s, packet) => {
            socket.write(JSON.stringify(packet) + '¶');
        });
    }
}

new members(); // 인스턴스 생성

구입관리

`use strict`;

// 비즈니스 로직 파일 참조
const business = require(`./module`);

class purchases extends require(`./server.js`) {
    constructor() {

        super(
            "purchases",
            process.argv[2]
                ? Number(process.argv[2])
                : 9030,
            ["POST/purchases", "GET/purchases"]
        );
        this.connectToDistributor("127.0.0.1", 9000, (data) => { // Distributor 접속
            console.log("Distributor Notification", data);
        });
    } // 클라이언트 요청에 따른 비즈니스 로직 호출
    onRead(socket, data) {
        console.log("onRead", socket.remoteAddress, socket.remotePort, data);
        business.onRequest(socket, data.method, data.uri, data.params, (s, packet) => {
            socket.write(JSON.stringify(packet) + '¶');
        });
    }
}
new purchases();

이렇게 모놀리식 아키텍처를 마이크로서비스 아키텍처로 변형했습니다. 언뜻 보기에는 아키텍처를 변경하는 것이 더 간단해 보일 수도 있습니다. 하지만 책에서는 이해를 돕고자 모놀리식 아키텍처를 처음 구현할 때부터 마이크로서비스로 변경하기 쉽도록 설계했습니다.

실제로 아키텍처를 변경할 때는 매우 많은 노력이 필요합니다. 추가된 새로운 기능은 전혀 없는데 투입 비용만 늘어나는 것을 좋아하는 사람은 없을 것입니다. 이러한 과도기적 문제를 극복하는 하나의 방법으로 모놀리식 아키텍처를 구현하는 시점에 향후 마이크로서비스로 변경할 것을 감안해 코드를 모듈화하면, 적은 비용으로도 아키텍처를 변경할 수 있습니다.

초기 개발 단계에서 마이크로서비스를 고려하지 않았다면 단계적으로 적은 비용을 들여 변경해 나갈 수 있습니다. 대부분의 경우 I/O 처리와 비즈니스 로직 간 심한 커플링이 아키텍처를 변경하는 데 가장 큰 걸림돌이 됩니다. 기존 코드에서 I/O 처리와 비즈니스 로직을 분리하는 리팩토링 작업으로 아키텍처를 변경하는 비용을 줄일 수 있습니다.

마지막으로 Distributor가 시스템 맨 뒤에 있는 서버라면 맨 앞에서 요청을 받아들이는 서버인 게이트웨이를 알아보겠습니다.