주노 님의 블로그

20241010 본캠프 59일차 TIL 본문

TIL

20241010 본캠프 59일차 TIL

juno0432 2024. 10. 10. 23:21

본캠프 59일차 내용 간단요약

  • 9:00 ~ 11:00 : 면접 준비
  • 11:00 ~ 11:20 : 면접
  • 12:00 ~ 13:00 : 점심시간
  • 13:00 ~ 18:00 : redis 강의
  • 18:00 ~ 19:00 : 저녁시간
  • 19:00 ~ 21:00 : 개인과제 마무리

면접

더보기

면접 준비는 비공개글에!

 

두괄식 중요하다

주절주절은 잘 안읽을 경향이 높으니

두괄식으로 먼저 말하기


redis

더보기

redis란?

  • 키 값 구조의 비정형 데이터를 저장하고 관리하기 위한 nosql의 dbms이다.
  • 장점
    인메모리에 모든 데이터를 저장하고,
    기존 데이터베이스는 disk에 데이터를 저장하지만, redis는 ram에 데이터를 저장해서 처리속도가 월등히 빠르다
  • 어디서쓰나 왜 redis를 써야하나?
    캐싱 : redis는 메모리 내에서 데이터를 처리하기때문에 속도가 빠르다, 따라서 성능을 크게 향상시킨다
    세션관리 : 세션 정보는 일반적으로 빠르게 읽고 써야하는데이터로 redis를 사용하면 성능이 좋다
    실시간 분석 및 통계 : 실시간 데이터 처리는 빠른 작업속도를 요하는데 redis는 데이터를 매우 빠르게 읽고쓸수                                     있다.
    메세지 큐 : redis pub/sub기능이나 리스트를 이용한 메세지 큐 구현이 가능하며, 빠른 속도로 처리가 가능하다
    지리공간 인덱싱 : redis는 지리공간 데이터를 다룰수있는 geo기능을 제공한다
    속도 제약 : 높은 트래픽을 효율적으로 처리할수있으며 대규모 데이터셋에서도 빠른 응답을 보장한다
    실시간 채팅 : 낮은 지연과 빠른 응답성이 중요하기때문에 실시간 채팅에 사용한다
    대용량 데이터 처리 : 대용량 트래픽을 처리하기 위해 필수적으로 사용되는 기능이 redis의 캐싱기능이다

    따라서 redis는 속도 및 다양한 데이터 구조 지원으로 위와같은 시나리오에 자주 사용된다.

redis를 설치해보자

  • ubuntu / docker 설치
  • 레디스 설치
    #redis를 가져오는 명령어
    user@localhost:~$ docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    302e3ee49805: Already exists
    378d889b37dd: Pull complete
    e4edbcee329b: Pull complete
    c78d46bd3323: Pull complete
    4b3c79aadafc: Pull complete
    99f3f5284f55: Pull complete
    4f4fb700ef54: Pull complete
    1f4a511d4985: Pull complete
    Digest: sha256:541209804a009ab69e97a06504706cfe83be2693150885fa08ed05a91f243089
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    #도커 이미지 파일을 실행시키는 명령어 (컨테이너화)
    user@localhost:~$ sudo docker run --name redis-test -d -p 6379:6379 redis
    [sudo] password for user:
    7a113bf741187bc6fcab23c76e6cff09a6483896f4f32270a378f6eafff7079b
    #현재 실행중인 컨테이너 확인
    user@localhost:~$ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
    7a113bf74118   redis     "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp   redis-test
    #redis Cil로 접속하는법 (레디스 안에 들어가서 명령어를 치는방법)
    sudo docker exec -it redis-test redis-cli
    127.0.0.1:6379>

    그 후 ping을 했을때 pong이 날라온다면 정상적으로 설치된것이다
    127.0.0.1:6379> ping
    PONG


