SAX 파싱 (Simple API for XML)

SAX 파싱

파싱법은 4가지가 있다. 삭스, 돔, 마샬, 언마샬.

그 중 첫번째가 SAX 파싱이다. 삭스는 한 줄씩 읽어오는 파싱이다.

 

 

x.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<rt rr=”처음”>
     <a a1=”일” a2=”이” a3=”삼”></a>
     <b b1=”하나” b2=”두울” b3=”세엣”></b>
</rt>

 

 

MainClass.java

package sax;

import java.io.File;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;

public class MainClass {
 
      public static void main(String[] args) {
  
          try{
                 SAXParserFactory spf=SAXParserFactory.newInstance(); //”삭스 파서 팩토리” 객체생성
                 SAXParser sp=spf.newSAXParser(); //”삭스 파서” 생성
                 Dhandler handler=new Dhandler(); //”D핸들러”를 new로 메모리 할당 (※디폴트 핸들러를 상속받은 핸들러임)
                 sp.parse(new File(“.\\src\\x.xml”), handler); //(1)파일 경로의 xml을 (2)핸들러 로 파싱.
          }
          catch(Exception ex){System.out.println(ex.getMessage());}
      }

}

 

Dhandler.java

package sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

 

public class Dhandler extends DefaultHandler {
      @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
               System.out.print(“한 줄 읽기! “);
               System.out.print(“큐네임 “+qName+” : “);

               try{
                  if(qName.equals(“rt”)){
                        System.out.print(attributes.getValue(“rr”));
                  }
   
                  if(qName.equals(“a”)){
                        System.out.print(attributes.getValue(“a1”));
                        System.out.print(attributes.getValue(“a2”));
                        System.out.print(attributes.getValue(“a3”));
                  }
    
                   if(qName.equals(“b”)){
                         System.out.print(attributes.getValue(“b1”));
                         System.out.print(attributes.getValue(“b2”));
                         System.out.print(attributes.getValue(“b3”));
                   }
                }catch(Exception ex){System.out.println(ex.getMessage());}

                System.out.println(”          !한 줄 끝”);
           }
}

 

startElement는 메소드는 Element가 하나 발견될 때마다 실행된다.

 

결과는 아래와 같이 나온다.

 

한 줄 읽기! 큐네임 rt : 처음          !한 줄 끝
한 줄 읽기! 큐네임 a : 일이삼          !한 줄 끝
한 줄 읽기! 큐네임 b : 하나두울세엣          !한 줄 끝

 

 

 

dtd 만들기/dtd 만들고 가져다 쓰기

dtd 만들기/dtd 만들고 가져다 쓰기

 

DTD는 Document Type Definition(문서타입 정의)의 약자로 XML 문서 구조를 정의한다.

다음과 같이 DTD 파일을 만든다.

a.dtd

<?xml version=”1.0″ encoding=”UTF-8″?>
<!ELEMENT member (list+)>
<!ELEMENT list (name,addr,tel)>
<!ATTLIST list id ID #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT hp (#PCDATA)>

 

이어서 xml 파일을 만든다.

member.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE member SYSTEM “a.dtd”>

 

위와 같이 도큐먼트 타입을 쓰면 ‘이클립스’ 상에서 Ctrl+Space 로 엘리먼트들을 불러다 쓸 수 있다.

 

ex)

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE member SYSTEM “a.dtd”>

<member>
     <list id=”a1″>
          <name></name>

          <addr></addr>
          <tel></tel>
     </list>
</member>

 

CSS와 HTML의 분리

CSS와 HTML의 분리

 

아시다시피 html의 <head> 안에는 3가지가 들어간다. 첫째, 스타일. 둘째, 스크립트, 셋째, 타이틀.

다시 말해서,

<!doctype html>

 <head>

 <style>

 table{font-size:12px;}

 </style>

 

 <script type=”text/javascript”>

 function a(){alert(“하하”);}

 </script>

 <title>타이틀</title>

 </head>

 <body>

 </body>

</html>

 

이런식으로 쓰기 마련이다.

 

중요한 점은 이러한 html 파일 1개를 파일 3개로 나눌 수 있다.

 

html 파일

<!doctype html>
     <head>
          <link rel=”stylesheet” href=”c.css”>
          <script src=”j.js” type=”text/javascript”></script>
     </head>

     <body>

 

     </body>
</html>

 

c.css 파일

table{font-size:12px;}

 

j.js 파일

function a(){alert(“하하”);}

 

위와 같이 나눠서 쓰면 편리하다.

스프링 구조 그림학습

스프링 구조 그림학습

 

 

 

 

xml=트리 그림학습

xml=트리 그림학습

 

위 계층구조에서 Sawon은 테이블, List는 로우, Sabun은 컬럼(필드)에 해당된다.

MVC 직접제작 02

MVC 직접제작 02

 

이것이 스프링을 배우기 위한 초석이 된다.

 

작성 순서는 모델 -> 컨트롤러 -> 뷰 순이다.

web.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://java.sun.com/xml/ns/javaee” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd” id=”WebApp_ID” version=”3.0″>
  <display-name>MVCProject</display-name>

  <servlet>
      <servlet-name>mvc</servlet-name>
      <servlet-class>com.controller.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
      <servlet-name>mvc</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  

  <welcome-file-list>
      <welcome-file>index.html</welcome-file>
      <welcome-file>index.htm</welcome-file>
      <welcome-file>index.jsp</welcome-file>
      <welcome-file>default.html</welcome-file>
      <welcome-file>default.htm</welcome-file>
      <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

web.xml에 (1)서블릿과 (2)서블릿-매핑을 추가한다.

(1) 서블릿에는 디스패처서블릿을 등록해준다. 디스패처서블릿은 컨트롤러를 연결한다. 

서블릿-매핑은 확장자를 준다. 나중에 파일명을 쉽게 자를 수 있다. 예를 들어서, 주소가 localhost/…/list.do 면 list를 키로 넘겨주고 키값(모델)을 쉽게 가져올 수 있다. 서블릿-매핑은 .do파일을 부르면 호출한다.

 

1. 모델 만들기

com.model 패키지에 만든다.

Model.java

우선 인터페이스를 만들어둔다. 인터페이스는 일종의 추상클래스이다. Model 인터페이스를 만들고, 다른 모델들에 임플리먼츠(구현)할 수 있다.

package com.model;

import javax.servlet.http.HttpServletRequest;

public interface Model {
      public String handlerRequest(HttpServletRequest req)
      throws Exception;
}

 

ListModel.java

package com.model;

import javax.servlet.http.HttpServletRequest;

public class ListModel implements Model{

     @Override
     public String handlerRequest(HttpServletRequest req) throws Exception {
         // TODO Auto-generated method stub
         String str=”리스트모델(Model)에서 jsp로 보냅니다”;
       req.setAttribute(“msg”, str);

         return “view/list.jsp”;//’에이치티티피 서블렛 리퀘스트(req)’에 값을 실어서 list.jsp라는 스트링을 반환한다.
      }

}

 

바로 위에 만든 인터페이스 ‘모델’을 임플리먼츠(구현)하고, “핸들러 리퀘스트”를 오버라이딩한다.

핸들러 리퀘스트는 말 그대로 리퀘스트를 다룬다. 자세히 말하면, (1)”HTTP서블렛리퀘스트”의 어트리뷰트를 채워넣고, (2)결과가 출력될 jsp를 던져준다.

“핸들러 리퀘스트”의 매개변수는 ‘HTTP서블렛 리퀘스트’다. 이 ‘HTTP서블렛 리퀘스트’에 “msg”라는 이름으로 스트링을 싣는다.

 

이때, “핸들러 리퀘스트”의 반환형은 String이다. jsp파일의 경로를 적으면, 경로가 스트링값으로 반환될 것이다. 

ContentModel.java

package com.model;

import javax.servlet.http.HttpServletRequest;

public class ContentModel implements Model{

     @Override
     public String handlerRequest(HttpServletRequest req) throws Exception {
          // TODO Auto-generated method stub
          String msg=”ContentModel에서 content.jsp로 보냅니다”;
          req.setAttribute(“msg”, msg);
      return “view/content.jsp”;//req라는 리퀘스트를 뷰가 있는곳의 list.jsp로 값을 보낸다
      }

}

 

위의 ListModel.java와 동일하게 이해하면 된다. 동일하게 돌아간다.

 

2. 컨트롤러 만들기

com.controller 패키지에 만든다.

 

DispatcherServlet.java

package com.controller;

 

import java.io.*; //출력을 위한 것
import java.util.HashMap; //맵
import java.util.Map; //맵

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.model.*;

 

public class DispatcherServlet extends HttpServlet {
     // <선언부>

     // 버젼 선언​

     private static final long serialVersionUID = 1L;
     

     // 배열 선언
     private String[] strCmd={“list”,”content”}; //id의 배열
     private String[] strCls={“com.model.ListModel”,”com.model.ContentModel”}; //모델: 클래스의 배열
     private String[] strJsp={“view/list.jsp”,”view/content.jsp”}; //뷰: jsp의 배열
                   // 보통은 배열로 선언하지 않고, 맵에다 뿌린다.

                   //​  예를 들어 ?cmd=list 라고 사용자가 요청했다면 아래와 같이  매칭.
                   // <bean id=”list” class=”com.model.ListModel” jsp=”view/list.jsp”/>식으로 갯수만큼 써서
                   // 맵에다 넣어놨다가 뿌려주면 빠르고 간편하다.

    

     // 맵 선언
     private Map clsMap=new HashMap(); //모델(클래스)을 담는 맵
     private Map jspMap=new HashMap(); //뷰(jsp)를 담는 맵

     public void init(ServletConfig config) throws ServletException {
     // 이유는 모르겠지만 생성자 대신 init을 쓴다.

     // 객체가 만들어지자마자 모델과 뷰를 맵에 담는다.

          try{
               for(int i=0;i<strCmd.length;i++){
                    Class clsName=Class.forName(strCls[i]); //클래스를 메모리 할당

                                                                                //strCls={“com.model.ListModel”,”com.model.ContentModel”}; 
                    Object obj=clsName.newInstance(); //객체를 생성
                    clsMap.put(strCmd[i], obj); //커맨드 이름(키)에 오브젝트(키값) 대입 //id를 키로 class를 맵에 담기
                    jspMap.put(strCmd[i], strJsp[i]);    //id를 키로 jsp를 맵에 담기
                    System.out.println(strCmd[i]+”===”+obj+”===”+strJsp[i]);
                    //strCmd[i]:클라이언트의 요청값 === 오브젝트 === jsp파일 
               }
          }catch(Exception ex){System.out.println(ex.getMessage());}
     }

 

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doProcess(request, response);
     }

 

     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doProcess(request, response);
     }
 
     protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          try{
               // 클라이언트가 뭘 요청했는지 알아낸다(요청값=cmd). 주소를 통해 알 수 있다.
               String cmd=request.getRequestURI();  // URI는   /MVCProject/list.do ​이다.
                                                                    //            ContextPath() 는 /MVCProject 이고,
                                                                    //            ContextPath().lengh()+1 은 /MVCProject/ 까지이다.
               cmd=cmd.substring(request.getContextPath().length()+1,cmd.lastIndexOf(“.”));

               // 서브스트링으로 자른다. 자르면, cmd 변수 에는 “list” 라는 단어 하나가 들어온다.
               Model model=(Model)clsMap.get(cmd);
               // 모델을 모아둔 클래스 맵(clsMap)을 이용해서 모델을 선언한다.
               String jsp=model.handlerRequest(request); //핸들러 리퀘스트가 반환하는 “list.jsp”라는 스트링을 저장한다.
               RequestDispatcher rd=request.getRequestDispatcher(jsp); //리퀘스트 디스패처에 jsp를 담는다.
               rd.forward(request, response);

          }catch(Exception ex){ System.out.println(ex.getMessage()); }
     }
}

 

 

3. 뷰 만들기

List.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR” pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd“>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>

<body>
         <center>${msg}</center>
</body>
</html>

 

볼 것도 없다. 그냥 표현식으로 msg 변수를 뿌려주면 된다. 달러와 중괄호 ${    } 를 표현식이라고 한다.

 

Content.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR” pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd“>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>

