웹 소켓이란 ?

HTML5 에서 정의한 프로토콜이다. 클라이언트와 서버 간의 양방향 통신을 가능하게 한다.

HTTP 프로토콜과 달리, 웹 소켓은 지속적인 연결을 유지하면서 실시간으로 데이터를 주고받을

수 있다. 이는 채팅, 실시간 알림과 같은 애플리케이션에서 사용된다.

 

웹 소켓의 동작 방식

1. 핸드셰이크(Handshake)

  • 웹 소켓 통신은 일반적인 HTTP 요청으로 시작한다. 클라이언트는 웹 소켓 연결을 시작하기
    위해 서버에 HTTP 요청을 보낸다.
  • 서버는 요청을 수락하고, HTTP 응답을 보내면서 프로토콜을 웹 소켓으로 업그레이드한다.

2. 연결 유지

  • 핸드셰이크가 완료되면, 클라이언트와 서버 간의 연결은 지속적으로 유지된다.
  • 이 연결을 통해 양방향 통신이 가능하며, 클라이언트와 서버는 언제든지 메시지를 주고받을
    수 있다.

3. 데이터 전송

  • 클라이언트와 서버는 웹 소켓 프레임을 통해 데이터를 전송한다. 프레임은 작은 단위의 데이터 조각이며,
    여러 프레임이 모여 하나의 메시지를 구성할 수 있다.
  • 데이터는 텍스트 또는 바이너리 형식으로 전송될 수 있다.
STOPM 란 ?

- STOMP (Simple (or Streming) Text Oriented Messaging Protocol)는 메시징 시스템에서 사용하는 프로토콜로,

클라이언트와 서버 간의 메시지 전송을 위해 설계되었다. 주로 웹 소켓[각주:1]과 함께 사용되어 실시간 통신을 가능하게 한다.

STOMP는 텍스트 기반 프로토콜로, 메시지를 전송하기 위한 간단한 명령 세트를 제공한다.


STOMP의 주요 개념 및 동작 방식

 

1. Connect and Disconnect (연결 및 연결 해제)

  • 클라이언트는 서버에 연결하기 위해 'CONNECT' 프레임을 전송
  • 서버는 연결이 수락되면 'CONNECTED' 프레임을 응답
  • 연결 해제는 'DISCONNECT' 프레임을 사용

2. Send (메시지 전송)

  • 클라이언트는 서버로 메시지를 보내기 위해 'SEND' 프레임을 사용
  • 메시지는 특정 목적지(destination)를 가지며, 이 목적지는 구독자가 메시지를 수신할 때 사용된다.

3. Subscribe and Unsubscribe (구독 및 구독 취소)

  • 클라이언트는 특정 목적지의 메시지를 수신하기 위해 'SUBSCRIBE' 프레임을 전송
  • 구독을 취소은 'UNSUBSCRIBE' 프레임 사용

4. Message (메시지)

  • 서버는 클라이언트에게 메시지를 전송할 때 'MESSAGE' 프레임 사용
  • 'MESSAGE' 프레임은 클라이언트가 구독한 목적지로부터의 메시지를 포함

5. Acknowledge and Nacknoewledge (확인 및 비확인)

  • 클라이언트는 메시지를 성공적으로 처리했음을 나타내기 위해 'ACK' 프레임을 전송할 수 있다.
  • 메시지를 처리할 수 없을 경우 'NACK' (Negative Acknowledgement)프레임을 전송할 수 있다.

STOMP 프레임 구조

 

  • COMMAND : 프레임의 종류를 나타낸다. ('CONNECT', 'SEND', 'SUBSCRIBE' 등)
  • Headers : 명령과 관련된 추가 정보를 제공한다. (각 헤더는 'key:value' 형식으로 작성)
  • Body : 메시지의 내용이 포함 (빈 줄 다음에 위치하며, '@' 문자가 프레임의 끝을 나타낸다)

 


STOMP 동작 예시

1. 클라이언트가 서버에 연결                         2. 서버가 연결 수락                        3. 클라이언트가 특정 목적지 구독 


                          4. 서버가 클라이언트에게 메시지 전송                           5. 클라이언트가 서버로 메시지 전송

  1. 웹 브라우저와 웹 서버 간의 양방향 실시간 통신을 가능하게 하는 기술 [본문으로]


- JWT(JSON Web Token)는 정보를 안전하게 전송하기 위한 웹 표준으로 클라이언트와 서버 간의 인증과 정보 교류를 위해 사용된다. JWT는 JSON 형식으로 되어 있으며, 암호화된 토큰으로서 클레임(Claim)이라는 속성들을 포함하고 있다.

 

JWT의 세가지 구성 요소

 


1. Header, JWT의 종류와 사용하는 알고리즘에 대한 정보를 담고 있다.

 


 

 

2. Payload, 실제로 전송할 클레임(Claim) 정보를 포함한다.

클레임에는 사용자의 정보나 추가적인 메타데이터를 포함한다.

 


