Spring

스프링 기본 개념 정리

코리늬 2019. 3. 15. 11:25

스프링 기본 개념 정리

SpringFramework는 웹 프레임 워크가 아니다.

그렇다면?

Java 기반의 프레임워크로 여러 모듈로 구성되어 있는데, 이중 웹 어플리케이션을 만들려고 등장한 것이 SpringMVC 모듈이다.

SpringMVC 사용할 때 Servlet Container와 Spring Container라는 용어를 자주 볼 수 있다.


Servlet Container
  • Servlet 저장소라고 보면 된다.

  • Java로 웹을 개발하기 위해 여러 Servlet 들이 필요하게 되는데, Servlet들의 생명주기, 멀티쓰레드 지원 등을 해주는 것이 Servlet Container다

  • 대표적으로 Tomcat이 해당된다.

  • Spring MVC 역시 Servlet Container가 관리하고 있는 Servlet이다.

    • 만약 Servlet 없이 Spring MVC만 있으면 된다고 하는것은 비즈니스 로직을 Spring을 통해 처리하겠다는 것이지 Servlet이 필요없다는 얘기가 아니다.


Spring MVC로의 모든 요청과 응답은 DispatcherServlet이 관리하고 있다.

URL요청이 오면 이를 가로채 HandlerMapping(=@RequestMapping) 에게 해당 요청을 처리할 수 있는 Controller를 찾아 요청을 Controller에 보내고 결과값을 리턴해준다.


Spring Bean이란 Spring이 관리하는 인스턴스이다.
  • Spring이 제공하는 Container를 통해서 관리되는 인스턴스를 Bean이라고 한다.

  • POJO와 설정(Configuration Metadat)을 Spring이 제공하는 Contnainer(DI Container == IoC Container에) 주입시키면 Bean으로 등록되고 사용이 가능하다.

    • Spring Framework를 사용한다고 본인이 만든 모든 Class들이 Bean으로 자동 등록되는 것은 아니다.

    • 설정은 XML파일이나 어노테이션이라고 보면 된다.

  • Bean은 기본적으로 싱글톤의 scope를 가진다. 즉 Bean으로 지정된 Class는 Container에서 1개의 인스턴스로만 존재 할 수 있다.


POJO (Plain Old Java Object) 란?
  • 어느 곳에도 종속되지 않은 Java Class를 말한다.

  • 종속되지 않는 다는 것은 해당 클래스를 사용하기 위해 다른 프레임워크 같은 외부 환경이 필요하고, 해당 환경이 특정 인터페이스를 구현할 것을 강요하는 것 같은 제약에 자유롭다는 뜻이다.


쉽게말해서, Spring MVC를 걷어내도 POJO는 정상적으로 작동이 되어야 한다.


Spring이 제공하는 대표적인 DI Container는 BeanFactoryApplicationContext가 있다.

BeanFactory는 DI Container의 기본이 되는 인터페이스로써, Bean을 관리하는 역할을 하는 인터페이스다.

ApplicationContext는 BeanFactory를 상속한 인터페이스로 BeanFactory의 기능외에 추가적으로 AOP와 같이 대규모 웹 프로젝트에 필요한 여러 확장기능들을 포함하고 있다.


이로인해 Spring 프로젝트의 대부분은 ApplicationContext를 통해 Bean을 관리한다.


Spring의 Bean을 ApplicationContext가 관리하고 있기 때문에 테스트 코드 작성시 @Service나 @Repository 같은 Bean들을 사용하고 싶을때는 강제로 ApplicatinContext를 생성하면 된다.

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml") 
//applicationContext 생성

FileEventDao fileEventDao = (FileEventDao)ctx.getBean("fileEventDao");
//applicationContext에서 Bean 호출


AOP (Aspect-Oriented Programming) 란?

AOP는 어플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원해준다.

기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을 때 공통된 요소를 추출하자는 것이다. 그래서 크로스 컷팅(Cross-Cutting) 이라고 불리기도 한다.

  • OOP : 비즈니스 로직의 모듈화 => 모듈화의 핵심 단위는 비즈니스 로직

  • AOP : 인프라 혹은 부가기능의 모듈화 => 대표적인 예 : 로깅, 트랜잭션, 보안 등 각각 모듈의 주 목적 외에 필요한 부가적 기능


OOP에서는 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용한다.

하지만 모든 부가기능까지 상속이나 위임으로 처리하기에는 어렵다.

그래서 AOP를 사용한다.

장점

  • 어플리케이션 전체에 흩어진 공통 부가기능이 하나의 장소에서 관리된다는 점

  • 다른 서비스 모듈들이 본인의 목적에만 충실하고 그외 사항들은 신경쓰지 않아도 된다는 점



스프링 컨테이너 (IoC 컨테이너)

스프링 컨테이너란?
  • bean의 생성과 관계 설정, 사용, 생명주기 관리 등을 관장하는 컨테이너


스프링 컨테이너는 경량 컨테이너이다.

  • Java 객체를 담고 있고, 생성 ~ 소멸에 이르는 라이프 사이클을 관리하며 Spring Container로 부터 필요한 객체를 가져와 사용한다.


스프링의 의존성 주입 순서
  1. 어플리케이션의 구성 메타데이터를 읽음

  2. 객체 인스턴스화

  3. 인스턴스 주입


스프링 설정 메타데이터(Spring configuration metadata)
  • 어떤 객체를 인스턴스화, 설정, 구성할 것인지에 대한 정보

  • XML, 자바 어노테이션, 자바 코드로 표현됨


참고

https://jojoldu.tistory.com