<body>
         <center>${msg}</center>
</body>
</html>

 

위와 똑같다.

 

빅데이터 DB

빅데이터 DB

몽고DB, MariaDB, TokuDB, 멤캐시드(Memcached), 카산드라(Cassandra)

WAS서버

WAS서버

-미들웨어(서버와 서버 사이)

– 웹노직, 웹스피어, 제우스, 톰캣

마이바티스 기초 코딩하기

마이바티스 기초 코딩하기

마이바티스로 emp테이블의 정보를 간단히 뿌려본다.

우선 아래와 같이 폴더를 구성한다.

1. Config.xml

Config.xml은 GetConnection과 DIsConnection을 대체시켜준다.

environment는 항상 동일해서, 복사-붙여넣기를 활용할 수 있다.

설명> config.xml은 configuration 태그로 묶여있다.

configuration 태그는 3 가지로 나뉜다.

1. typeAliases: VO를 등록한다. 여기서는 Emp라는 별칭을 줬다.

2. environments: 오라클 환경설정을 하는 부분이다.

    2-1. 트랜잭션매니저 타입: JDBC. 트랜잭션은 COMMIT에서 ROLLBACK까지의 한 단위를 말한다.

    2-2. 데이터 소스 : 커넥션 풀 관련. 데이터에 대한 모든 정보를 갖고 있는 곳이다.

                              커넥션 풀을 쓰려면 POOLED, 우리가 커넥션을 만들려면 UNPOOLED라고 써야 한다.

3. mappers: 매퍼는 sql문장을 모아서 넘겨주는 부분이다. 프리페어 스테이트먼트(ps)를 설정한다고 보면 된다.    

2. EmpVO.java (O)
밸류 오브젝트. 값만 저장해둔다. 기존의 DTO와 똑같다. 원하는 변수들을 선언해놓고, 게터세터를 주면 된다.

3. EmpDAO.java★★★

설명>

(1) 리더가 Config.xml 을 읽어온다.

(2) ssf(sql세션 팩토리)에 리더를 메모리 할당하면, 이제 값을 읽어올 수 있다.

(3) ssf(sql 세션 팩토리)의 열려있는 세션(openSession)에 대해서 셀렉트문을 날릴 수 있다.

셀렉트는 여러 개를 가져오는 selectList 와, 한 개를 가져오는 selectOne으로 나뉜다.

4. emp-mapper.xml ★★

매퍼xml은 SQL 문장을 담아두는 곳이다.

나중에 어노테이션을 배우면 xml을 쓰지 않고, 자바 단에서 sql을 넣을 수 있다.

5. list.jsp (O) 

리스트에 받아와서 뿌린다. 기존의 방법과 똑같다.

다른 점은, 어레이 리스트가 아닌 리스트로 받아온다는 점이다.

 

xml 문법사항

xml 문법사항

마크업 랭귀지(ml)

<>로 묶는 언어

용도

문서나 데이터 저장용

호환성

서로 다른 종의 운영체제에 호환성이 높다.

사용자 정의 태그

지정된 태그를 사용하는 것이 아니다.

태그를 만드는 문법

1) 알파벳이나 한글 시작(단, 알파벳은 대소문자 구분)

2) 숫자는 사용 가능(단, 앞에 사용 금지)

3) 특수문자 (  _   –  .  )

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

4) 예약어는 사용 금지 (딱 하나 있음. xml)

5) 최상위 태그는 반드시 한 개만 존재

     <a>

        <b></b>

        <c></c>

     </a>

포함관계가 명확해야 한다. (계층구조(하이어라키)를 명확히 해야한다)

6) 태그의 종류

여는 태그 <a>

닫는 태그 </a>

단독 태그 <a/>  (열고 닫는게 동시에 됨)

7) 태그에 공백이 있으면 안된다: < a >는 없다. <a>로 붙여써야.

8) 속성 <a href=””> 반드시 따옴표””를 써야 한다.

<name>데이터</name> column과 같다.

특징

XML은 파일형 데이터베이스이다.

XML은 반정형 데이터다.

XML은 태그+속성 이다.

XML에서 값 가져오기

우리는 XML에서 값을 가져올 수 있다.

(1)여는 태그와 닫는 태그 사이의 값을 가져올 수 도 있고, (2)속성을 가져올 수도 있다.

태그 정의하기(DTD만들기)


<!ATTLIST 태그명/속성명 타입 옵션>

<a href=””>

<!ATTLIST a href CDATA #REQUIRED

                          타입       옵션


■ 태그명/속성명

+ : +는 반드시 한 번 이상 사용하며, 여러번 쓸 수 있다.

        ex) <!ELEMENT sawon (list+)>

                  list+ 를 주면 반드시 한 번 써야 한다.

         

* : 별*은 여러 번 쓸 수도 있고, 한 번도 안 써도 된다.

​? : 한 번 사용하거나, 사용하지 않아도 된다.  ex) table의 caption 태그. (표에서 한 번만 사용할 수 있는 타이틀용 태그임)

| : 여러 개 중 한 개 선택. or와 같다.

​        ex) <!ELEMENT list (sabun,name,addr?,hp|tel)>


default : 반드시 한 번만 사용

        ex) <!ELEMENT sawon (list)>

               ‘사원’ 안에는 ‘리스트’가 있다는 뜻


■ 타입

CDATA

CDATA는 character data의 약자다. 공백을 포함해서 들어가는 문자를 쓸 수 있다.

ID

중복값을 허용하지 않는다 (ID #REQUIRED는 프라이머리 키와 같다)

IDREF , IDREFS

포린 키와 같다. IDREF는 한 개, IDREFS는 여러 개를 참조.

NOTATION  

DTD의 단점: 모두 문자열이다(숫자형이 없다), 예를 들면 전화번호나 형식을 지정할 수가 없다. 이를 보완한 파일이 스키마이다. (스프링에서 자주 쓰인다)


■ 옵션

1. 리콰이어드 (#REQUIRED)
낫 널 (NOT NULL널이 들어가선 안된다. 예를 들면 xml의 버젼. ex: <?xml version=”1.0“?>)


2. 임플리드 (#IMPLIED)

널값이 들어가도 된다. 써도 되고, 안써도 된다. 예를 들면 xml의 인코딩. 한국인이 필요해서 쓰는 것이다. <?xml version=”1.0″ encoding=”UTF-8″?>)

3. 픽시드 (#FIXED)

고정값.  #FIXED “aaa”;  (오라클의 디폴트와 같다)

DTD 가져다 쓰기

DTD(document type definition)는 xml문서의 타입을 정의하는 문서이다.

우리가 아는 DTD 파일은 loose.dtd가 있다.

dtd 파일이 없으면 마이바티스에 필요한 xml을 다 외워써야 한다.

dtd 파일을 갖다놓으면 xml 태그를 ctrl+space로 불러낼 수 있다.

ex) 마이바티스 DTD 가져다 쓰기

<?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> 

마이바티스 시작하기

마이바티스 시작하기

마이바티스 개요

마이바티스는

1. xml에 서버 정보(오라클 드라이버, 주소, 아이디, 비번..) 을 써놓고

2. xml에 sql구문을 넣고

3. 반환값을 담을 그릇(VO=DTO)를 써주면 에러없이 DAO를 구현할 수 있다.

즉, xml이 핵심이다.

명령어★★★

selectlist: 어레이리스트(복수의 VO) 넘겨줌
selectone: VO 하나 넘겨줌

insert
update
delete

어노테이션

기존에는 xml, 자바, xml, 자바… 를 오가면서 코딩해야한다. 이것이 불편하기 때문에 자바 단에서만 코딩하기 위한 어노테이션이 생겼다.

골뱅이 셀렉트(@select) 쓰면 자바 단에서만 SQL문을 조절할 수 있다.

마이바티스(mybatis) 준비하기

1. 마이바티스 블로그에 접속한다.

http://blog.mybatis.org/

2. mybatis-3.2.8 다운받는다 (mybatis-3.2.8.zip, 3.01MB)

3. lib 폴더 안의 jar파일들과, mybatis-3.2.8.jar 파일을 모두 복사한다. (jar파일들을 복사)

 

4. 원하는 프로젝트의 WEB-INF 폴더 내의 lib 폴더에 모아놓는다.


5. standard.jar와 jstl.jar 도 구해서 넣는다.

관련링크:

http://blog.naver.com/bb_/220322577782

작은 윈도우 띄우기

작은 윈도우 띄우기

<script type=”text/javascript”>
function postfind()
{
 window.open(“post.jsp”,”post”,”width=470,height=450,scrollbars=yes”); 
}

</script>

MVC 직접제작 01

MVC 직접제작 01

1. 다이나믹 웹 프로젝트를 새로 만든다.

이때, Generate web.xml deployment descriptor 를 체크한다.

 

2. jstl.jar와 standard.jar를 WEB-INF의 lib 폴더에 붙여넣는다.


3. Java Resources의 src에 컨트롤러와 모델이라는 패키지를 만들고, WebContent 폴더에 view라는 폴더를 만든다.

 

4. MVC 구조

MVC의 과정

(1) 사용자가 요청한다.

(2) 요청분석(클래스를 찾아온다)

(3) 사용자의 요청 ‘결과를 request 또는 session’에 저장한다.

(4) 뷰로 ‘포워딩 또는 리다이렉트’ 해준다.

요약하자면, 사용자 요청 분석해서, 클래스를 찾고, 갖고있는 메소드를 구해서, 결과값을 리퀘스트에 묶고, 포워드하면 된다는 이야기다.

‘프로퍼티스’를 xml로 대체해서 직접 MVC를 만들어보자.

(5) 아래와 같이 파일을 만들어둔다.

‘컨트롤러’는 ‘서블릿’

‘모델’은 ‘자바빈’ (자바파일)

‘뷰’는 ‘jsp’ (사용자는 모바일이나 퍼스널 컴퓨터가 있으면 됨)를 사용하면 된다.

cf) 서블릿은 보안이 뛰어나다. jsp는 보안성이 떨어진다.

파일 업로드/다운로드와 파일 삭제

파일 업로드/다운로드와 파일 삭제

파일 업로드

http://blog.naver.com/bb_/220323686927

다운로드 링크거는 부분

<jsp:useBean id=”dao” class=”com.databoard.dao.DataBoardDAO”/>
<%
 String strNo=request.getParameter(“bno”);
 String strPage=request.getParameter(“page”);
 
 DataBoardDTO d=dao.boardContentData(Integer.parseInt(strNo));

   .

(중략)

   .

   .

<a href=”../databoard/download.jsp?fn=<%=d.getFilename()%>”><%=d.getFilename()%></a>(<%=d.getFilesize() %>Bytes)

파일 다운로드

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%@ page import=”java.io.*”%>
<%@ page import=”java.net.*”%>
<%
 String fn=request.getParameter(“fn”);
 String path=”c:\\download\\”;
 File file=new File(path+fn);
 //셋 헤더
 response.setHeader(“Content-Disposition”, “attachment;filename=”+URLEncoder.encode(fn,”UTF-8”));
                 //fn을 보내는데 UTF-8로 보낸다
                 //euc-kr은 불가능하다
 response.setContentLength((int)file.length());
 
 BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
 BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream());
                                                   //접속한 클라이언트의 영역
 
    byte[] buffer=new byte[1024];//한번 읽을때마다 1024씩
 int i=0;
    while((i=bis.read(buffer,0,1024))!=-1){
     //-1이 EOF.
     bos.write(buffer,0,i);
    }
    bis.close();
    bos.close();
    out.clear();
    out=pageContext.pushBody();//out객체를 다시 가져온다
%>

파일 삭제

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR” import=”com.databoard.dao.*”%>
<%@ page import=”java.io.*” %>
<jsp:useBean id=”dao” class=”com.databoard.dao.DataBoardDAO”/>
<%
 String strNo=request.getParameter(“no”);
 String strPage=request.getParameter(“page”);
 String pwd=request.getParameter(“pwd”);
 //DB 연동
 String fn=dao.databoardGetFileName(Integer.parseInt(strNo));
 boolean bCheck=dao.databoardDelete(Integer.parseInt(strNo), pwd);
 
 if(bCheck==true){
  //파일 삭제
  File file=new File(“c:\\download\\”+fn);
  file.delete();
  
  //이동
  response.sendRedirect(“../main/main.jsp?no=7&page=”+strPage);
  
 }else{
 %>
  <script>
  alert(“비밀번호가 틀립니다”);
  history.back();
  </script>
 <%
 }
