개요deadlock 방지FK에 해당하는 레코드가 있는 지 조회하기 위해 lock이 걸리는데, 이 lock으로 인한 성능 저하를 줄이기 위해서이 두 가지 리스크가 FK Constraint를 걸어서 얻는 이점보다 크다고 판단함일반적으로 FK에 대응되는 레코드가 없을 때 발생하는 손실이 전체 DB 성능 저하보다 크지 않음JOIN 또는 SELECT 결과가 NULL일 테니 쉽게 탐지 가능함프로그래밍적으로 제어 가능단, FK Constraint는 끊어도 FK에 Index는 생성해야 한다JOIN 성능을 위해서일부 ORM은 FK Constraint를 끊으면 Index도 사라지니 잘 확인해야 한다JPA에서 FK Constraint 제거하는 방법foreignKey = @ForeignKey(ConstraintMode.NO_..
All
요약repository.getReferenceById()를 이용해 프록시 객체를 생성하고, 엔티티 생성 parameter에 엔티티 대신 넘긴다getReferenceById()는 JPA에 정의되어 있기 때문에 구현 없이 쓰면 된다프록시 객체는 Primary key(id) 만 초기화되어 있고, 다른 값은 모두 null인 객체이다설명Foreign Key가 있는 레코드를 생성할 때, DBMS에서는 Foreign Key(user_id 등)만 알면 INSERT문으로 레코드를 생성할 수 있다. 그러나 이를 JPA 코드로 표현하면 FK 뿐만 아니라 관계된 전체 객체가 필요한 것처럼 보인다.Habit habit = Habit.creationBuilder() .runTime(param.getRu..
사용 범위Service Layer에서 DTO를 return한다도메인을 보호하기 위해서도메인이 변경됐을 때 Controller에 미치는 영향을 줄이기 위해서Controller가 도메인에 의존하지 않게 하기 위해서DTO - Domain 변환은 Mapper class가 수행한다`MapStruct` 라이브러리를 이용해서 편리하게 구현할 수 있다목적많은 매개변수를 일괄 처리원격 작업을 할 때 네트워크 오버헤드 감소직렬화 로직 캡슐화직렬화 로직을 DTO 클래스로 모아서 변경 지점을 하나로 만듦Domain 모델을 Presentational 모델과 분리하여 두 모델을 독립적으로 변경할 수 있게 한다 참고 자료https://hudi.blog/data-transfer-object/ DTO의 개념과 사용범위DTO는 우테코 ..
개요WHERE IN 보다는 JOIN 문의 성능이 더 좋다WHERE IN 절은 실행 계획에서 OR절로 변환되어 N번의 동등(=) 비교를 수행하기 때문에 성능이 나쁘다MySQL 5.6버전부터는 실행 계획에서 IN절을 JOIN으로 변환하여 성능을 개선하였다서브쿼리 존재 유무만 판별할 때는 IN대신 EXISTS 문을 사용하여 성능을 개선할 수 있다서브쿼리를 반복해서 실행하는 단점이 있다그러나 서브쿼리 WHERE 조건에 인덱스가 걸려 있다면 IN보다 빠를 것으로 예상된다IN: 동등 비교를 서브쿼리 결과 수만큼 수행, 반복 vs EXISTS: 인덱스 타고 가서 데이터 존재 여부 판별을 반복서브쿼리 결과 row 수가 많다면 EXISTS가 유리, 적다면 IN이 유리할 것으로 예상된다서브쿼리 결과 row 수가 증가하면 ..
개요Event Driven Architecture는 MSA에서 Producer가 여러 Consumer 서비스를 직접 호출해야 했던 구조에서 Event Broker 하나에만 이벤트를 전송하면 되는 구조로 개선했다는 것이 가장 큰 특징이다. 이로 인해 서비스가 느슨하게 결합(Loosely Coupled)되고, 결합도가 낮아진다. 다음 문단부터 정리할 EDA의 장단점은 이러한 EDA의 특징 때문에 생기는 것이라고 이해할 수 있다.장점확장성시스템에 부하가 증가할 때 Producer와 Consumer를 scale out(수평적 확장) 할 수 있다.Producer가 Counsumer를 직접 호출하지 않기 때문에 시스템을 크게 재설계하지 않아도 된다유연성새로운 이벤트나 처리 로직을 추가할 때 기존 컴포넌트에 미치는 ..
https://www.ssemi.net/what-is-the-bearer-authentication/ 토큰 기반 인증 Bearer AuthenticationOAuth를 들어가려고 생각하다가, 이전에 Bearer scheme 부터 조져야 겠다는 생각을 먼저 해봤다 블로그에 글을 쓸 때 마다 드는 생각Bearer scheme 에 대해서 정확히 설명을 하기 위해서 여러 자료들을 봤www.ssemi.net
FCM을 이용해서 습관 알림을 구현하는 방식에는 아래와 같은 이슈가 있습니다. 사이드 프로젝트로 정해진 시간에 알림을 보내는 기능을 구현하면서 생각했던 이슈를 공유합니다. 참고로 클라이언트는 PWA로 구현하고 있습니다.이슈기기가 인터넷에 연결되어 있지 않을 때 동작하지 않습니다동시에 1000개의 메세지만 전송할 수 있습니다. 1000개가 넘어가면 사용자가 지정한 시간에 보낼 수 없습니다.https://stackoverflow.com/questions/42927065/limit-of-bulk-firebase-cloud-messaging#comment83876716_42928210해결법구글에서는 캘린더 앱과 같은 예시에서는 로컬 알림을 스케줄링 할 것을 권장합니다.https://firebase.google...
개요이번 글의 주제는 Kafka, Pulsar와 같은 Event Streaming 플랫폼, 그리고 이를 소비하는 Flink에서 메세지를 주고받을 때 Serialization, Deserailization을 하는 이유를 알아보는 것입니다. Flink 예제 코드를 보면서 동작 과정을 분석할 때 정확히 알아야 겠다는 생각이 들어서 조사해 보았습니다.PulsarSource source = PulsarSource.builder() .setServiceUrl("pulsar://host.docker.internal:6650") .setTopics("order-topic") // Deserialization - 왜 할까? ..