전자문서와하이퍼텍스트 - Esantomi/digital-humanities GitHub Wiki

목차

강의 페이지

기말 평가

  • 시험
    • 플레인 텍스트가 주어지면 XML로 바꾸고, 데이터베이스에 적재하여 서비스할 수 있게끔 하는 것

1주차. 오리엔테이션

  • 과거 워드 프로세서는 위지윅(WYSIWYG) 방식이 아니었다.
    • 위지윅은 눈에 보이지 않는 문자(감추어진 부분)를 보여 주지 못한다.
    • 텍스트 기반 문서 작성을 통해 어떤 제어 문자, 태그가 들어가 있는지 직접 확인할 필요가 있다.
  • 본 강의에서는 XML 문서를 제작하는 방법과 XML을 데이터베이스상에서 운용하는 방식을 배울 것

말, 글, 데이터

  • 조선 시대에는 '앎이 곧 행함'으로 이어진다고 믿는 경우가 많았으나, 이는 신분 사회의 뒷받침 덕분이었다.
    • 단순히 지식이 많은 것만으로는 부족하다.
    • 특히, 변화에 필요한 사회적 역할이 주어지지 않는다면 개인적 실천에 그칠 뿐이다.
    • 즉, 지식이 많아도 실천으로 이어질 방법이 없다면 어떡할 것인가?
    • 지식을 통해 얻은 status를 통해 특정 기능을 수행할 수 있다는 것은 망상이나, 오늘날도 여전히 널리 받아들여진다.
      • 실천을 할 수 있는, 유효하고 올바른 능력을 신장시키기 위한 공부가 필요하다.
  • 소피스트들의 '말의 시대'는 갔다.
    • 사회 규모가 점차로 커졌기 때문.
  • '글의 시대'가 왔고, 조선 시대 과거 시험의 목적도 사대부에 걸맞은 작문이 가능한지 판단하는 것에 있었다.
    • 단순히 문학성 있는 글을 쓰는 것이 아닌, 고사들을 적절히 인용함으로써 설득력 있는 글을 쓰는 능력을 말한다.
      • 이 당시에는 글을 잘 쓰는 능력이 실제로 세상을 움직이는 결과로 이어질 수 있었다.
    • 마르크스의 《공산당 선언》과 디지털 인문학 선언문(Digital Humanities Manifesto)을 읽어 볼 것
  • 이제는 '데이터의 시대'다.
    • 지금은 문서도 전자적으로 제작되고 전자시스템을 통해 전달된다.
    • 데이터는 실천력을 갖는다.
    • 데이터 시대에 유효한 커뮤니케이션 능력을 확보함으로써, 사회를 움직이는 데 기여하는 인력이 될 수 있다.

데이터 시대의 인문학

  • 세상이 돌아가는 데 인문학이 아무런 영향을 미치지 못한다면, 인문학은 사라지고 말 것이다.
    • 인문학적 지식이 데이터로 운용됨으로써, 의사소통 속에서 어떤 역할과 기능을 수행할 수 있어야 한다.
    • 즉, '글의 시대'에 융성했던 인문학 지식이 '데이터의 시대'에서 사라지지 않을 수 있도록 해야 한다.
    • 인문학은 왜 유독 디지털과 거리가 먼가?
      • 애초에 디지털화되기 어려운 개념들을 다룬다. (이산적이지 않은 데이터들)
      • 자연과학, 사회과학에 비해 관심사가 더 과거에 치우쳐 있다.
  • 디지털인문학자로서, 직접 인문지식을 탐구하는 사람이 직접 데이터를 취급할 수 있는 능력을 가져야 한다.
    • 정통적 인문학이 아니어도, 오늘날 유효한, 사람에 대한 탐구를 디지털적으로 '직접' 접근할 수 있어야 한다.
    • 인문학자와 컴퓨터 전문가의 협업은 길어야 1년이다.
    • 프로세스를 통해 도출한 데이터를 스스로, 추가로 손볼 수 있는 사람이 디지털인문학자이다.
      • 기술은 항상 새롭게 나오므로, 중요한 건 기술 자체가 아니라 인문학적 목표 의식이다.

디지털 교실 환경 설정

  • FTP(File Transfer Protocol)
    • 파일 전송 프로토콜(규약)
      • 프로토콜(protocol)이란 '나'(사용자)와 '상대'(서버) 간 사용하기로 약속한 언어 (e.g. HTTP로 대화)
    • FTP에 의한 파일 전송을 쉽게 해 줄 수 있는 소프트웨어 (e.g. FileZilla)
    • 내 디렉터리는 2022 - 201 - student - s08

과제

  • 본인 컴퓨터에 사진 파일 10장 준비할 것
    • 메타데이터를 추출, 사진을 볼 때 메타데이터를 같이 볼 수 있게끔 XML 데이터로 만들어 볼 예정

2주차. EXIF와 포토 아카이브 구축

포토 아카이브 구축

  • 2022-201:Photo Archive Home
    • EXIF 메타데이터를 바탕으로 한 아카이브
    • 메타아카이브의 /public_html/photoAlbum/s08 사용
  • 설치 프로그램
    • Exif Pilot
      • a useful application for individuals dealing with JPEG EXIF information on a daily basis.
        image
        • Edit EXIF/IPTC/XMP 클릭 후 세부정보 수정
        • 한번에 EXIF 데이터를 다운받으려면 별도의 유료 플러그인(batchediting.plg), Registration Code 필요
          1. Plugins - Batch Editing - Add Plugin
          2. Import/Export - Create Template for Export - Settings - Export/Import to/from single File 체크
          3. Import/Export - Export EXIF/IPTC/XMP to CSV
            • csv로 저장 완료!
      • EXIF(Exchangeable image file format)
        • 디지털카메라의 이미지 파일 안에 저장되어 있는 화상 파일 형식
        • 화상 데이터와 함께 카메라 제조사(Maker), 카메라 모델(Model), 이미지 에디터(Software), 사진을 보정한 날짜(Datetime), Exif 버전(Exif Version), 촬영한 날짜(Shoot Datetime), 웹에 올려진 사진의 실제 크기(Image Size), 노출 시간(Exposure Time:셔터 스피드), 촬영 프로그램(Exposure Program), 렌즈 초점 길이(Focal Length), 조리개 개방 수치(F-Number), 플래시 사용 여부 등 세부적인 부가정보를 기록할 수 있다.
    • csv2xml
      image
      • Exif Pilot으로 생성한 csv 파일을 extractPhotoMetaXml.bat, extractPhotoMetaKml.bat 파일을 통해 XML, KML 파일로 변환
        image
    • Easy Thumbnails
      • a popular free Windows utility for creating accurate thumbnail images and scaled-down/up copies from a wide range of popular picture formats.
        image
        • 섬네일 파일은 thumb 폴더를 만들어 별도 저장
          • 이때 원본 이미지와 파일명이 같아야 함
  • 서버 업로드

과제

  • 지리정보 포함된 album01과 album02를 만들기
    • 두 앨범은 성격이 다르게 설정
      • 맛집 앨범과 취미 앨범?
    • 지리정보 없으면 새로 찍기 (또는 지리정보 삽입)
    • 내 개인 위키에 구축해도 좋음

3주차. INTERNET과 WWW / 포토 아카이브

인터넷의 탄생

  • ARPANET
    • 1963년 미국 국방성의 ARPA(The Advanced Research Projects Agency)는 긴급 사태 시에도 장애를 받지 않고 정상적으로 제 기능을 발휘할 수 있는 통신망 구축 방법에 대한 연구를 추진
    • 1969년부터 ARPA 연구원들 간의 정보 자원 공유를 위하여 ARPANET이라는 컴퓨터 통신망을 구축하여 운용하기 시작
  • TCP/IP
    • 당시 근거리통신망(LAN) 기술과 워크스테이션의 보급에 따라 새로운 컴퓨터 통신망들이 탄생하여 발전하기 시작하였고, ARPANET은 이들 통신망들과의 상호 연결이 필요
    • ARPA는 기종에 관계없이 통신망에 접속된 모든 컴퓨터 간의 통신이 가능한 컴퓨터 통신망 구축을 위해 새로운 통신 프로토콜을 정의하게 되었는데, 그것이 TCP/IP 프로토콜
    • 미국방성의 DCA(the Defense Communications Agency)는 모든 ARPANET 호스트들의 TCP/IP 사용을 의무화
      • TCP/IP는 인터넷의 표준 프로토콜로 자리를 잡게 됨
  • NSFNET
    • 1985년 미국과학재단(NSF: The National Science Foundation)은 5개의 수퍼 컴퓨터 센터를 설치하고 미국의 각 대학에서 이 자원을 공동으로 이용할 수 있게 하는 계획을 수립
    • 5개 센터의 수퍼 컴퓨터를 많은 사용자들이 공동으로 사용하기 위해서는 통신망 구축이 필요
    • 기존의 ARPANET을 사용하려 했으나, 관료적 문제점들로 인해 실패
      • TCP/IP 기술을 바탕으로 한 고유의 통신망을 구축하기로 결정
    • 모든 대학이 수퍼 컴퓨터 센터와 직접 연결하는 것이 아니라, 지역별로 독립된 통신망을 구축하고 각 지역망들이 다시 체인처럼 연결되게 하며, 이러한 체인망들 중에 하나가 수퍼 컴퓨터 센터와 접속
  • INTERNET
    • 대학 사회에서의 컴퓨터 통신망 구축이 활발하게 전개
    • 컴퓨터 자원 활용 면에서는 크게 성공적이었으나 곧 트래픽의 한계에 봉착
    • 망 및 망 제어 컴퓨터의 성능을 지속적으로 개선
      • 국가기관 종사자들의 전유물이었던 인터넷을 교육 분야로 확대
    • 미국의 4년제 대학에 입학하는 모든 학생을 인터넷 사용자화
      • 이들이 대학 졸업 후, 각자가 속한 기업, 단체에서 인터넷 활용을 촉진

하이퍼텍스트

  • 하이퍼텍스트(Hypertext)란?
    • 문서 내의 중요한 키워드마다 다른 문서 또는 유관한 시청각 자료로 연결되는 통로를 만들어 여러 개의 문서가 하나의 문서인 것처럼 보여 주는 문서 형식
      • Hypertext의 반대되는 개념은 Linear text
  • 하이퍼텍스트 이론의 발전
    • 메멕스(memex)
      • 1945년 바네바 부시(Vannevar Bush)가 제안한, 여러 정보를 꼬리에 꼬리를 물고 따라갈 수 있게 한 문서 관리 체제
      • 부시는 지식의 폭발적인 증가로 사용자가 자신에게 유용한 정보를 찾아갈 수 있는 경로가 여러 가지로 존재해야 한다고 주장 (‘As we may think’)
    • 하이퍼텍스트(Hypertext)
      • 테드 넬슨(Ted Nelson)은 이 개념을 정리하여 하이퍼텍스트란 용어를 창안
      • 1981년에 '리터러리 머신(Literary Machine)'이라는 글을 발표하여, 재나두(Xanadu)라는 시스템을 설명
        • 재나두는 문서의 내부에 노드로 표현되는 정보들을 연결한 최초의 하이퍼텍스트 시스템
  • 하이퍼텍스트의 실용화
    • 1987년, 미국의 애플사는 자사의 매킨토시 시스템에서 사용되는 하이퍼텍스트 응용 상품 ‘하이퍼카드(HyperCard)’를 출시
    • 하이퍼카드의 성공 요인
      • 매킨토시 운영체제와 함께 제공되는 무료 소프트웨어 패키지
      • 텍스트뿐 아니라, 소리와 이미지로의 링크를 제공
  • 하이퍼텍스트와 인터넷의 만남
    • 팀 버너즈리(Tim Berners-Lee)
      • CERN에 취직한 후, 범세계적인 정보 서비스를 위한 하이퍼텍스트 프로젝트를 제안 (1989)
      • 로베르 카이오(Robert Cailliau)와 함께 월드 와이드 웹(WWW)의 하이퍼텍스트 시스템을 고안
      • 사용자가 마음 먹은 대로 브라우징할 수 있는 노드들의 웹(WEB)으로 다양한 종류의 연결된 정보들에 접근하는 방법을 제공

