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



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()