1. Node.js의 정의

비동기 이벤트 처리 서버사이드 (네트워크 애플리케이션) 개발에 사용되는 소프트웨어 플랫폼.

개발 언어로는 자바스크립트를 사용한다.

내장 HTTP 서버 라이브러리를 가지고 있으므로, 아파치와 같은 웹 서버 어플리케이션이 없이도 동작한다.

비동기 방식이므로 다수의 연결을 동시에 처리 가능하다.

2. Node.js의 논 블로킹 방식


이는 오늘날 OS 스레드가 일반적으로 사용하는 동시성 모델과는 대조적입니다. 스레드 기반의 네트워크는 상대적으로 비효율적이고 사용하기가 몹시 어렵습니다. 게다가 잠금이 없으므로 Node의 사용자는 프로세스의 교착상태에 대해서 걱정할 필요가 없습니다. Node에서 I/O를 직접 수행하는 함수는 거의 없으므로 프로세스는 결과 블로킹 되지 않습니다. 아무것도 블로킹 되지 않으므로 Node에서는 확장성 있는 시스템을 개발하는 게 아주 자연스럽습니다. 


블로킹, 논 블로킹 참조 : http://ozt88.tistory.com/20

3. Node.js의 장점

비동기 I/O 처리 / 이벤트 위주 : Node.js 라이브러리의 모든 API는 비동기식입니다, 멈추지 않는다는거죠 (Non-blocking). Node.js 기반 서버는 API가 실행되었을때, 데이터를 반환할때까지 기다리지 않고 다음 API 를 실행합니다. 그리고 이전에 실행했던 API가 결과값을 반환할 시, Node.JS의 이벤트 알림 메커니즘을 통해 결과값을 받아옵니다.

빠른 속도 : 구글 크롬의 V8 자바스크립트 엔진을 사용하여 빠른 코드 실행을 제공합니다.

단일 쓰레드 / 뛰어난 확장성 :  Node.js는 이벤트 루프와 함께 단일 쓰레드 모델을 사용합니다. 이벤트 메커니즘은 서버가 멈추지않고 반응하도록 해주어 서버의 확장성을 키워줍니다.  반면,  일반적인 웹서버는 (Apache) 요청을 처리하기 위하여 제한된 쓰레드를 생성합니다. Node.js 는 쓰레드를 한개만 사용하고  Apache 같은 웹서버보다 훨씬 많은 요청을 처리할 수 있습니다.

노  버퍼링 : Node.js 어플리케이션엔 데이터 버퍼링이 없고, 데이터를 chunk로 출력합니다.

라이센스 :  Node.js 는 MIT License가 적용되어있습니다.

4. Node.js를 사용하면 좋은 분야

다음과 같은 분야에 Node.js 가 사용된다면 뛰어난 효율성을 달성 할 수 있습니다.


  • 입출력이 잦은 어플리케이션
  • 데이터 스트리밍 어플리케이션
  • 데이터를 실시간으로 다루는 어플리케이션
  • JSON API 기반 어플리케이션
  • 싱글페이지 어플리케이션

https://velopert.com/133 참조


캡슐화(Capsulation)




캡슐화는 목적이 객체의 기능 보호에 있다.

만일 어떤 메소드나 필드가 항상 모두에게 공개되어 있다면, 입력 시킨 값이나 메소드의 내용을 누구나 가져가서 사용할 수 있고, 수정할 수

있게 되므로, 보안에 취약한 형태가 될 수 밖에 없다.

따라서, 외부 객체가 호출하거나 읽고 쓸 수 있는 메소드, 필드의 범위를 접근 제한자를 통해서, setter,getter 메소드를 통해서 정해 줄 수 있는

기능을 가질 필요가 있다.



접근 제한자 (Access Modifier) 




public : 모든 클래스에서 접근 가능한 필드, 메소드.

protected : 자신과, 상속받은 자식 클래스에서만 접근 가능한 필드 메소드.

default : 같은 패키지 내의 클래스에서만 접근 가능한 필드 메소드.

private : 자신만 사용 가능한 필드, 메소드


http://book.naver.com/bookdb/book_detail.nhn?bid=10338797




자바스크립트 언어에 대해 설명해 놓은 책이다.


저자는 MIT 컴퓨터 과학 학위, 공학 학위를 받았다고 한다. 



책 내용이 아주 많고 자세하게 설명되어 있는것 같아서 구매했다.


신판은 6판이지만 먼저 5판을 중고로 구했다. 혹시 필요하게 되면 새로 사야 할 것 같다.



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