월드 와이드 웹

  • 월드 와이드 웹(World Wide Web: WWW)
    • 하이퍼텍스트 문서를 지원하는 인터넷 서버들의 범세계적인 집합
      • WWW stands for "World Wide Web"; the large global collection of Internet servers which support hypertext documents coded in HTML, and transferred via HTTP
      • The universe of hypertext servers (HTTP servers) which are the servers that allow text, graphics, sound files, etc. to be mixed together
  • 웹 서버(Web Server)
    • 인터넷상에서 WWW 방식의 정보 서비스를 가능하게 해 주는 시스템 소프트웨어
      image
  • 웹 브라우저(Web Browser)
    • WWW의 클라이언트 측에서 서버와 메시지를 교환하고, 서버의 메시지를 해석하여 사용자에게 보여 주는 기능을 하는 소프트웨어
    • WWW 브라우저는 http, ftp 등 여러 가지 프로토콜을 통해 URL로 지정된 서버와 메시지를 교환
  • HTTP(HyperText Transfer Protocol)
    • WWW의 서버와 클라이언트가 하이퍼텍스트 문서를 송수신하기 위해 사용하는 프로토콜
    • TCP/IP 위에서 동작, 기본적으로 TCP 포트 80번이 지정
    • Request/Response 방식 동작
      • 서비스를 요구하면 TCP 연결이 만들어지고 서버가 응답을 보내어 데이터 전송을 끝내면 자동적으로 연결 마감
      • 하이퍼 링크를 통해 다른 호스트에 문서를 요청할 수 있으므로 효율적
      • 하나의 호스트에서 여러 문서를 가져올 경우에는 소모적인 방식
  • URL(Uniform Resource Locator)
    • 인터넷상의 여러 가지 정보 자원을 일원적으로 표기하는 약속
    • URL 개념의 발명은 여러 가지 형태의 리소스를 포괄적으로 처리하는 정보 시스템인 WWW의 기반이 되었다.
  • CGI(Common Gateway Interface)
    • 클라이언트로부터의 입력을 외부의 프로그램에 넘겨 처리하고, 그 결과에 기초해서 응답을 해 주는 기능
      image
    • CGI를 이용한 WEB 데이터베이스의 구현
      • 클라이언트의 web 문서 요청을 데이터베이스 검색 명령으로 치환
      • 데이터베이스 검색 수행
      • 검색 결과를 WEB 문서 형태로 변환
      • 클라이언트에게 WEB 문서 전송
  • HTML(Hypertext Markup Language)
    • 하이퍼텍스트를 만드는 수단. 사용자에게 보여 줄 문서의 표현 형식을 만들어 내는 언어
    • HTML 표준 문서의 기본 틀은 항상 SGML(Standard Generalized Markup Language)이라고 하는 페이지 서술 언어
      • 이미 어떠한 원칙과 사용자가 존재하는 환경에서 HTML이 태동 → 지속적인 표준화가 가능

XML, XSLT

  • XML을 웹에 띄우는 방법
    • XML을 프로그램이 읽어 들여 parsing해서 보여 주기
    • 스타일시트(stylesheet)를 이용 (HTML 스크립트 사용) : XSLT!
  • XSLT(Extensible Stylesheet Language Transformations)
    • XSLT는 XML 문서를 다른 XML 문서로 변환하는 데 사용하는 XML 기반 언어이다.
    • XSLT는 XML 데이터를 웹 페이지로 표시하기 위해 HTML 또는 XHTML 문서로 변환할 때 자주 사용된다.
  • API(Application Programming Interface)
    • 내가 가진 자원을 제3자가 쓸 수 있게 해 주는 것

포토 아카이브 홈

  • 장소감(sense of place)
    • 장소에 대한 인간의 정서적 감정을 의미하는 것으로 인간과 장소의 경험이 상호작용을 통해 소속감이나 애착과 같은 정서적 유대가 형성되는 것을 의미한다(권영락과 황만익, 2005)
    • 장소감이 느껴지는 이유는 우리가 그곳에 얽힌 이야기를 알기 때문
  • Photo Archive Home
  • 재미있는 글쓰기
    • 사람의 기억력은 한정적이므로, 재밌는 이야기를 쓰기 위해서는 소재가 풍성한 것도 좋으나 많은 것을 버릴 수 있어야 함
    • 논문도 마찬가지. '너무 많은 것을 담으려 하지 말 것'.
    • 코페르니쿠스적 전회(Copernican revolution) : 칸트 曰 시공간은 외재하는 게 아니라 인간 내면에 있는, 세상을 이해하기 위한 감성의 범주

XML 구조

image

  • <?xml> : XML 태그
  • <?xml-stylesheet> : XML 스타일시트 태그로, 보이는 형태 규정
  • <Album> : 아래 태그는 모두 사용자가 임의로 설정
    • <Photo>
      • <FileName>
      • <PixelWidth>
      • <PixelHeight>
      • <Description>
      • <DateTimeOriginal>
      • <Latitude>
      • <Longitude>
      • <Keywords>
      • <ObjectName>

4주차. XML의 이해

XML이란?

  • XML(eXtensible Markup Language)
    • W3C-recommended general-purpose markup language.
      • W3C Recommendation : XML 문서의 구조와 XML 프로세서의 요건을 정의
      • General-Purpose : 특정 분야, 특정 목적의 전자문서 생산에 적용할 수 있는 보편적 표준을 제공
      • Interoperable : 시스템의 상이함에 구애되지 않는 데이터 공유
      • Open, Free Standard : 누구나 사용할 수 있는 개방된 표준
        • 전자문서 기술 언어의 세계적인 표준
    • W3C에서 개발된, 다른 특수한 목적을 갖는 마크업 언어를 만드는 데 사용하도록 권장하는 다목적 마크업 언어
      • 즉, 다른 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어
  • XML의 특징
    1. XML은 다른 목적의 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어입니다.
    2. XML은 다른 시스템끼리 다양한 종류의 데이터를 손쉽게 교환할 수 있도록 해줍니다.
    3. XML은 새로운 태그를 만들어 추가해도 계속해서 동작하므로, 확장성이 좋습니다.
    4. XML은 데이터를 보여주지 않고, 데이터를 전달하고 저장하는 것만을 목적으로 합니다.
    5. XML은 텍스트 데이터 형식의 언어로 모든 XML 문서는 유니코드 문자로만 이루어집니다.
  • 탄생 배경
    image
    • 하이퍼텍스트 상용화와 SGML 국제 표준화에 힘입어 HTML이 등장했으나, HTML은 SGML의 정신(구조, 내용, 모양의 분리)을 계승하지 않았으므로 그 특성을 살려 새롭게 만든 것이 XML이다.
    • 기말 시험에 나옴!!

XML 발전의 역사

  • SGML(Standard Generalized Markup Language)
    • 문서에 담긴 정보 요소와 그 요소들 간의 관계를 컴퓨터가 이해할 수 있도록 만든 마크업 언어
    • 1969년 미국의 IBM 사의 찰스 골드파브(Charles Goldfarb)와 그 동료들(Ed Mosher, Ray Lorie)에 의해 GML(Generalized Markup Language)이라는 이름으로 처음 개발
    • 그 후 지속적으로 발전하여 1986년 국제표준기구에 의해 구조적 데이터 표현의 표준안(ISO 8876)으로 인증
  • HTML(Hypertext Markup Language)
    • HTML도 기본적으로는 SGML을 기반으로 만들어진 것
    • 그러나 HTML은 문서를 ‘내용’, ‘구조’, ‘모양’으로 구분하여 그 각각의 독립성과 유연성을 추구한 SGML의 기본 사상에 충실하지 않았다.
    • 대신 누구나 쉽게 ‘하이퍼텍스트’ 문서를 만들 수 있도록 하였고, 그것에 의해 월드 와이드 웹이 탄생
    • SGML을 차용하되, SGML에 얽매이지 않는 것이 HTML의 성공 요인
  • XML(eXtensible Markup Language)
    • HTML이 약화시켰던 SGML의 중요한 목적을 다시 회복
      • HTML이 표현하지 못했던 문서의 구조와 내용 요소의 성격을 명확하게 표현
    • XML 문서의 대표적 특성
      • 문서를 “문서의 구조”, “문서의 내용”, “문서의 모양” 3가지로 분리한다는 것
        • 문서의 내용과 모양을 구분함으로써, 내용을 그대로 두고 모양만을 바꾼다거나, 모양에 손대지 않은 채 내용을 확장하고 수정할 수 있는 유연성 보장
    • XML은 인터넷과 하이퍼텍스트가 결합한 곳에서 텍스트의 구조와 정보 요소까지 드러내고자 하는 취지에서 개발된 것
  • KML(Keyhole Markup Language)
    • 구글 어스, 구글 지도 및 기타 응용 프로그램에 쓰이는 XML 기반의 마크업 언어 스키마

XML의 특징

  • HTML
    • 구조, 내용, 모양의 통합 (문서의 내용과 모양을 한꺼번에 취급)
      image
  • XML
    • 구조, 내용, 모양의 분리
      image
      • XML : 문서의 내용
      • XSD : 문서의 구조
      • XSL : 문서의 모양
    • 예시: letter
      • letter.htm
        <html>
          <head>
            <title>편지</title>
          </head>
          <body>
            <p style="color:red; text-align:left">영이에게</p>
            <p style="color:green; text-align:center">생일 축하해!</p>
            <p style="color:blue; text-align:right">철수</p>
          </body>
        </html>
        
      • letter.xml
        <?xml version="1.0" encoding="utf-8"?>
        <?xml-stylesheet type="text/xsl" href="letter.xsl"?>
        
        <편지 xmlns="letter.xsd">
          <수신>영이에게</수신>
          <본문>생일 축하해!</본문>
          <날짜>2019. 4. 25</날짜>
          <발신>철수</발신>
        </편지>
        
      • letter.xsd
        <?xml version="1.0" encoding="utf-8"?>
        <xs:schema targetNamespace="letter.xsd"
          xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
          <xs:element name="편지">
            <xs:complexType>
              <xs:sequence>
                <xs:element ref="수신"/>
                <xs:element ref="본문"/>
                <xs:element ref="날짜"/>
                <xs:element ref="발신"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="수신" type="xs:string"/>
          <xs:element name="본문" type="xs:string"/>
          <xs:element name="날짜" type="xs:string"/>
          <xs:element name="발신" type="xs:string"/>
        </xs:schema>
        
      • letter.xsl
        <?xml version="1.0" encoding="utf-8"?>
        
        <xsl:stylesheet version="1.0" 
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:ltt="letter.xsd"
          exclude-result-prefixes="ltt"
        >
        <xsl:template match="/">
          <html>
            <head>
              <title>편지</title> 
            </head>
            <body>
              <xsl:apply-templates/>
            </body>
          </html>
        </xsl:template>
        
        <xsl:template match="ltt:편지">
          <xsl:apply-templates/>
        </xsl:template>
        
        <xsl:template match="ltt:수신">
          <p style="color:red; text-align:left"><xsl:value-of select="."/></p>
         </xsl:template>
        
        <xsl:template match="ltt:본문">
          <p style="color:green; text-align:center"><xsl:value-of select="."/></p>
        </xsl:template>
        
        <xsl:template match="ltt:날짜">
          <p style="color:grey; text-align:center"><xsl:value-of select="."/></p>
        </xsl:template>
        
        <xsl:template match="ltt:발신">
          <p style="color:blue; text-align:right"><xsl:value-of select="."/></p>
        </xsl:template>
        
        </xsl:stylesheet>
        

