학습 day21-day25

Hanna·2024년 11월 8일

KOSMO 24.10~25.03

목록 보기
3/12

day21 2024-11-05-화

생성 파일 및 수업 진도

  • jdbc.book.BookDaoTest : 오라클 자바 연동 단위테스트 메소드 구현 ㅇㅇ (ui없이 출력으로만 확인)
  • select, delete, insert
  • athread.bubble.Chat 4개 .java -> 채팅메시지 버블모양

도서 목록 조회 시스템

  • DB 연동

    • DBConnectionMgr/Connection/PreparedStatement -> INSERT UPDATE DELETE : 한번쓰고 끝남 - 지변으로 사용
    • ResultSet -> SELECT일때만 필요 : next()사용 - boolean 타입(if/while문 연결)
      • 1 row ->xxxVO 에 담는다 / n개의 row -> List<xxxVO>에 담는다
    • con/pstmt/rs : interface -> override 해서 사용: 그 클래스가 구현체 클래스가 된다
  • 객체 선언

    • A a = null; //타입만 결정
    • A a = new A();
    • A a = new B(); //다형성
    • A a = B.getInstance();
      ex) con = dbMar.getConnection(); //인터페이스 -> 메소드의 형태로 객체 생성
  • 오라클 자바 연동 -> 단위테스트 메소드 구현

    • BookDaoTest
    • ui없이 할때는 변수 말고 상수로 넣어서 하자~
  • 예외 주의

    • SQLException se -> sql문 출력된 경우 : 오라클에 복붙해서 부적합한식별자(오타)문제인지 확인 (엉엉)

시퀀스 만들기

  • 아무리 에러가 나고 사람이 많이 들어오는 경쟁이 심한 상황에서 순서대로 들어오도록 해줌
  • 채번이 막 올라가서 건너뛸 수도 있긴함

-> BookDao의 bookInsert()의 sql에 넣을듯

인터페이스 중심의 코딩 설계 - Duck 코드 리뷰

  • src.classes.design.duck_sim
  • day15 -> 상속 메모/ day18,19 -> 인터페이스 메모 참고
  • 왜 interface인가?
    • 클래스 간의 결합도를 낮춘다 -> 각각이 독립적 (1메소드, 1기능) - 코드 설계
      • 상속: 결합도 높음, 의존적이다 > 사이드이펙트 등이 여기서 발생
    • 인터페이스 중심으로 코딩을 전개하는 것 -> 다형성을 누릴 수 있다.
      • 다형성: 선언부, 생성부가 다름 -> 같은 이름의 메소드를 호출 하더라도 다른 기능을 구현할 수 있다.
    • 재사용성과 이식성을 높이는 코드를 작성할 수 있다. - 자바다(메모리 약점)
  • 인터페이스는 반드시 구현체 클래스를 가져야 한다 - 기능 처리
    • 인터페이스가 갖는 메소드는 모두 추상메소드이기 때문에!
  • 추상클래스는 일반메소드도 있고 추상 메소드도 있음
  • 추상메소드 이점이 뭔가? - OCP 원칙
    - 개방-폐쇄 원칙(OCP, Open-Closed Principle)
    : 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다

    (출처: https://url.kr/ihhdew)

다형성

  • 선언부, 생성부가 다름 -> 같은 이름의 메소드를 호출 하더라도 다른 기능을 구현할 수 있다.
    • 이때, 1)선언부가 상위클래스, 생성부가 하위클래스 2)하위클래스가 상위클래스를 상속하고있음-메소드 사용위해서
  • 그렇지 않는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워짐
  • 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음
    (참조: velog.io/@ldevlog/06.-다형성과-다형성을-사용하는-이유)

day22 2024-11-06-수

수업 진도

  • Book.package 이어서~!
  • 삭제 : BookApp.deleteAP() : ui에서 사용자가 선택한 자료에 삭제 수행
  • 상세조회 : BookApp.detailAP() : 선택한 자료에 대해 상세조회 창 띄워서 상세 정보 보여주기
  • BookDialog.setEditable() : 팝업창 - 입력/수정 - 변경 가능, 상세조회 - 변경 불가능 메소드
    • set()에 넣어 파라미터로 추가해준다. -> BookApp에서 입/수/상 반응 소스에 파라미터 입력
  • 입력: 빈 팝업창 - BookApp.insertAP() & 저장 - BookDialog.actionPerformed()
  • 수정 (각자 알아서) : 상세조회 + 저장 소스 기능 -> 단! 기존 로우의 정보가 바뀌도록

