posted by 시드라엘 2013. 7. 10. 11:12

1. 인덱스의 개념

- 책의 뒷부분에 있는 색인과 비슷한 개념

- 작은 데이터에는 없어도 큰 차이가 없지만, 대량의 데이터에는 인덱스가 있어야만 빠른 검색이 가능하다.

 

2. 인덱스의 장단점

1) 장점

- 검색 속도가 무척 빨라질 수 있다. (반드시 그런것은 아니지만)

- 그 결과 시스템의 부하가 줄어들어 시스템 전체 성능 향상에 도움이 된다.

2) 단점

- 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해진다. (DB의 10퍼센트 내외의 공간이 추가로 필요)

- 인덱스를 생성하는데 시간이 많이 소요될 수 있다.

- 데이터 변경 작업이 자주 일어날 경우에 인덱스를 재작성해야 할 필요가 있기에 성능에 영향을 끼칠 수 있다.

 

3. 인덱스의 종류

1) 클러스터형 인덱스

- 영어사전과 비슷한 개념

- 클러스터형 인덱스는 테이블당 1개만 생성가능

- 클러스터형 인덱스는 행데이터를 인덱스로 지정한 열에 맞춰 자동정렬

- 인덱스 자체가 데이터

2) 비클러스터형 인덱스

- 일반 책의 찾아보기와 비슷한 개념

- 테이블당 여러개 생성 가능하다.

- 인덱스자체가 데이터가 아니라 인덱스가 가리키는 것이 데이터

 

4. 인덱스의 특징

- 제약조건없이 테이블 생성시에 인덱스를 만들 수 없다.

- 인덱스가 자동생성되기 위한 열의 제약조건은 Primary KEY와 Unique뿐

 

5. 인덱스의 내부동작

B-Tree (Balanced Tree, 균형트리)

- 범용적으로 사용되는 데이터구조

- 인덱스를 표현할 때 많이 사용된다.

- 데이터 검색시 뛰어난 성능을 보인다.

- 데이터 변경시 성능이 나빠진다.

- 구성 : 루트노드 + 중간노드 + 리프노드

 

6. 인덱스의 구조

1) 클러스터형 인덱스

데이터를 추가하면 데이터 분할이 필요하다. 리프페이지가 하나 늘어나고 루트페이지에 데이터페이지를 하나 더 등록시켜준다.

2) 비클러스터형 인덱스

정렬을 하지 않으므로 빈 공간이 존재하면 빈 공간에 바로 들어갈 수 있다.

비클러스터형 인덱스에 데이터추가에 있어서 클러스터형 인덱스보다 효율적이다.

 

7. 인덱스를 생성해야 하는 경우와 그렇지 않은 경우

- 인덱스는 열 단위로 생성된다.

- WHERE절에서 사용되는 컬럼을 인덱스로 만든다.

- WHERE절에서 사용되더라도 자주 사용해야 가치가 있다.

- 데이터의 중복도가 높은 열은 인덱스로 만들어도 효용이 없다. (예 : 성별, 타입이 별로 없는 경우, 적은경우)

- 외래키가 사용되는 열에는 인덱스를 되도록 생성해주는 것이 좋다.

- JOIN에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.

- INSERT / UPDATE / DELETE가 얼마나 자주 일어나는지를 고려한다.

- 클러스터형 인덱스는 하나만 생성할 수 있다. (없을 수도 있다.)

- 클러스터형 인덱스가 테이블에 아예 없는 것이 좋은 경우도 있다.

- 사용하지 않는 인덱스는 제거하자

 

posted by 시드라엘 2013. 7. 10. 11:12

1. DROP TABLE A; (DDL)

구조와 row를 모두 날린다.

 

2. DELETE FROM A; (DML)

row를 모두 날린다. 시퀀스 값을 사용하고 있다면 삭제된 이후의 번호부터 차례로 값이 증가한다. (초기화 X)

 

3. TRUNCATE TABLE A; (DDL)

row를 모두 날린다. 초기화 O

 

DML은 롤백이 가능하지만 DDL은 불가능하다.

 

posted by 시드라엘 2013. 7. 10. 11:11

DDL, DML, DCL


1. DDL(Data Definition Language)


데이터와 그 구조를 정의합니다.


