자바스크립트 제거하는 정규식

자바스크립트 제거하는 정규식

String str=”(function(){ var id=’admin’;});”;
System.out.println(str);

str=str.replaceAll(“\\(function.*\\(\\)\\{.*\\}.*\\);”, “”);
System.out.println(str);

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

(function글자들(){글자들}글자들);

을 제거한다.

좌측괄호 (  가 \\(

우측괄호 ) 가 \\) 임

자료구조 하이어라키

자료구조 하이어라키

 

워드클라우드(wordcloud) 만들기

워드클라우드(wordcloud) 만들기

반드시 UTF-8 로 저장된 txt만 가능하다.

1. R소스
     library(wordcloud)
     library(KoNLP)
     library(RColorBrewer)
     f<-file(‘c:/image/word.txt’,encoding=’UTF-8′)
     textLines<-readLines(f)
     nouns<-sapply(textLines,extractNoun,USE.NAMES=F)
     close(f)
     png(‘c:/image/plz.png’)
     wordcloud<-table(unlist(nouns))
     wordcloud(names(wordcloud),freq=wordcloud,scale=c(8,0,5),max.words=150,per=.1,min.freq=2,random.order=F)
     dev.off()
     System.out.println(“COMPLETE”)

2. 자바소스

 public static void imgSave() throws Exception
 {  
     RConnection rc=new RConnection();//Rserver Connection
     rc.voidEval(“Sys.setenv=(JAVA_HOME=\”c:/Program Files/Java/jre7\”)”);
     rc.voidEval(“library(wordcloud)”);
     rc.voidEval(“library(KoNLP)”);
     rc.voidEval(“library(RColorBrewer)”);
     rc.voidEval(“f<-file(\”c:/image/word.txt\”,encoding=\”UTF-8\”)”);
     rc.voidEval(“textLines<-readLines(f)”);
     rc.voidEval(“nouns<-sapply(textLines,extractNoun,USE.NAMES=F)”);
     rc.voidEval(“close(f)”);
     rc.voidEval(“png(\”c:/image/plz.png\”)”);
     rc.voidEval(“wordcloud<-table(unlist(nouns))”);
     rc.voidEval(“wordcloud(names(wordcloud),freq=wordcloud,scale=c(8,0,5),max.words=150,per=.1,min.freq=2,random.order=F)”);
     rc.voidEval(“dev.off()”);
     System.out.println(“COMPLETE”);
     rc.close();
 }

3. 임시 저장(즉각 출력)을 위한 자바소스

2번 소스와 txt 및 png 파일 위치만 다르다. 아래와 같이 메타데이터 안의 경로를 찾아넣어주면 jsp에서 <img src=”word.png”> 로만 불러들일 수 있다.

 public static void imgSave() throws Exception
 {
  RConnection rc=new RConnection();
  rc.voidEval(“Sys.setenv(JAVA_HOME=\”c:/Program Files/Java/jre7\”)”);
  rc.voidEval(“library(KoNLP)”);
  rc.voidEval(“library(RColorBrewer)”);
  rc.voidEval(“library(wordcloud)”);
  rc.voidEval(“f<-file(\”C:/springDev/springStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/SpringWebProject7/word/word.txt\”,encoding=\”utf-8\”)”);
  rc.voidEval(“textLines<-readLines(f)”);
  rc.voidEval(“nouns<-sapply(textLines,extractNoun,USE.NAMES=F)”);
  rc.voidEval(“close(f)”);
  //참고: c:/springDev2/springStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/DiningCodeProject/dlist_detail/image/cloudimg/word.jpg
  rc.voidEval(“png(\”C:/springDev/springStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/SpringWebProject7/word/word.png\”)”);
  rc.voidEval(“wordcloud<-table(unlist(nouns))”);
  rc.voidEval(“pal<-brewer.pal(17,\”Set3\”)”);
  rc.voidEval(“pal<-pal[-(1)]”);
  rc.voidEval(“windowsFonts(malgun=windowsFont(\”Malgun Gothic\”))”);
  rc.voidEval(“wordcloud(names(wordcloud),freq=wordcloud,scale=c(8,0.5),max.words=150,rot.per=.1,min.freq=2,random.order=F, colors=pal, family=\”malgun\”)”);
  rc.voidEval(“dev.off()”);
  System.out.println(“COMPLETE”);
  rc.close();
 }

Rserve.exe 시스템 오류: jvm.dll이(가) 없어 프로그램을 시작할 수 없습니다

Rserve.exe 시스템 오류: jvm.dll이(가) 없어 프로그램을 시작할 수 없습니다

위와 같은 에러가 날 경우 아래와 같이 해결한다.

바탕화면의 내 PC-속성-고급 시스템 설정-고급 에서 Path라는 이름의 시스템 변수를 편집한다. Path라는 시스템 변수가 존재하지 않으면 새로 생성한다.

 

여기서 jvm.dll 이 존재하는 파일 경로를 쓰면 된다.

파일이 존재하는 위치가 컴퓨터마다 다른데, 내 컴퓨터의 경우 C:\Program Files\Java\jre7\bin\Server 였다.

이 경우 Path 변수에 C:\Program Files\Java\jre7\bin\Server; 라고 뒤 쪽이나 앞 쪽에 써주면 된다.

R 환경변수 세팅

R 환경변수 세팅

1. R 환경변수 세팅

바탕화면의 내 PC-속성-고급 시스템 설정-고급 에서 Path라는 이름의 시스템 변수를 편집한다. Path라는 시스템 변수가 존재하지 않으면 새로 생성한다.



 

1-1. R_HOME

시스템 변수 R_HOME 을 새로 만들고

C:\Program Files\R\R-3.2.0

라고 입력하기

1-2. Path

시스템 변수 Path 를 새로 만들어서 C:\Program Files\Java\jre7\bin\server;C:\Program Files\R\R-3.2.0\bin\x64;C:\Users\sist\Documents\R\win-library\3.2\rJava\jri\x64; 라고 쓰기

(기존에 Path가 있을 경우 기존 경로 뒤에

C:\Program Files\R\R-3.2.0\bin\x64;C:\Users\sist\Documents\R\win-library\3.2\rJava\jri\x64;

를 추가하기)

 

2. Arguments

자바에서 마우스 우클릭 후 Run As -> Run Configurations 로 들어가기

Arguments 탭에서 VM arguments 에 -Djava.library.path=C:\Users\user\Documents\R\win-library\3.2\rJava\jri\x64 라고 쓰기

 

3. R_HOME 

Environment에 R_HOME 변수를 만들어서 C:\Program Files\R\R-3.2.0 라고 값 쓰기.

 

4. PATH 

Environment에 PATH 변수를 만들어서 C:\Program Files\R\R-3.2.0\bin\x64;C:\Users\sist\Documents\R\win-library\3.2\rJava\jri\x64; 라고 값 넣기.

 

5. LD_LIBRARY_PATH 

Environment에 LD_LIBRARY_PATH 변수를 만들어서C:\Program Files\R\R-3.2.0\bin;C:\Program Files\R\R-3.2.0\library; 라고 값 넣기.

 

6. cmd 처리 

cmd 에서 cd c:\program files\r\r-3.2.0\bin 으로 들어가서,

R.exe CMD Rserve.exe 로 실행하기.

이 때, OK, ready to answer queries 가 나와야 정상작동.

 

태그제거하는 정규식

태그제거하는 정규식

str = str.replaceAll(“<(/)?([a-zA-Z]*)(

jaxp, jaxb

Java Architecture for XML Pasher (JAXP)

Java Architecture for XML Binding (JAXB)

 

csv

csv

Comma Separated Value의 약자. 말 그대로 “콤마로 구분된 값”.

자바 변수를 자바스크립트 변수로 넘기기

자바 변수를 자바스크립트 변수로 넘기기

1. 어레이리스트를 넘기기

<script>
  <c:forEach var=”vo” items=”list”>
   [‘<c:out value=”${vo.goods}”/>’]
  </c:forEach>
</script>

2. 단일 변수 넘기기

<script>
  var question=”<c:out value=”${member.question}”>”;
  var i = “<%=i%>”;</c:out>
</script>

 

R스튜디오 다운로드

R스튜디오 다운로드


1. R스튜디오 다운로드 

http://www.rstudio.com/products/rstudio/download/ 에서 RStudio 0.99.441 – Windows XP/Vista/7/8 다운로드

 

2. 참고 사이트

http://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html

몽고디비 sql 정리

SQL 문장

Mongo 쿼리 문장 

CREATE TALE USERS (a int, b int)


db.createCollection(“mycoll”) 

테이블 드랍하기 : db.mycoll.drop();

DB명 통째로 삭제하기: use mydb -> db.dropDatabase();  라고 쓰기

DB명 안의 테이블(=콜렉션) 전체 보기: show tables, 혹은 show collections

 INSERT INTO USERS VALUES (3,5)

db.users.insert({a:3, b:5}) 

 SELECT a, b FROM USERS

db.users.find({}, {a:1, b:1}) 

 SELECT * FROM users

 db.users.find()

 SELECT * FROM users WHERE age=33

 db.users.find({age:33})

 SELECT a,b FROM users WHERE age=33

 db.users.find({age:33}, {a:1,b:1})

 SELECT * FROM users WHERE age=33 ORDER BY name

 db.users.find({age:33}).sort({name:1})

 SELECT * FROM users WHERE age>33

 db.users.find({‘age’:{$gt:33}})

 SELECT * FROM users WHERE age<33

 db.users.find({‘age’:{$lt:33}})

 SELECT * FROM users WHERE name LIKE“%Joe%”

 db.users.find({name:/Joe/})

 SELECT * FROM users WHERE name LIKE “Joe%”

 db.users.find({name:/^Joe/})

 SELECT * FROM users WHERE age>33 AND age<=40

 db.users.find({‘age’:{$gt:33,$lte:40}})

 SELECT * FROM users ORDER BY name DESC

 db.users.find().sort({name:-1})

 SELECT * FROM users WHERE a=1 and b=’q’

 db.users.find({a:1,b:’q’})

 SELECT * FROM users LIMIT 10 SKIP 20

 SELECT * FROM users LIMIT 10 SKIP 20

 SELECT * FROM users WHERE a=1 or b=2

 db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } )

 SELECT * FROM users LIMIT 1

 db.users.findOne()

 SELECT DISTINCT last_name FROM users

 db.users.distinct(‘last_name’)

 SELECT COUNT(*y) FROM users

 db.users.count()

 

 SELECT COUNT(*y) FROM users where AGE > 30

 db.users.find({age: {‘$gt’: 30}}).count()

 SELECT COUNT(AGE) from users

 db.users.find({age: {‘$exists’: true}}).count()

 

 CREATE INDEX myindexname ON users(name)

 db.users.ensureIndex({name:1})

 CREATE INDEX myindexname ON users(name,ts DESC)

 db.users.ensureIndex({name:1,ts:-1})

 EXPLAIN SELECT * FROM users WHERE z=3

 db.users.find({z:3}).explain()

 UPDATE users SET a=1 WHERE b=’q’

 db.users.update({b:’q’}, {$set:{a:1}}, falsetrue)

 UPDATE users SET a=a+2 WHERE b=’q’

 db.users.update({b:’q’}, {$inc:{a:2}}, falsetrue)

 DELETE FROM users WHERE z=“abc”

 db.users.remove({z:’abc’});

맵리듀스 두번째

맵리듀스 두번째

1. 몽고디비 인서트

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”);
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“person”);
   BasicDBObject obj=new BasicDBObject();
   obj.put(“name”, “일”);
   obj.put(“sex”, “m”);
   obj.put(“age”, 20);
   dbc.insert(obj);
   
   obj=new BasicDBObject();
   obj.put(“name”, “이”);
   obj.put(“sex”, “m”);
   obj.put(“age”, 30);
   dbc.insert(obj);
   
   obj=new BasicDBObject();
   obj.put(“name”, “삼”);
   obj.put(“sex”, “w”);
   obj.put(“age”, 20);
   dbc.insert(obj);
   
   obj=new BasicDBObject();
   obj.put(“name”, “사”);
   obj.put(“sex”, “m”);
   obj.put(“age”, 40);
   dbc.insert(obj);
   
   obj=new BasicDBObject();
   obj.put(“name”, “오”);
   obj.put(“sex”, “m”);
   obj.put(“age”, 30);
   dbc.insert(obj);
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

2. 몽고디비 셀렉트

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”);
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“person”);

   DBCursor cursor=null;
   BasicDBObject query=null;
   
   cursor=dbc.find();
   System.out.println(“1.COUNT…”);
   System.out.println(“result:”+cursor.count());
   while(cursor.hasNext()){
    System.out.println(cursor.next());
   }
   cursor.close();
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

3. 비교연산자로 find

(몽고디비의 SELECT WHERE)

find({“age”,20}); 하면

여기에 조건을 줄 수 있다.

$gt (크다)

$gte (크거나 같다)

$lte (작거나 가다)

$lt (작다)

$ne (이콜이 아니다) (eq는 없다. 그냥 쓰는게 eq다)

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”);
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“person”);

   DBCursor cursor=null;
   BasicDBObject query=null;
   
   cursor=dbc.find();
   System.out.println(“1.COUNT…”);
   System.out.println(“result:”+cursor.count());
   
   
   System.out.println(“================”);
   
   String[] op={“$gt”,”$lt”,”$lte”,”$gte”,”$ne”};
   for(String str:op){
    query=new BasicDBObject(“age”,new BasicDBObject(str,20));
    cursor=dbc.find(query);
    
    System.out.println(“비교연산자: 값 “+str+” “+20);
    System.out.println(“Result: “+cursor.count());
    while(cursor.hasNext()){
     System.out.println(cursor.next());
    }
    cursor.close();
   }
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

4. 패턴으로 find (많은 의문이 남아있음.)

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”);
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“person”);

   DBCursor cursor=null;
   BasicDBObject query=null;
   
   cursor=dbc.find();
   System.out.println(“전체 갯수:”+cursor.count());
   System.out.println(“================”);

   System.out.println();
   Pattern j=Pattern.compile(“일”,Pattern.CASE_INSENSITIVE);
   query=new BasicDBObject(“name”,j);
   BasicDBObject keys=new BasicDBObject();//조건 세 개 and로 묶기?????????????????
   cursor=dbc.find(query,keys);
   System.out.println(“result: “+cursor.count());

   while(cursor.hasNext()){
       System.out.println(cursor.next());
   }
   cursor.close();
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

