• 네트워크란 무엇인가
    • 컴퓨터 또는 통신 장비들이 데이터를 공유할 수 있게 하는 디지털 전기통신망의 하나
    • 분산되어 있는 컴퓨터를 통신망으로 연결
    • 인터넷이란
      • 문서, 그림 영상과 같은 여러가지 데이터를 공유하도록 구성된 세상에서 가장 큰 네트워크
      • 네트워크 안에 포함된 것이 인터넷이고, 네트워크 안에 포함된 여러 통신망 중의 하나
      • 그 통신망을 이용해 '웹서비스'를 이용한다.
        • www이 인터넷이 아니다. 
          • www는 인터넷을 통해 웹과 관련된 데이터를 공유하는 것이다. 

https://youtube.com/playlist?list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi

  • 네트워크의 분류
    • 크기에 따른 분류
      • LAN : Local Area Network
        • 가까운 지역을 하나로 묶은 네트워크
          • 스타크래프트 배틀넷에 접속해서 플레이어 들이랑 만나서 플레이  할 때 근거리 통신망으로 이용한다. (같은 PC방에 있는 친구들끼리 만남)
        • 같은 네트워크 대역
      • WAN : Wide Area Network
        • 멀리 있는 지역을 한데 묶은 네트워크 
          • 가까운 지역끼리 묶인 LAN과 LAN을 다시 하나로 묶은 것 (여러 개의 LAN 네트워크 대역을 연결)
          • 인터넷을 통해 네이버를 접속한다? 
            • 네이버 LAN과 나의 LAN을 연결했다
    • 연결 형태의 따른 분류
      • Star형
        • 중앙 장비에 모든 노드가 연결된 것 
          • 가정집에서 공유기를 통해서 핸드폰, 컴퓨터, tv 등으로 연결한다. 
          • 가까운 지역에 있는 네트워크를 연결할 때, 하나의 LAN을 구성하려고 할 때 이 방식을 주로 채택
          • 멀리 있는 것을 직접 연결하려고 할 땐 선 길이당 돈이 드므로 가까운 걸 연결할 때 주로 사용 
      • Mesh형
        • 여러 노드들이 서로 그물처럼 연결
          • 우리나라가 다른 나라와 연결되어 있는 형태 
          • WAN대역에서 주로 채택함 
      • 혼합형
        • 실제 인터넷은 여러 형태를 혼합한 형태 (star + mesh 등의 조합)
  • 네트워크의 통신방식
    • 네트워크에서 데이터는 어떻게 주고 받는가?
      • 유니캐스트 : 내가 통신하고 싶은 특정 대상(한 사용자)이랑만 
      • 멀티캐스트 : 같은 네트워크 대역에서 여러 사용자가 있다고 했을 때 특정한 다수와 통신을 하는 것 
      • 브로드캐스트 : 같은 네크워크 대역에 있는 모두와 통신
  • 네트워크 프로토콜
    • 프로토콜이란?
      • 일종의 약속, 양식 
      • 네크워크에서 노드와 노드가 통신할 때 어떤 노드가 어느 노드에게 어떤 데이터를 어떻게 보내는지 작성하기 위한 양식 
      • 각 프로토콜들도 해당 프로토콜만의 양식이 있음 
    • 여러가지 프로토콜
      • 하고 싶은 네트워크 방식에 따라서 멀리, 가까이, 인터넷을 하고 싶다, 파일공유를 하고 싶다 등 여러가지 상황에 맞는 여러 프로토콜이 있음 
        • 가까운 곳과 연락할 때 : Eternet (MAC 주소)
        • 멀리 있는 곳과 연락할 때 : ICMP, IPv4, ARP (IP주소)
        • 여러가지 프로그램으로 연락할 때 : TCP, UDP (포트 번호)
      • 패킷 
        • 여러 프로토콜들로 캡슐화 된 것 
          • Ethernet + IPv4 + TCP + 데이터 
            • 가까운 곳만 통신하고 싶다 그래서 이더넷만 사용? (X)
            • 데이터를 어떤 프로그램에 (TCP) 얼마나 멀리 (IPv4) 어느 컴퓨터에 (Ethernet) 
            • 특정 프로토콜로만 통신하지 않고 여러 프로토콜이 결합된 형태로 통신을 한다.

 

구글과 나는 어떻게 연결되는 가 

  • $ tracert 8.8.8.8 로 확인해보면 10개 이상의 LAN 을 통해 연결되는 것을 알 수 있다.

용도에 맞는 프로토콜을 사용한다. 

네이버를 접속했다고 가정하면, IPv4프로토콜을 이용해 판교에 있는 네이버 본사 iptime까지 접속하고 거기서 가까운 서버로 접속하기 위해 Ethernet 프로토콜을 사용하고, 크롬 프로그램과 네이버 프로그램을 연결하기 위해 TCP 프로토콜을 사용함 

 

 

 

 

