배움 __IL/TIL 1기

TIL : 41번째- 230131 [1-5-화]

Mo_bi!e 2023. 1. 31. 18:46

I. 데이터베이스

1. DCL (is du)

실제로 훨씬 많이쓰는 것이다.

DDL은 UI로 가능하다 심지어 설계하면 설계 툴이 만들어준다.

우리는 암기보다는 개념이 필요할 뿐이다.

 

 

(1) 데이터 삽입하기 - INSERT

1) 기본

 

주의 : 순서대로 넣어야한다.! -> 순서를 보면서 처야해서 부담스럽다.

 

INSERT INTO MEMBER
VALUES(9999, '모나미' , '1234',   '재영809@네이버.컴', '모재영');

SELECT * FROM MEMBER;

ROLLBACK;

COMMIT;

SELECT * FROM MEMBER;

해서 조회를 해도 안된다.

그런데 한번에 들어가는게 아니라 임시 공간에 들어가는 것이다.

ROLLBACK;  하면 되돌릴수 있다.

확정은 COMMIT; 를 하면된다

 

임시로 둔것을 어떻게든 처리해야한다.

 

 

2)

그러나 필드 값 필수만 입력할수 있게끔 할수도 있다.

INSERT INTO MEMBER (ID, NAME, PWD)
VALUES(8888, '모재모재', '12341234');

SELECT * FROM MEMBER;

이렇게 하면된다

그런데 나머지 빈곳은 null 값이 들어있다. 비어있는게 아니다.

 

(2) UPDATE 

UPDATE MEMBER SET NAME='newnew';

이거 하면 모든게 다 적용된다

 

UPDATE MEMBER SET NAME='newnew' WHERE ID=1;

WHERE 절을 꼭 쓰자.

ID를 설정해서 가능하다. 다만 이경우 다른곳에서 커밋안하고 건드리기만 했으면 대기 해야한다.

 

 

UPDATE MEMBER SET NAME='나는경기도안양이준영이다.2222', EMAIL='angyang@naver.com'  WHERE ID=9999;

그렇다면 두개이상 컬럼 바꾸고 싶을 떄는 이렇게 한다

사이에는 ,분리한다.

 

 

(3)DELETE

WHERE 꼭쓰고

여기도 마찬가지이고 

DELETE MEMBER WHERE ID='8888';

만약 ID가 NULL이면 다른 컬럼을 이용해서 지울 수있다.

 

제약조건을 걸수있다

ID는 안되게끔 할수 있다.파라이머리key에다가 주로한다.

-> 무결성제약조건에 위배된다

명령의 1 행에서 시작하는 중 오류 발생 -
INSERT INTO MEMBER(ID, NAME, PWD)
VALUES (9999, '나는경기도안양이준영이다', '1234')
오류 보고 -
ORA-00001: 무결성 제약 조건(NEWLEC.MEMBER_PK)에 위배됩니다

이런 오류가 발생한다

 

(4) SELECT

1)

원하는 컬럼만 순서대로 조회하기 가능함

 

*은 숨겨진 의미가있다. 모든 것을 의미한다.

테이블의 컬럼 외 다른것까지 달라는 의미이다.

편하지만 내가 한정을 원한다면 MEMEBER.*로 해야한다

SELECT MEMBER.* FROM MEMBER;
SELECT * FROM MEMBER;

위 두개는 서로 다르다.

 

2)

컬럼명을 다른 이름으로 원할 때 AS로 가능하다.

SELECT ID,NAME, PWD AS PASSWORD FROM MEMBER;

PWD만 다른걸로 표현(별칭)이 가능하다.

그런데 AS없이도 즉 아무런 구분자 없이도 별칭설정이 가능하다

그래서 별칭을 할때는 주로 안쓰는것이 좋다

 

여기다가 WHERE 로 원하는 레코드를 뽑아낼수있다.

SELECT ID,NAME, PWD AS PASSWORD FROM MEMBER WHERE ID = 9999;

 

 

 

II. 이클립스에서 DB와 연동하기

1.  들어가며

SQL모르는 사람이 화면으로 그사람이 조회 원하는 것을 클릭으로 보여주기한다.

 

2. JDBC API란?

(1) SQL을 작성할 수있는 사람들을 위한 쿼리실행 도구DB Client 프로그램

이 도구는 SQL할줄 아는 사람들을 위한것이다

 

(2) SQL을 잘석할 수없는 사람들을 위한 쿼리실행도구는 업무용프로그램

이 껍대가 UI를 만드는 것은 우리이다. 지금은 web이란는 환경에서 HTML JS등으로 만든다.

 

이렇게 만든것을 요청할 수있는 API이다

즉 DB API

 

- 우주선이 있다고 해도 내가 조정하기 위해서 API가 있어야한다

프로그래머에게 API가 없는 앱은 내가 사용할수 없는 것이다.

 

(3) DBC (DataBaseConectivity)

오라클 전용 API받으면, 시퀄용 API 받으면... 이라서 오라클전용 등만 가능해서 특정 것만 종속하게 됨

