1. Help > Install new software



2. Work with 입력


Work with에 http://www.exerd.com/update 를 입력하고 Add 버튼을 누른다.



3. Add Repository 입력


Add 버튼을 클릭하면 Repository를 적는 창이 나오는데 Location은 이미 적혀 있으니 Name만 적으면 된다.



4. Install


Name 창에 eXERD가 뜨면 전부 체크를 하고, 맨 아래 하단의 체크박스는 해제한다.

그러고 난 뒤 Next를 클릭한다.



5. Install Details


Next 클릭한다.



6. Review Licenses


라이센스에 동의한 뒤 Finish 버튼을 누른다.



7. Selection Needed


플러그인을 설치하는 도중 이러한 창이 뜨면 체크박스에 체크하고 OK를 누른다.



8. 이클립스 재실행



9. 완료


 

 

이클립스에서 Export시, server runtime 체크박스는 uncheck, source files는 check 하는 것이 좋다.

server runtime 같은 경우에는 받는 측에서 사용하는 WAS가 tomcat이 아닌 경우도 있기 때문이며 source files 는 자바 소스 파일이 들어가 있어야 하기 떄문이다.

1. 정의

비즈니스 요구 사항을 만족하는 시스템을 구축하기 위해 전체 시스템에 대한 구조를 정의한 문서.

시스템을 구성하는 컴포넌트와 그 컴포넌트를 구성하는 정보(데이터)를 정의.

 

소프트웨어 구성 요소와 구성 요소들이 지니고 있는 특성 중 외부에 드러나는 특성, 그리고 구성 요소들의 관계를 표현하는 시스템의 구조나 구조체.

 

소프트웨어 아키텍쳐는 현재의 요구 사항 뿐 아니라 변화되는 비지니스 전략에 대응이 가능하도록 장기적인 로드맵을 수용하여 확장 가능한 형태로 디자인 되어야 하며, 가능하면 구현하고자 하는 조직의 기술 수준, 조직의 규모와 형태 그리고 비지니스의 형태에 맞춰 설계되어야 함.

 

 

2. 시스템 아키텍쳐 설계 필수 요소

종류

설명

애플리케이션 아키텍쳐 (Application Architecture)

 애플리케이션 소프트웨어에 대한 아키텍쳐를 설계.

 컴포넌트 정의, 컴포넌트 관계, 특정 기능에 대한 컴포넌트 간의 호출 흐름, 컴포넌트 간의 통신을 위한 메세지에 대한 규격 정의를 포함.

테크니컬 아키텍쳐 (Technical Architecture)

 애플리케이션의 배포 구조 정의.애플리케이션을 배포할 하드웨어의 구조와 애플리케이션 개발에 사용하는 미들웨어(ex. DBMS, Web Server etc...) 등의 배포 구조를 함께 정의.

데이터 아키텍쳐 (Data Architecture)

 애플리케이션에서 다루는 데이터의 구조와 관계를 정의.

 

 

3. 아키텍쳐를 사용하는 이유

ㄱ. 소프트웨어 아키텍쳐가 시스템의 공통적인 추상화를 제공함으로서, 관련 이해 당사자들 간의 상호 이해와 협상, 일치, 의사 소통의 기본을 제공.

ㄴ. 시스템 분석, 설계시의 초기 결정 사항을 제공.

ㄷ. 시스템의 요약된 형태로서 향후에 상세한 시스템 구성의 기본을 제공.

=> 개발과 유지보수 비용을 줄이고 제품의 품질을 높일 수 있음

 

APMSETUP의 경우, phpMyAdmin에 접속할 때 기본으로 설정되어 있는 암호가 apmsetup 이다.

아이디 root, 비밀번호 apmsetup으로 접속하면 된다.

1. Abstract (추상 클래스)

반드시 한 개 이상의 추상 메소드를 가지고, 객체를 생성하지 않는다.

슈퍼 클래스로 사용이 가능하며 추상 메소드가 하나 이상만 있으면 된다. 

 

 

