void ioWorker() throws IOException

{
1.스트림 연다.
2.작업한다. <-IO 익셉션 발생했을 경우
3.스트림 닫는다.
}

=> 생각해볼 점.. throws를 선언했음으로 익셉션에 대한 catch의 책임은 콜러측에 넘겼지만,

     익셉션 발생시 코드의 제어에 따르면 (catch or finally가 없다면) 제어가 바로 콜러측으로 복귀하기 때문에
     시스템 리소스를 열어서 워커가 작업 중이었다면.. 리소스 누수가 발생한다. 그럼으로 리소스 관련 작업을
     해줄때에는 throws 선언했다고 방심하지 말고.. 리소스를 어떻게 안전하게 해제할지를 고려해줘야한다.
     sol) try {} finally{} 사용!

 =>예외 발생시 필터스트림의 close()를 명시적으로 호출해 줘야하는 이유가 또있다. 예를 들어 버퍼드 필터스트림을 
    사용할 경우.. 실제로 print() 작업을 해줘도 실제로 파일에 기록을 하지 않고 내부의 버퍼에 담아둔다. 이것을 최종적으로
    타겟 소스로 보내는 작업은 flush()가 담당한다. 그럼으로 close() 또는 flush()를 사용해야 한다. (외부 i/o 접근은
    너무 느리고, 위험성이 있기에 최소화 한다.)  (cf) 채팅 프로그램의 경우엔 버퍼드필터스트림의 생성자에 
    boolean autoFlush 를 true로 한다)


*******************************************************************************************

dtd: xml문서의 구조를 레벨별로 나누어 관리할수 있다
schema: xml 문서가 더 복잡한 제약을 만족할수 있게 관리한다.

dom: xml 문서 전체를 한번에 메모리로 읽어와 프로그래밍을 통해 사용할수 있게 해준다.
sax: dom과는 달리 xml문서 전체를 한번에 메모리에 올리지 않고, 이벤트 중심으로 문서를 처리할수 있게 해준다.

xsl: xml문서를 스타일시트 타입으로 구성하기 위하 언어
xslt: xml문서를 또 다른 xml문서(브라우저에 출력하기 위한 html, 핸드폰등 무선기기에 출력하기 위한 wml등)로 변환
       하는 언어로, 주어진 xml문서의 구성요소를 추출해서 재배열하는등의 조작 메커니즘을 제공한다. 
       (xslt는 xml을 조작할때 xpath라는 언어를 사용한다. element와 같은 의미인듯?)

jsp페이지를 xml문서로 작성하는 것이 가능하다. 모든 jsp페이지는 xml문서로 표현된다.

xml의 지향점은 무엇인가?
*************************************************************************************

1.xml 파일 식별 관련 (dom스타일, sax스타일)

