이제는 Spring Boot를 써야할 때다

스프링 프레임웍(Spring Framework)의 현행 버전은 4.1.x다. 그런데 세월이 흐르고 모든 것이 변해가는데 2014년 4/4분기인 현재 시점에서 아직도 2.5 버전대의 습관에서 못 벗어난 경우를 가끔 본다. 과감히 바꿔야할 때가 됐다. 이제는 Spring Boot를 써야할 때다. 스프링 부트는 스프링 프레임웍을 사용하는 프로젝트를 아주 간편하게 셋업할 수 있는 스프링 프레임웍의 서브프로젝트다.

스프링 프레임웍은 우리나라에서 국가 표준이므로 대부분의 자바 프로젝트에서 채택하는 명실상부한 1위 프레임웍이다. 나도 스프링 프레임웍을 몇 년간 써보면서 느끼는데 중요하면서도 개발자가 직접 만들기 힘든 기능들을 아주 맛깔스럽게 빚어놓음으로써 개발자들의 본 업무 외적인 시스템 내부 작업을 아주 간편하게 해결해주고 있다.

그런데 스프링의 다양한 장점에 비해 개발자들의 이해도는 낮은 편이며 남들이 해놓은 것을 가져다 수정해서 쓰는 “ctrl-c, ctrl-v” 방식 개발이 현장에는 만연해 있다. 또한 스프링을 충분히 활용하려면 초기 셋업부터 중요한데 일반 개발자는 거의 손을 못대는 경우가 많다. 진화하고 있는 스프링 프레임웍에 비해 우리나라 현장에서는 다음과 같은 문제점이 있다고 생각된다.

  • 전자정부 표준프레임웍은 새로운 것을 추구하기보다 안정성이 중요하므로 스프링 프레임웍 3.x 버전대를 사용하고 있다. 안정성의 반대로 바꿔 생각한다면 관 주도의 표준안 적용으로 인해 변화와 혁신에 대한 도입이 늦는 편이다.
  • 개발자들은 과거에 “잘” 사용했던 버전 및 기본 설정만을 가져다 쓰다보니 프로그램 모델이 경직돼 있다. 새롭고 효율적인 변화에 대해 공부하고 싶지 않거나 공부할 기회가 적다.
  • 스프링을 잘 아는 기술 지원 전문가(현장에서 “AA”라고도 부르는…)에 의존하다 보니 기술 지원 전문가가 부재 중일 때 또는 기술 지원 전문가도 잘 해결 안되는 문제가 발생하면 프로젝트 전체에 영향이 미친다.
  • 개발자가 개발한 결과물을 개발 서버나 운영 서버로 이행(배포)하는 것은 더욱 더 기술 지원 전문가에게 의존해야만 한다. 프로젝트의 효율성에서, 결국 시간과 인력이라는 비용 측면에서 손실이 발생할 수 있다.

웹 개발의 경향은 전체적으로 작은 서비스의 집합체로서의 웹으로 가는 편인데 우리나라 프로젝트들은 아직도 대규모 컨텐트 제공 웹사이트를 만들기 위한 프레임웍 구성에 치중해 있는 편이다. 커다란 프로젝트를 하나 구성하면 대부분은 그 안에서 자기가 맡은 일부 업무만 개발하고 말고 PoC 개념의 소규모 프로젝트를 동시 다반사로 진행한다든가 개발자 각각의 학습과 발전을 위한 기회를 마련하는 것은 상당히 요원하다.

여기서 요지는 프레임웍이란 것이 개발하는 데 도움을 주기 위해 도입하는 것인데 우리나라 개발 현장에서는 프레임웍을 자유자재로 다루기 위한 진입 장벽이 높아 보다 새롭고 유익한 변화를 도입하거나 보다 다양한 프레임웍의 면모를 활용하는 게 쉽지 않다는 것이다.

