웹 애플리케이션 만들기

관계형 데이터베이스 실습

실습1 

opentutorials.sql

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `topic`
-- ----------------------------
DROP TABLE IF EXISTS `topic`;
CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text NOT NULL,
  `author` int(11) NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of topic
-- ----------------------------
INSERT INTO `topic` VALUES ('1', 'About JavaScript', '<h3>Desctiption</h3>\r\n<p>JavaScript  is a dynamic computer programming language. It is most commonly used as part of web browsers, whose implementations allow client-side scripts to interact with the user, control the browser, communicate asynchronously, and alter the document content that is displayed.</p>\r\n<p>\r\nDespite some naming, syntactic, and standard library similarities, JavaScript and Java are otherwise unrelated and have very different semantics. The syntax of JavaScript is actually derived from C, while the semantics and design are influenced by the Self and Scheme programming languages.\r\n</p>\r\n<h3>See Also</h3>\r\n<ul>\r\n  <li><a href=\"http://en.wikipedia.org/wiki/Dynamic_HTML\">Dynamic HTML and Ajax (programming)</a></li>\r\n  <li><a href=\"http://en.wikipedia.org/wiki/Web_interoperability\">Web interoperability</a></li>\r\n  <li><a href=\"http://en.wikipedia.org/wiki/Web_accessibility\">Web accessibility</a></li>\r\n</ul>\r\n', '1', '2015-03-31 12:14:00');
INSERT INTO `topic` VALUES ('2', 'Variable and Constant', '<h3>Desciption</h3>\r\n\r\nIn computer programming, a variable or scalar is a storage location paired with an associated symbolic name (an identifier), which contains some known or unknown quantity or information referred to as a value. The variable name is the usual way to reference the stored value; this separation of name and content allows the name to be used independently of the exact information it represents. The identifier in computer source code can be bound to a value during run time, and the value of the variable may thus change during the course of program execution.\r\n\r\n<h3>See Also</h3>\r\n<ul>\r\n<li>Non-local variable</li>\r\n<li>Variable interpolation</li>\r\n</ul>\r\n', '3', '2015-05-14 10:04:00');
INSERT INTO `topic` VALUES ('3', 'Opeartor', '<h2>Operator</h2>\r\n<h3>Description</h3>\r\n<p>Programming languages typically support a set of operators: constructs which behave generally like functions, but which differ syntactically or semantically from usual functions</p>\r\n<p>Common simple examples include arithmetic (addition with +, comparison with >) and logical operations (such as AND or &&). </p>\r\n', '1', '2015-06-18 05:00:00');
INSERT INTO `topic` VALUES ('4', 'Conditional', '<h3>Description</h3>\r\n<p>In computer science, conditional statements, conditional expressions and conditional constructs are features of a programming language which perform different computations or actions depending on whether a programmer-specified boolean condition evaluates to true or false. Apart from the case of branch predication, this is always achieved by selectively altering the control flow based on some condition.</p>\r\n<p>In imperative programming languages, the term \"conditional statement\" is usually used, whereas in functional programming, the terms \"conditional expression\" or \"conditional construct\" are preferred, because these terms all have distinct meanings.</p>\r\n<h3>See Also</h3>\r\n<ul>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Branch_(computer_science)\" title=\"Branch (computer science)\">Branch (computer science)</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Conditional_compilation\" title=\"Conditional compilation\">Conditional compilation</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Dynamic_dispatch\" title=\"Dynamic dispatch\">Dynamic dispatch</a> for another way to make execution choices</li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/McCarthy_Formalism\" title=\"McCarthy Formalism\">McCarthy Formalism</a> for history and historical references</li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Named_condition\" title=\"Named condition\" class=\"mw-redirect\">Named condition</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Test_(Unix)\" title=\"Test (Unix)\">Test (Unix)</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Yoda_conditions\" title=\"Yoda conditions\">Yoda conditions</a></li>\r\n</ul>', '2', '2015-07-25 00:00:00');
INSERT INTO `topic` VALUES ('5', 'Function', 'A function model or functional model in systems engineering and software engineering is a structured representation of the functions (activities, actions, processes, operations) within the modeled system or subject area.', '2', '0000-00-00 00:00:00');
INSERT INTO `topic` VALUES ('6', 'Object', 'In computer science, an object is a location in memory having a value and possibly referenced by an identifier. An object can be a variable, a data structure, or a function. In the class-based object-oriented programming paradigm, \"object\" refers to a particular instance of a class where the object can be a combination of variables, functions, and data structures. In relational database management, an object can be a table or column, or an association between data and a database entity (such as relating a person\'s age to a specific person)', '3', '0000-00-00 00:00:00');

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `password` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'egoing', '111111');
INSERT INTO `user` VALUES ('2', 'jin', '222222');
INSERT INTO `user` VALUES ('3', 'k8805', '333333');
INSERT INTO `user` VALUES ('4', 'sorialgi', '444444');
INSERT INTO `user` VALUES ('5', 'lily', '555555');
INSERT INTO `user` VALUES ('6', 'happydeveloper', '666666');

