이번에는 JDBC를 통해서 DBMS와 JAVA를 연동해보겠다.

 

내부 동작 구조와 JDBC

 

JDBC는 java사에서 DB와 연동 할 수 있게 만든 것으로 위와 같은 내부구조를 가진다. 하지만 JDBC는 바로 사용할 수 없고 interface만 구성되어 있고 동작은 overriding해서 사용해야 한다. 그 이유는 모든 DBMS가 같은 구조로 동작되지 않기 때문이다. 따라서 해당 DBMS에 맞게 재정의 해서 사용해야 한다.

내부 구조를 살펴보면 애플리케이션 즉, eclipse 와 같은 java ide에서 sql문이 String 형태로 날아갈 것이다. 그럼 이를 DBMS에서 사용할 수 있게 번역의 기능을 하는것이 JDBC이다. 이정도 구조만 알아도 이해하기엔 무리 없을 것이다.

 

기본적으로 프로젝트나 여러가지 상황에서 주로 동적 쿼리를 사용하는 경우가 많아 동적 쿼리를 기준으로 작성하였다.

정적 쿼리를 작성하고 싶은 경우 PreparedStatement 대신 일반 Statement를 사용하고 StringBuffer에 올바른 쿼리문을 작성하면 된다.

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

public class UserDB {
	public static void main(String[] args) {
		StringBuffer sql = new StringBuffer();
		sql.append("insert into CGVUSER ");
		sql.append("values(?,?,?,?,sysdate)");
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/XEPDB1","test","test");
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, "id");
			pstmt.setString(2, "password");
			pstmt.setString(3, "저팔계");
			pstmt.setString(4, "남자");
			
			int result = pstmt.executeUpdate();
			System.out.println(result+"개의 행이 추가되었습니다.");
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {if(pstmt!=null) pstmt.close();} catch(SQLException e) {}
			try {if(con!=null) con.close();} catch(SQLException e) {}
		}
	}
}

위와 같이 INSERT 구문이 잘 동작하는것을 볼 수 있다.

'DB(DataBase) > Oracle' 카테고리의 다른 글

[DB] Oracle(오라클)의 기본적인 쿼리(CRUD)  (0) 2020.05.12
[DB] Oracle의 초기설정  (0) 2020.05.12

오라클을 설치하고 기본설정 하는 것은 이전 포스팅에서 완료 했다.

그리고 이번에는 DB가 무엇인지 오라클은 무엇인지 간단하게 설명하고 이러한 DB를 사용하는 기본적인 쿼리문을 살펴보려고 한다.

  • 쿼리문은 SQL에서 사용하는 코드라고 생각하면 편하다.

DB란?

DB란 Data Base의 약자로 특정 관심의 데이터를 수집하고 그 데이터의 성격에 맞게 잘 설계하여 이를 저장하고 관리함으로서 효율적으로 그 데이터를 사용할 수 있는 자원이다. 즉, 쉽게 말하면 데이터는 실제 존재하는 값들이다. 이러한 값들의 특징에 맞게 틀을 만들고 그 틀에 맞게 데이터를 저장하는 저장공간이라고 생각하면 편하다.

DBMS란?

DBMS란 Data Base Management System의 약자로 말 그대로 DB를 효율적으로 관리해 주는 일종의 프로그램이다. 그리고 DB를 효율적으로 관리하려면 데이터 추가(생성),불러오기,수정,삭제의 기능을 가지고 있어야 하는데 이를 CRUD(Create, Read, Update, Delete)라고 한다.

그리고 이러한 DBMS에는 여러가지 종류가 있는데 그중 가장 비중을 많이 차지하는 RDBMS에 대해 주로 알아볼 것이다.

RDBMS란?

관계형 데이터베이스로 데이터 베이스가 어떠한 관계가 맺어져 있다고 생각하면 편할것이다. 자세한 내용은 이후 포스팅 할예정이다.

RDBMS의 구조와 CRUD의 기본 문법