in xxxVO class

  • setXXX() : 쓰기 및 저장 -> private으로 정의된 변수에 쓰기 -return 없음
  • getXXX() : 읽기 -> 앞에 타입이 옴. return 타입이 있다
  • 프로그램의 기능: 입력,처리,출력,시각화

BookDialog에 BookApp의 DB 넘겨주기

  • BookVO에 DB가 들어있음
  • 어떻게 넘겨줄까??
    --> BookDialog.set()의 파라미터로 선언하자!!!!!
    • BookApp에서 set() 호출하면서 파라미터로 BookVO 넣어줌으로써 주소번지 원본을 넘겨준다

MVC - 화면과 로직을 분리하자

  • mdn MVC 검색
  • M : Model (DB연동, 업무처리)
  • V : View (BookApp, BookDialog)
  • C : Control

개발패턴, 방법론 - 개발 설계 FLOW CHART

  • 저장 : BookDialog -> BookDao(bookInsert-insert문) -> BookDialog(닫힘) -> BookApp(새로고침-select문)
    • QUERY : INSERT INTO book152 VALUES(seq_book152_no.nextval,?,?,?,?,?) -> ? 5개
      -> 사용자가 입력한 것 받아야 하니깐
    • pstmt.setString(1,"책제목"); pstmt.setString(2, "저자"); pstmt.setString(3,"출판사"); pstmt.setString(4,"책소개"); pstmt.setString(5,"책이미지");
      -> 5개의 파라미터 -> BookVO pbvo의 파라미터
    • 1 or 0의 리턴타입 - executeUpdate()가 ㅇㅇ (입력,수정,삭제)
  • 수정 : BookDao(getBookList(b_no)-1건-select문) - BookDialog(저장) -> BookDao(update문) -> BookApp(새로고침-refreshData()) : DB 2번 방문
    - 저장 프로시저 사용
    - QUERY : UPDATE book152 SET b_name = ?, b_author = ?, b_publish = ?, b_info =?, b_img=? WHERE b_no =?
    --> pstmt.setString(1,"책제목"); pstmt.setString(2, "저자"); pstmt.setString(3,"출판사"); pstmt.setString(4,"책소개"); pstmt.setString(5,"책이미지"); pstmt.setString(6,5);

    각각의 코딩은 chatGPT가 해준다 그러나 병합연결이 안된다 - 개발자가 할 일

  • 상세조회 : BookDao(getBookList(b_no)-1건-select문) - BookDialog(출력만 하면 끝)
  • 삭제 : BookApp - BookDao(delete문) - BookApp(refresh문 호출 - select문)
    • QUERY : DELETE FROM book152 WHERE b_no =?
  • 전체조회 : BookApp - BookDao(select문)
  • 조건 검색 고려
    • QUERY : SELECT b_no, b_name, b_author, b_info WHERE b_no =?

day23 2024-11-07-목요일

이번주 학습 목표

  • 자바와 오라클의 연동 (이종간의 연계 서비스)
    • CRUD 목표(입력,수정,삭제,조회)
    • 화면과 로직(업무)을 분리하자 - MVC 과거의 출발점
      • VIEW & MODEL(데이터+처리(알고리즘)) 계층
    • UI와 연계해서 처리해보기 - MVC 패턴 숙지

