레이블이 객체지향다형성인 게시물을 표시합니다. 모든 게시물 표시
레이블이 객체지향다형성인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 12일 토요일

22. 스프링3.X 게시판(Spring AOP적용, DAO단 DML문 실행시 로깅, 스프링 충고 spring advice) Spring Framework3.2 게시판 2단계 : 지금까지 구현한 게시판의 기본 기능에 Spring AOP를 적용하여 충고(Advice)를 적용하자.

22. 스프링3.X 게시판(Spring AOP적용, DAO단 DML문 실행시 로깅, 스프링 충고 spring advice)
 
Spring Framework3.2 게시판 2단계 : 지금까지 구현한 게시판의 기본 기능에 Spring AOP를 적용하여 충고(Advice)를 적용하자.

onj.board.dao.SpringBoardDAO.java의 insert, update, delete등 DML문장 실행시 로그를 남기기 위해 ...

1. 로깅을 위해 Oracle Table 만들자.

SQL> create table boardlog (
          methof varchar2(50),
   sql varchar2(1000),
   ilsi date);
 
2. Spring AOP용 Aspect(Pointcut + advice)를 만들자.(LogginAspect.java)
 
package onj.board.aop;
 
import onj.board.dao.BoardDAO;
import onj.board.dao.LoggingDAO;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
@Aspect
public class LoggingAspect {
 @Autowired
 private LoggingDAO loggingDAO;
 
 @Autowired
 private BoardDAO boardDAO;
 // 사후충고(반드시 정상 리턴 후 호출)
 // SpringBoardDAO의 모든메소드중 파라미터가 1개 있는 메소드가 충고받을 포인트컷
 // 본 게시판에는 리스트보기와 , getSql() 만 메소드 파라미터가 없어 충고 적용 안됨
 @AfterReturning(pointcut="execution(* onj.board.dao.SpringBoardDAO.*(*))", returning="result")
 public void logAfterReturning(JoinPoint joinPoint) {
System.out.println("<<<<<<<<< DAO 로깅 충고 실행");  
  loggingDAO.writeLog(joinPoint.getSignature().getName(), boardDAO.getSql());  
 }
}

3. 로그를 DB에 넣을 DAO단 클래스 제작. LoggingDAO.java

package onj.board.dao;
 
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component("loggingDAO")
public class LoggingDAO {
 private JdbcTemplate jdbcTemplate;
 @Autowired
 private DataSource dataSource;
 public JdbcTemplate getTemplate() {
  if (jdbcTemplate == null) {
   this.jdbcTemplate = new JdbcTemplate(dataSource);
  }
  return jdbcTemplate;
 }
 // DAO단 쿼리 로깅
 public int writeLog(String mehtodName, String dml)
   throws DataAccessException {
  //로그용 테이블에 로그 저장
  String sql = "insert into boardlog(method, sql, ilsi) values (? , ? ,sysdate) ";
  
  Object[] obj = { mehtodName, dml };
  return getTemplate().update(sql, obj);
 }
}
 

4. boardConfig.xml에 aspect 추가
 <aop:aspectj-autoproxy/>
 <context:component-scan base-package="onj.board.dao"/>
 <context:component-scan base-package="onj.board.service"/> 
 
 <bean id="myLogger" class="onj.board.aop.LoggingAspect" />
 
</beans> 

5. [결과확인]
 
10월 09, 2013 2:13:52 오후 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
10월 09, 2013 2:13:52 오후 org.apache.catalina.startup.Catalina start
INFO: Server startup in 3491 ms
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행

boardlog 테이블을 select 해보라!!

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  

[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)






2013년 10월 6일 일요일

[JAVA객체지향]자바,다형성,오버로딩,오버라이딩, 캡슐화, Late binding 1. 다형성(Polymorphism) 상속을 ...

[JAVA객체지향]자바,다형성,오버로딩,오버라이딩, 캡슐화, Late binding에 대해 알아봅니다.
1. 다형성(Polymorphism)
상속을 받은 것을 그대로 사용하지 않고 입맛에 맞게 바꾸어 줄 수 있도록 하는 것
다형성을 위해 자바에서는 메소드 overriding 과 메소드 overloading을 제공 한다.
상속계층 상에서 어떤 객체의 어느 메소드를 호출할 것인지를 결정하는 객체의 능력을 다형성 이라 한다.
사인곡선을 그리는 함수가 있다고 할 때 사용자는 파라미터로 radian이나 degree값을 넣게 되지만 둘 다 처리할 수 있다. 이것은 sine(int degrees)나 sine(float Radians)와 같이 동일 이름의 함수가 다른 파라미터로 두 번 선언되었기 때문이다.
오버로딩 or 오버라이딩을 통해 구현
2. 오버로딩(Overloading)
동일한 함수의 이름 사용 가능, 같은 클래스 내에 같은 이름의 생성자나 메소드를 사용하는 행위,매개변수의 개수와 타입이 달라야 한다

