본문 바로가기
학원수업/12월

12/30 국비학원 자바수업 25회차(우편번호 오라클 업로드, 자바와 연결)

by 코딩마스터^^ 2022. 12. 30.

소켓통신 정리

 

서버

package dev_java.week5;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class NetworkServer2 {
	public void server() {
		int port = 3000;
		ServerSocket server = null;
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			server = new ServerSocket(port);
			System.out.println("서버 소켓 생성되었습니다.");
			while (true) {
				Socket client = server.accept();//클라이언트소켓에서 받아오기
				System.out.println("client : " + client);
				oos = new ObjectOutputStream(client.getOutputStream());//하드웨어와 연결되어있는 소켓 클래스가 있어야 된다.그렇게 생각하기...
				ois = new ObjectInputStream(client.getInputStream());
        //듣기코드
				String msg = (String) ois.readObject();//스피커(h/w)
				System.out.println("msg : " + msg);
				oos.writeObject(msg);//말하기코드 마이크(h/w)-소켓-oos만들어야
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		NetworkServer2 ns = new NetworkServer2();
		ns.server();
	}

}
package dev_java.week5;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class NetworkClient2 {
	public void client() {
		int port = 3000;
		String serverIP  = null;
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			serverIP = "127.0.0.1";
			Socket socket = new Socket(serverIP, port);
			oos = new ObjectOutputStream(socket.getOutputStream());
			ois = new ObjectInputStream(socket.getInputStream());
			System.out.println("NetworkClient socket "+socket);
			oos.writeObject("100#NetworkClient_2");
			String msg = (String)ois.readObject();
			System.out.println("client msg : "+msg);			
		} catch (Exception e) {
			System.out.println("NetworkClient client "+e.getMessage());
		}
	}
	public static void main(String[] args) {
		NetworkClient2 nc = new NetworkClient2();
		nc.client();
	}

}

 

토드

 

view>objectpalette

 

우편번호를 오라클에 올려보자

작업지시서
1. 우편번호 테이블 생성을 위한 스키마 파일로 테이블 추가하기
    : 테이블 삭제하기
    drop table zipcode_t
 

2. zipcode_t테이블 백업 파일 공유된 것으로 테이블에 데이터 붓기

커밋모드

1. 레코드별로 커밋하기

3. 다하고나서 한꺼번에 커밋하기

 

데이터가 엄청 많다면 시간이 오래 걸릴수도 있다.

 

where dong like '역삼' || '%'

%가 어떤게 와도 된다는 뜻

조건문처럼 역삼동의 전부다를 찾는것이다.

역삼대신에 변수를 넣음. 변수는 앞에 :을 붙여줘야된다.

변수가 동이름이다. 파라미터는 스트링 타입이다.

공백조심!!!!!!

 

Map을 인스턴스화 하려면 HashMap, HashTable

HashTable은 멀티 스레드에서 안전하다.

순서 보장을 받는다.

package dev_java.week6;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

class S1{
  int age=30;
}
class S2{
  String animal="사자";
  int leg=4;
}
class S3{
  //3개짜리 클래스 설계
}
public class MapTest1 {
  List<Map<String, Object>> list=null;
  public static void main(String[] args) {
    S1 s1=new S1();
    System.out.println(s1.age);
    //Map에 넣고 age를 출력해보자!
    Map<String, Object> map1=new HashMap<>();
    map1.put("s1",s1);
    S1 s2=(S1)map1.get("s1");//겟은 오브젝트타입으로 꺼내온다 그래서 강제 형전환
    System.out.println(s2.age);
    // System.out.println(map1.get("s1").age);//안되나봄...
    // Map<String, String> map11=new HashMap<>();//타입이 달라서 안된다.
    // map11.put("s1",s1);

    Map<String, Object> map2=new Hashtable<>();
    S2 s3=new S2();
    map2.put("s2",s3);
    S2 s4= (S2)map2.get("s2");
    
    if(s4.animal instanceof String){
      System.out.println("문자열입니다");
      System.out.println(s4.animal);
    }
    //Deprecated 가급적 쓰지 말아라..예전꺼라서 줄그인다
    if(new Integer(s4.leg)instanceof Integer){
      System.out.println("정수형입니다.");
      System.out.println(s4.leg);
    }
    
  
    
  }
  
}

