본문 바로가기

Oracle

23일차 공부 Transaction

1 교시

 

** SQL의 분류

1. Database 이론

 1) DDL(정의) - 데이터베이스 객체를 생성하고 구조를 변경하고 제거

 2) DML(조작) - 데이터를 삽입하고 갱신하고 삭제하고 조회

 3) DCL(제어) - 데이터베이스의 무결성, 회복, 병행제어 등을 처리

=> DDL과 DCL은 DBA(데이터베이스 관리자)의 언어

=> DML은 USER의 언어

=> 트랜잭션 제어 명령어를 DCL에 포함

 

2. 실무에서의 분류

 1) DDL - 데이터베이스 객체를 생성하고 구조를 변경하고 제거(CREATE, ALTER, DROP

 2) DQL - 데이터베이스 조회(SELECT)

 3) DML - 데이터를 삽입하고 갱신하고 삭제(INSERT, UPDATE, DELETE)

 4) TCL - 트랜잭션 제어어(COMMIT, ROLLBACK, SAVEPOINT)

 5) DCL  - 권한, 회복, 병행제어, 무결성에 관련된 명령어(GRANT, REVOKE, IMPORT, EXPORT)

=> DQL, DML, TCL은 USER의 언어로 간주하고 DDL, DCL을 DBA의 언어로 간주

 

3. DATABASE에서 얘기하는 USER는 APPLICATION PROGRAMMER

 

* DATABASE 구동 원리

=> 관계형 DATABASE는 원본에 바로 작업하는 경우가 거의 없다.

=> 복사본에 작업을 수행하고 작업이 완료되면 원본에 다시 복사하는 형태로 동작

=> 지금까지 수행한 작업을 원본에 반영할 지 여부를 결정하는 명령러를 TCL이라고 한다.

 

* TRANSACTION

=> 한번에 이루어져야 하는 작업의 논리적 단위

1. 기본 성질(ACID)

 1) ATOMICITY(원자성) : ALL OR NOTHING - 전부 수행되거나 전부 수행되지 않아야 한다.

 2) CONSISTENCY(일관성) : 한 번 완료된 트랜잭션은 일관성은 유지해야 한다.

 3) ISOLATION(독립성) : 트랜잭션은 다른 트랜잭션에 독립적이어야한다.

 4) DURABILITY(영속성) : 한번 완료된 트랜잭션은 계속되어야 한다.

 

2. 트랜잭션 명령어

 1) COMMIT : 작업을 원본에 반영

 2) SAVAPOINT : ROLLBACK할 지점을 만드는 명령어

 3) ROLLBACK : 작업을 취소

 

3. AUTO COMMIT : 자동으로 COMMIT 되는 상황

=> DDL 이나 DCL이 성공적으로 수행된 경우

=> 접속 프로그램을 정상적으로 종료한 경우

 

4. AUTO ROLLBACK 되는 경우

=> 사용 중에 정전이나 컴퓨터의 고장으로 인한 SHUT DOWN의 경우에는 ROLLBACK 된다.

 

5. 프로그래밍 언어에서 데이터베이스를 사용하는 경우 그 언어나 프레임워크의 기본 트랜잭션 동작에 대해서 미리 알아보고 프로그래밍을 해야 한다.

 

JAVA에서 데이터베이스를 사용할 때는 기본적으로 AUTO COMMIT이고 JAVA에서도 HIBERNATE와 같은 데이터베이스 연동 프로그램을 사용할 때는 MANUAL COMMIT(수동커밋)이다.

 

 

 

2 교시

 

6. TRANSACTION 적용 모드 

 1) AUTO COMMIT : SQL 명령어가 실행되면 무조건 COMMIT을 수행하는 방식

JAVA나 DBEAVER의 기본모드

 

 2) MANUAL COMMIT : DML이나 DQL의 경우는 직접 COMMIT이나 ROLLBACK을 해야만 적용되는 방식

=> 다른 프로그래밍언어나 대다수의 접속프르그램의 기본 모드

=> 프로그램에 적용할 때도 대부분 이 방식을 사용

 

 

 

 

 

 

 

3~4 교시

 

 ** CONSTRAINT(제약조건)

=> 데이터베이스에 잘못된 데이터가 삽입되지 않도록 데이터베이스의 열 들에 설정하는 여러가지 규칙