%>

관련 DAO
 //삭제
 public boolean databoardDelete(int no,String pwd){
  boolean bCheck=false;
  try{
   getConnection();
   String sql=”SELECT pwd FROM databoard WHERE no=?”;
   ps=conn.prepareStatement(sql);
   ps.setInt(1, no);
   ResultSet rs=ps.executeQuery();
   rs.next();
   String db_pwd=rs.getString(1);
   rs.close();
   ps.close();
   
   if(db_pwd.equals(pwd)){
    bCheck=true;
    sql=”DELETE FROM databoard WHERE no=?”;
    ps=conn.prepareStatement(sql);
    ps.setInt(1, no);
    ps.executeUpdate();//삭제
    ps.close();
   }
   else
   {
    bCheck=false;
   }
  }
  catch(Exception ex){System.out.println(ex.getMessage());}
  finally{
   disConnection();
  }
  return bCheck;
  
 }
 public String databoardGetFileName(int no){
  String result=””;
  try{
   getConnection();
   String sql=”SELECT COUNT(filename) FROM databoard WHERE no=?”;//파일 올렸었는지 안올렸었는지 확인
   ps=conn.prepareStatement(sql);
   ps.setInt(1, no);
   ResultSet rs=ps.executeQuery();
   rs.next();
   int count=rs.getInt(1);
   rs.close();
   ps.close();
   if(count==0){
    //파일이 있다면
    result=”NOFILE”;
   }
   else{
    //파일이 없다면
    sql=”SELECT filename FROM databoard WHERE no=?”;
    ps=conn.prepareStatement(sql);
    ps.setInt(1, no);
    rs=ps.executeQuery();
    rs.next();
    result=rs.getString(1);
    rs.close();
   }
   
   
  }catch(Exception ex){}
  finally{
   disConnection(); 
  }
  return result;
 }

MVC패턴 그림학습

MVC패턴 그림학습

 

jsp 표현언어(EL)

jsp 표현언어(EL)

참고 JSP액션태그: http://blog.naver.com/bb_/220322509021

<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core“%>
표현언어(EL)

1. $()

<%=%> 은 ${} 으로 대체

점(.)은 get을 의미한다.

ex) <%=dto.getName()} 은 ${dto.name} 으로 대체

