오랜만에 글을 쓰고 있네요 ㅎㅎ 12월이 지나면 어느덧 저도 개발 10년에 접어들게 됩니다. 믿기지 않네요 ㅎㅎㅎ
최근 회사를 이직하고 이제 적응(출근적응 ㅎㅎ)도 되고 글쓰기 관련 도서를 읽으면서 문득 블로그질을 하고 싶다는 생각이 들었습니다.
신규 프로젝트에 많은 오픈 소스를 사용하다 보니 관련 글을 쓰려고 합니다. 먼저 오픈 소스를 사용하는 것에 대한 이야기를 하려고 합니다. 어떤 개발자 분이 오픈 소스 관련 대화를 하다가 '의미있는 바이너리를 만들어내야 한다.'라는 이야기를 한적이 있습니다. 이 말에 대략적인 의미는 아래와 같습니다.
1. 오픈 소스처럼 의미있는 것을 만드는 개발자가 되어야 한다.
2. 오픈 소스가 모든 것을 해결해주지는 못한다. 즉 한계가 존재하여 직접 만들 수 밖에 없다.
1번은 이상적이고 멋있는 개발입니다. 아마도 이분은 2번에 더 많은 의미를 실어서 이야기를 한다고 느껴졌습니다.
언제부터인지 개발자를 보면 1. 기술에 관심이 많은 개발자 2. 업무에 관심이 많은 개발자로 분리가 됩니다. 교과서적인 이야기지만 기술 + 업무가 조화를 잘 이루어야 진짜 의미있는 결과물이 나옵니다. 1번이 강한 사람은 2번에 관심이 없고 2번이 강한 사람은 1번에 관심이 없습니다. 모두가 그런 것은 아니지만 제가 봐온 많은 개발자들은 편차가 심합니다. 아마도 위에 언급한 분은 기술에 관심이 많고 업무에는 별 관심이 없는 개발자입니다. 기술에만 관심을 가져도 되는 분야가 있습니다. 하지만 업무가 중요한 부분을 기술에만 관심있는 개발자가 설계를 하고 리드해가는 과정과 그 결과물을 보면서 '앙꼬없는 진빵'이라는 생각이 들었습니다. 누구를 위한 기술이고 무엇을 위한 기술인지 알수가 없었습니다. 물론 저의 생각이고 시야가 좁아 그런걸 수도 있습니다. 업무가 중요한 분야에서 업무에 대한 관심과 분석 없이는 좋은 결과물을 만들어낼 수 없다고 확신합니다.
그럼 이제 본론?!으로 들어가서 오픈 소스 선택에 대한 기준에 대해서 이야기를 해보겠습니다.
동일한 기능을 제공하는 오픈 소스들이 많이 있습니다.
예를 들어 IoC Container만 하더라도 20여 가지가 넘습니다.
저는 아래와 같은 기준으로 오픈 소스를 선택합니다.
1. 성능
2. 기능
3. 레퍼런스 사이트
4. 문서, 커뮤니티 기타 등등
1번째로 성능입니다. 여기서 순서는 우선순위를 의미합니다. 많은 기능을 가지고 있더라도 성능이 떨어지면 제외가 된다는 의미입니다. 성능을 가장 우선순위에 놓은 이유는 성능에 관련된 문제가 발생하게 되면 사용한 오픈 소스에 전체 구조 및 문제점을 분석 해야하고 수정을 하면 수정으로 인한 부작용까지 감수해야 하는 어려움 때문입니다. 기능에 대한 단순 버그를 수정하는 것과 근본이 흔들리는 성능은 큰 차이점이 있다고 생각합니다. 그리고 의외로 기능만 보고 오픈 소스를 선택하는 경향이 있습니다. 기능이 되기 때문에 일단 도입을 해서 사용을 하다가 성능 때문에 고생을 한 경우를 몇 번 보았기 때문이기도 합니다. 성능을 고려할 때 절대적인 수치로만 고려할 부분은 아니고 상대적인 수치로 조금 성능이 낮더라도 기능이 우수한 오픈 소스를 선택하는 경우도 있습니다.
2번째는 역시 기능입니다. 원하는 기능이 되지 않으면 당연히 의미가 없습니다. 기본 기능을 살펴보고 당장은 사용하지 않더라도 확장성을 고려해서 선택합니다.
3번째로는 해당 오픈소스를 사용한 레퍼런스 사이트입니다. 예를 들어 Dapper와 같은 매퍼는 Stackoverflow에서 사용한 오픈 소스로 레퍼런스 사이트만 들어도 신뢰가 생기는 오픈소스입니다.
마지막으로는 문서, 커뮤니티, 사용성 등등 고려해야할 요소들이 있습니다.
위의 내용을 기준으로 제가 이번에 선택한 IoC Container는 SimpleInjector입니다.
1번째 성능에 의해서 SimpleInjector와 Lightinject를 선택하였습니다. 2번째 기능에 대해서 IoC Container 본연의 기능과 추후의 확장가능한 기능인 AOP를 둘 다 제공합니다. 3번째는 잘 모르겠고 문서, 커뮤니티 등등 우열을 가리기가 쉽지 않았습니다.
작년에 LightInject를 간단하게만 사용해보았고 이번에 검토를 하면서 SimpleInjector를 사용해보았습니다. 사용해본 느낌은 LightInject는 유연한 느낌이고 SimpleInjector는 엄격한 느낌입니다. 이런 느낌의 근거는 의존성 주입이 되는 객체가 1개 또는 N개에 따라서 컬렉션(List<T>)으로 받을 수 있는지 없는지에 대한 차이 때문입니다. 전자는 받을 수 있고 후자는 예외가 발생합니다.
평상시에 저라면 유연한 것을 선택했을 확률이 높은데 컨테이너는 엄격해야 한다는 생각이 들었습니다.
이번에 검토를 하면서 이전에 사용해봤던 Spring, Unity, Windsor, MEF는 유물이 된 느낌이였습니다. 일단 성능 수치가 상대가 안되었고 요즘 아이들은 이름처럼 간단하고 가벼운 느낌이 들었습니다.
IoC Container로 프로젝트를 처음부터 해본적이 없었는데 적용을 해보면서 경험해봐야만 알 수 있는 내용과 왜 사용하였는지에 대해서도 해당 프로젝트의 1차 개발이 끝날때쯤(한3월초? ㅎㅎ) 작성해보도록 하겠습니다.