22/03/07 TIL

Jaden.dev·2022년 3월 7일
0

📌 캐시를 쓰는 이유

캐시(Cache)

  • 한번 읽은 데이터를 임시로 저장하고, 필요에 따라 전송/갱신/삭제
  • 보통 데이터의 보관장소로 서버의 메모리를 사용하는 경우가 많음
  • Long Tail 법칙 : 20%의 요구가 시스템 리소스의 대부분을 사용한다는 법칙
  • 디스크에서 정보를 얻어오는 것 보다 훨씬 빠른 I/O 성능을 얻을 수 있으나, 서버가 다운되거나 재부팅되면 휘발됨
  • 영속성이 없음
  • 별도의 디스크백업 등으로 보관이 가능하지만, cache의 진정한 의미와는 멀어짐

Redis

  • key-value 기반의 인메모리 데이터 저장소
  • key-value 기반이므로 쿼리가 필요없이 결과를 바로 가져올 수 있음 (O(1))
  • 싱글 스레드로 동작하여 한 번에 한 개의 명령어만 실행 가능
  • 싱글 스레드 기반이므로 race condition 방지
    -
  • 멀티 스레드, 멀티 프로세스를 지원하는 Memcached도 있음
  • 트랜잭션 지원
  • List, Set, Sorted Set, Hash 등의 Collection을 지원
  • persistence를 지원해서, 서버가 꺼져도 다시 데이터를 불러들일 수 있음

📌 Response 객체를 쓰는 이유

Representation

  • API Response는 필요한 것만 노출하도록 하는 것이 원칙이다
  • Entity 자체를 넘기거나, 모든 정보를 넘기게 되면 보안 상의 문제가 존재
  • 따라서 Entity에서 해당 API 요청에서 필요로하는 정보만을 포장하여 보냄
  • Response라는 postfix를 뒤에 붙여줌으로써 외부와 소통할 때 보내는 데이터로 명시할 수 있음

📌 Pubsub

  • Observer 패턴은 알림을 수신하고자 하는 Observer가 이벤트를 실행하는 주체 Publisher에 등록해야 함
  • 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 알림이 가고 자동으로 정보가 갱신되는 보통 1:N 의 관계를 성립
  • 강한관계를 갖는 Observer 패턴과 달리 pub/sub 패턴은 느슨한 관계
  • pub/sub 패턴은 수신 객체 Subscriber와 이벤트 발생 객체 Publisher 사이에 위치하는 이벤트 채널을 둠
  • publisher는 subscriber를 모른채로 이벤트 채널에 메시지를 넘겨주고, 이벤트 채널은 이를 필터링해 받아야할 수신자들에게 보내줌
  • 응답과 상관없이 중간 객체를 통해 가기 때문에 비동기 방식
  • pub/sub을 분리함으로써 publisher 관점에서 subscriber들을 관리하지 않음

📌 Interface의 default

Interface

  • 인터페이스는 기본적으로 이를 구현하는 구현체 클래스들의 뼈대를 정해주는 역할
  • 그래서 인터페이스에 선언된 메서드를, 구현 클래스는 구현해줘야 함
  • 인터페이스의 변경이 일어나면, 해당 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야하는 문제가 발생함
  • 인터페이스에 default 메서드를 이용하며 이런 문제를 해결할 수 있음
  • default 말고도 우리가 평소 사용하는 public static 메서드도 선언할 수 있음. 인터페이스를 이용해 간단한 기능을 가지는 유틸리티성 메서드도 선언 가능

default

  • JAVA8 부터 default 메서드 기능을 이용 가능
  • JAVA11의 List.java를 살펴보면, sort 메서드가 default로 선언되어있는 것을 알 수 있음
  • default void sort() 를 통해 이 메서드에 대한 코드를 구현체에서 구현하는 것이 아니라 인터페이스에서 직접 구현하겠다는 의미
  • default에는 public 메서드라는 의미가 내포되어있음

interface와 객체 클래스와의 차이

  • 인터페이스는 구현이 포함되지않은 객체의 명세서 역할인데, 여기에 메서드의 구현이 들어간다면 일반 객체 클래스와 다를바가 있는가? 라는 의문
  • 인터페이스는 멤버변수를 가질 수 없다.
  • 멤버 변수는 그 객체의 속성을 담아두기 위한 용도인데, 그런 속성값을 저장할 수도, 변경할수도 없는 인터페이스는 결국 그 자체로 객체화될 수 없음
  • 추상 클래스와는 다르게 인터페이스는 여러 개의 상속이 가능
  • 인터페이스에 default, static, private 메서드가 포함됨으로써 명세서상의 구현뿐 아니라 기능상으로 상속과 비슷한 형태가 되었다 -> 다중상속

기타 알게된 지식

  • optional. nullable이다 아니다를 명시적으로 표현하는 것은 코드레벨에서의 안정성에 매우 중요함
  • command&query를 분리하는 CQRS를 일전에 공부했는데, 실제 사례를 살펴보면 command에 비해 query가 월등히 많음을 알 수있다 -> 분리한 이유
  • @VisibleForTesting : 테스트할 때만 사용할 거니까 일반 프러덕션에선 사용 X
profile
https://github.com/JadenHeo

0개의 댓글