JDBC

JDBC 서버 클라이언트 연동(학생 관리)

code2772 2022. 10. 20. 16:22
728x90
반응형
과제.
c/s 환경에서 아래와 같이 프로그램을 만들어보자.

******** 메뉴 *******
1. 학생 리스트
   학번 이름 연락처 성별 주소
2. 성적 리스트
   학번 이름 국어 수학 영어 총점 평균

자바와 SQL 연동

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

public class DBcon {
    private static Connection conn; // 주요하게 생각하는것을 컨넥션 객체를 사용할 수 있게
    //스테틱이 있으면 클래스만 불러도 된다 메소드 호출시
    public static Connection getConnection() throws SQLException, ClassNotFoundException {// 리턴타입은 Connection
        String url = "jdbc:mysql://127.0.0.1/aidev?useSSL=false";
        String uid = "root";
        String upw = "1234";

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

서버

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class ServerTask {
    public static void main(String[] args) {
        System.out.println("서버가 실행되었습니다.");
        Scanner sc = new Scanner(System.in);
        ServerSocket serverSocket = null;
        Socket socket = null;
        ScoreDAO scoreDAO = new ScoreDAO();
        BufferedReader br = null;
        BufferedWriter bw = null;
        try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
            serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
            System.out.println("서버가 준비되었습니다.");
            socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
            System.out.println("클라이언트가 접속되었습니다.");
            br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            // 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
            String dan = br.readLine();
            int intdan = Integer.parseInt(dan);

            switch(intdan) {
                case 1:
                    bw.write(scoreDAO.list()); // scoreDAO.list() 를 출력
                    System.out.println(scoreDAO.list());
                    bw.flush(); // 남아있는 데이터를 모두 출력시킴

                    break;
                case 2:
                    bw.write(scoreDAO.scoreList());
                    System.out.println(scoreDAO.scoreList());
                    bw.flush();
                    break;


            }
        }catch (IOException e){
            e.printStackTrace();
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }catch (SQLException e){
            e.printStackTrace();
        }
        finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
            if(br != null) try{br.close();}catch (IOException e){}
            if(bw != null) try{bw.close();}catch (IOException e){}
            if(socket != null) try{socket.close();}catch (IOException e){}
            if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
        }
        System.out.println("프로그램이 종료되었습니다.");
    }
}

클라이언트

import java.io.*;
import java.net.Socket;
import java.sql.SQLException;
import java.util.Scanner;

public class ClientTask {
    public static void main(String[] args) {
        System.out.println("클라이언트가 실행되었습니다.");
        Socket socket = null;
        BufferedReader br = null;//받을거기 때문에
        BufferedWriter bw = null;

        try{
            System.out.println("서버와 연결을 시도중입니다");
            socket = new Socket("192.168.6.13",3579);//접속이 잘되면 소켓생성
            System.out.println("연결되었습니다");
            br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            System.out.println("1번 학생리스트, 2번 성적리스트");
            System.out.println("번호를 입력하세요");

            Scanner sc = new Scanner(System.in);
            int input = sc.nextInt();
            System.out.println(input + "번호");
            bw.write(input+"\n");
            bw.flush();
            System.out.println("전송되었습니다.");

            String list ="";
            while((list = br.readLine()) != null){
                System.out.println(list);
            }


        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(br != null) try{br.close();}catch(IOException e){}
            if(socket != null) try{socket.close();} catch (IOException e){}
        }
        System.out.println("프로그램이 종료되었습니다");
    }
}

DAO 메소드 부분

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ScoreDAO {

    public  String list() throws ClassNotFoundException, SQLException {
        Connection conn = DBcon.getConnection();
        StringBuilder sql = new StringBuilder();
        sql.append("select st_id, st_name, st_hp, st_gender, st_address,st_rdate from tb_student order by st_id");
        PreparedStatement pstmt = conn.prepareStatement(sql.toString());
        ResultSet rs = pstmt.executeQuery();
        String s = ""; // 널로 초기값 지정 -> 와일문을 통할 때 변수만 선언할 경우 문제가 발생

        while (rs.next()) {
            String st_id = rs.getString("st_id");
            String st_name = rs.getString("st_name");
            String st_hp = rs.getString("st_hp");
            String st_gender = rs.getString("st_gender");
            String st_address = rs.getString("st_address");
            String st_rdate = rs.getString("st_rdate");
            s += st_id + ": " + st_name +  ": " + st_hp +
                    ": " + st_gender +  ": "+st_address+": "+st_rdate+"\n";
        }// 와일문 내 s만 사용한 이유는 return해야 하는 값인데 String 사용시 반복문 내에서만
        // 수행이 되기 때문에
        return s; // 리턴값을 반환하여 서버에 넣어주기 위해 리턴사용
    }

    public  String scoreList() throws ClassNotFoundException, SQLException{
        Connection conn = DBcon.getConnection();
        StringBuilder sql = new StringBuilder();
        System.out.println("성적보기");
        sql.append("select st_id, st_name, sc_kor,sc_math,sc_eng,sc_avg,sc_sum  \n" +
                " from tb_student left join tb_score on tb_student.st_id = tb_score.sc_id;");
        PreparedStatement pstmt = conn.prepareStatement(sql.toString());
        ResultSet rs = pstmt.executeQuery();
        String l = "";
        while (rs.next()) {
            String st_id = rs.getString("st_id");
            String st_name = rs.getString("st_name");
            int sc_kor = rs.getInt("sc_kor");
            int sc_math = rs.getInt("sc_math");
            int sc_eng = rs.getInt("sc_eng");
            int sc_avg = rs.getInt("sc_avg");
            int sc_sum = rs.getInt("sc_sum");
            l +=" 아이디 : "+st_id + " 이름 : " + st_name +  " 국어 : " + sc_kor +
                    "수학 : " + sc_math +  "영어 : "+sc_eng+" 평균 : "+sc_avg+" 합계: "+sc_sum + "\n";
        }
        return l;
    }

}
반응형