서비스(service)와 데몬(daemon)

서비스 = 데몬

사용자의 요청 시점이 아닌 임의의 시점에서 background process로 시작되어 사용자나 프로세스에 서비스를 제공하는 프로그램

 

서버 : 요청한 서비스 제공

클라이언트 : 서비스 요청

 

방식
• Stand Alone 

- 스스로 listen하며 항상 메모리에 상주한다.
- 서비스 요청에 즉시 대응 가능하다.
- 서비스 요청이 매우 드물거나 idle 한 경우 메모리를 낭비한다.
• Super Daemon
- Listen을 직접하지 않는다.
- 메모리에 상주하지 않으며 서비스 요청이 있을때 xinetd에 의해 호출된다.
- 점차 사라지는 추세

 

서비스 조회
# systemctl list-unit-files
- 모든 서비스의 상태 확인

 

# systemctl [is-enabled | is-active] [서비스명]
- is-enabled : 자동 실행 등록 여부 확인
- is-active : 현재 실행 여부

 

서비스 등록
# systemctl [enable | disable] [서비스명]
- [enable | disable] : 등록 및 등록 해제

 

서비스 실행
# systemctl [start | restart | stop] [서비스명]
- [start | restart | stop] : 실행, 재실행, 종료

 

systemctl 추가 옵션
# systemctl [옵션] [서비스명]
- try-restart : 실행, 재실행, 종료 (에러났을 때 실행)
- Reload : 설정 재구동
- status : 상태 확인

 

ntsysv

반드시 필요한 서비스만 구동한다.
• 초기 서비스 목록
network   : 네트워크 활성화
crond.service   : 스케쥴 관리
display-manager.service   : Xwindow 필수
gdm.service   : Xwindow 필수
sshd.service   : sshd

 

Target
Target은 init의 run level과 동일한 개념이다.
• run level보다 다양한 모드를 제공한다.
Ex)
- multi-user.target : init3
- graphical.target : init5
- rescue.target : init1, single user mode
- emergency.target : 응급 복구 모드
• 제공되는 target 확인
# systemctl list-units --type target --all


Default target 확인
# systemctl get-default
- 기본 타켓을 확인한다.

CentOS 7 이전버전
• /etc/inittab 파일에 설정됨

 

Default target 설정
# systemctl set-default [타켓]
- 기본 타켓을 변경한다.

- 변경후 시스템 리부팅

 

타켓 변경
• 시스템 관리나 장비 손상 등으로 인한 타켓 변경
# systemctl [rescue | emergency]
- 지정한 타켓으로 변경된다.
- rescue : rescue.target
- emergency : emergency.target : 응급 복구 모드

 

레드햇 계열 리눅스의 런레벨

리눅스의 런레벨은 리눅스마다 약간의 차이가 있으나 보통 0,1,6은 공통이다.


Single user mode 실습

system, password 복구시 사용

여기서 패스워드를 바꾸거나 수정하면 된다.

'리눅스 공부 기록' 카테고리의 다른 글

DNS 서버 구축 실습  (0) 2021.11.08
리눅스 15 - DNS 서버  (0) 2021.11.08
리눅스 13 - CRON & RSYNC  (0) 2021.11.04
CentOS5 및 CentOS6 설치하기 및 epel, rpmforge 추가하기  (0) 2021.11.03
리눅스 12 - RPM 및 YUM  (1) 2021.11.03

조인 : 자기 참조 조인(Self join)과 외부조인(Outer join)

조인 문을 생성하는 과정
step 1. 지문에서 검색 대상과 조건을 구분한다.
- 이를 통해 일단 SELECT 절, WHERE 절, ORDER BY 절을 구성한다.
- SELECT 절은 step 5에서 작성자의 의도에 따라 추가될 수 있다.
step 2. SELECT 절과 WHERE 절의 내용에 따라 정보를 검색할 테이블을 찾는다.
step 3. 테이블간의 관계를 확인한다.
- 관계를 확인하는 단계에서 테이블이 추가될 수 있다.
step 4. 조인 조건을 기술한다.
step 5. 전체 문장을 다듬는다.

 

 

예제 1. 위에 제시한 단계별로 지문으로부터 SQL문을 만들어 보자.
- 화학과 학생의 일반화학 기말고사 점수를 검색한다.

step 1. 지문에서 검색 대상과 조건을 찾는다.

step 2. SELECT 절과 WHERE 절의 내용에 따라 정보를 검색할 테이블을 찾는다.

step 3. 테이블간의 관계를 확인한다.

step 4. 조인 조건을 기술한다.

step 5. 전체 문장을 다듬는다.

 

- 4학년 학생이 수강하는 과목을 강의하는 교수의 명단을 검색한다.

step 1. 지문에서 검색 대상과 조건을 찾는다.

step 2. SELECT 절과 WHERE 절의 내용에 따라 정보를 검색할 테이블을 찾는다.

step 3. 테이블간의 관계를 확인한다.

step 4. 조인 조건을 기술한다.

step 5. 전체 문장을 다듬는다.

 

자기 참조 조인 (Self Join)

: 같은 TABLE 조인 (TABLE 하나 더 생성하고 조인)

별명을 이용한 조인

SELECT 별명1.컬럼1, ... 별명2.컬럼1, ...
FROM 테이블 별명1, 테이블 별명2, ...
WHERE 조인_조건
AND 일반_조건

 

예제 2. 각 사원을 관리하는 사수의 이름을 검색한다. (mgr : 사수 사번)

SELECT e1.eno, e1.ename, e1.mgr, e2.eno, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.eno;

ENO     ENAME      MGR      ENO     ENAME
------- ---------- -------- ------- ----------
0201    안영숙     0001     0001    안영희
0202    손하늘     0001     0001    안영희
0301    이승철     0001     0001    안영희
2007    이초록     0001     0001    안영희
2008    윤고은     0001     0001    안영희
1001    문시현     0201     0201    안영숙
1002    김주란     0201     0201    안영숙

 

외부 조인(Outer join)

SELECT 테이블1.컬럼, ..테이블2.컬럼, ...
FROM 테이블1, 테이블2, ...
WHERE 조인_조건(+)
AND 일반_조건

데이터 없는 쪽에 (+) 붙이기

 

예제 3. 각 부서별로 사원를 검색한다. (외부 조인과 일반 조인 결과물의 비교)

- 일반 조인 

SELECT d.dno 부서번호, dname 부서명, ename 사원명
FROM dept d, emp e
WHERE d.dno = e.dno
ORDER BY 1;

부서번호  부서명  사원명
--------- ------- ----------
01        총무    안영숙
01        총무    안영희
01        총무    손하늘
02        회계    박선경
02        회계    이승철
02        회계    천유정
02        회계    김민지

SQL문은 맞으나 데이터가 틀림. 

 

- 외부 조인

SELECT d.dno 부서번호, dname 부서명, ename 사원명
FROM dept d, emp e
WHERE d.dno = e.dno(+)
ORDER BY 1;

