[12.02] 내일배움캠프[Spring] TIL-24

박상훈·2022년 12월 2일
0

내일배움캠프[TIL]

목록 보기
24/72

[12.02] 내일배움캠프[Spring] TIL-24

1. Java JVM 복습하기

JVM 데이터 저장영역 구조

JVM Call Stack( ex. Main stack frame )


int main(void){
    func1();  // func1() 호출

    return 0;
}

void func1(){
    func2();  // func2() 호출
}

void func2(){
}

함수 호출에 의한 StackFrame의 변화


실행 단계 살펴보기

1) 프로그램 실행 -> 가장 먼저 main() 함수 호출 되어 main() 함수의 스택 프레임이 스택에 저장
2) func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등이 스택 프레임에 저장.
3) func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장
4) func2() 함수의 모든 작업이 완료되어 반환되면, func2()함수의 스택 프레임만이 스택에서 제거.
5) func1()함수의 호출이 종료되면, func1()함수의 스택 프레임이 스택에서 제거
6) main() 함수의 모든 작업이 완료되면 main()함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료
👉 Last - In , First - Out

2. Java - Thread와 Multi Thread프로그래밍

  • Main Thread
    👉 모든 자바 프로그램은 메인 스레드가 psvm을 실행하며 시작.
    👉 main 스레드는 작업 스레드들을 만들어 병렬로 코드들을 실행
  • 프로세스의 종료
    👉 싱글 Thread : 메인 스레드가 종료하면 프로세스도 종료
    👉 멀티 Thread : 실행 중인 스레드가 하나라도 있다면, 프로세스 미종료
    ( 잘못된 실수로 하나의 스레드가 계속 돌고 있다면..? 대 참사 )
  • 자바 Thread
class Solution {
    public static void main(String[] args) {
        Thread th = new Thread();
        Thread th2 = new Thread();

        System.out.println(th.getName());//Thread - 0
        System.out.println(th2.getName());//Thread - 1
    }
}

Runnable 인터페이스 구현

class Solution implements Runnable{

    @Override
    public void run() {

        System.out.println("Thread :"+Thread.currentThread().getName());

        try{
            Thread.sleep(2000);
        }catch (InterruptedException e){
            e.getStackTrace();

        }
        System.out.println("End");
    }

Extends 함수

public class ExtendThread extends Thread{

    @Override
    public void run(){
        System.out.println("Thread :"+Thread.currentThread().getName());

        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.getStackTrace();

        }
        System.out.println("End");
    }
}

Main 구현 메소드

  public static void main(String[] args) {

       Thread th = new Thread(new Solution());
       Thread th2 = new Thread(new Solution());
       Thread th3 = new Thread(new Solution());
       Thread th4 = new Thread(new Solution());
       th.start();
       th2.start();
       th3.start();
       th4.start(); // 실행결과가 항상 똑같지 않았음.
       

        ExtendThread extendThread = new ExtendThread();
        extendThread.run();

    }

👉 여기서 Thread th 객체를 3개 더 만들고 진행 했을 때, 0 -> 1 -> 2 ->3 이런 순서를 보장하지 않았다.
👉 Thread를 extends 하는 것과 implement Runnable을 하는 것은 왜 나뉘어 있나?
👉 Thread를 extends 하게되면 다른 클레스를 상속 받을 수 없다.
👉 Implements Runnable을 하게 되면 다른 클레스를 상속 받을 수 있다.

프로세스 ? Thread ?

  • CPU는 한번에 하나의 작업만 가능
    👉 옛날에는 음악듣다가 다른 웹 페이지 작업 시 음악꺼짐..
  • 우리는 빠른 문맥교환( Context Switching )을 통해 동시 작업
    👉 둘 이상의 프로세스를 넣었다가 뺐다가 반복하는 것은 비용이 엄청나게 발생..

프로세스

