티스토리 뷰

트랜잭션이란?

  • 하나의 업무 단위

  • 하나의 업무는 여러개의 작업단위로 쪼개진다. 이것들을 모아둔 것을 트랜잭션이라고 부른다.

    #이런 트랜잭션이 왜 중요할까?

    • 트랜잭션임을 어떻게 알고 롤백을 시킬까? 어플리케이션에서 쿼리를 날리면 바로 커밋이 되는데, 어떻게 롤백을 시킬까?
      • 트랜잭션을 날렸을 때 MyBatis가 커밋을 날린다.
      • 중간에 에러가날 경우, 다 롤백을 시킨다.
      • 즉, MyBatis
  • 트랜잭션을 이해하기 위해서는 관점지향 프로그래밍을 이해해야한다.

관점 지향 프로그래밍(AOP: Aspect Oriented Programming)

  • 공통적으로 적용되는 기능들을 특정 Method 혹은 Class가 실행되기 전/후 등의 단계에서 자동으로 실행될 수 있게 지원하는 프로그래밍 방법.
  • Logging, Transaction, Parameter Check 등 여러 기능들을 대상으로 한다.

  • 자동으로 어떤 로직이 실행되기 전에 공통기능코드가 찍히고, 실행되고나서 또 공통기능코드가 찍힌다.

  • 자바를 컴파일하면 class파일이 나온다. class파일을 까보면 외계어로 잔뜩 써져있고, JVM이 class파일을 가져가서 다시 기계어로 바꾼다.
  • AOP는 java파일을 컴파일하면 클래스파일로 바꾸고, 그 중간에 로그 찍는 클래스파일을 껴넣는다. 그렇게되면 마치 코드가 하나의 자바파일이였던 것처럼 동작한다.
  • 실무에 나가면 Weaving 이라고 말한다. (이 기술은 어려워서 개발자들도 하지 못한다. 자바를 만든 Sun 사도 못하는 일을 Spring이 한다.)

#AOP 설정방법

  1. AOP 설정

    AOP는 공통 기능이 실행될 시점을 제공한다. 이 다섯가지 기능을 advisor라고 한다.

    1) aop:before : 어떤게 실행되기 전에 ~를 해라.

    2) aop:after-returning : 실행이 됬다면 ~를 해라.(실행 결과와 상관없이)

    3) aop:after-throwing : 예외가 발생됬을 때 ~를 실행해라.

    4) <aop:after> : ~가 정상적으로 실행된 직후

    5) <aop:around> : 1)~4)를 포함한 모든 시점

  2. 공통으로 실행될 기능 정의

  3. ApplicationContext.xml에 bean으로 등록시켜준다.

#실습

execution 내용
  • public : 접근 제어 지시자가 public인 것들을 실행시키겠다는 의미
  • *는 모든 리턴 타입
  • com.hucloud.aop.sample2..*의 첫 번째 *은 패키지 내의 모든 클래스를 의미
  • .*을 통해 모든 클래스 내의 모든 메소드를 의미
  • *(..)는 모든 메소드의 파라미터 모든 것을 의미

 

Main.java

 

 

실행하면 다음과 같다.

 

MyBatis 연동

  • ORM : Object Relational Mapping Framework, 객체 관계 맵핑 프레임워크.
  • MyBatis 는 ORM의 한 종류이다.
  • 객체 관계 맵핑을 DB랑 한다.

#Connection Pool

  • 여러개의 커넥션을 미리 만들어서 필요할 때 준다.
  • 동시 접속자 4000명정도를 거뜬히 처리할 수 있다.

#ORM의 종류

  • MyBatis, iBatis, JPA, Hibernate 가 많이 사용되며, 그 중 MyBatis, iBatis의 사용빈도가 가장 높다.
  • MyBatis는 iBatis가 Google Code로 옮겨지면서 이름이 바뀌었다.
  • 2010년경 변경되었는데, 아직도 iBatis를 쓰는 경우가 빈번하다. 그 이유는 2007,8년에 만든것 아직까지도 유지보수하고 있다는 것이다.

설정방법

  1. pom.xml 에 Maven Repository 추가

    이게 없으면은 ojdbc를 받아올 수 없다.

  2. dependency 추가

    • 총 6가지가 필요하다.
    • ojdbc, mybatis-spring, mybatis, spring-jdbc, aspectjweaver 를 추가한다. commons-dpcp 1.4를 추가한다.

 

 

3.  rootContext.xml 생성

 

 

커넥션을 만들어준다. 현재 시간 찍는거니 HR계정도 무방하다.

4. rootContext.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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

