Servlet  

서블릿이 요구하는 구현 규칙을 지켜주면서 서블릿을 정의해주면
http 요청 정보를 쉽게 사용할 수있고 처리결과를 쉽게 응답으로 변환 할 수 있다.

서블릿을 이용해서 웹요청을 다루게되면 개발자들이 진짜 집중해야할 비지니스 로직에 더 집중할 수있다.

서블릿이 생성되면 init메서드가 호출되고 소멸될때는 destroy()메서드가 호출된다.
서비스는 요청을 처리할때 호출이 되는 메서드다.

 

서비스의 로직수행: Get요청이 들어오면 doGet메서드를 호출하고
Post요청이 들어오면 doPost 메서드가 호출된다.
doxxx를 찾아 재정의해주는것

서비스 메서드만 재정의해서 처리 방법을 지정한다.

 


서블릿 컨테이너와 서블릿이 호출되는 과정
서블릿컨테이너 : 서블릿을 담아 관리하는 바구니
사용자 요청이 들어오면 서블릿 컨테이너는 해당요청과 매핑된 서블릿을 찾는다.

설정파일에 정의가 되어있다. 
/hello라는 요청이 들어오면 HelloServlet이라는 서블릿으로 처리하겠다

이 설정을 서블릿 컨테이너가 읽어서 어떤 서블릿이 필요한지 알게되면
서블릿 인스턴스가 컨테이너에 있는지 확인한다.

인스턴스가 컨테이너에 존재한다면 그 인스턴스를 그대로 사용한다.
없으면 생성해서 사용 ( 아까 서블릿의 init()메서드가 호출된다)

 

서블릿객체는 소멸되지 않고있다가 다음번 같은 요청이 들어왔을때 
서블릿 컨테이너에 의해서 또 호출되서 사용된다.
서블릿 컨테이너는 서블릿의 생명주기를 관리한다

1. Servlet Request/ Servlet Response 객체생성
2. 설정 파일을 참고하여 매핑할 Servlet을 확인
3. 해당 서블릿 인스턴스 존재 유무를 확인하여 없으면 생성 init()
4. Servlet container 에 스레드를 생성하고 res,req를 인자로 service실행

만약 여러 요청이 들어온다면 ?
스레드당 다른 서블릿이 처리할 수있고 여러스레드에서 한 서블릿의 여러 요청을 동시에 처리할 수있다.


Dispatcher Servlet이 web요청을 처리하는 과정

디스패처 서블릿은 모든 요청을 다받고 핸들러매핑이라는 애가 내 요청을 처리할때 
컨트롤러를 찾아서 반환하고 핸들러어뎁터는 그 컨트롤러의 메서드를 호출해서 처리로직을 수행

 

스프링으로 웹요청 :
스프링 mvc에서 제공하는 디스패처 서블릿과 웹 요청처리 관련 구현체들을 사용할 수있다
스프링 컨테이너 (스프링 Ioc)를 사용해서 개발 할 수 있다.
개발자로 하여금 핸들러, 요청처리 로직들에만 신경 쓸 수 있다.

콘텐트에 이미지가 보인다면 저장할필요없다. 콘텐트에 경로를 입력할것이기때문에

컬럼이들어간건 별도의 첨부파일만 씀

파일즈 : 파일이 여러개 올라갈수있다

파일의 목록을 구분자로넣어서 파일하나를 다룬다

시퀄보다는 자바라던지 제어문으롲 ㅣ워야한다 

장점 :삽입할때편하다


여러개파일일경우는 ?

여러개파일을 업로드 하는경우는 ?

하나의값만받음
배열로받음


파일을 두개이상 보낸다면 ?

같은이름으로 보내도된다 name = f


하나의 파일즈컬럼에 두개의파일을 담을것

한 열에 파일두개를 등록할것

쉼표를 이용해서 두개의 파일을 디비에 등록

총 12글자(길이)에서 11글자만넣어야하므로 -1해준것


파일을 전달하지않으면 에러발생 널이전달

 


내가 한 게시글에서만된다

forTokens는 문자열을 쪼갠다. 쪼갠문자열을 반복한다

하이퍼링크가 두번반복될것
첨부파일이름을 클릭하면 다운로드된다.

데이터베이스는같이쓰지만 웹서버는 각각다르므로 다른사람의 첨부파일을 클릭하면 404에러가난다

자기웹서버의 디렉토리에있으므로..


라스트가 아닐경우에만 포함


인덱스로적용

3개가 조회된다 (0~2)


파일명에 마우스오버하면 절대위치가보인다. 어드민인지 확인할것


아티클쓰는 중간에 저장하려면 

페이지내에서 화면이뜬다

드래그드랍으로 업로드

.

정규화 :

정규화1,2,3을 외우는게아니라 느낌으로 속성만보고 구별,의심이 가야함
중복제거

1정규화란 ?
하나의 컬럼값만 넣어야한다. (원자성)
특정컬럼이 두개이상 가질 가능성이있다면 중복유발
속성중에 2개이상 들어갈 수있는것 ? 

ex : 댓글내용,댓글등록일자
공지사항입력할때 제목은 하나만 넣는가 ?
작성자 이름은 하나만 넣는가 ?
댓글이 여러개 달릴 수있는가 ?

컬럼은 방이다. 
댓글컬럼이 늘어난다면 ? 100개의 댓글컬럼을 만들겠다 -> X  
컬럼은 유동적이지않다. max값을 생각해야함
연회장처럼 하객에 따라 써야함
데이터는 수직으로늘려야한다.
ex 댓글 : 공지사항과 같은 테이블에 담아야한다면 공지사항의 아이디,제목,작성내용이 중복발생한다.

공지사항 - 댓글

1:N형태

위반되는컬럼떄문에 다른컬럼의 중복이 발생한다

컬럼이 2개이상 가질가능성이있다면 업무자에게 물어봐야한다.

ex 업무자가 원테이블식당이라고하면 테이블번호는 1정규화위반이 아니다.


3정규화

아이디가 달라져도 형태,지역명은 이전데이터가 쓰인다. ( 아까 넣은 데이터가 또 들어가는것)

올드한데이터중복

 

3정규화위반 : 작성자이름,작성자연락처,등급

앞의 레코드를 다음에넣을때 또 넣을 수있는 가능성찾기

첨부파일용도가 정해진 키워드라면 3정규화위반가능

2정규화 :

부분 함수 종속성을 없앤다

작성자에 대한 정보가 필요하면 참조.

 

 

설계란 ?
 내가 말하고싶은것을 그린것(디자인)

IT기술에만 국한해서 생각하지말것

 

 

개념설계 :

ER 다이어그램

 

논리설계 :

관계형 ,테이블형태 (공통분모형태)

 

물리설계: 

물리적으로 DBMS선택해야함

실질적으로 물리적 공간에 저장하기위해 각각에 대해 정의



키의 종류
1. 주키(primary key) : 식별키,일련번호, 아이디
2. 후보키 : 기본키 처럼 식별용으로 쓸 수 있는 키
3. 대체키 : 후보키에서 기본키 이외의 키

4. 슈퍼키 : 2개 이상의 컬럼이 모여 기본키로 사용

5. 외래키 : 두 테이블을 서로 연결하는 데 사용되는 키

 

키의 종류

- 실선(Identifying): 식별관계

-> 부모 테이블의 기본키를 자식 테이블이 가지고 있으며 이를 기본키로 사용하는 경우

-> 부모가 있어야 자식이 생기는 경우

ex) Issue 테이블과 IssueComment 테이블이 있을 경우, IssueComment는 Issue가 존재해야지만 있을 수 있음

 

- 점선(Non-Identifying): 비식별관계

-> 부모 테이블의 기본키를 자식테이블이 가지고 있지만 이를 기본키로 사용하지 않을 때 

-> 부모가 없어도 자식이 생기는 경우

ex) User 테이블과 Process가 있을 경우, User가 담당 프로세스가 있다고 하더라도, Process는 User없이도 존재할 수 있음

 

정규화 : 

normalization 표준화,정상화

