jhhan의 블로그

Spring 주요 개념에 대해 본문

Spring

Spring 주요 개념에 대해

jhhan000 2020. 2. 24. 17:18

Spring의 주요개념에 대해 알아볼 것이다.

근데 지금 당장 올리기는 어려울 것 같다.

조만간 글을 수정해서 올릴 것이다.

 

*주요 개념에 대해서만 설명하는 글이어서 예제를 담지 않기로 했습니다. 나중에 추가할 수도 있습니다.

 

먼저 Spring의 장점에 대해 말해보겠습니다.

Spring 장점

  1. Java파일의 수정없이 xml만 수정하면 됩니다.
  2. 따라서 유지보수가 수월합니다.
  3. 대규모 프로젝트에서 유용합니다.
  4. 트랜잭션을 지원합니다.(xml과 애너테이션을 제공)
  5. DI를 통해 결합도를 낮춰줍니다.

 

1.IoC(Inversion of Control)

  • '제어의 역전' 이라고 번역할 수 있습니다.
  • 자바에서는 객체의 생성을 개발자가 담당합니다.
  • 반면 스프링에서는 객체의 생성을 개발자가 담당하는 대신 스프링이 관리합니다.
  • 개발자가 주도하던 프로그램 Flow가 프레임워크가 주도하는 것으로 바뀌었습니다.
  • 특징 4가지
    • 개발자에서 object를 생성하는 제어 흐름을 뒤집는다.
    • IoC에서는 object가 자신이 사용될 object를 생성하거나 선택하지 않는다.
    • 모든 object는 자신이 어떻게 생성되고 어떻게 사용되는지 관심이 없습니다.
    • 모든 Object는 제어 권한을 가진 특별한 object에 의해 만들어지고 사용된다.

2.IoC컨테이너

  • 모든 작업을 사용하는 쪽에서 제어합니다. 즉 IoC컨테이너가 제어합니다.
  • 기본적으로 객체(Bean이라고 함)를 생성하고 객체간의 의존성을 이어줍니다.
  • 다시 말하면 Bean을 만들고 엮어주고 제공합니다.
  • BeanFactory와 ApplicationContext를 사용하는데,
  • ApplicationContext가 BeanFactory를 상속받아 확장성이 높기 때문에 ApplicationContext를 사용하는 것을 권장합니다.
  • BeanFactory는 특별한 경우에만 사용합니다.

3. Bean

  • Spring에서 객체를 뜻하는 말입니다.
  • Spring IoC컨테이너가 관리하는 객체입니다.
  • ApplicationContext가 만들어서 그 안에 담고 있는 객체입니다.
  • Bean으로 등록하기
    • Componet Scanning
      • @Component
        1. @Repository
        2. @Service
        3. @Controller
        4. @Configuration
    • @Bean으로 직접 등록할 수도 있습니다.
    • 특정 인터페이스의 경우 애너테이션이 없어도 Bean으로 등록하는 것이 가능합니다.
  • 등록한 Bean을 꺼내쓰기
    • @AutoWired 사용
    • ApplicationContext에서 꺼내쓰기
    • 보통 @AutoWired를 많이 쓴다.

4. DI(Dependency Injection)

  • 직역하면 '의존성 주입'이라는 뜻입니다.
  • 객체를 직접 생성하지 않고 외부에서 생성된 객체를 주입시킵니다.
  • 크게 3가지 방법이 있습니다.
    • 생성자
    • Setter
    • 필드 : @AutoWired를 사용

Setter Injection
@AutoWired와 필드를 이용한 Injection

  • 스프링에서는 생성자 사용을 권장합니다.
  • 필수적으로 사용해야 하는 레퍼런스 없이 인스턴스를 만들지 못하게 강제할 수 있기 때문입니다.

생성자 Injection

  • 다음과 같은 코드에서 OwnerController의 생성자인 것을 알 수 있습니다. 그리고 그에 대해 OwnerRepository와 VisitRepository가 없으면 OwnerController는 동작할 수 없다는 것을 알 수 있습니다.
  • 따라서 OwnerController입장에서 OwnerRepository, VisitRepository는 반드시 필요한 객체입니다.
  • OwnerRepository, VisitRepository가 있어야만 OwnerController의 객체를 만들 수 있기 때문에 코드가 안전한 편이라고 할 수 있습니다.

5.AOP(Aspect Oriented Programming)

  • 번역을 하면 '관점지향 프로그래밍'이라고 할 수 있습니다.
  • 응집도와 관련이 있습니다.
  • 핵심관심과 횡단 관심으로 구분합니다.
    • 핵심 관심 : 비즈니스 로직
    • 횡단 관심 : 메소드마다 공통으로 등장하는 코드
  • 여기서 우리는 횡단 관심에 초점을 맞춥니다.
  • 핵심 기능 이외에 부가기능을 모듈화하여 재사용합니다.
  • 이 때 부가기능을 Aspect라고 합니다.
  • AOP 구현 방법
    • 컴파일 : AspectJ
    • 바이트코드 조작 : AspectJ
    • 프록시 패턴 : Spring AOP가 사용하는 방법

6. PSA(Portable Service Abstraction)

  • 교체가 용이한 서비스를 추상화 한 것입니다.
  • PSA 적용시 확정성이 좋아지고 테스트하기 편해집니다.
  • Spring이 제공하는 API는 대부분 PSA입니다.
  • 예시
    • Spring Transaction
      • 트랜잭션 처리를 독립적으로 처리하기 위한 추상화 기법
      • Aspect를 통해 처리
    • Spring Web MVC
    • Cache
  • 사실 PSA와 관련해서는 설명을 하기가 힘든 부분이 있습니다.
  • PSA에 대해서는 다른 블로그들이 정리를 잘 해놨으니 참고하시면 될 것 같습니다.

'Spring' 카테고리의 다른 글

Spring_Security 응용 - 로그인 페이지 만들기(1)  (0) 2020.03.03
Spring - Error_Page  (0) 2020.03.03
Spring_JPA  (0) 2020.02.27
Spring ThymeLeaf(타임리프)(2)  (1) 2020.02.27
Spring ThymeLeaf(타임리프)(1)  (0) 2020.02.25