본문 바로가기
Backend

06월 25일 화 | SW활용 07 - NCS 시험범위와 DB연습Ⅰ

by 구라미 2019. 6. 25.

NCS 시험범위와 DB연습

 

타이틀 세부내용
학습 1. 운영체제 기초 활용하기 1-1. 운영체제의 특징 파악 3 
1-2. 운영체제 기본 명령어 활용 8 
1-3. 운영체제 핵심 기능 파악 16 
학습 2. 데이터베이스 기초 활용하기  2-1. 데이터베이스 종류 및 선정 24 
2-2. 관계형 데이터베이스 활용 30 
2-3. 데이터베이스 관리 37 
학습 3. 네트워크 기초 활용하기  3-1. 네트워크 계층 구조 파악 45 
3-2. 네트워크 프로토콜 파악 53 
3-3. 네트워크 핵심 알고리즘 파악 60 
학습 4. 기본 개발환경 구축하기  4-1. 운영체제 설치 및 운용 70 
4-2. 개발 도구 설치 및 운용 76 
4-3. 응용 시스템 개발 인프라 구축 81 



 


학습 1. 운영체제 기초 활용하기 

 

1-1. 운영체제의 특징 파악 3 

 

OS의 정의

운영체제는 사용자로 하여금 컴퓨터의 하드웨어를 보다 쉽게 사용할 수 있도록 인터페이스를 제공해 주는 소프트웨어이다. 하드웨어는 컴퓨터의 장치를 제어하고 데이터를 처리 하는 중앙 처리 장치, 데이터를 저장하는 기억 장치, 외부와의 통신을 담당하는 통신 장치 그리고 데이터 입력과 출력을 담당하는 입출력 장치 등으로 구분될 수 있다. 즉, 운영체제
는 사용자 편의성을 위한 인터페이스인 동시에 다양한 자원을 관리하는 자원 관리자이다.

 

OS의 구조

 

 

윈도우즈 - 윈도우즈7, 윈도우즈10

리눅스 - 우분투, 센토스

맥 - OS X

 

COI -> CLI

커맨드라인 명령어

화면 GUI 명령어

비교 장단점 알기

 

linux,unix

-Shell

-Kernel

개념 코어와 인터페이스

리눅스와 유닉스 명령어는 Shell에서 입력할 수 있다. Shell이란 컴퓨터 내부를 관리하는 Kernel과 사용자 간을 연결하는 Command 창이다. 셸의 주요 기능은 다음과 같다.

- 세션별 변수를 설정, 운영체제를 사용자가 원하는 상태로 설정하도록 지원
- 사용자 요청에 기반한 명령렬 작성
- 백그라운드 처리, 서브 셸 생성
- 일련의 명령어를 묶어 처리하는 스크립트 기능 지원 등
Bourne 계열은 Bash 셸, Korn 셸, Bourne 셸 등이 존재하고, C계열은 Csh, Tcsh, Zsh, Ash 와 같은 셸이 있다. 이 중 Ksh 셸은 리눅스에서, Bash 셸은 리눅스에서 가장 보편적으로 사용되고 있다.

 

명령 대기화면 prompt 상태

 

 

 

1-2. 운영체제 기본 명령어 활용

 

1. CLI(Command Line Interface) 기본 명령어
리눅스는 최상위 유저를 CLI 환경에서 #으로 표시하며 일반 유저를 $로 표시한다. 명령어에 대한 도움말은 -help, -h, #man을 명령어 뒤에 붙임으로써 확인할 수 있다. 모든 명령어에는 다른 옵션값들이 존재한다. 예를 들어 #mkdir는 디렉터리를 생성하는 명령어이며, -p옵션을 사용하면 하위 디렉터리까지 한 번에 생성할 수 있다. #cp는 파일 복사 명령어 있데, -i는 덮어쓰기, -r는 하위 디렉터리 및 파일 모두 복사, -v는 명령어 실행 과정을 보여 주는 옵션값이다.