1. 종류

 1) NOT NULL : 필수 입력

 2) UNIQUE : 유일성 - 중복될 수 없다. NULL은 가능하고 중복 체크를 하지 않음

 3) PRIMARY KEY : NOT NULL 이고 UNIQUE

 4) CHECK : 값의 범위나 조건을 지정

 5) FOREIGN KEY : 외래키 - 다른 테이블에서 데이터를 조회하기 위한 열

 

2. 제약조건 확인

=> 제약조건은 USER_CONSTRAINTS 테이블에서 확인 가능

=> CONSTRAINTS TYPE이 종류를 의미

P : PRIMARY KEY

R : FOREIGN KEY

U : UNIQUE

C : CHECK, NOT NULL

 

3. 제약조건 설정

 1) 행 레벨 제약조건 설정 : CREATE TABLE 구문에서 행을 만들 때 기재

 2) 테이블 레벨 제약조건 설정 : 행을 다 만들고 제약조건을 설정

 

 

4. NOT NULL

=> 필수 입력을 하고자 하는 경우에 사용

=> 행 레벨에서만 설정 가능

=> NOT NULL은 실제로는 하나의 바이트를 이용해서 설정하기 때문

NOT NULL로 지정하면 NULL을 표현하기 위한 BYTE가 만들어지지 않기 때문에 행을 만들 때 결정을 해야 한다.

 

5. UNIQUE

=> 유일성

=> NULL은 제외 - NULL은 여러개 일 수 있다.

 

6. PRIMARY KEY

=> NOT NULL 이고 UNIQUE

=> 1개 이상의 열로 만듬 - 2개 이상의 열로 만들 수도 있다.

=> 테이블에서 1개만 생성 가능

=> 테이블에서 행을 구분하기 위한 유일 무이한 속성 또는 속성의 집합

 

7. CHECK

=> 값의 범위나 조건을 설정

=> 컬럼이름 조건의 형태로 입력

=> GENDER는 M 또는 F의 값만을 가져야 한다.

GENDER CHAR(1) CHECK(GENDER IN ('M', 'F'))

=> SCORE는 0-100까지 사이의 값이어야 한다.

SCORE NUMBER(3) CHECK(SCORE BETWEEN 0 AND 100)

 

EX) 회원정보를 저장하는 테이블

EMAIL 변하지 않는 문자열 50자 (한글 없음) - PRIMARY KEY

NAME 변하지 않는 문자열 10자 (한글) - 필수 입력

PHONE 변하는 문자열이지만 글자수는 항상 11자(한글 없음) - 유일해야함, NULL가능

GENDER 영문 한글자로 M 과 F 만 가능

ADDRESS 변하는 문자열로 한글 100자 이내

DESCRIPTION 변하는 문자열로 한글 1000자 이내 - 긴 문자열

 

CREATE TABLE MEMBER(

   EMAIL VARCHAR2(50) PRIMARY KEY,  

   NAME VARCHAR2(30) NOT NULL,

   PHONE VARCHAR2(11) UNIQUE,

   GENDER VARCHAR2(1) CHECK(GENDER IN('M', 'F')),

   ADDRESS CHAR(300),

   DESCRIPTION CLOB);

 

 

 

5 교시

 

7. FOREIGN KEY

=> 다른 테이블의 데이터를 참조하기 위한 열

=> 자신의 테이블에서 어떤 열이던 상관이 없지만 다른 테이블에서 UNIQUE하거나 PRIMARY KEY이어야 한다.

=> REFERENCES 테이블이름(열이름) 옵션

=> 옵션은 생략가능하고 ON DELETE CASCADE, ON DELETE SET NULL, ON UPDATE CASCADE 등이 있다.

=> 외래키로 지정된 열을 소유하고 있는 테이블을 부모 테이블이라고 하고 외래키를 소유한 테이블을 자식 테이블이라고 한다.

=> 별다른 옵션 없이 만들면 자식 테이블에 존재하는 데이터는 부모 테이블에서 삭제할 수 없다.

ON DELETE CASCADE는 부모 테이블에서 지워질 때 자식 테이블에서도 연쇄적으로 지워진다

ON DELETE SET NULL은 부모 테이블에서 지워질 때 자식 테이블에서는 외래키의 값이 NULL로 설정된다.