맵에 맞는 타입을 넣어줘야한다. 급을 맞춰줘야한다.

2는 빨간줄됐다.

1은 new Double을 붙여줬더니 오류 없어졌다.

 

/*
 * JDBC API를 이용하여 DB연동하기
 * 1. 각 제조사가 제공하는 드라이버 클래스를 로딩한다.
 * 2. 물리적으로 떨어져있는 오라클 서버와 연결 통로를 확보해준다.
 * 3. DML문을 자바에서 오라클 서버로 전달 해 줄 인터페이스를 생성한다.(Statement:정적 쿼리문, PreparedStatement:동적 쿼리문 지원)
 * 4. SELECT의 경우 오라클 서버에서 제공하는 커서를 지원하는 ResultSet인터페이스를 활용하여
 * 테이블에 제공되는 커서를 조작하여 해당 로우에 데이터가 존재하면 Cursor...open....fetch과정을 통해서
 * 오라클 서버로부터 데이터를 꺼내서 Lsit<DeptVO>에 담을 수 있다.
 * 주의 : INSERT,UPDATE,DELETE에서는 커서가 필요없음
 * 리턴값은 int임
 * 이것들을 요청할때는 executeUpdate(INSERT문orUPDATE, DELETE문)
 * SELECT일때는
 * ResultSet rs=executeQuery("SEKECT * FROM dept");
 * 오라클에서 제공되는 커서를 조작하는 인터페이스를 리턴 타입으로 제공받아서
 * 조회 결과를 Collection에 담을 수 있다.
 * List<DeptVO> deptList= new ArrayList<>();
 * DeptVO dVO=null;
 * while(re.next()){
 * dVO=new DeptVo();
 * 
 * deptLsit.add(dVO);
 * }
 * 사용한 자원을 반납할 때에는 사용한 역순으로 닫아주면됨
 * SELECT인경우 
 * ResultSet먼저 닫고
 * Statement혹은 PreparedStatement 두번째로 닫고
 * Connection을 맨 나중에 닫아 주면 됨
 * 닫지않으면 자동으로 언젠가는 닫아주지만 명시적으로 닫아주면 
 * 닫는 시간을 앞당길 수 있어 플젝에서는 명시적으로 닫는 코드 작성을 가이드로 정함
 * 
 * INSERT, UPDATE, DELETE는 두번째와 세번째만 닫으면 된
 * 왜냐면 리턴타입이 커서가 필요 없으니까...
 */

빌드방식...?

메이븐 방식과 그레이들 방식이 있다.

나는 그레이들 방식으로 하는중이라는데...?

 

싱글톤 패턴

메소드를 통한 인스턴스화

이런식으로도 객체 주입을 받을 수 있다. 게으른 인스턴스화

try {
      
    } catch (Exception e) {
      e.printStackTrace();//라인번호가 출력, 이력출력. 해커들에게 힌트가 됨
    }

 

 e.printStackTrace() 중요! 외우기

Scanner도 닫아주고 FileWriter도 닫아주고....

얘네 만들어 놨던거 닫아주는 메소드 

 

copyInto를 기억해놓기!!

zipcodes는 imsi벡터의 사이즈만큼 칸을 가진 배열이다. 라고 설정해주었다.

imsi라는 벡터의 값을 카피해서 zipecode라는 배열에 넣었다.

 

하위에 있는것을 상속받는 것이 누릴것이 많다.

왜 아빠것이 호출될까??

재정의가 되어서...

sup=sub;으로

복사하기전에는 은닉아니고 sup을 sub으로 치환하면

부모가 가진 stop메소드는 은닉 메소드라고 한다. shadow메소드라고 한다.

 

처음에 슈퍼쓸려고 했었는데 스태틱에서는 슈처 디스 사용 불가능하다.

