SPRING - DI

이상해씨·2022년 10월 17일
0

웹 풀스택(JAVA)

목록 보기
49/54

✔Spring

1. Spring Framework

  • 엔터프라이즈 급 애플리케이션을 만들기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션.
  • JEE(Java Enterprise Edition)가 제공하는 다수의 기능 지원. JEE를 대체하는 Framework로 자리잡고 있음.
  • JEE가 제공하는 기능 뿐 아니라, DI(Dependencty Injection), AOP(Aspect Oriented Programming)과 같은 기능 지원.
  • Programming 및 Configuration Model을 제공해 주는 Framework.
    • Low Levle에 신경 쓰지 않고 Business Logic 개발에 전념할 수 있도록 해줌.

2. Spring 구조.

◾Spring 삼각형

  • Enterprise Application 개발시 복잡함을 해결하는 spring의 핵심.
    • POJO
    • PSA
    • IoC/DI
    • AOP

◾ POJO(Plain Old Java Object)

  • 특정 환경이나 기술에 종속적이지 않은 객체지향 원리에 충실한 자바 객체.
  • 테스트하기 용이. 객체지향 설계를 자유롭게 적용 가능.

◾ PSA(Portable Service Abstraction)

  • 환경과 세부 기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙.
  • 트랜잭션 추상화. OXM 추상화, 데이터 액세스의 Exception 변환 기능... 등 기술적인 복잡함은 추상화를 통해 Low Level의 기술 구현 부분과 기술을 사용하는 인터페이스로 분리.
  • 예) 데이터베이스에 관계없이 동일하게 적용할 수 있는 트랜잭션 처리 방식.

◾ IoC/DI(Dependency Injection)

  • DI는 유연하게 확장 가능한 객체를 만들어 두고 객체 간의 의존관계를 외부에서 다이나믹하게 설정.

◾ AOP(Aspect Oriented Programming)

  • 관심사의 분리를 통해서 소프트웨어의 모듈성 향상.
  • 공통 모듈을 여러 코드에 쉽게 적용 가능.

3. Spring 특징.

◾ 경량 컨테이너

  • 스프링 : 자바 객체를 담고 있는 컨테이너.
  • 자바 객체 생성과 소멸과 같은 라이프 사이클을 관리.
  • 언제나 스프링 컨테이너로부터 필요한 객체를 가져와 사용가능.

◾ DI(Dependency Injection-의존성 지원) 패턴 지원.

  • 설정 ㄹ파일이나, 어노테이션을 통해 객체 간의 의존 관계 설정 가능.
  • 의존한고 있는 객체를 직접 생성하거나 검색할 필요가 없음.

◾ AOP(Aspect Oriented Programming-관점 지향 프로그래밍) 원

  • AOP : 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법.
  • 핵심 관심 사항과 전체에 적용되는 공통관심 사항을 기준으로 프로그래밍 함으로서 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 지원.
  • 자체적으로 프록시 기반의 AOP 지원. 트랜잭션, 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심이 아닌 기능들을 분리하여 각 모듈에 적용 가능.

◾ POJO(Plain Old Java Object) 지원.

  • 특정 인터페이스를 구현하거나 또는 클래스를 상속하지 않는 일반 자바 객체 지원.
  • 스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나, 클래스 상속 없이도 사용 가능.
  • 일반적인 자바 객체를 칭하기 위한 별칭 개념.

◾Ioc(Inversion of Control-제어의 반전)

  • 자바의 객체 생성 및 의존 관계에 있어 모든 제어권은 개발자에게 있음.
  • Servlet과 EJB가 나타나면서 기존의 제어권이 Servlet Container 및 EJB Container에 넘겨짐.
    • 단, 모든 객체의 권한이 넘겨진것이 아니고 Servlet, EJB에 대한 제어권을 제외한 나머지 객체 제어권은 개발자가 담당.
  • 스프링에서도 객체에 대한 생성과 생명 주기를 관리할 수 있는 기능 제공.
    • 이런 이유로 Spring Container또는 IoC Container라고 부름.

◾ 트랜잭션 처리를 위한 일관된 방법 제공.

  • JDBC, JTA 또는 컨테이너가 제공하는 트랜잭션을 사용하든, 설정 파일을 통해 트랜잭션 관련 정보를 입력하기 때문에 트랜잭션 구현에 상관없이 동일한 코드를 여러 환경에서 사용 가능.