무결성 -> 데이터 중복제거
중복이 발생하는 패턴에서 중복제거

1정규화 : 모든 도메인이 원자값으로만 이루어져야만 한다. 
    도메인 : (유효한) 값의 범위

              ex이메일 : 123 (X)
    원자값 : 하나의 값만 이루어져야만 한다. 

              ex기업고객의 아이디가 하나만

속성을 봤을때 1개가 만들어갈지 n개가 들어갈지 또는 n개까지인지 찾아보기.

1개만 받는다면 원자값 , 여러개면 원자값이 아니다.

(전화번호 여러개인지 ?, 설립일이 여러개인지 ? )

 

1정규화 위반되는것 찾기 (테이블로뽑을지, 구분자로 구분할지선택 )
*노하우 - 이미지
*일기- 키워드
*공지 - 파일

관계표현


3정규화

아까들어갔던 내용이 계속 들어가는것(ex 여고괴담처럼 자꾸 졸업앨범에나타남)

 

책임자이름,매니저이름,매니저연락처,매니저이메일  ->중복제거 (자식을만들어야함)

올드데이터 : 미리있어야하는것이므로 별도 테이블 생성 ->외래키가 늘어나게된다. 

3정규화

 

일정이 새로생겨도 분류는 기존것이 그대로 사용된다.

 

설계할때는 한글로쓰기 (영어를 쓰면 의미가 왜곡될 수있다.)

회원 - 구매 - 상품 (n;n )

한 회원이 여러개의 상품을구매할 수있다.

한 상품이 여러 회원에 의해 구매된다.

식별자 : 언더라인

 

속성,관계고치기

 

사용자행위로서의 관계

사용자구성으로의 관계

 

행위자, 행위, 키 구분

-반려동물을 선택한 후에 일정이뜬다면 구성

-댓글은 행위. 기존에 있던것에 대한 행위. 노하우,일기에 대한 댓글

-노하우가 있어야만 댓글이 달릴 수있다. (키가 될 수 없다)

-좋아요도 행위, 대상이 될 수없다.

-회원이 여러 노하우글에 댓글을 달 수있다.

-노하우에 여러회원들이 댓글을 달 수있다.

좋아요는 행위다.
회원 - 좋아요 -리뷰 (n : n)

회원 - 댓글 - 노하우 

회원 -친구(신청) : 바로신청되는모습

논리 : 테이블형태 (공통분모형태)
물리설계: 물리적으로 DBMS선택해야함
탭으로왔다갔다

데이터베이스 모델링

 

테이블정하기

속성쓰지말고

테이블명으로 사용할수있는것들

 

메뉴를 뽑는게아니라 역할을 뽑아야한다

 

쇼핑몰에서의 역할자

 

회원이 등록하는 대상

개인정보,

장바구니,

 

 

비회원이 등록하는 대상[데이터베이스 모델링]

DBMS 종류
-RDBMS, OODBMS, ...

RDBMS : Relational DBMS
관계형 DB 

무결성 : -> 데이터 중복을 제거하는 방식으로 -> 파일(뷰)-> 쪼갬(집중화) -> 테이블

사용할 때는 :
테이블 -> 합쳐서 (뷰)-> 파일

테이블을 합칠 때 기준?
객체지향DB, RDBMS:관계

관계가 무엇인가요?
: 행위를 말한다.


주어(테이블) 동사(행위:관계) 목적어(테이블)

[회원:주어]이 [게시글:대상]을 등록[행위:관계]하다.


[제일 먼저 해야 할 가이드 1]
주어를 찾는 것.==주체를 찾는 것==행위자를 찾는 것==역할자를 찾는 것

사람수 != 역할자수

---------- ICODA를 보면서 이 사이트에서의 역할자를 찾으시오 ---------
회원
비회원
관리자
판매자

------ 역할자를 찾았으면 등록이라는 행위를 하게 되는 대상을 찾으시오.-----
-회원(이) [  ]를 등록하다.

관심상품 X : 회원이 상품을 등록하진않는다.

행위는 두개넣지말기

 

-관리자(이) [  ]를 등록하다. 

판매자관리

-판매자(이/가) [  ]를 등록하다. 

 

 

------ 위의 문제에 대한 리뷰 -------------
회원이 등록
- 회원정보 (주소, 이름, 전화번호,,)
- 장바구니 (X) ==> 등록하다에 어울리는 대상은 아님  ~에 "담다"를 말하는 행위에 더 어울림
- 관심 상품  ==> 합성어는 단위를 쪼개서 처리해야 함. 행위를 명사에 붙여서 표현하면 모든 것이 대상이 될 수 있음.
- 상품 평
-           상품정보 ==> 정보라는 어휘는 생략하는 것이 바람직함.
- 상품 문의 (질문) 

<가이드>
1. 합성어는 분리하고 분리한 어휘에서 행위는 제거하시오.
2. 정보라는 단어는 제거하시오.
3. 그 후에 남은 어휘가 등록이라는 대상에 어울리는지 확인하시오.
4. 속성명은 그것의 구조화된 데이터로 변경하시오.

-------------------------------------------------------------------
회원이 [글]을 등록하다.
관리자가 [이벤트/공지사항/배너광고] 등록하다.
판매자는 [상품]을 등록하다.

 

데이터베이스 설계

개념설계

논리설계

물리설계

 

개념설계(Concept..)

Entity-Relation 

 

키를 뽑는다.

관계를 찾는다. (등록, 수정, 다른동사 찾기)

 

등록이 데이터가쌓이거나, 삭제내역이쌓이면,조회내역이쌓이면(레코드가 쌓이면) ->데이터베이스에 관계표시

임시데이터는 데이터베이스를 사용하지않는다.

 

 

[ 회원 ]이 [ 배너광고 ]을 [ 조회 ]하다



=== < 리뷰 > =========================================================

행위를 뽑아서 보면… 다음과 같은 것들을 체크해야 한다.

 

  1. 업무적으로 다루는 내용인가.
  2. 행위가 데이터를 누적하는가? 추가로 누적되는 데이터가 없다면  관계로 보지 않는다..

예) 수정/삭제 -> 위키를 아시나요? 위키에서는 글을 수정하면 누가?언제?무엇?..을 저장해요. 그러면 이렇게 수정된 내역이 추가된다면 그것은 관계로 간주한다.

관계는 데이터베이스에 등록되는 것만을 대상으로 한다.

  1. 위의 내용을 만족하기는 하나 데이터를 별도의 파일이나 저장소를 이용하는 경우는 데이터베이스의 관계에서 제외된다.

 

데이터베이스를 사용하지 않고 다른 저장소를 선택하는 기준이 있느냐?

  • 임시 데이터
  • 수정/삭제/등록 과 같은 조작을 수반하지 않고 읽기 전용 데이터를 기록하는 경우



[판매자]가 [상품]을 [등록/수정/삭제/조회]하다.

