DB 데이터 변경 감지 방법 | 폴링 or 이벤트
·
Database
■ IntroDB 데이터 변경을 감지해야할 일이 있다. 서버의 어떤 동작이 외부 설정데이터에 영향을 받기 때문에 변경을 감지해서 동작을 수정해야 하는 상황이다. 그래서 일반적인 방법들을 정리해보고자 한다. (참고: 프론트엔드 부분은 제외하고 이야기한다.) 먼저 확인보자면 여기에서는 "실시간 데이터 처리와 변경 감지는 많은 비즈니스 애플리케이션에서 중요한 요구 사항으로 자리잡고 있습니다. 데이터베이스에서 특정 테이블이나 데이터를 감시하는 방법은 다양하지만, 전통적으로 트리거를 활용한 방식이 가장 많이 사용되었습니다." 라고 말한다. (그래서 뭘 해야하는데? 이 글에서 알아볼 것이다.) 앞으로도 데이터 변경 감지를 적절한 방법으로 해내기 위해서, 다양한 변경 감지 방법들을 알고 있도록 하자. 변경 감지는 두..
MSA에서 분산트랜잭션
·
Database
https://tech.kakaopay.com/post/msa-transaction/ MSA 환경에서 네트워크 예외를 잘 다루는 방법 | 카카오페이 기술 블로그결제시스템(페이상품권)에서 분산 트랜잭션을 보장하고 안전하게 다루기 위해 고민한 내용을 공유합니다.tech.kakaopay.com 위 kakaopay 페이지를 참고하여 정리하였다. ✨ MSA의 트랜잭션하나의 시스템은 수십여개의 MSA로 구성될 수 있다. MSA 환경에서 중요한 것은 연결된 서비스마다 DB를 관리하고 있을 때 일관성을 보장해야 한다는 것이다. 예를 들어 포인트, 상품권 등 여러 서버가 엮인 결제 트랜잭션이 그렇다.결제 트랜잭션에서의 예외는 이런 것들이 있다.[고객 입장] 두 번 결제됨 / 결제취소 안됨 / 결제 성공했는데 잔액 안빠져..
[상속관계 매핑] 싱글 테이블 전략을 선택한 이유
·
Database
지도에 마킹이 가능한 두개의 엔티티, CultureEvent와 CulturePlace는 Mark 엔티티를 상속하고 있다.이러한 상속관계에서 선택하기 적절한 상속관계매핑전략은 조인 전략, 싱글테이블 전략 두가지가 있는데 이번에 나는 싱글테이블 전략을 선택하기로 했다. 먼저 총 3개의 상속관계 매핑 전략을 읊고 가자.🪄상속관계 매핑 전략조인 전략: 자식테이블이 부모테이블의 PK를 참조한다. 즉 자식테이블의 PK는 FK다.부모테이블은 DTYPE (구분 컬럼)을 가진다. 어떤 자식테이블을 조회해야할지 알아야 하기 때문.장점: 가장 정규화된 방법이다. 외래키 참조 무결성 제약조건도 활용 가능하고, 저장공간도 효율적으로 사용 가능하다.단점: 조회시 Join이 잦아 성능저하를 검토해야 한다. Join을 하기에 조회..
[MySQL + JPA] field 'mark_id' doesn't have a default value | 그리고 auto increment
·
Database
🪄 기본키 전략기본키는 유일한 값으로 개발자가 지정해줘도 되지만, 실무에서 보통 자동생성 방식을 따른다프로젝트 이력을 돌아보면, 나는 보통 기본키 자동 생성 전략으로 IDENTITY를 사용해왔다. 이번 프로젝트를 개발하면서 IDENTITY 사용시 field 'xxx_id' doesn't have a default value가 뜨는 것을 보고, 데이터베이스와 JPA를 다시 짚어봐야겠다는 생각이 들었다.  🪄 기본키 자동생성 전략 4가지이 기본키 자동생성 전략은 본질적으로 insert쿼리가 언제 나가느냐의 차이다.✨ AUTO아래 IDENTITY, TABLE, SEQUENCE 중 자동선택한다.✨ IDENTITY설명- 기본 키 생성을 데이터베이스에 위임한다.- insert 쿼리를 확인해보면 id에 null이..
컬럼 수 적절성에 대한 고민 및 테이블 분할
·
Database
🪄 요일별 운영시간 저장 형태가게의(장소의) 월화수목금토일 운영시간을 어떻게 저장하면 가장 효율적일지 고민해보았다. 결론: 운영시간 테이블을 따로 두고mon_open, mon_close, ..., sun_open, sun_close라는 총 14개의 속성에 시간을 저장해두는 방식 이유:- [open과 close 분리] 요일별 open과 요일별 close는 의미가 다르므로 open, close로 분리한다.- [요일별 분리] 모든 장소, 행사의 운영시간은 요일별로 존재한다. 결국 월화수목금토일을 검토하는 것이 공통적일 것임.- [휴무일과 운영일] 휴무일을 별도를 저장해두는 게 아니라, open 에 별도의 값을 통해 식별하면 효율적일 것임. 🪄 관련 생각들처음부터 요일별 open, close를 저장해야곘다고..
Docker Mysql Container의 sql 파일 꾸준히 백업: crontab 사용
·
Database
🪄 [1단계] mysql 컨테이너의 sql 백업파일 생성 아래 예시코드를 통해 mysql 컨테이너의 sql 백업파일을 생성할 수 있다. (경로는 맘대루..) docker exec mysql mysqldump -u"유저" -p"패스워드" mysql > ~/backup/backup-db-$(date +%Y-%m-%d).sql 이 코드를 담은 backup.sh를 만들면, backup.sh 실행만으로 mysql 컨테이너의 데이터파일인 .sql을 생성해낼 수 있다. 매일 꾸준히 백업하고 싶으니까 스케줄러를 등록해두자. 🪄 [2단계] cron 스케줄러 등록 다음과 같이, 방금 만든 backup.sh 실행하는 크론탭을 등록하자. crontab -e 명령으로 편집하자. *편집창이 뜨면 아래 스케쥴을 추가하면 된다. *..
[DB] 인덱스 사용 이유 이해하기
·
Database
Intro DB에 데이터 양이 많다면 쿼리 수행이 느리다. 쿼리의 성능을 높이기 위해 인덱스를 잘 활용하는 것이 좋다. "인덱스: DB 테이블 검색 성능을 높여주는 자료구조" . . ★ 참고로, 아래 영상의 도움을 크게 받아 정리했다. 강추한다. https://www.youtube.com/watch?v=iNvYsGKelYs INDEX란? 테이블 검색 성능을 높여주는 자료구조라고 했다. 어떤 자료구조길래? . . person 테이블에서 age가 25인 행을 찾고 싶다. 그렇다면 다음과 같은 select문이 익숙할 것이다. SELECT * FROM person WHERE age = 25 그런데 데이터가 막 10억개로 무지 많은 상황에서 모든 행을 다 뒤져 찾는다면, age = 25를 찾는 것이 무지 느리다...
[H2] Column이 drop 되지 않음 | JPA Bean을 직접 주입하는 실습 중
·
Database
⭐ 설정파일을 잘못 작성 (create-drop의 위치) 문제 원인 : jpa 설정을 JpaProperties에서 가져왔기 때문에, jpa의 create-drop 설정은 jpa의 properties 아래에 둬야 의도에 맞다. ∴ JpaProperties에서 설정을 가져올 때의 ddl auto 설정의 올바른 위치: jpa: properties: hbm2ddl: auto: create-drop ∨ create-drop이 jpa의 properties 아래로 가야 한다. ∨ JPA에 필요한 Bean을 직접 주입하는 실습이었다. 접은글의 코드를 보면, 위와 같은 jpa설정을 JpaProperties에서 가져오고 있다. 더보기 아래 코드를 보면 JpaProperties에서 정보를 가져옴을 알 수 있다. @Bean ..
mysql 서버 상태 확인하기(show status) | db connection 전후 Threads 관련 상태변수 확인
·
Database
mysql 데이터베이스 서버 상태 확인하기 데이터베이스의 환경변수값, 상태변수값을 조회하여 서버의 상황을 체크할 수 있다. ■ 환경변수 조회 : show variables └> 환경변수값을 조정해서 mysql의 상태 제어 가능 ■ 상태변수 조회 : show status └> 상태변수값을 통해 mysql의 각종 상태(동작정보)를 확인 가능 ■ 환경변수 조회 show variables 쿼리 결과이다. 각종 환경변수 값을 확인할 수 있다. ■ 상태변수 조회 show status 쿼리 결과이다. 각종 상태변수 값을 확인할 수 있다. Thread 관련 상태변수 값 확인해보기 db서버의 thread 관련 상태변수 값을 확인해보자. show status like '%Threads%'; 나는 지금 DB connecti..
[DB] 상속 관계 매핑 전략 선택하기
·
Database
다음과 같은 논리적 상속관계를 DB상에 물리적으로 어떻게 나타내야하는지 고민했다. 조인테이블 전략을 사용하였다. (장단점은 맨 아래에 요약) 참고) Join Table 전략 : 여러 테이블 사용 - 관리해야 할 테이블이 많아짐 - 객체지향스럽지 않고 복잡함 => Single Table 전략을 현업에서 좀 더 많이 사용하기도 함 Join 전략으로 매핑하면 다음과 같이 superclass와 subclass의 table이 구성된다. Springboot를 통해 상속관계 DB매핑 적용하기 super class ▶ 참고: @DiscriminatorColumn 지정은 상속관계매핑의 JoinTable 전략에서 필수가 아니다. (본인도 필요가 없어져서 나중에 없앰) 참고로, 하나의 테이블로 상속관계가 매핑되는 Singl..