Spring에서는 객체를 직접 new Service();와 같이 생성하지 않아도 사용할 수 있게 설정할 수 있다.
new Service와 같은 객체화를 Spring에 맡기는 것이다.
- 컨트롤러 -
@Controller
public class MemberController {
// 의존성 주입용 필드 선언
// 어노테이션 + Interface 타입
@Autowired
private MemberService ms;
// 인터페이스를 상속받는 객체에 @Component나 @Service 어노테이션이 필요
// 객체 생성 시 new Service와 같은 부분을 Spring에게 맡기는것.
}
- Service 인터페이스 -
public interface MemberService {
}
- Service -
// Component, Service 둘다 사용 가능
/*@Component*/
@Service
public class MemberServiceImpl implements MemberService {
}
위와 같은 Member java 파일들이 있다고 할 때
컨트롤러에서 객체를 자동 생성해 주는 부분은
@Autowired
private MemberService ms;
이 부분이다.
어노테이션 @Autowired를 위에 명시하고
객체화 할(MemberServiceImpl) Java 파일 상단에
서비스의 경우는
@Component
@Service
Dao의 경우는 @Repository
해당하는 어노테이션을 명시한다.
이런식으로 어노테이션을 명시해두면
@Autowired
private MemberService ms;
Autowired만으로도 MemberService가 MemberServiceImpl 자바 파일로 객체화 되어 생성된다.
Service나 Dao와 같은 Spring framework 에서 사용하는 기본 패턴의 경우는
@Component, @Service, @Repository와 같은 어노테이션으로 충분하다.
이 외에도 작성자가 계속 간단하게 사용하고 싶어서 임의로 만들고 싶다면 XML 파일에 등록해 두면 된다.
보통 Spring에서는 Service 부분에서 SqlSession 이라는 객체를 생성하여 DB에 접근하기 위한
객체를 만들게 된다.
예전에 JDBCTemplate이라고 Properties 파일을 이용해 설정을 받아
객체를 생성하여 DB를 조회한것과 유사하다.
먼저 SqlSession을 만들기 위해서 mybatis 라이브러리를 다운로드 해야한다.
pom.xml 파일을 열어
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
아래에 <dependency> 태그를 추가하자.
<!-- jdbc 라이브러리 추가 -->
<dependency>
<groupId>com.jslsolucoes</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<!-- 마이바티스 라이브러리 추가 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- spring-jdbc 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- 마이바티스 스프링 모듈 추가 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- dbcp 라이브러리 추가 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
이 태그를 입력하고 파일을 저장하면 Maven이 자동으로 라이브러리 다운로드를 시작한다.
Progress 탭을 보고 다운로드가 완료되면
Problems에서 빨간색으로 된 오류가 있는지 확인해보고
톰캣을 실행시켜 정상적으로 켜지는지 확인해보자.
만약 문제가 있다면 라이브러리가 다운받아지는 폴더인 repository의 폴더들을 삭제하고
프로젝트 우클릭 - Maven - 업데이트를 한번 하고 다시 시도해보자.
오류가 또 난다면 반복
라이브러리가 정상적으로 다운로드 됫다면 root-context xml 파일을 열자.
sqlSessionTemplate을 Bean에 등록하는 작업
<!-- 데이터베이스 접속에 관련된 클래스들을 bean으로 등록할 수 있다. -->
<!-- sqlSessionTemplate 등록 -->
<!-- SqlSessionTemplate 기본 생성자가 비어있지 않기 때문에 아무것도 안넣으면 오류가 난다. -->
<!-- 생성자 매개변수인 sqlSession을 추가해주자. -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession"></constructor-arg>
</bean>
<!-- sqlSession도 bean으로 등록한다. -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- dataSource 객체 bean 등록 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="DB 계정이름을 써주세요"></property>
<property name="password" value="DB 계정비밀번호를 써주세요"></property>
<property name="defaultAutoCommit" value="false"></property>
</bean>
위의 코드를 xml 파일 중간 부분에 아무대나 추가하면 된다.
자동으로 생성될 객체들의 생성자를 설정하는 부분이다.
sqlSessionTemplate은 sqlSession를 인자로 받아 생성되고
sqlSession은 dataSource를 인자로 받아 생성된다.
dataSource의 Property(매개변수 인자들)를 보면 driver 설정, url 설정, 접속계정 설정, 접속비번 설정
설정을 하고 생성하게 된다.
그리고 Auto Commit을 False로 두었을 때 여러개의 DB 작업을 하면
성공한 곳 까지는 commit이 자동으로 되기 때문에 나중에 트랜잭션(AOP를 이용) 기능을 설정해주어야 한다.
이번에는 bean 태그의 속성들을 보자
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"></bean>
id, class를 입력받게 된다.
id는 변수명이라고 보면 되고
class의 경우는 내가 생성할 객체의 해당하는 파일의 위치를 말한다.
org.mybatis.spring 위치에 있는 SqlSessionTemplate 파일을 이용해서 생성한다는 의미
이와같이 root-context.xml에 명시를 하고 톰캣을 실행해보면 정상적으로 자동 생성되는 것을 확인 할 수 있다.
활용으로 자기가 만든 객체도 비슷하게 생성할 수 있다.
Spring IoC(Inversion of Control)란,
프로그램을 돌릴 때 객체 생성, 변경 등 관리를 개발자가 아닌
프로그램을 돌리는 컨테이너가 직접 관리하는 것을 말한다.
Spring Framework는 IoC 구조를 통해서 직접 관리를 수행하게 된다.
우리가 XML에 설정할 부분이 많은 이유이다.
Spring에서 관리하는 객체를 Bean이라고 하고 이 객체들을 관리하는 컨테이너를 Bean Factory라고 한다.
이러한 컨테이너들에 의해 객체의 생명주기와 의존성을 관리하고
코드의 구현시간을 단축하게 해 준다.
또한 메모리 사용에도 좀 더 효율적인 것으로 알 고 있다.
Spring DI(Dependency Injection)란
Spring에서 IoC 구현의 핵심 기술로 의존성 주입을 의미한다.
사용하는 객체들을 개발자가 생성하지 않고 개발자가 xml 파일에 설정해둔
xml 기록을 토대로 컨테이너가 객체에 연결해주는 방법이다.
이러한 방법을 사용하면 코드가 단순해지고
객체간의 결합도(종속 관계)가 느슨해진다.
결합도란 한 클래스에서 필드 객체를 생성 시 발생하는 두 객체 간의 관계를 말하며
객체간의 내용이 수정 될 경우 영향을 미치는 정도라고 한다.
이러한 방식은 프로젝트 협업 시 공동 작업을 하기 때문에 이러한 방법을 사용하면 편의성이 높아지고
모든 객체를 xml에서 간편하게 확인할 수 있다.
생성할 객체에는 꼭 getter, setter가 존재해야 한다.
그리고 자동으로 bean 객체를 찾아서(어노테이션) 생성하는 기능을 Bean Scanning이라고 한다.