3. 오버라이딩
상위 클래스에서 정의된 함수를 하위 클래스에서 재 정의, 기존 클래스의 메소드 구현 부분만 약간 변화시켜 새로운 클래스를 생성할 수 있다. 매개변수의 개수와 타입이 같아야 한다.
상위 클래스로부터 메소드를 상속받을 때, 서브클래스 내에 같은 이름의 메소드가 있는 경우에?Signature가 다르면 중복(overloading)이 되고 Signature가 같으면 재정의(overriding)가 된다

4. Template : 타입을 인자로 하여 새로운 타입을 생성
5. 캡슐화(encapsulation)
객체는 자신이 수행하는 모든 행동과 속성을 다른 객체와 외부 세계에는 보이지 않는다
객체 자신의 Operation을 수행하고 결과를 내놓지만 그 Operation의 동작 원리는 숨기는 것이다.
높은 모듈성과 정보은닉을 제공
참고로 Late binding이란?
Virtual Method Invocation
 변수의 타입이 아닌 실제 메모리 영역을  차지하고 있는 변수가 참조하는 객체를  찾아 그메소드를 호출하는 것, 물론 변수의 경우 해당 사항 없다.(shadow variable, 가리기)

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  




2013년 8월 8일 목요일

[오라클자바커뮤니티자바교육]struts simple example

Struts의 간단한 예제


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  

이번 예제는 간단한 구조를 가지는 프로그램이지만 스트럿츠의 흐름을 이해할 수 있는 예제 입니다.

add.jsp에서 사용자가 두수를 입력한 후 submit 버튼을 누르면 ActionServlet이 호출된 후 AddAction을 호출하여 비즈니스 로직(두수를 더함)을 처리 합니다. 그런 다음 처리 결과를 result.jsp로 포워드 시키는 예제 입니다. 이때 사용자가 입력되는 두수를 저장하기 위해 AddForm이라는 폼빈을 사용했습니다.

이 예제를 실행하기 위해서는 http://struts.apache.org 에 가서 struts 최신 버전인 1.2.4 또는 1.2.6을 다운받습니다. 압축 받은 파일을 풀면 lib 폴더에 jar 파일과 tld 파일이 있는데 jar 파일은 context의 WEB-INF/lib에 위치시키고, tld 파일은 /WEB-INF에 저장 합니다. (전 이클립스를 사용했으며 struts-test라는 Tomcat 프로젝트를 만들었습니다)

Result.jsp에서는 JSTL을 사용했는데 Struts에서 JSTL을 사용하기 위해 http://www.apache.org/dist/jakarta/taglibs/standard/ 에서 jakarta-taglibs-standard-current.zip 파일을 다은 받은 후 jar 파일을 /WEB-INF/lib 폴더에 복사 합니다.


이클립스와 톰캣 플러그인에 대해서는 이전 강좌를 참고하시기 바랍니다.

--------------------
web.xml
--------------------
version="1.0" encoding="ISO-8859-1"?>
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

Welcome to Tomcat

Welcome to Tomcat



/WEB-INF/struts-bean.tld
/WEB-INF/struts-bean.tld


/WEB-INF/struts-html.tld
/WEB-INF/struts-html.tld


/WEB-INF/struts-logic.tld
/WEB-INF/struts-logic.tld




action
org.apache.struts.action.ActionServlet

config
/WEB-INF/struts-config.xml

1 





action
*.do





--------------------
Struts-config.xml
--------------------

version="1.0" encoding="UTF-8"?>


















path="/FirstAction"
type="add.action.AddAction"
name="addForm"
validate="false"
>







-----------------------------------------------
add.jsp (struts-test 컨텍스트의 루트에 저장)
-----------------------------------------------

최초 실행 시 add.jsp를 localhost/struts-test/add.jsp 라고 호출 합니다.

<%@ page language="java" contentType="text/html;charset=euc-kr" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
:namespace prefix = html />
+=




-----------------------
result.jsp
-----------------------

결과가 포워드 되는 페이지 입니다.

<%@ page language="java" contentType="text/html;charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
합은 : :namespace prefix = c />

------------------------
AddAction.java
------------------------

사용자가 submit 버튼을 눌렀을 때 호출되는 action 클래스 입니다.

WEB-INF/src/add/action폴더에 작성 합니다.

package add.action;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.*;
import add.model.AddForm;
import add.model.AddResultVO;

public class AddAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {
int op1 = ((AddForm)form).getOp1();
int op2 = ((AddForm)form).getOp2();

int result = op1 + op2;

AddResultVO vo = new AddResultVO();
vo.setResult(result);

req.setAttribute("resultvo", vo);

//System.out.println(vo.getResult());

return (mapping.findForward("success"));

}
}



-----------------
AddForm.java
-----------------

사용자의 Input Form과 형태를 같이 하며 ActionServlet을 통해 사용자의 입력 값들이 자동으로 저장되는 AddForm 입니다.

