본문 바로가기
[ Developer ]/Spring Framework

[Spring] 스프링이란? 스프링 프레임워크 Spring Framework

by 김현섭. 2016. 6. 7.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Spring
  • Spring에선 Interface를 사용하게 끔 만들어져 있다
  • Spring은 new (객체화 시키는 키워드)를 사용하지 않으려는 목적이 있다
    • 의존 관계에 있는 Class 선언 시
    • 의존 관계(캡슐화) 어떠한 Class가 다른 Class를 필요로 할 때
    • ex) BIZ Class는 DAO Class가 필요하다

# Spring 개념
  • EJB를 주 프레임워크로 사용할 때 불편했던 점들을 해소
  • 로드 존슨이 출판한 도서 Expert One-on-One J2EE Design and Development에 선보인 코드가 Sping 근간
  • Java를 사용함에 있어 표준처럼 사용됨

# Spring 특징
  • Java의 객체를 스프링이 직접 관리
  • 객체의 라이프사이클을 스프링이 직접 관리하며 필요한 객체를 얻어옴
  • POJO (Plain Old Java Object) 기반의 프레임워크
    • 순수하게 자바만 쓰인 코드
  • IoC (Inversion Of Control) 지원
    • 소스코드가 스프링을 호출하는 것이 아니라 스프링이 코드를 호출
  • DI (Dependency Injection)을 지원
    • 각 계층이나 서비스간 객체간의 의존성이 존재할 경우 스프링이 직접 서로 연결
    • 약한 결합을 가능케 함
  • AOP (Aspect Oriented Programming)을 지원한다
    • 트랜잭션, 로깅, 보안 등 여러 모듈에서 공통적으로 지원하는 기능을 분리하여 사용
  • 스프링은 확장성이 높다
    • 스프링의 소스는 모두 라이브러리로 분리 시켜 놓음으로써 필요한 라이브러리만 가져다 쓸 수 있다
    • 많은 외부 라이브러리들도 이미 스프링과 연동
  • Model2 방식의 MVC Framework 지원
    • Model2 : Servlet과 JSP를 구분
    • MVC Framework을 배우기 위해서 스프링을 배운다
  • EJB, Struts 등을 제치고 업계 표준으로 자리 잡음
  • 일반 사용자를 위한 웹 기반 어플리케이션 부터 기업환경의 어플리케이션까지 스프링이 활용됨

# Spring의 의존 관계
  • 각각의 모듈이 의존 관계가 있어서
  • 하나의 라이브러리를 사용하기 위해서 다양한 라이브러리가 필요하다
  • 이러한 불편한 점을 해소하기 위해 Maven을 만들었다
  • Maven
    • Spring의 의존 라이브러리를 간편하게 추가할 수 있도록 의존성 주입을 제공
    • 자동으로 의존 라이브러리를 추가해줌으로써 개발자는 단순히 개발만 하면 된다

# Spring DI/IoC (Tips)
  • Java의 Class 상속 / Interface를 이용한 추상화를 기반으로 하는 개발 방법
  • Spring은 DI/IoC를 강력하게 지원하는 프레임워크
  • DI : Dependency Injection
    • 프로그램에 필요한 각종 클래스들을 Bean Container에 두고 필요할 때 마다 불러와서 사용
    • 서블릿에 필요한 Biz가 있다면 Spring이 서블릿에게 Biz를 주는 것이다
    • 기존 방식의 Biz에서 DAO를 연결하는 방식은 결합
    • 내가 필요한 객체를 받아오는 것이 DI (의존성 주입)
  • IoC : Inversion of Control
    • 프로그램을 제어하는 패턴 중 하나
    • DI는 IoC패턴의 구현체 중 하나
    • DI에 따라 프로그램의 흐름이 완전히 변경
    • DI 같은 것들의 개념 제어를 역전 시킨다
    • 기존의 개념
      • 서블릿이 Biz가 필요하다면 new로 Biz를 알고 생성할 수 있어야 한다
      • Biz에 대한 제어는 서블릿이 한다
      • 이 개념의 역전 (만드는 주체를 역전)
    • IoC 개념
      • Spring이 서블릿에 필요한 Biz를 생성해주고 소멸시킨다
  • 스프링은 DI를 기준으로 많은 프레임워크 모듈들이 만들어짐
  • Spring은 DI Framework 혹은 IoC Framework라고 부름

# 의존성
  • 의존도가 높은 경우 (강한 결합)
    • 어떤 Class가 다른 Class를 사용해야 하는지 알고 있는 것
    • new 키워드를 사용한 것
  • 의존도가 낮은 경우 (약한 결합, 느슨한 결합)
    • 어떤 Class가 다른 Class를 사용해야 하는지 모르는 것
  • 의존도를 가르는 것은 Interface
  • new Interface를 사용해야 의존도가 낮다라고 생각한다

# DI의 실세계 예시
  • 핸드폰을 빌리는 경우 누구에게 빌리느냐에 따라서 핸드폰의 기종이 다를 수 있다
  • 어떤 Class가 오던간에 정상적으로 동작이 가능하게 하기 위해서 사용

# 전통적인 POJO 방식
  • DAO를 정의하고 Biz에서 DAO를 생성하여 Biz에서는 DAO Class 내용을 모두 알 고 있다
  • 서블릿에서도 Biz를 생성해서 Biz 메소드를 사용한다
  • 이때 Biz는 인터페이스가 아니라 클래스이다 즉 다형성을 포기한 형태
  • 이러한 방식은 수정 및 확장에 불리한 구조
  • 안좋은 구조의 코드

# Interface를 활용한 POJO 방식
  • Interface로 DAO와 Biz애서 메소드를 정의해준다
  • DAOImpl 이라는 클래스에서 dao를 implements 한 후 Override를 시켜준다
  • Main에서도 new를 이용해서 인터페이스를 선언한다
  • 하지만 new를 사용해서 BizImpl와 강한 결합이기 때문에 좋은 코드는 아니다

# Interface와 Factory를 활용한 POJO 방식
  • 사용하는 곳에서는 new를 사용하지 않기 위한 개념
  • Factory는 public static으로 Biz를 받아 BizImpl로 리턴해주는 방식을 사용한다
  • 그리고 Main에서 Factory의 메소드를 사용함으로써 new를 사용하지 않는다
  • Factory (완성된 객체를 만드는 공간)
  • 엔진을 만드는 공장에서 만들어진 엔진은 엔진을 만드는 곳에서만 알 수 있다
  • 다음 부분을 연결시키는 공장에서는 완성된 엔진을 이용하지만 어떠한 모양인지 알 수 없다
  • Main과 BizImpl간의 관계는 끊어졌지만 Biz와 DAO의 관계는 강한 결합이 유지된다

# Interface와 Factory를 활용한 POJO 방식 2
  • get과 set을 이용한다
  • Factory에서 할일이 많아진다
  • Setter에서 필요한 DAO를 만들어서 보내준다

# Spring DI의 원리
  • Main
    • Biz가 어떠한 내용인지 모른다
  • BizImpl
    • DAO가 어떠한 내용인지 모른다
  • DAOImpl
  • Factory
    • Factory가 모두 생성해서 보내기 때문에 서로는 모르지만 Factory는 알 고 있다
    • Main이 생성할 권리는 Factory가 가져와서 생성을 한다
  • Spring은 결론적으로 Factory에서도 new 키워드를 지우고자 한다

# Spring DI를 활용한 의존성 주입 - Setter를 이용한 DI
  • xml을 이용해서 객체를 생성한다
  • 객체를 Interface 모양으로 선언이 가능하고 요소들도 정의할 수 있다