명령어는 파일 디렉터리 관리, 유저 관리, 권한 관리, 프로세스관리, 통신 관련 등으로 구분될 수 있다. 최상위 디렉터리는 /이며 root는 최상위 디렉터리 아래의 root 계정의 홈 디렉터리임을 의미한다. 타 운영체제에서 root를 최상위 디렉터리라고 하는 것과 다르다.

 

 

[최고 관리자 계정] - 슈퍼유저 

오라클 DB - system, sys

MySQL DB - root

MS-SQL DB - sa

Windows OS - administrator

 

 

최상위 디렉토리를 루트라고 한다.

cmd  shell

 

  명령프롬프트 Shell
디렉토리 dir #ls
복사 copy #cp
상위폴더 cd.. #cd ..
현재폴더 cd. #cd.
파일삭제 del #rm
파일내용출력 type #vi (편집도 가능)

   

 

1-3. 운영체제 핵심 기능 파악 

 

운영체제 기능

중앙 처리 장치, 메모리, 스토리지, 주변 기기 등을 적절히 관리한다. 

 

가상화, 클라우드

 

 


 

학습 2. 데이터베이스 기초 활용하기 


2-1. 데이터베이스 종류 및 선정 

관계형 DB RDB

관계형 데이터베이스 관리시스템(RDBMS: Relational Database Management System) 가장 보편화된 데이터베이스 관리시스템이다. 데이터를 저장하는 테이블의 일부를 다른 테이블과 상하 관계로 표시하며 상관관계를 정리한다. 변화하는 업무나 데이터 구조에 대한 유연성이 좋아 유지 관리가 용이하다.
- Oracle: 미국 오라클사에서 개발한 데이터베이스 관리시스템으로 유료이다. 리눅스/ 유닉스/윈도 모두를 지원하며 대형 시스템에서 많이 사용한다.
- SQL Server: 마이크로소프트사에서 개발한 관계형 데이터베이스 시스템이다. 마이크로소프트사 제품이기 때문에 윈도즈 서버에서만 구동이 되며, 마이크로소프트사의 개발언어인 C# 등과 가장 잘 호환된다.
- MySQL: 썬 마이크로시스템에서 소유했던 관계형 데이터베이스 시스템이었으나 오라클에서 인수하였다. 리눅스, 유닉스, 윈도에서 모두 사용이 가능하고 오픈소스 기반으로 개발되었다.
- Maria DB: MySQL 출신 개발자가 만든 데이터베이스로 MySQL과 완벽히 호환된다.

 

데이터베이스 관리시스템(DBMS) 특징
- 데이터 무결성: 부적절한 자료가 입력되어 동일한 내용에 대하여 서로 다른 데이터가 저장되는 것을 허용하지 않는 성질
- 데이터 일관성: 삽입, 삭제, 갱신, 생성 후에도 저장된 데이터가 변함없이 일정
- 데이터 회복성: 장애가 발생하였을 시 특정 상태로 복구되어야 하는 성질
- 데이터 보안성: 불법적인 노출, 변경, 손실로부터 보호되어야 하는 성질
- 데이터 효율성: 응답 시간, 저장 공간 활용 등이 최적화되어 사용자, 소프트웨어, 시스템 등의 요구 조건을 만족 시켜야 하는 성질

 

 

상용 데이터베이스 관리시스템 및 오픈소스 기반 데이터베이스 관리시스템
- 상용 데이터베이스 관리시스템은 특정 회사에서 유료로 판매하는 시스템이다. 유지 보수와 지원이 원활한 장점이 있다.
- 오픈소스 기반 데이터베이스 시스템은 오픈소스 라이선스 정책을 준용하는 범위 내에서 사용이 자유롭다. 최근 사용 비중이 증가하고 있다.

• 상용 데이터베이스 관리 프로그램(Oracle, MSSQL 등)
• 오픈소스 기반 데이터베이스 관리 프로그램(MySQL, MongoDB 등)
• 오픈소스 라이선스 정책(MIT, BSD, 아파치, MPL, Eclipse, GPL, LGPL 등)

 

