이안의 평일코딩

XML 1일차 - XML태그 본문

Back-end/XML

XML 1일차 - XML태그

이안92 2020. 9. 16. 09:23
반응형

2020.09.16(수)

 

JAXB API 2.3.1.jar

mvnrepository.com/artifact/javax.xml.bind/jaxb-api

 

json-simple-1.1.1.jar

bundle

mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1

 

영화관 박스오피스

kobis.or.kr/kobis/business/main/main.do

 

xml 가져오기 연습용

newssearch.naver.com/search.naver?where=rss&query=%EC%98%81%ED%99%94

 

MVC (확장자를 사용자 마음대로 설정) => 실무에서 70% 사용

 

 

HTML (고정된 태그) = XML 코드는사용자 정의

 

XML => 1) 태그 2) 속성

   

=> HTML과 다른점

   1) 문법이 어렵다

   2) HTML은 화면 출력하는 목적, 문서 저장 목적 (파일형 데이터베이스)

   3) 태그나 속성에서 대소문자를 구분한다

   4) 속성에 값을 대입할 때 = 반드시 ""를 사용한다

   5) 여는태그 닫는태그는 반드시 일치

   6) Spring, Mybatis => XML기반

=> 장점

     1) 호환성이 좋다 (스마트폰, 리눅스, 윈도우) => 운영체제에 상관없이 사용이 가능

=> 단점

     2) XML코드가 길어지면 속도가 느려진다 (분산처리) : 여러개를 나눠서 처리

=> Spring, Mybatis : 업체마다 XML코드가 다르기 때문에 제공하는 XML만 사용해야된다 (XML태그를 외워야한다)

      => DTD파일을 제공 (태그가 정의되어 있는 문서)

     XML을 주로 사용하는 부분 ==> 변환 (Annotation)

     => Spring, Mabtis => 업체 요구사항

        = Ajax => javascript and XML

        = javascript 5 => javascript 6 (XML)

        = React / VueJS

        = AI => 데이터 수집 (XML)

        = Kotlin => XML기반

=> 사용자 정의 태그를 만든다 <태그명> : 사용자 정의

     1) 문법

        = 알파벳, 한글로 시작한다(알파벳:대소문자구분)

           <a>!=<A>

        = 숫자를 사용할 수 있다 (앞에 사용금지)

          <2a>(X) => <a2> <a3>...

        = 태그에 공백이 있으면 안된다

           < abc>(X)    <file name>(X)

        = 특수문자 사용이 가능 ( _ , - , .)

            <file_name> <file-name> <file.name>

        = 키워드는 사용할 수 없다 => <xml>

        = HTML태그는 사용이 가능 (문서로 저장)

        = 여는태그와 닫는태그가 반드시 일치

           <a><b><c></c></b></a> : 계층구조가 있어야 완성된다

        = 태그의 종류

           여는태그 : <table> <a>

           닫는태그 : </table> </a>

           빈태그 : <br/> <img/>

        = XML태그는 반드시 최상위 태그가 존재

           <a></a> (O)

 

           <a></a>

           <b></b> (X)

 

           <a>

           <b></b>

           </a>        (O)

         = 권장사항

            알아보기 쉬운 태그명을 사용한다(시멘텍 태그)

            예)

                 <a>홍길동</a> (X)

                 <name>홍길동</name> (O)

 

mybatis-3.2.8.zip

github.com/mybatis/mybatis-3/releases/tag/mybatis-3.2.8

 

 

