Java의 기본 log 기능 정리


http://www.gisdeveloper.co.kr/?p=5174#comment-25326



Java에서 기본으로 제공하는 log 기능에 대해 정리한 글.


  1. log에 대한 수준별로 출력하는 메소드
  2. 나만의 log를 설정하게 해주는 클래스
  3. log를 file로 저장하게 해주는 방법.


'프로그래밍 > JAVA' 카테고리의 다른 글

캡슐화(Capsulation)  (0) 2018.08.07
다형성 (polymorphism)  (0) 2018.07.20
상속(Inheritance)  (0) 2018.07.20
클래스 - 다른 클래스의 메소드 호출  (0) 2018.05.17
Return data type에 대한 검색 및 정리.  (30) 2018.05.03


HTTP 헤더의 의미에 대해 검색해서 나온 자료.


HTTP요청(Request)

헤더(Header)


요청의 HTTP 헤더는 모든 HTTP 헤더의 기본 구조를 따릅니다: 뒤에 콜론(':')이 오는 대소문자 구분없는 문자열 다음에 구조가 헤더에 종속적인 값으로 이루어집니다. 값을 포함하는 전체 헤더는 상당히 길 수도 있는 단일 줄로 구성됩니다.


많은 요청 헤더를 이용할 수 있습니다. 요청 헤더들은 몇 가지 그룹으로 나누어집니다:


Via와 같은 일반적인 헤더들은 메시지 전체에 적용됩니다.

User-Agent, Accept-Type와 같은 요청 헤더들은 (Accept-Language처럼) 좀 더 특정짓고, (Referer처럼) 컨텍스트를 제공하며, (If-None처럼) 조건에 따라 제한함으로써 요청을 수정합니다.

Content-Length와 같은 엔티티 헤더들은 요청의 본문에 적용됩니다. 요청 내에 본문이 없는 경우 말할 필요도 없이 그런 헤더 또한 전송되지 않습니다.





본문(Body)


요청의 마지막 부분은 본문입니다. 모든 요청들이 본문을 가지는 건 아닙니다: GET, HEAD, DELETE 또는 OPTIONS와 같이, 리소스를 가져오는 요청들은 일반적으로 본문을 필요로 하지 않습니다. 어떤 요청들은 리소스를 갱신하기 위한 목적으로 데이터를 전송합니다: 이것은 대게 (HTML 폼 데이터를 포함하는) POST 요청일 경우에 그렇습니다.


본문은 넓은 의미에서 두 개의 종류로 나눠집니다:

두 개의 헤더(Content-Type와 Content-Length)로 정의되는, 단일 파일을 구성하는 단일 리소스 본문.
멀티파트 본문으로 구성되는 다중 리소스 본문은 각자가 정보의 서로 다른 부분을 포함합니다. 이것은 일반적으로 HTML 폼과 연계되어 사용됩니다.

HTTP응답(Response)

헤더(Header)


응답을 위한 HTTP 헤더는 다른 헤더와 동일한 구조를 따릅니다: 뒤에 콜론(':')이 오는 대소문자를 구분하지 않는 문자열 다음에  구조가 헤더에 종속적인 값으로 이루어집니다. 값을 포함하여, 전체 헤더는 단일 줄로 표시됩니다.


이용 가능한 많은 요청 헤더들이 있습니다. 그들은 몇 가지 그룹으로 나누어질 수 있습니다:


Via와 같은 일반적인 헤더는 전체 메시지에 적용됩니다.

Vary와 Accept-Ranges와 같은 응답 헤더들은 상태 줄에서 설명하지 못했던 서버에 관한 추가적인 정보들을 제공합니다.

Content-Length와 같은 엔티티 헤더들은 요청의 본문에 적용됩니다. 요청 내에 본문이 없는 경우 말할 필요도 없이 헤더 또한 전송되지 않습니다.



본문(Body)


응답의 마지막 부분은 본문입니다. 모든 응답이 본문을 갖진 않습니다: 201 혹은 204와 같은 상태 코드를 갖는 응답에는 일반적으로 아무것도 없습니다.


본문은 넓은 의미에서 세 가지 종류로 나누어질 수 있습니다:


길이를 알고 있는 단일 파일로 구성된 단일 리소스 본문은 두 개의 헤더(Content-Type와 Content-Length)에 의해 정의됩니다.

길이를 알지 못하는 단일 파일로 구성된 단일 리소스 본문은 여러 부분으로 나누기 위해 설정된 Transfer-Encoding를 이용해 청크별로 인코딩됩니다.

멀티파트 본문으로 구성되는 다중 리소스 본문는 각자가 서로 다른 정보를 포함합니다. 이런 경우는 매우 희귀합니다.


