💡 복습 요약
3 Layer Architecture
- 역할에 따라 Controller - Service - Repository 로 계층 분리
- Controller : 요청을 받음, 서비스에서 처리 완료된 결과를 클라이언트에게 반환
- Service : 비즈니스 로직(요구사항) 처리, Repository에 DB에관한 요구사항 전달
- Repository: DB관리, CRUD 작업
Spring 입문 2주차
📌의존 주입
DI패턴을 쓰기 위해선 객체의 생성이 우선이 되어야 한다.
MemoController를 예시로 보면 MemoService 객체를 미리 생성하고 이걸 받아와서 필드에 주입하고 있다.
(원래 주입받으려면 @Autowired어노테이션에 필요하지만 스프링 4.3버전 이후부터는 생성자 선언이 1개일때 자동으로 달린 걸로 처리한다. 즉, 생성자 선언이 2개 이상일 땐 명시적을 @Autorwired 어노테이션을 붙여주자.)
의존 주입시 보통 생성자로 주입을 많이하는데 객체의 불변성을 지켜줄 수 있기 때문이다.(final 선언)
공식 문서에서도 생성자를 통한 주입을 권장하고 있다.

참고) 다양한 의존 주입 방식의 예시
1. 메서드로 주입
위의 경우처럼 주입하는 객체가 고정적이어서 final로 불변성을 보장해줄 수도 있지만
주입하는 객체가 계속 바뀌는 경우도 있을 것이다.
그럴 때는 메서드로 주입하는 방법을 사용할 수 있다.

2. 필드 주입

3. Lombok을 통한 주입
@RequiredArgsConstructor을 사용하면 final이나 @NotNull인 필드를 포함하는 생성자를 생성해주기 때문에 의존 주입이 된다.

📌Component와 ComponentScan
Spring 프레임워크는 필요한 객체를 생성/관리해준다.
객체가 Spring Bean에 등록되면 Spring의 관리하에 들어가고, 의존 주입 역시 Spring이 관리한다.
💡용어 설명
Bean 이란?
→ 스프링이 관리하고 있는 객체
→ Bean의 이름은 클래스명에서 앞글자만 소문자로 바꾼것이다. (ex: MemoService → memoService)
IoC 컨테이너
→ 이 관리되고 있는 객체들이 모여있는 컨테이너
@Component
→ 클래스를 스프링이 관리하는 Bean객체로 등록하기 위한 어노테이션
@Component 어노테이션을 달면 어떻게 Bean으로 등록되고, 컨테이너에서 관리될까?
스프링에는 @ComponentScan 이라는 어노테이션이 존재한다. @Component 를 찾아주는 어노테이션이다.
프로젝트 생성 시 기본으로 제공되는 클래스를 살펴보면
@SpringBootApplication이라는 어노테이션이 붙어 있다.

이 어노테이션을 확인해보면 @ComponentScan 어노테이션이 붙어있는 것을 볼 수 있다.
이 어노테이션이 적용되어 있으면, 적용된 위치의 패키지와 그 하위 패키지들을 전부 확인하여 @Component 어노테이션이 적용된 클래스를 찾아 Bean으로 등록한다. 그 후 @Autowired가 달려있는 주입이 필요한 객체를 찾아 주입을 해준다.

아까도 잠깐 등장했지만, 의존 주입을 할 때 @Autowired라는 어노테이션도 사용한다.
당연한 얘기겠지만, @Autowired 는 IoC 컨테이너에서 관리되는 Bean 클래스에만 적용이 가능하다.
📌직접 수동으로 Bean을 등록하는 방법
1. Bean 이름으로 등록
ApplicationContext : bean의 생성, 초기화, 의존주입,소멸 같은 전 과정을 담당하는 IoC컨테이너

2. Bean 클래스 형식으로 가져오기

'SPRING' 카테고리의 다른 글
| Spring Event Driven (수정필요) (0) | 2025.11.04 |
|---|---|
| JAVA/SPRING JPA 연관관계 매핑 (@OneToOne, @OneToMany, @ManyToMany) (0) | 2025.02.26 |