19.04.26 관계형 데이터베이스란?

Back-End/Data Base 2019. 4. 26. 20:43

-관계형 데이터 베이스란?-

 

데이터를 2차원 표를 사용해 관리하는 데이터베이스

관계형 데이터베이스의 가장 큰 이점은 사람들이 자연스럽고 직관적으로 이해하기 쉬운 형식으로 데이터 관리를 할 수 있다는 점이다.

 

 

 

-데이터베이스에서 수행할 수 있는 데이터 조작-

 

 

  1.검색

 

  2.신규 데이터 등록

 

  3.기존 데이터 갱신(수정)

 

  4.기존 데이터 제거

 

 

 

 

-관계형 데이터베이스의 이점-

 

프로그래밍 언어를 사용하지 않아도 데이터를 조작할 수 있다.

이것 때문에 데이터베이스 사용자층이 단숨에 넓어지게 되었다.

그리고 이것을 가능하게 한 것이 관계형 데이터베이스에 있는 'SQL'이라는 언어이다.

 

 

 

-SQL (Structured Query Language)-

 

관계형 데이터베이스가 데이터를 조작하기 위해 준비한 언어.

SQL은 4가지 기본 조작에 대응하는 명령어가 있다.

 

 

  1. SELECT (검색)

 

  2. INSERT (등록)

 

  3. UPDATE (갱신)

 

  4. DELETE (제거)

 

 

 

 

-DBMS와 데이터베이스의 차이-

 

데이터베이스의 기능을 제공하는 소프트웨어를 'DBMS (DataBase Management System)' 이라고 한다.

데이터베이스는 기능이나 구조를 나타내는 추상적인 개념이고,

DBMS는 그것을 실현하기 위해 작성된 구체적인 소프트웨어를 가리킨다.

따라서 Oracle나 MySQL 같은 제품은 DBMS이며 데이터베이스는 아니다.

 

 

 

-SI(System Integration)-

 

데이터베이스와 여러가지 소프트웨어가 같이 조합해서 시스템을 구축하는 작업 과정

사용되는 소프트웨어는 크게 애플리케이션, 미들웨어, 운영체제로 구분할 수 있다.

 

 

 

-소프트웨어의 계층성-

 

 

1. 애플리케이션 : 업무용 기능을 가진 프로그램된 소프트웨어, 사용자가 가장 빈번하게 조작하는 소프트웨어.

 

 

2. 미들웨어 : 중간 소프트웨어<-- DBMS가 위치한다.

 

 

3. 운영체제 : 시스템을 동작하게 하기 위한 일종의 토대가 되는 기능을 제공하는 소프트 웨어

 

 

:

19.04.26 JSP 페이지 디렉티브, 페이지 스크립트 요소 (동영상 5강~8강)

Back-End/JSP 2019. 4. 26. 14:44

- JSP 페이지 디렉티브 -



속 성

 설 명

기본값

language

JSP 스크립트 코드에서 사용되는 프로그래밍 언어를 지정한다.
    JSP 2.1 버전까지는 스크립트 언어로서 자바만을 지원하고 있다. 

java 

 contentType

JSP가 생성할 문서의 타입을 지정한다. 

 text/html

 import

JSP 페이지에서 사용할 자바 클래스를 지정한다. 

 

 session

JSP 페이지가 세션을 사용할지의 여부를 지정한다.
          "true" 일 경우 세션을 사용하고 "false"일 경우 세션을 사용하지 않는다. 

 true

 buffer

JSP 페이지의 출력 버퍼크기를 지정한다. 

"none" 일 경우 출력버퍼를 사용하지 않으며, "8kb" 라고 입력할 경우 8킬로바이트
         크기의 출력 버퍼를 사용한다.

 최소 8kb

 autoFlush

출력 버퍼가 다 찼을 경우 자동으로 버퍼에 있는 데이터를 출력 스트림에 보내고
            비울지의 여부를 나타낸다. "true" 일 경우 버퍼의 내용을 웹 브라우저에 보낸 후
            버퍼를 비우며, "false" 일 경우 에러를 발생시킨다. 

 true

 info

JSP 페이지에 대한 설명을 입력한다. 

 

 errorPage

JSP 페이지를 실행하는 도중 에러가 발생할 때 보여줄 페이지를 지정한다. 

 

 isErroePage

 현재 페이지에 에러가 발생될때 보여지는 페이지인지의 여부를 지정한다.
              "true"일 경우 에러페이지이며, "false"일 경우 에러 페이지가 아니다.

false 

 pageEncoding

JSP 페이지 자체의 캐릭터 인코딩을 지정한다.  

 




-JSP의 형식-


 

  <%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%> //jsp 페이지의 필수적인 요소


  page language=사용할 언어
  contentType=사용할 형식
  charset=문자셋


  <%
  안에 입력되면 language에 해당되는 언어로 인식됨.
  %>






-에러 코드 예제-


JSP 에서는 위쪽 형식에 <% errorPage="Error.jsp" isErrorPage="true"%> 코드를 붙여서 에러표시를 한다.



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
<%@page import="java.util.Date" %>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.util.Date" errorPage="Error.jsp" isErrorPage="true"%>
 
    
<!DOCTYPE html html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/htm14/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content ="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
나 화면에 보여지니?
 
<%
 
int sum = 10/0;//에러코드를 작성 어떤수를 0으로 나눌수가 없기 때문에 에러가 뜬다.
 
%>
 
