메모하는 습관 9

실시간 통신 기술

Polling다른 프로그램의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때, 데이터 처리 하는 방식을 말한다.당연히 주기가 짧을수록 요청은 많아지기 때문에 답해줄 메시지가 없는 경우에도 서버 자원이 불필요하게 낭비되는 문제가 있다.다음은 클라이언트에서 서버에 새 메시지가 있는지 5초 주기로 요청하는 client polling 예시이다.// 5초마다 서버에 요청setInterval(async () => { const response = await fetch('/api/new-messages'); const messages = await response.json();}, 5000); 클라이언트가 계속 요청을 하기 때문에 클라이언트가 많아지면 그만큼 서버의 자원도 더 필요해진다.새로운 메시지가 없더라..

캐싱 전략

캐싱은 성능 향상, DB 트래픽 부하 감소 이로인한 비용 절감등의 이유로 많은 시스템에서 사용된다.어떠한 전략을 선택하느냐에 따라 데이터 정합성 문제, 조회 성능이 달라질 수 있기 때문에 전략을 고려해야한다.캐시 읽기 전략Cache-Aside캐시를 옆에 두고 필요할 때만 데이터를 캐시에 로드하는 전략이다.초기 조회 시 DB에서 데이터를 호출 해야 하므로 단건 호출 빈도가 높은 서비스보다는 반복적으로 데이터를 조회하는 서비스에 적합하다.Look Aside, Lazy Loading 전략이라고도 불린다.가장 일반적으로 사용되는 캐싱 접근 방식이다.Memcached 와 Redis가 널리 사용된다.캐시에 붙어있던 connection이 많다면, 캐시가 다운된 순간 많은 요청이 DB로 몰려서 부하가 발생한다.웹 서버..

데이터베이스 설계 / 정규화(1NF, 2NF, 3NF, BCNF)

데이터 베이스 정규화를 시작하기 전에 정규화의 정의 먼저 살펴보자.위키백과에 정의된 정규화의 정의이다. 말이 어렵다. 왜 중복을 최소화 해야되는지 예시로 알아보도록 하자.  order 테이블과 user 테이블에 동일한 사용자 정보가 중복 저장한된 경우이다. 이때 회원이 개명을 해서 userName 데이터를 수정한다고 해보자.  user 테이블의 userName을 변경했다. 이때 order 테이블의 userName도 당연히 변경되어야한다. order 테이블의 모든 주문에서 해당 사용자의 이름을 수정한다. 근데 하나를 놓쳤다고 가정하자. 각각의 주문에 다른 이름이 저장되어 버렸다. Order 테이블 기준에서는 데이터가 정확하지 않다. 이를 데이터 무결성 이라 한다. 그리고 User 테이블과 Order 테이블..

Redis 캐시 적용 해보기

조회 API Redis 캐싱빈번하게 요청되는 조회 API에 Redis를 활용하여 캐싱을 적용해보자. 캐싱 구조 흐름Spring 애플리케이션:클라이언트 요청이 들어오면 먼저 캐시에서 데이터를 확인하기 위해 Redis로 요청을 보낸다.Redis:Redis는 메모리 기반으로 작동하며, 자주 사용되는 데이터를 캐시로 저장한다.만약 Redis에 요청된 데이터가 있다면, Spring 애플리케이션은 MySQL에 접근하지 않고 Redis에서 데이터를 바로 가져온다.Redis에 해당 데이터가 없으면, MySQL로 요청이 전달된다.MySQL:MySQL은 디스크 기반 데이터베이스로, Spring 애플리케이션이 필요로 하는 데이터를 제공한다.이 데이터는 Redis에 저장되어, 이후 동일한 요청이 들어왔을 때는 MySQL을 거..

낙관적락이 롤백되는 이유

체크 예외와 언체크 예외의 Rollback 여부체크 예외와 언체크 예외의 차이점 중에 같이 보아야 할 점은 Rollback의 여부이다.https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/rolling-back.html Rolling Back a Declarative Transaction :: Spring FrameworkYou must carefully consider how specific a pattern is and whether to include package information (which isn’t mandatory). For example, "Exception" will match nea..

Mybatis 동작 원리

추후 레거시 시스템 개선, 마이그레이션을 위해 Mybatis Legacy 프로젝트를 경험해보자.세팅, 동작 원리가 더 중요하다 생각되어 사용 방법은 생략한다. Mybatis 세팅 주의할점plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6'}스프링 부트 3.3.2 버전에서 오류가 발생했다.Invalid bean definition with name 'userProfileMapper' defined in file 생략 'factoryBeanObjectType': java.lang.String상위 버전에서는 스프링 컨테이너에 빈 주입이 실패한다.plug..

SHA-256 핵심, 요약, java 구현, 결론

SHA256은 미국 국가안보국(NSA)에서 설계한 해시 함수이다.NIST(National Institute of Standards and Technology)에서 관리하는 FIPS (Federal Information Processing Standards) 180-4 문서에 정의되어 있다.https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf굳이 해당 내용을 다 알고있을 필요는 없다.복잡한 해시 알고리즘을 통해 해싱 한다는것만 가져가면 된다.SHA-256은 SHA-2 계열에 속한다.SHA-3 계열은 SHA-2에 비해 더 강력한 보안을 제공하기 위해 개발되었지만, 오랜 기간 동안 널리 사용되면서 안정성과 보안이 검증되었기 때문에 대부분의 시스템에서 SHA..

Patch 메서드가 멱등이 아닌 이유

HTTP 메서드 스펙을 보면 PATCH는 멱등성을 보장하지않다고 나와있다.보통 데이터 수정에 PUT, PATCH가 많이 사용된다.여기서 PUT은 데이터 로우를 완전히 교체하기때문에 멱등성이 보장된다.하지만 PATCH는 멱등성이 보장이 되는 설계도, 안되는 설계도 가능하다.먼저, 멱등성이 보장된 설계이다.PATCH - api.ex.com/users/1{ "name" : "홍길동"}이번에는 멱등성이 보장되지 않는 설계이다.PATCH - api.ex.com/users/1/add/point{ "addPoint" : 10}수정 메서드는 보통 엔티티 필드를 더티체킹으로 변경하는 방식으로 많이 사용된다.실제 코드는 이러할것이다.public void addPoint(int Point) { this.point += po..

Stack을 Deque로 사용하자!

왜 Stack을 deque로 사용할까?Stack class는 vector class를 상속 받는다.Vector를 상속받은 Stack은 3가지의 단점이 있다.중간에 데이터를 삽입하거나 삭제 할 수 있기 때문에 stack class의 가장 중요한 후입선출(LIFO)원칙이 깨지는 문제가 발생한다.초기 용량을 설정할 수 있는 생성자가 없기 때문에 데이터의 삽입이 많아지면 배열을 복사해야 하는 일이 빈번하게 발생해 성능이 느려진다.pop, peek, search 등 각 메서드에 synchronized 키워드가 붙기 때문에 Thread-safe 하게 되고, Single-Thread 환경에서 모든 작업에 lock을 걸어 많은 오버헤드가 발생되어 성능이 느려진다.빨간박스를 해석해보면 '보다 완전하고 일관된 스택 작업은..