[SpringBoot] Spring 컨테이너

김선형·2025년 9월 8일

Java

목록 보기
13/27

개요

Spring Bean의 생성, 설정, 관리, 소멸 등 라이프사이클 전반을 담당하는 핵심 엔진이다. 객체의 생성과 관리, 흐름의 제어권을 개발자가 아닌 프레임워크 (Spring의 IoC 컨테이너)에서 처리한다.

✏️ IoC (Inversion of Control)?
기존에 클래스 A에서 클래스 B 객체를 생성하기 위해서는 클래스 A 내부에서 b = new B()와 같이 객체를 직접 생성하였다. 즉, 개발자가 객체의 라이프사이클을 직접 제어했다.
Spring에서는 이 흐름을 역전시켜 객체의 생성, 의존성 주입 및 소멸을 Spring 컨테이너가 담당하도록 하였다. 즉, 개발자가 private B b와 같이 객체를 직접 생성하지 않고, Spring 컨테이너에서 객체 B를 받아와 b에 할당하여 사용한다.

Spring IoC 컨테이너

BeanFactory

가장 기본적인 컨테이너로, Bean을 생성하고 조회하며 관리하는 역할을 담당한다.
Lazy Loading을 지원하여 요청 시 Bean을 생성한다.
실제로는 거의 사용하지 않으며, 옛날 레거시, 경량 환경에서 사용한다.

✏️ Lazy Loading (지연 로딩)?
필요 시점까지 객체의 초기화를 연기시키기 위해 사용하는 디자인 패턴

ApplicationContext

BeanFactory의 확장판으로, BeanFactory의 모든 기능과 부가 기능 (국제화, 이벤트, 환경설정, etc.)을 지원한다.
기본적으로 모든 싱글턴 빈을 컨테이너 시작 시 생성한다.
대부분의 Spring 어플리케이션에서 사용하며, 웹/서버/실제 프로젝트 환경에서 표준적으로 사용한다.

빈 (Bean)

Spring이 관리하는 객체 (인스턴스)를 의미한다. 일반적으로 개발자가 new로 직접 생성하지 않고 Spring 컨테이너에게 위임하여, Spring 컨테이너가 생성하고 라이프사이클을 관리한다. 기본적으로 모든 Bean을 싱글턴 방식으로 관리한다.

✏️ 싱글턴 (Singleton) 방식?
컨테이너(컨텍스트) 당 단 하나의 객체만 생성해서 공유하는 디자인 패턴

특징

  • 메모리 절약: 객체를 한 번만 생성해서 여러 곳에서 같이 쓰면 메모리를 아낄 수 있다.
  • 일관된 데이터 관리: 모든 사용자가 같은 객체 (동일 인스턴스)를 사용하므로 데이터 일관성이 높아지다.
  • 객체 생성 비용 감소: 반복적인 객체 생성 작업을 줄일 수 있다.

어노테이션 (Annotation)

Java 코드에 메타데이터를 제공하는 특수한 표기법으로, @ 기호로 시작한다. 컴파일러, 개발 툴, 런타임 등에서 특별한 의미로 해석된다. 주로 설정 파일을 줄이고 코드 가독성을 높이기 위해 사용한다.

역할

  • 컴포넌트 식별: 클래스가 Spring이 관리할 Bean임을 명시한다.
  • 의존성 주입: Bean 간의 의존성을 자동으로 연결한다.
  • 웹 계층: 컨트롤러, 요청 매핑 등 웹 요청 처리에 사용한다.
  • 설정 및 환경: 설정 클래스 지정, 환경설정, 프로퍼티 주입 등에 사용한다.
  • 데이터 접근/트랜잭션: 데이터베이스 접근 계층에서 활용하거나 트랜잭션을 관리한다.
  • 예외 및 검증: 예외 처리 및 데이터 검증을 수행한다.

주요 어노테이션

컴포넌트 식별

어노테이션사용 위치주요 역할/설명
@Component클래스Spring이 관리하는 일반 빈 (Bean)으로 등록
@Controller클래스MVC 패턴의 컨트롤러 (웹 요청 처리) 빈으로 등록
@Service클래스비즈니스 로직을 담는 서비스 계층 빈으로 등록
@Repository클래스DAO 계층 빈, 예외 변환 처리 (데이터 접근 계층)
@RestController클래스REST API용 컨트롤러(@Controller + @ResponseBody)

✏️ DAO (Data Access Object) 계층?
데이터베이스 같은 영속 계층 (Persistence Layer)에 직접 접근하는 로직을 모아둔 계층으로, DB 연결, SQL 실행, 결과 매핑 등을 처리하며 서비스 계층이 DB와 직접 얽히지 않게 한다.

의존성 주입

어노테이션사용 위치주요 역할/설명
@Autowired생성자, 필드, 메서드자동으로 의존성 주입
@Qualifier파라미터, 필드동일 타입 빈 여러 개 존재 시 특정 빈을 지정
@Inject생성자, 필드Java 표준 의존성 주입 (Spring도 지원)
@Resource필드, 메서드이름 기반 의존성 주입

웹 계층

어노테이션사용 위치주요 역할/설명
@RequestMapping클래스, 메서드HTTP 요청 URL 매핑
@GetMapping메서드GET 요청 매핑 (축약형)
@PostMapping메서드POST 요청 매핑 (축약형)
@PutMapping메서드PUT 요청 매핑 (축약형)
@DeleteMapping메서드DELETE 요청 매핑 (축약형)
@PathVariable파라미터URL 경로 변수 값 매핑
@RequestParam파라미터쿼리 파라미터 값 매핑
@RequestBody파라미터HTTP 요청 body (JSON 등) 매핑
@ResponseBody메서드, 클래스리턴값을 HTTP 응답 body로 변환

환경 설정

어노테이션사용 위치주요 역할/설명
@Configuration클래스Java 기반 설정 클래스 표시
@Bean메서드수동 빈 등록
@Value필드, 파라미터프로퍼티 값 주입
@PropertySource클래스프로퍼티 파일 위치 지정
@Profile클래스, 메서드특정 프로필 (환경)에서만 빈 등록

데이터 접근

어노테이션사용 위치주요 역할/설명
@Entity클래스JPA 엔티티로 지정
@Id필드엔티티의 기본키 지정
@GeneratedValue필드기본키 값 자동 생성
@Repository클래스DAO 계층 빈 등록, 예외 변환 처리
@Transactional클래스, 메서드트랜잭션 적용

예외 및 검증

어노테이션사용 위치주요 역할/설명
@ControllerAdvice클래스전역 예외 처리, 바인딩 등 지원
@ExceptionHandler메서드특정 예외 처리 메소드 지정
@Valid, @Validated파라미터, 클래스Bean Validation 적용
profile
선형의 비선형적 기록 🐜

0개의 댓글