1. com.paging 패키지에 들어가는 Paging.java 소스

 

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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package com.paging;
 
public class Paging {
 
    int recordsPerPage;       // 페이지당 레코드 수
    int firstPageNo;          // 첫번째 페이지 번호
    int prevPageNo;           // 이전 페이지 번호
    int startPageNo;          // 시작 페이지 (페이징 너비 기준)
    int currentPageNo;        // 페이지 번호
    int endPageNo;            // 끝 페이지 (페이징 너비 기준)
    int nextPageNo;           // 다음 페이지 번호
    int finalPageNo;          // 마지막 페이지 번호
    int numberOfRecords;      // 전체 레코드 수
    int sizeOfPage;           // 보여지는 페이지 갯수 (1,2,3,4,5 갯수)
    
    public Paging(int currentPageNo, int recordsPerPage) {
 
        this.currentPageNo = currentPageNo;
        //기본 페이지 : 5개 보기를 default로 설정함
        this.sizeOfPage = 5;
        
        //recordsPerPage가 0이 아니면 recordsPerPage, 아니면 무조건 5(default : 5)
        this.recordsPerPage = (recordsPerPage != 0) ? recordsPerPage : 5;
        
//        System.out.println("debug > paging sizeOfPage : " + this.sizeOfPage);
//        System.out.println("debug > paging recordsPerPage : " + this.recordsPerPage);
//        System.out.println("debug > paging currentPageNo : " + this.currentPageNo);
    }
    
    public int getRecordsPerPage() {
        return recordsPerPage;
    }
 
    public void setRecordsPerPage(int recordsPerPage) {
        this.recordsPerPage = recordsPerPage;
    }
 
    public int getFirstPageNo() {
        return firstPageNo;
    }
 
    public void setFirstPageNo(int firstPageNo) {
        this.firstPageNo = firstPageNo;
    }
 
    public int getPrevPageNo() {
        return prevPageNo;
    }
 
    public void setPrevPageNo(int prevPageNo) {
        this.prevPageNo = prevPageNo;
    }
 
    public int getStartPageNo() {
        return startPageNo;
    }
 
    public void setStartPageNo(int startPageNo) {
        this.startPageNo = startPageNo;
    }
 
    public int getCurrentPageNo() {
        return currentPageNo;
    }
 
    public void setCurrentPageNo(int currentPageNo) {
        this.currentPageNo = currentPageNo;
    }
 
    public int getEndPageNo() {
        return endPageNo;
    }
 
    public void setEndPageNo(int endPageNo) {
        this.endPageNo = endPageNo;
    }
 
    public int getNextPageNo() {
        return nextPageNo;
    }
 
    public void setNextPageNo(int nextPageNo) {
        this.nextPageNo = nextPageNo;
    }
 
    public int getFinalPageNo() {
        return finalPageNo;
    }
 
    public void setFinalPageNo(int finalpageNo) {
        this.finalPageNo = finalpageNo;
    }
 
    public int getNumberOfRecords() {
        return numberOfRecords;
    }
 
    public void setNumberOfRecords(int numberOfRecords) {
        this.numberOfRecords = numberOfRecords;
    }
 
