Versions Compared

Key

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

...

현재는 내가 필요한것이 어딘가에 오픈소스이든 상용소스인든지 어딘가에 존재한다.

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

1세대 - OOP : 2006

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;
}
............................................
// 이하생략 이만큼의 코드로도 리스트가 제대로 작동하지않는다.
// 또한 스레드 세이프하기위해서 더 신경쓰야할 부분도있다.

c에서 c++로 전환 되면서 객체지향이란 컨셉이 대동하기 시작한다.  하지만 성능이 항상 중요했고, c++을 사용하지만

oop를 활용하지 못했고... List가 얼마나 빠른지? 자료구조에 신경을 쓰던때이다. 

개발자의 컴퓨터 메모리가 1기가 안되던 시절로, List를 빠르게 하기위해 OOP로 설계하는것은 사치이던 시절이 있었다.


그리고 몇년이 흘러,이러한것을 작성할 필요없는(자료구죠) stl이 등장하였고-  stlport라는 c++비공식 라이브러리였으며 표준에 채택되기 까지는 더 많은 시간이 필요했음

...

물론 이러한 개발자가 도메인개발까지 잘할수 있다란것은 별개의 문제이다.

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

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


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

...

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

...

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



참고:

Future and Promice

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

...

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

...