。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

강의/Spring

[Spring 입문] 4. 스프링 빈과 의존관계

quarrrter 2023. 12. 11. 00:40

 

스프링 빈(Spring Bean) 스프링 프레임워크에서 관리되는 객체

스프링은 객체 지향 프로그래밍의 장점을 활용하여 애플리케이션을 개발하는데, 이때 많은 객체들이 생성되고 관리되어야 합니다. 

스프링 빈은 이러한 객체들을 스프링 컨테이너가 생성, 관리, 조립하여 제공하는 것입니다.

특징:
생성과 소멸의 관리:

스프링 컨테이너가 객체의 생성과 소멸을 담당하므로 개발자는 객체의 생명주기를 직접 다룰 필요가 없습니다.
의존성 주입(Dependency Injection):

스프링은 빈을 생성하고 조립할 때 의존성 주입(DI)을 통해 필요한 의존 객체들을 자동으로 주입합니다. 이로써 객체 간의 결합도가 낮아지며 유지보수와 테스트 용이성이 향상됩니다.
스코프 관리:

스프링은 빈의 스코프를 관리하며, 싱글톤, 프로토타입 등 다양한 스코프를 지원합니다.

스프링에서 "스코프(scope)"란 빈(Bean)이 생성되고, 존재하며, 어떤 범위에서 사용될지를 나타냅니다. 
스프링은 다양한 스코프를 제공하여 빈의 생명주기와 사용 범위를 관리할 수 있습니다.
싱글톤 스코프는 스프링 빈이 하나의 인스턴스만을 생성하여 애플리케이션 전체에서 공유하는 스코프입니다.(스프링 기본 설정)

하나의 인스턴스: 
스프링 컨테이너당 하나의 빈 인스턴스가 생성됩니다. 
이 인스턴스는 애플리케이션 전체에서 공유되며, 모든 빈 요청에 대해 동일한 인스턴스가 반환됩니다.

생성 및 소멸: 
싱글톤 빈은 스프링 컨테이너가 시작될 때 생성되고, 컨테이너가 종료될 때 소멸됩니다.

메모리 효율성: 
하나의 인스턴스를 공유하기 때문에 메모리 사용이 효율적입니다. 
주의해야 할 점은 싱글톤 빈이 가변 상태를 가지면 다수의 클라이언트 간에 상태가 공유되므로 스레드 안전성에 유의해야 합니다.


생명주기 콜백:

스프링 빈은 초기화와 소멸 단계에서 사용할 수 있는 생명주기 콜백 메서드를 제공합니다.
AOP(Aspect-Oriented Programming) 지원:

스프링은 관점 지향 프로그래밍을 통해 비즈니스 로직과 관련 없는 부가적인 작업들을 분리하고 관리할 수 있습니다.

 

 

 

컴포넌트 스캔(Component Scanning)

스프링 프레임워크에서 사용되는 기능 중 하나로, 클래스 경로에서 어노테이션으로 표시된 컴포넌트를 자동으로 찾아 스프링 빈으로 등록하는 프로세스

 

@Autowired

스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

DI (Dependency Injection), 의존성 주입:  객체 의존관계를 외부에서 넣어주는 것

객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입 한다.

생성자가 1개만 있으면 `@Autowired` 는 생략할 수 있다.

@Controller
public class MemberController {

 private final MemberService memberService;
 
 @Autowired
 public MemberController(MemberService memberService) {
     this.memberService = memberService;
 }
}

 

=> 하지만 연관된 객체를 찾기 위해선 그 객체가 스프링 빈으로 등록되어 있어야 한다.

 

**스프링 빈을 등록하는 2가지 방법**
1. 컴포넌트 스캔과 2. 자동 의존관계 설정 자바 코드로 직접 스프링 빈 등록하기

 

1. 컴포넌트 스캔 원리

`@Component` 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

`@Component` 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.

`@Controller`
`
@Service`
`
@Repository`

 

 

2. 자바 코드로 직접 스프링 빈 등록하기

@Configuration
 public class SpringConfig {
 
     @Bean
     public MemberService memberService() {
         return new MemberService(memberRepository());
     }
     
     @Bean
     public MemberRepository memberRepository() {
         return new MemoryMemberRepository();
     }
}