티스토리 뷰

Framework/Spring

[Spring & ibatis] 수업 5일

gray.yoon 2013. 4. 26. 20:28

 


AOP - around

 

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
31
32
33
34
35
36
37
38
39
40
41
package aop.common;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.util.StopWatch;
 
 
/**
 * 요구 사항 : 대상 모듈의 각 메서드 별로 
 * 0.5초~1.5초 : log.warn(클래스명 메서드명 소요시간)
 *    1.5초~ : log.error(클래스명 메서드명 소요시간) 형태로 기록을 남긴다.
 * 만약 대상 메서드가 Exception을 발생시키더라도 반드시
 * 시간 체크는 되어야 한다.
 */
 
public class TimeCheckAspect {
    private Log log = LogFactory.getLog(getClass());
    public Object timeCheck(ProceedingJoinPoint point) throws Throwable{
        Object retValue=null;
        StopWatch sw = new StopWatch();
        sw.start();
        try{
        retValue = point.proceed();
        }finally{    //Exception 발생시에도 무조건 시간은 체크한다.
            sw.stop();
            long time = sw.getTotalTimeMillis();
            if(time>500 && time <=1500){
                String cn = point.getTarget().getClass().getName();
                String mn = point.getSignature().getName();
                log.warn(cn+" "+mn+" "+time);
            }else if(time>1500){
                String cn = point.getTarget().getClass().getName();
                String mn = point.getSignature().getName();
                log.error(cn+" "+mn+" "+time);
            }
        }
        
        return retValue;
    }
}

 

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
package aop.test;
 