3. Signature, Header와 Payload의 내용을 Base64로 인코딩한 후,

비밀 키를 사용하여 서명된 부분으로 이를 통해 JWT의 무결성을 검증할 수 있다.


JWT의 사용

  • 인증(Authentication) : 사용자가 로그인할 때 JWT를 발급하여 클라이언트에게 전달한다. 
    클라이언트는 로그인 이후 요청에 해당 JWT를 포함시켜 사용자(본인)을 인증한다.
  • 정보 교류(information Exchage) : 클라이언트와 서버 간의 안전하게 정보를 교환하는 데 사용된다.
    JWT를 사용하면 HTTP 요청 헤더[각주:1]나 URL 파라미터에 포함해 사용할 수 있다.
  • Stateless 서비스 : JWT는 서버 측에서 세션 상태를 유지하지 ㅇ낳고도 인증을 처리할 수 있어
    stateless한 서비스 설계에 유리하다.
  1. URL 파라미터 보다 JWT의 노출없이 전송할 수 있는 HTTP 헤더를 통한 요청이 보통 사용된다 (Autorization: Bearer JWT 형식) [본문으로]

로컬 환경에서의 Redis 설정 방법 익히기


로컬환경에서의 기본적인 RedisConfig 설정방법

 

 

의존성 추가


RedisRepositorytConfig 설정


 

 

 

RedisProperties

- Spring boot에서 Redis 관련 설정을 담는 클래스이다.

 

spring.data.redis

- prefix 값으로 해당 위치에 redis 관련 값 즉 host, port 및 password 등을 넣게 되면 해당 객체가 생성될때 명시해준 값으로 오버라이딩돼 들어가게 된다. 

 

(로컬환경에서의 테스트때는 RedisProperties에 host로 localhost와 기본 Redis port인 6379가 들어가있기 때문에 application.properties 또는 yml에 별도의 설정을 하지 않아도 작동한다)

 

 


RedisConnectionFactory

- Redis와의 연결을 관리하기 위한

인터페이스로 Redis 클라이언트 구현체인 Lettuce나 Jedis 등을 이용해 Redis 서버와의 연결을 설정하고 제어한다.

 

- 대표 메서드로 getConnection 메서드는 Redis 서버와의 연결을 생성하고 반환한다.



LettuceConnectionFactory

- Redis 서버와의 연결을 관리하기 위한 구체적인 구현체 중 하나이다.

현재는 host와 port만 파라미터로 넣어 구현체로써 사용하고 있지만,

@Bean
public LettuceConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
    redisConfig.setPassword(redisPassword);
    return new LettuceConnectionFactory(redisConfig);

이 처럼 RedisStandaloneConfiguration 을 이용해 password도 적용시켜 사용하는 방법이 존재한다.

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

[Spring Boot] STOPM란  (0) 2024.06.18
[Security] JWT란 ?  (0) 2024.06.18
accessToken 재발행 오류 처리(Filter 내에서의 오류 처리)  (0) 2024.04.19
RedisUtil (get, set 설정)  (0) 2024.04.16
RedisRepositoryConfig 설정  (0) 2024.04.16

EC2 인스턴스에 프로젝트 build 방법 익히기

  • build 하기 전에 EC2에 설치돼 있는 MySQL에 테이블과 필드 생성해놓기
  • build 하기 전에 MySQL을 백그라운드에서 실행해놓기 (sudo systemctl start mysql)
  • build 하기 전에 MySQL이 사용할 port 3306을 인스턴스 보안 그룹의 인바운드 규칙에 생성해놓기

1. 

프로젝트 디렉토리에서 실행

./gradlew build

- gradlew build 명령어를 사용해 gradlew를 실행 한다.

- 앞에 붙는 .은 현재 디렉토리를 뜻한다. (무언가의 실행할 때의 명령어로 봐도 무방)

- gradlew의 ew는 excute wrapper의 줄임


> 이때 Permission denied가 나온다면 gradlew 파일의 실행권한이 없는 것으로 

chmode +x gradlew 명령어로 파일에 실행권한을 부여한 다음 다시 build 명령어 실행

  • chmode > change mode
  • + > 권한부여 명령어
  • x > excute의 x

잠시 후 해당 문구가 출력 된다면 이후의 글은 볼 필요 없다.


2.

build가 실패할 때의 대처

  1. root project > [여기에 스크린샷과 같이 문구들이 나와준다면 일단은 진행이 되는 상태]
  2. root project > [여기에 아무 문구가 나오지 않는다면 빌드 실패의 징조]

위의 2번 또는 다음 스크린샷과 같은 상태에서도 멈춰있게 된다면 그 역시 build가 실패할 징조이다.


이유는 ?

- RAM이 부족하기 때문, 프리티어로 생성한 인스턴스이기에 프로젝트의 용량이 커진다면 이와같이 build에 실패할 수 있다. 다음글을 보고 실제 RAM이 아닌 SWAP 기능을 이용해 적은 메모리로도 build를 성공시킬 수 있도록 설정해보자.

 

