- DI, IoC, Bean-
DI(Dependency Injection) IoC(Inversion of Control) 스프링 중에 만나는 개념의 일부.
하나의 개념을 설명하는데 개념들을 이해하게 위해서 1/Design Pattern인 'singleton' Pattern을 알아야 한다.
SIngleton
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하여 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 사용해야하는 이유는 만약 우리가 만들었던 DI 컨테이너인 요청을 할 때마다 새로운 객체를 생성한다. 요청이 엄청나게 많은 트래픽 사이트에서는 계속 객체를 생성하게 되면 메모리 낭비가 심하기 때문이다.
즉,
고정된 하나의 메모리를 사용하기 때문에 쓸데없이 같은 일을 하는 여러개의 객체가 메모리를 사용하여 낭비가 일어나는 것을 방지할 수 있다.
IoC
이때 나오오는 개념이 바로 IoC Container이다. 한국말로 제어의 역전이라는 의미.
말 그대로 개발자가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 된다는 디자인 패턴이다. 뒤에 붙은 contariner의 의미는 말 그대로 Spring 애플리케이션이 실행됨과 동시에 생성된 Bean들을 담고 있기 때문에 Container라는 이름이 붙은 것이다.
DI
위에서도 언급했듯이 IoC와 DI는 같은 개념이다. IoC는 매우 포괄적인 의미를 담고 있기 때문에, 용어에서 혼동을 줄 수 있다고 생각한 Martin Fowler는 2004년 Dependency Injection이라는 용어를 만들어낸다. 그래서 현재는 상위 모듈에 의존하는 하위 모듈의 생성자, 프로퍼티, 메서드를 통해 주입하는 것을 DI라고 부르고 있다.
즉, 클래스간의 의존관계를 빈 설정정보를 바탕으로 컨테이너가 자동으로 연결 해주는 것이라고생각하면 되겠다.
스프링에서는 빈의 생성 소멸 등 생명 주기를 컨테이너가 관리하고, '필요로 하는 곳'에 알아서 DI해주는데,
필요로 하는 곳이란 해당 '타입'의 객체를 사용하는 곳을 말한다.(타입기반 매칭)
아무 해당 타입의 객체를 사용하는 것이 아니다. 컨테이너에게 이 빈이 필요할 것 같으니까 DI해달라고 명시해줄 2가지 방법을 알려준다.
1. Constructor-based DI
2. Setter-based DI
Bean
Spring은 싱글톤(Singleton Pattern) 개념이 적극적으로 투영된 프레임워크인데, 흔히 말해 Bean이라고 불리는 객체가 이와같이 애플리케이션 안에 하나만 존재하는 객체를 이야기한다. 예전 Spring Framework를 사용할 때는 xml파일에 빈을 하나씩 등록시켜주어야 했지만, 현재 버전에서는 어노테이션을 사용해서 간단하게 Bean을 등록할 수 있다.
사용하는 이유는 각각의 자바 클래스들이 의존 관계를 가지고 있어, MVC 구조에 따라 설계를 하면 먼저
Model클래스를 만들고, Model 객체들을 담게 되는 Repository 클래스를 구현하게 된다. 또 생성된 Repository에 인덱싱 하기 위한 Service클래스가 있고 Controller는 Service를 통해 Model이 담겨 있는 Repository에 접근한다.
웹 프로그래밍은 멀티 유저에 대한 동시성 제어가 중요하고, 스프링 컨테이너에서는 싱글톤 패턴(Singleton Pattern)으로 관리한다.
Bean 의존관계 설정([스프링 컨테이너] 아직 의존 관계가 없는 빈(Bean))
>>> 스프링 빈을 등록해 해결 되는 것은 아니며, 싱글톤 객체로 생성되 관리되는 클래스들의 의존 관계를 연결해주어야 한다.
1. 자동 의존 관계
컴포넌트 스캔을 이용해 스프링 빈들 등록했을 때는 클래스의 생성자에 @Autowired 어노테이션을 명시한다.
*@Autowired 생략 조건*
- Spring 4.3ver부터 @Autowired 생략 가능.
- 생성자 선언이 1개일 때 생략 가능.
- 파라미터가 다른 생성자들.
- Lombok의 @RequiredArgsConstructor를 사용하면 다음과 같이 코딩 가능하다.
2. 수동 의존 관계
자동 의존 관계의 어노테이션이 아닌 컨피규레이션을 통해 빈을 등록한 경우, 실제 클래스의 구현된 생성자의
형태와 동일하게 객체를 아래의 수동 어노테이션을 통해 컨피규레이션에서 리턴해주면 된다.
Bean이 사용되기 위한 어노테이션
1. @Controller
2. @Service
3. @Repository
4. @Component
5. @Bean
항해에는 체크 인,아웃 시스템이 있어 수강생들의 개인 출퇴근, 개인 공부량(및 현재 총) 시간, 수강생들의 총 공부 시간, 항해를 시작하며 오늘까지의 일차까지 구현되있다.
오늘로 21일차 일요일이다. 사실 하루하루 같은 패턴으로 지내고 살다보니, 오늘이 월요일인지 토요일인지는 반배정을 통해 리셋되 알게 된다. 주의 금요일 항해 출근 시간에는 배정된 조로 이동을 하게 된다. 새로우면서도, 기대되면서도, 설레면서도, 두려움이 따라온다. 소통? 아니. 분위기? 아니. 적응? 아니. 배정될 때마다 주차는 바뀌어 있고, 커리큘럼도 바뀌어 있어서 주차에 걸맞는 마음가짐이나, 시간관리, 정신력, 실력, 집중력이 밑받침이 잘 되어 있어주면 좋은데. 마치 내 마음은 아직도 20대야, 아직도 대학생이야와 같은 현재가 아닌 과거에 머물러 있는 것이 매우 두려운 것이다. 비유가 맞진 않으나 글자만으로 보았을 때 어떤 상황인지 가늠이 갈 것이다.
늘어야 하고, 늘어야 하며, 바뀌어야 하고, 바뀌어야 한다. 달라져야하고 달라져야 한다. 더 집중해야하고 집중해야 된다.
벌써 21일차 믿기지 않을 시간이 흘렀고, 생각보다 3개월이란 기간은 길지 않다. 하루가 짧기에.