Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-05-03(화) 067일차 [Oracle, Ajax, Spring Framework] 서브쿼리, JOIN, RSS, 스프링 환경설정

옌炎 2022. 6. 17. 10:57
728x90

수업내용


1교시 (09:30-10:20)

  • 지난 시간 복습
    - 오라클
        
        요구사항에서
        
        **분석 과정**
        
        요구사항을 충족하기 위해서 데이터 <-- 속성
        를 사용해야 하는데
        그 데이터를 모아놓은 공간 <-- 엔티티
        모아둘 공간이 여러 개 <-- 같은 성격의 데이터를 모아 두기 위해서
        
        논리 모델을 만들어서 토론한다. --> 논리 모델 확정 분석이 완료되면
        Entity
        Attribute
        
        **설계 과정**
        
        완성된 논리 모델을 가지고 물리 모델을 만든다.
        Table
        Column
        
        ERD 모델
        논리모델 물리모델
        엔티티 Entity 테이블 Table
        속성 Attribute 컬럼 Column
        
        논리 모델하고 물리 모델은 항상 동일해야 한다.
  • 서브쿼리
SELECT HIREDATE FROM EMP;

-- 입사일이 빠른 순서로 5건을 구하시오 
-- 데이터는 꼭 눈으로 확인 해야 한다. 건수 가 적으면 아이체킹 한다.
-- 건수가 많으면 대표적은 데이터 타입 구별해서 확인 해야 한다. 

-- 1. 입사일 전건 확인 하는 것 : 14건 이니까
SELECT HIREDATE FROM EMP;

SELECT HIREDATE FROM EMP ORDER BY HIREDATE ASC;

SELECT HIREDATE FROM EMP WHERE ROWNUM <= 5;

-- 프럼절에서 자식 쿼리 인라인 뷰 서브쿼리로 
-- 입사일 빠른 순으로 소트를 먼저한다.
-- 이후 부모 쿼리에서 5건을 구한다.
SELECT A.HIREDATE 
FROM
    -- 인라인 뷰 서브쿼리 
    (SELECT HIREDATE FROM EMP ORDER BY HIREDATE ASC) A
WHERE ROWNUM <= 5;

/*
SELECT 
    SELECT * FROM DUAL;
FROM 
    SELECT * FROM DUAL;
WHERE 
    SELECT * FROM DUAL;
*/

SELECT * FROM EMP;
SELECT * FROM DEPT;

DESC EMP;
DESC DEPT;

SELECT * FROM DEPT;
SELECT DISTINCT DEPTNO FROM EMP;
SELECT DEPTNO FROM EMP GROUP BY DEPTNO;

2교시 (10:30-11:20)

  • ERwin 사용법

  • JOIN
--####################################################
-- 조인 : 테이블을 합치는 것 : 여러개의 테이블을 관계 키를 가지고 합치는 것 
--      꼭 관계키가 없어도 합칠 수 있다. 
-- PK, FK 
-- EQUI JOIN 이퀴조인, EQUAL JOIN 이퀄조인 : INNSER JOIN 이너조인
-- NOT-EQUI JOIN 낫 이키조인
-- SELF JOIN 셀프 조인
-- OUTER JOIN 아우터 조인 




-- EQUI JOIN : 이키 조인, EQUAL JOIN : 이퀄조인 
-- 한 개의 테이블을 두 개의 별도의 테이블 처럼 사용, 
-- 한 개의 테이블의 행들을 같은 테이블의 행들과 조인한다, 
-- 동일 컬럼 기준으로 조인

--###############################################
-- INNSER JOIN : 이너조인 
-- 연산자 = 사용해서 각 테이블에서 동일한 컬럼을 매칭해서 조회하는 것  

-- 이너 조인은 테이블에 있는 모든 데이터를 조회 할 수가 없다.
-- 컬럼에 데이터가 매칭이되지 않으면 데이터를 조회할 수가 없다. <-- 이 조건을 충족하는 조인이 OUTER JOIN 아우터 조인 이다. 
--###############################################
-- 테이블을 조인할 때는 꼭 테이블 앨리어스 사용하기 
SELECT * FROM EMP A;
SELECT * FROM DEPT B;