[회원]이 [상품]을 [구매//조회/평가]하다.

[관리자]가 [상품]을 [등록/수정/삭제/조회]하다

 

조인은 평상시쓰는것이므로 연습해야한다

 

VIEW

뷰: 멀리볼수도, 작게볼수있는 보고싶은대로 테이블단위

실질저장모델은 아니지만 , 그모양자체를 하나의 다른이름으로 사용가능,코드를 단순화시킴

수정,삭제,업데이트불가, 조회(읽기)전용의 테이블형태이다. 1.복잡한쿼리간단하게, 2.사용자가들이 볼수없게 가림

CREATE VIEW NOTICE_VIEW21 
AS 
SELECT N.ID, N.TITLE, N.WRITER_ID, N.REGDATE, N.HIT, N.FILES, M.NAME WRITER_NAME, COUNT(C.ID) CMT_COUNT
FROM NOTICE N 
    LEFT JOIN MEMBER M ON N.WRITER_ID = M.NICNAME 
    LEFT JOIN "COMMENT" C ON N.ID = C.NOTICE_ID 
    GROUP BY ROWNUM, N.ID, N.TITLE, N.WRITER_ID, N.REGDATE, N.HIT, N.FILES, M.NAME;

SELECT * FROM NOTICE_VIEW21 
WHERE ROWNUM BETWEEN 1 AND 10 
ORDER BY REGDATE DESC;

 

SELF JOIN

자기가 자기자신을 조인

데이터가 서로 포함관게를 가지는 경우 : 담당,구성,연락

EX 게시글의 댓글이 댓글이참조하는경우

참조키가 다른테이블이아니라 자기것

참조키는

SELECT M.*, B.NAME BOSS_NAME 
FROM MEMBER M
    LEFT JOIN MEMBER B ON B.NICNAME = M.BOSS_NICNAME;

 

SELECT M.*, B.NAME BOSS_NAME, B2.NAME B2_NAME 
FROM MEMBER M
    LEFT JOIN MEMBER B ON B.NICNAME = M.BOSS_NICNAME 
    LEFT JOIN MEMBER B2 ON B2.NICNAME = B.BOSS_NICNAME;

B2.NICNAME (부모)= B.BOSS_NICNAME;(자식)

자식이 부모를 참조하는 형식 

 

부모가 자식을 참조할수없음 

 

CROSS JOIN

실무에서 쓰일일이 적음

 

조인대신 서브쿼리사용

그동안 조인해서 그룹바이 집계

부모의 컬럼을 추가할땐 조인해서 컬럼추가했었다.

컬럼을 가져와야할 경우 컬럼추가시 조인하지않고도 가능하다

 

서브쿼리로 간단히 가능

 

INNER JOIN (교집합)

문장암기할것

-결과물 총 28개

-멤버 : 25개

-노티스 : 45개

노티스가 멤버의 NICNAME을 참조하고있다.

SELECT * 
FROM 
    MEMBER INNER JOIN NOTICE 
    ON MEMBER.NICNAME = NOTICE.WRITER_ID;

 

OUTER JOIN (합집합)

OUTER도 포함시키는 조인

OUTER(관련없는 것)

부모테이블의 아우터,

자식테이블의 아우터 각각 존재가능

 A의 모든 열 더하기 B에 있는 공통부분

 

LEFT OUTER JOIN 

멤버의 모든열 + 노티스에 있는 공통부분

SELECT * 
FROM 
    MEMBER LEFT OUTER JOIN NOTICE 
    ON MEMBER.NICNAME = NOTICE.WRITER_ID;

6개 만들어진다

RIGHT OUTER JOIN 

NOTICE의 모든열 + 멤버에있는 공통부분

SELECT * 
FROM 
    MEMBER RIGHT OUTER JOIN NOTICE 
    ON MEMBER.NICNAME = NOTICE.WRITER_ID;

노티스의 이너3개+아우터2개 = 5개

FULL OUTER JOIN 

A와 B의 합집합

8개

JOIN은 중요하므로 익숙해져야한다.

필드이름의 충돌문제

두개의 테이블을 합칠경우 컬럼이름이 중복될 수있다.

별칭을 붙여서 사용할수있다.

SELECT N.ID, NAME 
FROM 
    MEMBER M INNER JOIN NOTICE N 
    ON M.NICNAME = N.WRITER_ID;

 

INNER JOIN의 특징 : 

모든회원이 조회되지않고, 글쓴회원만 조회된다.

SELECT M.NICNAME, M.NAME, COUNT(N.ID)
FROM 
    MEMBER M INNER JOIN NOTICE N ON M.NICNAME = N.WRITER_ID
    GROUP BY M.ID, M.NICNAME ,M.NAME;

from에있는걸 먼저 집계한후 진행

 

3개 테이블 조인하기

SELECT N.ID, N.TITLE, N.WRITER_ID, M.NAME WRITER_NAME ,COUNT(C.ID) CMT_COUNT
FROM 
    NOTICE N 
    LEFT JOIN MEMBER M ON N.WRITER_ID = M.NICNAME 
    LEFT JOIN "COMMENT" C ON N.ID = C.NOTICE_ID
    GROUP BY N.ID, N.TITLE,N.WRITER_ID, M.NAME;

자식과합치면 부모가 2,3개씩 늘어난다.(중복발생)

집계해야만 자식을 내 레코드에 껴넣을수있다.

 

페이징시 WHERE절 필요

 

 

stanleykou.tistory.com/entry/SQL-INNER-%EC%A1%B0%EC%9D%B8%EA%B3%BC-OUTER%EC%A1%B0%EC%9D%B8%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94

수정페이지 흐름

1.edit.jsp에서 form태그의 action을 "edit"으로 method는 "post"로 지정

 

2. 동일 url을 갖고있는 EditController.java와 맵핑

사용자가 입력한 id,title,content가 notice객체 담겨 update함수의 파라미터로 전달된다.

사용자에게는 sendRedirect에 연결된 detail페이지가 보여진다.

3. NoticeService.클래스에 update()메소드를 생성한다.

가져온 notice객체를 파라미터로 받는다.

sql문에는 수정될 항목에 = ? 를 넣는다.

?를 넣을 수있도록 PreparedStatement객체를 만들고

notice.getTitle()로 제목을 불러온뒤 setString에 넣는다.

결과값은 excuteUpdate()를 이용해 담는다.

수정한  내용 저장하기

NoticeServiece.java에서  update()에{ } sql,url, forname, connection  복사붙여넣기

CreateStatement 대신 PreparedStatement사용

Update/Delete/Insert는 executeUpdate()사용

 

수정->저장을 누르면 상세내역에서 저장된 내용이 보인다.

등록페이지만들기

<form action="URL">

폼 데이터(form data)를 서버로 보낼 때 해당 데이터가 도착할 URL을 명시

 

edit.jsp복사해서 reg.jsp만들기

list.jsp에서 글쓰기버튼만들기

reg.jsp  / list.jsp

 

사용자가 저장을 누르면 post된다.

등록처리만 하는 컨트롤러필요

redirect 가 다시 목록페이지로간다

콘솔창에 에러가없었는지확인할것

SQL오류가 발생

현재로그인한 정보를 넣어야하는데,

일단 자기계정넣기

 

삭제하기기능

doget요청할것

Select : executeQuery(sql)

Update , Insert, Delete : prepareStatement(sql)


조인(join) : 테이블을 하나로 합치는것

참조:관계형, 참조해서 합쳐서쓴다

 

멤버가있어야 글을 쓸수있다.

멤버 데이터 -> 등록하는 행위

 

참조되는녀석 : 부모

참조하는 녀석 :자식

FROM에는 테이블외에 격차형이 올수있다.

 

사용자가

1.목록페이지를 본다

2. 클릭하면 자세한내용이 나온다 (detail.jsp) 

3. 자세한페이지에 수정버튼, 삭제버튼이있다

 

제목,내용 수정할 수있게해보자.

수정할 수있는 상태를만들기

id에 해당하는 수정페이지

detail.jsp

detail.jsp를 복사한다.

제목 value에 자바코드를 넣는다.

내용 textarea태그를 만들고 안에 콘텐트를 불러온다.

<td colspan="3"><input type ="text" name="title"value="<%=notice.getTitle() %>"></td>
<tr>
<td colspan="4">
<textarea rows="20" cols="80"><%=notice.getContent() %></textarea>
</td>
</tr>

edit.jsp

<%=id%>

detail.jsp?id=<%=notice.getId()%>">취소</a>


sendRedirect

서블릿이 다른 서블릿을 요청할 수있게한다.

사용자가 저장을 눌러서 '업데이트처리'한테 post했지만 detail.jsp를 사용자에게 돌려준다.

 

jsp로만들면 <%%>코드블럭부담 + 제스퍼이용, 업데이트는 서블릿으로하는게 낫다

디테일jsp에 출력기능이 다있다. redirect로 detail.jsp에게 출력기능을 부탁한다.

 

  • 새로운패키지생성 controller.lecture
  • EditController 클래스생성
  • edit.jsp에서 보낸 <form action="edit" method="post"> , <textarea rows="20" cols="80"><%=notice.getContent() %></textarea>를 받을수 있게 준비한다.
  • name = "title"을 넣어 value="" 가 전달되게한다.
  • <textarea>태그에도 name을 넣는다

id는 자바스크립트로 값에 접근하는데 사용,

name은 jsp에서는 request.getparameter(name); 이렇게 값에 접근

editcontroller / edit

업데이트시 특정레코드만 수정하는거니까 id가 필요하다.

edit.jsp에 <input>태그에 숨겨서 보낼 수있다.

<input type="hidden"name="id" value="<%=id%>">


service.get(id);

editController.java

 

NoticeService.java

  • NoticeSerive.java에 update(Notice notice) 메소드 생성
  • 제목,내용,조회수,첨부파일 등  업데이트가 될 수있다.
  • sql을 한문장으로 쓸 수있게한다. 범용으로 쓸 수있는 update().
  • service.get(id);를 통해 해당id에 대한 데이터를 채워놓은상태에서 title,content를 다른값으로  대체할수있다.
notice = service.get(id);

조회수만 업데이트된다면 나머지는 null값을 가진다. -> 데이터를 DB에서 가져와서 업데이트한것만 바꾼다음에 널을 채운다. (sql에 업데이트 가능한것들을 한번에 나열)

수정할 것만 채워서 전달하면 나머지는 null이 채워지고 ->업데이트 후 기존데이터가 null이 된다.

넘겨지지않은 부분을 채워야한다.

So, EditController클래스에서

Notice notice = new Notice();로 새로운 객체를 생성하지말고

Notice notice = service.get(id);로 기존의 데이터를 가져온다.

 

1.IF문

2. FOR문자체를 줄이기

1. if문으로함

상세내역만들기

페이지연결

 1번째 게시물의 제목을 누르면 상세내역으로이동

 

컬럼안에서도 헤더역할이있다.<th>

colspan = 3 전체중에 3칸차지해

 

목록으로 돌아갈수있게 하이퍼링크넣기 "list.jsp"
게시글마다 다른 아이디값부여

 

글 목록에 마우스를 대면 하단에 주소값이 바뀌는것이보인다

페이지별 id부여

jsp에서 id요청 , java에서 get(id)메소드만들기

list.jsp에서 실행할것


detail.jsp화면
목록에서클릭한 내용에 콘솔에출력된다

SELECT 구절

SELECT / WHERE/ GROUP BY / HAVING/ ORDER BY

 

내장함수

-문자열관련함수

-변환함수

-날짜함수

-NULL 관련함수

-집계함수

 

SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY , ASC ,DESC (무조건외우기)
  • 집계한결과쓸때는 HAVING
  • FROM 에는 격자형태 결과물이오면된다
  • ROWNUM: 결과집합에 대한 가상의 순번
  • 쿼리문 작성순서와 실행순서가 다르다.

WHERE절과 HAVING절의 차이

  • WHERE절은 모든 레코드(행)에 대해서 조건을 적용한다.
  • HAVING절은 GROUP BY절을 통해 만들어진 GROUP들에만 조건을 적용한다.
    WHERE절에 집계함수 못씀.

 

실행순서 :

WHERE절끝나면 ROWNUM생기고 정렬(번호를붙이고 정렬하니까 순서엉망)

 

정렬하고나서 번호를 붙여야 한다. 정렬을 끝내고(안쪽FROM) 로우넘버를 다시붙이자

NOTICE 테이블에서 제목에ㅔ 'a'가 들어간것을 등록일 날짜기준으로 내림차순

조회한것을 n 이라고 명명

n을 ROWNUM으로 1~5개 만 출력

 

결과화면 / 정렬을 먼저하고 ROWNUM붙여 실행


숫자함수

  • ABS(n) : n의 절대값을 반환
  • CEIL(n) , FLOOR(n) : n보다 같거나 큰 정수를 반환한다
  • ROUND(n,i) : n을 소수점 i+1번째 자리에서 반올림
  • TRUNC(n,i) : n을 소수점 i+1번째 자리에서 버림
  • POWER(n1,n2) : n1을 n2번 거듭제곱한 결과
  • MOD(n1,n2) : n1을 n2로 나눈 나머지 값

문자함수

  • INITCAP(char) : char의 첫문자만 대문자 나머지 소문자
  • LOWER(char) : char를 소문자로
  • UPPER(char) : char을 대문자로
  • CONCAT(char1, char2) : char1 char2를 붙인다.
  • SUBSTR(char, pos,len) : char의 pos번째 문자부터 len길이만큼 잘라서 반환.
  • LTRIM: char1의 좌측부터 char2를 찾아서 삭제후 반환 (한번만 삭제한다.)
  • RTRIM: LTRIM과 비슷. 오른쪽부터 검색을 진행
  • LPAD(char1,n,char2) : char1의 왼쪽부터 char2를 채운다. n은 연산후 총 문자열 자릿수를 의미한다.
  • RPAD(char1,n,char2)  : LPAD와 비슷 , 오른쪽부터 진행
  • REPLACE(char1,char2,char3) : char1에서 char2를 찾아 char3을 반환한다. LTRIM과 달리 여러번 진행한다.
  • LENGTH(char) : char의 길이
  • DECODE(input1, search1 , result1, search2, .. ,default) :  input1을 search1과 비교하여 같은 값이면 result1을 반환하고, 같지 않을 경우 search2를 비교하는 방식을 반복한다. 최종적으로 같은 값이 없으면 default를 반환한다.

날짜함수

  • SYSDATE : 현재 시스템 일자 반환
  • ADD_MONTHS(date,int) : date에 int 수 만큼 월을 더한 날짜 반환
  • MONTHS_BETWEEN(date1,date2) : date1을 기준으로 두 날짜 사이의 개월 수 반환 
  • LAST_DAY(date) : date의 월말일 반환
  • ROUND(date, format) : format에 따라 반올림한 날짜 반환
  • TRUNC(date,format) : format에 따라 잘라낸 날짜 반환
  • NEXT_DAY(date,char) : date기준으로 char에 명시한 요일의 날짜를 반환

변환함수

  • TO_CHAR(char or date , format)  : 숫자나 날짜를 format에 맞는 문자로 변환                                                                                  ex) to_char(sysdate , 'YYYY/MM/DD'), to_char(12345, 'L9,999.99')
  • TO_NUMBER(char,format) : data를 format에 맞는 숫자로 변환
  • TO_DATE(char, format) : char를 format에 맞는 날짜로 변환
  • TO_TIMESTAMP(char,format) : char을 format에 맞는 타임스탬프로 변환

