일일 정리

APACHE - httpd.conf, 다중 행/열 서브 쿼리, 집합 연산자, 단일 행 함수와 문자 함수

mysecurity 2025. 2. 27. 23:55

목차

1. APACHE - httpd.conf

1-1 httpd.conf 개요

1-2 httpd.conf : Directory 설정

1-3 httpd.conf : Document Root

1-4 httpd.conf : 가상 호스트

 

2. 다중 행, 다중 열 서브 쿼리

2-1 다중 행 서브 쿼리

2-2 다중 열 서브 쿼리

 

3. 집합 연산자

3-1 집합 연산자 개요

 

4. 단일 행 함수와 문자 함수

4-1 단일 행 함수

4-2 문자 함수

4-3 문자함수 : 문자 치환 함수

 

 

1. APACHE - httpd.conf

1-1 httpd.conf 개요

● httpd.conf 파일의 구문 점검

#  /app/apache/bin/httpd  ‐t

- httpd.conf 파일의 문법상의 오류를 찾아준다.

- "Syntax OK" : 오류 없음 표시이다.

 

● 전역 환경 설정

- ServerRoot “/app/apache”

:웹서버의 설정파일로, 로그 파일 등이 저장되는 최상위 디렉토리이다.

 

- Timeout 120

: 클라이언트와 아무런 메시지가 없을 때에 오류로 처리되는 초단위 시간을 설정한다.

 

- MaxClients 150

: 접속 가능한 최대 client 수를 설정한다. (회사 인원이 1000명인 경우 150이면 충분하다.)

 

- Startservers 20 

: 초기 서버 프로세스의 수를 설정한다.

 

- MinSpareServers / MaxSpareServers

: 대기 상태의 프로세스 수를 설정한다.

 

- ServerName [명칭]

: DNS나 hosts 파일에 등록된 Apache 서버의 이름을 설정한다.

 

● 기본 서버 구성

- DocumentRoot  “/app/apache/htdocs”

: 웹서버의 홈 디렉토리이다.

 

- DirectoryIndex  index.html index.java index.php

: 메인페이지 파일명으로, 최초로 index.html을 참조한다. 이 파일이 없다면 index.java를, 이 또한 없다면 index.php를 참조한다.

 

- ErrorLog  logs/error_log

: 웹서버에 문제가 발생 시에 에러를 기록하는 로그파일이다.  

 

- CustomLog  logs/access_logcombind

: 외부에서 접근한 기록에 대한 로그파일이다.

 

- UserDir  public_html

: 개인 홈 디렉토리 지정파일이다.

 

- ServerAdmin  root@localhost

: 관리자의 메일주소

 

1-2 httpd.conf : Directory 설정

웹서버는 디렉토리 단위로 설정한다. 즉, 해당 디렉토리에 엑세스를 할 수 있도록 설정한다. 

이때 초기 서비스 파일은 엑세스를 허용해야 서버에 접속이 가능하다.

ex)

 <Directory "/app/apache/htdocs">
	 Options Indexes FollowSymLinks
	 AllowOverrideNone
	 Order allow, deny
	 Allow from all
 </Directory>

 

● Options 항목

- ALL : 가능한 모든 옵션을 다 사용한다.

- None : 아무런 옵션도 없다.

- Indexes : 메인 페이지가 없는 경우 파일 목록을 보여준다.

- FollowSymLinks : 디렉토리의 심볼릭 링크를 이용한다.

 

● AllowOverride 항목

- 현재는 사용하지 않는다.

 

● Order 항목

- 접근 권한 적용 순서를 설정한다.

- Order allow, deny 문장의 경우 허용관련 설정 후 거부관련 설정을 하라는 뜻이다.

 

ex) 192.168.123. 으로 시작하는 IP를 제외하고 모든 접속을 막는다.

Order deny, allow
Deny  from  all
Allow  from  192.168.123.

 

※ Require를 이용한 설정도 가능하다.

   Require all [denied | granted] : 기본 설정

   Require [not]  ip ip_주소         : IP별 설정

 

ex) 192.168.123.0 네트워크를 제외하고 모두 접속을 허용한다.

Require all granted
Require not ip 192.168.123.0/24

 

 

● 각 사용자의 개인 홈 디렉토리에 대한 설정 

<Directory "/home/*/public_html">
 	Options Indexes FollowSymLinks
 	AllowOverride None
 	Order allow, deny
 	Allow from all
