본문 바로가기
Web Programming/Spring

[Spring] Annotation

by Classic! 2020. 8. 6.

[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

댓글