1) CREATE : 데이터베이스 객체를 생성합니다.
2) DROP : 대이터베이스 객체를 삭제합니다.
3) ALTER : 기존에 존재하는 데이터베이스 객체를 다시 정의하는 역할을 합니다.
4) RENAME : 데이터베이스의 컬럼명을 변경합니다.
5) TRUNCATE : 테이블을 최초 생성된 초기상태로 만들며, ROLLBACK이 불가능합니다.

 

 

2. DML(Data Manipulation Language)


데이터의 검색, 수정, 삭제 등을 처리합니다.


1) INSERT : 데이터베이스 객체에 데이터를 입력합니다.
2) DELETE : 데이터베이스 객체에 데이터를 삭제합니다.
3) UPDATE : 기존에 존재하는 데이터베이스 객체안의 데이터 수정합니다.
4) SELECT : 데이터베이스 객체로부터 데이터를 검색합니다.
5) COMMIT : 변경사항을 저장합니다.
6) ROLLBACK : 변경사항을 취소합니다.

 


3. DCL(Data Control Language)


데이터베이스 사용자의 권한을 제어합니다.


1) GRANT : 데이터베이스 객체에 권한을 부여합니다.
2) REVOKE : 이미 부여된 데이터베이스 객체의 권한을 취소합니다.

posted by 시드라엘 2013. 7. 10. 11:10

DBMS의 특징과 장단점


1) 계층형 DMBS


(1) 특징
① 데이터간에 1:N 관계를 유지한다.
② 데이터가 트리 형태로 저장되는 모델을 사용한다.
③ 가장 오래 되었다.
④ 각 계층이 물리적 포인터로 연결되어 있으며, 종속적 관계를 지닌다.


(2) 장점
① 부모, 자식 세그먼트(노드) 사이에 항상 연결될 수 있기에 1:N 관계를 갖는 대용량 데이터베이스 처리에 매우 강력하다.
② 데이터베이스 무결성의 조건에 대해 좋은 성능의 관리가 가능하다.


(3) 단점
① 한 번 구축하면 구조를 변경하기 어렵다.
② 트리 구조 내에서는 순환이 허영되지 않는다.
③ 데이터 저장의 물리적 구조에 대한 이해도가 높게 필요하다.
④ 계층형 구조상의 한계로 1:N 기준에 맞지 않는 일반적 관계를 구현하기 매우 어렵다.

 

 

2) 네트워크 DMBS


(1) 특징
① 데이터간에 N:N 관계를 유지한다.
② 망 형태로 구성된 모델을 사용하며 계층형 트리를 확장한 형태이다.
③ 레코드간의 관계가 링크로 표현되는 점은 계층적 모델과 유사하나, 구조는 순환을 허용한다.


(2) 장점
① 계층구조에 링크를 추가하여 유연성과 접근성이 우수하다.
② 데이터 추출이 빠르고 효과적이다.


(3) 단점
① 유지보수 비용이 많이 든다.
② 프로그램 작성시 프로그램의 구조를 이해해야만 작성이 가능하다. (계층형 모델과 유사)
③ DataBase 구조 변경시 이를 참조했던 모든 응용프로그램에 대한 수정을 요한다.

 

 

3) 객체지향 DMBS


(1) 특징
① 정보은닉, 상속성, 다형성 등을 포함하며, 데이터베이스로서 오브젝트 식별자와 오브젝트간의 관계와 같은 추가적 특징을 지닌다.


(2) 장점
① 강력한 Data 모델링 기능을 제공한다.
② 데이터와 관련연산을 동시에 표현한다.
③ 사용자 데이터 구조 및 연산을 정의할 수 있는 확장성을 지닌다.
④ 재사용성 및 우수한 질의가 가능하다.


(3) 단점
① 기본 DB 기능 제공 미흡
② 수행속도 등의 성능저하
③ 신개념에 대한 경험 및 기술부족
④ 기존 RDB와 호환문제(SQL 지원못함)

 

 

4) 관계형 DBMS


(1) 특징
① 데이터간에 1:1 관계를 유지한다.
② 데이터가 2차원 구조의 테이블로 구성된 관계형 모델을 사용한다.
③ 한 테이블은 다수의 열로 구성된다.
④ 각 열은 레코드 단위로 구성된다.
⑤ 데이터간의 연결은 키의 중복으로 생성된다.
⑥ 현재 판매되는 대부분의 DMBS