</Directory>

 

1-3 httpd.conf : Document Root

HTTPD 서버 관리와 웹페이지 관리는 서로 다른 책무이므로 반드시 분리해 구성한다.

- 웹페이지 관리자가 시스템 디렉토리에 접근해서는 안된다.

- 웹페이지 관리자 계정 web 계정을 생성하고 홈 디렉토리 내에서 관리가 이뤄지도록 한다.

 

관리자 정보 예시

- 계정 : webmaster(group:web)

- Document Root : /home/httpd/html

웹페이지는 웹페이지 관리자의 직무 영역이므로 웹페이지 관리자의 홈디렉토리를  Document Root 경로에 마운트하여 관리한다.

 

1-4 httpd.conf : 가상 호스트

하나의 웹서버에 둘 이상의 호스트가 존재할 수 있다. 즉, 하나의 웹서버에서 둘 이상의 서로 다른 ip주소의 페이지들을 가질 수 있다.

 

● IP 기반 호스트

IP 기반으로 호스트를 설정할 경우 httpd.conf 파일에 다음과 같이 설정할 수 있다.

<VirtualHost 접속IP>
 	DocumentRoot 홈디렉토리
	ServerName IP 또는 도메인명
</VirtualHost>

ex)
<VirtualHost 192.168.10.222>
 	DocumentRoot /home/httpd/sec
 	ServerName 192.168.10.222
</VirtualHost>

<VirtualHost 192.168.10.333>
 	DocumentRoot /home/httpd/itc
 	ServerName 192.168.10.333
</VirtualHost>

 

- <VirtualHost> 항목에는 모든 전역 설정 파라미터가 기술 가능하다.

- 추가로 DNS 서버 쪽에 기존과 같이 해당 ip에 대한 도메인 설정을 하고, 아파치 서버쪽에 각각의 DocumentRoot 경로에 대한 퍼미션을 지정하여 해당 페이지에 접속할 수 있다. (1-2  httpd.conf : Directory 설정 부분)

+

- 'ifconfig  이더넷인터페이스  IP' 명령어로 추가 인터페이스를 생성해야 페이지로 접속이 가능하다.

ex) ifconfig ens160:0 192.168.10.333 (2025-02-28 추가)

2. 다중 행, 다중 열 서브 쿼리

2-1 다중 행 서브 쿼리

SELECT 컬럼...
FROM  테이블
WHERE 컬럼다중_행_연산자(SELECT 문장: Sub query문)
. . . .;

 

- 서브 커리에 여러 행이 검색되는 경우 사용한다.

- 다중 행 연산자를 이용한다.

    IN    : 검색된 값 중 하나만 일치하면 된다.

    ANY : 부등호와 쓰이며, 검색된 값 중 일부와 조건이 부합하면 된다.

    ALL  : 부등호와 쓰이며, 검색된 값 전체와 조건이 부합해야 한다.

 

● IN 연산자를 이용한 다중 행 서브 쿼리

ex)

화학과 교수의 부임일과 동일한 날 입사한 사원의 명단을 검색한다.

20번 부서원과 동일한 관리자로부터 관리받는 사원을 검색한다.

SQL> SELECT eno 사번, ename 이름
2  FROM emp                               
3  WHERE hdate IN (SELECT hiredate
4                  FROM professor
5                  WHERE section = '화학');


SQL> SELECT * FROM emp 
2  WHERE mgr IN(SELECT mgr FROM emp
3                WHERE dno= '20')
4  AND dno != 20; 		//20번 부서원까지 출력되지 않도록 주의한다.

 

ANY, ALL을 이용한 다중 행 서브 쿼리

ex)

10번 부서원들보다 급여가 낮은 사원을 검색한다.

SQL> SELECT eno 사번, ename 이름, dno 부서번호
2  FROM emp                                    
3  WHERE sal< ALL (SELECT sal
4                   FROM emp
5                   WHERE dno = '10');

 

- 서브 쿼리를 다음과 같이 그룹함수로 대체하여 사용할 수 있다. 그룹함수의 가독성이 더 우수하여 주로 그룹함수를 이용한다.

  (SELECT MIN(sal) FROM emp WHERE dno= '10');

 

2-2 다중 열 서브 쿼리

SELECT 컬럼...
FROM  테이블
WHERE (컬럼1, 컬럼2, ...) IN(SELECT 문장: Sub query문)
. . . .;

 