</body>
</html>
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
 
    에러 페이지 입니다.
 
</body>
</html>
cs




-스크립트릿<%! %>-


스크립트릿은 가장 일반적으로 JSP 페이지에서 많이 쓰이는 스크립트 요소로
주로 프로그래밍의 로직을 기술할 때 많이 쓰인다.


스크립트릿에서 선언한 변수는 JSP 페이지가 서블릿으로 변환될때
지역변수로 사용된다. 



  <%!
   자바 코드 삽입

  %>





-선언문<%! %>-


선언문은 일반적으로 JSP 페이지에서 자바의 멤버변수 또는
멤버 메소드로 사용하고자 할때 주로 사용된다.


선언문의 변수는 서블릿으로 변환될 때 멤버변수로 변환되고
선언문에서의 메소드는 서블릿에서 메소드로 만들어진다.



 

  <%!

   자바 코드 삽입

  %>





-표현식 <%= %>-


표현식은 일반적으로 JSP페이지에서 자바의 System.out.println()과 유사하게 사용된다.
데이터 출력을 할때 주로 사용되는 프로그래밍의 로직 기술이다.


 

  <%=
   자바 코드 삽입

  %>





-예제 및 출력 결과-


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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!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=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
    <h2>화면에 구구단을 출력하시오</h2>
 
 
    <%
        //자바코드는 <%안쪽에 적기, <%=는 브라우저에 표시될 값
        for (int i = 2; i < 10; i++) {
 
            for (int j = 1; j < 10; j++) {
    %>
    <%=i%>
    +
    <%=j%>
    =
    <%=* j%>
    <%
        }
    %>
    <br>
    <%
        }
    %>
 
 
</body>
</html>
cs

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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!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>Insert title here</title>
</head>
<body>
 
    <h2>화면에 구구단을 출력하시오</h2>
  //위에 코드와 같은 값이 출력됨 (이게 더 간단함)
    <%
        //자바코드는 <%안쪽에 적기, <%=는 브라우저에 표시될 값
        for (int i = 2; i < 10; i++) {
            for(int j = 1; j < 10; j++){
                
                out.write(i+ " * " + j + " = " +i*j); //out.write는 <%= 와 동일한 뜻을 가진다.
                
            }
        }
            
%>
 
 
 
</body>
</html>
cs


  <참고>


  JSP 파일을 콘솔창에 출력이 되도록 컴파일을 해야 jsp.java 파일과 jsp.class 파일이 추가가 된다. 




-예제-


선언문- <%만쓰면 메소드 안에서 문자만 출력이 가능하기 때문에  메소드 안에 메소드가
           선언이 될수 없어, <%!를 쓰면 멤버 메소드로 생성이 되게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
 
    <%!public void inCrement() {
 
    }%>
 
    <%!int a = 10//멤버 메소드내에서 만들어짐(멤버변수임)%>
 
    <%
        int a = 100//서비스 메소드내에서 만들어짐 (지역변수임) 따라서 2개가 중복이 안됨
    %>
 
 
 
</body>
</html>
cs


:

19.04.26 JSP 기본 문법 (교재)

Back-End/JSP 2019. 4. 26. 10:24

-JSP-


스크립트의 요소란 JSP 프로그래밍에서 사용되는 문법의 표현 형태.
JSP에서는 동적인 페이지를 생성하기 위해서 다양한 형태를 제공하여 각각 필요한
곳에 적절히 사용할 수 있도록 하고 있다.




-JSP 스크립트 요소-


 

  1. 선언문


  2.스크립트릿


  3.표현식


  4. 주석




-예제 및 출력 결과-


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
<%@ page contentType="text/html; charset=EUC-KR"%>
<html>
<title>JSP스크립트 Example</title>
<body>
    <h1>Script Example</h1>
    <%!String declaration = "Declaration";%>
    <%!public String decMethod() {
        return declaration;
    }%>
    <%
        String scriptlet = "Scriptlet";
        String comment = "Comment";
        out.println("내장객체를 이용한 출력 : " + declaration + "<p>");
    %>
    선언문의 출력1 :
    <%=declaration%><p>
        선언문의 출력2 :
        <%=decMethod()%>
    <p>
        스크립트릿의 출력 :
        <%=scriptlet%>
    <p>
        <!-- JSP 주석부분 -->
        <!-- JSP 주석 1: <%=comment%>-->
    <p>
        <%-- JSP 주석 2<%=comment%>--%>
        <%
            /* 주석
            (여러줄 주석)
            */
        %>
        <%//주석(한줄 주석) %>
    
</body>
</html>
cs





-이클립스와 브라우저창에서 각각 [페이지 소스 확인]-


브라우저에서의 [페이지 소스보기]는 HTML, Javscript, CSS 코드만 보입니다.

JSP와 같은 서버 스크립트(asp, php, jsp) 들의 코드는 서버(톰캣) 에서 동적으로 처리가 되고

처리된 내용들을 브라우저로 응답을 하기 때문에 클라이언트의 브라우저에서는 보이지 않습니다.


(지금 이 예제는 html로 만들었기 때문에 브라우저와 이클립스에서 확인한 [페이지 소스 확인]의 값이 동일하다.)







-선언문-


JSP 프로그램의 스크립트 요소 중 선언문은 JSP에서 사용될 변수나 메소드를 선언할 수 있는
영역의 요소를 의미합니다.
jsp 페이지 내에서 변수 및 메소드를 선언을 하고 선언된 변수나 메소드를 이용하여
필요한 동적인 HTML 코드를 생성하는데 사용한다.

