이번에 Spring Tool Suite로 Maven을 사용할 때, 간혹 추가되지 않은 의존성 몇 가지에 의해, 에러가 나는 경우가 있어서

적어둔다.

 

 

1. web.xml에서 에러 발생 시 추가

1
2
3
4
5
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
        </dependency>
cs

2. Java EE Perspective가 없을 때 마켓 플레이스에서 검색하여 설치.

 

3.Maven에 Tomcat API 추가. https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-api

 

1
2
3
4
5
6
7
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
cs

4. 가장 짜증났던 부분인데 JSP 페이지 생성할 때, Servlet 관련 API가 없어서 발생하는 에러 해결.

 

1
2
3
4
5
6
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
cs

 

차후에도 추가 합니다.

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

[Spring] @RestController , @Controller의 차이  (0) 2018.08.20

관계연산


관계대수 : 절차적 특징, what, how를 모두 명시,


일반 집합연산자 : 합집합, 교집합, 차집합, 카티션 프로덕트


합,교,카티션은 교환법칙이 성립한다. R과 S의 합집합 = S와 R의 합집합


차집합은 순서를 바꾸면 전혀 다른 결과가 나오기 때문에 성립하지 않음


SELECT a, b FROM R, S -> 카티션 프로덕트


R이 3행, S가 5행이면 15행이 출력되기 때문에 조인에 비해서 굉장히 효율이 안좋다.


SELECT R.a, S.b FROM R,S WHERE R.c = S.c; -> 조인


마찬가지의 경우에 5행 이하로 출력되기 때문에 카티션 프로덕트에 비해서 굉장히 효율이 좋다.


순수 관계연산자 : SELECT σ, PROJECT π, JOIN ⋈, DIVISION ÷


SELECT : 조건에 만족하는 행을 추출 -> 필요없는 행을 모두 삭제 -> 특정 컬럼을 검색


선택도(Selectivity)가 낮을때는 시그마를 먼저쓰는것이 효율이 좋다.


SQL에서 WHERE


PROJECT : 조건에 만족하는 열을 추출 -> 필요없는 열을 모두 삭제 -> 특정 튜플을 검색


SQL에서 SELECT


JOIN : 


DIVISION : 


관계해석 : 비절차적 특징, what만 명시,


튜플 관계 해석 : 1튜플 전체를 다 가져와서 필요한 속성을 골라 쓰는 방법


도메인 관계 해석 : 필요한 속성 일부만 변수로 잡아서 골라쓰는 방법



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

정규화란?  (0) 2018.09.29
DB 용어 정리 DDL DML DCL TCL  (30) 2018.05.24


정규화



이상현상(삽입,삭제,정렬시)의 제거


릴레이션 분해


함수종속의 유지


완전함수 종속, 부분함수 종속, 이행함수 종속이 있다.


부분함수 종속을 해결하는것이 2정규화.


이행함수 종속을 해결하는것이 3정규화.


릴레이션의 모든 속성을 후보키로 만드는것을 보이스코드 정규화.


릴레이션에서 다치 종속 관계가 성립하는 경우 4정규화


릴레이션에서 조인 종속이 성립하는 경우 5정규화


릴레이션에서 이상 현상이 발생할 수 있는 함수 종속관계를 제거하기 위하여, 릴레이션을 분해하는 작업.


함수 종속 관계



X -> Y : Y는 X에 완전 함수적 종속 되어있다.


X : 결정자이자 기본키라고 한다.


Y : X의 종속자


한 테이블 내에서 기본키가 A, B(복합키)일때, C는 A, B에 종속 되어있으나, D는 B에만 종속되어 있을때, D를 부분함수 종속이라고 한다.


R(A,B,C,D)는 제2 정규화가 필요하다.


정규화 후에는 R1(A,B,C,) ,R2(B,D)로 나누어진다.


B는 R1의 외래키, R2의 기본키로 작동한다.



