학습 day11 ~ day20

Hanna·2024년 11월 8일

KOSMO 24.10~25.03

목록 보기
2/12

day11. 2024-10-22-화

생성 파일 & 핵심 내용

  • src.classes.day11
    - .For3 : 반복문, 무한루프, 방어 코드, 디버깅
    - .For4 : 변수의 scope, 설계
    - .time : 타임서버 내가 세팅한 화면에 출력하기

for문

  • 반복문 - for문, while문, do..while()
  • 조건문 - if문, switch문(메시저-직관), 삼항 연산자
  • 무한루프 상황 연출해보자
    • 방어하는 코드를 생각해야 함! 주의!
    • break에 대한 이해도를 바탕으로 적절하게 사용 필요
  • 디버깅 능력 키우자
    - 개발자가 되는 데 있어서 8할이라고 하는 사람도 있음. 기본5할이상
    - println은 디버깅이라고 하지 않음

변수 scope(범위) 이슈

  • 내가 선언한 위치의 변수가 어디까지 영향을 끼치는가? - 기초 아님
  • 멤버변수와 전역변수, 지역변수 -> 클래스 설계(변수 설계, 메소드 설계, 생성자 설계 포함)
    • 메소드 설계: 리턴타입도 변수, 파라미터 자리도 변수이기 때문
  • for문 밖에서도 변수i에 대해 접근하려면 for밖에서 선언할 것

equals와 등호(==)

  • 대입연산자 우측에 문자만 작성하면 변수 이름이 달라도 주소번지 동일
  • new로 문자를 할당하게 되면 새로운 String을 만들어 문자를 할당하기에 주소번지가 다르다

타임서버 코드

프로그램 동장과정
1. 서버는 2008번 포트에서 클라이언트 연결을 기다린다.
server = new ServerSocket(port); (65열) //1~65570 사이 숫자 사용
1~1023번은 윈도우 운영체제가 사용하므로 피한다.
2. 클라이언트가 연결(new Socket("172.16.90.45",2008))되면
새로운 스레드가 생성되어 해당 클라이언트에게 1초마다 현재시간을 전송한다.
: 객체를 생성할 때 서버소켓에 접속을 시도한다. 다른 코드는 필요없음
3. 클라이언트가 연결을 종료하면 해당 스레드는 종료된다.
스레드 클래스가 사용자에 대해 라이프사이클를 관리함(생성-활용-죽음)
4. 서버는 새로운 클라이언트가 연결될 때까지 계속 대기하며, 연결될 때마다 새로운 스레드를 생성한다(깊은복사)

소켓 Socket

  • 네트워크 통신을 지원하는 송수신 접점, 클래스 종류
  • 네트워크 7계층에서 소켓은 네트워크의 끝부분을 의미함
  • 클라이언트 소켓과 서버 소켓으로 구분
    • 클라이언트(사용자)와 서버에 해당되는 컴퓨터를 식별하기 위한 IP주소 필요
    • 해당 컴퓨터 내에서 현재 통신에 사용되는 응용프로그램을 식별하기 위한 포트번호 필요
  • 실제 데이터가 어떻게 전송되는지 상관X, 읽고쓰는 데 인터페이스를 제공
    • 인터페이스는 추상화, 구현체 클래스가 반드시 있어야 활용 가능
  • 네트워크 계층과 전송 계층이 캡슐화 되어있어 두 개의 계층을 신경쓰지 않고 프로그램 작성 가능
    • 네트워크, 7계층 등과 관련된 영상 보는 것도 추천
  • java는 이식성이나 플랫폼 독립적인 프로그램 지원을 위해 소켓을 핵심 라이브러리로 만듦
  • TCP/IP계층의 TCP를 지원하기 위해 소켓, 서버소켓 클래스 제공(널널한개발자 참고)
    • TCP: 컴퓨터가 데이터를 주고받을 때 사용하는 프로토콜로, 전송 제어 프로토콜
  • 클라이언트는 소켓객체를 생성하여 TCP서버와 연결 시도한다
  • 서버는 서버소켓객체를 생성하여 TCP연결을 청취하여 클라이언트와 연결

  • 클라이언트(사용자) 소켓 구현하기
    • 클라이언트 소켓객체 생성을 통한 서버접속
    • 데이터 송수신을 위한 input/output 스트림 생성
    • input 스트림을 통한 데이터 수신 (서버 → 클라이언트)
    • 통신 종료

서버 소켓

  • 서버소켓 생성 -> 생성자도 호출됨
  • 생성자도 파라미터가 존재할 수 있음
    • 파리미터 자리에 포트번호가 와야 한다!!
    • ex) NoticeSub ns = new NoticeSub(this)
    • 여기의 this로 클래스 사이의 관계를 설정해줌
  • 생성 후, 클라이언트(사용자)의 접속을 기다린다
    • SO, new Socket("192.168.0.98",5000)을 인스턴스화 하기만 하면 된다
    • "192.168.0.98": IP번호, 5000: 포트번호


Thread

  • 운영체제에서는 실행 중인 하나의 어플리케이션을 프로세스라 함
    • 사용자가 어플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 어플리케이션의 코드를 실행
    • 독립적인 실행 단위로, 각각 고유한 주소공간, 메모리, CPU 및 파일을 가짐
  • Thread : 하나의 코드 실행 흐름
    • 프로세스 내에서 실행되는 실행 흐름, 프로세스의 메모리, CPU, 파일을 공유
    • 프로세스 내에서 동시에 실행될 수 있으므로 프로그램의 성능을 향상시키는 데 사용할 수 있음


