3D Graphic Technical Artist

20130115 교육내용 본문

업무(~2014)/JAVA

20130115 교육내용

er1ca 2013. 1. 15. 20:21

#0 환경 설정

 

1. 오라클 데이타베이스 설치

- cmd에서 sqlplus 이용가능

2. JDK/Eclipse설치

3. Eclipse에 Toad Extension 설치

- [help]- [install new software] 에서 url로 install

 

#1 오라클데이타베이스_쿼리

 

* 테이블 만들기
CREATE TALBE BOARD(
BNUM NUMBER PRIMARY KEY,
CONTENT VARCHAR2(30),
WDATE DATE,
AUTHOR VARCHAR2(10)
);
// PRIMARY KEY : 해당 Row에  값이 꼭 존재 해야한다 
// 한줄에 값이 꼭 하나는 존재한다는 것을 보장 

* 테이블 정보보기
DESC BOARD;


* 데이터 삽입
INSERT INTO
BOARD(BNUM,CONTENT,WDATE,AUTHOR)// 이 컬럼에
VALUES(1, '이것은 아우성', SYSDATE, '홍길동') // 이값을 insert 하겟다
//문자열은 '', 현재시간은 SYSDATE

* 데이터 검색
SELECT BNUM,CONTENT,WDATE,AUTHOR FROM BOARD; // BOARD라는 테이블에서 해당 값을 가져오라
(SELECT * FROM BOARD;
// 의미는 같지만 실행시 속도가 느리기때문에 업무시에는 '*'는 사용하지 않는것이 좋다.)

 

 

#2 오라클데이타베이스_트렌젝션

 

Transaction을 사용함으로써 얻을 수 있는 효과 : ACID 
Automicity (원자성) : 트렌젝션 하나에 수행되는 기능을 모두 수행을 하거나 하지 않도록 하는 것 , 
                               수행이 되다 에러가 나는경우에 처음으로 롤백 시킴, DB에서는 DBMS가 원자성을 보장
Consistancy (일치성) : 트렌젝션 수행 결과가 같도록 일치 시키는 것  
Isolation (독립성) : 트렌젝션이 수행되는 동안 다른 것은 접근 하지 못하도록 독립적으로 하는 것 
Durability () : 디스크에 정확히 저장이 되어야 한다는 것 

* set autocommit on/off 
SQL 문장이 끝나면 개별적인 트렌젝션으로 잡는 것을 설정/비설정

 

 

 

#3 JDBC 사용 순서


 

1. Driver Loading : JDBC 드라이버를 사용하기 위해 로딩

2. Connection : 데이타베이스에 실제로 접속 하는 것
JDBC URL - 자바 프로그램이 해당 데이타베이스를 찾아가서(jdbc url에)  ID와 PW를 가지고 접근 시도 
>>가장 로드가 많이 걸리는 작업 , 많이 하면 성능이 떨어지게 됨 -> Connection pool 을 이용 (dbct)

이제 SQL구문을 DB에 전달해보자 ~
3. Statement 생성
-Statement : 효율이 좋지 않기 때문에 거의 사용하지 않음
-PreparedStatement : 일반적으로 사용하는 JDBC의 Statement
-CallableStatement : DB안에 있는 함수를 호출 하기 위해 사용할 때 

Statement를 DB에 전달해서  SQL문의 query를 실행시키자
4. Query 실행
-excuteQuery()
-excuteUpdate()

5. 결과처리
-excuteQuery() -> ResultSet 이용
-excuteUpdate() -> int Result : 영향을 받은 레코드 수 
테이블 안에 몇개의 행이 영향을 받았는지.. 

6. 사용된 자원 반납
자원 반납을 하지 않으면 DB 시스템 자원 누수 문제 생김
JAVA와 DB가 connection/statement/resultset 의 자원을 함께 이용하는데 
JAVA는 자동으로 자원을 반납하지만 DB는 close를 통해 자원을 반납해야만 한다. 

>>가장 나중에 사용한 자원부터 닫는다. 
>>자원 반납은 꼭 finally 부분에 써줘야 한다. 
try 부분에서 에러가나면  catch로 넘어가므로 
try 부분을 실행 하든 하지않든 꼭 수행하는 부분인 finally에서 자원을 반납해줘야 함

 

 

▲JAVA와 DataBase가 함께 사용하는 자원인 Connection, Statement, resultSet  
JAVA는 리소스 반납을 자동으로 하지만 DB는 close()를 통해 반납 해주어야 함 


 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class HelloJDBC {

       /**
       * @param args
       * @throws SQLException
       */
       public static void main(String[] args) throws SQLException {
             // TODO Auto-generated method stub
            Connection con = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;
             //finally 에서 자원을 반납 하려면 자원에 접근을 해야하기에 try 구문 밖에서 자원을 선언
            
             try {
                  Class. forName("oracle.jdbc.driver.OracleDriver");
                  System. out.println("드라이버 로딩 성공@_@!!" );
                  String id = "er1ca";
                  String pw = "er1ca";
                  String JDBC_URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE" ;
                   //thin, oci 방식으로 oracle의 jdbc 드라이버에 접근하겟다
                       //1521 프로그램을 통해서
                       //127.0.0.1 로컬 컴퓨터에 XE(디폴트 데이타베이스)데이타베이스에 접속 한다
                     //(DBMS를 통해 만들어지는 여러개의 데이타베이스 중에 XE는 디폴트 데이타베이스임)
                  
                  con = DriverManager. getConnection(JDBC_URL,id,pw);
                   //객체가 존재 하면 드라이버에 접근을 했다는 의미
                       //반대로 없으면 드라이버에 접근 실패
                  System. out.println("드라이버 연결 성공! ㅋㅋㅋ" );
                  
                  String sql = "Select * from BOARD";
                   //SQL 구문을 먼저 작성
                  stmt = con.prepareStatement(sql);
                  
                  rs = stmt.executeQuery(); // select인 경우
                   //ResultSet 인스턴스를 이용해서 쿼리 실행 결과를 받아서
                       //해당 결과를 가르키는 rs 변수
                  
                   while(rs.next()){
                   //결과 값의 커서를 하나 내릴때 내릴값이있으면 true/내릴값이 없으면 false를 반환
                         int num = rs.getInt("BNUM" );
                        String content = rs.getString( "CONTENT");
                        String wdate = rs.getString( "WDATE");
                        String author = rs.getString( "AUTHOR");
                         //해당하는 column의 값을 가져와서 변수에 저장한다.
                              //while문을 돌려서 전체 테이블 값을 가져올수 있다.
                        
                        System. out.println(num + "\t"
                                    + content + "\t"
                                    + wdate + "\t"
                                    + author);
                  }
                   //stmt.executeUpdate();
                       //insert, delete, update인 경우
            } catch (ClassNotFoundException e) {
                   // TODO Auto-generated catch block
                  e.printStackTrace();
            } finally {
                   try{
                        rs.close();
                        stmt.close();
                        con.close();
                  } catch(Exception e2){
                        e2.printStackTrace();
                  }
                   //finally구문에서도 오류가 발생 할 수 있기때문에 try/catch으로 감싸줘야한다.
            }
             //해당 패키지의 클래스를 불러오는 것 ; Driver Loading
               //오라클 데이타베이스 벤더가 제공
      }
}

 

 

 

#4 계층형설계 


 

 

*DAO는 디미터 법칙에 따라 persistance Layer가 하는 일에 관계없이 메소드만 제공함.

-> Business Layer와 하드웨어 종속 부분에 대한 중간 완충 역할

 

* 디미터 법칙

레이어에의 코드들이  최소한의 interface로 각각의 레이어에 느슨하게 연결되도록 하는 것 
(변경 사항이 있는 경우 서로에게 영향을 최소화 한다.) 

- DAO(Data Access Object) ; DB 처리 전담 객체
- DTO(Data Transfer Object) ; 레이어간에 정보를 객체로 전달 할 수 있도록 하는 객체, DB table column을 기준으로 만든다.
->VO(Value Object),DO(Domain Object),Entity,Business Object Model(비지니스 로직을 담고있는 객체를 전달) 
; 보는 관점에 따라 다름

Q. connection 처리를 어디서 해야하는가?
Business Logic 에서 함 -> transection 처리 때문

'업무(~2014) > JAVA ' 카테고리의 다른 글

20130116 교육내용  (1) 2013.01.16