5주차. XML의 구조와 표현

패러데이터

  • SEADDA(Saving European Archaeology from the Digital Dark Age)
    • SEADDA is a community of archaeologists and digital specialists working together to secure the future of archaeological data across Europe and beyond.
    • 데이터의 공개와 공유를 통해 다수의 공유 자산으로 삼아 소실로부터 saving 하고자 함
      • 강철 같은 미디어에 새겨 두는 것이 아니라, 블록체인처럼 여럿이 소유하게 함
    • 디지털 기록을 남겨 둘 수 있는 환경 구축을 목표로 함
    • Arches
      • Arches is an open-source data management platform that is freely available for organizations worldwide to install, configure, and extend in accordance with their individual needs and without restrictions on its use.
  • 패러데이터(Paradata)
    • 데이터가 만들어지는 프로세스에 대한 데이터
      • The paradata of a data set or survey are data about the process by which the data were collected.
    • 데이터 자체는 남으나, 데이터가 어떻게 만들어졌는지에 대한 데이터는 잘 남지 않음

XML 구성 요소

image

  • Element(요소)
    • Opening tag(시작 태그)
      • Attribute(속성)
    • Value(요소 값)
    • Closing tag(종료 태그)
  • 빈 태그(empty tag)
    • 예) <br />, <img src="C:\Users\admin" />

XML 문서 구조

  • XML 문서의 구조
    image
    • <?xml version="1.0" encoding="UTF-8"?>
      • XML 문서는 맨 첫 줄에 <xml> 태그를 사용하여 XML 문서임을 명시
    • 구조 요소
      • 최상위 요소(root 요소)
        • XML 문서에 단 하나만이 존재
        • XML 문서에 존재하는 모든 요소의 조상(ancestor) 요소가 됨
      • 문중 요소(child 요소)
        image
    • 참고 : TCP School - XML 구조

XML 문서 구조 정의

  • 스키마(Schema)
    • 다른 언어를 정의하기 위해서는 먼저 해당 언어에 필요한 요소와 속성을 파악해야만 하는데, 이러한 정보들의 집합을 스키마(schema)라고 함
      • XML은 다른 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어
      • 스키마는 일관성 있는 XML 문서를 유지하는 데 아주 중요한 역할을 수행
  • XML 스키마 작성법
    • DTD(Document Type Definition)
      • 문서 타입 정의(DTD)는 XML 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의
        • DTD를 사용하여 새로운 XML 문서의 구조를 정의함으로써 새로운 문서 타입을 만들 수 있음
      • DTD 문법
        • <!DOCTYPE 루트요소 DTD식별자 [ 선언1 선언2 ... ]>
          • <!DOCTYPE : DTD 시작
          • 루트(root) 요소 : XML 파서(parser)에 명시된 루트 요소부터 파싱(parsing)을 시작하라고 알려주는 역할을 수행
          • DTD 식별자 : 프로그램 외부에 존재하는 DTD 파일을 위한 식별자
            • 외부 서브셋(subset) : DTD 식별자가 외부 주소를 가리키고 있는 경우
          • 내부 서브셋(subset) : 추가로 선언한 엔티티(entity)의 리스트로, 괄호([]) 안에 위치함
        • DTD 내·외부 서브셋
          • DTD가 XML 파일 내부에서 선언되면, 그 선언은 반드시 <!DOCTYPE> 안에 위치해야 함
          • DTD가 XML 파일 외부에서 선언되면, <!DOCTYPE>은 반드시 외부 DTD 파일의 주소 정보를 포함해야 함
        • .dtd 확장자를 사용하여 저장
      • DTD의 단점
        • 네임스페이스 지원 불가
        • XML 문법이 아닌 별도 문법으로 작성
        • 제한된 타입 지원
        • 재사용 및 확장 불가
      • 참고 : TCP School - DTD 개요
    • XSD(XML Schema Definition)
      • XML 스키마 정의(XSD)는 XML 문서의 구조 및 해당 문서가 포함할 수 있는 적법한 요소와 속성을 명시함
        • 즉, 해당 XML 문서가 유효한(valid) XML 문서로서 포함할 수 있는 관계를 정의
      • DTD의 단점으로 인해 2001년 W3C에서 새로운 스키마 언어인 XSD를 공표
        • 네임스페이스 지원
        • XML 문법으로 작성 가능하여 재사용 및 확장이 용이
        • 정수, 문자열 등의 다양한 타입을 지원
      • XSD 문법
        • 모든 XSD 문서의 루트 요소는 <schema>
          <?xml version="1.0" encoding="UTF-8" ?>
          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
              targetNamespace="http://codingsam.com"
              xmlns="http://codingsam.com"
              elementFormDefault="qualified">
          ...
          </xs:schema>
          
          • xmlns:xs 속성 : XSD의 요소와 타입에 사용할 W3C의 XML 스키마 네임스페이스를 명시
          • targetNamespace 속성 : 요소를 정의할 XML 스키마 네임스페이스를 명시
          • xmlns 속성 : 기본 XML 스키마 네임스페이스를 명시
          • elementFormDefault 속성 : 해당 스키마를 이용해 선언한 XML 문서의 모든 요소가 네임스페이스를 만족한다는 것을 명시
      • 참고 : TCP School - XSD 개요

XML 문서 표현

  • XSL(eXtensible Stylesheet Language)
    • 각각의 장치는 내부적으로 자신만의 고유한 데이터 구조를 사용하므로 각각의 장치가 전달받은 XML 문서를 자신이 사용하는 데이터 구조로 변환할 때 사용할 규칙이 필요
      • 이러한 변환 규칙에 대한 명세를 작성할 수 있는 언어가 바로 XSL(eXtensible Stylesheet Language)
    • CSS가 HTML 문서를 위한 스타일 시트 언어라면, XSL은 XML 문서를 위한 스타일 시트 언어
    • XSL 적용 예시

과제

  • xml로 자신의 이력서를 만들어 보기

6주차. XSL

도메인

  • 네임서버(DNS: Domain Name Server)
    • 영문 도메인을 네 자리의 IP 주소로 매핑시켜 주는 서버
      • 인터넷 주소창에 도메인을 입력할 때 도메인 등록 시 지정된 네임서버를 통해 해당 도메인과 연결된 IP 주소를 확인하여 연결
  • 도메인 네임(Domain name)
    • 외우거나 식별하기 어려운 IP 주소(예:240.10.20.1)의 단점을 보완하고자 example.com처럼 기억하기 쉽게 만들어 주는 네트워크 호스트 이름
      • 보통 루트 네임 서버(최상위 DNS 서버이며 IANA에서 관리)에 등록된 최상위 호스트 네임 및 각 최상위 호스트 네임을 관리하는 도메인 레지스트리에서 관리하는 하위 호스트 네임을 이르는 말
      • 최상위 호스트 네임은 최상위 도메인이라고 부르며 해당 레지스트리에 등록된 하위 호스트 네임들은 '.'으로 구분된 호스트가 얼마나 붙었는지에 따라 2차 도메인, 3차 도메인 등으로 불린다.
        • 대한민국의 경우 .kr 이라는 ccTLD를 부여받아 KRNIC(실질적으로는 한국인터넷진흥원 인터넷주소센터)에서 관리
    • 도메인의 종류
      • 최상위 도메인(TLD, Top Level Domain)
        • 국가 도메인(ccTLD, country code Top Level Domain)
          • 인터넷상에서 국가를 나타내는 도메인으로 ‘.kr(대한민국)’, ‘.jp(일본)’, ‘.cn(중국)’, ‘.us(미국)’ 등 영문으로 구성된 영문 국가도메인이 있다. 또한 ‘.한국(대한민국)’처럼 자국어 국가도메인도 있다.
        • 일반 도메인(gTLD, generic Top Level Domain)
          • .com(회사)’, ‘.net(네트워크 관련기관)’, ‘.org(비영리기관)’, ‘.biz(사업)’ 등 등록인의 특성에 따라 사용할 수 있는 도메인이다.

XSL, XSLT

  • XSL(eXtensible Stylesheet Language)
    • 문서의 스타일을 정의하기 위한 언어
  • XSL 적용 방법
    • XML 문서 최상단의 태그 아래에 <?xml-stylesheet type="text/xsl" href="파일명.xsl"?> 삽입
  • XSL의 구성
    image
    • XSLT
      • XSL Transformations
      • XML 문서를 다른 구조의 문서로 변환시키기 위한 마크업 언어
      • 예) XML → HTML, XML → WML, XML → XML
    • XPath : XML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어
    • XSL-FO
      • XML 데이터를 출력하기 위한 목적으로 설계된 언어
        • XML 문서를 非XML 문서(XML 권고안 문법에 따라 작성된 텍스트 형식의 파일이 아닌 문서)로 변환하는 방법
          • 예) XML 문서 → PDF 문서
      • XSL-FO는 2012년에 발표된 2.0 버전을 마지막으로, 2013년부터는 더 이상의 업데이트를 진행하고 있지 않으므로, 현재는 CSS3로 대체하여 사용
  • XSLT(Extensible Stylesheet Language Transformations)
    • XSLT는 XML 문서를 XHTML 문서나 또 다른 XML 타입의 문서로 변환하기 위해 사용하는 언어
      • XSLT는 W3C 표준 권고안으로, XSL에서 가장 중요한 언어
      • 위와 같은 변환 과정에서 XSLT는 XPath를 이용하여 XML 문서에서 필요한 정보를 찾는 역할을 수행
    • 참고 : TCP School - XSLT 개요
  • XSL의 요소
    • 기본 요소
      • xsl:stylesheet
        • XSLT의 최상위 요소
      • xsl:output
        • XSLT를 통해 변환된 결과가 어떠한 문서인지를 표시(XML, HTML, TEXT)
        • Indent 속성…… 요소 사이의 공백 표시/제거
      • xsl:template
        • XML 문서의 어느 부분을 어떻게 변환할 것인지 결정한다.
        • match 속성을 이용하여 문맥 노드의 위치를 XPath 표현식으로 지정한다.
      • xsl:apply-templates
        • 문맥 노드의 하위에 있는 자식 요소의 처리를 지시한다.
        • select 속성을 이용하여 특정 노드를 선택할 수 있다.
      • xsl:value-of
        • 요소나 속성의 내용을 문자열 형식으로 출력한다.
        • select 속성을 이용하여 특정 노드를 선택할 수 있다.
    • 제어 요소
      • xsl:if
        • test 속성의 조건이 참일 경우의 처리를 지시한다.
      • xsl:choose, xsl:when, xsl:otherwise
        • test 속성의 조건이 참일 경우와 거짓일 경우의 처리를 지시한다.
      • xsl:for-each
        • select 속성을 통해 선택한 노드를 반복적으로 처리한다.
      • xsl:sort
        • xml 문서의 내용을 순차적으로 정렬한다.
        • 나 의 자식 요소로 사용할 수 있다.
        • order 속성으로 차순(ascending|descending)을 지정
        • data-type 속성으로 숫자/문자 여부(number|text)를 지정
    • XML 문서 생성 요소
      • xsl:element
        • 결과 트리를 출력할 때 새로운 요소를 생성한다.
      • xsl:attribute
        • 결과 트리에 출력되는 요소의 속성값을 동적으로 할당한다.