RDBMS는 기본적으로 테이블의 구조를 하고있다. 테이블구조는 쉽게 말하면 표 모양이다. 이는 아래 쿼리문을 학습하면서 알아보자

1. Create

  • Create는 말 그대로 생성하는 것이다. 생성을 할 때에는 아무렇게나 생성해서는 안된다. 여기서 DB의 정의를 다시 보면 DB는 “특정 관심의 데이터를 수집하고 그 데이터의 성격에 맞게 잘 설계하여 이를 저장하고 효율적으로 사용할 수 있는 자원”이다. 그렇다면 내가 저장하려고 하는 데이터의 특징을 먼저 파악해야한다.
  • 예를 들어 회원가입시에 필요한 User 테이블을 만들어보자.

전 포스팅까지 잘 따라했다면 이렇게 만들어져 있을 것이다.

그리고 데이터 베이스를 새로 만드는데 사용자 이름과 비밀번호는 저번에 생성한 그 본인 계정을 작성하면 된다.

기본적으로 Create 문은 Create [만드려고 하는 대상] [테이블명]( 데이터의 형태)로 구성이 된다.

데이터는 [데이터 속성] [데이터의 자료형] [데이터의 제약조건]으로 구성이 된다. 데이터의 속성은 데이터라면 마땅이 가져야할 특징,속성이다.

이번 유저 테이블을 예로 들자면 여러분들이 어떠한 사이트이든지 회원 가입을 하려면 필수적으로 작성해야하는 아이디나 패스워드 이름 등이 속성이 될 것입니다. 즉 유저를 정의하는 속성들인 셈이죠.

2. INSERT INTO

  • insert into 구문은 이렇게 만든 테이블에 데이터를 집어넣는 쿼리문 입니다.
  • INSERT INTO [table명] VALUES(‘속성1’,….);의 형태로 작성하게 되는데 이렇게 작성하려면 생성시에 작성한 데이터의 속성 순서대로 넣어야 한다. 그러려면 table안이 어떻게 구성되어있는지 알아야 하는 조건도 있어야 할 뿐만 아니라 원하는 데이터만 넣을 수 없는 단점이 있다.

  • 그래서 대부분 아래와 같이 모든 속성의 이름을 적고 작성하게된다.

INSERT INTO cgvuser(id,password,name,gender,birth)
VALUES(‘test2’,’test2',’사오정’,’여자’,’2020–05–11');

#참고 — SQL문은 대소문자를 구분하지 않는다. 하지만 구분하지 않으면 어디까지 명령어이고 어디부터 변수인지 한눈에 구분하기 어렵다. 따라서 기본적인 명령어는 대문자로 작성하는것이 좋다.

이제 데이터를 DB에 넣었으니 잘 들어갔는지 확인 해 보자.

3.SELECT

  • select문은 데이터를 검색할 때 사용하게 되는데 기본 구문은

SELECT [보고싶은 데이터 속성 명][][]… from [테이블 명];이다.

이 외에 SELECT는 여러가지 옵션이 있는데 이는 나중에 더 포스팅 해보도록 하겠다.

이와같이 쿼리문을 날리면 아까 insert into 구문으로 저장해둔 두 개의 데이터를 볼 수 있다.

여기서 RDBMS의 구조를 볼 수 있는데 저러한 데이터의 모양이 마치 표처럼 구성되어있고 행과 열이 있는 구조로 되어있다. 따라서 데이터의 속성 명을 column(열)이라 하고 데이터를 row(행)라고 한다.

4. DELETE

  • DELETE 구문은 데이터를 삭제하는 것이다. 기본 구문은
  • DELETE (from) [테이블 명];이고 이렇게 작성하면 테이블에 해당하는 모든 데이터가 삭제된다.
  • from 은 생략해도 된다.

이처럼 두개의 쿼리를 날리면 cgvuser에 해당하는 테이블에 있는 두 개의 데이터가 삭제된것을 알 수 있다.

이렇게 4가지의 쿼리가 기본적인 쿼리문으로 CRUD에 해당하는 구문이다.