- 서브 쿼리의 SELECT 문에 여러 개의 컬럼을 검색한다.

- 이 경우 반드시 비교 대상 컬럼과 1:1 대응이 돼야한다.

- 서브 쿼리의 검색 결과가 한 행이 나온다면 '=' 연산자 사용도 가능하나, 되도록 'IN' 연산자를 이용한다.

 

ex)

김선유와 부서 및 업무가 동일한 같은 사원을 검색한다.

SQL> SELECT eno 사번, ename 이름, dno 부서번호, job 업무
2  FROM emp                                    
3  WHERE (dno, job) IN (SELECT dno, job              
4                         FROM emp
5                         WHERE ename = '김선유')
6  AND ename != '김선유';


SQL>  SELECT eno 사번, ename 이름, dno 부서번호, job 업무
2   FROM emp                                    
3   WHERE dnoIN (SELECT dnoFROM emp WHERE ename = '김선유')
4   AND job IN (SELECT job FROM emp WHERE ename = '김선유')
5   AND ename != '김선유';

 

위의 두 문장은 같은 기능을 수행하는 것처럼 보이나, 김선유가 두 명 이상이라면 결과값이 다르게 나오게 되므로 되도록이면 'IN' 연산자를 사용하도록 한다.

 

3. 집합 연산자

3-1 집합 연산자 개요

SELECT ...
[UNION ALL | UNION | INTERSECT | MINUS]
SELECT ...

 

- 둘 이상의 SELECT 문의 결과를 집합 연산하는 것이다.

- 검색 결과의 헤더는 앞쪽 SELECT 문에 의해 결정된다.

- 두 SELECT 문의 컬럼 개수와 데이터 타입이 반드시 일치해야한다.

연산자 의미 결과
UNION 합집합 검색된 결과의 합으로 중복이 제거된다.
UNION ALL 검색된 결과의 합으로 중복을 허용한다.
INTERSECT 교집합 양쪽 모두에 포함된 결과만 검색한다.
MINUS 차집합 첫 번째 검색 결과에서 두 번째 검색 결과를 제외하여 검색한다.

 

- UNION과 UNION ALL 중 마음대로 선택하여 사용할 수 있다.

- INTERSECT와 MINUS는 사실상 거의 쓰이지 않는다.

 

●집합 연산자를 이용한 검색

ex)

2000년 이후에 입사한 사원과 부임한 교수의 명단을 부임일 순으로 검색한다.

SQL> SELECT pno 번호, pname 이름, hiredate 입사일_부임일
2  FROM professor
3  WHERE hiredate >= '2000/01/01'
4  UNION ALL
5  SELECT eno, ename, hdate
6  FROM emp
7  WHERE hdate >= '2000/01/01'
8  ORDER BY 3;

 

 

- 헤더는 첫 번째 SELECT 문에 의해 결정된다.

- ORDER BY 절은 SELECT 문 끝에 추가한다.

  pno나 eno가 아니라 반드시 번호를 이용해서 정렬한다.

 

4. 단일 행 함수와 문자 함수

4-1 단일 행 함수

- 단일 행 함수를 이용하여 검색된 데이터에 대해 각 행별로 연산된 결과값을 얻을 수 있으며 중첩이 가능하다.

- 응용 프로그램의 오류를 줄이고 개발 시간을 단축할 수 있다.

- 인수로는 컬럼 명, 수식, 변수 등을 사용할 수 있으며, 인수 개수는 함수마다 다르다.

- SELECT 절이나 WHERE 절 등 값이 필요한 거의 모든 구문에 사용이 가능하다.

 

※ 단일 행 함수의 종류

문자 함수, 숫자 함수, 날짜 함수, 변환 함수, 일반 함수 등

- 숫자 함수와 날짜 함수는 같은 함수이다. 숫자를 주면 숫자 함수, 날짜를 주면 날짜 함수이다.

- 변환 함수는 포맷을 맞춰주는 기능으로 데이터를 출력할 때 반드시 써야한다.

 

4-2 문자 함수

문자 함수는 문자 데이터를 받아 데이터를 리턴해주는 함수이다.

우리가 보는 화면에 출력되는 값은 모두 문자이므로 알맞은 포맷을 지정하여 사용한다.

 

다음과 같은 문자 함수들이 있다.

