day21 2024-11-05-화
생성 파일 및 수업 진도
- jdbc.book.BookDaoTest : 오라클 자바 연동 단위테스트 메소드 구현 ㅇㅇ (ui없이 출력으로만 확인)
- select, delete, insert
- athread.bubble.Chat 4개 .java -> 채팅메시지 버블모양
도서 목록 조회 시스템
시퀀스 만들기
- 아무리 에러가 나고 사람이 많이 들어오는 경쟁이 심한 상황에서 순서대로 들어오도록 해줌
- 채번이 막 올라가서 건너뛸 수도 있긴함

-> 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로 책 검색하기
경로
네이버 개발자 센터
-> 어플리케이션 등록 -> 검색
-> 아이디: 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의 대상
메신저프로젝트에 대한 질의
- 스레드와 각 소켓 사이드
- 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(); -싱글톤 패턴
<일반적인 싱글톤 패턴>
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
왜 필요한가?
- 현대 웹어플리케이션은 다양한 기능을 갖춘 여러 파일로 구성되어있음
- 이를 하나씩 불러온다면 로딩 속도가 느려지고 사용자가 불편함
-> 파일을 번들로 묶어 배포함으로써 파일 로딩을 최소화해서 성능을 향상시킴
웹 어플리케이션 만들기
- 그 과정에서 프로그래밍이 무엇인지 배워본다
- 어플리케이션이란?
- 입력된 데이터를 가지고 ...필기 삭제됨..;ㅎ
이후 오후 수업
- 메신저 프로젝트 -> 회원가입 및 아이디중복검사 만들기(힘들다..^^)