Spring 스프링 프레임워크 기초 - 01

Jakezo·2021년 6월 28일
0

Spring

목록 보기
1/7

01: 스프링 프레임워크란?

스프링 프레임워크(Spring Framework)는 자바 기반의 오픈소스 프레임워크로 자바 EE(Enterprise Edition)에서 요구하는 수준의 복잡한 기능들을 자바 EE를 사용하지 않고 구현하고자 시작되었습니다.

2002년 Rod Johnson이 자신의 저서 “Expert One-on-One J2EE Design and Developement”에서 제시한 코드와 아이디어를 발전시켜 오늘에 이르게 되었습니다.

스프링 프레임워크 주요 특징

스프링 프레임워크에 사용된 주요 특징은 다음과 같습니다.

  • 경량 컨테이너로서 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링 컨테이너로부터 필요한 객체를 얻어올 수 있다.
  • 제어의 역행(IoC : Inversion of Control)을 지원한다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  • 의존성 주입(DI : Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
  • 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

02: IoC, DI, AOP

스프링 프레임워크의 특징이며 스프링 프레임워크의 구조를 이해하기 위해 반드시 알아야 하는 세가지 중요 개념입니다.

IoC(Inversion of Control)

제어의 역행 이라고도 하며 기존의 프로그램은 main() 과 같이 프로그램이 시작되는 곳에서 필요한 객체를 생성하고 생성된 객체의 메서드를 호출하는 등의 흐름을 가지는것과 달리 IoC는 객체가 자신이 사용할 객체를 직접 생성하거나 선택하지 않는 것으로 프로그램의 제어를 자신이 아닌 다른곳에 위임하는 것을 말합니다.

  • 작업을 수행하는 쪽에서 객체를 생성하는 일반적인 개념을 뒤집은것.
  • IoC에서는 객체가 자신이 사용할 객체를 생성하거나 선택하지 않음.
  • 객체는 자신이 어떻게 생성되고 어떻게 사용되는지 알 수 없음.
  • 모든 객체는 제어권한을 위임 받은 특별한 객체(컨테이너)에 의해 만들어지고 사용됨.
    스프링의 경우 스프링 컨테이너 라는 곳에서 객체를 생성하고 공급하는 역할을 담당 합니다. 스프링 빈(Spring Bean)은 스프링컨테이너에 의해 관리되는 스프링 객체를 말하는 것으로 예전에는 XML 기반의 설정 파일을 통해 객체와 관계를 정의 했으나 지금은 애너테이션을 통해 관련 설정을 하게 됩니다.

DI(Dependency Injection)

IoC 를 구현하는 방법으로 DL(Dependency Lookup)과 DI가 있습니다. DL은 저장소에 저장되어 있는 Bean에 접근하기 위해 개발자들이 컨테이너에서 제공하는 API를 이용하 Bean을 찾는 방식입니다. 당연히 컨테이너에 대한 의존성이 커지고 불필요한 코드 사용이 증가하므로 의존성 주입 으로도 불리우는 DI 방식을 사용합니다.

DI는 클래스간의 의존관계를 Bean 설정에 기반해 컨테이너가 자동으로 연결해 주는 방식입니다. 스프링프레임워크에서는 기본적으로 DI 방식을 사용 합니다.

다음의 여러 구현방법을 통해 DI개념과 스프링프레임워크를 사용한 코드를 대략적으로 이해하도록 합니다.

일반적인 구현 ShotGun 클래스는 다음에 나오는 다른 구현코드에서도 사용합니다.

class ShotGun{
  void fire() { ... }
}

class Game {
  public gameRun() {
    ShotGun sg = new ShotGun();
    sg.fire();
  }
}
  • 게임에 필요한 무기중 샷것(ShotGun)클래스 생성.
  • 게임 프로그램에서 필요시 샷건 인스턴스를 생성해 사용(fire());

팩토리패턴 구현 ShotGun 에도 속성이 다른 여러 객체가 존재할 수 있는데 객체생성을 프로그램에서 하지 않고 팩토리 클래스를 통해 필요한 인스턴스를 얻어오는 방법입니다. 디자인 패턴중 팩토리 패턴을 사용한것으로 프로그램에서는 어떤 ShotGun의 인스턴스가 전달될지 알 필요가 없습니다.

class Game {
  public gameRun() {
    ShotGun w = Factory.getInstance();
    w.fire();
  }
}
  • Factory 클래스는 ShotGun 클래스의 인스턴스를 제공.
    인스턴스는 싱글턴(Singleton)일수도 있고 객체 풀 혹은 여러 방법으로 생성된 객체중 하나일 수 있음.
    객체 생성에 대한 부분이 캡슐화 되지만 팩토리에 의존성이 생기고 필요에 따라 특정 객체를 요구하는 등에 대해서는 별도 구현이 필요.
    DI 구현 게임 프로그램에 필요한 ShotGun 객체가 외부에서 공급되는 형태 입니다.
class Game {
  private ShotGun sg;
  public void setShotGun(ShotGun sg) {
    this.sg = sg;
  }

  public gameRun() {
    sg.fire();
  }
}
  • ShotGun 클래스에 @Component 애너테이션을 붙여 스프링컨테이너가 해당 클래스의 인스턴스를 생성할 수 있도록 함.
  • @Autowired 는 생성된 해당 클래스 타입의 객체의 인스턴스를 연결.

AOP(Aspect Oriented Programming)

관점지향 프로그래밍 이라고도 하며 스프링프레임워크 이전에 개념이 등장 했으며 스프링프레임워크의 핵심 요소중 하나입니다. 제대로 내용을 이해하고 활용하려면 꽤나 많은 학습이 필요하며 생소한 용어도 다수 등장 합니다.

지나치게 AOP 자체를 학습하는데 많은 시간을 소요하기 보다는 핵심 개념을 정리하고 스프링프레임워크등을 활용해 실제 구현에 하나씩 적용해 가면서 이해도를 높이는것이 좋습니다.

profile
탐험가

0개의 댓글