이 글은 '스프링 부트 핵심 가이드 - 스프링 부트를 활용한 애플리케이션 개발 실무' 책을 통해 학습한 내용을 정리한 글입니다.
스프링 부트(Spring Boot)
스프링 부트는 자바 기반의 오픈 소스 프레임워크인 스프링(Spring)을 기반으로한 독립적으로 실행 가능한 애플리케이션을 빠르고 간편하게 개발할 수 있도록 도와주는 도구이다. 스프링 부트는 스프링 프레임워크의 설정을 자동화하고, 개발자가 주로 신경써야 하는 공통적인 작업들을 간소화하여 생산성을 향상시킨다.
스프링의 특징과 구조
제어 역전(IoC; Inversion of Control)
객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 담당하는 디자인 패턴이다.
제어 역전은 객체의 의존성을 관리하는 방식으로 주로 사용된다. 전통적인 방식에서는 아래와 같이 개발자가 의존하는 객체를 직접 생성하고 조합해야 했지만, 스프링의 제어 역전을 활용하면 객체의 생성과 의존성을 관리하는 작업을 스프링 컨테이너가 대신 수행한다.
private Service service = new Service();
제어 역전을 위해 사용하는 방식
1. 빈(Bean)
스프링은 객체를 빈(Bean)이라고 부른다. 빈은 스프링 컨테이너에 의해 생성되고 관리되는 객체로, 개발자는 빈을 정의하고 컨테이너에 등록함으로써 해당 빈을 사용할 수 있다.
@Component // 스프링 빈으로 등록하기 위한 어노테이션
public class MyBean {
public void sayHello() {
System.out.println("Hello, I'm a Spring Bean!");
}
}
2. 스프링 컨테이너
스프링은 빈을 생성하고 관리하는 컨테이너를 제공한다. 컨테이너는 빈의 생명주기를 관리하고, 필요에 따라 빈을 생성하고 의존성을 주입한다. 개발자는 스프링 컨테이너를 설정하고, 필요한 빈을 등록하여 사용한다.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
// 스프링 컨테이너 실행 및 설정 클래스(MyApplication)를 전달
ConfigurableApplicationContext context = SpringApplication.run(MyApplication.class, args);
// 빈 가져오기
MyBean myBean = context.getBean(MyBean.class);
// 빈의 메서드 호출
myBean.sayHello();
// 스프링 컨테이너 종료
context.close();
}
}
3. 의존성 주입(DI; Dependency Injection)
스프링은 의존성 주입을 통해 객체 간의 관계를 설정한다. 의존성 주입은 객체가 필요로 하는 의존 객체를 컨테이너가 자동으로 주입하는 것을 의미한다. 이를 통해 객체 간의 결합도를 낮출 수 있고, 유연하고 재사용 가능한 코드를 작성할 수 있다.
스프링에서는 @Autowired라는 어노테이션(annotation)을 통해 의존성을 주입할 수 있다.
의존성 주입을 받는 세 가지 방법
(1) 생성자를 통한 의존성 주입
클래스의 생성자를 통해 의존성을 주입하는 방식으로, 클래스 내부의 필드에 직접 접근하지 않고 생성자 매개변수를 통해 의존성을 주입받는다.
@Component
public class MyClass {
private MyDependency myDependency;
@Autowired
public MyClass(MyDependency myDependency) {
this.myDependency = myDependency;
}
public void performAction() {
myDependency.doSomething();
}
}
(2) 필드 객체 선언을 통한 의존성 주입
의존성을 클래스의 필드에 직접 주입하는 방식으로 의존성을 주입받을 필드에 ‘@Autowired’ 어노테이션을 추가하여 의존성 주입을 수행한다.
@Component
public class MyClass {
@Autowired
private MyDependency myDependency;
public void performAction() {
myDependency.doSomething();
}
}
(3) setter 메서드를 통한 의존성 주입
의존성을 setter 메서드를 통해 주입하는 방식이다. 메서드를 통한 주입은 필드 객체 선언을 통한 주입과 마찬가지로 의존성을 주입받는 메서드를 호출하기 전에는 해당 의존성이 주입되지 않는다.
@Component
public class MyClass {
private MyDependency myDependency;
@Autowired
public void setMyDependency(MyDependency myDependency) {
this.myDependency = myDependency;
}
public void performAction() {
myDependency.doSomething();
}
}
관점 지향 프로그래밍(AOP; Aspect-Oriented Programming)
AOP는 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화하는 것이다. ‘핵심 기능’은 비즈니스 로직이 처리하려는 목적 기능을 말한다. 예를 들어, 자금 이체 기능에서 . ‘부가 기능’은 핵심 기능을 보완하거나 지원하는 기능 즉, 로깅, 트랜잭션 관리, 보안 등이 해당한다. 이러한 부가 기능은 여러 핵심 기능에 공통으로 적용되는 관점이다.
AOP 구현 방법
세 가지 방법이 있지만 스프링에서는 프락시 패턴을 이용한 방식을 사용한다. 간단하게 설명하자면 대리자(프락시) 객체를 사용하여 핵심 기능을 감싸고, 부가 기능을 추가하는 방법이다. 핵심 기능을 호출하기 전후에 부가 기능을 수행할 수 있다.
'북 스터디 > 스프링 부트 핵심 가이드' 카테고리의 다른 글
[스프링 부트] 09장. 연관관계 매핑 (0) | 2023.06.18 |
---|---|
[스프링 부트] 08장. Spring Data JPA 활용 (0) | 2023.06.11 |
[스프링 부트] 06장. 데이터베이스 연동 (0) | 2023.06.04 |
[스프링 부트] 04장 ~ 05장 (0) | 2023.05.28 |
[스프링 부트] 02장. 개발에 앞서 알면 좋은 기초 지식 (0) | 2023.05.21 |