한 테이블 내에서 A->B, B->C일때 A->C를 결정할 수 있게 되면 이행함수 종속관계라고 한다.


R(A,B,C)는 제 3정규화가 필요하다.


정규화 후에는 R1(A,B), R2(B,C) 로 나눈다. 이유는, A가 B를 결정하는데 B가 외래키 이므로 A에 의해 C도 결정된다고 논리적으로 이해할 수 


있기 때문이다. R1(A,B) R2(A.C)는 이런 논리적인 연결이 불가능하므로 안된다.



학번->(성명,학과,학년) X->Y 의 예



기본키는 릴레이션의 속성명에 밑줄이 쳐져 있다.


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

관계 데이터 연산  (0) 2018.09.29
DB 용어 정리 DDL DML DCL TCL  (30) 2018.05.24


@Aspect를 이용한 AOP 구현


작업순서


의존설정

@Aspect 어노테이션을 이용한 ASpect 클래스 제작

XML 파일에 <aop:aspectj-autoproxy/> 설정



XML에 <aop:aspectj-autoproxy/>가 @Aspect 어노테이션이 붙어있는 클래스를 찾아서 proxy를 만들어준다.


클래스 내의 @Pointcut 어노테이션이 붙어있는 메소드를 선언한다. 이 어노테이션에는 proxy가 적용될 범위를 지정해준다.


@Around 등의 어노테이션이 붙어있는 메소드가 proxy로 작동할 메소드 인데 @Pointcut의 범위 안에 드는 메소드가 실행될때


해당 어노테이션의 조건에 맞춰서 공통 기능 -> 핵심 기능 -> 공통 기능 순서로 실행된다.




@Before @After 처럼 아예 실행 위치만 지정해주는 어노테이션도 있다.



AspectJ Pointcut 표현식


AspectJ 문법


Execution : 실행할 메소드의 형식 (public void get*(..)) , 범위 (com.kjworks.ex.*.*())를 정한다.


within : 실행할 메소드의 패키지 안에 있는 메소드


bean : 특정 빈에만 실행 (이름의 형식)



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

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

XML 기반의 AOP 구현


1) 의존 설정 (pom.xmll)

2) 공통기능의 클래스 제작 - Advice 역할 클래스

3) XML 설정 파일에 Aspect 설정


XML 파일 설정


<aop:config> : aop 설정 부분


<aop:aspect id, ref> 참조할 aop 설정 클래스의 빈 id,와 aspect의 id


<aop:pointcut id, expression> aop 설정을 적용할 위치와 그곳을 id로 지정


<app:around pointcut-ref, method>aop 설정 메소드(프록시)명과 설정을 적용할 위치 id



공통기능을 먼저 실행하고, 핵심 기능을 부가적으로 실행하여


겹치는 기능을 분리해 관리할 수 있는 부분


<aop:before> 메소드 실행 전에 advice 실행

<aop:after-returning> 정상적으로 메소드 실행 후에 advice 실행

<aop:after-throwing> 메소드 실행중 exception 발생시 advice 실행

<aop:after> 메소드 실행중 exception이 발생하여도 advice 실행

<aop:around> 메소드 실행 전/후 및 exception 발생시 advice 실행





참조



신입SW인력을 위한 실전 자바(Java) 스프링(Spring) 동영상과정 제 09강 AOP-I


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

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



AOP란?


1. 용어 정리


Aspect : 공통 기능


Advice : Aspect의 기능 자체


Jointpoint : Advice를 적용 해야하는 부분. 메소드


Pointcut : Jointpoint중에서 Advice가 적용이 된 부분


Weaving : Advice를 Pointcut 하는 행위



2. 처리 순서


Client -> Proxy -> Target -> Proxy-> Client 의 순으로 처리된다.



3. 구현 방법


Spring에서는 IOC 컨테이너를 구현할때와 마찬가지로 XML 스키마 기반의 AOP 구현, @Aspect 어노테이션 기반의 구현이 가능하다.




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

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

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://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>




















@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

 

 

+ Recent posts