Spring Bean의 생성, 설정, 관리, 소멸 등 라이프사이클 전반을 담당하는 핵심 엔진이다. 객체의 생성과 관리, 흐름의 제어권을 개발자가 아닌 프레임워크 (Spring의 IoC 컨테이너)에서 처리한다.
✏️ IoC (Inversion of Control)?
기존에 클래스 A에서 클래스 B 객체를 생성하기 위해서는 클래스 A 내부에서b = new B()와 같이 객체를 직접 생성하였다. 즉, 개발자가 객체의 라이프사이클을 직접 제어했다.
Spring에서는 이 흐름을 역전시켜 객체의 생성, 의존성 주입 및 소멸을 Spring 컨테이너가 담당하도록 하였다. 즉, 개발자가private B b와 같이 객체를 직접 생성하지 않고, Spring 컨테이너에서 객체 B를 받아와b에 할당하여 사용한다.
BeanFactory가장 기본적인 컨테이너로, Bean을 생성하고 조회하며 관리하는 역할을 담당한다.
Lazy Loading을 지원하여 요청 시 Bean을 생성한다.
실제로는 거의 사용하지 않으며, 옛날 레거시, 경량 환경에서 사용한다.
✏️ Lazy Loading (지연 로딩)?
필요 시점까지 객체의 초기화를 연기시키기 위해 사용하는 디자인 패턴
ApplicationContextBeanFactory의 확장판으로, BeanFactory의 모든 기능과 부가 기능 (국제화, 이벤트, 환경설정, etc.)을 지원한다.
기본적으로 모든 싱글턴 빈을 컨테이너 시작 시 생성한다.
대부분의 Spring 어플리케이션에서 사용하며, 웹/서버/실제 프로젝트 환경에서 표준적으로 사용한다.
Spring이 관리하는 객체 (인스턴스)를 의미한다. 일반적으로 개발자가 new로 직접 생성하지 않고 Spring 컨테이너에게 위임하여, Spring 컨테이너가 생성하고 라이프사이클을 관리한다. 기본적으로 모든 Bean을 싱글턴 방식으로 관리한다.
✏️ 싱글턴 (Singleton) 방식?
컨테이너(컨텍스트) 당 단 하나의 객체만 생성해서 공유하는 디자인 패턴특징
- 메모리 절약: 객체를 한 번만 생성해서 여러 곳에서 같이 쓰면 메모리를 아낄 수 있다.
- 일관된 데이터 관리: 모든 사용자가 같은 객체 (동일 인스턴스)를 사용하므로 데이터 일관성이 높아지다.
- 객체 생성 비용 감소: 반복적인 객체 생성 작업을 줄일 수 있다.
Java 코드에 메타데이터를 제공하는 특수한 표기법으로, @ 기호로 시작한다. 컴파일러, 개발 툴, 런타임 등에서 특별한 의미로 해석된다. 주로 설정 파일을 줄이고 코드 가독성을 높이기 위해 사용한다.
| 어노테이션 | 사용 위치 | 주요 역할/설명 |
|---|---|---|
@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 적용 |