tuter77

Spring: spring, spring boot 비교(2) 본문

SpringStudy

Spring: spring, spring boot 비교(2)

tuter77 2023. 1. 29. 19:28

그룹스터디 과제로 spring과 spring부트를 공부했는데 해당 내용을 좀더 덧붙이려고한다.

●개념부터 정리하자면 스프링, 스프링 부트는 모두 객체지향적 프로그래밍 언어인 자바로 만들어진 프레임 워크이며, 자바가 웹서버에서 구동하기가 워낙 사용하기 불편했던 탓에 만들어진 것이라고 한다.(자바의 겨울이지나 봄이왔다고 해서 스프링이라고 지었다고 한다.)

 

스프링은 자바를 이용해 어플리케이션을 만들려고 활용하는 여러 툴이 활용된 프레임워크, 스프링 부트는 스프링을 모두 비슷하게 활용하자 더 편리하게 사용하려고 만든 상위 프레임 워크다.(사용자에게 가까운)

비유하자면 스프링은 스틱기어고, 스프링부트는 오토기어쯤 된다고 한다.

 

스프링에서 웹 서버와 소통하기 위해선 아파치 서버, 톰캣등의 웹 어플리케이션이 필요했는데 이 톰캣 세팅이 워낙 어렵다보니 스프링 부트에서는 톰캣을 자동으로 설정해주게끔 서버에 내장을 해버렸다.

때문에 컴퓨터 부팅하는 것과 같다고 해서 스프링 부트로 이름을 지었다고 한다.

핵심기능으로는 DI(Dependency Injection), Ioc(Inversion of Contorol), AOP(Aspect Oriented Programming) 등 이 있다. 

각 기능들은 스프링, 스프링 부트의 장점으로 이어진다.

 

●스프링의 장점은 다양하게 있다. 

먼저 모든 기능에서 다양한 모듈을 사용가능한 자유도를 자랑한다.(심지어 외부 모듈까지 가능하다고 한다.)

계속해서 개발중이며, 이전 버전들과 높은 호환성을 가졌다.

또한 API디자인을 섬세하게 하려고 노력해, 스프링 오픈소스 자체가 좋은 참고가 된다.

앞서 말한것의 파생으로 높은 코드 품질을 유지하려한다. 
오픈소스를 통해 기능개선을 꾀하면서 스프링 창시자인 로드 존슨을 주축으로 한 스프링소스가 스프링 개발의 주축을 맡음으로서 안정성까지 잡고 있다. 

이어 핵심기능으로 살펴보면, 

● DI는 객체간의 의존성을 느슨하게 하는 것인데, 변경에 의해 영향을 받는 관계가 Dependency, 여기서 의존하는 객체 사이에 의존 객체를 넣어 의존성을 해소해주는 것이다. 
간단한 예시로 보겠다.
A, B 두 객체가 있다면, 
B = A + 1처럼 B가 A에 의존성을 가지는 경우에 
A, A2, B로 
A2 = A 
B = A2 + 1 과 같은 형태로 의존성을 해소해주는 역할을 한다. 
이를 통해 코드의 재사용성이 증가하고, 단위 테스트가 용이해진다.

이러한 DI를 통해 클래스를 작성했더라도 그 객체를 main 메서드에서 주입하는 것보다 의존 객체를 주입하기위한 클래스를 따로 작성하는 것이 효율적인 관리가 된다. 

이 때 의존 객체를 주입하기 위한 클래스를 Assembler(조립기)라고 한다.

● IoC는 Bean, Servlet 같은 코드를 개발자가 아닌 프레임 워크가 대신 수행하는 기능을 의미한다. 

첨하자면 기존에는 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만, 프레임워크가 대신해준다는 의미.

● AOP는 핵심기능을 제외한 부수적인 기능을 프레임워크가 제공하는 특징이다.

AOP는 Filter, Interceptor 와 함께 공통적으로 처리해야할 업무들을 따로 빼서 관리할 수 있도록 해주는 기능을 가졌다. 

공통적으로 처리해야할 일들은 로그인 관련처리, 권한체크, XSS방어, pc와 모바일웹의 분기처리, 로그, 페이지 인코딩 변환 등이 있다.

위 세가지 기능은 무슨 행동을 하기전에 먼저 실행 혹은 실행한 후 추가적인 행동을 할 때 사용된다.