1. 데이터베이스 시스템 특징을 파악한다.
관리하는 데이터의 형태 및 관리 방식에 따라 관계형 데이터베이스, 문서 저장 시스템, 그
래프 데이터베이스, Key-Value 스토어 등으로 구분된다. <표 2-2>를 참조하여 각 데이터
베이스 유형별 특징을 정리한다.

2. 오픈소스 DBMS와 상용 DBMS의 특징과 주요 제품을 파악한다.
(1) 데이터베이스 관리시스템 제품 중 오픈소스 기반의 제품이 차지하는 비중이 높아지
는 이유를 정리한다.
- 기업들의 원가 절감 노력과의 상관관계를 파악한다.
- 인공 지능, 클라우드, 빅데이터 등 새로운 기술의 증가에 따른 오픈소스 데이터베이스
관리시스템의 대응 동향을 분석한다.
- 보안, 안정성에 대한 우려를 오픈소스 진영에서 해결하고 있는 노력을 조사한다.
- 정책적으로 오픈소스 데이터베이스 관리시스템 활성화를 추진하는 사례를 정리한다.

 

(2) 상용화 데이터베이스 관리시스템과 오픈소스 기반 데이터베이스 관리시스템의 주요
제품들을 파악한다.

 

2-2. 관계형 데이터베이스 활용 30 

ERD(E-R Diagram)
1. ERD 개요
ERD는 업무 분석 결과로 도출된 실체(엔티티)와 엔티티 간의 관계를 도식화한 것이다.
ERD로 요소들 간 연관성을 도식화하여 데이터베이스 관리자, 개발자, 사용자 모두 데이터의 흐름과 연관성을 공통적으로 쉽게 확인할 수 있다.


2. ER Model
ERD의 구성 요소인 개체, 관계, 속성을 추출하기 위해서는 업무나 시스템에 대한 명확한 정의가 있어야 한다. ERD로 도식화하기 전 각 개체를 사각형, 화살표, 마름모로 표기한 형태를 ER 모델이라고 한다.

 

 

1) 엔티티(Entity) - table
사물 또는 사건으로 정의되며 개체라고도 한다. ERD에서 엔티티는 사각형으로 나타내고 사격형 안에는 엔티티의 이름을 넣는다.
- 가능한 한 대문자로 엔티티 이름을 써 주며 단수형으로 명명한다.
- 유일한 단어로 정한다.

 

(2) 속성(Attribute)
엔티티가 가지고 있는 요소 또는 성질을 속성이라 부른다. 속성은 선으로 연결된 동그라미로 표기(Chen Model)하거나 표 형식으로 표기(Crow's Foot Model)하기도 한다.
관계형 데이터베이스 활용을 위해서는 Crow's Foot Model이 편리하다.

- 속성명은 단수형으로 명명한다.
- 엔티티명을 사용하지 않는다.
- 속성이 필수 사항(Not Null)인지, 필수 사항이 아닌지(Null) 고려하여 작성한다.

 

(3) 관계(Relationship)
두 엔티티 간의 관계를 정의한다. 개체는 사각형(□), 속성은 타원형(○)을 이용하여
표시하며, 관계 표시는 <표 2-5>를 참조한다.

 

2. ERD 최적화
(1) 테이블 정의
업무나 시스템을 분석하여 엔티티, 속성을 추출한 뒤 테이블을 작성한다.
(2) 정규화 수행 
데이터베이스 정규화는 무결성을 확보하고 중복성을 배제하여 테이블에 정확한 데이터가 들어가도록 하는 데 목적이 있다. 데이터의 중복성을 없애면 저장 공간을 최소화하고 시스템의 속도 또한 빠르게 할 수 있다.
- 1차 정규화: 반복되는 그룹의 속성을 별도로 추출한다.
- 2차 정규화: 부분 함수적 종속성을 제거한다.
- 3차 정규화: 키에 종속되지 않은 칼럼을 제거한다.
(3) ERD 관계형 스키마(논리 모델, 물리 모델) 작성
사용자가 식별하기 쉬운 한글 또는 영어 단어로 작성된 논리 ERD를 작성한다. 시스템이 식별하기 쉽도록 코드화된 물리 ERD를 작성한다.

 

󰊳 관계형 데이터베이스 테이블 생성
1. 생성 언어
데이터베이스의 종류와 상관없이 명령어는 국제 표준으로 제정된 SQL(Structured Query Language)를 사용한다. 미국 표준 연구소인 ANSI와 국제 표준화 기구인 ISO에서 SQL을 관계 데이터베이스의 표준 질의어로 채택하고 표준화하고 있다.
2. 테이블 관리
- 쿼리 명령어 “Create”를 사용하면 테이블 및 속성을 생성할 수 있다.
(예: CREATE TABLE table_name (column1 datatype, column2 datatype, ....);
- 쿼리 명령어 “Drop”을 사용하면 테이블을 삭제할 수 있다.
(예: DROP TABLE table_name ;)
- 쿼리 명령어 “Show tables”를 사용하면 테이블의 내용을 확인할 수 있다.

 

 


2-3. 데이터베이스 관리

CRUD는 데이터베이스가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기),
Update(갱신), Delete(삭제)를 말한다.

 

 


학습 3. 네트워크 기초 활용하기 

3-1. 네트워크 계층 구조 파악 

 

ㄴㅇㄹㄴㅇㄹ

 

 

 


MySQL 

 

SUNGJUK 테이블 이클립스로 출력하기 

 

연습문제 1) 어제 만든 SNO기준으로 SUNGJUK 테이블을 이클립스로 출력하시오.