실습2

index.php

<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$result = mysqli_query($conn, "SELECT * FROM topic");
?>
<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="http://localhost/style.css">
</head>
<body id="target">
	<header>
    <img src="https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/course/94.png" alt="생활코딩">
		<h1><a href="http://localhost/index.php">JavaScript</a></h1>
  </header>
	<nav>
		<ol>
    <?php
    while( $row = mysqli_fetch_assoc($result)){
      echo '<li><a href="http://localhost/index.php?id='.$row['id'].'">'.$row['title'].'</a></li>'."\n";
    }
    ?>
		</ ol>
	</nav>
  <div id="control">
    <input type="button" value="white" onclick="document.getElementById('target').className='white'"/>
    <input type="button" value="black" onclick="document.getElementById('target').className='black'" />
    <a href="http://localhost/write.php">쓰기</a>
  </div>
  <article>
  <?php
  if(empty($_GET['id']) === false ) {
      $sql = "SELECT topic.id,title,name,description FROM topic LEFT JOIN user ON topic.author = user.id WHERE topic.id=".$_GET['id'];
      $result = mysqli_query($conn, $sql);
      $row = mysqli_fetch_assoc($result);
      echo '<h2>'.$row['title'].'</h2>';
      echo '<p>'.$row['name'].'</p>';
      echo $row['description'];
  }
  ?>
  </article>
</body>
</html>

실습3

process.php

<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";
$result  = mysqli_query($conn, $sql);
if($result->num_rows == 0){
  $sql = "INSERT INTO user (name, password) VALUES('".$_POST['author']."', '111111')";
  mysqli_query($conn, $sql);
  $user_id = mysqli_insert_id($conn);
} else {
  $row = mysqli_fetch_assoc($result);
  $user_id = $row['id'];
}
$sql = "INSERT INTO topic (title,description,author,created) VALUES('".$_POST['title']."', '".$_POST['description']."', '".$user_id."', now())";
$result = mysqli_query($conn, $sql);
header('Location: http://localhost/index.php');
?>

코드의 힘을 느껴봅시다

코드는 부품을 결합하는 접착제라고 할 수 있습니다. 부품이 강력해지면 코드의 힘도 강력해집니다. 단 몇줄의 코드를 추가하는 것으로 파일업로드라는 매우 어려운 기능을 웹사이트에 추가해보겠습니다. 이를 위해서 uploadcare라는 서비스를 활용할 것인데요. 주소는 아래와 같습니다. 

http://uploadcare.grsm.io/e/1Xl

참고로 위의 주소로 서비스에 방문하면 서비스에 수익이 발생했을 때 수익금의 일부가 생활코딩에게 지급됩니다. 생활코딩은 이 수익금 전액을 비영리 단체 오픈튜터리얼스의 후원금으로 사용합니다.  

 

소스코드

github

댓글