차이점을 알아보자면, Interceptor와 Filter는 Servlet 단위에서 실행되는 반면, AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다. 

따라서 요청이 들어오면 Filter > Interceptor > AOP > Interceptor > Filter 순으로 거치게 된다.

Filter는 요청과 응답을 거른뒤 정제하는 역할을 한다. 서블릿 이전에 필터가 동작하도록 지원된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환처리, xss방어 등의 요청에 대한 처리로 사용된다.

Interceptor는 요청에 대한 작업 전 후로 끼어들어 스프링 컨텍스트 내부에서 컨트롤러에 관한 요청과 응답에 대해 처리한다.
스프링의 모든 빈 객체에 접근할 수 있고, 여러개의 인터셉터를 사용할 수도 있다.
기능은 로그인 체크, 권한체크, 프로그램 실행시간 계산작업, 로그확인 등이다.

AOP는 OOP를 보완하기 위한 개념으로 중복을 줄일 수 없는 부분을 줄이기 위해, 종단면 관점(Aspect)에서 바라보고 처리한다.

주로 로깅, 트랜잭션, 에러처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.

AOP는 인터셉터 필터와 달리 메소드 전후의 지점에 자유롭게 설정이 가능하고, 인터셉터/필터는 주소로 대상을 구분해서 걸러내야하는 반면, 주소/파라미터/애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

서블릿 종료 시 destroy가 실행된다
또한 중복되는 코드를 제거해주는 기능도 있다.
 

반면, 단점은 장점들에서 찾을 수 있다. 

높은 자유도 때문에 좋은 툴을 선택하기 힘든 상황이 발생한다.

이전 버전과의 높은 호환성은 레거시(낡은 기술)가 많이 남아있다는 말과 같은데, 이는 코드의 복잡성이 높아지기도 한다.

 

스프링 부트는 스프링의 장점을 다 가지면서 단점을 최소화 하기 위해 내놓은 서브 프로젝트라고 한다. 

때문에 스프링 부트의 장점은 스프링과 겹치고, 스프링과의 차이점이기도 하다.

 
●스프링 스프링부트 차이점

첫번째로 dependency(의존성) 설정과 버전관리가 수월해졌다고 한다. 

스프링에서는 dependency를 추가하기위해 긴 설정을 거쳐야하는데, 스프링 부트에서는 버전관리를 자동으로 해준다. 

구체적으로 기존 spring은 bean.xml 설정파일을 통해 일일히 Bean을 지정하는 방식이라면, spring boot는 @Configuration, @ComponentScan 등의 어노테이션 방식으로 Bean을 등록해서 더 편리하게 사용하는 것이다.

다른 예로 들면, Gradle 빌드 툴을 사용하는 경우 build.gradle파일에 dependency를 추가해주면, 모든 dependency를 자동으로 추가하고 관리해주는 것도 있다.
 


두번째로 스프링의 어려운 모든 어노테이션(주석) 및 빈 등록 등의 설정을 다 해야한다는 단점을 개선해 자동 Configuration이 있다. 

@SpringBootApplication 이라는 어노테이션 덕에 많은 외부 라이브러리, 내장된 WAS 중 톰캣 서버등이 실행될 수 있다고 한다. 

이 어노테이션은 @ComponentScan을 통해 Component가 붙은 Class를 Bean으로 자동 등록해주는 기능이 있다. 


(※Bean은 자료를 저장하는 객체로서, 스프링 Bean은 자바 Bean과 다르게 New Object로 생성하는게 아닌 Class를 생성하면 컨테이너인 ApplicationContext 인터페이스에 의해 등록되는 형태다. 

이 과정에서 스프링 설정값이 씌워진다고 함. 

참고로 ApplicationContext 안에 앞서 나온 어노테이션들 @ComponentScan등이 포함되어 있다.)

 

세번째로 배포가 편리하다. 

스프링으로 개발한 애플리케이션은 war파일을 WAS(Wep Application Server)에 담아 배포했는데, 스프링 부트에선 내장된 WAS(Tomcat, Jetty, Undertow, Netty)가 있기때문에 jar파일로 따로 설정을 하지않고도 간편히 배포할 수 있다고 한다.

위 내용은 2022.12.20에 공부한 내용입니다.

링크 : https://dudwls3278.tistory.com/17