하지만 스크립트 요소중에서 선언문은 잘 사용되지 않는다.

왜냐하면 jsp 페이지에서 선언된 메소드는 자신의 페이지에서만 반복적으로 사용 할 수가 있고 다른

jsp 페이지에서는 사용 할 수 없기 때문에 차라리 반복적으로 사용할 기능의 메소드가 필요하다면

자바 파일로 만들고, 모든 jsp 페이지에서 참조하여 사용하면 된다.

멤버변수 : 선언문에서 선언된 변수.



 

  ------선언문(Declaration)의 문법------


  <%!
   멤버변수 및 메소드를 선언하는 영역
  %>




 

  ------메소드(method) 문법------


  <%!
   String name = "Korea";
   public String getName() {
   return;
   }
  %>




-예제 및 출력-


team 변수는 늦게 선언이 되었지만 클래스 내부에 있는 멤버변수이기 때문에 전역변수인 name 변수를 참조할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
<%@ page contentType="text/html; charset=EUC-KR"%>
<h1>Declaration Example1</h1>
<%
    String name = team + "Fighting!!!"//name 보다 늦게 선언이 되었지만 team이라는 변수의 값을 참조하고 있다.
%>
 
<%!
    String team = "Korea";
%>
출력되는 결과는 ? <%=name%>
    
cs

-예제 및 출력 결과-

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page contentType="text/html; charset=EUC-KR"%>
<h1>Declaration Example2</h1>
<%!int one;
    int two = 1;
 
    public int plusMethod() {
        return one + two;
    }
 
    String msg;
    int three;%>
 
one 와 two의 합은 ?
<%=plusMethod()%><p>
    String msg의 값은 ?
    <%=msg%>
<p>
    int three의 값은 ?
    <%=three%>
cs


 

 

 

 

 


 

-스크립트릿(Scriptlet)-


가장 일반적으로 많이 사용되는 스크립트 요소로 jsp 페이지가 서블릿으로 변환되고
요청될 때 jspService (Tomcat 기준으로 설명) 메소드 안에 선언이 되는 요소입니다.
스크립트릿은 선언문과 달리 선언된 변수는 지역 변수로 선언이 되고 메소드 선언은 할 수가 없습니다.
변수를 선언할 수 있는 영역이지만 멤버 변수가 아니라 지역 변수라는 차이점이 있다.


 

  ------스크립트릿 문법------


  <%
   이곳에 필요한 자바코드를 삽입합니다. (지역 변수 선언, for, while, if 등...)
  %>


 

 

-예제 및 출력결과-

 

1
2
3
4
5
6
7
8
9
10
<%@ page contentType="text/html; charset=EUC-KR"%>
<h1>Scriptlet Example1</h1>
<%!int one;
    String msgOne;%>
<%
    int two = 31;
    String msgTwo = "Scriptlet Example";
%>
<%=two + " : " + msgTwo%><br />
<%=application.getRealPath("/")%> //현재 jsp파일의 경로를 출력하는 메소드
cs

 

 

