Programming-[Backend]/Database (18) 썸네일형 리스트형 JPA, ddl-auto, MYSQL, index 등 테이블 생성 기초 정리 Spring Boot + JPA + Hibernate + MYSQL 조합으로 DB를 구축할 때 주의해야할 점들에 대해 기록해둔다. 1. ddl-auto로 만들어진 순서 그대로 DB 컬럼의 순서들을 그대로 두지 말 것 hibernate.ddl-auto = create로 처리하면 아무런 세팅이 되지 않은 DB에서 Entity들을 이용해 빠르게 Table 들을 만들어낼 수 있다. 하지만 여기서 컬럼들의 순서들을 변경하지 않으면 안된다. 왜냐하면 DB 컬럼의 순서대로 차례대로 데이터를 읽어나가기 때문이다. DB는 블록 단위로 데이터를 저장하고, 조회 시에 레코드의 앞에서부터 읽어들이기 시작한다. 따라서 DB 컬럼의 순서는 PK, FK, 카디널리티가 높은 순서대로 배치하고 날짜 등 Range로 조회될 가능성이 .. id 설정하기. batchInsert, UUID, GenerationType.IDENTITY 상황스프링부트 + JPA 조합에서 batchInsert를 해야하는 상황 GenerationType.IDENTITY: batchInsert 불가public void saveMessages(dto) { List messages = new ArrayList(); dto.getMsgData().forEach(msgData -> { Message newMessage = new Message( UUID.fromString(msgData.getMsgKey()), null, null, msgData.getSenderNumber(), msgData.getRecei.. [TIL] TSID를 사용해야하는가? 왜 Id값은 Long(bigint)로 하는가? TSID를 사용해야하는가?TSID는 보통 서버용 프로그래밍에서 사용하는 int, Long 타입의 auto increment에 비해 실행 중인 노드 정보 및 시간 정보를 포함하여 64비트 단위로 id를 생성하고 활용하는 방법이다. 대부분의 애플리케이션에서는 필요없다. DB가 분산시스템으로 2대 이상 존재하며 서로 싱크를 맞춰야하는(샤딩) 상황에서 필요하다. TSID에 대한 개념은 이 글에서 적지 않는다. 좋은 참고자료들이 많다.https://jsonobject.tistory.com/634https://tech-monster.tistory.com/228 TSID를 사용해야할 때, 사용하는 장점 여러 시스템이 동시에 DB에 insert를 할 때도 id가 중복나는 경우가 거의 발생하지 않기 때문에 안전하다. .. [TIL] MySQL 사용 관련 주요 팁 모음: 타입, INET_ATON, FK 물리적으로 걸지 않기 MySQL은 json 필드값들 가상 컬럼으로 잡아주나, 성능이 떨어짐 숫자 타입: unsigned 옵션 줘서 음수 사용 안하게 해서 공간 활용도 높이기 문자열 타입: text 타입은 테이블 바깥 공간에 따로 저장된다(mySQL)postgreSQL의 경우 긴 VARCHAR 타입보다 TEXT 타입이 외부 공간에 저장됨에도 불구하고 속도가 빠르다 TIMESTAMP는 유닉스 epoch라서 2038년 까지만 사용가능(4바이트) MySQL의 INET_ATON 함수: IPv4 주소를 4바이트로 줄여서 저장해줘서 공간 절약하며, 검증도 해줌 Stored Procedure: SQL 쿼리문 등을 DB에 저장해놓는 것. MSSQL, Oracle 실디비 같은건 성능이 좋아서 괜찮은데 MySQL의 경우에는 성능 이슈가 있어서 .. [경험 요약] Atomikos multi-database transaction 묶기 https://wildeveloperetrain.tistory.com/332 Atomikos를 통한 Multi Datasource Transaction 처리 (전역 트랜잭션)스프링 부트 다중 데이터베이스 트랜잭션 처리 (jta-atomikos) 해당 포스팅은 스프링부트 환경에서 다중 데이터베이스를 연결할 때 'multi datasource에 대한 트랜잭션 처리'에 대해 정리한 내용입니다.wildeveloperetrain.tistory.com 위 링크가 정리가 잘 된 것 같다. 실무를 해보면서 유의해야할 점들을 저장해놓는다. 1. application.yml에서 hibernate 설정이 잘 안될 수 있다.- 따로 Datasource config를 위한 Bean들을 만들어서 Config에서 설정 내용을 주입.. [TIL][link] DB Connection Pooling, context manager DB Connection Pool은 여러 클라이언트의 DB 접속 요청을 위해 미리 세션을 만들어놓고 배분하는 것을 뜻한다. 이렇게 미리 만들어 놓지 않으면 DB는 접속 요청이 올 때마다 세션을 생성하는 작업을 반복해야해서 성능에 좋지 않다. 참조 링크 글에서는 connection pool을 설정하지 않거나 설정하고 DB에 연결 요청을 했을 때 소요 시간을 비교한다. SQLAlchemy를 사용하였으며, 아래 코드에서 poolclass=QueuePool 부분이 ConnectionPool 설정을 해주는 부분이다. from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueueP.. [TIL] DB pagination offset 문제, covering index 문제점 pagination을 하기 위해서 보통 아래와 같은 형식의 쿼리문을 사용한다. select ... from ... where ... limit ... offset limit은 가져올 데이터의 총 개수를, offset은 데이터를 조회할 시작점을 의미한다. 여기서 문제는, 데이터 개수가 많아지면(offset 100만건 이상?) offset 위치를 찾는 것을 마치 연결 리스트처럼 처음부터 쭉 이어나가다가 DB에 부하가 크게 걸릴 수 있다. 해결방법 where절에 조건을 건다. 특정값 이상의 id를 갖는 row만 조회한다던가, 날짜-연도 등을 기준으로 특정일 이후부터만 조회하도록하여 데이터의 개수 자체를 줄여서offset에 드는 부하를 줄여준다. covering index를 갖는 subquery를 실행하.. [TIL] insert시 ForeignKey에 제한 걸기: DB Trigger 사용 Django - python - postgresql을 이용하여 작업을 진행하던 중, 발생했던 문제점을 해결한 기록이다. 문제상황 아래처럼 새로운 테이블(모델)을 생성하고자 했다. class IWantNewModel: old_model = ForeignKey( "models.OldModel", on_delete=CASCADE, ... ) 이 때, FK가 되는 old_model의 타입을 특정 타입이 되도록 제한하고 싶었다. DB 자체에서 제한을 걸면 나중에 서비스단 로직에서 굳이 validation을 복잡하게 할 필요가 없기 때문이다. 한층 더 추상화되는 점은 있다만, 그래도 편리할 수 있다. Django에서는 이런 경우(FK가 아닌 경우에는) CheckConstraint 조건을 주어서 DB에서 제한을 걸도.. 이전 1 2 3 다음