SELECT * FROM EMP A, DEPT B WHERE A.DEPTNO = B.DEPTNO;
SELECT * FROM DEPT B, EMP A WHERE B.DEPTNO = A.DEPTNO;

SELECT A.*, B.*
FROM   EMP A, DEPT B
WHERE  A.DEPTNO = B.DEPTNO;

SELECT * FROM EMP WHERE EMPNO = '7369';
SELECT DNAME FROM DEPT WHERE DEPTNO = '20';

SELECT DNAME FROM DEPT WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE EMPNO = '7369');

-- INNER JOIN
SELECT B.DNAME
FROM   EMP A, DEPT B
WHERE  A.DEPTNO = B.DEPTNO
AND    A.EMPNO = '7369';

SELECT A.DEPTNO EMP_T, B.DEPTNO DEPT_T
FROM   EMP A, DEPT B
WHERE  A.DEPTNO = B.DEPTNO
ORDER BY 1;

SELECT DEPTNO FROM DEPT;

-- OUTER JOIN
-- (+) 아우터 조인의 연산자 : 데이터 부족한 쪽(없는) 테이블에 연산자를 붙인다.
-- 아우터 조인 순서
-- 1. 먼저 이퀄조인을 먼저 한다. : 연산자 =
-- 2. 데이터가 없는 테이블에 아우터조인 연산자 (+)를 붙인다. 
SELECT A.DEPTNO EMP_T, B.DEPTNO DEPT_T
FROM   EMP A, DEPT B
WHERE  A.DEPTNO(+) = B.DEPTNO
ORDER BY 1;

3교시 (11:30-12:20)

RSS Really Simple Syndication 초간편 배포

acount

  • AccountTest.java
package a.b.c.test.account;

public class AccountTest {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Runnable r = new SyncTest();
		Thread t1 = new Thread(r);
		Thread t2 = new Thread(r);
		
		t1.start();
		t2.start();
	}
}

class BankAccount {
	
	int balance = 1000;
	
	public void withdraw(int money) {
		
		if (balance >= money) {
			try { Thread.sleep(1000);} catch (Exception e) {}
			balance -= money;
		}
	}
}

class SyncTest implements Runnable {
	
	BankAccount ac = new BankAccount();
	
	public void run() {
		
		while (ac.balance > 0) {
			
			// 100, 200, 300 중의 한 값을 임의로 선택하여 출금(withdraw)
			int money = (int)(Math.random() * 3 + 1) * 100;
			ac.withdraw(money);
			System.out.println("balance >>> : " + ac.balance);
		}
	}
	
}
  • AccountTest_1.java
package a.b.c.test.account;

/*
synchronized 사용 자바 동기화
1. 메서드 사용
public synchronized void method(){
	// 코드
}
2. 객체변수 사용
private Object obj = new Object();
public void exampleMethod(){
	synchronized(obj){
		// 코드
	}
}
*/


public class AccountTest_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Runnable r = new SyncTest_1();
		Thread t1 = new Thread(r);
		Thread t2 = new Thread(r);

		t1.start();
		t2.start();
	}
}

class BankAccount_1 {

	int balance = 1000;

	public synchronized void withdraw(int money){
		
		if(balance >= money) {
			try { Thread.sleep(1000);} catch(Exception e) {}
			balance -= money;
		}
	} // withdraw
}

class SyncTest_1 implements Runnable {

	BankAccount_1 ac1 = new BankAccount_1();

	public void run() {
		synchronized(this){
			while(ac1.balance > 0) {

				// 100, 200, 300중의 한 값을 임으로 선택해서 출금(withdraw)
				int money = (int)(Math.random() * 3 + 1) * 100;
				ac1.withdraw(money);
				System.out.println(" balance >>> : " + ac1.balance
					               + " : 출금시간 >>> : " 
					               + CurrentTime.cTime());
			}
		}
	} 
}

abstract class CurrentTime 
{
	public static String cTime(){
		
		long time = System.currentTimeMillis();		
		java.text.SimpleDateFormat sdf = 
			new java.text.SimpleDateFormat("yyyy.mm.dd hh:mm:ss");
		String cTime = sdf.format(new java.util.Date(time));

		return cTime;
	}
}

4교시 (12:30-13:20)

Ajax 로 데이터 바인딩 해보기

