Spring의 핵심 개념/모듈(core, beans, context)

양성준·2025년 3월 10일

스프링

목록 보기
4/49

ApplicationContext는 beanFactory를 포함하면서 더 많은 기능을 제공, IoC 컨테이너는 개념적인 내용인데, 스프링에서는 beanFactory!
ApplicationContext 객체로 beanFactory를 다룬다고 생각하면 됨!

1. Spring의 핵심 개념

Spring Bean

  • Spring IoC 컨테이너에 의해 관리되는 객체
  • POJO로 작성됨 (순수한 자바 객체, 스프링 프레임워크 의존 X)
    • 스프링 모듈을 상속 x, 자바 객체는 상속해도 됨
    • 클래스가 스프링 없이도 돌아갈 수 있다면 POJO
    • 장점: 단순하고, 이해하기 쉽고, 테스트가 용이!
  • 스코프 (Scope)
    • Singleton : 디폴트값, 애플리케이션당 하나의 인스턴스만 생성
    • Prototype : Bean을 요청할 때마다 새로운 인스턴스가 생성
    • Request : HTTP 요청당 하나의 인스턴스가 생성
    • Session : 웹 세션당 하나의 인스턴스가 생성
  • 생성 방법
    • XML
    • Configuration 클래스 (자바 설정)
    • Annotation : 가장 많이 사용!
      스프링을 시작하면, 같은 패키지 내에 있는 @Service나 @Controller처럼 어노테이션이 있는 Bean들을
      IoC Container에 등록하고 관리 / 생성자에 Bean이 있다면, 의존 관계까지 등록해준다.

IoC

  • 애플리케이션의 제어 흐름을 개발자가 아닌 외부 프레임워크나 컨테이너가 관리하도록 하는 디자인 원칙
  • 객체의 생성과 의존성 관리를 IoC 컨테이너에 위임
  • DI를 통해 실현된다.

DI

  • 객체가 필요한 의존성을 외부에서 주입받는 디자인 패턴
  • IOC의 구현 방식 중 하나
  • 장점
    • 결합도 감소 : 객체들간의 직접적인 의존성이 줄어듦
    • 유연성 향상 : 다형성으로 의존성을 쉽게 교체 가능 + 확장도 쉽다
    • 테스트 용이성 : Mock 객체를 주입하여 단위 테스트 수행 가능
    • 재사용성 증가 : 모듈간의 독립성이 증가하여 재사용이 용이
  • 주입 방법
    • 필드 주입
// UserService.java
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired // 필드 주입
    private UserRepository userRepository;

    public void performService() {
        userRepository.saveUser();
    }
}

: 외부에서 수정이 불가능하므로 테스트 코드를 작성할 때 객체를 수정할 수 없다.
final 키워드를 통한 선언이 불가능해 객체의 불변성이 지켜지지 않는다.

  • 세터 주입
// UserService.java
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private UserRepository userRepository; // nullable

    @Autowired // 세터 주입
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void performService() {
        userRepository.saveUser();
    }
}

: 외부에서 setter메서드로 임의로 변경할 수 있기 때문에 불변성이 지켜지지 않는다.

  • 생성자 주입 - 권장
  // UserService.java
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired // 생성자 주입
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void performService() {
        userRepository.saveUser();
    }
}

: 객체 생성 시 1회만 호출되기 때문에 객체 불변성이 지켜짐 + 순환 참조 에러 방지
유일하게 final 키워드로 선언할 수 있어, 초기 클래스 생성 시 컴파일 단계로 잡아낼 수 있음

AOP

  • 로직을 핵심적인 관점과 부가적인 관점으로 나누어보고, 핵심적인 관점인 비즈니스 로직에서 부가적인 관점인 횡단 관심사를 분리
  • 횡단 관심사는 애플리케이션 전반적으로 사용되는 공통적인 기능 (로깅, 보안, 트랜잭션 관리, 예외 처리 등)
  • 코드의 재사용성과 유지보수성 향상
  • 프록시 객체를 통해 AOP가 적용된다.

2. Spring의 핵심 모듈

Spring core

: 기본 유틸 및 추상화 담당

  • 스프링 전반에서 공통으로 사용되는 기능과 유틸리티를 제공하는 가장 기초적인 모듈
  • 리소스 추상화, 공통 예외 구조, 환경/프로퍼티 처리, 다양한 유틸리티 클래스를 포함

Spring beans

  • BeanFactory라는 IoC 컨테이너 포함 - 애플리케이션의 객체를 Bean으로 정의하고, 생성과 소멸 / 의존성 주입 등을 관리
  • DI를 통해 IoC를 실현

Spring context

  • Spring-core와 spring-beans 모듈을 포함하면서, 추가적인 고급 기능을 제공
  • ApplicationContext는 BeanFactory의 모든 기능을 포함하면서 추가적인 기능을 제공하는 IoC 컨테이너
    • 이벤트 발행 및 리스닝 기능
    • AOP 통합 기능
    • 환경 설정 및 프로파일 관리
    • Bean 자동 등록 -> Annotation 기반의 빈 자동 등록을 해줌 (Singleton bean으로 즉시 로딩)
    • 메시지 리소스 처리
profile
백엔드 개발자

0개의 댓글