수업 진도

  • src.jdbc.book
  • Book : 이미지 띄우기, 상세조회-저장버튼 없애기_hanna, 파일찾기 버튼
    • 파일찾기 -> 이미지 미리보기 -> 저장하기
  • 검색기능 추가하기 : ZipCodeSearchForm 참조 --------------------> 직접해보기
  • 네이버 개발자 & PostMan --> 검색기 만들어보자~! (계정: jhn구글
  • openAPI.naver.ApiExamSerachBook.java -> 네이버 검색 API로 책 검색하기

경로

  • .\src
  • 상대경로 :

네이버 개발자 센터

-> 어플리케이션 등록 -> 검색
-> 아이디: 3jSgRUOwXoRCXhmVcvtp 비번: xHgPPEWIzB

네이버 검색 API 예제 - 책 검색

  • 통신 검색기 만들기
    • 소켓 : Http xhdtls (Web)
      1) Restful API (get, post) <-> Naver 연결 ==> Web 방식
      - get은 여러번 호출하더라도 결과가 같다
      2) http 프로토콜 통신 - 상태가 유지되지 않음
  • 웹에서 URL주소 에러 -> 클라이언트 아이디랑 비번을 같이 넘겨줘야 한다. - Header가 받아야함
    • Postman에서는 잘 구동 - Headers에 아이디랑 비번 넣어주었기 때문에
  • 뭔가 잔뜩 만들었는데 뭘까 몰라! 일단 설명...

Map

<-> BookVO

  • Map<(key), (value)>
    • key는 String 타입만 가능하다
    • value는 Object 타입이면 모두 가능하다 - 원시형 타입 불가
    • int -> Integer, double -> Double로 원시형의 wrapper클래스가 있음
    • value에 원시형 타입 입력해도 wrapper클래스로 자동전환됨 : 오토박싱
      ex) map.put("key1",1) -> "1"로 자동 전환된다.
  • table에서 1개의 row 정보를 담는다 (1건)
    • 단, key가 있어서 중복되면 안된다 (타입은 String)
    • value는 Object
  • List<Map> -> n건 : for문 등 반복문으로 담아서 처리한다

JSON

  • <key, value> 형태 - 검색에 많이 사용??

문법

  • int의 Object형 : Integer
  • 화면 배치
    • GridLayout : 위 아래로 배치
    • BorderLayout : 좌우로 배치

라이브러리 추가

  • intellij에 추가하기 (from Slack)

day24. 2024-11-08-금요일

수업 진도

  • src.jdbc.book
  • Book 검색 기능 추가
    • BookVO : gubun, keyword 변수 추가
    • JComboBox에 반응할 ItemListener I 추가 <- gubun
    • BookDao.getBookList에 조건절 if문 추가 : gubun에 일치하는 keyword 담은 데이터 뽑기
  • Book에 네이버 검색 추가하기: 버튼 추가 -> 새로운 팝업창에서 검색기능 BookNaverSearch
  • BookNaverSearch : JComboBox 두개 추가 - 시작위치, 검색결과 수 설정 -> ItemListener 인터페이스 사용
  • src.athread.step1.KiwiServer : 스레드의 역할 -> 단톡방 만들기
  • src.athread.step1.Protocol -> 단톡방 만들기
  • src.athread.step1.Room -> 단톡방 만들기

Book DB 연동

 SELECT (       ) FROM (집합)
    WHERE b_name 
    WHERE b_author
    WHERE b_publish
    WHERE b_no (pk)
  • DML : DATA -> SELECT/UPDATE/DELETE/INSERT -> COMMIT/ROLLBACK의 대상
    • 모두 int 타입

메신저프로젝트에 대한 질의

  • 스레드와 각 소켓 사이드
    • thread를 문제로 내주신 것인가? -> 아니다
    • 파라미터, 생성자, 리턴타입 쓰는 것 등이 문제이다 지금은 스레드 상관없다
      (스레드의 문제는 대화처리 하면서 동시에 타임서버를 운영하는 경우)
  • 여기서 스레드는 무슨일을 하나?
    • public void run(){}을 처리하는 역할 -> 서버측에서 전송한 문자열을 청취
    • 순서에 맞게 안전하게 진행되도록 도움
  • 스레드 이해

단톡방 만들기

  • athread.step1.Kiwi -> 테스트 코드군 작성

day 25. 2024-11-11-월

생성파일

  • basic.collection.List1.java
  • basic.collection.Map1.java --> 복습

지금껏 무얼 해왔나 - JAVA

  • MVC 패턴 -> 클래스 나누기 연습(생성자, this 사용 권장)
  • 오라클 연동
  • JDBC API 활용하기 - 이종간 연계서비스
  • 테이블 구조 이해
  • 연습 필요 부분
    • NoticeVO, NoticeVO[], List, List<Map<String,Object>>를 자유롭게 사용
    • 세로방향 : int[], String[], ...double 등