부서번호  부서명  사원명
--------- ------- ----------
01        총무    안영희
01        총무    안영숙
01        총무    손하늘
02        회계    이승철
02        회계    박선경
02        회계    천유정
02        회계    김선유
...
부서번호  부서명  사원명
--------- ------- ----------
50        POS

데이터 없는 emp 테이블에 (+) 기호를 붙인다.

 

 

실습

1. 학생 중에 동명이인을 검색한다.

SELECT DISTINCT s1.sname 이름, s1.sno 학번
FROM student s1, student s2
WHERE s1.sname = s2.sname
AND s1.sno != s2.sno 
ORDER BY s1.sname;

이름       학번
---------- -------
유태지     905301
유태지     943905
유태지     948209
황진혜     913902
황진혜     913908


2. 전체 교수 명단과 교수가 담당하는 과목의 이름을 학과 순으로 검색한다.

SELECT p.pno 교수번호, pname 교수이름, section 학과, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE p.pno = c.pno(+)
ORDER BY section;

교수번호  교수이름   학과    과목번호  과목이름
--------- ---------- ------- --------- ------------
1018      김응전     물리    1290      열역학
1016      호연작     물리    1287      전산물리
1013      하영진     물리    1245      실험물리학
1012      이영준     물리    1233      역학
1013      하영진     물리    1223      자기학
1009      이준영     물리
1016      호연작     물리    1226      양자물리학
...


3. 이번 학기 등록된 모든 과목과 담당 교수를 학점 순으로 검색한다.

SELECT st_num 학점, cno 과목번호, cname 과목명, c.pno 교수번호, pname 교수이름
FROM course c, professor p
WHERE c.pno = p.pno(+)
ORDER BY st_num;

      학점 과목번호  과목명       교수번호  교수이름
---------- --------- ------------ --------- ----------
         2 1228      위상수학     1018      김응전
         2 2365      전자기학     1029      주동평
         2 2112      영양학실험   1034      최해연
         2 2313      분류학실험   1027      임충원
         2 1211      일반화학실험 1001      송강
         2 1218      생화학       1008      문규식
         2 2366      물리실험     1030      김동평

      학점 과목번호  과목명       교수번호  교수이름
---------- --------- ------------ --------- ----------
         2 1214      무기화학     1004      시진영
         2 1245      실험물리학   1013      하영진
         2 1216      환경화학     1006      장청아
         2 1227      이학수학     1017      최무송
         2 2369      무기화학실험
         2 1711      유전학실험   1036      성현수
         3 2312      생리학       1022      이준
         ...


4. 직원 중에 자신의 관리자 보다 급여가 높은 사람의 급여 정보를 관리자 급여 정보와 같이 검색한다.

SELECT e1.eno 사번, e1.ename 이름, e1.sal 급여, e1.mgr 관리자번호, e2.eno 사번, e2.ename 이름, e2.sal 급여
FROM emp e1, emp e2
WHERE e1.mgr = e2.eno
AND e1.sal > e2.sal;

사번    이름             급여 관리자번호   사번    이름             급여
------- ---------- ---------- ------------ ------- ---------- ----------
1001    문시현           4500 0201         0201    안영숙           3900
1002    김주란           4100 0201         0201    안영숙           3900
1003    양선호           4300 0201         0201    안영숙           3900
2001    남궁연호         3950 0202         0202    손하늘           3510
2003    정의찬           4350 0202         0202    손하늘           3510


5. 교수의 정보와 교수가 담당하는 과목명을 검색한다.

SELECT p.pno 교수번호, pname 교수이름, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE p.pno = c.pno(+);

교수번호  교수이름   과목번호  과목이름
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험
1004      시진영     1212      일반화학
1006      장청아     1213      유기화학
1004      시진영     1214      무기화학
1006      장청아     1216      환경화학
1007      이초아     1217      고분자화학
1008      문규식     1218      생화학
...
교수번호  교수이름   과목번호  과목이름
--------- ---------- --------- ------------
1021      왕사진     2322      생물정보학
1027      임충원     2313      분류학실험
1029      주동평     2329      발생생물학
1033      박삭광
1009      이준영


6. 직원과 사수의 명단을 검색한다. 단 직원 명단은 모든 직원 명단이 출력되어야 한다.

SELECT e1.eno 사번, e1.ename 이름, e1.mgr 관리자번호, e2.eno 사번, e2.ename 이름
FROM emp e1, emp e2
WHERE e1.mgr = e2.eno(+);

사번    이름       관리자번호   사번    이름
------- ---------- ------------ ------- ----------
0201    안영숙     0001         0001    안영희
0202    손하늘     0001         0001    안영희
0301    이승철     0001         0001    안영희
2007    이초록     0001         0001    안영희
2008    윤고은     0001         0001    안영희
1001    문시현     0201         0201    안영숙
1002    김주란     0201         0201    안영숙
...
사번    이름       관리자번호   사번    이름
------- ---------- ------------ ------- ----------
0309    김선유     0302         0302    박선경
3001    김선유     1001         1001    문시현
0401    김진성     1001         1001    문시현
0801    천유정     1001         1001    문시현
3002    권아현     1002         1002    김주란
0120    김경현     1002         1002    김주란
0001    안영희


7. 화학과 학생 중에 학점이 동일한 학생을 검색한다.

SELECT s1.sno 학번, s1.sname 이름, s1.major 학과, s1.avr 평점
FROM student s1, student s2
WHERE s1.sno != s2.sno
AND s1.avr = s2.avr
AND s1.major = s2.major
AND s1.major = '화학';

학번    이름       학과          평점
------- ---------- ------- ----------
915303  정욱주     화학           .95
915301  정동상     화학           .95

 

CRON

작업을 정기적으로 실행

주기적으로 작업되는 작업 일정을 저장해서 자동으로 실행하는 데몬

- at이나 anacron 등과 같이 다양한 프로그램이 지원

 

관련 파일
• /etc/rc.d/init.d/crond
- 데몬 실행 스크립트(service를 이용한다.)

** 데몬 (=서비스) : 메모리에 실행되는 프로그램
• /usr/lib/systemd/system/crond.service
- 데몬 실행 스크립트(systemctl을 이용한다.)
• /etc/crontab
- 기본 스케줄 일정
• /usr/bin/crontab
- 스케줄 설정 프로그램 파일 (각 사용자가 스케줄 등록)
• /etc/cron.allow, /etc/cron.deny
- /usr/bin/crontab 이용 제한
- 등록된 계정에 대해서만 허용하거나 거부한다.

 

 

사용 형식

# crontab [옵션]

# crontab -u [유저] [옵션]
• 옵션
- e : 스케줄 등록
   . vi 환경으로 스케줄 등록