redis의 기본명령어

  • 데이터 <key, value>정의하기
    set : set [key] [value]
    get : get [key] >> [value] / 없을경우 (nil)
    keys * : 저장된 모든 key 조회하기
    del [key] : key로 데이터 삭제하기
    set [key] [value] ex 시간(초) : 만료시간 설정하기
    ttl [key] 만료시간 확인하기
    flushall : 모든 데이터 삭제하기
    # set을 사용하여 juno:name의 키값에 juno인 value를 넣는다
    127.0.0.1:6379> set juno:name "juno"
    OK
    # set을 사용하여 위와같이 넣는데 따옴표를 쓰면 띄어쓰기를 지정할수있다
    127.0.0.1:6379> set juno:hobby "sleep sleep long sleep"
    OK
    #띄어쓰기를 쓰지않는다면 따옴표를 쓰지 않아도 된다
    127.0.0.1:6379> set juno:telNo 010
    OK
    #해당 키값의 value를 조회할 수 있음
    127.0.0.1:6379> get juno:name
    "juno"
    127.0.0.1:6379> get juno:hobby
    "sleep sleep long sleep"
    127.0.0.1:6379> get juno:telNo
    "010"
    #모든 키를 조회 할 수 있다
    127.0.0.1:6379> keys *
    1) "juno:telNo"
    2) "juno:name"
    3) "juno:hobby"
    #해당 키를 삭제한다
    127.0.0.1:6379> del juno:name
    (integer) 1
    #삭제된 키의 value를 조회하며 (nil)인 경우 없음을 의미한다
    127.0.0.1:6379> get juno:name
    (nil)
    #데이터를 정의하는데 만료시간인 30초를 주어준다
    127.0.0.1:6379> set juno:pet dog ex 30
    OK
    #ttl을 사용하여 해당 키의 만료시간을 확인 할 수 있다
    127.0.0.1:6379> ttl juno:pet
    (integer) 21
    #해당 키가 남아있는것을 볼 수 있다
    127.0.0.1:6379> get juno:pet
    "dog"
    # 시간이 지나자 -2가 된다
    127.0.0.1:6379> ttl juno:pet\
    (integer) -2
    # 만료 시간이 지나자 get을 하면 nil을 반환하는것을 볼 수 있다
    127.0.0.1:6379> get juno:pet
    (nil)
    # juno:hobby는 만료시간을 정해주지 않았으며, -1을 반환하는것을 볼 수 있다
    127.0.0.1:6379> ttl juno:hobby
    (integer) -1
    # 모든 키를 삭제하기위해 전체 키를 조회한다
    127.0.0.1:6379> keys *
    1) "juno:telNo"
    2) "juno:hobby"
    #전체 키 삭제 명령어를 보내면
    127.0.0.1:6379> flushall
    OK
    #모든 키가 사라진것을 볼 수 있다.
    127.0.0.1:6379> keys *
    (empty array)


  • redis key 네이밍 컨벤션
    :(콜론)을 활용해 계층적으로 의미를 구분한다
    users:100:profile >> users에서 pk가 100인 사용자의 profile
    products:123:details >> products중에서 pk가 123인 products의 details

Redis의 캐싱 전략

  • 캐시란?
    디스크를 사용하는 데이터베이스보다 더 빠르게 가져올수 있는 임시 데이터 저장소이다

  • 캐싱이란?
    캐시에 접근해서 데이터를 빠르게 가져오는 방식을 의미한다 

  • redis의 캐싱 전략
    Cache Aside (= Look Aside, Lazy Loading)전략
    >> 데이터를 조회할때 주로 사용하는 전략이다
    1. 데이터 저장 :사용자가 들어와 글을 저장한다 (이때는 원본 저장소에 저장된다)
    2. 데이터 조회 : 사용자가 데이터를 조회한다, 이때 레디스에 있는지 확인하게 된다
    3. 캐시 미스 : 레디스에 데이터가 없는것을 호가인하고 데이터베이스에 조회한다
    4. 캐시 업데이트 : 데이터베이스는 응답하며 레디스에도 저장한다.
    5. 캐시 히트 : 다시한번 사용자가 해당 데이터를 조회하려고 한다.
    6. 레디스에 해당 데이터가 존재해서 레디스로부터 데이터를 가져온다.

    캐시 업데이트는 lazy loading 방식으로 데이터가 요청되기 전까지는 캐시를 채우지 않다가, 필요할때만 업데이트한다.

  • Write Around 전략
    데이터를 저장할때는 redis에 등록하지않고 데이터베이스에 등록만해준다

  • 문제점
    Cache Aside의 문제점
    위의 1,2,3,4순서는 그대로지만, 중간에 db를 수정했다면?
    user name이 준오 였는데 앗차차 준호였구나? 하면서 수정했다면 redis의 데이터와 db의 데이터가 다를것이다.
    또한 캐시에 저장할수있는 용량이 적다

  • 어떻게 극복할까?
    캐시를 적용시키기에 적절한 데이터
    캐시를 적용시키기에 적절한 데이터가 있다
    자주 조회되는 데이터, 잘 변하지않는 데이터, 정확하게 일치하지 않아도 되는 데이터
    위 방식이 있지만, 계속 캐시에 hit를 치면 될까?
    ttl을 사용하여 만료시간을 적절히 제공하여 수시로 갱신하는 방법이 있다
    ttl을 사용하면, 수시로 갱신되고, 사용되지않는 캐시도 정리된다.

