[Spring] 비즈니스 계층이 왜 있는걸까? (트랜잭션 transaction)
비즈니스 계층이 있는 이유 !
- 비즈니스 계층은 다양한 영속성 계층의 기능(DAO)을 일관성있게 관리하기 위해서 사용한다.
+ Transaction 처리 = 업무 정의를 위해 사용한다.
1. Maven 설정
(프로젝트 오른쪽 마우스 → 'convert to maven .. ' → pom.xml에 <dependency> 추가 (pom = project of model) )
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
2. ioc.xml 설정
(src 에서 new → other → Spring Bean Configuration File → ioc.xml 생성
3. memberDAO <<interface>> 생성
- register(String memberInfo) : void
4. PointDAO<<interface>> 생성
- register(String pointInfo) : void
5. MemberDAOImpl 생성 (implements MemberDAO)
6. PointDAOImpl 생성 (implements PointDAO)
7. MemberService <<interface>> 생성 : 트랜잭션 처리 (실행 중 문제 발생 시 rollback, 정상 실행 시 commit)
- register(String memberInfo, String pointInfo) : void
8. MemberServiceImpl 생성 (implements MemberService)
> 인스턴스 변수 : MemberDAO, PointDAO - 반드시 인터페이스 타입으로 관리! (유지보수성을 위해)
>생성자 : MemberServiceImpl(MemberDAO, PointDAO) { }
- Spring Container가 두 개의 DAO 구현 객체를 DI(주입)하도록 ioc.xml에 설정 (*DI : Dependency Injection)
> 오버라이딩 : register(String memberInfo, String pointInfo) : void
- MemberServiceImpl를 실행하면, MemberDAO와 PointDAO의 register가 트랜잭션 처리되어 실행되도록 !
9. TestIOC 생성
- factory 생성 : ClassPathXmlApplicationContext("ioc.xml")
- DL방식으로 memberService를 getBean해오기
- memberService의 register(memberInfo, pointInfo)실행
10. ioc.xml 수정
<bean>으로 MemberDAOImpl(id=memberDAO)와 PointDAOImpl(id=pointDAO)를 받아옴
&&
<bean> 으로 model.MemberServiceImpl(id=memberService)를 받아옴
+
<constructor-arg>으로 memberService를 생성하기 위해 생성자의 요소인 memberDAO와 pointDAO를
추가해준다.
/model
영속성 계층
/MemberDAO.java <<interface>>
package model;
public interface MemberDAO {
public void register(String memberInfo);
}
/MemberDAOImpl.java
package model;
public class MemberDAOImpl implements MemberDAO {
@Override
public void register(String memberInfo) {
System.out.println("회원 "+ memberInfo + " 정보 DB에 INSERT");
}
}
/PointDAO.java <<interface>>
package model;
public interface PointDAO {
public void register(String pointInfo);
}
/PointDAOImpl.java
package model;
public class PointDAOImpl implements PointDAO {
@Override
public void register(String pointInfo) {
System.out.println("포인트 "+ pointInfo + " 정보 DB에 INSERT");
}
}
비즈니스 계층
/MemberService.java <<interface>>
package model;
public interface MemberService {
/**
* 회원 가입 시, 회원정보테이블과 포인트정보테이블에
* 정보를 저장하는 메서드이다.
* 만약, 실행 중 문제가 발생하면 rollback하고,
* 모든 작업이 정상 실행되었을 때만 실제 DB에 반영되도록 한다. (commit)
* ==> Transaction 처리
*
* @param memberInfo
* @param pointInfo
*/
public void register(String memberInfo, String pointInfo);
}
/MemberServiceImlp.java
package model;
public class MemberServiceImpl implements MemberService {
//반드시 인터페이스 타입으로 관리!
private MemberDAO memberDAO;
private PointDAO pointDAO;
//Spring Container가 두 개의 DAO 구현객체를 DI하도록 ioc.xml에 설정
public MemberServiceImpl(MemberDAO memberDAO, PointDAO pointDAO) {
super();
this.memberDAO = memberDAO;
this.pointDAO = pointDAO;
}
@Override
public void register(String memberInfo, String pointInfo) {
System.out.println("--트랜잭션 처리--");
memberDAO.register(memberInfo);
pointDAO.register(pointInfo);
System.out.println("--트랜잭션 처리 완료--");
}
}
/test
/TestIOC.java
package test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import model.MemberService;
public class TestIOC {
public static void main(String[] args) {
ClassPathXmlApplicationContext factory
= new ClassPathXmlApplicationContext("ioc.xml");
MemberService memberService
= (MemberService) factory.getBean("memberService");
memberService.register("파프리카", "3000");
factory.close();
}
}
/ioc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberDAO" class="model.MemberDAOImpl"></bean>
<bean id="pointDAO" class="model.PointDAOImpl"></bean>
<bean id="memberService" class="model.MemberServiceImpl">
<constructor-arg>
<ref bean="memberDAO"/>
</constructor-arg>
<constructor-arg>
<ref bean="pointDAO"/>
</constructor-arg>
</bean>
</beans>
[ 결과 ]