(2) 장점
① 다른 DataBase로의 변환이 용이하고, 간결하며, 판독이 용이하다.
② 네트워크, 계층형에서 발견되지 않는 구조적 독립성을 가진다.
③ 실제 데이터 저장의 물리적 구조의 특성으로부터 사용자를 자유롭게 하여 DataBase를 설계하고 이를 관리하기가 다른 모델보다 유용하다.
④ 유연한 질의 능력을 가진다.


(3) 단점
① 데이터 종속성, 구조적 종속성 및 강력한 질의 처리의 장점을 해결하기 위해 실제적인 하드웨어와 운영체제 등의 오버헤드가 필요시 된다.
② 결과적으로 다른 모델 DMBS에 비교하여 느린 경향이 있으나 이는 현재 하드웨어와 운영체제의 급속한 성장으로 큰 단점은 되지 못한다.

 

 

5) 객체관계형 DMBS


(1) 특징
① 사용자 정의 타입, 참조 타입, 중첩 테이블을 지원한다.
② 대단위 객체(LOB, Large Object)의 저장, 추출이 가능하다.
③ 객체 간의 상속 관계를 지원하는것이 가능하다.
④ 새로운 응용에 대한 지원(복잡한 데이터 모델 등)과 효율적인 질의 처리가 요구된다.


(2) 장점
① 빈번한 동일 객체 접근시 빠른 접근을 제공한다.
② 복잡한 데이터 모델 지원


(3) 단점
① 효율적인 질의 처리 미비

 

 

posted by 시드라엘 2013. 7. 10. 11:08

Replication 이란?


 대규모로 운영중인 MySQL 데이터베이스의 문제는 server를 중단시키지 않고 전체 백업(clean backup)을 하는 것이다. 백업은 시스템을 느리게 만들며, 백업을 수행중인 테이블과 관련된 데이터가 변경될 수 있기 때문에 데이터 일관성을 해칠 수도 있다. server를 다운시키면 일관된 데이터를 얻을 수 있지만 이는 사용자에게 서비스 중단을 의미한다. 반드시 필요하고 어쩔 수 없는 경우라면 server를 다운시킬 수 있지만, 데이터를 백업하기 위해 매일 server를 중단하는 것은 받아들이기 어려운 일이다. 날마다 server를 중단하지 않고 안정적인 백업을 받는 방법은 MySQL에 Replication(replication)를 설정하는 것이다.
Replication이란 여러 대의 DBserver가 동일한 데이터를 지속적으로 가지고 있을 수 있는 기능이라 말 할 수 있다. 이 기능을 사용하면 실시간 백업과 DBserver 부하 분산도 가능하다. Replication을 이용하면 Master의 데이터와 동일한 데이터를 가진 여러 개의 Slave를 만들수 있다. 이 기능은 Mysql-3.23.15부터 지원되었다.
Mysql에서는 모든 데이터 변동 시 로그를 남기는 기능이 있다. Slaveserver는 Master의 binary 로그의 내용을 가지고 자기자신에 Update한다. 그러므로 모든 update query는 Master에서만 수행이 되어야만 하며 select와 같은 단순한 query는 slave에서 사용 가능하다.

 

------------------------------------------------------------------------------------------------------------------

 

내 의견

1. master에서만 INSERT, UPDATE, DELETE를 하는 이유는 마스터 -> 슬레이브로의 단방향 동기화를 위해서 이다. 역 방향으로 이 CRUD가 이루어지면 동기화는 지켜지기 어렵다. master에서 이뤄지는 SELECT는 실시간을 처리를 요하는 부분에만 사용하도록 하자.

2. INSERT, UPDATE, DELETE는 꼭 해당 DB에 접속해서 작업할 것!

3. Replication DB 사용시 유의사항

- UPDATE JOIN, DELETE JOIN시에 해당 TABLE이 존재하는지 확인

- 슬레이브에서 일부의 테이블만 지니고 있다면 그 DB에서 에러 발생 가능

 

posted by 시드라엘 2013. 7. 5. 10:43

우린 Tomcat 을 사용할 때

Document Root 를 어떻게 정의 하시나요??


일반적으로 이렇게..


<Host name="client.com" appBase="webapps">
   <Context path="" reloadable="true" docBase="/home/client/public_html" debug="1"/>