데이터 조회 성능을 개선하는 방법

  • SQL 튜닝
  • 캐싱 서버 활용
  • 레플리케이션
  • 샤딩
  • DB 스케일업 (하드 업그레이드)

  • 위 방법중에 어떤 방법을 사용해야할까?
    SQL튜닝을 먼저 사용해야한다
    다른 방식은 다 돈이듬 ㅇㅇ...
    그리고 SQL을 튜닝해야지 근본적인 문제를 해결할수 있다.


개인과제

더보기

개인과제를 위한 준비를 하자

 

12. AWS 활용 마스터
공통사항
각 AWS 서비스의 콘솔에서 내가 만든 서비스들의 설정 화면을 캡쳐하여 README.md에 첨부하세요.
12-1. EC2
EC2 인스턴스에서 어플리케이션을 실행하세요.
탄력적 IP를 설정해서 외부에서도 접속할 수 있도록 해주세요.
서버 접속 및 Live 상태를 확인할 수 있는 health check API를 만들고 README.md 에 기재하세요.
health check API는 누구나 접속 가능해야 해요.
API path는 편하게 정해도 괜찮습니다.
12-2. RDS
RDS에 데이터베이스를 구축하고, EC2에서 실행되는 어플리케이션에 연결하세요.
12-3. S3
S3 버킷을 생성하여 유저의 프로필 이미지 업로드 및 관리 API를 구현하세요.

 

1. HEALTH CHECK를 적용할 API를 구현하고.

2. 일단 S3를 이용해 파일 업로드를 구현하고

3. RDS를 사용하여 데이터를 저장하고

4. 그다음 스프링부트를 DOKER로 컨테이너화하여 EC2로 실행시키고

5. 탄력적 IP를 통해 IP를 고정시키고

6. ELB를 사용하여 HEALTH CHECK를 적용한다

 

각각 왜쓰는가?
EC2 : 하루종일 개인이 서버를 올릴 수 없다. 대신 24시간 돌려주는 대여용 서버를 구매하는것
탄력적 IP : EC2가 중지되었다가 재개하면 IPV4 주소가 지속적으로 바뀐다, 그것을 방지하기위한 고정된 IP를 제공받는것
ELB :  ELB는 트래픽을 적절하게 분배하는 장치이다. 로드밸런서라고도 하며, 여러대의 EC2 장치가 있을때 적절하게 트래픽을 분배하며, 중간중간 EC2서버가 뻗지 않았는지 체크를한다. 그 Health Check 기능이 담겨있다
RDS : 데이터베이스 대여용 서버이다
S3 : 파일 업로드 다운로드 에 특화된 대여용 서버이다

@RestController
public class HealthCheckController {
    @GetMapping("/health")
    public ResponseEntity<String> healthCheck() {
        return ResponseEntity.ok("pong");
    }
}

 

일단 ELB를 위한 헬스체크 API를 만들어준다

200OK만 반환하면 되기때문에 아무메세지나 넣어도된다.

 

S3를 이용해 파일 업로드를 구현해보자

 

'TIL' 카테고리의 다른 글

20241007 본캠프 57일차 TIL  (0) 2024.10.07
20241004 본캠프 56일차 TIL  (0) 2024.10.04
20241002 본캠프 55일차 TIL  (0) 2024.10.02
20241001 본캠프 54일차 TIL  (1) 2024.10.01
20240930 본캠프 53일차 TIL  (0) 2024.09.30