2024.06.16 - [Java/배포해보자] - EC2 Swap 기능 활용 (feat. build 실패)

 

EC2 Swap 기능 활용 (feat. build 실패)

EC2의 Swap 기능이란 ? EC2 인스턴스에 내 프로젝트를 빌드할때 실패를 경험함과 동시에 해결하기 위해 알게된 기능이다.Swap은 일반적으로 메모리 부족 상황에서 시스템의 안정성을 유지하기 위해

subray.tistory.com

 

 

 

 

 

EC2의 Swap 기능이란 ? 

EC2 인스턴스에 내 프로젝트를 빌드할때 실패를 경험함과 동시에 해결하기 위해 알게된 기능이다.

Swap은 일반적으로 메모리 부족 상황에서 시스템의 안정성을 유지하기 위해 사용되는 기능이다. 
물리적인 RAM이 부족할 때 사용되는 가상 메모리 공간을 의미한다.

가령 1초에 1의 일을 처리하는 RAM이 있을 때, 1초에 2의 일을 요구받으면 과부하가 발생할 수 있다. 이 때, RAM이 1초에 처리하는 일의 절반을 실제 디스크 공간 (HDD 또는 SSD)에 임시로 저장한 후, RAM이 이전 작업을 완료하면 해당 임시 데이터를 다시 불러와 처리함으로써, 느리지만 과부하 없이 작업을 완료할 수 있게 한다.

 

1. 권장 Swap 공간 확인하기

- 내가 사용하는 인스턴스 유형인

t2.micro는 RAM이 1GB이다.

그렇기에 권장 스왑 공간인 2GB까지만 늘려주도록 하자.

명령어 free로 실제 RAM의 크기를 확인할 수 있다. (980420KB)

 



2. swapfile 생성하기

 

sudo dd if=/dev/zero of=/swapfile bs=128M count=16

- 위 명령어 통해 swapfile 생성하기

  1. dd > [Data Duplicator] unix 계열 시스템에서 데이터를 복사하거나 변환하는 명령어
  2. if > [Input File] /dev/zero[각주:1] 지정
  3. of > [Output File] /swapfile 지정
  4. bs > [Block Size] swapfile의 크기 지정
  5. count > swapfile의 개수

풀어보자면 dd 명령어에 'if=/dev/zero' 옵션을 사용해 '/dev/zero' 장치에서 0으로 채워진 데이터를 읽어와 'of=swapfile' 옵션으로 지정한 파일에 해당 데이터를 복사한다. 이때 bs를 통해 적절한(내 프로젝트의 규모에 따라) swapfile의 크기를 지정해주고 count를 통해 swapfile로 지정한 Block의 개수를 지정해 총 사용량 용량을 맞춰준다. (지금은 2GB)

 

이렇게 생성된 Swapfile들이 RAM과 같은 역할을 해주게 되는 것.



3. swapfile 권한설정

사용 설정

- sudo chmod 600 /swapfile로 사용자의 읽기 권한 (Read): 숫자 4 + 쓰기 권한 (Write): 숫자 2 = 6을 지정해주자.

- sudo mkswap /swapfile 만들어둔 /swapfile을 swapfile의 영역으로 지정해주자.


4. 활성화 정보 확인

 

 

- sudo swapon -s를 입력해 내가 지정한 swapfile의 용량으로 설정됐는지 확인하자.


Swap 설정 완료 후 다시 build 해보기 !

2024.06.16 - [Java/배포해보자] - [배포 4] 프로젝트 build

 

[배포 4] 프로젝트 build

EC2 인스턴스에 프로젝트 build 방법 익히기build 하기 전에 EC2에 설치돼 있는 MySQL에 테이블과 필드 생성해놓기build 하기 전에 MySQL을 백그라운드에서 실행해놓기 (sudo systemctl start mysql)build 하기 전

subray.tistory.com

 


그렇다면 부족한 RAM을 Swap으로 해결하는 것이 항상 해답일 수 있을까 ?

 

Swap 공간은 RAM 보다 접근 속도가 느리기 때문에 실제 RAM 보다 성능이 떨어질 수 있어 실질적인 대안책은 아니다. 정교한 Swap 설정을 통해 메모리 부족으로 인한 시스템 다운을 방지하는 용도로 사용하는 것이 현명하다.

 

지금은 우리가 대규모 서버나 데이터베이스 서버를 운용하는 것이 목적이 아닌, 프로젝트 build를 성공해보는 것이 목적이기 때문에 사용했다. 추후 실제 서비스되는 프로그램에서의 사용은 조금 더 신중해야할 것 같다.
  1. Unix 및 Unix 계열 시스템에서 사용되는 가상 장치(Virtual Device) 중 하나이다. 이 장치는 데이터를 읽을 때마다 항상 0(제로) 바이트만 반환한다. [본문으로]

+ Recent posts