본문 바로가기

SpringFramework/Spring

Spring - 스프링 프레임워크 기본개념 정리

1] 개요

  • Spring FrameWork는 EJB(Enterprise Java Bean)를 주 프레임워크로 사용할 때 불편했던 부분을 해소 (EJB가 너무 스펙이 좋지않아서..)
  • 2003년 6월 Apache 2.0 License로 공개가 되었다

    = 장점
        1] 생산성
        => 스프링은 개발자가 이론적으로는 알아야 하는 부분이 많지만, 결과적으로 작성하는 코드의 양은 줄어든다.
        2] 품질보증
        => 프레임워크는 개발에 필요한 구조가 절반정도는 만들어져 있기 때문에, 필요한 부분만 조립하는 형태로 개발이 가능하다. 프레임워크를 사용하면 회사 입장에서는 일정한 품질이 보장되는 결과를 얻을 수 있다.
        3] 유지보수
        => 코드의 의존관계가 명시되지 않으므로 결합도가 낮아지기 때문에 유지보수가 편리해진다.

= 스프링 프레임워크의 구조

        2] 특징

    1] 경량 컨테이너로써 자바 객체를 직접 관리
    => 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

    2] POJO(Plain Old Java Object) 방식의 프레임워크
    (https://ko.wikipedia.org/wiki/Plain_Old_Java_Object)

    3] 제어의 역전[IOC(Inversion Of Control)]을 지원
    => 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출

    4] DI(Dependency Injection)을 지원
    => 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.

    5] AOP(Aspect-Oriented Programming)
    => 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리가능

    6] 영속성(Persistence)과 관련된 다양한 서비스를 지원
    => iBatis나 Hibernate등 이미 완성도가 높은 DB처리 라이브러리와 연결할 수 있는 인터페이스를 제공.

    7] 스프링은 확장성이 높음
    => 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기에 용이하다.

3] DI(Dependency Injection) - 의존 주입

    => 설명 : 밖에서 주입

    = 프로그래머는.. 1) 부품을 만든다(클래스 구현) / 2) 부품 조립 명세서를 정의한다(생성자 주입 방식)
    = 스프링 프레임워크는.. 1) 부품을 조립한다 (자동 DI) / 2] 쓸 줄 아는 "제품"은 알아서 사용한다. (ex) URL - Controller Mapping)

   

      => 명세서에 따라 자동으로 부품을 조립하는 것과 비슷하다.

    DI 문법 3가지

    1] 생성자 주입 방식 (권장)

  • Unit Test(단위 테스트)가 쉽다.
  • final 선언이 가능
  • 순환 의존성이 발생한 경우에 대응(BeanCurrentlyCreationException 발생)
  • 단일 책임 원칙을 더 잘 지키게 함 (생성자의 파라미터가 많아지면 위험신호이고, 리펙토링 할 필요성이 발견 됨)

    2] setter 주입 방식

  • 권장하지 않음...!

    3] 필드 주입 방식

  • 코드가 간결함
    => 장점으로 볼 수 있음.
  • Unit Test(단위 테스트)가 어렵다.
  • final 선언이 불가능
  • 순환 의존성이 발생한 경우 Detect 불가능.
    => (A→B, B→A)

4] Ioc(Inversion of Control) - 제어의 역전

= 개념
: 개발자가 제어하던 프로그램의 흐름을 컨테이너가 제어

  • 스프링 Bean 이란?
    • 스프링이 관리하는 독립적인 단위로서의 객체(Object)
    • 일반 자바 Object와 다른 것이 없고, 그냥 스프링이 관리하고 있음
    • 작업을 할 수 있는 Object이고, 이 Object는 스프링이 관리하면서 언제든 DI를 할 수 있다.
  • 스프링 Bean의 Scope
    • Singleton(디폴트) : 스프링 컨테이너에 단 하나만 존재하며, DI(주입)시 같은 Object가 사용
    • Prototype : 다수의 객체가 존재. DI(주입)시 매번 다른 Object가 생성
    • Request : 한 HTTP Request동안 단 하나만 존재
    • Session : 한 HTTP Session동안 단 하나만 존재
  • 스프링 Bean 생성 문법 (Annotation)
    • @Bean
      => 외부 라이브러리에서 정의한 클래스를 스프링 Bean으로 등록할 때
    • @Component
      => 개발자가 직접 작성한 Class를 스프링 Bean으로 등록할 때
    • @Controller
      => (=@Component) / Presentation Layer의 의미)
    • @Service
      => (=@Component) / Business Layer의 의미)
    • @Repository
      => (=@Component) / Persistence Layer의 의미)

              결론 : @Component와 같은 기능역할이지만, 어노테이션명을 의미상으로 나누었다.