https://mockaroo.com/ ←ajax_mock_dataset.xml으로 1000건 저장

  • ajax_mock_xml.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<!-- jQuery CDN 불러오기  -------------------------------------------->
	<script  src="http://code.jquery.com/jquery-latest.min.js"></script>
	<script type="text/javascript">
	
		$(document).ready(function(){
			
			$(document).on('click', '#btn', function(){
				
				alert(">>");
				
				let urlV = 'ajax_mock_dataset.xml';
				let dtV = "xml";
				$.ajax({
					url: urlV,
					dataType: dtV,
					
					success: function(data){
						
						var $data = $(data).find("record");
						
						if ($data.length > 0) {
							var dataTable = $("<table border='1' />");
							
							$.each($data, function(i, item){
								
								var $id 		= $(item).find("id").text();
								var $first_name = $(item).find("first_name").text();
								var $last_name 	= $(item).find("last_name").text();
								var $email 		= $(item).find("email").text();
								var $gender 	= $(item).find("gender").text();
								var $ip_address = $(item).find("ip_address").text();
								
								var row = $("<tr />").append(
															  $('<td />').text($id),
															  $('<td />').text($first_name),
															  $('<td />').text($last_name),
															  $('<td />').text($email),
															  $('<td />').text($gender),	
															  $('<td />').text($ip_address)	
															);
								
								dataTable.append(row);
							});
							
							$('.wrap').append(dataTable);
						}
					}
				});
			});
		});
		
	</script>
</head>
<body>
	<h3>mockaroo.com MOCK_DATA XML</h3>
	<hr>
	<button type="button" id="btn">xml 데이터</button>
	<div class="wrap"></div>
</body>
</html>

  • BoardController.java
package a.b.c.com.kosmo.board.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import a.b.c.com.common.ChabunUtil;
import a.b.c.com.common.EncryptSHA;
import a.b.c.com.kosmo.board.dao.BoardDAO;
import a.b.c.com.kosmo.board.dao.BoardDAOImpl;
import a.b.c.com.kosmo.board.service.BoardService;
import a.b.c.com.kosmo.board.service.BoardServiceImpl;
import a.b.c.com.kosmo.board.vo.BoardVO;