정의 하진 않나요?


그럼 저기서 appBase 는 무엇이며 docBase 는 무엇일까요?


그리고 docBase 에 상대적인 값을 넣는다면 어디를 보게 될까요?


기존에 appBase 를 deploy 되는 디렉토리로 생각했던 시점이 있었습니다.

그래서 virtual domain 을 사용할 경우 appBase 를 같은 곳으로 둘 경우 문제가 발생할 수 있다고 생각했었지요...

그리고 appBase 로 인해 실제로 문제가 발생하기도 했었습니다.


문제가 발생한 설정값입니다.



 

<Host name="client.com" appBase="/home/appweb">
   <Context path="" reloadable="true" docBase="/home/appweb" debug="1"/>


appBase 와 docBase 가 같을 경우에 정상적으로 동작하지 않는 경우가 있더라구요...


그래서 appBase 와 docBase 가 어떻게 쓰여지는 것인지 알아보고자 했습니다.


결론은 이렇습니다.


- docBase : The Document Base (also known as the Context Root) directory for this web application, or the pathname to the web application archive file (if this web application is being executed directly from the WAR file).


- appBase : The Application Base directory for this virtual host.


그럼 어떻게 사용하는게 좋을까요?


With following configuration there was a problem:

        <Host name="client.com" appBase="/home/client/public_html">
           <Context path="" reloadable="true" docBase="/home/client/public_html" debug="1"/>

and fix was pretty easy

        <Host name="client.com" appBase="/home/client">
           <Context path="" reloadable="true" docBase="public_html" debug="1"/>

 



이렇게 사용하라고 안내를 해주는군요.

하지만 지금처럼 사용하는 방식도 틀리다는것을 말하는건 아닙니다.
단지 appBase 와 docBase 에 대해서 알아가자는 것이지요~
 

 

posted by 시드라엘 2013. 7. 5. 10:41

// tomcat - server.xml파일에 DB Connection생성을 위한 설정(<Host>태그 내부에 추가함)

 

<Context Path="/myapp" docBase="myapp" debug="5" reloadable="true" crossContext="true">

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"

                maxActive="100" maxIdle="30" maxWait="10000"

                username="sys" password="password"    

                driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"

                url="jdbc:Microsoft:sqlserver://localhost:3306/javatest?autoReconnect=true"/>

</Context>

 

//내용설명

Context - path : URL 호출시 사용될 이름

            - docBase : 실제 웹 어플리케이션이 위치한 폴더명

            - debug : 로그 작성 레벨

            - reloadable : 톰캣서버의 재시작 없이 수정된 내용을 불러오기 위한 옵션

            - crossContext : myapp이외의 Context에서도 사용 가능하도록 하는 옵션

Resource - name : Resource명칭(JNDI Lookup 시 사용할 명칭)

              - auth : Resource 관리자를 지정. 여기서는 톰캣컨테이너가 관리자임

              - type : Resource 의 형태 지정. 데이타소스 형태를 지정함

              - maxActive : 최대 연결 가능한 Connection 숫자를 지정함

              - maxIdle : Connection pool 유지를 위해 최대 대기 connection 숫자

              - maxWait : Connection 재 사용을 위해 대기해야 하는 최대 시간(단위:ms)

              - username : DB접속 계정

              - password : DB접속 암호

              - driverClassName : DB와 접속하기 위한 driver 클래스를 지정. 예에서는 MySql임

              - url : 접속한 DB가 위치한 서버명, 포트명, 사용할 데이타베이스명을 지정

 

 

// tomcat - web.xml파일에 DB Connection생성을 위한 설정

<resource-ref>

              <description> DB Connection </description>

              <res-ref-name>jdbc/TestDB</res-ref-name>

              <res-type>javax.sql.DataSource</res-type>

              <res-auth>Container</res-auth>

</resource-ref>

 

//내용설명

resource-ref - description : 참조할 resource에 대한 설명

                  - res-ref-name : 참조할 resource의 명칭. Server.xml에 정의된 이름과 일치해야함

                  - res-type : 참조할 resource 형태로 여기서는 DataSource를 지정함

                  - res-auth : 참조할 resource를 관리할 주체로 톰캣컨테이너를 지정함

 

 