ON UPDATE CASCADE는 부모 테이블에서 갱신이 발생할 때 자식 테이블에서도 같이 갱신이 수행된다.

 

=> 외래키를 만드는 방법은 테이블 간의 관계를 확인해봐야 한다.

1:1 관계일 때는 양쪽 테이블의 기본키를 상대방 테이블에 외래키로 추가

1:N 관계일 때는 1인 쪽 테이블의 기본키를 상대방 테이블에 외래키로 추가

N:N 관계일 때는 양쪽 테이블의 기본키를 외래키로 갖는 별도의 테이블을 생성

 

=> 회원 테이블과 게시판 테이블이 존재하는 경우

회원 1명이 여러 개의 게시글을 작성할 수 있다.

게시글 1개는 1명이 작성해야 한다.

 

회원과 게시판의 관계는 1:N 이 된다.

회원 테이블의 기본키를 게시판 테이블의 외래키로 추가해주어야 하고 회원 테이블이 부모 테이블이 되고 게시판 테이블이 자식 테이블이 된다.

 

=> 회원 테이블과 상품 테이블이 존재하는 경우

회원 1명은 여러 개의 상품을 구매할 수 있다.

동일한 상품을 여러 명이 구입할 수 있다.

이런 경우는 N:N 이라고 한다.

회원테이블의 기본키와 상품 테이블의 기본키를 외래키로 갖는 별도의 테이블을 생성해야 한다.

 

회원 테이블을 참조하는(EMAIL을 외래키) 게시판 테이블을 생성

=> 글번호(정수 10자리 - 기본키), 제목(변하는 문자열이고 한글100자 까지), 내용(긴 문자열), 작성일(날짜), 조회수(정수 10자리)로 구성

CREATE TABLE BOARD(

    NUM NUMBER(10) PRIMARY KEY,

    TITLE CHAR(300),

    CONTENT CLOB,

    WRITEDATE DATE,

    READCNT NUMBER(10),

    EMAIL VARCHAR2(50) REFERENCES MEMBER(EMAIL) ON DELETE CASCADE);

    

=> 외래키가 설정되면 부모 테이블의 데이터를 삭제하거나 부모 테이블을 제거하려고 하면 에러가 발생할 수 있다.

 

 

8. DEFAULT

=> 데이터를 입력하지 않았을 때 대입하는 기본값

=> DEFAULT 기본값 형식으로 추가하면 된다.

=> 작성일 같은 경우는 직접 입력받는 것보다는 SYSDATE가 자동으로 대입되도록 해주는 것이 좋다.

=> 조회수도 기본값으로 0을 설정하는 것이 바람직하다.

CREATE TABLE BOARD(

    NUM NUMBER(10) PRIMARY KEY,

    TITLE CHAR(300) DEFAULT '무제', 

    CONTENT CLOB DEFAULT '냉무',

    WRITEDATE DATE DEFAULT SYSDATE,

    READCNT NUMBER(10) DEFAULT 0,

    EMAIL VARCHAR2(50) REFERENCES MEMBER(EMAIL));

 

9. INTEGRITY(무결성) , 면접은 아니고 시험에서 중요하다.

 1) ENTITY INTEGRITY(개체 무결성) : 기본키는 NULL이거나 중복될 수 없다.

 2) REFERENCE INTEGRITY(참조 무결성) : 외래키는 NULL이거나 참조할 수 있는 값만을 가져야한다.

=> 데이터베이스와 관련된 시험을 치를 때 반드시 기억(E-R DIAGRAM, TRANSACION ACID, INTEGRITY)

이거 틀리면 절대 안됨.

 

 

 

6~7 교시

 

10. 제약조건 이름

=> 제약조건 이름을 설정하지 않고 제약조건을 만들면 오라클은 SYS로 시작하는 번호를 이용해서 제약조건 이름을 설정

=> 제약조건은 USER_CONSTRAINTS;

SELECT *
FROM USER_CONSTRAINTS;

=> 제약조건을 만들 때 이름을 부여할 수 있는데 이 때는 제약조건 앞에 CONSTRAINT 제약조건 이름을 추가하면 된다.

=> 기본키에는 PK, 외래키는 FK, 유일성은 UK, NOT NULL은 NN, 체크 제약조건은 CK를 붙이는 것이 개발자들의 관습

 