package jdbc0625;

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

public class Test01_SelectAll {

	public static void main(String[] args) {
		//sungjuk 테이블 전체 목록을 sno 칼럼순으로 정렬해서 출력하시오.
		String url ="jdbc:oracle:thin:@localhost:1521:xe";
		String user ="java0514";
		String password ="1234";
		String driver ="oracle.jdbc.driver.OracleDriver";
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
			Class.forName(driver);				
			con = DriverManager.getConnection(url, user, password); 
			System.out.println("오라클DB 서버 연결 성공!!");
				
			StringBuilder sql = new StringBuilder();
			sql.append(" SELECT SNO,UNAME,KOR,ENG,MAT,AVG,ADDR,WDATE "); //칼럼의 순서는 이곳에서.
			sql.append(" FROM SUNGJUK ");
			sql.append(" ORDER BY SNO ");
									
			pstmt = con.prepareStatement(sql.toString());				
			rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.
			//cursor는 불러온 값 가장 처음것을 가리킴
			//cursor : 가리키는 값
			if(rs.next()){ //cursor가 존재하는지?
				System.out.println("자료있음");
				do{ //칼럼명으로 접근한다.
				System.out.print(rs.getInt("SNO")+" ");
				System.out.print(rs.getString("UNAME")+" ");
				System.out.print(rs.getInt("KOR")+" ");
				System.out.print(rs.getInt("ENG")+" ");
				System.out.print(rs.getInt("MAT")+" ");
				System.out.print(rs.getInt("AVG")+" ");
				System.out.print(rs.getString("ADDR")+" ");
				System.out.print(rs.getDate("WDATE")+" ");
				System.out.println();
			} while(rs.next());
			
			}else{
			System.out.println("자료없음");
			}
			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}finally{
				//자원반납(순서주의!!!!) 자원반납할시 역순으로 가장 최근에 실행했던 것부터 반납.
				try{
					if(rs!=null){rs.close();}
				} catch (Exception e){}		
				
				try{
					if(pstmt!=null){pstmt.close();}
				} catch (Exception e){}
				
				try{
					if(con!=null){con.close();}
				} catch (Exception e){}
				
			}

	}//MAIN END
}//CLASS END

 

결과값:

* 짝이 getString으로 WDATE를 불러왔는데 그렇게 했더니 시간까지 전부 출력되었다.

* substring으로 글자 잘라도 된다. 

* System.out.print(rs.getString("WDATE").substring(0,10)+" ");

 

 