NULL 관련 함수

  • NVL(input1,input2) : input1이 null이면 input2를 반환
  • LNNVL(조건식) : 조건식의 결과가 false이거나 unknown이면 true를 , true이면 false를 반환한다.
  • NULLIF(input1, input2) : input1과 input2가 동일한 값이면 null을 아니면 input1을 반환한다.

 

SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 1 AND 5;
SELECT SUBSTR ('HELLO',1,3) FROM DUAL;--인덱스는0부터,3개 HEL
SELECT SUBSTR ('HELLO',3) FROM DUAL; --3부터 나머지 LLO

SELECT * FROM MEMBER ORDER BY NAME DESC;--이름을 기준으로 역순으로 정렬해서조회
SELECT * FROM MEMBER WHERE NAME LIKE '박%' ORDER BY NAME;--회원중에서 박씨성을 가진 회원을 조회하시오, 오름차순으로정렬(ASC생략가능)
--이름이 같을경우 닉네임으로 정렬하자 2차정렬이필요할때
SELECT * FROM MEMBER ORDER BY NAME ASC, NICNAME DESC;--이름오름차순, 이름이같다면 닉네임으로 내림차순정렬
--일별,월별조회수,회원수집계 등 ->집계함수,분석
SELECT COUNT(*) FROM NOTICE; --게시글의 전체수조회. NULL이들어간건 제외된다.되도록 식별자를넣기
SELECT COUNT(ID) FROM NOTICE;
SELECT COUNT(ID),WRITER_ID FROM NOTICE GROUP BY WRITER_ID;--작성자별 게시글 수 조회
SELECT COUNT(ID),WRITER_ID FROM NOTICE GROUP BY WRITER_ID ORDER BY COUNT(ID) DESC, writer_id ASC;