- jsp 페이지에서 호출방법

   Context ic = new InitialContext();
   DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/TestDB"); 
   con = ds.getConnection();

 

  * mysql 의 경우 context 가 다르면,  각각 설정을 따로 하셔야 합니다.

 

  * data source 의 접근 방식은 다음과 같이 할 수도 있습니다.

   Context initContext = new InitialContext();
   Context envContext  = (Context)initContext.lookup("java:/comp/env");
   DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB");
 

 

  * tomcat 에서 JNDI 관련 에러메시지별 대처 방법

    - Cannot load JDBC driver class 'com.mysql.jdbc.Driver', cause: com.mysql.jdbc.Driver 또는

       Null Pointer Exception '', cause: No suitable driver

    ==> 해당 jdbc 드라이버(위의경우 mysql 드라이버) 가 없기 때문입니다.

          해당 드라이버 파일을 $CATALINA_HOME/common/lib 디렉토리로 복사합니다.

    - Name xxxx is not bound in this Context

      ==> server.xml 과 web.xml 에서 해당 JNID가 설정되지 않은 경우입니다.

           server.xml 과 web.xml 에 JNDI resource 를 설정하고 이름을 동일하게 설정하도록 합니다.

 

 

 

posted by 시드라엘 2013. 7. 5. 10:39

web.xml파일의 구성

1. x파일은 다음과 같이 구성된다.

- xml정의와 스키마 선언부

- 웹 애플리케이션 전체 설정

- jsp, 서블릿 관련 설정

- tag library 관련 설정

- 기타설정

2. xml정의와 스키마 선언부 : xml정의와 스키마 선언부는 xml문서에서 공통으로 필요한 xml 버전 선언과 스키마를 정의하는 부분으로 다음과 같이 공통된 버전 정의와 스키마를 가진다.

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

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

3. 웹 애플리케이션 전체 설정

<web-app>

        <display-name>애플리케이션 이름</display-name>

        <description>애플리케이션에 대한 설명</description>

        <welcome-file-list>

               <welcome-file>처음 시작할 파일 이름</welcome-file>

               <welcome-file>두번재로 시작할 파일 이름</welcome-file>

        </welcome-file-list>

</web-app>

4. jsp, 서블릿 관련 설정

        <servlet>

               <servlet-name>서블릿이름</servlet-name>

               <jsp-page>jsp페이지 경로</jsp-page>

               <servlet-class>서블릿클래스 경로</servlet-class>

               <load-on-startup>1</load-on-startup>

               <init-param>

                       <description>인자설명</description>

                       <param-name>인자이름</param-name>

                       <param-value>인자값</param-value>

               </init-param>

        </servlet>

        <servlet-mapping>

               <servlet-name>매핑할 서블릿이름</servlet-name>

               <url-pattern>매핑 패턴</url-pattern> 

        </servlet-mapping>

 

<load-on-startup>1</load-on-startup> : 0보다 큰값이면 배포 또는 서버실행시에 초기화하게 된다.

개발자가 설정하지 않으면 최초요청시에 초기화하게 되므로 시간이 소요됨..

5. tag library 관련 설정

<web-app>

        <taglib>

               <taglib-uri>태그라이브러리 경로</taglib-uri>

               <taglib-location>TLD(Tag Library Descriptor)</taglib-location>

        </taglib>

</web-app>

6. 기타설정

<web-app>

        <context-param>

               <description>설명</description>

               <param-name>인자이름</param-name>

               <param-value>인자값</param-value>

        </context-param>

</web-app>

 

 

posted by 시드라엘 2013. 7. 3. 14:15

 

 

posted by 시드라엘 2013. 7. 3. 10:49
1. Web에서 App으로..

가. Web에서 자바스크립트를 이용.
function ios_return() {
document.location = "toApp:relationButton:ios_button";
}

나. App에서 받아오기..

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestURL = [[request URL] absoluteString];
if ([requestURL isEqualToString:@"toapp:relationButton:ios_button"]) {

        return NO;

}

}


2. App에서 Web으로..

가.  App에서 아래와 같이 WebView의 메소드 이용 자바스크립트 호출.

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"return_orgFile(\"%@\");", filename]];


나. Web에서는 자바 스크립트 동작.

function return_orgFile(strName) {

alert(strName);

}


참고 : http://mingu.kr/68