jaden.dev
로그인
jaden.dev
로그인
22/03/07 TIL
Jaden.dev
·
2022년 3월 7일
팔로우
0
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
Jaden.dev
https://github.com/JadenHeo
팔로우
이전 포스트
22/02/23 TIL
다음 포스트
22/03/08 TIL
0개의 댓글
댓글 작성