UPDATE MEMBER SET GENDER = '여성' WHERE ID =21;
COMMIT;

SELECT COUNT(ID),GENDER FROM MEMBER GROUP BY GENDER;--ID를 통해서 개수를 구한다.성별기반. 성별로 카운트조회

UPDATE MEMBER SET BIRTHDAY = 19881215 WHERE ID = 21;
COMMIT;
--생년월일에서 년도만잘라내서 YEAR이라는 컬럼을만들고 년생을 오름차순으로정렬
SELECT COUNT(ID),SUBSTR(BIRTHDAY, 1, 4) YEAR 
FROM MEMBER 
GROUP BY SUBSTR(BIRTHDAY, 1,4) 
ORDER BY YEAR ASC;

--회원별 게시글수를 조회(단,게시글 수가 2미만 레코드만출력) 집계함수조건 HAVING
SELECT COUNT(ID),WRITER_ID FROM NOTICE GROUP BY WRITER_ID HAVING COUNT(ID) < 2;
--최신등록순으로 정렬한 결과에서 상위 열명을 원하는 경우조회
SELECT*FROM ( SELECT*FROM MEMBER ORDER BY REGDATE DESC) WHERE ROWNUM BETWEEN 1 AND 10;
--나이가 30이상인 회원목록조회(순서를 바꾸거나 먼저계산해서 실행)
SELECT*FROM MEMBER WHERE AGE > = (SELECT AVG(AGE) FROM MEMBER);
--보조쿼리,서브쿼리 먼저실행 안쪽에별칭만들어 쓰기
SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE)
WHERE NUM BETWEEN 6 AND 10;

--등록일자를 기준으로 역정렬, N:결과집합이름, TITLE에 A가들어간것
SELECT * FROM (
    SELECT ROWNUM NUM, N.* 
    FROM (
        SELECT * 
        FROM NOTICE 
        WHERE TITLE LIKE '%a%'
        ORDER BY REGDATE DESC
    ) N
)
WHERE NUM BETWEEN 1 AND 5;
--where title like'%a%'

 

 

더보기

집계한결과쓸때는 HAVING

11:15다시

FROM 에는 격자형태 결과물이오면된다

 

SELECT * FROM NOTICE ORDER BY REGDATE DESC;

전체조회 중 파란색부분만 출력해보자.

SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 1 AND 5; 

ROWNUM으로 가상의순번으로 집계되어있다. 

ROWNUM: 결과집합에 대한 가상의 순번


최신등록순으로 정렬한 결과에서 상위 열명을 원하는 경우조회하려면 ?

1.잘못된 쿼리 : ROWNUM이 순차적이지않다.

ROWNUM이 순차적이지않다

2. 순차적이지않은 ROWNUM에서 5개를 뽑은셈

쿼리문 작성순서와 실행순서가 다르다.

 

실행순서 :

WHERE절끝나면 ROWNUM생기고 정렬(번호를붙이고 정렬하니까 순서엉망)

 

정렬하고나서 번호를 붙여야 한다. 정렬을 끝내고 로우넘버를 다시붙이자

SELCT * FROM (SELECT ROWNUM NUM, N.* FROM ( SELECT * FROM NOTICE ORDER BY REGDATE DESC) N) WHERE NUM BETWEEN 1 AND 5;

결과집합 별칭은 AS쓸쑤없음
NOTICE. 생략가능 

roeldowney.tistory.com/332

bloodfinger.tistory.com/46

docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#:~:text=SQL%20functions%20are%20built%20into,functions%20written%20in%20PL%2FSQL.

패턴을 만들어야하는경우가 생긴다. 

전화번호패턴, 이메일패턴

 

[ ] 감싸져있을때 : 또는

1또는 6 또는 7 또는 ..

\d :숫자 문자에 대응됩니다. [0-9]와 동일합니다. (소문자 d)

\D : 숫자 문자가 아닌 문자에 대응됩니다. [^0-9]와 동일합니다.

\d : [0-9]과 같다

\d{3,4} 숫자3개 또는4개

가운데번호가 3또는 4자리

앞뒤에 다른기호가들어갈때 불일치하게하려면

^01[016789]-\d{3,4}-\d{4}$

번호앞뒤에 알파벳이붙어도 match가 뜬다. 

^ : 시작

$ : 끝

번호앞에 a를쓰면 no match가뜬다


 

[a-zA-Z]\w*: 첫글자가 대소문자,영숫자,0개이상,
\w 밑줄 문자를 포함한 영숫자 문자에 대응됩니다. [A-Za-z0-9_] 와 동일합니다. 
* 앞의기호가 0이상 , 앞의 표현식이 0회 이상 연속으로 반복되는 부분과 대응됩니다.
{0,} 와 같은 의미입니다
+ 앞의기호가 1이상, 앞의 표현식이 1회 이상 연속으로 반복되는 부분과 대응됩니다. {1,} 와 같은 의미입니다
? 앞의 표현식이 0 또는 1회 등장하는 부분과 대응됩니다. {0,1} 와 같은 의미입니다.

 

[a-zA-Z]\w*@[a-zA-Z]\w*.(com|net|org)

 

Q. 제목에 전화번호가 포함된 게시글을 조회

REGEXP_LIKE (TITLE, '01[016789]-\d{3,4}-\d{4}');


그동안 조회시 전체목록이나왔다. 게시물이 1억개라면 1억개가 조회되는것

->페이징필요

회원목록에서 상위 5명만 조회하시오

생ㄺ됐던것
5개만 뽑아줘

ROWNUM범위를 바꾸면 조회가 되지않는다..

ROWNUM은 실행해야 만들어진다

ROWNUM이 5이상나올수가없다.

BETWEEN 6 AND 10 은 조회가안된다

ROWNUM은 실행해야 만들어진다

developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions

www.regextester.com/

lee-mandu.tistory.com/48

 

MVC 방법론 :

m,v,c를 각 자르는것

 

NoticeService

-getList() retirm getList("title","")

-getList(f,q)

========================
사용자 입력
=========================

GET 요청에 쿼리스트링을 전달하는 예제
검색 : 
-f / q -> 전달 -> request.getParameter("f");

NoticeService
-getList(){ return getList("title", "");}
-getList(f,q){f와 q를 이용한 검색 쿼리를 작성하는 문제0}

ORACLE 2Step
연산자(산술,비교,관계)와 패턴연산자, 정렬, 집계

-산술연산
-- +, -, *, /
- || 

- 비교연산
-관계연산
-패턴연산

 

홑따옴표로 문자열표현 ' '

다르다 : !=, ^=, <>

UPDATE NOTICE SET HIT = 10 WHERE ID = 21;--조회수업데이트
COMMIT;
UPDATE NOTICE SET WRITER_ID ='김영화' WHERE WRITER_ID ='TUE';--사용자ID명을 이름으로바꿈

SELECT 3 || 10 FROM DUAL;--310
SELECT NAME || ID FROM MEMBER;--김영화21
SELECT NAME || '(' || ID || ')' AS NAME FROM MEMBER;--별칭으로조회
SELECT * FROM MEMBER ORDER BY ID;--ID로 정렬하기
--SELECT ID AS MEMBER_ID, NAME, PWD AS PASSWORD FROM MEMBER;--원하는 컬럼을 원하는 별칭으로조회
--SELECT ID "USER ID", NAME, PWD PASSWORD FROM MEMBER;--AS생략가능, 빈공간""로 묶기
SELECT * FROM NOTICE WHERE WRITER_ID = 'newlec';--''안에 대소문자구분
SELECT * FROM MEMBER;
SELECT * FROM NOTICE;

SELECT * FROM NOTICE WHERE HIT > 3;
SELECT * FROM NOTICE WHERE CONTENT IS NULL;--NULL인것조회
SELECT * FROM NOTICE WHERE CONTENT IS NOT NULL;

SELECT * FROM NOTICE WHERE HIT = 0 OR HIT = 1 OR HIT = 2;
SELECT * FROM NOTICE WHERE 0 <= HIT AND HIT <= 2;--조회수 1~2까지