11. 테이블 레벨 제약조건

=> 행을 만들 때 제약조건을 설정하지 않고 행을 전부 선언하고 마지막에서 제약조건을 설정하는 것

=> [CONSTRAINT 제약조건이름] 조약조건종류 (컬럼이름)

=> NOT NULL은 테이블 레벨 제약조건으로 사용할 수 없음

=> 기본키는 제약조건 종류를 PRIMATY KEY, 유일성은 UNIQUE, CHECK는 동일하고 외래키는 FOREIGN KEY(열이름) REFERENCES 테이블(참조할 열이름) 으로 설정한다.

=> 기본키를 2개 이상의 열로 만들 때는 반드시 테이블 레벨 제약조건으로 만들어야 한다.

=> NCS LEVEL 4 시험에서는 기본키로 2개 컬럼 설정하는 것이 문제로 출제

 

--회원 테이블을 생성
--EMAIL 영문 및 숫자로 50 자리 이내이며 변하지 않음
--NAME 한글 포함 10이내이며 변하지 않음
--NICKNAME 한글 포함 20자리 이내이며 변하지 않음
--PASSWORD 영문과 숫자 조합으로 15자리 이내이며 자주 변함
--PHONE 숫자로만 이루어진 문자열로(0으로 시작할 수 있음) 11자리이면 변할 수 있음
--REGISTERDATE 날짜 : 회원가입일로 기본값으로 현재 시간
--EMAIL은 PRIMARY KEY

CREATE TABLE MEMBER(
   EMAIL VARCHAR2(50),
   NAME VARCHAR2(30),
   NICKNAME VARCHAR2(60),
   PASSWORD CHAR(15),
   PHONE NUMBER(11),
   REGISTERDATE DATE DEFAULT SYSDATE,
   CONSTRAINT PKMEMBER PRIMARY KEY(EMAIL)
   );

 

12. 제약조건 갱신

 1) 제약조건 추가

ALTER TABLE 테이블이름

ADD CONSTRAINT 제약조건이름 제약조건종류(컬럼이름);

ALTER TABLE MEMBER(
ADD CONSTRAINT UKUNIQUE UNIQUE(NICKNAME); 
)

 

 2) 제약조건 변경 - NOT NULL은 제약조건 추가가 아니고 변경

ALTER TABLE 테이블이름

MODIFY 열이름 CONSTRAINT 제약조건이름 제약조건종류;

ALTER TABLE MEMBER(
MODIFY NICKNAME CONSTRAINT NNUNIQUE NOT NULL; 
)

 

3) 제약조건 삭제

 ALTER TABLE 테이블이름

 DROP CONSTRAINT 제약조건이름;

 

 

 

13. 제약조건 활성화 & 비활성화

 1) 제약조건을 일시적으로 비활성화 : 샘플링 입력이나 테스트할 때 주로 이용

ALTER TABLE 테이블이름

DISABLE CONSTRAINT 제약조건이름;

 

 2) 제약조건을 활성화

ALTER TABLE 테이블이름

ENABLE CONSTRAINT 제약조건이름;

 

14. 제약조건의 사용

=> 개발자들은 제약조건을 설정하지 않을려고 하는 경향이 있는데 이는 잘못된 생각

 

 

 

 

8 교시

 

** 오라클의 데이터베이스 객체

1. 종류

 1) TABLE

 2) VIEW

 3) SEQUENCE

 4) INDEX

 5) SYNONYM

 6) PROCEDURE

 7) TRIGGER

 

2. VIEW

=> 논리적인 가상의 테이블

=> 실제 존재하지는 않지만 마치 테이블처럼 사용

=> 테이블이나 다른 뷰로부터 생성

=> 자주 사용하는 SELECT 구문을 하나의 이름으로 묶어두고 사용하는 것

 1) 사용 목적

  => 속도 : VIEW나 PROCEDURE는 한번 호출하면 메인 메모리에 남아있게 되어서 다음에 호출할 때 속도가 빠르다.

  => 보안 : USER에게 USER가 필요한 데이터만 골라줄 수 있어서 보안 기능이 강화될 수 있다.

 

 2) 생성

CREATE OR REPLACE VIEW 뷰이름

AS

SELECT 구문

[WITH CHECK OPTION]

[WITH READ ONLY]

 