출처 : https://youtube.com/playlist?list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi 

  • volatile 키워드는 오직 한개의 쓰레드에서 쓰기 작업을 할때, 그리고 다른 쓰레드는 읽기작업만을 할 때 안정성을 보장
  • 하지만 AtomicInteger는 여러 쓰레드에서 읽기/쓰기작업을 병행합니다.
  • 그래서 CAS 알고리즘을 사용하여 2중 안전을 기하는 방법을 사용합니다.

  • 여러 스레드가 잠금을 얻으려고 시도하면 그 중 하나가 승리하고 나머지 스레드는 차단되거나 일시 중단됨
  • 스레드를 일시 중단했다가 다시 시작하는 프로세스는 비용이 많이 들고 시스템의 전반적인 효율성에 영향을 줌
  • 카운터와 같은 작은 프로그램에서는 컨텍스트 전환에 소요되는 시간이 실제 코드 실행보다 훨씬 길어 전체 효율성 크게 떨어짐
  • 여러 스레드가 CAS알고리즘을 통해 동일한 값을 업데이트하려고 하면 그 중 하나가 승리하고 값을 업데이트합니다.
    • 그러나 잠금의 경우와 달리 다른 스레드는 일시 중단되지 않습니다.
    • 대신, 그들은 단순히 값을 업데이트하지 않았다는 알림을받습니다.
  •  컨텍스트 전환이 완전히 방지되어 동기화 블록을 사용하여 성능을 낮추지 않아도 된다.

Java Singleton에 대해 PPT로 정리한 내용

 

환율 정보를 가져오는 작은 서비스를 개발해야 하는데 이번 기회에 AWS Lambda 를 이용해보기로 하였다. 

참고 자료를 찾아보는데 Java를 이용해서 AWS Lambda 서비스를 만든 사례를 찾기 어려워 꽤나 헤매었다;

환율을 가져오는 자세한 로직은 제외하고, 설정 및 테스트 부분만 포스팅해보겠다.

 

 

CloudWatch Events를 Trigger로 하여 정해진 시간에 한번씩 Currency 정보를 가져오게끔 하였다. 

 

런타임 설정 

 

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.LambdaLogger;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Map;

// Handler value: example.Handler
public class CurrencyHandler implements RequestHandler<Map<String,String>, String>{
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    @Override
    public String handleRequest(Map<String,String> event, Context context)
    {
        LambdaLogger logger = context.getLogger();

        String response = "200 OK";
        // log execution details
        logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
        logger.log("CONTEXT: " + gson.toJson(context));
        // process event
        logger.log("EVENT: " + gson.toJson(event));
        logger.log("EVENT TYPE: " + event.getClass());
        return response;
    }
}

 

pom.xml

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation platform('software.amazon.awssdk:bom:2.10.73')
    implementation 'software.amazon.awssdk:lambda'
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'
    implementation 'com.amazonaws:aws-lambda-java-events:3.1.0'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'org.apache.logging.log4j:log4j-api:2.13.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.13.0'
    runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.13.0'
    runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
}

test {
    useJUnitPlatform()
}

task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
    }
}

 

중요한 포인트는 소스 파일을 AWS Lambda에 올릴 때 사이즈가 50MB 이 넘어가면 S3에 소스코드를 올려야 한다.

이때 zip으로 package한 결과물을 올려야 하는데 이 부분에서 애를 많이 먹었다 :,-(

배포를 jar로만 했었는데 zip으로 하는 방법도 몰랐고, 그렇게 해야하는 건 줄도 몰랐다 ^^;;;

pom.xml에 zip으로 빌드한다는 내용을 입력하고, 'gradle buildZip'를 하면 

프로젝트\build\distributions 디렉토리 내 zip으로 빌드된 파일이 생성되고 이것을 S3에 올리면 된다. 

 

먼저 변수에 대한 깊은 이해를 도울 수 있게한 아래 글을 공유한다.

 

m.blog.naver.com/heartflow89/220954420688

 

[JAVA/자바] 메모리 구조(static, stack, heap)

이번 글은 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다....

blog.naver.com

이런 보석같은 글을 발견하게 되어 기분이 참 좋다 :) 👍 

 

자바를 공부할 때 변수에 대한 지식은 어느 정도 익히긴 했지만 내가 이것을 정확하게, 적절하게 사용하고 있는지에 대한 의구심이 있었다. 

마침, 사수님이 static에 대한 짧은 발표를 준비하라고 하셔서 이참에 자바 변수에 대한 정확한 이해를 하고 가자 결심하게 됐다. 

 

 

정리하자면,

  • 변수는 선언위치에 따라 클래스변수, 인스턴스변수, 지역변수로 나뉜다.
  • 각 변수들은 메모리 내에서 저장되는 위치가 다르다.
  • 전역변수는 static에, 기본자료형의 지역변수는 stack에, 참조형 타입 객체 및 배열은 heap에 저장된다.
  • new 클래스();로 생성되는 참조형 타입 객체 및 배열의 데이터는 heap영역에 저장되고, 이 저장된 영역의 주소(참조값)는 stack영역에 저장된다
    • 개인적으로 이는 Primitive Type과 Refernce Type을 이해하는 데에 있어 중요한 부분인 것 같아 핵심이라 생각함 

 

 

 

왜 자바에서 static의 사용을 지양해야 하는가?

자바에서 데이터를 가공하거나 특정 메서드를 수행할 때 새로운 클래스를 만들어서 이를 인스턴스화 해서 쓸건지 아니면 static 으로 쓸건지 고민하게 될 때가 있다. 사실 후자는 객체지향적 관

unabated.tistory.com

 

아래에는 발표를 위해 내가 준비한 PPT 파일이다.

 

 

 

참조 : 자바 성능 튜닝이야기 (이상민 지음)

+ Recent posts