2. Interface (인터페이스)

서로 다른 클래스를 연결시켜주는 연결 장치이다.

슈퍼 클래스의 용도로 사용이 가능하며, 반드시 추상 메소드로만 구현되어야 한다.

 

 

* Class > Abstract > Interface

 

 

3. 차이점

 

 Abstract

Interface 

추상 메소드 유무

1개 이상의 추상 메소드

전부 추상 메소드 

상속 유무

단일 상속만 가능 

다중 상속 가능 

 

 

4. DTO 에서 Interface를 사용하는 이유

프로그램 설계시 클래스의 구조가 1번의 경우일 때에는 A부터 C까지 쭉 상속을 받아 단일 상속으로 가능한 Abstract로 구현하면 되지만, 2번의 경우일 때에는 관련 없는 D 클래스가 있는 경우도 있기 때문에 보통은 Interface를 사용한다.

(2번 같은 경우에는 B를 상속받고 D를 인터페이스로 사용한다)

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

Java :: Exception 예외처리  (0) 2016.12.15
Servlet :: ServletContext vs ServletConfig  (0) 2016.11.22
Java :: 간단한 JDBC 예제  (0) 2016.10.18
Java :: 스레드(Thread)  (0) 2016.10.12
Java :: Code vs Heap vs Stack  (0) 2016.10.10

1. 웹 어플리케이션 구조

 

 

2. m_insert_form.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
31
32
33
34
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
 
<%= request.getRequestURI() %> <br>
 
<form action="<%= request.getContextPath() %>/minsert/m_insert_pro.jsp" method="post">
 
<table border="1">
    <tr>
        <td>아이디</td>
        <td><input type="text" name="m_id" size="20"></td>
    <tr>
    <tr>
        <td>암호</td>
        <td><input type="text" name="m_pw" size="20"></td>
    <tr>
    <tr>
        <td>권한</td>
        <td><input type="text" name="m_level" size="20"></td>
    <tr>
    <tr>
        <td>이름</td>
        <td><input type="text" name="m_name" size="20"></td>
    <tr>
    <tr>
        <td>이메일</td>
        <td><input type="text" name="m_email" size="20"></td>
    <tr>
    <tr>
        <td colspan="4"><input type="submit" value="회원가입버튼"></td>
    </tr>
</table>
 
</form>
cs

 

 

3.  m_insert_pro.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
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
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<!-- Connection 객체, PreparedStatement 객체 사용하기 위해서는 import를 해줘야 함 -->
<!-- DriverManage와 SQLException(쿼리문 사용) 객체 사용하기 위해서도 import 해줘야 함 -->
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.SQLException" %>
 
<!-- 
    JDBC(Java Database Connectivity) : 자바 언어를 이용해 DB에 접근할 수 있는 API 묶음 
        * API : java.sql.Connection 으로 정의되어 있음(java.sql.~ 클래스들 import 해줘야 함)
        1. DB 주소 + 포트번호 + 이름 + 암호 이용해서 연결(Connection) 객체 생성
        2. 커넥션에서 sql 객체 생성
        3. sql 객체 이용하여 sql 작업을 함
        4. 사용했던 리소스들(sql 객체, 커넥션 등)을 해제
-->
 
<!-- 자바 소스 코드가 들어가야 하기 때문에 스크립트릿 안에 자바 소스 코드를 넣었음 -->
<%
//  console 창에 출력하기 전 form.jsp에서 받은 파라미터 값들이 깨지지 않도록 인코딩
    request.getParameter("utf-8");
    
//  Connection, PreparedStatement 객체 생성
//  선언만 해주고 초기화 해주지 않을 시 => nullPointException 일어날 가능성 있음
    Connection conn = null;
//  PreparedStatement와 Statement의 차이
//  1. PreparedStatement : 쿼리문이 들어갈 양식만 있음 
//  2. Statement : 쿼리문 통째로 집어넣음
    PreparedStatement pstmt = null;
    
//  form의 파라미터들을 request 내장 객체 getParameter 메소드로 받아와 String형 변수들로 대입함
    String m_id = request.getParameter("m_id");
    String m_pw = request.getParameter("m_pw");
    String m_level = request.getParameter("m_level");
    String m_name = request.getParameter("m_name");
    String m_email = request.getParameter("m_email");
    
    System.out.println(m_id + "<-- m_id /minsert/m_insert_pro.jsp");
    System.out.println(m_pw + "<-- m_pw /minsert/m_insert_pro.jsp");
    System.out.println(m_level + "<-- m_level /minsert/m_insert_pro.jsp");
    System.out.println(m_name + "<-- m_name /minsert/m_insert_pro.jsp");
    System.out.println(m_email + "<-- m_email /minsert/m_insert_pro.jsp");
    
//  JDBC 드라이버 로딩(mysql이기 때문에 mysql, jdbc 형식이기 때문에 jdbc라고 적어줘야 함)
    Class.forName("com.mysql.jdbc.Driver");
    
//  해당 예제의 try문에는 catch가 없는데, 이것은 예외처리를 따로 해줄 필요가 없기 때문이다.
//  (catch가 없는 경우에는 try~finally 문을 굳이 써야할 필요가 없음 => try~finally 없애도 됨)
    try{
//      드라이버 주소, db id, db password가 필요(인코딩은 해줘도, 안 해줘도 됨)
        String jdbcDriver = "jdbc:mysql://localhost:3306/dev22db?" + 
                            "useUnicode=true&characterEncoding=utf8";
        String dbUser = "dev22id";
        String dbPass = "dev22pw";
        
//      mysql 커넥션 연결
//      커넥션 정보가 담긴 return 값을 conn이라는 인스턴스 주소값에 대입
//      매개변수 안에 직접 드라이버 주소, db id, db password를 적어줘도 되지만 매개변수 값의 길이가
//      너무 길기 때문에 밖에 따로 변수로 선언
        conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
 
        System.out.println("console> conn : " + conn);
    
//      mysql 쿼리문 선언
//      PreparedStatement 객체를 사용하는 이유는 ? 안에 들어가는 파라미터 값들이 
//      계속 변할 수 있으므로, 일일히 쿼리를 수정하는 것보다는 PreparedStatement 객체를
//      사용함으로서 form에서 받아오는 파라미터 값들을 유연하게 대처할 수 있기 때문이다.
        pstmt = conn.prepareStatement("INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
        
//      콘솔창에서 확인해보면 ?가 들어간 쿼리문만 출력됨
        System.out.println("console> before pstmt : " + pstmt);
        
//      form.jsp에서 받는 파라미터의 갯수대로 setting을 해준다.
//      (form에서 받는 파라미터들은 모두 default string 형으로 받아오기 때문에 setString 메소드를 호출해야 함)
        pstmt.setString(1, m_id);
        pstmt.setString(2, m_pw);
        pstmt.setString(3, m_level);
        pstmt.setString(4, m_name);
        pstmt.setString(5, m_email);
        
//      파라미터들을 setting 해준 뒤이기 때문에, 콘솔창에서 확인해보면 쿼리문 안에
//      setting 해준 값들이 쿼리문에 같이 출력됨을 알 수 있음
        System.out.println("console> after pstmt : " + pstmt);
    
//      쿼리 실행(쿼리문에서 직접 값을 받아오지 않는 경우만 사용 가능)
//      쿼리 실행 후 값을 직접 받아와야 하는 경우
//      (ex. SELECT문 => ResultSet 객체 선언하고 사용, 인스턴스.executeQuery() 메소드 사용)        
        pstmt.executeUpdate();
    
    }finally{
//      실행되었던 커넥션들을 모두 닫아줘야 함(객체 선언한 순서의 반대로 닫아줘야 함)
        if (pstmt != nulltry { pstmt.close(); } catch(SQLException ex) {}
        if (conn != nulltry { conn.close(); } catch(SQLException ex) {}
    }
%>
cs

 

 

 

 

4. 결과 

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

Servlet :: ServletContext vs ServletConfig  (0) 2016.11.22
Java :: Abstract vs Interface  (0) 2016.10.28
Java :: 스레드(Thread)  (0) 2016.10.12
Java :: Code vs Heap vs Stack  (0) 2016.10.10
Java :: 자바 소켓 프로그래밍(TCP)  (0) 2016.10.09

1. body class="container"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>class test</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
</head>
<!-- body에 class element를 적용한 경우 -->
<body class="container">
    <div>
        <h1>h1 Bootstrap heading(36px)</h1>
        <h2>h1 Bootstrap heading(30px)</h2>
        <h3>h1 Bootstrap heading(24px)</h3>
        <h4>h1 Bootstrap heading(18px)</h4>
        <h5>h1 Bootstrap heading(14px)</h5>
        <h6>h1 Bootstrap heading(12px)</h6>
    </div>
</body>
</html>
cs

 

 

 

2. div class="container"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>class test</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
</head>
<body>
<!--div에 class element를 적용한 경우 -->
    <div class="container">
        <h1>h1 Bootstrap heading(36px)</h1>
        <h2>h1 Bootstrap heading(30px)</h2>
        <h3>h1 Bootstrap heading(24px)</h3>
        <h4>h1 Bootstrap heading(18px)</h4>
        <h5>h1 Bootstrap heading(14px)</h5>
        <h6>h1 Bootstrap heading(12px)</h6>
    </div>
</body>
</html>
cs

 

 

부트스트랩 적용시 class 요소를 body에 붙여도, div에 붙여도 둘 다 정상적으로 동작하는 것을 확인할 수 있다. 

'FrontEnd > CSS & HTML' 카테고리의 다른 글

HTML :: 하이퍼링크로 팝업창 열기  (0) 2016.05.12
HTML :: <pre>  (0) 2016.04.02
HTML :: select optgroup  (0) 2016.03.10
HTML :: id vs name  (0) 2016.03.01

1. 정의

- 한 프로세스 내에서 두가지 또는 그 이상의 일을 동시에 할 수 있는 것 (동시에 두 가지 이상의 루틴 실행 가능함)

- 앞 뒤 순서 없는 일들이 있고 그 일들을 분리해서 동시에 처리해야 할 때 주로 사용

- 작은 규모의 프로세스. 다수 개의 스레드는 하나의 프로세스에서 나타남

- 자바에서 사용시 반드시 스레드를 상속받아 사용해야 함 (가장 대표적인 스레드 구동 방법)

- 모든 스레드는 해당 프로세스의 데이터 공간을 공유함

  (main 메소드에서 인스턴스.start() 메소드를 호출시 객체 안에 있는 메소드 전부가 실행되도록 구동되어 있음)

- 프로세스를 function. 즉 메소드 단위로 실행시키는 것. 일부 코드만 별도로 분리하여 실행함

- 프로세스에 비해 경량.

- 객체화되는 클래스 내부에 있는 메소드가 오버라이딩 됨

  (부모 클래스인 스레드를 상속 받는 자식 클래스를 메인 클래스에서 호출하기 때문에 오버라이딩)

 

 

2. 단일 스레드

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
package lesson01;
 
import java.util.Random;
 
//단일 쓰레드를 받는 예제
//자바에서 쓰레드를 구동시키는 가장 기본적인 방법 : Thread 상속
//쓰레드를 상속 받는 클래스 내에 있는 메소드가 실행이 될 때도 있고 안될 때도 있음
//=> 병렬적 실행 
public class ThreadTest extends Thread {
    static int index = 0;
    int id = -1;
    
//  2-1번째로 실행
    public ThreadTest(int id) {
        this.id = id;
        
        System.out.println("cosnole> Contructor id : " + id);
    }
    
//  Thread 부모 클래스를 상속받은 자식 클래스인 ThreadTest 가 실행되는 것이기 때문에
//  main 메소드에서 ThreadTest 객체를 실행시키게 되면
//  run() 메소드는 오버라이딩 되는 것이라고 할 수 있음.
    public void run() {
        System.out.println("console> id : " + id + "번 쓰레드 동작 중 ...");
        
        Random r = new Random(System.currentTimeMillis());
        
        try {
//          0.3초를 long s에 대입시킴
            long s = r.nextInt(3000);
            
            System.out.println("console> s : " + s);
            
//          sleep(min) : 쓰레드를 정지시키는 메소드. min : 정지시킬 시간(초)
//          0.3초 동안 쓰레드를 정지시킴
            Thread.sleep(s);
            
            index++;
        }
//      예외처리
        catch (InterruptedException e) { 
            e.printStackTrace();
        }
        
        System.out.println(id + " 번 쓰레드 동작 종료 ...");
    }
    
    public static void main(String[] args) {
//      1번째로 실행
        System.out.println("console> Start main method.");
        
        for (int i = 0; i < 10; i++) {
//          2번째로 실행
//          ThreadTest 생성자의 id 변수값 초기화 시킴
            ThreadTest t = new ThreadTest(i);
            
//          3번째 실행
            System.out.println("console> for i : " + i);
            
//          start() : 해당 객체의 메소드를 차례대로 실행시킴.
//          쓰레드는 for문 안에 있던 없던 간에 순서를 지키지 않고 병렬적으로 실행되기 때문에
//          run() 메소드가 실행될 때도 있고 실행되지 않을 때도 있음.
            t.start();
        }
        
        try {
//          0.5초동안 쓰레드 정지시킴
            Thread.sleep(5000);

//        예외처리 

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("console> current Index : " + index);
        System.out.println("console> End main method.");
    }
}
cs

 

 

실행된 콘솔창을 보면, 총 3번을 run 했음에도 불구하고 출력되는 내용이 모두 다 다르게 나온다.

이유인 즉슨 스레드는 순서를 지키지 않은 채로 분리되어 실행되기 때문에 스레드로 오버라이딩 되는 run() 메소드 안에 있는 console> id : id번 쓰레드 동작 중.. 이라는 메세지가 출력될 때도 있고 출력되지 않을 때도 있는 것이다.

(스레드로 동작하는 run() 메소드가 구동될 때도 있고, 구동되지 않을 때도 있음 => 직렬적이 아니라 병렬적으로 동작하므로)

 

메인 메소드에서 for문 안에 있는 초기화된 값 i가 1씩 증가하는데도 불구하고 말이다.

 

 

3. 멀티 스레드

- 멀티 스레드를 이용하는 방법에는 두 가지가 있음

ㄱ. java.lang.Thread 클래스 이용

- 장점 : 스레드 클래스 메소드를 바로 사용 가능

- 단점 : 메인 클래스가 타 클래스의 자식 클래스인 경우 사용하지 못함

ㄴ. java.long.Runnable 인터페이스 이용

- 장점 : 타 클래스로부터 상속 받은 상태여도(자식 클래스인 상태여도) 그 클래스를 스레드로 사용 가능

- 단점 : 스레드 클래스의 메소드는 사용하지 못함

 

1
2
3
4
5
6
7
8
package lesson01;
 
public class Thread1Main extends Thread {
//  run() 메소드 오버라이딩
    public void run() {
        System.out.println("console> Thread 1");
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package lesson01;
 
public class Thread2Main extends Thread {
//  run() 메소드가 오버라이딩 됨
    public void run() {
        System.out.println("console> Thread 2");
    }
    
    public static void main(String[] args) {
        Thread1Main tm1 = new Thread1Main();
        Thread2Main tm2 = new Thread2Main();
        
//      start() : Thread를 상속 받는 자식 클래스의 모든 메소드들이 실행됨
//      스레드는 순서가 없이 병렬적으로 실행되기 때문에 tm1 인스턴스와 tm2 인스턴스가
//      순서 없이 실행됨을 확인할 수 있음
        tm1.start();
        tm2.start();
    }
}
cs

 

여러 번 run을 해본 결과, 콘솔 창에 출력되는 값들은 순서가 일정하지 않았다.

멀티 스레드를 이용할 시 스레드가 여러 개 있어도 순서를 지키지 않고 제멋대로 실행이 된다는 것을 확인할 수 있다.

* 응용 프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받고, JVM은 메모리를 용도에 따라 여러 영역으로 나누어서 관리한다.

 

 

1. 코드 (Code) 영역

컴파일된 .class 코드 영역 (=클래스 영역 / 코드 영역 / 메소드 영역 - 이라고도 불린다)

0과 1로 된 2진수(binary)

static 변수 / static 메소드 (= static 영역이라고도 불린다) : class가 실행되기 전에 미리 메모리가 확보됨

 

 

2. 스택 (Stack) 영역 ( <=> 큐 )

가장 늦게 들어온 것부터 처리함

(ex. 함수 / 메소드 => A a = new B(); 시 B() 생성자 메소드를 호출하는게 아닌 뒤늦게 만들어진 인스턴스 a를 호출하는 것)
main() 메소드가 가장 먼저 호출됨 (지역변수를 저장할 메모리가 필요하니까)

 

 

3. 힙 (Heap) 영역

객체 인스턴스 (new 키워드가 들어가는)는 무조건 heap에 만들어짐 (생성자 메소드)

호출되는 클래스 내의 메소드들도 저장됨

 

* 만들어지는 순서 : code > stack > heap

* 종료되는 순서 : heap > stack > code

 

 

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
package com.example.java;
 
//CallStackTest : method area
public class CallStackTest {
//  str : stack(정적 메모리)
    String str = "홍길동";
    
//  main method : call stack(정적 메모리)
    public static void main(String[] args) {
//      main method에서 firstMethod() 메소드를 호출했기 때문에 먼저 호출됨
        System.out.println("console> main method() 시작");
        
        firstMethod();
        
        System.out.println("console> main method() 끝");
    }
    
//  firstMethod() method : Heap(동적 메모리)
    public static void firstMethod() {
        System.out.println("console> firstMethod() 시작");
        
        secondMethod();
        
        System.out.println("console> firstMethod() 끝");
    }
    
//  secondMethod() method : Heap(동적 메모리)
    public static void secondMethod() {
        System.out.println("console> secondMethod()");
    }
}
cs

 

 

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

Java :: 간단한 JDBC 예제  (0) 2016.10.18
Java :: 스레드(Thread)  (0) 2016.10.12
Java :: 자바 소켓 프로그래밍(TCP)  (0) 2016.10.09
Java :: 업캐스팅(UpCasting) vs 다운캐스팅(DownCasting)  (0) 2016.10.05
Java :: final과 static  (0) 2016.09.30

1. 소켓 (Socket)

- TCP 프로토콜을 사용하여 통신을 하는데 쓰임(TCP의 기본 : IP / Port 번호가 필요)

- 네트워크 상에서 서버, 클라이언트 두 개의 프로그램이 특정 포트를 통해 양방향 통신이 간으하도록 만들어주는 소프트웨어 장치.

- java.net에서 ServerSocket 클래스(서버측)와 Socket 클래스(서버측 + 클라이언트측)를 이용하여 서버와 클라이언트 간의 통신을 가능하게 만듦.

- 자바 채팅 프로그램의 기초는 서버 - 클라이언트 간의 연결이 가능해야 하는데, 소켓 프로그래밍으로 가능함(하나의 서버에 여러 개의 클라이언트가 접속하는 멀티 클라이언트 채팅 프로그램도 가능).

 

* IP : 컴퓨터마다 가지고 있는 고유의 주소

  port : 통신을 위한 연결 라인

 

 

2. 자바 소켓 프로그래밍 (TCP)

- 소켓 프로그래밍 중의 하나. 스트림 통신 프로토콜.

- 연결 지향 프로토콜 : 양 쪽의 소켓이 연결된 상태여야 함.

- 송신 > 수신시 차례대로, 연결된 순서대로 데이터를 교환해야 함(신뢰성이 높음).

- java.net.ServerSocket : 서버측에서 클라이언트의 접속에 대기하기 위해 필요한 클래스.

- java.net.Socket : 서버 - 클라이언트 간 통신하기 위해 필요한 클래스.

 

 

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package lesson01.exam02.server;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
 
//간단한 소켓 서버 프로그램. 소켓 연결이 되면 현재 시간을 출력하고 연결된 소켓을 닫음
public class SimpleSockterServer {
    static final int PORT = 8888;
    
    public static void main(String[] args) {
        
        try{
//          ServerSockter 생성 (포트 번호를 사용하는 서버 소켓)
//          서버용 소켓. 통신은 불가능하고 클라이언트의 연결만을 기다림
//          ServerSocket 소켓변수명 = new ServerSocket(포트번호);
            ServerSocket serverSocket = new ServerSocket(PORT);
            
            System.out.println("console> 서버 : 클라이언트의 접속을 기다립니다.");
            
//          소켓 서버가 종료될 때까지 무한루프
            while(true) {
//              클라이언트와 연결이 되면 실제로 통신을 하기 위해 만들어야 하는 소켓
//              서버소켓.accept();
//              클라이언트 소켓에서 요청을 할 때까지 소켓 서버가 대기 상태가 됨
//              클라이언트 소켓 수가 많아질 시 요청 횟수가 증가하면서 스레드가 늘어나면 
//              서버 자원을 많이 소모함
//              => 스레드풀(Thread Pool)이 등장하게 됨 : 다중 접속 처리가 원활해짐
                Socket socket = serverSocket.accept();
                
                System.out.println("console> 서버 " + socket.getInetAddress() + " 클라이언트와 " +
                                    socket.getLocalPort() + " 포트로 연결되었습니다.");
                
                try {
//                  응답을 통해 스트림을 얻어옴(서버에서 클라이언트의 입력을 받아들임)
                    OutputStream stream = socket.getOutputStream();
//                  현재 날짜를 받아와 출력함
                    stream.write(new Date().toString().getBytes());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
//                  소켓은 반드시 닫아야 함
                    socket.close();
                }
            }

//        예외처리

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
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
package lesson01.exam02.server;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
 
//소켓 클라이언트 프로그램. 소켓 서버에 접속하여 결과 출력하고 프로그램을 종료함
//서버 소켓은 필요 없고, InputStream을 OutputStream으로, InputStreamReader를 OutputStreamWriter로 바꾸면 됨
//서버 소켓에서 생성한 서버의 IP, port번호를 알고 있어야 함
public class SimpleSocketClient {
    static final int PORT = 8888;
    
    public static void main(String[] args) {
        try {
//          소켓 생성
            Socket socket = new Socket("localhost", PORT);
            
            System.out.println("console> PORT(" + PORT + ") 로 접속을 시도합니다.");
            
//          스트림을 얻어옴
            InputStream stream = socket.getInputStream();
//          스트림을 래핑함(클라이언트에서 서버로부터 수신 받은 메세지 받아들임)
            BufferedReader br = new BufferedReader(new InputStreamReader(stream));
            
//          결과를 읽음(서버로부터 온 메세지 수신)
            String response = br.readLine();
            
            System.out.println("console> 수신 response : " + response);
            
//          소켓 닫음
            socket.close();
            
//          프로그램 종료
            System.exit(0);

//        예외처리 

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

 클래스명

 설명

 특징

 InputStream

 byte 단위로 입력 받는 최상위 클래스

 객체화가 불가능한 추상 클래스.

 (상속 받아 사용해야 함)

 OutputStream

 byte 단위로 출력 받는 최상위 클래스

 Reader

 문자 단위 입력 스트림

 Writer

 문자 단위 출력 스트림

 BufferReader

 Buffer에 있는 IO 클래스. 읽는 클래스

 

 BufferedWriter

 Buffer에 있는 IO 클래스. 쓰는 클래스

 

 

+ Recent posts