연습문제 2) SUNGJUK 테이블의 행갯수를 출력하시오.

COUNT와 AS를 이용한 문제.

package jdbc0625;

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

public class Test02_SelectAll {

	public static void main(String[] args) {
		//sungjuk 테이블 전체 행 갯수를 출력하시오.
		String url ="jdbc:oracle:thin:@localhost:1521:xe";
		String user ="java0514";
		String password ="1234";
		String driver ="oracle.jdbc.driver.OracleDriver";
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
				Class.forName(driver);				
				con = DriverManager.getConnection(url, user, password); 
				System.out.println("오라클DB 서버 연결 성공!!");
				
				StringBuilder sql = new StringBuilder();
				sql.append(" SELECT COUNT(*) AS CNT "); //AS 사용해서 가상의 칼럼명 부여
				sql.append(" FROM SUNGJUK ");
									
				pstmt = con.prepareStatement(sql.toString());				
				rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.
				//cursor는 불러온 값 가장 처음것을 가리킴
				//cursor : 가리키는 값
				if(rs.next()){ //cursor가 존재하는지?
					System.out.println("자료있음");
					do{ //칼럼명으로 접근한다.
						System.out.print(rs.getInt("CNT")+" ");//임시로 만든 CNT값 가져오기.
						System.out.println();
					} while(rs.next());
					
				}else{
					System.out.println("자료없음");
				}
			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}finally{
				//자원반납(순서주의!!!!) 자원반납할시 역순으로 가장 최근에 실행했던 것부터 반납.
				try{
					if(rs!=null){rs.close();}
				} catch (Exception e){}		
				
				try{
					if(pstmt!=null){pstmt.close();}
				} catch (Exception e){}
				
				try{
					if(con!=null){con.close();}
				} catch (Exception e){}
				
			}

	}//MAIN END
}//CLASS END

 

결과값:

 

 

연습문제 3) 주소가 'SEOUL'인 행들의 국영수 평균값을 출력하세요.

AVG와 AS를 이용한 문제.

그리고 String keyword ='SEOUL'; <-변수를 어떻게 넣고 불러오는지에 대한 문제였다.

package jdbc0625;

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

public class Test03_SelectAvg {

	public static void main(String[] args) {
		//sungjuk 테이블 전체 행 갯수를 출력하시오.
		String url ="jdbc:oracle:thin:@localhost:1521:xe";
		String user ="java0514";
		String password ="1234";
		String driver ="oracle.jdbc.driver.OracleDriver";
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
		Class.forName(driver);				
		con = DriverManager.getConnection(url, user, password); 
		System.out.println("오라클DB 서버 연결 성공!!");
				
		//문3) 주소가 서울인 행들의 국영수 평균값을 출력하시오.
		String keyword ="SEOUL";
				
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT AVG(KOR) AS AVG_KOR,AVG(ENG) AS AVG_ENG,AVG(MAT) AS AVG_MAT "); 
        //AS 사용해서 가상의 칼럼명 부여
		sql.append(" FROM SUNGJUK ");
		sql.append(" WHERE ADDR = ? ");
									
		pstmt = con.prepareStatement(sql.toString());
		pstmt.setString(1, keyword); //★★★이부분이 누락되었었음
				
		rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.				
		//cursor는 불러온 값 가장 처음것을 가리킴
		//cursor : 가리키는 값
		if(rs.next()){ //cursor가 존재하는지?
			System.out.println("자료있음");
			do{ //칼럼명으로 접근한다.
			System.out.print(rs.getInt("AVG_KOR")+" ");	
			System.out.print(rs.getInt("AVG_ENG")+" ");	
			System.out.print(rs.getInt("AVG_MAT")+" ");	
			System.out.println();
		} while(rs.next());
					
		}else{
			System.out.println("자료없음");
			}
			
		}catch(Exception e){
			System.out.println("실패!" + e);
		}finally{
			//자원반납(순서주의!!!!) 자원반납할시 역순으로 가장 최근에 실행했던 것부터 반납.
			try{
				if(rs!=null){rs.close();}
			} catch (Exception e){}		
			
			try{
				if(pstmt!=null){pstmt.close();}
			} catch (Exception e){}
			
			try{
				if(con!=null){con.close();}
			} catch (Exception e){}
				
			}

	}//MAIN END
}//CLASS END

 

 

 