◾ 영속성과 관련된 다양한 API 지원.

  • JDBC를 비롯하여 iBatis, MyBatis, Hibernate, JPA 등 DB 처리를 위해 널리 사용되는 라이브러리와 연동 지원.

◾ 다양한 API에 대한 연동 지원.

  • JMS, 메일, 스케쥴링 등 엔터프라이즈 어플리케이션 개발에 필요한 다양한 API를 설정 파일과 어노테이션을 통해 손쉽게 사용 가능.

5. Spring Module


✔IoC & Container

1. IoC(Inversion of Control, 제어의 반전)

◾ IoC

  • IoC/DI
  • 객체 지향 언어에서 Object 간의 연결 관계를 런타임에 결정.
  • 객체 간의 느슨하게 연결됨(loose coupling)
  • IoC의 구현 방법 중 하나가 DI(Dependency Injection)

◾ IoC 유형

  • Dependency Lookup
    • 컨테이너가 lookup context를 통해 필요한 Resource나 Object를 얻는 방식.
    • JNDI 이외의 방법을 사용한다면 JNDI 관련 코드를 오브젝트 내에서 일일이 변경해주어야 함.
    • Lookup 한 Object를 필요한 타입으로 Casting해야함.
    • Naming Exceptiond을 처리하기 위한 로직 필요.
  • Dependency Injection
    • Object에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 Object에 설정할 수 있도록 지정해주는 방식.
    • Object가 컨테이너의 존재 여부를 알 필요가 없음.
    • Lookup 관련된 코드들이 Object 내에서 사라짐.
    • Setter Injection과 Constructor Inject.

2. Container

◾ Container

  • 객체의 생성, 사용, 소멸에 해당하는 라이프사이클 담당.
  • 라이프사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능 제공.

◾ Container 기능

  • 라이프사이클 관리.
  • Dependency 객체 제공.
  • Thread 관리.
  • 기타 애플리케이션 실행에 필요한 환경.

◾ Container 필요성

  • 비즈니스 로직 외에 부가적인 기능들에 대해 독립적으로 관리되도록 하기 위함.
  • 서비스 look up이나 Configuration에 대한 일관성을 위함.
  • 서비스 객체를 사용하기 위해 각각 Factory 또는 Singleton 패턴을 직접 구현하지 않아도 됨.

◾ Container - IoC Container

  • 오브젝트의 생성, 관계설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 독립된 컨테이너가 담당.
  • 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있어 IoC라고 부름.
  • 스프링 컨테이너를 IoC 컨테이너라고 부름.
  • 스프링에서 IoC를 담당하는 컨테이너에는 BeanFactory, ApplicationContext가 있음.

◾ Container - Spring DI Container

  • Spring DI Container가 관리하는 객체를 빈(Bean)이라 하고, 이 빈들은 생명주기를 관리하는 의미로 빈팩토리(BeanFactory)라 한다.
  • Bean Factory에 여러 가지 컨테이너 기능을 추가하여 ApplicationContext라 함.
  • <<interface>> BeanFactory
    • Bean 등록, 생성, 조회, 반환 관리.
    • 일반적으로 BeanFactory보다 이를 확장한 ApplicationContext를 사용.
    • getBean() method가 정의되어 있음.
  • <<interface>> ApplicationContext
    • Bean 등록, 생성, 조회, 반환 관리는 BeanFactory와 동일.
    • Spring의 각종 부가 서비스 추가 제공.

3. IoC 개념.

◾ IoC 개념

  • 객체 제어 방식
    • 기존 : 필요한 위치에서 개발자가 필요한 객체 생성 로직 구현.
    • IoC : 객체 생성을 Container에 위임하여 처리.
  • IoC 사용에 따른 장점 : 객체 간의 결합도를 떨어트릴 수 있음(loose coupling)
    • 결합도가 높으면 유지보수에 클래스와 결합된 다른 클래스도 유지보수 되어야할 가능성이 높음.

◾ 객체 간의 강한 결합

  • 클래스 호출 방식.
  • 클래스내에 선언과 구현이 모두 되어있기 대문에 다양한 형태로 변화 불가능.
  • 다형성을 이용해 느슨한 결합 가능.

