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를 실무와 연결시킬 수 있어야함 == 산 지식