결과값:

CMD로도 확인해보니

맞는 결과가 떴다.

 

 

쿼리문에서 이렇게 반올림 해줄 수도 있다.

SELECT

ROUND(AVG(KOR),2) AS AVG KOR,

ROUND(AVG(ENG),2) AS AVG ENG,

ROUND(AVG(MAT),2) AS AVG MAT

FROM SUNGJUK

WHERE ADDR = 'SEOUL';

 

 

연습문제 4) LIKE연산자 연습

만약 아래와 같은 쿼리문이 있다면

WHERE SUBJECT LIKE '%HAPPY%'

WHERE UNAME LIKE '%HAPPY%'

WHERE CONTENT LIKE '%HAPPY%'

              COL           KEYWORD 

 

계속 같은 자리만 반복해서 변한다. 저 부분은 변수 처리 해줄 수있다.

검색 용 게시판 작성할 때 많이 쓰이는 쿼리문 요령이다. 

 

package jdbc0625;

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

public class Test04_Like {

	public static void main(String[] args) {
	//sungjuk 테이블 전체 행 갯수를 출력하시오.
	String url ="jdbc:oracle:thin:@localhost:1521:xe";
	String user ="java0514";
	String password ="1234";
	String driver ="oracle.jdbc.driver.OracleDriver";
		
	Connection con = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null; //
		
	try{				
		Class.forName(driver);				
		con = DriverManager.getConnection(url, user, password); 
		System.out.println("오라클DB 서버 연결 성공!!");
				
	//문4) 이름에 '우'이라는 글자가 있는 행들을 조회하시오. Like 연산자 연습
	//WHERE UNAME LIKE '%우%'
	String col = "UNAME";
	String keyword = "우";
	//String where = "WHERE "+col+" LIKE "+"'%"+keyword+"%'";//내가 한거
				
	//그냥 ? 사용했을 때 안되니까 약간의 꼼수를 사용.
	//매우 중요한 내용 ★★★★★★★★★★★★★★★★★★★★★★★★★★★
	// + 연산자 많이 사용하기 때문에 StringBuffer 사용 권장.
	/*String where = "";
	where+=" WHERE " + col; //SQL명령어 사용하려공백을 주의해야한다.
	where+=" LIKE '%" + keyword + "%' "; //그래서 선생님은 좌우 공백을 주신다고 한다.
	//%옆에 따옴표
	System.out.println(where);*/
				
	//StringBuilder 사용하기
	StringBuilder where = new StringBuilder();
	where.append(" WHERE " + col);
	where.append(" LIKE '%" + keyword + "%' ");
	System.out.println(where);
								
	//SQL문 작성하기
	StringBuilder sql = new StringBuilder();
	sql.append(" SELECT SNO,UNAME,KOR,ENG,MAT,AVG,ADDR,WDATE "); 
	sql.append(" FROM SUNGJUK ");
	sql.append(where); // ? 명령어에 집착했는데 이렇게 해줘도 됨...
	sql.append(" ORDER BY SNO ");
									
	pstmt = con.prepareStatement(sql.toString());
			
	rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.				
	//cursor는 불러온 값 가장 처음것을 가리킴
	//cursor : 가리키는 값
	if(rs.next()){ //cursor가 존재하는지?
		System.out.println("자료있음");
		do{ //칼럼명으로 접근한다.
			System.out.print(rs.getString("SNO")+" ");
			System.out.print(rs.getString("UNAME")+" ");
			System.out.print(rs.getInt("KOR")+" ");
			System.out.print(rs.getInt("ENG")+" ");
			System.out.print(rs.getInt("MAT")+" ");
			System.out.print(rs.getInt("AVG")+" ");
			System.out.print(rs.getString("ADDR")+" ");
			System.out.print(rs.getDate("WDATE")+" ");
			System.out.println();
		} while(rs.next());
					
	} else{
		System.out.println("자료없음");
	}
			
	} catch(Exception e){
	System.out.println("실패!" + e);				
	} finally{
	//자원반납(순서주의!!!!) 자원반납할시 역순으로 가장 최근에 실행했던 것부터 반납.
		try{
			if(rs!=null){rs.close();}
		} catch (Exception e){}		
				
		try{
			if(pstmt!=null){pstmt.close();}
		} catch (Exception e){}
				
		try{
			if(con!=null){con.close();}
		} catch (Exception e){}
	}//finally end

	}//MAIN END
}//CLASS END

 

