[Spring] Spring 기본 동작 원리 파헤치기

2026. 4. 24. 13:34·Backend/Spring

* 개념 복습과 학습 정도를 파악하고자 포스팅합니다!
* Claude, ChatGPT를 활용하여 이미지를 생성하고 활용합니다.

 

Spring의 기본 동작 원리

1. IoC(Inversion of Control), 제어의 역전

일반적인 Java 코드에서는 객체가 필요하면 개발자가 직접 new로 만들죠?

// 일반 Java
public class OrderService {
    private UserRepository userRepository = new UserRepository(); // 직접 생성
}

이러면 OrderService가 UserRepository에 강하게 묶여서 테스트하기 어렵고 유연성이 떨어집니다.

 

Spring은 이걸 뒤집습니다.

객체 생성과 관리를 개발자가 아니라 Spring 컨테이너가 담당합니다. 이게 바로 제어의 역전(IoC, Inversion of Control)입니다!

// Spring — 컨테이너가 생성하고 주입
@Service
public class OrderService {
    private final UserRepository userRepository; // 직접 생성 안 함

    public OrderService(UserRepository userRepository) { // 컨테이너가 넣어줌
        this.userRepository = userRepository;
    }
}


2. DI(Dependency Injection), 의존성 주입

DI(Dependency Injection)은 IoC를 구현하는 구체적인 방법입니다.

컨테이너가 필요한 객체(의존성)을 찾아서 알아서 주입해줍니다.

 

Spring에서 DI 방법은 세 가지입니다. 그 중에서도 권장하는 방식은 생성자 주입입니다.

// 1. 생성자 주입 (권장) — 의존성이 명확하고 불변성 보장
@Service
public class OrderService {
    private final UserRepository userRepository;

    public OrderService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

// 2. 필드 주입 (비권장) — 테스트하기 어려움
@Service
public class OrderService {
    @Autowired
    private UserRepository userRepository;
}

// 3. Setter 주입 — 선택적 의존성에만 사용
@Service
public class OrderService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 

생성자 주입이 권장되는 이유는 final 키워드로 불변성을 보장하고, 테스트할 때 직접 객체를 넣기 편하기 때문입니다.


3. Bean, Spring이 관리하는 객체

Spring 컨테이너가 생성하고 관리하는 객체를 Bean 이라고 불러요.

개발자가 어노테이션으로 "이거 Bean으로 등록해"라고 알려주면 됩니다.

@Component   // 일반 컴포넌트
@Service     // 서비스 레이어 (의미상 구분)
@Repository  // DB 접근 레이어
@Controller  // 웹 컨트롤러
// 위 넷은 모두 @Component의 특수화 버전 — Bean으로 등록됨

@Configuration
public class AppConfig {
    @Bean                          // 직접 Bean 등록
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }
}


4. Spring Boot 기동 원리

Spring Boot 를 실행하면 내부에서는 어떻게 동작하는지 순서대로 같이 공부해봅시다!

@SpringBootApplication  // 이 한 줄이 모든 걸 시작
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootApplication 어노테이션은 내부에서 세 개의 어노테이션이 합쳐진 것 입니다.

@SpringBootConfiguration  // = @Configuration, 이 클래스가 설정 클래스
@EnableAutoConfiguration  // 자동 설정 활성화
@ComponentScan            // 현재 패키지부터 Bean 스캔 시작


5. Auto Configuration은 어떻게 동작하는거지?

자동 설정이 어떻게 되는 걸까? 라는 궁금증을 저도 처음 Spring을 학습하면서 가지게 되었습니다.

Spring Boot는 내부적으로 spring.factories , AutoConfiguration.imports 파일에 수백 개의 자동 설정 클래스 목록을 가지고 있습니다. 그 중 @ConditionalOn~ 어노테이션으로 조건이 맞을 때만 설정을 적용하죠.

// Spring Boot 내부 코드 (이런 식으로 동작)
@Configuration
@ConditionalOnClass(DataSource.class)       // DataSource 클래스가 있을 때만
@ConditionalOnMissingBean(DataSource.class) // 개발자가 직접 등록 안 했을 때만
public class DataSourceAutoConfiguration {
    @Bean
    public DataSource dataSource() {
        // application.yml의 설정으로 자동 DataSource 생성
    }
}

개발자가 직접 Bean을 등록하면 자동 설정은 진행하지 않고,

등록하지 않으면 자동으로 처리하는 방식입니다.

 

그래서 필요할 때만 커스터마이징하면 되는 구조라고 볼 수 있죠!


핵심 정리

개념 핵심
Spring Java 백엔드 프레임워크. IoC·DI·AOP로 객체지향 개발 지원
Spring Boot Spring + 자동 설정 + 내장 Tomcat. 빠르게 시작 가능
IoC 객체 제어권을 개발자 → 컨테이너로 역전
DI 컨테이너가 의존 객체를 찾아서 주입. 생성자 주입 권장
Bean 컨테이너가 관리하는 객체. 기본적으로 싱글톤
Auto Config 클래스패스 감지 + 조건 충족 시 자동 Bean 등록

'Backend > Spring' 카테고리의 다른 글

[Spring] 간단한 게시판 기능 구현 - 1  (0) 2026.04.25
[Java] Spring Boot와 Web MVC 파헤치기  (0) 2026.04.25
[Spring] AOP 원리와 코드로 실습하며 파헤치기  (0) 2026.04.25
[Spring] IoC/DI 코드로 실습하며 파헤치기  (0) 2026.04.25
[Spring] Spring, Spring Boot는 무엇일까?  (0) 2026.04.24
'Backend/Spring' 카테고리의 다른 글
  • [Java] Spring Boot와 Web MVC 파헤치기
  • [Spring] AOP 원리와 코드로 실습하며 파헤치기
  • [Spring] IoC/DI 코드로 실습하며 파헤치기
  • [Spring] Spring, Spring Boot는 무엇일까?
BackendInho
BackendInho
항상 열정적으로 부딪히고 깨닫는 주니어 백엔드 개발자의 여정을 기록합니다!
  • BackendInho
    Inho.devlog
    BackendInho
  • 전체
    오늘
    어제
    • 분류 전체보기 (41)
      • TIL (0)
      • Language (21)
        • Java (21)
      • Backend (8)
        • Spring (8)
      • Database (0)
        • SQL (0)
      • CS (8)
        • Computer Structure (2)
        • Network (2)
        • OS (1)
        • Data Structure & Algorithms (3)
      • Devops (0)
        • Docker & Kubernetes (0)
      • Coding-Test (1)
        • Programmers (3)
        • LeatCode (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    API
    CS
    HTTP
    java
    REST
    REST API
    Spring
    Spring Boot
    Web
    공간복잡도
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
BackendInho
[Spring] Spring 기본 동작 원리 파헤치기
상단으로

티스토리툴바