[Spring] Spring & Springboot의 특징

bbolddagu·2023년 4월 16일
0

Spring

목록 보기
1/2

Spring의 특징

1. POJO 프로그래밍 지향

POJO (Plain Old Java Object)

: 순수 Java만을 통해서 생성한 객체 (즉, 다른 기술 사용하지 않고 Java 및 Java의 스펙에 정의된 기술만 사용)

  • 특정 프레임워크나 라이브러리에 종속되지 않아서, 외부 기술이나 규약의 변화에도 영향을 받지 않습니다.
  • 이는 객체 지향 설계의 중요한 원칙 중 하나인 "의존성 역전 원칙(Dependency Inversion Principle, DIP)"을 따르고 있습니다.
    - 의존성 역전 원칙 : 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 되며, 양쪽 모두 추상화에 의존해야 한다.

👉 장점

  • POJO를 사용하면 자바 언어에서 지원하는 다양한 객체 지향적인 개념을 활용하여 코드를 작성할 수 있기 때문에, 코드의 가독성과 유지보수성을 높일 수 있습니다.
  • POJO는 특정 기술에 종속되지 않으므로, 확장성유연성을 높일 수 있습니다.

2. IoC / DI

IoC (Inversion of Control, 제어의 역전)

  • 기존의 개발 방식에서는 개발자가 코드를 작성하면서 필요한 객체를 직접 생성하고 조합하는 등의 제어를 수행
  • 하지만 IoC 방식에서는 제어의 흐름이 개발자가 아닌 프레임워크에 의해 역전되어 객체 생성과 의존성 조합 등을 프레임워크가 수행하게 됩니다.
  • 이렇게 하면 객체 간의 결합도가 낮아지고 유연한 코드를 작성할 수 있습니다.

DI (Dependency Injection, 의존성 주입)

  • 객체를 생성하면서 해당 객체가 필요로 하는 의존성 객체를 외부에서 주입하는 방식
  • 이렇게 하면 객체 생성 시점에 객체 간의 의존성을 완전히 분리시킬 수 있으며, 유닛 테스트 등에서도 객체를 쉽게 대체할 수 있습니다.

DI 적용 전

public class Car {
    private Engine engine;

    public Car() {
        engine = new Engine(); // 의존성 직접 생성
    }

    public void start() {
        engine.start();
    }
}

DI 적용 후

public class Car {
    private Engine engine;

    public Car(Engine engine) {
        this.engine = engine; // 의존성 주입
    }

    public void start() {
        engine.start();
    }
}

👉 이렇게 의존성 주입은 의존성을 관리하는 일을 외부에 넘겨 주었기에 일종의 IoC로 볼 수 있는 것이다.

📝 의존성 주입 방법

  1. 생성자 주입 (Constructor Injection)
  2. Setter 주입 (Setter Injection)
  3. 필드 주입 (Field Injection)

1) 생성자 주입

  • 생성자를 통해 의존성을 주입하는 방법
  • 객체 생성 시에 의존성이 필요하므로, 의존성이 필수적인 경우에 적합
public class MyClass {
  private MyDependency myDependency;

  public MyClass(MyDependency myDependency) {
    this.myDependency = myDependency;
  }
}

2) Setter(수정자) 주입

  • Setter 메서드를 통해 의존성을 주입하는 방법
  • 의존성이 선택적인 경우에 적합합니다.
  • 우선 객체를 생성하고 그 후에 인자에 사용하는 객체를 찾거나 만든다. 그 이후에 주입하려는 빈 객체의 수정자를 호출하여 주입
  • 주입받는 객체가 변경될 가능성이 있는 경우에 사용
public class MyClass {
  private MyDependency myDependency;

  public void setMyDependency(MyDependency myDependency) {
    this.myDependency = myDependency;
  }
}

3) 필드 주입

  • 필드에 직접 의존성을 주입하는 방법
  • 코드가 간결해지지만, 객체 생성 후에도 의존성을 수정할 수 있기 때문에 부작용이 발생할 수 있습니다. 따라서 권장되는 방법은 아닙니다.
public class MyClass {
  @Autowired
  private MyDependency myDependency;
}

👉 Spring 프레임워크에서는 주로 생성자 주입을 권장하며, 생성자 주입을 위해 @Autowired 어노테이션(스프링이 빈을 생성하고 의존성을 주입할 때 사용하는 어노테이션)을 사용

<생성자 주입 권장하는 이유>
1. 필수적인 의존성을 강제할 수 있습니다.
생성자 주입을 사용하면 해당 의존성이 필수적인 것이므로, 객체를 생성하는 동안 반드시 제공되어야 합니다. 
따라서, 객체 생성 시점에서 필수적인 의존성을 강제할 수 있어 안정적인 프로그램 구현을 도와줍니다.

2. 불변성을 보장할 수 있습니다.
의존성이 객체 생성 시점에서 제공되기 때문에, 해당 객체는 의존성을 변경할 수 없습니다. 
이는 객체의 불변성을 보장하여 코드의 안정성과 가독성을 높이는데 도움이 됩니다.

3. 테스트 용이성이 높습니다.
생성자 주입을 사용하면 의존성을 주입하기 위해 외부 컴포넌트를 사용할 필요가 없습니다. 
이는 테스트 코드 작성 시 복잡도를 낮추어 테스트 용이성을 높이는데 도움이 됩니다.

3. AOP (Aspect Oriented Programming, 관점 지향 프로그래밍)

" 흩어진 관심사(Crosscutting Conerns)를 모듈화 할 수 있는 프로그래밍 기법"

  • 흩어진 관심사: 소스 코드상에서 계속 반복해서 사용되는 부분
  • 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것

어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것

예를 들어 핵심적인 관점은 비즈니스 로직이 될 수 있고, 부가적인 관점은 핵심 로직을 실행하기 위해 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이 될 수 있다.


4. PSA (Portable Service Abstraction, 일관된 서비스 추상화)

일종의 인터페이스 형태로 다양한 서비스 기술에 대한 추상화 계층을 제공하며, 이를 통해 개발자가 서비스 구현 기술과 상관없이 일관된 방식으로 개발할 수 있도록 합니다.

예를 들어, 스프링에서는 JDBC, JPA, JMS 등 다양한 데이터 액세스 기술을 추상화한 인터페이스를 제공합니다. 이를 이용하여 개발자는 다양한 데이터 액세스 기술을 사용할 수 있으며, 데이터 액세스 기술을 변경해야 할 경우 코드의 변경을 최소화할 수 있습니다.


Springboot란?

Spring Boot는 스프링 프레임워크 기반의 애플리케이션을 빠르고 쉽게 개발하도록 도와주는 프레임워크입니다.

  • Spring Boot를 사용하면 스프링 기반의 애플리케이션을 개발할 때 필요한 다양한 설정을 자동으로 처리해줍니다.
  • 내장된 서버를 통해 애플리케이션을 빠르고 쉽게 배포할 수 있습니다.
    - 별도의 WAS(Web Application Server) 설치 없이도 애플리케이션을 실행할 수 있습니다.
  • 독립적으로 실행 가능한 JAR 파일을 생성할 수 있습니다.
    - JAR 파일은 모든 애플리케이션 코드와 필요한 라이브러리를 포함하고 있어서, JAR 파일만 있으면 누구나 동일한 환경에서 애플리케이션을 실행할 수 있습니다.
    - 이러한 특징 때문에 클라우드 서비스와 같은 가상화 환경에서 빠르고 쉽게 애플리케이션을 배포할 수 있습니다.

📎참고

0개의 댓글