특정 DBMS가 제공하는 API를 쓰는것을 원치안아하고, JAVA도 알고있음

이때 JAVA는 돼지코처럼 다 연결해 줌

 

(4) JDBC 와 JDBC Driver

<여기서 주황색은 JDBC 인터페이스이고, 실제 구현체는 우측의 연두색보라색 드라이버이다>

주황색은 jar를 Import한 것이고, 구현체는 실제 코드로 하는 것이다.

 

DBMS간 기능은 같은데 함수명이 다른 것에 불과하기 때문에 JDBC로 쓴다.

즉 JDBC만 하면 코드가 바뀌지 않는다.

여기서 driver는 구동코드라고 한다

 

즉 JDBC는 인터페이스에 불과(API)하다 실제 기능은 DBMS가 함

이 경우 DMBS가 바뀌어도 손댈것이 없다.

우측은 결국 손댈 것이 없다.

 

JDBC는 이런걸 한다.

1) 드라이버 로드

안하면 껍대기에 불과

 

2) 연결 생성하기

여기서 연결은 인증을 해야한다 id pw로...

 

3) 문장 실행하기

 

4) 결과집합 사용하기

 

4개의 각기다른 클래스가 있음

 

3. JDBC API 실습

https://opentutorials.org/module/3569/21222

(0) jar 파일 들고와야함

각 벤더사에서 들고온다.

 

(1) 객체화를 한다 (Class.forName("oracle.jdbc.driver.OracleDriver")) : JDBC 드라이버 로딩

객체화(메모리를 동적으로 할당)하기 위해서 Class.forName() 메소드를 사용한다

 

자바에 내장된 JDBC드라이버인터페이스가 상속받는 JDBC드라이버를 forName()인자에 패키지이름 넣어준다.

메모리에 올림

 

(2) 연결을 한다 : DBMS 서버 접속

java.sql 패키지의 DriverManager에 있는 getConnection()메소드를 이용한다.

연결 시도와 함께 연결을 활용하게끔 하는 Connection객체를 줌

오라클 서버와 메모리올라온 객체와 연결한다.

 

이경우 성공하면 반환값으로 Connection 객체로 표현해서 반환한다.

 

(3) 문장 실행하기 위한 state문 등 쿼리 실행도구가 있음 : Statement

여기서 Statement객체자바DB사이 연결 시 쿼리문을 전송하고, 그 결과를 반대쪽에서 전송하는 역할을 한다.

 

실행해달라고 함 DBMS에

바로 앞과 마찬가지로 Connection 객체가 반환하는 메소드를 받는다.

 

(4) 실행화면  : SQL문 실행

Statement 로 DB로부터 결과(Select)를 ResultSet객체의 메소드(커서 위치를 옮기는 메소드)이용한다. 이경우 본 객체는 커서 개념이 존재한다

 

편집담아서 실행하기

실행 결과

가로 한줄한줄은 레코드인데

전체는 파일이다

SQL로 명령해서 레코드 하나씩 가져오기위해서 가르키는 포인터인 커서가있다.

커서의 위치를 가르킬때 BOF EOF위치에 있다고 한다

커서 움직여서 하나씩 움직여 주어야한다

 

이렇게 들고온 레코드 저장하기 위한 공간이있다.

(5) next()

본 메소드는 커서위 위치를 다음 row로 옮기는 메소드이다.

 

이걸로 가져온다 (보라색 : 레코드 / 연두 1,2,3 각 컬럼)

또 호출하면 다음 레코드를 하나씩 가져오는 것이다 (보라색 안에, 연두3칸)

가져와서 담은뒤에(6번) 다음거 또 가져온다.

 

(6) title

getter메소드를 가지고있음

이 메소드 인자는 컬럼이름 혹은 인덱스값으로 가능하다

 

 

가져온게 문자이면 문자로 가져온다.

 

4.  -jar와 재사용 (JDBC실습 이전 개념 학습)

이후에 또 쓰고싶을 때(재사용) 할때 결과물을 가지고 한다(소스코드 파일이 X)

새로운 버전을 위한것이라면 과거 꺼를 그대로 쓰되 확장하는거고

수정은 이전것이 치명적인 것일때 바꾼다

결과물을 가지고 배포한다.

 

객체지향 수정은 닫히게, 확장은 열리게 해주어야한다

(1) export

 

(2) import

 

(3) res 에 패키지명 넣어주기 **

하는 이유 Class.forNam 위한거임 이렇게 해서도 new를 안해도 객체만들수 있다. (문제 : 기본생성자없음)

 

(4) 소스코드

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;

import com.newlecture.web.entity.Menu;

public class program {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
		// TODO Auto-generated method stub

//첫번쨰
		Menu menu = new Menu();
		
		menu.setName("아메리카노");
		System.out.println(menu);
        
//두번째
		FileInputStream fis = new FileInputStream("res/setting.txt");
		Scanner scan = new Scanner(fis);
		
		String clsName = scan.nextLine();
		
		
		