1.1  javax.xml.validation.SchemaFactory = newInstance("W3C XML Schema 1.0" or "RELAX NG 1.0")으로 원하는
                                                        타입을 결정해 스키마 객체 팩토리로 설정된후, (스키마란 용어는 class,inst
                                                        ance중 class라 생각하면 간단함.Schema newSchema()로 스키마 객체 
                                                        생성해줌.

1.2    javax.xml.validation.Schema = validator or validatorHandler생성
     
1.3    javax.xml.validation.Validator = void validate(Source source)로 해당 소스의 유효성 검증

        1.3.1  Source의 종류는
               a.javax.xml.transform.stream.StreamSource = 말 그대로 스트림으로 받게 되는 xml 패키지
                                                                          StreamSource(소스선택)와 StreamResult(구체 작업선택)

****javax.xml.trasform.Result 의 의미를 잘못 파악햇음! 말 그대로 transform 객체를 통해 변환 작업후 결과물을 담을
타겟의 의미임! (헷갈린 이유는 어제 노트계열 스트림, 필터계열 스트림의 데코레이터 패턴에 정신이 안드로메다로 날
아가서 인듯 **** 
                                                                          클래스로 구분됨

               b.javax.xml.transform.sax.SAXSource (simple app for xml )
                                                                = 마찬가지로 SAXSource와 SAXResult 클래스 + SAXTrans
                                                                   FormerFactory 클래스로 구성됨!
                                                                => XMLReader getXMLReader() , void setXMLReader() 등을 통해
                                                                   SAX 스타일의 스트림 관리

               c.javax.xml.trasform.dom.DOMSource (document object model)=
                                (1) DOM타입(노드를 이용한 트리구조)으로 데이터를 주고 받음
                                (2) XSLT와 관계성은 무엇인지 모르겠음! (제일 하단에 기술. xslt는 도큐먼트 언어 변환기임)
                                (3) javax.xml.Transformer 객체의 
                                     transform(Source xmlSourcr, Result outputTarget)을 사용해
                                     즉 소스를 선택하고, 수행할 작업을 결정해서 transformer객체를 통해 일을 시킴.
                                            Result = DOMResult,SAXResult,StAXResult,StreamResult 등이 있음.
                                    
                                                                      
                                생성자
                                (1)디폴트 생성자의 경우 내부적으로 DocumentBuilder.
                                    newDocument()를 사용해 빈상태의 DOM오브젝트 생성
                                (2)트리구조 임으로 DomSource(Node n)으로 생성 가능

                                주요메서드
                                (1)Node getNode()
                                (2)void setNode(Node n)
 
                                 javax.xml.parsers 패키지, org.w3c.com패키지, java.io패키지를 이용해 
                           xml파일을 DOM document 형식으로 다루기 
                                (1) DocumentBuilderFactory 객체 생성
                                (2) (1)에게서 DcumentBuilder 객체 생성
                                (3) (2)빌더가 제공하는 parse() 메서드를 사용해 파일스트림(xml)에서 Document 객체를 파싱
                                              (ex) Document d = docBulider.parse(new BufferedInputStream (new FileInputStream(.xml로 생성한
                                                     File객체)))
                                (4) d.getElementsByTagName("태그명")을 통해 NodeList 형 객체(Elements의 집합)에 
                                     받아옴
                                (5) NodeList 객체를 순회하면서 item(인덱스) 메서드를 통해 포함하고 있는 Element를 
                                     받아온후,
                                     (5-1) DocumentBuilder 객체의 org.jdom2.Element build(Element e)를 이용해 xml 파일의
                                             Element객체를 Document에서 쓰는 Element 객체로 변환 (Dom 형식으로 사용)

                                (6) (5)를 통해 얻어온 Elements 로서 이런 저런 작업을 수행후, 다시 xml로 파일에 기록해주기
                                (7) DOMSource source = new DOMSource(3에서 생성한 Document객체)를 통해
                                     Document 객체를 -> 파일 스트림 소스로 변환
                                (8) Source 관련 구체적 작업(필터)을 위해서  Transform 작업후 결과를 담기(타겟=dest) 위한 
                                     StreamResult 객체 생성
                                      (ex)StreamResult result = new StreamResult(new File( 경로 + 파일명.xml));
                                
                                (9) StreamSource , StreamResult를 가지고 실제 작업을 수행할 Transformer 객체 생성이 필요
                                     그럼으로 TransformerFactoy 객체를 생성해 Transformer 객체를 생성.                                       
                                (10) 스트림소스, 스트림이 어떤 작업을 할지 결정한 StreamResult(필터)를 Transformer 객체
                                      에게 매개변수로 전달해 작업 transform() =파일에 xml로 기록 시킴 


                                org.jdom2 패키지를 사용해 xml파일 기록하기(내가 썼던 방법)
                                (1) FileOutputStream 객체 생성, FileOutputStream(".xml")
           
                                (2) XMLOutputter 객체를 생성. 

                                (3) XMLOutputter 객체의 초기화를 위해 Fomat 객체 생성
                                     (3-1) 포맷 객체에 setEncoding("UTF-8"),setLineSpeparator(),
                                             setTextMode() 등으로 출력할 파일의 포맷(속성)결정
                                     (3-2) setFormat() 을 통해 XMLOutputter 객체 초기화 

                                (4) 내가 구성했거나, 읽어왔던 Document 객체와 
                                     (1)에서 만든 파일 아웃풋 스트림 객체를 XMLOutputter 객체에
                                        게 매개변수로 전달
                               
                                (5) 아웃풋객체의 output()메서드를 이용해 도큐먼트->xml로 출력 
                                     작업을  수행


                                 또다른 방법은 무얼까? XMLEncoder 클래스, XMLDecoder 클래스 확인 필요!


               d.StAXSource = 
                                  (1) StAX 리더(XMLStreamReader, XMLEventReader)의
                                       형식의 XML Source 홀더로서 기능한다.
                                  (2) Source를 받아들이는 모든 케이스, Transformer나
                                       입력으로서 Source를 받아들이는 Validator로 사용가능.
                                  (3) 마찬가지로 Source, Result 클래스가 존재한다.
                                     
                                  생성자
                                  (1) StAXSource(XMLEventReader x)
                                  (2) StAXSource(XMLStreamReader x)

                                  주요 메서드
                                  (1)XMLEventReader getXMLEventReader()
                                  (2)XMLStreamReader getXMLStreamReader()


XSLT(Extensible Stylesheet Language Transformations)는 XML 문서를 다른 XML 문서로 변환하는데 사용하는 XML 기반 언어이다. W3C에서 제정한 표준으로 XML 변환 언어를 사용하여 XML 문서로 바꿔주며, 탐색하기 위해 XPath를 사용한다.

원본 문서는 변경되지 않으며, 원본 문서를 기반으로 새로운 문서가 생성된다.[2] 새 문서는 표준 XML 문법 또는 HTML, 일반 텍스트 형식으로 출력된다.[3] XSLT는 XML 데이터를 웹 페이지로 표시하기 위해 HTML 또는 XHTML 문서로 변환할 때 자주 사용된다. 변환은 클라이언트나 서버에서 동적으로 수행되거나, 퍼블리싱 단계에서 수행되기도 한다. XML을 PDF,PostScriptAWTPNG와 같은 다양한 형태로 바꿀 수 있는 XML-FO로 변환할 때도 사용한다. XSLT는 일반적으로 서로 다른 XML 스키마를 사용하는 XML 메시지를 변환하거나, 하나의 스키마 안에서 문서를 변경하기 위해 사용한다(예: 메시지에서 불필요한 부분 삭제).


Transformer 클래스와 동일한 역할 아닌가? XMLOutputter,Inputter 클래스도..





by givingsheart 2014. 1. 1. 15:54