함수명 기능 함수명 기능
LOWER 문자열을 소문자로 변환한다. INSTR 문자의 위치를 반환한다.
INSTR(문자열, 검색문자, 시작위치, 횟수)
LOWER(‘ORACLE’) → oracle INSTR(‘ORACLE’, ‘A’) → 3
UPPER 문자열을 대문자로 변환한다. TRIM 문장 앞뒤의 글자를 잘라낸다. TRIM([leading | trailing | both] 제외문자 FROM 문자열)
UPPER(‘oracle’) → ORACLE TRIM(‘o’ FROM ‘oracle’) → racle
INITCAP 첫 번째 문자는 대문자로, 나머지는 소문자로 변환한다. LENGTH
LENGTHB
문자열의 길이나 byte를 반환한다.
INITCAP(‘oracle’) → Oracle LENGTH(‘가나’) → 2 LENGTHB(‘가나’) → 4
SUBSTR 문자열 내 지정된 위치의 문자열을 검색한다.
SUBSTR(문자열, STR,CNT)
LPAD
RPAD
지정된 문자열의 길이만큼 빈 부분에 문자를 채운다.
LPAD(문자열, 출력폭, 채움문자)
SUBSTR(‘oracle’, 1, 2) → or LPAD(‘20000’, 10, ‘*’) → *****20000

 

- SUBSTR(‘oracle’, 1, 2) 은 oracle의 첫 번째부터 두 글자를 추출한다.

- TRIM('문장') 은 문장 앞뒤에 공백이 있으면 지운다.

- ed 를 이용하여 썼던 SQL문을 수정할 수 있다. / 를 이용하여 다시 실행시킬 수 있다.

 

● 문자 함수를 이용한 검색

ex)

부서명과 문자열의 길이를 출력한다.

SUBSTR 함수를 이용해서 사원 이름의 일부 내용만을 검색한다.

다양한 방법으로 'a'가 나오는 위치를 출력한다.

SQL> SELECT dname, LENGTH(dname), LENGTHB(dname)
2    FROM dept;


SQL> SELECT ename, SUBSTR(ename,2),          
2                  SUBSTR(ename,‐2), 
3                  SUBSTR(ename,1,2),
4                  SUBSTR(ename,‐2,2)
5    FROM emp;


SQL> SELECT INSTR('database','a'),   
2           INSTR('database','a',3),
3           INSTR('database','a',1,3) 
4    FROM dual;

 

- SUBSTR(ename,‐2,2): 뒤에서 두 번째 글자부터 두 글자를 출력한다.

- INSTR('database','a',1,3): 첫 번째 글자 이후부터 세 번째로 나오는 a의 위치를 출력한다.

 

ex)

부서명의 마지막 글자를 제외하고 검색한다.

SQL> SELECT dname, SUBSTR(dname, 1, LENGTH(dname)‐1) dname
2  FROM dept;

 

- dname의 첫 번째 글자부터 (글자수-1)번째 글자까지 출력한다.

- SQL에서 지원하는 여러 함수들은 필요에 따라 위와 같이 중첩 사용이 가능하다.

 

4-3 문자함수 : 문자 치환 함수

단일행 기능
TRANSLATE 문자 단위로 치환된 값을 반환한다.
TRANSLATE(문자열, 검색문자, 치환문자)
TRANSLATE(‘oracle’, ‘a’,’#’) → or#cle
REPLACE 문자열 단위로 치환된 값을 반환한다.
REPLACE(
문자열, 검색문자열, 치환문자열)
REPLACE(‘oracle’, ‘or’, ‘##’) → ##acle

 

- TRANSLATE 는 특수한 상황에 사용한다. 그냥 쓰지 않는 것이 좋다.

- REPLACE 를 주로 많이 사용한다.

- 각각 '문자'를 변환하는 것과 '문자열'을 변환하는 것이므로 그 차이를 주의한다.

 

ex)

원문의 'Wo'를 '--'로 변환한다.

SQL> SELECT TRANSLATE('World of Warcraft', 'Wo', '‐‐') Translate,
2           REPLACE('World of Warcraft',  'Wo', '‐‐') Replace  
3    FROM dual;

 

- TRANSLATE 는 'W' 와 'o'를 모두 '-' 와 '-' 로 각각 변환한다.

- REPLACE 는 'Wo' 문자열을 '--' 로 변환한다.