앞에 말한 SELECT에 해당하는 쿼리는 추가적으로 공부해야할 부분이 많을 것이다. 워낙 활용도가 높은 구문이기 때문에 어떻게 사용하는지에 따라 굉장히 많은 것들을 사용할 수 있다. 이도 나중에 정리해서 포스팅 할 예정이다.

'DB(DataBase) > Oracle' 카테고리의 다른 글

[DB]JDBC를 통한 Oracle과 JAVA연동  (0) 2020.05.13
[DB] Oracle의 초기설정  (0) 2020.05.12

[DB] Oracle의 초기설정

Oracle은 DBMS의 한 종류인 대표적인 RDBMS이다.

오라클을 사용하려면 초기설정을 해야하는데 우선 해당 포스트는

18c버전을 기준으로 작성되었다.

설치는 어렵지 않게 oracle사에서 다운받을 수 있다.

그 뒤에 설정이 중요한데 설치가 완료되었으면 윈도우에서 cmd창을 띄운다.

그리고 cmd창에 sqlplus를 대뜸 적으면 위와 같이 사용자명을 입력하라는 것을 볼 수 있다. 그럼 설치하면서 작성한 루트계정에대한 아이디와 비밀번호를 입력하면 된다.

그러면 이와 같이 접속할 수 있다.

그 다음에

alter session set container=XEPDB1;

이라는 명령어를 치면 되는데 오라클은 MySQL과 다르게 컨테이너라는 것이 있는데 기본적으로 설정되어있는 컨테이너에서는 아무것도 할 수 없기 때문에 XEPDB1 컨데이너로 이동한다.

그리고 오라클에서 기본적으로 제공하는 유저가 있는데 바로 hr이다. 그러므로 hr 유저에대한 사용권한과 비밀번호를 설정해야 한다. 물론 본인 고유의 아이디와 비밀번호를 만들 수 있다.

이런식으로 하면 접속할 수 있다.

명령어 대부분을 차지하는 alter를 사용하게 되면 주로 대답이 ~~이 변경되었습니다. 로 나오게 되는것으로 보아 alter는 어떠한 설정을 변경하는데 사용하는 명령어라는 것을 유추 할 수 있다. 실제로도 맞다.

alter user hr identified by hr;

이 명령어는 alter user [ID] identified by [password]; 의 문법을 기준으로 사용한다.

여기서 또 유추해 볼 수 있는점은 alter가 수정이었다면 수정에 해당하는 alter를 생성으로 바꿔 

create user [id] identified by [password];

이렇게 사용해 볼 수 있지 않을까? 해보자

역시나 생성이 된다. 앞으로는 기본 유저 말고 이 유저를 사용해볼 예정이다.

그럼 이제 사용하면 되느냐?? 아니다. 이제 막 들어온 신입한테 무슨 권한이 있겠는가?? 권한을 부여해보자

기본적으로 사용하기 위한 초기 셋팅이라고 할 수 있다.

오라클은 tablespace라는 개념이 있는데 그 테이블 스페이스에 여러개의 테이블이 그냥 올라가게 된다. 그 테이블 스페이스의 용량을 차지할 수 있게하는(?) 권한을 준 것이라고 생각하면 되겠다.

이러한 일련의 과정들은 사실 sqldeveloper에서 해도 된다. 그리고 그곳이 아마 UI가 보기 좋아 편할것이다.

 

 

다음 포스팅은 이렇게 설치한 오라클을 가지고 기본적인 테이블 생성과 CRUD구문을 작성해볼 예정이다.

'DB(DataBase) > Oracle' 카테고리의 다른 글

[DB]JDBC를 통한 Oracle과 JAVA연동  (0) 2020.05.13
[DB] Oracle(오라클)의 기본적인 쿼리(CRUD)  (0) 2020.05.12

트리거(Trigger)란 테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때에 자동으로 가동되는 개체이다.

트리거는 대체로 테이블에 부착되어 사용하게 되는 형태로 트리거가 부착된 해당 테이블에서 작업이 발생될 때, 자동으로 트리거가 실행되게 된다.

