본문 바로가기
Archive/Java 풀스택 아카데미

[TIL] 15. 10월 Spring Framework(Bean)

by Lseing 2025. 10. 28.

🧐Spring Bean 이란?

이전에 다룬 Spring Container가 관리하는 객체를 Bean이라고 한다.

일반적으로 우리가 new 키워드를 사용해서 생성하는 객체와 달리, 스프링 컨테이너에 의해 생성되고 관리되는 특별한 개체이다.

🟢일반 객체 VS Bean

일반객체의 경우

// 일반 객체
StudentService service = new StudentService();
StudentDAO dao = new StudentDAO();

// 개발자가 직접 관리한다.
service.setDao(dao);
  • 개발자가 직접 new 키워드를 통해 생성한다.
  • 개발자가 직접 관리한다.
  • 개발자가 직접 정리한다.

반면에 Bean은

@Service
public class StudentService {
	@Autowired
    private StudentDAO dao; // Container가 자동 주입
}
  • Container가 자동으로 생성한다.
  • Container가 자동으로 주입한다.
  • Container가 알아서 정리한다.

🟢Bean의 핵심 특징

동작 방식

서버 시작 -> Container가 @Controller 발견 -> new StudentController() 자동 실행 -> Container에 저장

▪️싱글톤 패턴

기본적으로 Bean은 애플리케이션에서 딱 하나만 생성된다.

장점으로는

하나만 만들어서 재사용하기 때문에 메모리 효율적이다.

▪️의존성 자동 주입

Bean끼리는 Container가 자동으로 주입해준다.

@Controller
public class StudentController {
    @Autowired
    private StudentService service;  // 자동 주입
}

@Service
public class StudentService {
    @Autowired
    private StudentDAO dao;  // 자동 주입
}

예시

사진과 같은 흐름으로 자동으로 Bean을 생성하고 주입해준다.

▪️Bean 등록 방법

그렇다면 Bean 어떻게 등록할까?

@Controller  // Controller Bean으로 등록
public class StudentController { }

@Service  // Service Bean으로 등록
public class StudentService { }

@Repository  // DAO Bean으로 등록
public class StudentDAO { }

@Component  // 일반 Bean으로 등록
public class MyComponent { }

위의 코드처럼 등록하면 된다.

 

각 어노테이션들의 의미는 이렇다.


Bean 등록 어노테이션 관계

@Controller, @Service, @Repository 는 모두 @Component를 상속받은 것이다.

 

▪️Bean의 생명주기

Bean은 생성되서 사라질 때 까지 Container가 관리한다.

▪️Bean Scope 범위

@Scope를 통해 Bean이 생성되는 범위를 지정할 수 있다.

왜 쓰는거죠? -> 객체 생명주기와 범위를 제어하기 위해서, 성능을 최적화하기 위해

1. Singleton (기본값)

애플리케이션에서 단 하나만 생성된다.

@Controller
@Scope("singleton")  // 생략 가능 (기본값)
public class StudentController { }

가장 많이 사용된다는 특징이 있다.

2. prototype

요청할 때 마다 새로운 객체를 생성한다

@Controller
@Scope("prototype")
public class StudentController { }

매번 새 객체를 생성하기 때문에 메모리를 많이 사용한다.

특별한 경우에만 사용한다.

3. Request(웹 전용)

HTTP 요청마다 새로운 Bean 생성

@Controller
@Scope("request")
public class StudentController { }

4. Session(웹 전용)

HTTP 세션마다 새로운 Bean 생성

@Controller
@Scope("session")
public class StudentController { }

 

전체 구조는 대략 이러하다

Bean을 왜 사용하는지 다시 정리하고 마무리 하겠다

1. 객체 관리 자동화

2. 싱글톤으로 메모리 절약

3. 테스트 용이

4. 설정 변경 용이