헤더 내의 세부 항목


   ㅇ 일반 헤더 (General Header) 항목
      - 요청 및 응답 메세지 모두에서 사용 가능한 일반 목적의(기본적인) 헤더 항목

         . Date  : 메세지를 생성한 일시
            .. RFC 1123에서 규정됨
            .. 例) Date: Sat, 2 Oct 2018 02:00:12 GMT
         . Connection : 다소 모호한 복잡성 있음
            .. 클라이언트와 서버 간 연결에 대한 옵션 설정
            .. 사용 형식 : Connection: `Token list`
            .. 例) Connection: close => 현 HTTP 메세지 직후에 TCP 접속을 끊는다는 것을 알림
            .. 例) Connection: Keep-Alive => 현 TCP 커넥션을 유지
         . Cache-Control
         . Pragma
         . Trailer

  ㅇ 엔터티/개체 헤더 (Entity Header) 항목
     - HTTP 메세지 내에 포함된 선택적인 개체에 대한 구체적인 미디어 타입 등의 설명 등
     - HTTP 메세지는, 이미지,비디오,오디오,HTML 문서,전자메일 등의 개체들을 실어나를 수 있음

         . Content-Type : 본문 개체에 포함되는 미디어 타입 정보
            .. MIME 미디어 타입 및 문자 인코딩 방식(EUC-KR,UTF-8 등)을 지정
            .. 타입 및 서브타입(type/subtype) 구성 
            .. 타입은 9개 정도 (text,image,audio,video,application,multipart,message,
               model,eample)가 표준으로 지정됨 ☞ IANA 미디어 타입 종류
            .. 例) text/html; charset-latin-1 => 해당 개체가 iso-latin-1 문자집합 임

         . Content-Language : 본문 개체와 가장 잘 어울리는 자연언어
         . Content-Encoding : 본문 개체 데이터의 압축 방식
         . Content-Length : 전달되는 본문 개체의 바이트 길이 또는 크기
           .. 응답 메세지 바디의 길이(10진수)를 지정함
         . Content-Location : 리소스가 실제 어디에 위치하는가를 알려줌

         . Location : 리소스가 리다이렉트된 때에 이동된 주소, 또는 새로이 생성된 리소스 주소
            .. 새로 생성된 경우에 HTTP 상태 코드 `201 Created`가 반환됨
            .. 例) Location: http://www.ktword.co.kr/

         . Allow : 해당 리소스가 지원 가능한 HTTP 메소드의 리스트를 나타냄
            .. 例) Allow: GET,HEAD => 서버가 제공가능한 HTTP 메서드는 GET,HEAD 뿐임

         . Expires : 리소스가 지정된 일시까지 캐시로써 유효함
         . Last-Modified : 리소스를 마지막으로 갱신한 일시

         . Transfer-Encoding: chuncked
            .. 동적으로 생성되어 바디 길이를 모르는 경우에 조금씩 전송 가능
            .. 각 chunk 마다 그 시작에 16진수 길이를 삽입하여 chunk 길이를 알려줌



참조 페이지



정보통신기술용어해설  https://developer.mozilla.org/ko/docs/Web/HTTP/Messages


MDN- WebDocs : http://www.ktword.co.kr/abbr_view.php?m_temp1=3790

'네트워크' 카테고리의 다른 글

컴퓨터 네트워킹 하향식 접근  (30) 2018.10.04
REST,RESTful의 의미  (0) 2018.08.23


참조 : https://yish-foss.blogspot.com/2012/04/xml-10.html


아주 특수한 용도가 아니면 1.1은 사용할 필요가 없다.


1.0만 사용하면 된다.

'아이디어' 카테고리의 다른 글

정보처리기사 필기 합격!  (0) 2018.08.19
프로그래머에게 가장 어려운 일  (0) 2018.07.15



참조 : http://devkyeol.tistory.com/entry/Postman-%EA%B0%9C%EC%9A%94-%EC%84%A4%EC%B9%98-%EC%82%AC%EC%9A%A9%EB%B2%95-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95



개발사 홈페이지 : https://www.getpostman.com/



웹 페이지를 간단히 테스트 해볼 수 있는 확장 프로그램.

'프로그래밍' 카테고리의 다른 글

[AOP] 관점 지향 프로그래밍 (3)  (0) 2018.09.28
[AOP] 관점 지향 프로그래밍 (2)  (0) 2018.09.28
[AOP] 관점 지향 프로그래밍 (1)  (30) 2018.09.28


PHP로 구현한 CRUD 게시판



이전에 JSP, model1, model2, Spring MVC로 구현했었던 형태와 유사하게


PHP를 사용하여, 게시물 목록을 불러오고(이전, 다음 페이징 처리 포함), 게시물을 입력하고, 삭제하고, 수정하고, 글 내용을 읽을 수 있는


