Post

[스프링 부트 3 백엔드 개발자 되기 - 자바 편(2판) 스터디] - 2주차 (8.5 ~ 8.11)


스프링 부트 3 백엔드 개발자 되기 - 자바 편(2판) 스터디 2주차

책을 읽고 공부한 내용을 정리하기

종이책 : 스프링 부트 3 백엔드 개발자 되기 - 자바 편(2판)

엔터프라이즈 애플리케이션

대규모의 복잡한 데이터를 관리하는 애플리케이션을 말한다.
몇 백만, 몇 천만의 사용자가 한 번에 잔고 조회, 입금, 출금, 통장 개설을 하기도 한다.
이렇듯 엔터프라이즈 애플리케이션은 많은 사용자의 요청을 동시에 처리해야 하므로
서버 성능, 안정성, 보안이 매우 중요하다.
이런 점들을 해결할 수 있는 것이 바로 스프링이다.

스프링

스프링은 프레임워크다. 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공한다.
스프링 프레임워크의 주요 개념과 특징은 다음과 같다.
의존성 주입(Dependency Injection, DI)
제어의 역전(Inversion of Control, IoC)
AOP(Aspect-Oriented Programming)
모듈성
더 많은 개념과 특징이 있지만 너무 방대하기 때문에 이 정도만 작성했다.

스프링 부트

스프링은 설정이 매우 복잡하다. 이런 복잡함을 해결하기 위해 스프링 부트가 생겼다.
빠르게 스프링 프로젝트를 설정할 수 있고 스타터를 사용해 간편하게 의존성을 사용하거나 관리할 수 있다.
WAS(웹 어플리케이션 서버)가 내장되어 있어 따로 설치하지 않아도 된다.
스프링 부트는 스프링과 다른 것이 아니고 스프링에 속한 도구이다.
—-스프링—–
│        │
│ 스프링 부트 │
│        │
—————
이런 느낌이다.
스프링은 엔터프라이즈 애플리케이션 개발을 더 쉽게 만드는 도구이고
스프링 부트는 스프링의 개발을 더 빠르고 쉽게 하기 위해 사용하는 도구다.

IoC

IoC는 Inversion of Control의 줄임말이다. 제어의 역전이라는 뜻이다.

1
2
3
4
5
6
7
8
9
10
public class B {
    // B 클래스의 내용
}
public class A {
    private B b;
    // 생성자를 통한 의존성 주입 (생성자 주입 방식)
    public A(B b) {
        this.b = b;
    }
}

원래는 위 코드 처럼 직접 객체를 생성했다. 이 경우, A 클래스는 B 클래스에 강하게 결합되어 있으며,
A 클래스가 B 객체를 생성하는 책임을 가지고 있다. 이는 클래스 간의 의존성이 높아지는 문제가 생긴다.
제어의 역전(IoC)은 이 책임을 개발자가 아닌 외부의 프레임워크(스프링)가 맡도록 하여,
객체의 생성과 제어를 프레임워크가 담당한다.
개발자는 객체의 생성 방식을 신경 쓰지 않고, 프레임워크가 제공하는 흐름을 따르기만 하면 된다.
이로 인해 객체의 생성, 초기화, 소멸 등의 제어가 “역전”된 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class B {
    // B 클래스의 내용
}
@Component
public class A {
    private B b;
    // 생성자를 통한 의존성 주입
    @Autowired
    public A(B b) {
        this.b = b;
    }
}

이 방식에서는 A 클래스가 B 객체를 직접 생성하지 않고, 외부에서 생성된 B 객체를 주입받는다.
스프링 프레임워크가 B 객체를 생성하여 A 클래스에 주입한다.
이로 인해 A 클래스는 B 클래스에 덜 결합되고, 더 유연한 구조를 가지게 된다.
요약하자면 제어의 역전이란 단순히 객체 생성만이 아니라,
객체의 라이프사이클 전체(생성, 초기화, 소멸 등)를 프레임워크가 관리한다는 뜻이다.

@Component
클래스에 붙여서 스프링 컨테이너가 해당 클래스를 빈으로 관리하도록 한다.
객체의 생성과 관리가 스프링 컨테이너에 의해 자동으로 이루어진다.

@Autowired
빈(Bean)의 의존성을 자동으로 주입받기 위해 사용된다.
@Autowired를 사용하면, 스프링이 빈을 자동으로 주입해준다.

DI

DI는 Dependency Injection의 줄임말이다. 의존성 주입이라는 뜻이다.
제어의 역전을 구현하기 위해 사용하는 방법이다.
DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻이다.
다르게 말하면 한 객체가 다른 객체를 필요로 할 때, 그 객체를 의존한다고 말한다.
예를 들어, Car 클래스가 Engine 객체를 필요로 한다면, Car는 Engine에 의존하고 있는 것이다.

1
2
3
4
5
6
public class Car {
    private Engine engine;
    public Car() {
        this.engine = new Engine();  // 직접 생성
    }
}

여기서 Car 클래스는 Engine 객체를 직접 생성하고 관리한다.
이 방식의 문제점은 Car가 Engine 객체의 생성과 관리에 직접 관여해야 한다는 점이다.
DI의 주요 방식은 3가지가 있다.

생성자 주입 (Constructor Injection)

1
2
3
4
5
6
7
public class Car {
    private Engine engine;
    // 생성자를 통한 의존성 주입
    public Car(Engine engine) {
        this.engine = engine;
    }
}

의존성을 생성자의 매개변수로 주입받는 방식이다.
Car 클래스는 Engine 객체를 생성자 매개변수로 받아서 의존성을 주입받는다.
이 방식은 주입받는 의존성이 final로 설정되므로 불변성을 보장한다.

필드 주입 (Field Injection)

1
2
3
4
5
public class Car {
    @Autowired
    private Engine engine;  // @Autowired 어노테이션 사용
    // 생성자나 메서드 없이 자동 주입
}

의존성을 클래스의 필드에 직접 주입받는 방식이다.
@Autowired 어노테이션을 사용하여 스프링 프레임워크가 자동으로 의존성을 주입한다.

메서드 주입 (Method Injection)

1
2
3
4
5
6
7
public class Car {
    private Engine engine;
    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}

의존성을 클래스의 메서드에 주입받는 방식이다.
Engine 객체가 setter 메서드를 통해 주입된다.
@Autowired는 스프링 컨테이너에 있는 빈이라는 것을 자동으로 주입받는다.
빈은 스프링 컨테이너에서 관리하는 객체를 말한다.

스프링 컨테이너

스프링 프레임워크의 핵심 구성 요소로서, 애플리케이션의 객체를 생성하고 관리하며,
의존성 주입을 수행하는 역할을 한다.
즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리한다.
주요 기능
빈(Bean) 생성 및 관리
의존성 주입(Dependency Injection)
빈 생명 주기 관리
위 기능이 스프링 컨테이너가 한다고 했지만 스프링 컨테이너 안의 구성 요소인
애플리케이션 컨텍스트가 위 기능을 수행한다.

빈은 스프링 컨테이너가 제공하는 것이 아니라, 스프링 컨테이너에 의해 생성되고 관리되는 자바 객체다.
빈의 정의는 XML, 자바 설정, 또는 컴포넌트 스캔을 통해 이루어진다.
클래스가 빈으로 등록되면 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꾼 이름이다.
예를 들어 MyBean이 클래스 이름이면 빈의 이름은 myBean이다.