◾ 다형성을 이용한 결합도 낮춤.

  • 인터페이스 호출 방식.
  • 구현 클래스 교체 용이. 다양한 형태로 변화 가능.
  • 하지만, 인터페이스 교체 시 호출 클래스도 수정되어야 함.

◾ Factory를 이용한 결합도 낮춤.

  • 팩토리 호출 방식.
  • 팩토리가 구현 클래스를 생성하므로 클래스는 팩토리를 호출.
  • 인터페이스 변경시 팩토리만 수정하면 됨. 호출 클래스에는 영향을 미치지 않음.
  • 하지만, 클래스에 팩토리를 호출하는 소스가 들어가야함. 그것 자체가 팩토리에 의존함을 의미.

◾ Assembler를 통한 경합도 낮춤.

  • IoC 호출 방식.
  • 팩토리 패턴의 장점을 더하여 어떠한 것에도 의존하지 않는 형태.
  • 실행시점(Runtime)에 클래스 간의 관계 형성.
  • 각 Service의 LifeCycle을 관리하는 Assembler 사용.
  • Spring Container가 외부 조립기(Assembler)역할.

✔DI(Dependency Injection)

1. DI

◾ 빈 생성 범위 - 싱글톤(Sigleton Bean)

  • 기본적으로 싱글톤 패턴
  • 새로운 인스턴스를 반환하게 만들고 싶은 경우 scope를 prototype으로 변경.
// java
@scope("singleton")
@scope("prototype")

// xml
<bean id=".." .. scope="prototype"></bean>

◾ 빈 생성 범위 지정

  • singleton : 스프링 컨테이너당 하나의 인스턴스 빈만 생성. (default)
  • prototype : 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성.
  • request : HTTP Request별로 새로운 인스턴스 생성.
  • session : HTTP Session별로 새로운 인스턴스 생성.

◾ 스프링 빈 설정

◾ 스프링 빈 설정 : XML

  • XML 문서 형태로 빈의 설정 메타 정보 기술.
  • 단순하며 사용하기 쉬움.
  • <bean>태그를 통해 세밀한 제어 가능.

◾ 스프링 빈 설정 : Annotation

  • 어플리케이션의 규모가 커지고 빈의 개수가 많아질 경우 XML 파일을 관리하는 것이 번거로움.
  • 빈으로 사용될 클래스에 특별한 annotation을 부여해 자동으로 빈 등록 가능.
  • "오브젝트 빈 스캐너"로 "빈 스캐닝"을 통해 자동 등록.
    • 빈 스캐너는 기본적으로 클래스 이름을 빈의 아이디로 사용.
    • 정확히는 클래스 이름의 첫 글자만 소문자로 바꾼 것을 사용
  • Annotation으로 빈을 설정할 경우 반드시 component-scan 설정.
  • Stereotype annotation
    • 빈 자동등록에 사용할 수 있는 annotation
    • 빈 자동인식을 위한 annotation이 여러가지인 이유
      • 계층별로 빈의 특성이나 종류 구분.
      • AOP Pointcut 표현식을 사용하면 특정 annotation이 달린 클래스만 설정 가능.
      • 특정 계층의 빈에 부가기능 부여.
    • 종류
      • @Repository : Data Access Layer의 DAO 또는 Repository 클래스에 사용. DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해 사용.
      • @Servie : Service Layer의 클래스에 사용.
      • @Controller : Presentation Layer의 MVC Controller에 사용. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정.
      • @component : 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정.

◾ Dependency Injection

  • 객체 간의 의존관계를 자신이 아닌 외부의 조립기가 수행.
  • 제어의 역행(Inversion of Control)이라는 의미로 사용.
  • DI를 통해 시스템에 있는 각 개체를 조정하는 외부 객체가 객체들에게 생성시에 의존관계가 주어짐.
  • 느슨한 결합(loose coupling)의 주요 강점.
    • 객체는 인터페이스에 의한 의존 관계만 알고 있으며, 이 의존 관계는 구현 클래스에 대한 차이를 모르는채 서로 다른 구현으로 대체 가능.

◾ 스프링의 DI 지원

  • Spring Container가 DI 조립기 제공.
    • 스프링 설정 파일을 통하여 객체 간의 의존관계 설정.
    • Spring Container가 제공하는 API를 이용해 객체 사용.
profile
후라이드 치킨

0개의 댓글