게시판을 구현해 보았다.



PHP는 XAMPP를 다운 받아서 PHP와 Apache만을 설치하였다. (https://www.apachefriends.org/index.html)


board_list.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>board_list.php</title>
        <link rel="stylesheet" href="/css/bootstrap.css">
    </head>
    <body>
        <h1 class="display-4">board_list.php</h1>
        
        <?php
            $currentPage = 1;
            if (isset($_GET["currentPage"])) {
                $currentPage = $_GET["currentPage"];
            }
 
            //mysqli_connect()함수로 커넥션 객체 생성
            $conn = mysqli_connect("localhost""root""java0000","jjdev");
            //커넥션 객체 생성 확인
            if($conn) {
                echo "연결 성공<br>";
            } else {
                die("연결 실패 : " .mysqli_error());
            }
            
            //페이징 작업을 위한 테이블 내 전체 행 갯수 조회 쿼리
            $sqlCount = "SELECT count(*) FROM board";
            $resultCount = mysqli_query($conn,$sqlCount);
            if($rowCount = mysqli_fetch_array($resultCount)){
                $totalRowNum = $rowCount["count(*)"];   //php는 지역 변수를 밖에서 사용 가능.
            }
            //행 갯수 조회 쿼리가 실행 됐는지 여부
            if($resultCount) {
                echo "행 갯수 조회 성공 : "$totalRowNum."<br>";
            } else {
                echo "결과 없음: ".mysqli_error($conn);
            }
                        
            $rowPerPage = 5;   //페이지당 보여줄 게시물 행의 수
            $begin = ($currentPage -1* $rowPerPage;
            //board 테이블을 조회해서 board_no, board_title, board_user, board_date 필드 값을 내림차순으로 정렬하여 모두 가져 오는 쿼리
            //입력된 begin값과 rowPerPage 값에 따라 가져오는 행의 시작과 갯수가 달라지는 쿼리
            $sql = "SELECT board_no, board_title, board_user, board_date FROM board order by board_no desc limit ".$begin.",".$rowPerPage."";
            $result = mysqli_query($conn,$sql);
            //쿼리 조회 결과가 있는지 확인
            if($result) {
                echo "조회 성공";
            } else {
                echo "결과 없음: ".mysqli_error($conn);
            }
        ?>
        <table class="table table-bordered">
            <tr>
                <td>board_no</td>
                <td>board_title</td>
                <td>board_user</td>
                <td>board_date</td>
                <td>수정</td>
                <td>삭제</td>
            </tr>
            <?php
                //반복문을 이용하여 result 변수에 담긴 값을 row변수에 계속 담아서 row변수의 값을 테이블에 출력한다.
                while($row = mysqli_fetch_array($result)){ 
            ?>
                <tr>
                    <td>
                        <?php
                            echo $row["board_no"];
                        ?>
                    </td>
                    <td>
                        <?php
                            echo "<a href='/board_detail.php?board_no=".$row["board_no"]."'>";
                            echo $row["board_title"];
                            echo "</a>";
                        ?>
                    </td>
                    <td>
                        <?php
                            echo $row["board_user"];
                        ?>
                    </td>
                    <td>
                        <?php
                            echo $row["board_date"];
                        ?>
                    </td>
                        <?php
                            echo "<td><a href='/board_update_form.php?board_no=".$row["board_no"]."'>수정</a></td>";
                            echo "<td><a href='/board_delete_form.php?board_no=".$row["board_no"]."'>삭제</a></td>";
                        ?>
                </tr>
            <?php
                }
            ?>
        </table>
        &nbsp;&nbsp;&nbsp;&nbsp;
        <?php
            //currentPage 변수가 1보다 클때만 이전 버튼이 활성화 되도록 함
            if($currentPage > 1 ) { 
                //이전 버튼이 클릭될때 GET방식으로 currentPage변수 값에 1을 뺀 값이 넘어가도록 함
                echo "<a class='btn btn-primary' href ='/board_list.php?currentPage=".($currentPage-1)."'>이전</a>&nbsp;&nbsp;&nbsp;&nbsp;";
            }
 
            $lastPage = ($totalRowNum-1/ $rowPerPage;
 
            if (($totalRowNum-1) % $rowPerPage !=0) { 
                $lastPage += 1;
            }
            //lastPage변수가 currentPage 변수보다 클때만 다음 버튼이 활성화 되도록 함
            if($currentPage < $lastPage) { 
                //다음 버튼이 클릭될때 GET방식으로 currentPage변수 값에 1을 더한 값이 넘어가도록 함
                echo "<a class='btn btn-primary' href='/board_list.php?currentPage=".($currentPage+1)."'>다음</a>";
            }
            mysqli_close($conn);
        ?>
        &nbsp;&nbsp;
        <a class="btn btn-primary" href="/board_add_form.php">글 쓰기</a>
        <br><br><br><br><br>
        <script type="text/javascript" src="js/bootstrap.js"></script>
    </body>
</html>



board_detail.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
</<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>board_detail.php</title>
        <link rel="stylesheet" href="/css/bootstrap.css">
        <style>
            table {
                table-layout: fixed;
                word-wrap: break-word;
            }
        </style>
    </head>
    <body>
        <h1 class="display-4">board_detail.php</h1>
        <?php
            //mysql 커넥션 객체 생성
            $conn = mysqli_connect("localhost", "root", "java0000","jjdev");
            //커넥션 객체 생성 여부 확인
            if($conn) {
                echo "연결 성공<br>";
            } else {
                die("연결 실패 : " .mysqli_error());
            }
            //board_list.php 에서 넘어온  번호 저장  출력
            $board_no = $_GET["board_no"];
            echo $board_no."번째 글 내용<br>";
            //board 테이블에서 board_no값이 일치하는 board_no, board_title, board_content, board_user, board_date 필드  조회 쿼리
            $sql = "SELECT board_no, board_title, board_content, board_user, board_date FROM board WHERE board_no = '".$board_no."'";
            $result = mysqli_query($conn,$sql);
            //조회 성공 여부 확인
            if($result) {
                echo "조회 성공";
            } else {
                echo "결과 없음: ".mysqli_error($conn);
            }
        ?>
        <table class="table table-bordered" style="width:50%">
            <?php
                //result 변수에 담긴 값을 row 변수에 저장하여 테이블에 출력
                if($row = mysqli_fetch_array($result)) {
            ?>
            <tr>
                <td style="width:15%">작성자</td>
                <td style="width:35%">
                    <?php
                        echo $row["board_user"];
                    ?>
                </td>
            </tr>
            <tr>
                <td style="width:10%">글 제목</td>
                <td style="width:15%">
                    <?php
                        echo $row["board_title"];
                    ?>
                </td>
                <td style="width:5%">글 번호</td>
                <td style="width:3%">
                        <?php
                            echo $row["board_no"];
                        ?>
                </td>
                <td  style="width:5%">작성 일자</td>
                <td  style="width:3%">
                    <?php
                        echo $row["board_date"];
                    ?>
                </td>
                
            </tr>
            <tr>
                <td colspan="6">
                    <?php
                        echo $row["board_content"];
                    ?>
                </td>
            </tr>
            <?php
                }
            ?>
        </table>
        <br>
        &nbsp;&nbsp;&nbsp;
        <a class="btn btn-primary" href="/board_list.php"> 리스트로 돌아가기</a>
        <script type="text/javascript" src="js/bootstrap.js"></script>
    </body>
</html>



board_add_form.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>board_add_form.php</title>
        <link rel="stylesheet" href="/css/bootstrap.css">
        
    </head>
    <body>
        <h1 class="display-4">board_add_form.php</h1>
        <!-- board_add_action.php로 넘기는 폼 -->
        <form class="form-horizontal" action="/board_add_action.php" method="post">
            <div class="form-group">
                <label for="exampleInputPassword1" class="col-sm-2 control-label">비밀번호 : </label>
                <div class="col-sm-10">
                    <!-- 글 비밀번호 입력 상자 -->
                    <input class="form-control" name="boardPw" id="password" type="password" placeholder="Password"/>
                </div>
            </div>
            <div class="form-group">
                <label for="exampleInputTitle1" class="col-sm-2 control-label">글 제목 : </label>
                <div class="col-sm-10">
                    <!-- 글 제목 입력 상자 -->
                    <input class="form-control" name="boardTitle" id="Title" type="text" placeholder="Title"/>
                </div>
            </div>
            <div class="form-group">
                <label for="exampleInputContent1" class="col-sm-2 control-label">글 내용 : </label>
                <div class="col-sm-10">
                    <!-- 글 내용 입력 텍스트영역 -->
                    <textarea class="form-control" name="boardContent" id="content" rows="5" cols="50" placeholder="Content"></textarea>
                </div>
            </div>
            <div class="form-group">
                <label for="exampleInputName1" class="col-sm-2 control-label">작성자명 : </label>
                <div class="col-sm-10">
                    <!-- 작성자명 입력 상자 -->
                    <input class="form-control" name="boardUser" id="name" type="text" placeholder="Name"/>
                </div>
            </div>
            
            <div>
                &nbsp;&nbsp;&nbsp;
                <!-- 글 입력 버튼 -->
                <button class="btn btn-primary" type="submit" value="글 입력">글 입력</button>
                &nbsp;&nbsp;
                <!-- 입력 내용 초기화 버튼 -->
                <button class="btn btn-primary" type="reset" value="초기화">초기화</button>
                &nbsp;&nbsp;
                <!-- 리스트로 돌아가는 버튼 -->
                <a class="btn btn-primary" href="/board_list.php">리스트로 돌아가기</a>
            </div>
        </form>
        <script type="text/javascript">
            //id가 XX인 객체에 변화가 생기면 checkXX 함수를 변화된 객체의 값을 매개로 호출
            $("#password").change(function(){
                checkPassword($('#password').val());
            });
            $("#Title").change(function(){
                checkTitle($('#Title').val());
            });
            $("#content").change(function(){
                checkTitle($('#content').val());
            });
            $("#name").change(function(){
                checkName($('#name').val());
            });
            //입력된 변수의 길이를 참조하여 조건문을 통해 최소 입력 길이 유효성 검사를 하는 함수
            function checkPassword(password) { 
                if(password.length < 4) { 
                    alert("비밀번호는 4자 이상 입력하여야 합니다."); 
                    $('#password').val('').focus();
                    return false;
                } else { 
                    return true;
                } 
            } 
            
            function checkTitle(Title) {
                if(Title.length < 2) {
                    alert('제목은 2자 이상 입력해야 합니다.');
                    $('#Title').val('').focus();
 
                    return false;
                } else { 
                    return true;
                } 
            }
 
            function checkContent(content) {
                if(content.length < 2) {            
                    alert('내용은 2자리 이상 입력해야 합니다.');
                    $('#content').val('').focus();
                    return false;
                } else { 
                    return true;
                } 
            }
 
            function checkName(name) {
                if(name.length < 2) {            
                    alert('작성자명은 2자리 이상 입력해야 합니다.');
                    $('#name').val('').focus();
                    return false;
                } else { 
                    return true;
                } 
            }
        </script>
        <script type="text/javascript" src="js/bootstrap.js"></script>
    </body>
</html>



board_add_action.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html>
    <head>
    </head>
    <body>
        <h1>boardAddAction.php</h1>
        <?php
            //board_add_form.php 페이지에서 넘어온 글 번호값 저장 및 출력
            $board_pw = $_POST["boardPw"];
            $board_title = $_POST["boardTitle"];
            $board_content = $_POST["boardContent"];
            $board_user = $_POST["boardUser"];
            echo "board_pw : " . $board_pw . "<br>";
            echo "board_title : " . $board_title . "<br>";
            echo "board_content : " . $board_content . "<br>";
            echo "board_user : " . $board_user . "<br>";
            //mysql 커넥션 객체 생성
            $conn = mysqli_connect("localhost""root""java0000","jjdev");
            //커넥션 객체 생성 여부 확인
            if($conn) {
                echo "연결 성공<br>";
            } else {
                die("연결 실패 : " .mysqli_error());
            }
            //board 테이블에 입력된 값을 1행에 넣고 board_date 필드에는 현재 시간을 입력하는 쿼리
            $sql = "INSERT INTO board (board_pw, board_title, board_content, board_user, board_date) values ('".$board_pw."','".$board_title."','".$board_content."','".$board_user."',now())";
            $result = mysqli_query($conn,$sql);
            // 쿼리 실행 여부 확인
            if($result) {
                echo "입력 성공: ".$result//과제 작성시 에러메시지 출력하게 만들기
            } else {
                echo "입력 실패: ".mysqli_error($conn);
            }
            mysqli_close($conn);
            //헤더함수를 이용하여 리스트 페이지로 리다이렉션
            header("Location: http://localhost/board_list.php"); //헤더 함수를 이용해서 리다이렉션 시킬 수 있다.
        ?>
    </body
</html>


board_update_form.php



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>board_update.php</title>
        <link rel="stylesheet" href="/css/bootstrap.css">
        <!-- 테이블 크기 조절용 css -->
        <style>
            table {
                table-layout: fixed;
                word-wrap: break-word;
            }
        </style>
    </head>
    <body>
        <h1 class="display-4">board_update.php</h1>
        <?php
            //커넥션 객체 생성 (데이터 베이스 연결)
            $conn = mysqli_connect("localhost", "root", "java0000","jjdev");
            //연결 성공 여부 확인
            if($conn) {
                echo "연결 성공<br>";
            } else {
                die("연결 실패 : " .mysqli_error());
            }
            $board_no = $_GET["board_no"];
            echo $board_no."번째 글 수정 페이지<br>";
            //board 테이블을 조회하여 board_no의 값이 일치하는 행의 board_no, board_title, board_content, board_user, board_date 필드의 값을 가져오는 쿼리
            $sql = "SELECT board_no, board_title, board_content, board_user, board_date FROM board WHERE board_no = '".$board_no."'";
            $result = mysqli_query($conn,$sql);
            if($row = mysqli_fetch_array($result)){
        ?>
        <br>
        <form action="/board_update_action.php" method="post">
            <table class="table table-bordered" style="width:30%">
                <tr>
                    <td style="width:10%">글 번호</td>
                    <td style="width:20%"><input type="text" name="board_no" value="<?php echo $row["board_no"]?>" readonly></td>
                </tr>
                <tr>
                    <td style="width:10%">글 제목</td>
                    <td style="width:20%"><input type="text" name="board_title" value="<?php echo $row["board_title"]?>"></td>
                </tr>
                <tr>
                    <td style="width:10%">글 내용</td>
                    <td style="width:20%"><input type="text" name="board_content" value="<?php echo $row["board_content"]?>"></td>
                </tr>
            </table>
            <br>
        <?php
            }
            //커넥션 객체 종료
            mysqli_close($conn);
        ?>
            &nbsp;&nbsp;&nbsp;
            <button class="btn btn-primary" type="submit">글 수정</button>
            &nbsp;&nbsp;
            <a class="btn btn-primary" href="/board_list.php"> 리스트로 돌아가기</a>
        </form>
        <script type="text/javascript" src="js/bootstrap.js"></script>
    </body>
</html>


board_update_action.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>board_update.php</title>
    </head>
    <body>
        <h1>board_update_action.php</h1>
        <?php
            //board_update_form.php에서 POST 방식으로 넘어온 값 저장 및 출력
            $board_no = $_POST["board_no"];
            $board_title = $_POST["board_title"];
            $board_content = $_POST["board_content"];
            echo "board_no : " . $board_no . "<br>";
            echo "board_title : " . $board_title . "<br>";
            echo "board_content : " . $board_content . "<br>";
            //커넥션 객체 생성 및 연결 여부 확인하기
            $conn = mysqli_connect("localhost""root""java0000","jjdev");
            if($conn) {
                echo "연결 성공<br>";
            } else {
                die("연결 실패 : " .mysqli_error());
            }
            //board 테이블의 board_no값이 일치하는 행의 board_title,board_content 값을 입력한 값으로,board_date값을 현재 시간으로 수정하는 쿼리
            $sql = "UPDATE board SET board_title='".$board_title."',board_content='".$board_content."',board_date=now() WHERE board_no=".$board_no."";
            $result = mysqli_query($conn,$sql);
            //수정 작업의 성공 여부 확인하기
            if($result) {
                echo "수정 성공: ".$result
            } else {
                echo "수정 실패: ".mysqli_error($conn);
            }
        
            mysqli_close($conn);
            //헤더를 이용한 리다이렉션 구현
            header("Location: http://localhost/board_list.php"); 
        ?>
    </body
</html>


board_delete_form.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" href="/css/bootstrap.css">
    </head>
    <body>
        <h1 class="display-4">board_delete_form.php</h1>
        <?php
            //board_list.php 페이지에서 넘어온  번호값 저장  출력
            $board_no = $_GET["board_no"];
            echo $board_no."번째 글 삭제 페이지<br>";
        ?>
        <!-- board_delete_action.php 페이지로 post방식을 이용하여 값 전송 -->
        <form action="/board_delete_action.php" method="post">
            <table class="table table-bordered" style="width:10%">
                <tr>
                    <td>글 비밀 번호를 입력하세요.</td>
                </tr>
                <tr>
                    <td><input type="text" name="board_pw">
                        <input type="hidden" name="board_no" value="<?php echo $board_no ?>">
                    </td>
                </tr>
                <tr>
                    <td><button class="btn btn-primary" type="submit">글 삭제 버튼</td>
                </tr>
            </table>
        </form>
        <script type="text/javascript" src="js/bootstrap.js"></script>
    </body>
</html>


board_delete_action.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>board_delete.php</title>
    </head>
    <body>
        <h1>board_delete_action.php</h1>
        <?php
            //board_delete_form.php 페이지에서 넘어온 글 번호값 저장 및 출력
            $board_no = $_POST["board_no"];
            $board_pw = $_POST["board_pw"];
            echo "board_no : " . $board_no . "<br>";
            echo "board_pw : " . $board_pw . "<br>";
            //mysql 커넥션 객체 생성
            $conn = mysqli_connect("localhost""root""java0000","jjdev");
            //커넥션 객체 생성 여부 확인
            if($conn) {
                echo "연결 성공<br>";
            } else {
                die("연결 실패 : " .mysqli_connect_error());
            }
            //board테이블에서 입력된 글 번호와, 글 비밀번호가 일치하는 행 삭제 쿼리
            $sql = "DELETE FROM board WHERE board_pw='".$board_pw."'AND board_no=".$board_no."";
            //쿼리 실행 여부 확인
            if(mysqli_query($conn,$sql)) {
                echo "삭제 성공: ".$result//과제 작성시 에러메시지 출력하게 만들기
            } else {
                echo "삭제 실패: ".mysqli_error($conn);
            }
        
            mysqli_close($conn);
            //헤더함수를 이용하여 리스트 페이지로 리다이렉션
            header("Location: http://localhost/board_list.php");
        ?>
    </body
</html>





















1. 소상공인 포털 ->학사 정보 시스템 (주제 변경)




소상공인 포털로 만들려고 했었던, 프로젝트 주제가 변경 되었다...


사유는 포털의 기능에 대한 추상화가 쉽지 않아서...및 프로세스 구상이 어렵다는 문제였다.


그래서, 이전에 주제 토의에서 나왔었던 학사 정보 시스템을 제작하는 쪽으로 방향을 수정하였다.



2. 학사 정보 시스템




학사행정입학부터 졸업까지의 학생 Life Cycle에 의한 정보
통합 관리 및 서비스 제공
일반행정대학운영 관련하여 일반 사무행정 업무의 생산성
향상을 지원
연구행정대학 내 교원 및 연구원의 연구활동 지원관리
경영정보학사행정 현황/통계 정보, 추이분석
포털/SSO포털 구현, SSO 구현, 관련시스템 연동
H/W, S/WH/W, N/W, DB, WAS, G/W, Mail, 개발툴, 리포팅
툴, 시스템간 연동


출처 : http://tomatosystem.co.kr/common.tomato?page=m2.m3.m1



시스템 개발업체의 설명에 의하면, 행정 업무를 웹 사이트를 통하여 처리할 수 있게 해주는 종합 정보 시스템이라고 한다.


물론 우리 조원 6명이서 모든 내용을 구현하기에는 내용이 매우 많다.


따라서 이번 프로젝트에서는 일반행정 부분에서, 인사관리 프로세스에 관해서만 구현하는 것을 목표로 잡았다.




























'팀 프로젝트' 카테고리의 다른 글

팀 프로젝트 주제와 개요 정리  (30) 2018.08.24



프로젝트 주제 설정



무엇을 개발 해 볼 것이냐..를 정하는 문제는 확실히 생각하기에 낯선 부분이었다.

이전 회사에서도 주도적으로 연구 테마에 대한 부분을 생각하라는 업무는 없었기에 (그저 맡겨진 업무내에서 품질 개선 실험 정도만 해봤지..)

어떤 타이틀 전체를 정해서 시작한다는 부분은 쉽지 않았다.


하지만, 또 선생님이 학생들을 그렇게 놔두지는 않는 법.

주제를 선정하기에 참조할 만한 것들 몇 가지를 알려 주셨다.


1) 하드웨어를 가정한다.

입력을 받을 수 있는 외부 장치를 가정하여, 입력 받을 수 있는 데이터를 예상해서 주제 선정

예) 스마트 워치, 바코드 리더기, 생체정보 인식 장치, 혈당 측정기 등

2) 외부 API의 활용

