day11. 2024-10-22-화




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



자바 설치 (2번째 프로그램)
SQL 제품 <-> NoSQL(모바일.., 경량DB)
RDBMS(오라클, MySQL, MS-SQL Server, DB2) -> PL/SQL 표준을 따름
저장프로시저(프로그래밍-배열, 구조체지원), 함수도 지원
(함수형 프로그래밍이 요새 유행)
-> 금융, 공공부분, 보험, 물류, 회계 - 사회에서 사라지지 않는!
옵티마이저- 일꾼
DBA 쪽 분야도 취업하기 좋다~ - DB설계 : 개발 경험이 없다면 쫌?! - 눈에 보이지 않는 컬럼을 찾아내야 함. 2년 정도 근무 - 프로젝트 4-5개 하니깐 이후 진로결정 추천
오라클 11g1qjs - 관리자권한으로실행 설치 (DB암호: abcd1234, SID: orcl11)
Toad 설치
ER-WIN --> DB설계 -> EBD산출물
day12. 2024-10-23-수



설계: 필요한 정보를 사용하기 위해 정의, 접근 등
삼항 연산자: [조건식 ? 반환값1 : 반환값2]

(TimeServer1.61열)
class Dept >> 
class ArrayDept2 >>

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

1) 클래스마다 전체적으로 보기
2) 이후 구성요소 파악해보기 > 손으로 써보기
3) 클래스 테스트 순서 : 호출되는 순서 >> 흐름따라가보기(JVM)
4) 몇번 라인이 실행되는지
SYS 쓰면서 확인해보기
5) 클라이언트 실행 시켰을때 언제 넘어가는지도 확인해보기
List<String> list2 = new ArrayList<>();
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
}
}
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);
}
}
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
}
}
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);
}
}
}
day14. 2024-10-25-금
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

-------------------------------------------------------------------------------
day15. 2024-10-28-월. 병원 피검사로 오후 조퇴
멀티스레드는 하나의 공간을 여러명이 공유 - Vector - 그래서 느리다
싱글스레드는 하나의 공간을 한명이 쓰니깐 빠르다 - ArrayList
인터페이스는 단독으로 인스턴스화 할 수 없다 - 반드시 구현체클래스가 필요하다
학습 순서: 변수-배열-객체배열-리스트-맵-세션과 쿠키
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()
}
}
불가-> 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-화
SELECT '전체' zdo FROM dual
UNION ALL
SELECT zdo
FROM (
SELECT
distinct(zdo) zdo
FROM zipcode_t
ORDER BY zdo asc
);
day17 2024-10-30-수요일
DefaultTableModel dtm_zipcode = new DefaultTableModel(data,cols); //데이터셋 담당
JTable jtb_zipcode = new JTable(dtm_zipcode);
JTableHeader jth = jtb_zipcode.getTableHeader();
- 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();
@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-금




day20 2024-11-04-월
intellij -> 이미 설치됨
eclipse -> 구글 maven repository 에서 lombok 최신 설치

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