사용자 이름을 한글로 한 사람

  • 기술 이력서 작성시 사용해본 도구, 툴을 적는다
  1. 자바 설치 (2번째 프로그램)
    SQL 제품 <-> NoSQL(모바일.., 경량DB)
    RDBMS(오라클, MySQL, MS-SQL Server, DB2) -> PL/SQL 표준을 따름
    저장프로시저(프로그래밍-배열, 구조체지원), 함수도 지원
    (함수형 프로그래밍이 요새 유행)
    -> 금융, 공공부분, 보험, 물류, 회계 - 사회에서 사라지지 않는!
    옵티마이저- 일꾼
    DBA 쪽 분야도 취업하기 좋다~ - DB설계 : 개발 경험이 없다면 쫌?! - 눈에 보이지 않는 컬럼을 찾아내야 함. 2년 정도 근무 - 프로젝트 4-5개 하니깐 이후 진로결정 추천

  2. 오라클 11g1qjs - 관리자권한으로실행 설치 (DB암호: abcd1234, SID: orcl11)

    • DB 서버 제품 - AWS사용하는 대신에 로컬에 직접 서버구축
    • 표준검사창 체크 3개, 암호관리- Scott,HR 계정 체크 해제 - 암호 tiger
  3. Toad 설치

  4. ER-WIN --> DB설계 -> EBD산출물




day12. 2024-10-23-수

생성 파일

  • src.classes.day11.time.TimeClient2 - 소켓 역할
  • src.classes.day11.time.TimeServer2
  • src.classes.day12.TryCatch - 예외 처리
  • src.classes.day12.DeptMain - 오라클 테이블을 자바에서 설계
  • src.classes.day12.ArrayDept1,2 - 배열 복습
  • D:\eclipse-workspace\tomatoTalk\src\collection\step1\List1~4 - List 학습
  • D:\eclipse-workspace\tomatoTalk\src\sockettalk\step1\Tomato~4개 - 소켓 스레드 틀 구축

학습목표

  • 생성자 활용
  • 생성자 통해 멤버변수의 초기화를 할 수 있다
  • 여러 가지의 생성자를 재정의하여 상황에 따라 선택하여 호출할 수 있다
  • 생성자의 여러 파라미터 변수를 맞춰 사용할 수 있다
  • this를 사용해야 하는 이유에 대해 말할 수 있다

새로 배운것

  • eclipse 툴 사용
  • List 개념
  • 소켓, private
  • Tomato 서버, 클라이언트, 소켓

try catch 블록

  • 예외가 발생할 가능성이 있는 코드를 try안에 쓴다
  • 네트워크 관련 코드에는 무조건 만들어야 한다
  • 후처리를 위해 사용함

문법 설명

  • private : 캡슐화 접근제한자 - 내 클래스 안에서만 접근 가능함. <-> public

  • private해도 쓰고 싶다면 Getter and Setter 사용해서 접근가능함

  • 설계: 필요한 정보를 사용하기 위해 정의, 접근 등

  • 삼항 연산자: [조건식 ? 반환값1 : 반환값2]

    • 조건식 참 -> 반환값1, 조건식 거짓 -> 반환값2

(TimeServer1.61열)

배열 복습

  • 하나의 클래스에 여러 변수를 선언할 수 있다
  • 객체배열을 사용할 수 있다 - n개의 로우를 담을 수 있음(단, 고정형)
  • 생성자 파라미터 3개 -> 새 클래스에서 인스턴스 배열 변수 선언

class Dept >>

class ArrayDept2 >>

- 배열 크기 3 -> 한 방에 변수3개가 들어있음!! deptno, dname, loc

eclipse 툴 사용법

  • intellij보다 한번에 일인다역을 할 수 있어서 유용함
  • 메신저 프로젝트할 때 유용

List

  • 인스턴스화할 때 클래스는 ArrayList 임
  • 인스턴스화 할 때 선언부에 더 넓은 타입이 올 수 있음
    • 더 넓은 타입이란 인터페이스나 추상클래스를 말함
  • <> : 다이아몬드 연산자, 제네릭 기호. 타입 작성
  • 크기를 자유롭게 늘리고 줄일 수 있다 (배열, 변수보다 빈번하게 사용됨)
    (배열은 고정형, 삭제 불가 - 굳이 삭제 원하면 깊은복사로 처리할 것)

Tomato 소켓 어떻게 공부하지>!?!?!

1) 클래스마다 전체적으로 보기
2) 이후 구성요소 파악해보기 > 손으로 써보기

  • 메인 메소드 유무 확인 -> 안에 호출되는 것
  • 생성자 유무
  • 파라미터 넘기는 유무
  • 멤버변수 체크

3) 클래스 테스트 순서 : 호출되는 순서 >> 흐름따라가보기(JVM)

4) 몇번 라인이 실행되는지
SYS 쓰면서 확인해보기

5) 클라이언트 실행 시켰을때 언제 넘어가는지도 확인해보기




day13. 2024-10-24-목

생성파일

  • day13.연습문제 Q12,27 >> 변수의 적용 범위
  • day13.연습문제 Q28 > 멤변, 지변, this과 인스턴스화의 연결
  • src.jdbc.lib. >> 오라클 제공 코드를 JVM에서 찾을 수 있도록 함 "ojdbc6"
  • jdbc.step1.OracleConnection
  • CA ERwin 모델러 구동 >> 토마토멤버 만들기 - 오라클에서 자료 추가하기

