Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

기억을 더듬어(년도는 추정치) 필자가 실제 개발에 활용했던 코드샘플을 통해 개발의 변천사를 알아보자

...

1기 - OOP : 2007

Code Block
languagecpp
themeEmacs
#include <iostream>

struct Node{

    Node* prev;
    Node* next;

    void* data;
};

struct List{
    Node* head;
};

List* createList(){

    Node* head = new Node;
    head->prev = head;
    head->next = head;
    head->data = 0;

    List* list = new List;
    list->head = head;

    return list;
}

void insertNodeAfter(Node* node, void* data){
    
    Node* before = node;
    Node* after = node->next;

    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = after;
    newNode->prev = before;

    after->prev = newNode;
    before->next = newNode;
}

void removeNode(Node* node, bool deleteData){

    Node* before = node->prev;
    Node* after = node->next;

    before->next = after;
    after->prev = before;

    if (deleteData)
        delete node->data;
    delete node;
}
............................................
// 이하생략 이만큼의 코드로도 리스트가 제대로 작동하지않는다.
// 또한 스레드 세이프하기위해서 더 신경쓰야할 부분도있다.

...

템플릿의 등장과함께 본격적인 OOP시대가 개막된다.


부록: 이시절 서버 오토스케일링 시스템

위와같은 코드를 활용하여, 사용자의 수에따라 자동으로 서버가 증감하는 오토스케일링은 물론

...

위키피디아 기재 : 미국에서는 Poker가 스포츠로 분류되며 Cereus Poker로 북미 Top3 에 드는 시스템이였습니다. ( 대용량 트래픽을 처리했다란 의미)

1.

...

5기 제네릭 프로그래밍 : 2008

Code Block
languagecpp
#include <algorithm>
#include <iostream>
#include <list>
 
int main()
{
    // Create a list containing integers
    std::list<int> l = { 7, 5, 16, 8 };
 
    // Add an integer to the front of the list
    l.push_front(25);
    // Add an integer to the back of the list
    l.push_back(13);
 
    // Insert an integer before 16 by searching
    auto it = std::find(l.begin(), l.end(), 16);
    if (it != l.end()) {
        l.insert(it, 42);
    }
 
    // Iterate and print values of the list
    for (int n : l) {
        std::cout << n << '\n';
    }
}

위와같이 자료구조를 컨테이너화하는 제네릭컨셉은 java,c#을 포함하여 여러가지 언어에서 공통적으로 이용할수 있다.

c++은 java가 탄생하기전에 이미 위와같은 컨셉이 적용되고 실험되었으며 OOP의 역사는 c++을 중심으로 보는것이 이해가 쉽다.

템플릿 프로그래밍과 함께 다음 개발자의 노력은 OOP의 능력을 극대로 사용하는 디자인 패턴으로 이어진다.

하지만 템플릿과 프라이빗한 패턴적용은 서비스 코드에서 가독성의 문제와 디버깅문제를 격게 되며

MVC,싱글톤,팩토리패턴등  유용한 패턴들은 프레임워크에 자연스레 녹여들면서 구현보다는 사용하고 활용하는쪽으로 변화하면서

디자인 패턴을 극단적으로 생산하는것을 프레임워크가 잡아주게 된다.

MVC템플릿이 프레임워크 레벨에서 자동생성되거나 잘 갖추어진 의존성 주입방식을 활용하는것이 대표적인 예이다. 


부록: 모니터링

모니터링을 직접 개발하여, CPU/패킷량/메모리/디스크등 실시간 측정하였으며

장애발생시 메일자동발송 하기도 하였습니다. 요즘은 이러한것을 직접 개발하지 않고

다양한 APM 시스템을 이용할수 있습니다.

...


2기  : 멀티스레드 작성의 몰락과 비동기 프로그래밍 : 2012

...

하드웨어의 발전과 함께 단일노드에서 멀티스레드를 통한 대용량처리가 주류를 이루었으며

...

컨셉으로 완결이 되는것으로 보이며 곧바로 함수형시대가 열리게 됩니다.


참고:

Future and Promice


부록: 모니터링

모니터링/로깅등 직접개발했던 것을 관리되는 서비스로 전환하던 시기이며

OpenNMS(모니터링),Splunk(로깅)등을 연동하여 APM이 도입되던 시기입니다.

...

3기  : 람다와 함께 함수형 프로그래밍의 등장 : 2015

...

이제는 람다 + 함수형과 결합을 하여 불변하지 않는 리스트 객체를 이용하여

...

Spring Boot 의 성공한 전략을 따라가고 있다라고 볼수있다. ( Java 8부터는 Future및 Stream을 포함하여 쓸만한 언어스펙을 가지고 있기때문에 이제는 큰 단점이 되지 못한다.)

...


4기  :

...

1~3기의 장점을  잘 융합하는

...

하이브리드 마이크로 서비스의 시대 : 2015

...

최근에 다양한 마이크로  서비스를 통해 분산처리되고 관리가 되는 어플리케이션 구성에 고민을 하고 있으며

...

  • 도메인 객체인 엔티티,Aggregate,Repository를 OOP를 통해 분리하는 방법 (OOP설계능력 향상을 통한 도메인처리)
  • 대용량 처리에서 역압력 사용을 위한 스트림의 활용과 메시지큐의 활용 ( Akka,Kafka 등등)
  • 분산처리를 위한 라우팅설계및 클러스터활용과 다른 플랫폼을 상호 연동하는 방법
  • 전통적인 예외처리를 개선하는 패러다임의 활용 ( Let it Crash By Supervisor )
  • 다양한 테스트 개발환경 구축과 유닛테스트 커버리지를 올릴수 있는 방안및 지속적 통합(CI)

...


5기 : 클라우드의 전성기 : 2019

...

 클라우드에는 우리가 필요로하는 모든것이 갖추어지기 시작했으며,

...