sawon.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
      HTML (고정된 태그) => XML 코드는 사용자 정의
      
      XML => 1) 태그
             2) 속성 
             
          => HTML과 다른점 
             1) 문법이 어렵다 
             2) HTML은 화면 출력하는 목적 , 문서 저장 목적 (파일형 데이터베이스)
             3) 태그나 속성에서 대소문를 구분한다 
             4) 속성에 값을 대입할때 = 반드시 ""를 사용한다 
             5) 여는태그 닫는 태그는 반드시 일치 
             6) Spring , Mybatis => XML기반
          => 장점 
             1) 호환성이 좋다 (스마트폰,리눅스,윈도우) => 운영체제에 상관없이 사용이 가능 
          => 단점 
             2) XML코드가 길어지면 속도가 늦어진다 (분산처리) : 여러개를 나눠서 처리
          => Spring , Mybatis : 업체마다 XML코드가 다르기 때문에
                                제공하는 XML만 사용해야된다 (XML태그를 외워야한다)
                 => DTD파일을 제공 (태그가 정의되어 있는 문서)
             
             XML을 주로 사용하는 부분  ==> 변환 (Annotation)
             => Spring,Mabtis => 업체 요구사항
               = Ajax => Javascript and XML
               = javascript 5 => javascript 6(XML)
               = React / VueJS
               = AI => 데이터 수집 (XML)
               = Kotlin => XML기반
          => 사용자 정의 태그를 만든다  <태그명>:사용자 정의
             1) 문법 
                = 알파벳,한글로 시작한다(알파벳:대소문자구분)
                  <a>!=<A>
                = 숫자를 사용할 수 있다 (앞에 사용금지) 
                  <2a>(X) => <a2> <a3>...
                = 태그에 공백이 있으면 안된다 
                  < abc>(X)  <file name>(X)
                = 특수문자 사용이 가능  ( _ ,- , .)
                  <file_name> <file-name> <file.name>
                = 키워드는 사용할 수 없다 => <xml>
                = HTML태그는 사용이 가능 (문서로 저장)
                = 여는태그와 닫는태그가 반드시 일치 
                  <a><b><c></c></b></a> : 계층구조가 있어야 완성된다
                = 태그의 종류
                                  여는태그 : <table> <a>
                                  닫는태그 : </table> </a>
                                  빈태그    : <br/> <img/>
                = XML태그는 반드시 최상위 태그가 존재 
                  <a></a> (O)
                  
                  <a></a>
                  <b></b> (X)
                  
                  <a>
                   <b></b>
                  </a>   (O)
                = 권장사항
                                 알아보기 쉬운 태그명을 사용한다(시멘텍 태그)
                                 예)
                     <a>홍길동</a> (X)
                     <name>홍길동</name>(O)        
                     
            1. https://mybatis.org 
                            메뉴 => product => 테이블 맨 위를 클릭 => 버전 => 3.2.8.zip 다운
                     라이브러리 
                     => lib
                     => mybatis-3.2.8.jar
                     
         ======= DTD , XML mybatis-3-mapper.dtd , Spring => 스키마
                 JSP => View(HTML)
 -->
 <sawon> <!-- 테이블명 -->
   <list> <!-- ROW -->
     <sabun>1</sabun> <!-- 컬럼명 -->
     <name>홍길동</name>
     <job>사원</job>
     <dept>개발부</dept>
     <sal>3500</sal>
   </list>
   <list> <!-- ROW -->
     <sabun>2</sabun> <!-- 컬럼명 -->
     <name>심청이</name>
     <job>대리</job>
     <dept>개발부</dept>
     <sal>3800</sal>
   </list>
 </sawon>
 

 

member.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE member SYSTEM "member.dtd">
<member>
  <list>
     <name>aaa</name>
     <sex>aaa</sex>
     <hp>aaa</hp>
     <address>aaa</address>
  </list>
</member>

 

