development/spring

Spring Boot 와 Spring Legacy

bokshiri 2023. 7. 18. 18:04

  올해 들어 새 프로젝트를 진행하고자 인텔리제이에서 스프링부트 프로젝트를 하나 생성하였는데요. 부트 버전이 벌써 3. 대가 출시되었습니다. 이에 맞게 Spring Swagger와 Spring Security 등도 최신버전을 채택하여 설정을 진행하였는데, Security는 Lambda를 사용하게끔 바뀌었고 Swagger는 Builder패턴을 사용하여 설정할 수 있도록 바뀌었습니다. 

  레퍼런스를 찾아보며 프레임웍을 구성하다 문득 그런 생각이 들었습니다. Spring Boot를 쓰는 이유가 뭘까? 누군가 제게 Legacy Project와 Boot의 차이를 묻는다면 적절한 대답을 하지 못할 것 같다는 생각이 들었고, 이에 이번 글을 통해 간략하게나마 Legacy Project와 Spirng Boot의 차이점을 정리해보고자 합니다.

 

1. 설정 자동화 (Auto Configuration)

  Boot의 가장 큰 특징은 바로 자동화된 설정을 제공한다는 점입니다. 기존의 Spring Legacy에서는 web.xml 등의 .xml 파일을 사용하여 Front Controller인 DispatcherServlet과 Context-Path를 정의하고, Spring Bean의 Component-Scan 패키지를 하나하나 명시하는 등의 작업이 필요했지만 Spring Boot는 위와 같은 설정들을 자동으로 제공해줍니다. (이 외에도 web mvc와 관련된 설정의 auto-configuration 작업이 이루어지며, 추가적인 설정이 필요한 경우 WebMvcConfigurer 인터페이스를 구현하여 커스텀 메서드를 정의해줄 수 있습니다. - 한 가지 주의할 점은, @EnableWebMvc 를 사용할 경우 Auto-Configuration에서 제공하는 기능이 일부 유실될 수 있으니, 기존의 자동화된 설정에 추가적인 커스터마이징이 필요한 경우 해당 어노테이션은 제외하도록 합니다.)

  부트의 최상위 패키지에 위치해 있는 Application 클래스의 @SpringBootApplication 어노테이션에는 @ComponentScan 어노테이션이 포함되어 있기 때문에 Legacy에서 xml에 하나하나 등록해주던 컴포넌트 스캔 경로를 따로 지정하지 않아도 해당 클래스의 하위 패키지에 @Component 를 등록하기만 하면 자동으로 스캔이 이루어집니다.

 

2. 내장 Servlet-Container 제공

  Boot를 사용하게 되면 Tomcat을 외부에 별도로 설치할 필요 없이 Dependency만 등록해놓으면 자동으로 서버를 띄울 수 있게 되었습니다. 사실 로컬서버를 띄울 때에는 이 부분이 크게 와닿지 않았고, 톰캣을 외부에서 올려놓고 실행하는 것과 무슨 차이가 있는지 가늠하기 어려웠습니다. 내장 Servlet-Container는 서버를 구축할 때 비로소 빛을 발휘하는 것 같습니다. 기존의 Spring-Legacy 프로젝트는 서버를 구성할 때 외장 Tomcat을 설치한 후 war 파일을 배포하여 압축을 풀고 Tomcat 안에 해당 파일을 등록하여 서비스를 하는 방식이었습니다. 위 방식은 jsp 등의 파일도 모두 servlet 형태로 변환하여 war로 압축하기 때문에 무겁고, 실행 시간도 오래걸린다는 단점이 있습니다. 

  하지만 Spring Boot 프로젝트는 Jsp가 아닌 .html 확장자를 사용하는 thymeLeaf를 공식적으로 지원하고 있고, 이를 사용하여 프로젝트를 구성한다면 bootJar 옵션을 통해 jar 파일로 배포하여 서비스를 할 수 있습니다. 이 방식은 war로 배포하는 것에 비해 훨씬 가볍고 내장 톰캣을 사용하기 때문에 외부에 톰캣을 설치하지 않고도 java -jar 옵션으로 즉시 애플리케이션을 실행할 수 있습니다. (물론, 부트에서 권장하는 방식은 아니지만 jsp를 사용하여 mvc패턴을 구성할 경우 war파일로 빌드를 하여 was를 실행해야 합니다.)


3. Dependency 설정 지원

  Spring Boot에서는 Dependency에 대한 자동화된 설정을 지원함으로써 개발자가 의존성에 대한 버전을 명시하지 않더라도 의존성 패키지에 등록된 버전을 자동으로 등록해줌으로써 보다 간편한 설정이 가능하도록 지원하고 있습니다. 더 이상 Legacy Project에서 직면하던 Dependency 간의 버전이 맞지 않아 오류가 나던 문제를 마주하지 않게 된 것입니다.

 

  Spring Boot는 위와 같이 Legacy Project를 보다 개선하여 편리한 기능을 제공함으로써 개발자가 프레임워크나 개발 환경 설정 등의 요소보다는 비즈니스 로직에 집중할 수 있도록 도움을 주고 있습니다. 위에서 언급하지는 않았지만 Boot의 기본 설정 파일인 application.yml 혹은 application.properties 파일을 통해 별도의 java Config 클래스 파일을 만들지 않더라도 Persistence Config나 Context-Path 혹은 Web Mvc와 관련된 prefix, suffix 등의 설정을 할 수 있으며 하나의 application.yml 안에서 spring.config.activate.on-profile 옵션과 --- 구분자를 활용하여 profile 별로 설정을 다르게 적용할 수 있다는 장점이 있습니다. 

'development > spring' 카테고리의 다른 글

JPA 정리본  (0) 2023.09.15
테스트 주도 개발 - TDD란?  (0) 2023.08.01
자주 사용하는 Spring annotation 정리  (2) 2023.06.05
QueryDSL - Introduction / Join / Dynamic Query  (4) 2023.02.15
JPA - JPQL과 QueryDSL 활용  (5) 2023.01.31