새로 배운것

  • 변수의 적용범위
  • finally{} - try catch
  • 배열 선언 기호 위치
  • 개선된 for문
  • 오라클과 ERwin

복습

  • static 영역 안에서는 this를 사용하지 않는다
  • List
List<String> list2 = new ArrayList<>();
  • 인터페이스<타입> 변수명 = new 클래스<>(); 꼴로 사용
  • List는 인터페이스이고, 구현체 클래스를 가지고 있음
    • 인터페이스는 추상메소드만 가지고 있어서 오른쪽에 단독으로 사용 불가
    • 반드시 오른편에는 구현체클래스가 와야 하며 그래야 추상메소드를 구현할 수 있음
  • 네트워크 관련된 코드는 무조건 예외처리를 하게 되어 있음 : try-catch 블록

지역변수

  • Q12 : 다른 메소드에서 변경에도 기존 메소드에서는 바뀌지 않음
public class Q12 {
     public static void main(String []args) {
        int x = 5;  //main에서 선언된 지역변수
        Q12 p = new Q12();
        p.doStuff(x);
        System.out.print("main x = "+ x);//5
        }

     void doStuff(int x) {
        System.out.print("doStuff x ="+ x++);  //x를 증가시키기전에 출력한다. 5
    }
}
class Pass {
    int x =1;
    //6-7-8-11-12(5출력)-9(5)
    public static void main(String[] args) {
        int x = 5;  //main에서 선언된 지역변수
        Pass p = new Pass();
        p.doStuff(p);
        System.out.print("main x = " + p.x);//2
    }
    void doStuff(Pass p) {//1
        System.out.print("doStuff x =" + ++p.x);  //2
    }
}
  • Q28_1 : 뭔말인지 모르겠지만 일단 외우자! > 그림그리면서 외우자 (노트필기 그림참고)
public class Q28_1 {
    int i = 1;
    Q28_1 q = null;
    void m(int i, Q28_1 q){
        System.out.println(q);
        q = new Q28_1();
        System.out.println(q);
        System.out.println(this.q);
 여기-> System.out.println(this); //이게 문제다!! - 7줄과 동일
    }

    public static void main(String[] args) {
        Q28_1 q = new Q28_1();
        q.m(1, q);
    }
}   
  • ↓ Q28: 이해하기 어려운 난해함.....↓
public class Q28 {
    int x = 12;

    public static void main(String[] args) {
        Q28 q = new Q28();
        System.out.println(q.x); //12
        q.x = 10;
        System.out.println(q.x); //10
        q = new Q28();
        System.out.println(q.x); //10
    }
}

배열 선언과 초기화

public class Q29 {
    public static void main(String[] args) {
        int []x = {1,2,3,4,5};
        int y[] = x;
        System.out.println(y[2]);
        int a,b=1;
        int a1[],b1 = 1; //a1[]은 선언만 된 상태 => int a1[];
        a1 = new int[3]; //지변은 초기화를 생략할 수 없다
        System.out.println(a1.length);
        System.out.println(a1 instanceof Object);//타입확인 - instanceof - 화면단과 서버가 만나는 부분에서 필요, 타입이 다르니깐
      //  System.out.println(a1 instanceof String);
        System.out.println(b1);
       // int []a2,b2 = 2;
        int []a3,b3 = null; //배열기호가 변수앞- 뒤에오는 변수도 배열이다
        int []a5,b5 = new int[]{1,2,3,4,5}; //a5은 선언만 된 상태
        a5 = new int[]{1,2,3,4,5};//따로 초기화 해줘야 함
        System.out.println(a5[3]); //4
        System.out.println(b5[3]); //4

    }
}

개선된 for문

public class List2 {
    public static void main(String[] args) {
        List<A> list = new ArrayList<A>();
        System.out.println(list.size());//0
        A a = new A();
        list.add(a);//1
        a = new A();
        list.add(a);//2
        a = new A();
        list.add(a);//3
        System.out.println(list.size());
        
        for (A a1 : list) { //개선된 for문 지원함 - (제네릭 타입 : 자료구조 클래스)
            //자료구조에 있는 모두를 다 출력할때는 개선된 for문을 사용
            System.out.println(a1);
        }
    }
}
  • 개선된 for문 지원함 : 자료구조에 있는 모두를 다 출력할 때
  • (제네릭 타입 : 자료구조 클래스)

Java API를 활용하여 오라클 서버에 접속

  • jdbc.step1.OracleConnection
    1) 오라클 회사가 제공하는 드라이버 클래스(ojdbc6.jar)를 로딩
    --> 이후 CA ERwin 프로그램 구동해봄 -끝

day14. 2024-10-25-금

생성파일

  • src.jdbc.step1.OracleConnection > 배열 초기화하여 출력하기
  • src.jdbc.step1.OracleConnection3 > getter, rs.next()이용해서 리스트 만들고 출력하기

배경지식에 대하여

  • 경력 2년부터 티가 나는 듯 하다 -> 이런 암기 지식 -> 정보처리기사(정처기)는 추천
  • DML/DDL/DCL

새로 배운것

  • DB 연동 4단계
  • Toad 오라클 사용

