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의 실행환경을 저장/로딩.



2013년 8월 21일 수요일

Socket


jar 파일 사용하기.




시스템 아키텍쳐의 변천사.





메인프레임 


장점
- S/W 유지보수 쉽다.
- 보안이 강하다.

단점
- H/W확장이 어렵다.
- 고가격이다.

Client / Server

장점
- H/W 확장 쉽다.
- 저가격이다.

단점
- S/W유지보수 어렵다.
- 보안문제가 발생한다.


Application Server

장점
- S/W 유지보수가 쉽다.
- H/W 확장이 쉽다.




Client / Server
- Client: 먼저 요청하는 쪽


- Server: 요청 받은 후 응답하는 쪽

ServerSocket 
- Client와의 연결을 제공하는 객체.
- 포트번호 :  실행 중인 컴퓨터에서 서버 프로그램을 구분하기 위한 고유 번호.
- 운영체제는 랜선으로 데이터가 들오오면 포트번호를 확인하여 
  해당프로그램으로 데이터를 전달한다.

ServerSocket serverSocket = new ServerSocket(8888);



accept()
- Client 의 연결을 기다리고 있다가 연결 요청이 들어오면 즉시 리턴한다.
- 리턴 값: 클라이언트와 데이터를 주고 받을 수 있는 도구이다.

Socket
- 상대편과 데이터를 주고 받을 수 있는 도구이다.

Socket socket = serverSocket.accept();

2013년 8월 19일 월요일

디자인패턴 Flyweight

Generic 
- 파라미터나 변수의 타입을 정의하지 않는다.
- 사용하는 시점에 선언한다.



for (int i = 0; i <list.size(); i++) 의 문장은 for (Member m : list) 와 같다.

문장 구조.
for (클래스 변수 : 배열 또는 Collection 인터페이스 구현객체)


* Flyweight
- 자주 사용되는 객체, 객체 생성시 시간이 오래 걸리는 객체를 공유하는 것.
ex) pooling 기법 (객체를 빌려서, 사용하고, 다시 반납)

- 가비지 생성을 줄인다.

- 실행속도를 향상시킨다.



RedApp.Class 코드 수정.


RedApp 사용 시나리오.

메뉴>member
멤버관리>list
...
멤러관리>view email
...

멤버관리>menu
메뉴>project
프로젝트관리>list
번호, 제목, 시작일, 종료일
...
프로젝트관리>view 프로젝트번호
번호: 1
제목: ...
내용: 
... ... 
시작일: 2013-08-20
종료일: 2013-10-31
관리자: hong@test.com
프로젝트관리> update
...
프로젝트관리> delete
정말 삭제하시겠습니까?(y/n)y
삭제되었습니다.
정말 삭제하시겠습니까?(y/n)n
삭제 취소하였습니다.
프로젝트관리>add
제목: ...
내용:
...
시작일: 2013-08-20
종료일: 2013-10-20
관리자: hong@test.com

프로젝트관리>menu
메뉴>quit
안녕!

* UI 처리
Boundary

* 업무처리
Control

* Data처리
Entity






2013년 8월 18일 일요일

Design pattern: Factory Method

RedApp.class
SQL과 연동하기 위한, list(), add(), view(), update() 메소드 수정.



MySQL 서버에 연결할 도구를 준비.
- JDBC DRIVER 클래스 중(.jar 파일에 들어 있는 클래스들 중에서)
- java.sql.Driver 인터페이스를 구현한 클래스를 먼저 로딩한다.
- 이 클래스가 java.sql.Connection 인터페이스를 구현한 클래스를 알고 있다.

1.서버와 연결

Connection con = null;

2. SQL문을 보낼 도구를 얻기

- createStatement()를 호출하여 SQL문을 서버에 보낼 도구를 얻는다.

Statement stmt = con.createStatement();

3. SQL 서버에 보냄

ResultSet rs = stmt.executeQuery("select MNAME,PHONE,EMAIL, "
+ "from MEMBERS order by MNAME");

- executeQuery()는 서버에 SQL문을 보낸다.
- 서버는 결과를 준비한다.
- executeQuery()는 서버에서 결과를 가져올 도구를 리턴한다.

4. 서버의 결과를 가져와서 출력.
- next()를 호출하여 서버로부터 1 레코드의 결과를 가져온다.

Design pattern: Factory Method
- 객체 생성이 복잡한 경우 특정 메서드를 통해 얻는 방식.




Statement vs. PreparedStatement

*1) 소스 가독성:

SQL문이 복잡할 수록 읽기 어렵다. <==> 간결하다.

*2) 바이너리 데이터(이미지, 음악, 동영상 등) 입력:

불가(base64와 같은 형식으로 인코딩 시 가능) <==> 가능

3) 반복 수행시 속도:

매번 SQL문을 DBMS 형식에 따라 변환 속도 느리다
<==> 한번만 변환, 그리고 실행, 속도 빠르다.


add()





delete()






view()





update()







list()









2013년 8월 16일 금요일

interface

Test.ex1



Tico.class






HankookTire.class



KumhoTireClass




Tire.class




중요한 내용이 많으므로, 코드를 가지고 연습을 많이 하자.