import model.service.MemberNotFoundException;
import model.service.MemberService;
import model.service.ProductService;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class TestAOP {
    public static void main(String[] args) {
        ApplicationContext context
        =new ClassPathXmlApplicationContext("timecheck.xml");
        MemberService m
        =(MemberService) context.getBean("memberService");
        ProductService p
        =(ProductService)context.getBean("productService");
        m.getAllMemberList();
        m.findMember();
        p.selectAllProductList();
        p.selectProduct();        
        try {
            m.findMember("");
        } catch (MemberNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }
}

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
package model.service;
 
public class MemberService {
    public void findMember(){        
        System.out.println("findMember");
    }
    public void getAllMemberList(){
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("getAllMemberList");
    }
    public void findMember(String id) throws MemberNotFoundException{
        try {
            Thread.sleep(1700);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(id.equals(""))
            throw new MemberNotFoundException("회원 없음!");
        System.out.println("find Member..."+id);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package model.service;
 
public class ProductService {
    public void selectProduct(){
        System.out.println("selectProduct");
    }
    public void selectAllProductList(){
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("selectAllProductList");
    }
}
 

 

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
package test;
 
import org.springframework.util.StopWatch;
 
public class TestStopWatch {
 
    public void timeCheck(){
        StopWatch sw = new StopWatch();
        sw.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("business...");
        sw.stop();
        System.out.println("소요시간 : "+sw.getTotalTimeMillis());
    }
    
    public static void main(String[] args) {
        new TestStopWatch().timeCheck();
    }
 
}
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    log4j.rootLogger = warn,stdout
 
    log4j.additivity.aop.common=false
    log4j.category.aop.common=debug,stdout
 
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p ({%t} %F[%M]:%L) [%d] - %m%n
 
    log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.dailyfile.File = C:\\java-kosta\\logfile.log
    log4j.appender.dailyfile.Append = true
    log4j.appender.dailyfile.DatePattern='.'yyyy-MM-dd
    log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
    log4j.appender.dailyfile.layout.ConversionPattern=%5p ({%t} %F[%M]:%L) [%d] - %m%n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
>
    <bean id="memberService" class="model.service.MemberService"></bean>
    <bean id="productService" class="model.service.ProductService"></bean>
<!-- 공통 관심 사항을 정의한 bean -->
<bean id="timeCheckaspect" class="aop.common.TimeCheckAspect"></bean>
<aop:config>
    <aop:pointcut expression="execution(public * model.service.*Service.*(..))" id="aroundPointCut"/>
    <aop:aspect ref="timeCheckaspect">
        <aop:around method="timeCheck" pointcut-ref="aroundPointCut"/>
    </aop:aspect>
</aop:config>
</beans>

[결과]

getAllMemberList
 WARN ({main} TimeCheckAspect.java[timeCheck]:31) [2013-04-26 20:22:29,912] - model.service.MemberService getAllMemberList 1322
findMember
selectAllProductList
ERROR ({main} TimeCheckAspect.java[timeCheck]:35) [2013-04-26 20:22:31,941] - model.service.ProductService selectAllProductList 2025
selectProduct
ERROR ({main} TimeCheckAspect.java[timeCheck]:35) [2013-04-26 20:22:33,642] - model.service.MemberService findMember 1701
회원 없음!

 

 


다음 시간...

 

SpringMVC

view : jsp, jstl, javascript, ajax, jQuery 

controller : DispatcherServlet-HandlerMapping-Controller(interface)...MultiActionController...(UserController)...register(req,res)

    ModelAndView(Model 및 View 페이지 정보 정의)

Model : 1. 비지니스 계층 (Service 계층) ... AOP는 여기에 속한다.

2. 영속성 계층 (ibatis)

 

 


ibatis

 

**ibatis framework**
why? 영속성 계층(Dao) 의 Framework
    개발 생산성 -> 기존 JDBC 의 중복된 부분을 Framework 에서 처리
    유지 보수성 -> DB 설정 정보 및 SQL 정보를 XML 로 분리하여 정의
how?
  application(Dao) ------ config xml ( db 설정.xml , sql 정의.xml)      
        |
        ibatis library   
        
     application 에서 설정 정보 및 SQL 정의 xml 을 로딩한다.
     --> SqlMapClient
     SqlMapClient API를 이용하여 SQL을 실행시킨다.

 

 

실습 부분

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
    <!-- 별칭:자주 사용되는 대상 -->
    <typeAlias alias="mem" type="model.MemberVO" />
    <!-- Dao 에서 사용할 SQL을 정의 -->
    <insert id="insertMem" parameterClass="model.MemberVO">
        insert into member(id,password,name,address)
        values(#id#,#password#,#name#,#address#)
    </insert>
    <select id="findMemberById" resultClass="mem" parameterClass="String">
        SELECT * FROM MEMBER Where ID = #value#
    </select>
</sqlMap>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- database 일반 정보 설정 -->
<transactionManager type="JDBC" commitRequired="false">
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>
      <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:xe"/>
      <property name="JDBC.Username" value="spring"/>
      <property name="JDBC.Password" value="oracle"/>
    </dataSource>
  </transactionManager>
  <!-- SQL 정의 XML을 링크  -->
   <sqlMap resource="config/member.xml"/>
</sqlMapConfig>
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
31
32
33
34
35
36
37
package factory;
 
import java.io.IOException;
import java.io.Reader;
 
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
 
/**
 * ibatis 설정 파일(SqlMapConfig.xml)을 로딩하여
 * SqlMapClient 를 생성하는 클래스 
 * @author admin
 *
 */
public class SqlMapFactory {
    private static SqlMapFactory factory=new SqlMapFactory();
    private SqlMapClient sqlMapClient;
    private SqlMapFactory(){
        // 설정 파일을 로딩해서 SqlMapClient 객체를 얻어 온다.  
        try {
            Reader reader
            =Resources.getResourceAsReader("config/SqlMapConfig.xml");
            this.sqlMapClient=SqlMapClientBuilder.buildSqlMapClient(reader);
            System.out.println("ibatis config loading.."+sqlMapClient);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlMapFactory getInstance(){
        return factory;
    }
    public SqlMapClient getSqlMapClient() {
        return sqlMapClient;
    }
    
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package factory;
 
import com.ibatis.sqlmap.client.SqlMapClient;
 
public class TestSqlMapFactory {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // SqlMapClient 를 리턴받아 출력해본다. 
        SqlMapClient sqlMapClient=
                SqlMapFactory.getInstance().getSqlMapClient();
        System.out.println(sqlMapClient);
    }
 
}
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
package model;
 
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.ibatis.sqlmap.client.SqlMapClient;
 
import factory.SqlMapFactory;
 
/**
 * ibatis framework 을 이용한 Dao (Data Access Object) 를 구현 
 * @author admin
 *
 */
public class MemberDao {
    private static MemberDao dao = new MemberDao();
    private SqlMapClient sqlMapClient;
    private MemberDao(){
        this.sqlMapClient=SqlMapFactory.getInstance().getSqlMapClient();
    }
    public static MemberDao getInstance(){
        return dao;
    }
    public MemberVO findMemberById(String id) throws SQLException{
        return (MemberVO) this.sqlMapClient.queryForObject("findMemberById",id);
    }
}
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package model;
 
public class MemberVO {
    private String id;
    private String password;
    private String name;
    private String address;
    public MemberVO() {
        super();
        // TODO Auto-generated constructor stub
    }
    public MemberVO(String id, String password, String name, String address) {
        super();
        this.id = id;
        this.password = password;
        this.name = name;
        this.address = address;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "MemberVO [id=" + id + ", password=" + password + ", name="
                + name + ", address=" + address + "]";
    }
    
}
 
1
2
3
4
5
6
7
8
9
10
11
package test;
 
import model.MemberDao;
 
public class TestMemberDao {
    public static void main(String[] args) throws Exception{
        MemberDao dao = MemberDao.getInstance();
        System.out.println(dao.findMemberById("java"));
        
    }
}

 

create table member(
 id varchar2(50) primary key,
 password varchar2(50) not null,
 name varchar2(50) not null,
 address varchar2(50) not null
)
insert into member values('java','1234','조용필','분당');
select * from member;

'Framework > Spring' 카테고리의 다른 글

[Spring & ibatis] 수업 7일-1(ibatis 끝)  (0) 2013.04.30
[Spring & ibatis] 수업 6일  (0) 2013.04.29
[Spring & ibatis] 수업 4일  (0) 2013.04.25
[Spring & ibatis] 수업 3일  (0) 2013.04.24
[Spring & ibatis] 수업 2일  (0) 2013.04.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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 31
글 보관함