		//이렇게 해서도 객체를 만들수 있음 		
		Menu menu1 = (Menu) Class.forName(clsName).newInstance();
		
//		Menu menu1 = (Menu) Class.forName(clsName)
//				.getDeclaredConstructor()
//				.newInstance();
		
		menu1.setName("카페라떼");
		System.out.println(menu1);
		
		scan.close();
		fis.close();
		
				
		
	}
}

첫번째 Menu 의 경우 직접 import한 것을 인스턴스 만들어서 생성이 가능하다

 

두번째 방법에 Menu의 경우 Class객체로 forName이라는 메소드(String방식의 클래스의 정보를 가져오는 메소드)로 특정 클래스의 경로를 불러와서 인스턴스(newInstance)(앞서 받은 정보로 인스턴스를 만들어주는 것)를 만들어 주는 것이다.

- 이경우 불러오는 클래스는 기본생성자가 있어야한다. *

이 방식을 하는 이유는 JDBC는 값으로 받아오는데, java에서는 값으로 인스턴스를 만들수 없기 때문이다.

 

5. 오라클 PDB서버에 접속하기

최근 오라클도 구독방식으로 바뀌고 있다.

(1) 가상DB : PDB
1)

옛날에는 DB가 하나이다. 이후 가상화된거 까지 나온다.

큰 DB가있고, 거기서 자원공유하면서 독립된 조그마한 가상화된 DB가 등장함

 

마치 운영체제가 있는데 운영체제에다가 가상컴퓨터 설치하는 것이다 

운영체제 안에 운영체제 있는거처럼 DB안에 DB가 있는것이다 

이경우 가상 머신 안 윈도우는 Pluggable 하다 다른 가상머신에 옮길 수있다

바깥의 호스트 자원을 같이 쓴다

 

이런거처럼 Pluggable DB라고 한다

이전 접속은 CDB(컨테이너 데이터베이스 : 오라클에 있음)라고 한다. 과거로 치면 이게 진짜 DB이다

그 안에 설치된 플러거블한 DB에도 접속이 가능하다 

 

쿼리문으로 할수있다 Seed라는 플러거블한 DB(PDB)를 만들수 있는 탬플릿이다

즉 Seed라는 씨앗이 있는데 이 씨앗을 복사해서 만들고 한다 

 

2)

SEED 는 원본이고, 실제로 존재하는 것은 XEPDB1이고 가상 DB에 접속할수있다.

가상은 망가뜨려도 큰 부담은 없다.

 

3)

SID(Seed) 는 XE로하지만

PDB는 서비스 이름으로 접속한다 이게 가상DB를 접속하는것이다

 

이전 CDB와 달리 결국 분리된 별도의 DB이다 결국 별도로 접속하는 방식으로 한다.

 

 

6.  이클립스로  JDBC로 불러오기 실습

package com.newlecture.web.jdbc;

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

public class JDBCProgram {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		String url = "jdbc:oracle:thin:@oracle.newlecture.com:1521/xepdb1";
		Connection con = DriverManager.getConnection(url, "NEWLEC","rland");
		
		System.out.println(con.isClosed());
		//false 는  open 상태를 의미한다.
		
		Statement st = con.createStatement();
		//레코드 담아옴 
		ResultSet rs = st.executeQuery("select * from member");
		
		
		{
		//담아 옴 
			rs.next();
			String nickName = rs.getString("nicname");
			System.out.println(nickName);
		
		}
		
//		DriverManager
//		Connection
//		Statement
//		Resultest
		
		
		
	}

}

1)

Class.forName 에서 참조변수가 없는 이유는 오라클드라이버는 스태틱생성자로서 전역객체를 내부에 가지고 있기 때문이다.

(한편 이렇게 하는 경우는 일반적으로 인스턴스만드는 방식과 달리 메모리에 올라가는 방식도 다르다)

 

2)

Connection 으로 url, id, pw를 입력해서 접속한다

이경우 url은 가상 db인 xepdb1으로한다

 

3)

Statement 로 쿼리문을 받아와준다.

이것은 쿼리문을 실행해주는 역할을 한다. 그러나 쿼리문의 내용을 이해하지는 못해서 전달해주는것에 불과하다


4)

ResultSet 으로 전달한 쿼리의 결과로서 파일을 들고온다

 

5) 

rs.next()로 bof에서부터 차례대로 커서의 위치를 움직여서 레코드를 String nickName에 넣어준다.

(MT. rs.next()를 반복문으로 하면은 계속해서 실행이 가능하다)

 

 


1. 보충

 

(1) static 생성자

 

(2) 자바 리플랙션 (forname)

 

 

2. 회고 

1) 녹록치 않은 jdbc 때문에 어려움이 있다.

그래도 스터디 덕분에 궁금증이 쉽게 해결될수 있어서 다행이다

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 43번째- 230202 [1-5-목]  (0) 2023.02.03
TIL : 42번째- 230201 [1-5-수]  (0) 2023.02.01
TIL : 40번째- 230130 [1-5-월]  (0) 2023.01.30
TIL : 39번째- 230127 [1-4-금]  (0) 2023.01.28
TIL : 38번째- 230126 [1-4-목]  (0) 2023.01.26