5. $in 과 $nin

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”);
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“person”);

   DBCursor cursor=null;
   BasicDBObject query=null;
   
   cursor=dbc.find();
   System.out.println(“전체 갯수:”+cursor.count());
   System.out.println(“================”);
   
   String[] or={“$in”,”$nin”};
   int[] age_arr={20,30};
   for(int i=0;i<or.length;i++){
    query=new BasicDBObject(“age”,new BasicDBObject(or[i],age_arr));
    cursor=dbc.find(query);
    System.out.println(“결과 갯수: “+cursor.count());
    while(cursor.hasNext()){
     System.out.println(cursor.next());
    }
    cursor.close();
   }
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

맵리듀스

맵리듀스

맵리듀스가 이런거였다니 허망하기 짝이 없다.

(1) aaa bbb ccc bbb ccc aaa bbb 로 데이터가 넘어온다면,

(2) 맵: 첫째로 (aaa,1) (bbb,1) (ccc,1) (bbb,1) (ccc,1) (aaa,1) (bbb,1) 식으로 바꾼다. 이것을 Map이라고 한다.

     ※ Map: key와 Value의 쌍으로 이루어진 자료구조

(3) 셔플: 둘째로 (aaa,1,1) (bbb,1,1,1) (ccc,1,1) 식으로 같은 것끼리 모을 수 있다.

(4) 리듀스: 마지막으로 (aaa,2) (bbb,3) (ccc,2) 로 바꿀 수 있다. 리듀스이다.

     ※ Reduce: Map을 줄여나감(Reduce). 갯수를 세거나, 밸류의 총합을 내거나, 평균을 구함.

몽고 DB 인서트

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”); //localhost,27017); 포트번호 27017
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“books”);
   
   BasicDBObject book=new BasicDBObject();
   book.put(“name”, “자바의 정석”);
   book.put(“pages”, 600);
   dbc.insert(book);
   
   book=new BasicDBObject();
   book.put(“name”, “삼국지”);
   book.put(“pages”, 500);
   dbc.insert(book);
   
   book=new BasicDBObject();
   book.put(“name”, “초한지”);
   book.put(“pages”, 700);
   dbc.insert(book);
   
   book=new BasicDBObject();
   book.put(“name”, “손자병법”);
   book.put(“pages”, 2000);
   dbc.insert(book);
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }

맵 리듀스

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”); //localhost,27017); 포트번호 27017
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“books”);
   
   String map=”function(){ var category; if(this.pages>=600){category=’Big Books’;} else{category=’Small Books’;} emit(category,{name:this.name});}”;
   String reduce=”function(key,values){var sum=0; values.forEach(function(doc){sum+=1;}); return {books:sum}; }”;
   MapReduceCommand cmd=new MapReduceCommand(dbc, map, reduce, null, MapReduceCommand.OutputType.INLINE, null);
   MapReduceOutput out=dbc.mapReduce(cmd);
   
   for(DBObject o:out.results()){
    System.out.println(o.toString());
   }
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }

제이슨(json)

제이슨(json)

제이손 라이브러리

1. json-lib-2.4-jdk15.jar1

2. EZmorph 1.0.6

<dependency>
 <groupId>net.sf.ezmorph</groupId>
 <artifactId>ezmorph</artifactId>
 <version>1.0.6</version>
</dependency>
 

제이슨 입력

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   //{변수:값, 변수:값…} JSONObject
   // [{},{},{},{}] JSONArray
   
   
   JSONObject obj=new JSONObject();
   obj.put(“name”, “박문수”);
   obj.put(“sex”, “남자”);
   obj.put(“age”, 30);
   
   FileOutputStream fos=new FileOutputStream(“./info.json”);
   fos.write(obj.toJSONString().getBytes(“UTF-8”));//바이트로 변환. 이때 UTF-8을 줘야 한글이 깨지지 않는다
   fos.close();
   System.out.println(“데이터 저장 완료”);
   
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
}

제이슨 출력

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   
   //제이슨 파서가 제이슨 번역기다.
   JSONParser parser=new JSONParser();
   Object obj2=parser.parse(new InputStreamReader(new FileInputStream(“./info.json”),”UTF-8″));
   JSONObject jsonObj=(JSONObject)obj;
   String name=(String)jsonObj.get(“name”);
   String sex=(String)jsonObj.get(“sex”);
   Long age=Long.valueOf(jsonObj.get(“age”).toString());
   System.out.println(“Name”+name);
   System.out.println(“Sex”+sex);
   System.out.println(“Age”+age);
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
}

제이슨 입력 2

 

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   AddressBook ad=createAddressBook();
   JSONObject obj=JSONObject.fromObject(JSONSerializer.toJSON(ad));
   System.out.println(obj.toString());
   FileOutputStream fos=new FileOutputStream(“./address.json”);
   fos.write(obj.toString().getBytes(“UTF-8”));
   fos.close();
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

제이슨 출력 2

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   
   AddressBook ad=createAddressBook();
   JSONObject obj=JSONObject.fromObject(JSONSerializer.toJSON(ad));

   JSONArray users=(JSONArray)obj.get(“user”);
   JSONObject user=(JSONObject)users.get(0);
   System.out.println(“Name:”+user.get(“name”));
   System.out.println(“Phone:”+user.get(“phone”));
   System.out.println(“Address:”+user.get(“Address”));
   

   JSONObject emails=(JSONObject)user.get(“emails”);
   JSONArray email=(JSONArray)emails.get(“email”);
   
   for(int i=0;i<email.size();i++){
    JSONObject temp=(JSONObject)email.get(i);
    System.out.println(temp.get(“id”)+” “+temp.get(“emailAddr”));
   }
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

구글에서 도서 제이슨 얻어오기

https://www.googleapis.com/books/v1/volumes?q=nosql

깡패파서기 버젼2

깡패파서기 버젼2

package p1;

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.io.File;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JEditorPane;
import javax.swing.JFileChooser;

import org.apache.catalina.ant.FindLeaksTask;

import com.sun.java.swing.plaf.windows.resources.windows;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.org.apache.xerces.internal.impl.dtd.models.DFAContentModel;

public class Main {
 static Robot robot;
 public static void main(String[] args) {
  
  ProcessBuilder p=new ProcessBuilder(“notepad.exe”);
  WinDef.HWND hWnd;//윈도우 핸들
  try{
   //로봇 선언
   robot=new Robot();
   Date d=new Date();
   SimpleDateFormat sdf=new SimpleDateFormat(“MMdd_hhmmss_”);
   String d2=sdf.format(d);
   System.out.println(d2);
   
   for(int i=1;i<=2;i++){
   //기존의 파일이 있다면 미리 지운다
   File f=new File(“c:\\data\\”+d2+”g”+i+”.txt”);
   
   if(f.exists()){System.out.println(“기존 파일을 삭제”);f.delete();}
   
   hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);//메모장이 없으므로 널이 나와야 한다
   
   if(hWnd!=null){
    System.out.println(“실행 중인 메모장을 종료한 후 다시 시작해주세요”);
    return;
   }
   
   //메모장을 켠다
   p.start();
   
   checkProgress();
   
   //메모장이 켜졌는지 검사
   hWnd=null;
   while(hWnd==null){
    System.out.println(“메모장을 로드 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
    if(adminEnd()==true){System.exit(0);}
   }
   robot.delay(500);
   //파일을 연다
   CtrlO(0);
   
   
   //열기 창이 닫혔는지 검사
   hWnd = User32.INSTANCE.FindWindow(null, “열기”);
   while(hWnd!=null){
    System.out.println(“열기 창을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “열기”);
    if(adminEnd()==true){System.exit(0);}
   }
   robot.delay(200);
   
   String target=”건대입구”;
   target=URLEncoder.encode(target,”utf-8″);
   
   String str=”http://cafeblog.search.naver.com/search.naver?where=post&sm=tab_pge&query=”+target+”&st=sim&date_option=0&date_from=&date_to=&dup_remove=1&post_blogurl=&post_blogurl_without=&srchby=all&nso=&ie=utf8&start=”+(i*10-10);
   System.out.println(str);
   Main m=new Main();
   
   m.setClipboardContents(str);

   //한땀한땀 입력:::
   //str=str.toLowerCase();
   //keyPress(str);
   
   //url명을 붙여넣기 해서 엔터친다
   CtrlA(200);
   Del(200);
   CtrlV(200);
   Enter();
   
   //열기 창이 닫혔는지 검사
   hWnd = User32.INSTANCE.FindWindow(null, “열기”);
   while(hWnd!=null){
    System.out.println(“열기 창을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “열기”);
    if(adminEnd()==true){System.exit(0);}
   }
   robot.delay(200);
   
   checkProgress();
   robot.delay(200);
   
   //파일 저장 윈도우를 연다
   CtrlS(0);
   
   //저장 창이 켜졌는지 검사
   hWnd=null;
   while(hWnd==null){
    System.out.println(“저장 창을 로드 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “다른 이름으로 저장”);
    if(adminEnd()==true){System.exit(0);}
   }
   robot.delay(200);
   
   //저장한다
   m.setClipboardContents(“c:\\data\\”+d2+”g”+i+”.txt”);
   CtrlV(200);
   Enter();
   
   //저장 창이 닫혔는지 검사
   hWnd = User32.INSTANCE.FindWindow(null, “다른 이름으로 저장”);
   while(hWnd!=null){
    System.out.println(“저장 창을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “다른 이름으로 저장”);
    if(adminEnd()==true){System.exit(0);}
   }
   robot.delay(200);
   checkProgress();
   robot.delay(200);
   

  
   //메모장을 끈다
   AltF4(200);
   
   while(!f.exists()){
    //파일이 존재하지 않는다면 문제가 생긴 것이다
    System.out.println(“파일을 저장중”);
   }
   
   while(!f.canRead()){
    System.out.println(“대기”);
   }
   
   //메모장이 꺼졌는지 검사
   hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
   while(hWnd!=null){
    //System.out.println(“메모장을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
   }
   System.out.println(i+”번째 파일 : “+(i*10-10)+”번째부터 “+(i*10-1)+”까지 세이브됨”);
  
    }//포문 닫힘
  }
  catch(Exception ex){System.out.println(“에러”+ex.getMessage());}
  

 }
 public void setClipboardContents(String str){
  
  Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        StringSelection contents = new StringSelection(str);
        clipboard.setContents(contents, null);
       

   }

 public static void keyPress(String str) throws Exception{
    for(int i=0;i<str.length();i++){
    
     String mykey=str.substring(i,i+1);
     int newkey=mykey.charAt(0);
    
     if(mykey.equals(“:”)){
     Colon();
     }
     else if(mykey.equals(“/”)){
      Slash();
     }
     else if(mykey.equals(“.”)){
      Dot();
     }
     else if(mykey.equals(“?”)){
      System.out.println(“d”);
       Quest();
     }
     else if(mykey.equals(“&”)){
       Andmark();
     }
     else if(mykey.equals(“_”)){
       Underbar();
     }
     else if(mykey.equals(“=”)){
       Eqmark();
     }
     else if(mykey.equals(“%”)){
       Permark();
     }
     else if(mykey.equals(“1”)){
       num1();
     }
     else if(mykey.equals(“2”)){
       num2();
     }
     else if(mykey.equals(“3”)){
       num3();
     }
     else if(mykey.equals(“4”)){
       num4();
     }
     else if(mykey.equals(“5”)){
       num5();
     }
     else if(mykey.equals(“6”)){
       num6();
     }
     else if(mykey.equals(“7”)){
       num7();
     }
     else if(mykey.equals(“8”)){
       num8();
     }
     else if(mykey.equals(“9”)){
       num9();
     }
     else if(mykey.equals(“0”)){
       num0();
     }
     else{
      PressWhat(newkey);
     }
    
     robot.delay(200);
    }
    Enter();
 }
 
