카테고리 없음

[Spring] 비즈니스 계층이 왜 있는걸까? (트랜잭션 transaction)

파프리카_ 2020. 10. 28. 10:27
728x90
반응형

비즈니스 계층이 있는 이유 !

- 비즈니스 계층은 다양한  영속성 계층의 기능(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>

[ 결과 ] 

 

 

 

 

728x90
반응형