Introduce Spring(0) - Prelude

18 Mar 2019 » Spring

Spring은 Java 생태계에서 높은 점유율을 가지고 있고, 국내에 한정해서는 더더욱 그렇다. 또한 그러면서도 사용자들에게 많이 사랑받고 있다1. 문제는 수많은 Spring 생태계 내의 개발자에 비해 정작 Spring을 쓸 줄 아는 개발자는 거의 없다는 부분에 있다.

여기서 말하는 Spring을 쓸 수 있다는 것은

  • Spring을 이용하여 필요한 형태의 환경을 구성할 수 있고
  • 추가적인 기능적인 요구에 대해 유연하고 안정적으로 확장할 수 있으며
  • 개발과정에서 프레임워크레벨에서 발생하는 문제를 매끄럽게 해결할 수 있는

것을 의미한다. 예기치 못한 문제가 발생했을 때 매끄럽게 해결하기 위한 능력은 ‘자신이 다루고 있는 기술에 대한 이해’가 필요하다. 이는 꼭 Spring이 아니더라도 자신의 주 영역에 해당하는 기술에 대해 모두 해당되는 이야기이다.

예를 들어, @Controller, @RequestMapping, @Service, @Repository 등의 몇몇 애노테이션을 붙이면 Spring은 알아서 웹 MVC 시스템을 만들어주지만, 이것은 ‘Spring에서 사용되기 위한’ 코드를 만드는 것에 불과하다. 이러한 상황에서 Spring에 대한 첫인상이 ‘어떻게 돌아가는지 도무지 이해가 가지 않는다’ 는 얘기가 나오는 것도 당연하다.

물론 그냥 그대로 써도 된다. 주변을 둘러보면 그렇게 쓰는 사람이 많기도 하고 Spring에서 제공하는 기본적인 구현체를 그대로 써도 제법 충실한 수준의 기능은 활용할 수 있다. 문제는 그정도라면, 신입 개발자도 충분히 할 수 있다는 점이다. 경험을 통한 지식과2, 프레임워크에 대한 이해를 통해 Spring이 가지고 있는 가치를 최대한 끌어내서 조금 더 현장에서 필요한 부분을 매끄럽게 구현해낼 수 있어야 ‘기술을 다룬다’ 라고 표현할 수 있다.3

누군가에게 받은 질문만은 아니다. 사실은 내가 겪었던 얘기.

지금까지 개발자로 살아온 시간중에 약 1년여 정도를 제외하고는 나는 거의 항상 Spring 생태계의 일원이었다. C#으로 시작했던 개발에서도 Spring.NET을 썼고, 그 이후로도 전자정부 프레임워크, Spring framework, Spring Boot 등, 다양한 방식으로 Spring을 사용했다.
아마 나 이외에도 많은 개발자들이 연습겸, 취업을 위해 거쳐왔을 xx 교육원, xx 학원 등의 과정에서 Spring을 처음 접했고, 내가 1의 노력을 들이면 3~4가 나오는 Spring의 모습에 놀라 ‘개발자가 되면 저렇게 신기한 걸 만들 수 있구나’ 라는 생각이 내가 최종적으로 개발자의 길을 선택하는데 영향을 미쳤다.

하지만 아쉽게도 현장에서는 이러한 지식이나 경험을 공유받지 못했다. ‘이게 왜 이렇게 돌아가는거죠?’ 라고 물어봐도 주변에 대답해줄 사람이 없었다. 다행히도 박재성 교수님의 Slipp, 토비(이일민)님의 블로그에서 힌트를 찾아가며 조금씩 이해를 높여갈 수 있었다.

문제는 이제는 내가 그런 질문을 받는 시기가 되었다. ‘Spring 잘 모르겠어요’, ‘Spring 어떻게 해야 해?’ 이러한 질문에 대해 알고 있는 것조차도 명료하고 말끔하게 설명하지 못하는 기분이 들었고, 그것이 이 블로그를 만들고, 글을 정리하고, 표현에 대해 고민한 이유이기도 하다.

정답을 줄 수는 없다. 나는 이런 식으로 접근했고, 이렇게 쓰고 있고, 그러한 방식이 어느정도 도움이 되었다는 누군가에게 힌트가 될만한 내용을 전달하는 것이 목적이다. 그리고 그를 위해 내가 배워왔던 것들, 위에서 언급한 가르침들에 대해 나름의 주해(註解)를 달아 조금 더 쉽게 설명하기 위한 과정을 거친다.

