본문 바로가기

Spring Boot(스프링 부트)

Spring Boot(스프링 부트) > 스프링 빈과 의존관계

저번주에 빡센 일정으로 블로그 포스팅을 못하여 지금 포스팅을 하려고 한다!

김영한 선생님의 스프링 빈과 의존관계, 그리고 간단한 실습 강의를 듣었다

그대로 따라하기 보다는 요약느낌으로 포스팅하려고 한다!

 

먼저 스프링 비번주에 빡센 일정으로 블로그 포스팅을 못하여 지금 포스팅을 하려고 한다!

 

김영한 선생님의 스프링 빈과 의존관계, 그리고 간단한 실습 강의를 듣었다

 

그대로 따라하기 보다는 요약느낌으로 포스팅하려고 한다!

 

 

 

 

Spring Bean(스프링 빈)

 

Spring Bean이란 Spring IoC 컨테이너에서 관리하는 자바 객체로서 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다.

이는 컨테이너가 관리하는 자바 객체이다. Spring에서 객체를 관리해주는 그런 기능이라고 생각하면 될 것이다

 

스프링 빈을 등록하는 방법은 2가지가 있다

1. 컴포넌트 스캔과 자동 의존관계 설정

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

 

우선 컴포넌트 스캔과 자동 의존관계 설정을 설명하겠다!

 

스프링 빈 등록 방법 1 :
컴포넌트 스캔과 자동 의존관계 설정

 

어노테이션이라는 것으로 컴포넌트를 스캔하여 스프링 빈에 등록한다

@Component, @Controller 등이 있고

@Component 를 포함하는 어노테이션은 다음과 같다

@Controller
@Service
@Repository

각각의 어노테이션은 크게 기능으로 나뉜다고 생각하면 이해가 쉬울 것이다

 

@Controller -> 컨트롤러

@Service -> 비즈니스 로직

@Repository -> 저장 관리`

 

@Autowired: 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어주는 어노테이션

이 어노테이션이 등록하면 객체가 생성되는데 스프링한테 그 객체를 가져오게 해 자동으로 주입해주는 어노테이션이

"@Autowired"이다

 

@Controller
public class MemberController {
         private final MemberService memberService;

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

 

여기서 보이듯 MemberController도 현재 스프링 컨테이너의 객체로 등록된 것이다

왜냐하면 어노테이션(@Controller)가 있기 때문

여기서 memberService를 외부에서 넣어주었는데 이것을 의존성 주입이라고 한다

프로그램 내 여러 객체가 생성되는 것을 방지하기 위함이다

보통 @Autowired를 사용하면 이렇게 DI(의존성 주입)을 주로 사용하는 것 같다

의존성 주입에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지가 있는데

보통 생성자 주입을 사용한다

 

정리하자면 생성자에 @Autowired가 있는 경우, 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입하는 방법이다.

생성자가 1개가 있는 경우에 @Autowired를 사용한다면, 이 어노테이션은 생략 가능하다.

 

이렇게 @Controller와 같은 어노테이션을 사용한다면 스프링 컨테이너에 등록된다!

 

MemberService를 다음과 같이 작성하고

public class MemberService {
         private final MemberRepository memberRepository;

         @Autowired
         public MemberService(MemberRepository memberRepository) {
                  this.memberRepository = memberRepository;
         }
}

 

memberRepository도 다음과 같이 작성한다면

@Repository
public class MemoryMemberRepository implements MemberRepository { }

 

스프링 컨테이너는 다음과 같아진다

 

어노테이션으로 스프링 컨테이너에 스프링 빈으로 등록되었고 @Autowired를 통해 서로를 참조하고있는 느낌

 

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다고 한다

싱글톤: 유일하게 하나의 인스턴스로 등록해서 공유하는 방식

 

따라서 같은 스프링 빈이면 모두 같은 인스턴스이다!

 

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


자바 코드로 스프링 빈을 등록한다면 기존에 있었던 어노테이션이 없어야 한다!

있는 경우이면 이미 스프링 빈으로 등록되었기 때문

 

따로 class를 만들어서 그곳에서 스프링 빈으로 등록해준다

강의에서는 SpringConfig.class를 만들었다

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

         @Bean
         public MemberRepository memberRepository() {
                  return new MemoryMemberRepository();
         }
}

 

@Configuration이라는 어노테이션으로 스프링 빈을 등록한다는 것을 스프링에 알려준다!

@Bean 어노테이션으로 선언한 클래스는 스프링 컨테이너에 스프링 빈으로 등록해준다

 

어노테이션과 같은 방식으로 둘 중 하나를 선택하면 된다

 


 

슬슬 어려워지기 시작하는 것 같다

수업시간에 Bean 관련해서 수업을 했었는데 사실 이해가 안돼서 그냥 넘어간 내용 중 하나였는데

이렇게 맞딱뜨리게 되니 당황스러웠고 그래서인지 더 집중하며 들었던 거 같다!

나중에 볼 때 정리되어 있는 핵심만 보면 좋을 거 같아서 앞으로 핵심만 정리하려고 한다

시험기간에 강의를 듣고있으니 급급하지만 그래도 강의를 들을 때에는 집중해서 들어야 겠다!