Port 8090 required by Tomcat v9.0 Server at localhost is already in use 와 같이 같이 포트번호가 이미 사용중이라는 오류 메세지가 뜰 때 해결하는 방법에 대해 포스팅해보겠다

 

필자는 포트번호를 tomcat 포트번호를 8090으로 사용하고 있다.

이클립스에서 아래 서버창에 Tomcat 서버를 더블클릭한다.

그러면 오른쪽 부근에 아래와같이 보일 것이다

본인이 어떤 포트번호를 사용하고 있는지 확인할 수 있다.

 

cmd 창으로 간다

 

netstat -a -n -o -p tcp | more  를 입력하여 tomcat이 사용하는 pid를 확인한다.

필자는 8090을 사용하고 있기 때문에 로컬주소에 뒷자리가 8090인 것을 찾고 해당 pid 번호(5092)를 기억한다.

 

다시 cmd 창에 taskkill /f /pid 5092 를 입력하면 

프로세스(pid 5092)가 종료되었습니다 라는 문구가 나오면서 해당프로세스 강제종료를 완료한다.

반응형

 


쿠키 세션
저장위치 브라우저 서버
보안 비교적 보안이 취약 상대적으로 안전
LifeCycle 유효기간이 남아 있으면 브라우저를 종료해도 유지 브라우저 종료시 세션 삭제
속도 상대적으로 빠름 요청마다 서버에서 처리해야하기 때문에 느림

 

쿠키는 웹브라우저가 보관하는 데이터이다. 웹 브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송하며, 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해서 필요한 데이터를 읽을 수 있다. 이를 사용하면 웹 서버와 웹 브라우저는 필요한 값을 공유하고 상태를 유지할 수 있다.

ex) 아이디 자동완성, 오늘만 보지않기(팝업창), 쇼핑몰에서 로그인 안한 상태에서 장바구니 담기(지워져도 크게 상관없는 것)

 

세션은 클라이언트의 상태를 저장할 수 있다. 쿠키와의 차이점은 세션은 웹 브라우저가 아니라 서버에 값을 저장한다는 것이다. 서버는 세션을 사용해서 클라이언트 상태를 유지할 수 있기 때문에 로그인한 사용자 정보를 유지하기 위한 목적으로 세션을 사용한다.

ex) 네이버 로그인한 후 에 카페, 블로그, 쇼핑 창을 이동해도 로그아웃되지 않음

반응형

'Web > HTML | JSP' 카테고리의 다른 글

input 텍스트 입력 시 숫자만 허용하기 (onkeyup)  (0) 2022.04.01

hoisting이란 변수, 함수 선언을 최상단으로 끌어 올린다는 것이다. 즉 런타임시 어떤 변수를 출력하는데 변수선언이 되어있지 않음에도 불구하고 오류가 나지 않는다는 것이다. 예를 들어보자

 

console.log(a);
var a = 1;
console.log(a);

 

위의 경우 변수 a를 선언하기도 전에 콘솔 창에 a를 출력하도록 했다. 원래대로라면 오류가 나야 정상이지만 자바스크립트에서 var 로 변수를 선언하게 되면 hoisting이라는 특성 때문에 오류가 나지않는다 즉, 최상단에서 변수선언이 이루어 진 것이다. 때문에 변수 선언문 다음의 콘솔출력은 정상적으로 1이 출력되는 것을 볼 수 있다.

이러한 hoisting은 다른언어를 공부한 사람들에게는 정말 미친(?) 개념이 아닐 수 없다. 이러한 오류를 줄이기 위해 변수 선언시 let을 사용하는 것이 좋다.

이러한 hoisting은 var에서 일어나는 현상이다.

 

console.log(a);
let a = 1;
console.log(a);

같은 코드에서 변수선언을 let으로 해보았다. 콘솔창에서 오류가 발생하는 것을 알 수 있다. 이것이 정상적인 것이다...

let은 ES6에서 추가가 되었는데 chrome에서는 호환이 잘 되기 때문에 문제없이 사용가능하다.

문제많은 var를 사용할 이유가 없다.

 

또 var를 사용하면 안되는 이유가 있다.

{ }스코프에 영향을 받지 않는다. (이것도 정말 미친것같다...)

 

{
    var a = 1;    
}
console.log(a);

위 코드를 보면 변수 a는 스코프 안에서 var를 통해 선언되었고 1을 할당 받았다. 그리고 스코프 밖에서 a를 출력한다. 정상적이라면 오류가 나야 정상이다. 하지만..

이렇게 스코프를 무시하고 1을 출력하는 것을 볼 수 있다. (정말 문제가 많은 녀석이다...)

하지만 let을 사용하면 