복습

  • 서버가 서버스레드에 주입되어야 함: 객체주입 - 제어권을 넘겨줌
    • 이 과정에서 생성자+this를 사용하여 관계르 연결하고 멤변 원본을 넘겨준다
    • 스레드가 클라이언트를 관리
  • 클라이언트 고객이 여러명이니 -> List에 담고 클라이언트스레드에서 관리하자
    • ArrayList로 늘리고 줄이며 관리 -> 주소가 다 달라야 한다
    • 고객이 새로 생길때마다 깊은복사로 인스턴스 변수 생성해야 함
      -> 또한, 서버스레드가 새로 생겨야 함(안에 최소 기본변수는 s, ois, oos-> 로컬로 관리)
      -서버스레드는 ArrayList로 묶어서 관리

Toad for Oracle

  • 보이진 않지만 서버가 있음
  • 서버에 뭔가 보내려면 우리는 DML을 보내야 한다
    • DML: 데이터 조작어 (SELECT, INSERT, UPDATE, DELETE)
    • INSERT,UPDATE,DELETE의 반환값 타입은 int
  • SELECT ,,_ FROM 집합 : 데이터를 꺼내온다
    • table 데이터에서 꺼내옴. 즉, 어레이가 아니라 클래스를 공략한다..?

DB 연동의 4단계

1) Class.forName(_Driver): 드라이버클래스 로딩
- (클래스)는 제조사에서 제공한다
- .jar, .war는 zip과 같은 압축파일로, 안에 클래스가 들어있다
2) Connection(I): 서버에 연결하는 통로를 확보해준다
- 추상메소드(미정의 상태)를 사용하기에 구현체 클래스가 필요함
- (ex) List -> ArrayList (싱글스레드에 안전, 빠름), Vector(멀티스레드에 안전))
- (그래서 선언부 생성부의 이름이 다르다)
3) Statement(I): 요청사항 DML로 JAVA에서 ORACLE DB을 보내준다
- 동적 QUERY(Prepared St.) & 정적 QUERY가 있다
4) ResultSet(I): 테이블의 커서를 조작해준다
- rs.next(): 행 방향으로 커서위치 이동 후 > 거기 위치에 데이터가 있니? boolean-true/false

오라클

  • primary key에는 인덱스가 만들어진다
    • MySQL 등등 다른것들도 그러함
    • 인덱스가 있는 컬럼은 order by를 쓰지 않아도 디폴트로 오름차순(asc) 정렬이 되어있음
  • select 로 해서 먼저읽는 집합이 있고 나중에 읽는 집합이 있다
    • 동시에 두개의 테이블을 읽는 것이 아니라 순차적으로 읽음
    • 실행계획을 통해서 확인할 수 있음
    • 부서집합 - 4건 - 인덱스 - 순번 - 사원집합 - 인덱스(empno) - deptno(외래키)
      -> 부서집합의 부서번호와 사원집합의 부서번호가 같은 것 -> 양쪽 테이블에 존재하는 경우만 조회
  • 실행순서
    1. parsing- 문법 체크
    2. DBMS가 실행계획을 세운다
    3. 옵티마이저에게 넘김
    4. open, corsor..fetch..close

오라클 문법

  • DELETE FROM dept; : 자료 전체 삭제
    • 에러: 무결성 제약조건에 위배
    • 자식레코드(자료)가 있는데 부모레코드를 강제 삭제가 안된다

DML/DCL/DDL

  • DML
    • SELECT : 자료가 바뀌는 것은 아니고 불어오기만. commit/rollback은 대상이 아님.
    • INSERT(삽입)/UPDATE(수정)/DELETE(삭제)
      -> CRUD로 연결됨

오라클에서 직접 자료 테이블 만들기

  • 시퀀스 만들기 : Schema Browser에서 - 접힌 종이 클릭

-------------------------------------------------------------------------------

day15. 2024-10-28-월. 병원 피검사로 오후 조퇴

생성 파일

  • src.classes.day15.PCMain -> 자손과 부모의 생성자 클래스 호출
  • src.classes.day15.AMain
  • src.classes.day15.JDiaogMain --> 이후 파일은 조퇴 이후 진도라서 복습!!
  • src.classes.day15.JFrameMain
  • src.com.util.DBConnectionMar
  • src.athread.talk3.DBUnitTest

새로 배운것

  • 생성부의 이름을 객체 생성
    • 부모타입의 인스턴스변수가 자손 클래스로 생성되면 자손의 메소드 호출됨
  • API에서 클래스마다의 설명, 파라미터 타입 등 확인 가능 -> 자주 보자
  • 사이드 이펙트: 감기약 먹으면 졸리는 것처럼 의도하지 않은 반응 발생
    • 인스턴스변수 변수의 값을 직접 변경하는 것은 대체로 피해야

복습

  • 멀티스레드는 하나의 공간을 여러명이 공유 - Vector - 그래서 느리다

  • 싱글스레드는 하나의 공간을 한명이 쓰니깐 빠르다 - ArrayList

  • 인터페이스는 단독으로 인스턴스화 할 수 없다 - 반드시 구현체클래스가 필요하다

  • 학습 순서: 변수-배열-객체배열-리스트-맵-세션과 쿠키

    • 3차 배열: 공간이면 직관이 떨어짐 -> 리스트나 맵 활용해서 대체 가능: JSON, UI지원하는 DataSet객체설계에 유용
  • API 볼때: 생성자를 먼저 보자!