 //http://web.mit.edu/gleitz/gizmoball/trunk/api/src-html/gizmoball/SwingKeyboardInput.html
 public static void Quest() throws Exception{
//    robot.keyPress(63);
//    robot.keyRelease(63);
  robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_SLASH);
    robot.keyRelease(KeyEvent.VK_SLASH);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void AltF4(int delay) throws Exception{
  robot.keyPress(KeyEvent.VK_ALT);
    robot.keyPress(KeyEvent.VK_F4);
    robot.keyRelease(KeyEvent.VK_F4);
    robot.keyRelease(KeyEvent.VK_ALT);
    robot.delay(delay);
 }
 public static boolean adminEnd(){
  boolean bef=false;
  //메모장을 끄기전, 혹시 이미 메모장이 꺼졌는지 검사(사용자 강제종료인지)
  WinDef.HWND hWnd;//윈도우 핸들
  hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
  if(hWnd==null){
   System.out.println(“사용자가 강제종료하였습니다.”);
   bef=true;
  }
  return bef;
 }
 public static void Andmark() throws Exception{
//    robot.keyPress(38);
//    robot.keyRelease(38);
    robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_7);
    robot.keyRelease(KeyEvent.VK_7);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void Underbar() throws Exception{
//    robot.keyPress(95);
//    robot.keyRelease(95);
  robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(45);
    robot.keyRelease(45);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void num1() throws Exception{robot.keyPress(KeyEvent.VK_1); robot.keyRelease(KeyEvent.VK_1);}
 public static void num2() throws Exception{robot.keyPress(KeyEvent.VK_2); robot.keyRelease(KeyEvent.VK_2);}
 public static void num3() throws Exception{robot.keyPress(KeyEvent.VK_3); robot.keyRelease(KeyEvent.VK_3);}
 public static void num4() throws Exception{robot.keyPress(KeyEvent.VK_4); robot.keyRelease(KeyEvent.VK_4);}
 public static void num5() throws Exception{robot.keyPress(KeyEvent.VK_5); robot.keyRelease(KeyEvent.VK_5);}
 public static void num6() throws Exception{robot.keyPress(KeyEvent.VK_6); robot.keyRelease(KeyEvent.VK_6);}
 public static void num7() throws Exception{robot.keyPress(KeyEvent.VK_7); robot.keyRelease(KeyEvent.VK_7);}
 public static void num8() throws Exception{robot.keyPress(KeyEvent.VK_8); robot.keyRelease(KeyEvent.VK_8);}
 public static void num9() throws Exception{robot.keyPress(KeyEvent.VK_9); robot.keyRelease(KeyEvent.VK_9);}
 public static void num0() throws Exception{robot.keyPress(KeyEvent.VK_0); robot.keyRelease(KeyEvent.VK_0);}
 
 public static void Permark() throws Exception{
  robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_5);
    robot.keyRelease(KeyEvent.VK_5);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void Eqmark() throws Exception{
    robot.keyPress(61);
    robot.keyRelease(61);
 }
 public static void PressWhat(int nkey) throws Exception{
   robot.keyPress(nkey-32);
   robot.keyRelease(nkey-32);
  }
  public static void Enter() throws Exception{
   robot.keyPress(KeyEvent.VK_ENTER);
   robot.keyRelease(KeyEvent.VK_ENTER); //97을 넣으면 숫자1이 나옴
  }
  public static void Dot() throws Exception{
   robot.keyPress(46);
   robot.keyRelease(46);
  }
  public static void Slash() throws Exception{
   robot.keyPress(KeyEvent.VK_SLASH);
   robot.keyRelease(KeyEvent.VK_SLASH);
  }
  public static void CtrlO(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_O);
    robot.keyRelease(KeyEvent.VK_O);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
  public static void CtrlY(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_Y);
    robot.keyRelease(KeyEvent.VK_Y);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
  public static void CtrlW(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_W);
    robot.keyRelease(KeyEvent.VK_W);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void CtrlS(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void CtrlV(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void CtrlA(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_A);
    robot.keyRelease(KeyEvent.VK_A);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void Del(int delay) throws Exception{
    robot.keyPress(127);
    robot.keyRelease(127);
    robot.delay(delay);
 }
 public static void Colon() throws Exception{
    robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_SEMICOLON);
    robot.keyRelease(KeyEvent.VK_SEMICOLON);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void checkProgress(){
  //프로그레스 창 검사
  WinDef.HWND hWnd=null;//윈도우 핸들;

  while(true){

   hWnd = User32.INSTANCE.FindWindow(“OperationStatusWindow”, null);
   if(hWnd!=null){
     char[] windowText = new char[512];
              User32.INSTANCE.GetWindowText(hWnd, windowText, 512);//텍스트 받기
             
              String wText = Native.toString(windowText);
             
             
              System.out.println(“프로그레스 창이 실행중입니다.”+wText);
              if(wText==null || wText.equals(“진행률”)){break;}
   }
   
   if(hWnd==null){ break;}
  }
 }
}
 

깡패파서기

깡패파서기

 

package p1;

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.io.File;

import javax.swing.JEditorPane;
import javax.swing.JFileChooser;

import org.apache.catalina.ant.FindLeaksTask;

import com.sun.java.swing.plaf.windows.resources.windows;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;

public class Main {
 static Robot robot;
 public static void main(String[] args) {
  
  ProcessBuilder p=new ProcessBuilder(“notepad.exe”);
  WinDef.HWND hWnd;//윈도우 핸들
  try{
   //로봇 선언
   robot=new Robot();
   
   
   for(int i=1;i<=100;i++){
   //기존의 파일이 있다면 미리 지운다
   File f=new File(“c:\\data\\g”+i+”.txt”);
   if(f.exists()){System.out.println(“기존 파일을 삭제”);f.delete();}
   
   hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);//메모장이 없으므로 널이 나와야 한다
   
   if(hWnd!=null){
    System.out.println(“실행 중인 메모장을 종료한 후 다시 시작해주세요”);
    return;
   }
   
   //메모장을 켠다
   p.start();
   
   //메모장이 켜졌는지 검사
   hWnd=null;
   while(hWnd==null){
    //System.out.println(“메모장을 로드 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
   }
   
   //파일을 연다
   CtrlO(0);
   
   //열기 창이 켜졌는지 검사
   hWnd=null;
   while(hWnd==null){
    //System.out.println(“열기 창을 로드 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “열기”);
   }
   
   String target=”신촌”;
   String str=”https://www.google.co.kr/search?hl=ko&as_q=”+target+”&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&as_filetype=&as_rights=&start=”+(i*10-10);
   
   Main m=new Main();
   m.setClipboardContents(str);

   //한땀한땀 입력::: //str=str.toLowerCase(); //keyPress(str);
   
   //url명을 붙여넣기 해서 엔터친다
   CtrlV(200);
   Enter();
   
   //열기 창이 닫혔는지 검사
   hWnd = User32.INSTANCE.FindWindow(null, “열기”);
   while(hWnd!=null){
    //System.out.println(“열기 창을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “열기”);
   }
   robot.delay(100);
   
   //파일 저장 윈도우를 연다
   CtrlS(0);
   
   //저장 창이 켜졌는지 검사
   hWnd=null;
   while(hWnd==null){
    //System.out.println(“저장 창을 로드 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “다른 이름으로 저장”);
   }
   robot.delay(100);
   
   //저장한다
   m.setClipboardContents(“c:\\data\\g”+i+”.txt”);
   CtrlV(200);
   Enter();
   
   //저장 창이 닫혔는지 검사
   hWnd = User32.INSTANCE.FindWindow(null, “다른 이름으로 저장”);
   while(hWnd!=null){
    System.out.println(“저장 창을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(null, “다른 이름으로 저장”);
   }
   robot.delay(100);
   
   //메모장을 끈다
   AltF4(200);
   
   while(!f.exists()){
    //파일이 존재하지 않는다면 문제가 생긴 것이다
    System.out.println(“파일을 저장중”);
   }
   
   while(!f.canRead()){
    System.out.println(“대기”);
   }
   
   //메모장이 꺼졌는지 검사
   hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
   while(hWnd!=null){
    //System.out.println(“메모장을 닫는 중입니다”);
    robot.delay(500);
    hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
   }
   System.out.println(i+”번째 파일 : “+(i*10-10)+”번째부터 “+(i*10-1)+”까지 세이브됨”);
   
    }//포문 닫힘
  }
  catch(Exception ex){System.out.println(“에러”+ex.getMessage());}
  

 }
 public void setClipboardContents(String str){
  
  Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        StringSelection contents = new StringSelection(str);
        clipboard.setContents(contents, null);

   }

 public static void keyPress(String str) throws Exception{
    for(int i=0;i<str.length();i++){
    
     String mykey=str.substring(i,i+1);
     int newkey=mykey.charAt(0);
    
     if(mykey.equals(“:”)){
     Colon();
     }
     else if(mykey.equals(“/”)){
      Slash();
     }
     else if(mykey.equals(“.”)){
      Dot();
     }
     else if(mykey.equals(“?”)){
      System.out.println(“d”);
       Quest();
     }
     else if(mykey.equals(“&”)){
       Andmark();
     }
     else if(mykey.equals(“_”)){
       Underbar();
     }
     else if(mykey.equals(“=”)){
       Eqmark();
     }
     else if(mykey.equals(“%”)){
       Permark();
     }
     else if(mykey.equals(“1”)){
       num1();
     }
     else if(mykey.equals(“2”)){
       num2();
     }
     else if(mykey.equals(“3”)){
       num3();
     }
     else if(mykey.equals(“4”)){
       num4();
     }
     else if(mykey.equals(“5”)){
       num5();
     }
     else if(mykey.equals(“6”)){
       num6();
     }
     else if(mykey.equals(“7”)){
       num7();
     }
     else if(mykey.equals(“8”)){
       num8();
     }
     else if(mykey.equals(“9”)){
       num9();
     }
     else if(mykey.equals(“0”)){
       num0();
     }
     else{
      PressWhat(newkey);
     }
    
     robot.delay(200);
    }
    Enter();
 }
 
 //http://web.mit.edu/gleitz/gizmoball/trunk/api/src-html/gizmoball/SwingKeyboardInput.html
 public static void Quest() throws Exception{
//    robot.keyPress(63);
//    robot.keyRelease(63);
  robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_SLASH);
    robot.keyRelease(KeyEvent.VK_SLASH);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void AltF4(int delay) throws Exception{
  robot.keyPress(KeyEvent.VK_ALT);
    robot.keyPress(KeyEvent.VK_F4);
    robot.keyRelease(KeyEvent.VK_F4);
    robot.keyRelease(KeyEvent.VK_ALT);
    robot.delay(delay);
 }
 public static void Andmark() throws Exception{
//    robot.keyPress(38);
//    robot.keyRelease(38);
    robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_7);
    robot.keyRelease(KeyEvent.VK_7);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void Underbar() throws Exception{
//    robot.keyPress(95);
//    robot.keyRelease(95);
  robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(45);
    robot.keyRelease(45);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void num1() throws Exception{robot.keyPress(KeyEvent.VK_1); robot.keyRelease(KeyEvent.VK_1);}
 public static void num2() throws Exception{robot.keyPress(KeyEvent.VK_2); robot.keyRelease(KeyEvent.VK_2);}
 public static void num3() throws Exception{robot.keyPress(KeyEvent.VK_3); robot.keyRelease(KeyEvent.VK_3);}
 public static void num4() throws Exception{robot.keyPress(KeyEvent.VK_4); robot.keyRelease(KeyEvent.VK_4);}
 public static void num5() throws Exception{robot.keyPress(KeyEvent.VK_5); robot.keyRelease(KeyEvent.VK_5);}
 public static void num6() throws Exception{robot.keyPress(KeyEvent.VK_6); robot.keyRelease(KeyEvent.VK_6);}
 public static void num7() throws Exception{robot.keyPress(KeyEvent.VK_7); robot.keyRelease(KeyEvent.VK_7);}
 public static void num8() throws Exception{robot.keyPress(KeyEvent.VK_8); robot.keyRelease(KeyEvent.VK_8);}
 public static void num9() throws Exception{robot.keyPress(KeyEvent.VK_9); robot.keyRelease(KeyEvent.VK_9);}
 public static void num0() throws Exception{robot.keyPress(KeyEvent.VK_0); robot.keyRelease(KeyEvent.VK_0);}
 
 public static void Permark() throws Exception{
  robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_5);
    robot.keyRelease(KeyEvent.VK_5);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }
 public static void Eqmark() throws Exception{
    robot.keyPress(61);
    robot.keyRelease(61);
 }
 public static void PressWhat(int nkey) throws Exception{
   robot.keyPress(nkey-32);
   robot.keyRelease(nkey-32);
  }
  public static void Enter() throws Exception{
   robot.keyPress(KeyEvent.VK_ENTER);
   robot.keyRelease(KeyEvent.VK_ENTER); //97을 넣으면 숫자1이 나옴
  }
  public static void Dot() throws Exception{
   robot.keyPress(46);
   robot.keyRelease(46);
  }
  public static void Slash() throws Exception{
   robot.keyPress(KeyEvent.VK_SLASH);
   robot.keyRelease(KeyEvent.VK_SLASH);
  }
  public static void CtrlO(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_O);
    robot.keyRelease(KeyEvent.VK_O);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
  public static void CtrlY(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_Y);
    robot.keyRelease(KeyEvent.VK_Y);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
  public static void CtrlW(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_W);
    robot.keyRelease(KeyEvent.VK_W);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void CtrlS(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void CtrlV(int delay) throws Exception{
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(delay);
 }
 public static void Colon() throws Exception{
    robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_SEMICOLON);
    robot.keyRelease(KeyEvent.VK_SEMICOLON);
    robot.keyRelease(KeyEvent.VK_SHIFT);
 }

}

마샬, 언마샬

마샬, 언마샬

정형화: RDBMX(오라클)

반정형화: XML, JSON, HTML

  –  JAXP (P는 파싱의 약자. DOM,SAX)

  –  JAXB(B는 바인드의 약자. xml과 클래스 연결)

비정형화: txt (정규식)    ex) .*VO  (뒤의 VO 붙은걸 다 달라)

                                 ex) \d{1-3}\\.\d{1-3}\\.\d{1-3}\\.\d{1-3} (ip를 달라)

                                 ex) ^{A-Za-z} 알파벳으로 시작(^)한다

                                 ex) ^{A-Za-z}{0-9}$  알파벳으로 시작(^)해서 정수로 끝나는($) 문자

1. pom.xml

<!– jaxb-impl 2.2.11 –>
<dependency>
 <groupId>com.sun.xml.bind</groupId>
 <artifactId>jaxb-impl</artifactId>
 <version>2.2.11</version>
</dependency>

<!– jaxb-core 2.2.11 –>
<dependency>
 <groupId>com.sun.xml.bind</groupId>
 <artifactId>jaxb-core</artifactId>
 <version>2.2.11</version>
</dependency>

<!– jaxb-api 2.2.11 –>
<dependency>
 <groupId>javax.xml.bind</groupId>
 <artifactId>jaxb-api</artifactId>
 <version>2.2.11</version>
</dependency>

—————————————–

<!– json.simple 1.1.1 –>
<dependency>
 <groupId>com.googlecode.json-simple</groupId>
 <artifactId>json-simple</artifactId>
 <version>1.1.1</version>
</dependency>

<!– Commons Lang 2.6 –>
<dependency>
 <groupId>commons-lang</groupId>
 <artifactId>commons-lang</artifactId>
 <version>2.6</version>
</dependency>

<!– Oracle JDBC Driver 10.2.0.4.0 –>
<dependency>
 <groupId>com.oracle</groupId>
 <artifactId>ojdbc14</artifactId>
 <version>10.2.0.4.0</version>
</dependency>

OJDBC는 다운로드가 안 될 것이다.
맨 위 쪽에
<repositories>
 <repository>
     <id>mesir-repo</id>
     <url></url>”>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
 </repository>
</repositories> 를 붙여줘야 다이렉트로 받는다.

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

info.java

package com.sist.web;

import javax.xml.bind.annotation.XmlRootElement;

import com.sun.xml.txw2.annotation.XmlAttribute;
import com.sun.xml.txw2.annotation.XmlElement;

/*
 *
 *  <info id=””>
 *   <name></name>
 *      <age></age>
 *  </info>
 * 
 * 
 * 바깥쪽 태그는 클래스 (info)
 * 속성은 어트리뷰트 (id)
 * 안쪽 태그는 엘리먼트 (name, age)
 * 전체를 감쌀 때 루트 엘리먼트
 */
@XmlRootElement
public class Info {
 private String name;
 private int age;
 private String id;
 public String getName() {
  return name;
 }
 
 @XmlElement
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 @XmlElement
 public void setAge(int age) {
  this.age = age;
 }
 public String getId() {
  return id;
 }
 @XmlAttribute
 public void setId(String id) {
  this.id = id;
 }
 
}

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

MainClass.java (마샬)
마샬 (클래스를 xml로)

