본문 바로가기

Database10

springboot with mybatis - foreign key로 연결된 행 삭제 이 글은 JPA로만 프로젝트를 진행하다가 mybatis를 사용할 때 발생하는 문제중 고아객체에 관한 내용을 담고 있다. 저번 프로젝트에서 스프링부트와 JPA로 진행을 하였는데 delete 쿼리를 날릴 때 고려한 것은 고아객체였다. 외래키로 연관관계에 있는 두 엔티티 부모를 삭제하면 부모의 외래키를 가지고 있는 자식은 어떻게 되는가? 에 대한 내용이 고아객체 내용이다. JPA에서는 부모객체가 삭제되어 없는 상황일 때 자식객체를 고아객체로 표현하였고 이를 객체 내의 어노테이션을 달아서 해결했었다. 그렇다면 Mybayis에서 어떻게 해결할까? 처음에는 고아객체가 데이터베이스 전체에서 쓰이는 말인줄 알았지만 알고보니 JPA에서만 사용되는 말이었다. 그렇기에 Mybatis 고아객체라고 검색을 해도 인터넷에는 나오.. 2023. 4. 9.
AWS RDS를 통한 관계형 데이터베이스 구축 및 springboot 연동 들어가기 프로젝트를 진행함에 있어서 가장 중요한 것 중 하나는 데이터베이스이다. 간단히 로컬에서 프로젝트를 진행할 때는 h2를 사용하였고 배포까지 진행할 때는 배포서버 내부에 mariaDB를 설치하여 데이터를 삽입하였다. 그렇다면 aws 프리티어를 사용하고 있을 때는 어떻게할까? 프리티어로 진행한 서버는 내부 용량이 적기 때문에 데이터베이스 크기도 작을 수 밖에 없고 한눈에 데이터들을 파악하기도 힘들다. 그리고 배포 서버에 문제가 생기면 데이터베이스에 접근할 수 없다는 문제도 있다. 이럴때 유용한 것이 aws rds이다. aws rds는 aws에서 rds 전용 서버를 제공을 해주는 서비스이다. 즉, 배포서버에서 데이터를 rds 서버로 저장을 시켜서 데이터를 굳이 배포서버에 저장할 필요가 없어진다. 배포서.. 2023. 2. 22.
DB 오라클 - 자주 사용하는 힌트절 이번 글에서는 간단히 자주 사용되는 오라클 힌트 절에 대해서 작성해 볼 것이다. '개발자를 위한 인덱스 생성과 SQL 작성 노하우(이병국)'을 참고하여 작성하였다. DB에서 옵티마이저는 최적의 실행계획을 결정한다. 하지만 그렇다고 해서 옵티마이저가 만능이라는 것은 아니다. 옵티마이저도 잘못된 SQL이나 부정확한 통계정보로 인하여 실수도 할 수 있다. 이럴 때는 힌트 절을 통해 잘못된 실행계획을 바로 잡을 수 있다. 즉, 힌트 절은 옵티마이저의 실수를 만회할 수 있는 용도로 사용할 수 있는 것이다. 옵티마이저에 대한 내용은 https://khdscor.tistory.com/m/52 를 참고하길 바란다. 데이터베이스 옵티마이저에 대한 간단 설명 데이터베이스를 사용하다 보면 여러 가지 인덱스를 만들어 놓는 경.. 2022. 4. 30.
DB - 성능 개선을 위한 테이블 분할 데이터베이스의 성능을 개선하기 위한 방법 중 하나가 테이블 분할이다. 테이블 분할은 어려움이 따르는데 그 이유는 기존에 설계된 테이블 구조를 변경해야 하고 이미 개발된 프로그램을 변경해야 하기 때문이다. 보통 테이블을 변경하는 원인은 DB 설계시 정규화를 소홀했거나 용량 산정을 잘못했기 때문이다. DB는 설계가 매우 중요하기 때문에 초반에 설계를 잘못한다면 성능상의 문제가 생기기 마련이다. 그렇기에 잘못된 설계 및 정규화로 인한 성능 저하를 해결하기 위해 테이블 분할을 하는 것이다. 테이블 분할은 크게 수직분할과 수평분할로 나눈다. 수직분할은 컬럼을 기준으로 테이블을 분리하는 것을 의미하고 수평분할은 로우를 기준으로 테이블을 분리하는 것을 의미한다. 테이블의 컬럼 수가 많을수록 I/O에 대한 부하가 걸리.. 2022. 4. 26.
오라클 DB - 자주 접하는 에러 메시지 이 글에서는 간단하게 오라클에서 간단하게 발생하는 에러 메시지들을 살펴볼 것이다. '개발자를 위한 인덱스 생성과 SQL(이병국)'을 참고하였다. 1. ORA-00001: 유일성 제약조건에 위배됩니다 오라클 에러메시지 중에서 개발자가 가장 자주 접하는 문제이다. 테이블에 PK가 있거나 UNIQUE UNDEX가 있을 때, 중복해서 INSERT를 사용하면 발생하는 에러이다. 2. ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 오타로 인해 발생할 수 있는 에러이고 실제로 테이블이 생성됐는지도 확인이 필요하다. 개발계와 운영계를 따로 관리하는 환경이라면, 실제 해당 테이블에 대한 생성 유무를 착각할 수도 있기 때문이다. 또한 권한이 없어서 발생하는 경우도 있다. 이런 경우 DBA에게 권한을 요청하거나 아.. 2022. 4. 25.
데이터베이스 성능 개선 - 채번에 대한 이해(Primary Key 컬럼의 용도) 프로젝트를 진행하다 보면 테이블을 설계하고 주키(primary key)를 설정하게 된다. 주키는 레코드들을 구별하는 고유한 값이며 테이블당 하나 이상의 컬럼으로 설정되어야 한다. 즉, 주키에 의해 레코드들을 구분할 수 있는 것이다. 하지만 딱히 주키로 설정할만한 고유한 컬럼이 없다면 어떻게 할까? 그럴 때 '채번'을 이용하는 것이다. 채번은 'serial number' 즉, DB의 번호표이다. 채번은 일본의 영향을 받은 말로서 새로운 번호를 딴다는 의미이다. 데이터베이스에서 채번은 대부분 PK 컬럼의 용도로 사용한다. 보통은 위에서 언급한 데로 의미 있는 컬럼들을 PK로 사용하지만, 가끔 필요에 의해 아무런 의미가 없는 시스템적 일련번호 형식의 채번을 PK 컬럼으로 사용하기도 한다. 채번을 사용하는 것이.. 2022. 4. 21.
데이터베이스 옵티마이저에 대한 간단 설명 데이터베이스를 사용하다 보면 여러 가지 인덱스를 만들어 놓는 경우가 많다. 어느 테이블에서 무엇인가 조회를 하는 방법은 그 테이블에 사용되는 다양한 인덱스 중 어느 인덱스를 사용할지, 조인을 했다면 어느 테이블부터 조회할지 등 실행 방법에는 다양한 경우가 있을 수 있다. 이러한 방법 중에 최적의 방법을 실행하는 것이 가장 효율적일 것이다. 여기서 어떤 실행에 대해서 최적의 루트를 계산해 실행하는 것이 '옵티마이저'이다. 옵티마이저에는 크게 CBO(Cost Based Optimizer) 즉, 비용 기반 옵티마이저와 RBO(Rule Based Optimizer) 즉, 규칙 기반 옵티마이저로 두가지로 나뉠 수 있다. RBO는 규칙 기반 옵티마이저로서 미리 정해진 우선 순위 규칙에 따라 접근 경로를 결정한다. .. 2022. 4. 18.
DB - 결합인덱스 및 컬럼 순서 결정 방법 데이터 베이스를 다루면서 성능 향상을 위해 인덱스의 사용과 개념은 전 페이지에서 설명하였다. 특정 컬럼을 기준으로 정렬해 놓은 목차 같은 것이라고 할 수 있고 분류 대상과 분류 정보를 분리했을 때 분류 정보가 인덱스라고 할 수도 있다. 여기서 확인할 것은 특정 컬럼이 하나가 아닐 수 있다는 것이다. 이것은 여러 개의 인덱스를 만든다는 말이 아니라 하나의 인덱스에 여러 컬럼이 기준이 될 수 있다는 것이다. 이것이 바로 결합 인덱스이다. 이 글에서는 결합인덱스에 대해 간단히 설명하고 컬럼 선정 방법에 대해서도 설명할 것이다. 참고로 '개발자를 위한 인덱스 생성과 SQL 작성 노하우(이병국)'을 참고하여 작성하였다. 결합 인덱스는 하나의 인덱스에서 기준 컬럼이 하나가 아닌 인덱스이다. 결합 인덱스 1= 컬럼1.. 2022. 4. 10.
인덱스의 유형과 특징(1. B-Tree index) 인덱스는 우리가 테이블에서 특정한 칼럼을 기준으로 정렬을 미리 시켜놓은 목차 같은 개념이다. 그렇기에 인덱스를 지정한 컬럼을 대상으로 검색을 할 때에는 인덱스를 통해서 더 적은 비용으로 데이터를 찾을 수 있기에 성능 향상에 있어서는 인덱스는 필수적이다. 그렇다면 인덱스는 어떤 종류들이 있을까? B-Tree 인덱스, 리버스 키 인덱스, 비트맵 인덱스, 함수기반 인덱스가 있지만 이 글에서는 B-Tree 인덱스에 대해서만 설명을 하겠다. 클러스터 인덱스에 대해서는 https://khdscor.tistory.com/46 를 참고하길 바란다. 데이터 저장구조와 특징(클러스터링 팩터) 스프링 프로젝트를 하면서 최적화에 대한 문제를 여러 번 직면했다. api 횟수를 줄이는 문제, DB와의 통신 횟수를 줄이는 방식, .. 2022. 4. 1.