SELECT * FROM NOTICE WHERE HIT BETWEEN 0 AND 2;--조회수 1~2, 암기할것
SELECT * FROM NOTICE WHERE HIT IN (0,2,7);--조회수 0,2,7결과조회

SELECT * FROM NOTICE WHERE HIT NOT IN (0,2,7);--반대,여집합조회 0,2,7이 아닌것찾아라
--패턴연산자
SELECT * FROM MEMBER WHERE name LIKE '박%';--회원중에서 박씨성을 조회,(사용x->NAME = '박%'; 정확한 박%를찾는다.)
SELECT * FROM MEMBER WHERE NAME LIKE '박_';--언더바는 길이제한, 박씨이고 이름이외자인 회원조회

SELECT * FROM NOTICE WHERE TITLE LIKE '%i%';--i가들어간 제목조회, '%I' 로 끝나는

qh5944.tistory.com/41

velog.io/@underlier12/Servlet-JSP-09-%EC%83%81%ED%83%9C-%EC%9C%A0%EC%A7%80%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95

velog.io/@underlier12/Servlet-JSP-09-%EC%83%81%ED%83%9C-%EC%9C%A0%EC%A7%80%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95

[자바 백엔드 프로그래밍]

자바언어 + 플랫폼을 이용한 실현

웹 플랫폼
-서블릿
-- HttpServlet을 상속 받아서 service 함수를 구현하는 것이 전부
-- 추가적인 도구로써 입/출력 도구 : request, response
-- 상태저장의 필요성 때문에 준비된 도구 : 상태저장이 안되는 이유는 서블릿간의 생명주기 문제로 ...
   상태저장 도구 : application/session/request/pageContext/queryString
-서블릿의 문제점
--서블릿은 doGet/doPost를 주로 서비스 하는 프로그램인데 대부분은 GET 요청을 처리하는 서비스이다.
--그래서 주로 출력하는 코드가 HTML을 출력하는 코드가 대부분이다. 이런 문제로 단순반복적인 코드가 많아지게 되어서...
   그것을 도와주는 도움자가 필요하게 되었다.
-JSP

 

코드블럭

-기본블럭 <% 자바문법 %>

-정의블럭 <%! %>

-출력블럭 <%= %>

-사전지시자블럭 <%@ %>

 

오라클

오라클이란 ? DBMS 제품 중하나

DBMS 는 ?

DB?

DDL/ DML / DCL

DML 명령어 :INSERT/SELECT/UPDATE/DELETE

 

JDBC

-Native Library ->JDBC

-JDBC의 구성

-connection / statement/resultSet

-Driver 로드하는 방식도..

-데이터 쿼리하는 코드

-데이터 쿼리하는 코드를 재사용하기 위해  클래스로 분리

-MemberService구현

-getList()메소드를 구현

 

WEB(JSP)에서 JDBC 라이브러리 사용하여 DB연동하기


엔티티만들기 

1. entity 패키지에 Notice클래스를 만든다

2. service패키지에 NoticeService클래스를 만든다

3. Notice클래스에 변수를 먼저 넣어준후, 마우스오른쪽-source->기본생성자,매개변수사용하는 생성자, toString메소드, getter and setter를 만든다.

4. NoticeService클래스에서 List<Notice> getList() ~~ 클래스이름을 넣어준다.

   sql :클래스이름을 넣어준다.

5. 멤버변수를 불러온다.

 

 

서비스구현시 : 서버가 동시에 여러명접속하게하는데 한계가있다. 동시접속자를 늘리려면 요청-연결-종료해줘야한다.

자동으로 끊기긴하지만 연결종료, statement와 resultSet을 닫아준다.

마지막엔 연결종료를한다. 기억하기.

연결을 끊어줘야한다. ->성능개선 WRITER_ID

 

사용자가입력한 값을 서버에 출력해보자.

select name=f와 input name q가 주소창에 전달되어있다.

사용자에의해 검색값이 눌려지면 get요청이된다

 

사용자가 옵션을 선택->검색을 입력하면 ->서버창에 뜬다.

 

action = "" 누구한테 요청할 것인지 ,입력받은내용을 누구에게 요청할지를 정함(생략가능)

action =""을 생략하면 자기자신에게 요청할것으로 정함

 

 

getList()함수를 기본함수, 오버로드함수 각각 만든다.

public List<Notice> getList() throws ClassNotFoundException, SQLException{

return getList("title","");//기본값
}
public List<Notice> getList(String field,String query) 

두개의 컬럼을 하나로 합칠수있어야한다

오라클연산자

 

 

UPDATE NOTICE SET NAME ='김영화' WHERE NICNAME ='TUE';

COMMIT;
SELECT * FROM MEMBER;

SELECT HIT + 1 FROM NOTICE;
SELECT 1 + 1 FROM DUAL;--2
SELECT '1' + 1 FROM DUAL;--2
SELECT 'A' + 1 FROM DUAL;--수치가 부적합합니다,A는 숫자변환불가
SELECT '1' + 1 FROM DUAL;--2
SELECT '1' + 1 HIT FROM DUAL;--별칭생성
SELECT 3 || 10 FROM DUAL;

업데이트 후 커밋하기.

웹개발

자바 ->서블릿->JSP->오라클->JDBC->JSP->Collection

 

가변길이배열

util import
기능은같은데 내부적으로사용하는방법이 다르다, 운영방법이다르다.

Arraylist : 연결결됨, 배열, 중간데이터삽입,삭제시 전항목에 대해 이동명령이 필요

LinkedList : 끊어져있음.링크

 

자료구조 : 성능을 고려하면 중요할수있다.

구조가 어떤모양, 어떤것을 취하는것이좋은지, 장단점알고있기

 

set은식별자가없다.

자바에서의 모든객체는 부모를두지않아도 (extends 안해도) object를 상속한다.

newlecExam은 3가지 형식으로 참조할수있다.

숫자는 참조될수없다.

object는 참조형식

참조형식은 공간이있나요 ? 

참조 : 주소

건물에 주소가있다. 창고에도 주소가있다.

참조형식에 주소를 기록할수있다.

축구공에 주소가있나? no ,값형식(숫자3)은 축구공과비슷

숫자3 자체가 주소를갖고있지않기때문에 참조변수에 참조시킬 수 없다.

 

값 형식 : 변수가 을 담는 데이터 형식. 참조 형식 : 변수가  대신 이 있는 곳의 위치(참조)를 담는 데이터 형식. ... 이 메모리 영역 중 값 형식과 관련이 있는 것은 스택 메모리 영역이고, 참조 형식과 관련 있는 것은 힙 메모리 영역이다.

 

3에 알맞는 클래스로 감싸줘야한다 (박싱)

wrapper클래스

수많은 다른자료형을 한번에 관리할 수있다.

 

학생데이터 :학생만

사원데이터 : 사원만

자료형 한정
담고자하는것을 자료형에맞게 사용가능 / list.add("hello") 오류
<>쓰면 요즘방식 : 한종류만 담을때 generic형식으로
일괄적으로 값을뽑아낼수있게 foreach등장

 

add를 6개이상했지만 중복된값이있다면 size가 6미만으로나올수있다.

중복제거에 효율적

 

list:가변길이

 

Map :속성,값 (자바스크립트의 오브젝트)

SQL의 구성3가지 ?

1. 데이터정의 DDL : create / alter/drop

2. 데이터조작 DML : select / insert/update/ delete

3. 데이터제어 DCL : grant/ revoke(허가)

 

기존코드분리

출력을 분리하자.

웹이든,콘솔이든 재사용하기위해 

 

데이터를 가져오는 코드는 재사용이 가능한 코드인 반면 콘솔 출력이나 입력부분은 다른 ui를 구현할 때까지 재사용이 용이하지않으므로 데이터쿼리를 위한 코드를 부닐해서 재사용하도록 하면 어떨까 ?

 

안돼면 오라클에서 검색해볼것

String sql = String.format("SELECT * FROM MEMBER WHERE NICNAME='%s'",nickname);

사용자가 입력한 값 넣기