${“10″+1} 은 11이 된다. (문자는 자동으로 parseInt가 된다. 다시 말해, +(플러스)는 문자열 결합이 아니다.

${“일”+10}은 에러난다.

${null+1} 은 0 이다. (null 연산은 0 으로 취급한다)

${3/2}는 1.5다. 정수 나누기 정수는 실수가 될 수 있다. (오라클과 같다.)

2. <c:forEach>

for문은 <c:forEach>로 대체

3. <c:if>

if문은 <c:if>로 대체

EL이 제공하는 객체

1. requestScope


2. sessionScope

JSTL(자바 표준 태그 라이브러리)이 제공하는 태그의 종류

1. 코어

1-1.제어문

코어는 제어문을 제공한다.

(1) <c:if>

(2) <c:choose>

(3) <c:forEach>

1-2. 리다이렉트

샌드리다이렉트를 대체한다.

<c:redirect>

<c:redirect url=”url”>
 <c:param name=”이름” value=”값”/>
</c:redirect>

2. 국제화

날짜 형식 변화.

<fmt:formatDate>  자바의 ‘심플데이터포맷’과 같다.

JNDI와 커넥션풀, 커넥션풀 직접만들기

JNDI와 커넥션풀, 커넥션풀 직접만들기

JNDI: JNDI는 자바 네이밍 디렉토리 인터페이스(Java Naming and Directory Interface)의 약자이다. 한 서비스가 다른 서비스를 탐색할 때 유용하게 사용한다.

저장되는 공간이 폴더 형태로 되어있고, 각 객체가 폴더 내에 저장된다. “저장된 개체의 주소값을 넘겨달라”가 룩업이다.

쉽게 생각하면 탐색기라고 할 수 있다. Context 새 개체를 만들고, comp/env에 접근한 뒤, 그 안에서 지정한 이름(jdbc/oracle)의 데이터 소스를 얻어온다. 그리고 나서 겟 커넥션을 하면 된다.

그 전에는 연결->사용->해제 였으나, 이제는 연결->사용-> “반환”으로 바뀐다.(커넥션풀)


​커넥션풀 직접 만들기

여기서부터는 커넥션풀의 원리를 이해하기 위해 직접 만들어본다. 새로 만든 소스에 대한 설명은 노란색 표 안에 넣어두었다. 실제 커넥션풀 소스는 파란색 표 안에 넣어두었다.

(1) server.xml

서버에 대한 정보를 가지고 있는 xml파일. 오라클 드라이버 주소부터 커넥션풀 갯수까지 각종 서버정보를 기입해놓는다.

<?xml version=”1.0″ encoding=”UTF-8″?>
<context>
        <Resource
          name=”jdbc/oracle”
          type=”com.sist.DataSource”
          driverClassName=”oracle.jdbc.driver.OracleDriver”
          url=”jdbc:oracle:thin:@localhost:1521:ORCL”
          password=”tiger”
          username=”scott”
          maxActive=”10″
          maxIdle=”5″
          maxWait=”-1″
        />
</context>

 

 

설명>

server는 xml파일로 저장된다. 여기서 Resource는 테이블에 해당된다. name, type, driverClassName, url, password, username, maxActive, maxIdle, maxWait은 컬럼에 해당된다.

name은 “jdbc/oracle”

type 은 DataSource로 한다. 기존의 커넥션풀을 쓰려면 type=”javax.sql.DataSource” 을 써야 한다.

driverClassName 은 오라클 드라이버 이름을 넣는다.

url 은 오라클 드라이버 주소를 넣는다.

password는 오라클 패스워드

username은 오라클 아이디

maxActive는 커넥션 풀 최대갯수

maxIdle 커넥션 풀 유지갯수

maxWait -1이면 무한정 대기(1000이면 1초 대기)

 

 

원래 코드>

<Context docBase=”프로젝트이름” path=”/프로젝트이름” reloadable=”true” source=”org.eclipse.jst.jee.server:프로젝트이름”>
        <Resource
          name=”jdbc/oracle”
          type=”javax.sql.DataSource”
          auth=”Container”
          driverClassName=”oracle.jdbc.driver.OracleDriver”
          url=”jdbc:oracle:thin:@localhost:1521:ORCL”
          password=”tiger”
          username=”scott”
          maxActive=”10″
          maxIdle=”5″
          maxWait=”-1″
        />
</Context>

 

 

(2) DataSource.java

서버.xml의 정보를 실제로 저장해두는 영역. 일종의 DTO라고 생각하면 쉽다.

import java.sql.Connection;
import java.sql.DriverManager;

public class DataSource {
   private String driverClassName;
   private String url;
   private String username;
   private String password;
   private int maxActive;
   private int maxIdle;
   private int maxWait;

 

   //이 아래로는 게터세터
   public String getDriverClassName() {
      return driverClassName;
   }
   public void setDriverClassName(String driverClassName) {
      this.driverClassName = driverClassName;
   }
   public String getUrl() {
      return url;
   }
   public void setUrl(String url) {
      this.url = url;
   }
   public String getUsername() {
      return username;
   }
   public void setUsername(String username) {
      this.username = username;
   }
   public String getPassword() {
      return password;
   }
   public void setPassword(String password) {
      this.password = password;
   }
   public int getMaxActive() {
      return maxActive;
   }
   public void setMaxActive(int maxActive) {
      this.maxActive = maxActive;
   }
   public int getMaxIdle() {
      return maxIdle;
   }
   public void setMaxIdle(int maxIdle) {
      this.maxIdle = maxIdle;
   }
   public int getMaxWait() {
      return maxWait;
   }
   public void setMaxWait(int maxWait) {
      this.maxWait = maxWait;
   }
}

 

설명>

DataSource에는 커넥션에 필요한 기본적인 변수들을 넣어놓는다. 일단 필수적인 변수들로

   private String driverClassName;
   private String url;
   private String username;
   private String password;
   private int maxActive;
   private int maxIdle;
   private int maxWait;

을 선언한다.

그리고 게터/세터를 적용한다.

 

(3) MyHandler.java

마이 핸들러는 xml을 한 줄씩 읽어와 해시 맵에 저장하는 역할을 한다. 다시 말해, xml에서 get한 엘리먼트들을 데이터 소스에 넣어 맵으로 만드는 기능을 가졌다.

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.*;

public class MyHandler extends DefaultHandler {
   Map map=new HashMap();
   @Override
   public void startElement(String uri, String localName, String qName,
         Attributes attributes) throws SAXException {
      try {
         if(qName.equals(“Resource”))
         {
            String name=attributes.getValue(“name”);
            String type=attributes.getValue(“type”);
            String driver=attributes.getValue(“driverClassName”);
            String url=attributes.getValue(“url”);
            String pwd=attributes.getValue(“password”);
            String user=attributes.getValue(“username”);
            String ma=attributes.getValue(“maxActive”);
            String mi=attributes.getValue(“maxIdle”);
            String mw=attributes.getValue(“maxWait”);
           
            Class clsName=Class.forName(type);
            DataSource ds=(DataSource)clsName.newInstance();
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(user);
            ds.setPassword(pwd);
            ds.setMaxActive(Integer.parseInt(ma));
            ds.setMaxWait(Integer.parseInt(mw));
            ds.setMaxIdle(Integer.parseInt(mi));
            map.put(name, ds);
         }
      } catch (Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

설명>

(1)MyHandler는 DefaultHandler를 상속받는다. 그 후 해시 맵을 우선 선언한다.

public class MyHandler extends DefaultHandler {
   Map map=new HashMap();

 

(2) startElement를 오버라이딩한다. startElement는 xml에서 한 줄을 읽어오는 역할이다.

startElement는 한 줄이 시작하는 시점이다.

매개변수는 String uri, String localName, String qName, Attributes attributes가 있다.

uri는 파일경로명.

qName은 태그이름. 테이블에 해당하는 <>안의 단어이다.

Attributes는 속성명. 컬럼에 해당하는 <>안의 단어이다.
   @Override
   public void startElement(String uri, String localName, String qName,
         Attributes attributes) throws SAXException {
      try {

         //한 줄이 시작하는 시점에 큐네임(태그이름)이 Resource라면
         if(qName.equals(“Resource”))
         {

            //변수에 어트리뷰트(속성명)기억해둔다.
            String name=attributes.getValue(“name”);
            String type=attributes.getValue(“type”);
            String driver=attributes.getValue(“driverClassName”);
            String url=attributes.getValue(“url”);
            String pwd=attributes.getValue(“password”);
            String user=attributes.getValue(“username”);
            String ma=attributes.getValue(“maxActive”);
            String mi=attributes.getValue(“maxIdle”);
            String mw=attributes.getValue(“maxWait”);
           

            //데이터 소스를 선언하고, 데이터소스에 각 변수를 대입한다.

            //cf)데이터 소스를 선언할 때 type을 메모리 할당한 후 데이터소스로 변환해야 한다.**
            Class clsName=Class.forName(type); //**
            DataSource ds=(DataSource)clsName.newInstance(); //**
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(user);
            ds.setPassword(pwd);
            ds.setMaxActive(Integer.parseInt(ma));
            ds.setMaxWait(Integer.parseInt(mw));
            ds.setMaxIdle(Integer.parseInt(mi));
            map.put(name, ds); //맵에 ‘이름’을 ‘키’로, ‘데이터소스’를 ‘키 값’으로 넣는다. 해시 맵은 ‘키’로 ‘키 값’을 불러올 수 있다.
         }
      } catch (Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

 

 

(4) Context.java

컨텍스트 클래스는 마이핸들러로 맵을 선언한다. (앞서, 마이핸들러는 get한 엘리먼트들을 데이터소스에 넣어 맵으로 만드는 기능이었다) 컨텍스트 클래스의 lookup 메소드는 키 이름(ex: “jdbc/oracle”)를 넘기면 맵(Object)를 반환해준다.

import java.util.*;
import java.io.*;

import javax.xml.parsers.SAXParserFactory;

import com.sun.org.apache.xerces.internal.parsers.SAXParser;

public class Context {
   Map map=new HashMap();
   public Context(){
      try{
         SAXParserFactory spf=SAXParserFactory.newInstance();
         javax.xml.parsers.SAXParser sp=spf.newSAXParser();//SAXParser sp=spf.newSAXParser();
         MyHandler mh=new MyHandler();
         String path=”C:\\webDev2\\workspace\\JNDIProject\\src\\com\\sist\\server.xml”;
         sp.parse(new File(path),mh);
         map=mh.map;
      }catch(Exception ex){}
     
   }
   
public Object lookup(String name){
      return map.get(name);
   }
}

 

설명>

Context 클래스:
(1) 해시 맵을 선언한다.  Map map=new HashMap();

(2) 삭스 파서 팩토리(spf)를 선언 SAXParserFactory spf=SAXParserFactory.newInstance();
(3) 삭스 파서 팩토리로부터 삭스파서(sp)를 선언 javax.xml.parsers.SAXParser sp=spf.newSAXParser();//SAXParser sp=spf.newSAXParser();
(4) 마이 핸들러(mh) 메모리할당 MyHandler mh=new MyHandler();
(5) 삭스파서(sp)로 파스(parse)한다. 파스할 때 서버패스와 마이 핸들러가 필요하다. sp.parse(new File(path),mh);

     cf) String path=”C:\\webDev2\\workspace\\JNDIProject\\src\\com\\sist\\server.xml”;
(6) 마이 핸들러로 맵을 선언한다. map=mh.map;

설명>

lookup 메소드:

public object: 객체(Object)를 반환한다. 여기서 객체는 해쉬 맵이다.

return map.get(name): 해쉬맵의 키 값에 따른 키를 가져온다. 예를 들면 “jdbc/oracle” 이라는 이름(키)의 맵을 반환한다.

 
 

(5) MainClass

커메인 클래스는 직접 만드는 커넥션 풀에만 존재하고, 실제 커넥션 풀에는 존재하지 않는다.

실제 커넥션 풀에는 getConnection()이라는 이름의 메소드를 만들면 된다.

import java.sql.*;

public class MainClass {

 public static void main(String[] args) {
  try{
          Context c=new Context();
          DataSource ds=(DataSource)c.lookup(“jdbc/oracle”);
          Connection conn=ds.getConnection();
         
          System.out.println(ds.getUrl());
          System.out.println(ds.getDriverClassName());
          System.out.println(ds.getPassword());
          System.out.println(ds.getUsername());
  }
  catch(Exception ex){System.out.println(ex.getMessage());}
 }

}

설명>

(1) Context를 새로 선언한다.

(2) ‘데이터 소스’에 해시맵을 넣는다. ‘컨텍스트.룩업‘은 name에 대한 해시 맵을 반환해주는 메소드다.

(3) ‘데이터 소스.겟커넥션‘으로 연결한다.

 

 원래 소스> 

public void getConnection(){
    try{
     Context init=new InitialContext();//탐색기를 여는 것과 같음
     Context c=(Context)init.lookup(“java://comp/env”);//C드라이브에 접근하는것과 같음
     DataSource ds=(DataSource)c.lookup(“jdbc/oracle”);//그 안에서 파일 하나를 얻어온다.
     conn=ds.getConnection();
    }catch(Exception ex){System.out.println(ex.getMessage());}
 }

.
 

파일 업로드

파일 업로드

1. cos.jar 붙여넣기

2. 업로드 버튼이 있는 jsp의 수정

파일 업로드를 할 때는 enctype이 “multipart/form-data” 여야 한다.

따라서 업로드 버튼이 존재하는 jsp에서, form 태그 안에 enctype=”multipart/form-data”를 써넣어야 한다.

ex)

<form method=”post” action=”../databoard/databoard_insert_ok.jsp” name=”board_frm” enctype=”multipart/form-data”>

    <input type=”file” name=”fileobj“/>

</form>

만약 파일을 여러 개 업로드할 수 있게 하려면 multiple=”multiple”을 써넣는다. 또한 name 뒤에 대괄호를 넣어서 배열 처리한다.

<form method=”post” action=”../databoard/databoard_insert_ok.jsp” name=”board_frm” enctype=”multipart/form-data”>

    <input type=”file” multiple=”multiple” name=”fileobj[]”>

</form>

3. 파일이 실제 업로드되는 부분을 구현한 jsp

(databoardinsert_ok.jsp)

아래 소스는 파일을 원하는 폴더 안에 업로드시켜준다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%@ page import=”com.oreilly.servlet.*” %><%–cos.jar 내부에 존재–%>
<%@ page import=”com.oreilly.servlet.multipart.*” %><%–cos.jar 내부에 존재–%>
<%
 //멀티파트: 파일업로드 라이브러리
 String path=”c:\\download”;
 int size=1024*1024*100;//100메가
 String enctype=”EUC-KR”;
 MultipartRequest multipartRequest = new MultipartRequest(request,path,size,enctype,new DefaultFileRenamePolicy());

  //DefaultFileRenamePolicy(): 파일명이 중복되면 바꿔줌

String fileName = multipartRequest.getFilesystemName(“fileobj”);   

if (fileName==null) {

          System.out.println(“파일이 업로드 되지 않았습니다”);

}
%>

sax 기초

sax 기초

1. xml 예제

<sawon>
  <sabun>1</sabun>
  <name>1</name>
  <job>1</job>
</sawon>

sawon은 테이블.
sabun,name,job 은 컬럼이라고 생각하면 됨.

2. sax

맨 첫줄에서 startElement() 에서 나옴.(태그가 시작되었다는 뜻)

태그 하나를 읽을 때마다 메소드를 호출함.
ex) 태그가 시작되면 startElement() 메소드 호출

<?xml version=”1.0″ encoding=”UTF-8″?>      ===> startDocument()
<sawon>                 ===> startElement()
  <sabun>1</sabun>      ===> startElement() => characters() => endElement()
  <name>1</name>        ===> startElement() => characters() => endElement()
  <job>1</job>          ===> startElement() => characters() => endElement()
</sawon>                ===> endElement()

태그를 읽어와야 하는 곳은, startElement임.
(태그가 시작되어야 읽을 수 있기 때문)
 

xml 파싱하는 방법 4가지

xml 파싱하는 방법 4가지

1. 삭스(sax): 데이터를 한 줄씩 읽어온다. 수정/삭제 불가능

2. 돔(dom, Document Object Model): 전부 메모리에 저장해놨다가 쓴다(수정/삭제시 사용)

3. 언마샬(unmarshal) : 클래스 객체에 값을 집어넣게 쓴다, 값을 객체화 시킴

4. 마샬(marshal): 객체화된걸 다시 xml로 변환

참고: http://data.go.kr

jdbc(자바 데이터베이스 커넥티비티)하는 방식 2개

1. dao (데이터 엑세스 오브젝트)
2. dbcp (데이터베이스 커넥션풀)

커넥션풀 기초

커넥션풀 기초

1. 다운받기

cos-26Dec2008.zip 다운받기



 

1-2. 다운받기2

commons-dbcp-1.4-bin.zip

commons-fileupload-1.3.1-bin.zip

commons-io-2.4-bin.zip

commons-logging-1.2-bin.zip

commons-pool-1.6-bin.zip

위 파일들을 http://apache.org/ 에서 다운받자. 구글에서 apache라는 단어를 붙여 검색하면 더 쉽다.

2. 압축 풀고 jar 파일 빼내기

각 폴더에 압축을 풀고

commons-dbcp-1.4.jar
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
commons-logging-1.2.jar
commons-pool-1.6.jar
cos

위의 jar파일을 빼내서 아래처럼 한 폴더에 모은다.

3. cos.jar

4. commons-dbcp-1.4.jar

commons-pool-1.6.jar

commons-dbcp-1.4.jar와 commons-pool-1.6.jar를 톰캣 폴더 안의 lib 폴더 속에 붙여넣는다.



 

5. 커넥션풀 설정(톰캣 설정)

server.xml을 수정하기 전 (1)새로운 다이나믹 웹 프로젝트를 만들고, (2)빈 jsp파일을 만들고, (3)빈 jsp를 실행해보자(Ctrl+F11)

톰캣에 jar파일이 반영되도록 한 번 서버를 돌려보는 것이다.

5-1. server.xml의 Context 수정

server.xml 을 누르고 Source를 눌러 수정한다.

 

<Context docBase=”DBCPProject” path=”/DBCPProject” reloadable=”true” source=”org.eclipse.jst.jee.server:DBCPProject”/>

을 아래와 같이 변경한다.

<Context docBase=”DBCPProject” path=”/DBCPProject” reloadable=”true” source=”org.eclipse.jst.jee.server:DBCPProject”>
        <Resource
          name=”jdbc/oracle”
          type=”javax.sql.DataSource”
          auth=”Container”
          driverClassName=”oracle.jdbc.driver.OracleDriver”
          url=”jdbc:oracle:thin:@localhost:1521:ORCL”
          password=”tiger”
          username=”scott”
          maxActive=”10″
          maxIdle=”5″
          maxWait=”-1″
/>
</Context>

name=”jdbc/oracle” ->   이름임. 아무거나 써도됨. 마이디비, 라고 써도 됨.
type=”javax.sql.DataSource” ->  우리가 찾아올 때 데이터소스라는 클래스로 찾아와야함. 데이터소스가 아래 변수들을 다 가지고 있음.
auth=”Container” ->     톰캣이 관리한다. 컨테이너=톰캣
driverClassName=”oracle.jdbc.driver.OracleDriver” ->     드라이버 네임. 오라클일 경우 왼쪽과 같이 줘야함
url=”jdbc:oracle:thin:@localhost:1521:ORCL”
password=”tiger” ->     비번
username=”scott” ->    아이디
maxActive=”10″ ->   최대한 몇개를 생성할건지
maxIdle=”5″ ->    미리 몇개를 생성할건지. 계속 5개를 유지하려 노력함
maxWait=”-1″ ->     기다리는 시간. -1이면 계속 기다리라는(무한정) 말. 1000을 주면 1초 후에 나가야 함.

 

cf) 아래처럼 commons-dbcp-1.4.jar 안의 BasicDataSource 내부를 보면 name,type,auth,url,password … 등을 변수로 가지고 있음을 알 수 있다.

5-3. server.xml의 Connector 수정

6. 겟 커넥션(getConnection) 소스의 변화

 public void getConnection(){
    try{
     Context init=new InitialContext();//탐색기를 연다
     Context c=(Context)init.lookup(“java://comp/env”);//C드라이브에 접근
     DataSource ds=(DataSource)c.lookup(“jdbc/oracle”);//그 안에서 파일 하나를 얻어온다.
     conn=ds.getConnection();
    }catch(Exception ex){System.out.println(ex.getMessage());}
 }

7. JNDI의 이해






 

 public void getConnection(){
  try{
   Context init=new InitialContext();//탐색기를 연다
   Context c=(Context)init.lookup(“java://comp/env”);//C드라이브에 접근
   DataSource ds=(DataSource)c.lookup(“jdbc/oracle”);//그 안에서 파일 하나를 얻어온다.
   conn=ds.getConnection();
  }catch(Exception ex){System.out.println(ex.getMessage());}
  
 }

JNDI는 자바 네이밍 디렉토리 인터페이스(Java Naming and Directory Interface)의 약자이다. 저장되는 공간이 폴더 형태로 되어있고, 각 객체가 폴더 내에 저장된다. “저장된 개체의 주소값을 넘겨달라”가 룩업이다.

쉽게 생각하면 탐색기라고 할 수 있다. Context 새 개체를 만들고, comp/env에 접근한 뒤, 그 안에서 지정한 이름(jdbc/oracle)의 데이터 소스를 얻어온다. 그리고 나서 겟 커넥션을 하면 된다.   

그 전에는 연결->사용->해제 였으나, 이제는 연결->사용-> “반환”으로 바뀐다.(커넥션풀)

스프링(STS) jdk1.8에서 jdk1.7로 버전다운그레이드하기, 버전낮추기

스프링(STS) jdk1.8에서 jdk1.7로 버전다운그레이드하기, 버전낮추기

기존에 jdk1.8을 쓰고 있었는데 1.7로 다운그레이드할 경우가 생긴다. 예를 들면 전자정부 프레임워크는 jdk 1.6, 1.7 에서 작동되고 1.8에서 작동하지 않는다. 이때 jdk1.8로 작성했던 프로젝트들이 작동되지 않을 수 있는데 아래처럼 따라해본다.

1-1. c:\…\java 폴더 내의 1.8버젼을 모두 지운다.

1-2. jdk 1.7버젼을 다운받아 설치한다.

http://www.oracle.com/technetwork/java/index.html 에서 Java SE Development Kit 7u79 를 찾는다

1-3. tomcat 7.0 을 zip다운받아 압축푼다.

http://tomcat.apache.org/

 

2. sts 압축파일을 (기존 폴더가 아닌) 새로운 폴더에 압축 푼다.

3. File -> Import -> (폴더)General -> Existing Projects into Workspace 로 기존의 프로젝트 폴더를 추가할 수 있다.

4. Window -> Preferences -> (리스트)Server -> Runtime Environment에서 기존 서버들을 다 지운다.

5. Window -> Show view -> Navigator -> (폴더) .settings -> org.eclipse.jdt.core.prefs 에서

eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.7

로 바꿀것.

6. Window -> Show view -> Navigator -> (폴더) .settings -> org.eclipse.wst.common.project.facet.core.xml 에서

<?xml version=”1.0″ encoding=”UTF-8″?>
<faceted-project>
  <fixed facet=”java”/>
  <fixed facet=”wst.jsdt.web”/>
  <fixed facet=”jst.web”/>
  <installed facet=”java” version=”1.8″/>
  <installed facet=”jst.web” version=”3.1″/>
  <installed facet=”wst.jsdt.web” version=”1.0″/>
</faceted-project>

<?xml version=”1.0″ encoding=”UTF-8″?>
<faceted-project>
  <fixed facet=”java”/>
  <fixed facet=”wst.jsdt.web”/>
  <fixed facet=”jst.web”/>
  <installed facet=”java” version=”1.7″/>
  <installed facet=”jst.web” version=”3.0″/>
  <installed facet=”wst.jsdt.web” version=”1.0″/>
</faceted-project> 

로 바꿀것.

7. Window -> Show view -> Project Explorer 로 돌아온다.

8. Project -> Clean 으로 컴파일된 파일들을 비워준다. (미리 컴파일된 파일들이 jdk 1.8로 컴파일 되었으므로)

9-1. JRE System Library 에서 마우스 우클릭 -> Properties

9-2. jdk1.7 를 선택한다.

10-1. 마우스 우클릭 -> Run As -> Run On Server 로 실행해본다.

10-2. Manually define a new Server -> Tomcat v7.0 Server 를 선택 -> Next -> Finish.

실행될 것이다.

11. 위 과정이 잘되지 않는는다면, 아래처럼 해본다.

프로젝트에서 마우스 우클릭 -> Build Path -> Configure Build Path 로 들어간다.

Libraries에서 Add Library -> Server Runtime -> Apache Tomcat v7.0을 선택




 

12. Project -> Clean 을 다시 해보거나 자바 파일들(ex: dao.java파일) 을 다른데 카피해두고, 프로젝트 상에서 제거했다가 다시 붙여넣은 후 실행해본다.

c:forEach, c:if 기초예제

c:forEach, c:if 기초예제

<%@ taglib prefix=“c” uri=http://java.sun.com/jsp/jstl/core%>

     .

     .

     .

<c:forEach var=ibegin=“1” end=“10”>

     <c:if test=${i%2==0}>

          ${i}&nbsp;

     </c:if>

</c:forEach> 

—————————————————————————————————

$  EL [이엘] (표현식)


c:if     c:forEach     JSTL [제이에스티엘] (JSP 표준 태그 라이브러리)

jstl.jar standard.jar

jstl.jar standard.jar

jstl

standard

 

세션(session)과 로그인

세션(session)과 로그인

/* 세션: 실행중인 프로그램
   = 저장 setAttribute(“key”,”key-value”)
   = 저장 가지고 오기 getAttribute(“key”)
   = 유지시간  setMaxactiveInterval(초): 30분이 디폴트
   = 해제  invalidate()
   = 일부해제  removeAttibute(“key”)
   **** 접속마다 session은 한개만 생성이 가능.
   접속자마다 sessionId 생성
*/

1. 로그인되었는지 아닌지 확인
String id=(String)session.getAttribute(“id”);
String log_jsp=””;
if(id==null){
 log_jsp=”login.jsp”;
}
else{
 log_jsp=”logout.jsp”;
}

2. 로그인 하기

<form method=post action=”login_ok.jsp” name=frm>
     <input type=text name=id value=”hong” size=15>

     <input type=password name=pwd value=”1234″ size=15>
     <input type=submit value=로그인>
</form>

3. 로그인 확인

String id=request.getParameter(“id”);
String pwd=request.getParameter(“pwd”);

     <%– 아이디와 비밀번호가 옳다면 아래를 실행–%>
session.setAttribute(“id”, id);
session.setAttribute(“name”, result);

4. 로그아웃

session.invalidate();//세션 해제: 아이디를 널값으로 바꿈
response.sendRedirect(“main.jsp”);

자바빈(bean)

자바빈(bean)

bean은 콩이라는 뜻.

1. 데이터 관리 (데이터 빈)

~DTO (데이터 프랜스퍼 오브젝트), ~VO (밸류 오브젝트)

읽기(getXxx), 쓰기(setXxx)

2. 기능처리 (액션 빈)

~DAO (데이터 엑세스 오브젝트), ~Service

jsp 액션태그

jsp 액션태그

1. <jsp:userBean>

2. <jsp:setProperty>

3. <jsp:getProperty>

4. <jsp:include>

5. <jsp:forward>

1. <jsp:userBean>

객체 생성.

​<jsp:useBean id=“d” class=com.dao.MemberDTO> <%– MemberDTO d=new MemberDTO(); –%>

   <jsp:setProperty name=“d” property=“*”/>

</jsp:useBean>

ex) <jsp:userBean id=”a” class=”A”>

     => A a=new A(); 를 대체

ex) <jsp:userBean id=”dao” class=”BoardDAO”>

————————————————————————————————————————

2. <jsp:setProperty>

ex) <jsp:setProperty name=”a” property=”name” value=”홍길동”>

     => a.setName(“홍길동”); 를 대체

————————————————————————————————————————

3. <jsp:getProperty>

출력용.

<%=d.getSabun()%><br>

     위 코드는 아래와 같이 대체된다.

<jsp:getProperty name=“d” property=sabun/><br>

ex)

     => <%=a.getName()%> 를 대체

————————————————————————————————————————

4. <jsp:include>

ex) (1) <%@ include file=”a.jsp”%>

         (컴파일 전에 소스를 합치므로, 페이지 두 개에서 중복선언(ex: int a)했을 경우 에러)

            고정된 파일을 사용할 때 쓰이나 잘 쓰이지 않음.

     (2) <jsp:include page=”a.jsp”/>

         (컴파일 후에 HTML을 묶어서 사용. 변경되는 파일 사용시 쓰임. 주로 쓰임.

     => pageContext.include() 를 대체

————————————————————————————————————————

5. <jsp:forward>

url 주소가 바뀌지 않고 화면만 변경됨.

forward 대상에 request를 전송.

b.jsp에서 아래와 같이 코딩한다.

     RequestDispatcher rd=request.getRequestDispatcher(“a.jsp”);

     rd.forward(request);

     => pageContext.forward() 를 대체 

시퀀스

시퀀스

MAX+1을 대체하는 SQL.

시퀀스

자동증가

CREATE SEQUENCE seq명
     START WITH 1 : 시작
     INCREMENT BY 1 : 증가
     NOCYCLE | CYCLE : 순환시킬거냐, 순환시키지 않을거냐.(보통 시퀀스는 프라이머리 키이기 때문에 순환하지 않음)
     NOCACHE | CACHE : 미리 20개를 생성해놓고 번호를 가져올거냐, 생성하지 않을거냐.
     MAXVALUE | MINVALUE
DROP SEQUENCE seq명

CREATE SEQUENCE my_no_seq
     START WITH 1
     INCREMENT BY 1
     NOCYCLE
     NOCACHE
     MAXVALUE 100
     MINVALUE 1;

SELECT my_no_seq.nextval FROM DUAL;
(처음에 쓰면 1을 가져옴, 다음에 가져오면 2를 가져옴)

SELECT my_no_seq.currval FROM DUAL;

삭제

DROP SEQUENCE my_no_seq;

DROP SEQUENCE dm_no_seq;
DROP TABLE diaryMessage;
DROP TABLE diaryMember;

—————————————-
CREATE TABLE diaryMember(
     id VARCHAR2(20),
     pwd VARCHAR2(10) CONSTRAINT dm_nn_pwd NOT NULL,
     name VARCHAR2(34) CONSTRAINT dm_nn_name NOT NULL,
     CONSTRAINT dm_pk_id PRIMARY KEY(id)
);

CREATE TABLE diaryMessage(
     no NUMBER,
     id VARCHAR2(20),
     subject VARCHAR2(1000) CONSTRAINT dm_nn_sub NOT NULL,
     msg VARCHAR2(4000) CONSTRAINT dm_nn_msg NOT NULL,
     year NUMBER,
     month NUMBER,
     day NUMBER,
     CONSTRAINT dm_pk_no PRIMARY KEY(no),
     CONSTRAINT dm_fk_id FOREIGN KEY(id) REFERENCES diaryMember(id)
);

————————————-
CREATE SEQUENCE dm_no_seq
     START WITH 1
     INCREMENT BY 1
     NOCYCLE
     NOCACHE;

—————————————————-
INSERT INTO diaryMember VALUES(‘hong’,’1234′,’홍길동’);
INSERT INTO diaryMember VALUES(‘shim’,’1234′,’심청이’);
INSERT INTO diaryMember VALUES(‘park’,’1234′,’박문수’);
————————————————————-
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’프로젝트 발표’,’4월 3일 조별 발표’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’조 편성’,’4월 3일 3개조로 편성’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’프로젝트 발표’,’4월 3일 조별 발표’,2015,4,1);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’shim’,’조 편성’,’4월 3일 3개조로 편성’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’park’,’프로젝트 발표’,’4월 3일 조별 발표’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’조 편성’,’4월 3일 3개조로 편성’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’프로젝트 발표’,’4월 3일 조별 발표’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’조 편성’,’4월 3일 3개조로 편성’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’프로젝트 발표’,’4월 3일 조별 발표’,2015,3,31);
INSERT INTO diaryMessage VALUES(dm_no_seq.nextval,’hong’,’조 편성’,’4월 3일 3개조로 편성’,2015,3,31);