Silver Bullet은 없다.

분명히 말해두지만 세상에 절대적인 기술도, 방법론도 없다.
여러번 언급한 바 있지만, 나는 특정 기술이나 방법론을 만병통치약을 파는 약장수처럼 전파하는 개발자를 혐오한다.

개발자의 역량은 다양한 기술과 방법론을 상황에 맞게 적용하는 것에 있다.
우리가 개발하는 과정에서 겪는 많은 문제들은 학창시절의 객관식 시험도 아니며, 모범 답안이 있는 것도 아니다. 그저 ‘가장 적절한 것’을 고르는 문제다. 아무리 좋은 기술, 새로운 기술이라도 그 상황에 맞지 않으면 더 나은 수단을 찾아 적용해야 하는 것이 개발자의 책무인 것이다.

Spring도 마찬가지다. 이 글에서는 Spring의 장점을 더 많이 다루게 될 수 밖에 없을 텐데, 절대로 그렇지 않다는 것을 항상 염두에 둔채로 읽어주었으면 한다.

내가 Spring에서 얻은 것

Spring은 만능이 아니지만, 분명히 가치있는 프레임워크라고 생각한다. 여러가지 이유가 있겠지만, 내 개인적으로 집중하는 가치 - 그래서 이 시리즈에서 주로 다루게 되는 관점 - 를 한번 설명한다.

  1. 다양한 기술에 대한 접근
    • Spring은 Java 생태계 내에서 메이저라고 볼 수 있는 기술들에 대해 넓은 적용 범위를 지원한다. 모든 기술, 모든 영역을 다루기에 힘든 현실에서 Spring을 통해 다양한 기술을 사용하고 더 나아가 Spring에서 그 기술들을 다루는 방식을 살펴보는 것이 가능하다면, 그러한 기술들을 직접 다루는 것이 가능해진다.
    • 이 말은 다시 말해, ‘바퀴를 만들 필요가 없다4’ 는 얘기도 된다. 물론 중요한 파트는 직접 구현해야 하지만, 상대적으로 덜한 부분에 대해 필요에 따라 선택적 무지(selective Ignorance)를 택할 수 있다.
    • 여기에는 당연히 단점도 존재하는데, 추상화된 API를 통해 이용하는 과정에서 네이티브하게 사용하는 것보다는 일부 기능을 사용하지 못하는 경우도 있다.
  2. DIP
    • SOLID에 포함된 기본 원칙이지만, 이를 직접, 일관성 있게 구현하는 것은 생각보다 까다롭다. Spring을 이용하면 DIP를 쉽게 적용할 수 있다. 물론, 필요한 것이 DIP 뿐이라면 Google Guice도 좋은 선택이다.
  3. 오래 사용되고, 그러면서도 개발자들에게 사랑받는 소프트웨어에 대한 관찰
    • 약 20여년에 가까운 세월동안 유지되고 변화에 대응하며 아직까지도 생태계에서 충분히 사랑받고 있는 소프트웨어, 특히 이 과정에서 기존의 주류를 밀어내고 스스로 새로운 주류가 된 부분은 어떤 소프트웨어를 만들어야 하는지 관찰 대상으로 충분하다고 생각한다.
  4. 구현 패턴
    • 나보다 코드를 잘 만드는 개발자들의 소스코드를 보고 배우기 위함이다. 정답은 없지만, 참고를 할 수 있음에는 분명하다. 물론, 보기 쉽다고는 말 못한다.

  1. RebelLabs의 2017 Report등을 통해 이를 확인할 수 있다. 

  2. 경험은 투자한 시간에 대해 공평하다. 다만 그 경험을 얼만큼 자신의 것으로 소화해내는지는 다르다. 나는 이 두가지를 항상 구분해 설명한다. 경력과 실력이 정비례하지 않는 이유를 이것으로 보기 때문이다. 

  3. 최고급 스포츠카라도 운전자가 그 능력을 제대로 끌어내지 못한다면, 그보다 낮은 스펙의 자동차의 능력을 100% 끌어낼 수 있는 운전자보다 떨어질 수 있다. 그리고 그것이 ‘운전자’의 능력이며, 개발자 또한 이런 관점으로 보아야 한다. 

  4. Spring이 스스로 밝히는 Spring의 가치의 하나이기도 하다. 


Tags : Spring Framework , Basic Understanding