[Annotation]
이전에 Bean 설정 문서에 관하여 포스팅한 적이 있다.
https://icefree.tistory.com/entry/Spring-MyBatis-Bean-%EC%84%A4%EC%A0%95%EB%AC%B8%EC%84%9C
[Spring] Bean 설정문서
[Bean 설정 문서] 본 글에서는 bean설정 문서에서 Presentation Layer, Service Layer, Persistence Layer, Data Access/Intergration Layer에 존재하는 Component(=bean)을 입력한다. 여기서 Spring framework가..
icefree.tistory.com
위 글에서 언급했듯이, Bean은 Layer의 Bean(=Component) 개수가 늘어날 때마다 Bean 설정문서에 하나하나 입력해야 하는 번거로움이 있다. 또한, 프로젝트가 커질 경우 여러 bean을 나열하면서 xml 문서가 길고 복잡해진다. 이러한 문제점을 Spring에서는 Annotation으로 해소하고자 한다.
[Annotation 사용 방법]
Component 위에 @Component를 삽입하여 나타낸다.
Annotation은 @Component로 표시할 수 있으나 어떤 Layer에 위치한 Component인지 보다 명확히 하기 위해 @Layer명으로 지정한다.
- Bean 설정문서에서 persistence Layer의 컴포넌트인 DAOImpl와 Service Layer의 컴포넌트인 ServiceImpl을 @Annotation 처리한다.
다만, DAOImpl, ServiceImpl에서 Annotation 작업을 선행한다.
- DAOImpl
package ibatis.services.user.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
@Repository
public class MyBatisUserDAOImpl13 implements UserDAO{
/*
* 클래스에서 가장 중요한게 필드! 필드에 값을 주입하는 방법은 setter/getter
* 그런데 setter/getter 때문에 재사용성이 급격히 저하된다.
* 따라서 setter/getter 대신 @Autowired로 값 주입
*/
@Autowired
private SqlSession sqlSession;
// SqlSession은 DAO에서 필드로 선언했으므로 Autowired 설정하고 설정문서에서 DAOImpl 지우기
@Override
public int addUser(User user) throws Exception {
int result=sqlSession.insert("UserMapper10.addUser",user);
return result;
}
@Override
public int updateUser(User user) throws Exception {
int result=sqlSession.update("UserMapper10.updateUser",user);
return result;
}
}
- ServiceImpl
package ibatis.services.user.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
import ibatis.services.user.UserService;
// Service Layer라서 @Service
@Service
public class MyBatisUserServiceImpl13 implements UserService{
// @Autowired 로 UserDAO(DAOImpl의 인터페이스) 가져오기
@Autowired
private UserDAO userDAO;
@Override
public void addUser(User user) throws Exception {
userDAO.addUser(user);
}
@Override
public void updateUser(User user) throws Exception {
userDAO.updateUser(user);
}
}
- Bean 설정 문서
DAOImpl에서 @autowired로 SqlSession값을 주입하도록 설정했기 때문에 Bean 설정 문서에서 DAOImpl, ServiceImpl에 해당하는 4,5번 Bean 삭제할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- wiring -->
<context:property-placeholder location="classpath:config/dbconn.properties"/>
<!-- 1. Data Source API Bean -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</bean>
<!-- 2. SqlSessionFactory API Bean-->
<bean id="SqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 3. SqlSession API Bean -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="SqlSessionFactoryBean"/>
</bean>
// <!-- 4. DAOImpl12 사용자정의 Bean -->
// <bean id= "myBatisUserDAOImpl12" class="ibatis.services.user.impl.MyBatisUserDAOImpl12">
// <property name="sqlSession" ref="sqlSession"/>
// </bean>
// <!-- 5. ServiceImpl12 사용자정의 Bean -->
// <bean id= "myBatisUserServiceImpl12" class="ibatis.services.user.impl.MyBatisUserServiceImpl12">
// <property name="userDAO" ref="myBatisUserDAOImpl12"/>
// </bean>
<context:component-scan base-package="ibatis.services.user.impl"/>
<!-- Container가 해당 패키지를 돌면서 파일 내 '@'를 탐색 -->
</beans>
위 코드에서 보듯이 Annotation은 xml의 길이를 줄여줄 뿐만 아니라, @autowired로 클래스에서 필드에 값을 주입하는 setter/getter를 대체한다. setter/getter는 필드명을 바꿀 때 함께 수정해야 하는 항목 중 하나로, 필드가 증가할수록 그 수가 동반 증가하여 DAO의 재사용성을 저하시키는 요인이 되기도 한다.
따라서 Spring에서는 Annotation을 활용하여 setter/getter를 명시하지 않아도 되므로 DAOImpl의 재사용성을 높인다.
'Web Programming > Spring' 카테고리의 다른 글
[Spring] File Upload/Download (0) | 2020.08.11 |
---|---|
[Spring] BeanNameViewResolver (0) | 2020.08.10 |
[Spring] Bean 설정문서 (0) | 2020.08.06 |
[Spring] My Batis - SQL (1) | 2020.08.05 |
[Spring] MyBatis Data Access (0) | 2020.08.04 |
댓글