member.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT member (list+)>
<!ELEMENT list (name,sex,(tel|hp),address)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT hp (#PCDATA)>
<!ELEMENT address (#PCDATA)>

 

=========================================================

config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
     문서 저장 : 태그의 순서 ,속성을 저장 
 -->
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <!-- 
     (properties?,   ? => 사용할 수도 있고 ,사용하지 않을 수도 있다
      settings?, 
      typeAliases?, 
      typeHandlers?, 
      objectFactory?, 
      objectWrapperFactory?, 
      reflectorFactory?, 
      plugins?, 
      environments?, 
      databaseIdProvider?, 
      mappers?)
  -->  
  <!-- 
     
        1. 연결  getConnection() ==> 연결할 수 있게 오라클 정보 보내준다
        2. sql => String sql="SELECT * FROM music";
                  ps=conn.preparedStatement(sql);
        3. ResultSet rs=ps.executeQuery();
        4. while(rs.next())
           {
               MusicVO vo=new MusicVO();
               vo.setTitle(rs.getString(1))
              
               list.add(vo);
            }
            
            MyBatis에서 코딩 
   -->
<configuration><!-- 최상위 태그 : 환경설정을 하는 태그명 -->
  <typeAliases> <!-- MyBatis에서 오라클을 연결해서 가지고 온 데이터를 저장=>어느 클래스에 저장할 지를  알려준다-->
    <!-- VO를 등록하는 위치 -->
    <typeAlias type="com.sist.dao.MusicVO" alias="MusicVO"/><!-- 여러개 등록이 가능 -->
    <!-- 
       (typeAlias*, package*)   ORDER BY WHERE  , 순서
       
       while(rs.next())
       {
          MusicVO vo=new MusicVO();
          vo.setXxx(rs,getString(1));
          =
          =
          =
       }
     -->
  </typeAliases>
  <!-- 오라클 연결하는 부분 => 오라클 정보 (driver,url,username,password) -->
  <!-- 
     (environment+) => 반드시 한번 이상을 사용
   -->
  <environments default="development">
    <!-- 오라클 연결 : getConnection(),disConnection() -->
    <!-- (transactionManager, dataSource) -->
    <environment id="development">
      <transactionManager type="JDBC"/><!-- Commit,Rollback(자바의 JDBC) -->
      <dataSource type="POOLED">
        <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
        <!-- 
              Class.forName("oracle.jdbc.driver.OracleDriver")
         -->
        <property name="url" value="jdbc:oracle:thin:@211.238.142.000:1521:XE"/>
        <property name="username" value="hr"/>
        <property name="password" value="happy"/>
        <!-- 
           public void getConnection()
           {
              conn=DriverManager.getConnection(url,username,password)
           }
         -->
      </dataSource>
    </environment>
  </environments>
  <!-- 연결이 종료 => SQL문장을 읽는다  -->
  <!-- 
       SQL문장이 많이 존재하기 때문에 (XML코드가 길어지면 속도가 늦어진다)
       => 나눠서 작업을 하기 때문에 파일을 별도로 제작할 수 있게 만든다 
   -->
  <mappers>
    <!-- SQL문장을 저장  PrpparedStatement-->
    <mapper resource="com/sist/dao/music.xml"/>
    <!-- 파일이 여러개 들어 올 수 있다 -->
  </mappers>
  
</configuration>

 

com.sist.xml

Channel.java

package com.sist.xml;
import java.util.*;
public class Channel {
   private List<Item> item=new ArrayList<Item>();

	public List<Item> getItem() {
		return item;
	}
	
	public void setItem(List<Item> item) {
		this.item = item;
	}
   
   
}

 

Item.java

package com.sist.xml;
/*
 *    태그안에 태그가 있으면 => 클래스 제작
 *    태그안에 문자열 값 => 변수 제작 
 *    자바 XML => 연결이 가능 
 */
public class Item {
    private String title;
    private String description;
    private String author;
    private String link;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getLink() {
		return link;
	}
	public void setLink(String link) {
		this.link = link;
	}
	   
}

 

NewsManager.java

 

package com.sist.xml;
import java.util.*;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

import java.net.*;
public class NewsManager {
   public List<Item> naverNewsData(String fd)
   {
	   List<Item> list=new ArrayList<Item>();
	   try
	   {
		   String strUrl="http://newssearch.naver.com/search.naver?where=rss&query="
				        +URLEncoder.encode(fd, "UTF-8");
		   URL url=new URL(strUrl);
		   JAXBContext jb=JAXBContext.newInstance(Rss.class);
		   Unmarshaller un=jb.createUnmarshaller();
		   Rss rss=(Rss)un.unmarshal(url);
		   list=rss.getChannel().getItem();
	   }catch(Exception ex) {}
	   return list;
   }
   public static void main(String[] args) {
	  NewsManager m=new NewsManager();
	  List<Item> list=m.naverNewsData("¿µÈ­");
	  for(Item i:list)
	  {
		  System.out.println(i.getTitle());
	  }
   }
}

 

Rss.java

package com.sist.xml;

import javax.xml.bind.annotation.XmlRootElement;

/*
 *   news => naver ==> JAXB (XML => Java Class변환) : 언마샬
 *   ==============    JAXB (Java Class=> XML) :마샬
 *   <rss>  태그 (태그) ==> 클래명 
 *     <channel> => 클래스 
 *       <item>
 *         <title>aaa</title> 변수명 
 *         <description>aaa</description>
 *         <author>aaa</author>
 *         <link>aaa</link>
 *       </item>
 *       <item>
 *         <title>aaa</title>
 *         <description>aaa</description>
 *         <author>aaa</author>
 *         <link>aaa</link>
 *       </item> ==> <item> => 50개
 *    </channel>
 *  </rss>
 *  
 *     <member>  ==> class Member
 *       <list>  ==> class List 
 *                   {
 *                       private String name
 *                       private String sex
 *                   }
 *         <name>aaa</name>
 *         <sex>aaa</sex>
 *       </list>
 *     </member>
 */
@XmlRootElement
public class Rss {
   private Channel channel=new Channel();

	public Channel getChannel() {
		return channel;
	}
	
	public void setChannel(Channel channel) {
		this.channel = channel;
	}
  
}

 

com.sist.dao

MusicVO.java

package com.sist.dao;
/*
 *  1. XML 태그 제작 방법
 *  2. XML문법 
 *  3. 자바 파싱 (자바에서 XML의 데이터를 읽어온다)
 *     = DOM (데이터베이스 대체) : 수정,추가 ,삭제,검색
 *     = SAX : 검색 
 *     = JAXB : 자바클래스와 XML을 연결(빅데이터,외부 XML을 읽을 경우)
 */
// Mybatis => 변수명 = 컬럼명이 반드시 일치
// DESC 테이블명 
public class MusicVO {
    private int mno;
    private String title;
    private String singer;
    private String album;
    private String poster;
    private String state;
    private int idcrement;
    private String key;
	public int getMno() {
		return mno;
	}
	public void setMno(int mno) {
		this.mno = mno;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getSinger() {
		return singer;
	}
	public void setSinger(String singer) {
		this.singer = singer;
	}
	public String getAlbum() {
		return album;
	}
	public void setAlbum(String album) {
		this.album = album;
	}
	public String getPoster() {
		return poster;
	}
	public void setPoster(String poster) {
		this.poster = poster;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public int getIdcrement() {
		return idcrement;
	}
	public void setIdcrement(int idcrement) {
		this.idcrement = idcrement;
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
    
    
}

 

MusicDAO.java

package com.sist.dao;
import java.util.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
/*
 *     클래스 제작 
 *     ========
 *       프로그램 => 데이터를 조작 
 *                ======
 *                 데이터를 저장 : 초기값을 부여 
 *                 =======================
 *                 = 명시적 초기화
 *                   private int a=10;
 *                 = 초기블록
 *                   = 인스턴스 블록
 *                   
 *                   = static 블록 
 *                 ======================== 자동 인식 
 *                 = 생성자 : 호출할때 변수가 초기화 
 *                   new 생성자()
 */
public class MusicDAO {
   private static SqlSessionFactory ssf;
   // ssf => XML을 읽어오는 역할 => 오라클연결 (JDBC) , XML(파싱), HTML(크롤링)
   static {
	   // 자동 초기화
	   try
	   {
		   Reader reader=Resources.getResourceAsReader("config.xml");
		   // XML 파싱 
		   ssf=new SqlSessionFactoryBuilder().build(reader);
	   }catch(Exception ex)
	   {
		   System.out.println(ex.getMessage());
	   }
   }
   public static List<MusicVO> musicAllData()
   {
	   return ssf.openSession().selectList("musicAllData");//<select id="musicAllData">
   }
   
}

 

MainClass.java

package com.sist.dao;
import java.util.*;
public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       List<MusicVO> list=MusicDAO.musicAllData();
       for(MusicVO vo:list)
       {
    	   System.out.println(vo.getTitle());
       }
	}

}

 

music.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- SQL문장 저장  : MyBatis => 데이터베이스 연결만하는 라이브러리-->
<!-- namespace : 자바 (package명) -->
<mapper namespace="com.sist.dao.music">
  <!-- 데이터 읽기  -->
  <select id="musicAllData" resultType="MusicVO">
    SELECT * FROM genie_music
    ORDER BY mno ASC
    <!-- 
         String sql="SELECT * FROM genie_music
                     ORDER BY mno ASC";
         ps=conn.prepredStatement(sql);
         
         <select id="musicAllData" resultType="MusicVO">
                ====               ==========
                       중복이 없는 속성                   실행 결과를 받는 클래스를 등록 
     -->  
  </select>
  <!-- 
       1. ~VO만들기 (컬럼명=변수명)
       2. config.xml ==> Connection
          =========== 변경사항이 없다  (VO등록,Mapper등록)
       3. music.xml  ==> PreparedStatement,ResultSet
          ===========
           table마다 1개씩 만든다
               
   -->
</mapper>
반응형

'Back-end > XML' 카테고리의 다른 글

XML 3일차 - Map  (0) 2020.09.18
XML 2일차 - DOM, SAX, JSON  (0) 2020.09.17
Comments