SELECT * FROM diaryMessage
 

답글형 게시판 4줄요약

답글형 게시판 4줄요약

 

아래 네 줄을 기억하자.

1. 부모 것을 가져와서

2. 순서를 뒤로 밀어버리고

3. 내가 그 자리에 들어가고

4. 부모의 뎁쓰를 +1한다.

 

좀 더 자세히 설명하면,

1. 부모의 gi, gs, gt를 가져온다.

2. gi같은 애들 중에서 gs높은 애들을 +1시켜준다.

3. INSERT

4. 루트의 뎁쓰를 +1한다.

 

좀 더 자세히 설명하면,

1. 부모의 gi, gs, gt를 가져온다.

2. 부모와 gi 같은 애들 중에서, gs가 부모보다 높은 애들의 gs를 +1시켜준다.

3. INSERT. gi는 부모거, gs는 부모+1, gt는 부모+1, 루트는 pno, 뎁쓰는 0.

4. 부모(루트)의 뎁쓰를 +1한다.

끝이다. 네 줄만 외우면 SQL 완성은 시간문제.

jsp 화면 바꾸는 법(자동이동)

jsp 화면 바꾸는 법(자동이동)

두 가지 방법이 있다.

1. 파일째 바꾸는것: 샌드 리다이렉트

response.sendRedirect(“aa.jsp”);