// http://localhost:8088/kosServlet/board
// /kosServlet/board
@WebServlet("/board")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	Logger logger = LogManager.getLogger(BoardController.class);

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		logger.info("BoardController :: doGet() 함수 진입 >>> : ");
		
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		String isudType = request.getParameter("isudType");
		logger.info("BoardController :: doGet() 함수 진입 isudType >>> : " + isudType);
		
		if (isudType !=null && isudType.length() > 0) {
			isudType = isudType.toUpperCase();	

			if ("I".equals(isudType)) {
				
				String bnum = ChabunUtil.getBoardChabun("");
				String bsubject = request.getParameter("bsubject");
				String bwriter = request.getParameter("bwriter");
				String bpw = request.getParameter("bpw");				
				String bmemo = request.getParameter("bmemo");
			
				BoardVO bvo = null;
				bvo = new BoardVO();
				
				bvo.setBnum(bnum);
				bvo.setBsubject(bsubject);
				bvo.setBwriter(bwriter);
				// 패스워드 암호화 하기 
				bpw = EncryptSHA.encryptSHA256(bpw);
				bvo.setBpw(bpw);
				bvo.setBmemo(bmemo);

				logger.info("bvo.getBnum() >>> : " + bvo.getBnum());
				logger.info("bvo.getBsubject() >>> : " + bvo.getBsubject());
				logger.info("bvo.getBwriter() >>> : " + bvo.getBwriter());
				logger.info("bvo.getBpw() >>> : " + bvo.getBpw());
				logger.info("bvo.getBmemo() >>> : " + bvo.getBmemo());
								
				BoardService bs = new BoardServiceImpl();
				boolean bool = bs.boardInsert(bvo);
				
				if (bool) {
					
					logger.info("입력 성공 >>> :" + bool);
					
					// setAttribute(java.lang.String, java.lang.Object)
					request.setAttribute("bool", new Boolean(bool));
					
					RequestDispatcher rd = request.getRequestDispatcher("/kosmo/board/boardInsert.jsp");
					rd.forward(request, response);
				}else {
					
					logger.info("입력 실패 >>> :" + bool);
					
					out.println("<script>");
					out.println("location.href='/kosmo/board/board.html'");
					out.println("</script>");
				}
				
			}
			if ("SALL".equals(isudType)) {
				logger.info("BoardController :: doGet() 함수 진입 SALL isudType >>> : " + isudType);
				
				// 서비스 호출 
				BoardService bs = new BoardServiceImpl();
				ArrayList<BoardVO> aList = bs.boardSelectAll();
				
				if (aList !=null && aList.size() > 0) {
					
					logger.info("전체조회 성공 >>> : " + aList.size());
					request.setAttribute("aList_selectALL", aList);
					RequestDispatcher rd = request.getRequestDispatcher("/kosmo/board/boardSelectAll.jsp");
					rd.forward(request, response);
				}else {
					
					logger.info("전체조회 실패 >>> : ");
					
					out.println("<script>");
					out.println("location.href='/kosmo/board/board.html'");
					out.println("</script>");
				}
			}
			
			if ("U".equals(isudType)) {
				logger.info("BoardController :: doGet() 함수 진입 U isudType >>> : " + isudType);
								
				String bnum = request.getParameter("bnumChk");
				
				BoardVO bvo = null;
				bvo = new BoardVO();
				bvo.setBnum(bnum);
			
				// 서비스 호출 
				BoardService bs = new BoardServiceImpl();
				ArrayList<BoardVO> aList = bs.boardSelect(bvo);
				
				if (aList !=null && aList.size() > 0) {
					
					logger.info("조회 성공 >>> : " + aList.size());
					
					request.setAttribute("aList_select", aList);
					RequestDispatcher rd = request.getRequestDispatcher("/kosmo/board/boardSelect.jsp");
					rd.forward(request, response);
					
				}else {
					
					logger.info("조회 실패 >>> : ");
					
					out.println("<script>");
					out.println("location.href='/kosServlet/board?isudType=SALL'");
					out.println("</script>");
				}				
			}
			
			// 수정하기 
			if ("UOK".equals(isudType)) {
				logger.info("BoardController :: doGet() 함수 진입 UOK isudType >>> : " + isudType);
				
				String bnum = request.getParameter("bnum");
				String bsubject = request.getParameter("bsubject");
				String bmemo = request.getParameter("bmemo");
				
				BoardVO bvo = null;
				bvo = new BoardVO();				
				bvo.setBnum(bnum);
				bvo.setBsubject(bsubject);				
				bvo.setBmemo(bmemo);

				logger.info("bvo.getBnum() >>> : " + bvo.getBnum());
				logger.info("bvo.getBsubject() >>> : " + bvo.getBsubject());
				
				// 서비스 호출
				BoardService bs = new BoardServiceImpl();
				boolean bool = bs.boardUpdate(bvo);
				
				// 결과 포워드 하기 /kosmo/board/boardUpdate.jsp
				if (bool) {
					
					logger.info("수정 성공 >>> :" + bool);
					
					request.setAttribute("bool", new Boolean(bool));					
					RequestDispatcher rd = request.getRequestDispatcher("/kosmo/board/boardUpdate.jsp");
					rd.forward(request, response);
				
				} else {
					
					logger.info("수정 실패 >>> :" + bool);
					
					out.println("<script>");
					out.println("alert('글 수정 실패')");
					out.println("location.href='/kosServlet/board?isudType=SALL'");
					out.println("</script>");
				}
			}
			
			// 삭제하기
			if ("D".equals(isudType)) {
				logger.info("BoardController :: doGet() 함수 진입 D isudType >>> : " + isudType);
				
				// http://localhost:8088/kosServlet/board?bnumchk=1&isudType=D
				
				String bnum = request.getParameter("bnumChk");
				
				BoardVO bvo = null;
				bvo = new BoardVO();				
				bvo.setBnum(bnum);
				logger.info("bvo.getBnum() >>> : " + bvo.getBnum());
				
				// 서비스 호출
				BoardService bs = new BoardServiceImpl();
				boolean bool = bs.boardDelete(bvo);
				
				// 결과 포워드 하기 /kosmo/board/boardDelete.jsp
				if (bool) {
					
					logger.info("삭제 성공 >>> : " + bool);
					
					request.setAttribute("bool", new Boolean(bool));
					RequestDispatcher rd = request.getRequestDispatcher("/kosmo/board/boardDelete.jsp");
					rd.forward(request, response);
				
				} else {
					
					logger.info("삭제 실패 >>> : " + bool);
					
					out.println("<script>");
					out.println("alert('글 삭제 실패')");
					out.println("location.href='/kosServlet/board?isudType=SALL'");
					out.println("</script>");
				}
			}
			
			// 아이디 체크
			if ("IDCHK".equals(isudType)) {
				logger.info("BoardController :: doGet() 함수 진입 IDCHK isudType >>> : " + isudType);
			}
			
			// 비밀번호 체크
			if ("PWCHK".equals(isudType)) {
				logger.info("BoardController :: doGet() 함수 진입 PWCHK isudType >>> : " + isudType);
				
//				String bnum = request.getParameter("bnum");
//				String bpw = request.getParameter("bpw");
//				bpw = EncryptSHA.encryptSHA256(bpw);
//				
//				logger.info("BoardController :: doGet() 함수 진입  bnum >>> : " + bnum);
//				logger.info("BoardController :: doGet() 함수 진입  bpw >>> : " + bpw);
				
				BoardVO bvo = null;
				bvo = new BoardVO();
				bvo.setBnum("B0003");
				bvo.setBpw("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f");
				
				logger.info("bvo.getBnum() >>> : " + bvo.getBnum());
				logger.info("bvo.getBpw() >>> : " + bvo.getBpw());
				
				// 서비스 호출
				BoardService bs = new BoardServiceImpl();
				ArrayList<BoardVO> aList = bs.boardPWCheck(bvo);
				
				// Ajax에서 요청한 응답을 하는 경우
				// 1. Servlet에서 직접 Ajax로 응답을 하는 경우
				// 2. Servlet에서 jsp를 디스패치해서 Ajax로 리턴하는 경우
				
				String sVal = "";
				if (aList !=null && aList.size() == 1) {
					logger.info("aList.size() >>> : " + aList.size());
					sVal = "PW_GOOD";						
				}else {
					logger.info("aList.size() >>> : " + aList.size());
					sVal = "BAD_GOOD";
				}
				out.println("이 글자는 화면에 출력하는 글자이다. resonse 하는 스트림이다. html 이다.");
				out.println("22222222222222");
				out.println(sVal);				
				out.println("<?xml version='1.0' encoding='UTF-8' ?>");
				out.println("<pwchk>");
				out.println("<result>"+ sVal +"</result>");
				out.println("</pwchk>");
			}
			
		} else {
			logger.info("BoardController :: doGet() 구분자가 없습니다. >>> : ");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

5교시 (14:30-15:20)

  • ajax_chosun_rss_xml.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.FileWriter" %>

<%
	String strLine = "";
	try {
		String strUrl = "https://myhome.chosun.com/rss/www_section_rss.xml";
		
		BufferedReader br = new BufferedReader(
			new InputStreamReader((new URL(strUrl))
			.openConnection().getInputStream(),"UTF-8"));
		
		String filePath = "C:\\00.KOSMO108\\30.Web\\eclipse_web_1_work\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\KosMember\\kos_ajax";
		String fileName = "ajax_chosun_rss.xml";
		File xmlFile = new File(filePath +"/"+ fileName);

		FileWriter fw = new FileWriter(xmlFile);
		while ((strLine = br.readLine()) != null ){
			System.out.println(strLine);
			fw.write(strLine);
		}
						
		fw.flush();
		fw.close();
		
	} catch (Exception e) {		
		throw e;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>
  • ajax_chosun_rss.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- jQuery CDN 불러오기  -------------------------------------------->
<script  src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">

	$(document).ready(function(){
		
		$(function(){
			// http://localhost:8088/KosMember/kos_ajax/choson_rss_xml.jsp
			let urlV = "ajax_chosun_rss.xml";
			let dtV = "xml";
			$.ajax({
				url: urlV,
				dataType: dtV,
				success: function(data){
					
					alert("data >>> : " + data);
					console.log("data >>> : " + data);
					
					var $items = $(data).find("item");
					alert("$items >>> : " + $items);
					
					if ($items.length > 0) {
						$items = $items.slice(0, 10);
						var $ulTag = $("<ul />");
						$.each($items, function(i, item_data){
							var $title = $(item_data).find('title').text();
							var $link = $(item_data).find('link').text();
							
							var $aTag = $("<a />").attr({
								"href":$link,
								"target":"_blank"
							}).text($title);
							
							var $liTag = $("<li />").append($aTag);
							
							$ulTag.append($liTag);
						});
						$('.wrap').append($ulTag);
					}
				},
				error: function(e){
					alert(e.responseText);
				}
			});
		});
	});

</script>
</head>
<body>
<h3>조선닷컴 오늘의 주요뉴스 RSS 읽기</h3>
<hr>
<div class="wrap"></div>
</body>
</html>

  • [숙제]RSS
        
        동네예보 > 중기예보 > 서울.경기도 RSS
        [http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109](http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109)
        
        기상청 날씨누리
        [https://www.weather.go.kr/w/weather/forecast/mid-term.do?stnId1=109](https://www.weather.go.kr/w/weather/forecast/mid-term.do?stnId1=109)
        
        서울 인천 경기도
        기상전망
        
        서울 : 최저/최고기온(C) 가져오기
        
        ajax_weathergokr_rss_xml.jsp : xml 가져오기
        ajax_weathergokr_rss.xml : 가져온 xml 이름
        ajax_weathergokr_rss.jsp : ajax 로 xml 에서 데이터 가져와서 화면 dp
        
        2022년 05월 06일 금요일 18시 20분까지
  • ajax_weathergokr_rss.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.FileWriter" %>

<%
	String strLine = "";
	try {
		String strUrl = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109";
		
		BufferedReader br = new BufferedReader(
			new InputStreamReader((new URL(strUrl))
			.openConnection().getInputStream(),"UTF-8"));
		
		String filePath = "C:\\00.KOSMO108\\30.Web\\eclipse_web_1_work\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\KosMember\\kos_ajax";
		String fileName = "ajax_weathergokr_rss.xml";
		File xmlFile = new File(filePath +"/"+ fileName);

		FileWriter fw = new FileWriter(xmlFile);
		while ((strLine = br.readLine()) != null ){
			System.out.println(strLine);
			fw.write(strLine);
		}
						
		fw.flush();
		fw.close();
		
	} catch (Exception e) {		
		throw e;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

 

  • ajax_weathergokr_rss.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<!-- jQuery CDN 불러오기  -------------------------------------------->
	<script  src="http://code.jquery.com/jquery-latest.min.js"></script>
	<script type="text/javascript">
	
		$(document).ready(function(){
			
			$(document).on('click', '#btn', function(){
				
				let urlV = 'ajax_weathergokr_rss.xml';
				let dtV = "xml";
				$.ajax({
					url: urlV,
					dataType: dtV,
					
					success: function(data){
						
						var $data = $(data).find("data");
						
						if ($data.length > 0) {
							var dataTable = $("<table border='1' />");
							
							dataTable.append(
									$("<tr>"),
									$("<th width=200>날짜</th>"),
									$("<th width=100>일기예보</th>"),
									$("<th width=100>최저기온</th>"),
									$("<th width=100>최고기온</th>"),
									$("</tr>"));
														
							$.each($data, function(i, item){
								
								var $tmEf 		= $(item).find("tmEf").text();
								var $wf = $(item).find("wf").text();
								var $tmn = $(item).find("tmn").text();
								var $tmx 	= $(item).find("tmx").text();
								
								var row = $("<tr />").append(
															  $('<td />').text($tmEf),
															  $('<td />').text($wf),
															  $('<td />').text($tmn),
															  $('<td />').text($tmx)
															);
								dataTable.append(row);
								
								if (i == 12){ // 서울 데이터 개수
									return false;
								}
							});
							
							$('.wrap').append(dataTable);
						}
					}
				});
			});
		});
		
	</script>
</head>
<body>
	<h3>서울 : 최저/최고기온(C) 가져오기</h3>
	<hr>
	<button type="button" id="btn">xml 데이터</button>
	<div class="wrap"></div>
</body>
</html>

6교시 (15:30-16:20)

  • Spring
    스프링
    ==============

    스프링 사이트 
    https://spring.io/tools

    Spring Framework 
    https://repo.spring.io/release/org/springframework/spring/

    STS 플러그인
    http://dist.springsource.com/snapshot/STS/nightly-distributions.html


    스프링은 2004년에 출시
    ----------------------------
    J2EE (EJB : Enterprise Java Beans) 엄청 기술적으로 훌륭한 제품
    이기종 플랫폼에서 데이터를 통신하는 것
    이기종 플랫폼 : NT(윈도우) <--> UNIX <--> 기간계(메인프레임)
     C, C++      C, C++, JAVA, COBOL

    J2EE 기술 : 매우 복잡하고 어렵다. <-- 자바에서 겨울이라고 표현한다.

    Web Service 기술로 대체가 될 것이다 . : RESTful Web Service. SOAP

    Spring : 봄
    한국 2010년 즈음에 자리매김 공공중심
    2015년부터 한국 IT 겉으로 장악하기 시작하고
    현재는 한국 IT == Spring : 전자정부프레임워크


    우리가 쓸 스프링 개발 환경
    ---------------------
    1. jdk 1.8
    2. was : apache-tomcat 8.5
    3. ide : 이클립스 : eclipse2020-6(4.16)
    4. 이클립스 STS 플러그인 : Spring Tools 3(Standalone Edition) 3.9.14.RELEASE
    5. COntext : Dynamic Web Project
    6. Spring API (library) : 3.2.9(공부), 4.3.16(프로젝트)
    7. 스프링 환경 설정 파일
    Context/WEB-INF/web.xml
    Context/WEB-INF/spring-servlet.xml

7교시 (16:30-17:20)

  • Spring
    스프링을 개발할 수 있는 환경
    ---------------------
    1. spring.io : STS : 이클립스에 STS 플러그인이 되어 있음 : 엄청 무거움
    2. STS BOOT : 라이브러리를 손쉽게 다운받는다.
    3. 이클립스 + STS 플러그인 개발자가 직접 하는 것 <-- 이것으로 한다.

    4. 빌드 프레임워크 (소스를 컴파일하고 실행하는 것)
    Dynamic Web Proeject + 환경설정 파일
    Maven : pom.xml(의존성 파일, 라이브러리 자동으로 다운로드) + ant 기반 + 환경 설정 파일
    Gradle : Groovy(자바와 같은 언어 : {key:value}) + 환경설정 파일

    이클립스에서 tomcat 서버를 실행하는 순서
    ------------------------------
    이클립스
    ---------

    Servers : 이클립스에서 선언된 모든 Context에 적용이 되는 파일들
    context.xml
    <Resource name="jdbc/jndi_orclKSY00"
    server.xml
    <Connector URIEncoding="UTF-8" port="8088"
    <Context docBase="KosMember" path="/KosMember"
    web.xml
    <session-timeout>30</session-timeout>
    MIME Type Mappings

    Context : 독립적인 도메인
    WebContent
    jsp
    test.jsp
    META-INF
    WEB-INF
    web.xml : 이 컨텍스트에만 적용되는 내용들이다.
    <welcome-file>index.html</welcome-file>
    <servlet-class>a.b.c.test.servlet.Web_xmlServlet</servlet-class>
    <url-pattern>*.ksy</url-pattern>
    <param-value>/WEB-INF/classes/log4j.xml</param-value>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <session-timeout>30</session-timeout>

    브라우저에서 test.jsp 파일을 요청하면
    서버에서
    server.xml 읽고
    web.xml 읽고
    context.xml 읽고
    Context/WEB-INF/web.xml 읽고
    test.jsp 파일을 찾아간다.
    test_jsp.java
    test_jsp.class
    결과를 만드면
    이것을 클라이언트에게 전송을 한다.

8교시 (17:30-18:30)

  • 환경세팅
    개발 환경 세팅하기 (220321 강의노트 참조)
    -----------------------------
    1. 이클립스 워크스페이스 만들기
    C:\00.KOSMO108\30.Web\eclipse_spring
    C:\00.KOSMO108\30.Web\eclipse_spring_work

    2. 인코딩 UTF-8

    3. 이클립스 워크스페이스를 만들면
    C:\Program Files\Java\jdk1.8.0_261 설치되어 있는 jdk가
    자동으로 플러그인 된다.
    자동으로 안되면 직접 수동 세팅해도 됨

    4. tomcat 8.5 이클립스에 플러그인 하기
    이클립스 -> Window -> Preferences
    Server -> Runtime Environment
    Server Runtime Environment 창에서
    Apache Tomcat v8.5 선택하고 Next 버튼 누르기
    Tomcat Server 창에서 Browser 버튼을 눌러서
    Tomcat installation directory 텍스트 필드에
    C:\Program Files\Apache Software Foundation\Tomcat 8.5 세팅하기
    JRE:
    jdk1.8.0_202 선택하고 Finish 버튼 누르기
    Project Explorer에 Servers 폴더가 생겨야 한다.

    5. STS 플러그인 하기
    Marketplace에서 플러그인 하기
    이클립스 메뉴에서 Help 누르기
    Eclipse Marketplace.. 누르기
    Eclipse Marketplace 창에서
    Find 텍스트필드 : sts 키인하고 Go 버튼 누르기
    검색된 sts 플러그인 중에서
    Spring Tools 3(Standalone Edition) 3.9.14.RELEASE
    에 있는 install 버튼 누르기
    Confirm Selected Features 창에서 Confirm 버튼 누르기
    파일 다운로드 하나라 시간이 걸린다
    다운로드가 다 되면
    Riview License 창이 뜬다.
    I accpet the terms of the license agreements
    래디오 버튼 체크하면 Finish 버튼이 활성화됨
    Finish 버튼 누르기
    이클립스에 파일 다운로드하면서 설치 작업을 오래 한다.
    중간에 팝업이 뜨면 OK하고 이클립스가 재시작한다.

    현재는 하지 않음
    -------------
    Marketplace 대신 다른 곳에서 플러그인하기
    Install New Software .... 플로그인 하기
    http://dist.springsource.com/snapshot/STS/nightly-distributions.html


    6. 스프링 프로젝트 생성하기
    스프링 프로젝트 이름 : testSpring
    File -> New -> Dynamic Web Project 선택하기
    Dynamic Web Project 창 Project name : testSpring 입력하고 Next 버튼 클릭
    Java 창 아래에 있는 Default output folder 아래 텍스트 필드에서
    build/classes --> WebContent\WEB-INF\classes 변경하고 Next 버튼 클릭하기
    -- testSpring\WebContent\WEB-INF\classes
    Web Module 창에서
    Generate web.xml deployment descripter 체크박스 체크하고 Finish 버튼 누르기
    Project Explorer에
    testSpring 프로젝트가 생성된다.
    testSpring 프로젝트에 마우스로 우클릭하면
    아래에 Spring 메뉴 아이템이 보인다.
    Spring 메뉴 아이템에 마우스를 롤오버해서 Add Spring Project Nature 클릭하면
    testSpring 프로젝트 폴더에 파란색 S 이미지가 보인다.

    7. 스프링 라이브러리 포팅하기 spring 3.2.9 버전 : 21개의 POJO 라이브러리가 있다.
    POJO : Pure Old Java Object : 순수하게 자바 객체로만 만들었다.

    C:\00.KOSMO108\90.Download\spring\spring-framework-3.2.9.RELEASE\libs>del *javadoc.jar
    C:\00.KOSMO108\90.Download\spring\spring-framework-3.2.9.RELEASE\libs>del *sources.jar

    Context/WEBINF/lib/21개 POJO 라이브러리 Copy하기

    8. POJO 라이브러리 사용

    Spring API 3.2.9 포보 라이브러리 21개

    beans.jar : spring-beans-3.2.9.RELEASE.jar
    클래스 인스턴스 하는 기능
    스프링 프레임워크에서는
    클래스를 컴포넌트, 빈즈(콩, 자바에서는 컴포넌트 개념으로 사용)라고 부른다.

    context.jar : spring-context-3.2.9.RELEASE.jar
    클래스 위치를 찾아가는 기능

    core.jar : spring-core.3.2.9.RELEASE.jar
    스프링 프레임워크 기본 엔진(컨테이너)
    IoC, DI를 한다.

    webmvc.jar : spring-webmvc-3.2.9.RELEASE.jar
    스프링 웹 MVC

Notes


 

728x90