Spring

[Spring] Spring 이란? + (Spring Boot 와의 차이점)

하부루 2024. 6. 17. 00:46

1. Spring이란?

- 스프링은 자바의 오픈소스 애플리케이션 프레임워크 중 하나로 객체를 관리할 수
  있는 컨테이너를 제공하고 객체지향 어플리케이션을 개발할 수 있게 도와주는 프레임워크
- 컨테이너를 통해서 의존성 주입과 제어의 역전을 통해 결합도를 낮추게 한다.

2. Spring의 주요 특징

1. IOC (제어의 역전)

  • IOC란 객체를 개발자가 관리하는 것이 아닌 스프링에서 대신 관리합니다.
  • 제어권이 개발자에게 있지 않고 프레임워크에 있어서 제어의 역전이라고 합니다.
  • 이로인해 개발자는 비즈니스 로직에 집중하여 개발할 수 있습니다.

2. DI (의존성 주입)

  • DI는 스프링 컨테이너가 객체간의 의존관계를 자동으로 연결하는 방식.
  • 이를 통해 코드의 재사용성을 높일 수 있습니다.

3. AOP (관점 지향 프로그래밍)

  • AOP는 애플리케이션에 적용되는 공통 기능을 분리하여 관리하는 방식.
  • 여러개의 클래스가 있다고 가정을 하겠습니다. 각 클래스들은 주요 기능들이 서로 중복되는 부분이 많습니다. 코드가 중복될 경우 가독성 및 효율에 좋지않기에 중복되는 코드를 최대한 따로 정의하여 필요할때만 호출하여 쓰는 프로그래밍 기법입니다.

4. POJO

  • POJO란 순수 Java를 통해서 생성된 객체를 의미합니다.
  • POJO는 특별한 클래스를 상속받지 않기때문에 유연하고 가볍습니다.
  • getter/setter를 가진 단순한 자바 오브젝트.

3. 의존성 주입(DI) 방법 3가지

1. 생성자 주입

  • 생성자 호출 시점에 1번만 호출 (불변성 확보)
  • 객체 생성과 의존관계 주입이 동시에 일어난다.
  • 생성자가 1개인 경우 @Autowired를 생략 가능
@Component
public class MyService {
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

2. setter 주입

  • final을 사용하지 못하고 setter메서드에 @Autowired를 사용해서 의존관계 주입
  • 객체생성후 의존관계를 주입한다.
  • 선택과 변경 가능성이 있는 의존관계에 사용한다.
@Component
public class MyService {
    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

3. 필드 주입

  • 코드가 간결해지는게 장점이다.
  • 클래스 외부에서 접근을할 수 없어서 테스트하기에 어렵다.
  • DI 프레임워크가 없으면 사용할 수 없다.
@Component
public class MyService {
    @Autowired
    private MyRepository myRepository;
}

생성자 주입을 사용하자!

  • 생성자 주입은 프레임워크에 의존하지 않기때문에 순수한 자바 코드로 구현이 가능하고, final을 사용해 불변성을 보장받을 수 있어서 생성자 주입 방식을 권장.

4. Spring과 Spring Boot의 차이점

-Spring boot는 개발자가 더 쉽고 빠르게 애플리케이션을 개발할 수 있도록 하기위해 개발되었다.
 
1. 스프링부트는 기본적인 설정(Auto-Configuration)을 자동으로 처리해줘서 간단하다.

2. 스프링부트는 내장된 서버를 제공하여 별도의 내장 Tomcat 설정이 필요없다.

3. dependency 의존성 관리가 쉽다.