내가 수행한 몇 프로젝트에서 스프링 부트를 적용해본 결과 그 장점이 아주 만족스러운 편이었다. 위에 말한 문제점들을 해결한다고 말하는 것이 아니라 스프링의 다양한 변화 중 가장 먼저 관심을 가질 만한 서브프로젝트라고 생각돼서 언급하는 것이다. 아직 스프링 부트를 접해보지 못했다면 다음과 같은 면에서 유용함을 느낄 수 있으므로 추천하고 싶다.

  • 수작업으로 초기 셋업하는 과정 없이 간단히 프로젝트를 띄울 수 있다. 스프링에서 제공하는 Spring Tool Suite 개발 도구를 사용하면 마법사를 통해 기본적인 프로젝트 성격과 프로젝트에서 필요로 하는 라이브러리를 선택할 수 있다. 수작업으로 셋업하더라도 이전에 비해 반 이상이 단순해진다고 생각된다.
  • 프로젝트마다 일상적으로 설정하게 되는 사항들을 이미 내부적으로 가지고 있고 개별적으로 차이가 나는 부분만 설정 파일에 집어 넣으면 된다. 예를 들어 DB 연결 설정은 설정대로, 스프링 DB 설정은 설정대로 하지 않고 DB 연결 설정만 설정 파일에 적어놓으면 된다. DB 드라이버니, 트랜잭션이니 하는 것처럼 당연히 들어가야하는 것들은 알아서 처리된다.
  • 스프링 보안(Security), 스프링 데이터 JPA와 같이 다른 스프링 프레임웍 구성 요소를 쉽게 가져다 쓸 수 있으며 이 과정에서 프로토타이핑이나 기능을 시험해보는 시간이 전보다 단축된다.
  • 톰캣(Tomcat)이나 제티(Jetty)를 기본 내장할 수 있으며 웹 프로젝트 띄우는 시간이 독립적인 톰캣으로 띄우는 시간보다 반은 단축된다(예를 들어 30초 -> 15초). 또한 이렇게 서블릿 컨테이너가 내장될 수 있으므로 프로젝트를 .jar 파일 형태로 간단히 만들어 배포할 수 있다.
  • maven pom.xml에서 의존 라이브러리의 버전을 일일이 지정하지 않아도 된다. 스프링 부트가 권장 버전을 관리한다. 또한 Spring Tool Suite을 사용한다면 이클립스의 “컨텐트 어시스트” 기능을 통해 의존 라이브러리를 자동 완성 방식으로 입력할 수 있다.

실제 예시를 들어가보자. Spring Tool Suite을 사용하지 않고 수작업으로 웹프로젝트를 셋업할 경우다. 우선 의존 라이브러리를 maven pom.xml 파일에 지정해야할 것이다. 스프링 부트는 다음 한 가지 라이브러리 의존성만 넣어도 기본적인 웹 개발이 가능하도록 나머지 의존 라이브러리를 준비해준다.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

다음으로는 스프링 환경 셋업이다. 아래와 같이 xml 설정 없이 자바 클래스 하나로 기본 설정이 끝난다. @Configuration, @EnableAutoConfiguration 같은 어노테이션이 보인다.

package dylan.sample.spring.boot; // 예시 패키지
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

이제 서비스할 웹 페이지를 만들겠다면 늘 하던 대로 @RequestMapping 어노테이션을 붙인 컨트롤러 메서드를 만들면 된다.

    @RequestMapping("/")
    public @ResponseBody String helloWorld() {
        return "Hello World!";
    }

그런데 위의 예제는 메서드 반환 값에 @ResponseBody를 붙임으로써 별도의 뷰가 없는 경우를 예로 든 것이다. 뷰를 JSP로 하겠다면 src/main/resources/application.properties 파일에 다음과 같이 지정해준다.

spring.view.prefix                  = /jsp/
spring.view.suffix                  = .jsp

위 두 줄로 인해 스프링 MVC는 /jsp/ 폴더에 있는 jsp 파일들을 기본 뷰로 사용하게 된다. 컨트롤러 메서드는 다음과 같이 고치면 된다. /jsp/hello.jsp를 찾아 보여주게 된다.

    @RequestMapping("/")
    public String helloWorld() {
        return "hello"; // jsp 지정
    }

스프링 부트의 기본 개념은 프로젝트 웹사이트의 설명에 분명하게 드러나 있다.

Spring Boot takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible.

즉, 스프링 부트는 환경 설정보다는 통상적인 관례를 더 우선시한다. 환경 설정 한 줄 더 추가하는 것보다는 개발자들이 자주 하던 것이 무엇인지를 알고 있음으로 해서 사용자 환경에 따라 자동으로 구성해주는 것이다. 관심이 있다면 이러한 자동 설정이 어떻게 만들어져 있는지 소스를 보는 것도 좋을 것이다. 기존에 일일이 작성하던 환경 설정 값이 자바 클래스에 박혀있음을 보게 될 것이다.

자바는 버전 8을 내보내면서 근본적인 변화를 맞이하고 있다. 2014년 올해 자바와 스프링은 변혁의 한 해였던 것 같다. 같이 동참해보는 게 어떨까 권유해본다.