public class MainClass {
 public static void main(String[] args) throws Exception{
  JAXBContext jc=JAXBContext.newInstance(Info.class);
  Info info=new Info();
  info.setName(“심청이”);
  info.setAge(30);
  info.setId(“shim”);
  Marshaller m=jc.createMarshaller();
  m.setProperty(Marshaller.JAXB_ENCODING, “EUC-KR”);
  m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  m.marshal(info, new File(“./info.xml”));
  System.out.println(“저장완료”);
 }
}

MainClass.java (언마샬)

언마샬 (xml을 클래스로)

public class MainClass {
 public static void main(String[] args) throws Exception{

  JAXBContext jc=JAXBContext.newInstance(Info.class);
  Unmarshaller m=jc.createUnmarshaller();
  Info info=(Info)m.unmarshal(new File(“./info.xml”));
  System.out.println(“Name:”+info.getName());
  System.out.println(“Age:”+info.getAge());
  System.out.println(“Id:”+info.getId());
 }
}

UTF8로 단어 변환

UTF8로 단어 변환

query=URLEncoder.encode(str, “UTF-8”);

라고 쓰면 “신촌”이 %EC%8B%A0%EC%B4%8C 가 된다.

자바로 외부프로그램 실행(java ProcessBuilder)

자바로 외부프로그램 실행

 

ProcessBuilder는 외부 프로그램(그림판, 메모장, 인터넷 익스플로러..)를 실행할 수 있게 해준다.

 

아래 예제는 실행하면 (1)인터넷 익스플로러를 켜서 (2)전체를 복사하고 (3)해당내용을 메모장으로 자동으로 옮겨 붙이는 작업을 수행한다. 단점은 속도가 느리다.

 

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.*;
import java.util.ArrayList;

public class Main {
 static Robot robot;
 public static void main(String[] args) throws Exception{

   try {
  //로봇을 생성
  
  ProcessBuilder b = new ProcessBuilder();
  
  ArrayList<String> v = new ArrayList<>();
  v.add(“C:\\Program Files\\Internet Explorer\\iexplore.exe”);
  v.add(“http://en.wikipedia.org/“);

  // Pass List to command method.
  b.command(v);
  b.start();
  
  robot=new Robot();
  robot.delay(10000);
  CtrlA();
  CtrlC();
  
  b=new ProcessBuilder();
  v = new ArrayList<>();
  v.add(“notepad.exe”);
  b.command(v);
  b.start();
  robot.delay(2000);
  CtrlV();
  
     } catch (Exception ex) { // 에러 처리
       System.err.println(“에러” + ex.getMessage());
     }
   }
 
 public static void CtrlA() throws Exception{
  robot.keyPress(KeyEvent.VK_CONTROL);
  robot.keyPress(KeyEvent.VK_A);
  robot.keyRelease(KeyEvent.VK_A);
  robot.keyRelease(KeyEvent.VK_CONTROL);
  robot.delay(200);
  System.out.println(“컨트롤A”);
 }
 
 public static void CtrlC() throws Exception{
  robot.keyPress(KeyEvent.VK_CONTROL);
  robot.keyPress(KeyEvent.VK_C);
  robot.keyRelease(KeyEvent.VK_C);
  robot.keyRelease(KeyEvent.VK_CONTROL);
  robot.delay(200);
  System.out.println(“컨트롤C”);
 }
 
 public static void CtrlV() throws Exception{
  robot.keyPress(KeyEvent.VK_CONTROL);
  robot.keyPress(KeyEvent.VK_V);
  robot.keyRelease(KeyEvent.VK_V);
  robot.keyRelease(KeyEvent.VK_CONTROL);
  robot.delay(200);
  System.out.println(“컨트롤V”);
 }
}

자바로 강제키입력 (java java.awt.Robot)

자바로 강제키입력

 

실행하면 강제로 폴더를 새로 열어서 google.com을 키입력하고 엔터키를 누르는 매크로.

 

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class Main  {
 static Robot robot;
 public static void main(String[] args) throws Exception{

   //로봇을 생성
   robot=new Robot();
   
   WinE();
   robot.delay(1000);
   System.out.println(“a”);
   AltD();
   
   keyPress(“google.com”);

 }
 public static void keyPress(String str) throws Exception{
  for(int i=0;i<str.length();i++){
   
   String mykey=str.substring(i,i+1);
   int newkey=mykey.charAt(0);
   
   if(mykey.equals(“:”)){
    //Colon();
   }
   else if(mykey.equals(“/”)){
    Slash();
   }
   else if(mykey.equals(“.”)){
    Dot();
   }
   else{
    PressWhat(newkey);
   }
   
   robot.delay(200);
  }
  Enter();
 }
 public static void PressWhat(int nkey) throws Exception{
  robot.keyPress(nkey-32);
  robot.keyRelease(nkey-32);
 }
 public static void Enter() throws Exception{
  robot.keyPress(KeyEvent.VK_ENTER);
  robot.keyRelease(KeyEvent.VK_ENTER); //97을 넣으면 숫자1이 나옴
 }
 public static void Dot() throws Exception{
  robot.keyPress(46);
  robot.keyRelease(46);
 }
 public static void Slash() throws Exception{
  robot.keyPress(KeyEvent.VK_SLASH);
  robot.keyRelease(KeyEvent.VK_SLASH);
 }
 
 public static void WinE() throws Exception{
  robot.keyPress(KeyEvent.VK_WINDOWS);
  robot.keyPress(KeyEvent.VK_E);
  robot.keyRelease(KeyEvent.VK_E);
  robot.keyRelease(KeyEvent.VK_WINDOWS);
  robot.delay(400);
  System.out.println(“윈도우키+E”);
 }
 
 public static void AltD() throws Exception{
  robot.keyPress(KeyEvent.VK_ALT);
  robot.keyPress(KeyEvent.VK_D);
  robot.keyRelease(KeyEvent.VK_D);
  robot.keyRelease(KeyEvent.VK_ALT);
  robot.delay(200);
  System.out.println(“알트+D”);
 }
}

자료실용(MultiPartResolver) app.xml

자료실용(MultiPartResolver) app.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xmlns:context=”http://www.springframework.org/schema/context
 xmlns:p=”http://www.springframework.org/schema/p
 xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd“>

 <context:annotation-config></context:annotation-config>
 <context:component-scan base-package=”com.*”></context:component-scan>
 
 <!– DataSource –>
 <!– SqlSessionFactory –>
 <!– Mapper구현 –>
 <!– ViewResolver –>
 <!– MultiPartResolver –>
 
 <!– DataSource –>
 <bean id=”ds” class=”org.apache.commons.dbcp.BasicDataSource”
 p:driverClassName=”oracle.jdbc.driver.OracleDriver”
 p:url=”jdbc:oracle:thin:@localhost:1521:ORCL”
 p:username=”scott”
 p:password=”tiger”
 p:maxActive=”10″
 p:maxIdle=”5″
 p:maxWait=”-1″>
 </bean>
 
 <!– SqlSessionFactory –>
 <bean id=”ssf”
 class=”org.mybatis.spring.SqlSessionFactoryBean”
 p:dataSource-ref=”ds”>
 </bean>
 
 <!– Mapper를 구현하는 클래스 –>
 <bean id=”mapper”
 class=”org.mybatis.spring.mapper.MapperFactoryBean”
 p:sqlSessionFactory-ref=”ssf”
 p:mapperInterface=”com.mybatis.dao.DataBoardMapper”>
 </bean>
 
 <!– ViewResolver –>
 <bean id=”viewResolver”
 class=”org.springframework.web.servlet.view.InternalResourceViewResolver”
 p:prefix=”/”
 p:suffix=”.jsp”>
 </bean>
 
 <!– MultiPartResolver –>
 <bean id=”multipartResolver”
 class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”>
 </bean>
</beans>
 

web.xml

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>SpringWebProject2</display-name>

  <servlet>
   <servlet-name>mvc</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/app.xml</param-value>
   </init-param>
  </servlet>
  <servlet-mapping>
   <servlet-name>mvc</servlet-name>
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <!– 한글 변환 코드 –>
  <filter>
   <filter-name>e</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>EUC-KR</param-value>
   </init-param>
   
  </filter>
  <filter-mapping>
   <filter-name>e</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-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>

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

컨트롤러 등록
   =DI (XML, 애너테이션 등록)
   =MVC 구조
      =ORM
   =공통모듈(AOP)
      -보안
      -트랜잭션
   =Tiles, OXM, Spring-data
  
<param-value>/WEB-INF/config/app.xml</param-value> 은
/WEB-INF/config/app*.xml 을 쓰거나
/WEB-INF/config/one.xml,/WEB-INF/config/two.xml 식으로 쓸 수 있음
   

    public class DispatcherServlet extends HttpServlet
    {
        WebApplicationContext wc;
     public void init(StringConfig config){
        String path=config.getInitParameter(“contextConfigLocation”);
        if(path==null)
          path=”/WEB-INF/”+<servlet-name>+”-servlet.xml”; (서블릿네임이 spring일 경우 spring-servlet.xml이 될 수 있음)
        wc=new WebApplicationContext(path);
     }
     doGet, doPost
     public void doProcess(){
         Model model=()
     }
     
   }

   매개변수로 Request가 더 이상 넘어오지 않음. (HttpSession 과 매개변수를 써야함)
    @RequestMapping(“a.do”)
    //a.do?name=홍길동&page=1& …
    public String a(String name,int page,MemberVO vo,HttpSession session){
     return “folder/filename”;
    }

  <!– 에러코드 –>
<error-page>
   <error-code>404</error-code>
   <location>/error/error404.jsp</location>
</error-page>
  
분석 순서 : web.xml
            DispatcherServlet : Spring
               /WEB-INF/applicationContext.xml
            FilterDispatcher : struts2
               /SRC/struts.xml
            ActionServlet : struts
               /SRC/struts-config.xml–>
 

app.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xmlns:context=”http://www.springframework.org/schema/context
 xmlns:p=”http://www.springframework.org/schema/p
 xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd“>

 <context:annotation-config></context:annotation-config>
 <context:component-scan base-package=”com.*”></context:component-scan>
 
 <!– DataSource –>
 <bean id=”ds”
 class=”org.apache.commons.dbcp.BasicDataSource”
 p:driverClassName=”oracle.jdbc.driver.OracleDriver”
 p:url=”jdbc:oracle:thin:@localhost:1521:ORCL”
 p:username=”scott”
 p:password=”tiger”>
 </bean>
 
 <!– SqlSessionFactory –>
 <bean id=”ssf”
 class=”org.mybatis.spring.SqlSessionFactoryBean”
 p:dataSource-ref=”ds”
 p:configLocation=”Config.xml”>
 </bean>
 
</beans>

@Autowired 위치

@Autowired 위치

 *   1-1. class A
 *           {
 *             @Autowired
 *             B b;
 *           }
 *          
 *           class A
 *           {
 *             @Autowired
 *             public A(B b){}   생성자(컨스트럭쳐)위의 오토와이어드는 매개변수에 값을 채운다
 *           }
 *          
 *           class A
 *           {
 *            @Autowired
 *            public setB(B b){}    셋 메소드 위에도 올라간다
 *           }
 *          
 *           class A
 *           {
 *            @Autowired
 *            public void initDao(B b){}   initDao 메소드 위에만 올라갈 수 있다(일반 메소드위에는 올라갈 수 없다)
 *           }

서울시에 존재하는 모든 동

서울시에 존재하는 모든 동

가락
가락본
가리봉
가산
가양
가회
갈월
갈현
개봉
개봉본
개포
개화
거여
견지
경운

고덕
고척
공덕
공릉
공평
공항
과해
관수
관철
관훈
광장
교남
교북
구기
구로
구로본
구산
구수
구의
구파발
군자

궁정
권농

길음
낙원
남가좌
남영
남창
남학
남현
내곡
내발산
내수
내자
냉천
노고산
노량진
노유
녹번
논현
누상
누하


답십리
당산
당인
당주
대림
대방
대신
대조
대치
대현
대흥
도곡
도렴
도림
도봉
도선
도원
도화
독산
독산본
돈암
돈의
동교
동빙고
동숭
동자
동작
둔촌
등촌
마곡
마장
마천
마포
망우
망원
면목
명일
모진


무교
무악
무학

묵정
문래
문배
문정
미근
미아
반포
반포본
방배
방배본
방산
방이
방학
방화

보광

봉원
봉익
봉천
봉천본
부암
북가좌
북아현
북창
불광
사간
사근
사당
사직
산림
산천
삼각
삼성
삼전
삼청
상계
상도
상봉
상수
상암
상왕십리
상월곡
상일
서계
서교
서린
서빙고
서소문
서초
석관
석촌
성내
성북
성산
성수
세곡
소격
소공
송월
송정
송파
송현
수색
수서
수송
수유
수표
수하
순화
숭인
시흥
시흥본
신계
신공덕
신교
신길
신내
신당
신대방
신도림
신림
신림본
신사
신설
신수
신영
신원
신월
신정
신창
신천
신촌
쌍림
쌍문
아현
안국
암사
압구정
양재
양평
양화
여의도
역삼
역촌
연건
연남
연지
연희
염곡
염리
염창
영등포
영천
예관
예장
예지
오곡
오금
오류
오륜
오쇠
오장
옥수
옥인
옥천
온수
와룡
외발산
용강
용답
용두
용문
우면
우이
운니
원남
원서
원지
월계
율현
응봉
응암
이문
이촌
이태원
이화
익선
인사
인의
일원
일원본
입정
자곡
자양
잠실
잠실본
잠원
장교
장사
장안
장위
장지

적선
전농

정릉
제기
종암
주교
주성
주자
중계
중계본
중곡

중림
중학
중화
증산
진관내
진관외

창성
창신
창전
창천
천연
천왕
천호
청담
청량리
청암
청운
청진
체부

충신
토정
통의
통인
팔판

평창
포이
풍납
필운
하계
하왕십리
하월곡
하일
하중
한남

합정

행당
행촌
현석
현저
혜화
홍은
홍익
홍제
홍지
홍파
화곡
화곡본

화양
황학
회기
효자
효제
효창
후암
훈정
휘경
흑석
흥인

IoC

IoC

스프링 IoC 컨테이너(Spring Inversion of Control Container)

-IoC

1. DL (디펜젼시 룩업)

2. DI (디펜젼시 인젝션)

2-1. 세터 인젝션

2-2. 컨스트럭터 인젝션

2-3. 메소드 인젝션

몽고 DB 기초

몽고 DB 기초

1. 몽고 디비 서버 가동

mongodb 폴더 내의 bin 폴더 내에 들어가서 mongod –dbpath c:\mongodb\data 라고 쓰면 됨

 

2. 몽고 디비 접근(1/2)

몽고 디비 서버를 가동한 상태에서 새로운 cmd 창을 열어서 접근해야 함.

mongodb 폴더 내의 bin 폴더에 들어가서 mongo 라고 쓰면 됨.

 

3. 몽고 DB 접근(2/2)

“show dbs” 를 통해 소유한 db목록을 보고, “use db명” 을 통해서 원하는 db에 접근한 후, insert, update, delete 등을 실행할 수 있음.


■ 가지고 있는 db목록을 출력
show dbs

■ db명을 사용
use db명
ex) use test
     use mydb