- l : 스케줄 확인 (출력)
- r : 스케줄 삭제
• 명령어 형식
[분] [시] [일] [월] [요일] [작업내용]
 시간 범위
 - 분 : 0 ~ 59

 - 시 : 0 ~ 23

 - 일 : 1 ~ 31

 - 월 : `1 ~ 12

 - 요일: 0(일요일) ~ 6(토요일)

 

crontab 실습

시간 받아오는 것과 권한을 변경해 주었다.

 

a.txt 파일의 권한이 변경된것을 확인할 수 있다.

 

RSYNC

두 시스템간에 지정한 디렉토리 동기화

RSYNC 도 클라이언트와 서버가 있음.

이 둘을 동기화하는 것

RSYNC 데몬 구동 : standalone(스크립트로 실행)

rsync 설치 확인
# yum list rsync
……
Installed Packages
rsync.x86_64 3.0.9-18.el7 @anaconda


관련 파일
• 데몬 : /usr/bin/rsync  (: 실제 실행되는 파일)
• 관리 스크립트 : /usr/lib/systemd/system/rsyncd.service   (: ntsysv 밑에 있는 것)
• 백업 설정 파일 : /etc/rsyncd.conf  (: rsync의 설정파일 / 수정하면 데몬 stop 후 start)


데몬 실행
# systemctl [start | stop | restart | status] rsyncd.service

 

RSYNC 서버 설정 : /etc/rsyncd.conf

[서비스 명] : 리소스 식별자, client에서 이용한다.
path : 백업 경로
comment : 주석
uid : 전송자 UID
gid : 전송자 GID
use chroot : rsync 경로를 외부에서 / 로 인식한다.

   (chroot : change root) 사용자가 접속하면 디렉토리 밖으로 이동못하게 / 로 인식

read only : 읽기 전용으로 접근한다.
hosts allow : 접속 허용할 호스트 (클라이언트만 지정)
max connections (=max clients / max servers) : 동시 접속자 수
timeout : 시간이 지나면 자동으로 접속 끊기

# cat /etc/rsyncd.conf
[backup]
path = /backup
uid = root
gid = root
use chroot = yes
read only = yes    (파일 원본 있어 복사만 가능. 쓰기 X)
hosts allow = 192.168.10.33  (지정된 클라이언트만 복사 가능)
max connections = 1
timeout = 300

RSYNC 클라이언트 : 동기화
: rsync client 명령을 이용 server의 디렉토리와 client의 디렉토리를 동기화
rsync –avz [--delete] source destination   (source를 destination로 복사)
rsync -avz [--delete] IP::[서비스명] [백업 디렉토리]
rsync -avz [--delete] [백업 디렉토리] IP::[서비스명]  (우리 서버는 현재 read only라 실행 X)

rsync 명령 옵션
• -v : 작업내역 출력
• -a : archive mode 작업
심볼릭 링크, 권한 등 모든 내용을 보존한다.
• -z : 파일을 압축 전송한다.
• --delete : source에서 지워진 파일을 destination에서도 지워준다.(완전 동기화 옵션)
 Local System 내에 동기화
rsync –avz /home/httpd/ /backup/httpd/

 

rsync 명령을 cron에 등록
• 매일 새벽 1시에 백업 수행
00 1 * * * rsync -avz 192.168.10.31::backup /backup

 

 

RSYNC 실습

서버 [192.168.10.131] 

클라이언트 [192.168.10.133] 

먼저 서버로 사용할 [192.168.10.131] 컴퓨터에서 사용한다.

[192.168.10.131]에 rsync 설치를 확인한다.

 

[192.168.10.131]의 [ vi /etc/rsyncd.conf ] 수정한다.

 

 

클라이언트 컴퓨터 [192.168.10.133]

클라이언트에서 실행

/backup : 백업할 디렉토리를 생성한다. (/밑에 backup로 생성)

192.168.10.131 에 백업을 /backup 디렉토리에 백업한다.

잘 백업된 것을 확인할 수 있다.

 

 

클라이언트에서 cron 과 rsync를 이용한 자동 백업 등록

매일 새벽 1시에 백업 수행한다.

CentOS5 및 CentOS6 설치하기 및 epel, rpmforge 추가하기

- 실습 내용 -

CentOS 5,6,7에 각각 epel, rpmforge를 추가한다.

CentOS6 epel, rpmforge 파일 예시
epel-release-6-8.noarch.rpm
rpmforge-release-0.5.3-1.el6.rf.i686.rpm
파일을 설치하고 repository 목록을 확인한다.

[ yum repolist ] 입력해 목록 확인

 

CentOS5 설치하기

영어로 설치해주기!!!

한국어로 설치시 설치할 파일 선택해주기

CentOS5는 32bit이므로 위와 같은 버전을 선택한다.

 

test는 스킵한다.

 

영어를 선택해준다.

한국어로 선택할 경우 마지막에 설치할 파일을 지정해 설치해주면 된다.

다음을 누르면 초기화할 것인지 물어보는데 초기화하기를 눌러준다.

 

 Custom layout 을 선택해주고 다음 (영어버전 / 한국어버전)

 

파티션을 만들어 준다.

/boot 를 500MB으로 만들어준다.

 

swap를 1024MB로 만든다.

 

/ 를 나머지 용량으로 채운다.

 

IP주소와 netmask를 설정해준다.

 

호스트명을 설정하고 게이트웨이, DNS를 설정한다.

 

시간은 나중에 따로 설정해도 되므로 다음을 누른다.

 

root 암호를 설정한다.

 

Gnome 을 선택하고 다음을 누른다.

 

다음을 누른다.

 

한국어로 설정해 설치할 경우 더 많은 기능이 설치되면서 오류가 뜨게 되는데 영어로 설치하면 오류가 안뜬다.

 

설치가 끝나면 리부트를 눌러 다시 켜준다.

 

방화벽은 disabled를 설정한다.

 

selinux도 disabled를 설정한다.

 

사용자를 생성한다.

 

PuTTY로 잘 접속되는 것을 확인한다.

 

CentOS 5에 epel, rpmforge를 추가하기

epel-release-5-4.noarch.rpm
rpmforge-release-0.5.3-1.el5.rf.i386.rpm
파일을 설치하고 repository 목록 확인

 

파일을 다운받기 위해 FTP 로 접속한다.

FTP를 이용해 위와 파일을 다운받는다.

 

잘 다운받은 것을 확인한다.

[ rpm -Uvh 파일명 ] 을 통해 다운받는다.

 

[ yum repolist ] 입력해 잘 다운되었는지 목록을 확인한다.

 

CentOS6 설치하기

CentOS6는 64bit이므로 위와 같은 버전을 설정한다.

 

test는 스킵하고 다음을 누른다.

 

한국어를 선택하고 키보드는 영어를 선택한다.

 

기본 저장장치를 선택한다.

모든 데이터를 삭제한다.

 

호스트명을 지정한다.

 

IP주소와 netmask, gateway를 설정한다.

 

설치하고 난 뒤 설정을 바꿀수도 있다.

 

시간은 나중에 설정할 것이므로 다음을 누른다.

root 암호를 설정한다.

 

사용자 레이아웃 만들기로 설정한다.

표준파티션으로 설정한다.

 

/boot 는 500MB

swap는 1024MB 설정한다.

 

/ 는 나머지 용량으로 설정한다.

위와 같이 생성된 것을 확인한다.

 

포맷을 누른다.

 

다음을 누른다.

 

 desktop를 선택하고 다음을 눌러 설치하고 리부트 한다.

 

라이센스 정보는 동의하고 사용자 계정을 등록한다.

 

kdump는 비활성화로 하고 다음을 눌러 root로 로그인하기위해 기타를 누른다.

 

root로 로그인 되는것을 확인한다.

 

CentOS 6에 epel, rpmforge를 추가하기

epel-release-6-8.noarch.rpm
rpmforge-release-0.5.3-1.el6.rf.i686.rpm
파일을 설치하고 repository 목록 확인

 

ftp를 설치하기위해 CentOS6 의 VMware를 들어간다.

위와같이 [ VM > Removable Devices > CD/DVD > Connect ]를 누르면 iso파일이 활성화된다.

 

/로 이동해 media 디렉토리로 이동해 CentOS_6.10_Final 디렉토리로 이동한다.

Packages 디렉토리로 이동해 ftp 설치파일을 다운받는다.

[ cd /media/CentOS_6.10_Final/Packages ] 이동후 ftp 다운

 

ftp로 들어간다.

epel-release-6-8.noarch.rpm
rpmforge-release-0.5.3-1.el6.rf.i686.rpm

위 두 파일을 다운받는다.

 

파일을 설치한다.

 

[ yum repolist ] 입력해 잘 다운되었는지 목록을 확인한다.

 

CentOS7

위와 같은 방법이므로 설명은 생략하고 사진만 첨부

 

ftp에서 파일 다운한다.

 

파일을 다운받는다.

 

목록을 확인한다.

 

RPM

: Redhat 사에서 제공하는 리눅스용 프로그램을 배포하는 기술

프로그램의 설치, 검증, 삭제 등의 다양한 기능을 제공

 

RPM 패키지의 구조
[ 패키지명-버전-릴리즈.아키텍처.rpm ]

 

질의

rpm -q : 질문
# rpm -qa : 시스템에 설치된 모든 패키지명
# rpm -qi 패키지명 : 패키지의 상세한 정보
# rpm -ql 패키지명 : 패키지의 파일 리스트
# rpm -qf 파일명 : 지정한 파일이 포함된 패키지

 

설치 및 업그레이드
# rpm [-ivh | -Uvh | -Fvh] 패키지명
옵션
-i : 설치
-U : 업그레이드 (이전버젼 미설치시 -i와 동일)
-F : 업그레이드만
-v : 설치과정 출력
-h : 설치정도 출력 (#)

 

삭제
# rpm -e 패키지명
: 지정한 패키지를 삭제

 

추가 옵션
옵션
--nodeps : 의존성을 무시하고 작업한다.
(삭제에 주로 이용)
--force : 같은 버전의 패키지나 파일이 있어도 무시하고
작업진행
--oldpackage : 다운그레이드시 사용

 

YUM (Yellowdog Updater Manager; Modified)

: rpm의 고질적인 문제인 의존성을 해소하기 하기 위한 패키지 기술로 RPM과 동일한 형식의 설치 구조를 지원한다.
YUM은 인터넷 repository를 이용하는 기술로 인터넷만 연결되어 있다면 지원되는 모든 프로그램을 설치 관리 할 수 있다.

 

yum list
• 패키지를 확인한다.
# yum list [installed]
• 설치 가능한 모든 패키지 목록을 보여준다.
• Installed : 설치된 패키지 목록을 보여준다
# yum list [패키지명]
• 지정한 패키지의 설치 여부를 확인한다.

 

검색 추가 옵션
• repolist, search, provide
# yum repolist
• 시스템에 등록된 repository list를 출력한다.
# yum search 문자열
• 패키지명이나 description에 문자열이 포함된 패키지들을 출
력한다.
# yum provides 경로/문자열
• 문자열이 포함된 파일이 소속된 패키지들을 출력한다.

 

설치
# yum install [-y] 패키지명
• 패키지를 repository로 부터 설치한다.
 

업데이트
# yum update [-y] 패키지명
• 패키지를 repository로 부터 업데이트한다.

 

삭제
# yum remove [패키지명]
• 지정한 패키지를 삭제한다.

 

초기화
# yum clean headers
# yum clean packages
# yum clean metadata

 

 

RPM 실습

ssh 파일 확인하기

(파일명에 경로명 포함하기)

 

리눅스에서 iso파일 설치하기

마운트할 디렉토리 생성하고 /cdrom 으로 마운트하고 vsftpd 를 설치하기 위한 rpm 파일을 설치한다.

 

ntsysv 로 vsftpd.service가 설치된 것을 확인한다.

 

 

VMware에서 NAT 네트워크 구축하기

위와 같은 NAT 네트워크 환경을 구축할 것이다.

 

실습 전 기본 환경 설정

VMnet8 은 NAT에 연결되어있는 네트워크이므로 사용함으로 설정한다.

 

IP주소와 서브넷마스크만 설정한다.

기본 게이트웨이는 하나만 설정해야 하므로 게이트웨이는 설정하지 않는다. 

 

cmd 창에서 ipconfig 를 입력해 네트워크 설정을 확인한다.

 

VMware에서 Virtual Network Editor 에서 설정된 것을 확인한다.

 

 

( 실습 1 ) 192.168.11.0 NAT 네트워크에 윈도우 1개, 리눅스 2개 설치하기

(통신 잘 되는지 확인하기)

리눅스  192.168.11.11 / 192.168.11.12 

윈도우  192.168.11.21 

GW ) 192.168.11.1

 

리눅스 설치

아래 링크 참조

2021.10.12 - [리눅스 공부 기록] - VMware에서 Linux (CentOS) 설치하기

 

VMware에서 Linux (CentOS) 설치하기

VMware에서 Linux (CentOS) 설치하기 여기까지는 VMware에서 Windows10 설치와 같다. 리눅스를 선택해준다. 버전은 CentOS7 64bit를 선택한다. 이름을 설정하고 경로를 지정한다. 용량은 40기가로 설정한다...

lemonandgrapefruit.tistory.com

 

윈도우 설치

2021.09.30 - [리눅스 공부 기록] - VMware에서 NAT 설정 및 VMware에서 NAT 환경에서 Windows 설치

 

VMware에서 NAT 설정 및 VMware에서 NAT 환경에서 Windows 설치

VMware에서 NAT 설정 [ Edit > Virtual Network Editor ] 을 들어간다. VNnet8에서 IP와 Subnetmask를 설정해준다. NAT setting 와 DHCP setting를 각각 들어간다. Gateway IP 주소를 설정한다. Start IP 와 E..

lemonandgrapefruit.tistory.com

 

 

각 컴퓨터 네트워크 정보를 확인한다.

Windows

 

서로 통신 확인하기

Windows IP는 192.168.11.21인데 다른 컴퓨터에서 ping이 보내지지 않는다.

이것은 윈도우 방화벽 때문이라 방화벽을 꺼준다.

ping이 잘 보내지면 다시 방화벽을 켜준다.

 

ping이 잘 보내지는 것을 확인할 수 있다.

 

 

리눅스 3개 모두 다음과 같이 설정한다.

[ ntsysv ]에 들어가 다음과 같이 설정한다.

네 개를 설정 해제한다.

firewalld 도 설정 해제한다.

 

리눅스 보안정책을 해제하기 위해 [ vi /etc/selinux/config ] 여기에 들어가 아래와 같이 disabled로 설정한다. 

이 설정 뒤에는 reboot 한다.

 

( 실습 2 ) 192.168.11.0 NAT 네트워크, 192.168.12.0 네트워크 구축하기

윈도우   192.168.11.21

리눅스   192.168.11.11   /   192.168.12.11   /  [ 192.168.11.254 | 192.168.12.1 ]  (NAT 2개 설정)

192.168.11.254 에는 게이트웨이를 설정한다. 

 

192.168.12.1의 게이트웨이는 설정해주지 않는다.

게이트웨이는 한 컴퓨터에서 하나만 설정해주면 된다.

 

 

패킷 포워딩 기능 활성화

192.168.12.0 NAT 네트워크에서 패킷 포워딩 기능을 활성화한다.
# sysctl –a | grep forward


1)  # sysctl –w net.ipv4.ip_forward=1 (공백 없음)
or
2)  # echo 1 > /proc/sys/net/ipv4/ip_forward
or
3)  /etc/sysctl.conf 파일에 ‘net.ipv4.ip_forward = 1’ 을 수정(추가)한다.


파일 추가후 [ sysctl –p ]명령을 실행한다.

 

활성화된 것을 확인한다.

 sysctl –p 를 반드시 실행한다.

 

192.168.11.254 컴퓨터에서 리부트 할 경우에 LAN카드가 두개 다 살아있게 하기 위해 ONBOOT를 yes로 설정한다.

ONBOOT = yes 설정한다.

 

ifconfig로 잘 확인한다.

 

패킷 포워딩 설정

첫 번째 리눅스(192.168.11.11)에서 192.168.12.0 네트워크로 가기 위한 route 설정하기

 

윈도우(192.168.10.130)에서 192.168.12.0 네트워크로 가기 위한 route 설정하기 (cmd 관리자 권한으로 실행)

 

192.168.11.12 리눅스에서 192.168.12.0 네트워크에 있는 컴퓨터로 변경하기 위해 IP주소를 192.168.12.11로 변경한다.

gateway도 192.168.12.1로 변경한다.

모든 리눅스 리부트하고 접속한다.

 

192.168.12.0 네트워크에 잘 포워딩 되는지 확인하기 위해 PuTTY로 [ 192.168.12.11 ] 컴퓨터로 접속이 잘 되는 것을 확인한다.

 

프로세스(Process)

: 현재 실행중인 프로그램

메모리에 일정 부분 차지

 ** 커널 : 하드웨어에 접근

프로세스는메모리 일중 구역을 할당 받아 실행

프로텍션 도메인(Protection domain) : 할당 받은 메모리영역

• 프로세스는 pid에 의해 구별
• 프로세스는 tree 구조를 이루며 최상위 프로세스는 init
• 프로세스는 ppid로 구별되는 상위(부모 프로세스)를 갖는다.


JOB
job은 현재 터미널에서 실행한 프로세스로 shell에 의해서 job 번호가 부여된다.

 

관련 명령어
• ps, kill, pkill, jobs, nohup

 

 

Foreground

: 현재 터미널에서 제어되는 프로세스이다. 터미널은 입출력은 foreground 프로세스를 위해서 대기

Background

: 터미널과 무관하게 메모리에서 실행되는 프로그램이다. 터미널 입출력에 대해서 투명하다.

보통 daemon(service) 프로세스들이background 에서 실행된다.

 

ps

: 프로세스를 확인
옵션
-a : 현재 터미널에서 실행중인 프로세스
-e : 전체 프로세스
-f : 자세한 내용
-u : 실행 계정, 시작 시간 포함한 정보 검색

UID : 프로세스 실행 계정
• PID : pid
• PPID : 부모프로세스 pid
• C : idle time
• STIME : start time
• TTY : 터미널
• TIME : CPU 사용 시간
• CMD : 실행 명령

 

kill

: 프로세스를 강제 종료한다. 

signal에 미리 정의된 프로세스에 대한 종료 작업 수행

옵션
-l : signal 목록 (9 : 프로세스 강제 종료)

 

nohup

: 프로세스 중단(hangup)을 무시하고 명령을 계속 실행
이로인해 로그아웃 이후에도 명령은 계속 실행되지만 명령을 background(&)로 돌리는 것은 아니다. 

또한 표준 출력을 nohup.out으로 변경
작업 시간이 긴 명령어를 실행할 때 로그 아웃이나 터미널 다운에 대비
# nohup [command]

등가 조인과 비 등가 조인(Equi join, Nequi join : INNER JOIN)

SELECT 테이블1.컬럼, ...테이블2.컬럼, ...
FROM 테이블1, 테이블2, ...
WHERE 조인_조건
AND 일반_조건

- 조인 조건은 두 테이블간의 관계를 수식으로 표현
- 조인 조건은 SELECT 문에 사용된 테이블의 개수에 따라 달라진다.

- 테이블 n개 라면 조인 조건의 개수는 항상 (n-1)개 이상이다.


등가 조인(Equi-join)

: 조인 조건에 '='를 이용하는 조인

 

비 등가 조인(Non equi-join)

: 부등호가 포함된 조인 조건

 

예제 1. 각 사원의 근무 부서를 검색한다.

SELECT eno 사번, ename 이름, emp.dno 부서번호,
	dept.dno 부서번호, dname 부서명
FROM dept, emp
WHERE dept.dno = emp.dno;

사번    이름       부서번호  부서번호  부서명
------- ---------- --------- --------- -------
0001    안영희     01        01        총무
0201    안영숙     01        01        총무
0202    손하늘     01        01        총무
0301    이승철     02        02        회계
0302    박선경     02        02        회계
1001    문시현     10        10        ERP
1002    김주란     20        20        ISP

 

예제 2. 광주에서 근무하는 직원의 명단을 검색한다.(부서번호와 부서명도 검색한다.)

SELECT loc 근무처, d.dno 부서번호, dname 부서명,
	eno 사번, ename 이름
FROM dept d, emp e
WHERE d.dno=e.dno
AND loc = '광주';

근무  부서번호  부서명  사번    이름
----- --------- ------- ------- ----------
광주  30        ITEA    1003    양선호
광주  30        ITEA    2003    정의찬
광주  30        ITEA    2007    이초록

 

예제 3. 각 직원의 급여를 10% 인상한 경우 급여 등급을 검색한다.

SELECT eno 사번, ename 이름, 
	sal*1.1 인상된급여, grade 등급
FROM emp, salgrade
WHERE sal*1.1 BETWEEN losal AND hisal;

사번    이름       인상된급여       등급
------- ---------- ---------- ----------
0309    김선유            990          5
0702    김민지           1210          4
2002    제갈민           1672          4
2007    이초록         2187.9          3
2008    윤고은           2310          3
0269    권나현           2860          3
0801    천유정           3190          2

 

예제 4. 조인 조건이 없는 잘못된 조인문장의 결과를 확인해 보자.

SELECT d.dno, dname, e.dno, ename
FROM dept d, emp e;

DNO     DNAME   DNO     ENAME
------- ------- ------- ----------
01      총무    01      안영희
01      총무    01      안영숙
01      총무    01      손하늘
01      총무    02      이승철
01      총무    02      박선경
01      총무    10      문시현
01      총무    20      김주란

 

(예제 4)와 같은 조인을 Cross join(교차 조인)이라고 하는데 이런 조인은 특별한 경우 사용된다. 

cross join은 잘못된 결과값(Cartesian product)을 생성한다.

 

 

테이블과 관계

* 부모 테이블과 자식 테이블

 

실습

1. 송강 교수가 강의하는 과목을 검색한다.

SELECT p.pno 교수번호, pname 이름, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE pname = '송강'
AND p.pno = c.pno;

교수번호  이름       과목번호  과목이름
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험


2. 과목명에 화학이 포함된 과목을 강의하는 교수의 명단을 검색한다.

SELECT p.pno 교수번호, pname 이름, cno 과목번호, cname 과목명
FROM professor p, course c
WHERE cname LIKE '%화학%'
AND p.pno = c.pno;

교수번호  이름       과목번호  과목명
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험
1004      시진영     1212      일반화학
1004      시진영     1214      무기화학
1006      장청아     1213      유기화학
1006      장청아     1216      환경화학
1007      이초아     1217      고분자화학
1008      문규식     1218      생화학


3. 학점이 2학점인 과목과 이를 강의하는 교수를 검색한다.

SELECT cno 과목번호, cname 과목이름, st_num 학점, p.pno 교수번호, pname 교수이름
FROM professor p, course c
WHERE st_num = 2
AND p.pno = c.pno;

과목번호  과목이름           학점 교수번호  교수이름
--------- ------------ ---------- --------- ----------
1211      일반화학실험          2 1001      송강
1214      무기화학              2 1004      시진영
1216      환경화학              2 1006      장청아
1218      생화학                2 1008      문규식
1245      실험물리학            2 1013      하영진
1228      위상수학              2 1018      김응전
2313      분류학실험            2 1027      임충원


4. 화학과 교수가 강의하는 과목을 검색한다.

SELECT p.pno 교수번호, pname 이름, section 학과, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE section = '화학'
AND p.pno = c.pno;

교수번호  이름       학과    과목번호  과목이름
--------- ---------- ------- --------- ------------
1001      송강       화학    1211      일반화학실험
1004      시진영     화학    1212      일반화학
1006      장청아     화학    1213      유기화학
1004      시진영     화학    1214      무기화학
1006      장청아     화학    1216      환경화학
1007      이초아     화학    1217      고분자화학
1008      문규식     화학    1218      생화학


5. 화학과 1학년 학생의 기말고사 성적을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목명, result 성적
FROM student s, score r, course c
WHERE major = '화학' 
AND syear = 1
AND s.sno = r.sno
AND c.cno = r.cno;

전공          학년 학번    이름       과목번호  과목명             성적
------- ---------- ------- ---------- --------- ------------ ----------
화학             1 925309  오우재     1211      일반화학실험         71
화학             1 945302  김람석     1212      일반화학             85
화학             1 945303  남궁경아   1212      일반화학             44
화학             1 945314  이철윤     1212      일반화학             47
화학             1 925309  오우재     1213      유기화학             83
화학             1 925309  오우재     1214      무기화학             63
화학             1 945302  김람석     1214      무기화학             93


6. 일반화학 과목의 기말고사 점수를 검색한다.

SELECT c.cno 과목번호, cname 과목이름, s.sno 학번, sname 이름, result 성적
FROM student s, course c, score r
WHERE cname = '일반화학'
AND c.cno = r.cno
AND s.sno = r.sno;

과목번호  과목이름     학번    이름             성적
--------- ------------ ------- ---------- ----------
1212      일반화학     894501  장봉철             84
1212      일반화학     905301  유태지             87
1212      일반화학     905302  정욱상             82
1212      일반화학     905603  정용정             84
1212      일반화학     913901  황수현             97
1212      일반화학     913902  황진혜             70
1212      일반화학     913903  정도정             57


7. 화학과 1학년 학생의 일반화학 기말 고사 점수를 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, cname 과목이름, result 성적
FROM student s, course c, score r
WHERE major ='화학' 
AND syear = 1
AND cname = '일반화학'
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목이름           성적
------- ---------- ------- ---------- ------------ ----------
화학             1 945302  김람석     일반화학             85
화학             1 945303  남궁경아   일반화학             44
화학             1 945314  이철윤     일반화학             47


8. 화학과 1학년 학생이 수강하는 과목을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목이름
FROM student s, course c, score r
WHERE syear = 1
AND major = '화학'
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목번호  과목이름
------- ---------- ------- ---------- --------- ------------
화학             1 925309  오우재     1211      일반화학실험
화학             1 945302  김람석     1212      일반화학
화학             1 945303  남궁경아   1212      일반화학
화학             1 945314  이철윤     1212      일반화학
화학             1 925309  오우재     1213      유기화학
화학             1 925309  오우재     1214      무기화학
화학             1 945302  김람석     1214      무기화학


9. 일반화학 과목에서 평가 점수가 A인 학생의 명단을 검색한다.

select * from scgrade;

GRADE      HISCORE    LOSCORE
------- ---------- ----------
A              100         85
B               84         70
C               69         55
D               54         40
F               39          0

 

SELECT c.cno 과목번호, cname 과목이름, s.sno 학번, sname 이름, result 성적, grade 평가점수
FROM student s, course c, score r, scgrade
WHERE cname = '일반화학'
AND result BETWEEN loscore AND hiscore
AND grade = 'A'
AND s.sno = r.sno
AND r.cno = c.cno;

과목번호  과목이름     학번    이름             성적 평가점수
--------- ------------ ------- ---------- ---------- ---------
1212      일반화학     905301  유태지             87 A
1212      일반화학     913901  황수현             97 A
1212      일반화학     913908  황진혜             98 A
1212      일반화학     914504  심빈경             88 A
1212      일반화학     915303  정욱주             93 A
1212      일반화학     915602  임주영             96 A
1212      일반화학     918205  독고낭도           94 A


10. 송강 교수의 과목을 수강하는 학생의 기말고사 점수를 성적 순서로 검색한다.

SELECT p.pno 교수번호, pname 교수이름, cname 과목명, s.sno 학번, sname 이름, result 성적
FROM student s, professor p, course c, score r
WHERE pname = '송강'
AND s.sno = r.sno
AND r.cno = c.cno
AND c.pno = p.pno
ORDER BY result DESC;

교수번호  교수이름   과목명       학번    이름             성적
--------- ---------- ------------ ------- ---------- ----------
1001      송강       일반화학실험 924505  서찬호             98
1001      송강       일반화학실험 894501  장봉철             97
1001      송강       일반화학실험 913901  황수현             94
1001      송강       일반화학실험 925602  강아영             94
1001      송강       일반화학실험 915602  임주영             93
1001      송강       일반화학실험 923902  김호야             93
1001      송강       일반화학실험 924502  은정현             91


11. 화학과 1학년 학생의 기말고사 성적을 학점(A,B,C,D,F)으로 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목명, 
	result 학점, grade 평가점수
FROM student s, course c, score r, scgrade
WHERE major = '화학'
AND syear = 1
AND result BETWEEN loscore AND hiscore
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목번호  과목명             학점 평가점수
------- ---------- ------- ---------- --------- ------------ ---------- ---------
화학             1 945303  남궁경아   1216      환경화학             99 A
화학             1 925309  오우재     2363      화학실험             99 A
화학             1 945314  이철윤     2370      고생물학             99 A
화학             1 945303  남궁경아   2368      핵화학               99 A
화학             1 945303  남궁경아   2366      물리실험             99 A
화학             1 945303  남궁경아   2365      전자기학             98 A
화학             1 925309  오우재     1228      위상수학             96 A


12. 송강 교수가 강의하는 과목에서 평가 점수가 A인 학생의 명단을 과목명과 함께 검색한다.

SELECT p.pno 교수번호, pname 교수이름, c.cno 과목번호, cname 과목명, s.sno 학번, sname 이름, 
	result 학점, grade 평가점수
FROM student s, professor p, course c, score r, scgrade
WHERE pname = '송강' 
AND result BETWEEN loscore AND hiscore
AND grade = 'A'
AND s.sno = r.sno
AND r.cno = c.cno
AND p.pno = c.pno;

교수번호  교수이름   과목번호  과목명       학번    이름             학점 평가점수
--------- ---------- --------- ------------ ------- ---------- ---------- ---------
1001      송강       1211      일반화학실험 894501  장봉철             97 A
1001      송강       1211      일반화학실험 905302  정욱상             89 A
1001      송강       1211      일반화학실험 913901  황수현             94 A
1001      송강       1211      일반화학실험 915303  정욱주             86 A
1001      송강       1211      일반화학실험 915601  강태용             87 A
1001      송강       1211      일반화학실험 915602  임주영             93 A
1001      송강       1211      일반화학실험 923902  김호야             93 A


13. 화학과 1학년 학생에게 강의하는 교수의 명단을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, p.pno 교수번호, pname 교수이름
FROM student s, professor p, course c, score r
WHERE major = '화학'
AND syear = 1
AND s.sno = r.sno
AND r.cno = c.cno
AND c.pno = p.pno;

전공          학년 학번    이름       교수번호  교수이름
------- ---------- ------- ---------- --------- ----------
화학             1 925309  오우재     1001      송강
화학             1 945302  김람석     1004      시진영
화학             1 945303  남궁경아   1004      시진영
화학             1 945314  이철윤     1004      시진영
화학             1 925309  오우재     1004      시진영
화학             1 945302  김람석     1004      시진영
화학             1 945303  남궁경아   1004      시진영

 

 

route

: 라우팅 경로 확인 및 수정

 

route 출력 필드
• Destination: 목적지
• Gateway: 게이트웨이 주소
• Genmask: 목적지 네트워크의 넷마스크 주소.
  - 255.255.255.255 : 목적지 호스트의 주소
  - 0.0.0.0 : 기본 게이트웨이 주소
• Flags: 해당 경로에 대한 정보를 알려주는 기호.
  U(up):활성화된 경로

  H(host):호스트 주소,
  G(gateway):게이트웨이
• Metric: 목적지 네트워크까지의 거리
• Ref: 경로를 참조한 횟수
• Use: 경로를 탐색한 횟수
• Iface: 패킷이 오가는 데 사용할 네트워크 인터페이스

 

서식
# route [add | del] –net [ip] netmask [mask] gw [ip]
ex)
# route add –net 1.2.3.0 netmask 255.255.255.0 gw 192.168.11.2
# route add –net 1.2.3.4 netmask 255.255.255.255 gw 192.168.11.2
# route add default gw 192.168.11.1 enp3s0
# route del -net 192.168.10.0 netmask 255.255.255.0 enp3s0
** 추가 경로는 여러 서브넷 환경을 가진 시스템에서 제한적으로 사용
• 시스템에는 단 하나의 default gateway만 지정가능함으로 추가적인 경로에 대한 설정은 직접 해야한다.
  (ICMP redirect 등을 허용 X)

 

※ Windows route 명령
route –p add [IP] MASK [mask] [GW_IP]

ex)
route –p add 1.2.3.0 MASK 255.255.255.0 192.168.11.2
route –p add 1.2.3.4 MASK 255.255.255.255 192.168.11.2

 

 

IP aliases

하나의 물리적인 인터페이스를 여러 개의 논리적인(?) 인터페이스로 구현 IP를 여러 개 설정하는 방법

인터페이스가 여러개인 것처럼 구성

같은 MAC address / 다른 IP

방법
1. ifcfg-ens32를 ifcfg-ens32:0, ifcfg-ens32:1 등으로 복사한 이후 각각 다른 device와 IP를 설정한다.
  ⇒ subnet은 동일하거나 달라도 상관없다.
  ⇒ 설정후 nic를 reset한다.
2. ifconfig 명령을 이용한다.
  ⇒ ifconfig ens32:0 192.168.10.32

 

실습

/etc/sysconfig/network-scripts에 들어가 ens32를 ens32:0로 복사한다.

cat 명령어를 이용해 잘 복사된 것을 확인한다.

 

[ vi ifcfg-ens32:0 ]로 위와 같이 NAME, DEVICE, IP를 수정한다.

 

ifconfig ens32:0 192.168.10.131 명령을 이용한다. 

IP aliases가 잘 설정된 것을 확인할 수 있다.

if 문

if 문

if (조건) {
        문장1;
        문장2;
        ....
}

 

if~else 문

if (조건) {
        문장1;
        문장2;
        ....
}
else {
        문장1;
        문장2;
        ....
}

if~else if 문

if (조건) {
        문장1;
        문장2;
        ....
}
else if (조건2) {
        문장1;
        문장2;
        ....
}
else if (조건3) {
        문장1;
        문장2;
        ....
}
else {
        문장1;
        문장2;
        ....
}

 

$a = "";
if (!isset($a)) echo(" \$a의 값이 없습니다.2<br>"); // FALSE
if (is_null($a)) echo(" \$a의 값이 없습니다.1<br>"); // FALSE
if (empty($a)) echo(" \$a의 값이 없습니다.3<br>"); // TRUE

빈 값("")

empty() : TRUE

is_null() ,  !isset() : FALSE

(PHP가 빈 값과 널 값을 서로 다르게 봄)

 

switch문

switch (변수 또는 수식) {
   case 값1 :
             문장1;
             문장2;
             ...
             break;
   case 값2 :
             문장1;
             문장2;
             ...
             break;
...
   default :
             문장1;
             문장2;
             ...
}

 

 

 

 

 

if문 예제

예제 2-1. 입력된 값 중에 큰 값을 출력한다.

2-1.html

<html>
<head>
<title>2-1.html 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="2-1.php">
	A : <input type="text" name="a"><br>
	B : <input type="text" name="b"><br>
		<input type="submit" name="확인" value="확인">
		<input type="reset" name="취소" value="취소"><br>
  </form>
</html>

2-1.php

<?
   $a = $_POST["a"];
   $b = $_POST["b"];
   if ($a>$b) {
       echo(" 입력 값중 큰 값은 \$a($a)입니다. ");
   }
   if ($b>$a) { 
       echo(" 입력 값중 큰 값은 \$b($b)입니다. ");
   }
   if ($a==$b) {
   echo(" 두 입력 값이 동일합니다.. ");
   }
?>

실행결과

 

예제 2-2. 다음 표를 보고 입력된 급여에 따라 각 사원의 내년도 지급 받을 급여를 출력한다.
* 입력은 만원 단위로 입력한다.
ex) 1,230,000원 → 123만원

2-2.html

<html>
<head>
<title>2-2.html 급여 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="2-1.php">
	현재 급여 입력: <input type="text" name="sal">만원<br>
		<input type="submit" name="확인" value="확인">
		<input type="reset" name="취소" value="취소"><br>
  </form>
</html>

2-2.php

<?
   $sal = $_POST["sal"];
   if ($sal <= 100) { // sal이 100만원 이하인 경우
      $sal = round($sal*1.15);
      echo(" 당신의 내년 급여는 15% 인상된 {$sal}만원입니다.");
   }
   else if ($sal <= 200) { // 101만원≦sal≦200만원
      $sal = round($sal*1.1);
      echo(" 당신의 내년 급여는 10% 인상된 {$sal}만원입니다.");
   }
   else if ($sal <= 300) { // 201만원≦sal≦300만원
   $sal = round($sal*1.05);
   echo(" 당신의 내년 급여는 5% 인상된 {$sal}만원입니다.");
   }
   else if ($sal <= 400) { // 301만원≦sal≦400만원
   $sal = round($sal*1.02);
   echo(" 당신의 내년 급여는 2% 인상된 {$sal}만원입니다.");
   }
   else { // sal이 400만원을 초과하는 경우
   echo(" 당신의 내년 급여는 올해와 같은 {$sal}만원입니다.");
   }
?>

실행결과

 

switch 실습

예제 2-3. 다음 [표]를 보고 입력된 급여에 따라 각 사원의 내년도 지급 받을 급여를 출력한다.
* 프로그램은 switch 문을 이용한다.
* 입력은 만원 단위로 입력한다.
ex) 1,230,000원 → 123만원

2-3.html

<html>
<head>
<title>2-3.html 급여 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="2-2.php">
	현재 급여 입력: <input type="text" name="sal">만원<br>
		<input type="submit" name="확인" value="확인">
		<input type="reset" name="취소" value="취소"><br>
  </form>
</html>

2-3.php

<?
   $sal = $_POST["sal"];
   $con = ceil($sal/100);
   switch ($con) {
     case 1: // sal이 100만원 이하인 경우
            $sal = round($sal*1.15);
            echo(" 당신의 내년 급여는 15% 인상된 {$sal}만원입니다.");
            break;
     case 2: // 101만원≦sal≦200만원
            $sal = round($sal*1.1);
            echo(" 당신의 내년 급여는 10% 인상된 {$sal}만원입니다.");
            break;
     case 3: // 201만원≦sal≦300만원
            $sal = round($sal*1.05);
            echo(" 당신의 내년 급여는 5% 인상된 {$sal}만원입니다.");
            break;
     case 4: // 301만원≦sal≦400만원
            $sal = round($sal*1.02);
            echo(" 당신의 내년 급여는 2% 인상된 {$sal}만원입니다.");
            break;
     default : // sal이 400만원을 초과하는 경우
            echo("당신의 내년 급여는 올해와 같은 {$sal}입니다.");
   }
?>

실행결과

 

예제 2-4. 다음에 제시하는 문제점과 해결책을 이용, 이전 [프로그램]를 수정한 프로그램을 완성하세요

- 문제점
인상폭이 각 등급별로 정의되면 급여가 역전되는 현상이 나타난다. 예를 들어 급여가 99만원이었던 5등급 사
원은 15% 인상으로 114만원이 되지만 101만원인 4등급 사원은 10% 인상으로 111만원이 되어 인상 후, 자
신의 급여 등급보다 낮은 사원보다 적은 급여를 받게 된다.
- 해결책
역전 현상이 나타나는 경우 한 단계 낮은 등급의 최대 급여와 동일하게 급여를 조정해주기로 결정했다. 예를
들어 5등급의 최대 급여는 100만원으로 인상된 급여는 115만원인데 만일 4등급 사원 중에 인상 급여가 115
만원에 미치지 못하는 사원이 있다면 해당 사원의 인상된 급여는 115만원으로 조정해 주는 것이다.

2-4.html

<html>
<head>
<title>2-4.html 급여 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="2-4.php">
	현재 급여 입력: <input type="text" name="sal">만원<br>
		<input type="submit" name="확인" value="확인">
		<input type="reset" name="취소" value="취소"><br>
  </form>
</html>

2-4.php

<?
   $sal = $_POST["sal"];
   $con = ceil($sal/100);
   switch ($con) {
   case 1: // sal이 100만원 이하인 경우(5 등급)
          $sal = round($sal*1.15);
          echo(" 당신의 내년 급여는 15% 인상된 {$sal}만원입니다.");
          break;
   case 2: // 101만원≦sal≦200만원(4 등급)
          $sal = round($sal*1.1);
          if ($sal >= 115) // 5 등급 인상 후 최대 급여 115만원
            echo(" 당신의 내년 급여는 10% 인상된 {$sal}만원입니다.");
          else
            echo(" 당신의 내년 급여는 115만원입니다.");
          break;
   case 3: // 201만원≦sal≦300만원(3 등급)
          $sal = round($sal*1.05);
          if ($sal >= 220) // 4 등급 인상 후 최대 급여 220만원
            echo(" 당신의 내년 급여는 10% 인상된 {$sal}만원입니다.");
          else
            echo(" 당신의 내년 급여는 220만원입니다.");
          break;
    case 4: // 301만원≦sal≦400만원(2 등급)
          $sal = round($sal*1.02);
          if ($sal >= 315) // 3 등급 인상 후 최대 급여 315만원
             echo(" 당신의 내년 급여는 10% 인상된 {$sal}만원입니다.");
          else
            echo(" 당신의 내년 급여는 315만원입니다.");
          break;
   default : // sal이 400만원을 초과하는 경우(1 등급)
          if ($sal >= 408) // 2 등급 인상 후 최대 급여 408만원
            echo(" 당신의 내년 급여는 동결된 {$sal}만원입니다.");
          else echo(" 당신의 내년 급여는 408만원입니다.");
}
?>

 

실행결과

+ Recent posts