본문 바로가기
JDBC

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

by code2772 2022. 10. 20.

[ 목차 ]

    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;
        }
    
    }
    
    반응형