2013년 9월 7일 토요일

자바 API 신규 기능 [Java 1.4 추가 기능 - assertion]

Java 1.4 추가 기능 - assertion

assertion를 사용한 프로그램밍
설명(공식설명사이트 영문, 한글)
단언을 시험할 때 사용한다고 볼 수 있다. 예를 들면 물은 위에서 반드시 아래로 떨어진다것은 반드시 사실이어야 한다.
형식
Format1
assert Expression1;
Format2
assert Expression1:Expression2;
Expression1는 boolean 식 , Expression2 값을 가지는 식, void로 선언되는 식을 사용 불가
Expression2 는 오류 출력시 오류 설명 문자열로 사용됨. 사용된다.
Exception in thread "main" java.lang.AssertionError: Expression2
at assert_test.AssertionTestDrive.testAssertion_01(AssertionTestDrive.java:25)
assertion을 사용하지 말아야 하는 경우
  • public 메소드의 내에 인수 체크
    • AssertionError는 Error 상속 한다. (주의) 일반적인 Exception으로 예외 처리 되지 않음.
  • 어플리케이션의 올바른 동작에 필요한 처리를 실행하기 위해서 assertion를 사용하지 말아 주세요.

사용예
  • 내부의 불변조건 : 반드시 될수 없는 조건
  • 제어 플로우의 불변 조건 : 제어 흐름상 올 수 없는 곳
  • 사전 조건,사후 조건, 및 클래스의 불변 조건
    • 사전 조건 - 메소드가 호출 되었때 반드시 만족 해야 한다.
      • 락 상태 사전 조건 : Thread.holdsLock():
    • 사후 조건 - 메소드가 호출 된 후 반드시 만족 해야 한다.
    • 클래스 불변 조건 - 내부 불변 조건의 일종
내부의 불편조건 예1)
for(int i = 0 ; i < 10 ; i++){
 if(i % 3 == 0){
   System.out.printf("%d는 3으로 떨어집니다.\n",i);
 }else if(i % 3 == 1){
   System.out.printf("%d의 나머지가 1입니다.\n",i);
 }else{
   System.out.printf("%d의 나머지가 2입니다.\n",i);
   assert i % 3 == 2 : i;
 }
}
내부의 불편조건 예2)
enum Suit{ CLUBS,DIAMONDS,HEARTS,SPADES }
for(Suit suit:Suit.values()){
 switch(suit){
 case CLUBS: System.out.println(suit); break;
 case DIAMONDS: System.out.println(suit); break;
 case HEARTS: System.out.println(suit); break;
 case SPADES: System.out.println(suit); break;
 //디폴드 값이 절대로 올수 없으므로
 default:
   throw new AssertionError(suit);
 // assert false:suit; //동일함.
 }
}
제어 플로우의 분편조건 예)
for(Suit suit:Suit.values()){
 if(suit == Suit.SPADES)
   return;
}
//Never reach this point!! -->
assert false;
사전 조건 예)
public void setRefreshRate(int rate){
 //precondition -- 이 부분에서 사용하지 않는 이유는 public
 //에서 파라미터 확인을 위해서 assertion을 사용하지 말라
 //그 이유는 throw 하지 않기 때문에
 if(rate <= 0 || rate > MAX_REFRESH_RATE)
   throw new IllegalArgumentException("Illegal rate: "+rate);
 setRefreshInterval(100/rate);
}
private void setRefreshInterval(int interval){
 assert interval > 0 && interval <= 100/MAX_REFRESH_RATE : interval;
}

assert 고도의 사용법
assert 클래스 파일로 부터 무효화 하기 : 이유는 프로그램 사이즈가 작아진다.
static final boolean asserts = false;
static void controlAssert(){
 if(asserts) assert false;
}
assertion 무조건 유효화 하기 : -ea을 활성해야 한다. 않그러면 정상적으로 동작 하지 않는다.
static{
 boolean assertEnabled = false;
 assert assertEnabled = true; //
 if(!assertEnabled) throw new RuntimeException("Asserts must be enabled!!!");
}

시작시 assert를 유효화 무효화 할 수 있음. 관련 기능
디폴트는 무효화 입니다.
  • 유효화 : -enableassertions 혹은 -ea
  • 무효화 : -disableassertions 혹은 -da