■ 데이터를 인서트
db.member.insert({no:1,name:”hong”,tel:”1111-1111″,addr:”seoul”})
※ 중괄호 안쪽이 1개의 row임

■ 모든 데이터를 읽어옴(SELECT * FROM member)
db.member.find()

■ 조건에 맞는 데이터를 읽어옴 (SELECT * FROM member WHERE ~)
db.member.find({no:1})

4. 자바에서 몽고 DB 접근하기

4-0. app.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd“>

<bean id=”dao” class=”com.dao.MemberDAO”/>
</beans>

4-1. 커넥션 (생성자에서 처리)

public class MemberDAO {
 private MongoClient mc;//Connection
 private DB db;//ORCL (mydb)
 private DBCollection dbc;//table
 
 //db.member.find()
 public MemberDAO(){
  try{
   mc=new MongoClient(“localhost”);//연결
   db=mc.getDB(“test”);
   dbc=db.getCollection(“member”);
   //dbc.find()

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

}

4-2. 셀렉트 (리스트로 받아오기)

public List<MemberVO> memberAllData(){
  List<MemberVO> list=new ArrayList<MemberVO>();
  try{
   // dbc.find()
   //DBCursor cursor=dbc.find();
   DBCursor cursor=dbc.find().sort(new BasicDBObject(“no”,-1));
           //ORDER BY no
           // -1(DESC)  1(ASC)
   
   while(cursor.hasNext()){
    BasicDBObject obj=(BasicDBObject)cursor.next();//rs.next()와 동일. 중괄호{} 단위로 가져옴
    //{no,name,tel,addr}
    MemberVO vo=new MemberVO();
    vo.setNo(obj.getInt(“no”));
    vo.setName(obj.getString(“name”));
    vo.setTel(obj.getString(“tel”));
    vo.setAddr(obj.getString(“addr”));
    //인트와 스트링, 두 가지 뿐이다(날짜형은 없다)
    list.add(vo);
   }
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
  return list;
 }

——————————

 public static void main(String[] args) {
  ApplicationContext app=new ClassPathXmlApplicationContext(“app.xml”);
  MemberDAO dao=(MemberDAO)app.getBean(“dao”);
  //그냥 출력
  List<MemberVO> list=dao.memberAllData();
  for(MemberVO vo:list){
   System.out.println(vo.getNo()+” “+vo.getName()+” “+vo.getTel()+” “+vo.getAddr());
  }

}

4-3. 인서트

public void insert(MemberVO vo){
  try{
   DBCursor cursor=dbc.find();
   int max=1;
   while(cursor.hasNext()){
    BasicDBObject obj=(BasicDBObject)cursor.next();
    int no=obj.getInt(“no”);
    if(max<no){
     max=no;
    }
   }
   cursor.close();
   BasicDBObject obj=new BasicDBObject();//DB Object 1개가 블록 1개임
   obj.put(“no”, max+1);
   obj.put(“name”, vo.getName());
   obj.put(“tel”, vo.getTel());
   //{}
   obj.put(“addr”, vo.getAddr());
   dbc.insert(obj);
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }​

—————————

 public static void main(String[] args) {
  ApplicationContext app=new ClassPathXmlApplicationContext(“app.xml”);
  MemberDAO dao=(MemberDAO)app.getBean(“dao”);
  //인서트
  MemberVO vo=new MemberVO();
  vo.setName(“박문수”);
  vo.setTel(“3333-3333”);
  vo.setAddr(“강원”);
  dao.insert(vo);
  System.out.println(“데이터 추가 완료”);

}

4-4. 검색

public List<MemberVO> memberFindData(String str){
  List<MemberVO> list=new ArrayList<MemberVO>();
  try{
   BasicDBObject obj1=new BasicDBObject();
   obj1.put(“name”, new BasicDBObject(“$regex”,str+”.*”));
   // LIKE ‘%str%’
   // $lt(<) $gt(>) $le(<=) $ge(>=) $eq(==)
   DBCursor cursor=dbc.find(obj1);
   
   while(cursor.hasNext()){
    BasicDBObject obj=(BasicDBObject)cursor.next();//rs.next()와 동일. 중괄호{} 단위로 가져옴
    //{no,name,tel,addr}
    MemberVO vo=new MemberVO();
    vo.setNo(obj.getInt(“no”));
    vo.setName(obj.getString(“name”));
    vo.setTel(obj.getString(“tel”));
    vo.setAddr(obj.getString(“addr”));
    //인트와 스트링, 두 가지 뿐이다(날짜형은 없다)
    list.add(vo);
   }
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
  return list;
 }

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

 public static void main(String[] args) {
  ApplicationContext app=new ClassPathXmlApplicationContext(“app.xml”);
  MemberDAO dao=(MemberDAO)app.getBean(“dao”);
  //검색
  Scanner scan=new Scanner(System.in);
  System.out.println(“검색어:”);
  String name=scan.next();
  List<MemberVO> list=dao.memberFindData(name);
  for(MemberVO vo:list){
   System.out.println(vo.getNo()+” “+vo.getName()+” “+vo.getTel()+” “+vo.getAddr());
  }

}

4-5. 딜리트

public void delete(int no){
  try{
   BasicDBObject obj=new BasicDBObject();
   //db.member.remove({no:1})
   //다시 말하지만 블록(중괄호)은 베이직디비오브젝트임.
   
   obj.put(“no”, no);
   dbc.remove(obj);
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }

——————————————–

public static void main(String[] args) {

  ApplicationContext app=new ClassPathXmlApplicationContext(“app.xml”);
  MemberDAO dao=(MemberDAO)app.getBean(“dao”);
  //삭제
  Scanner scan=new Scanner(System.in);
  System.out.println(“번호:”);
  int no=scan.nextInt();
  dao.delete(no);
  System.out.println(“삭제 완료”);

}

4-6. 카운트

//카운트
dbc.count()

dbc.count({no:1}) 로도 쓸 수 있다.

4-7. 업데이트

public void update(MemberVO vo){
  try{
   BasicDBObject where=new BasicDBObject();
   where.put(“no”, vo.getNo());
   //WHERE no=1
   BasicDBObject updateObj=new BasicDBObject();
   updateObj.put(“name”, vo.getName());
   updateObj.put(“tel”, vo.getTel());
   updateObj.put(“addr”, vo.getAddr());
   
   BasicDBObject obj=new BasicDBObject();
   obj.put(“$set”, updateObj);//수정
   dbc.update(where, obj);
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

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

 public static void main(String[] args) {
  ApplicationContext app=new ClassPathXmlApplicationContext(“app.xml”);
  MemberDAO dao=(MemberDAO)app.getBean(“dao”);
  //수정
  MemberVO vo=new MemberVO();
  vo.setNo(2);
  vo.setName(“박문식”);
  vo.setTel(“3333-3333”);
  vo.setAddr(“강원”);
  dao.update(vo);
  System.out.println(“데이터 수정 완료”);
}

R 기초

R 기초

1. 다운로드

R-3.2.0-win.exe 를 다운받아 실행. next, next…를 눌러 디폴트 상태로로 설치

2. R을 실행

> install.packages(‘rJava’)

> library(‘rJava’)

cf: library(‘패키지명’)으로 로딩해야 함. 그렇지 않으면 쓸 수 없음.

> install.packages(‘Rserve’)

> library(‘Rserve’)

> install.packages(‘googleVis’)

> library(‘googleVis’)

> install.packages(‘wordcloud’)

> library(‘wordcloud’)

> install.packages(‘RColorBrewer’)

> library(‘RColorBrewer’)

> install.packages(‘ggplot2’)

> library(‘ggplot2’)

3. 예제들

예제 0)
※ 첨부파일 a.csv를 다운받아 C드라이브의 image 폴더에 붙여넣기

sing<-read.csv(“C:/image/a.csv”, header=TRUE);

라고 쓰고,

sing

이라고 쓰면 정상적으로 출력되어야 함.

예제1)

wordcloud(sing[,1],sing[,2])

예제2)

pal <- brewer.pal(6,”Dark2″)
pal <- pal[-(1)]
# wordcloud 함수 실행
wordcloud(sing[,1],sing[,2],colors=pal, min.freq=3, random.order=F, family=”맑은 고딕”)

예제3) 워드 클라우드를 그림 파일로 만들기

png(“c:/image/b.png”)
wordcloud(sing[,1],sing[,2],colors=pal, min.freq=3, random.order=F, family=”맑은 고딕”)
dev.off()

예제4) 모션차트

R에서 아래를

Motion=gvisMotionChart(Fruits,
                       idvar=”Fruit”,
                       timevar=”Year”)
plot(Motion)

※ 참고사이트: http://cran.r

project.org/web/packages/googleVis/vignettes/googleVis_examples.html

4. R서브 세팅 





 

 

JSON(JavaScript Standard Object Notation)

JavaScript Standard Object Notation

몽고db에서 {no:1, id:2, … } 식으로 쓰인 형태

정형화: RDBMX(오라클)

반정형화: XML, JSON, HTML

  –  JAXP (P는 파싱의 약자. DOM,SAX)

  –  JAXB(B는 바인드의 약자. xml과 클래스 연결)

비정형화: txt

Jsoup 예제

Jsoup 예제

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

import org.jsoup.*;
import org.jsoup.nodes.*;
import org.jsoup.select.*;

public class MainClass {
 public static void main(String[] args) {
 
  List<BaseBallVO> list=new ArrayList<BaseBallVO>();
  String[] items={“순위”,”팀명”,”승”,”패”,”무”,”승률”,”연속”};
  
  try{
   Document doc=Jsoup.connect(“http://www.koreabaseball.com”).get();
   //System.out.println(doc);
   
   Elements trs=doc.select(“table.table01 tbody tr”);
   //System.out.println(trs);
   
   
   
   for(Element tr:trs){
    Iterator<Element> it=tr.getElementsByTag(“td”).iterator();
//    System.out.println(it.next().text());
//    System.out.println(it.next().text());
//    System.out.println(it.next().text());
//    System.out.println(it.next().text());
//    System.out.println(it.next().text());
//    System.out.println(it.next().text());
//    System.out.println(it.next().text());
    
    BaseBallVO vo=new BaseBallVO();
    vo.setRank(Integer.parseInt(it.next().text()));
    vo.setName(it.next().text());
    vo.setWin(Integer.parseInt(it.next().text()));
    vo.setLose(Integer.parseInt(it.next().text()));
    vo.setSame(Integer.parseInt(it.next().text()));
    vo.setWinrate(Double.parseDouble(it.next().text()));
    vo.setCon(it.next().text());
    list.add(vo);
   }
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
  
  for(String str:items){
   System.out.print(str+”\t”);
  }
  System.out.println();
  for(BaseBallVO vo:list){
   System.out.println(vo.getRank()+”\t”+vo.getName()+”\t”+vo.getWin()+”\t”+
     vo.getLose()+”\t”+vo.getSame()+”\t”+vo.getWinrate()+”\t”+vo.getCon());
  }
 }
}
 

DI

DI

  DI:   1) 객체 생성
         2) 객체 소멸
         3) 멤버변수, 생성자, 매개변수 값 주입
         4) 클래스 간의 관계 설정 (=의존성 관계설정)

DTD: Documents Type Definition, 표준문서 포맷으로 XML을 추상화
스키마: XML 정의언어

150518 스프링

150518 스프링

1. Bean 배치

  -> 클래스를 모아서 관리

  -> 클래스 메모리 할당, 소멸 –> (설정)

      변수값 설정, 메소드 호출, 매개변수

      객체의 생명주기 관리(DI: 디펜전시 인젝션)

2. 반복 코딩에 대한 처리 (공통모듈) : AOP

  -> 트랜젝션, 보안, 로깅

3. MVC (웹) : JQuery, JSON, WebSocket

4. 테스팅, restful

5. ORM, OXM -> XML 또는 Annotation으로 처리

(릴레이션 매퍼, XML매퍼)

6. Maven

(1) DI
(2) AOP
(3) MVC

스프링 한글 필터 spring filter

스프링 한글 필터 spring filter

 

web.xml

 <!–  =============== Filter  Character Encoding =============== –>
 <filter>
  <filter-name>Character Encoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>EUC-KR</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>

 </filter-mapping> 

스프링2: 값 채우기

스프링2: 값 채우기

맵에 값 채우기

<bean id=”list” class=”com.sist4.SawonList”>
 <property name=”map”>
  <map>
   <entry key=”id” value=”admin”></entry>
   <entry key=”pwd” value=”1234″></entry>
  </map>
 </property>
</bean>

list에 값 채우기
<bean id=”list” class=”com.sist4.SawonList”>
 <property name=”list”>
  <list>
     <ref bean=”s1″></ref>
              <!–  list.add(s1) –>
     <ref bean=”s2″></ref>
     <ref bean=”s3″></ref>
  </list>
 </property>
</bean>

멤버변수에 값 채우기
<bean id=”s1″ class=”com.sist4.Sawon”>
 <property name=”sabun” value=”1″></property>
 <property name=”name” value=”홍길동”></property>
 <property name=”dept” value=”영업부”></property>
</bean>
<bean id=”s2″ class=”com.sist4.Sawon”>
 <property name=”sabun” value=”2″></property>
 <property name=”name” value=”심청이”></property>
 <property name=”dept” value=”총무부”></property>
</bean>
<bean id=”s3″ class=”com.sist4.Sawon”>
 <property name=”sabun” value=”3″></property>
 <property name=”name” value=”박문수”></property>
 <property name=”dept” value=”자재부”></property>
</bean>

스프링 상식

스프링 상식

마틴 파울러: “제어가 역전되었다(ioc -> Inversion Of Control)”, 스프링을 ioc 컨테이너라고 함.

로드 존슨: 스프링의 모체를 고안(클래스에 다른 클래스들을 모아 관리한다).

DI: 값을 주입한다 = 의존성을 주입한다. 세터(Setter)를 통해 값을 주입하는 것을 DI 라고 한다. Dependency injection(디펜던시 인젝션, 의존성 주입)

0. 설정파일

설정파일은 xml 또는 어노테이션을 쓴다.

1. DI

(가)값을 주입하거나, (나)메소드를 호출하는걸 DI라고 한다.