XSL 예시

<xsl:stylesheet version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:html="http://www.w3.org/1999/xhtml">
  • xmlns(xml name space) : XML 네임스페이스의 선언
    • xsl은 XSL/Transform을 네임스페이스로, html은 xhtml을 네임스페이스로 지정
<xsl:output method="xml" indent="yes"/>
  • <xsl:output> : 변환 결과(xml) 선언
<xsl:template match="/">
	<html:html>
		...
	</html:html>
</xsl:template>
  • <xsl:template> : 템플릿(template)은 특정 노드가 일치할 때 해당 노드에 적용할 규칙들을 포함
    • /는 문서 전체를 지칭
  • <html:html> : html 규약에 따른 html
<html:body>
	<xsl:apply-templates/>
</html:body>
  • <xsl:apply-templates/>
    • 특정 노드나 특정 노드의 자식 노드에 템플릿을 적용할 때 사용
    • 그 아래를 처리해 달라고 요청
<xsl:template match="항목명">
	<html:font style="color:red;font-weight:bold;font-size:18pt;">
	<html:p style="text-align:center;">
	<xsl:value-of select="."/>	
	</html:p>
	</html:font>
	<html:br/><html:br/>
</xsl:template>
  • <xsl:value-of/> : 내용을 문자열로 출력

과제

  • 사진이 포함된 관심 주제에 대한 XML 문서 2개와 XSL 문서 1개(XML 문서 둘 다에 적용)를 만들고 FTP로 서버에 올린 뒤 카톡방에 링크 올리기

7주차 휴강

8주차. XSL 실습

  • XML을 XSL을 통해 어떻게 구조화할 것인가?
    • 개별 요소를 상위 개념을 통해 구조화
    • 기술적으로는 XSL을 통해 구조화
  • Oxygen XML Editor
    • The Oxygen XML Editor (styled ) is a multi-platform XML editor, XSLT/XQuery debugger and profiler with Unicode support.
    • 유료 프로그램 (연구소 라이센스 구매 완료)

정규표현식

9주차. XPath

XPath란?

  • Xpath
    • XML 문서 내의 특정 부분(element, attribute)을 찾아가기 위해 사용되는 경로 표기 언어
    • 1999년 11월 W3C 권고안으로 XPath 1.0 발표
  • XPath의 용도
    • 스타일 시트
      • 스타일을 적용할 요소를 찾아가는 경로 표시자로 사용
      • xsl:template 요소의 match 속성 혹은 xsl:apply-templates, xsl:value-of 요소의 select 속성에 사용
    • 데이터베이스
      • 데이터상에서 검색 대상 요소를 찾아내는 경로 표시자로 사용
      • XML Data Type Method에서 사용
  • 노드(node)
    • XML 문서를, 루트(root)라는 하나의 개체에서 시작하여 여러 개의 연결된 개체로 뻗어 나간 나무(tree) 형태의 자료로 이해하고, 서로 연결된 각각의 구성 요소를 노드(node)라고 명명
      • 위키백과의 각각의 항목이 모두 노드
      • 백과사전의 편찬은 지식의 노드를 구축하는 작업
    • XML 문서상에서 명시적으로 확인되는 노드는 요소(element)와 속성(attribute)이지만, XPath에서는 정교하고 유연한 조작을 위해 다음을 모두 노드로 간주
      • 루트(root), 요소(element), 속성(attribute), 텍스트(text), 이름공간(namespace), 프로세싱 명령문(processing instruction), 주석(comment)
    • 노드 집합(node collection) : XML 문서상의 모든 노드 중에서 특정 조건에 부합하는 노드들의 집합
    • 루트 노드(root node)
      • XML 문서 자체를 지시하는 가상적인 최상위 노드
      • 문서 루트(document root)라고도 하며, ("/")로 표기
    • 문맥 노드(context node)
      • 템플릿(template)의 적용의 시작점이 되는 노드
  • 위치 경로 : 문맥 노드의 위치를 지정하는 방법
    • / : 루트 노드를 선택
    • /tag
      • 루트 노드의 자식인 모든 요소를 선택
      • 문맥 노드가 루트 노드에서 요소로 이동
    • tag
      • 문맥 노드의 자식인 모든 요소를 선택
      • 문맥 노드가 상위 노드에서 요소로 이동
    • /tag/stag/sstag
      • 루트 노드의 자식 요소를 찾은 후
      • 요소의 자식 요소를 찾은 후
      • 요소의 자식 요소를 선택
      • 문맥 노드는 최종적으로 선택된 요소로 이동
    • @attr : 문맥 노드의 attr 속성을 선택
    • . : 문맥 노드 자체를 선택
    • .. : 문맥 노드의 상위 노드를 선택
  • 경로 연산자
    • 재귀적 내림 연산자(Recursive Descent Operator) "//"
      • 찾고자 하는 노드의 위치와 상관없이 노드 이름을 찾아 경로 이동
      • //인명 : 문서 내의 모든 <인명> 요소를 선택
      • //@id : 문서 내의 모든 id 속성을 선택
    • OR 연산자 "|"
      • 어떤 노드가 하나 이상의 패턴과 일치할 경우 템플릿을 활성화
      • 인명 | 지명 : 노드 이름이 <인명> 또는 <지명>인 경우의 처리 지시

필터

  • 노드 선택 필터 "[]"
    • 특정 조건을 만족하는 노드의 선택
    • 필터는 문맥 노드의 위치에 영향을 주지 않는다.
    • 예시
      • 분야[소분야]
        • 문맥 노드의 자식 중 <소분야> 자식 요소를 가진 모든 <분야> 요소 선택
        • 문맥 노드가 <소분야> 요소가 아니라 <분야> 요소까지만 이동
      • 인명[@id]
        • 문맥 노드의 자식 중 id 속성을 가진 모든 <인명> 요소만 선택
      • 분야[소분야= 'A']
        • 문맥 노드의 자식 중 <소분야> 요소의 값이 "A"인 자식 노드를 가진 모든 <분야> 요소 선택
      • 유형[. = 'B']
        • 문맥 노드의 자식 중 값이 'B'인 모든 <유형> 요소
      • //명단[인명/@id = 'C']
        • id 속성 값이 'C'인 <인물> 요소를 자식으로 가진 모든 <명단> 요소
    • 응용
      • /프로젝트[@code = 'D']/명단/인명[@id = 'C']
  • 필터 연산자
    • 필터 조건문에 사용하는 연산자
    • 비교 연산자
      • = : 같다
      • != : 같지 않다
      • &lt; : 작다
      • &lt;= : 작거나 같다
      • &gt; : 크다
      • &gt;= : 크거나 같다
    • 관계 연산자
      • and : 두 조건을 모두 만족
      • or : 적어도 하나를 만족

XPath 함수

  • 노드 함수
    • node() : 노드 그 자체를 반환
    • text() : 노드의 PCDATA 내용을 반환
  • 위치 함수
    • count() : 노드 집합에서 노드의 개수를 반환
    • position()
      • 노드 집합 내의 노드의 위치를 문서 순서대로 반환
      • "tag[position() = 2]"는 "tag[2]"와 동일
    • last() : 노드 집합에서 마지막 노드의 위치를 반환
  • 수치 함수
    • number() : PCDATA를 수치 값으로 변환하여 반환
    • sum() : 노드 집합 내의 모든 수치 값을 합하여 반환
  • 부울 함수
    • boolean()
      • XPath expression을 진위를 판단하여 true 혹은 false를 반환
      • 수치 값 : 0인 경우 → false, 0이 아닌 경우 → true
      • 문자열 : 1개 이상의 문자로 구성된 경우 → true
      • 노드 집합 : empty인 경우 → false
  • 문자열 함수
    • string() : 임의의 값을 문자열로 변환하여 반환
    • string-length() : 공백을 포함한 문자열의 길이를 반환
    • concat() : 2개 이상의 문자열을 합하여 하나의 문자열로 반환
    • contains() : 두 번째 문자열의 내용이 첫 번째 문자열에 포함되었는지 진위를 반환
    • substring(), substring-after(), substring-before() : 문자열의 일부를 반환
    • translate() : 두 번째 문자열에 속하는 문자를 세 번째 문자열에 속하는 문자로 변환

XPath 실습

  • 데이터베이스 실습 예시
    • sql 코드
      use hanyang2022
      
      select label, infoUrl from hanyang2022Data
      where label like '%명성황후%'
      
    • MSSQL 실행 결과
      image
  • Xpath.sql
    • sql 코드
      /*
      § XPath란?
      	• XML 문서 내의 특정 부분(element, attribute)을 찾아가기 위해 사용하는 경로 표기 언어
      § XPath의 용도
      	• 스타일 쉬트 ☞ 스타일을 적용할 요소를 찾아가는 경로 표시자로 사용
      	  ※ xsl:template 요소의 match 속성 혹은 xsl:apply-templates, xsl:value-of 요소의 select 속성에 사용. 
      	• 데이터베이스 ☞ 데이터 상에서 검색 대상 요소를 찾아내는 경로 표시자로 사용
      	  ※ XML data type method에서 사용
      */
      
      declare @xmltxt xml
      set @xmltxt =N'
      <항목 ID="10001332">
      	<항목명>
      		수내동 가옥
      	</항목명>
      	<메타데이터>
      		<분야>생활·민속</분야>
      		<유형>건물</유형>
      	</메타데이터>
      	<본문>
      		<지명>분당</지명> 신도시 개발 전 이곳에 세거하였던 <인명 유형="성씨">한산이씨(韓山李氏)</인명>의 살림집 중 한 채로 <인명>이택구</인명>씨가 거주하였던 집이다.
      		<사진 url="house_a.jpg">수내동 가옥</사진>
      		<사진 url="house_b.jpg">수내동 가옥</사진>
      	</본문>
      </항목>
      '
      
      /* Xpath 노드 사용 예시 */
      --select @xmltxt.query('/항목/메타데이터/유형')
      --select @xmltxt.query('//인명')
      --select @xmltxt.value('(//인명)[1]', 'nvarchar(40)')
      
      /* Xpath 함수 사용 예시 */
      --select @xmltxt.query('count(/항목/본문/사진)')
      --select @xmltxt.value('(/항목/본문/사진/@url)[1]', 'nvarchar(40)')
      --select @xmltxt.value('(/항목/본문/사진/@url)[2]', 'nvarchar(40)')
      
      /* Xpath 필터 사용 예시 */
      --select @xmltxt.query('/항목/본문/사진[.="수내동 가옥"]') 
      --select @xmltxt.query('/항목/본문/사진[./@url="house_a.jpg"]') 
      --select @xmltxt.query('//인명[./@유형="성씨"]') 
      
      • declare
        • 변수 선언
        • declare @변수명 데이터타입
        • @ : variable 앞에 무조건 붙임
      • set
        • 변수 할당
        • set @변수명 =N'값'
        • N : 유니코드 문자열 앞에 무조건 붙임
      • .query()
        • xml 데이터 형식 변수 또는 열에 저장된 XML 인스턴스에 대해 쿼리를 지정하는 데 사용
        • select @변수명.query('경로')
      • //
        • 재귀적 내림 연산자
        • 찾고자 하는 노드의 위치와 상관없이 노드 이름을 찾아 경로 이동
      • .value()
        • 값을 반환
        • 예) select @xmltxt.value('(//인명)[1]', 'nvarchar(40)')
          • 인명의 첫 번째([1]) 값만 반환 (유니코드 40자 이내로)
        • @url : url이라는 이름의 attribute 지정
      • []
        • 노드 선택 필터
        • 특정 조건을 만족하는 노드의 선택
        • 예시
          • select @xmltxt.query('/항목/본문/사진[.="수내동 가옥"]') : xmltxt라는 xml 텍스트 내의 항목/본문/사진 경로에서, 그 값이 "수내동 가옥"인 것을 찾으라.
          • select @xmltxt.query('/항목/본문/사진[./@url="house_a.jpg"]') : 사진 태그의 url attribute가 "house_a.jpg"인 것을 찾으라.
          • select @xmltxt.query('//인명[./@유형="성씨"]') : 경로 무관하게 인명 태그로 가서 유형 attribute가 "성씨"인 것을 찾으라.
    • MSSQL 실행 화면
      image
      • 코멘트를 제거하며 시험해 보자.
        image
      • 파란색은 명령어, 빨간색은 데이터
  • 추후 XML을 데이터베이스에 올리고, 조작하는 실습을 위주로 할 것