String sql = "SELECT * FROM MEMBER WHERE NICNAME="+"'"+nickname+"'";
String.format("SELECT * FROM MEMBER WHERE NICNAME='%s'",nickname")

 


가변크기배열

객체를만들고 담아야한다.

Member member = new Member();

member.setId(id);

member.setName(nicName);

member.setPwd(pwd);

이건 0번째만 입력하는것

생성자만들거나 member객체 생성 후 setter에 대입하기

사용자가 요구하는것을 제공

사용자:"업무자

업무자가원하는 데이터를 만들어주는 서비스

클래스를 impot하는것 클래스명에만 빨간줄이생긴다

기존에작업한 list.jsp파일에 자바코드를 넣어주고

import를 해준다. (ctrl + space누르면 자동 import구문이 추가된다)

원래는 패키지명을 적어줘야하지만 import해주면 빠르고 정확하다

배포되는 라이브러리를연결해줘야한다

우리가한것 :이클립스에서한것

기존에 클래스패스가 필요했었다. 

저작업이 톰캣이필요하다.

관련된 jar를 실행되는 톰캣한테 알려줘야하는데 다른컴퓨터에서 실행될것

내 노트북에있는 경로 jar파일이이라 오류

나중에 실행하는 톰캣한데 "C:"를 알려줘야하는데, 다른컴퓨터에 돌아가는톰캣

 

경로만알려주면 내노트북에있는경로니까 컴파일할수없다.

jar파일이 컴퓨터에같이있어야한다.

웹은 라이브러리도 같이배포되어한다

ctrl+c , ctrl+v

 

 

JDBC란 ?

라이브러리,Java database connectivity

 

무슨라이브러리 ?

자바로 데이터베이스를 이용하기위한 라이브러리

 

Native Library(ex, 오라클용,mySQL용 etc) / JDBC + JDBC Library(native대신..)

                                                        JDBC+구동코드

 

배운것에대해 용어정리부터하기

 

App -> JDBC -> JDBC driver ------ > DBMS ->DB

         - 인증하기위한 라이브러리 (connection)

         -실행하기위한 클래스 (statement)

         -결과집합(resultset)

 

 

객체생성 :로드

(oracle.jdbc.OracleDriver");이 읽혀지는순간

static생성자가 실행된다.

전역변수를 초기화하는 static생성자에서 driver를 등록한다

 

 

1.객체가만들어짐 (초록색), 드라이버매니저에다가 오라클드라이버를 생성해서 등록해놓은상태

2. 연결시도 , 서버주소 객체를 얻어낼수있다DriverManager.getConnection(사용자 계정정보);

3. 문장실행

4. 결과집행 : resultSet은 하나의 공간을가지고있다.

5.스캐너와비슷, 다음것내놔

6. 넥스트에서가져온것중 하나의 행에서 타이틀컬럼만

새로운녀석이 유효하면 트루

회원이 1억명이라면 1억번을 반복해서 자바에서 1개의자료만쓴다면 비효율적

SQL에서 애초에 조건문을 넣어서 결과집합만든다

데이터베이스결과집합자체가 1개일때만 불러오는것

데이터를 정렬,집계 XXX

SQL에서 셋팅하기

자바에서는 그대로 가져다쓴다.

데이터조작은 SQL로만

자바 : 데이터조작X, 그대로출력, 사용자에게 어떤모양으로보여줄지

        데이터조회를위한 쿼리문작성

 

앞으로 수많은 변수가 필요할것임

Member의 id,Member의 nicname,..

데이터를 묶는다, 데이터사용시 게시판,주문내역,회원정보 등 수많은 변수가필요하다.

어떤데이터인지 자료형을 만들어서 쓰는게 바람직하다. 

haileykim2014.tistory.com/73

엔티티클래스

ctrl + space : 기본생성자

마우스오른쪽버튼 : source -> constructor using field

sourse -> generate getter and setter

sourse -> generate toString

 

분리, 콘솔, 데이터가져오는기능만빼서 웹으로

 

 

 

오라클이란 ?

DBMS제품들 중에 하나

 

DBMS는 ?

DB를 관리하는 시스템

 

DB?

데이터를 모아놓은 데이터 집합

 

DB를 직접 사용 할 수있나요 ?

no

 

DB를 MS를 이용해서 간접적으로 사용할때 어떤 방법으로 사용하나요 ?

명령어SQL를 이용

 

SQL의 구성3가지 ?

1. 데이터정의 DDL : create / alter/drop

2. 데이터조작 DML : select / insert/update/ delete

3. 데이터제어 DCL : grant/ revoke(허가)

 

DDL을 위해서 알아야할 내용으로 자료형 :

문자열(char/varchar2/nchar/nvarchar/long/clob/nclob

숫자:number

날짜:timestemp/ date

 

null은 값이다. 비어있는게 아니라서 비교가가능하다.

                   

데이터수정 

UPDATE [테이블명] SET [변경할 내용] WHERE [조건];

COMMIT; 하기. 커밋/롤백을 안하면 해당레코드가 홀딩되어있어서 다른사람이 접근불가.

UPDATE MEMBER SET PWD ='222' WHERE NICNAME ='TUE';
COMMIT;--INSERT후 저장소에 저장

--DELETE MEMBER;모든데이터삭제
DELETE MEMBER WHERE ID='21';--특정 레코드만설정

INSERT INTO MEMBER(ID, NICNAME, PWD)--데이터삽입
VALUES(21,'TUE'  ,'111');

--ROLLBACK;--커밋안했던것취소
SELECT * FROM MEMBER ORDER BY ID;--ID로 정렬하기
SELECT * FROM MEMBER;--MEMBER에서 모든컬럼을가져와
SELECT MEMBER.* FROM MEMBER;

SELECT ID, NAME, PWD FROM MEMBER; --원하는컬럼만 원하는 순서대로 조회,테이블이 여러개면 어떤테이블인지정.테이블이하나면 생략가능
SELECT ID AS MEMBER_ID, NAME, PWD AS PASSWORD FROM MEMBER;--원하는 컬럼을 원하는 별칭으로조회
SELECT ID MEMBER_ID, NAME, PWD PASSWORD FROM MEMBER;--AS생략가능
SELECT ID "USER ID", NAME, PWD PASSWORD FROM MEMBER;--AS생략가능, 빈공간""로 묶기

--UPDATE MEMBER SET PWD='111';--모든사용자의 비밀번호를 바꾸는것, 필히 WHERE조건절넣을것,누구도 레코드에 손댈수없다,커밋이나 롤백할때까지

 

JDBC 데이터베이스를 사용하기위해 api필요

뒷단에는 sql을 이용해서 데이터를 dbms에 저장

  • 오라클과 MS sqld의 api 함수이름이 다르다.
  • 데이터베이스의 연결을 위한 함수를 바꿔야한다. (벤더가달라서,,)
  • 기능을 단일화시킬수있는 돼지코를 ㅈ바ㅏ에서 제공
  • sql을 사용해서 db에 넣어야함.
  • 사용자입력 -> SQL(빈칸에들어감) -> DB

JDBC Driver

구동장치는 jdbc드라이버임.

jdbc는 껍데기

콘솔용어플리케이션임 , 자바프로그램만드는중 , 웹이아니다. (자바프로젝트에서도가능한것..)

 

스프링이 사용하는 버전이 1.8

클래스명외우기

new라는 키워드가 객체생성하는 유일한방법이아니었다.

연결됐으면 연결된객체통해서 객체를반환해준다.

ctrl shift o ->import

다른 패키지에 있는 클래스를 사용하기 위해서는 import 키워드를 이용한다.

DriverManager : 드라이버로드
Connection // 드라이버매니저를 통해서 Connection 만듦, import
Statement st = con.createStatement(); // 안쪽에서 new해서 만들어진 객체 반환
Resultset rs = st.executeQuery(sql); // st를 실행하면 실행한것을 통해서 결과집합객체만듦

Class.forName("oracle.jdbc.OracleDriver");

톰캣에서 문서를가져와서 객체화하려면 ..

  • 문자열로 읽어온것을 객체화해야함(자바코드가 아니기때문)
  • 자바플랫폼에서지원 -> Class cls = Class.forName("문자열")
  • Class.forName() : 문자열을 가지고 문자열에  해당되는 클래스정보를 얻어서 클래스안에있는 모든것을 분석해낼 수 있는도구
  • 소스코드는 하나의 문자열이다
  • 소스코드의 규칙이있다. 자바의규칙, 자바스크립트의 규칙 등
  • 코드들이 내부는 숫자로되어있다.

 

  • RTTI (Runtime type information) : 런타임 타입의 정보를 알아낼 수 있다.
  • 코드에서 객체나 메소드,필드등 포함해서 읽어볼 수있다.
  • getMethod() 메소드배열을 가져오는 구조체,

메소드나 속성 메소드인자들을 꺼내볼 수있다.

문자열을 읽어온것을 가지고 타입정보를 알아 낼수도있고,

newInstance();로 객체를 만들 수도있다.

Class cls = Class.forName("com.newlecture.web.Lotto");
Lotto lotto = (Lotto)cls.getDeclaredConstructor().newInstance();

문자열로 읽어온것을 객체화하고싶다면 ? (톰캣처럼)

new연산자쓸 수 없다. Class.forName("")사용

 

드라이버를 생성하는 코드 

실제로 new하는건아닌데, 드라이버매니저가 오라클드라비어객체를 반환해주지 ?

DriverManager.getConnection(null)

OracleDriver 클래스안에 생성자는 static생성자이다. static이기때문에 "oracle.jdbc.OracleDriver"인식이 되는 순간 저절로 호출된다.

생성자 안에 이미 자식객체를 생성하며 부모객체를 참조하고,

 

스태틱이라서 진행되는순간 자동실행


인스턴스변수 : 객체생성할때마다 값이 달라짐, 로또size는 항상일정하다.똑같은것을 개별적으로만들필요가없다.->전역변수

Lotto lotto = new Lotto()생성시 4바이트만 할당(인스턴스변수 1개)

모든객체가 동일한값을 쓰면 객체생성할때마다 인스턴스변수를 만들필요가없다.

모든객체가 static 하나가지고쓴다.

  • static은 객체와상관없이 불러올수있다.
  • 100개의 객체가 만들어져도 1개의 전역변수사용
  • 메모리절약가능
  • 프로그램이 실행되자마자 실행됨
  • new와상관없이 생성
  • 객체생성자:객체만들때만생성
  • static{ } 생성자, 클래스에 접근만하면 실행되는것,한번만 실행
  • static 변수는 계속접근가능

클래스의 속성과 메서드에 static 키워드를 사용하면 어디서나 속성과 메서드를 공유할 수 있다.

오라클이란 DBMS중하나다.

 

데이터베이스란 ?

데이터들을 모아둔것

 

DBMS 종류 : 오라클,mysql,Microsoft sql server

 

데이터베이스관리란 ?

데이터베이스를 관리해주는것

 

데이터를 모아야하는 이유 ?

무결성을 위해(결함을 없애기 위해)

 

무결성을 위한 방법 : 중복제거

 

프로그램에서 데이터를 직접사용가능한가 ? 

NO 관리시스템을 통해접근

 

명령체계를 이용해 데이터에 접근

명령어사용

 

명령어종류(SQL의 소분류)

1. 데이터정의 DDL : create / alter/drop

2. 데이터조작 DML : select / insert / update/ delete (반드시 암기)

3. 데이터제어 DCL : grant/ revoke(허가) 권한제어

 

문자자료형 : char, varchar, nchar, nvarchar,long,clob,nclob

 

문장끝마다 ; 세미콜론 

 

오라클 데이터 형식

NUMBER 데이터 형식

 

number(최대값,포함하는 소수점자리수)

기본최대값:38

number(6,2) 소수점 2자리포함 최대 6자리

      - 컬럼명 NUMBER(p,S)  ( ※ 단, p > s 인 경우)
        : 전체자리수 P에서 소수점이하 s자리까지 표현 
        : 정수 부분은 p-s 자리까지 허용하고, 소수점 s+1번째자리에서 반올림한다.
        
      - 컬럼명 NUMBER(p,s)  ( ※ 단, s > p 인 경우)
        : p는 소숫점이하의 유효 숫자 수
        : s는 소숫점이하의 전체 자리수
        : (s-p)만큼의 0이 유효숫자 앞에 존재해야한다.

        765432.1234           NUMBER                765432.1234 // 전부출력
        765432.1234           NUMBER(*,3)           765432.123  //소숫점 3번째자리까지
        765432.6234           NUMBER(7)             765433 //양수만
        765432.6834           NUMBER(9,1)           765432.7 //2번째자리에서 반올림 후 소수점1번째짜리까지 출력
        765432.6834           NUMBER(7,-2)          765400 //소수점기준 왼쪽2번째자리에서 반올림
        765432.6834           NUMBER(5)             ERROR 발생
        1.234                 NUMBER(4,5)           ERROR 발생
        0.01234               NUMBER(4,5)           0.01234
        0.001234              NUMBER(3,5)           0.00123
        0.005678              NUMBER(2,5)           ERROR 발생
        0.0005678             NUMBER(2,5)           0.00057

 

 

실행할 문장을 드래그해서 선택후 실행

DATE형식

 

DATE :

TIMESTAMP : 시간까지 명시된다.

컬럼을 추가했을때 또 DROP을 써야하나 ? 

컬럼을 추가하고싶었던거지 데이터를 날리X

ALTER TABLE [테이블명] ADD [컬럼명] [타입]

ALTER TABLE NOTICE21 ADD REGDATE TIMESTAMP;

오른쪽목록에서 마우스오른쪽버튼 ㅅ ㅐ로고침
명령어를 암기할필요가없고, 구조화된 데이터를 정의하는 방식이있다는것 기억, 자료형은 암기할것
SELECT 옵션*

행추가하기

INSERT INTO [테이블명](열1,열2,열3)
VALUES(값,값,값);

동시에 여러사람이쓰는 환경

동시에처리할 수 있도록 트랜잭션처리

INSERT INTO로 행추가 후 ROLLBACK하면 임시보관된 행이 삭제된다.

INSERT INTO로 행추가 후 COMMIT하면 저장소에 보관되고 SELECT* FROM[테이블명]을 넣으면 저장된 데이터들이 나열된다.

DROP TABLE MEMBER21;
DROP TABLE NOTICE21;

CREATE TABLE MEMBER21
(
    ID          NUMBER,
    PWD         VARCHAR(10),--CHAR(10) [HI       ][OK      },VHARCHAR2(10) HI,OK
    NAME        NVARCHAR2(50),
    GENDER      NCHAR(2),--'남성','여성'; CHAR(2)<->CHAR(2 CHAR):UTF-8:X3 <->NCHAR(2):UTF-16:X2
    AGE         NUMBER(3),--나이숫자3자리
    BIRTHDAY    CHAR(6),--'900112','891225',
    PHONE       VARCHAR2(13),--아스키범주라 N필요없음  
    REGDATE     TIMESTAMP--가입시간이 필요하면 TIMESTEMP
        
);
ALTER TABLE MEMBER21 ADD REGDATE TIMESTAMP;

CREATE TABLE NOTICE21
(
    ID          NUMBER,
    TITLE       NVARCHAR2(100),--100바이트, 한글:33문자정도,한글10글자를 적었을경우 N을안붙이면30바이트->공간낭비
    "CONTENT"   NCLOB,--최대4000바이트 CHARACTER LARGE OF BYTE
    HIT         NUMBER,--자동 38자리      
    REGDATE     TIMESTAMP
);
ALTER TABLE NOTICE21 ADD REGDATE TIMESTAMP;

teddyeejeongmin.tistory.com/6참고

INSERT INTO MEMBER(ID, NICNAME, PWD)
VALUES(21,'TUE'  ,'111');

COMMIT;--INSERT후 저장소에 저장
ROLLBACK;--커밋안했던것취소


SELECT * FROM MEMBER;--MEMBER에서 모든컬럼을가져와

+ Recent posts