TIL

TIL_20230504

번잔중 2023. 5. 4. 23:55

오늘 할 일

  • LeetCode 데일리 문제 풀기
  • 자바의 정석 공부하기
  • 김영한의 스프링 입문 강의 듣기
  • 코드스테이츠 - Cloud > AWS > 3 Tier-Architecture 내용 노션에 정리하기
  • 원티드 프리온보딩
  • 큰돌님 CS 책 구매하기

오늘 배운 것

LeetCode 데일리 문제 풀기

  • 오늘의 문제: 649. Dota2 Senate(https://leetcode.com/problems/dota2-senate/)
  • 문제 조건
    • 도타2의 세계관에서 두 개의 연맹이 있다. - 레디언트와 다이어
    • 도타2 상원은 두 개의 연맹으로부터 상원의원들로 구성돼있다. 상원은 도타2 게임 내에서 변경을 할 수 있는 권한을 원한다. 이 변화에 대한 투표는 순환 기반의 절차이다. 매 회마다, 각 상원의원은 두 개의 권리 중 하나를 행사할 수 있다.
      • 다른 상원의원의 권한을 금지시킨다. - 상원의원이 다음 회부터 다른 상원의원의 모든 권한을 상실하도록 한다.
      • 승리를 공포한다. - 만약 이 상원의원이 투표할 권한이 아직 남은 상원의원들과 같은 연맹이라면, 승리를 공포하고 게임 내에서 상원이 바뀌도록 결정할 수 있다.
    • 상원의원이 속한 연맹을 알려주는 문자열 senate가 주어진다. 문자 R과 D는 레디언트 연맹과 다이어 연맹이다. 만약 n명의 상원의원이 있다면 주어진 문자열의 길이 또한 n이다.
    • 순환 기반의 절차는 주어진 순서에 따라 첫 번째 상원의원부터 마지막 상원의원까지이다. 이 절차는 투표가 끝날 때까지 계속된다. 그들의 권한을 잃은 모든 상원의원들은 절차 동안 무시한다.
    • 모든 상원의원이 충분히 똑똑하다고 가정하고 그들 자신의 연맹에 최고의 전략대로 플레이할 것이다. 마침내 승리를 공포하고 도타2 게임을 바꿀 연맹을 예측해라. 결과는 "Radient" 또는 "Dire"로 나와야 한다.
  • 문제 해결 과정
    • 문자열의 최대 길이가 10^4이지만 규칙상으로 10^4을 10^4만큼 순회하는 경우가 없다.
    • 문자열이 같은 값으로만 구성되어 있는 경우에는 해당 문자열에 해당하는 답을 반환한다. -> 근데 이걸 어떻게 함? 메소드를 하나 만들어보겠다.
    • 문자열을 하나씩 순회하면서 정답이 나올때까지 새로운 문자열을 만들어낸다.
    • 음 아닌 것 같다. 순서가 중요하니까 순서를 가지고 한번 해볼 생각
    • RDRDRDRD이면 매 라운드마다 다음 라운드로 진출하는 알파벳의 순서를 + 문자열의 길이만큼 해주면 라운드를 돌았을 때, 특정 라운드에 도달하면 하나의 알파벳만 남아 있을 것이다.
    • 그렇다면 리스트에 해당 인덱스를 저장하고 한 쪽 리스트가 빈 리스트가 될 때까지 반복을 하면 될 것 같다.
    • 코드를 작성하고 보니 앞에서부터 비교해야 하므로 리스트에서 while문을 못빠져나온다. remove로 계속 제거해주면서 값을 추가해줬는데 안되는 이유가... 내가 미친것 같다. 값을 계속 추가해줘놓고 빈 리스트가 되길 바라면 안된다.
    • 정리
      1. RDRDRD...로 된 문자열을 R이 해당하는 인덱스를 저장한 리스트와 D가 해당하는 인덱스를 저장한 리스트로 저장한다.
      2. 리스트의 맨 앞에 위치한 원소의 값(인덱스)끼리 비교했을 때 더 작은 수가 더 앞에 위치했다는 의미이므로 큰 수는 제거한 상태로 지나치고, 작은 수가 포함된 리스트에는 해당 원소의 값(인덱스)에 senate의 길이만큼 더해서 맨 뒤에 add해주면 다음 라운드도 살펴볼 수 있게 된 것이다.
      3. 이것을 반복하다보면 개수가 더 적은 쪽이 빈 리스트가 되기 때문에 리스트의 개수가 더 큰 것의 이름을 반환해주면 정답이 된다.

자바의 정석 공부하기

  • ch 6. 객체지향 프로그래밍 1에서 짧게 아래 내용만을 학습했습니다.
    • 3.7 JVM의 메모리 구조

김영한의 스프링 입문 강의 듣기

  • 섹션 4. 스프링 빈과 의존 관계 - 자바 코드로 직접 스프링 빈 등록하기 부분을 학습했습니다.
    • DI 방법에는 3가지가 있다. → 필드 주입, setter 주입, 생성자 주입. 이 중에서 생성자 주입을 권장한다.
    • 컴포넌트 스캔: 정형화된 컨트롤러, 서비스, 레포지토리에서 사용한다.
    • 스프링 빈 등록: 상황에 따라 구현 클래스를 변경해야 하는 경우에 사용한다. 수업 예시로는 아직 정해지지 않은 데이터 저장소를 우선 인터페이스 - 구현체로 구현한 후에 데이터 저장소가 정해지면 Config 파일에 있는 코드를 수정하면 스프링 빈에 등록될 때 올라가는 구현체만 바꿔주면 된다.
    • @Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작한다. 스프링 컨테이너가 관리하지 않는 객체에서는 동작하지 않는다.

코드스테이츠 - Cloud > AWS > 3 Tier-Architecture 내용 노션에 정리하기

  • 노션에 S3 부분을 학습하고 정리했습니다.
  • S3(Client) - EC2 - RDS의 3 Tier 구조를 학습했고, 추가로 Route 53 - CloudFront - S3 - EC2 - RDS로 도메인을 설정하면서 동시에 S3의 CDN의 역할을 하는 CloudFront까지 포함된 구조를 학습했습니다.

원티드 프리온보딩

  • 오늘은 컴퓨팅 파워(서버)와 관련된 AWS 서비스를 배웠습니다.
  • EC2
    • 온디맨드: 일반 사용자들이 가장 많이 쓰고, 할당된 자원을 독점해서 사용한다. 사용하는 만큼 결제한다.
    • 스팟 인스턴스: EC2처럼 사용하는 만큼 결제한다. 하지만 할당된 자원을 공유하기 때문에 사용 중 자원이 남는 상태에서 다른 서버가 자원을 사용하면 예기치 않게 서버가 종료될 수 있다. 그래서 비용적인 측면에서 상당히 저렴하다. 백엔드 쪽에서는 보통 Batch를 사용할 때 쓴다.
    • Saving Plans: 1년 또는 3년 동안 약정을 걸고 EC2나 Fargate의 사용량에 대해 저렴한 요금을 제공하는 서비스이다.
    • EC2는 기본적으로 Auto Scailing을 지원하기 때문에 인스턴스의 수를 AWS에서 조정해준다.
    • 탄력적 IP 주소: EC2는 기본적으로 임의의 IP가 할당된다. 이 때 고정 IP를 사용하기 위해서는 탄력적 IP를 생성해야 한다. 물론 비용이 들어간다.
  • Elastic Beanstalk
    • Elastic Beanstalk을 현업에서 많이 쓴다.
    • Elastic Beanstalk = EC2 + 배포 버전 관리(롤백) + Elastic Load Balancer + 모니터링 + 로그 트래킹 + 오토 스케일링
    • 애플리케이션 버전을 기록하기 때문에 롤백시 원하는 시점으로 돌아가 배포를 눌러주면 쉽게 롤백이 가능하다.
  • Fargate
    • 이전에는 컨테이너를 실행하기 위해서 컨테이너를 실행할 Instance(EC2)를 실행시켜야 했지만, AWS Fargate는 이러한 수고를 덜어줌
    • 주로 Docker에서 많이 사용한다.
    • EC2와 달리 Fargate는 Docker의 CPU와 RAM를 정해준다.
  • EC2 vs Fargate
    • 서비스 측면에서는 Fargate가 훨씬 간단하지만 다른 것을 쓴다. 그 이유는 가격 & 성능 이슈 때문이다.
    • 상황: 2개의 CPU, 8GB RAM
    • EC2 - 가격: 0.104 USD, 성능: 자체 제작 혹은 다양한 스펙의 프로세서를 사용
    • Fargate - 가격: 약 0.226 USD, 성능: 프로세서 정보 확인이 불가능하고, EC2보다 성능이 떨어지는 것으로 알려짐
    • 사이드 플젝, 학생이면 EC2를 쓸 것을 추천(머니 이쓔)
  • ECR
    • Docker 이미지의 보안성, 호환성 때문에 ECR을 사용한다.
  • ECS
    • AWS에서 제공하는 컨테이너 오케스트레이션 서비스로 여러 어플리케이션 컨테이너를 쉽고 빠르게 실행하고, 컨테이너를 적절하게 분배 및 확장 & 축소할 수 있도록 도와주는 서비스
    • AWS EC2와 AWS Fargate 중 원하는 환경에서 실행 가능 → 어떤 환경에서 구동할지 선택할 수 있다. 보통 더 편한 방법인 Fargate를 사용한다. (EC2는 Docker를 설치하고 다른 부분도 설정해주어야 하기 때문이다.)
    • ECS는 Docker 파일을 여러 개 묶어주는 역할(컨테이너 오케스트레이션)
  • Lambda
    • *Java 기반 개발의 경우는 Lambda가 적합하지 않다. JS, Python 기반의 개발을 한다면 추천
    • 서버 없이도 코드를 실행시킬 수 있는 서버리스 컴퓨팅 서비스 → 일명 ‘코드 뭉치 실행기’
    • 코드를 돌리기 위한 리소스를 임의로 지정할 수 있으며, 사용 리소스 x 사용 시간에 따라 과금이 된다. (ex. 메모리 용량 / 코어 개수)
    • 최대 15분 / 최대 10GB / 최대 6개의 Core
    • 사용 예시
      • 비동기 처리(이미지 썸네일 생성)
      • 예측이 불가능한 리소스 사용(대용량 처리 / 머신 러닝)

큰돌님 CS 책 구매하기

  • 책을 한번 읽어보고 사야겠습니다. 후기에 호불호가 갈리는 것 같아서 고민되네요!

느낀점

  • 리트코드에서 문제 설명이 아-주 긴 문제가 나왔습니다. Dota2 게임 과몰입러가 낸 문제 같습니다. 결론은 문자열의 입력된 순서에 따라 마지막까지 살아남는 상원의원을 구하는 문제였습니다. 입력된 순서에 집중해야 한다는 것을 늦게 깨달아서 빙빙 돌았네요. ㅎㅎ
  • 오늘은 프리온보딩 날이라서 시간을 쪼개고 쪼개서 활용하려고 노력했습니다! 그 결과 평소보다 더 빠르게 할 일들을 마무리 했네요. ㅎㅎㅎ
  • 코딩 카페를 다니고부터 저녁 시간을 쓸데없이 낭비하지 않게 되었습니다. 아주 만족스럽습니다. 취업이 되고 나서도 공부할 때 와야겠다는 생각이 듭니다!
  • 내일은 5월 5일 어린이날이라 알바도 쉬게 됐습니다. 그래서 친구들과 코딩 카페에 가서 같이 공부하기로 했습니다! 시간을 허투루 쓰지 않도록 내일은 아침부터 부지런히 움직이고 싶습니다!

내일 할 일

  • LeetCode 데일리 문제 풀기
  • 자바의 정석 공부하기
  • 김영한의 스프링 입문 강의 듣기
  • 코드스테이츠 - Cloud > 실습 - 서버 배포 > Full Stack Application 배포 내용 노션에 정리하기
  • Heart - 게시판 글 수정 및 삭제 이미지 처리 로직 작성하기
  • 운동하기 - 웨이트 트레이닝

'TIL' 카테고리의 다른 글

TIL_20230506  (0) 2023.05.06
TIL_20230505  (0) 2023.05.05
TIL_20230503  (0) 2023.05.03
TIL_20230502  (0) 2023.05.02
TIL_20230501  (0) 2023.05.01