{
    let a = 1;    
}
console.log(a);

이렇게 정상적으로 오류가 나는 것을 볼 수 있다. (이게 지극히 정상이다..)

 

결론 : 변수선언시 let을 사용하는 것이 바람직하다 

반응형

순수 바닐라 자바스크립트를 사용할땐 use strict을 선언하는 것이 좋음

자바스크립트 언어는 굉장이 유연한 언어이다. 유연하다는 것은 아주 위험하기도 하다는 것이다. 

이는 개발자가 많은 실수를 할 수 있다는 것을 의미한다. 자바스크립트에서는 선언되지 않은 변수의 값을 할당 한다던지 아니면 기존에 존재하는 프로토타입을 변경한다든지 이런 비상식적인 것들은 다른언어를 공부하고 온 개발자들이 봤을 때 미친 것들이다... use strick는 ECMAScript5 에 추가되어 있다. 그래서 use strict를 선언하면 비상식적인 행위들을 할 수 없게된다. 즉 비상식적인 오류들을 줄일 수 있다는 것이다.

반응형

html로 자바스크립트를 불러올 때 여러가지 방법으로 코드를 가져올 수 있는데 asyn와 defer 속성을 사용하는 것이 이에 해당된다. asyn와 defer말고도 다른 가능한 경우들도 코드를 보면서 차근차근 설명해보겠다.

위 코드에는 html을 쭉 parsing 하다가 script tag가 보이면 main.js를 다운받는다. 이때 parsing을 잠시 멈추고 필요한 자바스크립트 파일을 서버에서 다운받아 실행한 다음에 parsing하는 부분으로 넘어간다 이때 단점은 js파일이 용량이 크면 속도에 많은 지장을 준다. 따라서 사용자의 속도가 느려진다. 이 때문에 script를 head에 넣는것은 좋은 습관이 아니다.

 

 

그리고 위코드처럼 body안 끝부분에 script를 추가하는 경우가 있는데 이 경우는 html을 다운받아 쭉 parsing하면서 페이지가 준비가 된 다음에 script를 만나게 되면 서버에서 script를 받아오고 실행하게 된다. 그래서 js를 받기도 전에 페이지가 사용자들에게 준비가 되면서 사용자가 페이지의 컨텐츠를 볼 수 있다. 이 방법은 사용자가 기본적인 html의 컨텐츠를 빨리 본다는 장점은 있지만 웹사이트가 자바스크립트에 의존적이라면 즉, 사용자가 의미있는 컨텐츠를 보기위해서 자바스크립트를 이용해서 서버에 있는 데이터를 받아와야하는 경우의 웹사이트라면 사용자가 정상적인 페이지를 보기전까지는 fetching하는, 그러니까 서버에서 자바스크립트를 받아오는 시간을 기다려야되고 실행하는 시간도 기다려야하는 단점이 있다.

 

 

그리고 위의 경우는 head안에 script를 이용하되 asyn라는 속성값을 사용하는 것이다. asyn는 boolean타입의 속성값이기 때문에 이렇게 선언하는 것만으로도 true로 설정이되어 asyn옵션을 사용가능하다. asyn를 사용하면 브라우저가 html을 다운받아 parsing 하다가 asyn를 발견하면 병렬로 main.js를 다운받으라는 명령을 내려놓고 다시 parsing을 하다가 main.js가 다운완료되면 그때 parsing하는 것을 멈추고 다운로드된 js파일을 실행한다. 이렇게 실행하고 나서 나머지 html을 parsing한다. 

이 경우 body끝에 사용하는 것보다 fetching이 parsing하는 동안 병렬적으로 일어나기 때문에 다운로드 받는 시간을 절약할 수 있다. 하지만 자바스크립트가 html이 parsing 되기도 전에 실행이 되기때문에 만약 js파일에서 query selector를 이용해서 DOM요소를 조작하려 한다면 이 조작하려하는 시점에 html이 우리가 원하는 요소가 아직 정의 되어 있지 않을 수 있다. 이 부분이 조금 위험할 수 있다. html을 parsing하는 동안에 언제든지 js를 실행하기 위해서 멈춰질수 있기 때문에 사용자가 페이지를 보는데에 시간이 조금 걸릴 수 있는 단점이 있다.

 

 

이 경우는 defer을 사용하는 것이다. 앞에서와 마찬가지로 head안에 script를 넣고 정의하는데 이 경우는 parsing 하다가 script에 defer를 보고 main.js 다운 명령만 시켜놓고 나머지 html을 끝까지 parsing한다. 그리고 마지막에 parsing이 끝난 다음에 다운로드된 main.js를 실행한다. 때문에 defer를 사용하는 것이 가장 좋은 옵션이라고 할 수 있다.