   (1) 세터 DI (값 주입. 셋 메소드를 통해 값을 채워준다)

    <bean id=”hello” class=”com.sist3.Hello”>
       <property name=”name” value=”박문수”></property>
    </bean>

   (2) 메소드 DI (호출. 값 주입이 아니다)

     (2-1)시작(메모리 할당후)

       init-method=”메소드명”

       ex) <bean id=”hello” class=”com.sist3.Hello” init-method=”init”>

       드라이버 등록할 때 쓴다.


       (2-2)종료(메모리 해제후)

       destroy-method=”메소드명”

       ex) <bean id=”hello” class=”com.sist3.Hello” destroy-method=”메소드명”>

       disConnection에 많이 쓴다.

    (3) 생성자 DI (값 주입)

      <bean id=”hello” class=”com.sist3.Hello” init-method=”init”>
          <constructor-arg>
             <value>심청이</value>
          </constructor-arg>

      </bean>

*** bean을 쓸 때 디폴트값은 singleton 이다. (싱글톤 패턴)

<bean id=”hello” class=”com.sist3.Hello” scope=”singleton”>

위와 같이 bean에 메모리를 할당할 때, 주소값을 하나만을 사용한다. 이를 싱글톤 패턴이라고 한다. scope를 쓰지 않으면 디폴트가 싱글폰 패턴이다.

이를 변경하고 싶다면 scope=”prototype” 를 주면 된다. 프로토타입은 클론 명령어와 유사한 것으로, 주소값이 바뀌게 된다.

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

 

2. AOP

중복적으로

  2-1. 보안
  2-2. 트랜젝션

  2-3.

3. ORM(릴레이션 매퍼 / 관계형 데이터베이스를 연결하는 매퍼 / 마이바티스, 아이바티스, 하이버네이트)

***** OXM(xml 매퍼 / 마샬, 언마샬)

***** tx(트랜잭션)

***** expression: taglib

beans는 빈즈
p는 프로퍼티

—————–
일반 클래스는 @Component라고 붙인다.
DAO는 @Repository 라고 붙인다.
모델 클래스는 @Controller 라고 붙인다.

—————————-

@Autowired 
private Sawon s;

바로 아래의 객체를 자동으로 주입. 2개 이상일 경우 충돌이 난다.

@Resource(name=”sawon”)
private Sawon s;

복수일 경우 위와 같이 리소스를 써야 한다.

spring 4.1.6 jar모음

spring 4.1.6 jar모음

스프링 4.1.6 올인원(all in one, allinone,all-in-one)

첨부파일 2개를 다운받아 압축풀면 아래와 같이 jar파일들이 나온다(34개).

 

 

ojdbc6.jar

ojdbc6.jar

PL/SQL 6: 트리거 예제

PL/SQL 6: 트리거 예제

–트리거(TRIGGER)
PL/SQL 문법을 사용.

1) 데이터베이스에서 미리 정해놓은 조건을 만족하면
   자동으로 수행되는 이벤트
2) 사용하는 SQL (INSERT, UPDATE, DELTE)
   예)  입고 => 재고 변경
        출고 => 재고 변경

3) BEFORE (PRIMARY KEY), AFTER
4) 형식
    CREATE [OR REPLACE] TRIGGER tri_name
    BEFORE|AFTER (INSERT,UPDATE,DELETE) ON 테이블명
    FOR EACH ROW
    BEGIN
      처리 문장
    END;
    /

5) 삭제
   DROP TRIGGER tri_name

6) 수정
   ALTER TRIGGER tri_name

7) 권한 부여 (conn system/tiger)
   GRANT CREATE TRIGGER TO scott
   GRANT ALTER ANY TRIGGER TO scott
   GRANT DROP ANY TRIGGER TO scott

8) 원래 값은 올드, 새값을 포함하면 NEW
:OLD.컬럼명
:NEW.컬럼명

CREATE [OR REPLACE] TRIGGER trigger_name
timing
   event1 [OR event2 OR event3…]
ON {table_name|view_name|SCHEMA|DATABASE}
[REFFERENCING OLD AD old | NEW as new]
[FOR EACH ROW [WHEN (condition) ] ]
  trigger_body

timing: BEFORE, AFTER, INSTEAD OF(트리거가 특정 뷰에 대한 DML일 경우)

CREATE TABLE 상품(품번 NUMBER,항목 VARCHAR2(20),단가 NUMBER);
CREATE TABLE 입고(품번 NUMBER,수량 NUMBER,금액 NUMBER);
CREATE TABLE 판매(품번 NUMBER,수량 NUMBER,금액 NUMBER);
CREATE TABLE 재고(품번 NUMBER,수량 NUMBER,금액 NUMBER);

INSERT INTO 상품 VALUES(100,’새우깡’,900);
INSERT INTO 상품 VALUES(200,’감자깡’,900);
INSERT INTO 상품 VALUES(300,’맛동산’,1000);

INSERT INTO 입고 VALUES(100,10,9000);
INSERT INTO 입고 VALUES(200,10,9000);
INSERT INTO 입고 VALUES(300,10,10000);

INSERT INTO 재고 VALUES(100,10,9000);
INSERT INTO 재고 VALUES(200,10,9000);
INSERT INTO 재고 VALUES(300,10,10000);

COMMIT;

—————————————————————————–

–새우깡이 입고되었을 때
CREATE OR REPLACE TRIGGER j_trigger
AFTER INSERT ON 입고
FOR EACH ROW
BEGIN
  UPDATE 재고 SET
  수량=수량+:NEW.수량,
  금액=금액+:NEW.금액
  WHERE 품번=:NEW.품번;
END;
/

INSERT INTO 입고 VALUES(100,5,4500);
SELECT * FROM 재고;

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

–감자깡이 5개 출고되었을 때

CREATE OR REPLACE TRIGGER p_trigger
AFTER INSERT ON 판매
FOR EACH ROW
BEGIN
  UPDATE 재고 SET
  수량=수량-:NEW.수량,
  금액=금액-:NEW.금액
  WHERE 품번=:NEW.품번; 
END;
/

INSERT INTO 판매 VALUES(200,5,4500);
SELECT * FROM 재고;
 

PL/SQL 5: 펑션 예제

PL/SQL 5: 펑션 예제

PROCEDURE

1) 변수
   일반 변수 : 변수명 데이터형(vempno NUMBER(4))
   참조 변수 : 변수명 테이블형,컬럼명%TYPE
               변수명 테이블형%ROWTYPE
               TYPE 변수명 IS RECORD
               (
               )
               CURSOR cur_name IS
                SELECT~~~
2) 제어문
   조건문
     IF (조건문) THEN
        처리 문장(SQL)
     END IF;
 
     IF (조건문) TEHN
        처리 문장

     ELSIF (조건문) THEN
        처리 문장
    
     ELSE IF;

     IF (조건문) THEN
        처리 문장
     ELSE
        처리 문장
     END IF;

     반복문
        FOR 변수명 IN low..hi LOOP
            반복처리
        END LOOP;

        FOR 변수명 IN REVERSE low..hi LOOP
            반복처리
        END LOOP;

3) 매개변수

        IN, OUT, INOUT

4) 형식
        CREATE [OR REPLACE] PROCEDURE pro_name(매개변수)
        IS
          변수명
        BEGIN
          처리문장
        END;
 /

        FUNCTION : 리턴형을 가지고 있는 함수
              => max(), count(*)….

        형식)
             CREATE [OR REPLACE] FUNCTION func_name(매개변수)
             RETURN 데이터형
             IS
               변수명
             BEGIN
               처리
               RETURN 결과값
             END;
             /

–펑션예제 1
CREATE OR REPLACE FUNCTION emp_max_sal(
   s_deptno emp.deptno%TYPE
) RETURN NUMBER
IS
 max_sal emp.sal%TYPE;
BEGIN
 SELECT MAX(sal) INTO max_sal FROM emp WHERE deptno=s_deptno;
 RETURN max_sal;
END;
/

SELECT DISTINCT deptno,emp_max_sal(deptno) FROM emp;

——————————————————————
–펑션2

CREATE OR REPLACE FUNCTION emp_count(s_deptno emp.deptno%TYPE)
RETURN NUMBER
IS
 max_count NUMBER;
BEGIN
 SELECT COUNT(*) INTO max_count
 FROM emp
 WHERE deptno=s_deptno;
 RETURN max_count;
END;
/

SELECT DISTINCT deptno,emp_count(deptno)
FROM emp;

———————————-
–펑션3
CREATE OR REPLACE FUNCTION get_dname(s_empno emp.empno%TYPE)
RETURN VARCHAR2 IS emp_dname dept.dname%TYPE;
BEGIN
 SELECT dname INTO emp_dname FROM dept WHERE deptno=(SELECT deptno FROM emp WHERE empno=s_empno);
 RETURN emp_dname;
END;
/

SELECT empno,ename,get_dname(empno) FROM emp;

–IN: 프로시저에 전달하는 역할
–OUT: 프로시저로부터 값을 얻어오는 역할

 

PL/SQL 4: 커서(CURSOR), 반복문(FOR문)

plsql4

화면 출력 기능을 활성화
SET SERVEROUTPUT ON;

화면출력
DBMS_OUTPUT.PUT_LINE(vno || ‘텍스트’ || vname);

&는 입력값(오라클은 데이터 내에 &를 쓸 수 없다)

WHERE empno= ‘&empno’;

으로 쓰면 사용자의 입력값을 받는다.

:=는 할당연산자

:= 를 쓰면 ‘주소에 값을 집어넣겠다’는 뜻이다.

사용자 정의형 변수

1. 변수
 스칼라변수(오라클의 일반변수) : CHAR, VARCHAR2…
 참조변수
 (1) %TYPE  (2) %ROWTYPE  (3) TYPE
 CURSOR (ROW의 집합) => ResultSet

 CURSOR 사용법
 1) CURSOR 선언
  CURSOR cur_name
  IS
  SELECT * FROM emp (서브쿼리)

 2) CURSOR 열기
  OPEN cur_name;

 3) 데이터 인출 (FETCH)
 3-1)상태
  %NOTFOUND : 데이터가 모두 인출된 상태
  %FOUND : 데이터가 있는지 여부를 확인
  %ISOPEN : cursor가 오픈된 상태인지 확인
  %ROWCOUNT : 몇개를 인출했는지 확인
 
 4) CURSOR를 닫는다
  CLOSE cur_name;
 
2. 제어문
 FOR 변수 IN lo..hi LOOP
   처리문장
 END LOOP;

 FOR i IN 1..9 LOOP
    i
 END LOOP;

for문 예제 (CURSOR로 ResultSet 받아오기)

SET SERVEROUTPUT ON;

DECLARE
 vemp emp%ROWTYPE;
 — CURSOR 선언
 CURSOR C1 IS SELECT * FROM emp;
BEGIN
 FOR vemp IN C1 LOOP
           EXIT WHEN C1%NOTFOUND;
           DBMS_OUTPUT.PUT_LINE(vemp.ename||’ ‘||vemp.hiredate||’ ‘||vemp.job);
 END LOOP;
END;
/

for문 예제2
SET SERVEROUTPUT ON;
DECLARE
   CURSOR emp_cursor IS SELECT ename,sal FROM emp;
   star VARCHAR2(1000);
   cnt NUMBER:=0;
BEGIN
   DBMS_OUTPUT.PUT_LINE(‘사원 급여 현황’);
   FOR cur_var IN emp_cursor LOOP
     EXIT WHEN emp_cursor%NOTFOUND;
     star:=null;
     cnt:=ROUND(cur_var.sal/100,0);
     FOR i IN 1..cnt LOOP
       star:=star||’*’;
     END LOOP;
     DBMS_OUTPUT.PUT_LINE(cur_var.ename||’ ‘||cur_var.sal||’ ‘||star);
   END LOOP;
END;
/

정상 FOR문(i++)
SET SERVEROUTPUT ON;
DECLARE
BEGIN
 FOR i IN 0..5 LOOP
  DBMS_OUTPUT.PUT_LINE(i);
 END LOOP;
END;
/

거꾸로 가는 FOR문(i–)
SET SERVEROUTPUT ON;
DECLARE
BEGIN
 FOR i IN REVERSE 0..5 LOOP
  DBMS_OUTPUT.PUT_LINE(i);
 END LOOP;
END;
/
 

PL/SQL 3: 셀렉트, 딜리트 예제

PL/SQL 3: 셀렉트, 딜리트 예제

–미리 만들어진 프로시저 드랍

–CREATE OR REPLACE를 쓰기 때문에 기존의 프로시저를 드랍하지 않아도 된다.

–CREATE OR REPLACE를 쓰는 것은 뷰(VIEW)가 있다. 뷰는 ALTER가 없기 때문이다.
DROP PROCEDURE proEmpInsert;
DROP PROCEDURE proEmpShow;

–추가(인서트)와 수정(업데이트)를 구분해서 실행해주는 프로시저
CREATE OR REPLACE PROCEDURE proEmpInUP(
  vempno IN proEmp.empno%TYPE,
  vename IN proEmp.ename%TYPE,
  vjob IN proEmp.job%TYPE,
  vsal IN proEmp.sal%TYPE,
  vdeptno IN proEmp.deptno%TYPE
)
IS
BEGIN
   –사번이 없으면 만들고, 사번이 있으면 수정(업데이트한다)
   IF(vempno=0) THEN
     INSERT INTO proEmp VALUES((SELECT NVL(MAX(empno)+1,1) FROM proEmp),vename,vjob,SYSDATE,vsal,vdeptno);
   ELSE
      UPDATE proEmp SET ename=vename,job=vjob,sal=vsal,deptno=vdeptno WHERE empno=vempno;
   END IF;
      COMMIT;
END;
/

–셀렉트하는 프로시저
CREATE OR REPLACE PROCEDURE proEmpShow(
   vempno IN proEmp.empno%TYPE,
   vename OUT proEmp.ename%TYPE,
   vjob OUT proEmp.job%TYPE,
   vday OUT proEmp.hiredate%TYPE,
   vsal OUT proEmp.sal%TYPE,
   vdeptno OUT proEmp.deptno%TYPE
)
IS
BEGIN
  SELECT ename,job,hiredate,sal,deptno INTO vename,vjob,vday,vsal,vdeptno FROM proEmp WHERE empno=vempno;
