Java 16일차

소윤정·2021년 6월 15일
0

JAVA

목록 보기
13/15

15일차는 강사님이 아프셔서 오전수업밖에 안해서 내용이 없어서 Day15,16일차때 배운내용을 정리해보려한다. 이제 다음주면 HTML/CSS 수업을 진행하기로해서 요새는 네트워크 + 자바 + DB 연결하는 부분을 배우고 있다. DB랑 자바랑 같이 연결하는 건 할만한데 네트워크 + 자바는 좀 어려운것같다. 익숙하지 않아서 그런지 복잡하다ㅠㅡㅠ

PreparedStatement 인터페이스

  • Connection 객체의 preparedStatement() 메소드를 사용해서 생성한다. 이 메소드는 인수로 SQL문을 담은 String 객체가 필요하다. SQL 문장이 미리 컴파일되고, 실행 시간 동안 인수값을 위한 공간을 확보할 수 있다는 점에서 Statement 객체와는 차이점이 있다.
  • Statement 객체의 SQL은 실행될 때마다 매번 서버에서 분석해야 하는 반면, PreparedStatement 객체는 한번 분석되면 재사용이 용이하다는 장점이 있다.
  • 동일한 SQL문을 특정 값만 바꾸어서 여러번 실행해야 할때, 인수가 많아서 SQL문을 정리해야 될 필요가 있을때 사용하면 유용하다.
  • Statement는 보안상 취약점이 있기 때문에 PreparedStatement를 사용하라는 권고를 하기도 한다.
  • 단점 : 코드가 길어진다.
statement 방법)
String sql = "INSERT INTO tb_member(컬럼...) VALUES (값1, 값2,...)";
stmt.executeUpdate(sql);


PreparedStatement 사용 방법)
String sql = "INSERT INTO tb_member(컬럼...) VALUES (?,?...)"; // 컬럼의 갯수만큼 ?를 사용해준다. 
// ?는 변수 처리
pstmt = conn.prepareStatement(sql); // 컴파일만 시킨다.
pstmt.setString(1,1);
pstmt.setString(2,2);
...
pstmt.executeUpdate(); // 실행

연습문제

Q. 단어장 프로그램 만들기

DBconn.java