[Node.js] Node.js 는 무엇인가?  (0) 2018.08.13
JavaScript 기초 문법 정리 (3)  (0) 2018.06.26
JavaScript 기초 문법 정리 (2)  (0) 2018.06.26
JavaScript 기초 문법 정리 (1)  (0) 2018.06.25


다형성 (polymorphism)


객체 지향 프로그래밍에서, 같은 타입이지만, 다양한 객체를 같은 타입처럼 이용할 수 있는 성질.

하나의 타입 Bread = new Doughnut(); 다른 객체로 대입이 가능하다.

먼저 이러한 성질을 사용하기 위해서는, 인터페이스와 상속의 개념이 꼭 필요하다.

다형성을 위해서 자바에서 갖추고 있는 기능은, 부모 클래스와 인터페이스의 타입 변환이 가능하다는 점이다.

부모 타입 <=== 자식 타입

인터페이스 타입 <== 모든 구현된 클래스(객체)

이 다형성의 효과로 객체를 마치 기계의 부품처럼 사용할 수 있는 장점이 생긴다.

예) 자동차의 타이어는 어떤 타이어든 호환만 된다면 모두 장착 할 수 있는 것과 비슷하다.



다형성과 관련된 부분들


타입 변환 : 같은 타입이지만, 실행 결과가 다양해질 수 있는 객체를 이용할 수 있다는 성질.


하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해줌.


즉 객체를 부품처럼 이용하는 것이 가능해짐.


자식 클래스 타입을 부모 클래스 타입으로 변환하는 것이 가능하기 때문에, 이것이 가능하다.


자동 타입 변환 : 부모 클래스 타입의 변수가 자식 클래스 타입 객체를 참조하면 자동으로 부모 클래스 타입으로 변환이 되는 것.


자동 타입 변환이 일어날 수 있는 이유는, 자식 클래스는 부모 클래스의 특징과 기능을  상속 받아서 만들어졌기 때문에 가능한 것.


또한 상속 계층에서 상위 타입이면 무조건 자동 타입 변환이 일어날 수 있다. (부모가 아니라 2단계 상속 받은 상태라도 변환 가능)


메소드 오버라이딩 : 메소드가 자식 클래스에서 오버라이딩 되었을 경우에는, 자식 클래스의 메소드가 호출된다.


한번 자식 클래스에서 변환된 메소드는 타입 변환 후에도 항상 자식 클래스의 메소드로 호출된다.



메소드 오버로딩 : 메소드 오버로딩은 같은 이름의 메소드가 입력 받는 값에 변화를 주어 동작할 수 있는 가능성을 더 여러가지로


가질 수 있게 해주는 기능이다. 이 역시 다형성의 측면에서 행동하는 기능이라고 생각 할 수 있다.


만일, 오버로딩이 존재하지 않는다면 하나의 이름을 가지는 메소드는 오직 정해진 타입, 갯수의 변수 만을 받을 수 밖에 없는 형태


이기 때문에, 자유도적인 부분에서 상당히 떨어질 수 밖에 없다.



































상속 (Inheritance)


부모 클래스 : 상위, super 클래스라고도 한다.


자식 클래스 : 하위, 파생 클래스라도도 한다.



부모 클래스의 필드와 메소드를 자식 클래스에서 물려받아, 사용 할 수 있는 것을 말한다.


현실과는 다르게 상속의 권한은 자식에게 있다. (Extends)


상속 받은 재산을 자식이 마음대로 사용할 수 있듯이, 자식은 상속받은 필드와 메소드의 내용을 마음대로


변경이 가능하다. (메소드 재정의, 오버라이딩)


부모 클래스 또한, 일부, 또는 클래스 전체를 상속 거부할 수 있게 만드는 기능이 있다.(final)


부모 클래스는, 자식 클래스를 제외한 모든 클래스가 접근을 막게 할 수있다.(protected)


자식 클래스 타입의 메소드나 필드는 부모 클래스 타입의 변수에 대입시에 자동적으로 부모 클래스 타입으로 변환된다.(자동 타입 변환)




상속 : 자식 클래스를 선언할 때, 상속받을 부모 클래스의 이름을 extends 뒤에 기술한다. 다만 다중 상속은 불가능 하므로, 부모 클래스명을


2개 이상 기재하는 것은 안된다.


 부모 클래스

핸드폰 

자식 클래스

갤럭시s8, 아이폰x 



자식 객체를 생성할 때는 반드시 부모 객체가 생성되고, 자식 객체가 생성된다.