END;
/

–삭제하는 프로시저
CREATE OR REPLACE PROCEDURE proEmpDelete(vempno IN proEmp.empno%TYPE)
IS
BEGIN
   DELETE FROM proEmp WHERE empno=vempno;
   COMMIT;
END;
/

PL/SQL 2: 조건문, 인서트 예제

PL/SQL 2: 조건문, 인서트 예제

단일 조건문 (IF~THEN~END IF;)

DECLARE
  vename emp.ename%TYPE;
  vdname dept.dname%TYPE;
  vdeptno emp.deptno%TYPE;
BEGIN
  SELECT ename,deptno INTO vename,vdeptno
  FROM emp
  WHERE empno=7900;
  IF(vdeptno=10) THEN
    vdname:=’영업부’;
  END IF;
  IF(vdeptno=20) THEN
    vdname:=’기획부’;
  END IF;
  IF(vdeptno=30) THEN
    vdname:=’자재부’;
  END IF;
  IF(vdeptno=40) THEN
    vdname:=’총무부’;
  END IF;
DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);
DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);
DBMS_OUTPUT.PUT_LINE(‘부서:’||vdname);
END;
/

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

다중 조건문(ELSE IF가 아니라 ELSIF를 사용)

DECLARE
  vename emp.ename%TYPE;
  vdname dept.dname%TYPE;
  vdeptno emp.deptno%TYPE;
BEGIN
  SELECT ename,deptno INTO vename,vdeptno
  FROM emp
  WHERE empno=7900;
  IF(vdeptno=10) THEN
    vdname:=’영업부’;
  ELSIF(vdeptno=20) THEN
    vdname:=’기획부’;
  ELSIF(vdeptno=30) THEN
    vdname:=’자재부’;
  ELSIF(vdeptno=40) THEN
    vdname:=’총무부’;
  END IF;
DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);
DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);
DBMS_OUTPUT.PUT_LINE(‘부서:’||vdname);
END;
/

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

DECLARE
   vename emp.ename%TYPE;
   vcomm emp.comm%TYPE;
BEGIN
   SELECT ename,comm INTO vename,vcomm
   FROM emp
   WHERE empno=7654;
   IF(vcomm>0) THEN
     DBMS_OUTPUT.PUT_LINE(vename||’님의 성과급은 ‘||vcomm||’입니다’);
   ELSE
     DBMS_OUTPUT.PUT_LINE(vename||’님의 성과급은 없습니다’);
   END IF;
END;
/

——————————————————————————–

프로시저

형식

CREATE OR REPLACE PROCEDURE(매개변수…)

IS

    지역변수

BEGIN

    구현

END;

/

삭제 : DROP PROCEDURE proName;

호출: CALL 프로시저명(매개변수)

프로시저에 들어가는 문법을 ‘PL’이라고 한다.

———————————–

프로시저 준비

CREATE TABLE proEmp
AS (SELECT empno,ename,job,hiredate,sal,deptno FROM emp);

로 테이블을 한 개 복사뜬다.

————————————————————–

프로시저 만들기와 인서트
CREATE OR REPLACE PROCEDURE proEmpInsert(
   vename emp.ename%TYPE,
   vjob emp.job%TYPE,
   vsal emp.sal%TYPE,
   vdeptno emp.deptno%TYPE
)
IS
BEGIN
    INSERT INTO proEmp VALUES(
           (SELECT NVL(MAX(empno)+1,1) FROM proEmp),
           vename,vjob,SYSDATE,vsal,vdeptno);
    COMMIT;
END;

/

–데이터 입력
CALL proEmpInsert(‘박문수’,’대리’,3000,10);
SELECT * FROM proEmp;

———————————————————————–

프로시저 만들기와 인서트2
–데이터 입력
CREATE OR REPLACE PROCEDURE proEmpShow(
 vempno IN emp.empno%TYPE,
  vename OUT emp.ename%TYPE,
 vjob OUT emp.job%TYPE,
 vsal OUT emp.sal%TYPE,
 vday OUT emp.hiredate%TYPE,
 vdeptno OUT emp.deptno%TYPE)
IS
BEGIN
 SELECT ename,job,sal,hiredate,deptno INTO vename,vjob,vsal,vday,vdeptno
        FROM emp
        WHERE empno=vempno;
END;
/

VARIABLE vename VARCHAR2(20);
VARIABLE vjob VARCHAR2(20);
VARIABLE vsal NUMBER;
VARIABLE vday VARCHAR2(20);
VARIABLE vdeptno NUMBER;

CALL proEmpShow(7788,:vename,:vjob,:vsal,:vday,:vdeptno);
PRINT vename;
PRINT vjob;
PRINT vsal;
PRINT vday;
PRINT vdeptno;

–프로시저는 리턴형이 없기 때문에 주소값과 매개변수를 가지고 처리한다
–OUT변수가 콜 바이 레퍼런스에 해당된다(주소 넣는다). 값을 받고 싶으면 OUT을 쓴다.
–쓰지 않으면 IN이다 (콜 바이 밸류)
–OUT을 쓰게 되면 포인터이고 IN을 쓰면 일반변수다.
–두 개 다 쓰고 싶다면 INOUT 이라고 쓰면 된다
–주소 대신에 클론을 쓰고 포인터 대신에 아웃을 쓴다

PL/SQL 1: 문법

 

PL/SQL 1: 문법 

프로시저(PL/SQL) 피엘에스큐엘 문법

PL/SQL

1) 오라클에서 제공하는 절차적언어

2) 사용자 정의 함수(문법) : procedure, function

 2-1) function : 리턴형이 존재

   (셀렉트와 관련)
  => max, min, count 등 셀렉트 문법

 2-2) procedure: 리턴형이 존재하지 않는 함수

   (인서트, 업데이트와 관련)
– 프로시저는 캐시메모리에 저장 (속도가 빠르다)

– 여러개의 SQL문장을 동시에 처리할 수 있다

– 반복적으로 수행되는 문장에서 주로 사용(자바의 메소드와 비슷한 역할임)
  ex) 페이지나누기

3) 형식
 3-1) 선언부 => 변수 선언(지역변수)

 3-2) 구현부 => SQL
 

 3-3) 예외처리부 =>Exception

4) 변수 선언 방식
 4-1) 단일변수 선언
  vempno NUMBER(4);

   또는
  vempno emp.empno%TYPE;

  –emp테이블의 empno와 동일한 데이터 형으로 선언함

  (위의 것은 데이터 형의 크기를 외워야 하므로 주로 아래 것으로 사용함)

 4-2) ROW변수 선언
  vemp emp%ROWTYPE  => 레코드변수 (자바에서는 VO와 같다)

 4-3) 사용자 정의변수(RECORD) 선언
 필요한 데이터를 사용자 정의한다. 사용자 정의 타입(레코드)는 조인이 걸려도 쓸 수 있다.

  TYPE ed IS RECORD(
    vempno NUMBER,
    vename VARCHAR2(10)
  );

 4-4) 목록처리(CURSOR)
  CURSOR => ArrayList와 비슷. 자바에서는 ResultSet과 같다.

5) 제어문
 조건문, 반복문

 조건문: 단일, 다중, 선택

5-1) 조건문
  단일
   IF(조건문) THEN
     SQL
   END IF;

  다중
   IF(조건문) THEN
     SQL
   ELSE IF(조건문) THEN
     SQL
   ELSE
     SQL
   END IF;

  선택
   IF(조건문) THEN
     SQL
   ELSE
     SQL
   END IF;

5-2) 반복문
  FOR i IN 1..9 LOOP
    처리
  END LOOP;

예제1) 단일변수 선언/출력

1. sqlplus에서 set serveroutput on 이라고  칠것.

2. ed test 로 아래 내용을 작성

DECLARE

    vempno emp.empno%TYPE;

    vename emp.ename%TYPE;

    vjob emp.job%TYPE;

    vday emp.hiredate%TYPE;

    vsal emp.sal%TYPE;

BEGIN

    SELECT empno,ename,job,hiredate,sal INTO vempno,vename,vjob,vday,vsal

    FROM emp

    WHERE empno=7788;

    DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);

    DBMS_OUTPUT.PUT_LINE(‘사번:’||vempno);

    DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);

    DBMS_OUTPUT.PUT_LINE(‘직위:’||vjob);

    DBMS_OUTPUT.PUT_LINE(‘입사일:’||vday);

    DBMS_OUTPUT.PUT_LINE(‘급여:’||vsal);

END;

/

3. @test로 실행

예제2) 레코드 변수 선언/출력

DECLARE

  vemp emp%ROWTYPE;

BEGIN

  SELECT * INTO vemp

  FROM emp

  WHERE empno=7900;

  DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);

  DBMS_OUTPUT.PUT_LINE(‘사번:’||vemp.empno);

  DBMS_OUTPUT.PUT_LINE(‘이름:’||vemp.ename);

  DBMS_OUTPUT.PUT_LINE(‘직위:’||vemp.job);

  DBMS_OUTPUT.PUT_LINE(‘입사일:’||vemp.hiredate);

  DBMS_OUTPUT.PUT_LINE(‘급여:’||vemp.sal);

END;

/

예제3) 사용자 정의 레코드 변수 선언/출력

내가 원하는 형태로 정의할 수 있는게 레코드임. (VO를 만드는 것과 같음)

DECLARE

   TYPE empdeptRecord IS RECORD

   (

      empno emp.empno%TYPE,

      ename emp.ename%TYPE,

      job emp.job%TYPE,

      dname dept.dname%TYPE,

      loc dept.loc%TYPE

   );

   ed empdeptRecord;

BEGIN

   SELECT empno,ename,job,dname,loc INTO ed

   FROM emp,dept

   WHERE emp.deptno=dept.deptno

   AND empno=7900;

   DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);

   DBMS_OUTPUT.PUT_LINE(‘사번:’||ed.empno);

   DBMS_OUTPUT.PUT_LINE(‘이름:’||ed.ename);

   DBMS_OUTPUT.PUT_LINE(‘직위:’||ed.job);

   DBMS_OUTPUT.PUT_LINE(‘부서명:’||ed.dname);

   DBMS_OUTPUT.PUT_LINE(‘지역:’||ed.loc);

END;

/

예제4)

ACCEPT pno PROMPT ‘사번:’

   –자바의 SCANNER와 같다

DECLARE

   vempno emp.empno%TYPE:=&pno;

   –주소값을 넘김

   vename emp.ename%TYPE;

BEGIN

   SELECT ename INTO vename

   FROM emp

   WHERE empno=vempno;

   DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);

END;

/

/*

   int *p;

   int a;

   p=&a;

   int b=*p;

*/

달력 셀렉트(콤보박스)

달력 셀렉트(콤보박스)

 

 

function ychange(){
 mchange();
}

 