html을 parsing하는 동안 js파일을 다운받아 놓고 html parsing을 먼저해서 사용자에게 페이지를 보여준 다음에 js를 실행하기 때문이다.

 

 

그리고 위의 경우는 asyn옵션으로 다수의 script를 다운받으면 먼저 다운되는 것을 먼저 실행되고 다음에 다운완료되는 것이 실행되기 때문에 순서에 의존적인 자바스크립트라면 문제가 될 수 있다.

 

 

위 코드와 같은 상황에서 defer같은 경우는 parsing하는 동안 필요한 script를 모두 다운받아 놓고 순서대로 실행하기 때문에 정리한 순서대로 실행이 된다.

 

 

* 종합해보면 가장 마지막 경우와 같이 head 안에 defer옵션을 이용해서 가장 효율적이고 안전하다고 볼 수 있다.

반응형

오라클 DB 설치하면 C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 이 경로에 ojdbc.jar가 있을 것이다.

필자는 현재 ojdbc6을 사용하고 있다.

 

이를 통해 자바와 연동을 하는 것이다.

 

연동하기 위해 먼저 이클립스에서 Project Explorer에 있는 프로젝트를 우클릭하고 아래에 Properties를 클릭한다

그러면 아래와 같이 창이 뜰것이다.

 

Java Build Path에서 Libraries탭으로 가면 우측에 Add External JARs... 버튼을 클릭한다 (현재 필자는 ojdbc6.jar가 들어가 있다.)

 

그리고 위에서 말한 경로로 들어가 해당 jar를 선택하고 Apply and Close 버튼을 누르면 해당 프로젝트는 오라클과 연동이 가능한 상태가 된다.

 

연동이 잘 되어있는지 확인하기 위해 해당 프로젝트의 Referenced Libraries를 확인한다.  Referenced Libraries 아래에 해당 jar 가 있으면 연동이 되어있는 상태이다. 

 

반응형

 

 

 

무결성 제약 조건

                         

NOT NULL

NULL을 허용하지 않는다.

UNIQUE

중복된 값을 허용하지 않는다. 항상 유일한 값을 갖도록 한다.

PRIMARY KEY

NULL을 허용하지 않고 중복된 값을 허용하지 않는다.

NOT NULL 조건과 UNIQUE 조건을 결합한 형태이다.

FOREIGN KEY

참조되는 테이블의 칼럼의 값이 존재하면 허용한다.

CHECK

저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만을 허용한다.

 

FOREIGN KEY

CREATE TABLE EMP03( 
EMPNO NUMBER(4),
ENAME VARCHAR2(10) CONSTRAINT EMP03_ENAME_NN NOT NULL, 
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMP03_JOB_UK UNIQUE(JOB),
CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
); 

참조하기 위해서는 상위 테이블의 해당 컬림이 기본키로 지정되어 있어야 하위 테이블에서 외래키로 참조할 수 있음 

 

CHECK 제약조건 

CREATE TABLE EMP06( 
EMPNO NUMBER(4) PRIMARY KEY,
ENAME VARCHAR2(10) NOT NULL, 
GENDER VARCHAR2(1) CHECK (GENDER IN('M', 'F'))
); 

 

컬럼레벨 방식으로 제약조건 지정하기

CREATE TABLE EMP05( 
EMPNO NUMBER(4) CONSTRAINT EMP05_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT EMP05_ENAME_NN NOT NULL, 
JOB VARCHAR2(9) CONSTRAINT EMP05_JOB_UK UNIQUE,
DEPTNO NUMBER(4) CONSTRAINT EMP05_DEPTNO_FK REFERENCES DEPT(DEPTNO)
); 

 

테이블 레벨 방식으로 제약조건 지정하기

(PRIMARY KEY 같은 경우 중복으로 지정할 수 있는데 이렇게 중복으로 정의하려면 테이블 레벨 방식으로 지정해야한다)

 

▶복합키 지정

CREATE TABLE MEMBER01( 
NAME VARCHAR2(10),
ADDRESS VARCHAR2(30),
HPHONE VARCHAR2(16),
CONSTRAINT MEMBER01_COMBO_PK PRIMARY KEY(NAME, HPHONE)
); 

▶ 컬럼 레벨과 테이블 레벨 방식 둘다 사용하여 제약조건 지정

CREATE TABLE EMP03( 
EMPNO NUMBER(4),
ENAME VARCHAR2(10) CONSTRAINT EMP03_ENAME_NN NOT NULL, 
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMP03_JOB_UK UNIQUE(JOB),
CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
); 

NOT NULL 은 컬럼레벨만 가능한 것 같음..

 

제약조건 추가하는 방법