DBConnectionMgr : 드라이버 연결 공통 코드

  • 메소드를 통해서 객체 주입 받기
  • 메소드 안에서 인스턴스화 한다 - if문 사용가능 in 메소드
    • null 체크를 할 수 있고, null인 경우만 인스턴스화를 한다
  • DBConnectionMgr dbMgr = DBConnectionMgr.getInstance(); -싱글톤 패턴
    • DB 연결을 서비스(로그인, 상세정보 등)을 실행할 때마다 DB 연동을 위해 연결을 하는 것이 아니라, DB 연결을 공유하여 재사용성을 높이기 위한 것이다.(https://velog.io/@minjee98/JAVA-싱글톤-패턴)
<일반적인 싱글톤 패턴>
  
static DBConnectionMgr dbMgr = null;
   public static DBConnectionMgr getInstance(){
        if(dbMgr == null){
            dbMgr = new DBConnectionMgr();
        }
        return dbMgr;
    }

```java public final static String _DRIVER = "oracle.jdbc.driver.OracleDriver"; //ojdbc6.jar -> 오라클 public final static String _URL = "jdbc:oracle:thin:@localhost:1521:orcl11"; public final static String _USER = "scott"; public final static String _PW = "tiger"; ``` - _DRIVER : ojdbc6.jar -> 오라클 라이브러리가져오기 - _URL : 물리적으로 떨어져있는 서버와 연결통로 1) thin 드라이버 방식 - 멀티티어 2) oci 드라이버 방식 - 로컬
  • Connection con = dbMgr.getConnection(); -> null이면 NPE 발생
    • ojdbc6.jar를 buildpath에 추가해나?
      - ClassNOtFooundException 발생
    • URL 오타찾기 (orcl11)
    • port 번호 틀린 경우
    • 쿼리문 에러 -> SQLException 처리 - 부적합한 식별자
  • final : 변수를 상수로 취급하게 함

통신 try-catch 후 자원반납

  finally{ 
            dbMgr.freeConnection(con, pstmt, rs);
        }
  • 생성된 역순으로 해준다 - 생략하면 처리는 되지만 명시적으로 처리하는 것 - 자바튜닝
  • 예외가 발생하더라도 무조건 실행이 되어야만 하는 것

java에서 CRUD 수행 -> Auto Commit 된다

-> commit 하지 않으려면 con.setAutoCommit(false) 이용

앞으로의 진도

- 백엔드 : java
- 프로트엔드 :
   - html + css3 + javascript(이벤트처리), 
   - nodejs(웹서비스 이해와 개요[Restful API, 쿠키] 
   - express 플랫폼), reactjs
- 개발도구 : VSCode

- 파이썬 & 크롤링 수업
- 시각화
- 빅데이터 분석
- 머신러닝
- 딥러닝
- 강화학습
- 자연어 처리
--------------
- 트랜스포머
- 컴퓨터 비전

nodejs 설치

  • v22.11.0 -> 7z으로 설치 -> C:로 옮겨서 실행
  • 터미널 에디터 Cmder 설치 : https://url.kr/pih4a6 따라하기 -> <Cmder 컨텍스트 메뉴 추가> 까지 수행

번들러란?

  • 여러개(html, css, javascript, 이미지 ...)의 파일을 하나의 파일이나 몇 개의 파일로 합쳐주는 도구
  • 복잡한 어플리케이션을 효율적으로 관리하고 배포하는 데 도움
    ex) parcel
    왜 필요한가?
  • 현대 웹어플리케이션은 다양한 기능을 갖춘 여러 파일로 구성되어있음
  • 이를 하나씩 불러온다면 로딩 속도가 느려지고 사용자가 불편함
    -> 파일을 번들로 묶어 배포함으로써 파일 로딩을 최소화해서 성능을 향상시킴

웹 어플리케이션 만들기

  • 그 과정에서 프로그래밍이 무엇인지 배워본다
  • 어플리케이션이란?
    • 입력된 데이터를 가지고 ...필기 삭제됨..;ㅎ

이후 오후 수업

  • 메신저 프로젝트 -> 회원가입 및 아이디중복검사 만들기(힘들다..^^)
profile
computer sight

0개의 댓글