레이블이 닷넷강좌인 게시물을 표시합니다. 모든 게시물 표시
레이블이 닷넷강좌인 게시물을 표시합니다. 모든 게시물 표시

2013년 11월 5일 화요일

[닷넷4.0,ADO.NET강좌, .NET4.X, C#4.X]ADO.NET 개요, 소개, 특징 ADO.NET 개요, 소개

[닷넷4.0,ADO.NET강좌, .NET4.X, C#4.X]ADO.NET 개요, 소개, 특징   ADO.NET 개요, 소개  
 
ADO.NET 개요, 소개
 
ADO.NET은 .NET Framework 프로그래머에게 데이터 액세스 서비스를 제공하는 클래스 집합이다.  분산된 데이터 공유 응용 프로그램을 만들기 위한 다양한 구성 요소를 제공하고 또한 관계형, XML 및 응용 프로그램 데이터에 대한 액세스를 제공하는 .NET Framework의 핵심 부분이다.
 
ADO.Net은 Microsoft Accss와 SQL Server, Oracle 과 같은 관계 형 데이터베이스 뿐 아니라 비 관계형 데이터 원본도 조작이 가능한데 ADO.Net은 .Net Framework 안에 통합 되어 있으며 .NET 언어들(특히 C#)과 같이 쓰이도록 설계 되었다.
 
 기존의 ADO와 비교해 볼 때 ADO.Net은 확장성과 상호 운영성이 개선된 ADO 인데 ADO가 연결 지향형인데 반해 ADO.Net의 경우 비 연결성 데이터 집합을 처리 하도록 설계 되었습니다. 연결이 끊어진 레코드 집합은 응용 프로그램에만 도움이 되는데 이는 데이터를 로컬 상태에서 보다 빠르게 처리하고 전송 할 수 있기 때문이다. 또한 ADO.Net은 XML을 보편적인 데이터 전송 형식으로 사용하고 있다.
 
 ADO.Net은 System.Data.dll 어셈블리 안에 들어 있는데 ADO.Net의 모든 클래스들이 System.Data.dll  안에 들어 있으므로 결국 System.Data.dll 자체가 곧 ADO.Net 이라고 할 수 있다.
 
 그럼 왜 이름을 System.Data 라고 하지 않고 ADO.Net이라고 했을까?  ADO.Net이라는 이름은 ADO(ActiveX Data Object)로부터 따온 것이다. MS는 .NET 환경에서 권장 되는 데이터 액세스 인터페이스 임을 나타내기 위해 ADO.Net 이라고 명명 한 것이다.
 
.NET Framework에서의 클래스 라이브러리(Class Library)들을 굳이 다시 크게 나누어, Base Class Library와 그 외의 클래스 라이브러리(Class Library)로 구분하자면, Base Class Library(BCL)에는 Collections나 IO등과 같은 프로그래밍에 있어서의 좀 더 근원적인 알고리즘(Algorithm)과 자료구조 및  하드웨어(Hardware)에 보다 근접한 부분에 해당한다고 볼 수 있다. 그 외의 라이브러리들에는 Directory Service, XML Support등과 같은 보다 추상적이고 다양한 종류의 라이브러리를 접할 수 있고 그 중의 하나가 ADO.NET이라고 불리는 데이터(Data) 관련 클래스 라이브러리(Class Library) 이다. 

2013년 10월 24일 목요일

[닷넷,C#4.0강좌]C# 델리게이트 Action Delegate Action 델리게이트는 Func 델리게이트와 거의 유사하다. 차이점이라면...

[닷넷,C#4.0강좌]C# 델리게이트 Action Delegate 

Action 델리게이트는 Func 델리게이트와 거의 유사하다. 차이점이라면 반환 형식이 없다는 것이다. 이 Action 델리리게이트 역시 닷넷4.0 프레임워크에는 대략 17가지 준비되어 있다.
 
public delegate TResult Action< >()
public delegate TResult Func<in T >(T arg)
public delegate TResult Func<int T1, in T2>(T1 arg, T2 arg)
public delegate TResult Func<int T1, in T2, in T3 >(T1 arg, T2 arg, T3 arg)
……
……
public delegate TResult Func<in T1,,,in T16>(T1 arg, T2 arg, T3 arg,,, T16 arg)
Func 델리게이트와는 반환값이 없는 것이 특징이며 형식 매개변수는 모두 입력 매개변수 이다.
 
[사용 예문]
 
입력 매개 변수가 없는 경우…
 
Action action1 = () => Console.WriteLine(“No Parameter Action Delegate”);
action1();
 
입력 매개 변수가 두개인 경우…
 
int sum=0;
 
//입력 매개변수는 둘, 더한 결과를 밖에서 선언한 sum에 저장
Action<int, int> action2 = (x, y) => sum=x*y;
action2(1,2); 
Console.WriteLine(“1+2={0}”, sum);      //9 리턴
 

[예제]
 
using System;
namespace Lambda
{
    class Program
    {
        delegate int Sum(int[] arg);
        static void Main(string[] args)
        {
            Action action1 = () => Console.WriteLine("No Parameter Action Delegate");
            action1();
            int ret = 0;
            Action<int> action2 = (x) => ret = x * x;
            action2(3);
            Console.WriteLine("action2(3), 3*3={0}", ret);
            Action<double, double> action3 = (x, y) =>
            {
                double d = x / y;
                Console.WriteLine("Action<t1, t2>({0},{1}) : {2}", x, y, d);
            };
            action3(8, 4);
        }
    }
}
 

[결과]
No Parameter Action Delegate
action2(3), 3*3=9
Action<t1, t2>(8,4) : 2

2013년 10월 19일 토요일

[Spring Container에서 자바빈 로딩하는 방법2가지]Spring Framework Lazy Loading, Pre Loading, BeanFactory, ApplicationContext

[Spring Container에서 자바빈 로딩하는 방법2가지]Spring Framework Lazy Loading, Pre Loading, BeanFactory, ApplicationContext
 
스프링 프레임워크에서 자바빈을 로딩(인스턴스로 만든 후 바인딩)하는 데 있어 두가지 방법을 제공한다.

두 방법은 lazy biding, pre-loading 이다.
 
1. Lazy Binding
 
자바빈이 다른 메소드 또는 클래스의 요청에 의해 호출되는 시점에 로드되는 방법이다.

org.springframework.beans.factory.BeanFactory와 하위클래스들이 사용하는 방법으로 스프링 컨테이너에서는 관련빈을 호출되는 시점에 로딩한다.
 
아래 예를 보자.
 
BeanFactory factory = new XmlBeanFactory(
                        new InputStreamResource(
                        new FileInputStream("onj.xml")));    
             
OrderManager orderManager = (OrderManager) factory.getBean("orderManager"); 

우선 위 예문의 경우 onj.xml이 메모리에 로딩되더라도 orderManager 빈은 인스턴스화 되지 않는다.  즉 getBaean("orderManager")하는 순간 메모리로 올라오는 것이다.

결국 getBean 메소드가 호출되는 시점에 할 일이 많아 지는 것이다.

2. Pre-Loading
 
컨테이너에서 XML 파일을 로딩하자 마자 정의된 자바빈들을 로딩하는 방법.

org.springframework.context.ApplicationContext가 수행한다.
 
//모든 싱글톤 자바빈들이 메모리로 로딩
ApplicationContext context =
            new ClassPathXmlApplicationContext("onj.xml");
           
//필요한 빈을 리턴           
OrderManager orderManager = (OrderManager) context.getBean("orderManager");

오라클 SCN은 최근의 SCN 보다 크고 유일한 값

SCN 이란?
오라클은 특정한 시점의 데이타베이스 상태를 SCN으로 관리하는데 어떤 트랜잭션이 commit 되면, SCN은 최근의 SCN 보다 크고 유일한 값이 할당되며이 값은 그 트랜잭션이 변경시킨 블럭에 반영되고또한 데이타화일의 가장 최근의 SCN은 데이타화일의 헤더에 기록 됩니다.
아래에는 SCN이 이용되는 경우에 대해 몇 가지 적었습니다.
참고 하세요~

1. Oracle Startup 
내부적 과정

$ORACLE_HOME/dbs/init$ORACLE_SID.ora file
를 찾는다
.
$ORACLE_SID.ora file
내의 지정된 config file를 포함하여 parameter 내용을 참조하여 Oracle backgroud process startup 한다.
(nomount )

control_file
이라는 parameter에 지정된 control file를 읽는다.
(mount )

control file
내에 설정되어 있는 Datafile  redolog file를 읽은 후 SCN이 일치하는가를 check한 후에 만약 틀리면 redolog를 이용하여 Recover 한 후 startup한다.


2. Listing Status Information About Data Files

SQL> SELECT name,
2 rfile#,
3 status,
4 checkpoint_change# "CHECKPOINT"
5 FROM v$datafile;

NAME RFILE# STATUS CHECKPOINT
----------------------------------------------------------------
C:\ORACLE\ORADATA\WINK\SYSTEM01.DBF 1 SYSTEM 7041729

C:\ORACLE\ORADATA\WINK\UNDOTBS01.DBF 2 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\CWMLITE01.DBF 3 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\DRSYS01.DBF 4 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\EXAMPLE01.DBF 5 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\INDX01.DBF 6 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\ODM01.DBF 7 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\TOOLS01.DBF 8 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\USERS01.DBF 9 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\XDB01.DBF 10 ONLINE 7041729


10 
개의 행이 선택되었습니다.

RFILE#
은 각 데이타 화일의 화일 숫자로 리스트 하며 데이타베이스를 갖고 create 되었던,
SYSTEM tablespace
에 있는 첫번째 데이타 화일은 항상 화일 1 입니다.

STATUS
은 데이타 화일에 대해 다른 정보로 리스트 합니다만약 데이타 화일이 SYSTEM tablespace의 부분에 있다면상태는 SYSTEM 입니다.
(
만약 recovery를 요구 하지 않는다면)
만약 non-SYSTEM tablespace에 데이타 화일이 online으로 된다면상태는 ONLINE 이구요,
non-SYSTEM tablespace
에 데이타 화일이 offline으로 된다면상태는 OFFLINE이나 RECOVER 중 하나로 될 수 있습니다.
CHECKPOINT
는 데이타 화일의 가장 최근의 checkpoint에 기록된 마지막의 SCN을 리스트 합니다.


3. Oracle
 "fast commit" mechanism을 사용 하므로 사용자가 COMMIT문장을 사용하면 LGWRcommit record를 즉시 redo log buffer에 기록하지만 해당 data buffer의 변경들은 redo log buffer들을datafile들에 write하는 것을 더 효과적으로 할 때까지 지연 되는 것입니다.

User
 transaction commit 할 때, transaction System Change Number(SCN)를 할당 받고 Oracleredo log transaction redo log entry들과 함께 기록 합니다.

Activity
가 빈번하다면, LGWR group commit을 사용하여 online redo log file write할 수도 있습니다.

출처 : 오라클자바커뮤니티(http://www.oraclejavanew.kr)

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





2013년 10월 15일 화요일

테이블이 몇개의 블록을 사용중인지 확인하는 방법 각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다.

테이블이 몇개의 블록을 사용중인지 확인하는 방법

각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다 rowid에는 그 Rows의 물리적인 위치정보를 포함하고 있는데 파일번호블록번호블록내 행 번호와 같은 정보를 포함하고 있습니다.

하나의 데이터파일을 가지는 테이블스페이스에 테이블 데이터가 저장 되면 이 테이블의
ROWID는 유일한 블록번호(즉 하나의 테이블의 행들이 같은 블록 번호를 중복해서 가지지않는다는 의미)를 가지는 반면에 둘 이상의 데이터파일로 구성되는 테이블스페이스인 경우에 테이블에 데이터가 저장 되면 동일한 블록번호(서로 다른 파일에 각각의 블록 번호가 부여 되므로)를 가질 수 있습니다이러한 경우엔 블록번호와 파일번호 두 개의 항목을 조합하여 ROWID로부터 유일한 번호를 얻어 낼 수 있습니다.
 
즉 테이블이 몇 개의 블록으로 구성 되어 있는지는 이러한 점을 이용하여 구하면 되는데DBMS_ROWID라는 패키지를 이용하여 rowid에서 특정 값(파일번호블록번호등)을 얻어 낼 수 있습니다.
 
Rowid를 조회 하면 다음과 같습니다.
 
SQL> select rowid, jumin, name from addrbook;
rowed                            JUMIN      NAME
------------------ -------------- ------------
AAAJMZAABAAAPEKAAA 111111-2222222    
:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />홍길동

AAAJMZAABAAAPEKAAB 333333-4444444    
가길동
AAAJMZAABAAAPEKAAC 111111-2222222    
홍길동
 
다음과 같이 유일한 블록의 개수(테이블이 몇 개의 블록으로 구성되어 있는지)를 카운팅 할 수 있습니다.
 
SQL> SELECT COUNT ( DISTINCT
  2           DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)
  3           ||
  4           DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)
  5         ) "Used"
  6  FROM scott.emp;
 
      Used
----------
         2
 
 
또는 다음과 같은 방법도 가능 합니다.
 
SQL> SELECT COUNT (DISTINCT SUBSTR(rowid,1,15)) "Used"
  2  FROM scott.emp;
 
      Used
----------
         2

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


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)