=> VIEW는 구조 변경이 안되서 ALTER VIEW가 없다.

=> 구조를 변경할 때는 OR REPLACE를 이용

=> VIEW는 가상의 테이블이지만 DML 작업이 가능하다.

VIEW에 데이터를 삽입하면 원본 테이블에 데이터가 삽입된다.

=> DML(INSERT, UPDATE, DELETE) 작업을 못하도록 할 때 WITH READ ONLY 를 추가

=> WITH CHECK OPTION은 VIEW에 존재하는 데이터만 DML 작업을 할 수 있도록 하기 위한 옵션

 

 3) 삭제

DROP VIEW 뷰이름;

 

 4) 뷰 생성과 삭제

 DEPT 테이블의 데이터를 이용해서 DEPTVIEW를 생성

 

 

원본에 데이터 삽입이 안된다.

 

 

VIEW 삭제

 

 

 

 

3. SEQUENCE

=> 오라클에서 일련번호를 만들어주기 위해서 제공되는 객체

1) 생성

CREATE SEQUENCE 시퀀스이름

START WITH 시작숫자

INCREMENT BY 증가숫자

MAXVALUE 최대값

MINVALUE 최소값

CYCLE | NOCYCLE

CACHE | NOCACHE;

 

=> START WITH는 시작 위치로 기본값은 계정에 따라 다름

=> INCREMENT BY 는 증가값으로 기본값은 1

=> MAXVALUE는 최대값으로 기본값은 10의 27승

=> MIXVALUE는 최소값으로 기본값은 1

=> NOCYCLE은 최대값까지 간 경우 최소값으로 돌아오지 않는다.

기본키를 만들 대는 이 옵션을 사용

=> CACHE는 기억할 값의 개수로 기본값은 20

 

 

2) 사용

시퀀스이름.NEXTVAL : 다음 시퀀스 값 가져오기

시퀀스이름.CURRVAL : 현재 시퀀스 값 가져오기

=> 생성하고 1번은 NEXTVAL을 호출해야 CURRVAL 사용 가능

 

3) 변경

ALTER SEQUENCE 시퀀스이름

옵션 설정

=> START WITH는 수정할 수 없다.

=> START WITH를 변경할 때는 삭제하고 다시 생성

 

4) 삭제

DROP SEQUENCE 시퀀스이름;

 

 

 

3. INDEX 

=> 데이터를 빠르게 찾을 수 있도록 설정한 포인터

1) 장점

=> 검색속도가 향상

 

2) 단점

=> 추가적인 공간이 필요

=> 삽입이나 삭제가 빈번히 발생하면 속도가 느려진다.

 

3) 오라클의 경우는 B*트리 이용

 

4) PRIMARY KEY와 UNIQUE에는 별도의 지정이 없어도 인덱스를 생성

 

시험문제1)

--USER_INFO 테이블 만들기
CREATE TABLE USER_INFO(
ID CHAR(18) PRIMARY KEY,
NAME CHAR(18) UNIQUE,
PASSWORD CHAR(18) NOT NULL,
EMAIL CHAR(30) UNIQUE
);

--BOARD 테이블 만들기
CREATE TABLE BOARD(
     ARTICLE_ID NUMBER PRIMARY KEY,
     USER_ID CHAR(18) REFERENCES USER_INFO(ID) ON DELETE CASCADE,
     ARTICLE_TITLE CHAR(50) NOT NULL,
     ARTICLE_DETAIL VARCHAR2(1000),
     ARTICLE_HITS NUMBER,
     ARTICLE_RECOMMEND NUMBER
);
   
--FILES 테이블 만들기
CREATE TABLE FILES(
FILE_ID CHAR(18),
FILE_NAME CHAR(18) UNIQUE,
FILE_SIZE CHAR(18) NOT NULL,
ARTICLE_ID NUMBER,
CONSTRAINT PK_FILES PRIMARY KEY(FILE_ID),
CONSTRAINT FK_BOARD FOREIGN KEY(ARTICLE_ID) REFERENCES BOARD(ARTICLE_ID) ON DELETE SET NULL
);

 

 

시험문제2)

1. EMP테이블에서 각 업무별(JOB)로 최대급여(SAL), 최소급여, 급여의 합을 출력하는 SELECT 문장
SELECT JOB, MAX(SAL), MIN(SAL), SUM(SAL)
FROM EMP
GROUP BY JOB;

 