따라서 내부적으로는 자식 클래스의 생성자에 super() 라는 생성자 메소드가 자동적으로 첨부되게 된다.


이 메소드는 갤럭시s8이라는 클래스의 부모 클래스가 있다면, 핸드폰이라는 부모 클래스의 생성자를 호출하여 그 객체를 자동으로 생성한다.


만일, 명시적으로 부모 클래스의 생성자를 호출하고 싶다면, (ex 부모 클래스의 생성자가 오버로딩이 되어있을 경우) 따로 작성하면 된다.


ex) super("",'',12)


이 super() 생성자 메소드는 언제나 자식 생성자 메소드 내의 첫 줄에 위치하여야 한다! 그렇지 않으면 컴파일시 에러가 발생한다.



메소드 오버라이딩 : 자식 객체에서 부모 클래스의 메소드를 사용하려는데, 메소드의 내용을 수정하고 싶을 수가 있다.


이런 경우를 위해 만들어진 기능이, 메소드 오버라이딩 기능이다.


자식 클래스를 작성할 때, 부모 클래스의 메소드명은 그대로 가져오고, 메소드 내의 내용만 수정한다.


그리고, 자식 객체를 생성해서 메소드를 호출하면 부모 클래스의 메소드는 숨겨지게 되고, 자식 클래스의 메소드가 호출되어 실행이 된다.


만일 부모 클래스의 메소드를 그대로 호출 해야 할 상황이라면, super.메소드명() 으로 호출하면 사용할 수 있다.




final : final 키워드는 상수를 만들 때도 사용하지만, 클래스와 메소드에 붙여서 선언한다면, 상속이 불가능하게 만드는 효과가 있다.


이는 자식 클래스에서 클래스 전체나 일부 메소드의 내용을 변경(오버라이딩) 하여 사용할 수 없게 만드는 것으로, 특정 클래스가 고정된 작


업만 수행하게 하는 역할을 한다. (최종)



protected : 이 접근 제한자가 붙은  필드 , 메소드, 생성자는 오로지 상속받은 클래스에서만 참조할 수 있다.



자동 타입 변환 :  자식 클래스는 부모 클래스의 필드, 생성자, 메소드를 상속 받은 상태이므로, 다시 부모 클래스의 타입으로 변환이 가능하


다. 라고 생각 할 수 있다. 실제로, 자식 클래스의 필드, 생성자, 메소드는 부모 클래스를 참조하고 있다. (비교연산자 == 체크)


그러므로 실제로 이것이 가능한 것이다. 


ex) Phone phone = galaxys8.call();


이 자동 타입 변환은 상속 계층에서 여러번 상속된 상위 클래스로도 이루어 진다. A-B-C로 상속된 관계라면, C는 B나 A 어떤것으로든 타입 변


환이 가능하다.




















(1) 이진트리의 표현


자식노드, 부모노드의 계산법.


3.3 이진트리의 운행법(Binary Traversal)

트리의 운행 : 트리의 모든 노드를 체계적으로 방문하는 방법.
-트리의 구조를 분석하거나 각 노드에 저장되어 있는 정보를 정해진 순서에 의해 읽어올 때 사용

 : 중순위, 전순위, 후순위, 레벨순위


전순위 (Preorder) : 루트가 노드 A고 이진트리가 있을때, 루트부터 방문하고, 왼쪽 부분트리를 Preorder로 운행하고, 오른쪽 부분트리를 마찬가지로 왼쪽부터 차례로 운행하는 방식.


노드A가 트리의 루트라는 사실만 알 수있음. 선형리스트가 아니기 때문.


Preorder는 언제나 루트부터 방문하게 되는 방식.


역순으로 값을 차례로 모두 push하고 값을 2개 pop하면서 연산자와 계산하고 다시 push and pop하면서 계산을 반복한다. (역순 Postfix notation 이라고 생각하면 간단함.)


중순위(Inoerder) : 왼쪽 부분트리를 먼저 방문하고 다른 상위루트를 방문, 최상단 루트 노드A 를 방문하고 또 오른쪽 부분트리를 또 왼쪽부터 먼저 방문하는 방식.


infix notation의 중위 표기법과 일치하는 결과를 보여줌


후순위(Postorder) : 왼쪽 최하단 노드부터 방문하고 상위로 올라가면서 A를 건너뛰고, 우측 트리도 왼쪽 최하단부터 방문한다. 그리고 가장 마지막으로 노드 A를 방문한다.