-예제 파일 서블릿 코드 (jsp -> jsp.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
/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.40
 * Generated at: 2019-04-26 13:50:13 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;
 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
 
public final class scriptlet1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
 
    int one;      //선언문에서 선언한 변수들 (멤버변수)
    String msgOne;
  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();
 
  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
 
  private static final java.util.Set<java.lang.String> _jspx_imports_packages;
 
  private static final java.util.Set<java.lang.String> _jspx_imports_classes;
 
  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }
 
  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
 
  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }
 
  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }
 
  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }
 
  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }
 
  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }
 
  public void _jspInit() {
  }
 
  public void _jspDestroy() {
  }
 
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
 
    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }
 
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
 
 
    try {
      response.setContentType("text/html; charset=EUC-KR");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  nulltrue8192true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
 
      out.write("\r\n");
      out.write("<h1>Scriptlet Example1</h1>\r\n");
      out.write('\r');
      out.write('\n');
 
    int two = 31;                       //스크립트릿에서 선언한 변수들 (지역변수)
    String msgTwo = "Scriptlet Example";
 
      out.write('\r');
      out.write('\n');
      out.print(two + " : " + msgTwo);  //표현식으로 출력된 JSP 코드들
      out.write("<br />\r\n");
      out.print(application.getRealPath("/"));
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
 
 
 
cs

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-jsp 페이지가 실행될 때 서블릿 코드로 변환이 되는 위치-

 

 

  Tomcat에서 실행을 했을 때와는 다른 위치에 만들어 진다.

  application 객체의 getRealPath("/") 메소드를 통해서 이클립스로 실행시 실질적으로 실행되는 JSP 코드가 있는 위치

  (C:\Users\hansub\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\) 파악을 한 후에 이 위치에서

  두 단계 상위로 올라가면 (C:\Users\hansub\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0)

  work 폴더에서 8단계 하위로 들어가면 서블릿 코드로 변환된 소스를 찾을수 있다.

 

  jsp 페이지가 서블릿 코드로 변환되는 소스는 개발시에 상당히 중요하다.

  디버깅 작업을 할 때 서블릿 코드가 참조되는 경우가 많기 때문에 반드시 이 위치를 알아놓아야 한다!!

 



 


-표현식-


표현식은 말 그대로 동적인 jsp 페이지를 브라우저로 표현을 하기 위한 요소입니다.
표현식은 변수를 출력하거나 메소드의 결과 값을 브라우저에 출력 할 수 있습니다.
스크립트릿 코드 내에서 out이라는 내장객체를 통해서 브라우저에 출력도 가능합니다.
그리고 표현식에서는 스크립트릿과 달리 변수나 메소드를 출력하고 할 때는 세미콜론(;)은
표기하지 않습니다.
내부적으로 서블릿(Servlet) 코드로 변환될 때 자동적으로 세미콜론이 붙여지기 때문입니다.

그리고 결과로만 출력을 할 수 있고, 조건적인 문장은 (if/else)는 표현식으로는 사용 할 수 없다.

그러나 삼항 연산자는 조건 검사의 결과 값을 리턴하기 때문에 표현식에서 사용 할 수 있다.

 

  ------표현식 문법------


  <%=변수 혹은 메소드%>


 

 

 


-예제 및 출력 결과-

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html; charset=EUC-KR"%>
<h1>Expression Example1</h1>
<%!String name[] = { "Java""JSP""Android""Struts" };%> //문자배열 선언 및 값 할당
<table border="1" width="200"> //border은 테이블 외곽선의 두께, width는 테이블 칸의 길이 
    <%
        for (int i = 0; i < name.length; i++) { //문자의 길이만큼 루프돌려 문자 하나씩 출력
    %>
    <tr>
        <td><%=i%></td>
        <td><%=name[i]%></td>
    </tr>
    <%
        }
    %>
</table>
cs

 

-예제 및 출력 결과-

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html; charset=EUC-KR"%>
<h1>Expression Example2</h1>
<%
    java.util.Date date = new java.util.Date();
    int hour = date.getHours(); //Date 클래스에서 getHours() 메소드를 사용하여 시간(hour) 값만 반환을 한다.
    int one = 10;
    int two = 12;
%>
<%!public int operation(int i, int j) {
        return i > j ? i : j;
    }%>
지금은 오전일까요 오후일까요?
<%=(hour < 12) ? "오전" : "오후"%><p>
    one 와 two 둘 중에 큰 숫자는?
    <%=operation(one, two)%>

cs

 


-주석-


프로그램에 직접적인 영향을 미치지는 않지만 개발자들이 소스 분석 내용 및
파일 설명 처리를 위해서 없어서는 안 될 꼭 필요한 요소.


 

  ------HTML 형식 주석------


  <!-- Fighting <%=name%> -->




 

  ------JSP 형식 주석------


  <%-- Fighting <%=name%> --%>




 

  ------스크립트 형식 주석------


  <% /*주석...여러 줄 주석 및 부분 주석)*/ %>


  <% //주석....(한줄 주석)%>


 

 

 

-예제 및 출력 결과-

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<h1>Comment Example1</h1>
<%
    String name = "Korea";
%>
<!-- 주석 부분입니다. '소스보기'에서 보이지요 -->
<%--
    이 부분은 jsp 페이지에서만 보이고 '소스보기'를 해도 보이지 않습니다.
    브라우저에 보내지 않는 문장입니다.
--%>
<!-- <%=name%> 주석에서도 동적인 변수은 가능하지만 출력은 되지 않는다. -->
<%=name/* 표현식에 주석 부분 입니다 */%>
Fighting!!!
 
cs

 


 

:

19.04.25 SQL 예제

Back-End/Data Base 2019. 4. 26. 01:30

[문제] 아래 보기의 [판매실적] 테이블을 똑같이 만드는 SQL 문(단, 기본키는 판매액으로 설정)

서울지역에 한하여 판매액 내림차순으로 지점명과 판매액이 검색되는 SQL문을 작성하시오.

(출처-기사책에 나온문제 업그레이드)

 

[판매실적] 테이블

 

 도시

 지점명

 판매액

 서울

 강서지점

158 

 대전

 대전지점

165

 서울

 강북지점

168

 광주

 광주지점

197

 서울

 강동지점

200

 서울

 강남지점

330

 

 

1. 테이블 생성 코드

 

(빨간색은 오류 = 실수로 기본키를 중복값으로 입력했기 때문...)

기본키는 튜플을 식별할수 있는 키여야만 하기 때문에 중복값이 오면 에러가 발생하게 된다. (개체무결성 원칙)

 

 

 

 

 

2. 테이블 생성 및 검색

 

 

 

 

3. 원하는 자료 검색

 

 

 

 

[문제] 아래 보기의 [학생] 테이블을 똑같이 만드는 SQL 문(단, 기본키는 학번으로 지정, 연락처를 제외한 모든 속성은 NULL값이 오지못하게)

연락처의 번호가 '7588'로 끝나는 학생의 성명과 연락처, 학번을 검색하시오. (출처-기사책에 나온문제 업그레이드)

 

 학번

성명

학년 

수강과목 

점수 

 연락처

 161017

 최길동

 4

컴퓨터

 75

 625-7588

 172020

 김길동

 2

 운영체제

 92

NULL

 181010

 이철준

 3

 컴퓨터

 80

 432-1234

 181533

 이영진

 3

 산업공학

 90

 242-4461

 190111

 김철수

 1

 정보통신

 85

 234-4567

 190223

 박태인

 1

 데이터베이스

 88

 245-2151

 

 

 

1. 테이블 생성 코드

 

 

 

 

2. 테이블 생성 및 검색

 

 

 

 

3. 연락처를 제외한 다른속성이 NULL값이 오는지 확인 (NULL 값 삽입불가)

 

 

 

 

4. 원하는 자료 검색

 

:

19.04.25 데이터베이스란?

Back-End/Data Base 2019. 4. 26. 01:05

- 데이터 베이스의 기본 기능 -

 

 

  1. 데이터의 검색과 갱신

 

  2. 동시성 제어

 

  3. 장애 대응

      ㄴ3-1 데이터 다중화 : 데이터를 한 곳이 아니라 복수의 장소에 분산해서 유지

  ㄴ3-2 백업 : 데이터 소실이 발생했을 때 데이터를 복원하는 방법

 

  4. 보안

 

 

 

 

- 데이터베이스의 종류 -

 

 

  계층형 데이터베이스

 

  데이터를 계층 구조로 관리하는 데이터베이스.

  조직도나 전체 구조도를 상상하면 이미지가 쉽게 잡힌다.

 

  관계형 데이터베이스

 

  2차원 표 형식으로 데이터를 관리하는 데이터베이스.

  가장 주류를 이루고 있다.

 

  객체지향 데이터베이스와 XML 데이터베이스

 

  각각 '객체'와 'XML'이라는 형식으로 데이터를 관리하는 데이터베이스.

 

  NoSQL 데이터베이스

 

  관계형 데이터베이스에 있는 기능 일부를 버려서 성능을 높인 데이터베이스.

  대량의 데이터를 고속으로 처리해야 하는 웹 서비스와 잘 맞아서 최근 자주 이용.

 

 

XML :인터넷 웹페이지를 만드는 HTML을 획기적으로 개선하여 만든 언어이다.

  홈페이지 구축기능, 검색기능 등이 향상되었고, 웹 페이지의 추가와 작성이 편리해졌다.

:

19.04.25 웹 프로그래밍의 이해

Back-End/JSP 2019. 4. 25. 15:42


- 용어정리 -



클라이언트 :  네트워크에서 정보를 요구하는 쪽



서버 : 요구받은 정보를 제공하는 쪽의 컴퓨터



요청(request) : 클라이언트에서 서버로 정보를 요구하기 위해 보내는 메시지. GET방식과 POST방식이 있습니다.



응답(response) : HTTP에서 요구된 메시지에 대한 응답, HTML, 이미지 등의 응답이 내용이 됩니다.



동적 페이지 (동적 콘텐츠) : 콘텐츠를 동적으로 생성하는 페이지, 웹페이지들을 적절한 처리를 통해서 이미지를 배치해서 다양한 요구에 부합하도록 만들어진 페이지



WWW : 월드 와이드 웹의 줄임말. HTML로 작성된 홈페이지의 데이터는 인터넷에서 상호 링크하여 복잡한 컴퓨터 네트워크를 형성하고 있다. 마치 거미집 처럼 복잡하게 접속되어 있어서 Worldwide(세계적인) Web(거미집)이라고 불리게 되었다.



게이트 웨이 : 네트워크에서의 게이트웨이는 현재 사용자가 위치한 네트워크(정확히는 세그먼트-segment)에서 다른 네트워크(인터넷 등)로 이동하기 위해반드시 거쳐야 하는 거점을 의미한다.



세그먼트 : 메모리 관리 방식의 하나로, 프로그램이나 데이터를 세그멘트 또는 섹션이라는 가변 크기로 관리하는 방법이다.




CGI (Common GateWay Interface) : 월드 와이드 웹(www) 서버와 백 엔드 프로그램(게이트웨이) 사이에서 정보를 주고받는데 사용되는 인터페이스.CGI의 규약을 준수한다면 어떠한 언어도 사용 가능하다는 것이 CGI의 장점.



프로세스 : 프로그램이 실행중인 상태



스레드 : 컴퓨터 프로그래밍에서 어떤 프로세스 도는 프로그램의 일부분이 되는 프로세스. 은행을 예로 들면 프로세스는 은행이고, 스레드는 은행 안에 있는 각각의 창구



스크립트 언어 : 어떤 일을 수행하는 부분 코드들.



확장 CGI : 전통적인 OGI 방식의 단점들을 보완한 기술들이 확장 CGI로 발전. 확장 CGI는 매번 프로세스를 생성하는 방식이 아니고, 동일한 프로그램에 

              대해서는 하나의 프로세스를 생성한 후 여러 개의 스레드 방식으로 요청이 처리되는 방식이기 때문에 시스템의 부하를 줄일 수 있습니다.



- 확장 CGI의 종류 -


 

  ASP (Acive Server Page) : 비주얼 베이직이라는 언어에서 사용되는 문법들을 사용하여 동적 콘텐츠를 만들어 내기 위한 기술.

                                    하지만 특정 웹 서버와 OS(운영체제)에서만 동작한다는 것이 단점.


  PHP (Personal HomePage Tools, Professional Hypertext Preprocessor) : ASP와는 달리 특정 영역에서만 동작하지 않고, 작은 명령어들로 프로그래                                                                                               밍이 가능하고 편리성이 많다, 하지만 복잡한 요구들에 대한 기능 미약


  Servlet / JSP : Servlet (Server + Applet) : 확장 CGI 방식으로 Java라는 언어를 기반으로 하여 동적인 콘텐츠를 생성하는 기술 제공


  JSP (Java Server Pages) : JSP 또한 Java라는 언어를 기반으로 하여 만들어진 것이지만, ASP, PHP처럼 HTML 태그 사이 중간에 동적인 콘텐츠

                                  생성을 담당할 Java 코드가 들어가 있는 형태




  Servlet 와 JSP의 차이 : JSP는 HTML에 포함되어 프로그램이 만들어지는 것, 서블릿은 자바 프로그램의 외형에 웹 프로그래밍 요소가 포함된 것.

                               그런점으로 볼때 HTML 태그에 포함된 JSP는 브라우저에 표현이 될 부분에 유용하고,

                               서블릿은 브라우저에 표시될 필요가 없지만, 내부적으로 처리되어야 할 부분에 보다 유용하게 사용할 수 있다.



이식 : 특정한 시스템에서 개발한 소프트웨어를 다른 시스템에 설치해서 동작하게 하는 작업



서버 & 클라리언트 측 스크립트 : 서버에서 실행하는것을 서버 스크립트, 사용자의 브라우저에서 실행하는 것을 클라이언트 스크립트라고 한다.



HTML : 웹 문서를 만들기 위하여 사용하는 기본적인 웹 언어의 한 종류이다. 하이퍼텍스트를 작성하기 위해 개발되었다. 



자바빈즈 : 기본적으로 데이터를 저장하기 위한, 멤버변수와, 데이터를 컨트롤하는 setter/getter 메소드를 가지고 있는 클래스를 일컫는 말입니다.




-JSP 서버 처리과정-



:

JSP 책 학습일정

Back-End/JSP 2019. 4. 25. 13:46


JSP 책 학습일정.xlsx



:

19.04.24 NIO 기반 입출력 및 네트워킹-2

Back-End/Java 2019. 4. 25. 01:50

-  서버소켓 채널과 소켓 채널의 용도 -


이 두 채널은 IO의 ServerSocket과 Socket에 대응되는 클래스로, IO가 버퍼를 사용하지 않고

블로킹 입출력 방식만 지원한다면 ServerSocketChannel, SocketChannel은 버퍼를 이용하고 블로킹과 넌블로킹 방식을 모두 지원한다.

사용방법은 ServerSocketChannel은 클라이언트 SocketChannel의 연결 요청을 수락하고 통신용 SocketChannel을 생성한다.


서버를 개발하려면 ServerSocketChannel 객체를 얻어야 한다.

ServerSocketChannel은 정적 메소드인 open( )으로 생성하고, 블로킹 방식으로 동작시키기 위해 configureBlocking(true)

메소드를 호출한다.

기본적으로 블로킹 방식으로 동작한다.

포트에 바인딩하기 위해서는 bind( ) 메소드가 호출되어야 한다.

포트 정보를 가진 InetSocketAddress 객체를 매개값으로 주면 된다.

포트 바인딩까지 끝났다면 ServerSocketChannel은 클라이언트 연결 수락을 위해 accept( ) 메소드를 실행해야 한다.

accept( ) 메소드는 클라이언트가 연결 요청을 하기 전까지 블로킹되기 때문에 UI 및 이벤트를 처리하는 스레드에서 accept( ) 메소드를

호출하지 않도록 한다.

클라이언트가 연결 요청을 하면 accept( )는 클라이언트와 통신할 SocketChannel을 만들고 리턴한다.


 

  블로킹이란?

  스레드가 대기 상태가 된다는 뜻이다.


  바인딩이란?

  컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것


  포트란? 

  모뎀과 컴퓨터 사이에 데이터를 주고받을 수 있는 통로 




 

  SocketChannel socketChannel = serverSocketChannel.accept( );




연결된 클라이언트의 IP와 포트 정보를 알고 싶다면 SocketChannel의 getRemoteAddress( ) 메소드를 호출해서

SocketAddress를 얻으면 된다. 실제 리턴되는 것은 InetSocketAddress 인스턴스이므로 타입 변환할 수 있다.


 

  InetSocketAddress socketAddress = (InetSocketAddress) socketChannel.getRemoteAddress( );




InetSocketAddress에는 다음과 같이 IP와 포트 정보를 리턴하는 메소드들이 있다.


리턴 타입

 메소드명(매개 변수)

 설명

 String

 getHostName( )

 클라이언트 IP 리턴

 int

 getPort( )

 클라이언트 포트 번호 리턴

 String

 toString( )

 "IP : 포트번호" 형태의 문자열 리턴



더 이상 클라이언트를 위해 연결 수락이 필요 없다면 ServerSocketChannel의 close( ) 메소드를 호출해서 포트를 언바인딩 시켜야 한다.

그래야 다른 프로그램에서 해당 포트를 재사용할 수 있다.


 

  serverSocketChannel.close( );





- 예제 및 출력 결과 -


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
package com.hs.chap19;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
 
public class ServerExample {
    public static void main(String[] args) {
        ServerSocketChannel serverSocketChannel = null;
 
        try {
            serverSocketChannel = ServerSocketChannel.open(); // open() 메소드를 사용해 서버 소켓 채널 얻기
            serverSocketChannel.configureBlocking(true); // 블로킹 방식으로 동작시키기 위해 호출한다. 이걸 안써도 기본적으로 블로킹 방식으로 동작하지만 //명시적으로
                                                            // 설정하는 이유는 넌블로킹과 구분하기 위해서이다.
            serverSocketChannel.bind(new InetSocketAddress(5001)); // bind()메소드의 매개값으로 5001번 포트를 줘서 바인딩 시킨다.
            while (true) {
                System.out.println("[연결 기다림]");
                SocketChannel socketChannel = serverSocketChannel.accept(); // 연결 수락을 위해 accept() 메소드를 호출
                InetSocketAddress isa = (InetSocketAddress) socketChannel.getRemoteAddress(); // getRemoteAddress() 메소드를
                                                                                                // 호출해 IP와 포트정보를 얻고,
                                                                                                // 타입변환을한다.
                System.out.println("[연결 수락함]" + isa.getHostName());
            }
        } catch (Exception e) {
    }
        if (serverSocketChannel.isOpen()) { // ServerSocketChannel이 열려있을 경우
            try {
                serverSocketChannel.close(); // ServerSocketChannel 닫기
            } catch (IOException e1) {
            }
        }
    }
}
 
cs




- 소켓 채널 생성과 연결 요청 -


SocketChannel은 정적 메소드인 open( ) 으로 생성하고, 블로킹 방식으로 동작시키기 위해 configureBlocking(true) 메소드를 호출한다.

기본적으로 블로킹 방식으로 동작하지만, 명시적으로 설정하는 이유는 넌블로킹과 구분하기 위해서이다.

서버 연결 요청은 connect( ) 메소드를 호출하면 되는데, 서버 IP와 포트 정보를 가진 InetSocketAddress 객체를 매개값으로 주면 된다.

connect( ) 메소드는 연결이 완료될 때까지 블로킹되고, 연결이 완료되면 리턴된다.

다음은 로컬 PC의 5001 포트에 바인딩된 서버에 연결을 요청하는 코드이다.


 

  SocketChannel socketChannel = SocketChannel.open( );

  socketChannel.configureBlocking(true);

  socketChannel.connect(new InetSocketAddress("localhost", 5001));





- 예제 및 출력 결과 -


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
package com.hs.chap19;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
 
public class ServerExample {
    public static void main(String[] args) {
        ServerSocketChannel serverSocketChannel = null;
 
        try {
            serverSocketChannel = ServerSocketChannel.open(); // open() 메소드를 사용해 서버 소켓 채널 얻기
            serverSocketChannel.configureBlocking(true); // 블로킹 방식으로 동작시키기 위해 호출한다. 이걸 안써도 기본적으로 블로킹 방식으로 동작하지만 //명시적으로
                                                            // 설정하는 이유는 넌블로킹과 구분하기 위해서이다.
            serverSocketChannel.bind(new InetSocketAddress(5001)); // bind()메소드의 매개값으로 5001번 포트를 줘서 바인딩 시킨다.
            while (true) {
                System.out.println("[연결 기다림]");
                SocketChannel socketChannel = serverSocketChannel.accept(); // 연결 수락을 위해 accept() 메소드를 호출
                InetSocketAddress isa = (InetSocketAddress) socketChannel.getRemoteAddress(); // getRemoteAddress() 메소드를
                                                                                                // 호출해 IP와 포트정보를 얻고,
                                                                                                // 타입변환을한다.
                System.out.println("[연결 수락함]" + isa.getHostName());
            }
        } catch (Exception e) {
        }
        if (serverSocketChannel.isOpen()) { // ServerSocketChannel이 열려있을 경우
            try {
                serverSocketChannel.close(); // ServerSocketChannel 닫기
            } catch (IOException e1) {
            }
        }
    }
}
 
cs

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
package com.hs.chap19;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;
 
public class ClientExample {
 
    public static void main(String[] args) {
        SocketChannel socketChannel = null;
 
        try {
            socketChannel = SocketChannel.open(); // SocketChannel을 open()메소드를 사용해 생성
            socketChannel.configureBlocking(true); // 블로킹 방식으로 동작시키기 위해 configureBlocking 메소드를 호출
            System.out.println("[연결 요청]");
            socketChannel.connect(new InetSocketAddress("localhost"5001)); // localhost 5001포트로 연결요청을 한다.
            System.out.println("연결 성공");
        } catch (Exception e) {
        }
        if (socketChannel.isOpen()) {
            try {
                socketChannel.close();
            } catch (IOException e1) {
            }
        }
    }
}
 
 
cs



- 소켓 채널 데이터 통신 -


클라이언트가 연결 요청 (connect( )) 하고 서버가 연결 수락 (accept()) 했다면, 양쪽 SocketChannel 객체의 read( ), write( ) 메소드를 호출해서 데이터통신

을 할 수 있다. 이 메소드들은 모두 버퍼를 이용하기 때문에 버퍼로 읽고, 쓰는 작업을 해야한다.

다음은 SocketChannel의 write( ) 메소드를 이용해서 문자열을 보내는 코드이다.


 

  Charset charset = Charset.forName("UTF-8");

  ByteBuffer byteBuffer = charset.encode("Hello Server");

  socketChannel.write(byteBuffer);




다음은 SocketChannel의 read( ) 메소드를 이용해서 문자열을 받는 코드이다.


 

  ByteBuffer byteBuffer = ByteBuffer.allocate(100);

  int byteCount = socketChannel.read(byteBuffer);

  byteBuffer.flip( );

  Charset charset = Charset.forName("UTF-8");

  String message = charset.decode(byteBuffer).toString( );



- 예제 및 출력 결과 -

 

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.hs.chap19;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
 
public class ServerExample {
    public static void main(String[] args) {
        ServerSocketChannel serverSocketChannel = null// 소켓채널에 null값을 준다. 값을 담아야하기 때문
        try {
            serverSocketChannel = ServerSocketChannel.open(); // open() 메소드를 사용해 SocketChannel객체를 얻는다.
            serverSocketChannel.configureBlocking(true); // 블록킹방식으로 동작하기 위해 configureBlocking(true)호출
            serverSocketChannel.bind(new InetSocketAddress(5001)); // 새로운 5001번 로컬호스트를 연결 시킨다.
            while (true) {
                System.out.println("[연결 기다림]");
                SocketChannel socketChannel = serverSocketChannel.accept(); // 클라이언트 연결 수락을 위해 accept() 메소드 실행
                InetSocketAddress isa = (InetSocketAddress) socketChannel.getRemoteAddress(); // socketChannel의 IP주소와 포트
                                                                                                // 정보를 isa에 저장한다.
                System.out.println("[연결 수락함]" + isa.getHostName());
 
                ByteBuffer byteBuffer = null// 바이트버퍼에 null값을 준다. 값을 담아야하기때문
                Charset charset = Charset.forName("UTF-8"); // 매개값으로 주어진 문자셋을 담아놓는다. (문자열을 전송하기위해)
 
                byteBuffer = ByteBuffer.allocate(100); // 바이트버퍼에 100개의 공간을 새로 만들어 저장.
                int byteCount = socketChannel.read(byteBuffer); // 바이트버퍼의 수만큼 읽어서 카운트 변수에 저장
                byteBuffer.flip(); // position의 위치를 0번인덱스로 설정, (0이어야 ByteBuffer의 첫 바이트 부터 저장되기 때문)
                String message = charset.decode(byteBuffer).toString(); // 바이트버퍼를 디코딩해서 string타입으로 변환한다
                System.out.println("[데이터 받기 성공]: " + message);
 
                byteBuffer = charset.encode("Hello Client");
                socketChannel.write(byteBuffer);
                System.out.println("[데이터 보내기 성공]");
            }
        } catch (Exception e) {
        }
 
        if (serverSocketChannel.isOpen()) {
            try {
                serverSocketChannel.close();
            } catch (IOException e1) {
            }
        }
 
    }
}
 
cs

 

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
package com.hs.chap19;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
 
public class ClientExample {
    public static void main(String[] args) {
        SocketChannel socketChannel = null// 소켓채널에 null값을 준다. 값을 담아야하기 때문
        try {
            socketChannel = SocketChannel.open(); // open() 메소드를 사용해 SocketChannel객체를 얻는다.
            socketChannel.configureBlocking(true); // 블록킹방식으로 동작하기 위해 configureBlocking(true)호출
            System.out.println("[연결 요청]");
            socketChannel.connect(new InetSocketAddress("localhost"5001)); // 새로운 5001번 로컬호스트를 연결 시킨다.
            System.out.println("[연결 성공]");
 
            ByteBuffer byteBuffer = null// 바이트버퍼에 null값을 준다. 값을 담아야하기때문
            Charset charset = Charset.forName("UTF-8"); // 매개값으로 주어진 문자셋을 담아놓는다. (문자열을 전송하기위해)
 
            byteBuffer = charset.encode("Hello Server"); // 위에서 담은 문자셋으로 Hello Server을 변환한다.
            socketChannel.write(byteBuffer); // 바이트버퍼에 담은 문자열을 보낸다.
            System.out.println("[데이터 보내기 성공]");
 
            byteBuffer = ByteBuffer.allocate(100); // 바이트버퍼에 100개의 공간을 새로 만들어 저장.
            int byteCount = socketChannel.read(byteBuffer); // 바이트버퍼의 수만큼 읽어서 카운트 변수에 저장
            byteBuffer.flip(); // position의 위치를 0번인덱스로 설정, (0이어야 ByteBuffer의 첫 바이트 부터 저장되기 때문)
            String message = charset.decode(byteBuffer).toString(); // 바이트버퍼를 디코딩해서 string타입으로 변환한다
            System.out.println("[데이터 받기 성공]: " + message);
        } catch (Exception e) {
        }
 
        if (socketChannel.isOpen()) {
            try {
                socketChannel.close();
            } catch (IOException e1) {
            }
        }
 
    }
 
}
 
 
cs

 

 

 

 

read( ) 메소드가 블로킹 해제되고 리턴되는 경우

 

 블로킹이 해제되는 경우

 리턴값

 상대방이 데이터를 보냄

 읽은 바이트 수

 상대방이 정상적으로 SocketChannel의 close( )를 호출

 -1

 상대방이 비정상적으로 종료

 IOException 발생

 

 

- 스레드 병렬 처리 -

 

TCP 블로킹 방식은 데이터 입출력이 완료되기 전까지 read( )와 write( ) 메소드가 블로킹 된다.

만약 애플리케이션을 실행시키는 main 스레드가 직접 입출력 작업을 담당하게 되면 입출력이 완료될 때까지 다른 작업을 할 수 없는 상태가 된다.

그렇기 때문에 클라이언트 연결(채널) 하나에 작업 스레드 하나를 할당해서 병렬 처리해야 한다.

 

 

 

- 스레드풀 -

 

클라이언트 폭증으로 인해 서버의 과도한 스레드 생성을 방지하려면 스레드풀을 사용하는 것이 바람직하다.

스레드풀은 스레드 수를 제한해서 사용하기 때문에 갑작스런 클라이언트의 폭증은 작업 큐의 작업량만 증가시킬 뿐

스레드 수에는 변함이 없기 때문에 서버 성능은 완만히 저하된다.

 

: