2013년 9월 2일 월요일

DB Modeling

* DB Modeling
- Modeling: 생각하고 있는 바를 글이나 그림으로 표현.
- 데이터의 구조와 상관관계를 표현하는 것.
- 전체 그림(시스템을 다루는 data들)을 빠르게 이해할 수 있다.

1. 테이블 정의
- 컬럼 식별
- data를 구분하기 위한 키 설정.

2. 정규화 수행
- data의 중복 제거
  -> 메모리 절약.
  ->data 신뢰성을 높인다. (무결성)

정규화 방법
1) 제1정규화
- 중복컬럼, 중복data 제거 후 별도 테이블로 정의한다.
- 부모-자식 관계를 맺는다.

2) 제2정규화
- PK(Primary Key)가 두개 이상일 경우

3) 제3정규화
- 어떤 컬럼이 PK가 아닌 일반 컬럼에 중복되는 경우
- 별도 테이블로 분리
- 부모-자식 관계를 맺는다.

3. 도메인 정의
- 컬럼들을 분류하여 하나의 타입으로 정의
- 도메인을 컬럼에 설정
- 컬럼의 정의를 쉽게 변경 할 수 있다.

4. DBMS에 종속적인 물리 모델을 정의한다.

5. 모델을 SQL문으로 전환한다.

============================================================================

http://www.exerd.com/ 다운.

Rendering: 명령어에 맞춰서 화면에 뿌려지는 것.

*관계
1. 식별관계: FK == PK
2. 비식별관계: FK != PK


* N : N 관계 해소
테이블을 한개 더 만든다. (관계테이블)




2013년 8월 29일 목요일

요구사항 식별

* 요구사항 식별
1. Actor 식별 (Primary Actor)
- Actor: 시스템을 이용하는 사람이나 프로세스.
- Supplementary Actor (= Secondary) : 시스템에 의해 이용당하는 다른 시스템.




2. Use-case 식별
- Actor가 시스템을 사용해서 달성하려는 업무목표(사용목표)

Use-case 크기
- 2주 ~ 6주 내에 개발이 가능한 범위
- 체크리스트
 1) 업무에 시작과 끝이 명확해야 한다. (카운트가 가능하여야 한다.)
 2) 한 사람이 한 순간에 한 장소에서 수행하는 작업.
 3) 업무여야 한다. (서로관련이 있는 것들은 한개로 통합한다.)
   ex) C,R,U,D -> xxx관리

3. Use-case 명세서 작성
 1) Use-case 명
 2) actors
 3) pre-condition (사전 조건)
   - Use-case를 시작하기 위한 사전 시스템 상태
 4) post-condition
   - Use-case를 종료한 후 시스템 상태
   - 종료 조건
 5) 기본 시나리오
   - actor와 시스템간의 눈에 보이는 대화.
 6) 예외 시나리오
   - 오류 발생시 actor 와 시스템의 시나리오.

========================================================================

* 시스템이 다루는 Data를 관리



2013년 8월 28일 수요일

web.xml, ContextLoaderListener.class

Best practice: 최고의 실천 사례.

Adapter pattern
Decorator pattern
Factory method pattern
Flyweight pattern

Singleton pattern
- 객체를 한개만 만들어서 공유하는 것.
- 외부에서 객체를 직접 생성하지 못하도록 생성자를 private으로 선언한다.


DBConnectionPool.class




향후 지속적인 기능 추가가 발생할 가능성이 높은데, 
기존 코드를 손대는 방식은 좋지 않다.

solution: 기능을 하나의 별도의 객체로 만든다.

Command pattern (Undo)
메소드를 클래스화 시킨다.

* 객체 공유 방법
- 서블릿이 사용할 객체를 공유하는 방법.

======================================================================

Listener : 어떤 이벤트가 발생했을 때 알림을 받는 객체.

Servlet Context Listener
- web app 이 시작되거나 종료될 때 알림을 받는 리스너.


ServletContextListener
- 서블릿 컨테이너가 웹 애플리케이션을 시작하거나 종료할 때 알리기 위한 규칙을 정의.




======================================================================

Context Parameter
- web App. 환경변수.
- web.xml
  <context-param>...</context-param>
- ServletContext를 통해 조회.

web.xml


ContextLoaderListener.class



2013년 8월 27일 화요일

한글출력방법.

깨진 글자 제대로 나오게 하는 법.

- 제대로 Unicode를 클라이언트가 원하는 문자집합으로 변환하려면
  출력스트림을 얻기 전에 변환할 문자집합을 설정한다.

response.setContentType("text/plain;charset=UTF-8");


- 제대로 출력이 된걸 확인할 수 있다.




* 에노테이션(annotation)



- 컴파일러나 JVM에게 전달하는 주석.

ex) @SuppressWarnings("serial")

=================================================================================

클라이언트가 보낸 Data를 읽기 전에, 문자집합을 알려줘야 한다.
반드시 getParameter()를 호출하기 전에 알려줘야 한다.
호출한 후에는 의미없다.


단, URL로 데이타를 보내는 경우(GET요청) 서블릿 컨테이너의 메뉴얼에 따라 설정한다.
ex) 톰캣의 경우, server.xml 파일의 <Connector> 태그의 다음 속성 값을 설정한다.
    <Connector .... URIEncoding="UTF-8">....</Connector>


server.xml 에서 URIEncoding="UTF-8" 을 추가로 입력한다.



한글이 제대로 출력 되는걸 알 수 있다.






2013년 8월 26일 월요일

Tomcat 설치.









HTTP = Hyper Text Transfer Protocol

HTTP Application
http server (= web server)
http client (= web browser)

*web Application Architecture

컴파일 방식 / 인터프리터 방식

===============================================================

* CGI (Common Gateway Interface)
- web Server 와 web Application 사이에 Data를 주고받는 규칙.



*도서
- 빌게이츠 생각의 속도 
- 스티브 잡스

* Servlet Container 와 Application
- 규칙 정의 => Java EE Spec
                      Servlet / JSP / EJB(분산컴퓨팅 컴포넌트) / web service 
                      / web socker(ver.7) / DBConnection 관리 / 리소스 관리

==================================================================


Tomcat 설치


www.apache.org 에 접속하여 하단에서 Tomcat 클릭.



Tomcat7.0 클릭.

Core 에서 환경에 맞는 파일 선택.





다음 경로에 압축을 풀어준다.







이클립스와 연동하기 위해 Preferences에서 Server - Runtime Environments 에서 Add클릭.
그림 순서대로 실행.








이클립스 오른쪽 상단에서 Java EE 선택




선택하면 아래쪽 창에 Servers 가 나올것이다. 창안에 마우스 오른쪽 클릭해서 
New Server 클릭하여 서버를 추가해준다.






마우스 오른쪽 클릭하여 서버를 스타트 시킨다.



================================================================

* web browser의 요청 url
프로토콜://서버주소:포트번호/리소스 ID
http://localhost:9999



* web Application 배치 (deployment)
- 서버마다 배치 폴더가 다르다.
- Tomcat ( 톰캣은 Java로 만들었다.)
ex) C:\javaide\server\apache-tomcat-7.0.42

\bin            톰캣 실행 관련 파일
\conf         실행파일
\lib             Tomcat java library
\work         실행 중에 임시 생성하는 파일
\webapps   web app 배치 폴더


Eclipse 연동 시
- 원래 폴더 및 파일을 손대지 않는다.
- 개발을 위해 다양한 서버 환경을 구축한다.
- 설정 파일을 별도 프로젝트로 관리한다.
- 배치 폴더도 별도로 관리한다. (workspace폴더)

=====================================================================

서블릿 만들기 1
- javax.servlet.Serrvlet 인터페이스 구현
- 이 인터페이스에 선언된 메서드를 서블릿 컨테이너의 스레드가 호출한다.


서블릿의 인스턴스 생성 시점
- 클라이언트가 요청할 때
- 서버가 시작될 때 만들어지는 것이 아님!!!
- 한번 만들면 다시 만들지 않음.

서블릿 등록
- 서블릿이 실행되려면 web.xml에 등록되어야 한다.
- 1) 서블릿 선언: <servlet></servlet>
- 2) 서블릿에 url 부여: <servlet-mapping></servlet-mapping>




* 서블릿 메소드

@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
- 서블릿 인스턴스 생성 시 호출됨.
- 서블릿이 사용되기 전에 준비함.
- 딱 한번만 호출됨 => 서블릿은 하나만 생성된다.


@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
- 클라이언트의 요청이 들어올 때 마다 호출됨.
- 실제 서비스할 작업을 기술한다.


@Override
public void destroy() {
// TODO Auto-generated method stub
}
- 웹 어플리케이션이 종료될 때 마무리 작업을 위해서 호출된다.


@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
- 서블릿 컨테이너의 관리자 메뉴에서 서블릿 정보를 얻기 위해 호출한다.


@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
- 서블릿 컨테이너의 관리자 메뉴에서 서블릿 정보를 얻기 위해 호출한다.


서블릿 만들기 2
- 매번 서블릿을 만들 때 마다 구현에 관심없는 메서드들도 만들기 때문에
  짜증난다. ex) init(), destroy(), getServletConfig(), getServletInfo()
- 주로 어떤 작업을 수행할 것인지 service() 메서드를 구현하는데 집중할 필요가 있다.
- 대안? 도우미 클래스를 정의하여 상속 받는다.


BaseServlet 이라는 도우미 클래스를 상속받아서 사용한다.



* javax.servlet.GenericServlet 클래스
- 서블릿 생성 시 모든 메서드를 구현하는 번거로움을 막기 위해 
- 미리 4개의 메서드 init(), destroy(), getServletConfig(), getServletInfo() 를 구현한
   추상클래스 이다.
- 이전에 우리가 직접 만들었던 BaseServlet과 같은 역할을 한다.



한글은 깨진다...



  

2013년 8월 25일 일요일

쓰레드.

* finalize()
- object 메서드
- garbage collector 가 호출  -> 인스턴스 해제 전





=========================================================================

중첩 클래스 (inner class)
- 클래스 내부에 선언하는 클래스
- 1) top lever inner class: static inner class
      - 다른 클래스에서도 사용하기 위함.

- 2) member inner class
      - outer 클래스의 인스턴스를 통해서만 사용 가능한 클래스

- 3) local inner class
      - 해당 클래스가 선언된 블럭 내에서만 사용 가능한 클래스.

- 4) anonymous inner class
      - 이름이 없는 클래스
      - 클래스를 정의한 직후 바로 인스턴스 생성함.
      - 오로지 한개의 인스턴스만 필요한 경우에 사용.

      - 이름 없는 클래스 정의
      new (슈퍼클래스 또는 인터페이스) () { 클래스 정의 }



* 일반 클래스의 명칭: 패키지 멤버 클래스.

* sleep(): 지정한 시간만큼 not runnable 상태로 만드는 것.
 - cpu 쟁탈전에서 제외 시킴. (not runnable)

* 여러 스레드가 동시에 진입하여 같은 객체를 다룰 때 문제가 발생되는 코드.
=> critical section.   
- 해결책 :  한번에 하나의 스레드 만이 접근할 수 있도록 한다.
- 번호표 나눠준다. ex) 화장실 키, 번호표
- 접근 가능 여부를 관리하기 위한 값 => mutual exclusion (= mutex:뮤텍스)

* 뮤텍스 방식
- 뮤텍스 방식은 오로지 1개의 스레드만이 접근 가능한 것.
- 1개만 가능한 세마포어

* semaphore(세마포어)
- 일정한 개수까지는 접근 가능하게 하는 방식.

* synchronized
- 한번에 하나의 스레드만이 진입 할 수 있게 하는 설정.
- synchronized로 설정된 블럭은 한번에 하나의 스레드 만이 접근 가능하다.
- 그러나 객체가 다르다면 동시 진입 가능하다.
- mutex(1개만 가능한 semaphore)는 같은 객체에 대해서 적용한다.




2013년 8월 23일 금요일

스레드..



=======================================================================

스레드 프로그래밍

- 병행적으로 작업을 수행하기 위한 방법
- 1. Thread를 상속받는다.  extends Thread
- 2. 병행으로 수행할 작업들을 run()메서드에 넣는다.
     
        @Override
public void run(){

}

- 스레드에게 일을 시킬 때는 run()을 호출하지 말고, start()를 호출해야 한다.
- start()를 호출하면 JVM은 스레드를 준비시키고, run()을 호출한다.


*Context Switching

- process의 실행환경을 저장/로딩.