자바 빈이 뭔데 씹덕아! 자바콩!자바콩! - 윤영현
스프링 프로젝트를 하면서 @Bean이라는 어노테이션을 자주 보게되었는데
이게 뭔지 정확하게 이해가 안돼서 정리해 보고자 한다.
1. 스프링 빈
스프링 Ioc 컨테이너가 관리하는 객체를 빈(Bean)이라고 한다.
자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져 있습니다.
이때, 객체들은 독립적으로 동작하는 것 보다 서로 상호작용하여 동작하는 경우가 많습니다.
이렇게 상호작용하는 객체를 '객체의 의존성'이라고 표현합니다.
스프링에서는 스프링 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입(DI)하는 역할을 해줍니다.
그리고 스프링 컨테이너에 등록한 객체들을 '빈'이라고 합니다.
먼저 스프링 Ioc에 대해 먼저 알아보자.
IoC(Inversion Of Control)
IoC(제어 반전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미합니다.
컴포넌트 의존관계 설정(Component dependency resoulution), 설정(Configuration) 및 생명주기(LifeCycle)을
해결하기 위한 디자인 패턴(Design Pattern)입니다.
IoC 컨테이너
컨테이너? - 컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것
스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데,
왜 이름이 컨테이너..?
내가 아는건 이런 컨테이넌데 어디서 튀어나와서 컨테이너인척 하는거야..
위에거 다 해주면 그냥 매니저라고 하던가...
인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해줍니다.
객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있습니다.
아하! 그럼 내가 관리 안하고 손놓고 있어도 애가 해주는구나!
- IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
- 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
- 개발자는 비즈니스 로직에 집중할 수 있다.
- 객체 생성 코드가 없으므로 TDD가 용이하다.
Ioc 컨테이너가 객체의 생성을 책임진다는데 내가 하나씩 써주는건데 왜 쟤가 하는척함?
POJO? 푸조가 뭐임 푸주는 아는데
POJO(Plain Old Java Object)에 대해 알아보자
대충 순수하고 오래된 자바 객체?를 있어보이게 쓴말이라고한다.
스프링(Spring)에서의 POJO
스프링 프레임워크는 IoC(Inversion of Control, 제어의 역전) 컨테이너 안에서 POJO를 구성 및 관리하는 것이 가장 핵심으로 POJO를 매우 잘 다루는 프레임워크가 스프링 프레임워크이다.
Java EE 등을 사용할 때에 비해서 특정 인터페이스를 구현하거나 상속 할 필요 없고 라이브러리를 지원하기에 용이하며 객체 또한 가벼운 것이 특징이다.
확장이나, 인터페이스 구현, 어노테이션같은 양념이 들어간건 순수(Plain)하지 않다. 그래서 포조가 아님
IOC는 두개로 분류할수 있따
바로 DL(Dependency Lookup) 과 DI(Dependency Injection) 로 나눠지는데
- DL : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는 것
- DI : Spring에서 새롭게 지원하는 IoC의 한 형태로써 각 계층 사이, 각 Class 사이에 필요로 하는 의존관계가 있다면 이를 컨테이너가 자동적으로 연결시켜 주는 것(@Autowired, @Qualifier)으로 각 Class 사이의 의존관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것이다.
DL 사용시 컨테이너 종속이 증가하기 때문에 주로 DI를 사용합니다.
라고 하니 DI만 써야겠다
어려운말
외부에서 객체를 생성후 주입시켜주게 되면 두 객체사이에 약한 결합으로 형성되게 된다.
그러나 내부에서 new를 사용하여 객체를 생성하게되면 두 객체사이에 강한 결합으로 형성이 된다.
강한 결합으로 생성시 객체에대한 의존성이 강해지므로 객체의 교체가 어렵게 된다..
반면 약한 결합으로 객체를 생성한다면 의존성이 약해지므로 객체를 쉽게 교체할 수 있게된다.
스프링 컨테이너에 Bean을 등록하는 두 가지 방법
빈을 등록하는 방법은 기본적으로 두 가지 방법이 있다고 한다.
1. @Component 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록
1. 컴포넌트 스캔과 자동 의존관계 설정
스프링 부트에서 사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법은 클래스 선언부 위에 @Component 어노테이션을 사용하는 것입니다.
@Controller, @Service, @Repository는 모두 @Component를 포함하고 있으며
해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록됩니다.
2. 자바 코드로 직접 스프링 빈 등록
이번에는 수동으로 스프링 빈을 등록하는 방법에 대해 알아보겠습니다.
수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용 해야 합니다.
정 클래스를 만들고 @Configuration 어노테이션을 클래스 선언부 위에 추가하면 됩니다.
그리고 특정 타입을 리턴하는 메소드를 만들고, @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됩니다.
MemberRepository는 인터페이스이고, MemoryMemberRepository가 구현체이기 때문에 MemoryMemberRepository를 new 해줍니다.
스프링 컨테이너가 관리하는 객체를 빈(Bean)이라고 하고,
이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory) 라고 부릅니다.
'수업정리 > JAVA' 카테고리의 다른 글
DTO, VO, ENTITY? (0) | 2023.06.19 |
---|