댓글 본문
작성자
비밀번호
  1. 중간자
    var singleWidget = uploadcare.singleWidget('[role=uploadcare-uploader]');

    위의 코드가 아래와 같은 에러가 발생합니다 아시는 분 고견을 부탁합니다.

    - 아래 -

    Uncaught TypeError: uploadcare.singleWidget is not a function
    at write.php:97
  2. 중간자
    write.php에서 본문입력 시 uploadcare widget을 이용하여 본문에 upload한 파일의 url을 삽입하려고 하는데 다음과 같은 에러가 발생합니다.아시는 분 고견을 부탁합니다.
    Uncaught TypeError: uploadcare.singleWidget is not a function
    at write.php:43
    uploadcare.full.min.js:17 Camera is not allowed for HTTP. Please use HTTPS connection.
    i.warn @ uploadcare.full.min.js:17
  3. 34534534
    작은 따옴표를 큰 따옴표로 감싸주는 경우랑 그냥 작은 따옴표만으로 문자를 감싸는 경우 두 가지 경우가 이해가 안 되는데 어떻게 이해를 해야 하나요?
  4. central1
    실습 3번 영상 14분 즈음에 var_dump($row);의 결과로 null이 나오네요 ㅠㅠ 왜이런거지요
    밑에 댓글 달린 부분대로 따라 해봐도 달라지는게 없네요..ㅠㅠ
  5. egoing
    1씩 컴퓨터가 자동으로 증가시키는 값입니다.
    마지막 학생이 30번인데 전학생이 오면 31번을 부여받는 것과 같은 이치죠.
    대화보기
    • Iluminate
      해결했습니다.
      본문 : <textarea name="description" id="description"></textarea>
      본문 textarea 에 id 값을 주니 되네요!
      대화보기
      • 여기까지 따라왔는데, 정말 매번 감사합니다!

        개인적인 궁금증이 있어서요 ㅎㅎ 처음 문의드리네요.

        id 번호 같은 경우 저는 순차적으로 들어가는데
        egoing 님의 것은 6번 다음 바로 17번으로 가는데

        이 id는 컴퓨터가 임의로 생성하는 것인가요?
      • Iluminate
        저도 이미지 업로드 후 본문에 이미지 주소값이 나오지 않네요..
        <input type="hidden" role="uploadcare-uploader" />
        <input type="submit"name="name">
        </form>
        </article>
        <script>
        UPLOADCARE_PUBLIC_KEY = "deb848bcf1d9806b6362";
        </script>
        <script charset="utf-8" src="//ucarecdn.com/libs/widget/2.10.3/uploadcare.full.min.js"></script>

        <script>
        var singleWidget = uploadcare.SingleWidget('[role = uploadcare-uploader]');
        singleWidget.onUploadComplete(function(info){
        document.getElementById('description').value=document.getElementById('description').value +'<img src="'+ info.cdnUrl+'">';
        });
        </script>

        틀린게 있는건지..ㅜㅜ
      • hellisoued
        감사합니다 ㅎㅎ
        대화보기
        • anikwon
          이 페이지 맨 윗쪽 예제 opentutorials.org를 보시면 6번째 줄에

          DROP TABLE IF EXISTS `(테이블명)`;

          이녀석 입니다.
          대화보기
          • 헬리사우드
            테이블삭제를 아무리검색해봐도 찾지를못하겠네요. 테이블삭제법을 알고계신분 있나요?
          • 유민호
            대박 _ 하나 들어있다니 왜 제눈에는 안 보였을가요. 정말 감사합니다!
            대화보기
            • 문돌이
              저도 계속 안되다가...

              <p>본문 : <textarea name="description" id="description"></textarea></p>

              저는 id="descripton" 이 부분을 없어서, id 값을 설정하지 않으니 밑에 script에 작성한 value 값이 없어서 나타나지 않았습니다.
              대화보기
              • 문돌이
                아래쪽 부분에서

                VALUES ('".$_POST['title']."','".$_POST['description']."','".$_user_id."', now())";
                $result = mysqli_query($conn,$sql);
                header('Location: http://localhost......hp');
                ?>


                $user_id."'.now())";

                $와 user_id 사이에 _ 이것이 없으면 되지 않을까요?
                대화보기
                • 유민호
                  수업 정말 잘 듣고 있습니다. ^^

                  질문은 새로운 작가 데이터를 입력시 작가가 유저테이블에 입력되면서, 자동으로 토픽 테이블에 그 값이 매칭이 되어야되는데, 계속 안됩니다. 전문을 긁어다 붙여넣기하면 되는데, 제가 친 것은 안 되는데 어떤 사유로 그럴까요?

                  <제가 친 코드>

                  <?php
                  require("config/config.php");
                  require("lib/db.php");
                  $conn = db_init($config["host"],$config["duser"],$config["dpw"],$config["dname"]);
                  $sql="SELECT * FROM user WHERE name='".$_POST['author']."'";
                  $result = mysqli_query($conn, $sql);
                  if($result->num_rows == 0){
                  $sql = "INSERT INTO user (name, password) VALUES('".$_POST['author']."', '111111')";
                  mysqli_query($conn, $sql);
                  $user_id = mysqli_insert_id($conn);
                  } else {
                  $row = mysqli_fetch_assoc($result);
                  $user_id = $row['id'];
                  }
                  $sql="INSERT INTO topic(title, description, author, created)
                  VALUES ('".$_POST['title']."','".$_POST['description']."','".$_user_id."', now())";
                  $result = mysqli_query($conn,$sql);
                  header('Location: http://localhost......hp');
                  ?>

                  <이고잉님코드>
                  <?php
                  require("config/config.php");
                  require("lib/db.php");
                  $conn = db_init($config["host"],$config["duser"],$config["dpw"],$config["dname"]);
                  $sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";
                  $result = mysqli_query($conn, $sql);
                  if($result->num_rows == 0){
                  $sql = "INSERT INTO user (name, password) VALUES('".$_POST['author']."', '111111')";
                  mysqli_query($conn, $sql);
                  $user_id = mysqli_insert_id($conn);
                  } else {
                  $row = mysqli_fetch_assoc($result);
                  $user_id = $row['id'];
                  }
                  $sql = "INSERT INTO topic (title,description,author,created)
                  VALUES('".$_POST['title']."', '".$_POST['description']."', '".$user_id."', now())";
                  $result = mysqli_query($conn, $sql);
                  header('Location: http://localhost......hp');
                  ?>
                • Hyunsik Lim
                  if 조건문에서 조건을 $result == false 로 했을 때도 정상 작동하는 것 같네요.
                  (sql에 보낸 명령문이 잘못되었을때 '**값이 boolean입니다'라는 식의 에러가 많은게 생각나서..)
                  $result->num_rows == 0 으로 사용하는 혹시 특별한 이유가 있는지 궁금합니다!
                • 까비에프
                  num_row 값이 1 이상인지 확인하는 부분에서 "오!" 했습니다 ㅋㅋ 예외 처리가 궁금했거든요~

                  그런데 제가 다른 언어를 접하다 배운 예외처리는 '에러 발생시 다른 코드 적용' 개념으로 try-exception 을 사용해왔던 것 같아서요~ 찾아보니 php에도 try-catch-throw가 있네요! if-else로 처리하는 것과 메모리 할당량이 다른건지.. 둘중에선 어느게 더 나은 방법인지 궁금합니다. 또 다른 방법이 있다면 그것도 알고싶구요.
                • 나홀로문도리
                  좋은 강의 잘 들었습니다.

                  저... 저도 업로드 케어에서 본문에 이미지 주소값 나오는 부분은 안 되는 것 같습니다. 해결책을 알려주시면 다시 들러붙어 보겠습니다 ^^;;;
                • 저는 오늘 이것을 봤는데요 handylady님께서 댓글로 남기신 코드를 다시 atom에 복사, 붙여넣기하시면 실행이 됩니다.
                  대화보기
                  • 저도 업로드 케어 붙이는 부분에서 본문으로 붙는 부분이 안되네요.

                    크롬에서 Inspect 해보니까 이 부분이 "document.getElementById('description').value = document.getElementById('description').value + '<img src = "'+info.cdnUrl+'">';" Uncaught TypeError: Cannot read property 'value' of null 라는 에러가 떠서 안되는거 같네요.

                    이리저리 찾아봐도 해결이 혼자서는 안되어서 ㅜ_ㅜ 일단 다음으로 넘어갑니다.
                  • 이성진
                    수강 완료!
                    좋은 강의 항상 감사 드립니다~
                  • handylady
                    업로드 케어 붙이는 부분도 소스코드 있었으면 좋겠습니다.
                    본문으로 붙는 부분이 안 되는데 에러가 아
                    제가 못찾는 것인가요? ^^a

                    (이 부분.. 뭐가 틀린건지 -_ㅜ)

                    <script>
                    var singleWidget = uploadcare.SingleWidget('[role = uploadcare-uploader]');
                    singleWidget.onUploadComplete(function(info){
                    document.getElementById('description').value=document.getElementById('description').value +'<img src="'+ info.cdnUrl+'">';
                    });
                    </script>
                  • 정말 잘 듣고 있습니다~! 너무 너무 감사합니다.
                    판교 경기문화창조허브에서 직접 뵈었어야 하는 건데..
                    제가 시간이 안돼서 참석을 못하였네요.. 정말 아쉬웠습니다.
                    저에게 코딩수업은 산넘어 산이지만 정말 유익하게 듣고 있습니다.

                    하나 여쭤볼게 있는데
                    process.php 에서 변수 $sql 이 계속 새로 정의 되는데 있어서 생기는 문제는 없을까요?
                    $sql 변수가 실행 될때 바로 위에서 정의된 $sql 로 실행 되기 때문에 문제가 없는 것으로 알고 있으면 될까요?
                    $sql의 상수값 즉 정의된느 값은 실행되는 값에 따라 바뀌어도 바로 윗줄에서 정의된 것으로 실행되기 때문에 괜찮은 것인가요?

                    질문은 예를 들어 각 $sql 을
                    1) $sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";
                    2) (if 구문의 )$sql = "INSERT INTO user (name, password) VALUES('".$_POST['author']."', '111111')";
                    3) $sql = "INSERT INTO topic (title,description,author,created) VALUES('".$_POST['title']."', '".$_POST['description']."', '".$user_id."', now())";

                    구분 하기 쉽게 $sql1, $sql2, $sql3 으로 정의해도 상관 없나요?
                    아니면 반드시 전부다 $sql 로 같아야 하나요? 궁금합니다..

                    그리고 감사합니다!
                  • 폭스킴
                    아침에 출근하면 무의식적으로 오픈튜토리얼스로 접속하는 저를 발견하고 있습니다;; 부두교 술사에 사로잡힌 좀비가 된 거 같아요 ㅋ
                  • 123123
                    왜안될까 슬프다
                  • 임지호
                    데이터베이스 들어오면서 엄청 어렵네요 거의 80%는 이해가 안되는듯요ㅠㅠ
                    일 때문에 한달여간 공부 못한 것도 엄청 크고..
                    그래도 다시 빢세게 해보겠습니다~~!!
                  • 히스토
                    감사합니다. 하다가 오타와 몇줄을 빼먹은 적도 많았네요. 디버깅 덕분에 잘 풀었습니다. 막힐 때는 짜증나고 그렇지만, 탁 풀어냈을 때 성취감이 있네요. 뭐가 문제지 하면서 문법도 더 알게 되는 것 같습니다.
                  • 규현빵
                    opentutorials.sql 를 카피앤 페이스트 했는데 오류가 떠서 봤더니 시간지정을 0000-00-00 이런식으로 되어 있었더라고요.. 토픽 테이블에 5,6번이요.. 그런데 수정하는 방법을 따로 안올려주셔서요... 그냥 다시 작성하면 자동으로 덮어쓰기 형식으로? 수정이 될까요??
                  • 드디어..넘어갑니다...
                    실습1-3은 반복해서 봤는데요. php문법이 어렵네요.
                  • 김종엽
                    2016.08.10 완료!
                  • Wookiiis
                    잘 보았습니다. :)
                  • 차누
                    수강완료
                  • 김유성
                    ^^ 재밌네요.

                    html, php, mysql 문법에 문자입력이 햇갈려서 좀 어렵지만요.
                  • 수강완료
                  • 갤럭시
                    머리터질뻔햇네요 ㅋㅋㅋㅋㅋㅋ '".."' 이거정말 실수많이할거같아요

                    여러번 실습해봐야 완전하게 받아들여질거같네요.
                  • 강이경
                    sql 이고잉님이 주신 것 그대로 복붙했는데 본문 내용 문단 나눔이 안되어 있네요. 근데 영상에서는 문단 나눠져있구요. 문단 나누는거 어떻게 하나요? <br>도 넣고 해 볼수 있는거 다 해봤는데 문단이 안나눠져요ㅠ 아 그리고 \r\n이 뭔가요?
                  • JustStudy
                    고맙습니다 2.
                  • flyoverthehimalaya
                    password 앞에 "컴마(,)" 대신 "점(.)" 을 쓰셨네요!!
                    대화보기
                    • Jo Minho
                      에휴... 콤마.따옴표 정말정말 헷갈리네요
                    • 이승민
                      저도 실습3에서 대혼란에 빠졌네요 ㅋㅋㅋ 지금까지 머리에 쑤셔넣은 것들의 전체적인 맥락을 머리에 붙잡아두고 있어야 이해가 가능할 것 같네요. 마음 편하게 그냥 다음강의로 넘길랍니다! 나중에 MySQL이랑 PHP 배울때 배우게 되겠지요.
                    • 저도 아톰을 쓰고 있는데
                      하얀색으로 보이는데 실행을 하니 정상작동하고 있습니다.
                      대화보기
                      • 지명
                        추가를 12번까지 했다가 그 이후부터 추가를해도 보이지않아
                        데이터베이스 삭제 방법(delete from 테이블명 where id=?)
                        위 방법으로 삭제하고 다시 "쓰기" 창 에서 추가 하려고 하니
                        추가가 되지 않아요..... 지금 몇시간째 반복해서 하는데 이전 mysql 까지 돌아갔다가 다시 왔는데도

                        안되네요 ㅜㅜ 제발 도와주세요
                      • 강지명
                        아톰 쓰고 있는데요 $user_id = mysqli_insert_id($conn);

                        위 부분에서 mysqli_insert_id 이부분이 하얀색으로 보이는데

                        mysql_insert_id 이것처럼 i를 삭제하면 mysqli_query 와 같은 색깔로 보여집니다,,

                        정상 작동하지 않는걸로 보입니다.

                        작성자가 추가가 안되요..

                        이유가있을까요?
                      • 지명
                        저도 하얀색으로 되고있어서 작성자 추가가 안되네요,,

                        몇번해봐서 이제 더이상 추가도안되는데..
                        대화보기
                        • 광팔a
                          꿀잼!
                          감사합니다
                        • 실습3에서 멘붕 ㅋㅋㅋ
                          궁금한게 저렇게 delete해서 데이터베이스 값없애면, id 가 중간중간 비게 되잖아요
                          다시 채울순 없는건가요 ㅎㅎ
                          대화보기
                          • 드디어 여기까지 왔네요
                          • 달고뉴
                            감사합니다. 따옴표 부분이 참 헷갈리네요.
                          • 즐거운수업이었습니다. 감사합니다.
                          • zombiefood
                            수고하셨습니다^^
                          버전 관리
                          egoing
                          현재 버전
                          선택 버전
                          graphittie 자세히 보기