package dev_java.week5.ex;
import java.net.InetAddress;
import java.net.Socket;
public class ChatClient {
public void client() {
int port = 3000;
String serverIP = "127.0.0.1";
// java.net, java.io -> 인터넷 회선 장애 문제발생 위험을 지님
// io 생성시에 소켓을 통해 인스턴스화를 하니까 의존관계에 있다
// 이런 패키지는 반드시 예외처리 할 것(Thread도 마찬가지 -> 인터셉트를 당할 수 있다)
// Object마다 lock flag값이 있어서 스레드가 점유하면 잠금처리 -> 다른 스레드는 사용불가
// 데드락상태에 빠질 수 있다(안에서 잠금으로 다른 스레드가 사용불가한 상태
// 한정된 자원을 여러 사람이 이용하기 위해 제공되는 클래스가 Thread
// Thread.sleep(), join, yield, intercept ...
try {
System.out.println(InetAddress.getLocalHost().getHostAddress());
Socket socket = new Socket(serverIP, port);
} catch (Exception e) {
// 에러메세지에 대한 history를 기억하고 라인번호와 함께 이력을 출력해줌
// 디버깅 때 꼭 필요
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatClient cc = new ChatClient();
cc.client();
}
}
package dev_java.week5.ex;
import java.net.ServerSocket;
import java.net.Socket;
// 단일상속만 되니까 인터페이스(다중상속 가능) 지원함
// 인터페이스를 통한 스레드 구현방법
public class ChatServer implements Runnable {
// 메인스레드이다
public static void main(String[] args) {
System.out.println("main 시작");
ChatServer cs = new ChatServer();
Thread th = new Thread(cs);
th.start();
System.out.println("main 끝");
}
@Override
public void run() {
System.out.println("run 호출 성공");
int port = 3000;
ServerSocket server = null;
try {
server = new ServerSocket(port);
// 대기상태 ...
System.out.println("서버 소켓 생성 완료 - 클라이언트 소켓 접속 대기중...");
while (true) {
// 아래코드가 진행되는 시점
// ChatClient에서 new Socket("서버IP", 3000); 하면 대기상태 풀림
Socket client = server.accept();
System.out.println("클라이언트측: " + client.getInetAddress()); // 접속한 클라이언트 정보 출력
// 금융권에서 주로 사용(oos, ois) -> 보안강화 / 직렬화기법 / 마샬링, 언마샬링구간
// 말하기 - ObjectOutputStream -> writeObject(); 네트워크 전송 일어남 - 패킷
// 듣기 - ObjectInputStream -> readObject();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package dev_java.week5.ex;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
public class FileTest {
public void output() {
String path = "D:\\vscode_java\\dev_java\\app\\src\\main\\java\\dev_java\\week5\\ex\\";
FileWriter fw = null;
try {
fw = new FileWriter(path + "test1.txt", true);
fw.write(97);
fw.write(65);
} catch (FileNotFoundException fe) {
System.out.println("파일이 존재하지 않습니다.");
} catch (IOException ie) {
ie.printStackTrace();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
// 예외가 발생하든 그렇지 않든 무조건 처리할 코드는 finally에 작성
try {
if (fw != null) // 실행문이 하나라서 {} 생략
// IO패키지는 스트림형태로 이동하니까 열려있을 경우 인터셉트나 위변조가 가능하므로
// 반드시 사용 후에는 닫도록 하고있다.
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
FileTest ft = new FileTest();
ft.output();
}
}
DDL(데이터 정의어, 구조를 정의하는 언어)
CREATE TABLE
CREATE PROCEDURE
CREATE FUNTION
ALTER 수정
DROP 삭제
RENAME 이름변경
TRUNCATE 초기화
DML(데이터 조작어)
SELECT 검색, 조회 →커밋과 롤백의 대상이 아니다(물리저인 테이블에 변화를 주지 않는다)
아래 조작어는 실제 테이블에 변화를 주는 문장 → 커밋과 롤백의 대상
주의할 점: 커밋한 상태에서는 롤백이 불가하다
INSERT 가입, 주문등록 / 삽입이상발생 주의
UPDATE 변경 / 수정이상 발생 주의
DELETE 삭제, 탈퇴, 취소(삭제하고 INSERT하거나 UPDATE일수도)
DCL(데이터 제어어)
GRANT 권한부여
REVOKE 박탈, 회수
COMMIT 실제 물리적인 테이블에 반영
ROLLBACK 커밋시점 이후에 이전상태로 돌림
오라클은 데이터를 관리하는 구조체로 테이블을 지원한다
테이블의 구성요소는 로우(html의 <tr> 가로방향)와 컬럼(html의 <td> 세로방향)으로 구성
선분과 선분이 만나 면이 되니까 데이터를 담을 수 있다(나타낼 수 있다, 출력할 수 있다)
테이블을 만들어주는 언어를 DDL문이라 한다.(개발자는 DML을 주로 사용)
테이블에는 기본키가 있다
Primary key의 제약조건
1. NOT NULL - 널을 허용하지 않는다
널이란? 모르는, 확정되지 않은 값
2. 유일무이하다(유니크하다)
식별자의 역할을 해야한다
3. 오라클이 인덱스를 만들어 제공한다
유니크한 인덱스, 똑똑한 조건 → 중복되지 않으니까, 검색속도가 빠르다
다른 컬럼도 인덱스를 만들 수 있다(이때는 중복이 허용된다-왜냐하면 PK가 아니니까)
--SELECT 컬럼명1, 컬럼명2, 함수명(컬럼명)
--FROM 집합이름1, 집합이름2
--WHERE 컬럼명 비교연산자
SELECT * FROM emp
SELECT ename, comm FROM emp
--우리회사에 근무하는 사원들 중에서 인센티브를 받는 사원들의
--사원명과 인센티브 금액을 출력하시오.
--조건절을 사용하면 경우의 수가 줄어들어 검색 속도는 빨라진다.
SELECT ename as "사원명", comm as"인센티브"
FROM emp
WHERE comm>0
--SELECT와 FROM절 사이에는 컬럼명이 온다 - 여러개도 가능하다
--단, 콤마(열겨형 연산자)를 붙여서 작성해야한다
--FROM절 뒤에는 집합이 온다 - 집합적 사고 중요(합집합, 교집합, 차집합, 여집합)
--FROM 뒤에는 테이블명, SELECT문(인라인뷰-경우의 수 줄여줌)이 올 수 있다
--전체범위처리
SELECT count(empno), max(sal), min(sal), avg(sal) FROM emp
--합집합을 하면 row가 늘어난다
SELECT 1 FROM dual
UNION ALL
SELECT 2 FROM dual
--같지 않음을 표현하는 연산자
SELECT empno
FROM emp
WHERE 1 != 0
SELECT empno
FROM emp
WHERE 1 <> 0
--우리 회사에 근무하는 사원들 중에서 인센티브를 받지 않는 사원들의
--사원명과 인센티브 금액을 출력하시오.
SELECT empno as"사원번호", ename as "사원명", comm as"인센티브"
FROM emp
WHERE comm=0
--인센티브를 받는지 안 받는지 모르는 사원
--널을 비교할 때는 반드시 IS NULL 또는 IS NOT NULL로 비교해야 한다
SELECT empno as"사원번호", ename as "사원명" ,comm as "인센티브"
FROM emp
WHERE comm IS NULL
----인센티브를 받는 사원
SELECT empno as"사원번호", ename as "사원명" ,comm as "인센티브"
FROM emp
WHERE comm IS NOT NULL
AND comm>0
--집합적 사고로 인센티브를 받지 않는사람 처리
SELECT empno as"사원번호", ename as "사원명" ,comm as "인센티브"
FROM emp
WHERE comm IS NOT NULL
MINUS
SELECT empno as"사원번호", ename as "사원명" ,comm as "인센티브"
FROM emp
WHERE comm>0
--근무하는 사람 전혀 없는 부서 번호를 출력하시오(차집합)
SELECT deptno as "부서번호" FROM dept --4건
SELECT deptno as "부서번호" FROM emp --14건(중복 존재)
SELECT distinct(deptno) FROM emp --3건(중복제거 함수, 컬럼명 사용가능)
SELECT deptno as "부서번호" FROM dept
MINUS
SELECT deptno as "부서번호" FROM emp
--NVL은 해당 컬럼의 널을 체크하고 널이면 0으로 치환한다
--이름 뒤에 괄호()가 있으면 함수
SELECT ename, comm, NVL(comm, 0)
FROM emp
--정렬 - pk(empno)는 정렬되어있다 -> pk는 인덱스가 있기에
SELECT empno FROM emp
SELECT ename FROM emp
--오름차 정렬
SELECT ename FROM emp
ORDER BY ename asc
--내림차 정렬
SELECT ename FROM emp
ORDER BY ename desc
--점조건
--=
--IN
SELECT ename, sal, deptno
FROM emp
WHERE deptno IN(10, 20)
--선분조건
--LIKE문
--''는 문자를 담는다
--이름 두 번째에 A가 든 사람
SELECT empno, ename
FROM emp
WHERE ename LIKE '_A%'
--이름 세 번째에 A가 든 사람
SELECT empno, ename
FROM emp
WHERE ename LIKE '__A%'
--이름에 A가 없는 사람
SELECT empno, ename
FROM emp
WHERE ename NOT LIKE '%A%'
--dual은 오라클에서 제공하는 로우, 컬럼이 1개씩인 가상 테이블
SELECT sysdate
FROM dual
--오늘, 내일, 어제 날짜정보
SELECT sysdate, sysdate+1, sysdate-1
FROM dual
--날짜, 시간, 요일 형식
SELECT to_char(sysdate, 'YYYY-MM-DD')
,to_char(sysdate, 'YYYY-MM-DD HH:MI:SS')
,to_char(sysdate, 'YYYY-MM-DD HH:MI:SS AM')
,to_char(sysdate, 'day')
FROM dual
--개월수 비교
SELECT MONTHS_BETWEEN(sysdate, TO_DATE('2022-11-28','YYYY-MM-DD'))
FROM dual
SELECT empno, enamed
, MONTHS_BETWEEN(sysdate, hiredate)
, TRUNC(MONTHS_BETWEEN(sysdate, hiredate),1)
, TRUNC(MONTHS_BETWEEN(sysdate, hiredate),-1)
FROM emp
WHERE empno = 7521
SELECT * FROM emp
RDBMS(관계형 데이터베이스)
관계형 데이터베이스는 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템
정보를 저장하기 위해 테이블을 이용하며, 행(row)과 열(column)로 구성됨
처음 데이터베이스를 만든 후 관련되는 응용 프로그램들을 변경하지 않고 새로운 데이터 항목을 추가할 수 있음
사용자의 요구에따라 정보를 생성해 관계형 데이터베이스를 생성, 수정, 관리할 수 있는 소프트웨어
관계형태
1:1
일대일 매칭되는 관계
1:n
하나의 row가 여러개의 row와 연결되는 관계
n:n
여러 row가 여러개의 row와 연결되는 관계
카타시안의 곱(데이터복제에 도움, join시 쓰레기값→복제용으로만 사용)
PK(Primary Key, 기본키)
해당 테이블의 고유한 id로 식별자로 이용
각 row는 각자의 PK를 지니고 PK를 통해 해당 row를 찾거나 인용/참조하게됨
FK(Foriegn Key, 외래키)
한 테이블의 필드 중 다른 테이블의 행을 식별할 수 있는 키
관계형 데이터베이스 제품 특징
1. 테이블의 수가 많다 → PL/SQL표준을 따름
(제1정규화, 제2정규화, 제3정규화)
2. 그렇다보니(테이블을 여러개로 분할하다보니) 조인문이 거의 필수이고 복잡도가 증가한다(인라인뷰, 서브쿼리-총계, 효율적인 조건검색)
Natural, Self, Outer, 카타시안곱
3. 인덱스 전략을 잘 세워야한다
3초안에 조회가 끝나야한다
4. 반정규화하는 경우도 있다-유지보수나 관리적 측면에서 굳이 반정규화를 단행 → 명분과 이유를 밝혀야함
5. 옵티마이저 옵션 요구 구매 가능
병렬처리
릴레이션(테이블, 표)
row+column
튜플
릴레이션을 구성하는 각각의 행(row)
sys(system) 계정의 비밀번호를 잃어버렸을때
sqlplus “/as sysdba” →관리자 계정으로 들어감
show user →유저보기
alter user 유저이름 identified by 비밀번호; → 비밀번호 변경
alter user 유저이름 account lock / unlock; →유저 락/언락
select username, account_status, to_char(LOCK_DATE, 'YYYY-MM-DD HH:MI:SS') lock_date from dba_users;
Toad이용, sys에서 kiwi 생성
/* Formatted on 2023-01-02 오후 3:03:35 (QP5 v5.215.12089.38647) */
SELECT username,
account_status,
TO_CHAR (LOCK_DATE, 'YYYY-MM-DD HH:MI:SS') lock_date
FROM dba_users;
alter user hr account unlock
create user kiwi identified by tiger;
create tablespace ts_kiwi datafile 'C:\\app\\user1\\oradata\\orcl11\\kiwiDB.dbf' SIZE 50M
ALTER database datafile 'C:\\app\\user1\\oradata\\orcl11\\kiwiDB.dbf' RESIZE 70M
SELECT tablespace_name, initial_extent, max_extents, min_extents
FROM dba_tablespaces
DROP tablespace ts_kiwi; --다시 복구하려면 kiwiDB파일 삭제하고 위 명령어 다시실행
grant connect, resource to kiwi;
grant create sequence to kiwi;
SELECT * FROM emp
DELETE FROM emp
rollback;
kiwi에서 시퀀스, 테이블 생성
CREATE SEQUENCE KIWI.seq_member_no
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 999999
NOCACHE
NOCYCLE
NOORDER
CREATE TABLE member(
mem_no number(5) constraints member_no_pk primary key
,mem_id varchar2(10) not null
,mem_pw varchar2(10) not null
,mem_name varchar2(30) not null
,mem_nick varchar2(30)
,mem_birth varchar2(30)
,mem_reg varchar2(30)
)
INSERT INTO member(mem_no, mem_id, mem_pw, mem_name, mem_nick, mem_birth, mem_reg)
VALUES(seq_member_no.nextval, 'tomato', '123', '토마토', '나신입', '2000-10-12', to_char(sysdate, 'YYYY-MM-DD HH:MI:SS'));
INSERT INTO member(mem_no, mem_id, mem_pw, mem_name, mem_nick, mem_birth, mem_reg)
VALUES(seq_member_no.nextval, 'kiwi', '123', '키위', '나초보', '2000-10-12', to_char(sysdate, 'YYYY-MM-DD HH:MI:SS'));
INSERT INTO member(mem_no, mem_id, mem_pw, mem_name, mem_nick, mem_birth, mem_reg)
VALUES(seq_member_no.nextval, 'banana', '123', '바나나', '나일등', '2000-10-12', to_char(sysdate, 'YYYY-MM-DD HH:MI:SS'));
SELECT * FROM member
--아이디도 있어야하고 비밀번호도 일치해야함 -> 그리고(AND)
SELECT mem_no, mem_name
FROM member
WHERE mem_no = 1
OR mem_no = 3
SELECT mem_no, mem_name
FROM member
WHERE mem_no = 1
AND mem_no = 3
SELECT mem_no, mem_name, mem_nick
FROM member
WHERE mem_id = 'kiwi'
AND mem_pw = '123'
SELECT mem_nick
FROM member
WHERE mem_id =: id
AND mem_pw =: pw
/* Formatted on 2023-01-02 오후 4:32:48 (QP5 v5.215.12089.38647) */
SELECT 1 FROM MEMBER;
SELECT 1 FROM DUAL;
--존재한다면 1 반환
SELECT 1
FROM MEMBER
WHERE mem_id = 'kiwi';
SELECT mem_nick, 1
FROM MEMBER
WHERE mem_id = 'banana';
--존재하면 1, 존재하지 않으면 -1 반환
SELECT NVL ( (SELECT 1
FROM MEMBER
WHERE mem_id = 'kiwi'),
-1)
r_nick
FROM dual;
/* Formatted on 2023-01-02 오후 5:00:41 (QP5 v5.215.12089.38647) */
CREATE OR REPLACE PROCEDURE proc_login (u_id IN VARCHAR2,
u_pw IN VARCHAR2,
r_nick OUT VARCHAR2)
IS
--선언문이 오는 자리
r_status NUMBER; --변수선언, 숫자를 담음
BEGIN
--실행문이 오는 자리 -> 반복문, 조건문
SELECT NVL ( (SELECT 1
FROM MEMBER
WHERE mem_id = u_id),
-1)
INTO r_status --결과값을 status에 담기
FROM dual;
IF r_status = 1
THEN
SELECT NVL ( (SELECT mem_nick
FROM MEMBER
WHERE mem_id = u_id AND mem_pw = u_pw),
'비밀번호가 틀립니다.')
INTO r_nick
FROM dual;
ELSIF r_status = -1
THEN
r_nick := '아이디가 존재하지 않습니다.';
END IF;
END;
variable r_nick varchar2;
exec proc_login('kiwi','123',:r_nick);
print r_nick;
package dev_java.basic1;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MapExam1 {
public static void main(String[] args) {
// List따로 Map따로 사용하는 경우보다는 주로 List<Map<>>꼴로 많이 사용됨
// 오라클에서 제공하는 테이블 구조에서 튜플을 구성하 때 Map을 사용 가능함
// Member테이블 기준-id, pw, nickname
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> pMap = new HashMap<>();
pMap.put("mem_id", "kiwi");
pMap.put("mem_pw", "123");
pMap.put("mem_nick", "나초보");
System.out.println(pMap);
list.add(pMap); // list.get(0)
pMap = new HashMap<>(); // 새로운 주소번지가 할당됨
pMap.put("mem_id", "tomato");
pMap.put("mem_pw", "123");
pMap.put("mem_nick", "나신입");
System.out.println(pMap);
list.add(pMap); // list.get(1)
pMap = new HashMap<>();
pMap.put("mem_id", "banana");
pMap.put("mem_pw", "123");
pMap.put("mem_nick", "나일등");
System.out.println(pMap);
list.add(pMap); // list.get(2)
// Map의 키값은 DB테이블의 컬럼명과 통일하기 -> 권장
// 키값을 출력-mem_id, mem_pw, mem_nick
// Object key[] = pMap.keySet().toArray();
// for (Object s : key) {
// System.out.print(s.toString() + ": ");
// System.out.println(pMap.get(s));
// }
for (int i = 0; i < list.size(); i++) {
Map<String, Object> rMap = list.get(i);
System.out.println(rMap.get("mem_id") + ", " + rMap.get("mem_pw") + ", " + rMap.get("mem_nick"));
}
}
}
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day28 (0) | 2023.01.04 |
---|---|
국비 지원 개발자 과정_Day27 (0) | 2023.01.03 |
국비 지원 개발자 과정_Day25 (0) | 2022.12.30 |
국비 지원 개발자 과정_Day24 (0) | 2022.12.29 |
국비 지원 개발자 과정_Day23 (0) | 2022.12.28 |
댓글