KT에이블스쿨 7기

[KT AIVLE School 7기] Spring Framework(2)

CodeForWelfare 2025. 6. 24. 10:20

1. 스프링 프레임워크 개요

스프링(Spring)은 자바 플랫폼을 위한 오픈소스 경량 프레임워크입니다. 객체지향 원칙(OOP)에 충실한 개발을 지향하며, 기존 Java EE의 복잡한 설정과 개발 구조를 단순화합니다. 스프링의 가장 핵심적인 특징은 제어의 역전(IoC), 의존성 주입(DI), 관점 지향 프로그래밍(AOP), 트랜잭션 처리, MVC 웹 프레임워크, 선언적 예외 처리 등입니다.

 

스프링은 모듈화된 구조를 갖고 있어, 개발자가 필요에 따라 선택적으로 사용할 수 있습니다. 대표 모듈로는 Core, AOP, Context, Web, ORM, JDBC, Test 등이 있으며, 이들을 유기적으로 조합하여 애플리케이션을 구성할 수 있습니다.

스프링의 철학은 POJO 기반의 개발을 지향하고, 설정의 단순화와 개발자의 편의성을 중시합니다.


2. 프레임워크, OOP, POJO

프레임워크란?

프레임워크는 일련의 개발 규칙과 구조를 제공하여 애플리케이션 개발을 체계적으로 지원하는 구조입니다. 라이브러리는 개발자가 필요한 기능을 호출하는 방식이지만, 프레임워크는 개발자가 그 구조에 맞게 개발해야 하며, 일부 제어 흐름을 프레임워크가 담당하는 제어의 역전(Inversion of Control) 구조를 가집니다.

OOP와 스프링

스프링은 객체지향 프로그래밍 원칙에 따라 각 모듈을 객체 단위로 구성하며, 상속, 캡슐화, 다형성 등을 활용한 유연한 구조 설계를 지향합니다. 특히 다형성과 인터페이스를 기반으로 한 설계는 스프링의 DI 및 AOP 기능과 매우 밀접합니다.

POJO란?

POJO(Plain Old Java Object)는 스프링 프레임워크가 특별한 API에 의존하지 않고 일반적인 Java 객체로도 개발이 가능하도록 하는 철학을 담고 있습니다. 이는 테스트 용이성, 재사용성, 경량성 등을 높입니다.

public class Person {
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

위의 클래스처럼, 별도의 상속이나 어노테이션 없이 작성된 단순한 객체가 POJO입니다.


3. IoC - 제어의 역전

IoC(Inversion of Control)는 객체의 생성, 관계 설정, 생명주기 관리 등의 제어 권한을 개발자가 아닌 컨테이너(스프링 프레임워크)가 담당하는 개념입니다. IoC를 통해 객체 간 결합도를 낮추고 유연한 구조를 유지할 수 있습니다.

스프링에서는 IoC를 구현하기 위해 컨테이너 개념을 사용하며, 주로 다음 두 가지 컨테이너를 제공합니다:

  • BeanFactory: 스프링의 가장 기본적인 컨테이너로, 요청이 들어올 때 객체를 생성하는 지연 로딩 방식을 채택합니다.
  • ApplicationContext: BeanFactory를 확장한 컨테이너로, 국제화 지원, 이벤트 처리, AOP 통합 등 고급 기능을 포함합니다.

스프링의 IoC 컨테이너는 XML, 어노테이션, Java Config 등을 통해 Bean 정의를 읽고 객체를 생성하여 빈으로 등록하고 관리합니다.

<bean id="memberService" class="com.example.MemberService" />

또는

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService();
    }
}

4. DI - 의존성 주입

DI(Dependency Injection)는 객체 간의 의존 관계를 외부에서 주입하는 방식입니다. 객체 내부에서 의존 대상을 직접 생성하지 않고, 외부에서 전달받음으로써 객체 간의 결합도를 낮추고 테스트 용이성과 유지보수성을 높입니다.

DI 유형

유형설명

생성자 주입 생성자 매개변수를 통해 의존 객체를 전달 받음 (가장 권장)
Setter 주입 Setter 메서드를 통해 의존 객체를 주입
필드 주입 필드에 직접 주입 (테스트 어려움으로 권장하지 않음)

어노테이션

어노테이션 설명
@Autowired 스프링의 의존성 자동 주입 어노테이션
@Inject 자바 표준 어노테이션 (javax.inject)
@Resource 이름을 기준으로 주입

DI 예시

@Service
public class OrderService {
    private final OrderRepository orderRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
}

순환 참조 방지 방법

  • Setter 주입으로 변경하여 초기화 시점을 늦춤
  • @Lazy를 활용한 지연 주입
  • ObjectProvider, Provider, ApplicationContext.getBean() 활용