SlideShare a Scribd company logo
1 of 11
Spring
김영남
자바 개발 간소화
 종속객체 주입(DI: Dependency Injection)
 강한 결합을 제거하자
 AOP(Aspect Orientation Programming)
 횡단 관심사를 모듈화 하자
 Spring템플릿
 템플릿을 이용한 상투적인 코드 제거
종속객체 주입(DI: Dependency Injection)
 강한 결합을 제거하자
 원정을 떠나는 기사
강한 결합
Public class Knight {
private Quest quest;
public Knight() {
quest = RescueDamselQuest();  RescueDamselQuest에 강하게 결합된다.
}
}
종속객체 주입
Public class Knight {
private Quest quest;
public Knight(Quest quest) {
this.quest = quest;  Quest가 주입된다.
}
}
Knight
RescueDamsel
Quest
Knight
RescueDamsel
Quest
SlayDragon
Quest
종속객체 주입(DI: Dependency Injection)
 Spring의 XML설정을 이용한 종속객체 주입(wiring)
 Spring container가 객체(bean)를 관리한다.
<beans>
<bean id=“knight” class=“com.spring.knights.BraveKnight”>
<constructor-arg ref=“quest” />  “quest” bean 주입
</bean>
<bean id=“quest” class=“com.spring.knights.SlayDragonQuest” />  SlayDragonQuest 생성
</beans>
Spring container
Brave
Knight
SlayDragon
Quest
…
…
…
…
…
…
…
AOP(Aspect Oriented Programming)
 횡단 관심사를 모듈화 하자
 은행 전산 시스템
AOP(Aspect Oriented Programming)
 원정을 떠나는 기사와 응원하는 음유시인
public class BraveKnight {
private Quest quest;
private Minstrel minstrel;
public BraveKnight(Quest quest, Minstrel minstrel) {  기사에게 음유 시인을 주입해야 할까?
this.quest = quest;
this.minstrel = minstrel;
}
public void embarkOnQuest() {
minstrel.singBeforeQuest();  기사가 자체적인 음유 시인을 관리해야 할까?
quest.embark();
minstrel.singAfterQuest();
}
}
AOP(Aspect Oriented Programming)
 음유시인을 AOP로 선언하기
<beans>
<bean id=“knight” class=“com.spring.knights.BraveKnight”>
<constructor-arg ref=“quest” />
</bean>
<bean id=“quest” class=“com.spring.knights.SlayDragonQuest” />
<bean id=“minstrel” class=“com.spring.knights.Minstrel” />  음유시인 bean 선언
<aop:config>
<aop:aspect ref=“minstrel”>
<aop:pointcut id=“embark” expression=“execution(* *.embarkOnQuest(..))” />  pointcut정의
<aop:before pointcut-ref=“embark” method=“singBeforeQuest” />  before advice선언
<aop:after pointcut-ref=“embark” method=“singAfterQuest” />  after advice선언
</aop:aspect>
</aop:config>
</beans>
public class BraveKnight {
private Quest quest;
public BraveKnight(Quest quest)
this.quest = quest;
}
public void embarkOnQuest() {
quest.embark();
}
}
AOP(Aspect Oriented Programming)
 어드바이스(Advice)
 Aspect가 무엇을 해야하는지 정의
 조인포인트
 어드바이스를 끼워넣을 지점(point)
 포인트컷
 Aspect의 대상을 정의
 Aspect가 advice할 joinpoint영역을 좁힌다.
위치 특징
이전(before) 대상 메소드가 호출되기 전에 어드바이스 수행
이후(after) 결과에 상관없이 대상 메소드 완료 후 어드바이스 수행
반환 이후(after-returning) 대상 메소드가 성공적으로 완료된 후 어드바이스 수행
예외 발생 이후
(after-throwing)
대상 메소드가 예외를 던진 후 어드바이스 수행
주위(around) 대상 메소드 호출 전과 후에 어디바이스 수행
프록시
AOP(Aspect Oriented Programming)
 인트로덕션(Introduction)
 기존 클래스 변경없이 새 메소드나 멤버 변수 추가
 위빙(Weaving)
 타겟 객체에 새로운 프록시 객체를 생성
타겟
호출자
Spring 템플릿
 템플릿을 이용한 상투적인 코드 제거