생성자 인스턴스화

  • 코드 볼때 : 생성자를 먼저 볼것 -인스턴스화 여기가 출발점
  • 생성자도 메소드와 같이 오버로딩의 규칙을 따른다: 파라미터의 개수와 타입에 따라 구분됨
  • vs. 오버라이딩: 파라미터의 개수와 타입은 기존으로 고정, 변경 불가
  • API 많이 보면서 공부하기: 표준이 무엇인가? 생각하면서
  • 상속: 결합도 높음, 의존적이다 > 사이드이펙트 등이 여기서 발생한다
  • 인스턴스화 왼쪽에서 더 큰 클래스가 올수 있음
Parent1 p2 = new Child1();
  • 자손 클래스의 생성자가 호출되기 전에 반드시 상위 클래스의 생성자가 먼저 호출된다
    • 파라미터가 있는 생성자를 호출해도 부모의 디폴트 생성자가 호출됨
class Parent1{
    Parent1(){
        System.out.println("Parent1");
    }
}
class Child1 extends Parent1{
    Child1(){
        System.out.println("Child1");
    }
}

public class PC1Main {
    public static void main(String[] args) {
         Child1 c1 = new Child1(); ///결과 : Parent1 Child1

      }
}
  • 자바에서는 생성부의 이름으로 객체가 생성된다
class Parent3{
    Parent3(){
        System.out.println("Parent3");
    }
    Parent3(String s){
        System.out.println("Parent3(String)");
    }
    void m(){
        System.out.println("Parent3.m()");
    }
}
class Child3 extends Parent3{
    Child3(String a){
        System.out.println(a); }
        @Override
      void m() {
            System.out.println("Child3.m()");
        }
}

public class PC3Main {
    public static void main(String[] args) {
        // Child3 c3 = new Child3("hello");
        Parent3 p1 = new Parent3(); //Parent3
        p1.m(); //Parent3.m()

 여기-> p1 = new Child3("a"); //Parent3 a
 여기-> p1.m(); //Child3.m()

        Parent3 p = new Child3("Hello~~"); //선언-부모, 생성-자녀
        // Parent3 Hello~~

 여기->  p.m(); //Child3.m()
      }
}
  • 오버라이드 메소드: p가 Parent3타입 이더라도 자손의 메소드가 호출된다
  • 이때 부모의 m메소드는 쉐도우 메소드가 된다.(출력x)
  • 생성 선언부가 다른 생성자 - 다형성이 가능
  • 부모타입, 자손 클래스로생성 -> 자손에만 있는 메소드 호출 불가
  • 상속: 자손클래스가 부모클래스보다 누릴 수 있는 변수와 메소드가 더 많음 (Child ⊃ Parent)
  • 다향성: 선언부 타입과 생성부 타입이 다른 경우
    • 구현체클래스 변수명 = new 구현체클래스();
    • 인터페이스 변수명 = new 구현체클래스();
    • 추상클래스 변수명 = new 구현체클래스();
  • 객체생성시 주의사항
    • 사이드 이팩트(Spring 프레임워크에서는 대신해준다)를 피하는 코드 작성하기

List

  • 제네릭 사용x -> Object 타입
    • 이때 개발자가 타입을 맞춰줘야 함
  • 인터페이스는 단독으로 인스턴스화 할 수 없음
    • 반드시 구현체 클래스 필요
  • add()는 오버로딩된 메소드 -> list2,list3에서 다 사용 가능
 불가-> List list = new List();
        List list2 = new ArrayList(); 
        list2.add(0,"사과");  //Object타입
        list2.add("파인애플"); //Object타입
 확인-> list2.add(1); //Object타입, 위치가 아닌 숫자1을 추가
        list2.add(2,7); //끼워넣기 가능
        for(Object i:list2){
            System.out.println(i); //사과 파인애플 7 1
        }

        List<String> list3 = new ArrayList<>();
        list3.add(0,"사과");
        list3.add("파인애플");



day16 2024-10-29-화

생성파일&수업

  • src.athread.talk3
  • 토드 오라클 : D:/tomato_member.sql -> TOMATO_MEMBER 데이터 CMD에서 활용하기
    -> 오라클 언어 코딩
  • sr.athread.talk3.ZipCodeSearchForm> 데이터 불러와서 검색하기
    -D:/zipcode_t.sql

새로 배운 것

  • ZipCodeSearchForm: DB연동 주소 조회 데이터 불러오기
  • 개념 공부: Query문, SQL
  • 테이블 구조 -> VO(Value Object), DTO 떠올리기 (이게 뭔데..?)

문법 배우기

  • implements FocusListener: 커서 넣으면 "동이름을 입력하세요" 삭제하기
  • catch예외: e.printStackTrace()
    • 예외 상황이 발생하면 라인번호와 함께 에러메시지를 출력함.
    • 디버깅과 관련되어있다

Query

  • 데이터베이스DB에 사용자가 요청한 특정 데이터를 보여달라는 요청
    • 즉, 쿼리문을 작성 = DB에서 원하는 정보를 가져오는 코드를 작성한다.

SQL

  • Structured Query Language
  • 데이터베이스에서 데이터를 추출하고 조작하는 데에 사용하는 데이터 처리 언어
  • 효율적으로 추출하고 분석할 수 있어 빅데이터를 다루기 위해 필수적

zipcode_t.sql 쿼리문 설명

SELECT '전체' zdo FROM dual 
UNION ALL 
SELECT zdo
  FROM (
        SELECT
               distinct(zdo) zdo 
          FROM zipcode_t
        ORDER BY zdo asc
       );
  • dual
    • 가상 단일행, 단일열의 테이블
    • 실제 테이블을 참조하지 않아도 될때 사용
    • '전체'와 zdo를 반환하게 도와줌
  • UNION ALL : 위아래 select 연결
  • distinct : select에서 중복된 값을 제거하고 고유한 값을 반환하는 데 사용

