서버 실행방법
단일 상속만 되니까 인터페이스를 지원함
인터페이스를 통한 스레드 구현방법
스레드를 인스턴스화해서 그안에 서버를 넣어준다.
Start()로 실행시킨다.
12/30시험 풀이
package dev_java.assignmentTest;
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() {
int port=3000;
ServerSocket server=null;
try {
System.out.println("Run호출 성공");
server=new ServerSocket(port);
//대기상태~~~시간이 가다가 ChatClient에서 new Socket("서버아이피",3000)
System.out.println("서버소켓 생성 완료-클라이언트 소켓 접속 기다리는 중...");
while(true){
//아래코드가 진행되는 시점은 언제지?-new Socket("서버ip","포트");
Socket client=server.accept();
System.out.println("Client 측 :"+client.getInetAddress());
//금융권 위주로 사용됨-보안강화-직렬화기법-마샬링, 언마샬링 구간...
//말하기-ObjectOutPutStream->writeObject();네트워크 전송일어남-패킷
//듣기-ObjectInputStream->readObject();듣기
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package dev_java.assignmentTest;
import java.net.InetAddress;
import java.net.Socket;
public class ChatClient {
public void client(){
int port=3000;
String serverIP="192.168.10.70";//-->답은 "192.168.20.34"로 서버 아이피로 바꿔야한다.
// java.net,java.io인터넷 회선장애 문제발생 원인
//io생성시 socket을 통해 인스턴스화를 하니까 의존관계있다.
//이런 패키지는 반드시 예외처리를 할 것(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();
}
}
토드 단축키
한 문장씩 실행할 때는 Ctrl + Enter하고
탭 문서에 있는 여러 문장을 한 번에 실행할 때는 F5를 사용하세요
오라클
오라클은 데이터를 관리하는 구조체로 테이블을 지원한다.
테이블의 구성요소로는 로우(<tr>-가로방향)와 컬럼( <td>-세로방향)으로 구성되어 있다.
선분과 선분이 만나면 면이니까 데이터를 담을 수 있다.
데이터를 나타낼 수 있다.
데이터를 출력 할 수 있다.
테이블을 만들어주는 언어를 DDL문이라고 한다.
오라클안에 JVM처럼 일꾼이 산다. 옵티마이저
DDL :구조를 정의하는 언어
CREATE PROCEDURE
CREATE FUNCTION
DML : 데이터조작어
SELECT -검색-조회- 테이블에 변화없다-커밋과 롤백의 대상이 아니다.
실제 테이블에 변화를 주는 문장-COMMIT과 ROLLBACK의 대상이다
커밋-실제 물리적인 체이블반영
롤백-커밋시점 이후에 이전 상태로 돌림
주의할 점 -커밋한 상태에서는 롤백 불가하다.
INSERT-가입 주문등록
삽입이상발생
UPDATE-현대카드 주소지 변경
수정이상 발생
DELETE-회원탈퇴, 주문취소(삭제하고 INSERT, UPDATE)
삭제이상 발생
DCL :데이터베이스에 접근 사용 권한을 주는
테이블에는 기본 키(pk)가 있다.
PRIMARY KEY
제약조건
1. NOT NULL-널을 허용하지 않는다.
널이란? 모른다. 모르는 값이다.
null과 0은 다르다.
2. 유일무이하다.
식별자의 역할을 한다.
3. 오라클이 인덱스를 만들어서 제공한다.
unique한 인덱스임
똑똑한 조건이다.
중복되지 않으니까 검색속도가 빠르다.
다른 컬럼도 인덱스를 만들 수 있다. (이때는 중복이 허용된다.-왜냐하면 pk 가 아니니까)
자동 매핑 누르고 넘어가기
첫번째 줄은 데이터 안들어 간다
Q. 우리회사에 근무하는 사원들 중에서 인센티브를 받는 사원들의
사원명과 인센티브 금액을 출력하시오.
Q.우리회사에 근무하는 사원들 중에서 인센티브를 받지 않는 사원들의
사원명과 인센티브 금액을 출력하시오.
SELECT와 FROM사이에는 컬럼명이 온다. -여러개도 가능함
단, 콤마(열거형 연산자) 붙일 것
FROM절 뒤에는 테이블명 집합이 온다. -집합적 사고-합집합,교집합,차집합,여집합
뒤에 SELECT명도 올 수 있다.
WHERE절 뒤에는 조건절이 온다.
FROM 테이블명1, 테이블2, (SELECT문-인라인 뷰)
ename as "사원명"
임시로 위에 컬럼명을 보이게 해준다. 진짜 데이터 들어간것은 아니고 출력시에 잘 알아볼 수 있도록 하는것이다.
RDBMS 관계지향형 데이터베이스-오라클
객체지향형 데이터베이스 제품은 자동으로 다 해준다.
오류가 발생하면 찾기가 힘들다.
관계지향형 데이터베이스는 SQL과 NOSQL로 나뉜다.
노에스유엘로 처리는 한계가 있다.
오라클은 sql이고
집합과 집합 사이의 관계- 관계지향형 데이터베이스
관계형태는 1:1 , 1:n , n:n
n: n 을 카타시안의 곱이라고 한다...
테시안 곱(Cartesian Product)이란?
=> union(교집합)/ interction(합집합)
- From절에 2개 이상의 Table이 있을때 두 Table 사이에 유효 join 조건을 적지 않았을때 해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것이다.
복제하는데만 사용한다.
외래키
외래 키(FOREIGN KEY)
외래 키는 다른 릴레이션(테이블)의 기본키(PRIMARY KEY)를 참조하는 칼럼(속성) 또는 이러한 속성들의 집합이다. 여기서의 외래 키 값은 참조하고 있는 릴레이션의 기본키에 없는 내용을 참조할 수 없으며, NULL 값을 가질 수 있다. 이를 참조 무결성(Referential Integrity)이라고 한다. 이러한 외래 키는 다른 릴레이션과의 관계를 표현할 때 사용한다.
출처 : https://seeminglyjs.tistory.com/267
외래 키 선언 방법은 외래 키를 사용하고자 하는 테이블의 속성을 FOREIGN KEY에 담아주고 이후 참조할 테이블과 해당 테이블의 기본키를 소괄호안에 넣어주면 된다.
부서집합 - 사원집합
deptno :PK deptno : FK
같지 않음을 표현하는 연산자
SELECT distinct (deptno) FROM emp
오라클에서 제공해주는 함수가있다.
distinct(컬럼명) 중복을 제거해줌
부서집합에는 세가지 컬럼이 있다. 부서번호 부서명
deptno컬럼 dept집합에서 -부서테이블
마이너스
deptno컬럼 emp집합을 빼라 -사원테이블
40이 남았다.
그반대는 하나도 없다. 더 큰 집합이 부서테이블이니까.
인센티브 없는 사원 IS NULL로 조건절 만들기-=NULL안된다.
인센티브 있는 사원 IS NOT NULL 그런데 0인사람도 빼야된다.
인센티브가 0인 사람만 뽑기
위와 같은 결과가 나온다.
NVL 함수
컬럼에서 널인 값은 0으로 바꾼다??
값이 null 인 경우, 지정 값을 출력하고 그렇지 않으면 원래값을 그대로 출력한다.
PK이면 인덱스가 있어서 정렬을 해준다
empno는 자동정렬
ename은 인덱스가 없다 정렬 없다.
ORDER BY 는
dual은 오라클에서 제공하는 가상의 컬럼하나 로우하나의 표이다.
오라클에서 두 날짜의 월 차이를 계산해서, 개월 수를 산출할 때는 MONTHS_BETWEEN 함수를 사용한다. 개월 수 계산은 나이, 근속일수를 계산할 때 자주 사용하며, 개월 수를 산출할 때는 함수의 첫 번째 인자의 날짜에서 두 번째 인자의 날짜를 빼는 방식으로 개월 수가 계산된다.
DBMS 데이터 베이스 관리 시스템
RDBMS
관계형 데이터 베이스 제품 특징
1. 테이블 수가 많다. - PL/SQL표준 따른다.
(제1 정규화, 제2정규화, 제3정규화, 제4 정규화, 재 5정규화)
2. 그렇다보니 조인문이 필수이고 복잡도가 증가 한다.
(인라인뷰, 서브쿼리-총계, 효율적인 조건검색....)
Netural, Self, Outer, 카타시안의 곱....(조인종류)
3. 인덱스 전략을 잘 세워야 한다.
3초안에 조회가 끝나야한다.
4. 반정규화 하는 경우도 있다.-유지보수나 관리적 측면에서 굳이 반 정규화를 단행-명분과 이유
5.옵티마이저 옵션 요구 구매 가능
병렬처리옵션따라 가격이 차이난다.
두뇌처리를 하는 역할 =옵티마이저
정보를 저장하기위해 테이블을 이용하며 행과 열이있다.
확장이 용이하다.
릴레이션 : 테이블. 로우와 컬럼
튜플 : 행
xxxVO.java -> List<DeptVO>
Map<String, Object>-> List<Map<String, Object>>
토드에서 sysdba들어가기
터미널로 sysdba 들어가기
sys 계정에 비번을 잃어버렸을때
sqlplus "/as sysdba" 엔터
show user;
alter user sys identified by abcd1234 엔터
connection은 conn으로 줄여쓸 수도 있다.
sys계정으로 테이블 만들기와 크기 정하기
권한주기
grant
시퀀스 만들기
시퀀스 만들었다
키위에 멤버테이블 만들기
이렇게 변수로 단위테스트 가능하다.
프로시저란?
오라클에서의 프로시저는 PL/SQL을 통해 만들어집니다. 자주 사용하는 SQL을 프로시저로 만든 뒤 필요 할때마다 호출,사용하여 작업 효율을 늘릴 수 있습니다. 함수는 특정 연산을 수행한 뒤 결과 값을 반환하지만 프로시저는 특정한 로직을 처리하기만 하고 결과 값은 반환하지 않는 서브 프로그램입니다.
출처 : https://coding-factory.tistory.com/453
1이 세번 찍힌다.
키위가 있는곳에 1을 찍어라
1이 하나 찍혀서 나온다
토마토의 나신입 닉넴이 나왔다.
아이디가 없으면 -1을 반환 있으면 1을 반환하자
nvl(xxx, 0)은 xxx가 널이면 0으로 바꿔줌
위에서는 널이면 -1을 반환한다
키위가 없으면 널
키위가 있으면 널아님
널아니면 1을 찍어라
널이면 nvl이 -1로 바꿔라는 뜻
where은 조건문
아이디와 비번이 일치하면 (and) 닉네임을 반환한다
널값이면 비번이 틀립니다 를 반환한다.
r_nick은 위에 라벨 붙여주는거다.
dual이라는 1x1표에 데이터값에따라 늘어난다. 기본 표.
create or replace procedure proc_login(u_id in varchar2, u_pw in varchar2, r_nick out varchar2) --선언문
is
--선언부
r_status number; --변수선언. 숫자를 담음 디폴트값은 5
begin
--실행문, 반복문, 조건문
select nvl((
select
1
from member
where mem_id = u_id
),-1) into r_status--결과값을 담기
from dual;
if r_status =1
then --1이면 아이디가 존재
select nvl((
select
mem_nick
from member
where mem_id = 'kiwi'
and mem_pw= '123'
),'비번이 틀립니다.') into r_nick
from dual;
elsif r_status = -1 then
r_nick := '아이디가 존재하지 않습니다.';
end if;
end; --영역을 나타낼때 자바는 {}쓰는데 여기서는 end문을 사용한다.
프로시저에 등록이 되면
exec proc_login('kiwi','123', :r_nick)
이렇게 만들어 놓은걸로 간단하게 실행할수있다.
Map은 한번에 하나 들어간다. 그래서 맵을 담을 List가 필요하다...
keySet().toArray()는 키값을 한꺼번에 뽑는 메소드이다. 외워두자
package dev_java.basic;
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테이블 기준
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> pmap = new HashMap<>();
System.out.println(pmap);
pmap.put("mem_id","kiwi");
pmap.put("mem_pw","123");
pmap.put("mem_nick","위위");
list.add(pmap);//list.get(0);
pmap = new HashMap<>();//새로운 주소번지가 할당된다. 새로운 맵
System.out.println(pmap);
pmap.put("mem_id","toamto");
pmap.put("mem_pw","123");
pmap.put("mem_nick","나신입");
list.add(pmap);//list.get(1);
pmap = new HashMap<>();//타입을 제거해서 중복선언을 피한다
System.out.println(pmap);
pmap.put("mem_id","banana");
pmap.put("mem_pw","123");
pmap.put("mem_nick","나나");
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.println(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")
);
}
}
}
'학원수업 > 1월' 카테고리의 다른 글
01/05 국비학원 29회차 오라클수업 (0) | 2023.01.05 |
---|---|
01/04 국비학원 28회차 오라클수업 (0) | 2023.01.04 |
01/03 자바 복습 - 디비연동(List, Map) (0) | 2023.01.03 |
01/03 국비학원 27회차-오라클수업(데이터 모델링, Toad로 sql문 작성) (0) | 2023.01.03 |
01/02 오라클 숙제 (0) | 2023.01.02 |
댓글