-주소창의 주소가 바뀐다.

-request 객체의 attribute가 넘어가지 않는다.

2. 화면만 바꾸는것: 포워드 기법 (윈도우(JFrame)의 카드 레이아웃과 같다)

<jsp:forward page=”aa.jsp” />

-주소창의 주소가 바뀌지 않는다.

-request 객체의 attribute가 전달된다.

참고) Request의 Parameter : 클라이언트에서 서버로 넘기는 데이터

Request의 Attribute: 서버에서 클라이언트로 넘기는 데이터

Session: 사용자의 정보를 저장함

오라클 비밀번호를 까먹었을 경우/계정 새로만들기

오라클 비밀번호를 까먹었을 경우/계정 새로만들기

sqlplus 를 관리자 권한으로 실행한다. 시작메뉴에 바로가기가 있고, 마우스 우클릭을 해서 관리자 권한으로 실행할 수 있다.

찾기 어렵다면 시작->실행 에서 sqlplus /nolog 라고 써도 된다.

 

sql창이 떴다면,

 

SQL> conn /as sysdba

 

을 써서 최고권한으로 접속한다.

 

SQL> ed test1

이라고 치면 sql파일을 만들 수 있다.

 

파일 안에 아래처럼 적는다.

 

conn /as sysdba;
drop user scott cascade;
create user scott identified by tiger; 
GRANT CREATE SESSION TO scott;
GRANT ALTER SESSION TO scott;
GRANT CREATE TABLE TO scott;
GRANT CREATE VIEW TO scott;
GRANT QUERY REWRITE TO scott;
GRANT CONNECT TO scott;
GRANT RESOURCE TO scott;
PASSWORD EXPIRE;

 

저장하고 메모장을 빠져나온다.

 

@test1 써서 실행하면 scott 계정이 만들어졌다.

 

확인해보려면 다시 sqlplus를 켜서 conn scott/tiger 로 접속해보면 된다.

jsp get/post방식 전송

jsp get/post방식 전송

□ get방식 전송

<a href=”output.jsp?id=admin&pwd=1234&name=홍길동”>데이터 전송</a>

□ get방식 출력

<%

String id=request.getParameter(“id”);

%>

<%=id %>
<%=pwd %>
<%=name %>

□ post방식 전송

<form action=”output.jsp” method=”post” name=frm> /*id는 디자인용, name은 자바용*/ 

        <input type=text name=name size=12>

        <input type=radio name=sex value=남자 checked> <input type=radio name=sex value=여자>

        <input type=checkbox name=hobby value=”낚시”>낚시
        <input type=checkbox name=hobby value=”운동”>운동
        <input type=checkbox name=hobby value=”등산”>등산
        <input type=checkbox name=hobby value=”독서”>독서
        <input type=checkbox name=hobby value=”게임”>게임

        <input type=”submit” value=전송>

</form>

 

  <form action=“postfind.jsp” method=“post” name=frm> /*id는 디자인용, name은 자바용*/

    <td>

          입력:<input type=text name=dong size=12>

      <input type=button value=찾기onclick=postfind()’>

    </td>

  </form>

​<head>

  <script>

    function postfind(){

    var f=document.frm;//계층구조 (window > document > form > input)

    //window는 생략이 가능

      if(f.dong.value==“”){//공백이면

      alert(//면을 입력하세요);

      f.dong.focus();//포커스.

      return;

      } 

    f.submit(); 

    } 

  </script>

​/<head>

 

 

□ post방식 출력

/* 포스트 방식일 때 바꾸는 방식*/

request.setCharacterEncoding(“EUC-KR”);

String name=request.getParameter(“name”);

String sex=request.getParameter(“sex”);

String[] hobby =request.getParameterValues(“hobby”);

%>

……………….(중략)……………….

<body>

<%=name %><br>

<%=sex %><br>

<%

for(int i=0;i<hobby.length;i++){

%>

    <%=hobby[i]%>

<%

}

%>

</body>

□ 자바스크립트 함수 예제

​  <a href=javascript:ok(‘<%=zip%>‘,’<%=addr%>‘)”>클릭</a>

<head>

    <script>

      function ok(zip,addr){

       //오프너:부모. 나를 띄워준 창이 오프너“. (join.jsp 가 오프너임)

       opener.frm.post1.value=zip.substring(0,3); //113-111 에서 133

       opener.frm.post2.value=zip.substring(4,7); //113-111 에서 111

       opener.frm.addr1.value=addr;

       self.close();

       }

    </script>

</head>

 

 

 

 

jsp 웹 개발 기초

jsp 웹 개발 기초

□ 자바로 웹페이지 만들기
자바로 웹페이지를 짜는 법은 두 가지가 있다.

(1) 서블릿

-> 컴파일 방식(실행코드 방식)
보안이 뛰어나다.

(2) jsp(자바 서버 페이지스)

-> 스크립트 방식 (<% %>)
컴파일하지 않으므로 빠르다.

실전에서는 보안이 필요한 부분은 서블릿, 그렇지 않은 부분은 jsp로 짠다.

□ 톰캣이 변환하는 과정

□ 톰캣 =웹 컨테이너 =어플리케이션 서버

톰캣은 (1)JSP 또는 (2)서블릿을 변환해준다.

□ JSP, ASP, PHP

JSP: 자바 서블릿 페이지.

ASP: 호환이 좋지 않다. 윈도에만 가능하다.

PHP: 퍼스널 홈페이지(Personal Home Page) 의 약자이다. (작은 사이트 위주)

□ 스프링

스프링은 클래스를 관리하는 관리자 역할을 한다. “컨테이너” 라고도 부른다.
(컨테이너: 컴포넌트를 관리한다. 자바 클래스가 컴포넌트다.)

□ 서블릿 

서블릿: “서버에서 실행되는 가벼운 프로그램”이라는 뜻. (server + let)

jsp 파일은 HttpServlet를 상속받은 class로 변환됐다.

스크립트릿, 표현식은 메소드 안에 들어간다.

선언식은 클래스 안에 들어간다.

현재는 html에서 출력할 때 out.println이 생략되어 있다.

(<%= name %>은 <% out.printlin(name); %>과 같다)

디렉티브(지시자)

(1) page : 페이지 디렉티브. jsp 파일에 대한 정보를 가지고 있다. jsp 맨 위의 <%@ page..>

 – contentType: html인지, xml인지 pdf인지 지정할 수 있음.
ex)   <% page contentType=”text/html” %>
        <% page contentType=”text/xml” %>

charset=”EUC-KR” 또는 “UTF-8” (한 페이지에서는 둘 중의 하나로 완전히 통일시킬 것)

 – import: 자바 클래스 포함시킬때. 자바 라이브러리 불러올 때

ex) <% page import=”java.util.Date” %>

 – errorPage: 에러났을때 이동시킬 페이지(파일)지정.

(2) taglib

태그로 자바 문법을 정의

ex)

      <%

          for(int i=1;i<=10;i++)

          {

      %>

              html

      <%

          }

      %>

 

위 코드를 아래처럼 바꿔준다.

<c:forEach var=”i” start=”1″ end=”10″>

     html

</c:forEach>

 

이처럼 태그형 프로그램으로 바뀐다. 이것을 JSTL이라고 한다.

(3) include

jsp 안의 특정부분에 다른 jsp를 불러올 때 사용

스크립트 요소

(1) 스크립트릿: 자바 일반식. 자바 코드를 실행한다.
<% %>

<%

     일반 자바코드

%>

(2) 표현식: 값을 출력한다.
<%= %>

<%= 값%>

(3) 선언식: 자바 메서드(함수)를 만든다
<%! %>

<%! 멤버변수

     또는 메소드 선언 %>

잘 쓰지 않는다. 우리에게 import가 있기 때문에 메소드를 굳이 만들지 않는다. 선언식을 쓰면 재사용이 되지 않는다, import로 재사용하자.

기본객체(내장 객체: 미리 메모리 할당이 된 객체명)

(1) request

요청.

클라이언트의 정보, 요청값 읽기/쓰기

map으로 구성되어 있다. “키”와 “밸류”로 구성되어서, 키를 주면 밸류를 받아온다.(map: 순서가 없다. 키는 중복불가능, 밸류는 중복가능)

 -getRemoteAddr()
접속된 클라이언트의 ip어드레스를 출력한다.

 

 -getRequestURI()

​URI를 구한다.

 -getContextPath()

ContextPath를 구한다.

 getParameter(): 값이 한개 넘어올때.
 getParameterValues(): 체크박스때만 씀. 값이 여러개 넘어올때.

(2) response

응답에 대한 정보, 이동정보(리다이렉트)

(3) session

서버의 정보를 저장할 때 쓴다.

서버 측에 클라이언트 정보를 저장.

ex) 로그인
리퀘스트로 로그인 요청 -> 세션에 저장 -> 리스폰스로 결과값 돌려준다. 세션 내용이 지워지려면, (1)로그아웃 하거나(2) 브라우저 끄면 지워준다.

(4) application: 서버에 대한 정보를 갖고 있음.

(5) out: 메모리에 대한 정보.

(6) config: 환경설정 관련. 나중에 web.xml로 변경됨

(7) exception: 예외처리에 대한 정보. (try catch 절로 대체)

(8) page: jsp파일에 대한 정보. this와 같은 의미

(9) pageContext: 페이지 연결하는 부분. 내장객체 관리. 

하둡 생태계(Hadoop Eco System)

하둡 생태계(Hadoop Eco System)

 

하둡 생태계는 빅데이터 관련 프로그램들을 총칭한다. Flume, HBase, Hive, Pig, Sqoop, Zookeeper, Storm, Kafka 등이 있다.

 

1. 하둡(Hadoop): 분산 처리를 가능하게 해준다(여러 컴퓨터를 연결).

HDFS: 하둡 파일 시스템

 

2. R: 통계 패키지

R 스튜디오(R Studio): GUI 환경에서 R을 사용하게 해줌

 

3. 주키퍼(Zookeeper): “사육사”라는 뜻(따라서 동물 이름을 갖는 프로그램들이 많다). 빅데이터 관련 프로그램들을 관리한다. 설치가 가장 까다롭다.

 

4. 하이브(Hive): “벌떼”라는 뜻. SQL 문장 분석을 한다

5. 피그(Pig): “돼지”라는 뜻. “Pig Latin”이라 불리는 언어를 쓴다.(파이썬 류)

cf) 자바는 맵/리듀스를 쓴다. 하둡 안에도 맵/리듀스(=mapred)가 존재한다.

 

6. 플럼(flume): 비정형화된 데이터를 가져오는 수집기. 플럼은  “수로(waterway), 물미끄럼틀”이라는 뜻이 있다.

7. 스쿱(sqoop): 정형화된 데이터를 가져오는 수집기. sqoop은 뜻이 존재하지 않고, scoop의 경우 아이스크림을 푸는 깊고 둥근 숟가락을 말한다.

 

8. H베이스(HBase): 분산 데이터베이스. 매우 거대한 데이터베이스를 저사양에서 처리할 수 있게 도와줌.

 

9. 몽고DB(mongodb): 비정형 데이터를 저장하는 DB. 몽고DB는 컬렉션으로 이루어져 있음. <-> 오라클(Oracle)은 정형 데이터를 저장.

우분투에 하둡 세팅하기 06: mongo db 설치

우분투에 하둡 세팅하기 06: mongo db 설치

1. mongodb-server 설치

다운로드 폴더에 들어가서 다운받아둔 mongodb-linux-x86_64-ubuntu1404-3.0.1.tgz 을 압축 푼다. (마우스 우클릭->여기에 풀기)

압축 푼 폴더의 이름을 mongo 로 바꾼다.


이제 다운로드 폴더 내의 mongo 폴더를 /usr/local 로 옮기자.

 

cd 다운로드
sudo mv ./mongodb /usr/local      로 다운로드 폴더의 mongodb 를 /usr/local로 이동시키자.

cd /usr/local
sudo chown sist mongodb             mongodb의 소유 권한을 sist에게 부여한다(chown: 파일 및 디렉토리 소유주 변경)
cd mongodb