정부, 신문사, 특정 웹 사이트등에서 제공해주는 API 데이터들을 입력 받아 가공하여 새로운 데이터를 제공해 줄 수 있는 주제.

3) 주제는 팀원이 모두 공감할 수 있는 것

주제 자체가 팀원들이 이해 할 수 없는 것이라든가, 아니면 너무 유치해서 이런거 가지고 해도 돼? 이런 것은 제외해야 한다.

4) 조달청, 나라장터를 찾아본다.

조달청이나 나라장터 웹 사이트를 들어가서 적절한 검색어를 입력해 보면 현재 진행중이거나 계획중인 SW 개발 프로젝트들이 있으니 참조 

가능하다.

※ 회의시에는 상대방의 의견을 항상 존중하며, 의견이 좁혀지지 않을때는 근거가 좀 더 타당한 쪽으로 진행하는 것을 원칙으로 한다.




그리하여, 많은 공공 데이터를 찾아본 결과... 몇 가지 주제가 나왔었는데, 학사 정보 시스템, 독거 노인을 위한 요양 지원 프로그램, 소상공인


을 위한 지원 포털 등이 나왔었다.


조원 투표를 통해서 내려진 결론은 소상공인을 위한 지원 포털이 주제로 정해졌다.



프로젝트 명은 소상공인을 위한 창업지원, 사업운영을 지원하는 소상공인 지원 포털 사이트 로 정했고, 팀명은 따로 정하지 않았다.