<!-- 커넥션 만들어준다 -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
      <property name="url" value="jdbc:oracle:thin@localhost:1521:XE" />
      <property name="username" value="HR" />
      <property name="password" value="hr" />
   </bean>

   <!-- MyBatis가 사용할 Database에 연결하도록 설정 -->
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource"></property>
   </bean>

   <!-- MyBatis의 CRUD 템플릿을 사용할 수 있도록 설정 -->
   <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg ref="sqlSessionFactory" />
   </bean>

   <!-- Transaction 설정하기 -->
   <!-- Transaction Manager 설정 commit, rollback -->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
   </bean>

    <!-- Transaction 대상 설정 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*" rollback-for="RuntimeException" />
            <tx:method name="write*" rollback-for="RuntimeException" />
            <tx:method name="add*" rollback-for="RuntimeException" />
            <tx:method name="create*" rollback-for="RuntimeException" />
            <tx:method name="regist*" rollback-for="RuntimeException" />
            <tx:method name="set*" rollback-for="RuntimeException" />

            <tx:method name="update*" rollback-for="RuntimeException" />
            <tx:method name="modify*" rollback-for="RuntimeException" />
            <tx:method name="edit*" rollback-for="RuntimeException" />
            <tx:method name="change*" rollback-for="RuntimeException" />

            <tx:method name="delete*" rollback-for="RuntimeException"/>
            <tx:method name="remove" rollback-for="RuntimeException" />
            <tx:method name="terminate*" rollback-for="RuntimeException" />

            <tx:method name="read*" read-only="true" />
            <tx:method name="select*" read-only="true" />
            <tx:method name="get*" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut expression="execution(public * com.ktds.smahn..web.*.*(..))" id="controllerTx" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="controllerTx" />
    </aop:config>
</beans>

 

여기까지 myBatis를 위한 기반작업을 끝낸 것이다. 이제는 쿼리를 쓸 수 있도록 하는 configuration 파일을 만들고, 연결시키는 일들을 해야할 것이다.

현재의 system date를 얻어오는 실습을 해보자.

1. Mapper생성 : articleDAO.xml 에 mapper를 생성한다.

2.  articleContent.xml에 추가

  • articleDAO를 추가한다.

  • articleBiz를 추가한다.

 

 

3. ArticleDAO.xml 생성

1) 는 namespace가 반드시 있어야 한다.

2) id는 ArticleDAO.java에서 선언한 메소드명과 동일하게 적는다.

  • 쿼리문에 세미콜론은 쓰지 않는다.

3) 결과를 string 타입으로 가지고 올 수 있다.

 

 

4. configuration 파일을 생성

  • mybatis.xml 생성

  • 코드를적어준다.  

 

  • 우리가 만들었던 mapper의 위치를 잡아준다
    .

 

이제 마지막 step만 남았다.

 

 

5.  rootContext.xml 에 추가

  • classpath의 의미 : 클래스파일들이 위치한 곳의 가장 최상위. 즉, 4개의 폴더가 전부다 classpath라고 불리는 것들이다.

 

 

6. ArticleDAOImpl 추가

  • return null을 다음과 같이 바꿔준다.

 

 

이렇게 하면 설정이 모두 완료된다. 이제

현재시간이 잘 찍히는지 실행을 해보자. 이를 위해 ArticleBizImpl에 로그를 추가한다.

 

리스트 페이지에 들어가면 우리가 만들었던 날짜를 볼 수 있다.

 

 

 

#Tip.배포시 프로젝트의 jar나 resources가 배포안되는 문제

main에 있는 java나 resources에 있는 xml을 모두 배포하기 위해서는 pom.xml 에서 build밑에 이 구문을 넣어주면 된다.

 일단 이렇게 1.0 으로 바꿔주고,

 

이 구문을 넣어준다.

 

그러나 위와 같이 xml파일들은 배포가 되었어도 maven 안에 있지 않은 jar는 배포가 되지 않는다.  그래서 maven에 넣어 같이 배포가 되게 해야한다.

 

이거를 오른쪽 마우스 클릭해서 run as maven build... 를 선택한다.

그리고 아래처럼 적어주고 Run하면

 

 이렇게 Build Sucess 되는 것을 콘솔창에서 확인할 수 있다.

 

블럭처리한 것을 윈도우 탐색기에 붙여넣기 하고, my-utilities-1.0.jar 파일을 사용하기 편리하도록 D드라이브로 옯겨준다.

 

'프레임워크 > Spring' 카테고리의 다른 글

Dynamic Query  (0) 2016.04.20
MyBatis 전체 요약, CRUD(insert, select)  (0) 2016.04.20
Controller, Interceptor, logger  (0) 2016.04.15
예외 처리하기  (0) 2016.04.14
커맨드 객체 값 검증과 에러메시지 출력  (1) 2016.04.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함