👉 메모리에 올라와 실행되고 있는 프로그램의 인스턴스( 독립적인 개체!!)
👉 OS로 부터 시스템 자원을 할당받는 작업의 단위
👉 동적인 개념으로는 실행된 프로그램을 의미한다.
👉 독립된 메모리영역 ( Code, Data, Stack, Heap)
👉 기본적으로 적어도 1개의 메인 스레드를 가지고 있음
👉 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
👉 ex) 우아한 테크 영상 발췌 내용 : https://www.youtube.com/watch?v=1grtWKqTn50
👉 옛날 익스플로어에서 여러 창을 켜놨을 때 뻑나면 다 꺼짐 -> 멀티 스레드 방식이기 때문에
하나의 스레드의 동작이상이 발생하면 다른 스레드에게도 영향을 준다.
👉 크롬을 그럴일이 없음 -> 멀티 프로세스 방식으로 하나가 뻑나도 다른 프로세스에 영향을 주지 않는다.

스레드

👉 스레드는 프로세스 내에서 각각 Stack만 따로 할당 받고 Code, Data, Heap영역 공유
👉 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에서 스레드끼리 공유하면서 실행된다.
👉 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
👉 각각 스레드는 별도의 레지스터와 스택을 갖고있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
👉 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있다.

멀티 프로세스 멀티 스레드의 차이

멀티 프로세스

  • 하나의 응용프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
  • 장점 : 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
  • 단점 : Context Switching에서의 오버헤드

멀티 스레드

  • 하나의 응용프로그램들을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것이다.
  • 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
  • 장점 :
    1) 시스템 자원 소모 감소( 자원의 효율성 증대 )
    2) 시스템 처리량 증가 ( 처리 비용 감소 )
    3) 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
  • 단점 :
    1) 주의 깊은 설계가 필요하다.
    2) 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
    3) 다른 프로세스에서 스레드를 제어할 수 없다.
    4) 멀티 스레드의 경우 자원 공유의 문제가 발생한다.( 동기화 문제 )
    5) 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
    출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

멀티 스레드 동기화 문제

  • 공유 자원에 다중의 스레드가 접근하면서 예상과 다른 결과치가 도출될 수 있음.

동시성과 병렬성 ( 상세개념은 다음 시간에 )

3. Test 코드

  • 원래 코드들을 웹페이지나 어플리케이션으로 띄워서 잘 되나? 안되나를 보거나 main메서드를 활용하여 System.out.println()을 찍어보면서 확인했는데, 너무 번거롭고 한줄 한줄 테스트 할 때마다 돌려보는건 너무 비효율적..
  • 지금 짠 코드가 예시의 데이터를 대입 했을 때 잘돌아간다? = 잘짰다

간단한 Test Code 써보기

package org.example;

public class Sum {

    public int sumNum(int a, int b){
        return a+b;
    }
}
package org.example;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class SumTest {

    @Test
    void sum() {

        Sum sum = new Sum();
        assertEquals(3,sum.sumNum(1,2)); // 1,2 넣었을 때 3 맞냐? OK!! 잘 돌아간다!
    }
}

1) Test원하는 함수명 오른쪽 마우스 클릭!
2) Generate !
3) Test !

👉 만약 이런 Test구조 디렉터리가 없다?!

👉 요렇게 설정해주자!

4. 네트워크

네트워크의 기본구조 LAN / WAN

  • LAN : 사무실이나 빌딩처럼 비교적 좁은 범위의 네트워크를 말한다.
  • WAN : 서로 떨어져있는 LAN 사이를 전용선 등으로 연결한 광역 네트워크를 말한다.
  • LAN을 통해 건물의 네트워크에 접속하거나 자원을 공유할 수 있다.
    👉 Wifi 공유기를 통해 노트북이나 핸드폰으로 인터넷에 연결하는 것도 LAN
    👉 Wifi 공유기를 통해 컴퓨터에서 프린터에 연결하는 것도 LAN
  • WAN을 통해 멀리 떨어져 있는 LAN사이를 연결할 수 있다.
    👉 WAN 전용선으로 건물과 통신사 중계기(ISP)를 연결하는 것도 WAN
    👉 WAN 케이블로 네트워크 시스템(SDN)을 통해 미국의 네트워크에 연결하는 것도 WAN

클라이언트 / 서버

  • 클라이언트 : 네트워크상에서 서버에게 서비스를 요청하는 장비
    👉 컴퓨터, 노트북, 핸드폰, 아이패드 등...
  • 서버 : 네트워크상에서 서비스를 제공하는 장비
    👉 공유기, 도메인 관리기(DNS), IP 할당기(DHCP), 시간관리기(NTP), 게이트웨이등..

OSI 7계층