프로젝트 개요


프로젝트의 목적

1. 창업 의지가 있는 예비 창업자의 컨설팅

2. 자영업 클리닉 지원 (경영지도, 전문지도)

3. 사업 정리 지원 (폐업컨설팅, 점포원상복구비용 및 영업양도 광고비용 지원, 취업상담)

4. 자영업 현장체험(현장체험과 경영노하우를 지도받을 수 있도록 지원)

5. 자영업 협업화(대기업, 프랜차이즈 등과 경쟁으로 소득기반이 축소된 소상공인의 자생력 제고를 위한 지원 (공동시설, 공동브랜드 등))


프로젝트를 통해 제작된 사이트로서 얻어지는 기대효과

1. 창업 의지가 있는 신규 창업자들의 진입 장벽을 (정보, 자금) 상당 부분 낮춰줄 수 있을 것.

2. 현재 운영되고 있는 자영업자들의 경영난 해소 및 폐업률을 줄이는데 일조 할 수 있을 것.

3. 비슷한 혹은 연계되는 업종의 자영업자들이 협업을 통해 매출 및 소득 증대 효과를 보일 수 있을 것.



































'팀 프로젝트' 카테고리의 다른 글

팀 프로젝트 주제 변경  (0) 2018.09.05

※수업 시간에 @Controller @RestController 어노테이션에 대해 사용법을 배웠는데 의미가 궁금해서 찾아서 정리해 보았음.