/*
    DB 연결 메소드
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBconn {

    public static  Connection conn;

    public static Connection getConnection() throws SQLException, ClassNotFoundException {
        String url = "jdbc:mysql://127.0.0.1/jcp?useSSL=false";
        String userid = "DB 이름";
        String userpw = "DB 비밀번호";

        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = DriverManager.getConnection(url, userid, userpw);
        return conn;
    }

    public  static void dbclose(){
        try {
            conn.close();
            conn = null;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

VocaDTO.java

public class VocaDTO {
    private int idx;
    private String eng;
    private String kor;
    private int level;
    private String rdate;

    public VocaDTO() {
    }

    public VocaDTO(int idx, String eng, String kor, int level, String rdate) {
        this.idx = idx;
        this.eng = eng;
        this.kor = kor;
        this.level = level;
        this.rdate = rdate;
    }

    public int getIdx() {
        return idx;
    }

    public void setIdx(int idx) {
        this.idx = idx;
    }

    public String getEng() {
        return eng;
    }

    public void setEng(String eng) {
        this.eng = eng;
    }

    public String getKor() {
        return kor;
    }

    public void setKor(String kor) {
        this.kor = kor;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public String getRdate() {
        return rdate;
    }

    public void setRdate(String rdate) {
        this.rdate = rdate;
    }

    @Override
    public String toString() {
        return "idx : " + idx + " eng : " + eng + " kor : " + kor + " level : " + level + " rdate : " + rdate;
    }
}

VocaDAO.java

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

public class VocaDAO {
    Connection conn;
    Scanner sc;
    StringBuilder sql;
    PreparedStatement pstmt;
    ResultSet rs; // 참조변수

    public void insert() {
        sc = new Scanner(System.in);
        System.out.print("추가할 단어를 입력하세요 >> ");
        String eng = sc.next();
        System.out.print("단어의 뜻을 입력하세요 >> ");
        String kor = sc.next();
        System.out.print("레벨을 입력하세요 >> ");
        int level = sc.nextInt();
        try {
            conn = DBconn.getConnection();
            sql = new StringBuilder();
            sql.append("INSERT INTO tb_word(w_eng, w_kor, w_level) VALUES (?,?,?)");
            pstmt = conn.prepareStatement(sql.toString());
            pstmt.setString(1, eng);
            pstmt.setString(2, kor);
            pstmt.setInt(3, level);
            int result = pstmt.executeUpdate();
            if (result >= 1) System.out.println("단어 등록 성공!");
            else System.out.println("단어 등록 실패! ");

            DBconn.dbclose();
            pstmt.close();
            pstmt = null;
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void list() {
        try {
            conn = DBconn.getConnection(); // DB 연결
            sql = new StringBuilder(); // 문자열을 저장할 Builder 만들기
            sql.append("SELECT w_eng , w_kor , w_level, w_datetime FROM tb_word ORDER BY w_eng asc");
            pstmt = conn.prepareStatement(sql.toString()); // sql 구문을 넣어 컴파일하여 conn 안에 prepareStatement 실행
            rs = pstmt.executeQuery(); // resultSet 반환
            while (rs.next()) { // next를 하면 한 줄 아래로 내려감
                String eng = rs.getString("w_eng"); // 커서가 첫번째 데이터를 가르키게 된다. 거기서 rs.getString에서 w_eng 컬럼을
                // 가져오게 된다. eng에 가져온 데이터를 저장하게 된다.
                String kor = rs.getString("w_kor");
                int level = rs.getInt("w_level");
                String datetime = rs.getString("w_datetime");
                System.out.println(eng + " : " + kor + " (" + level + ", " + datetime + ")");
            }
            DBconn.dbclose(); // 참조변수 없애기
            pstmt.close();
            pstmt = null;
            rs.close();
            rs = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void search() {
        sc = new Scanner(System.in);
        System.out.print("검색할 단어를 입력하세요 >> ");
        String word = sc.next();
        try {
            boolean isFind = false;
            conn = DBconn.getConnection(); // DB 연결
            sql = new StringBuilder();
            sql.append("SELECT w_eng, w_kor, w_level, w_datetime from tb_word where w_kor =?"); // w_kor에 대한 전체 내용 출력
            pstmt = conn.prepareStatement(sql.toString()); // 컴파일시켜서 pstmt를 만들어서
            pstmt.setString(1, word); // ?에 들어갈 단어를 입력
            rs = pstmt.executeQuery(); // rs로 출력

//            if(!rs.next()){ // 이렇게 하면 하나만 출력하게 된다.
//                System.out.println("찾는 단어가 없습니다.");
//            }else {
//                String eng = rs.getString("w_eng"); // 커서가 첫번째 데이터를 가르키게 된다. 거기서 rs.getString에서 w_eng 컬럼을
//                // 가져오게 된다. eng에 가져온 데이터를 저장하게 된다.
//                String kor = rs.getString("w_kor");
//                int level = rs.getInt("w_level");
//                String datetime = rs.getString("w_datetime");
//                System.out.println(eng + " : " + kor + " (" + level + ", " + datetime + ")");
//            }

            // rs.next를 하게 되면 커서가 다음으로 넘어가게 된다.
            while (rs.next()) { // 이렇게 하면 여러개가 출력되고
                isFind = true;
                String eng = rs.getString("w_eng");
                String kor = rs.getString("w_kor");
                int level = rs.getInt("w_level");
                String datetime = rs.getString("w_datetime");
                System.out.println(eng + " : " + kor + " (" + level + ", " + datetime + ")");
            }
            if (!isFind) System.out.println("찾는 단어가 없습니다.");

            DBconn.dbclose(); // 참조변수 없애기
            pstmt.close();
            pstmt = null;
            rs.close();
            rs = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void edit() {
        sc = new Scanner(System.in);
        System.out.print("수정할 단어를 입력하세요 >> ");
        String eng = sc.next();
        System.out.print("단어의 뜻을 입력하세요 >> ");
        String kor = sc.next();
        System.out.print("레벨을 입력하세요 >> ");
        int level = sc.nextInt();
        try {
            conn = DBconn.getConnection();
            sql = new StringBuilder();
            sql.append("UPDATE tb_word SET w_kor = ? , w_level =? where w_eng = ?");
            pstmt = conn.prepareStatement(sql.toString());
            pstmt.setString(1, kor);
            pstmt.setInt(2, level);
            pstmt.setString(3, eng);
            int result = pstmt.executeUpdate();
            if (result >= 1) System.out.println("단어 수정 성공!");
            else System.out.println("단어 수정 실패! ");

            DBconn.dbclose();
            pstmt.close();
            pstmt = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void delete() {
        sc = new Scanner(System.in);
        System.out.print("삭제할 단어를 입력하세요 >> ");
        String word = sc.next();
        try {
            conn = DBconn.getConnection(); // DB 연결
            sql = new StringBuilder();
            sql.append("DELETE FROM tb_word WHERE w_eng = ?");
            pstmt = conn.prepareStatement(sql.toString());
            pstmt.setString(1, word);
            int result = pstmt.executeUpdate();
            if(result >= 1) System.out.println("단어 삭제 성공! ");
            else System.out.println("단어 삭제 실패!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void random(){
        sc = new Scanner(System.in);
        System.out.println("단어 맞추기 게임을 시작합니다");
        int sum = 0;
        try {
            conn = DBconn.getConnection(); // DB 연결
            sql = new StringBuilder(); // 문자열을 저장할 Builder 만들기
            sql.append("SELECT w_eng , w_kor , w_level, w_datetime FROM tb_word order by rand() limit 10");
            pstmt = conn.prepareStatement(sql.toString());

            while (true) {
                rs = pstmt.executeQuery();
                rs.next();
                String eng = rs.getString("w_eng");
                String kor = rs.getString("w_kor");
                System.out.print(eng + "의 뜻을 입력하세요 >> ");
                String word = sc.next();
                if(kor.equals(word)){
                    System.out.println("맞았습니다. ");
                    sum += 1;
                    System.out.println("최종 점수 : " + sum);
                } else System.out.println("틀렸습니다.");

                if(sum == 10){
                    System.out.println("10점 모두 맞혔습니다. ");
                    System.out.println("게임을 종료하겠습니다😁");
                    break;
                }
            }
            DBconn.dbclose(); // 참조변수 없애기
            pstmt.close();
            pstmt = null;
            rs.close();
            rs = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

conn.close() : 연결 끊는 객체
  • DB는 데이터 공유를 위해 사용
  • Connection은 유한개 ⇒ 다른 사람을 위해 사용한 연결객체는 반환
  • DB 자원 : Connection 생성 → Statement 생성 → ResultSet 생성
  • DB 자원 반환은 역순으로 해주면 된다.
  • Connection만 끊어주면 Statement와 ResultSet도 자동적으로 끊긴다.

Main.java

import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        VocaDTO vocaDTO;
        VocaDAO vocaDAO = new VocaDAO(); // 객체 생성

        while(true){
            System.out.println("🎁    단어장    🎁");
            System.out.println("1. 등록   2.출력    3.검색    4.수정     5.삭제    6. 단어 맞추기 게임   7.프로그램 종료");
            int input = sc.nextInt();
            if(input == 7){
                System.out.println("프로그램을 종료합니다.");
                break;
            }
            switch (input){
                case 1:
                    vocaDAO.insert();
                    break;
                case 2:
                    vocaDAO.list();
                    break;
                case 3:
                    vocaDAO.search();
                    break;
                case 4:
                    vocaDAO.edit();
                    break;
                case 5:
                    vocaDAO.delete();
                    break;
                case 6:
                    vocaDAO.random();
                    break;
            }
        }
    }
}

이렇게 단어장 프로그램과 단어맞추기 게임 연습문제를 풀어보았다. 이제는 Java + 네트워크에 대해 공부해보자!

네트워크

  • Net + Work 합성어
  • 컴퓨터들이 통신 기술을 이용하여 그물망처럼 연결된 통신 이용형태

인터넷

  • 컴퓨터로 연결하여 TCP/IP 프로토콜을 이용하여 정보를 주고받는 네트워크

IP(Internet Protocol)

  • 인터넷에 연결되어 있는 모든 장치를 식별할 수 있도록 장비에게 부여되는 고유 주소
    포트(Port) : 컴퓨터나 통신장비에서 다른 장치에 물리적으로 접속되는 특정한 부위(통로)

IPv4(일반), IPv6
  • 32bit이면서 4개의 8비트 필드로 구분된 십진수로 작성된다.
아이피 알아보기
  1. 네이버에 "내 IP"로 검색
  2. 윈도우 cmd → ipconfig
    맥북 같은 경우 "ipconfig getifaddr en0"를 치면 아래와 같이 자신의 IP 주소를 확인 할 수 있다.


소켓(socket)

  • 두 호스트 사이 연결
  • 원격 장비에 연결, 데이터 전송(보내기, 받기), 포트 지정, 수신 대기
  • 어떠한 방식으로 통신을 할지 정해주는 것

소켓의 통신 흐름

서버(Server)

  • 클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하게 한다.
    1) socket() 함수를 이용하여 소켓을 생성
    2) bind() 함수로 ip와 port번호를 설정하게 됩니다.
    3) listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기 시킬지 결정
    4) accept() 함수를 사용하여 클라이언트와의 연결을 기다림

클라이언트(Client)

  • 실제로 데이터 송수신이 일어나는 것이 클라이언트 소켓이다.
    1) socket() 함수로 가장 먼저 소켓을 연다.
    2) connect() 함수를 이용할 서버의 설정된 ip와 port 번호에 통신을 시도
    3) 통신을 시도시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환
    4) 이를 통해 클라이언트와 서버가 서로 read(), write()를 하며 통신
    (이 과정을 반복)

0개의 댓글

관련 채용 정보