day17 2024-10-30-수요일

생성파일

  • src.ui.combo.
  • 화면 새로고침 기능: classes.ui_day9.refresh.JFrameMain
  • src.ui.table

공부를 어떻게 할 것인가

  • 어렵다 -> 흐릿하다 -> 구체화 -> 시각화 해보기
  • 문제 해결: 로그 관리 -> print 안하고 화면에 띄우기 (3일 영속성 필요하다면 오라클DB 사용)
  • 일괄처리와 자동화! -> 일하는 시간을 줄이고 생산력 높이는 능력 키우기
  • DB연동시
    • 생성자를 활용하지만, 오라클 서버의 데이터에 따라 초기화가 결정된다면
    • 시간, 타임라인에 대한 이해가 필요함
  • 화면처리(랜더링) 시점과 객체가 생성되는 그 시점 사이에 간격이 있다
    • 테스트 시나리오 작성해보기
      1) 처음 화면이 그려질때(랜더링) 그 때 초기화 하기
      2) 이벤트가 발생할 때 초기화 하기

JComboBox

  • UI 기능
  • DefaultTableModel dtm_zipcode = new DefaultTableModel(data,cols);
    • 이게 데이터를 품음
    • JTable, JScrollPane 등은 데이터 품지 못함
DefaultTableModel dtm_zipcode = new DefaultTableModel(data,cols); //데이터셋 담당
    JTable jtb_zipcode = new JTable(dtm_zipcode);
    JTableHeader jth = jtb_zipcode.getTableHeader();

이벤트 처리 (implements ~)

  • ActionListener public void actionPerformed(ActionEvent e)
  • FocusListener -> public void focusGained(FocusEvent e)
  • ItemListener -> public void itemStateChanged(ItemEvent e)
  • 클래스 안에서 실행하기
    • jcb1.addItemListener(this): this - Combo1 클래스
    • ItemListener가 정의하는 추상 메소드를 오버라이딩하고 있어서 Combo1은 ItemListener 구현체 클래스 라고 한다

새로운 용어

  • int index = jcb3.getSelectedIndex();
    • getSelectedIndex: 0부터인지 1부터인지 시작점 체크
  • String item = (String)jcb3.getItemAt(index);
    • getItemAt 타입: Entity - 오라클 쿼리문 - 클래스 -Object
  • append vs. setText: 추가 vs. 기존삭제후 새것만입력
  • this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //JVM과 앱 사이에 연결 끊어 자원 반납
  • String zdos[] = null; //크기를 내가 정할 수 없음 - DB에 따라서 결정됨
  • v.copyInto(zdos); //효율단계: 일일이 넣기 -> for문으로 넣기 -> copyInto :: 자동화!! (Vector의 메소드)
  • Container cont = this.getContentPane(); cont.revalidate();
    • revalidate(); - 기존 창 비워내고 업데이트 -> 수정한 사항 반영

오버로딩과 오버라이딩

  • 메소드의 다형성을 구현하는 데 사용
  • 반드시 구현체 클래스 관계일때만 따진다
  • 오버로딩: 파라미터의 개수와 타입이 다른 같은 이름의 메소드를 여러 개 정의
    • 생성자도 오버로딩의 규칙을 따름
    • 오버로딩을 사용하면 코드의 가독성과 재사용성을 높일 수 있음
  • 오버라이딩: 상속받은 메소드를 재정의
    • 파라미터의 개수와 타입은 기존으로 고정, 변경 불가 : 선언부 동일
    • 코드의 재사용성과 확장성을 높일 수 있음
    • 상속받은 메소드를 자신에 맞게 변경 > 코드의 유지보수를 쉽게 해줌
  • 인터페이스타입 변수명 = new 구현체클래스();
  • 추상클래스타입 변수명 = new 구현체클래스();

day18, 241031목 진도내용 (공결off)

  • 오라클 쿼리문
  • ahread.talk3.MemberShipForm.java
  • ZipCodeSearchForm.java -> MouseListenser 기능 추가
  • ahread.talk3.TalkDao.java
  • classes.design -> 8개 자바 파일 : 추상 클래스 vs. 인터페이스

오라클 쿼리문

- SELECT n_no, n_title, n_content FROM notice1030;

--테이블에는 커서가 따라 붙는다. 커서를 조작하는 메소드가 필요했다.
-- 메소드를 가지려면 클래스가 되어야 했다. - 그런데 기능은 사용처에 따라 달라야한다.???
--그러면 인터페이스(디바이스마다 달라서 결정할 수 없으면 추상메소드로 정의할것) - 다형성 실현
--  ResultSet은 커서를 움직이는데 필요한 next(), previous(), isFirst(), isLast(): boolean
-- 그래서 if문이나 while문이나 for문 괄호안에 쓸 수 있다.
-- PreparedStatement - 동적쿼리 <-> 정적쿼리 -Statement
-- SELECT -> pstmt.executeQuery("SELECT문"):ResultSet(인터페이스)
-- INSERT, UPDATE, DELETE -> commit, rollback
-- pstmt.executeUpdate("INSERT문|UPDATE문\DELETE문"):int
-- javadoc문법