REST의 의미




풀어서 쓰면 REpresentational State Transfer라고 한다.

로이 필딩이라는 사람이 2000년 박사학위 논문에 처음으로 소개했다.

WWW와 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍쳐의 형식 중 하나.

장비가 서로 통신하는데 CORBA, RPC, SOAP같은 방식을 원래 사용했는데, 이것이 복잡해서 간단하게 HTTP로 통신할 수 있도록 하는것이 목

적이었다.

REST는 자원지향구조(Resourece Oriented Architecture)로 웹 사이트의 이미지, 텍스트, Database 등 모든 Resource에 고유한 URI를 부여한다.


RESTful



6가지 제한 조건이 있다.


  • 클라이언트 / 서버 구조
  • 무상태 (Stateless)
  • 캐시 처리 가능 (Cacheable)
  • 계층화 체계 (Layered System)
  • Code on Demand

위 6가지 조건을 준수하는 상황에서 RESTful 하다고 할 수 있다.
또한 이 상황에서 개별 컴포넌트를 자유롭게 구현할 수 있다.
조건에 대한 부분은 각각 다른 페이지에서 설명하겠다.


Web 서비스들에 적용시



REST 아키텍처 제약 조건을 준수하는 웹 서비스 API를 RESTful API라고 한다. HTTP 기반 RESTful API는 다음과 같은 측면으로 정의된다.


  • 기본 URL (a base URL)
  • 상태 전이 데이터 요소(a media type that defines state transition data elements) ex) Atom, microformats, application/vnd.collection+json
  • 표준 HTTP 메소드 ex)  OPTIONS, GET, PUT, POST, DELETE