스택의 후위표기법(Postfix notation)과 일치하는 결과 -> 값은 push하고 연산자가 나왓을때 값 2개를 pop하여 연산한다.


이진트리의 운행에 대한 부분은 많은 연습을 통해서 트리를 보자마자 운행 순서가 바로 떠오를 수 있도록 하는것이 중요하다.


또한 프로그램 상에서 어떻게 트리의 운행을 구현할 수 있는지 생각해보는 것도 필요함. (스택 or 재귀)




레벨 순위 운행법 (Levelorder) : 작은 레벨부터 방문, 레벨이 같으면 왼쪽부터 방문. ABCDEF... 아주 쉬움


큐의 개념이 적용됨.



포리스트(Forest) : 1개 이상의 트리로 구성된 트리의 집합.


트리가 없으면 포리스트도 없다. 트리가 1개 이상이면 그때 트리의 루트는 포리스트의 루트가 된다. 


트리의 이진트리 변환한 BT가 왼쪽 오른쪽 부분트리가 된다.














자료구조 강의


http://www.kocw.net/home/search/kemView.do?kemId=1085782


2014년 2학기에 강의하신 무료 녹화 강의다.


C언어를 기반으로 강의 하셨으나 다른 언어를 충분히 이해하고 있다면,


개념 자체를 이해하는데는 문제가 없는 강의라고 생각한다.



매우 중요한 부분이므로 자료구조 수업을 들어본 적이 없다면 필히 들어보는것을 추천함.


수업에 사용된 교재는 구매하지 않아서 알 수가 없다..



본 자료는 http://www.kocw.net/에서 참조하였음.

'자료구조, 알고리즘' 카테고리의 다른 글

해시 함수와 해시 테이블  (0) 2018.10.08
[강의노트]이진트리의 운행법  (0) 2018.07.17



이름 짓기, 설명 하기, 시간 예상하기, 함께 일하기, 남의 코드 수정하기.


경험이라고 하기엔 짧은 시간이지만 모두 수긍이 되는 부분들이다.

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

XML을 1.0 버전만 써야 하는 이유  (0) 2018.09.10
정보처리기사 필기 합격!  (0) 2018.08.19

참조 페이지 : http://ndba.egloos.com/tb/2831611


오늘은 JSP에서 테이블 내용을 페이징 처리 하는 방법에 대해 연습해 보았다.



코드는 Color Scripter에서 잘라서 붙이려니, 페이지 내에 문제가 생겨서 통째로 밑에 올리고


위에서는 설명만 적도록 했다.


먼저, 테이블의 내용은 JAVA 클래스를 따로 만들어 메소드를 호출하여 ArrayList에 담아서 불러 오도록 하였다.


메소드 호출하는데 사용한 주요한 변수 2가지는.


1. 현재 페이지의 번호.


2. 페이지당 보여줄 행의 갯수.


로 정했다.


현재 페이지의 번호 currentPage 는 상수 1로 고정하였지만, [다음] 버튼을 누를 시에는 페이지 번호 값이 담긴 파라미터가 넘어 오므로,


그에 해당하는 페이지 번호로 변경 되게 하였다.


페이지당 보여줄 행의 갯수는, pagePerRow 자유롭게 선택해서 정하면 된다.


전체 행의 갯수 rowNumber는 역시 메소드를 따로 만들어 호출해서 값을 받아내어 변수에 담아서 사용하도록 하였다.



페이징 시에 보여줄 버튼은



이런 형태를 가지게 된다.



이전, 다음 버튼부터 설명 하자면,


이전 버튼은 현재 페이지의 번호가 1보다 클 때만 나타나도록 하였다.


다음 버튼은 현재 페이지의 번호가 마지막 페이지의 번호(총 페이지의 갯수 lastPage) 보다 작을 때만 나타나도록 하였다.



1,2,3,4,5...의 넘버링은


for문을 활용하는 것이 좋을 것 같다고 생각하였다.


다만, 페이지가 너무 많아지면 끝도 없이 (ex) 1000,1001,...) 넘버링이 길어지는 문제가 생기는데,


이 부분에 대한 해결책은 더 고민해보아야 할 것 같다.


페이징 하는데 이용한 계산식은,


총 페이지의 갯수  lastPage = (( 모든 행의 갯수 rowNumber - 1) / 페이지당 보여줄 행의 갯수 pagePerRow) + 1 ;


를 이용하여  계산 하였다.


