의존관계주입이란
객체 간의 관계를 설정하는 방법 중 하나로 , 한 객체가 다른 객체를 사용할 때 직접 생성하거나 관리하는 대신 외부에서 해당 객체를 주입받아 사용하는 것을 의미한다.
일반적으로 객체는 다른 객체와 협력하여 작업을 수행한다.
객체는 직접 협력 객체를 생성하고 관리하는 방식으로 코드를 작성할 수 있다.
위의 그림처럼 a class 를 상속받은 b class와 c class 는
a class에 오류가 발생 한다면 b,c class 또한 오류가 발생 할 수 밖에 없다. 이러한 방식은 객체들 간의 결합도가 높아져 유지보수가 어려워지고 코드의 재사용성과 테스트 용이성도 떨어진다.
이러한 문제를 해결하기 위해 등장한 개념이 의존관계주입 입니다.
객체가 직접 협력 객체를 생성하거나 관리하는 대신 외부에서 필요한 협력 객체를 주입하는 방식입니다.
이렇게 하면 객체는 협력 객체를 생성하고 관리하는 책임에서 벗어나며, 의존하는 객체의 구체적인 구현에 의존하지 않고 인터페이스나 추상화 에 의존할 수 있다.
객체 간의 결합도를 낮추고 코드의 유지보수성과 재사용성을 높일 수 있다.
다양한 기능과 지원을 통해 개발자는 더욱 효율적인 개발을 할 수 있다.
클래스들(객체들) 간에 의존관계가 느슨해야 유지보수가 편하다.
어떻게 해야 의존관계가 느슨해질까 ?
여기서 드릴 class의 매소드를 변경한다하면 현재 코드 또한 오류가 발생한다.
-> 둘 사이의 관계가 견고하기 때문이다.
😎 이 관계를 느슨하게 하기 위해서는 new하지 않고 직접 주입 받아서 쓰게 하는 방법을 써야한다.
Drill이 interface 타입이 되어서 주입을 받아야함!
Servlet-context.xml에 아래 코드를 복사하기!
Servers/context.xml 에 설정된 oracle 접속정보 가 있어야 된다.
⌨ 코드
<beans:bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/myoracle"/>
</beans:bean>
Configuration.xml 문서가 어디에 있는지 알려야 한다.
value 에서 classpath: 은 src/main/resources 폴더를 가리킨다.
따라서 classpath:Configuration.xml 은 src/main/resources 폴더안에 존재 해야 한다.
⌨ 코드
<beans:bean id="sessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource"/>
<beans:property name="configLocation" value="classpath:Configuration.xml"/>
</beans:bean>
MyBatis의 SqlSessionTemplate을 설정하는 부분
SqlSessionTemplate은 MyBatis와 Spring을 연결하여 MyBatis의 SqlSession을 사용할 수 있게 해주는 클래스이다.
Mybatis를 이용하면 dao를 작성할때 코드가 간결해진다.
Mybatis란,,
객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거 합니다. Mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있습니다.
⌨ 코드
<beans:bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<beans:constructor-arg name="sqlSessionFactory"
ref="sessionFactory"/>
</beans:bean>
dataSource = new JndiObjectFactoryBean();
dataSource.setJndiName("java:comp/env/jdbc/myoracle");
sessionFactory=new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation("classpath:xxx");
new SqlSessionTemplate(sessionFactory);
자동으로 컴포넌트를 검색하고 인식하여 빈(bean)으로 등록하는 과정이다.
그 객체가 사용 되는 시점에서 spring이 표시 된 위치에서 사용된다.
컴포넌트로 등록하려는 클래스에 어노테이션을 추가합니다. 이 어노테이션은 해당 클래스를 Spring의 빈으로 등록하겠다는 표시.
@controller, @Service, @Repository, @Component 등의
어노테이션이 붙어 있는 클래스를 찾아서 bean으로 만든다.