You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 15 Next »


10년전 C++로 개발을 시작했을때는 내가 필요한것을 모두 작성해야 했었다.

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


아래 코드는, 모두 작성해야 했을 시점에 코드 샘플이다.

이때는 바이블처럼 메모리누수없는 성능좋은 자료구조를 개발자들이 구현가능했어야 하는 시점이다.

서비스 로직보다. 자신이 작성한 자료구조가 얼마나 더 빠른고 안전한지에대해 더 열정을 퍼 붓던 시절이다.

자신의 기술력을 훈련할수 있는 정량적인 문제 해결에 집중을 하던 시대라고 정의를 하고 1세대 부터 시작해보겠습니다.

1세대 - OOP

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


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

자주 사용되는 자료구조를 구현이아닌 이용을 할수 있는  신기방기한 녀석이 등장하였다. 우수한 개발자들의 역량이 자료구조 설계에 있었으며

이때 등장한 STL을 반가울리 없었으며, STL 과 성능 벤치마크까지 해서 자신의 자료구조의 성능을 증명하거나, 마지막까지 고수하였지만  

이 녀석의 등장으로 곧 템플릿+제네릭 프로그램이 유행을하였으며 프라이빗한 자료구조는 몽땅 대체되기 시작하였다. 

자료구조를 아주 잘 작성하는 개발자의 시대가 끝났다란것을 의미하기도 한다.

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


1.5 세대 : 제네릭 프로그래밍

#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';
    }
}


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


멀티스레드 프로그래밍이아닌 동시성 처리를 위한 비동기처리를 위한 여러가지 언어스펙이 발생하게되며

콜백헬을 방지하는 여러가지 방안이 생기기 시작합니다.

그리고 Future 와 Promice라는 컨셉으로 완결이 되는것으로 보입니다.


참고:

Future and Promice

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


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

집계 통계등을 신기방기한 방식으로 간단한 코드로 표현이 가능해졌다. 

그리고 이것은 복잡한 비동기 처리 개발방법이 필요없어지게 되었고, 알아서 멀티코어를 활용하여

다중 동시 처리를 해준다.

아래코드는 C#이며, JAVA 8 Stream에서도 비슷하게 작성할수가 있다.

List<Person> persons = new List<Person>()
{
    new Person { PersonId = 1, car = "Ferrari" },
    new Person { PersonId = 1, car = "BMW" },
    new Person { PersonId = 2, car = "Audi"}
};


List<Result> results2 = persons
    .GroupBy(p => p.PersonId, 
             (k, c) => new Result()
                     {
                         PersonId = k,
                         Cars = c.Select(cs => cs.car).ToList()
                     }
            ).ToList();


스칼라의 WordCount는 함수형 프로그래밍을 통해 데이터의 집계처리를 단순화한 좋은 예이다.

https://spark.apache.org/examples.html


최근 핫한 스칼라/언랭/파이썬 등에서 위와같은 컨셉이  나왔고 그것을 이용하는것만이 모던한 개발 이고

나머지는 아니라고 잘못된 정의를 내리는 경우를 보았다.

템플릿/람다/제네릭/함수형 그 컨셉이 메니지드 언어에 존재하지도 았을때-예를 들면 자바 4혹은 닷넷 프레임웍 2.0 이하시절

이미 오래전, 10년도 더 전에 C++에서 시도 되었고  Boost(https://www.boost.org/)로 집약이 되어있다.


만약 함수형+스트리밍을 통해 서비스를 처리하는 방식에 도전하고 싶다면

akka http 에서 그 컨셉이 잘 정리되었으니 참고가 될듯하다.  -akka는 비교적 모던한 개발방식뿐아니라, 앞으로 유행될 내용에대해 컨셉을 잘정리하면서 빨리적용되는 편이다. 

https://doc.akka.io/docs/akka-http/current/introduction.html


하지만, 웹서비스에서 Java코드를 사용하는 Spring Boot(의존성자동주입과,어노테이션의 천국)이 여전히 안정적이고

MSA에서 성공한 넷플릭스의 개발패턴을 잘 옮겨온 , Spring Boot Cloud로 다시한번 인기가 이어가고 있다.  


4세대 : 1~3세대의 장점을  잘 융합하는 마이크로서비스의 시대



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

시대에따라 달라 질수도 있지만 그러한 관점에서 모던한 개발에서 필요한것이 무엇인가? 를 정의를 할필요가 있다고 봅니다.

예를 들면 도메인 처리는 여전히 OOP가 안정적이고  분석은 함수형에 이점이 있으며  배치는 절차형이 안정적이다.

어느한가지 방식이 항상 장점이 있는것이 아닌, 각각의 특성의 장점을 이용하는것입니다.


모던한 개발에서 요구되는 사항

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


5세대 : 클라우드의 발전


 도메인과 관련한 룰생성,API생성을 포함하여 마이크로서비스를 오케스트라를 할수 있는 방법이 이미 있으며

더 성숙을 한다고 하면 응용레벨의 코딩이 사라지고, UI에서 드래그앤 드랍을 하는 서비스가 성공하는 시대가 올것이다.

OOP가 사라지지 않듯이, 이전 개발 방식이 완전 사라지는것이 아니고 어느정도 공존이 되면서 변화가 될것이다. 


하지만 우린 지금 시대에 필요한 지식탐구의 방향은 무엇인가? 를 고민해볼필요가 있으며

이것은 다음 주제로 이어집니다.

Next :



  • No labels