개발자가 직접 설정 파일을 작성하여 스프링 컨테이너 구성 / 빈 객체 등록 / 빈 객체 간 의존성 설정해야함
SpringBoot
스프링 프레임워크를 보다 쉽게 사용할 수 있도록 만든 프레임워크
개발자가 설정 파일을 작성할 필요 없이, 프로젝트의 설정과 라이브러리 의존성을 자동으로 처리해주는 기능을 제공
JAR 파일을 만들수 있음
내장형 서버를 제공
스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에서 배포
스프링 부트는 WAS를 자체적으로 가지고 있기 때문에 jar파일만 만들면 WAS를 설정하지 않아도 애플리케이션 실행이 가능!
Spring IoC와 DI
IoC
Inversion of Control의 줄임말로 제어의 역전을 의미한다.
# 클래스A 안에서 클래스B 객체를 생성하는 예시publicclassA{ b = newB();}# 스프링 컨테이너가 객체를 관리하는 방식publicclassA{privateBb;}
즉 클래스 A안에서 클래스 B 객체를 직접 생성하는 것이 아니고, 외부에서 받아오는 방식
외부 == 객체를 관리하는 주체 == 스프링 컨테이너
DI
Dependency Injection의 줄임말로 의존성 주입을 의미한다. 이는 제어의 역전을 구현하기 위해 사용하는 방법이다.
publicclassA{ @AutowiredBb;}
@Autowired = 스프링 컨테이너에 있는 빈을 주입하는 역할
Spring AOP와 PSA
AOP
Aspect Oriented Programming의 줄임말
관점 지향 프로그래밍
프로그래밍에 대한 관심을 핵심 관점, 부가 관점 으로 나누어 모듈화 하는 것
부가 관점 로직을 모듈화 하여 핵심 관점 코드에서 분리 ⇒ 프로그램의 변경과 확장에 유연하게 대응할 수 있게된다.
PSA
Portable Service Abstraction의 줄임말
이식 가능한 서비스 추상화
스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스
예시
스프링에서 DB에 접근하는 기술(JPA, MyBatis, JDBC) 중 어느 것을 사용하더라도 일관된 방식으로 DB에 접근하도록 인터페이스를 지원
코드 변경 없이 WAS를 톰캣이 아닌 언더토우, 네티에서 실행해도 기존 코드 사용이 가능
Spring과 SpringBoot의 차이점
Bean을 사용할 때 기존 Spring에서는 xml 파일에 따로 명시를 해두어야 했지만 SpringBoot에서는 어노테이션 @Bean 등을 이용해 Bean을 손쉽게 사용할 수 있다.
<!-- applicationContext.xml --><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 빈 정의 --><beanid="myService"class="com.example.MyService"/><!-- 의존성 설정 --><beanid="myController"class="com.example.MyController"><propertyname="myService"ref="myService"/></bean></beans>
#XML이 아닌 자바 설정에서 @Bean 사용하는 방법@ConfigurationpublicclassAppConfig { @BeanpublicMyServicemyService() {returnnewMyServiceImpl(); } @BeanpublicMyControllermyController() {MyControllercontroller = newMyController();controller.setMyService(myService());return controller; }}
기존 Spring에서는 스프링과 연관된 대부분의 설정을 직접 작성해야 했지만, SpringBoot에서는 application.properties 나 application.yml 을 통해 간단한 설정만 추가하고 대부분의 설정을 스프링에서 자동으로 제공한다.
#대부분의 설정이 자동으로 제공되기 때문에 설정파일을 따로 작성할 필요 X#필요할 경우에만 application.properties 나 application.yml을 통해 간단한 설정만 추가#@SpringBootApplication 어노테이션이 붙은 클래스에서 자동으로 스캔하고, 필요한 빈을 자동으로 등록@SpringBootApplicationpublicclassMySpringBootApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(MySpringBootApplication.class, args); }}
@ServicepublicclassMyService {// Service logic}@ControllerpublicclassMyController {privatefinalMyServicemyService;// 의존성 자동 주입 @AutowiredpublicMyController(MyServicemyService) {this.myService = myService; }}
MVC 패턴
장고에서는 MTV 패턴을 사용했다면, 스프링에서는 MVC 패턴을 사용한다.
Model
클라이언트의 요청 사항을 처리하기 위한 작업의 처리 결과 데이터
View
Model을 이용하여 웹 브라우저와 같은 애플리케이션의 화면에 보이는 리소스를 제공하는 역할
Spring MVC의 View 기술
HTML 페이지 출력
PDF, Excel 등의 문서 형태로 출력
XML, JSON등 특정 형식의 포맷으로 전환
Controller
클라이언트의 요청을 직접적으로 전달받는 엔드포인트
Model과 View 사이의 상호작용 역할
클라이언트의 요청을 받아 비즈니스 로직을 거친 후 Model 데이터가 만들어지면, 이 데이터를 View로 전달하는 역할
Spring MVC 패턴의 전체 흐름
image.png
DispatcherServlet
클라이언트의 요청을 전달받음
controller에게 클라이언트의 요청을 전달
controller 리턴한 결과값을 view에 전달하여 알맞은 응답을 생성
controller의 controller이기 때문에 front controller라고 불리기도함
HandlerMapping
클라이언트의 요청 URL 을 어떤 컨트롤러가 처리할지 결정하는 기능
Controller
클라이언트의 요청을 처리한 뒤, 결과를 리턴
응답 결과에서 보여줄 데이터를 Model 에 담아 전달
컨트롤러에서 나오는 Model은 HandlerAdpater 에 의해 ModelAndView 로 변환됨
ModelAndView
Controller 에서 처리한 결과 정보 및 View 선택에 필요한 정보를 담음
ViewResolver
Model and View 를 전달받은 DispatcherServlet ****은 실제 클라언트에게 보여질 View 를 렌더링하기 위해 어떤 View객체를 사용할지 결정하기 위해 ViewResolver 를 호출
View
ViewResolver 에 의해 View 객체가 결정되고 해당 객체를 통해 View 를 렌더링
후기
이번 세션에서는 Spring과 SpringBoot에 대한 설명 및 차이점, MVC 패턴과 그 흐름에 대해서 배울 수 있었다.
MVC 패턴은 알고 있었지만 스프링 내부에서 MVC 패턴을 따라 어떤 식으로 동작하는지는 정확히 알지 못했는데, 이번 세션에서 확실히 이해할 수 있었다고 생각한다.
이전에 스프링 부트를 공부할 때는 이런 설명들을 들어도 이해가 안되서 대충 넘겨버렸었던 기억이 있는데, 그 후 스프링 부트로 여러 프로젝트를 직접 해보고 이번 세션으로 다시 복습해보니 이전에는 몰랐던 내용이 보이고 이해되는 느낌을 받았다. 지금까지 스프링으로 만들었던 백엔드 시스템이 내부적으로는 이런 방식으로 작동되고 있었음을 알고 나니 감회가 새로웠다.