모든 시스템 클래스에 대한 유효/무효화
  • 유효화 : -enablesystemassertions 혹은 -esa
  • 무효화 : -disablesystemassertions 또는 -dsa
옵션 형식 :
  • 인수 없음 : 시스템 클래스를 제외한 모든 클래스내의 assertion를 유효 또는 무효로 한다
  • packageName... : 이름 첨부의 패키지내 및 임의의 서브 패키지내의 assertion를 유효 또는 무효로 합니다.
  • ... : 현재의 작업 디렉토리내의 이름이 없는 패키지내의 assertion를 유효 또는 무효로 한다
  • className : 지정한 클래스내의 assertion를 유효 또는 무효로 한다
사용예
  • 예1) java -ea:com.wombat.fruitbat... BatTutor
    • - 설명 : com.wombat.fruitbat 패키지와 그 서브 패키지내에서만 assertion를 유효하게 함. 실행프로그램 BatTutor
  • 예2) java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat BatTutor
    • - 설명 : com.wombat.fruitbat 패키지내의 assertion를 유효하게 하고,com.wombat.fruitbat.Brickbat 클래스내의 assertion를 무효로 시킨 후 BatTutor를 실행함

자바7 NIO.2 - 내용정리 1장

chapter 1. Path 클래스 사용하기

java.nio.file.Path


Path 클래스 두 가지 용도
  • 문법적인 용도로 파일시스템에 접근하지 않고 경로를 조작하는 작업에 주로 사용 (메모리상의 논리적인 조작)
  • 경로를 참조하는 파일에 대한 작업


파일시스템 - 하드 드라이브 같은 일정한 형태의 미디어에 파일을 저장하고 구조적으로 관리하며, 같은 방법으로 파일을 쉽게 가져올 수 있게 만든 것
java.nio.file.FileSystems 을 사용하여 접근할 수 있다.
중요 메소드
  • getDefault() : JVM에 기본 FileSystem(운영체제의 기본 파일시스템)을 반환하는 static 메소드
  • getFileSystem(URI uri) : 인자의 URI 스키마와 일치하는 파일시스템 제공자(provider) 목록에서 파일시스템을 반환하는 static 메소드. 메모리 , 네트워크 , 가상 파일시스템에서 가져 올 수 있다.