ALTER TABLE DEPT03
ADD CONSTRAINT DEPT03_DEPTNO_PK PRIMARY KEY (DEPTNO);
ALTER TABLE EMP01
ADD CONSTRAINT EMP01_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO);

 

제약조건 제거하는 방법

ALTER TABLE EMP05
DROP CONSTRAINT EMP05_EMPNO_PK;

 

제약조건 확인하기

SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP03';


CONSTRAINT_NAME                                              CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------
EMP03_ENAME_NN                                               C
EMP03
"ENAME" IS NOT NULL

EMP03_EMPNO_PK                                               P
EMP03


CONSTRAINT_NAME                                              CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------

EMP03_JOB_UK                                                 U
EMP03


EMP03_DEPTNO_FK                                              R
EMP03

CONSTRAINT_NAME                                              CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------

C -> NOT NULL이나 CHECK 제약이 걸려있음 (DESC 테이블명으로 구조파악 하면 NULL 여부가 나오므로 구분 가능 )

P -> PRIMARY KEY

U -> UNIQUE

R -> REFERENCES

(SELECT 문에 R_CONSTRAINT_NAME 를 추가하면 참조관계 확인 가능)

 

CASCADE

DROP TABLE DEPT01 CASCADE CONSTRAINTS;

CASCADE를 이용해서 참조(REFERENCES)받는(상위 테이블) 테이블이어도 제거 가능

(하위테이블은 DROP으로 바로 제거 가능)

 

 

반응형

INSERT - 데이터 삽입

INSERT INTO DEPT01 (DEPTNO, DNAME, LOC)
VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT01
VALUES (40, 'OPERATIONS', NULL);

명령에 컬럼을 생략하고 데이터를 삽입하려면 해당 테이블의 구조 즉, 컬럼의 순서에 따라 정확한 VALUES 값을 입력해야함

(컬럼명을 생략하는 것이 좋은 습관이 아니므로 생략하지 않도록 하자)

 

 

emp테이블의 스키마를 복사한 emp01 테이블을 생성 후 다음과 같이 데이터를 저장

 

create table emp01
as select * from emp where 0 = 1;

insert into emp01 values (7369,'SMITH','CLEARK' ,7836,'80/12/17', 800, null,20);
insert into emp01 values (7499,'ALLEN','CLEARK' ,7836,'80/12/17', 1600, 300,20);
insert into emp01 values (7839,'KING','PRESIDENT' ,NULL,NULL,5000,NULL,NULL);

 

부서테이블의 부서번호와 부서이름을 입력하고 나머지는 NULL을 입력

INSERT INTO department( deptno, dname)
VALUES (300,'lifetech'); 

 

교수 테이블에서 입사일을 2005년 1월 1일로 입력하여라.

'YY/MM/DD'형식입력 :

INSERT INTO professor(profno,name,position, hiredate,deptno)
VALUES(9920,'choi','assist','05/01/01',102);

'YYYY-MM-DD' 형식 입력 :

INSERT INTO professor(profno,name,position, hiredate,deptno)
VALUES(9920,'choi','assist', TO_DATE('2005/01/01','YYYY/MM/DD'), 102);

 

 

▶모든 컬럼의 데이터를 복사해서 삽입

insert all into emp01
select * from emp;

(구조가 동일해야함)  (all 생략 가능)

 

▶조건에 해당되는 데이터 모두 복사하기

insert into emp01
select * from emp
where sal > 2000;

 

▶여러개의 테이블에 복사하기

INSERT ALL
INTO EMP01 VALUES (EMPNO, ENAME, SAL)
INTO EMP03 VALUES (EMPNO, ENAME)
SELECT EMPNO, ENAME, SAL FROM EMP
WHERE DEPTNO >= 20;

(emp01에는 empno, ename, sal 컬럼 3개만 가지고 있어야함

emp03에는 empno, ename 컬럼 2개만 가지고 있어야함)

 

 

 

 

 

 

 

UPDATE - 데이터 수정

UPDATE EMP04
SET SAL = SAL * 1.1
WHERE SAL >= 3000;
UPDATE EMP04
SET DEPTNO = 20, JOB = 'MANAGER'
WHERE ENAME = 'SCOTT';

 

학번이 10201인 학생의 학년과 학과 번호를 10103학번 학생의 학년과 학과번호 와 동일하게 수정

UPDATE student
SET (grade, deptno) = (SELECT grade, deptno FROM student WHERE studno = 10103)
WHERE studno = 10201;

 

 

 

 

DELETE - 데이터 삭제

DELETE FROM EMP04
WHERE DEPTNO = 30;
DELETE FROM EMP04
WHERE HIREDATE >= '85/01/01';

 

반응형

+ Recent posts