Ep.4 CS가 개발에 중요한 이유 (백엔드 사례 위주로 설명합니다)

CS가 왜 중요한지 실제로 사례를 들어주심. 경각심이 들었고 CS는 평생 공부해야겠다는 마음가짐이 생김. 영상을 보며 정리해보았음

CS란?

컴퓨터가 어떻게 동작하고 프로그램이 어떻게 실행되는지 그 기본 원리를 탐구하고 설명하는 확문

CS를 왜 중요하다 생각하게 되었는가?

  • CS를 잘 알수록 좋은 성능의 애플리케이션 만들 수 있음
  • CS를 잘 알수록 더 안정적이고 더 온전하게 운영 가능(데이터 정합성, 보안 등등)
  • CS를 잘 알수록 학습 속도가 향상될 수 있음
  • CS를 잘 알수록 전체적인 그림을 그릴 수 있음
  • 실무에서 실제로 CS와 연결되는 업무가 존재
  • 매우 중요하다

CS 사례1) 한정된 하드웨어 자원에 대한 이해와 메모리에 대한 이해가 부족할때

  • 캐시를 한다며 스프링 애플리케이션 인스턴스의 힙영역에 캐싱

    • 캐싱을 DB를 전체 조회해서 캐싱
    • 시간이 갈수록 힙영역을 점점 크게 차지
    • 힙영역이 부족해 GC는 자주돌지만 캐싱된 힙영역의 캐싱된 데이터는 참조가 되고있어서 garbage가 아님.
    • 점점 GC는 자주돌지만 메모리 부족은 해결이 결코 안됨
  • 해결책들

    • Caffein Cache에 max size 설정(로컬 캐시)
    • Redis 인스턴스를 하나 따로 두고 역할 분리(외부 캐시)
  • 불필요한 CPU를 쓰는걸 모를수 있다

    • 시간복잡도를 모르는 경우
    • 자료구조에대한 지식 부족으로 적절한 클래스 선택을 못하는 경우
      • 클래스 선택도 내공이 필요

CS 사례2) multithreading, race condition, scheduling

  • 스프링 애플리케이션에서 API 호출을 카운트하는 기능 그런데 int count 를 씀
    • 동시성 이슈 발생 가능성 매우 크다
    • 자바 스프링은 multithreading 기반
    • 스레드끼리 힙영역은 공유함
    • race
    • CAS(cpu 도움 필요), atomic, volatile, synchronized…

CS 사례3) 인덱스에 대한 이해가 명확

  • 시간이 갈수록 데이터가 누적됨에따라 쿼리느려짐
  • composite index
  • 탐색범위 스콥을 최대한 줄이는 방식

CS 사례4) Transaction, ACID 개념 부재

  • 트랜잭션 개념과 ACID 특성을 모른채 데이터베이스를 다루면…
  • 동시에 같은 재고를 구매하는 경우 재고가 -1이 되는 문제 발생
  • 송금 중 오류 시 돈은 빠졌는데 상대방은 못 받는 상황
  • 여러 테이블 업데이트 중 일부만 성공해서 데이터 정합성 깨짐
  • 격리 수준을 몰라서 팬텀 리드, 더티 리드 같은 문제에 무방비
  • 롤백 처리를 안 해서 실패한 작업이 부분적으로 반영됨

CS 사례5) 해시와 보안 개념 부족

해시는 단방향인게 강력. 복호화가 불가

  • [DS] ArrayList 와 HashSet 을 적절하게 잘 구분해서 사용할 수 있다 - 성능 향상
  • [OS] race condition 가능성이 있을 때 thread-safe 한 클래스를 사용할 수 있다 (e.g. ConcurrentHashMap) ~> 데이터 정합성 향상
  • [OS] Local Cache 처럼 공유해서 사용될 객체는 immutable 로 만들어야겠다는 생각을 한다 -> 데이터 정합성 향상
  • [OS] coroutine, WebFlux 개념과 원리를 더 금방 이해할 수 있다 -> 학습 속도 향상, 적재 적소에 기술 사용
  • [OS][DB][DS] DB의 데이터 관리 방식을 더 잘 이해할 수 있다 -> 학습 속도 향상, 적재 적소에 기술 사용
  • [DB] 테이블 설계 시 incremental 하지 않은 값을 primary key 로 사용하는 것을 망설이게 된다 - 성능 하락 방지
  • [DB] 테이블 설계 시 특정 컬럼의 사이즈가 매우 크다면 그 컬럼만 따로 별도의 테이블로 분리하는 것을 고려할 수 있다-테이블 조회 성능 향상
  • [DB] DB 테이블 설계를 잘못해서 중복 데이터가 생기는 것을 방지한다 -* 데이터 정합성 향상
  • [DB] 서비스 특성에 맞춰 DB 퍼포먼스를 향상 시킬 수 있다 (sharding, partitioning, replica)- 성능 및 안정성 향상
  • [DB] DB에서 update 내용이 사라졌을 때 isolation level 을 의심할 수 있다 .> 데이터 정합성 향상
  • [Network] TCP 특성을 잘 알면 HTTP/3 가 왜 나왔고 어떤 특징이 있는지 이해할 수 있고, 특히 앱을 개발할 때는 앱이 웹과 통신할 때 HTTP 버전 중에서 3 를 쓰는게 사용자 경험에 더 좋겠다고 판단할 수 있다 -> 학습 속도 향상, 성능 향상
  • [Network] connection pool이 왜 필요한지 정확히 이해할 수 있어서 적절하게 튜닝할 수 있다 -> 성능 향상
  • [Network] application level 에서 새로운 프로토콜을 정의할 필요가 있을 때 서비스 특성에 따른 적절한 transport layer 프로토콜을 선택할 수 있다 -> 성능 혹은 안정성 향상
  • [Network] 통신하는 어딘가에서 hang이 걸렸을 때 더 빠르게 추적 및 해결할 수 있다 -> 운영 측면에서 도움
  • [Network] 웹 브라우저에서 URL 주소 창에 주소를 입력했을 때 웹 브라우저에 페이지가 뜨는 과정을 설명할 수 있다
  • [ALL]큰 그림을 그릴 수 있다
  • [ALL] 기술적인 대화를 하거나 문서를 읽을 때 전반적으로 막힘 없이 진행할 수 있다

아는 것만으로 끝나면 안된다 == 죽은 지식

CS를 실무와 연결시킬 수 있어야함 == 산 지식