계층이름설명
7계층👩‍💻응용 계층(Application)애플리케이션 서비스 제공
6계층🗂️표현 계층(Presentation)문자코드, 압축, 암호화
5계층⛳️세션 계층(Session)통신 방식 결정
4계층🔐전송 계층(Transport)신뢰성 있는 통신 구현
3계층🎯네트워크 계층(Network)다른 네트워크와 통신하기 위한 IP주소 결정
2계층⛓️데이터링크 계층(Data Link)물리주소 결정
1계층📡물리 계층(Physical Layer)물리적인 연결과 전기 신호 변환

👉 각 계층은 독립적인 역할을 부여받아 동작하며, 문제 발생시 현상에 따라 원인 파악이 용이 해짐, 이 모델을 통해 각 계층에서의 작업을 시각적으로 표현할 수 있게됨

계층의 기본 구조

  • 계층 1, 2, 3( 네트워크 지원계층 )
    👉 하나의 장치에서 다른 장치로 전송되는 데이터의 물리적인 면을 처리
  • 계층5, 6, 7( 사용자 지원계층 )
    👉 관계 없는 소프트웨어 시스템 간 상호 운용성 제공
  • 계층 4 ( 전송 계층 )
    👉 네트워크 지원 계층과 사용자 지원 계층을 서로 연결, 네트워크 지원 계층이 전송 한것을 사용자 지원 계층이 사용할 수 있는 형태가 되도록 보장한다.

1- 물리 계층

  • 물리적으로 연결된 두 대의 컴퓨터가 전선을 통해 직접 데이터를 송수신할 수 있게 해주는 모듈
  • 목적 : 들어온 전기 신호를 그대로 전달하는 것
  • 동작 : 디지털 신호 < - > 아날로그 신호 ( encoding & decoding )
  • 규칙 : 물리 계층에서는 두 시스템 간 데이터를 전송하려고 링크를 활성화 하고 관리하는 전기적, 기계적, 절차적, 기능적 특성을 정의
  • 사용하는 장비 : 케이블, 허브
  • 전송단위 : 비트(Bit)

2 - 데이터 링크 계층

  • 출발 주소와 도착 주소를 확인하고 자신에게 보낸 데이터인지 아닌지 검사후 데이터 처리를 수행한다.
  • 목적 : 주소정보를 정의하고 정확한 통신이 되도록 하는 것( IP주소가 아닌 MAC 주소 )
  • 통신에서의 오류도 찾아주고 재전송하는 기능도 가지고 있다.
  • 사용하는 장비 : 스위치, 브릿지, 이더넷
  • 전송단위 : 프레임(Frame)

3 - 네트워크 계층

  • 경로(Route)와 주소(IP)를 정하고 패킷을 전달해주는 것이 이 계층의 역할이다.
  • 즉 목적지까지 가장 안전하고 빠르게 데이터를 보내는 기능을 한다. 최적의 경로 설정
  • 이런 라우팅 기능을 맡고 있는 계층이 네트워크 계층이다.
  • 전송단위 : 패킷

4 - 전송 계층

  • 양 끝단의 사용자들 간의 신뢰성있는 데이터를 주고 받게 해주는 역할
  • 송신자와 수신자 간의 신뢰성있고 효율적인 데이터를 전송하기 위하여 오류 검출 및 복구,흐름제어와 중복검사등을 수행한다.
  • 데이터 전송을 위해서 Port번호가 사용된다. 대표적인 프로토콜 TCP/ UDP
  • 전송단위 : 세그먼트(Segment)

5- 세션 계층

  • 응용 프로세스가 통신을 관리하기 위한 방법을 정의
  • TCP/IP 세션을 만들고 없애는 역할

6 - 표현 계층

  • 전송하는 데이터의 표현방식을 결정한다( 데이터변환, 압축, 암호화 )
  • GIF, JPEG, ASCII등
  • 송신자의 데이터해석 위한 데이터 부호화, 변화
  • 수신자에서 데이터의 압축을 풀 수 있는 방식으로 된 데이터 압축
  • 데이터의 암호화와 복호화

7 - 응용 계층

  • 사용자와 가장 가까운 계층
  • 우리가 사용하는 응용 서비스나 프로세스가 바로 여기서 동작
  • HTTP, FTP등의 프로토콜이 응용 계층에서 속한다.

profile
기록하는 습관

0개의 댓글