(col, keyword)변수가 있는 쿼리문을

(where)변수에 담아서 쿼리문으로 사용한 사례이다.

? 명령어가 먹히지 않을 때가 있기 때문에 그럴 때 해결방안으로 사용한다.

 

연습문제 5) 수원에 살며, 이름에 '정'문자가 있는 행들의 국영수 평균을 반올림해서

소수점 둘때자리까지 국영수 평균값을 순서대로 출력하시오.

여태까지 했던 모든 문제를 종합한 문제이다.

package jdbc0625;

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

public class Test05_Test {

	public static void main(String[] args) {
	//sungjuk 테이블 전체 행 갯수를 출력하시오.
	String url ="jdbc:oracle:thin:@localhost:1521:xe";
	String user ="java0514";
	String password ="1234";
	String driver ="oracle.jdbc.driver.OracleDriver";
		
	Connection con = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null; //
		
	try{				
		Class.forName(driver);				
		con = DriverManager.getConnection(url, user, password); 
		System.out.println("오라클DB 서버 연결 성공!!");
				
	//문4) 수원에 살며, 이름에 '정'문자가 있는 행들의 국영수 평균을 반올림해서
	//소수점 둘때자리까지 이름순으로 정렬하여 주소, 이름, 국영수 평균값을 순서대로 출력하시오.
				
	String addr = "Suwon";
	String col = "UNAME";
	String keyword = "정";
				
	//StringBuilder 사용하기
	StringBuilder where = new StringBuilder();
	where.append(" WHERE " + col);
	where.append(" LIKE '%" + keyword + "%'");
	where.append(" AND ADDR = " +"'"+ addr+"'");
	System.out.println(where);
								
	//SQL문 작성하기
	StringBuilder sql = new StringBuilder();
	sql.append(" SELECT ROUND(AVG(KOR),2) AS AVG_KOR, ROUND(AVG(ENG),2) AS AVG_ENG, ROUND(AVG(MAT),2) AS AVG_MAT "); 
	sql.append(" FROM SUNGJUK ");
	sql.append(where); // ? 명령어에 집착했는데 이렇게 해줘도 됨...
								
	pstmt = con.prepareStatement(sql.toString());	
	rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.				
		//cursor는 불러온 값 가장 처음것을 가리킴
		//cursor : 가리키는 값
	if(rs.next()){ //cursor가 존재하는지?
		System.out.println("자료있음");
		do{ //칼럼명으로 접근한다.
			System.out.print(rs.getDouble("AVG_KOR")+" ");
			System.out.print(rs.getDouble("AVG_ENG")+" ");
			System.out.print(rs.getDouble("AVG_MAT")+" ");
			System.out.println();
		} while(rs.next());
			
	} else{
		System.out.println("자료없음");
	}
		
	} catch(Exception e){
		System.out.println("실패!" + e);				
	} finally{
		//자원반납(순서주의!!!!) 자원반납할시 역순으로 가장 최근에 실행했던 것부터 반납.
		try{
			if(rs!=null){rs.close();}
		} catch (Exception e){}		
		
		try{
			if(pstmt!=null){pstmt.close();}
		} catch (Exception e){}
				
		try{
			if(con!=null){con.close();}
		} catch (Exception e){}
	}//finally end

	}//MAIN END
}//CLASS END

 

 

 

 

댓글