ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 004. DAO/DTO/VO 개념, 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리)
    SsY/Class 2023. 4. 25. 18:00
    728x90
    DAO DTO VO
    - 설명
    ■■■ DAO DTO VO ■■■
    ○ DAO (Data Access Object)
      데이터에 접근을 목적으로 하는 객체
      리소스를 매우 크게 소모하는 커넥션 객체를 하나만 두고
      여러 사용자가 DAO 인터페이스를 사용하여
      필요한 데이터에 접근할 수 있도록 한다.
      즉, Database 와 연계하여 처리할 프로그램을
      규정화 해 둔 클래스를 의미한다. 
      - DTO 객체를 만들어 편집 및 조작을 한다.
      - DTO 를 데이터베이스 서버에 저장하기도 한다.
        데이터베이스 서버로부터 레코드를 select 해서 DTO 객체로
        변형해 가져오기도 한다.
      - insert, update, delete, select 등
        데이터 액션 처리를 주 목적으로 한다.
    -------------------------------------------------------------------------------------
    ○ DTO (Data Transfer Object)
      데이터가 포함된 객체를 특정 시스템에서 다른 시스템으로
      전달하는 작업을 처리하는 객체.
      메소드 호출 횟수를 줄이기 위해 데이터를 담고 있는 객체이다.
      즉, 데이터를 하나의 객체로 관리할 목적으로 만들어 둔 클래스의 객체를 의미한다.
      setter 와 getter 메소드를 가지고 직렬화(Serializable) 를 구현한다. 
      - 폼에서 입력된 데이터들은 하나의 DTO 객체로 변환될 수 있다.
      - 일반적으로 하나의 데이터베이스 레코드를 저장하며
        레코드와 같은 구조를 가지고 있는 경우가 많다.
      - 하나의 레코드는 빈즈 클래스 하나로 매핑된다. 
      - 데이터 베이스의 컬럼은 멤버 변수로 매핑된다.
    -------------------------------------------------------------------------------------
    ○ VO (Value Object)
      Value Object 는 관계형 데이터베이스의 레코드에 대응되는 자바 클래스.
      형태는 DB 레코드를 구성하는 필드들을  Value Object 의 Attribute 로 하고
      해당 변수에 접근할 수 있는 setter/ getter 메소드의 조합으로 형성된 클래스.
      특성은 대체로 불변성이고, equals() 메소드를 통해 비교할 경우
      객체를 구성하고 있는 모든 값을 비교해야 한다.
      DTO 와 유사한 개념이지만, 특정 비즈니스 로직만 전달한다는 것으로
      이해하는 것이 구분에 용이하다.
      즉, 일반적으로 Value Oject 는 read only 속성을 갖는다.
      - Network Traffic 을 줄여 처리 성능을 향상시킬 수 있다.
      - 장점으로는 비 서버 측에 해당하는 클라이언트도
        네트워크 오버헤드 없이 영속적 데이터베이스에 엑세스 할 수 있다는 점이다.
      - 데이터 전달을 위해 가장 효율적인 방법이지만, 
        클래스의 선언을 위해서는 많은 코드가 필요하다.
        즉, 파일 수가 많아지게 되고 관리도 힘들어지게 된다는 단점이 있다.
    -------------------------------------------------------------------------------------
    ※ VO 와 DTO 비교
       VO 와 DTO 의 차이점은
       특정 비즈니스 로직을 담는 객체를 VO 라고 하고
       레이어 간의 통신 용도로 오가는 객체를 DTO 라고 한다.
       대부분 VO 와 DTO 를 같은 개념으로 다루고 있다.
    더보기

    - 하나의 객체를 전담으로 맡게 되면 시행착오도 줄일 수 있고, 효율적 : DAO
    - 한 객체가 전담으로 왔다 갔다 할 때, 한 번에 일을 처리할 수 있게 모아둘 수 있게 하는 것 : DTO, VO
    ※ DTO 와 VO 는 거의 같아서 실무에서는 구분을 하여 사용하는 경우가 거~~~의 없다
        지칭을 그냥 DTO 나 VO로 해둘 뿐. 
        단, DTO 나 VO 가 여러개가 존재하는 경우 (명확하게 나누어져서 구성되어있는 경우) 구별해 사용할 수 도 있다.

        이 때, 아래 두 가지를 확인한다. 
         1. 비즈니스로직 적용만 할 뿐이지 데이터 처리하지 않는 것인지? -> 데이터를 처리하지 않는 것 : VO
         2. Read Only? -> Read Only 인 것 : VO

    JDBC04

    SQL DEVELOPER

    SELECT USER
    FROM DUAL;
    --==>> SCOTT
    
    --○ 기존 실습에 이용했던 데이터들 정리
    TRUNCATE TABLE TBL_SCORE;
    --==>> Table TBL_SCORE이(가) 잘렸습니다.
    
    --○ 기존 실습에 이용했던 시퀀스 제거
    DROP SEQUENCE SCORESEQ;
    --==>> Sequence SCORESEQ이(가) 삭제되었습니다.
    
    --○ 시퀀스 다시 생성
    CREATE SEQUENCE SCORESEQ
    NOCACHE;
    --==>> Sequence SCORESEQ이(가) 생성되었습니다.

    Eclipse

    • DBConn
    /*====================
    	DBConn.java
    	- throws
    =====================*/
    
    package com.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class DCBConn
    {
    	private static Connection dbConn;
    	
    	public static Connection getConnection() throws ClassNotFoundException, SQLException
    	{
    		if (dbConn == null)
    		{
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "scott";
    			String pwd = "tiger";
    			
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			dbConn = DriverManager.getConnection(url, user, pwd);
    		}
    		
    		return dbConn;
    	}
    	
    	public static Connection getConnection(String url, String user, String pwd) throws ClassNotFoundException, SQLException
    	{
    		if (dbConn == null)
    		{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			dbConn = DriverManager.getConnection(url, user, pwd);
    		}
    		
    		return dbConn;
    	}
    	
    	public static void close() throws SQLException
    	{
    		if (dbConn != null)
    		{
    			if (!dbConn.isClosed())
    				dbConn.close();
    		}
    		
    		dbConn = null;
    	}
    	
    }

    /*======================
    	ScoreMain.java
    =======================*/
    /*
    ○ 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리)
                    - ScoreDTO 클래스 활용(속성만 존재하는 클래스, getter / setter 구성)
                    - ScoreDAO 클래스 활용(데이터베이스 액션 처리)
                    - Process 클래스 활용(업무 단위 기능 구성)
                    - DBConn 클래스 활용(데이터베이스 연결 전담 전용 객체 처리)
    
    여러 명의 이름, 국어점수, 영어점수, 수학점수를 입력받아
    총점, 평균, 석차 등을 계산하여 출력하는 프로그램을 구현한다.
    ※ 이 과정에서 업무 단위로 기능을 묶어 사용할 수 있는 서브 메뉴를 구성한다. → Process  클래스 활용
    */
    더보기
    /*
    실행 예)
    
    =====[ 성적 처리 ]=====
    1. 성적 입력
    2. 성적 전체 출력
    3. 이름 검색 출력
    4. 성적 수정
    5. 성적 삭제
    =======================
    >> 선택(1~5, -1종료) : 1
    
    7번 학생 성적 입력(이름 국어 영어 수학) : 상훈문 50 60 70
    >> 성적 입력이 완료되었습니다. 
    
    8번 학생 성적 입력(이름 국어 영어 수학) : 준복이 80 80 80
    >> 성적 입력이 완료되었습니다. 
    
    9번 학생 성적 입력(이름 국어 영어 수학) : .
    
    =====[ 성적 처리 ]=====
    1. 성적 입력
    2. 성적 전체 출력
    3. 이름 검색 출력
    4. 성적 수정
    5. 성적 삭제
    =======================
    >> 선택(1~5, -1종료) : 2
    
    전체 인원 : 8 명 
    번호   이름   국어   영어   수학   총점   평균   석차
    1
    2
    3
    4
    5						...
    6
    7
    8
    
    =====[ 성적 처리 ]=====
    1. 성적 입력
    2. 성적 전체 출력
    3. 이름 검색 출력
    4. 성적 수정
    5. 성적 삭제
    =======================
    >> 선택(1~5, -1종료) : 3
    
    >> 검색할 이름 입력 : 홍길동
    
    전체 인원 : 1명
    번호   이름   국어   영어   수학   총점   평균   석차
    1
    
    // 이름이 없을 경우 다시 물어보기 or 없다고 얘기하고 메인메뉴로 보내기 -- 업무 성격에 따라서 이동
    
    =====[ 성적 처리 ]=====
    1. 성적 입력
    2. 성적 전체 출력
    3. 이름 검색 출력
    4. 성적 수정
    5. 성적 삭제
    =======================
    >> 선택(1~5, -1종료) : -1
    
    >> 프로그램이 종료 됩니다. 
    
    
     */

    SQL DEVELOPER

    --○ 쿼리문 준비
    
    --1. 데이터 입력 쿼리문 구성
    INSERT INTO TBL_SCORE(SID,NAME,KOR,ENG,MAT)
    VALUES(SCORESEQ.NEXTVAL, '상훈문',90,80,70);
    --> 한 줄 구성
    INSERT INTO TBL_SCORE(SID,NAME,KOR,ENG,MAT) VALUES(SCORESEQ.NEXTVAL, '상훈문',90,80,70)
    ;
    --==>> 1 행 이(가) 삽입되었습니다.
    
    SELECT *
    FROM TBL_SCORE;
    --==>> 1	상훈문	90	80	70
    
    COMMIT;
    --==>> 커밋 완료.
    
    
    -- 2. 리스트 출력 쿼리문 구성(총점, 평균, 석차 포함)
    SELECT SID, NAME, KOR, ENG, MAT
        , (KOR + ENG + MAT) AS TOT
        , (KOR + ENG + MAT)/3 AS AVG
        , RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK
    FROM TBL_SCORE
    ORDER BY SID;
    --> 한 줄 구성
    SELECT SID, NAME, KOR, ENG, MAT, (KOR + ENG + MAT) AS TOT , (KOR + ENG + MAT)/3 AS AVG, RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK FROM TBL_SCORE ORDER BY SID
    ;
    --==>> 1	상훈문	90	80	70	240	80	1
    
    -- 내 쿼리문
    SELECT SID, NAME, KOR, MAT, ENG, (KOR+MAT+ENG) AS TOT, TRUNC((KOR+ENG+MAT)/3,2) AS AVG, RANK() OVER(ORDER BY (KOR+ENG+MAT)/3 DESC) AS RANK FROM TBL_SCORE
    ;
    
    
    --3. 인원 수 조회 쿼리문 구성
    SELECT COUNT(*) AS COUNT
    FROM TBL_SCORE;
    --> 한 줄 구성
    SELECT COUNT(*) AS COUNT FROM TBL_SCORE
    ;
    --==>> 1
    
    
    --4. 이름 검색 기능 관련 쿼리문 구성(총점, 평균, 석차가 포함된 리스트 형태로 조회)
    SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK
    FROM 
    (
        SELECT SID, NAME, KOR, ENG, MAT
            , (KOR + ENG + MAT) AS TOT
            , (KOR + ENG + MAT)/3 AS AVG
            , RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK
        FROM TBL_SCORE
    )
    WHERE NAME = '상훈문'
    ORDER BY SID
    ;
    --> 한 줄 구성
    SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK FROM (SELECT SID, NAME, KOR, ENG, MAT , (KOR + ENG + MAT) AS TOT , (KOR + ENG + MAT)/3 AS AVG , RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK FROM TBL_SCORE) WHERE NAME = '상훈문'
    ;
    --==>> 1	상훈문	90	80	70	240	80	1
    -- ++ 추가
    SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK
    FROM 
    (
        SELECT SID, NAME, KOR, ENG, MAT
            , (KOR + ENG + MAT) AS TOT
            , (KOR + ENG + MAT)/3 AS AVG
            , RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK
        FROM TBL_SCORE
    )
    WHERE NAME LIKE '%%%s%%'
    
    --5. 번호 검색 기능 관련 쿼리문 구성(총점, 평균, 석차가 포함된 리스트 형태로 조회) --> 성적 수정, 삭제를 위해
    SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK
    FROM 
    (
        SELECT SID, NAME, KOR, ENG, MAT
            , (KOR + ENG + MAT) AS TOT
            , (KOR + ENG + MAT)/3 AS AVG
            , RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK
        FROM TBL_SCORE
    )
    WHERE SID = 1
    ORDER BY SID
    ;
    --> 한 줄 구성
    SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK FROM(SELECT SID, NAME, KOR, ENG, MAT, (KOR + ENG + MAT) AS TOT, (KOR + ENG + MAT)/3 AS AVG, RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK FROM TBL_SCORE) WHERE SID = 1
    ;
    --==>> 1	상훈문	90	80	70	240	80	1
    
    --6. 데이터 수정 쿼리문 구성
    
    UPDATE TBL_SCORE
    SET NAME='상훈문', KOR =10 , ENG=20 , MAT=30 
    WHERE SID = 1;
    --> 한 줄 구성
    UPDATE TBL_SCORE SET NAME='상훈문', KOR =10 , ENG=20 , MAT=30 WHERE SID = 1
    ;
    --==>> 1 행 이(가) 업데이트되었습니다.
    
    SELECT *
    FROM TBL_SCORE;
    --==>> 1	상훈문	10	20	30
    
    COMMIT;
    --==>> 커밋 완료.
    
    --7. 데이터 삭제 쿼리문 구성
    
    DELETE
    FROM TBL_SCORE
    WHERE SID =1;
    --> 한 줄 구성
    DELETE FROM TBL_SCORE WHERE SID =1
    ;
    --==>> 1 행 이(가) 삭제되었습니다.
    
    ROLLBACK;
    --==>> 롤백 완료.
    
    -- 추가
    --8. 검색 인원수 확인 쿼리문 구성
    SELECT COUNT(*)
    FROM TBL_SCORE
    WHERE NAME = '상훈문';
    --> 한 줄 구성
    SELECT COUNT(*) AS COUNT FROM TBL_SCORE WHERE NAME = '상훈문'
    ;
    SELECT COUNT(*) AS COUNT FROM TBL_SCORE WHERE NAME LIKE '%%상훈%%'
    ;

    Eclipse

    • ScoreDTO
    /*====================================
    	ScoreDTO.java
    	- 데이터 보관 및 전송 전용 객체
    =====================================*/
    
    package com.test;
    
    public class ScoreDTO
    {
    	// 주요 속성 구성
    	private String sid, name;			//-- 번호, 이름
    	private int kor, eng, mat;			//-- 국어점수, 영어점수, 수학점수
    	private int tot, rank;				//-- 총점, 석차
    	private double avg;					//-- 평균
    	
    	// getter / setter  
    	public String getSid()
    	{
    		return sid;
    	}
    	public void setSid(String sid)
    	{
    		this.sid = sid;
    	}
    	public String getName()
    	{
    		return name;
    	}
    	public void setName(String name)
    	{
    		this.name = name;
    	}
    	public int getKor()
    	{
    		return kor;
    	}
    	public void setKor(int kor)
    	{
    		this.kor = kor;
    	}
    	public int getEng()
    	{
    		return eng;
    	}
    	public void setEng(int eng)
    	{
    		this.eng = eng;
    	}
    	public int getMat()
    	{
    		return mat;
    	}
    	public void setMat(int mat)
    	{
    		this.mat = mat;
    	}
    	public int getTot()
    	{
    		return tot;
    	}
    	public void setTot(int tot)
    	{
    		this.tot = tot;
    	}
    	public int getRank()
    	{
    		return rank;
    	}
    	public void setRank(int rank)
    	{
    		this.rank = rank;
    	}
    	public double getAvg()
    	{
    		return avg;
    	}
    	public void setAvg(double avg)
    	{
    		this.avg = avg;
    	}
    
    }

    • ScoreDAO
    /*========================================
    	ScoreDAO.java
    	- 데이터베이스 액션 처리 전용 객체
    =========================================*/
    
    package com.test;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    
    import com.util.DBConn;
    
    public class ScoreDAO
    {
    	// 주요 속성 구성
    	private Connection conn;
    	
    	// 데이터베이스 연결 담당 메소드
    	public Connection connection() throws ClassNotFoundException, SQLException
    	{
    		conn = DBConn.getConnection();
    		return conn;
    	}
    	
    	// 데이터 입력 담당 메소드
    	public int add(ScoreDTO dto) throws SQLException
    	{
    		int result = 0 ;
    		Statement stmt = conn.createStatement();
    		
    		String sql = String.format("INSERT INTO TBL_SCORE(SID,NAME,KOR,ENG,MAT)"
    									+ " VALUES(SCORESEQ.NEXTVAL,'%s',%d,%d,%d)"
    									, dto.getName(), dto.getKor(), dto.getEng(), dto.getMat());
    		result = stmt.executeUpdate(sql);
    		stmt.close();
    		
    		return result;
    	}
    	
    	// 전체 리스트 출력 담당 메소드
    	public ArrayList<ScoreDTO> lists() throws SQLException
    	{
    		ArrayList<ScoreDTO> result	= new ArrayList<ScoreDTO>();
    		Statement stmt = conn.createStatement();
    		
    		String sql = "SELECT SID, NAME, KOR, ENG, MAT"
    					+ ", (KOR + ENG + MAT) AS TOT "
    					+ ", (KOR + ENG + MAT)/3 AS AVG"
    					+ ", RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK"
    					+ " FROM TBL_SCORE"
    					+ " ORDER BY SID";
    		ResultSet rs = stmt.executeQuery(sql);
    		while (rs.next())
    		{
    			ScoreDTO dto = new ScoreDTO();
    			// 받아온 값을 새 dto 객체에 담아주는 행위
    			dto.setSid(rs.getString("SID"));
    			dto.setName(rs.getString("NAME"));
    			dto.setKor(rs.getInt("KOR"));
    			dto.setEng(rs.getInt("ENG"));
    			dto.setMat(rs.getInt("MAT"));
    			dto.setTot(rs.getInt("TOT"));
    			dto.setAvg(rs.getDouble("AVG"));
    			dto.setRank(rs.getInt("RANK"));
    			
    			result.add(dto);	//값이 담아진 dto 객체를 result(즉 arrayList) 에 add 해서 담기!
    		}
    		
    		rs.close();
    		stmt.close();
    		
    		return result;
    	}// end lists()
    	
    	
    	// 이름 검색 담당 메소드
    	public ArrayList<ScoreDTO> lists(String name) throws SQLException	// 동명이인의 경우가 있을 수 있어 Arraylist 형태 필요
    	{
    		ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
    		
    		Statement stmt = conn.createStatement();
    		String sql = String.format("SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK"
    								+ " FROM"
    								+ " (SELECT SID, NAME, KOR, ENG, MAT"
    								+ ", (KOR + ENG + MAT) AS TOT"
    								+ ", (KOR + ENG + MAT)/3 AS AVG"
    								+ ", RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK"
    								+ " FROM TBL_SCORE"
    								+ ") WHERE NAME LIKE '%%%s%%'", name);	
    		ResultSet rs = stmt.executeQuery(sql);
    		while (rs.next())
    		{
    			ScoreDTO dto = new ScoreDTO();
    			
    			dto.setSid(rs.getString("SID"));
    			dto.setName(rs.getString("NAME"));
    			dto.setKor(rs.getInt("KOR"));
    			dto.setEng(rs.getInt("ENG"));
    			dto.setMat(rs.getInt("MAT"));
    			dto.setTot(rs.getInt("TOT"));
    			dto.setAvg(rs.getDouble("AVG"));
    			dto.setRank(rs.getInt("RANK"));
    			
    			result.add(dto);			
    		}
    		rs.close();
    		stmt.close();		
    		
    		return result;
    	}
    	
    	// 번호 검색 담당 메소드
    	// public ScoreDTO lists(int sid) -- 단일 값 하나만 불러오기 때문에 별도로 이렇게 구성도 가능 함
    	public ArrayList<ScoreDTO> lists(int sid) throws SQLException 	// 다만, 사용자를 고려한 오버로딩 + sid String 값으로 구성했는데 int 로 한 것은 오버로딩을 위함
    	{
    		ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
    		Statement stmt = conn.createStatement();
    		String sql = String.format("SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK"
    								+ " FROM"
    								+ "(SELECT SID, NAME, KOR, ENG, MAT"
    								+ ", (KOR + ENG + MAT) AS TOT"
    								+ ", (KOR + ENG + MAT)/3 AS AVG"
    								+ ", RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK"
    								+ " FROM TBL_SCORE"
    								+ ") WHERE SID = %d", sid);
    		ResultSet rs = stmt.executeQuery(sql);
    		while (rs.next())	// if(rs.next()) 도 가능
    		{
    			ScoreDTO dto = new ScoreDTO();
    			
    			dto.setSid(rs.getString("SID"));
    			dto.setName(rs.getString("NAME"));
    			dto.setKor(rs.getInt("KOR"));
    			dto.setEng(rs.getInt("ENG"));
    			dto.setMat(rs.getInt("MAT"));
    			dto.setTot(rs.getInt("TOT"));
    			dto.setAvg(rs.getDouble("AVG"));
    			dto.setRank(rs.getInt("RANK"));
    			
    			result.add(dto);			
    		}
    		rs.close();
    		stmt.close();		
    		
    		return result;
    	}
    	
    	// 전체 인원 수 확인 담당 메소드
    	public int count() throws SQLException
    	{
    		int result = 0;
    		Statement stmt = conn.createStatement();
    		
    		String sql = "SELECT COUNT(*) AS COUNT FROM TBL_SCORE";
    		ResultSet rs = stmt.executeQuery(sql);
    		
    		while (rs.next())
    		{
    			result = rs.getInt("COUNT");
    		}
    		
    		rs.close();
    		stmt.close();
    		
    		return result;
    	}
    	
    	// 데이터 수정 담당 메소드 → 매개변수 유형 check!!! (수정을 위해서는 수정할 값까지 모두 받아야 한다.)
    	public int modify(ScoreDTO dto) throws SQLException	
    	{
    		int result = 0;
    		
    		Statement stmt = conn.createStatement();
    		String sql = String.format("UPDATE TBL_SCORE"
    								+ " SET NAME='%s', KOR = %d , ENG= %d , MAT=%d "
    								+ "WHERE SID = %s"
    								, dto.getName(), dto.getKor(), dto.getEng(), dto.getMat()
    								, dto.getSid());
    		result = stmt.executeUpdate(sql);
    		stmt.close();
    
    		return result;
    	}
    	
    	// 데이터 삭제 담당 메소드
    	public int remove(int sid) throws SQLException
    	{
    		int result = 0;
    		
    		Statement stmt = conn.createStatement();
    		String sql = String.format("DELETE FROM TBL_SCORE WHERE SID =%d", sid);
    		result = stmt.executeUpdate(sql);
    		stmt.close();	
    		
    		return result;
    	}
    	
    	// 데이터베이스 연결 종료 담당 메소드
    	public void close() throws SQLException
    	{
    		DBConn.close();
    	}
    	
    	// 추가 
    	// 검색 인원수 확인 담당 메소드
    	public int countName(String name) throws SQLException
    	{
    		int result = 0;
    		Statement stmt = conn.createStatement();
    		String sql = String.format("SELECT COUNT(*) AS COUNT FROM TBL_SCORE WHERE NAME LIKE '%%%s%%'", name);
    
    		ResultSet rs = stmt.executeQuery(sql);
    		while (rs.next())
    		{
    			result = rs.getInt("COUNT");
    		}
    		
    		rs.close();
    		stmt.close();
    		
    		return result;
    	}
    	
    }// end Class ScoreDAO

    • Process
    /*===================
    	Process.java
    ====================*/
    
    /*
    1. 성적 입력
    2. 성적 전체 출력
    3. 이름 검색 출력
    4. 성적 수정
    5. 성적 삭제
    */
    
    package com.test;
    
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Process
    {
    	// 주요 속성 구성 → 데이터베이스 액션 처리 전담 객체 → ScoreDAO
    	private ScoreDAO dao;
    	
    	// 생성자 정의(사용자 정의 생성자)
    	public Process()
    	{
    		dao = new ScoreDAO();
    	}
    	
    	// 성적 입력 기능
    	public void sungjukInsert() throws SQLException
    	{
    		try
    		{
    			//데이터베이스 연결
    			dao.connection();
    			
    			// 레코드 수 확인
    			int count = dao.count();
    			
    			Scanner sc = new Scanner(System.in);
    			
    			do
    			{
    				System.out.println();
    				System.out.printf("%d번 학생 성적 입력(이름 국어 영어 수학) : ", ++count);
    				String name = sc.next();
    				if (name.equals("."))
    					break;
    				int kor = sc.nextInt();
    				int eng = sc.nextInt();
    				int mat = sc.nextInt();
    				
    				// 입력받은 항목들을 토대로 ScoreDTO 객체 구성 -- add() 에 건네줄 속성 값만 채워지면 됨
    				ScoreDTO dto = new ScoreDTO();
    				dto.setName(name);
    				dto.setKor(kor);
    				dto.setEng(eng);
    				dto.setMat(mat);
    				
    				// dao 의 add() 메소드 호출
    				int result = dao.add(dto);
    				if (result>0)
    					System.out.println(">> 성적 입력이 완료되었습니다. ");
    				
    			} while (true);
    			
    			// 데이터베이스 연결 종료
    			dao.close();
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    
    	}//end sungjukInsert()
    	
    	// 성적 전체 출력 기능
    	public void sungjukSelectAll() 
    	{
    		try
    		{
    			// dao 의 connection() 메소드 호출 → 데이터베이스 연결
    			dao.connection();
    			
    			// dao 의 count() 메소드 호출 → 인원 수 확인
    			int count = dao.count();
    
    			// dao 의 lists() 메소드 호출 → 리스트 출력
    			System.out.println();
    			System.out.printf("전체 인원 : %d 명\n", count);
    			System.out.println("번호   이름     국어   영어   수학    총점    평균   석차");
    			
    			// list() 메소드의 호출 결과를 반복문을 활용하여 처리
    			for (ScoreDTO dto : dao.lists())
    			{
    				System.out.printf("%3s   %4s   %4d   %4d   %4d   %5d   %5.1f  %5d\n"
    								, dto.getSid(), dto.getName(), dto.getKor()
    								, dto.getEng(), dto.getMat(), dto.getTot()
    								, dto.getAvg(), dto.getRank());
    			}
    			
    			// dao 의 close() 메소드 호출 → 데이터베이스 연결 종료
    			dao.close();			
    
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    		
    	}// end sungjukSelectAll()
    	
    	
    	// 이름 검색 출력 기능
    	public void sungjukSearchName()
    	{
    		try
    		{
    			//검색 할 이름 입력받기
    			Scanner sc = new Scanner(System.in);
    			System.out.print("검색할 이름 입력 : ");
    			String name = sc.next();
    			
    			//-- 필요한 경우 이 과정에서 프로그래밍적으로 검증(검사) 수행
    			// (즉, 이름이아닌 숫자거나, 특수문자가 있거나 하는 상황에 대한 유효성 검사)
    			
    			// 데이터베이스 연결
    			dao.connection();
    			
    			// dao 의 lists() 메소드 호출 → 매개변수로 검색할 이름을 문자열 형태로 넘겨주기
    			ArrayList<ScoreDTO> arrayList = dao.lists(name);
    			
    			if (arrayList.size() > 0)
    			{
    				// 수신된 내용 출력
    				System.out.println();
    				//int count =  dao.countName(name);
    				//System.out.printf("전체 인원 : %d명\n",count);
    				System.out.printf("전체 인원 : %d명\n", dao.countName(name));
    				System.out.println("번호   이름     국어   영어   수학    총점    평균   석차");
    				for (ScoreDTO dto : arrayList)
    				{
    					System.out.printf("%3s   %4s   %4d   %4d   %4d   %5d   %5.1f  %5d\n"
    							, dto.getSid(), dto.getName(), dto.getKor()
    							, dto.getEng(), dto.getMat(), dto.getTot()
    							, dto.getAvg(), dto.getRank());
    				}
    			}
    			else
    			{
    				// 수신된 내용이 없는 상황이라는 안내
    				System.out.println(">> 검색 결과가 존재하지 않습니다.");
    			}
    			
    			// 데이터베이스 연결 종료
    			dao.close();
    			
    		} catch (Exception e)
    		{
    			// TODO: handle exception
    		}
    		
    		/*--------------------------------------------- 내 풀이-------------------------------------------------------
    		try
    		{
    			dao.connection();
    			Scanner sc = new Scanner(System.in);
    			do
    			{
    				System.out.println(">> 검색할 이름 입력 : ");
    				String name = sc.next();
    				
    				ArrayList<ScoreDTO> result = dao.lists(name);
    				
    				if (!result.isEmpty())
    				{
    					System.out.printf("전체 인원 : %d명\n", result.size());
    					System.out.println("번호   이름     국어   영어   수학    총점    평균   석차");
    					for (ScoreDTO dto : result)
    					{
    						System.out.printf("%3s   %4s   %4d   %4d   %4d   %5d   %5.1f  %5d\n"
    								, dto.getSid(), dto.getName(), dto.getKor()
    								, dto.getEng(), dto.getMat(), dto.getTot()
    								, dto.getAvg(), dto.getRank());
    					}
    					break;
    				}
    				
    				System.out.println(">> 검색 내역이 없습니다. 다시 입력하세요.");
    				
    			} while (true);
    			
    			dao.close();
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    		------------------------------------------------- 끝 -------------------------------------------------------*/
    	}// end sungjukSearchName()
    	
    	// 성적 수정 기능 -- 번호 입력받아 수정할 수 있도록 구성
    	public void sungjukUpdate()
    	{
    		try
    		{
    			// 수정할 대상의 번호 입력받기
    			Scanner sc = new Scanner(System.in);
    			System.out.print(">> 수정 대상의 번호를 입력하세요 : ");
    			int sid = sc.nextInt();
    			
    			//-- 입력받은 번호로 점검해야 할 로직 적용 삽입 가능
    						
    			// 데이터베이스 연결
    			dao.connection();
    			
    			// 수정할 대상 확인(수신)
    			ArrayList<ScoreDTO> arrayList = dao.lists(sid);
    			
    			if (arrayList.size() > 0)
    			{
    				// 수신된 내용 출력
    				System.out.println();
    				System.out.println("번호   이름     국어   영어   수학    총점    평균   석차");
    				for (ScoreDTO dto : arrayList)
    				{
    					System.out.printf("%3s   %4s   %4d   %4d   %4d   %5d   %5.1f  %5d\n"
    							, dto.getSid(), dto.getName(), dto.getKor()
    							, dto.getEng(), dto.getMat(), dto.getTot()
    							, dto.getAvg(), dto.getRank());
    				}
    				
    				// 대상에 대해 수정할 데이터 입력
    				System.out.println();
    				System.out.print(">> 수정 데이터 입력(이름 국어 영어 수학) : ");
    				String name = sc.next();
    				int kor = sc.nextInt();
    				int eng = sc.nextInt();
    				int mat = sc.nextInt();
    				
    				// 입력된 데이터를 활용하여 ScoreDTO 객체 구성
    				ScoreDTO dto = new ScoreDTO();
    				dto.setName(name);
    				dto.setKor(kor);
    				dto.setEng(eng);
    				dto.setMat(mat);
    				dto.setSid(String.valueOf(sid));
    				
    				// 구성된 ScoreDTO 객체를 넘겨주며 dao 의 modify() 메소드 호출
    				int result = dao.modify(dto);
    				if (result > 0)
    				{
    					System.out.println(">> 수정이 완료되었습니다.");
    				}
    			} else
    			{
    				// 수신된 내용이 존재하지 않는 상황임을 전달(안내)
    				System.out.println(">> 수정 대상이 존재하지 않습니다.");
    			}
    			
    			// 데이터베이스 연결 종료
    			dao.close();
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    	}// end sungjukUpdate()
    	
    	// 성적 삭제 기능
    	public void sungjukDelete()
    	{
    		try
    		{
    			// 삭제할 번호 입력받기
    			Scanner sc = new Scanner(System.in);
    			System.out.print(">> 삭제 대상의 번호를 입력하세요 : ");
    			int sid = sc.nextInt();
    			
    			//-- 입력받은 번호로 점검해야 할 로직 적용 삽입 가능
    			
    			// 데이터베이스 연결
    			dao.connection();
    			
    			// dao 의 lists() 메소드 호출 → sid 넘겨주며 삭제할 대상 검색
    			ArrayList<ScoreDTO> arrayList = dao.lists(sid);
    			
    			// 삭제할 대상의 존재여부 확인
    			if (arrayList.size() > 0)
    			{
    				// 수신된 내용 출력
    				System.out.println();
    				System.out.println("번호   이름     국어   영어   수학    총점    평균   석차");
    				for (ScoreDTO dto : arrayList)
    				{
    					System.out.printf("%3s   %4s   %4d   %4d   %4d   %5d   %5.1f  %5d\n"
    							, dto.getSid(), dto.getName(), dto.getKor()
    							, dto.getEng(), dto.getMat(), dto.getTot()
    							, dto.getAvg(), dto.getRank());
    				}
    				// 삭제 여부 확인
    				System.out.print(">> 정말 삭제하시겠습니까?(Y/N) : ");
    				String reponse = sc.next();
    				if (reponse.equals("Y")|| reponse.equals("y"))
    				{
    					// 삭제 처리
    					int result = dao.remove(sid);
    					if (result > 0)
    						System.out.println(">> 삭제가 완료되었습니다.");
    				}
    				else 
    				{
    					System.out.println(">> 취소되었습니다.");
    				}
    			} else
    			{
    				// 삭제 대상으로 수신된 내용이 존재하지 않는 상황임을 전달(안내)
    				System.out.println(">> 삭제할 대상이 존재하지 않습니다.");
    			}
    			// 데이터베이스 연결 종료
    			dao.close();
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    		
    	}// end sungjukDelete()
    	
    
    }//end Class Process

    • ScoreMain
    /*======================
    	ScoreMain.java
    =======================*/
    package com.test;
    
    import java.util.Scanner;
    
    public class ScoreMain
    {
    	public static void main(String[] args)
    	{
    		Scanner sc = new Scanner(System.in);
    		Process prc = new Process();
    		do
    		{
    			System.out.println();
    			System.out.println("=====[ 성적 처리 ]=====");
    			System.out.println("1. 성적 입력");
    			System.out.println("2. 성적 전체 출력");
    			System.out.println("3. 이름 검색 출력");
    			System.out.println("4. 성적 수정");
    			System.out.println("5. 성적 삭제");
    			System.out.println("=======================");
    			System.out.print(">> 선택(1~5, -1종료) :");
    			
    			String menus = sc.next();
    			
    			//-- 필요에 따라 입력값에 대한 유효성 검사 코드 삽입 가능
    			
    			try
    			{
    				int menu = Integer.parseInt(menus);
    				
    				if(menu == -1)
    				{
    					System.out.println();
    					System.out.println(">> 프로그램이 종료되었습니다.");
    					return;
    				}
    				
    				switch (menu)
    				{
    				case 1:
    					// 성적 입력 기능 수행
    					prc.sungjukInsert();
    					break;
    				case 2:
    					// 성적 전체 출력
    					prc.sungjukSelectAll();
    					break;
    				case 3:
    					// 이름 검색 출력 기능 수행
    					prc.sungjukSearchName();
    					break;
    				case 4:
    					// 성적 수정 기능 수행
    					prc.sungjukUpdate();
    					break;
    				case 5:
    					// 성적 삭제 기능 수행
    					prc.sungjukDelete();
    					break;
    
    				default:
    					break;
    				}
    
    			} catch (Exception e)
    			{
    				System.out.println(e.toString());
    			}
    		} while (true);			
    			
    	}// end main()
    }

     

    728x90
Designed by planet-si