--2. EMP 테이블에서 이름(ENAME)에 "T"가 있는 사원이 근무하는 부서에서 근무하는 모든 조업원에 대해 
-- 사원 번호(EMPNO), 이름(ENAME), 급여(SAL) 를 출력하는 SELECT문
-- 사원번호 (EMPNO) 순으로 조회
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO 

                           FROM EMP 
                           WHERE ENAME LIKE '%T%')
ORDER BY EMPNO;

-- SUB QUERY결과가 2개 이상이면 IN, NOT IN, ANY, ALL 같은 다중행 연산자를 사용

 

--3. EMP 테이블에 저장된 모든 사원을 삭제하는 프로시저를 작성
CREATE OR REPLACE PROCEDURE EMPNO_DELETE
IS
BEGIN
       DELETE FROM EMP;
END;
/

BEGIN
EMPNO_DELETE();
END;

--4. EMP_SAL_CHK라는 트리거를 삭제하는 SQL을 작성
DROP TRIGGER EMP_SAL_CHK;

 

 

 

 

 

** 프로그래밍 언어에서 데이터베이스 사용

1. 사전 준비

=> 프로그래밍 언어와 데이터베이스 사이에서 통역할 드라이버를 설치

=> 자바에서는 드라이버 파일을 BUILD PATH에 추가해 주어야 한다.

ojdbc6.jar 파일을 프로젝트에 복사하고 마우스 우클릭해서 [build path] - [add to build path] 메뉴를 실행

 

=> 데이터베이스 접속 정보를 알아야 함

url L 데이터베이스 서버 컴퓨터의 ip나 도메인, 포트번호, 데이터베이스이름(오라클은 sid 나 service name)

 

192.168.0.200, 1521, sid는 xe

userid나 password : 데이터베이스 종류에 따라서는 없어도 되는 경우가 있다.

                           Access 나 Sqlite3 의 경우는 필요가 없다. 

user05

 

2. java에서 데이터베이스 연동 작업

1) 드라이버 클래스를 로드

Class.forName(String driverClassName);    driverClassName 은 데이터베이스 종류마다 다르다.

이 작업은 프로그램 내에서 처음에 1번만 수행한다.

 

오라클 : oracle.jdbc.driver.OracleDriver

 

2) 데이터베이스 연결

Connection 연결변수 = DriverManager.getConnection(String url[, String userid, String password]);

 

=> url은 데이터베이스 종류마다 다름

오라클의 url - jdbc:oracle:thin:@ip:포트번호:sid

sid 대신에 service name 인 경우 - jdbc:oracle:thin:@ip:포트번호/service name

 

=> 연결에 실패하면 예외가 발생

=> 데이터베이스 서버가 사용가능한지 url은 맞게 작성했는지 id와 password가 맞는지 확인

catch 구문에서 getMessage() 를 출력하고 확인해서 해결

 

 

3) SQL 실행 객체 생성

=> PreparedStatement : SQL 실행

=> CallableStatement : Precodure 실행

PreparedStatement 실행객체변수 = 연결변수.PrepareStatement(String sql);

=> sql 작성 시 값의 자리에는 ?를 사용해서 나중에 바인딩 하는 것이 가능

insert -> values

update -> set의 값, where에서 조건의 값의 자리

delete -> where의 조건의 값의 자리

delete -> where 와 having에서 조건의 값의 자리

컬럼이름은 ?로 대체할수 없다.

=> ?자리에 값을 바인딩 : set자료형(물음표번호, 실제데이터)

 

4) SQL 실행

=> select : ResultSet 결과변수 = 실행객체변수.executeQuery();

=> 그 이외 : int 결과변수 = 실행객체변수.executeUpdate();

=> select 구문은실행결과가 순서대로 결과에 접근할 수 있는 cursor가 리턴

=> 나머지 구문은 영향받은 행의 개수가 리턴

 

5) 실행 결과 사용

 

6) 생성된 객체들의 연결을 해제

ResultSet.close()

PreparedStatement.close()

Connection close()

=> 클라이언트가 서버에 직접 접속하는 경우에는 정확하게 해주어야 하고 클라이언트가 애플리케이션 서버를 통해서 접속하는 경우에는 크게 문제가 되지 않는다.