티스토리 뷰
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 |