이제는 Spring Boot를 써야할 때다”에 대한 의견

  1. 감사합니다. ^^.
    말씀처럼 ctrl +c ,ctrl+v 를 하더라도 뭘 알고 하는 개발자가 되고 싶습니다.
    퍼갈께용.

    1. 개발자는 IDE라는 제품을 조작하는 기사가 아니라 소프트웨어라는 종합 예술(?)을 하는 사람이죠. ㅎㅎ 개발자로서의 앞날을 잘 헤쳐가시길 바랍니다.

  2. 잘 읽었습니다.
    Spring-boot 를 공부하던 차에.. 해당 게시글을 읽게 되었는데,
    느끼는 점이 많네요.
    작성하신 글에 많은 공감을 하고 갑니다.
    감사합니다.

  3. 장단점이 있는것같아요 자신이 적용할 프로젝트에 장점이 더 크다면 적용하면 될듯합니다 무조건 아닐듯해요

    1. 예 맞습니다. 어떤 프로젝트에 어떻게 적용하느냐에 따라 프레임웍이나 라이브러리의 활용이 달라지겠죠. 좋은 의견 감사합니다.

    1. 에이. 고생하는 만큼 당당해야죠. 고생하는 모든 개발자가 행복해졌으면 좋겠습니다. 방문 감사드립니다.

  4. 스프링을 잘 모르고 스프링 부트를 먼저 사용해서 개발하는 게 나은걸가요? 아니면 스프링으로 프로젝트 몇개 해보고나서 스프링 부트를 사용하는게 나은걸가요? 스프링 배치로 프로젝트를 할건데 이런저런 예시나 레퍼런스는 대부분 스프링 기반으로 되어 있어서 부트 환경이랑 다른 것 같아서요…의견 부탁드립니다^^

    1. 스프링 부트와 스프링의 차이는 셋업 방식의 차이라고 할 수 있습니다. 어느쪽을 먼저 하든 결국 스프링을 이해하게 되면 다른 쪽을 이해하는 것은 시간 문제일 수 있습니다.

      말씀하신 대로 이런 저런 예시를 본다든지 할 때 스프링을 이해하는 시간을 줄이기 위해서라면 스프링부터 공부해보는 것이 좋을 수 있지만 아키텍트 같은 업무를 하지 않는다면 사실상 스프링을 다 이해하고 쓰는 사람을 못 봤습니다.어떻게 사용하는지, 어떻게 셋업해야 DB에 연결하고 JSP가 나오게 되고 하는 실무적인 차원만 접할 거라면 남들이 뭘 하든 남들의 예시를 보지 말고 영어로 된 자료도 보면서 스프링 부트를 먼저 접해보는 것도 좋다고 말씀 드리겠습니다.

    1. 잘 봐주셔서 감사합니다. 직접 해보시고 또 느껴보시는 것도 좋을 것 같습니다.

    1. Spring legacy라 하면 기본 Spring 프레임웍을 말씀하시는 것 같습니다. 많은 분들이 이런 내용을 주제로 관심을 가지는 것이구요, 제가 이 글에서 권하는 스프링 부트 프로젝트가 Spring starter 프로젝트를 통해 쉽게 시작할 수 있는 방법입니다.

  5. 제가 인턴으로 웹개발 일을 하게 되었습니다. 프론트엔드는 뷰를 쓰고 백엔드는 스프링부트를 쓴다고 이야기 들었습니다. 출근 전에 공부를 하려고 합니다. 위에 어떤 분이 저랑 똑같은 걸 질문하셔서 스프링보단 스프링부트를 먼저 접하는게 좋다고 말씀하셔서 스프링부트부터 해볼 생각입니다. 스프링부트는 스프링보다 정보 찾기가 어려워서 매우 막막한 상황입니다.ㅠㅠ 혹시 도움될 만한 책이나 인강 있을까요?

    1. 스프링 부트는 스프링 프레임웍의 다양한 라이브러리를 좀더 손쉽게 사용할 수 있도록 만들어주는 역할이기 때문에 결국 스프링 자체에 대한 이해가 있으면 더 이해하기 쉽습니다. 그래서 개발자가 사용하고자 하는 스프링 프레임웍에 따라 다양한 예시가 있구요(https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples) 공부를 한다면 제가 권하는 것은 위에도 썼지만 영문 자료를 보는 것이 좋습니다. 우리나라 책도 있지 않을까 싶은데요, 하지만 온라인으로 자료를 보면서 직접 컴퓨터로 해보는 것도 좋은 방법입니다. 스프링 사이트에 가시면 (이클립스 같은 IDE 없이) 스프링 부트를 시작하는 방법이라든가(https://spring.io/guides/gs/spring-boot/) 스프링 부트의 전체적인 지침서(https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/)를 보시는 걸 권합니다. 좋은 결과 있으시길 바라겠습니다.

  6. 좋은 글 감사합니다.. 많은 생각이 드네요
    항상 공부할 준비가 되어있는 개발자가 되어야겠ㅅ브니다

  7. 스프링부트를 이제야 접했네요..
    생산성이 문제 였는데, 이제는 자바도 날개를 가진듯..
    감사합니다.

의견 있으시면 냉큼 작성해주세요~