sudo mkdir data                          
sudo mkdir log                              로 mongodb 폴더 안에 data폴더, log폴더를 만든다.

ls                                                를 써서 폴더 있는지 확인

sudo chown sist data
sudo chown sist log

ls -al

cd bin

sudo apt-get install mongodb-server

2. 서버 돌리기

sudo ./mongod –dbpath /usr/local/mongodb/data
 

3. mongo db 실행하기 

cd /usr/local/mongodb/bin
ls -al

mongo     쓰면 접근됨

show dbs

user mydb       라고 쓰면 데이터 베이스를 바꿈

db.member.insert({no:1,name:”aaa”});         라고 쓰면 데이터 추가

db.member.find()                                라고 쓰면 데이터 조회.

우분투에 하둡 세팅하기 05: R base, 하이브, 피그, 플럼, 몽고DB 등등 설치하기

우분투에 하둡 세팅하기 05: R base, 하이브, 피그, 플럼, 몽고DB 등등 설치하기

1-1. 통계패키지 R

터미널을 열어서,

sudo apt-get upgrade      라고 쳐서 업그레이드를 한다.

sudo apt-get install r-base      라고 쳐서 r-base를 깔면 된다.

1-2. R Studio

구글에 ‘R studio’ 로 검색해서, 아래처럼 들어가서, Desktop 버젼 중 tar 파일을 다운받으면 된다.

2. flume

구글에 ‘flume 다운로드’ 로 검색해서, 아래처럼 tar.gz 파일을 다운받으면 된다.

 

3. hbase

구글에 ‘hbase 다운로드’ 로 검색해서, 아래처럼 tar.gz 파일을 다운받으면 된다.




 

4. hive

구글에 ‘hive 다운로드’ 로 검색해서, 아래처럼 tar.gz 파일을 다운받으면 된다.




 

5. pig

구글에 ‘pig 다운로드’ 로 검색해서, 아래처럼 tar.gz 파일을 다운받으면 된다.


 

6. sqoop

구글에 ‘sqoop 다운로드’ 로 검색해서, 아래처럼 tar.gz 파일을 다운받으면 된다.


 

7. zookeeper

구글에 ‘zookeeper 다운로드’ 로 검색해서, 아래처럼 tar.gz 파일을 다운받으면 된다.




 

8. mongodb

구글에 ‘mongodb 다운로드’ 로 검색해서, 아래처럼 다운받으면 된다.


아래는 전부 다 받은 모습이다.

 

우분투에 하둡 세팅하기 04: 하둡 실행확인

우분투에 하둡 세팅하기 04: 하둡 실행확인

1. 터미널을 껐다 킨후, hadoop namenode -format 이라고 하면 하둡이 실행된다.

 

2. start-all.sh 를 치고 yes 를 친다.


 

3. 마지막으로 jps를 쳤을 때 6개가 나오면 된다.

ScondaryNameNode

NameNode

DataNode

Jps

TaskTracker

JobTracker

순서는 상관없다. 



4. 연결 확인

마지막으로 파이어폭스를 켜서 두 군데에 연결 확인을 해보자.

http://localhost:50030/jobtracker.jsp , http://localhost:50070/dfshealth.jsp 이렇게 두 군데에 접속 시도하면 연결이 되어야 한다.

만약 Unable to connect 가 나오면, 중간 과정을 다시 되짚어봐야 한다.

 

 

우분투에 하둡 세팅하기 03: 지에디트로 파일 편집하기

우분투에 하둡 세팅하기 03: 지에디트로 파일 편집하기

 

(1) hadoop-env.sh

local/hadoop-1.2.1/conf 에 들어가서 hadoop-env.sh를 찾는다.

열어서 기존의 “# export JAVA_HOME=/usr/lib/j2sdk1.5-sun” 부분을,

 

export JAVA_HOME=/usr/local/jdk1.8.0_31
export HADOOP_HOME=/usr/local/hadoop-1.2.1
export HADOOP_HOME_WARN_SUPPRESS=1

 

로 바꾸자.

 

(2) core-site.xml

local/hadoop-1.2.1/conf 에 들어가서 core-site.xml를 찾는다. 마우스 우클릭 -> 지에디트로 열기 로 파일을 연다.

아래와 같이 입력하자.



 

(3) hdfs-site.xml

local/hadoop-1.2.1/conf 에 들어가서 hdfs-site.xml를 찾는다. 마우스 우클릭 -> 지에디트로 열기 로 파일을 연다.

아래와 같이 입력하자.
 

 

(4) mapred-site.xml

local/hadoop-1.2.1/conf 에 들어가서 mapred-site.xml을 찾는다. 마우스 우클릭 -> 지에디트로 열기 로 파일을 연다.

아래와 같이 입력하자.

 

 

우분투에 하둡 세팅하기 02: 계정명 변경, hadoop폴더와 hdfs폴더 생성

우분투에 하둡 세팅하기 02: 계정명 변경, hadoop폴더와 hdfs폴더 생성

1. cd /etc

sudo chmod 646 hosts   하면 쓰기권한이 부여된다.

sudo nano hosts           하면 나노에디터로 수정한다.


 

2. 아래 파일을 확인한다.


 

아래와 같이 바꾼다.
두번째 줄의 127.0.1.1 을 -> 127.0.0.1 로 바꾸고,

sist를 ubuntu 로 바꿔야한다.

저장하고 끈다.(컨트롤+O  컨트롤+X  엔터)

 

3. sudo nano hostname 을 쓴다.




4. 아래와 같은 파일이 나온다.

 

아래와 같이 바꿔서 저장하고 끈다.(컨트롤+O  컨트롤+X  엔터)

 

5. 터미널을 껐다 키면 이름이 이름이 sist  @ ubuntu 로 바뀐다.

아래와 같은 상태에서 디렉토리를 네 개 만든다.

sudo mkdir -p /home/hadoop/hdfs/name

sudo mkdir -p /home/hadoop/hdfs/data

sudo mkdir -p /home/hadoop/hdfs/temp

sudo mkdir -p /home/hadoop/hdfs/mapred



 

6. 아래와 같이 cd /home 으로 들어간후,

sudo chown sist hadoop 이라고 친다.

sist 계정에게 hadoop 접근권한을 주는 것이다.


 

7-1. 아래와 같이 cd /hadoop 으로 들어간후,

sudo chown sist hdfs 라고 친다.

이번엔 sist 계정에게 hdfs 접근권한을 주는 것이다.

7-2. 마지막으로 cd /hdfs 로 들어가서,

sudo chown sist * 라고 치면 만들었던 디렉토리 4개(name, data, temp, mapred)에 권한이 부여된다.

 


 

우분투에 하둡 세팅하기 01: VBox 환경/네트워크 설정, openssh-server 패키지 설치

우분투에 하둡 세팅하기 01: VBox 환경/네트워크 설정, openssh-server 패키지 설치

1. Virtual Box 메뉴 바의 “파일(F)”->”환경 설정(P)”으로 들어간다.

 

2.  설정 창에서 “네트워크”를 선택한다. “호스트 전용 네트워크”를 선택하고 “일자 드라이버 모양 아이콘(호스트 정보)”를 클릭한다. “DHCP 서버” 탭을 클릭하고 “서버 사용”을 체크 해제한다. 


3. “설정” 아이콘(톱니바퀴 모양)을 눌러서 “네트워크”로 들어가서, 어댑터 1을 “브리지 어댑터”로 바꾸고 무작위 모드를 “모두 허용”한다.

 
 

4. 좌측 환경설정 아이콘(톱니바퀴 모양)을 누르고 네트워크를 클릭한다.

5. “IPv4설정” 클릭 -> 방식은 “수동” 선택 -> 주소를 추가(A)한다.

첫번째 칸은 자신의 ip주소를 쓰고, 엔터를 누른다.

넷마스크는 서브넷 마스크 주소인 255.255.255.0 을 쓰고 엔터를 누른다.

게이트웨이에는 기본 게이트 웨이 주소를 적는다.

이 모든 주소는 실행(윈도우키+R) -> cmd -> ipconfig  에서 확인할 수 있다.

6. 터미널 열어서 sudo apt-get install openssh-server 칠것

7. ssh-keygen -t rsa 라고 칠것.

엔터를 4번 친다.

암호화하는 통신 프로토콜이 만들어진다.

8. cd .ssh
ls -al 이라고 치면 ssh 폴더 안쪽에 id_rsa와 id_rsa.pub을 볼 수 있다.

cat id_rsa.pub>>authorized_keys   라고 치고
more authorized_keys    라고 칠것.

그러면 아래처럼 키가 암호화된 것이 보인다.


 




 

톰캣과 jsp의 get/post에서 한글 깨질시(한글변환)

톰캣과 jsp의 get/post에서 한글 깨질시(한글변환)

jsp에서 한글 전송이 안된다면 System.out.println을 날려서 값을 찍어본다. ??로 나올 경우 한글이 전송 중에 깨지고 있다.

아래처럼 해결한다.

□ get방식일 경우

톰캣 서버에서 바꿔야 한다.

톰캣의 server.xml 에서 Connector 부분 끝에 URIEncoding=”EUC-KR” 이라 붙일것.

□ post 방식일 경우

출력하는 jsp 파일 상단에 request.setCharacterEncoding(“EUC-KR”); 을 쓸것.

인라인 뷰(게시판 목록 출력)

 

 

인라인 뷰(게시판 목록 출력) 원리

 

SELECT no,subject,group_tab,num FROM

(SELECT no,subject,group_tab,rownum AS num FROM

(SELECT no,subject,group_tab FROM reply_board ORDER BY group_id DESC,group_step ASC))

WHERE num BETWEEN 2 AND 4;

위 SQL문을 단순화하면 아래와 같다.


비트윈을 위한 셀렉트 문(rownum을 뽑기 위한 셀렉트 문(ORDER BY를 위한 셀렉트 문))

제일 안 쪽의 셀렉트 문부터 이해해나가야 쉽다.

1. 먼저 ORDER BY를 이용해 정렬을 시킨다. 이때 ORDER BY를 쓴다.

2. 1번에 rownum(줄 번호)을 붙인다. 정렬 순으로 번호를 붙이는 것이다. rownum AS 별칭 으로 이를 기억해둔다.

3. 2번에서 원하는 번호를 추출한다. 이때 비트윈을 쓴다.

jsp 내장객체: request, response, session

jsp 내장객체: request, response, session

 

request: request의 구조는 map으로 되어있다. map(키, 키값). 다시 말해 map (no,10) 식으로 되어 있다.

response: 예를 들어 글쓰기를 할 경우, 웹서버는 글쓰기를 다 처리한후, 사용자를 list로 이동시켜준다.(ex: response.sendRedirect(list.jsp);) 이게 리스폰스가 하는 역할이다.

ex) 게시판 리스트에서 “다음 페이지”글자를 클릭해서 페이지 이동하기

링크 부분:

 <a href=board_list.jsp?page=<%=current_page+1%>>

jsp 최상단 부분:

<%

String temp=request.getParameter(“page”);

current_page=Integer.parseInt(temp);

DAO dao=new DAO();

ArrayList<DTO> list=dao.printList(current_page);

%>


뷰(view) & 시퀀스

뷰(view)

 1) 가상테이블 (기존의 테이블을 참조)

 2) 메모리에 데이터를 저장하지 않는다(보안)

​ 3) View=>SQL문장을 저장하고 있다

 4) 자바에서 코딩을 줄일 수 있다

 5) 뷰의 종류

    1. 단순 뷰: 테이블 한 개에서 연결

    2. 복합 뷰: 테이블 여러 개 이상이 연결

    3. 인라인 뷰(페이징)

6) 사용법

    1.   CREATE VIEW view_name

         AS (SELECT~)

    2.   CREATE VIEW view_name

         AS (SELECT~ JOIN)

    3. SELECT ~ FROM (SELECT~)

       ★(탑앤TOP-N 이라고도 한다. 위에서부터 n개 가져옴) (앤앤N-N이라고도 한다. 어디서부터 어디까지 가져옴)

7) 수정

    CREATE OR REPLACE VIEW view_name ~

8) 삭제

    DROP VIEW view_name