10주차. XML 데이터베이스

조선 지성의 꽃, 퇴계와 율곡의 향기

  • 출처 : 김현, “조선 지성의 꽃, 퇴계와 율곡의 향기”, 전북대학교 건지리버럴아츠 특강 발표자료, 2022. 11 2. 전북대학교
  • 퇴계(退溪) 이황(李滉, 1501-1570)과 율곡(栗谷) 이이(李珥, 1536-1584), 그들이 존경받는 이유
    • 퇴계와 율곡은 그들의 학문 활동을 통해 모든 인간이 ‘예의·염치’를 실현할 수 있는 능력을 지녔고, 그 능력을 발휘해야 하는 의무를 지닌 존재임을 밝혔다. 이들의 학설은 유교의 이상을 건국 이념으로 삼았던 조선 왕조의 통치 체제를 든든하게 받쳐 주는 이론적 지주가 되었고, 그 가치관은 가난한 시골 마을의 풍속에까지 영향을 끼쳤다.
  • 사단칠정설(四端七情說)
    • 퇴계
      • “四端之發, 純理, 故無不善; 七情之發, 兼氣, 故有善惡.” (李滉, 「與奇明彦」, 『退溪集』 권16 書, 1b)
        • 인간의 감정 가운데 기쁨, 노여움, 슬픔, 두려움, 좋아함, 싫어함, 욕망과 같은 자연 감정[七情]은 그 발출 원인이 기(氣)에 있지만, 불쌍히 여기는 마음, 부끄럽게 여기는 마음, 양보하는 마음, 옳고 그름을 가리는 마음 등 인의예지(仁義禮智)의 도덕 원리에 합치하는 사단(四端)은 이(理)의 발동에 의해 일어나는 것이다.
    • 율곡
      • “四端只是善情之別名, 言七情則四端在其中矣.” (李珥, 「答成浩原」, 『栗谷全書』 권10 書二, 7a)
        • 인간의 감정은 도덕적인 것, 비도덕적인 것의 구분 없이 모두 다 기 (氣)의 발동에서 발생하는 것이다. 단, 이때 기의 발동이 이(理)가 정하는 원리에 그대로 합치한 것을 일컬어 ‘사단’이라고 칭하고, 그 합치여부를 따짐이 없이 발생한 감정 전체를 일컬을 경우에는 ‘칠정’이라고 한다.
  • 퇴계의 이기호발설(理氣互發說)
    • 惻隱․羞惡․辭讓․是非, 何從而發乎? 發於仁義禮智之性焉爾. 喜․怒․哀․懼․愛․惡․欲, 何從而發乎? 外物觸其形而動於中, 緣境而出焉爾. (李滉, 「答奇明彦非四端七情分理氣辯」, 『退溪集』 권16 書, 9b)
      • “도덕적인 감정인 사단(四端)은 인의예지의 본성으로부터 직접 발현되며, 몰가치적인 칠정(七情)은 외물이 형기에 감촉되어 발현된다.”
    • 도덕적인 감정은 그 발현의 주체는 이(理)라고 하는 점, 바꿔 말해 이(理)가 감정발현의 주체가 되어 도덕적인 감정을 발현할 수 있음을 강조한 것.
  • 율곡의 기발이승일도설(氣發理乘一途說)
    • 見孺子入井, 然後乃發惻隱之心. 見之而惻隱者氣也, 此所謂氣發也; 惻隱之本則仁也, 此所謂理乘之也. 非特人心爲然, 天地之化, 無非氣化而理乘之也. (李珥, 「答成浩原」, 『栗谷全書』 권10 書2, 5b)
      • “어린아이가 우물에 빠지는 것을 보게 되면 측은히 여기는 마음을 발출하게 된다. 보는 순간 측은한 마음이 생기게 되는 기의 작용이다. 그런데 그 때 그것을 측은히 여기는 마음의 근원은 인(仁)이니 이것을 일컬어 이(理)가 거기(기의 발현)에 올라탔다고 하는 것이다.”
    • 이(理)와 기(氣)의 역할을 구분하는 이기이원론의 틀 속에서 인간의 심리현상을 합리적으로 설명. 도덕의 실현을 위한 현실적 토대의 중요성[이(理)의 가치 실현을 위한 토대로서의 기(氣)의 중요성]을 강조.
  • 퇴계와 율곡의 학문이 남긴 문제점
    • 퇴계의 호발설이 인간의 자발적인 도덕성을 지나치게 강조한 면이 있는 반면, 율곡의 기발이승일도설은 인간들이 때로 부도덕할 수 있다는 현실을 인정하면서 그것을 개선할 수 있는 가능성을 제시했다는 점이 장점이다.
      • 하지만 율곡의 이론은 기질(氣質)의 환경이 극도로 나쁜 경우[기질이 탁박해진 경우] 자발적인 도덕의 실현을 기대할 수 없게 된다는 뜻으로 해석될 수도 있다.
    • 농암(農巖) 김창협(金昌協, 1651~1708)의 비판
      • 栗谷人心道心說, 善者淸氣之發, 惡者濁氣之發 ..... 今若以善惡之情, 一歸之於氣之淸濁, 則恐無以見理之實體而性之爲善也. (金昌協, 「論退栗兩先生四端七情說」, 『農巖續集』 卷下 說, 69a-70a)
        • “율곡(栗谷) 선(善)은 맑은 기[淸氣]에서 발현하고, 악(惡)은 탁한 기(濁氣)에서 발현한다고 하였다..... (그러나) 인간의 감정[情]이 선하고 악하게 되는 원인을 기(氣)의 청탁(淸濁)에만 돌린다면 이(理)의 실체와 성(性)의 선함을 드러낼 길이 없게 될 것이다.”
  • 녹문(鹿門) 임성주(任聖周, 1711~1788)의 철학
    • 퇴계와 율곡 이후 조선의 성리학자들은 퇴계와 율곡이 남긴 업적과 정신을 계승하면서, 그들이 못 다한 숙제를 마무리 지으려 치열한 노력을 기울였다. 녹문(鹿門) 임성주(任聖周, 1711~1788)의 철학은 그 발전적 전개의 한 단면을 보여 준다.
    • 녹문(鹿門)의 기일원론(氣一元論)
      • 人性之善, 乃氣質之善耳, 非氣質外別有善底性也. (任聖周, 「鹿廬雜識」, 『鹿門集』, 권19 雜著 5a)
        • “인간의 성품이 선한 것은 인간의 기질이 선하기 때문이다. 기질 밖에 따로 선한 본성이 있는 것이 아니다.”
      • 녹문은 기(氣)의 차별성보다는 그 본래의 순수성을 강조하고, 기로 인해 구체화된 인간의 마음[心]은 그 속에 품고 있는 원리[理]와 다름 없이 순수하다고 하는 이론을 강력하게 제기.
      • 녹문이 생각한 심(心)은 순수한 이(理)와 청탁(淸濁)이 섞여 있는 기(氣)가 합쳐진 2차적 존재가 아니라 이와 기를 구별할 필요가 없이 순수하면서 역동적인 하나의 실체.
    • 임성주의 철학의 의의
      • 인간의 마음은 그 자체로 선하고, 환경의 제약 없이 선을 실천할 수 있다고 하는 심선설(心善設)의 완성
  • 중국 유학
    • 자세한 건 PPT 참고!!
    • 중국의 역대 왕조
      image
      • 하(夏) - 은(殷) - 주(周) - 춘추전국(春秋戰國) - 진(秦) - 한(漢) - 위진남북조(魏晋南北朝) - 수(隋) - 당(唐) - 송(宋) - 원(元) - 명(明) - 청(淸) - 중화민국(中華民國) - 중화인민공화국(中華人民共和國)
    • 선진유학(先秦儒學)
      • 공자, 맹자, 순자
    • 한대유학(漢代儒學)
      • 동중서(董仲舒)
    • 송대(宋代) 성리학(性理學)
      image
      • 이기이원론(理氣二元論)

XML 데이터베이스

  • XML 데이터베이스
    • 일반적인 데이터베이스는 그것을 구성하는 정보의 조각(데이터베이스의 행과 열)에 문자나 숫자만을 담을 수 있는 데 반해, XML 지원 데이터베이스는 XML 언어로 쓰여진 데이터를 담을 수 있는 기능을 지원
    • 일반적인 DBMS 기능 + XML 데이터 타입 지원 + XML 데이터 조작 메소드 제공
  • XML-Enabled Database
    • XML 데이터 포맷과 데이터 모델(보통 관계형 데이터베이스) 간 매핑(mapping), 변환을 위한 확장 기능을 제공하는 데이터베이스
  • XML 데이터 조작 메소드
    • 메소드(method)
      image
      • 특정 유형의 개체에 대해 동작하는 서브 프로그램
      • a piece of code that is exclusively associated either with a class or with an object