package dev_java.util;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DBConnectionMgr {
  public static final String _DRIVER = "oracle.jdbc.driver.OracleDriver";//오라클 안에 데이터가 들어있다...

  public static final String _URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl11";
  public static String _USER = "scott";
  public static String _PW = "tiger";

  public Connection getConnection(){
    Connection con =null;
    try {
      Class.forName(_DRIVER);
      con=DriverManager.getConnection(_URL, _USER, _PW);
    } catch (ClassNotFoundException e) {
     System.out.println("드라이버 클래스를 찾을 수 없습니다.");
    }catch(Exception e){//가장 범위가 넓은 클래스를 가장 바깥에 적기. 에러중에 젤 큰애다.
      //멀티 블럭 작성시 더 넓은 클래스가 뒤에 와야함
      System.out.println("오라클 서버와 커넥션 실패!");
    }
    return con;
  }
  //사용한 자원을 반납하는 코드를 명시적으로 하는 것을 원칙으로 하고있음
  //반납하는 순서는 생성된 역순으로 진행할 것-자바 튜닝팀 지적사항
  
  //사용한 자원 반납하기 SELECT-커서 조작이 필요함
  public void freeConnection (Connection con, Statement stmt, ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(stmt!=null){
      try {
        stmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }

  
  public void freeConnection (Connection con, PreparedStatement pstmt, ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(pstmt!=null){
      try {
        pstmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }
  //사용한 자원 반납하기-INSET, UPDATE, DELETE

  public void freeConnection (Connection con, Statement stmt){
    
    if(stmt!=null){
      try {
        stmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }

  public void freeConnection (Connection con, PreparedStatement pstmt){
    
    if(pstmt!=null){
      try {
        pstmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  }
package dev_java.week6;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import dev_java.util.DBConnectionMgr;

public class ZipCodeSearch {
  Connection con = null;// 인터페이스-결합도가 약하다. 이종간의 연결을 위해서. 의존적이지 않다.
  PreparedStatement pstmt = null;// 인터페이스
  ResultSet rs = null;// 인터페이스
  DBConnectionMgr dbMgr = new DBConnectionMgr();

  public Integer[] getZipcode(String dong) {// 우편번호를 가져올거다. int타입 변수이다. 넣어줄 값은 동이름이다. 스트링리다.
    System.out.println("getZipcode 호출 성공====>" + dong);
    Integer[] zipcodes = null;// 몇개 나올지 나도 모르겠다.
    // List<Integer> imsi=new ArrayList<>();
    Vector<Integer> imsi = new Vector<>();// copyInto쓰려고 벡터로 바꿨다...
    StringBuilder sql = new StringBuilder();//sql문을 
    sql.append("select");// 띄어쓰기를 해야 append가 붙일때 잘 붙인다....
    sql.append(" zipcode");
    sql.append(" from zipcode_t");
    sql.append(" where dong like :x||'%'");

    try {
      con = dbMgr.getConnection();//오라클이랑 연결을 해줌
      pstmt = con.prepareStatement(sql.toString());
      pstmt.setString(1, dong);
      rs = pstmt.executeQuery();
      while (rs.next()) {
        System.out.println(rs.getInt("zipcode"));
        int code = rs.getInt("zipcode");
        imsi.add(code);
      }
      zipcodes = new Integer[imsi.size()];
      imsi.copyInto(zipcodes);
      for (int c : zipcodes) {
        System.out.println(c);
      }
    } catch (Exception e) {
      e.printStackTrace();// 라인번호가 출력, 이력출력. 해커들에게 힌트가 됨

    } finally {// 무조건 닫아주자!!!!
      dbMgr.freeConnection(con, pstmt, rs);
    }
    return zipcodes;
  }
  // public List<Integer> getZipcode(String dong){//우편번호들이 다 숫자다. 배열로 담을 수 있다.

  // }

  public static void main(String[] args) {
    ZipCodeSearch zcs = new ZipCodeSearch();
    zcs.getZipcode("잠실");
  }

}

댓글