9) 옵션

    WITH CHECK OPTION(디폴트 값임): 수정/삭제(테이블에 영향을 미치므로 주의)

    WITH READ ONLY: 읽기 전용 ★말 그대로 뷰는 보는 용도로 쓰기 때문에, 리드 온리를 해주는 경우가 많다.

 


뷰란 가상의 테이블을 말한다. 메모리에 저장되지 않는다(테이블과 다르다. 뷰에는 데이터가 들어있지 않다. SQL만 저장되어 있다).

뷰의 사용목적은 사용자의 편의성이다. 여러 테이블을 조인하는 효과를 갖는다(미리 조인을 만들어놓는 효과).

메모리에 저장하지 않기 때문에 보안성이 높다.


뷰는 3가지가 있다.
단순 뷰, 복합 뷰, 인라인 뷰


1. 단순 뷰
1개의 테이블로 만들어지는 단순뷰.
(옵션)
WITH CHECK OPTION : 주어진 제약조건에 맞는 데이터만 입력/수정 허용
 – CREATE와 REPLACE를 쓰며 간다(alter가 없으니 replace를 씀)
WITH READ ONLY: 읽기 전용뷰
 – SELECT만 가능
 

​–ex)

–1. 단순뷰 만들기

CREATE VIEW dept_view AS (SELECT * FROM dept);

단순뷰 조회

SELECT * FROM dept_view;

단순뷰 인서트

INSERT INTO dept_view VALUES(50,영업부,서울);

COMMIT;

–★뷰는 테이블을 참조하고 있을 뿐이지만, 단순뷰의 경우 INSERT가 가능하므로, 테이블에 영향을 준다.(테이블 인서트나 다름없다)

삭제

DROP VIEW dept_view;

–2. 단순뷰 만들기(읽기전용)

CREATE VIEW dept_view AS (SELECT * FROM dept) WITH READ ONLY;

–★인서트를 실행하면, “읽기 전용 뷰에서는 DML작업을 수행할 수 없습니다라 나온다.

  

2. 복합 뷰

여러개가 묶이는 뷰

​–ex)

–CREATE OR REPLACE뷰를 만들자(알터대신에 쓴다)

CREATE OR REPLACE VIEW emp_dept_grade

AS (SELECT empno,ename,job,hiredate,sal,dname,loc,grade

    FROM emp,dept,salgrade

    WHERE emp.deptno=dept.deptno

    AND sal BETWEEN losal AND hisal);

–★조인이 많이 걸리면 너무 길어지기 때문에, 뷰에 SQL문을 저장해두는 것이다.

 

SELECT * from emp_dept_grade;

셀렉트 별표로 뷰를 불러오면, 아주 긴 SQL문을 치는 것과 동일한 효과가 난다.

 

3. 인라인 뷰
From 다음에 Select를 써서 임시로 쓰는, 서브쿼리에 해당되는 뷰 (1회용 뷰)

​–ex)

인라인뷰(TOP-N)

SELECT empno,ename,sal,num FROM

(SELECT empno,ename,sal,rownum AS num FROM

(SELECT empno,ename,sal FROM emp ORDER BY sal DESC)) WHERE num BETWEEN 3 AND 5; 

 

—————————————————————————————————————————

시퀀스

CREATE SEQUENCE seq_jumun_no

    INCREMENT BY 1    (증가.  INCREMENT BY -1 하면 감소가 된다)

    START WITH 1000     (시작점)

    MAXVALUE 1010      (MAXVALUE, MINVALUE 지정하지 않을시 무한대로 감)

    MINVALUE 990        

    CYCLE                   (범위가 MAX를 넘어가면 순환되게 만든다. 보통 NOCYCLE로 씀(기본값). 보통 프라이머리키이기 때문임.)

    CACHE 2;               (미리 20개 정도 저장하고 들어감)

조회: CURRVAL로 조회하면 현재값, NEXTVAL을 사용하며여 조회하면 다음값(=MAX+1)

답변형 게시판 제작

답변형 게시판 제작

<답변형 게시판 테이블> 

 게시물 번호
 이름
 이메일
 제목
 내용
 비번
 작성일
 조회수
 그룹번호 gi
 그룹출력순서 gs
 간격  gt
 루트  root
 깊이(댓글갯수) depth 

CREATE TABLE reply_board( 답변형 게시판

no NUMBER,

name VARCHAR2(34) CONSTRAINT rb_nn_name NOT NULL,

email VARCHAR2(50),

subject VARCHAR2(1000) CONSTRAINT rb_nn_sub NOT NULL,

content CLOB CONSTRAINT rb_nn_cont NOT NULL,

pwd VARCHAR2(10) CONSTRAINT rb_nn_pwd NOT NULL,

regdate DATE DEFAULT SYSDATE,

hit NUMBER DEFAULT 0,

group_id NUMBER,

group_step NUMBER,

group_tab NUMBER,

root NUMBER,

depth NUMBER,

CONSTRAINT rb_pk_no PRIMARY KEY(no)

);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,1,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,2,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,3,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,4,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,5,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,6,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,7,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,8,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,9,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,10,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,11,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,12,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,13,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,14,0,0,0,0);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,15,0,0,0,1);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,16,1,1,16,1);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,16,1,1,16,1);

INSERT INTO reply_board VALUES(

(SELECT NVL(MAX(no)+1,1) FROM reply_board),

홍길동,,답변형 게시판 연습중,답변형 게시판 연습중,‘1234’,SYSDATE,0,16,2,2,17,0);

COMMIT;

SELECT * FROM reply_board

ORDER BY group_id DESC, group_step ASC;

//예비

//DELETE FROM reply_board;

//SELECT * FROM reply_board; 

1. DTO 만들기

2. DAO 기본사항 만들기

private Connection conn;

private PreparedStatement ps;

private final String URL=“jdbc:oracle:thin:@localhost:1521:ORCL”;

private final String DRIVER=oracle.jdbc.driver.OracleDriver;


public 클래스이름(){ //생성자에 만드는 이유(한번만 실행)

try{

Class.forName(DRIVER);

}catch(Exception ex){System.out.println(ex.getMessage());}

}

 

public void getConnection(){

try{

conn=DriverManager.getConnection(URL,“scott”,“tiger);

}catch(Exception ex){System.out.println(ex.getMessage());}

}

 

public void disConnection(){

try{

if(ps!=null) ps.close();

if(conn!=null) conn.close();

}catch(Exception ex){System.out.println(ex.getMessage());}

}

라이브러리와 프레임워크의 차이는 무엇인가?

라이브러리와 프레임워크의 차이는 무엇인가?

자바는 라이브러리이고 스프링은 프레임워크이다.
라이브러리는 완제품이라 개조할 수 없다. 스프링은 프레임워크 수정해서 쓸 수 있다.
ex) 전자정부 프레임워크(정부), 애니 프레임워크(삼성)

파티션(PARTITION)

파티션(PARTITION)

우선 scott에게 “테이블 스페이스(공간)”를 만들 수 있는 권한을 줘야 한다.

SQL Plus 를 관리자 권한으로 들어가서 아래처럼 권한을 준다.

테이블 스페이스 권한을 줘야 한다

conn system/tiger;

GRANT CREATE TABLESPACE TO scott;

conn scott/tiger;

1. 테이블 스페이스 생성

CREATE TABLESPACE data1 DATAFILE ‘/app/user/oradata/orcl/data1.dbf’ –역슬래시가 아닌 슬래시 사용, 맨 앞의 ‘C:’생략

SIZE 10M AUTOEXTEND ON;–10M가 다 차면 1기가씩 늘어남(디폴트)

                       –‘SIZE 10M AUTOEXTEND ON 20M’라고 쓰면 20M씩 증가함

CREATE TABLESPACE data2 DATAFILE ‘/app/user/oradata/orcl/data2.dbf’

SIZE 10M AUTOEXTEND ON;

CREATE TABLESPACE data3 DATAFILE ‘/app/user/oradata/orcl/data3.dbf’

SIZE 10M AUTOEXTEND ON;

CREATE TABLESPACE data4 DATAFILE ‘/app/user/oradata/orcl/data4.dbf’

SIZE 10M AUTOEXTEND ON;

2. 테이블을 만들면서 파티션 할당

CREATE TABLE emp_pt(

empno NUMBER(4),

ename VARCHAR2(20),

job VARCHAR2(20),

hiredate DATE,

sal NUMBER(7,2)

)

PARTITION BY RANGE(empno)(

PARTITION emp_p1 VALUES LESS THAN(2000) TABLESPACE data1, –2000 미만이면 data1 테이블스페이스에 저장

PARTITION emp_p2 VALUES LESS THAN(4000) TABLESPACE data2,

PARTITION emp_p3 VALUES LESS THAN(7000) TABLESPACE data3,

PARTITION emp_p4 VALUES LESS THAN(9000) TABLESPACE data4

);

–CREATE 문을 끝내고 세미콜론을 찍지 않고, 이어서 파티션을 쓰는것에 주의

3. 데이터 삽입

INSERT INTO emp_pt VALUES(1000,‘1,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(1500,‘1,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(2000,‘2,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(2500,‘2,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(4000,‘3,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(4500,‘3,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(7000,‘4,과장,SYSDATE,3000);

INSERT INTO emp_pt VALUES(7500,‘4,과장,SYSDATE,3000);

COMMIT;

4. 데이터 확인

SELECT * FROM emp_pt;

SELECT * FROM emp_pt PARTITION (emp_p1);

SELECT * FROM emp_pt PARTITION (emp_p2);

SELECT * FROM emp_pt PARTITION (emp_p3);

SELECT * FROM emp_pt PARTITION (emp_p4);

DDL: ALTER, DROP

DDL: ALTER, DROP

일단 테스트를 위한 테이블을 만들자.

테이블 만들

CREATE TABLE test(

  id VARCHAR2(10),

  pwd VARCHAR2(10));

1. ALTER

컬럼 추가

ALTER TABLE test ADD name VARCHAR2(20) CONSTRAINT test_nn_name NOT NULL;

컬럼 수정

ALTER TABLE test MODIFY id VARCHAR2(20) CONSTRAINT test_pk_id PRIMARY KEY;

컬럼 삭제

ALTER TABLE test DROP COLUMN name;

값 추가

INSERT INTO test VALUES(‘aaa’,’1234′);

INSERT INTO test VALUES(‘bbb’,‘1234’);

INSERT INTO test VALUES(‘ccc’,‘1234’);

COMMIT;

2. DELETE

테이블 삭제하기

1.DELETE (테이블 구조는 남는다)

DELECT FROM test;

2. TRUNCATE (테이블 구조는 남는다(데이터 잘라내기), 딜리트보다 빠르다) //주의!오토커밋

TRUNCATE TABLE test;

3. DROP (테이블 완전히 다 없어짐) //주의!오토커밋

DROP TABLE test;

———————————————————————————————————-

다시 연습을 위한 테이블을 만들자.

DROP TABLE 판매전표;

DROP TABLE 제품;

DROP TABLE 전표상세;

CREATE TABLE 판매전표(

  전표번호 VARCHAR2(12),

  판매일자 DATE,

  고객명 VARCHAR2(34),

  총액 NUMBER

);

CREATE TABLE 제품(

  제품번호 VARCHAR2(12),

  제품명 VARCHAR2(50),

  제품단가 NUMBER

);

CREATE TABLE 전표상세(

  전표번호 VARCHAR2(12),

  제품번호 VARCHAR2(12),

  수량 NUMBER,

  단가 NUMBER,

  금액 NUMBER

);

1. ALTER로 제약조건 주기

ALTER TABLE 판매전표 ADD CONSTRAINT 판매전표_pk_전표번호 PRIMARY KEY(전표번호);

ALTER TABLE 판매전표 ADD CONSTRAINT 판매전표_ck_총액 CHECK(총액>0);

ALTER TABLE 판매전표 MODIFY 고객명 CONSTRAINT 판매전표_nn_고객명 NOT NULL;

2. ALTER로 제약조건 주기2

ALTER TABLE 제품 ADD CONSTRAINT 제품_uk_제품명 UNIQUE(제품명);

ALTER TABLE 전표상세 ADD CONSTRAINT 전표상세_fk_전표번호 FOREIGN KEY(전표번호) REFERENCES 판매전표(전표번호);