FileSystems.getDefault().getPath(""); 의 단축 표기 법은 Paths.get(""); 이다.
Path.normalize(); --> 중복되는 부분을 정리한다.
URI 파일 예 : file:///rafaelnadal/tournaments/2009/BNP.txt
1.2 경로 정의 하기
  • 절대 경로 정의 : Paths.get(“절대경로”);
  • 상대 경로 정의 : Paths.get(“상대경로");
  • 작업 폴더에서 상태 경로 정의 :
  • 단축을 이용한 경로 정의 : . , .. 사용가능 , normalize() 중복 부분 제거
  • URI에서 경로 정의 하기 : URI.create()이용하여


1.3 경로에 관한 정보 가져오기
  • getFileName() : 경로가 가리키는 파일/디렉토리를 반환함.
  • getRoot() : 경로에서 루트를 가져옵니다.(만약 경로에 root가 없다면 null)
  • getParent() : 현재 경로의 부모를 가져옵니다.
  • getNameCount() : 경로에 있는 요소 개수를 가져 온다.
  • getName(int index) : 각 요소의 이름 가져오기
  • subpath(start,end) : 상대경로를 추출할 수 있다. 시작 인텍스와 끝 인덱스를 주면 해당 범위 요소를 반환함.


주요 메소드들
1.4 Path의 변환 관련 메소드
  • toString() : 문자열 변환
  • toUri() : URI로 변환
  • toAbsolutePath() : 절대 경로 변환
  • toRealPath() : 실제 경로 변환 (아래 추가 설명)
  • toFile() : 파일 객체로 변환
  • FileInstance.toPath() : 파일 객체를 Path 객체로 변환
실제 경로를 반환하는 메소드
  • toRealPath(Options..); 설명
실재 파일(existing file)의 실제 경로(real path)를 반환 한다. 여기서 실재 파일이라는 의미는 파일이 진짜로 있어야 한다는 뜻이다. 하지만 toAbsolutePath() 메소드를 사용할 때는 실재 파일일 필요가 없다. 심볼 링크를 지원하는 파일시스템에서는 toRealPath() 메소드에 어떤 인자를 전달하지 않는다면 경로에 있는 모든 심볼 링크를 실제 경로로 풀이한다. 변환과정에서 심볼링크를 제외하고 싶다면 메서드에 LinkOption.NOFOLLOW_LINKs enum 상수를 전달해야 한다. 또한 상대 경로를 전달하면 절대 경로를 반환하며, 경로에 중복 요소가 있다면 이를 제거한 경로 반환한다.
만약 toRealPath() 메소드는 파일이 없거나 파일에 접근할 수 없다면 IOException 예외를 던진다.


1.5 두 경로를 조합하기
  • resolve() : 고정 경로에 부분경로 추가
  • resolveSibling() : 형제 경로에서 부분경로 추가


1.6 두 위치 사이의 경로 생성하기
  • relativize() : 한쪽 위치에서 다른 위치까지의 경로를 만들기
** 주의사항 : 만약 루트 패스가 한쪽에 있는 경우에는 정상적으로 패스를 만들지 못한다. (모두 있어야 한다.)


1.7 두 경로 비교하기
  • equals() : 두 경로의 동등성은 비교 한다.
    • 파일 시스템에 접근하지 않는다.
    • 비교하는 경로로 실재 하지 않아도 된다.
    • 경로가 파일인지 검사하지 않는다.
    • OS에 따라 대소문자를 비교를 여부를 따진다.
    • 상대경로와 절대경로는 같은 패스를 가르쳐도 동등하지 않는다.
  • java.nio.file.Files.isSameFile() : 두개의 경로가 같은 파일/폴더인지만 검사한다. 내부에서 Path.equals를 사용하고 만약 false인 경우 이중 체크 작업 즉 파일시스템에 실재해야 한다. 만약 그렇지 않으면 IOException 예외를 던진다.
  • Path는 Comparable 인터페이스 구현 하였음. 정렬은 사전편찬식 작은은 0 보다 작은값 크면 0 보다 큰값
  • 부분비교 : startsWith() ,endsWith()


1.8 경로의 이름 요소 반복하기
Path는 Iterable 인터페이스 구현하고 있음. 명시적인 이터레이터를 사용하거나 foreach 루프를 사용할 수 있다.

- 참고 문헌 : 한빛미디어 , 자바7 NIO.2 파일&네트워크 프로그램밍

2013년 9월 6일 금요일

[Head First]Servlets & JSP 내용정리-3장

Chapter.03 MVC 웹 애플리케이션 만들어서 배포해봅시다.

url-pattern 양식 설명
  • URL 입력 패턴 : /Beer-v/SelectBeer.do
    • /  : 서버의 루트 디렉토리
    • Beer-v : web-application 컨텍스트 루트(환경)
    • /SelectBeer.do : 자원에 대한 논리적인 이름
JSP 설명
  • 파일 확장자 jsp
  • page 지시자(directive) <%@ … %>


forward 구문 : servlet에서 JSP를 호출하기

public void doPost(HttpServletRequest request,
   HttpServletResponse response)
   throws IOException, ServletException{


 String c = request.getParameter("color");
 BeerExpert beerexpert = new BeerExpert();
 List<String> result = beerexpert.getBrands(c);


 request.setAttribute("styles",result);
 ------------------------------------------------
 JSP가 나중에 읽을 수 있도록 Request객체의 속성값을 설정한다.


 RequestDispatcher view = request.getRequestDispatcher("result.jsp");
 --------------------------------------------------------------------
 JSP로 작업을 부탁할 클래스 RequestDispatcher 객체를 생성한다.
 view.forward(request,response);
 ------------------------------
 RequestDispatcher는 컨테이너에게 JSP를 준비하라고 요청하고 그 다음 JSP에게
 request와 response 객체를 전달한다.

[Head First]Servlets & JSP 내용정리-2장

Chapter.02 웹 애플리케이션 아키텍쳐

컨테이너 (Container) : tomcat 대표적인 컨테이너

컨테이너 역할

  • 통신(커뮤니케이션) 지원 :
    웝서버와 서블릿과의 통신에 대해서 고민 할 필요 없음.
  • 생명주기 관리 :
    Servlet의 탄생과 죽음 관리
  • 멀티스레딩 지원 :
    요청이 들어올 때 마다 새로운 자바 쓰레드 생성 , 응답하면 쓰레드가 끝남.
  • 선언적인 보안 관리 :
    XML DD를 통한 관리
  • JSP 지원 :
    JSP를 Servlet으로 변환

컨테이너의 요청 관리 순서

  1. 사용자가 서블릿 링크를 클릭
  2. 컨테이너 요청이 들어오면 다음 두 객체를 생성
    • HttpServletResponse
    • HttpServletRequest
  3. URL을 분석 DD에서 어떤 서블릿 요청인지 알아내고 해당 서블릿 생성 후
    Request , Response 객체를 인자로 넘김.
  4. 컨데이너는 서블릿의 service()를 호출하고
    요청에 지정한 방식에 따라 doGet() 혹은 doPost() 호출할지 결정함.
  5. doGet() 메소드에서 동적인 페이지를 생성한 후, Response 객체에 실어 보낸 후
  6. 쓰레드 작업이 끝나면 Container는 Response 객체를 HTTP Response로 전환하여
    클라이언트 내려 보내고 마지막으로 Request , Response 객체를 소멸시킴

Servlet의 세 가지 이름 가진다 : 그 이유는 편리성, 보안성, 확장성, 친밀성 (^^ 그냥 좋다)

  • URL 이름 - 클라이언트가 호출시 사용함.
  • 내부적인 이름 - 내부적인 맵핑을 위한 이름
  • 실제 파일명 (패스포함) - 실제 패키지 클래스 이름 (.class 빼고)


배포서술자(web.xml : DD) 유형설명

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2eeweb-app_2_4.xsd">
 <servlet>
 -----------
 컨테이너가 관리하는 서블릿 클래스에 대한 정보를 알수 있음.
   <servlet-name>Chapter1 Servlet</servlet-name>
   ---------------------------------------------
   내부 이름에 해당한다. <servlet-mapping>의 <servlet-name>과 맵핑됨.
   <servlet-class>Ch1Servlet</servlet-class>
   -----------------------------------------
   패키지명과 포함하는 서블릿명 (.class는 생략)
 </servlet>
 <servlet-mapping>
 -----------------
 URL로 들어오는 검색하여 실제 실제 서블릿 클래스를 찾는 역할을 수행
   <servlet-name>Chapter1 Servlet</servlet-name>
   <url-pattern>/Serv1</url-pattern>
   ---------------------------------
   URL 이름 - 실제 클라이언트가 호출하는 이름
 </servlet-mapping>
</web-app>
** 정확한 경로가 없는 이유는 컨테이너는 정해지 위치에서 서블릿을 찾기 때문...


DD 역할
  • 보안 역할 설정
  • 오류페이지 설정
  • 항목 라이브러리
  • 초기화 구성 및 관련 정보 설정


서블릿, JSP 환경에서 MVC
  • M - POJO (일반 자바 객체),
    • 비지니스 로직 여기 들어감.
    • 예를 들면 장바구니 정보
    • DB연동등이 존재함.
  • V - JSP가 수행함.
    • C로 부터 모델 정보를 읽어 옴.
    • 사용자가 입력한 정보를 C에게 넘김
  • C - Servlet이 수행함.
    • Request 객체로 부터 사용자가 입력한 정보를 뽑아 냄
    • 모델정보를 수정 하거나 뷰에게 넘겨줄 새로운 모델를 생성한다.
J2EE 란 ?

  • 스펙들에 대한 스펙 , 슈퍼 스펙
  • 하위 스펙들
    • 서블릿 스펙 2.4
    • JSP 2.0 스펙
    • EJB 2.1 스펙
    • JNDI
    • JMS
  • J2EE 어플리케이션 서버 = 웹 컨테이너 + EJB 컨테이너 , 톰켓은 어플리케이션 서버가 아님.
    • BEA의 윕로직
    • JBoss AS
    • IBM의 웹스피어