WEB-INF/src/add/model에서 작성 합니다.

package add.model;
import org.apache.struts.action.ActionForm;;

public class AddForm extends ActionForm {
protected int op1;
protected int op2;

public int getOp1() {
return op1;
}

public int getOp2() {
return op2;
}

public void setOp1(int op1) {
this.op1 = op1;
}

public void setOp2(int op2) {
this.op2 = op2;
}
}


---------------------
AddResultVO.java
---------------------

결과값을 저장하여 request에 AddResultVO를 저장하여 result.jsp가 나중에 이 값을 이용하여 화면에 출력을 합니다.

WEB-INF/src/add/model에서 작성 합니다.

package add.model;

public class AddResultVO {
private int result;


public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}
}

2013년 8월 2일 금요일

자바 위임을 이용한 Adapter 패턴 예제 (java adapter pattern, java design pattern

안녕하세요~ oraclejavacommunity 입니다. 위임을 이용한 Adapter 패턴 예제 입니다.
 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



위임이란 어떤 메소드의 처리를 다른 인스턴스의 메소드에 맡긴다는 의미 


Banner.java및 Main.java는 앞 예제와 동일함

//Print.java
public abstract class  Print {
public abstract String printString();
}


//PrintBanner.java
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner (String str) {
this.banner = new Banner(str);
}
public String  printString() {
return "(" + banner.showString() + ")";
}
}
 
  

java inheritence and composition(자바 상속 컴포지션)

상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다. 
 - 상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체
 - 컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽
 - 컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계
 - 상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



Composition Exam

class Soap {
  private String s;
  Soap() {
    System.out.println("Soap()");
    s = new String("Constructed");
  }
  public String toString() { return s; }
}

public class Bath {
  private String 
    // Initializing at point of definition:
    s1 = new String("Happy"), 
    s2 = "Happy", 
    s3, s4;
  Soap castille;
  int i;
  float toy;
  Bath() {
    System.out.println("Inside Bath()");
    s3 = new String("Joy");
    i = 47;
    toy = 3.14f;
    castille = new Soap();
  }
  void print() {
    // Delayed initialization:
    if(s4 == null)
      s4 = new String("Joy");
    System.out.println("s1 = " + s1);
    System.out.println("s2 = " + s2);
    System.out.println("s3 = " + s3);
    System.out.println("s4 = " + s4);
    System.out.println("i = " + i);
    System.out.println("toy = " + toy);
    System.out.println("castille = " + castille);
  }

  public static void main(String[] args) {
    Bath b = new Bath();
    b.print();
  }
}

2013년 8월 1일 목요일

(Java PolyMorphism)자바 다형성

주어진 유형의 변수 하나로 여러 유형의 객체를 참조하고 , 변수가 참조하는 객체 유형에 맞는 메소드를 자동으로 호출할 수 있는것
 즉 다형성을 이용하면 메소드 호출 하나가 호출이 적용되는 객체의 유형에 따라 서로 다르게 작동하도록 할 수 있다.
  다형성이 구현되기 위한 조건
    - 서브클래스의 객체의 메소드 호출은 수퍼클래스 유형의 변수를 통해서
        Book selectedBook;
  Random select = new Random();

for(int i=0;i<10;i++) {
selectedBook = theBooks[select.nextInt(theBooks.length)];
System.out.println("\n ***** 선택한 책 ***** \n" + selectedBook);
selectedBook.display();
}         
 호출된 메소드는 수퍼클래스의 메소드
 수퍼클래스와 서브클래스에서 메소드 유형및 리턴값이 같아야 한다.
 메소드 접근제한은 서브클래스가 수퍼클래스 보다 덜 제한적이어야 한다.

import java.util.Random;
class Book {
public Book(String aType) { type = new String(aType); }
public String toString() { return "이것은 " + type; }
public void display() { }
private String type;
}

class EngBook extends Book {
public EngBook(String aName) {
super("영어책...");
name = aName;
}
public void display() { System.out.println("이 책은 영어를 공부하는데 쓰입니다...");}
public String toString() { return "책 제목은 : " + name ; }
private String name;
}


class JavaBook extends Book {
public JavaBook(String aName) {
super("자바책...");
name = aName;
}
public void display() {
System.out.println("이 책은 자바언어를 공부하는데 쓰입니다...");
}
public String toString() {
return "책 제목은 : " + name ;
}
private String name;
}

public class MyPolymorphism {
public static void main(String[] args) {


Book[] theBooks = {
              new EngBook("English Alive..."),
              new JavaBook("자바정복하기..."),
new JavaBook("자바30일완성..."),
new EngBook("영어박살내기...")
};
Book selectedBook;
Random select = new Random();

for(int i=0;i<10;i++) {
selectedBook = theBooks[select.nextInt(theBooks.length)];
System.out.println("\n ***** 선택한 책 ***** \n" + selectedBook);
selectedBook.display();
}
        }
}