html body 태그 백그라운드 색깔이 자동으로 변경되는 코드를 Javascript 소스를 간단히 작성해 보았습니다. jQuery를 활용하지 않고 순수 Javascript만으로 구현해 해당 소스를 복사해 .html 파일 확장자로 저장 하시고 브라우저에서 확인해 보시면 됩니다.
처음엔 색상 코드를 배열로 저장해 랜덤하게 뽑아내려고 했지만, 인터넷에 있는 자료 중 색깔 코드가 자동으로 생성되는 소스를 활용해 코드를 작성했습니다. 소스의 흐름은 간단합니다. change 함수가 무한 반복되며 실시간으로 랜덤하게 색상이 변경되는 모습을 보기 위해 1초에 한 번씩 코드가 실행 되도록 코드를 작성했습니다.
코드의 상세 내용은 주석에 있는 내용을 참고하시면 이해하실 수 있으며 무한반복 되지만 멈추기 위한 방법이 필요한 분들이 있을 수 있다는 판단에 clearTimeout을 활용하는 구문도 작성해 보았습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>자동으로 백그라운드 색깔이 변경 되도록 하는게 목표 현재는 10000번돔.</title>
</head>
<body>
</body>
</html>
<script type="text/javascript">
var number = 0;//특정 갯수만큼 반복하고 멈추게 하기 위해서
function change() {
const roop = setTimeout(change, 1000);//1초에 한번씩 실행
//자동색상코드 생성 코드 이건 인터넷에서 가져온거
const randomColor = Math.floor(Math.random()*16777215).toString(16);
document.body.style.backgroundColor = "#" + randomColor;
if(number >= 10000){//만번만 돌아
clearTimeout(roop);
}
number++;
};
change();//clearTimeout 조건이 될떄까지 반복
</script>
결과화면
결과화면은 아래 이미지와 같이 표시 됩니다. 현재 소스 기준으로는 10000번 반복 됩니다.
해당 소스를 파일로도 필요하신 분들은 파일을 다운로드받아서 확인해 보셔도 됩니다. 간단한 소스지만 개인적으로 재밌을 것 같다는 생각에 코드를 작성해 보았으니 혹시라도 필요하신 분들은 참고하시면 좋을 것 같습니다.
오래전 이야기지만 대학 때 처음 프로그래밍 언어를 접하였고 졸업 이후 취업을 하기 전까지 국비 지원으로 자바언어를 활용한 웹 프로그래밍 관련 수업을 들었습니다. 대학 수업 과목 중 자바 과목이 있었지만, 책에 있는 코드를 그대로 따라치고 실행 결과를 보는 것만으로는 프로그래밍 언어에 대해서 제대로 이해할 수 없었던 기억도 납니다.
국비지원 프로그래밍 교육에 대한 현실이나 후기에 대해 인터넷에 있는 정보들을 좀 찾아보게 되면 부정적인 의견이 꽤 있었던 기억이 납니다. 그런 수업을 듣는 것보다 스스로 어떠한 프로그램이나 환경을 구성하며 문제를 해결하는 방식으로 배우는 게 더 좋다고 하는 이야기들이 주로 있었던 것 같습니다.
이러한 의견에 대해서는 전적으로 동의하며 프로그래밍을 가장 빨리 익히고 이해하며 습득할 수 있는 가장 좋은 방법은 맞습니다. 하지만 국비 지원을 받아 프로그래밍 수업을 듣는 것이 더 좋은 효과도 있다고 생각합니다.
첫 번째. 사람들과 같이 공부하며 배우며 자신이 모르는 분야에 대해 더 잘 알고 있는 부분에 대해 직접적으로 정보 공유하지 않아도 눈으로 보거나 정보를 직접 공유하며 팁이나 노하우 등 배울 것들이 있습니다.
두 번째. 사업을 하든 취업을 하든 결국엔 사람들과 커뮤니케이션을 하며 정보를 주고받아야 합니다. 사람들과 커뮤니케이션 능력을 높일 수 있으며 프로젝트를 진행하며 나 아닌 다른 사람을 대하는 방식에 대해 배울 수 있습니다.
세 번째. 본인의 프로그래밍 실력이 좋다면 다른 사람에게 본인이 알고 있는 내용에 대해서 설명하게 되는 경우가 많아집니다. 다른 사람에게 어떠한 기술적인 내용을 설명하다 보면 본인이 알고 있는 지식보다 더욱더 깊게 이해할 수 있게 계기가 되기도 합니다.
네 번째. 혼자서도 새로운 기술을 습득하며 다양한 IT 공부를 할 수도 있겠지만 아무래도 교육기관에서 같이 수업을 받는 것보다는 공부를 게을리하게 됩니다. 하지만 교육기관에서 교육을 받게 되면 수업하시는 강사분도 계시고 다른 사람들도 공부하는 모습에 조금 더 부지런히 공부할 수 있는 분위기가 되기도 합니다.
개인적으로 국비 지원 프로그래밍 수업을 받으며 좋은 효과가 있을 것으로 생각되는 몇 가지를 작성해 보았습니다. 물론 사람들과 직접 대화하지 않고 인터넷을 이용해 소통하는 방식도 있겠지만 사람과 직접 대화하는 것과 글로 주고받는 것에는 차이가 있습니다.
그래서 저는 국비 지원 프로그래밍 교육을 받는 것에 긍정적인 의견을 가진 사람 중 하나입니다. 물론 대학생 시절에도 가능한 부분입니다. 그래서 이미 대학을 다니며 이러한 것들은 경험하신 분들은 굳이 국비 지원 수업을 굳이 듣지 않아도 어렵지 않게 프로그래밍 관련 직종에 일하시는 분들도 있습니다. 사람마다 경험하는 것이 다르기에 국비 지원 수업이 필요하지 않은 사람들도 충분히 있을 수 있다고 생각합니다.
머리가 꽤 좋으신 분들은 이미 대학 시절부터 열심히 공부하며 저보다 더 빠른 시기에 경험할 수 있는 내용입니다. 하지만 저는 머리가 좋은 편이 아니었으며 평범한 사람이었기에 국비 지원 교육이 필요했습니다.
국비 지원 수업을 통해 프로그래밍 교육을 듣다 보면 적성에 맞지 않는 사람들도 있습니다. 교육을 받거나 반복 연습을 하다 보면 어떠한 사람이라도 프로그래밍 언어에 대해 이해할 수 있고 프로그래머, 개발자, 서버 관리자, 등등 다양한 IT 분야에서 일을 할 수 있습니다.
IT 기술 쪽 분야에 본인의 적성에 맞는지 그리고 이쪽 분야에 내가 재능이 있는지 없는지 판단하는 건 어렵지 않습니다. 자신이 처음 프로그래밍과 관련된 분야를 접하였거나 교육을 받았는데 처음 접하는 다른 사람에 비해 이해가 빠르고 같이 교육을 받는 다른 사람이 프로그래밍을 만들지 못하는 것은 최선을 다하지 않은 것이고 노력하지 않아 그렇게 된것이지 프로그래밍을 못 하는 사람을 이해하기 힘드신 분이라면 재능이 있으신 겁니다.
여기서 주의할 점은 프로그래밍 선행학습을 한 사람들도 대다수이기에 정말 처음 프로그래밍 관련 분야를 처음 접하는 다른 사람과 비교해 보시면 좋습니다. 조금 다니다 보면 프로그래밍을 할 수 있는 사람 하지 못하는 사람 구분은 가능합니다.
이런 사람들은 다른 사람과 동일한 시간에 교육을 받아도 성장하는 과정이 더욱더 빠르고 같은 내용을 봐도 남보다 더 앞서가실 수 있습니다. 게임으로 생각할 때 레벨업이 다른 캐릭터에 비해 빠르다고 생각하시면 좋을 것 같습니다.
그리고 국비 지원 프로그래밍 수업을 6개월 듣고 자신이 간단한 프로그램이라도 만들 수 있다면 자신의 시간을 IT 업계에 투자해볼 만한 가치가 있다고 생각합니다.
재능이 없고 머리가 좋지 않아도 프로그래밍이나 IT 기술직은 노력으로 충분히 극복할 수 있습니다. 그런데 개인적으로 생각하기에는 오랜 기간 이 분야에서 일을 원활히 하려면 자신의 적성에 맞아야 오랜 기간 일하실 수 있습니다.
국비 지원 프로그래밍 교육을 받는 교육 기관을 고를 때 많이 고민하실 것 같은데 어떤 사람들은 가르치는 사람이 실력이 부족하다고 판단하거나 유명한 교육기관이나 인지도 있는 교육기관을 생각하시는 것 같은데 개인적으로 생각하기엔 그런 건 중요하지 않습니다.
수업을 가르치는 사람도 헷갈릴 수 있는 부분이 있고 모르는 부분이 있을 수 있습니다. 이러한 부분은 수업을 들으며 본인이 어떻게 수업을 받을지에 따라 다릅니다. 수업하시는 분이 조금 진행이 안 된다고 하여도 교재가 있고 수업 진행을 하게 되어 있기에 수업 주제에 따라 본인이 추가적인 내용을 인터넷 검색을 하시거나 관련 서적을 보면 해당 내용에 더욱더 깊게 이해하시면 되는 겁니다.
그리고 비대면 수업을 추천하지 않습니다. 50%만 출석해야 하는 상황이더라도 교육을 받는 기관에 나오는 다른 사람이 있다면 반드시 교육기관에 나가서 수업받기를 추천합니다. 만약 교육기관에 모인 다른 사람들의 분위기가 모두 비대면 수업을 한다면 대면 수업에 출석하는 비율이 높은 학원을 추천해 드리고 싶습니다.
어쩔 수 없는 상황으로 남는 시간에 비대면 수업을 받는다고 하여도 본인의 노력 여부에 따라 달라질 수 있다고 생각합니다. 물론 저는 게으른 사람이고 머리가 좋은 사람도 아니기에 교육을 받을 때 나름대로 열심히 한 것이지 최선을 다했다고 생각하지는 않습니다.
국비 지원교육 기관에 따라 다른 선생님들에 비해 조금 더 이해되기 쉽게 가르치시거나 자신의 성향에 맞게 수업을 진행하는 사람들도 있겠지만 자신이 선택한 학원이 그렇지 못한다고 했을 땐 교육 기관을 옮기는 것도 좋겠지만 다른 교육기관에 간다고 하여도 큰 차인 없으며 본인의 의지가 가장 중요하다고 생각하는 편입니다.
그리고 경험자나 자신보다 잘하는 사람에게 질문하거나 의견을 공유한다는 개념이 정말 중요한 것 같습니다. 질문하는 내용을 상대방이 모를 수도 있다는 생각에 스스로 해결하려면 시간이 걸립니다. 대부분의 경력자는 이미 질문하는 사람이 생각하는 것을 미리 경험하였고 경험자도 모르는 내용이라 하더라도 해당 문제의 답을 빨리 찾아낼 수 있습니다.
자신이 의문을 가지고 있는 내용을 경험자에게 물어보기 전 자신이 혼자서 해결해 보려고 테스트도 해보고 실행도 해보고 다른 방법도 조금 생각해보고 질문을 하신다면 정말 좋을 것 같습니다.
물론 저도 질문을 잘하지 않는 사람이었고 매번 혼자서 일을 해결하려고 노력했던 사람입니다. 그렇기에 생기는 장점은 혼자서 해결하려다 보니 모르는 일에 대해서 스스로 해결하는 방식을 찾는 방식은 늘었으나 성장하는 데 시간이 오래 걸렸던 기억이 납니다.
상대방이 모른다는 생각과 정말 어이없는 질문인가라는 생각에 질문하기 애매한 때도 있습니다. 그럴 때는 자신의 편한 옆자리 동생이나 형, 또는 언니한테 가볍게 이야기를 하는 것만으로도 한 번 더 생각할 수 있는 시간이 되어 자신의 지식에 보탬이 된다는 생각도 듭니다.
그리고 6개월짜리 교육과정 중 웹, 모바일, 서버, AI 등등 다양한 과정들이 있는데 이미 6개월짜리 수업을 들었지만 다른 IT 분야에 관심이 있어 다른 수업도 받고 싶어 교육을 받으신다면 주의할 점이 있습니다.
대부분 국비지원 프로그래밍 교육 수업 진행은 후반부 외 초반 교육은 초보자 위주로 진행 되기에 이전에 받았던 교육과 동일한 내용이 대부분이라 복습한다는 개념과 더깊게 이해할 수 있는 장점은 있지만 정말 중요한 내용은 초반 기간이 지난 후 조금 힘이 빠진 이후 중 후반 기간에 교육을 받게 되니 조금 끈기 있게 공부하시면 좋을 것 같습니다. 프로그래밍쪽에 잘맞는 친구들은 후반부에도 정말 열심히 수업을 듣더라고요.
개인적으로 국비지원 교육을 받으며 그리고 사회생활을 하거나 일을하며 경험했던 내용들중 다른 사람에게 필요한 내용이라고 생각 되는 것들을 정리해 봤습니다.
국비 지원 과정을 통해 프로그래밍 관련 교육을 몇 차례 받았습니다. 물론 자유로운 회사도 많지만 아무래도 월급을 받는 회사에서 개발하거나 일을 할 때는 아무래도 업무에 필요하거나 돈이 되는 내용에 위주로 개발을 하게 되는데 국비 교육을 받을 때는 다른 사람들과 각자 자신이 만들어보고 싶었던 프로젝트를 서로 이야기하며 조율하며 자유롭게 무언가 개발하고 만드는 편안하고 좋은 분위기로 무언가 만들어 볼 수 있었기 때문에 여러 번 교육을 받았던 것 같습니다.
IT 관련 기술 직업은 굉장히 매력적인 직업입니다. 직접 일을 하지 않는 다른 사람이 보기에는 멋있어 보이기도 하고 신기해 보이기도 하며 문제 발생 시 남들이 해결하지 못하는 문제를 해결했을 때 그리고 다른 사람이 처리 할 수 없는 일이라는 자부심과 남들에게 인정받는 직업이라는 느낌이 있기도 합니다.
미래에 대한 전망도 좋고 다른 직업에 비해 잘만 한다면 업무 시간을 여유롭게 보내며 고수익을 얻을 수 있는 직업이기도 하며 대부분 IT 회사는 일반 회사보다 좀 더 자유롭고 안정적입니다. 하지만 쉽지는 않습니다. 공부해야 할 양도 많고 다양한 문제도 잘 해결해 내야 하며 실수나 각종 문제 해결 및 장애도 잘 처리해 내야 하고 개발 일정에 맞추느라 고생한 기억이 있을 겁니다.
저는 남들보다 느리게 그리고 천천히 여유 있게 살고 싶었던 사람이었기에 남들만큼 성장이 빠르지는 못했습니다. 그리고 더 열심히 최선을 다할 수 있었음에도 놀고 싶어서 놀았던 기억이 나기도 합니다. 그런데 나이가 조금씩 들다 보니 세상에 정말 공짜가 없더라고요. 그래서 조금씩 바빠지는 삶을 살아야 현재 사회에서 낙오되지 않고 살아갈 수 있는 것 같습니다. 혹시라도 국비 지원교육 중 프로그래밍과 관련된 교육을 받으시려는 분 중 이글을 보셨다면 참고하셔서 꼭 도움이 되는 내용이 되기를 바라는 마음으로 작성을 마칩니다.
최근에 우분투 서버에 MariaDB와 아파치 서버를 구성하여 PHP를 설치하였습니다. 이왕 설치한 거 간단히 방명록 기능을 구현해 보았는데 필요할 때 개인적으로 참고할 목적과 필요하신 분들과 정보 공유를 위해 정리해 봤습니다.
웹 프로그래밍 방명록 구현을 위해 구성된 서버 버전은 다음과 같습니다.
우분투 - 20.04
MariaDB 버전 - 10.3.31
Apache 서버 버전 - 2.4.41
PHP 버전 - 7.4.3
방명록 글쓰기, 방명록 글 수정, 방명록 글 삭제, 방명록 검색, 페이징 기능을 간단히 구현하였으며 예외처리나 기타 보안 사항까지 모두 처리 하지 않았기에 현업에서 사용 시 필요한 구문만 참고 후 추가 수정이 필요합니다.
먼저 MariaDB에서 간단히 방명록 저장용 테이블을 하나 생성해 줍니다.
CREATE TABLE board(
no INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
email VARCHAR(40),
pass VARCHAR(30),
content TEXT,
date DATETIME,
PRIMARY KEY(NO)
);
당장 필요한 건 아니지만, 나중에 페이징 테스트를 하기 위해 데이터도 임시로 넣을 수 있도록 프로시져를 하나 만들어 줬습니다.
DELIMITER ;;
CREATE PROCEDURE auto_insert(IN count INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i <= count) DO
INSERT INTO board (name, email, pass, content, date)VALUES(CONCAT('에스파' ,i) , CONCAT('auto', i, '@mail.com'), '12345', CONCAT('자동 생성 데이타 에요', i), NOW());
SET i = i + 1;
END WHILE;
END;;
DELIMITER ;
CALL auto_insert(231);/*데이터 넣기*/
DROP PROCEDURE auto_insert;/*여러 종류 데이터 넣으려면 지우고 내용만 조금 변경*/
방명록 첫 페이지
간단히 방명록 첫 페이지를 HTML과 CSS를 활용해 작성했습니다.
home.html(메인 페이지)
기능이 따로 있는 페이지가 아니어서 html 페이지로 만들었으며 basic.css 스타일 시트 파일만 가져오는 간단한 HTML 소스입니다.
방명록 홈에서 방명록 목록을 선택하게 되면 방명록 전체 글 목록을 확인할 수 있는 페이지입니다.
list.php(방명록 목록 기능)
include 파일은 basic.css(페이지 디자인), dblink.php(DB 접속), listpage.php(방명록 상세 페이지), page.php(페이징 처리 및 검색) 파일을 다른 페이지에서도 사용해 파일을 나누어서 만들어 include 구문을 사용해 나눠 놓은 파일을 가져와 소스를 작성했습니다.
<?php
include "dblink.php";
$query = "SELECT * FROM board ORDER BY no";
$result = mysqli_query($conn,$query);
$rows = mysqli_num_rows($result);//DB 조회 결과 갯수를 result 변수에 넣어줘야 include 페이지 오류 나지 않음.
if(!$rows) {
echo "현재 등록되어있는 글이 없습니다.";
exit;
}
?>
<title>방명록 목록</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 목록</h1>
<hr id="title">
<a href="/board/home.html" class="my_link"><span class="my_text">【방명록 홈】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">
<?php
include "page.php";
$sql="SELECT * FROM board ORDER BY no DESC LIMIT $skip_record,$page_max";
$result = mysqli_query($conn,$sql);
include "listpage.php";
include "paging.php";
mysqli_close($conn);
?>
방명록 하단에 페이지, 페이징 처리 및 검색 결과에 표시되는 페이지 및 검색 태그를 다른 곳에서도 사용해 따로 파일을 뺐습니다.
page.php(페이지 계산 기능)
page를 계산하기 위해 필요한 내용을 따로 파일을 만들어 정리했습니다. 이 페이지를 include 하기 전 SELECT 쿼리의 총 개수를 담는 변수 이름을 $rows 이름의 변수로 담아야 다른 페이지에서 활용할 때 에러가 나지 않으니 참고하시면 좋을 것 같습니다.
<?php
$page_max = 10;//페이지에 표시될 페이징 갯수
$total = $rows;//DB SELECT 전체 행
$page_check = $total/$page_max;
$page_total = (int)($page_check);//전체 페이지 계산
$page_num = isset($_GET['page_num']) == '' ? 1 : $_GET['page_num'];//get 페이지 번호가 없는 경우 페이지 번호를 1로 지정.
$pg_cal = (int)(($page_num-1) / $page_max) * $page_max;//페이징 시작 위치 계산
$pg_start = $pg_cal+1;//다음 시작 페이지 계산
$pg_end = $pg_start + $page_max;//다음 마지막 페이지 계산
$prev = $pg_start-$page_max; //이전 페이징 시작 위치 계산
if($page_total < $page_check)//기본 페이지 1로 셋팅
$page_total += 1;
if($page_num == 1)//DB LIMT 갯수 계산
$skip_record=0;
else
$skip_record=($page_num-1)*$page_max;
?>
paging.php(방명록 다음 페이지, 이전 페이지, 처음, 끝 표시 기능)
하단에 들어갈 페이지 숫자와 같이 이전, 다음, 처음, 마지막 페이지 이동 시 필요한 소스입니다. 어려운 내용이 있는 구문은 아니지만 다른 페이지에서도 반복적으로 사용하기에 따로 파일을 뺐습니다.
반복문과 제어문을 활용해 하단 페이지 숫자 및 다음, 이전, 처음, 끝 페이 구분이 가능하며 표시됩니다.
방명록 목록 중 삭제를 선택하면 볼 수 있는 페이지입니다. 글 삭제 버튼을 누르게 되면 delete.php 파일로 입력한 비밀번호와 함께 페이지가 전환 됩니다.
delete.php(방명록 글 삭제 기능)
한 페이지에서 보여주고 삭제까지 처리되어 POST 전송 여부를 확인하였으며 비밀번호 확인 후 삭제 쿼리를 보내게 됩니다. mysqli_affected_rows를 활용해 delete가 정상적으로 되었는지 확인했습니다.
<?php
include "dblink.php";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {//삭제 버튼 눌렀을 때.
$pw = $_POST['check'];
$no = $_POST['no'];
$query = "SELECT no FROM board WHERE no='$no' AND pass = '$pw'";//글 삭제 비밀번호 확인
$result = mysqli_query($conn,$query);
$row = mysqli_fetch_array($result);
if($row){//비밀번호 맞을때 DELETE 쿼리 실행
$sql = "DELETE FROM board WHERE no = '$no' AND pass = '$pw'";
mysqli_query($conn, $sql);//DELETE 실행
$result = mysqli_affected_rows($conn);//delete 몇개 삭제 되었는지
if($result > 0){//1개 이상 변화 있었으면 글 삭제 OK.
echo "<script>alert('글이 삭제되었습니다.');</script>";
echo "<script>location.href='/board/list.php';</script>";
}
}else{
echo "<script>alert('비밀번호 입력이 안되었거나 잘못된 비밀번호 입니다.');</script>";
echo "<script>window.history.back();</script>";
}
}else{//글 목록에서 넘어왔을때
$no = $_GET['no'];
}
?>
<title>방명록 글 삭제</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 글 삭제</h1>
<hr id="title">
<a href="/board/list.php" class="my_link"><span class="my_text">【방명록 목록】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">
<?php
$no = $_GET['no'];
$query = "SELECT * FROM board WHERE no = $no";
$result = mysqli_query($conn,$query);
if($row = mysqli_fetch_array($result)) {
$no = $row['no'];
$name = $row['name'];
$email = $row['email'];
$content = $row['content'];
$date = $row['date'];
echo("
<div class='my_div'>
<form action='$_SERVER[PHP_SELF]' method='post' onsubmit='alert('ddd')'>
<ul class='my_ul'>
<li>글번호 : $no</li>
<li>작성자 : $name</li>
<li>내용$content</li>
<li>등록일 : $date</li>
</ul>
<p style='text-align:center;'>
<input type='password' id='check' name='check' placeholder='비밀번호 확인' style='height: 28px;' > <input type='submit' value='글 삭제' >
<input type='hidden' id='no' name='no' value='$no'>
</p>
<input type='hidden' id='no' name='no' value='$no'>
</form>
</div>
");
}
mysqli_close($conn);
?>
방명록 검색 결과 페이지
방명록 목록 하단에 페이지 번호 밑에 있는 이름이나 내용으로 검색했을 때 나오게 되는 페이지이며 검색 결과가 많게 되면 페이징 처리도 됩니다.
search.php(방명록 검색 기능)
내용, 이름 검색을 확인 후 쿼리문을 보내기 위해서 분기문이 조금 있습니다. 검색 결과가 많을 경우 페이징 처리를 하기 위해 검색 데이터는 세션에 저장하여 유지하였습니다. 방명록 목록 기능과 보여주는 화면이 같아 page.php, listpage.php, paging.php를 그대로 가져와 사용했습니다.
<?php
/**
s_type - 이름, 내용 검색인지 구분하기 위해
search - 검색어
search_type - 검색 타입에 따라 쿼리문 글자 변경용 변수
**/
include "dblink.php";
session_start();//검색 데이타 유지하기 위해서 사용
$s_type = "";
$search = "";
$search_type = "";
if($_SERVER['REQUEST_METHOD'] === 'POST'){//검색 결과 필요한 데이터 유지를 위해 세션에 데이터 저장
$s_type = $_POST['search_list'];
$search = $_POST['search'];
$_SESSION["s_type"]= $s_type;//검색된 결과에서 페이지 전환시 데이터 유지하기 위해 사용
$_SESSION["search"]= $search;//검색된 결과에서 페이지 전환시 데이터 유지하기 위해 사용
}else{//검색된 결과 이후 페이징 될때마다 검색 데이터 유지
$s_type = $_SESSION["s_type"];
$search = $_SESSION["search"];
}
if($s_type=="name"){//검색 선택에 따라 쿼리문 다르게 조회
$search_type = "name";
}else if($s_type=="content"){
$search_type = "content";
}
$query = "SELECT * FROM board WHERE $search_type LIKE '%$search%' ORDER BY NO;";
$result = mysqli_query($conn,$query);
include "error.php";
$rows = mysqli_num_rows($result);//DB 조회 결과 갯수를 result 변수에 넣어줘야 include 페이지 오류 나지 않음.
if(!$rows) {
echo "검색 결과가 없습니다.";
exit;
}
?>
<title>방명록 검색 결과</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 검색 결과 목록</h1>
<hr id="title">
<a href="/board/list.php" class="my_link"><span class="my_text">【방명록 목록】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">
<?php
include "page.php";
$sql="SELECT * FROM board WHERE $search_type LIKE '%$search%' ORDER BY no DESC LIMIT $skip_record,$page_max ";
$result = mysqli_query($conn,$sql);
include "listpage.php";
include "paging.php";
mysqli_close($conn);
?>
마지막으로 코드 작성 시 사용했던 툴은 Atom을 사용하였으며 폴더 구조는 아래 이미지와 같습니다.
PHP 언어를 활용해 방명록 기능이나 게시판 기능은 인터넷에 많이 있지만, 개인적으로 보기 깔끔하지 않아 정리해 봤습니다.
현업에서 사용하려면 많은 부분을 손봐야 하겠지만 교육용이나 연습용으로 필요하신 분들이 있을 수도 있다는 생각에 해당 파일을 압축해서 파일도 올려 놓을 테니 소스가 필요하신 분들은 참고하시면 좋을 것 같습니다.
파일을 받아 사용하시려면 board 폴더를 하나 만드시고 DB 연결 정보를 변경하시면 될 것 같습니다.
개인적으로 테스트 용도로 MariaDB를 사용해 보고 있는데 테스트 용도나 디버깅을 위해 임시 데이터를 테이블에 인서트 해야 하는 경우가 종종 생기는 것 같습니다. 프로그래밍 언어 DB 연결 및 제어문을 활용해 테스트 데이터를 넣어도 되지만 DB가 연결되어 있다면 SQL Query문 반복을 활용해 데이터를 넣는 게 더 간편한 것 같습니다.
프로시져만 작성하려고 했으나 데이터베이스, 테이블, 프로시져까지 생성하는 구문을 간단히 정리해 봤습니다. 제대로 규칙을 지키지 않고 작성한 쿼리문을 실행하게 되면 에러 문구가 애매하게 표시되는 부분이 있어 어디가 문제인지 찾느라 시간을 조금 허비한 기억에 개인적으로 이후에 활용할 목적도 있습니다.
CREATE DATABASE good; /*good DB 생성*/
/*_______________________________________________________________________________*/
USE good; /* good DB 선택*/
/*_______________________________________________________________________________*/
CREATE TABLE test( /*테스트용 테이블 생성*/
no INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
email VARCHAR(40),
pass VARCHAR(30),
content TEXT,
date DATETIME,
PRIMARY KEY(NO)
);
/*_______________________________________________________________________________*/
DELIMITER ;; /* 프로시저 만들기 위한 구분문자 DELIMITER 사이에 공백 지우면 에러남 */
CREATE PROCEDURE auto_insert(IN count INT) /*auto_insert 이름의 프로시저 생성 호출시 들어오는 숫자를 count 변수에 저장*/
BEGIN
DECLARE i INT DEFAULT 1;/* 변수 I에 1 초기화 */
WHILE (i <= count) DO/*1부터 호출시 입력한 숫자만큼 반복*/
INSERT INTO test (name, email, pass, content, date)VALUES(CONCAT('자동생성' ,i) , CONCAT('auto', i, '@mail.com'), '12345', CONCAT('자동생성 데이타 입니다.', i), NOW()); /* INSERT 실행 CONCAT 함수는 문자를 합치기 위해 사용*/
SET i = i + 1; /* 루프가 끝나기전 I변수 1증가 */
END WHILE; /* 반복 */
END;;
DELIMITER ; /* 프로시저 종료 지점 마찬가지로 DELIMITER 사이 공백 지우면 에러남.*/
/*_______________________________________________________________________________*/
CALL auto_insert(1121); /* 1121개 데이터 인서트 해봐~ */
/*_______________________________________________________________________________*/
SELECT * FROM test; /* 데이타 잘들어갔는지 확인.*/
/*_______________________________________________________________________________*/
DROP PROCEDURE auto_insert; /* INSERT 된거 확인 했고 필요 없으니 프로시저 삭제~ */
/*_______________________________________________________________________________*/
결과화면.
임시로 테스트 데이터를 넣으려는 분 중 쿼리 반복문에 익숙하지 않으신 분들은 참고하시면 좋을 것 같습니다.
리눅스 CentOS 7 버전에서 Maria DB를 설치하여 Heidi SQL 프로그램을 사용해 외부 접속 후 사용자 계정을 추가하여 데이터베이스와 테이블을 생성하여 권한을 주는 방법에 대해 정리해 보려고 합니다.
먼저 가상머신 프로그램인 VirtualBox에 CentOS 7 버전을 설치해야 합니다. 저는 dbgo라는 이름으로 리눅스를 설치하였습니다. 설치 방법은 이전에 작성한 https://zzarungna.com/1546 내용을 참고하시면 좋을 듯합니다.
리눅스 서버 최초 설치가 완료되었다면 커맨드 명령어를 사용해 maria db를 설치하시면 됩니다. 설치과정 중간에 나오는 내용에 모두 y를 누르고 엔터로 눌러 진행하시면 됩니다.
#mariadb와 mariadb-server 모두 설치~
yum install mariadb mariadb-server
MariaDB 설치 후 사용하기 위해 start 명령어를 사용해 시작해 주면 되며 서버 리부팅된 이후에도 자동으로 시작하게 하려고 enable mariadb 명령어를 적용 하시고 mysql에 접속해 주시면 됩니다. 설치 이후 초기 비번은 지정하지 않았으니 비번을 물어보는 화면에서 엔터를 입력하면 접속되게 됩니다.
systemctl start mariadb #마리아 디비 스타트
systemctl enable mariadb #서버 리부팅 이후에도 자동으로 시작 하기 위해서.
mysql -u root -p #mariadb 접속
DB 접속 후 관리자 계정이 외부 접속이 가능하도록 권한을 설정하시고 비번을 지정해 주시면 됩니다. 기존 root 계정에 비번은 12345로 지정 하였으며 권한 설정과 비번을 같이 설정하는 명령어 입니다.
grant all privileges on *.* to root@'%' identified by 'mypass';
초기 mariaDB 설치 후 root 계정의 user 테이블 grant_priv(자신의 권한을 남에게 부여할 수 있는 권한) 필드가 N으로 설정되어 있습니다. 이걸 Y로 변경해 주어야 DB 계정을 추가하고 추가한 계정의 권한도 부여할 수 있습니다.
use mysql; #mysql db 선택.
update user set grant_priv='Y' where host='%' and user='root';
flush privileges; #변경사항 즉시 반영
MariaDB 설치 후 관리자 계정이 외부에서 접속할 수 있도록 그리고 DB 접속 계정 추가나 권한도 부여 가능하도록 설정하였습니다. 마지막으로 MariaDB를 외부에서 접속 가능하도록 방화벽을 열어 주시면 됩니다.
리눅스 서버에 MariaDB를 설치하였으니 현재 서버가 사용하고 있는 ip 주소를 확인해야 외부에서 접속이 가능합니다.
ip addr show 명령어를 사용해 현재 서버가 사용하고 있는 아이피를 확인하시면 됩니다. 저는 192.168.56.108 아이피를 사용하고 있네요.
ip addr show
쿼리문을 사용해 데이터베이스, 테이블, 데이터 입력
가상 머신 리눅스 서버에서 MariaDB 설치와 외부에서 접속이 가능하도록 작업은 완료하였습니다. 그러니 이제 외부에서 실제로 접속이 되는지 테스트를 진행하려고 합니다. 먼저 https://www.heidisql.com/ 사이트에 접속하셔서 heidisql 프로그램을 설치해 주시면 됩니다. 저는 윈도우 환경의 인스톨러 프로그램을 다운받아 기본 설정된 상태로 설치해 주었습니다.
heidisql 프로그램 설치 후 실행하게 되면 아래 이미지와 같이 화면이 표시되게 됩니다. 시간이 지나 버전이 바뀌어 화면이 변경될 가능성은 있습니다.
네트워크 유형, Library IP는 방금 서버의 IP를 입력하고 열기를 누르시면 됩니다. 자격 증명 프롬프트에 체크하셨다면 root 계정을 입력하는 창이 추가로 표시 되니 아이디와 비밀번호를 다시 입력 하시면 접속되게 됩니다.
HeidSQL 프로그램을 사용해 데이터베이스 사용자 한 명을 추가 후 특정 테이블에 권한을 주기 위해 쿼리문을 사용해 데이터베이스를 하나 생성해 주었습니다. 실행 단축키는 Shift+Ctrl+F9 입니다.
CREATE DATABASE wellcome; /* 데이타 베이스 생성 */
쿼리문을 실행해 데이터베이스 생성하게 되면 왼쪽 메뉴에 추가한 데이타 베이스가 표시됩니다. 표시되지 않으신다면 F5 새로고침을 하시면 표시됩니다.
데이터베이스를 생성하고 인코딩 형식을 변경해야 한글이 깨지지 않으니 생성한 데이터베이스를 마우스 오른쪽 버튼으로 선택 하시고 편집 누르시면 됩니다.
편집을 누르게 되면 데이터베이스의 인코딩 형식을 변경하실 수 있습니다. 조합 메뉴에서 utf8_general_ci를 찾아서 선택하시고 확인 버튼을 누르시면 됩니다.
데이터베이스 생성 후 인코딩까지 맞춰 주었다면 이제 테이블을 만들어 주시면 됩니다. 쿼리문 작성 후 F9나 실행 버튼을 눌러 주시면 됩니다.
USE wellcome; /* 생성한 데이타베이스 선택 */
/* 멤버 테이블 생성 */
CREATE TABLE member(
NAME VARCHAR(20),
ID VARCHAR(20) PRIMARY KEY,
ADDRESS VARCHAR(50),
TEL VARCHAR(40)
);
생성한 테이블에 데이터를 넣어주시면 됩니다. 아래 쿼리문을 복사해서 실행하시면 됩니다.
/* 생성한 테이블에 데이터 넣기 */
INSERT INTO member(NAME, ID, ADDRESS, TEL) VALUES('홍길동','kildong','서울','없음');
INSERT INTO member(NAME, ID, ADDRESS, TEL) VALUES('아이유','iu','서울','010-1234-5678');
INSERT INTO member(NAME, ID, ADDRESS, TEL) VALUES('아무개','amuge','부산','010-1111-2222');
입력한 데이터를 확인해 보시려면 SELECT * FROM member; 쿼리문을 실행해 아래 실행 결과에서 데이터를 확인하시면 됩니다.
SELECT * FROM member;
HeidiSQL 데이터베이스 사용자 계정 추가
데이터베이스 사용자 계정을 heidiSQL 프로그램에서 추가하려면 사람 모양의 아이콘을 선택하시면 됩니다.
왼쪽 상단에 추가 메뉴 선택을 하시면 자격 증명 입력이 가능합니다. 사용자 이름은 iu로 지정하였으며 호스트는 윈도우 환경에서 cmd를 열어 윈도우 환경의 아이피를 확인하시면 됩니다.
그리고 암호를 넣고 암호 재입력까지 모두 입력하시고 객체 추가 버튼을 눌러 방금 생성한 데이터베이스를 선택하시고 확인을 누르시면 됩니다.
저는 집에서 공유기를 사용해 IPv4 주소가 192.168.0.15를 입력하니 SQL 오류 (1045): Access denied for user 'root'@'%' (using password: YES) 오류가 나더군요 위처럼 192.168.% 호스트에서 입력하니 정상 접속 되었습니다.
윈도우키 + R을 누르시고 cmd 입력 후 엔터를 누르시면 아래 이미지와 같이 커맨드창이 표시되며 ipconfig 명령어를 통해 사용하는 IP 확인이 가능하니 참고하시고 호스트에서 정보를 입력하시면 됩니다.
데이터베이스에 접속할 사용자 계정을 생성했으니 접속을 끊고 방금 생성한 아이디로 데이터베이스 접속이 되는지 확인하려고 합니다. 데이터베이스 연결해제 선택.
첫 화면으로 돌아오게 되면 자격 증명 프롬프트에 체크가 되어 있으면 됩니다. 이제 방금 생성한 iu라는 계정으로 로그인 시도.
iu 계정으로 접속 후 member 테이블에만 접근이 가능한 것을 확인했습니다.
서버에서 직접 MariaDB 사용자 계정 추가 후 권한 설정하기
UI 환경에서 데이터베이스 사용자 계정 추가까지 진행해 보았는데 마지막으로 리눅스 서버에서 직접 명령어를 통해 계정을 생성해 보려고 합니다.
MariaDB 접속 후 명령어를 사용해 iu와 같은 권한의 계정을 iuiu라는 아이디로 새로 생성하였습니다.
mysql -u root -p #비번입력 후 mariadb 접속
use mysql
grant all privileges on wellcome.member to 'iuiu'@'192.168.%' identified by '12345';
flush privileges;
계정 생성 후 heidiSQL 프로그램에 접속해서 확인해 보니 UI 모드에서 생성한 계정과 동일한 권한의 계정이 생성되었고 외부 접속도 잘됩니다. 서버에서 생성한 계정을 HeidiSQL 프로그램에서 확인한 이미지 입니다.
개인적으로 필요하다는 생각에 리눅스 서버에 MariaDB를 설치하고 외부 접속 및 계정 추가 권한 설정까지 정리해 보았습니다. 필요하신 분들에게 도움이 되었으면 좋겠습니다.
이전에 VMware 프로그램을 사용해 하드 디스크를 추가한 후 LVM 장치를 새롭게 추가해 사용하는 방법에 대해 정리한 내용이 있습니다. - https://zzarungna.com/1548 이번엔 새롭게 하드 디스크를 추가해 기존 LVM 장치에 용량을 확장하는 방법에 대해서 정리해 보았으며 확장까지 모두 진행한 후 완료했다면 삭제하는 방법까지 정리해 보려고 합니다.
먼저 VMware 프로그램에서 새롭게 하드 디스크를 하나 추가하시면 됩니다. Edit virtual machine settings 메뉴를 눌러 주시면 됩니다.(VMware 버전에 따라 차이가 있을 수 있습니다. 단축키는 Ctrl+D 메뉴는 VM → Settings)
기존에 사용하고 있는 LVM 하드 디스크 장치를 확장할 목적으로 새롭게 하드 디스크 하나를 추가하시면 됩니다. Add → Hard Disk → Next
이미지를 참고하셔서 하드 디스크 장치를 하나 추가하시면 됩니다. SCSI → Create a new virtual disk → 10GB, Store virtual disk as a singlefile → Finish
하드 디스크 장치를 추가한 후 리눅스 부팅 후 fdisk -l 명령어로 새롭게 추가한 디스크 정보를 확인할 수 있습니다.
fdisk -l
Disk /dev/sdd: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb260f7cc
Device Boot Start End Blocks Id System
기존 LVM 장치는 home과 마운트 되어 있으며 디스크 용량을 확장한 후 삭제까지 진행할 예정이기 때문에 데이터 복원을 위해 /home 폴더에 있는 데이터를 백업하고 진행하였습니다.
[root@localhost ~]# mkdir /home_backup #임시 백업 폴더 하나 생성
[root@localhost /]# cp -rp /home/* /home_backup #기존 데이타 백업
새롭게 추가한 하드 디스크를 용량 확장용으로 사용하기 위해서 먼저 파티션 설정이 필요합니다.
fdisk /dev/sdd
n
엔터
엔터
엔터
엔터
엔터
t
8e
w
[root@localhost ~]# fdisk /dev/sdd
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-20971519, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
파티션 설정 이후 physical volume을 생성한 후 기존에 bc 이름으로 볼륨 그룹을 만들었기에 볼륨 확장시 bc라는 이름으로 볼륨 확장을 진행하였습니다.
[root@localhost /]# pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created.
[root@localhost /]# vgextend bc /dev/sdd1
Volume group "bc" successfully extended
Physical volume, Volume group 확장까지 완료한 이후 vgdisplay 확인해 보니 VG Size가 총 20GB로 총하드 디스크 3개 5Gb, 5Gb, 10Gb(확장)를 사용한 모든 용량이 인식된 것을 확인할 수 있습니다.
[root@localhost /]# vgdisplay
--- Volume group ---
VG Name bc
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size <19.99 GiB
PE Size 4.00 MiB
Total PE 5117
Alloc PE / Size 2558 / 9.99 GiB
Free PE / Size 2559 / <10.00 GiB
VG UUID kyooUo-kENz-Clll-Ji8T-HqHD-uKaA-FvGJ8o
이제 확장한 데이터를 100% 사용하기 위해 lvextend 명령어를 사용해 Logical volume 크기를 새롭게 조정하였습니다.
[root@localhost /]# lvextend -l +100%FREE /dev/bc/lv_data
Size of logical volume bc/lv_data changed from 9.99 GiB (2558 extents) to <19.99 GiB (5117 extents).
Logical volume bc/lv_data successfully resized.
#lvextend -l +100%FREE -r /dev/bc/lv_data 이명령어를 사용하면 한번에 파일 시스템도 확장된다 공부하는 것이니 지금은 하나씩 확장
다시 vgdisplay 명령어를 사용해 확인해보니 Free Pe / Size가 모두 사용된 것을 확인할 수 있었습니다.
[root@localhost /]# vgdisplay
--- Volume group ---
VG Name bc
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size <19.99 GiB
PE Size 4.00 MiB
Total PE 5117
Alloc PE / Size 5117 / <19.99 GiB
Free PE / Size 0 / 0
VG UUID kyooUo-kENz-Clll-Ji8T-HqHD-uKaA-FvGJ8o
작업이 다 끝난 것으로 생각되어 df -h /home 명령어를 통해 기존에 사용하고 있었던 LVM에 마운트한 home 사용 중인 용량을 확인해 보니 아직 10GB로 적용이 안 되어 있습니다.
[root@localhost /]# df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/bc-lv_data 9.8G 37M 9.2G 1% /home
새롭게 확장한 데이터의 파일 시스템 크기 조정해 주어야 확장한 데이터를 사용할 수 있습니다. 파일 시스템 타입에 따라 명령어 차이가 있으니 주석에 있는 내용을 참고하시면 좋을 것 같습니다.
[root@localhost /]# resize2fs /dev/bc/lv_data # 파일 시스템 타입이 xfs라면 resize2fs대신 xfs_growfs 사용
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/bc/lv_data is mounted on /home; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/bc/lv_data is now 5239808 blocks long.
모든 작업이 완료된 것 같아 다시 df -h /home 명령어를 통해 확인해보니 새롭게 확장했던 용량까지 모두 Size에 적용된 것을 확인할 수 있습니다.
[root@localhost /]# df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/bc-lv_data 20G 45M 19G 1% /home
[root@localhost /]#
LVM 장치를 삭제하는 방법
기존 리눅스(CentOs7) 운영체제에 하드 디스크 2개를 추가하여 사용하다 1개의 하드 디스크를 더 추가해 확장까지 이용해 총 3개의 하드 디스크를 정상적으로 모두 적용된 것을 확인하였습니다.
연습용으로 진행한 것이기에 삭제하는 내용도 정리해 놓으면 좋을 것 같아 기존에 추가했던 3개의 모든 하드 디스크 LVM 장치를 삭제하려고 합니다.
아래 내용 순서대로 진행을 하시면 됩니다.
[root@localhost /]# umount /home ###기존에 연결된 마운트를 해제
[root@localhost /]# lvscan ###현재 활성화 되어 있는 장치 및 경로 확인을 위해서 '/dev/bc/lv_data 경로 확인.
ACTIVE '/dev/bc/lv_data' [<19.99 GiB] inherit
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
ACTIVE '/dev/centos/root' [<17.00 GiB] inherit
[root@localhost /]# lvremove /dev/bc/lv_data ###해당 경로에 추가했던 lvm 장치를 제거
Do you really want to remove active logical volume bc/lv_data? [y/n]: y ### y를 눌러 진행
Logical volume "lv_data" successfully removed
[root@localhost /]# vgs ###삭제가 모두 완료된 후 vgs 명령어를 통해 생성한 그룹 이름이 있는지 확인 저는 bc로 생성
VG #PV #LV #SN Attr VSize VFree
bc 3 0 0 wz--n- <19.99g <19.99g
centos 1 2 0 wz--n- <19.00g 0
[root@localhost /]# vgremove bc ### 생성했던 Volume Group bc 삭제
Volume group "bc" successfully removed
[root@localhost /]# pvs ### pvs 명령어를 통해 장치 세부 경로 확인
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 --- <5.00g <5.00g
/dev/sdc1 lvm2 --- <5.00g <5.00g
/dev/sdd1 lvm2 --- <10.00g <10.00g
[root@localhost /]# pvremove /dev/sdb1 /dev/sdc1 /dev/sdd1 ###한번에 삭제 가능
Labels on physical volume "/dev/sdb1" successfully wiped.
Labels on physical volume "/dev/sdc1" successfully wiped.
Labels on physical volume "/dev/sdd1" successfully wiped.
[root@localhost /]# vgdisplay ### 작업 완료 후 vgdisplay를 확인해 보니 추가했던 새로운 장치는 삭제 되었음.
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <19.00 GiB
PE Size 4.00 MiB
Total PE 4863
Alloc PE / Size 4863 / <19.00 GiB
Free PE / Size 0 / 0
VG UUID w9swur-lqPb-dYp9-ko7w-WYBS-uMpo-WFZpAb
삭제 완료 후 df -h /home 명령어를 통해 확인해보니 파일 시스템 경로가 root로 다시 변경되어 있는 것을 확인하였습니다.
[root@localhost /]# df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 1.3G 16G 8% /
LVM 장치를 추가하여 영구적으로 적용하기 위해 fstab 파일을 수정하셨다면 관련 내용을 삭제해 주셔야 합니다. 저는 주석처리 하는 것으로 삭제를 대신 하였습니다.
[root@localhost /]# vi /etc/fstab
위와 같이 삭제를 진행하게 되면 기존에 있던 home 계정 데이터는 모두 삭제되게 됩니다. 삭제를 진행하기 전 저는 home_backup 폴더에 데이터를 백업해 놓은 게 있습니다. cp -rp 명령어를 사용해 백업한 데이터를 다시 /home 폴더에 저장하였습니다.
[root@localhost /]# cp -rp /home_backup/* /home
다시 리눅스 전원을 끄고 켜보니 이전에 추가 했던 계정으로 문제없이 전환되는 것을 확인 했습니다.
[root@localhost /]# su korea
[korea@localhost /]$ good~
Logical Volume Manager를 이용해 새롭게 사용하고 확장하기 위해 사용했던 하드 디스크 장치를 확장하는 방법과 다시 삭제하는 방법까지 정리해 봤습니다. 이후에 필요한 내용이라 생각되어 개인적으로 참고할 목적으로 정리해 보았으며 필요하신 분들이 있다면 참고하시면 좋을 것 같습니다.
리눅스 운영체제에 VMware 가상 머신을 이용해 추가한 하드 디스크 장치 두 개를 합쳐 하나로 인식해 원하는 폴더에서 사용 할 수 있는 내용에 대해 간단히 정리해 보려고 합니다.
먼저 VMware 프로그램을 이용해 하드디스크를 추가하시려면 Edit virtual machine settings 메뉴를 선택하시면 됩니다.
Add 버튼을 누르시고 Hard Disk 선택 후 Next 선택. 이후 과정은 이미지를 참고하시면 좋을 것 같습니다. 하드 디스크를 2개 추가하는 방식이기에 같은 방식으로 하드 디스크 하나를 추가로 더 추가하시면 됩니다. 연습으로 진행하는 것이기에 5GB 하드 디스크 2개를 추가 하였습니다.
위와 같이 하드디스크 장치를 두 개 추가한 뒤 root 로그인하신 후에 fdisk -l 명령어를 통해 추가한 장치를 확인하실 수 있습니다.
fdisk -l
sdb, sdc 장치가 추가되었으며 각각 5GB로 잡혀 있습니다.
추가한 하드 디스크 장치 두 개를 사용하기 위해서는 파티션을 생성 후 타입을 lvm 형식으로 지정해야 합니다.
fdisk /dev/sdb, n, 엔터, 엔터, 엔터, 엔터, 엔터, t, 8e, w 커멘드를 차례대로 입력 하시고 같은 방법으로 fdisk /dev/sdc, n, 엔터, 엔터, 엔터, 엔터, 엔터, t, 8e, w 지정하시면 됩니다.
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xb260f7cc.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-20971519, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb260f7cc
Device Boot Start End Blocks Id System
/dev/sdd1 2048 20971519 10484736 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
pvdisplay 명령어를 통해 추가한 하드 디스크 장치 두 개가 정상적으로 파티션 설정이 되었는지 확인하시면 됩니다.
pvdisplay
그리고 두 개의 장치를 하나로 인식 하기 위해 Volume Group을 생성하시면 됩니다. 저는 bc라는 이름을 사용해 볼륨 그룹을 생성하였습니다.
vgcreate bc /dev/sdb1 /dev/sdc1
그룹을 생성한 뒤 vgdisplay 명령어를 통해 그룹이 생성되었는지 확인합니다. VG name이 bc로 되어 있고 VG-Size가 5GB 하드 디스크 두 개가 하나로 합쳐 9.99GB로 표시되는 것을 확인할 수 있습니다.
추가한 Volume Group 이름으로 Logical Volume 용량을 모두 사용해 생성하였습니다.
lvcreate -l 100%FREE -n lv_data bc
Logical Volume 생성 후 데이터를 저장하고 사용하기 위해서 파일 시스템 생성까지 진행해 주시면 됩니다.
mkfs.ext4 /dev/bc/lv_data
이제 마운트 과정을 거치게 되면 새롭게 추가한 하드 디스크 장치 두 개를 원하는 폴더에서 추가한 장치의 용량을 사용할 수 있게 되었습니다. mkdir 명령어를 사용해 lv_data 폴더를 새롭게 만들어 추가한 장치를 마운트 하였습니다.
mkdir lv_data
mount /dev/bc/lv_data /lv_data
위 과정까지 무사히 끝내셨다면 새롭게 추가한 하드 디스크 두 개를 원하는 폴더에서 사용할 수 있게 되었습니다. 임의로 폴더를 만들었기에 데이터를 임의로 저장하지 않는 한 자동으로 쌓이는 데이터는 없습니다.
그러니 리눅스 운영체제에서 자주 사용하고 데이터 용량이 필요한 폴더에 다시 마운트를 진행하면 좋을 것 같습니다.
사용자 계정이 저장되는 home 폴더에 추가한 장치를 백업하고 마운트 하여 시스템 재시작 이후에도 설정이 유지된 상태로 정상적으로 로그인되는지 테스트해 보려고 합니다. home 폴더에 어떤 데이터가 있는지 확인해 봤습니다.
ll home
먼저 home 폴더에 있는 모든 데이터를 lv_data 폴더로 모두 복사하여 붙여넣어 백업을 진행했습니다.
cp -rp /home/* /lv_data
파일이 정상적으로 복사되었는지 확인해 보니 잘 백업이 되었습니다.
ll /lv_data
home에 있는 계정 데이터를 모두 옮겼으니 기존에 home 폴더에 있는 데이터는 모두 삭제하였습니다. 데이터를 모두 삭제한 후 su k1 명령어를 사용해 계정을 전환하려고 하니 정상적으로 로그인이 안 되는 과정까지 확인하였습니다.
기존에 home 폴더에 있는 마운트를 해제하고 새롭게 추가했었던 lv_data 폴더 마운트도 해제하였습니다. 마지막으로 LVM으로 추가했던 장치를 home 폴더에 mount를 진행하였습니다.
rm -rf /home/* #home 폴더에 있는 모든 데이터를 삭제
su k1 #기존에 사용하던 k1 계정으로 전환해 봄
umount /home #기존 home 폴더에 마운트 해제
umount /lv_data #새롭게 마운트 했었던 lv_data도 마운트 해제
mount /dev/bc/lv_data /home #새롭게 추가한 장치를 home 폴더에 마운트
위 과정까지 모두 끝나게 되면 기존에 사용하고 있었던 home 폴더의 데이터를 모두 이동하여 새롭게 추가한 LVM 장치에 저장되도록 설정을 마쳤습니다.
이제 마지막 과정으로 서버 전원이 꺼지고 다시 켜지는 상황에서도 마운트를 유지하기 위해 /etc/fstab 파일을 수정해야 합니다.
vi /etc/fstab
vi 내용 중 아래 내용을 추가해 주면 됩니다.
/dev/bc/lv_data /home ext4 defaults 1 2
마지막으로 리눅스 운영체제의 전원을 껐다가 켠 뒤에 su k1 명령어를 사용해 계정을 전환해 보니 문제없이 계정 사용 가능한 것을 확인했습니다.
df -h /home 명령어를 통해 파일 시스템과 용량을 통해 잘 적용되었는지도 확인해 보시면 좋을 것 같습니다.
df -h /home
윈도우에서는 하드디스크 장치를 연결만 하면 자동으로 인식해 사용할 수 있지만 리눅스 운영체제에서는 설정해야 하는 과정이 좀 더 복잡하게 필요해 보입니다. 개인적으로 이후에도 필요한 내용이라 생각되어 정리하였으며 필요하신 분들이 있다면 참고하시면 좋을 것 같습니다.
VMware Workstation Pro 프로그램을 사용해 Cent OS 7 버전의 운영체제를 설치하는 방법을 나름대로 정리해 보려고 합니다. 먼저 VMware 가상 머신에 CentOs 7 버전을 설치하기 위해서는 CentOS 7 버전의 ISO 파일이 필요합니다.
개인적으로 유료 버전인 VMware Workstation Pro를 사용했으며 VMware Workstation Player와 설치방법이 크게 차이 나는 것은 아니니 VMware Workstation Player를 사용하시는 분들도 참고하시면 도움이 되실 겁니다.
ISO 파일을 다운로드하기 위해 https://www.centos.org/ 사이트에 접속하시고 Download 메뉴를 선택하시면 됩니다. 사이트 구조는 시간이 지남에 따라 변경될 수 있으니 참고하시면 좋을 것 같습니다.
탭 메뉴에서7(2009) 선택 하시고 x86_64 메뉴 선택.
전 미러링 사이트 목록 중 NAVER를 선택했습니다.
파일 목록 중 CentOS7 버전의 iso 링크를 선택하시면 됩니다. 그럼 ISO 파일이 다운로드 되게 되는데 정상적으로 다운되지 않거나 다운로드 파일 경로를 못 찾으셨다면 http://mirror.navercorp.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 주소를 인터넷 주소에 붙여 넣고 엔터를 누르시면 CentOS 7 ISO 파일을 바로 다운로드하실 수 있으니 참고하시면 좋을 것 같습니다.
CentOS 7 버전의 ISO 파일이 다운로드 완료되게 되면 아래 이미지와 같이 윈도우 환경에서 확인 가능합니다.
CentOS ISO 파일을 준비하셨다면 VMware 프로그램을 설치하시면 됩니다. https://www.vmware.com/ 사이트에 접속하시고 Workspace 메뉴에 WorkStation Pro를 선택하시면 됩니다. 참고로 WorkStation Pro는 유료입니다만 체험판 기간을 기본적으로 제공하니 참고하시기 바랍니다.
페이지 중간에 Workstation 16 Pro 사용해 보기 선택.
웹 페이지 중간쯤 Workstation 16 Pro for Windows 버튼을 누르시면 다운로드가 시작됩니다. 웹페이지에서 VMware Workstation 16 Pro 설치 파일을 못 찾으셨거나 정상적으로 다운로드 되지 않으신 분은 아래 URL을 통해 설치 파일을 다운로드하실 수 있으니 참고하시면 좋을 듯합니다. - https://www.vmware.com/go/getworkstation-win
다운로드한 VMWare 프로그램 설치를 진행해 주시면 됩니다.
설치 과정은 기본 설정된 상태로 변경하지 않고 Next 버튼을 눌러 진행하였습니다.
Finish를 눌러 설치 완료 후 License를 인증해도 되지만 저는 설치 과정 마지막에 License를 입력 후 사용하였습니다.
VMware workstation 메인 화면에서 Create a New Virtual Machine 선택.
Typical 선택 Next
I will install the operating system later. 선택 후 Next.
Linux 선택 후 Version CentOS 7 64-bit 선택 후 Next
이름은 아무거나 원하는 이름으로 지정 하시고 기본 경로 그대로 사용 후 Next.
연습용으로 하는 것이기에 디스크 용량은 20.0 GB를 선택하였으며 Store virtual disk as a single file 선택 후 Next.
새로운 가상 머신 추가를 완료하기전 Customize Hardware..를 선택해 추가 설정을 진행 하실 수 있습니다.
Finish 버튼을 누르셨다면 가상머신 추가 이후에도 Edit virtual machine settings 버튼을 선택해 진행하셔도 됩니다.
어쨌든 위 과정을 통해 설정 창이 나오게 되며 먼저 Memory 2GB 변경후 OK.
Processors는 2개로 변경 후 OK
CD/DVD (IDE) 선택 Use ISO image file 체크 후 Browse.. 버튼을 선택하시면 됩니다.
다운로드했던 CentOS 7 iso 파일을 선택하시고 열기. 후 OK.
USB Controller USB_compatibility USB 3.1로 변경 OK.
가상 머신 추가 과정에서 설정을 진행하셨다면 Finish를 누르시면 되고 가상머신 추가 이후에 설정을 하셨다면 OK 버튼을 누르게 되면 추가 설정은 모두 완료됩니다.
개인적으로 VMware 프로그램 화면을 빠져나가는 단축키가 불편해 설정을 변경하고 진행합니다. Edit → Preferences 메뉴를 선택하시면 됩니다.
개인적으로 Hot Keys 메뉴에서 저는 Win 버튼만 활성화하고 OK를 선택하였습니다. VMware 프로그램을 빠져나가기 위해서 키보드에서 윈도우키만 누르면 되니 외우지 않아도 되니 사용하기 편합니다.
추가한 가상머신은 왼쪽 메뉴에 표시됩니다. 추가한 가상머신을 선택하시고 ▶ 버튼이나 ▶ Power on this virtual machine을 선택해 주시면 됩니다.
가상머신 전원이 켜지며 CentOS를 설치하기 위한 화면이 표시됩니다. 키보드 방향 키를 이용해 Install CentOS 7 선택 후 엔터.
설치 과정 진행이 됩니다. 한국어 선택 후 계속 진행.
설치 요약 중 시스템만 설정하면 됩니다. 설치 대상 선택.
로컬 표준 디스크에 장치를 선택하시고 완료 버튼 누르시면 됩니다.
설치 시작.
설치 과정이 진행되며 ROOT 암호 선택을 누르셔서 최초 상위 계정인 root 계정의 비밀번호를 넣어 주시면 됩니다.
Root 암호를 모두 입력 후 완료 버튼을 누르시고 버튼 선택 이후 반응이 없다면 완료 버튼을 다시 한번 누르시면 됩니다.
사용자 생성은 설치 이후에 쉽게 추가 가능하니 ROOT 암호만 설정하면 됩니다. 설치가 모두 끝나게 되면 아래 이미지와 같이 재부팅 선택.
재부팅을 하게 되면 아래 이미지와 같이 표시 되게 됩니다. 첫 번째 메뉴에 선택이 되어 있는지 확인하시고 조금 기다리시면 됩니다.
자동으로 나머지 설치 과정이 진행되며 나머지 설치가 모두 완료되면 아래 이미지와 같이 login 화면이 나오게 됩니다. 설치 시 설정했던 Root 암호를 입력 하시면 됩니다.
root
설치시 정했던 비밀번호
최초 설치 후 인터넷이 되는지 확인해 보았는데 인터넷이 안됩니다. 명령어 nmtui를 통해 네트워크를 설정해 주시면 됩니다.
nmtui
Edit a connection 선택.
Edit 선택.
Automatically connect 메뉴에서 스페이스바를 누르시면 X가 활성화됩니다. 자동 연결을 활성화하시고 OK 선택.
설정을 완료 했으니 Back 선택.
Quit을 선택해 빠져 나오시면 됩니다.
다시 한번 ping google.com을 통해 테스트해보니 정상적으로 네트워크가 작동하는 것을 확인할 수 있었습니다.
VMware Workstation Pro를 이용해 Cent Os 7 버전을 설치하는 과정에 대해 나름대로 상세하게 정리해 봤습니다. 개인적으로 다시 참고할 목적과 처음 설치를 진행 하시는 분들이 좀더 쉽게 설치할 수 있기를 바라는 마음으로 정리해 보았습니다. 필요하신 분들은 참고 하세요.
이곳에서 CentOS-7-x86_64-DVD-2009.iso 링크를 선택하시면 다운로드가 시작됩니다. 정상적으로 다운로드 되지 않거나 다운로드 경로를 못찾으셨다면 http://mirror.navercorp.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 이경로를 인터넷 주소창에 붙여 넣어 엔터를 누르시면 사이트에 하나씩 접근하지 않아도 ISO 파일이 다운로드 되니 참고 하시면 좋을 것 같습니다.
CentOS ISO 파일 다운로드가 완료되면 아래 이미지와 같이 표시됩니다.
CentOS 7 운영체제 파일을 다운로드받았으니 이제 가상머신 프로그램을 설치해 주시면 됩니다. VirtualBox를 설치하려면 https://www.virtualbox.org/ 사이트 접속 후 Download VirtualBox 6.1 버튼을 선택해 주시면 됩니다. 마찬가지로 시간이 지나 사이트 화면이 바뀔 가능성이 있습니다.
이곳에서 운영체제에 맞는 메뉴를 선택하시면 됩니다. 저는 현재 사용하는 운영체제가 윈도우10이기 때문에 Windows hosts를 선택했습니다.
그럼 다운로드가 시작되며 기본 구성된 상태에서 next, install, yes 버튼으로 쭉 진행하시면 됩니다.
기본 설정된 상태로 next 버튼을 눌렀으며 Finish 버튼을 누르시면 VirtualBox 프로그램이 실행됩니다.
VirtualBox 프로그램을 실행 후 머신 메뉴 새로 만들기 메뉴를 선택 하시면 됩니다.
새로운 가상 머신 이름은 CentOS7 지정하였으며 종류는 Linux, 버전은 RedHot(64-bit)를 선택 후 다음 버튼을 선택 하시면 됩니다.
메모리크기는 2048MB 지정후 다음.
하드 디스크는 지금 새 가상 하드 디스크 만들기 선택 후 만들기 버튼 선택.
하드 디스크 파일 종류는 VirtualBox 디스크 이미지 선택 후 다음 버튼 선택.
물리적 하드 드라이브에 저장은 동적 할당 선택 후 다음.
파일 위치 및 크기는 기본 폴더를 그대로 사용하였으며 30.0GB 지정 후 만들기 선택.
새로운 장치 추가가 끝나게 되면 왼쪽 화면에 새로운 가상 장치가 표시되며 해당 가상 장치 선택 후 설정 메뉴 선택.
설정 시스템 메뉴 선택 후 부팅 순서 플로피 제외, 포인팅 장치를 USB 태블릿 변경.
저장소 메뉴 선택. 광학 드라이브 추가 선택.
추가 선택.
인터넷에서 받았던 CentOS-7-x86_64-DVD-2009.iso 파일 선택 후 열기.
CentOS7 ISO 파일 선택.
네트워크 메뉴 선택 후 어댑터1 호스트 전용 어댑터로 변경
네트워크 어댑터2 메뉴 선택 후 NAT 선택 후 확인 버튼.
VirtualBox 프로그램에 CentOS7 버전 설치를 위해 필요한 설정은 완료했습니다. VirtualBox 프로그램에 오른쪽 Shift 키가 호스트키 조합으로 되어 있어 대문자나 특수문자를 사용할 때 불편했습니다. 그래서 저는 파일 환경설정 메뉴를 통해 기본 설정된 호스트키 설정을 변경하였습니다.
파일 → 환경설정 → 입력 → 가상 머신 메뉴 탭 선택 후 호스트키 조합을 Right Shift에서 Left Windows키로 변경했습니다. 윈도우키는 윈도우10 환경에서 자주 사용하던 키라 개인적으로 더 편한 것 같습니다.
이제 설정이 끝났으니 왼쪽에 새로 추가한 가상장치를 선택하시고 시작 버튼을 누르시면 됩니다.
아래 이미지와 같이 화면이 나오신다면 시동 디스크 선택 메뉴 선택.
CentOS-7-x86_64-DVD-2009.iso를 선택하시고 시작 버튼 선택.
가상 머신에서 방향키를 이용해 Install CentOS 7 선택 후 엔터.
ko 한국어 선택 후 계속 진행
설치 요약 메뉴 중 시스템 설치 대상 선택.
로컬 표준 디스크 하드 디스크 선택 후 완료 버튼.
설치 시작 버튼 선택.
설치 과정 중 ROOT 암호 선택.
ROOT 암호 및 확인에 모두 입력 후 완료 버튼을 누르고 반응이 없다면 다시 완료 버튼을 누르시면 됩니다.
모든 설치가 완료되면 오른쪽 하단에 재부팅 메뉴가 나옵니다. 재부팅 선택.
설치 완료 후 재부팅이 되며 아래 이미지와 같이 방향키를 이용해 첫번째 커서에 위치하도록 놓고 조금 기다리시면 자동으로 나머지 설치 과정이 진행되며 로그인 화면이 나오게 됩니다.
부팅이 완료되게 되면 아래 이미지와 같이 로그인을 해야 합니다. 설치 시 입력했던 root 계정의 비밀번호를 넣어 주시면 됩니다. root는 계정이 변경되지 않으니 그대로 root 입력 후 설치 과정에서 입력했던 root 계정 비밀번호를 넣어 주시면 아래 이미지와 같이 로그인이 완료됩니다.
root 계정의 로그인이 완료 되었다면 nmtui 명령어를 통해 네트워크 설정을 추가로 해주셔야 합니다.
nmtui
위 명령어를 실행하면 아래 이미지와 같이 네트워크 매니저 화면이 표시되며 이곳에서 Edit a connection 메뉴 선택.
VirtualBox 네트워크 설정에서 설정했었던 네트워크가 2 가지 표시 됩니다. 먼저 첫번째 네트워크 선택 후 엔터. edit 선택 엔터.
키보드 방향키를 이용해 automatically connect 메뉴에서 스페이스바를 누르시면 X 표시가 활성화됩니다. 자동 연결을 활성화하셨으니 OK 버튼 선택하시면 됩니다.
첫 번째 네트워크의 자동 연결을 활성화 했으니 두 번째 네트워크도 자동 연결을 활성화하시면 됩니다. 두 번째 네트워크 선택 후 Edit 선택.
첫 번째 네트워크를 지정한 방법 처럼 두 번째 네트워크도 자동 연결 X 버튼을 활성화하시고 OK 메뉴로 이동해 엔터 누르시면 됩니다.
첫 번째 두 번째 네트워크를 모두 활성화했으니 Back 버튼 선택.
두 개의 네트워크를 모두 설정했으니 Quit으로 네트워크 매니저를 나가시면 됩니다.
네트워크 설정 후 인터넷이 잘 되는지 확인하기 위해 ping google.com 명령어를 실행해 확인하시면 됩니다. 아래 이미지와 같이 표시되면 정상적으로 인터넷 사용이 가능한 것이니 앞으로 필요한 패키지나 파일들을 명령어를 통해 설치할 수 있습니다.
ping google.com
개인적으로 리눅스를 많이 다루어 보지 않아 리눅스에 익숙해 지기 위해 연습용으로 설치해 공부하고 있습니다. 기본 설정된 상태로 진행하게 되면 설치 과정은 어렵지 않지만 시간이 지나 설치 과정에 필요한 내용을 잊어버릴 수 있을 것 같다는 생각에 개인적으로 활용할 목적과 공유할 목적으로 나름 세세히 작성해 보았습니다. 필요하신 분들께서는 참고하시면 좋을 것 같습니다.
PHP 로그인 샘플 소스(HTTP 인증 로그인, Cookie 로그인, Session 로그인)
PHP 웹 프로그래밍 언어를 사용해 HTTP 인증, Cookie, Session, Session+Cookie를 사용해 로그인 샘플 소스 코드를 정리해 보았습니다.
PHP HTTP 인증 로그인
장점 : 복잡한 과정을 거치지 않고 간단히 구현 가능
단점 : 로그아웃 기능이 없어 브라우저를 종료해야 로그아웃이 진행됨
요약 : 내부 인트라넷 용도나 간단히 구현하기 위해 인증 과정이 필요한 경우 사용하면 좋을 듯.
소스 server.php
$_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] 전역 변수 코드를 이용해 사용자가 입력한 데이터를 가져와 header 전송을 사용해 인증 로그인 팝업을 띄우는 코드입니다.
<?php
header('Content-Type: text/html; charset=UTF-8');
$username = 'zzarungna';
$password = '1234abcd';
/**
* 브라우저를 모두 종료하기 전까지 로그인이 유지된다.
* $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] 전역변수를 이용해 헤더 인증정보 데이터를 가져온다.
*/
if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
$_SERVER['PHP_AUTH_USER'] != $username || $_SERVER['PHP_AUTH_PW'] != $password ){
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate:Basic realm="zzarungna_login"');
exit('죄송합니다. 로그인 이후 페이지 사용이 가능 합니다. 아이디와 비밀번호를 확인해 주세요.');
}else{
echo('로그인 성공!');
}
?>
결과 화면 server.php
로그인이 되어 있지 않은 상태라면 HTTP 인증 팝업 노출.
소스 etc_page.php
다른 페이지에서 HTTP 인증 여부를 확인하려면 server.php 소스를 거쳐 로그인 여부를 확인해 처리.
<?php
header('Content-Type: text/html; charset=UTF-8');
require_once 'server.php';//다른 페이지에서 헤더 인증정보를 통해 로그인 사용자만 사용 가능하게 하고 싶다면 페이지를 인증정보 페이지를 항상 참조해야 한다.
?>
<h1><?php echo($_SERVER['PHP_AUTH_USER']); ?>님 방갑습니다. 저희 홈페이지를 이용해 주셔서 감사합니다.</h1>
결과 화면 etc_page.php
HTTP 인증이 통과되었다면 페이지 내용 출력
PHP Cookie 로그인
장점 : 로그아웃 구현 가능
단점 : 쿠키 만기 시점을 지정하지 않는 경우 브라우저 종료 시 로그아웃, 저장데이터 용량 한계, 쿠키를 지원하지 않는 브라우저가 있는 경우 사용 불가, 쿠키 삭제를 하지 않는 경우 사용자 PC에 데이터가 저장되어 보안상 좋지 않다.
요약 : 쿠키는 보조수단으로 세션과 함께 사용하면 좋음.
기존에 로그인 HTML 페이지를 하나의 페이지에서 구현하려고 했으나 쿠키가 생성되는 시간에 쿠키 생성 체크가 안 되는 현상이 있어 페이지를 3개로 나누어 작성
소스 cookie_login.php
form 전송여부 체크 후 아이디와 비밀번호가 맞는 경우 setcookie('id', $_POST['id]); 코드를 사용해 쿠키 생성.
요약 : 세션을 생성해도 서버 부하가 생길 만큼 파일 용량이 크지 않음으로 로그인은 세션을 사용해 구현하는 게 좋다.
소스 session_login.php PHP에서는 Session을 사용하려면 session_start(); 을 가장 먼저 작성 해주어야 한다. 소스의 흐름은 세션이 있는지 폼이 전송되었는지 아이디와 비밀번호를 입력하였는지 지정한 아이디와 패스워드와 일치하는지를 확인하는 소스 코드입니다. 쿠키와는 다르게 한 페이지에서 로그인 여부를 바로 확인할 수 있어 2페이지로 작성하였습니다.
로그아웃 버튼을 누르지 않은 상태에서 브라우저를 종료한 후 loginpage.php에 다시 접근하게 되면 기존에 클라이언트 쿠키 정보를 활용해 세션에 값을 다시 부여하여 다시 로그인 과정을 거치지 않아도 로그인 처리 가능.
주의점 : 각각의 브라우저별로 로그인 이후 로그아웃 버튼을 누르지 않고 이틀이 지나지 않은 상태에서 정상적으로 작동. 브라우저간 공유는 되지 않음.
로그인 환경을 구성할 때 HTTP, Cookie, Session을 활용하면 좋을 듯하며 HTTP, Session, Cookie를 활용해 로그인 기능뿐만 아니라 필요에 따라 자유롭게 활용하면 좋을 것 같습니다. 개인적으로 참고할 목적으로 정리하였으며 필요한 분들께 도움이 되는 정보였길 바랍니다.