클래스와 클래스의 관계는 상속 구현 의존 연관 집합 composite이 있다
1. 상속
자식이 부모를 가르키는 것 (SubClass, MainClass)
2. 구현
부모가 인터페이스일 때 자식은 실체화한 것(implement)
3. 의존
depnedency injection
4. 연관
main클래스에 subClass가 변수로 들어오는 것
5. 집합(loosely coupling)
전체와 부분 lifeCycle이 같지 않을 때
6. Composite
전체와 부분(필수) lifeCycle이 같을 때
IOC
IOC는 제어의 역전이라고 하며 Container가 개발자대신 제어하기 때문이다.
loc container인 Spring이 객체의 생성과 의존성을 관리한다. 따라서 우리는 mata설정파일만 만들면 된다.
IOC를 Spring에서 구현하는 방법은 크게 2가지(XML, Annotation)가 있으며 injection하는 방법은 세가지
(Setter Injection, Constructor Injecttion, Method Injection)가 존재하는데 그 중 setter와 constructor를 자주 사용한다.
용어
IoC용어 | 설명 |
빈(bean) | container가 관리하는 객체 |
빈 팩토리 | 빈을 생성하고 소멸하는 lifeCycle를 관리하는 인터페이스 |
어플리케이션 컨텍스트 | 빈 팩토리를 바로 사용하지 않고 빈 팩토리 + 추가기능을 붙인것 applicationcontext를 xml에서 사용할 때 사용하는 것이 GenericXmlApplicationContext 클래스 Annotation을 사용시 사용하는 것이 AnnotaionApplicationContext 클래스 |
설정정보/ 설정메타정보 | 어플이케이션 컨텍스트 및 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보 |
스프링 프레임워크 | IoC 컨테이너, 어플리케이션 컨텍스트를 포함한 스프링이 제공하는 모든 기능을 칭함 |
DI(Dependency Injection) in Spring
1. DI의 개념
각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 Contaioner가 자동으로 연결해주는 것이다.
객체는 interfacedp에 의한 의존관계만 알고 있으며, 구현 클래스에 대한 차이를 모르기 때문에 서로 다른 구현체로 대체가 가능하다.
2. DI의 유형
유형 | 설명 |
Setter Injection | setter method를 이용한 injection이며 <property>를 이용하여 주입해준다. |
Constructor Injection | 생성자를 이용한 injection이며 <Constructor-arg>를 이용하여 값을 지정한다. 이전과 같이 순서에 맞게 바인딩하며 index로 순서를 지정해줄 수 있지만 지정하지 않는다면 순서대로 해당되는 값을 넣어준다. setter와 다르게 id가 아닌 name으로 설정한다 |
Method Injection | 일반 method를 이용한 injection (일반적으로 사용x) |
생성자 | Setter | |
장점 | Bean객체를 생성하는 시점에 모든 의존 객체 주입 | 이름을 통해 어떤객체가 주입되는지 쉽게 알 수 있음 |
단점 | parameter의 개수가 많을 경우 어떤 객체에 binding하는지 생성자코드를 일일이 확인해야함 | NULL POINTEXCEPTION이 발생할 확률 높음 |
각자의 장단점이 있기때문에 섞어서 사용하는 것을 권장 |
Collection을 이용하여 set하기
Collection | |
List타입 | <list>와 <value> |
Set타입 | <set>과 <value> |
Map타입 | <map>과 <entry> |
Properties타입 | <props>와 <prop> |
<bean>
<property name="user">
<list>
<value>감자</value>
<value>고구마</value>
<value>호박</value>
</list>
</property>
</bean>
<bean>
<property name="user">
<set>
<value>감자</value>
<value>고구마</value>
<value>호박</value>
</set>
</property>
</bean>
<bean>
<property name="user">
<map>
<entry key="감자" value="5000원" />
<entry key="고구마" value="3000원" />
<entry key="호박" value="7000원" />
</map>
</property>
</bean>
<bean>
<property name="user">
<props>
<prop key="감자">5000원</prop>
<prop key="고구마">3000원</prop>
<prop key="호박">7000원</prop>
</props>
</property>
</bean>
3. Sprin DI Container
Beanfactory는 객체의 lifeCycle(등록, 생성, 조회, 반환)을 관리하는데 일반적으로는 Beanfactory를 재정의하는 것이 아닌 하위 interface인 ApplicationContext를 재정의한다. 따라서 BeanFactory의 하위인 ApplicationContext는 BeanFactory와 같은 기능을 가지고 있으며 지금까지 사용한 GenericXmlApplication 역시 BeanFactory의 하위 인터페이스 중 하나이다.
4. DI 설정 메타정보
메타정보 | 설명 |
xml | xml파일을 생성하여 bean객체를 설정하는 것 |
Annotaion | Annotaion을 이용하여 bean객체를 설정하는 것(반드시 @Configutaion이 있어야함) |
5. DI의 장점
º java file의 수정 없이 Spring설정파일을 수정하여 각각의 부품들을 생성/조립이 가능하다
º 상속은 superClass와 subClass가 서로 단단하게 묶여있는 tidhtly Coupling이지만 interface를 이용하여 loosly coupleing이 가능하다.
ex)
class를 이용하여 설정하는 것이 아닌 xml 또는 annotaion을 이용하여 설정하는 방식을 DI라고 하며 직접적으로 정보를 수정하는 것이 아닌 설정파일에서 수정하기때문에 수정 및 삭제에 용이하다.
6. Bean 등록 Annotaion
Annotation | 설명 |
@Component | - 목적에 그 역할이 바뀌며 repository, sevice, contorller로 바뀜 - Ioc Contaioner가 관리하는 객체 |
@Repository | - 데이터 액세스 계층의 DAO 또는 Repository클래스에 사용 - db의 속성을 가지고 있음 |
@Service | - 서비스 계층의 클래스에 사용 - 받아온 db의 정보를 controller에게 넘겨준다 |
@Controller | - 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 설정 - view와 관련 |
º 많은 클래스 중 어느 클래스가 Component인지 알게하려면 scannig을 해야한다. Annotation이기때문에 클래스 이름은 중요하지 않으며 위에 어떤 Annotation이 있는 지에 따라 각자 수행하는 역할이 다르다. Repository, Service, Controller는 Componet의 구체적인 형태이고 mvc에서는 직접적으로 사용해야 한다.
º 보통 클래스의 이름을 이용하여 찾지만 @Value를 사용하여 상대방이 호출할 때의 이름을 지정할 수도 있으며 id의 역할을 수행한다.
7. Bean 의존관계 주입
Annotaion | 설명 |
@Autowired | - 타입으로 찾는다 - 부족할 경우 Qualify를 이용 |
@Resource | - 이름으로만 검색한다 |
@Inject | - 라이브러리를 추가해야 사용가능 |
자동 바인딩 쓰지 않는다면 Setter를 이용해야하며 외부로 직접 정보를 집어넣어야한다. 하지만 위에 있는 Annotation을 이용하면 자동으로 binding해준다.
<Componet-scan>을 이용해야 자동 바인딜기능을 사용할 수 있다.
'spring정리' 카테고리의 다른 글
JPA와 영속성 관리 (0) | 2022.05.16 |
---|