Restful API - CRUD수업(입력,수정,삭제,조회) - Model계층(데이터 처리 + 비즈니스 로직)


INSERT INTO dept(deptno, dname, loc) VALUES(50,'총무부','인천');

commit;

SELECT deptno FROM dept
INTERSECT
SELECT deptno FROM emp;

SELECT empno FROM emp;--pk-> unique index(유일무이한-제약조건,  not null)
--그래서 테이블을 access하지 않고 index만 읽고서 결과를 출력한다.
--index - 따로 관리되고 있다. - 인덱스만 관리하는 별도의 공간이 있다.- 인덱스전략 수립   
   
<Select b_no From book152>
1)파싱 - 쿼리문의 문법 체크 - 읽어올 수 있는지 (테이블이 존재하지 않는다/부적합한식별자-컬럼명)
  - 디버깅 과정
  - 예외 처리 -> catch(SQLException se)
2)RDBMS가 실행계획을 세운다
  - execute plan
3)옵티마이저 : 실행계획을 받아서 처리한다.(hint문) (INSERT, UPDATE, DELETE)
4)OPEN.. CURSOR(위치에 데이터가 존재하면 true, false반환-시그널)-> Fetch(자료를 메모리에 연결) ...CLOSE   
(MVC 패턴에서 M에 대한 코딩을 하고 있다!)

SELECT ename FROM emp;--정렬이 안되어 있다. 왜냐면 인덱스가 없다.왜요? 넌 PK가 아니다.

SELECT ename FROM emp
ORDER BY ename asc;

--hint문을 통해서 옵티마이저에게 개발자의 실행계획을 전달할 수  있다.
--만일 오타있으면 무시된다.- 실행은 된다.- 실행계획이 반영되지 않았다.

SELECT /*+index_desc(emp pk_emp) */ empno
  FROM emp;

SELECT /*+index_desc(emp222222 pk_emp) */ empno
  FROM emp;


--FK 외래키, 인덱스가 제공되지 않음, 중복 된다.

--사원집합의 deptno는 부서집합과 1:n관계로 추가된 컬럼인데 이것을 외래키라고 한다.

SELECT count(deptno) FROM emp WHERE deptno = 30;

SELECT count(deptno) FROM emp WHERE deptno = 10;

SELECT distinct(deptno) FROM emp;

SELECT emp.ename, emp.sal, emp.hiredate, dept.dname
  FROM dept, emp
 WHERE dept.deptno = emp.deptno;
 
SELECT emp.ename, emp.sal, emp.hiredate, deptno
  FROM emp;



SELECT deptno FROM dept
MINUS
SELECT deptno FROM emp;

DELETE FROM dept WHERE deptno =:x;

SELECT * FROM dept WHERE deptno=50;

--executeUpdate():int

UPDATE dept
  SET dname='개발부'
     ,loc='제주'
WHERE deptno = 50; -- executeUpdate(update문-처리):int -> 1row updated

-- if(result ==1) 수정에 성공하였습니다. else 수정에 실패하였습니다. - 응답

DELETE FROM dept WHERE deptno=:x;

데이터베이스(오라클) 서버와 연동(자바)하기

데이터베이스(오라클) 서버와 연동(자바)하기

java.sql.* - 로컬

javax.sql.* - 멀티티어 , 3-tier - 웹서비스
서버 미들웨어 클라이언트
서버의 부담이 크다 - 중간에 미들웨어(서버)
서버가 2개 이상이니까 보안상 유리

JDBC API를 사용하지 않는다. 
- ORM솔루션(iBatis, MyBatis) - query문이 있다. - 웹개발부터는...
- Spring(Hibernate) - query문이 없다. - DB연동이 된다.

백엔드
DB연동 - 관계형, (문서형, 그래프), NoSQL, json형식갖는 데이터베이스
RDBMS - 오라클, MySQL, MS-SQL, 포스트그레이

오픈API활용하기 - 구글 클라우드, 네이버오픈API(네이버개발자센터), 카카오API(카카오개발자센터) - API제공, 백엔드 코드 리뷰

오라클과 연동하기 위해서 필요한 인터페이스
1)java.sql.Connection - getConnection()

2) java.sql.PreparedStatement 
: executeQuery():ResultSet - 커서 이동
: executeUpdate():int - commit, rollback- 실제 테이블에 변화를 가져옴

3) java.sql.ResultSet - next(), previous(), absolute(5), isFirst(), isLast()
isLast()-isFirst() - row count

왜 interface인가? - 설계 -> 클래스 간의 결합도를 낮추는 코드 작성할 수 있도록 설계하시오.
인터페이스 중심으로 코딩을 전개하는 것 - > 다형성을 누릴 수 있다.
재사용성과 이식성을 높이는 코드를 작성할 수 있다. - 자바다(메모리 약점)


인터페이스는 단독으로 인스턴스화 할 수 없다.

List list = new List();
List list = new ArrayList(); //선언부와 생성부가 다르다.
달라서 같은 이름의 메소드를 호출 하더라도 다른 기능을 구현할 수 있다. - 다형성

Duck myDuck = new MallardDuck();
public MallardDuck(){
	FlyBehavior flyBehavior = new FlyWithWings();
              flyBehavior.fly();//나는 날고 있어요
}


Duck hisDuck = new RubberDuck();
public RubberDuck(){
  flyBehavior = new FlyNoWay();
  flyBehavior.fly();//나는 날지 못합니다.
}


Duck himDuck = new WoodDuck();