    /**
     * 페이징 생성
     */
    public void makePaging() {
        if (numberOfRecords == 0)        // 게시글 전체 수가 없는 경우
            return;
        
        if (currentPageNo == 0)
            setCurrentPageNo(1);        // 기본 값 설정
        
        if (recordsPerPage == 0)
            setRecordsPerPage(10);        // 기본 값 설정
        
                                        // 마지막 페이지
        int finalPage = (numberOfRecords + (recordsPerPage - 1)) / recordsPerPage;
        
        if (currentPageNo > finalPage)
            setCurrentPageNo(finalPage);// 기본 값 설정
        
        if (currentPageNo < 0 || currentPageNo > finalPage)
            currentPageNo = 1;            // 현재 페이지 유효성 체크
                                        // 시작 페이지 (전체)
        boolean isNowFirst = currentPageNo == 1 ? true : false;
        boolean isNowFinal = currentPageNo == finalPage ? true : false;
        
        int startPage = ((currentPageNo - 1/ sizeOfPage) * sizeOfPage + 1;
        int endPage = startPage + sizeOfPage - 1;        
        
        if (endPage > finalPage)
            endPage = finalPage;
        
        setFirstPageNo(1);                    // 첫번째 페이지 번호
        
        if (isNowFirst)
            setPrevPageNo(1);                // 이전 페이지 번호
        else                                // 이전 페이지 번호
            setPrevPageNo(((currentPageNo - 1< 1 ? 1 : (currentPageNo - 1)));
 
        setStartPageNo(startPage);            // 시작페이지
        setEndPageNo(endPage);                // 끝 페이지
        
        if (isNowFinal)
            setNextPageNo(finalPage);        // 다음 페이지 번호
        else
            setNextPageNo(((currentPageNo + 1> finalPage ? finalPage : (currentPageNo + 1)));
        
        setFinalPageNo(finalPage);            // 마지막 페이지 번호
    }
}
cs

 

Paging.java 클래스 생성자에서 기본적으로 받아와야 할 값은

currentPageNo(현재 페이지), recordsPerPage(페이지당 게시글 수) 이렇게 두 인자가 필요하다.

생성자에서 인자 두 개를 받아 controller에서 컬럼의 인덱스를 리턴하는 offset 변수를 선언하는데 쓰게 된다.

 

 

2. controller (Servlet)

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
package com.servlet.book;
 
import java.io.IOException;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.paging.Paging;
import com.service.BookManageService;
import com.vo.BookVO;
 
@SuppressWarnings("serial")
@WebServlet("/BookCheckOutAdmin")
public class BookCheckOutAdminServlet extends HttpServlet {
       
    public BookCheckOutAdminServlet() {
        super();
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                throws ServletException, IOException {
        doPost(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                                throws ServletException, IOException {
 
        // Paging Calculation
        int currentPageNo = 1;        
        int recordsPerPage = 0;
        String url = null;
        
        //커넥션풀 연결, 인스턴스 생성
        BookManageService bookManageService = BookManageService.getInstance();
        
        //pages, lines 파라미터를 받아 currentPageNo, recordsPerPage 대입
        //처음 페이지 열릴 때에는 당연히 1, 0임
        if (request.getParameter("pages"!= null)
            currentPageNo = Integer.parseInt(request.getParameter("pages"));
        
        if (request.getParameter("lines"!= null)
            recordsPerPage = Integer.parseInt(request.getParameter("lines"));
        
        //Paging 객체 생성(currentPagenNo, recordsPerPage를 인자로 넣고 초기화함)
        //객체 선언한 뒤 paging 출력해보면 recordsPerPage가 5로 나온다. 
        Paging paging = new Paging(currentPageNo, recordsPerPage);
        
        //System.out.println("debug > BookCheckOutAdminServlet paging : " + paging);
        
        //해당 게시글의 인덱스를 구하는 변수(offset) 
        int offset = (paging.getCurrentPageNo() - 1* paging.getRecordsPerPage();    
        
        //System.out.println("debug > BookCheckOutAdminServlet offset : " + offset);
        
        //현재 대출 가능한 도서(book_lending_possible이 true인 목록만 가져옴)
        List<BookVO> bookList = bookManageService.selectAllLendingPossibleBook(offset,
                                            paging.getRecordsPerPage());        
       
        //System.out.println("debug > BookCheckOutAdminServlet bookList : " + bookList);
 
       //bookList 전체 갯수 구하여 numberOfRecords 메소드에 셋팅함 
        paging.setNumberOfRecords(bookManageService.getBookDao().getNoOfRecords());
 
        //System.out.println("debug > BookCheckOutAdminServlet numberOfRecords : "
        //                            paging.getNumberOfRecords);
 
       //페이징 만듦 
        paging.makePaging();    
        
        //bookList가 존재할 경우
        if (bookList != null) {
            //book_check_out_list.jsp에서 출력할 객체들을 request 단위로 설정함
            request.setAttribute("bookList", bookList);
            request.setAttribute("paging", paging);
            request.setAttribute("servletPath""BookCheckOutAdmin");
 
            //System.out.println("debug > BookCheckOutAdminServlet attribute bookList : "
            //                            + request.getAttribute("bookList"));
            //System.out.println("debug > BookCheckOutAdminServlet attribute paging : "
            //                            + request.getAttribute("paging"));
            //System.out.println("debug > BookCheckOutAdminServlet servletPath : "
            //                            + request.getAttribute("servletPath"));
 
            url = "book_check_out_list.jsp";            
        }
        //list가 존재하지 않을 경우
        else {
            //error_msg.jsp에서 출력할 객체들을 request 단위로 설정함
            request.setAttribute("msg""Error 가 발생했습니다.");   
 
            //System.out.println("debug > BookCheckOutAdminServlet attribute msg : "
            //                            + request.getAttribute("msg"));
         
            url = "error_msg.jsp";
        }        
         
        //해당 url로 모든 request, response 정보 넘김
        //http 창에서 url이 이동하는 url로 변하진 않음
        request.getRequestDispatcher(url).forward(request, response);
    }
}
 
cs

 

페이징을 할 때에는 SELECT 쿼리문에서 LIMIT 를 사용하기 때문에

LIMIT에 들어갈 컬럼의 인덱스 값과 SELECT할 컬럼의 갯수가 필요하다.

currentPage(현재 페이지), recordsPerPage로 설정해 놓고 Paging 객체 생성자에 두 값을 넣어

컬럼의 인덱스(offset)를 도출한다.

 

* 컬럼의 index 구하기 : (현재 페이지 - 1 ) * 페이지당 SELECT할 컬럼 수

 

편의에 맞게 '~개 보기'로 하여 recordsPerPage의 값이 변할 수 있다.

 

* 페이징을 할 때 꼭 알아야 할 값 (중요) *

- 현재 페이지

- 한 페이지 당 출력할 컬럼 갯수

- 전체 컬럼 수

 

전체 컬럼 수를 알아야 페이지가 몇 개가 나올 것인지를 알 수 있기 때문에 전체 컬럼 수는 꼭 필요하다.

그러나 컬럼은 편의에 따라 추가하거나 삭제될 수 있기 때문에

SELECT 쿼리문으로 해당 list 를 구한 후 COUNT를 도출해야만 한다.

 

(list를 구한 후 bookDAO.getNoOfRecords() 메소드를 이용하여 numberOfRecords를 setter한 뒤,

페이징을 만드는 메소드인 paging.makepaging() 을 실행하였음)

 

또한 반드시 setAttribute로 설정해줘야 list.jsp에서 paging 파라미터들을 사용할 수 있다.

 

 

3. Service

 

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
package com.service;
 
import java.util.List;
 
import com.dao.BookDao;
import com.vo.BookVO;
 
public class BookManageService {
 
    static BookManageService    bookManageService = null;
    BookDao                     bookDao;
    BookRentInfoDao             bookRentInfoDao;
    
    public BookManageService() {
 
        bookDao = BookDao.getInstance();

    }

    
    //BookDao를 리턴하는 getBookDao 메소드
    public BookDao getBookDao() {
 
        return bookDao;
    }
    
    public static BookManageService getInstance() {
        
        if (bookManageService == null) {
            bookManageService = new BookManageService();
        }
        
        return bookManageService;
    }
 
    public List<BookVO> selectAllLendingPossibleBook(int offset, int noOfRecords) {
        
        return bookDao.selectAllLendingPossibleBook(offset, noOfRecords);
    }
}
cs

 

Controller에서 Service의 selectAllLendingPossibleBook 메소드를 호출한 뒤

Service 클래스에서 DAO 클래스를 호출한다.

 

디폴트 생성자를 통해 인스턴스를 초기화했다.

 

* Service 클래스 *

- DAO 클래스를 바로 호출하지 않고, Service가 DAO를 호출하게 함.

- 1개의 Service는 1개 이상의 DAO 클래스를 실행 가능하게 한다.

 (대형 프로젝트에서는 1개의 Service가 3개 이상의 DAO를 실행 가능하게 하기도 함)

- 메뉴 1개당 보통 Servlet 1개, DAO 1개, Service 1개, sql 1개가 존재함.

- 객체지향에 따라 역할에 맞게 분류함.

 

 

4. DAO

 

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
package com.dao;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
 
import com.mybatis.MyBatisConnectionFactory;
import com.vo.BookVO;
 
public class BookDao implements BookDaoImpl {
 
    static BookDao        bookDao;
    SqlSessionFactory    sqlSessionFactory;
    final static Logger log = Logger.getLogger(BookDao.class);
    
    int             noOfRecords;
    
    public BookDao(SqlSessionFactory sqlSessionFactory) {
 
        this.sqlSessionFactory = sqlSessionFactory;
    }
 
    public int getNoOfRecords() {
 
        return noOfRecords;
    }
    
    @Override
    public List<BookVO> selectAllLendingPossibleBook(int offset, int noOfRecords) {
        
//        log.debug("selectAllLendingPossibleBook offset : " + offset + 
//                            " , noOfRecords : " + noOfRecords);
        
        List<BookVO> bookList = new ArrayList<BookVO>();
        SqlSession session = sqlSessionFactory.openSession();
        
        HashMap<String, Object> params = new HashMap<String, Object>();
 
        params.put("offset", offset);
        params.put("noOfRecords", noOfRecords);        
        
//        log.debug("selectAllLendingPossibleBook params : " + params);
        
        try {
            bookList = session.selectList("BookDAO.selectAllLendingPossibleBook", params);
            this.noOfRecords = session.selectOne("BookDAO.selectTotalRecords");
            
//            log.debug("selectAllLendingPossibleBook bookList : " + bookList);
//            log.debug("selectAllLendingPossibleBook noOfRecords : " + this.noOfRecords);
            
        } finally {
            session.close();
        }
        
        return bookList;
    }
cs

 

DAO 클래스에서 offset, noOfRecords 인자를 받아 쿼리를 구현한다.

 

받은 인자들을 쿼리문으로 보낼 때 HashMap을 쓴 이유는

MyBatis에서 인자를 2개 이상 보내기 위한 방법은 HashMap 밖에 없기 때문이다.

 

보내야 할 인자가 1개면 단순하게 변수를 보내면 끝이지만,

2개 이상인 경우 반드시 HashMap 객체를 써야 한다.

 

쿼리를 bookList 인스턴스에 담은 후

전체 bookList 갯수를 구하는 쿼리를 실행하여 noOfRecords 변수를 초기화한다.

 

(일전에 앞에서 list를 구한 뒤 count를 구해야 한다고 앞서 적은 바 있다.)

 

 

5. DAOImpl

 

1
2
3
4
5
6
7
8
9
10
package com.dao;
 
import java.util.List;
 
import com.vo.BookVO;
 
public interface BookDaoImpl {
 
    List<BookVO>        selectAllLendingPossibleBook(int offset, int noOfRecords);
}
cs

 

 

6. mapper.xml

 

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
<mapper namespace="BookDAO">
 
    <resultMap id="resultBook" type="BookVO">
        <result property="bookCode" column="book_code" />
        <result property="bookName" column="book_name" />
        <result property="bookAuthor" column="book_author" />
        <result property="bookMade" column="book_made" />
        <result property="bookPrice" column="book_price" />
        <result property="bookLendingPossible" column="book_lending_possible" />
        <result property="bookLendingCount" column="book_lending_count" />        
    </resultMap>
 
    <select id="selectAllLendingPossibleBook" parameterType="hashmap" resultMap="resultBook">
        SELECT SQL_CALC_FOUND_ROWS
                book_code,
                book_name,
                book_author,
                book_made,
                book_price,
                book_lending_count
        FROM book
        WHERE book_lending_possible is true
        LIMIT #{offset}, #{noOfRecords}        
    </select>
 
    <select id="selectTotalRecords" resultType="int">
        SELECT FOUND_ROWS();
    </select>
 
</mapper>
cs

 

FOUND_ROWS() : total count를 구할 때 한 번의 쿼리만으로 처리 가능.

 count를 쓰면 두 번의 쿼리를 날려야 하므로 과부하를 유발한다.

 

SQL_CALC_FOUND_ROWS를 쓰고 FOUND_ROWS() 를 쓰면

앞 쿼리에 썼던 SELECT한 전체 갯수를 FOUND_ROWS()를 쓴 쿼리에서 반환한다.

 

(이전 쿼리에 LIMIT가 있는 경우, LIMIT 부분은 무시하고 SELECT된 전체 갯수를 반환한다.)

 

FOUND_ROWS()로 전체 갯수를 구하는 이유 : 페이징의 필수 요소이기 때문에

(실제로 DAO 클래스에서 쿼리 부분을 커멘트 하면 페이징이 되지 않음)

 

 

7. import 될 paging.jsp

 

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
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<div class="paginate">
 
    <c:if test="${param.currentPageNo ne param.firstPageNo}">
        <a href="javascript:goPage('${servletPath}', ${param.prevPageNo}, ${param.recordsPerPage})" class="prev">이전</a>
    </c:if>
    
    <span>
        <c:forEach var="i" begin="${param.startPageNo}" end="${param.endPageNo}" step="1">
            <c:choose>
                <c:when test="${i eq param.currentPageNo}">
                    <b><font size=+1>
                            <a href="javascript:goPage('${servletPath}', ${i}, ${param.recordsPerPage})" class="choice">${i}</a>
                        </font>
                    </b>
                </c:when>
                <c:otherwise>
                    <a href="javascript:goPage('${servletPath}', ${i}, ${param.recordsPerPage})">${i}</a>
                </c:otherwise>
            </c:choose>
        </c:forEach>
    </span>
    
    <c:if test="${param.currentPageNo ne param.finalPageNo}">
        <a href="javascript:goPage('${servletPath}', ${param.nextPageNo}, ${param.recordsPerPage})" class="next">다음</a>
    </c:if>
 
</div>
cs

 

 

8. paging.jsp 에서 이동하는 javascript goPage 함수

 

1
2
3
4
5
6
function goPage(url, pages, lines) {
    
    url += '?' + "pages=" + pages + "&lines=" + lines;
    
    location.href = url;    
}
cs

 

 

9. list.jsp

 

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>main</title>
 
<script type="text/javascript" src="./js/script.js"></script>
 
</head>
<body>
 
        <jsp:include page="paging.jsp" flush="true">
            <jsp:param name="servletPath" value="${servletPath}" />
            <jsp:param name="recordsPerPage" value="${paging.recordsPerPage}" />
            <jsp:param name="firstPageNo" value="${paging.firstPageNo}" />
            <jsp:param name="prevPageNo" value="${paging.prevPageNo}" />
            <jsp:param name="startPageNo" value="${paging.startPageNo}" />
            <jsp:param name="currentPageNo" value="${paging.currentPageNo}" />
            <jsp:param name="endPageNo" value="${paging.endPageNo}" />
            <jsp:param name="nextPageNo" value="${paging.nextPageNo}" />
            <jsp:param name="finalPageNo" value="${paging.finalPageNo}" />
        </jsp:include>
 
</body>
</html>
cs

 

paging.jsp로 작성한 소스를 jsp 액션 태그 include로 불러오고,

Controller에서 request 단위로 setAttribute 설정한 paging 객체를 불러온다. 

 

 

 

실제로 프로젝트를 구현하면 위와 같이 페이징이 되고,

 

 

recordsPerPage 값을 몇으로 설정하냐에 따라서 SELECT 쿼리문에 들어가는 LIMIT의 값이 바뀌게 된다.

(option 값 변화에 따라 LIMIT가 바뀌는 부분은 본문에 넣지 않았다.)

페이징을 사용할 때 쿼리 select 문에 LIMIT를 사용하여 select로 뜨는 결과를 제한, 페이징을 구현할 수 있다.

 

1. 의미

LIMIT a, b

a번 인덱스 쿼리부터 b개 만큼 출력하겠다는 의미.

(ex. LIMIT 3, 3 : 3번 인덱스 컬럼부터 3개만 select 한다.)

 

 

2. 예제

 

 

book 테이블을 출력하는 쿼리 SELECT * FROM book; 을 입력했을 때에는

 

 

컬럼 book_code가 b00001부터 b00010까지인 book 테이블의 모든 정보를 보여준다.

 

여기서 응용하여 book_code가 b00003 ~ b00007까지 select 한다고 하면 쿼리를 어떻게 입력해야 할까?

 

 

답은 간단하다. 뒤에 LIMIT만 붙여주면 된다.

단, 컬럼의 인덱스는 0부터 시작하기 때문에 LIMIT 2, 5로 적어줘야 b00003인 도서부터 select 해줄 수 있다.

 

아래는 그 결과이다.

 

phpMyAdmin이나 developer 프로그램 이외에 command 창에서 mysql을 다루기 위한 기본적인 명령어들을 정리해봤다.

 

 

 

- cd.. : 상위 경로로 빠져나가는 명령어

- mysql -u user -p : user 부분에는 생성했던 user명을 입력하면 된다. Enter password 부분에는 해당 user의 패스워드를 입력한다.

 

mysql 폴더가 위치한 C드라이브로 경로를 옮긴다.

 

 

 

- show databases : 해당 user와 연동되어 있는 DB 목록을 보여준다.

- use DB명 : 입력한 DB를 사용한다는 뜻이다. 입력한 데이터베이스로 이동한다.

- show tables : 해당 데이터베이스 내에 만든 테이블들을 조회한다.

 

 

- select * from table : 테이블 내 데이터들을 조회한다.

데이터베이스 내에 있는 여러 테이블들 중 book이라는 테이블을 조회했는데, 한글이 꺠져서 나오는 문제가 발생했다.

 

 

 

- set character set euckr : command mysql 상에서 한글 깨짐을 방지하는 명령어이다.

다시 테이블 내용을 조회하니 잘 나온다.

 

 

 

- desc table : 테이블 구조를 보여준다. 필드명, 타입 등을 확인할 수 있다.

 

 

 

- show create table table_name : desc table과 비슷한 명령어이다.

   비슷하지만 ENGINE과 CHARSET 속성도 확인할 수 있는 장점이 있다.

(ENGINE을 InnoDB로 설정하여 테이블을 생성해야 외래키를 설정할 수 있다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>book_insert_form_ajax_button</title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="./js/bookmanage.js"></script>
<body>
<center>
 
<form method="post" name="insert_book_form" action="BookInsertPro" onsubmit="return insertBookSave()">
</form>
 
</center>
</body>
</html>
cs

 

./js/bookmanage.js 경로의 파일을 받는 insert_book_form이 있다고 가정한다.

onsubmit 이벤트로 insertBookSave 함수를 호출했을 때를 비교한다.

 

 

1. return

1
2
3
4
5
6
7
8
9
10
11
12
13
function insertBookSave() {
    var insert_book_form = document.insert_book_form;
    
//    alert('bookCode value : ' + insert_book_form_bookCode.value);
 
    if (! insert_book_form_bookCode.value) {
        alert('도서 코드를 입력하세요.');
        
        insert_book_form.bookCode.focus();
        
        return;
    }
}
cs

 

return 뒤에 어떠한 값으로 return하는지 정해주지 않았기 때문에 insert_book_form_value값이 들어가 있지 않을 경우 null로 return한다.

따라서 insert_book_form은 submit을 하지 못하고 null을 반환한다.

해당 return 아래를 전부 실행하지 않고 return 줄에서 클래스를 끝내버린다.

 

 

2. return true

1
2
3
4
5
6
7
8
9
10
11
function insertBookSave() {
    var insert_book_form = document.insert_book_form;
    
    if (! insert_book_form.bookCode.value) {
        alert('도서 코드를 입력하세요.');
        
        insert_book_form.bookCode.focus();
        
        return true;
    }
}
cs

 

return값을 true로 정해줬다.

insert_book_form이 submit 하기 전에 insertBookSave 함수에서 유효성 검사를 하고 통과가 되면 true (=submit true)로 리턴한다는 뜻이다.

즉 bookCode.value 값이 들어가 있지 않아도 submit 한다.

 

 

3. return false

1
2
3
4
5
6
7
8
9
10
11
function insertBookSave() {
    var insert_book_form = document.insert_book_form;
    
    if (! insert_book_form.bookCode.value) {
        alert('도서 코드를 입력하세요.');
        
        insert_book_form.bookCode.focus();
        
        return false;
    }
}
cs

 

return값을 false로 정해준다.

bookCode.value 값이 들어가 있지 않으면 submit을 fasle로 리턴한다는 뜻이다.

 

자바스크립트 함수를 쓰면서 return 값을 true나 false로 명확하게 주지 않고 return으로만 적었었는데,

input 값 관련 오류가 나서 어떤 이유인지 한참 찾아봤었다.

 

앞으로는 return 값을 true or false로 명확하게 해야겠다.

오라클은 mysql보다 한 단계 더 업그레이드 된 데이터베이스이다.

 

1. http://www.oracle.com 홈페이지로 들어간다.

 

downloads > oracle datebase express edition 11g release 2 > accept 버튼을 클릭한 뒤 각 컴퓨터 사양에 맞는 exe 파일을 다운받는다.

 

 

2. 다운 받은 exe 파일을 실행

- next > I accept > next > (defalt 사용) C:\oraclexe\ > id : system / pw : oracle > next > install > finish.

 

 

3. 자동 시작 방지 설정

- 제어판 > 관리 > 서비스 > OracleServietXE / OracleXETNSListener 속성 > 시작 유형 : 수동으로 설정

 

 

4. sql developer을 다운받는다.

 

 

5. Oracle Start database /  stop database 시작 메뉴에 고정

 

 

6. Oracle Start database

a. OracleServiceXE 실행중

b. OracleXETNSListenr 실행중

2개가 실행되면 정상

 

 

7. Oracle Stop > Oracle 다시 시작

 

 

8. 오라클 포트 변경

톰캣이 8080 포트를 쓰는데, 오라클도 8080 포트를 기본으로 쓰기 때문에 충돌 방지를 위해 오라클 포트를 8090으로 변경해야 함. 바꾸지 않으면 톰캣 실행이 되지 않아서 이클립스 에러가 난다.

근본적인 해결책 : 오라클 포트를 8090으로 변경한다.

 

a. sql developer 실행

 

b. 테이블 스페이스 생성

- dba > 저장 영역 > 테이블 스페이스 > 새로만들기

- 이름 : 파일명 뒤에 반드시 .DBA를 붙일 것

- 디렉토리 : DBA 파일들이 위치한 경로

- 파일 크기 : byte 단위. K(B), M(B), G(B), T(B)

 

(테이블 스페이스를 따로 두고 싶지 않을 때에는, 데이터베이스를 생성할 때 default로 system이나 다른 공간으로 테이블 스페이스를 지정한다.)

 

c. 사용자 추가

- dba > 보안 > 사용자 > 새로만들기

 

- 아이디, 비밀번호는 임의로 만들어 작성.

- 기본 테이블 스페이스 : 테이블 스페이스에서 생성했던 DBA명 클릭, 임시 테이블 스페이스 : TEMP 클릭

 

d. db 추가

- 접속 > 새접속

 

- 접속 이름 : 임의로 생성.

- 사용자 이름, 비밀번호 : 사용자를 생성했을 때 기입했던 아이디와 비밀번호 그대로 기입.

- 비밀번호 저장 체크할 것.

- 테스트 버튼을 눌러 접속이 원활하게 되는지 테스트한 뒤, 접속 버튼을 누른다.

 

e. 오라클 포트 변경

- 생성한 db에 접속한 뒤 SELECT DBMS_XDB.GETHTTPPORT() FROM DUAL 이라고 입력한 후 현재 오라클 포트를 확인한다.

- EXEC DBMS_XDB.SETHTTPPORT(8090) 을 입력하여 오라클 포트를 8090으로 변경한다.

 

f. 톰캣 테스트

- 오라클 포트를 8090으로 변경한 상태에서 이클립스에 접속, 실행시켜 톰캣이 제대로 작동하는지(포트 충돌 없는지) 다시 한 번 확인한다.

1. 서블릿으로 파라미터를 보내는 form.html 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Form.html</title>
</head>
<body>
 
<!-- 필터는 post 방식으로 받을 때에만 적용됨. -->
<!-- form.do라는 서블릿으로 파라미터들을 보냄. -->
<form action="form.do" method="post" name="textform"> 
    Name : <input type="text" name="name"><br⁄> 
    <input type="submit" value="전송" name="submitbtn"> 
</form> 
 
</body>
</html>
cs

 

2. WEB-INF/web.xml 파일에 필터 매핑

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
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>Archetype Created Web Application</display-name>
  
  <!-- 서블릿을 매핑하듯 필터도 같은 방식으로 WEB-INF/web.xml 파일에 매핑함. -->
  <!-- filter-name : 필터 클래스 파일 이름. -->
  <!-- filter-class : 필터 클래스 경로(애플리케이션 내에서의 절대 경로). -->
  <!-- init-param : 필터 클래스에서 사용하려는 파라미터의 이름, 값을 web.xml에서 미리 지정할 수 있음. -->
  <filter>
      <filter-name>HangulEncodingFilter</filter-name>
      <filter-class>com.filter.HangulEncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>      
  </filter>
  
  <!-- url-pattern : 해당 애플리케이션 내에서 필터를 적용시키고자 하는 범위. -->
  <!--                 /* - 애플리케이션 내 모든 post 방식에서 적용(servlet, jsp 구분 없이). -->
  <!--                 /*.do - 애플리케이션 내 *.do로 이름을 지은 서블릿 post 메소드만 적용. -->
  <!-- servlet-name : 애플리케이션 내 특정 서블릿에만 적용할 때 씀.-->
  <filter-mapping>
      <filter-name>HangulEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
cs

 

3. form.do 서블릿이 실행되기 전에 실행되는 filter 클래스

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
package com.filter;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
/**
 * Servlet Filter implementation class ExampleBFilter
 */
public class HangulEncodingFilter implements Filter {
 
    //인코딩을 수행할 인코딩 캐릭터 셋 지정
    String encoding;
    
    //필터 설정 관리자
    FilterConfig filterConfig;
    
    /**
     * Default constructor. 
     */
    public HangulEncodingFilter() {
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        //초기화
        //getInitParameter() : web.xml에 초기화해서 지정한 파라미터 값을 불러오는 메소드. 
        this.filterConfig = fConfig;
        this.encoding = fConfig.getInitParameter("encoding");
        
//        System.out.println("debug > init %%%%%%%%%");
    }    
    
    /**
     * @see Filter#destroy()
     */
    //destroy : 웹 애플리케이션이 끝날 때 같이 끝남
    public void destroy() {
        
        this.encoding = null;
        this.filterConfig = null;
        
//        System.out.println("debug > destroy %%%%%%%%%%%");
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
 
        //request.setCharacterEncoding("utf-8");
        
//        System.out.println("characterEncoding : " + request.getCharacterEncoding());
        
        if (request.getCharacterEncoding() == null) {
            if (encoding != null
                request.setCharacterEncoding(encoding);
        }
        
        chain.doFilter(request, response);
    }
}
cs

 

4. form.do 서블릿

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
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/form.do")
public class MyServlet extends HttpServlet {
    
    public MyServlet() {
        super();
    }
       
//    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
//                throws ServletException, IOException {
//        // TODO Auto-generated method stub
//    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException {
        
        // 한글깨짐방지
        // 한글 필터를 쓰면 아래것은 쓸모없다
        // request.setCharacterEncoding("utf-8");
 
        // 아래 2줄 넣으면 한글 무조건 깨진다.
        // PrintWriter out = response.getWriter();
        // out.println("name : " + name);        
        String name = request.getParameter("name");
        
//        System.out.println("Debug> name : " + name);
        
        request.setAttribute("name", name);
        
        RequestDispatcher rd = request.getRequestDispatcher("result.jsp");    
        rd.forward(request, response);
    }
}
cs

 

5. 서블릿에서 파라미터를 받아 출력하는 jsp 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%@ page isELIgnored="false" %>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>화면 결과 출력 예제</title>
</head>
<body>
    name : ${name}
</body>
</html>
cs

1. 정의

여과기 역할을 하는 프로그램.

서블릿 클래스가 실행되기 전/후에 어떤 데이터를 미리 실행시키거나, 아예 가로채서 서블릿이 실행되지 못하도록 한다.

자바 클래스 형태로 구현해야 한다.

http 요청, 응답을 변경 가능하고 재사용이 가능한 코드. 객체 형태를 띈다.

request와 최종 자원(jsp / servlet) 사이에 위치한다.


* 보통은 클라이언트 - 자원 사이에 필터가 1개가 존재는게 일반적이나, 다수도 가능하다.



2. 구조

1) 단일 필터 구조




2) 다중 필터 구조



3. 인터페이스

- Filter : 클라이언트와 최종 자원 사이의 객체 인터페이스

- ServletRequestWrapper : 필터가 요청을 변경하거나, 응답을 변경한 결과를 저장할 래퍼 클래스

- ServletResponseWrapper : 필터가 요청을 변경하거나, 응답을 변경한 결과를 저장할 래퍼 클래스



4. 용도

- 데이터 인코딩 : 서블릿 doPost 메소드에서 한글 인코딩을 대신 하는 역할

- 세션 데이터 인증 : 로그인 세션 체크

- 이벤트, 공지 등 팝업 추가



5. 예제


* 순서 : html -> filter 클래스 -> servlet 클래스 -> view jsp 페이지


1) 시작이 되는 html 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 적용 예제</title>
</head>
<body>
<form method="post" action="ExampleS.do">
    이름 : <input type="text" name="name">
    <input type="submit" value="확인">
</form> 
</body>
</html>
cs


2) filter 클래스 작성

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
package com.filter;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
/**
 * Servlet Filter implementation class ExampleBFilter
 */
//@WebFilter("/ExampleBFilter")
public class ExampleBFilter implements Filter {
 
    /**
     * Default constructor. 
     */
    public ExampleBFilter() {
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    // doFilter 메소드에서 한글 인코딩을 해줬다.
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
        
        request.setCharacterEncoding("utf-8");
        
        chain.doFilter(request, response);
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
}
cs


3) web.xml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 <filter>
    <filter-name>ExampleBFilter</filter-name>
     <filter-class>com.filter.ExampleBFilter</filter-class>
 </filter>
  
 <filter-mapping>
    <filter-name>ExampleBFilter</filter-name>
    <!-- url-pattern : 같은 웹 애플리케이션 디렉터리 내 웹 컴포넌트에 적용할 때 -->
    <!--                 (ex. /* : 모든 웹 컴포넌트, *.jsp : 디렉터리 내의 jsp페이지에만 적용-->
    <!-- servlet-name : 특정 서블릿에만 적용할 때-->
    <url-pattern>/*</url-pattern>
 </filter-mapping>
cs


4) servlet 클래스 작성

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
package com.servlet;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet implementation class ExampleSServlet
 */
@WebServlet("/ExampleS.do")
public class ExampleSServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExampleSServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {
//        System.out.println("############");
        
        String name = request.getParameter("name");
        
//        System.out.println("name : " + name);
        
        request.setAttribute("name", name);
        
//        System.out.println("after name : " + request.getAttribute("name"));
        
        RequestDispatcher rd = request.getRequestDispatcher("result.jsp");
        
        rd.forward(request, response);
    }
}
cs


5) view 용 jsp 페이지 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>화면 결과 출력 예제</title>
</head>
<body>
    name : ${name}
</body>
</html>
cs


'BackEnd > Java' 카테고리의 다른 글

Java :: PrintWriter 객체 인코딩 오류시  (0) 2016.08.04
Servlet :: 필터로 한글 인코딩 설정하기  (0) 2016.06.18
Java :: Random 함수  (0) 2016.06.05
Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: JDBC DAO 소스  (0) 2016.04.26

1. java.util.Random

new Randon() 을 사용하여 객체 생성

다양한 메소드를 사용하여 원하는 타입의 random 값을 사용 가능

주사위를 던지거나 카드를 섞는 난수를 사용할 때 주로 사용

 

 

종류 

 nextBoolean()

 nextDouble()

 nextBytes(byte[] bytes)

 nextFloat()

 nextGaussian()

 nextInt()

 nextInt(int n)

 nextLong()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.random;
 
import java.util.Random;
 
public class ExampleA_Main {
    public static void main(String[] args) {
    
        Random random = new Random();
        
        // nextBoolean() : true와 false중 랜덤 출력
        System.out.println("nextBoolean() : " + random.nextBoolean());
        System.out.println("nextFloat() : " + random.nextFloat());
        System.out.println("nextInt() : " + random.nextInt());
        // nextInt(int n) : n 이내의 정수를 랜덤으로 출력
        System.out.println("nextInt(10) : " + random.nextInt(10));
        System.out.println("nextDouble() : " + random.nextDouble());
        System.out.println("nextLong() : " + random.nextLong());
    }
}
cs

 

 

2. java.util.Math

double 타입으로 리턴하기 때문에 int로 형을 변환하여 사용 가능

주로 최소값과 최대값을 구할 때 사용,

((int) Math.random() * (최대값 - 최소값 + 1) 수식을 사용하여 최소값 ~ 최대값 범위를 지정

'BackEnd > Java' 카테고리의 다른 글

Servlet :: 필터로 한글 인코딩 설정하기  (0) 2016.06.18
Servlet :: 필터 (Filter)  (1) 2016.06.10
Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: JDBC DAO 소스  (0) 2016.04.26
Java :: 패키지 이름 명명 규칙  (0) 2016.04.02

1. 정의

모든 jsp는 서블릿 컨테이너에 의해서 서블릿으로 변환된다.

서블릿은 자바 프로그램이기 때문에 객체를 선언하여 인스턴스 변수를 개발자 마음대로 정의하여 사용할 수 있으나,

jsp는 서블릿이 상속받는 HttpServletRequest, HttpServletResponse 클래스에 선언된 객체들을 사용해야 한다.

(모든 jsp 파일들은 결국 서블릿으로 변환되기 때문에 = 서블릿이기 때문에)

 

서블릿에서는 직접 인스턴스 변수명을 마음대로 정의 가능하나 jsp는 서블릿으로 이루어져 있기 때문에(하위 단계라고 생각하는게 이해가 빠름) 서블릿에서 상속받은 HttpServletRequest, HttpServletResponse 클래스 안의 객체들을 사용할 수밖에 없다. (인스턴스 변수명이 이미 서블릿 안에서 지정되어 있다는 이야기)

 

별도의 import 없이 자유롭게 사용이 가능하고 스크립트릿 내에서 변수 이름으로 사용해서는 안 된다.

 

 

2. 속성

 범위

선언부

설명

 Page

pageContext

현재 페이지 내

해당 페이지가 클라이언트에 서비스를 제공하는 동안만 유효

 Request

request

클라이언트로부터 요청을 받아 처리하는 동안

( forward, include 이용시 여러 페이지에서 요청 정보가 유지되므로 request 영역의 속성을 여러 페이지에서 공유 가능 )

 Response

response 

클라이언트로 요청을 보내는 동안

request 객체와 반대의 속성

헤더 정보 설정, 오류 발생, 쿠키 추가 등에도 쓰임

 Session

session

한 브라우저 내 세션이 유지되는 동안

1 브라우저당 1 세션이 생성되므로 같은 웹 브라우저 내에서 실행되는 페이지들이 속성을 공유 가능

 Application

application

해당 웹 애플리케이션이 start -> stop 될 때까지

가장 범위가 큼

 

 

- removeAttribute(key) : 해당 정보 제거. key 값으로 등록된 속성을 제거

'BackEnd > Java' 카테고리의 다른 글

Servlet :: 필터 (Filter)  (1) 2016.06.10
Java :: Random 함수  (0) 2016.06.05
Java :: JDBC DAO 소스  (0) 2016.04.26
Java :: 패키지 이름 명명 규칙  (0) 2016.04.02
Servlet :: Servlet(서블릿) 이란?  (0) 2016.04.01

1. phpMyAdmin에 root로 접속한다.

 

 

 

 

2. (생성한 user와 연동할) db를 먼저 생성한다.

 

 

 

db를 생성하면 이렇게 db를 생성했다는 화면이 뜬다.

 

 

3. user를 생성한다.

 

 

왼쪽 메뉴 부분에 mysql > user > 삽입 을 클릭한다.

 

* Host : localhost(본인 컴퓨터에서 접속하므로 왠만하면 localhost로 입력)

  User : 아이디

  Password : 비밀번호, password 함수를 선택하여 암호화를 시킨다.

 

 

4. 계정과 db 연동

 

 

db > 삽입 을 클릭한 뒤,

 

* Host : localhost

  Db : (생성되어 있는 연동할 db 이름)

  User : db와 연동할 계정 id

권한은 전부 Y를 클릭한다.

 

 

5. mysql 재시작

 

 

 

6. 연동한 계정으로 로그인

 

 

+ Recent posts