트리거를 가장 많이 사용하는 사례로는 테이블의 내용 복구인데 누군가가 테이블의 행을 실수로 삭제했다면, 내용을 복구하고 누가 지웠는지 추적하기 쉽지 않다 하지만 이러한 경우에 트리거를 사용해서 행이 삭제된 시간, 행의 내용, 삭제한 사용자의 정보가 기록되어있다면 이러한 문제를 쉽게 해결할 수 있다.

트리거의 종류

  1. AFTER 트리거 : 작업이 일어났을때 작업 후에 작동하는 트리거
  2. BEFORE 트리거: 작업이 일어났을때 작업 전에 작동하는 트리거

트리거의 기본 문법과 사용

trigger_order의 사용은 사용하려는 테이블에 해당 트리거 외에 다른 트리거가 존재할 경우 다른 트리거보다 PRECEDES(선행) 혹은 FOLLOWS(후행) 할지를 지정한다.

 

 

이 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.

오류 코드

Could not connect, server may not be running. Can’t connect to MySQL server on ‘localhost’ (10061)

해결 방법

  1. Ctrl + Alt + Delete 를 누른다.
  2. 작업 관리자 실행

3. 서비스 클릭

4. MySQL 아래와 같이 중지되어 있다면 마우스 오른쪽 키로 시작

5. 해결

'DB(DataBase) > MySQL' 카테고리의 다른 글

[DB] SQL Trigger  (0) 2020.01.27

가용성에 대한 추가적으로 고가용성을 위한 Master-Slave Architecture에 대한 내용이다.

Master-Slave Architecture는 기본적으로 위와 같은 구조로

  1. Master는 Read/Write가 가능하고 Slave는 Read만 가능하다.
  2. 하나의 Master에 여러개의 Slave가 붙을 수 있다.
  3. Master는 변경 사항을 기록하고 그 결과는 Slave에 전달한다.

대표적으로 3가지의 규칙에 맞추어 작동하는데 이러한 Master-Slave구조가 고가용성을 위한 구조가 되는 이유는 바로 Sentinel의 역할 때문이다. 대표적인 Sentinel의 역할이 3가지 있다.

  1. 모니터링 : Sentinel은 Master와 Slave가 제대로 동작하는지 지속적으로 감시한다.
  2. 자동 장애조치 : 운영중에 Master가 다운됐을 경우, Slave만 작동하게 되어 Read 동작만 수행할 수 있다. 따라서 Downtime이 증가하게 되고 가용성은 떨어지게 된다. 이때, Master가 복구되지 않은 경우 관리자의 간섭 없이 Slave를 Master로 승격 시켜주고 기존의 Master는 Slave로 강등되어 복구 후에 새로운 Master에 대한 Slave의 기능을 수행하게 된다.
  3. 알림 : Sentinel은 감시하고있는 인스턴스들이 failover됐을때 client에게 알리거나 관리자에게 이메일 또는 SMS로 알릴 수 있다.
  • 참고
  • 다운 판단의 기준은 default 3000ms로 30초이며 파라미터 수정할 수 있다.
  • Sentinel의 구성 방식 : Slave의 수보다 많은 홀수의 갯수로 구성된다.
  • Quorum 값을 만족하는 Slave가 Master로 승격할 수 있다.

 

이 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.

 

 

 

가용성은 서버와 네트워크, 프로그램 등의 정보 시스템이 정상적으로 사용 가능한 정도를 말한다.

 

가용성을 구하는 식

Uptime : 정상 사용 시간

Downtime : 정상 사용 불가 시간

Uptime + Downtime : 전체 사용 시간

 

전체 사용 시간 중에 정상 사용시간이 얼마만큼인가를 나타내주는 척도로 이 값이 높은 것을 고가용성이라고 한다.

IT관점에서의 가용성은 요구 기능을 서비스 중단 없이 성능을 유지하며 요구 시간동안 성능을 유지하는 정도이다.

 

 

이 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.

+ Recent posts