XML 데이터베이스 SQL 실습

  • XMLdb_practice1.sql
  • select * from common.dbo.남한산성_xml
    image
    • 아래 xmltxt를 눌러 내용을 확인해 볼 것
  • 메소드 사용 : xmltxt의 인명, 지명, 집필자 검색
    select xmltxt.query('//인명') from common.dbo.남한산성_xml
    select xmltxt.query('//지명') from common.dbo.남한산성_xml
    select xmltxt.query('/항목/메타데이터/집필자') from common.dbo.남한산성_xml
    
  • select * from common.dbo.paintings
    image
    • 아래 xmltxt를 눌러 내용을 확인해 볼 것
  • 노드의 선택
    select xmltxt.query('/') from common.dbo.paintings where id='w01'  --id가 01인 최상위 노드
    select xmltxt.query('/개체/속성/작가') from common.dbo.paintings where id='w01'
    select xmltxt.query('/개체/표제'), xmltxt.query('/개체/속성/작가') from common.dbo.paintings where id='w05'
    
    select xmltxt.value('(/개체/속성/@틀)[1]', 'nvarchar(max)') from common.dbo.paintings where id='w01'
    
    select xmltxt.value('(/개체/표제/이름)[1]', 'nvarchar(max)') as 작품명,
    	xmltxt.value('(/개체/속성/작가)[1]', 'nvarchar(max)') as 작가
    	from common.dbo.paintings
    
  • 재귀적 내림 연산자 //
    select xmltxt.query('//인명') from common.dbo.paintings where id='w05'
    
    select id, 
    	xmltxt.value('(/개체/표제/이름)[1]', 'nvarchar(max)') as 작품명, 
    	xmltxt.value('(/개체/속성/작가)[1]', 'nvarchar(max)') as 작가,
    	xmltxt.query('//인명') as 출현인명, 
    	xmltxt.query('//지명') as 출현지명
    	from common.dbo.paintings
    
  • 필터 []
    select xmltxt.query('/개체/설명/문단[./지명]') from common.dbo.paintings           --문단 안의 지명 데이터
    select xmltxt.query('/개체/설명/문단[./지명="황룡사"]') from common.dbo.paintings  --문단 안의 지명이 황룡사인 데이터
    select xmltxt.query('/개체/표제/이름[./@표기="한자"]') from common.dbo.paintings   --표기는 attribute이므로 @를 사용
    
    select id,
    	xmltxt.value('(/개체/표제/이름)[1]', 'nvarchar(max)') as 작품명, 
    	xmltxt.value('(/개체/속성/작가)[1]', 'nvarchar(max)') as 작가,
    	xmltxt.value('(/개체/표제/이름[./@표기="국문"])[1]', 'nvarchar(max)') as 국문,
    	xmltxt.value('(/개체/표제/이름[./@표기="한자"])[1]', 'nvarchar(max)') as 한자 
    	from common.dbo.paintings
    
  • XPath 함수
    ---count : 개수 세기
    select xmltxt.query('count(/개체/설명/문단/인명)') from common.dbo.paintings where id='w05'
    ---node() : 그 밑에 있는 임의의 노드 전체
    select xmltxt.query('/개체/표제/node()') from common.dbo.paintings where id='w03'
    ---text() : 텍스트 데이터
    select xmltxt.query('/개체/설명/문단/text()') from common.dbo.paintings where id='w03'
    ---position() : 위치 지정
    select xmltxt.query('(//인명)[position()=1]') from common.dbo.paintings where id='w05'  --id w05의 인명 3개 중 1번째 데이터
    ---last() : 마지막 위치 설정
    select xmltxt.query('(//인명)[last()]') from common.dbo.paintings where id='w05'
    

11주차. XML 서버 데이터베이스 (1)

  • 교육 목표
    • XML 문서를 서버 데이터베이스에 올리는 방법을 교육
      • 인문학자에게 필요한 것은 프로세스에 대한 코딩(C, Python 등)이 아닌 데이터에 대한 코딩(XML, SQL, Ontology)
  • 디지털성남문화대전
    • 개요
      • 한국향토문화전자대전 사업의 일환으로 구축
      • 성남시의 역사와 문화유산을 포함한 정치, 경제, 사회의 변화, 발전상 등에 관한 정보를 집대성한 온라인 지식백과사전
    • XML로 구축
      image

XML 서버 데이터베이스 업로드 실습

  • 실습 파일
  • 권한 설정 image
    • 개체 탐색기 - 보안 - 로그인 - 본인 계정(s_id) 우클릭 - 속성 - 서버 역할
    • bulkadmin과 dbcreator 권한이 부여(체크)되어 있어야 함
  • 데이터베이스 생성 image
    • 데이터베이스 우클릭 - 새 데이터베이스(N) 클릭
    • 데이터베이스 이름을 정하고(계정명과 동일하게 생성) 확인 버튼 클릭
    • 데이터베이스 처음 크기를 5MB로 정하고, 5MB를 초과하면 1MB씩 늘리게 설정
    • 동명의 데이터베이스가 이미 있다면 오류 메시지 반환
      image
  • 데이터베이스 사용 및 전체 테이블 보기
    use 데이터베이스명
    
    select * from sys.tables
    
  • 실습 SQL 코드
    /* upload XML file */
    
    USE 데이터베이스명
    
    -- DROP TABLE seongnam_bulk
    -- DROP TABLE seongnam_xml
    
    --seongnam_bulk 테이블 생성 (column 1개, 형식 xml)
    CREATE TABLE seongnam_bulk (xmltxt xml)
    
    --seongnam_bulk 보기
    SELECT * FROM seongnam_bulk
    
    --SELECT 결과를 seongnam_bulk에 삽입
    ---경로는 digerati 서버상의 위치
    ---하나의 Binary Large Object(BLOB)로 처리
    INSERT INTO seongnam_bulk ( xmltxt )
    SELECT * FROM OPENROWSET(  
       BULK 'e:\inetpub\wwwroot\DhLab\2022\201\workshop\성남문화대전\성남문화대전.xml',  
       SINGLE_BLOB) AS x;  
    
    --seongnam_bulk 보기
    SELECT * FROM seongnam_bulk
    --이제 seongnam_bulk column의 내용물을 여러 column으로 나눠야 함
    
    
    /* create XML DB table */
    
    --seongnam_xml 테이블 생성 (column 2개, 형식 nvarchar, xml)
    CREATE TABLE seongnam_xml (
    	id	nvarchar(40) NOT NULL,
    	xmltxt 	xml NOT NULL,
    	primary key(id)
    	)
    
    /* create trigger */
    
    --TRIGGER는 table에 종속된 함수
    ---INSERT를 실행하면 INSERT 대신 아래의 복잡한 INSERT를 실행하게 하는 설정
    ---seongnam_bulk 테이블의 내용물을 seongnam_xml 테이블에 나눠 담기 위한 명령
    CREATE TRIGGER seongnam_getid ON seongnam_xml INSTEAD OF INSERT
    AS
    	INSERT INTO seongnam_xml(id, xmltxt)
    	SELECT
    		t.xmltxt.value('(/항목/@ID)[1]', 'nvarchar(40)') AS id,
    		t.xmltxt AS xmltxt	
    	FROM inserted t
    	
    	
    /* insert xml record from bulk-uploaded file */
    
    --항목을 찾아서 노드로 추출
    ---node.query('.') : node 그 자신을 보기
    ---CROSS APPLY : INNER JOIN과 동일
    SELECT node.query('.') 
    	FROM   seongnam_bulk CROSS APPLY xmltxt.nodes('/향토문화백과/항목') AS R(node) 
    
    --추출한 노드를 seongnam_xml 테이블에 삽입
    INSERT INTO seongnam_xml(xmltxt)
    	SELECT node.query('.') 
    	FROM   seongnam_bulk CROSS APPLY xmltxt.nodes('/향토문화백과/항목') AS R(node) 
    
    --seongnam_xml 보기
    SELECT * FROM seongnam_xml
    
    • C:\Inetpub\wwwroot
      • '웹서버'가 '기본 저장소'로 지정해 놓은 약속된 장소
      • 즉, 홈 디렉토리
    • 트리거 설정 확인
      image

12주차. XML 서버 데이터베이스 (2)

  • 컴퓨터에게 인문학을 가르치는 것이 디지털인문학
    • 컴퓨터로부터 인문학을 배울 수는 없다.
    • 컴퓨터는 가르쳐 주는 만큼만 한다.
  • 코딩(Coding)
    • Encoding of Process
      • 일반적으로 생각하는 코딩
      • 인문학자가 이에 대해 무지해서는 안 됨
    • Encoding of Data(=Contents)
      • 정말 인문학자에게 중요한 코딩
      • 등한시되는 경향이 있음
        • 인문정보학 작업에 대한 코더의 한마디
          • “이 데이터를 손으로 만드셨어요?”
  • 인문정보학 석사 과정의 핵심
    • XML, DB, 시각화 관련 툴
    • 디자인은 디지털인문학에 있어 중요하다.
      • 결국 사람들과 소통할 수 있어야 하기 때문