5] AOP (Aspect Oriented Programming)

  • 하나의 디자인 패턴이다..
  • 공통 기능을 정의한다
  • 99.9% Proxy AOP이다
    • 공통관심사항(cross-cutting concern)
      => 공통기능으로 어플리케이션 전반에 걸쳐 필요한 기능
      (ex) 로그, 트랙잭션, 보안 관련 코드 등)
    • 핵심관심사항(core concern)
      =>  핵심로직, 핵심 비즈니스 로직
  • AOP 프레임워크
    => AOP에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접 (호출하기 귀찮아서 만들어졌다는..?)
    => AOP에서는 분리한 공통 기능의 호출까지도 관점으로 다룬다. 그리고 이러한 각 모듈을 산재한 관점을 횡단 관점이라 부르고 있다.
    => AOP에서는 이러한 횡단 관점까지 분리함으로써 각 모듈로부터 관점에 관한 코드를 완전히 제거하는 것을 목표로한다!

  • Weaving 방식

    1] 컴파일 시 Weaving
    (ex. AspectJ)

    2] 클래스 로딩시 Weaving (JVM이 Class를 로딩할 때)
    (ex. AspectWerkz)

    3] 런타임시 Weaving (프록시를 이용하여 AOP를 지원 - 코드나 바이너리 파일의 변경이 없음)

    (ex. Spring AOP)

= 공통 기능호출하는 코드가 포함되는 경우

  • 스프링에서의 AOP
    => 스프링에서는 자체적으로 런타임시에 Weaving하는 Proxy기반의 AOP를 지원. 따라서 스프링 AOP는 외부에서 메소드 호출 시에만 적용이 가능.
    (클래스내의 메소드에서 다른 내부의 메소드를 호출할때는 동작하지 않음)
    => spring-boot-starter-aop 라이브러리를 사용하면 쉽게 AOP구현 가능하다.
    => 참고자료
          (https://jeong-pro.tistory.com/171)

6] 스프링 MVC

: Spring 프레임워크에서 제공하는 웹 모듈이다.

  • Model(모델) : 데이터를 처리하는 부분
  • View(뷰) : 화면을 담당하는 부분
  • Controller(컨트롤러) :  요청을 처리하는 부분으로 뷰와 모델사이의 통신 역할

= Spring MVC의 흐름

    클라이언트(웹브라우저) -> 요청 전송 -> DispatcherServlet -> HandlerMapping (요청 URL과 매칭되는 컨트롤러 검색) -> HandlerAdapter (처리 요청) -> Controller -> DispatcherSevlet -> ViewResolver (컨트롤러의 실행 결과를 보여줄 View 탐색) -> View -> 응답

 

= 스프링 MVC Controller의 특징

1] 파라미터 수집

  • 사용자의 요청에 필요한 데이터를 추출하고 VO(DB의 레코드와 상응되는 클래스) 나 DTO(컨트롤러, 뷰, 비즈니스등의 계층간 데이터 교환을 위한 자바빈즈)로 변환하는 파라미터의 수집 작업을 진행.

2] 애노테이션을 통한 간편 설정

  • 스프링 MVC 설정은 MVC나 애노테이션을 사용가능하고, 주로 애노테이션을 이용하여 클래스나 메소드의 선언에 필요한 애노테이션을 추가하는 작업을 통해 요청이나 응답에 필요한 모든 처리를 진행.

3] 테스트의 편리

  • WAS의 실행없이도 테스트할 수 있는 편리한 방법을 제공

7] Spring Boot 간단 소개

    = 스프링 응용프로그램을 독립적으로 작성, 빌드, 실행 수 있으며 Embeded Tomcat, jetty의 사용이 가능하므로, WAR 파일로 빌드해서 배포할 필요가 없다

    = Tomcat이나 Jetty가 내장되어 프로젝트를 .jar 파일 형태로 간단히 배포할 수 있다.

    = 복잡한 xml 설정을 간소화하여 어노테이션 기반의 java config로 교체하여 쉬운 서버 설정이 가능

    = 빠른 웹 프로젝트 생성가능

    = 2014년 4월 1.0 Ver 최초 release