public Employee getEmployeeById(long id) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(
“select id, firstname, lastname, salary from “ + employee where id=?”);  직원 조회
stmt.setLong(1, id);
rs = stmt.executeQuery();
Employee employee = null;
if (rs.next()) {
employee = new Employee();
employee.setId(rs.getLong(“id”));  데이터로부터 객체 생성
employee.setFirstName(rs.getString(“firstname”));
employee.setLastName(rs.getString(“lastname”));
employee.setSalary(rs.getBigDecimal(“salary”));
}
return employee;
} catch (SQLException e) {  여기서는 무엇을 수행해야 하지?
} finally {
if (rs != null) {  정리 작업
try {
rs.close();
} catch(SQLException e) {}
if (stmt != null) {
try {
stmt.close();
} catch(SQLEception e) {}
}
if (conn != null) {
try {
conn.close();
} catch(SQLException e) {}
}
}
return null;
}
Spring 템플릿
 템플릿을 이용한 상투적인 코드 제거
public Employee getEmployeeById(long id) {
return jdbcTemplate.queryForObject(
“select id, firstname, lastname, salary from “ + employee where id=?”  SQL쿼리
, new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {  결과를 객체에 매핑
employee = new Employee();
employee.setId(rs.getLong(“id”));
employee.setFirstName(rs.getString(“firstname”));
employee.setLastName(rs.getString(“lastname”));
employee.setSalary(rs.getBigDecimal(“salary”));
return employee;
}
}
, id);  쿼리 파라미터 지정
}

More Related Content

What's hot

영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA경원 이
 
Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)visual khh
 
Ahea Study reactive programming
Ahea Study reactive programming Ahea Study reactive programming
Ahea Study reactive programming Sunghyun Roh
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프Younghan Kim
 
Effective java
Effective javaEffective java
Effective javaHaeil Yi
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
스파르탄Js in sidejs5
스파르탄Js in sidejs5스파르탄Js in sidejs5
스파르탄Js in sidejs5Jin-Hyun Park
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
스파르탄Js in sidejs4
스파르탄Js in sidejs4스파르탄Js in sidejs4
스파르탄Js in sidejs4Jin-Hyun Park
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기NAVER D2
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
자바스터디 3 2
자바스터디 3 2자바스터디 3 2
자바스터디 3 2jangpd007
 

What's hot (18)

영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA
 
Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)
 
Ahea Study reactive programming
Ahea Study reactive programming Ahea Study reactive programming
Ahea Study reactive programming
 
8.Spring DI_3
8.Spring DI_38.Spring DI_3
8.Spring DI_3
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
 
Effective java
Effective javaEffective java
Effective java
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
스파르탄Js in sidejs5
스파르탄Js in sidejs5스파르탄Js in sidejs5
스파르탄Js in sidejs5
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
스파르탄Js in sidejs4
스파르탄Js in sidejs4스파르탄Js in sidejs4
스파르탄Js in sidejs4
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
자바스터디 3 2
자바스터디 3 2자바스터디 3 2
자바스터디 3 2
 

Similar to Spring