ZipCodeSearchForm.java에서 MouseListener 기능 추가

 @Override
    public void mousePressed(MouseEvent e) {
        if(e.getClickCount() == 2){
            int[] index = jtb_zipcode.getSelectedRows();
            int zipcode = (Integer)dtm_zipcode.getValueAt(index[0],0);
            String address = (String)dtm_zipcode.getValueAt(index[0],1);
            System.out.println(zipcode +", "+address);
            msForm.jtf_zipcode.setText(String.valueOf(zipcode));
            msForm.jtf_address.setText(String.valueOf(address));
            //this.dispose();
            this.setVisible(false);   


day19 2024-11-01-금

수업 진도

  • src.classes.design.B1Main.java -> 객체 선언과 생성
  • src.classes.design.Duck.java -> 추상 클래스와 인터페이스
  • src.classes.design.FlyBehavior.java -> 상속보다 결합도를 낮춰준다
  • src.classes.athread.talk3.LoginForm -> 클라이언트 서버에 도움
  • 이클립스에서 athread.talk3 가동하기
  • 디버깅 능력 -> 로그 정보 출력 하기

추상 클래스와 인터페이스

  • 모두 단독으로 인스턴스화 할 수 없다
  • 역할: 클래스 설계 -> 코드를 읽어내는 능력을 좀더 키워야 함
  • 필요 능력: 자동화, 효율성(재사용성, 이식성)
    • OOP 사상 : Object-Oriented Programming
    • 데이터와 메서드를 객체로 캡슐화하여 프로그램의 모듈성, 재사용성, 유지보수성을 향상시키는 방법론
  • B1 b1 = null;
    • 비어있다 -> 아무것도 참조하지 않는다 -> 객체가 아직 아니다!!
  • 생성자 사용
    • main() 안에서 생성된 객체의 주소번지를 다른 생성자에서 사용할 수 있다
    • 원본 파라미터를 넘겨 받음으로써 가능함 - 얕은복사
  • 인터페이스 사용은 클래스 사이의 결합도를 낮추어주는 방법
    • 인터페이스가 갖는 메소드는 모두 추상메소드
    • 그러나 추상클래스는 일반메소드도 있고 추상 메소드도 있음
    • 그래서 abstract을 생략할 수 없음
  • 인터페이스가 추상 클래스보다 더 추상적이다 : 생성자도 가질 수 없음
    • 인터페이스는 반드시 구현체 클래스를 가져야 한다 - 기능 처리
  • design.Squeak/QuackBehavior/MuteQuack -> 오버라이딩, 오버로딩 복습

LoginForm: 서버 소켓

  • 백엔드: 전처리, 후처리가 중요
  • 회원가입
  • 로그인 이벤트 발생 -> 인터셉트 -> 권한 인증하도록 하기 (보안 관련)
  • 서버: 이벤트 처리, 오라클DB 연동, 멀티스레드, 쿼리문 DML
  • 쿼리문 DML 수행하는 클래스 따로 만들기 -> Dao
    • StringBuilder로 쿼리문 작성
    • 파라미터 2개 id, pw -> varchar(String)
    • 리턴타입 하나 -> nickname(String)
    • 리턴타입이 여러개 -> List 사용

이클립스 프로그램 설정

  • Window - Preferences
    - Conten Types - 맨아래 Default encoding: <UTF - 8> - 오른쪽 업데이트

  • 이클립스에 외부 라이브러리 ojdbc6 코드 추가하기


day20 2024-11-04-월

생성파일

  • src.jdbc.book -> BookApp.java, BookDiglog.java, BookVO.java (lombok 사용)
    • 오라클DB 생성: book152 table -> BookDao.java : 쿼리문 작성 DML
  • src.athread.bubble- 7교시) 프로젝트 도움-채팅창 좌우/

DB Primary key

  • 제약조건 : 1) not null 2) unique
  • 화면 정의서에서 ERD를 설계한다
    • 화면 정의서: 타입, 명사형(자바 필드에서 변수로 -> VO(data set)

VO

  • Value Object, 값 객체
  • 원시 타입과 구분하여 객체 간의 역할을 구분하게 한다
  • 불변성: 수정자가 없다(Setter) - 공유시 사이드이펙트 발생x
  • 값 동등성
  • 자가 유효성 검증

lombok 설치

  • intellij -> 이미 설치됨

  • eclipse -> 구글 maven repository 에서 lombok 최신 설치

  • intellij에서 lombok 사용 가능하도록 설정

외부 라이브러리 intellij에서 불러오기

CRUD 구현하기

  • Create, Read, Update, Delete의 앞글자를 따서 만든 약어
  • 데이터베이스나 데이터 저장소에서 데이터를 처리하는 기본적인 기능

ER win 설정

DDL

  • 새로운 테이블을 생성할 때, 기존 테이블 변경, 기존 테이블을 삭제
  • CREATE, ALTER, DROP, TRUNCATE

오라클 문법

  • LIKE : 구간 검색, 부분검색, range scan
    ex) select * from book152 where b_info LIKE '%'||'머신러닝'||'%';
  • COMMIT을 해야 물리적인 테이블에 데이터가 반영됨
    • COMMIT을 하면 ROLLBACK이 안됨
  • in java
    • rs = pstmt.executeQuery(); -> select
    • executeUpdate() -> insert or delete or update
      ==> 모두 int 타입
    • 쿼리문을 보고 파라미터와 리턴타입을 결정해야 한다
profile
computer sight

0개의 댓글