XML 서버 데이터베이스 조작 실습

  • 실습 파일
  • 실습 SQL 코드
    USE s_haein
    
    /* browse xml data */
    
    SELECT * FROM seongnam_xml
    
    --'대표항목명'의 첫 번째 것을 80자로 보기
    select xmltxt.value('(/항목/항목명/대표항목명)[1]', 'nchar(80)') from seongnam_xml
    
    --위치 무관(//)하게 '인명'만 보기
    select xmltxt.query('//인명') from seongnam_xml
    
    --대표명칭, 한자명칭, 분야, 유형, 소재지를 xml 형식으로, 각각의 열로 만들어 보기
    select 
    xmltxt.query('/항목/항목명/대표항목명'),
    xmltxt.query('/항목/항목명/한자항목명'),
    xmltxt.query('/항목/메타데이터/대표분야'),
    xmltxt.query('/항목/메타데이터/대표유형'),
    xmltxt.query('/항목/메타데이터/표준지역')
    from seongnam_xml
    
    --위의 쿼리문과 상동 (아래 view문의, value 메소드를 사용한 select와 비교해 보자.)
    select 
    xmltxt.query('/항목/항목명/대표항목명') as 대표명칭,
    xmltxt.query('/항목/항목명/한자항목명') as 한자명칭,
    xmltxt.query('/항목/메타데이터/대표분야') as 분야,
    xmltxt.query('/항목/메타데이터/대표유형') as 유형,
    xmltxt.query('/항목/메타데이터/표준지역') as 소재지
    from seongnam_xml
    
    
    /* create metadata view */
    
    --drop view seongnam_meta
    
    --뷰(view) 만들기
    create view seongnam_meta as
    ---대표명칭, 한자명칭, 분야, 유형, 소재지를 xml 형식이 아닌 텍스트 데이터로, 각각의 열로 만들어 보기
    select 
    id, 
    xmltxt.value('(/항목/항목명/대표항목명)[1]', 'nchar(40)' ) as 대표명칭,
    xmltxt.value('(/항목/항목명/한자항목명)[1]', 'nchar(40)') as 한자명칭,
    xmltxt.value('(/항목/메타데이터/대표분야)[1]', 'nchar(80)') as 분야,
    xmltxt.value('(/항목/메타데이터/대표유형)[1]', 'nchar(40)') as 유형,
    xmltxt.value('(/항목/메타데이터/표준지역)[1]', 'nchar(80)') as 소재지
    from seongnam_xml
    
    --뷰 전체 내용 보기
    select * from seongnam_meta
    
    --뷰에서 유형이 '유적/건물'인 데이터만 보기
    select * from seongnam_meta
    where 유형='유적/건물'
    
    --뷰에서 소재지가 '금토동'인 데이터만 보기
    select * from seongnam_meta
    where 소재지 like '%금토동%'
    
    
    /* insert new xml data */
    
    --seongnam_xml 테이블의 xmltxt 컬럼에 값을 삽입하는 템플릿
    ---N은 유니코드 깨짐 방지를 위해 삽입
    INSERT INTO  seongnam_xml(xmltxt) VALUES(
    N'
    
    ') 
    
    --seongnam_xml 테이블의 xmltxt 컬럼에 '낙생습지.xml' 전체를 삽입
    ---트리거는 이전 세팅으로 인해 자동으로 적용됨
    INSERT INTO  seongnam_xml(xmltxt) VALUES(
    N'
    <항목 ID="GC00100528" 레벨="6" 유형="일반항목">
      <항목명>
        <대표항목명>
          <지명 검색="1" 검색어="낙생습지">낙생습지</지명>
        </대표항목명>
        <한글항목명>낙생습지</한글항목명>
        <한자항목명>樂生濕地</한자항목명>
        <영문항목명>
          <공식명칭 />
        </영문항목명>
        <중국어항목명></중국어항목명>
        <중문항목명></중문항목명>
      </항목명>
      <메타데이터>
        <이칭별칭 />
        <키워드 />
        <대표분야>지리/자연 지리</대표분야>
        <대표유형>지명/자연 지명</대표유형>
        <표준지역>경기도 성남시 분당구 대장동</표준지역>
        <표준시대>현대/현대</표준시대>
        <분야>지리/자연 지리</분야>
        <유형>지명/자연 지명</유형>
        <지역>경기도 성남시 분당구 대장동<공간 식별자="성남:낙생습지" 연관="직접" /></지역>
        <시대>현대/현대</시대>
        <집필자>김성환</집필자>
        <의견 작업="템플릿작업" 작업일시="20041025" 작업자="김윤희" />
        <의견 작업="윤문교열" 작업일시="20041205" 작업자="유경희" />
        <의견 작업="윤문교열검수" 작업자="이재열;20041215" />
        <의견 작업="교정" 작업일시="20041217" 작업자="염지영" />
        <의견 작업="태깅1.2" 작업일시="20041226" 작업자="김도형" />
        <의견 작업="태깅3.4" 작업일시="20050111" 작업자="김도형" />
        <상세정보 유형="성격">습지</상세정보>
        <상세정보 유형="면적">25,000㎡</상세정보>
        <상세정보 유형="깊이">1m</상세정보>
      </메타데이터>
      <본문>
        <소표제>[정의]</소표제>
        <문단>
          <지명 검색="1" 검색어="대장동">경기도 성남시 분당구 대장동</지명> <지명 검색="1" 검색어="낙생저수지">낙생저수지</지명> 상류부에 형성된 습지.</문단>
        <소표제>[개설]</소표제>
        <문단>
          <지명 검색="1" 검색어="낙생습지">낙생습지</지명>는 <지명 검색="1" 검색어="대장동">경기도 성남시 분당구 대장동</지명>과 <지명>용인시 고기동</지명> 사이에 위치하는 <지명 검색="1" 검색어="낙생저수지">낙생저수지</지명>의 상류부에 형성된 습지이다.</문단>
        <소표제>[명칭유래]</소표제>
        <문단>
          <지명 검색="1" 검색어="낙생저수지">낙생저수지</지명>의 상류부에 형성된 습지이므로 <지명 검색="1" 검색어="낙생습지">낙생습지</지명>라고 한다. ‘낙생’이란 명칭은 병자호란 때 충청감사 <인명 검색="1" UCI="G002+AKS-KHF_13C815C138ADDCB1583X0" 검색어="정세규">정세규</인명>가 <지명 검색="1" 검색어="남한산성">남한산성</지명>에 포위된 <인명 검색="1" UCI="G002+AKS-KHF_12C778C870FFFFB1595X0" 검색어="인조">인조</인명>를 구하기 위하여 북상하였다가 <지명>판교</지명> 남쪽 <지명 검색="1" 검색어="험천">험천</지명>[<지명>머내</지명>]에서 <지명>청</지명>나라 군사에게 크게 패하자, 임금이 성을 나와 <지명>청</지명> <인명 검색="0">태종</인명>에게 항복하였으므로 ‘성이 떨어졌다’는 뜻의 ‘낙성(落城)’이 ‘낙생(樂生)’으로 변했다고 한다.</문단>
        <소표제>[자연환경]</소표제>
        <문단>
          <지명 검색="1" 검색어="낙생습지">낙생습지</지명>는 해발 고도 약 90m 상에 형성되어 있으며 평균 수심은 1m, 면적은 25,000㎡ 정도이다. <지명 검색="1" 검색어="탄천">탄천</지명>으로 합류하는 <지명 검색="1" 검색어="동막천|험천">동막천</지명>의 유역에 형성된 인공 습지로서 <지명 검색="1" 검색어="낙생저수지">낙생저수지</지명>의 축조에 따라 저수지의 상류 호숫가를 따라 습지가 형성되었다.</문단>
        <소표제>[현황]</소표제>
        <문단>주요 식생으로 갈대군락을 비롯하여 줄, 고마리, 소리쟁이, 쇠뜨기, 애기부들이 서식하고 있다. 인공제방 축조로 인하여 식생의 인위적 교란을 겪고 있는 <지명 검색="1" 검색어="탄천">탄천</지명> 유역의 다른 습지들에 비하면 자연 상태의 보전이 비교적 양호한 편이다.</문단>
        <참고문헌>
          <문헌>
            <서명 검색어="성남시사">『성남시사』</서명>(<출판사항>성남시사편찬위원회, 1993</출판사항>)</문헌>
          <문헌>
            <저자>김기빈</저자> 외, <서명 검색어="분당의 땅이름 이야기">『분당의 땅이름 이야기』</서명>(<출판사항>한국토지공사 토지박물관, 1999</출판사항>)</문헌>
          <문헌>
            <서명 검색어="성남시의 역사와 문화유적">『성남시의 역사와 문화유적』</서명>(<출판사항>한국토지공사 토지박물관, 성남시, 2001</출판사항>)</문헌>
          <문헌>
            <서명 검색어="성남시의 역사와 문화유산">『성남의 역사와 문화유산』</서명>(<출판사항>성남문화원, 2001</출판사항>)</문헌>
          <문헌>
            <서명 검색어="2002 전국내륙습지 자연환경 조사보고서">『2002 전국내륙습지 자연환경조사 보고서』</서명>-한강유역(<출판사항>환경부, 2003</출판사항>)</문헌>
        </참고문헌>
      </본문>
    </항목>
    ') 
    
    select * from seongnam_xml   --낙생습지 삽입 여부 확인
    select * from seongnam_meta  --낙생습지 삽입 여부 확인
    
    --seongnam_xml 테이블에서 대표항목명이 '정일당 강씨 사당'인 데이터의 id, 항목명, xmltxt 보기
    select id, xmltxt.value('(/항목/항목명/대표항목명)[1]', 'nvarchar(80)' ), xmltxt from seongnam_xml
    where xmltxt.value('(/항목/항목명/대표항목명)[1]', 'nvarchar(80)' )='정일당 강씨 사당'  
    
    --seongnam_meta 뷰에서 대표명칭이 '정일당 강씨 사당'인 데이터의 id, 대표명칭, xmltxt를 두 테이블의 id값이 같은 것만 병합하여 보기 
    ---join : on 이하의 조건에 맞춰 두 테이블을 합쳐 줌
    select seongnam_meta.id, 대표명칭, xmltxt from seongnam_meta
    join  seongnam_xml on seongnam_meta.id = seongnam_xml.id
    where 대표명칭='정일당 강씨 사당'
    
    --위의 조건에서 대표명칭이 낙생습지인 것 보기
    select seongnam_meta.id, 대표명칭, xmltxt from seongnam_meta
    join  seongnam_xml on seongnam_meta.id = seongnam_xml.id
    where 대표명칭='낙생습지'
    
    /* create keyword index view: 인명 */
    
    --seongnam_person 뷰 만들기
    ---id, 인명을 포괄
    CREATE VIEW seongnam_person AS
      SELECT id, node.value('.', 'nchar(80)' ) AS 인명
      FROM  seongnam_xml CROSS APPLY xmltxt.nodes('//인명') AS R(node) 
    
    --seongnam_person 뷰 보기
    SELECT * FROM seongnam_person
    
    --인명으로 묶어 인물당 언급 횟수 세기
    SELECT 인명, count(*) as 빈도
      FROM  seongnam_person
      GROUP BY 인명
    
    --seongnam_meta 테이블과 seongnam_person 테이블의 id 값이 같은 것끼리 묶어서 인명이 '정일당 강씨'인 데이터를 보기
    select * from seongnam_person as sp
      join seongnam_meta as sm on sp.id = sm.id
      where 인명='정일당 강씨'
    
    
    /* create keyword index view: 지명 */
    
    --seongnam_place 뷰 만들기
    ---id, node의 value 포괄
    CREATE VIEW seongnam_place AS
      SELECT id, node.value('.', 'nchar(80)' ) AS 지명
      FROM  seongnam_xml CROSS APPLY xmltxt.nodes('//지명') AS R(node) 
    
    --seongnam_place 뷰 보기
    SELECT * FROM seongnam_place
    
    --지명으로 묶어 지명당 언급 횟수 세기
    SELECT 지명, count(*) as 빈도
      FROM  seongnam_place
      GROUP BY 지명
    
    --seongnam_meta 테이블과 seongnam_person 테이블의 id 값이 같은 것끼리 묶어서 지명이 '동막천', '청계산'인 것 중 '지명', seongnam_meta의 모든 데이터를 보기
    select 지명, sm.* from seongnam_place as sp
      join seongnam_meta as sm on sp.id=sm.id
      where 지명 in ('동막천', '청계산')
    

13주차. XML 서버 데이터베이스 (3)

  • 디지털 전환이란?
    • 전산화(Digitization) : 객체의 물리적인 형상이나 속성이 디지털 신호로 표현될 수 있도록 하는 것
    • 디지털화(Digitalization) : 전산화의 결과를 활용하여 해 오던 일의 프로세스를 효율화하는 것
    • 디지털 전환(Digital transformation) : 디지털 기술에 의해 확장된 지평 위에서 프로세스 자체를 변화시키는 것. 아울러 그 새로운 프로세스가 작동하도록 옛것에 매이는 고정관념을 깨뜨리고 조직과 문화를 개선하는 것
  • 2주간 프로젝트 진행
    • 스키마는 동기 간 상의를 통해 결정
      <콘텐츠 id="">
      <타이틀>
      	<이름> </이름>
      </타이틀>
      <메타데이터>
      	<유형>드라마</유형>
      	<상영>2000년 01월 01일
      	<제작자><인물 역할="극본">김똘똘</인물><인물 역할="연출">김똘이</인물></제작자>	
      	<방송사>KBS</방송사>
      </메타데이터>
      <내용>
      
      </내용>
      <멀티미디어>
      </멀티미디어>			
      </콘텐츠>
      
    • 2022-201:사극:콘텐츠:개국.xml

XML 서버 데이터베이스 업로드/조작 실습

  • 실습 파일
  • 실습 SQL 코드
    /*
     <참고 사항>
      - uploadXml.sql, manipulateXml.sql 실습 이후 진행!
      - 업로드할 파일은 성남문화대전2.xml 파일!
    */
    
    
    /* upload XML file */
    
    USE 사용자명
    
    DROP TABLE seongnam_bulk  --기존에 만든 테이블 날리기
    -- DROP TABLE seongnam_xml
    delete seongnam_xml       --껍데기만 남기고 데이터 지우기
    
    --seongnam_bulk 테이블 생성 (column 1개, 형식 xml)
    CREATE TABLE seongnam_bulk (xmltxt xml)
    
    --seongnam_bulk 보기
    SELECT * FROM seongnam_bulk
    
    --SELECT 결과를 seongnam_bulk에 삽입
    ---경로는 digerati 서버상의 위치
    ---하나의 Binary Large Object(BLOB)로 처리
    INSERT INTO seongnam_bulk ( xmltxt )
    SELECT * FROM OPENROWSET(  
       BULK 'e:\inetpub\wwwroot\DhLab\2022\201\workshop\성남문화대전\성남문화대전2.xml',  
       SINGLE_BLOB) AS x;  
    
    --seongnam_bulk 보기
    SELECT * FROM seongnam_bulk
    --이제 seongnam_bulk column의 내용물을 여러 column으로 나눠야 함
    
    
    /* create XML DB table */
    
    --seongnam_xml 테이블 생성 (column 2개, 형식 nvarchar, xml)
    CREATE TABLE seongnam_xml (
    	id	nvarchar(40) NOT NULL,
    	xmltxt 	xml NOT NULL,
    	primary key(id)
    	)
    
      
    /* create trigger */
    
    --TRIGGER는 table에 종속된 함수
    ---INSERT를 실행하면 INSERT 대신 아래의 복잡한 INSERT를 실행하게 하는 설정
    ---seongnam_bulk 테이블의 내용물을 seongnam_xml 테이블에 나눠 담기 위한 명령
    CREATE TRIGGER seongnam_getid ON seongnam_xml INSTEAD OF INSERT
    AS
    	INSERT INTO seongnam_xml(id, xmltxt)
    	SELECT
    		t.xmltxt.value('(/항목/@ID)[1]', 'nvarchar(40)') AS id,
    		t.xmltxt AS xmltxt	
    	FROM inserted t
      
      
    /* insert xml record from bulk-uploaded file */
    
    --항목을 찾아서 노드로 추출
    ---node.query('.') : node 그 자신을 보기
    ---CROSS APPLY : INNER JOIN과 동일
    SELECT node.query('.') 
    	FROM   seongnam_bulk CROSS APPLY xmltxt.nodes('/향토문화백과/항목') AS R(node) 
    
    --추출한 노드를 seongnam_xml 테이블에 삽입
    INSERT INTO seongnam_xml(xmltxt)
    	SELECT node.query('.') 
    	FROM   seongnam_bulk CROSS APPLY xmltxt.nodes('/향토문화백과/항목') AS R(node) 
    
    --seongnam_xml 보기
    SELECT * FROM seongnam_xml
    
    
    /* create keyword index view: 인명 */
    
    --이전에 생성해 둔 seongnam_person view 날리기
    drop view seongnam_person
    
    --seongnam_person 뷰 만들기
    CREATE VIEW seongnam_person AS
      SELECT distinct id, node.value('.', 'nchar(80)' ) AS 인명,
      node.value('./@유형', 'nchar(80)' ) AS 유형,
      node.value('./@식별자', 'nchar(80)' ) AS 식별자
      FROM  seongnam_xml CROSS APPLY xmltxt.nodes('//인명') AS R(node) 
    
    --seongnam_person 뷰 보기
    SELECT * FROM seongnam_person
    
    --seongnam_person 뷰에서 식별자별로 빈도 계산하여 조회 
    SELECT 식별자, count(*) as 빈도
      FROM seongnam_person
      GROUP BY 식별자
    
  • DROP, DELETE
    image
    • DELETE
      • 데이터는 지워지지만 테이블 용량은 줄어 들지 않는다.
      • 원하는 데이터만 지울 수 있다.
      • 삭제 후 잘못 삭제한 것을 되돌릴 수 있다.
    • TRUNCATE
      • 용량이 줄어 들고, 인덱스 등도 모두 삭제 된다.
      • 테이블은 삭제하지는 않고, 데이터만 삭제한다.
      • 한꺼번에 다 지워야 한다.
      • 삭제 후 절대 되돌릴 수 없다.
    • DROP
      • 데이블 전체를 삭제, 공간, 객체를 삭제한다.
      • 삭제 후 절대 되돌릴 수 없다.
    • 출처 : 예제로 배우는 ORACLE 11g

과제

14주차. XML 서버 데이터베이스 (4)

XSL 피드백

  • 예시 : 공주의_남자.xml
    • 사극2.xsl 적용
  • 사극2.xsl
    • 직접 작성한 사극.xsl 파일을 보강해 주신 것
    • choose, when-otherwise 문
      <xsl:template match="인명|인물">
      	<xsl:choose>
      		<xsl:when test="@id">
      			<a>
      				<xsl:attribute name="href">http://encykorea.aks.ac.kr/Contents/Item/<xsl:value-of select="@id"/></xsl:attribute>
      				<xsl:attribute name="target">_blank</xsl:attribute>
      				<span style="color:green"><u><xsl:value-of select="."/></u></span>
      			</a>
      		</xsl:when>
      		<xsl:otherwise>
      				<span style="color:green"><xsl:value-of select="."/></span>		
      		</xsl:otherwise>
      	</xsl:choose>
      </xsl:template>
      

사극콘텐츠 서버 데이터베이스 업로드

  • 과제로 제작한 7개 xml 파일 합본 제작
  • uploadHistoryContents.sql
    • 7개 합본이 아닌, 전체 콘텐츠 합본을 일괄로 데이터베이스에 올리기 위해 작성한 SQL 문
  • upload사극xml.sql
    /* upload XML file */
    
    USE Class2022
    
    -- DROP TABLE 사극_bulk
    -- DROP TABLE 사극_xml
    
    CREATE TABLE 사극_bulk (xmltxt xml)
    
    SELECT * FROM 사극_bulk
    
    INSERT INTO 사극_bulk ( xmltxt )
    SELECT * FROM OPENROWSET(  
       BULK 'e:\inetpub\wwwroot\DhLab\2022\201\workshop\사극\xml\잔싱롱.xml',  
       SINGLE_BLOB) AS x;  
    
    /*
    위에서, 수강생 각자가 작성하여 보낸 7-8개 합본을 하나의 전체 파일로 취합하지 않고 각각 INSERT함
    */
    
    SELECT * FROM 사극_bulk
    
    
    /* create XML DB table */
    
    CREATE TABLE 사극_xml (
       id   nvarchar(40) NOT NULL,
       xmltxt    xml NOT NULL,
       primary key(id)
       )
    
     
    /* create trigger */
    
    CREATE TRIGGER 사극_getid ON 사극_xml INSTEAD OF INSERT
    AS
       INSERT INTO 사극_xml(id, xmltxt)
       SELECT
          t.xmltxt.value('(/콘텐츠/@id)[1]', 'nvarchar(40)') AS id,
          t.xmltxt AS xmltxt   
       FROM inserted t
     
     
    /* insert xml record from bulk-uploaded file */
    
    SELECT node.query('.') 
       FROM   사극_bulk CROSS APPLY xmltxt.nodes('/데이터/콘텐츠') AS R(node) 
    
    INSERT INTO 사극_xml(xmltxt)
       SELECT node.query('.') 
       FROM   사극_bulk CROSS APPLY xmltxt.nodes('/데이터/콘텐츠') AS R(node) 
    
    SELECT * FROM 사극_xml
    

15주차. XML 서버 데이터베이스 (5)

온라인 데이터 인용

  • 참고문헌 작성법
    • The Chicago Manual of Style
      • 미국 시카고 대학(University of Chicago)에서 지정한 양식
      • 인문학, 예술, 자연과학, 사회과학 등 대부분의 학문 분야에서 가장 보편적으로 사용되는 인용 양식
      • Chicago는 각주를 사용하여, 특정 문헌의 어떤 부분에서 인용했는지까지 기술 가능
    • APA style
      • 미국심리학회(American Psychological Association)에서 지정한 양식
      • 주로 사회과학 분야에서 사용되는 인용 양식
      • APA는 각주 없이 행간에 (김현, 2012)처럼 밝혀 상세한 정보까지 기술하기 힘듦
  • 온라인 데이터의 인용?
    image
    • 학자들마저 온라인 데이터를 인용하는 방법을 잘 모르는 경우가 대부분임
    • 디지털 자료를 학술 자료로 인용할 수 있도록 만드는 것이 디지털 인문학
      • 디지털 인문학 전공자라면 본인 사이트를 구축하고, 논문을 위한 아카이브를 구축해서 이로써 논문에서 제시한 정보를 제공할 수 있어야 함
    • 온라인 저작의 오프라인 출처를 보고서, 서지 사항을 오프라인으로 밝히는 건 부도덕할 뿐 아니라 부정확하기까지 함
  • 온라인 데이터 인용 방법
    • 검색 일자가 아닌, 게시 일자를 밝히는 게 훨씬 중요함
      • 검색 일자는 수시로 변하는 (언제 없어질지 모르는) 자료인 경우, 게시 일자를 알 수 없는 경우에 기술
      • 수시로 변하는 자료라면 화면 하드카피(Hardcopy)를 같이 제공하는 방법이 있음
    • Chicago 스타일 웹사이트 인용법 (출처 : Chicago 출처 생성기)
      • 저자의 성, 저자의 이름 저자의 가운데 이름. “페이지명.” 웹사이트명, 출판일자, URL.
      • 예) Kim, Andrew. “How I Became a Full-Time Freelance Editor (and How You Can, Too).” Medium, August 28, 2020. https://medium.com/wordviceediting/how-i-became-a-full-time-freelance-editor-and-how-you-can-too-7e694d1792bc.
    • 저자의 성, 저자의 이름 저자의 가운데 이름. “페이지명.” DB명 웹사이트명, 출판일자, URL.
      • DB명도 명시해 주면 좋음
    • APA 웹 자원 인용 양식

사극콘텐츠 서버 데이터베이스 SQL

  • 사극1.sql
    • 데이터 업로드
  • 사극2.sql
    • 뷰 생성
    • 활용 예시
      /* 활용 예시 */
      
      -- 1) 드라마나 영화에는 어떤 역사인물 캐릭터가 많이 등장했나?
      
      select 캐릭터, count(*) as 횟수 from 사극_character
      group by 캐릭터 order by count(*) desc
      
      -- 2) 드라마나 영화에서 조선시대 왕 영조의 역할을 했던 배우들 
      
      select * from 사극_character where 캐릭터 in ('조선_영조', '조선_영조(아역)' )
      
      -- 3) 조선시대 왕 정조가 등장한 영화, 드라마
      
      select a.캐릭터, a.연기자, b.* from 사극_character as a
      join 사극_meta as b on a.id=b.id
      where a.캐릭터='조선_정조'
      
  • 사극3.sql
    • 노드 리스트 생성
    • 데이터 클리닝(data cleaning)
      • 공백 문자의 정체 파악
        select id, remark, unicode(substring(remark, 1, 1)), unicode(substring(remark, 2, 1)),  unicode(substring(remark, 3, 1))
        from 사극Data
        
      • 문제의 문자 처리: char(10), char(9), char(32)
        update 사극Data
        set label = replace(id,'_', ' '),
        remark = replace(replace(remark, char(10), ''), char(9), '')
        
        update 사극Data
        set remark = ltrim(rtrim(remark))
        
        select * from 사극Data
        
      • Single Quotation 문자 char(39) 존재 여부 확인/수정
        select remark from 사극Data
        where remark like '%'+char(39)+'%'
        
        update 사극Data
        set remark = replace(remark, char(39), char(34))
        where remark like '%'+char(39)+'%'
        
        select remark from 사극Data
        where remark like '%'+char(34)+'%'
        
        update 사극Data
        set note=NULL
        where note='NULL'
        
        select * from 사극Data
        
⚠️ **GitHub.com Fallback** ⚠️