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

 

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

 

 

1.Detach(할 필요없다 -바로 replace됨)

2.Replace : 1이 2의 자리로감

3.insert : 자리뻇긴 2를 1의 앞에넣음 

 

 

 

아우터 영역의 자원이 해제될 수있게하는 키를 가지는 함수

for문이 반복할때마다 function객체가 만들어진다.

3개의 객체가 i변수를 참조하고있다.

값이아니야, i라는 참조가 가리키는값이 3이야. (0부터 length까지인 2 이후에 i가 3된다.

boexs[3] 은 없지.

값변수가아니라 참조변수라서 계속 3을 가리킨다.->undefined

무엇을클릭해도 3이다.

let을 쓰면 가능하다. 값변수로 바뀐다.

선택후 삭제를누르면 삭제된다.

 

 

오라클이란 ?

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 키워드를 사용하면 어디서나 속성과 메서드를 공유할 수 있다.

nodes: DOM API상에 존재하는 모든 것들. 그것들을 모두 포괄하는 이름이 node이다.

 

Node의 밑에 Element가 있고

 

element: one specific type of node. 예를 들어  div, body, window 같은 특정한 타입.

모든 element는 HTMLElement의 자식이다. 따라서, HTMLElement의 property를 똑같이 가지고 있다. 동시에, element의 성격에 따라서 자신만의 property를 가지고 있다.

 

텍스트노드추가하기

var txt = document.createTextNode("1");

var div = document.createElement("div");

추가버튼을 누를때마다 div태그가 추가되면서 텍스트가 같이출력된다

1.div태그 만들기

document.createElement("div")

2.많은 태그객체의 속성설정

div.style.color="#fff";

3. 객체추가

div.append("1")

    btnAdd.onclick = function(){
        //1.엘리먼트 객체를 생성하기
        var div = document.createElement("div");
        
        //2. 엘리먼트객체의 스타일,속성 설정하기
        // img.src="../../images/1.jpg";
        div.style["background-color"]= "blue";
        div.style.backgroundColor = "blue";
        div.style.width = "100px";
        div.style.height = "100px";
        div.style.borderRadius = "50px";
        div.style.fontWeight ="bold";
        div.style.textAlign = "center";
        div.style.color="#fff";
        div.style.lineHeight ="100px";

        div.append("1"); //객체를 만들지않고 텍스트넣기

        //3. 엘리먼트 객체를  추가하기
        container.append(div);

    };

innderHTML

객체들을 문자열로뽑아내서 문자열을 더한다. 앞에꺼부터 다시 짓게되는셈.

removeChild(div); //0번째 div가 없어진다. 

 

 

 

 

사용자가 입력한 색상값에 따라 속성변경하기

사용자가 input태그에 입력 후 추가버튼을 누르면 해당 값이 반영된 div태그가 추가된다.

 

노드복사

Node.cloneNode()

해당 node의 children 까지 복제하려면 true, 해당 node 만 복제하려면 false

갤럭시 

모니터가 밀도가높아지면서 권장도높아진다.

 

전구다마크기에따라 픽셀이 제각각이 된다.

옛날에는 픽셀이 200개의 전구나마 너비

지금은 밀도가높음, 전구다마로는 작음.

CONTENT ="width= 360" : 화면을 360으로정하겠다. (기준밀도 1로했을때 너비), 실제장치의 너비

div style="width:200px" : 360을 기준으로했을때 200을 의미한다. 물리적인 200px은아니다. 

비율로 표현하는 수치 :dp (밀도가 곱해진것)

밀도가낮은 디바이스로봤을때도 저 크기로 볼 수있다.

밀도가높다 : 전구다마가 작아짐(전구다마=픽셀)

전구다마에달리 원래 디바이스의 크기로 너비를 잡는다.

전구다마를 1로했을때를 표현

기준밀도를 표현해야 단일하게 적용 (화면크기를 기반으로 설정)

 

모바일용을 따로 만들어야한다.

 

 

 

오라클이란 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에서 모든컬럼을가져와

모든 CSS 초기상태 값불러와서 특정 속성값만 추출 

  • var box = boxes[0];//왼쪽좌표위치 0, 원래있던 위치에서부터 증가하려면 ?
  • let boxStyle = window.getComputedStyle(box);
  • var left = parseInt(boxStyle.getPropertyValue('left'));//현재위치

Window.getComputedStyle()

Javascript에서 태그 추가하기 (엘리먼트 추가하기)

  1. element 객체 생성 : var img = document.createElement("img") 
  2. element 객체속성 설정 : img.src="/images/1.jpg"
  3. element 객체를 문서에 추가하기 : container.appendChild(img)

Document.createElement() ->window.document.creatElement() 앞에 윈도우가 생략된것.

Node.appendChild()

 

초기상태값 불러오기 

 let boxStyle = window.getComputedStyle(box);

The getComputedStyle() method gets all the actual (computed) CSS property and values of the specified element.

 

left를 0으로초기화했었다. 원래 있었던위치에서 부터증가하려면 ?

CSS에서 left값을 70px설정했어도 자바스크립트는 불러올 수 없다.

getComputedStyle(box)를 통해 box의 모든 css속성을 가져온다.

클릭해도 위치값이 안나온다.

CSS값이 아니라 박스가 가지고있는 스타일속성을 갖는 객체를 만든다 ->boxStyle

boxStyle.getPropertyValue('left') : 스타일 속성중 특정  속성값가져오기.

left 의 값인 70을 가져온다.

developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle

 

boxStyle의 속성중 특정속성만 원하면 getPropertyValue

  var left = boxStyle.getPropertyPriority("left");

문자열을 정수로 바꿀때 : parseInt( ) 숫자뒤의 문자를 없애준다.

parseInt () 앞에숫자만 남기고 숫자로 바꾸어준다.

left의 값 "70px"를 숫자로 바꿔준다.

 

div box1이 원래 위치에서부터 움직인다.

// ex4.css 속성 다루기
window.addEventListener("load",function(){
    // var section = document.getElementById("ex3");
    var section = document.querySelector("#ex4");

    var container = section.querySelector(".container");//id인지 class인지 표기
    var boxes = section.querySelectorAll(".box");//모두선택
    var button = section.querySelector("input[value='click']");
    
    button.onclick = function(){
        var box = boxes[0];//왼쪽좌표위치 0, 원래있던 위치에서부터 증가하려면 ?
        let boxStyle = window.getComputedStyle(box);

        var left = parseInt(boxStyle.getPropertyValue('left'));//현재위치
        var tid = window.setInterval(function(){
            
            left++;
            box.style.left = left + "px"; 
            if(left==400){
                clearInterval(tid);

            }

        },17);
    };
});

Node타입

  • 노드 :공통
  • 엘리먼트객체 : 태그 추가
  • 텍스트노드객체 : 텍스트

우리가 사용하는객체들은 다큐먼트에 담겨있다.

HTML내용을읽어서 메모리에올린것

노드는 마디를 의미, 메모리에올라간게 노드 객체

-엘리먼트노드객체

-커멘트노드객체

-텍스트노드객체

엔티티 : 대신사용하는키워드

엔티티레퍼런스 : 엔티티를 사용할 수있게금 해주는 레퍼런스

엔티티사용

엘리먼트 객체사용

Javasctrip에서 이미지 추가

 

태그를 html에서 얻어오는작업말고 추가할 수가 있다.

1. element 객체 생성 : var img = document.createElement("img") 

2. element 객체속성 설정 : img.src="/images/1.jpg"

3. element 객체를 문서에 추가하기 : container.appendChild(img)

추가버튼을 누를때마다 이미지가 추가

Javascript에서 div태그추가

 

1. 엘리먼트 객체 생성

var div = document.createElement("div");

 

2. 엘리먼트객체 속성 설정

       div.style["background-color"]= "blue";

        div.style.backgroundColor = "blue";

        div.style.width = "100px";

        div.style.height = "100px";

        div.style.borderRadius = "50px";

 

3.엘리먼트객체 추가 

container.appendChild(div);

메인함수가없다.

톰캣이 가지고있다.-> 약속된함수 : service

서비스함수만 오버라이드하면된다

 

데이터베이스란 ? 데이터를 베이스화해서 사용하는것 

데이터를 묶어놓은 집합

실시간으로 데이터사용x

데이터중복사용 -> 데이터결함발생

 

결함을없애는 데이터구조 - 무결성

데이터베이스의 가장큰 장점 : 무결성

데이터중복없앰 ->결함없앰

 

데이터베이스관리시스템이란 ?

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

 

데이터베이스와 데이터베이스관리시스템는 같은가

아니.

 

데이터베이스관리시스템이 필요한 이유는 ?

동시성,보안,성능해결

(헬스장기구를 여러사람이 동시에쓰려고할때 문제발생/시간이겹치고 관련파트만 접근가능하도록)

 

데이터베이스를직접이용하지않는다.

관리해주는애한테부탁

일정명령어사용

명령어집합을 SQL이라고한다.

 

명령어집합 3가지

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

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

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

 

    create table 테이블명(
        필드명 타입,
        필드명 타입
    PRIMARY KEY(필드명)

    );

 

오라클 DBMS 설치

1.데이터베이스관리해주는사람

2.SQL사용

3.튜닝하는사람..?

데이터결함하는과정에서 비효율적인->조인에대한내용...옵티마이저

오라클 DBMS설치

이미 설치가되어있을것.

개발도구를 클라이언트프로그램으로 쓰게된다

 

SQL : Structures Query langage

구조화된 데이터를 질의한다.

학생,부서,결제 등 개념단위 그룹핑 

그룹화된 개념단위 데이터를 질의하려면 데이터를 정의해야한다.

회원이라는 데이터정의

 

자바컴파일러에게 약속 class member{ }

정의명령어 CREATE

테이블정의

캐릭터는 홑따옴표로 감싼다.

 

데이터형식 : 캐릭터형

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

VARCHAR :안쓰는공간 반환, (가변적인 길이일 경우 적합)

CHAR : 데이터공간 고정형

  • CHAR(2 CHAR) : UTF8 문자하나당 3바이트씀 총6바이트 (크기에 상관없이 글자2개를 넣겠다)
  • NCHAR(2) : UTF16  숫자 2는 바이트의미, 1바이트 2개를 준비. 문자하나당 2바이트 (NATIONAL CHARACTER),공간절약 
  • CHAR(2) : 아스키코드 2개
  • 아스키코드외의 문자들은 NCHAR가 적합 
VARCHAR2(길이) NVARCHAR2(길이) CHAR NCHAR
길이가변형 길이가변형 길이고정 길이고정
알파벳과 숫자만 한글이 포함되는 경우    
NAME1 VARCHAR2(20): 20바이트이하 저장
"일이삼사오육칠팔"은
한글 8자리*3BYTE=24BYTE로 초과
NAME2 NVARCHAR2(20)
20자이하
"일이삼사오육칠팔"은
한글 8자리저장하고 추가12자리 더 저장가능
   

Q. VARCHAR(100) 하고 한글10자를 적으면 ? 

100은 실제공간이 아니라 MAX를 의미

한 문자당 3바이트*10개 = 30바이트크기

 

Q. NVARCHAR(100) 하고 한글10자를 적으면 ? 

2바이트*10개 = 20바이트적용 
괄호안에 100은 최대크기 100BYTE

CREATE TABLE MEMBER21
(
    ID          NUMBER,
    PWS         VARCHAR2(50),--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
    BIRTHDAY    CHAR(6),--'900112','891225',
    PHONE       VARCHAR2(13)--아스키범주라 N필요없음  
)
CREATE TABLE NOTICE
(
    ID          NUMBER,
    TITLE       NVARCHAR2(100),--100바이트, 한글:33문자정도,한글10글자를 적었을경우 N을안붙이면30바이트->공간낭비
    "CONTENT"   NCLOB--최대4000바이트 CHARACTER LARGE OF BYTE
    
)

 

 

 

LONG은 초창기,제한이많음 

 

blog.naver.com/wideeyed/221742972778

자바스크립트 

-언어 

  -데이터/형식

    - 기본형식(boolean/ Number/ String)

    - 연산자

    -제어구조

    -함수

    -가시영역/ 생명주기/클로저

 

-플랫폼

 -브라우저

   -API : window Object

    window.alert() / confirm() / prompt()

 -문서 

   -API : window.document

   document.write();

   document.getElementById();

  document.getElementsByClassName();

  ..

 

코드블록

 <script></script>

 onXXX ="" : 사용하지말자

 

기본코드블록

   window.onload = function(){

    var obj = document.getElementById("?");

    var item = container.getElementsByClassName("it1");

   }

 


window.addEventListener("load",function(){ }) 

함수를 누적할수있다. 

querySelectorAll 여러개

스팬의 자식의 콘텐트를 가져온다.

3000이면 3초

setTimeout() { }

클릭할때마다 카운트다운
클릭하면 자동으로 카운트다운

레프트탑을쓸수있다.

position

윗태그에 포지션렐러티브를 주면 앱솔루트적용한 하위태그가 안쪽으로들어온다

적당한크기가 내가할수있는것도많다..

50명정도이상

 

  • GET요청을 주로만든다. 사용자에게 돌려주는내용 : HTML
  • HTML을 주로돌려주는데, 반복적이고 시간을 많이든다.
  • 제스퍼라는역할자가 HTML(out.write() )을 대신해준다.
  • 확장자를 jsp로하면 ->을 출력해주는 서블릿코드완성된다.
  • <%%>를 이용해 코드를 작성하면된다.
  • JSP는 첫요청할때만 느리고 서블렛과 생명주기와동일하다.
  • 톰캣설정에서 카피한 이클립스설정
  • 톰캣손대지않고 이클립스설정을(서버)를 지웠다가 새로생성

코드블럭

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

-정의블럭 <%! %>

-출력블럭 <%= %>

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

 

주석블럭

<%-- --%>

out.print와 같다

자바는 함수안에 함수정의불가능

 

 JSP태그 종류

  • 지시자  : <%@ %> --> 페이지 속성(.jsp 파일의 제일 상단에서 볼 수 있음)
  • 주석     : <%-- --%> --> JSP의 주석은 HTML 주석과 다르게 브라우저에서 소스보기를 했을 때 보이지 않음
  • 선언     : <%! %> --> 변수, 메소드 선언
  • 표현식  : <%= %> --> 결과값 출력
  • 스크립트릿 : <% %> --> JAVA 코드

<%! %> 서비스함수와 동급으로 넣어준다.

service() { }함수메소드안에 들어가는게아니라 클래스의 멤버로서 추가된다.

사전지시사항(import) 설정

프론트작업한 프론트웹폴터의 파일,폴더들을 복사해서 이클립스-webcontent에 붙여넣기해서 오버라이드한다.

list.jsp를 추가하고 list.html파일의 내용을 list.jsp안에 넣는다.

jsp를 실행하면 웹화면이 뜬다.

5번반복

1. list.jsp 파일에

반복할 HMTL태그위에 <% for(int i=0;i<10;i++){ %> 자바코드를 넣어준다 

2. list_jsp.java파일에 작용으로 적용된다 (세번째그림)

   HTML태그는 자동으로 out.write( )태그가적용어서 나타난다. 

3. 윈도우창을 새로고침하면 10번 반복되어있다.(두번째그림) jsp는서버를 다시실행시킬필요없다.

 

10번 반복적용 

스크립트를통해 플랫폼을 이용하려고

문서조작: 다큐먼트오브젝트

브라우저ㅂ오브젝트 : 얼럿,컨펌, 등등

 

다큐먼트롸이트기능이있지만, 로드된 내용중 특정객체를선택해서 조작한다.

로드되어있는 걸선택하고 조작할예정

 

여기어는 함수호출하고 위에서는 함수정의   / 윗부분 / 사용자가 고객센터를 누르면 prompt가뜬다

로드된순간 객체가됨

태그안쪽에있는 속성에는 innerText를 적용한다

innerHtml = 오른쪽에있는게 html태그를 가지고있어서 태그에 적용하고싶을떄사용

HTML이 먼저로드되고 나서 Script가 실행된다. 스크립트가 위에있으면 html이 로드전이기때문에 에러가 난다. 이것을 해결하려면 ?

<h1 id="aside-title" /* onclick=" " 자리 */>고객센터</h1> :

온클릭속성없앤 후(하나의 코드블럭을 없앤것) 스크립트에 id이름.onclick = 함수이름으로 처리.(함수위임)

코드는 코드블럭에 하는게 바람직. 온클릭을 id에 다시한번하지않아도된다. 

코드블럭이란 ? 스크립트를 작성할 수있는블럭

스크립트태그가 분산되어있다. "printSum()"와 <script>

스크립트를만든느사람

html코드만든느사람 따로

블럭이 흩어져있으면 문서보다 하나로 몰려있는게 좋다.

id가 로드된 다음에 실행해야되니까 계속 블록이생긴다

 

window는 전역객체고 제일먼저 만들어진다.

HTML태그의 순서에따라 태그의 객체가 window.document에 만들어진다. 

window.onload : 윈도우가 갖고있는 그 구성요소들 HTML,CSS,이미지 등 모든것들이 로드가 되었을때 실행 할 수 있는이벤트속성이있다.

asideTime.onclick=tprintSum은 배밖에있어서 무조건실행된다. / 함수안에있으면 윈도우가 로드될떄 실행된다
에 함수를 대입하면 HTML모든 태그가 로드된 뒤에 실행된다.

로드가되었을때 수행할수있다

함수에안넣었다면 바로실행되겠지만 함수에넣어서 일단실행이안된다

윈도우객체 온로드이베느를사용해서 문서내에서 어떠한것도 직접onzㅡㄹ랙을 넣지않고 사용가능

Q . 함수호출과 위임의 차이 

호출을 두번하는것과같다

1.첫번째캡쳐 : onclick= " 코드블럭임 " 

2. 두번째캡쳐 :  asideTitle.onclick = function(){ printSum(); }; 으로 호출되어야한다. printSum()이 함수안에있던것

                     클릭되면 함수실행.

괄호쓰면 함수의 호출형태임 (호출된결과값반환/ 리턴값)             /                             함수를 위임하는것 

3.반환값을대입하는것을 의미 , 결과값을주는것(호출된 결과값을 달라고한게아니다)

4. 함수를 위임하는것 : 함수의 참조가 asideTitle.onclick에 대입(사용자가 asideTitle을 클릭했을때 실행될 함수를 넘겨달라고한것)

함수 위임

함수의 객체를 늘리지않으면서 사용가능 , 이름중복 x 

이벤트함수는 이름이 필요없다.

왼쪽:UI , 오른쪽 : 동적문서 

전역공간에 함수가있으면 위험

다른함수와 충돌가능성

window.onload =function(){ 안에 함수구현 } :로드되고 실행되는 블럭에다가 함수를 넣는다.

이름충돌을 피할 수 있다. 안에서만 사용되는 함수. 함수이름없음

쓰고자하는애들을 얻어내서 이용한다.

 

변수명 명명규칙

HTML : 단어구분시 구분자를 "-" 대시이용 aside-titme

JS : getElementById("aside-title");를 통해 해당아이디를 꺼내서  asideTitle로 사용할것. 

window.document.body.children[0]{id:"body"}

window.document.getElementById("aside-title");객체꺼내쓴다. 

HTML이 로드되고 window.onload안에있는 함수들이 실행된다. 

 

getElementsByClassName :

문서에서 동일한 클래스명이 여러개있을 수있다. 복수형태

특정엘리먼트.getElementsByClassName("이름")[0]; 하나만 한정

큰 세션에는 id 부여

지역명 class부여(중복가능한것)

공지사항영역에 사이드메뉴겹치기 

 

main영역을 기점으로 breadcrumb에 absolute적용해서 위치잡기

right 오른쪽기점

top:25px 위에서 52떨어지기

 

 

디스플레이성능에따라 밀도가높아진다.

화면크기는같아도 나타나는게 제각각일수있다.

앱은 dp를 사용하지않는다.

웹에서는 뷰포트를 사용

화면에 맞춰서 출력: 뷰포트

 

doGet 노가다성..html모두 작성해야하는..

서블릿->JSP(페이지기반의 서버페이지를 만드는 플랫폼)Java Server Page

아직까지는 서버페이지기반이지만 점점 사용률이 줄어든다.

 

jsp내장객체 알아야함, 외워야한다.

4대저장소

pageContext:현재 페이지(현재 서블릿) 생명력짧은 

request :두 서블릿간의 데이터공유

session : 사용자별 저장소

application:전역저장소 

 

Jesper :  엔진, 소프트웨어 (톰캣안에 있음) 클래스를 만들어주는 역할

(test. java -> test.class ->java test - > java(자바실행환경)

  javac test.java ->  ->dir -> test.java test.class

 java test : 중간코드를 번역해야하는데 (JIT just in time compiler ) Jitter야 이것좀 번역해줘 

 

이클립스가 톰캣에있는 원본을 망치지않도록, 톰캣의 실행파일은 이용하되 자기의 워크디렉토리에 배포디렉토리를 만들고 그 폴더에서 서비스를 사용 할 수 있게금 준비한다.

서버를지운다고 톰캣이 지워지지않고 이클립스가 따로 준비한 배포폴더가있고 그게 지워진다.

 

서비스할떄는 톰캣에 옮겨야한다.

 

//제조/생산 -> 기계 -> 전자기계 -> 자동화된 전자기계 ->이게인간이 할짓인가 ? AI->공부->방향숙달->창의적으로 생각

Jasper 

톰캣안에는 클래스만들어주 애가있다 : 제스퍼 

이클립스가 피해를주지않고 톰캣을 이용, 자신의 워크디렉토리에 별도폴더만들고 서비스사용하게끔 준비

 

정적인내용 / 동적인내용

첫요청할때만 느리다.

한번클래스만들고 컴파일된결과물을 이용한다

 

이제 서버코드작성할때는 - 컴파일과 배포다시, ㅅ ㅓ버다시 껏다켜야함

jsp:그럴필요없음, 코드달라짐이 톰캣이안다.서블릿코드가만들어진다.

Server Path (배포되는 디렉토리)

이클립스는 톰캣에 두지않아요.톰캣 어디에도 우리가만든 코드를 두지않습니다.

톰캣의 웹 루트에다가 배포해야만 그 루트에서 서비스하게되는데,어디에 배포하고잇는걸까

server path에 하고있음

이클립스에서 만든코드가 브라우저에서 보여지는것이 아니다(java,html이든..)

아래 폴더에 배포된다. 톰캣이 시작되서 conf에 파일을 서비스하게되는 것

콘트롤 f11해서 배포한것이 여기에 생성된다.

브라우저에서는 반영이안되요 1 : 고쳐진내용이 배포가되어야하는데, 가끔 덮어쓰기가안된다.

JSPPrj폴더에 배포가 되어야한다.  ->서버를 지우고 다시시작한다 (서버를지우면 tmp폴더가 지워지는것) 

브라우저에서는 반영이안되요 2 :브라우저는 일정시간동안 갖고있는 문서가있다(캐시)

브라우저 - 개발자도구 - 네트워크 - 톱니모양  설정 - Disable cache 표시

브라우저가 전에 다운로드했던 내용들을 캐시하고있다가 캐시에 저장되어있는것을 계속 불러온다 

jsp를 실행할때 컴파일되면서 , ~

실행코드인데 출력으로넣어진다.

그냥넣으면 출력

코드는코드블럭

 

<% int result = 13; % >와 <% out.print(result) %> : <% 코드삽입 %>

<% int result = 13; % >와 <% out.print(result) %> : <% 코드삽입 %> jsp에 넣는다

pageContext.getOut(); //printWriter와같음

 

calc_jsp.java를 손대지않는다

jsp내장객체 알아야함, 외워야한다

4대저장소

pageContext:현재 페이지(현재 서블릿) 생명력짧은 

request :두 서블릿간의 데이터공유

session : 사용자별 저장소

application:전역저장소  

 

out :출력도구 /page : 현재 서블릿객체 

alert는 확인버튼만있지만 confirm은 확인 취소 버튼이있다. 

3

결과를 출력하고자하는 위치가 있을때

저 엘리먼트에다가 쓰겠다

기존구조에 거기에 글자를 쓰고싶을떄 

자바스크립트가 html 요소들을 객체화하는 로드과정이 포함됨

스크립트로 내용을 변경 할 수있다.

첫번쨰사진 : 고객센터라는 글자가 안녕하세요로 바뀌었다. 

script태그를 id명명하기전으로 옮기면 ?

사용하고자하는 객체가 읽혀지지않은시점에서사용할수없다.

asideTitle은 아직 안읽혔다. 메모리에안올라갔다. ->오류발생

 

이벤트가 발생할때 실행되는 블록 

사용자가 벝느을 클릭하면실, 마우스가오버되면 실행되는코드

이벤트가발생했을때 실행되는 블럭 

<h1 id="asideTitle" onclick=" ">고객센터</h1>

asideTitle.innerHTML = html;

= 기존것위에 덮어씌워진다.

asideTitle.innerHTML += html;

코드작성 영역이 두군데있다. 

<script>그냥읽혀지는 실행블록, 열리자마자시작

<input onXXX="">이벤트가 발생할때 실행되는 블록

 

 

페이지열리자마자 실행되는부분을 사용자가 클릭후 반응하게하려면 ?

prompt를 script에 넣었을때는 창을 열마자마자 실행되었다.

사용자가 특정 부분을 클릭하면 실행되도록해보자

onclick" 실행할 내역 "을 넣음.

<h1 id="asideTitle" onclick="
                        var x = prompt('x값을 입력하세요');
                        var y = prompt('y값을 입력하세요');
                        x = parseInt(x);
                        y = parseInt(y);
                        alert(x+y);">고객센터</h1>

사용자가 고객센터글자를 클릭할때 prompt창이 뜬다. 

상단에 함수를 정의하고 해당부분에 함수이름을 호출하도록한다.

스크립트를 모아두는 방식으로 정리,

스크립트를 헤드영역에 두고 함수호출하도록한다. 

함수를 만드는곳 / 함수사용하는곳 으로 분리 

 

flex-basis : 중첩 flex사용시 basis 주의 

flex를 중첩하는 순간 위에있는 flex가 li의 flex-basis를 줬음에도 콘텐트크기로 줄여버린다. 

flex-basis 대신 width로 바꿔준다

 

flex-basis일경우 글자간격 15px이 안먹힌다(첫번쨰사진). width적용 (세번째사진)

페이저 가로로 나열하기 display:flex

마진간격 ul에 한꺼번에 적용 margin0 4px;

margin : 위아래 양옆;

margin : 위,오른쪽,아래,왼쪽

공통마진적용속성utils style에 적용

GET 방식과 POST방식

GET 방식

• 서버에 있는 정보를 가져오기 위해 설계됨.

• 240바이트까지 전달할 수 있음.

• QUERY_STRING 환경변수를 통해 전달.

• 형식 : http://xxx.xxx.co.kr/servlet/login?id=hj&name=hong

• URL노출로 보안성이 요구되는경우엔 사용할 수 없음.

• 검색엔진에서 검색단어 전송에 많이 이용함.

 

POST 방식

• 서버로 정보를 올리기 위해 설계됨.

• 데이터크기의 제한은 없다.

• URL에 파러미터가 표시되지 않는다.

 

서블릿구조

서블릿 로딩

• init() 메서드

• 최초 클라이언트 요청 시 init() 메서드가 호출되며 메모리에 적재됨.

 

요청 처리

• service() 메서드

• service() 메서드가 컨테이너에 의해 호출

 

처리 수행

• doGet(), doPost() 메서드 서블릿 종료

• destroy() 메서드

 

스레드는 프로세스를 스위칭하는 작업의 또다른 모델
옛날에는 프로세스와 스레드가 1:1이었다.프로세스에는 흐름이 1개였으니까
스레드에도 흐름이 1개였었다.하나의 프로그램이 자신로직을 동시실행해야하는 일이 발생
그걸 도와주기위해 프로세스안에서 스위칭이 일어나게끔 플랫폼이 새로 등장했다
프로세스안에서 여러 스위칭이, 여러함수가 개별적인 스위칭으로 왔다갔다할 수있게해주는 하나의 단위

get요청하면서 get을 처리하는 로직에게 내가 만든 값 또는 상태를 전달할 수 있는 방법이 필요하다.
1. 파일을 이용하는 방법
2. 서블릿의 저장소를 이용하는 방법(Application/session/cookie/..)
3. QueryString을 이용하는 방법 (r값전달):
   질의용(옵션 ex,커피+샷추가)
   다른서블릿에서 값전달시에도 사용

sendRedirect : post로 왔다가 다시 get요청을 할 수있게해준다. 추가적값을 전달해서 상태유지하게해준다.

 


if(req.getMethod().equals("POST"))

첫get요청에서는 이부분이 실행되지않아도됨

서버쪽에서 get요청인지, 값을 넣고 전달한 post요청인지 알아야한다.

Request 가 모든정보를 보여준다. Request Method가 POST일때 실행하도록한다.

 

변수를 POST조건문보다 먼저 선언했어야했다.

int x = 0;
int y = 0;
int result = 0;
String x_=null;
String y_=null; 를 먼저 선언할것

POST일때만 동작하는지 확인방법 :

System.out.println("calc");를 조건문 안에 넣어서 POST일경우 calc를 서버안에서 출력하도록한다.

사용자가 덧셈을 누르면 POST가되어 calc가 서버에 출력된다.

 

 

웹브라우저 : 사용자

이닛멤버메소드를 실행한다.

초기화할수있도록 비어있는 메소드이다. 오버라이드할수있다.

스레드란..?

 

프로그램만들면 메인함수부터 절차가 진행한다.(수행절차)

흐름을 그어보면 하나의 선으로 그어진다.(수행절차)

그 흐름을 스레드라고 한다.

실행흐름 = 스레드

동시에 다른흐름이생기는 경우가있다.

별도의 프로세스로 빼서 작업했었다

ex, 이북을 동시 다운로드(파일 카피) while문,반복문이 끝날때까지 다른것들 응답없음이 뜨게된다.

하나의 프로세스가 진행되는 과정에서 다운로드는 따로실행되게하고싶다.

흐름안에 흐름만드는방법이 없어서 

fork()사용(프로세스가 자식을 만드는것,프로그램이 프로그램을 실행) 

(프로그램은 살아있지않다. 프로세스가 다운됐어가 옳바른용어)

프로그램이올라가서 프로세스가된다.

자식프로세스가 필요

자기 로직의 일부를 별도프로세스올림.

일부로직인데, 서로 데이터를 공유해야하는 상황

원래 프로세스는 각자 개별적으로 자기만의 데이터로 혼자 실행되는것

프로세스간의 데이터공유, 컨텍스트 스위칭에 대한 부담 (프로세스 수가많아지면 전환되는과정에 부담)

여러개프로세스를 동시에실행하는게아니라 그렇게보이는것

(만화가 움직이는것처럼)

포인터가 프로세스정보를 가지고있다.

스위칭과정 : 콘텍스트스위칭

하나의 프로세스안에서 갖게되는 흐름 : 프로세스는 x , 스레드라한다

맨위에있는 스택에있는함수만 실행된다.

하나의 흐름만 갖고있는 방식으로는 검색,다운로드를 병렬수행할수없게된다.

스택을 2개만든다.

동시에 실행되면서 힙에있는것

함수를 스위칭하는방식 

자바는 new Thread()클래스가있음. 스레드클래스를통해 메인과 다른함수가 동시에실행할 수있다.

스레드로 수행하고있다.

 

서비스는 개별적으로 스레드로 동작

객체는 하나, 함수는 여러개

서비스흐름이끝나도 객체는 살아있다.

요청이안오면 사라진다.

3개의함수를 오버라이드할 수있다. 

super.service(req, resp);를 지웠을때 doGET(),doPost() 오버라이드된 게 안뜬다. 

doGet과 doPost를 호출하는 장본인이 service이다.

Service를 오버라이드하는 순간 doGet과 doPost를 호출하는걸 담고있는 로직이 지워진것(부모가갖고있는)이다.

부모안에 doGet과 doPost이 있었는데 오버라이드하면서 없어진것.

Service를 오버라이드하면서  doGet과 doPost이사라짐.

 

의도적으로 doGet과 doPost로직을 처리하면서 추가적으로 겟에 대한내용과 포스트에대한 내용을 할수있겠지만
일반적으로 service()를 작성하지않는다.
calc class에서 service()를 작성안하면 톰캣이 부모service()를 호출하고 거기에 적절하게 오버라이드된 doGet과 doPost가 호출된다.

servie()함수를 오버라이드하고 super.service()를 호출안헀을때 doGet과 doPost가 호출되지않는다.
calc에 오버라이드된 service함수안에 super.service()를 호출하면 calc안에 오버라이드된 doGet, doPost가 호출된다. 

 

 

POST와 GET요청의 이해와 코드 분리하기

1. doGet()과 doPost()로 분리

 

 

2. 사용자가 값을 입력하고 덧셈을 누르면 백지가나온다.

사용자가 숫자입력하면 흰화면

3 . 사용자에게 결과값을 돌려주는 출력을 하지 않았다.

숫자를 넣고 덧셈을누르면 다음화면으로넘어가지만 결과값이 나오지않는다.

사용자에게 출력한코드가없다.

다시 출력해줄때 write(HTML)코드를 다시넣어야하나 ? (똑같은코드를 두번쓰는건 비효율적)

아니다, 다시 get요청을 할 수있는 함수가 있다.

 

문서를 출력하는것은 post가 할게아니라 get한다.

처리한 결과를 get을 이용해서해야한다. 

doGet(res,resp);를 넣어보자. -> result를 전역변수로 해보자.

결과값을 공유하지 못한다.. 

 

calc라는 일반클래스가 아니다. web의 흐름

 

post요청이왔다면 다시 get요청을받을수있게 흐름을 잡아야함

사용자가 글을적고 등록을 누르면 목록페이지로 전환된다.

클릭-문의글등록-포스트-목록페이지로 전환(새로운 GET요청)

스레드가 연결이안되어있다.

포스트서블렛이 올라갔다 바로내려감 ,메모리에아무것도없음 다시 겟서블릿생성

doget은 어떠한 지역변수도 볼수없음.

상태값을 유지할 방법이 필요하다.

 

 

get요청하면서 get을 처리하는 로직에게 내가 만든 값 또는 상태를 전달할 수 있는 방법이 필요하다.

1. 파일을 이용하는 방법
2. 서블릿의 저장소를 이용하는 방법(Application/session/cookie/..)
3. QueryString을 이용하는 방법 (r값전달)

   질의용(옵션 ex,커피+샷추가)

   다른서블릿에서 값전달시에도 사용

 

resp.sendRedirect("/add?r="+result);

내가 어떤 서블릿코드에서 get요청을하고싶을때 사용한다. 

get을 재활용하는데 쿼리스트링을 이용해서 값을 공유하도록했다. 

 

doget에서 result는 출력할목적

dopost에서 result는 계산목적

sendRedirect : post로 왔다가 다시 get요청을 할 수있게해준다. 추가적값을 전달해서 상태유지하게해준다.

 

package com.newlecture.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/add")
public class Calc extends HttpServlet{
	
	int result;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//GET만 따로처리
		resp.setCharacterEncoding("UTF-8");//UTF로 인코딩보낸것,보내는방식지정
		resp.setContentType("text/html;charset=UTF-8");//1.브라우저가읽는방식,브라우저가 정상적으로 읽을수있도록		
		
		//1.입출력도구가 추가되었다.
		int x = 0;
		int y = 0;
		int result = 0;
		String x_=null;
		String y_=null;
		String r_= req.getParameter("r");
		
		if(r_ != null)
			result = Integer.parseInt(r_);

    	//문서를 동적으로 만드는 코드: 이 코드로 만들어진 결과물 , 동적인 문서, 서버문서 
    	PrintWriter out = resp.getWriter();
   	
    	out.write("<!DOCTYPE html>");
    	out.write("<html>");
    	out.write("<head>");
    	out.write("<meta charset=\"UTF-8\">");//2.브라우저가읽는방식,브라우저에게 이코드방식으로 읽어라 최근방식
    	out.write("<title>Insert title here</title>");
    	out.write("</head>");
    	out.write("<body>");
    	out.write("  <section>");
    	out.write("    <h1>계산기</h1>");
    	out.write("    <div>");
    	
    	if(x_ != null)//처음페이시 요청했을떄 안나오도록
    		out.write("    <div>"+x +"+"+ y+"=</div>"); //계산했던 연산식
    	
    	out.write("         <form action=\"/add\"method=\"post\">");
    	out.write("            <input type=\"text\" name=\"x\">+<input type=\"text\" name=\"y\"><br>");
    	out.write("            <input type=\"submit\" value=\"덧셈\"><span>"+result+"</span>");//출력용
    	out.write("         </form>");
    	out.write("      </div>");
    	out.write("   </section>");
    	out.write("</body>");
    	out.write("</html>");    	    	
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//POST에서 사용되는것만 분리
		int x = 0;
		int y = 0;
		int result = 0;
		String x_=null;
		String y_=null;
		
//		if(req.getMethod().equals("POST")){//대문자와비교
			System.out.println("calc");//서버에 출력
			
			x_ = req.getParameter("x");
    	if(x_ != null && !x_.equals("")) //null이면 0
    		x = Integer.parseInt(x_);
    	
    		y_ = req.getParameter("y");
    	if(y_ != null && !y_.equals("")) 
    		y = Integer.parseInt(y_);
    	
    		result = x + y; //계산용
    		// get요청을 하는것이 더 효율적이다.POST에서 계산후 get요청을 다시받아야한다
    		//doGet(req,resp);
    		resp.sendRedirect("/add?r="+result);//resp.sendRedirect("/add");값은안가고 문서만간다.
    		//get요청하면서 get을 처리하는 로직에게 내가 만든 값 또는 상태를 전달할 수 있는 방법이 필요하다.
    		//1.파일을 이용하는 방법
    		//2.서블릿의 저장소를 이용하는 방법(Application/session/cookie/..)
    		//3.QueryString을 이용하는 방법   		
    		
//		}
	}
	
	/*
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		resp.setCharacterEncoding("UTF-8");//UTF로 인코딩보낸것,보내는방식지정
		resp.setContentType("text/html;charset=UTF-8");//1.브라우저가읽는방식,브라우저가 정상적으로 읽을수있도록
		
		
		//1.입출력도구가 추가되었다.
		int x = 0;
		int y = 0;
		int result = 0;
		String x_=null;
		String y_=null;
		
		if(req.getMethod().equals("POST")){//대문자와비교
			System.out.println("calc");//서버에 출력
			
			x_ = req.getParameter("x");
    	if(x_ != null && !x_.equals("")) //null이면 0
    		x = Integer.parseInt(x_);
    	
    		y_ = req.getParameter("y");
    	if(y_ != null && !y_.equals("")) 
    		y = Integer.parseInt(y_);
    	
    		result = x + y;
		}
    	//문서를 동적으로 만드는 코드: 이 코드로 만들어진 결과물 , 동적인 문서, 서버문서 
    	PrintWriter out = resp.getWriter();
   	
    	out.write("<!DOCTYPE html>");
    	out.write("<html>");
    	out.write("<head>");
    	out.write("<meta charset=\"UTF-8\">");//2.브라우저가읽는방식,브라우저에게 이코드방식으로 읽어라 최근방식
    	out.write("<title>Insert title here</title>");
    	out.write("</head>");
    	out.write("<body>");
    	out.write("  <section>");
    	out.write("    <h1>계산기</h1>");
    	out.write("    <div>");
    	
    	if(x_ != null)//처음페이시 요청했을떄 안나오도록
    		out.write("    <div>"+x +"+"+ y+"=</div>"); //계산했던 연산식
    	
    	out.write("         <form action=\"/add\"method=\"post\">");
    	out.write("            <input type=\"text\" name=\"x\">+<input type=\"text\" name=\"y\"><br>");
    	out.write("            <input type=\"submit\" value=\"덧셈\"><span>"+result+"</span>");
    	out.write("         </form>");
    	out.write("      </div>");
    	out.write("   </section>");
    	out.write("</body>");
    	out.write("</html>");    	    	
    	
//    	resp.getWriter().print(x+y);
    	super.service(req, resp);
	}*/	
}

 어제 배운 부분에서는 저희가 doGet(), doPost() 메소드를 따로 분리하지 않고 service() 함수에서 사용자의 get 요청과 post 요청이 모두 처리되게 코드를 작성했었잖아요 근데 오늘은 get 요청과 post 요청을 따로 분리해서 doGet()에서는 사용자의 get 요청을 받게 하고, doPost()에서는 사용자의 post 요청을 받게 작성을 했어요

그래서 사용자가 get 요청을 했을 때는 doGet() 메소드 안의 내용이 사용자에게 보여지는 것인데, 이 때 저희가 계산기 입력 폼이 사용자에게 보여지게 doGet() 코드를 분리했었잖아요 이렇게 계산기 입력폼이 사용자에게 보여지는 것은 get요청으로 갈 수 있게 doGet() 안에 작성을 했는데 그렇게 해서 사용자에게 보여진 입력폼을 사용자가 제출할 때는 get이 아닌 post 요청으로 가서 doPost() 메소드가 호출될 수 있도록 <form action="/add" method="post"> 이렇게 폼 태그의 method 부분을 post로 작성해줘야해요..! 그래야 사용자가 입력폼을 제출했을 때 doPost() 메소드가 제대로 호출될 수 있습니다

 

맨 처음에는 사용자가 계산 입력폼 페이지를 요청을 해서 사용자에게 계산 입력폼 페이지를 보여줘야하니까 처음에는 doGet() 메소드가 호출돼요! 근데 그 다음에 사용자가 입력폼을 제출하면 form 태그의 method가 post이니까 POST 요청으로 받아들여져서 doPost() 메소드가 호출되구요. 근데 또 오늘 배운 것처럼 doPost()에서 resp.sendRedirect("/add?r="+result);를 통해 다시 doPost()에서 계산된 result의 값을 들고 doGet()이 호출이 되어서 result 값이 제대로 담긴 계산된 페이지가 사용자에게 get 요청으로 보여지게 됩니다~!

 

 

 

기술면접준비할 것

 

컴파일언어 , 인터프리터언어 :

  컴파일 언어 : 3+4 를 컴파일(binary code)로 번역후 디스크에 저장 ->런타임 ->Execute (실행속도빠름)

  컴파일언어 : C,C++, Java, C#

  인터프리터언어 : 번역없이 실행 ->소스코드가 바로 디스크에있음 ->바로필요할때 필요한언어만 번역

 

*컴파일 언어 :

코드 번역 보조기억장치 메인메모리 실행

ex: C, C++

CPU안의 Control Unit이 실행

특정CPU에서만 동작

기계어를 직접 만들어 실행

메모리 관리를 해야함

한번에 미리 번역

배포시 구문오류 존재 X

실행환경 도구 필요X

 

프로그램만드는 순서 : 개체를 찾고 - 기능을 찾고 - 기능을 구현한다

 

생성자를 사용하는 이유 ?

초기화는 단 한번만 실행되어야한다.

초기화는 다른 어떤 로직보다 먼저 실행 되야한다

 

객체지향에서의 캡슐화 : 실생활의 내용을 그대로 표현하는 도구

개체가 하는 서비스함수(행위)를 모아둔것

기존 캡슐화 : 데이터변화에 영향을 받는것들을 한곳에 모아 둔것

객체지향 캡슐화 : 객체가 갖고있는 서비스들, 즉 객체가 제공해야할 서비스들을 모아둔것

 

객체지향이란 ?

프로그램을 구성하는 요소로서 객체라는 것을 중심에두고 프로그램을 만드는것.

 

객체지향의 장점 ?

코드의 구조를 실세계내용을 반영해서 인간의 사고에 가깝게 쉽게 표현한다.

 

객체지향프로그래밍이란 ?

  주어,목적어가 우선 ( 행위의 주체가 눈에 띄도록한다)

  함수는 동사, 행위

 

객체 : 보이는것, 실존하는것, 식별이름

        실체,인스턴스, 객체이름, 참조변수

개체 : 유형. 적절한 추상화가 필요.개별적으로 움직일 수 있는 유형

       실존하지않는 것 = 타입명칭 = 자료형명 = 형식명칭

 

추상화

개체(모듈,캡슐)3가지 목적으로 사용된다.

1. 큰거를 잘라서사용

2. 공통적이고 반복된 부분을 집중화

3. 잘라낸부분다음에 재사용

 

추상화 : (캡슐의)공통부분을 잘라내는 것

아우를수있는 추상적인 것

추상화도 is a 상속이다

 

객체지향 :

캡슐화->has a(역어내기)상속관계->알맹이를 틀로쓰거나(Is a 상속):오버라이드

->추상화(집중화/공통분모화) :오버라이드,추상클래스/추상메소드

->다형성(분리와 도킹:인터페이스)

 

기본기가 중요하다.

대화가안되고 응용이안되면 XX

 

자바플랫폼 :

윈도우 프로그램(AWT), 파일입출력(FIle), 서블릿(HTTPServlet, HttpServletRequest,HttpServletResponse…)

'2021 Newlecture > JAVA' 카테고리의 다른 글

클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11
(추가정리) 상속  (0) 2021.04.10

언어 : 연산과 절차를 만들어 내는 명령어 집합 

API : 플랫폼이 제공한다. 플랫폼을 사용할 수있도록하는 인터페이스 (간접도구) 

플랫폼 : 프로그램을위한 도구, 재료 (카카오친구목록, 기상정보데이터, 디스크, 파일, ..)

           컴퓨터프로그래밍에서 절차에서 사용할 수있는 도구,재료,기반

 

인터페이스가 있는 플랫폼 

 

브라우저 오브젝트 API

다큐먼트 오브젝트 API

문자열을 정수로

함수가 플랫폼의 기능인지, 어느객체인지 찾기

 

언어의 기능이라면 언어의 레퍼런스 찾기

데이터변환은 언어가 갖고있는 범주

 

alert는 자바스크립트의 기능이 아니라 , 플랫폼(윈도우 객체가 제공하는)API다.

문자열로 반환된것 

 

요즘 디자인철학은

콘텐트를 기반으로한다

 

모방은 창조의 지름길이다. 

많이보고 베껴보기

 

페이지 가로로 나열

flex

 

이름을 부여하면

-이름 중복 부담

 

구조를 쓰면 

-구조가 변경되는 경우

불가능하다 (div이면서 첫째인것 의미) div는 pager의 둘째다. /  pager의 2번째자식 div

버튼속성의 집중화시킨것을 적용한다 div class ="button"

프론트엔드 : 다양한 클라이언트환경에 영향을 많이 받는다. 스크립트환경이 제각각이다.

              (쿠키 설정 허용문제 ,브라우저종류 등)

백엔드 : 약간의 안정성, 백엔드에서 문서만드는것을 최소화되고있다. 

요즘은 브라우저의 환경이 정제화되서 스크립트를 활용하기에 안정적인 환경을 갖고있다.

 

1.계산을 계속 할 수 있도록 계산기 UI를 출력하기

2. 한글 깨짐문제 해결하기

3. 계산기에서 계산한 결과 값 외에 계산했던 연산식도 함께 보여주기

4. POST와 GET요청의 이해와 코드 분리하기

5. POST요청의 기본 값

 

사용자입장에서는 불편한 계산기 

(다시 계산하려면 뒤로가야한다)

계산한 값을 출력하면서 UI를보여주자

계산한 값과 ui를 돌려주자.

Calc.java에 html을 넣어준다.

태그뒤에 "); 를 먼저 붙여넣기하고 out.write("를 붙여넣기한다. "앞에는 \넣어준다. 

 

java파일에서 실행 할 경우 500 오류 발생

req.getParameter("x"); x값이 없으니까 null이라서 오류난다. hmtl에서 실행해야한다.

계산한 값이 버튼옆에 뜬다.

동적인 문서, 서버문서

버튼옆에 숫자가 뜬다

한글깨지는 문제

서로해석을 잘못한것

ISO-8859-1 : 1바이트씩 잘라서 물음표로 나옴 

UTF-8 or EUC_KR : 2바이트씩이지만 뾰빽뽁식으로나옴

resp.setCharacterEncoding("UTF-8"); 출력도구에서 인코딩설정 //UTF-8로 보냄

브라우저에게 알려주는방법 (브라우저가 어떻게 읽을것인가에 대한 설정)

내가 UTF-8로 보냈어도 수신자가 UTF-8로 안받으면 오류발생
브라우저에게 알려주는 방법이 두가지있다
1.문서내에 메타데이터 "<meta charset=\"UTF-8\">" //UTF로 인코딩보낸것,보내는방식지정

  브라우저가 이 콘텐트가 무엇인지 알수 있다.

2. 웹의 헤더에 알려주는것 setContentType("text/html;charset=UTF-8") 

  브라우저가 제대로 읽을 수 있도록 서버단에 심어주는것 (최소책)

3."<meta charset=\"UTF-8\">");//2.브라우저에게 이코드방식으로 읽어라 최근방식

content type 에 UTP-8표시가없다. 대신 html의 meta 데이터 UTF-8설정을 찾아 한글을 출력한것
우 : contenty-type에 UTF-8이 나와있다.

 

얼마를 계산한건지 알기위해 x,y값을 알려주기

입력값없이 덧셈버튼을 누르면 500오류 발생 

String x_의 값이 null이고 null값을 파싱하려다 오류가난다. 

null을 파싱할수 없다는 오류

사용자의 값이 전달이 되지않았다. java파일에서 실행했을떄 오류

     if(x_ != null&&x_ != "") //null이면 0 ->객체비교

 

 

java파일에서도 실행되게 하려면 ? 

현재상태는 html를 통해서 실행된다. (html에서 실행했다)

html에서 데이터를 전달해야 실행되도록했지만 , 전달하지않으면 기본값을 설정할 수있지않을까

 

사용자가 입력한값이 null 이 아니거나 빈문자열이 아닐때 파싱을 하게한다. 

처음요청했을땐 노란색부분 이안나오고 나중에 포함되게하려면 ?

조건에따라서 나오게

세번째 : 널값이 아닌경우에만 출력하도록 조건을줘서 계산기 처음화면에서는 연산식이 보이지않는다.

 

POST와 GET요청의 이해

method = "post" 로 요청방식 변경

add -> 입력폼요청 GET

add*submit ->제출요청 POST

 

검색키워드가 서버로 둘다 전달된다.

GET - 폼을달라는요청 : 요청한 값이 url에 노출된다. 상태값을 유지해야하는때, 제출했던값 공유

  • 요청할때 쿼리스트링을 통해 전송
  • URL의 끝에 ? 와 함께 이름과 값으로  쌍을 이루는 요청 파라미터 : 쿼리스트링
  • 요청파라미터가 여러개이면 & 로 연결
  • URL에 조회 조건을 표시 하기 때문에 특정 페이지를 링크하거나 북마크가능
  • URL맴시멈이있다. 영어권기반, 멀티바이트코드사용불가

add?x=3&y=4 // 순수 GET요청만으로 값을 전달하고 결과를 얻는 요청

입력폼이있었지만 3,4를 누른 후 덧셈버튼을 눌럿을때 겟요청 후 포스트요청(덧셈)이지만 데이터전달형식은 get요청처럼보인다. post요청이 get요청처럼 되어있다.

 

POST - 제출요청(입력한것을 제출한다) : 요청값이 요청헤더에 따로전달됨. 데이터를 포스트바디에전달. 

  • 전송할 데이터를 HTTP메세지의 body에 담아서 전송
  • HTTP메세지의 body는 길이 제한이없다.
  • 그래서 대용량 데이터전송가능

 

웹은 모두 get요청이다 . (ex : <a >태그)

검색내용이 get일 경우 친구들과 검색결과를 공유할 수있다. (요청된 목록을 다른사람과 확인가능)

post일경우, 다시 해당사이트에서 검색을 해야한다. 

 

검색의 경우 : 검색결과가 문서를 달라고하는 요청이기때문에 get이 유용하다.

회원가입 : post요청하는게 적합

 

get (url에 입력한데이터가 노출)            /                  post (노출안됨)
POST일경우 브라우저-검사-네트워크-헤더요청에서 전달된값이 확인된다.

null일때와 빈문자열일때 

전달된 키워드가 없으면 null

전달된 키워드는있는데 값이없으면 빈문자열

숫자넣지않고 덧셈눌렀을때 빈문자열                 / html파일에서 name = x를 지우고 새로고침 후 덧셈을 누르면 전달된 x가없다. null임 

 

+ Recent posts