(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 인권 김
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여Jin wook
 
[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자NAVER D2
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸MoonGyeom1
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)DK Lee
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
Cappuccino fundamental
Cappuccino fundamentalCappuccino fundamental
Cappuccino fundamentalJeongHun Byeon
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Jin wook
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modulesJay Kim
 
Android DI With Hilt
Android DI With HiltAndroid DI With Hilt
Android DI With HiltSSLEE14
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704KTH, 케이티하이텔
 

Similar to Spring (20)

C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 
[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Cappuccino fundamental
Cappuccino fundamentalCappuccino fundamental
Cappuccino fundamental
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modules
 
Just java
Just javaJust java
Just java
 
Android DI With Hilt
Android DI With HiltAndroid DI With Hilt
Android DI With Hilt
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_6차_아이폰앱만들기_최명진&안두경_20120704
 

Spring

  • 2. 자바 개발 간소화  종속객체 주입(DI: Dependency Injection)  강한 결합을 제거하자  AOP(Aspect Orientation Programming)  횡단 관심사를 모듈화 하자  Spring템플릿  템플릿을 이용한 상투적인 코드 제거
  • 3. 종속객체 주입(DI: Dependency Injection)  강한 결합을 제거하자  원정을 떠나는 기사 강한 결합 Public class Knight { private Quest quest; public Knight() { quest = RescueDamselQuest();  RescueDamselQuest에 강하게 결합된다. } } 종속객체 주입 Public class Knight { private Quest quest; public Knight(Quest quest) { this.quest = quest;  Quest가 주입된다. } } Knight RescueDamsel Quest Knight RescueDamsel Quest SlayDragon Quest
  • 4. 종속객체 주입(DI: Dependency Injection)  Spring의 XML설정을 이용한 종속객체 주입(wiring)  Spring container가 객체(bean)를 관리한다. <beans> <bean id=“knight” class=“com.spring.knights.BraveKnight”> <constructor-arg ref=“quest” />  “quest” bean 주입 </bean> <bean id=“quest” class=“com.spring.knights.SlayDragonQuest” />  SlayDragonQuest 생성 </beans> Spring container Brave Knight SlayDragon Quest … … … … … … …
  • 5. AOP(Aspect Oriented Programming)  횡단 관심사를 모듈화 하자  은행 전산 시스템
  • 6. AOP(Aspect Oriented Programming)  원정을 떠나는 기사와 응원하는 음유시인 public class BraveKnight { private Quest quest; private Minstrel minstrel; public BraveKnight(Quest quest, Minstrel minstrel) {  기사에게 음유 시인을 주입해야 할까? this.quest = quest; this.minstrel = minstrel; } public void embarkOnQuest() { minstrel.singBeforeQuest();  기사가 자체적인 음유 시인을 관리해야 할까? quest.embark(); minstrel.singAfterQuest(); } }
  • 7. AOP(Aspect Oriented Programming)  음유시인을 AOP로 선언하기 <beans> <bean id=“knight” class=“com.spring.knights.BraveKnight”> <constructor-arg ref=“quest” /> </bean> <bean id=“quest” class=“com.spring.knights.SlayDragonQuest” /> <bean id=“minstrel” class=“com.spring.knights.Minstrel” />  음유시인 bean 선언 <aop:config> <aop:aspect ref=“minstrel”> <aop:pointcut id=“embark” expression=“execution(* *.embarkOnQuest(..))” />  pointcut정의 <aop:before pointcut-ref=“embark” method=“singBeforeQuest” />  before advice선언 <aop:after pointcut-ref=“embark” method=“singAfterQuest” />  after advice선언 </aop:aspect> </aop:config> </beans> public class BraveKnight { private Quest quest; public BraveKnight(Quest quest) this.quest = quest; } public void embarkOnQuest() { quest.embark(); } }
  • 8. AOP(Aspect Oriented Programming)  어드바이스(Advice)  Aspect가 무엇을 해야하는지 정의  조인포인트  어드바이스를 끼워넣을 지점(point)  포인트컷  Aspect의 대상을 정의  Aspect가 advice할 joinpoint영역을 좁힌다. 위치 특징 이전(before) 대상 메소드가 호출되기 전에 어드바이스 수행 이후(after) 결과에 상관없이 대상 메소드 완료 후 어드바이스 수행 반환 이후(after-returning) 대상 메소드가 성공적으로 완료된 후 어드바이스 수행 예외 발생 이후 (after-throwing) 대상 메소드가 예외를 던진 후 어드바이스 수행 주위(around) 대상 메소드 호출 전과 후에 어디바이스 수행
  • 9. 프록시 AOP(Aspect Oriented Programming)  인트로덕션(Introduction)  기존 클래스 변경없이 새 메소드나 멤버 변수 추가  위빙(Weaving)  타겟 객체에 새로운 프록시 객체를 생성 타겟 호출자
  • 10. Spring 템플릿  템플릿을 이용한 상투적인 코드 제거 public Employee getEmployeeById(long id) { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); stmt = conn.prepareStatement( “select id, firstname, lastname, salary from “ + employee where id=?”);  직원 조회 stmt.setLong(1, id); rs = stmt.executeQuery(); Employee employee = null; if (rs.next()) { employee = new Employee(); employee.setId(rs.getLong(“id”));  데이터로부터 객체 생성 employee.setFirstName(rs.getString(“firstname”)); employee.setLastName(rs.getString(“lastname”)); employee.setSalary(rs.getBigDecimal(“salary”)); } return employee; } catch (SQLException e) {  여기서는 무엇을 수행해야 하지? } finally { if (rs != null) {  정리 작업 try { rs.close(); } catch(SQLException e) {} if (stmt != null) { try { stmt.close(); } catch(SQLEception e) {} } if (conn != null) { try { conn.close(); } catch(SQLException e) {} } } return null; }
  • 11. Spring 템플릿  템플릿을 이용한 상투적인 코드 제거 public Employee getEmployeeById(long id) { return jdbcTemplate.queryForObject( “select id, firstname, lastname, salary from “ + employee where id=?”  SQL쿼리 , new RowMapper<Employee>() { public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {  결과를 객체에 매핑 employee = new Employee(); employee.setId(rs.getLong(“id”)); employee.setFirstName(rs.getString(“firstname”)); employee.setLastName(rs.getString(“lastname”)); employee.setSalary(rs.getBigDecimal(“salary”)); return employee; } } , id);  쿼리 파라미터 지정 }