function mchange(){
 var jm=$(‘#jmonth’).val();
 var jy=$(‘#jyear’).val();
 if(jm==1 || jm==3 || jm==5 || jm==7 || jm==8 || jm==10 || jm==12){
  $(“#jday”).html(“<option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option><option>8</option><option>9</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option><option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option><option>29</option><option>30</option><option>31</option>”);
 }
 else if(jm==2){
   if((jy % 400)==0 || ((jy % 4)==0)&&((jy % 100)!=0)){
   //윤년
   $(“#jday”).html(“<option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option><option>8</option><option>9</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option><option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option><option>29</option>”);
   }
   else{
   $(“#jday”).html(“<option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option><option>8</option><option>9</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option><option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option>”);
   }
 }
 else{
  $(“#jday”).html(“<option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option><option>8</option><option>9</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option><option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option><option>29</option><option>30</option>”);
 }
 inputmbirth();
}

 

function dchange(){
 inputmbirth();

}

function inputmbirth(){
 var jy=$(‘#jyear’).val();
 var jm=$(‘#jmonth’).val();
 var jd=$(‘#jday’).val();
 
 if(jm.length==1){
  jm=”0″+jm;
 }
 if(jd.length==1){
  jd=”0″+jd;
 }
 
 $(“#mbirth”).val(jy+”/”+jm+”/”+jd);
}

 

 

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

 

<table><tr>
    <td style=”width: 40%;”>
                 <select id=”jyear” onchange=”ychange()”>
                   <c:forEach var=”i” begin=”1900″ end=”2014″>
                      <option>${i}</option>
                   </c:forEach>
                    <option selected>2015</option>
                 </select>
    </td>
    <td style=”width: 30%;”>
     <select id=”jmonth” onchange=”mchange()”>
                   <c:forEach var=”i” begin=”1″ end=”12″>
                      <option>${i}</option>
                   </c:forEach>
                 </select>
    </td>
    <td style=”width: 30%;”>
     <select id=”jday” onchange=”dchange()”>
                   <c:forEach var=”i” begin=”1″ end=”31″>
                      <option>${i}</option>
                   </c:forEach>
                 </select>
    </td>
   </tr></table>
   <input type=”text” name=”mbirth” id=”mbirth”>

별짓을 해도 안되던 마이바티스 CLOB select

별짓을 해도 안되던 마이바티스 CLOB select

 

어제와 오늘 거의 10시간은 투자한 것 같다. 오라클 11g와 마이바티스3에서는, String을 CLOB으로 Insert하는데는 문제가 없지만, CLOB을 String으로 Select해올 때 null로 받아오는 문제가 있다.

 

구글의 미국/중국인들, 한국 프로그래머들을 통해 방법을 찾았지만 우선 11g를 쓰는 사람이 드물어서 환경이 맞지 않았고, 쿼리 사용시 어노테이션이 아닌 xml을 파싱하는 프로그래머가 대다수라 소스 구하기가 힘들었다.

 

마지막에 찾아낸 바로는

 

<typeHandlers>
    <typeHandler javaType=”java.lang.String” jdbcType=”CLOB” handler=”org.apache.ibatis.type.ClobTypeHandler”/>
</typeHandlers>

 

가 정석이지만 되지가 않고,

 

@Results({

   @Result(column=”content”,property=”content”,jdbcType=JdbcType.CLOB,javaType=HashMap.class,

               typeHandler=org.apache.ibatis.type.ClobTypeHandler.class)

})

 

도 되지 않았다.

 

결국 CLOB째로 받아다가 처리하는걸로 생각을 바꿨다.

 

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

1. Object 형으로 칼럼을 SELECT 해온다.

 

 @Select(“SELECT content FROM mvcBoard WHERE no=#{no}”)
 public Object boardContentData2(@Param(“no”) int no);

 

//content 칼럼을 받는다. 이때 반환형은 Object로 받았다.

 

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

2. CLOB을 String으로 변환해주는 클래스를 만든다.

 

package com.board.dao;
import java.io.IOException;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.sql.CLOB;
public class som {

   public static String extractClob(CLOB clob) throws SQLException {

   final int length = (int) ((CLOB)clob).length();
   final char [] buffer = new char [length];
   int charactersRead;
   try {
    charactersRead = clob.getCharacterStream().read(buffer, 0, length);
   } catch (IOException e) {
    throw new RuntimeException(“CLOB를 읽는데 문제가 발생했습니다:”,e);
   }
   return new String(buffer,0,charactersRead);
  }
}

 

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

3. DAO에서 처리한다.

 

 public static BoardVO boardContentData(int no){

  BoardVO vo=new BoardVO(); //데이터를 저장할 공간을 확보한다(VO).
  vo = mMapper.boardContentData(no); //게시물 전체를 가져오는 쿼리를 실행한다.
  
  Object obj=mMapper.boardContentData2(no); //Object 형으로 content칼럼을 얻어오는 쿼리를 실행한다.

  String temp=””;
  try {

          temp=som.extractClob((CLOB)obj); //CLOB을 스트링으로 변환해서 temp변수에 담는다.
  }catch (SQLException ex) {System.out.println(ex+”d”);}
  
  vo.setContent(temp); //temp변수를 vo에 싣는다.
  
  return vo; //vo를 되돌려 준다.
 }

마이바티스 어노테이션 이용

마이바티스 어노테이션 이용

list.jsp
<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR” import=”java.util.*,com.dao.*”%>
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
<%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt” %>
<%
 List<MyEmpVO> list=MyEmpDAO.empdeptAllData();
 
%>
<c:set var=”list” value=”<%=list%>”></c:set>
<!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>
 <table border=1 width=”600″>
  <tr>
   <th>사번</th>
   <th>이름</th>
   <th>직위</th>
   <th>입사일</th>
   <th>급여</th>
   <th>부서번호</th>
   <th>부서명</th>
   <th>근무지</th>
  </tr>
  <c:forEach var=”vo” items=”${list}”>
   <tr>
    <td>${vo.empno}</td>
    <td>${vo.ename}</td>
    <td>${vo.job}</td>
    <td>
     <fmt:formatDate value=”${vo.hiredate}” pattern=”yyyy-MM-dd”/>
    </td>
    <td>${vo.sal}</td>
    <td>${vo.deptno}</td>
    <td>${vo.mdv.dname}</td>
    <td>${vo.mdv.loc}</td>
   </tr>
  </c:forEach>
 </table>
</body>
</html>

MyEmpDAO.java

package com.dao;

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

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

public class MyEmpDAO {
 private static SqlSessionFactory ssf;
 
 private static MyMapper mMapper=null;
    static
    {
     try
     {
      Reader reader=Resources.getResourceAsReader(“Config.xml”);
      // XML 파싱
      ssf=new SqlSessionFactoryBuilder().build(reader);
      reader.close();
      Class[] mapper={com.dao.MyMapper.class};//인터페이스 전체를 모아서 구현해줌
      for(Class m:mapper){
       //클래스를 읽어서 메모리 할당
       ssf.getConfiguration().addMapper(m);//메소드가 전부 구현되었음.
      }
     
      //구현된 메모리 객체를 받는다.
      mMapper=ssf.openSession(true).getMapper(MyMapper.class);//구현된 주소를 가져옴.
      
     }catch(Exception ex)
     {
      System.out.println(ex.getMessage());
     }
    }
   
    public static List<MyEmpVO> empdeptAllData(){
     return mMapper.empdeptAllData();
    }
   
   
}

MyMapper.java(인터페이스)

package com.dao;

import java.util.List;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

public interface MyMapper {
 // while(rs.next()){
 //    My EmpVO vo=new MyEmpVO();
 //    vo.setEmpno(rs.getInt(“empno”))
 // }
 
 //조인시 데이터 맞춰놓기
 @Results({
  @Result(column=”empno”,property=”empno”),
  @Result(column=”ename”,property=”ename”),
  @Result(column=”job”,property=”job”),
  @Result(column=”hiredate”,property=”hiredate”),
  @Result(column=”sal”,property=”sal”),
  @Result(column=”deptno”,property=”deptno”),
  @Result(column=”dname”,property=”mdv.dname”),
  @Result(column=”loc”,property=”mdv.loc”)
 })
  //프로펄티에 컬럼 집어넣어라.
 @Select(“SELECT empno,ename,job,hiredate,sal,e.deptno,dname,loc”
   + ” FROM myEmp e,myDept d”
   + ” WHERE e.deptno=d.deptno”)
 public List<MyEmpVO> empdeptAllData();
 
}

MyEmpVO.java

package com.dao;

import java.util.Date;

public class MyEmpVO {
 private int empno;
 private String ename;
 private String job;
 private Date hiredate;
 private int sal;
 private int deptno;
 private MyDeptVO mdv=new MyDeptVO();
 
 public MyDeptVO getMdv() {
  return mdv;
 }
 public void setMdv(MyDeptVO mdv) {
  this.mdv = mdv;
 }
 public int getEmpno() {
  return empno;
 }
 public void setEmpno(int empno) {
  this.empno = empno;
 }
 public String getEname() {
  return ename;
 }
 public void setEname(String ename) {
  this.ename = ename;
 }
 public String getJob() {
  return job;
 }
 public void setJob(String job) {
  this.job = job;
 }
 public Date getHiredate() {
  return hiredate;
 }
 public void setHiredate(Date hiredate) {
  this.hiredate = hiredate;
 }
 public int getSal() {
  return sal;
 }
 public void setSal(int sal) {
  this.sal = sal;
 }
 public int getDeptno() {
  return deptno;
 }
 public void setDeptno(int deptno) {
  this.deptno = deptno;
 }
 
 
}

MyDeptVO.java

package com.dao;

public class MyDeptVO {
 private int deptno;
 private String dname;
 private String loc;
 public int getDeptno() {
  return deptno;
 }
 public void setDeptno(int deptno) {
  this.deptno = deptno;
 }
 public String getDname() {
  return dname;
 }
 public void setDname(String dname) {
  this.dname = dname;
 }
 public String getLoc() {
  return loc;
 }
 public void setLoc(String loc) {
  this.loc = loc;
 }
}
 

스프링 메모들

스프링 메모들

1

VO: 메모리할당 하지 않는다.

DAO: @리포지토리

모델: @컨트롤러

리퀘스트 매핑

결합성 약하게: 클래스 하나 수정하면 다른 하나에 영향
응집성 강하게: 같은 기능의 메소드를 모아줌

스프링=경량 컨테이너: 관계도가 1개(단순함)

프로시저 : 반복수행(페이지 나누기)
           조건분기
          

Annotation: 사용자 정의 클래스
XML : 이미 만들어져있는 클래스(어노테이션을 달 수가 없으므로 beans 내의 bean사용)

2

client요청(ex)클릭 -> jsp -> 디스패처 서블릿(doget or dopost) —> 모델 ->
                                1. 해당 모델 클래스 찾는다
                                2. 메소드 수행 handlerRequest
      3. 모델 <===> DAO
    4. request에 결과값 싣는다
       ex) request.setAttribute()
                                5. 디스패처 서블릿
                                6. jsp: forward() 되면서 실행

config.xml : conn을 가짐(겟 커넥션과 디스 커넥션)
board-mapper : ps를 가짐(프리페어 스테이트먼트 = SQL문장)

board-mapper  xml에서, parameterType=”int” 은 set int
                       #{start}는 get(“start”)와 같음
      

private static SqlSessionFactory ssf;//ssf이 모든 정보를 갖고 있다. 파싱된 내용을 여기에 넣어줘야 한다.
 static//스태틱 블록을 쓰자.(메모리 할당하지 않는다)
 {
  try{
   Reader reader=Resources.getResourceAsReader(“Config.xml”);//파싱하자 마자 커넥션이 만들어질거다.
   //xml을 읽었음
   ssf=new SqlSessionFactoryBuilder().build(reader);
   /*
    *
    *    getConnection(),disConnection()
    *              저장(Map)
    *    ===============================
    *        id           sql
    *    ===============================
    *    boardAllData   SELECT~~~
    */
  }catch(Exception ex){System.out.println(“BoardReplyDAO파일-ssf static:”+ex.getMessage());}
 }

 public static List<BoardVO> boardAllData(Map map){
  List<BoardVO> list=new ArrayList<BoardVO>();
  
  SqlSession session=null;
  
  try{
   session=ssf.openSession();//이제 세션이 셀렉트부터 conn까지 다 가지고있다.
   /////session.commit();
   
   
   // 셀렉트 100개를 날리고 마지막에 한 번 커밋 날리는것. 이것을 트랜잭션이라고 한다.
   /*
    * 오픈세션은 두가지가 있다
    * openSession()              => 디폴트는 폴스다. autoCommit(false)
    * openSession(boolean b)         0
    */
   list=session.selectList(“boardAllData”,map);
   
  }catch(Exception ex){
   
   /////session.rollback();
   System.out.println(“BoardReplyDAO파일-boardAllData:”+ex.getMessage());}
  finally{
   if(session!=null){
    session.close();//세션이 ps,conn다 가지고 있음.
   }
  }
  return list;
  //return ssf.openSession().selectList(“boardAllData”,map);

3

프로퍼티=> 셋 메소드를 의미

타입=> 클래스를 의미

4

자바연결(JDBC) TCP연결 : IP와 Port필요 (ip는 로컬호스트, port는 1521)
JDBC 라이브러리: 자바 데이터베이스 커넥티드.

1. 드라이버 설치 -> class.forName(OracleDriver)

2. 연결 => Connection (Socket포함)

3. SQL 문장 보내고/받기=> statement (BufferdReader, OutputStream)

4. execute Query(결과값 O) //SELECT
   execute Update(결과값 X) //INSERT UPDATE DELETE–결과값이 없다
                              0번:정상수행, 1번:비정상수행

ResultSet은 표 모양과 흡사하며, 커서가 맨 마지막에 위치하고 있다.
그러므로 우선 커서를 맨 위로 올려야 한다. 그 뒤 다음값, 다음값.. 식으로 읽어야 한다.
그게 rs.next()다. EOF까지 읽는다.(End Of File)

아래서부터 위로 올라가려면 rs.previous()다. BOF 전까지 읽는다.(Begin Of File)

ResultSet을 통째로 보내는게 아니라, 필요한 데이터만을 취해서 가져와야 한다. 그래서 “어레이 리스트”를 쓰는 것이다.

count ex)회원가입시 아이디 중복체크
max ex)예약번호 max치에 +1 자동증가
rank ex)조회수 순으로 정렬

오라클: ‘%A%’
자  바: ‘%’||’A’||’%’

웹서버도 보내는 부분, 받는 부분, 소켓이 있다.
-보낼때:Request 클래스 (OutputStream가 들어있다)
-받을때:Response 클래스 (Buffered Reader가 들어있다)
-소켓은 브라우저에 있다(브라우저 주소라인에. 주소가 연결되는 부분이다)

★★★문제는 구조파악이다.

얘를 왜 쓰냐? 를 깨달아야 한다.

어노테이션: 메소드 구분할 때 쓴다.
invoke를 할때 메소드 앞에 어노테이션이 붙어있으면 ‘구분’해서 가져올 수 있다. 스프링의 80%는 어노테이션이다.

컨트롤러(제어하는 클래스), 리포지토리(데이터베이스 연결하는 클래스)

SELECT zipcode,sido,gugun,dong,NVL(bunji,’ ‘)
FROM zipcode
WHERE dong LIKE ‘%신촌%’;

객체 지향 프로그램
 1) 데이터 보호: 캡슐화
 2) 재사용: 상속, 포함(★포함클래스가 핵심:필요한 클래스를 갖다놓고 쓴다)
 3) 변경, 추가: 다형성
 4) 사물을 단순화: 추상화(클래스 설계) ex)우편번호를 데이터 5개로 단순화, 사원을 데이터 9개로 단순화..

마이바티스 셀렉트리스트, 하고 SQL문장을 써주면 SQL문장이 어레이리스트에 쫙 들어옴(SQL 매퍼)

양: 조인< 서브쿼리

조인: 테이블 두개를 합침
서브쿼리: 쿼리문 두개를 합침

1.서브쿼리 ; 페이징에서 나온다

아이디: 프라이머리 키
주민번호: 후보키 (대체할만한 키)

angular js 개념

angular js 개념

var m={name:”aaa”,sex:”bbb”,dept:”ccc”};
            m.name
            m.sex
            m.dept  ====> JSON방식(자바스크립트 데이터 표현법)

자바스크립트와 몽고디비는 위와 같은 형식으로 되어있다.

몽고디비는 서버측, 자바스크립트는 클라이언트이기 때문에
그 둘을 연결해주면 빅데이터를 바로 갖다 뿌릴 수 있다. 이걸 연결해주는게 앙글라 js이다.

제이쿼리(jquery) 기초 2

제이쿼리(jquery) 기초 2

1. core(기본사항), 주로 셀렉터
※ 셀렉터:

속성값 가져오기 or 태그와 태그사이값 가져오기

문서에 존재하는 두번째p 값 가져오기
$(function(){
 var jq=$(‘p’);
 alert($(jq[1]).text()); 
});

input박스 생성하기
$(function(){
 $(‘<input type=text id=”aaa” value=”text”>’).appendTo(‘body’);
});

맨 처음 태그 가져오기, 맨 마지막 태그 가져오기

$(function(){
 alert($(‘li:first’).text());
 alert($(‘li:last’).text());
});

맨 마지막 바로 전의 태그 가져오기
alert($(‘li:last’).prev().text());

전전의 태그 가져오기
alert($(‘li:last’).prev().prev().text());

맨 처음 바로 뒤의 태그 가져오기
alert($(‘li:first’).next().text());

클릭하면 특정 태그의 특정 속성(attr) 바꾸기
$(‘img’).click(function(){
 $(‘img’).attr(‘src’,’image/b.jpg’); 
});

2. 효과(effect)

보이게 하기 / 안 보이게 하기

$(‘img’).show(3000);
$(‘img’).hide(3000);

※ 괄호 안에 밀리초를 주면 됨

div의 css 바꾸기, 속성 바꾸기

$(‘div’).css({width:350,height:350,border:”1px solid black”}).attr(‘align’,’center’);