참조 링크

















'네트워크' 카테고리의 다른 글

컴퓨터 네트워킹 하향식 접근  (30) 2018.10.04
HTTP 메시지 (Header,Body)  (0) 2018.09.10

@Controller와 @RestController의 차이

 

HTTP Response Body가 생성되는 방식의 차이.

 

기존의 MVC @Controller는 View 기술을 사용하지만, @RestController는 객체를 반환할때 객체 데이터는 바로 JSON/XML 타입의 HTTP 응답을 직접 리턴하게 된다.

 

@Controller의 메서드에 @ResponseBody를 선언해서 객체를 리턴 하는 방법도 있다.

 

 

실행 흐름 순서

 

@Controller의 실행 흐름

 

Client -> Request -> Dispatcher Servlet -> Handler Mapping -> Controller -> View -> Dispatcher Servlet -> Response -> Client 

 

@ResponseBody의 실행 흐름

 

Client -> Request -> Dispatcher Servlet -> Handler Mapping -> Controller (ResponseBody)-> Response -> Client 

 

@RestController의 실행 흐름

 

Client -> HTTP Request -> Dispatcher Servlet -> Handler Mapping -> RestController (자동 ResponseBody 추가)-> HTTP Response -> 

 

Client

 

 

ResponseEntity

 

별도의 View를 제공하지 않는 형태로 서비스를 실행한다. 예외의 상황에서 문제가 발생 할 수 있다.

 

개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 404, 500같은 HTTP 상태 코드를 전송하려는 데이터와 함께 전송 가능 하므로 세밀한 제어를 원하는 경우 사용 가능하다.

 

 

참조 블로그

 

http://doublesprogramming.tistory.com/105

 

 



가답안 채점 결과는 합격...


답 잘못쓰거나 밀려 쓰지만 않았다면.

'아이디어' 카테고리의 다른 글

XML을 1.0 버전만 써야 하는 이유  (0) 2018.09.10
프로그래머에게 가장 어려운 일  (0) 2018.07.15

+ Recent posts