<!-- 2018-07-11 이광재 -->
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ page import = "service.EmployeeDao"%>
<%@ page import = "service.Employee" %>
<%@ page import = "java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>EmployeeList</title>
<style>
.zui-table {
border: solid 1px #DDEEEE;
border-collapse: collapse;
border-spacing: 0;
font: normal 13px Arial, sans-serif;
}
.zui-table thead th {
background-color: #DDEFEF;
border: solid 1px #DDEEEE;
color: #336B6B;
padding: 10px;
text-align: left;
text-shadow: 1px 1px 1px #fff;
}
.zui-table tbody td {
border: solid 1px #DDEEEE;
color: #333;
padding: 10px;
text-shadow: 1px 1px 1px #fff;
}
</style>
</head>
<body>
<h3>직원 명부</h3>
<table class="zui-table">
<tr>
<th>no</th>
<th>name</th>
<th>age</th>
<th>주소입력</th>
<th>점수보기</th>
<th>삭제</th>
<th>수정</th>
</tr>
<%
int currentPage = 1;
if(request.getParameter("currentPage") != null) {
currentPage = Integer.parseInt(request.getParameter("currentPage")); // String 타입으로 넘어온 "currentPage" 변수의 타입을 int로 변환하여 저장한다.
}
int pagePerRow = 5;
EmployeeDao employeeDao = new EmployeeDao();
ArrayList<Employee> list = employeeDao.selectEmployeeByPage(currentPage, pagePerRow);
System.out.println(list + " : 01 list check");
int rowNumber = employeeDao.selectRowNumber();
for(int i=0; i<list.size(); i++) {
%>
<tr>
<td><%=list.get(i).getEmployeeNo()%></td>
<td><a href="./EmployeeAddrList.jsp?no=<%=list.get(i).getEmployeeNo()%>"><%=list.get(i).getEmployeeName()%></a></td>
<td><%=list.get(i).getEmployeeAge()%></td>
<td><a href="./InsertEmployeeAddrForm.jsp?no=<%=list.get(i).getEmployeeNo()%>">주소입력</a></td>
<td><a href="./EmployeeAndScore.jsp?employeeNo=<%=list.get(i).getEmployeeNo() %>">점수보기</a></td>
<td><a href="./DeleteEmployeeAction.jsp?no=<%=list.get(i).getEmployeeNo()%>">삭제</a></td>
<td><a href="./UpdateEmployeeForm.jsp?no=<%=list.get(i).getEmployeeNo()%>">수정</a></td>
</tr>
<%
}
%>
</table>
<%
if(currentPage>1) { //currentPage 값이 1보다 클때만 실행
%>
<a href="./EmployeeList.jsp?currentPage=<%=currentPage-1%>">이전</a> <!-- 이전 페이지 버튼 클릭시 "currentPage"변수로 currentPage-1의 값을 전송 -->
<%
}
/* 마지막 페이지의 번호 구하기(페이지의 총 갯수는 총 행의 갯수 -1에서 페이지당 보여줄 행의 수를 나눈 몫에다가 1을 더한다.)
예) (총 행 갯수 (25 - 1) / 페이지당 보여줄 행의수 5 = 5) +1 = 마지막 페이지의 번호는 5 --> 행 갯수와 PPR이 딱 나누어 떨어질 때
예) (총 행 갯수 (27 - 1) / 페이지당 보여줄 행의수 5 = 5) +1 = 마지막 페이지의 번호는 6 --> 행 갯수와 PPR이 딱 나누어 떨어지지 않을 때
*/
int lastPage = ((rowNumber - 1) / pagePerRow) + 1 ;
System.out.println(rowNumber + " : rowNumber called");
System.out.println(pagePerRow + " : pagePerRow called");
System.out.println(lastPage + " : lastPage called");
/* if ((employee.getRowNumber()-1) % pagePerRow !=0) { // rowNumber-1의 값과 페이지당 행의 수와의 나머지가 1이 아닐때
lastPage++;
}
*/
int pageNum = 0;
for(int i=1; i<=lastPage; i++) {
%>
<a href="./EmployeeList.jsp?currentPage=<%=i%>">[<%=i%>]</a>
<%
}
if(currentPage<lastPage) { /* 현재 페이지 넘버가 마지막 페이지 넘버보다 작아졌을때만 실행. */
%>
<a href="./EmployeeList.jsp?currentPage=<%=currentPage+1%>">다음</a> <!-- 다음 페이지 버튼 클릭시 "currentPage"변수로 currentPage+1의 값을 전송 -->
<%
}
%>
<br><br>
<a href = "./index.jsp">메인화면으로..</a>
</body>
</html>


+ Recent posts