본문 바로가기

db13

[DB] 인덱스 간략 정리 [1] 인덱스랜덤 & 순차 IO디스크 헤더를 1번, 여러번 옮기느냐? 즉, 디스크의 성능은 디스크 헤더 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정Mysql 는 그룹 커밋, 바이너리 로그 버퍼, InnoDB 로그 버퍼 등의 기능으로 개선결국 랜덤 IO 를 줄이는 것이 쿼리를 개선하는 것을 의미정의ArrayList 와 SortedList 의 차이를 아는가?순차적으로 저장 or 정렬하여 저장빠르게 적재 or 느리지만 정렬하여 적재인덱스를 적용한다는 것은 쓰기 성능을 어느 정도 포기하고, 읽기 성능을 택하겠다.B-Tree 에서 인덱스 키 추가 및 삭제 시보통의 경우, 레코드 추가 비용 1 가정 시 인덱스 추가 비용을 1.5 로 예측하는 편.인덱스 키 삭제와 변경의 경우, InnoDB 엔진에 .. 2024. 6. 29.
[DB] 트랜잭션과 락 간략 정리 트랜잭션트랜잭션은 애플리케이션 개발 입장에서, 고민해야 할 문제를 풀어주는 필수적인 DBMS 의 기능.트랜잭션 사용 시 주의사항DBMS 의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 트랜잭션의 범위를 최소화하라는 의미. 각 단위프로그램이 커넥션을 소유하는 시간이 길어질 수록 사용 가능한 여유 커넥션의 개수는 줄어든다. 메일 전송이나, 파일 전송 작업 등, 네트워크를 통해 원격 서버와 통신하는 작업은 트랜잭션 내에서 제거하라. 웹 서버뿐 아니라 DBMS 서버까지 위험한 상황 발생 저장 데이터의 단순 조회의 경우도 트랜잭션에 포함할 필요가 없다.락레코드 락레코드 자체만을 잠그는 것 InnoDB 스토리지 엔진은 레코드 자체가 아니라, 인덱스의 레코드를 잠근다. 인덱스가 없을 경우, 내부.. 2024. 6. 27.
[Spring Data JPA] JPA Enum 필드에 관한 문제 참나. 오늘 5시간 날렸다. Pagination 쿼리를 날리는 API에서 계속 500 에러가 나서 계속 붙잡고 있었다. 빨래 땜에 집에 왔지만 불굴의 의지로 해결해보리라 다짐하고 1시간만에 문제를 발견했다 증말. 문제점 결론부터 말하면 서버 DB에 잘못된 데이터가 들어가서였다. 문제는 JPA Enum 필드가 @Enumerated(EnumType.STRING) ㅣ이 아니라, Ordinal로 들어가 발생한 문제다. 지정한 Enum 상수는 총 4개 이며, ordinal의 범위는 0~3 이다. 4 이상의 숫자는 있어서는 안될 데이터다. 그래서 계속 이런 에러가 발생했다. java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 쿼리.. 2023. 2. 21.
[Spring Data JPA] 한방 쿼리의 효능 (feat : JPQL) 백엔드 개발의 기본 소양인 SQL을 작성하는 실력은 뛰어날 수록 더할 나위 없다. 실제로 대규모 트래픽이 발생하는 서비스에서는 이 성능을 매우 중요시 하는데, 일반적인 환경에서는 DB 조회적 측면에서 큰 성능 개선을 이끌 수 있으므로, 가장 기본이 되는 개선 방안이라고들 한다. SQL을 공부하고, JPA 를 공부하며 항상 빠질 수 없는 얘기, 성능 최적화. 항상 고민하다가 개선을 할 수 있는 기회가 주어졌고, 공부한 내용을 바탕으로 내 생각과 결과를 정리해보겠다. DB ERD Model opnions entity를 paging 처리해서 여러 개를 뽑아야 하는 상황. 주어진 중요 파라미터는 user_id 뿐이다. 1. 보통 같으면 Document Entity를 먼저 조회한 후, opinions 를 페이징 .. 2023. 2. 1.
동시성 조회 문제 해결 및 성능에 관한 고민 [Lock, Queue, Redis] 주문 건에 대한 상품 재고 파악 동시성 관련 이슈에 대해 고민한 하루다. 프로젝트 리팩토링을 시작하며 지난 도메인들은 기본 crud API만을 다루었다. 5일동안 JPA 강의들을 수강하며 본격적으로 주문 및 결제 API 리팩토링에 다시 착수했다. 아무래도 프로젝트의 토픽이 쇼핑몰이니 주문 및 결제 파트에서 단순 CRUD가 아닌 핵심 비즈니스를 고려하고 싶어, 외부 결제 API 및 디자인 패턴을 적용한 깔끔한 코드들을 고려하며 작성하는 중이다. 대략적인 틀을 만든 뒤, 본격적으로 주문을 구현하던 중, 동시성 이슈 문제에 직면했다. 기존 동시성 문제 해결 방법 MSA를 고려했기에, 데이터 정합성 문제를 해결하기 위해 Outbox pattern을 이용중이었다. 이 방식을 통해 상품 동시성 문제를 해결했었다. .. 2022. 9. 14.
DB 수정 & jpa 세팅 프로젝트의 전반적인 리팩터링을 다시 시작하며, 기존 mybatis를 이용했던 것을 그대로 옮겨왔다. 하지만 SQL Mapper를 이용한 설계 특성상 객체 지향적인 코드의 작성이 어려웠고, 또 기존 DB 설계의 문제도 있다는 것을 알게 되었다. DB의 전반적인 수정과 더불어, JPA를 이용해 다시 리팩터링을 해보기로 결정을 내렸다. 그 수정과정과 JPA 세팅 방법을 나열해보겠다. https://github.com/GroovyArea/My-ChickenBreast-Shop GitHub - GroovyArea/My-ChickenBreast-Shop: shop api with spring boot shop api with spring boot . Contribute to GroovyArea/My-ChickenB.. 2022. 8. 8.
2022.06.02 「DB 동시성 문제」 자바 기반 웹 프로그램은 기본적으로 멀티스레딩을 기반으로 하기 때문에, 동시성 관련 문제를 잘 해결해야 한다고 들었다. 이번에 내가 하는 쇼핑몰 프로젝트에서도 그 이슈가 딱 터졌다. 예를 들어 몇 만 명이 한정된 재고의 상품을 주문하려고 할 때? 수많은 멀티스레드는 데이터의 재고량을 조회하며 재고가 떨어졌으면 예외를 발생시키면 된다. 하지만 동시에 접근하면? 이거 난감하다. 이 문제에 대한 고찰을 작성하겠다. DB 동시성 문제 동시에 DB를 조회할 때가 문제이다. 내가 사용하는 DBMS는 Mysql Mysql은 기본적으로 트랜잭션의 격리 수준으로 Level 2 Repeatable Read를 사용하고 있다. 언두 영역을 통한 다양한 버전 별 MVCC를 통해 버전에 맞는 값을 조회할 수 있다. 하지만 모든 .. 2022. 6. 2.
2022.05.29 「결제 API」 장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 하는데, 생각만큼 쉽지 않았다. 어디서 본 건데 만들어진 API를 가져와서 쓰는 것도 능력이라고..ㅋㅋ 그래도 해야지 어쩌겠나. 카카오 페이 API 문서를 보니 되게 다양한 API를 소개해 놓았다. 결제 요청도 보안상 서버를 통해 요청을 해야 된다고 한다. 그리고 넘겨 주고 받는 파라미터도 굉장히 많다. 실거래를 위해 만들어진 API라 확실히 다르긴 하다. 개인적인 프로젝트 수준에서 테스트 결제를 위해 필요한 데이터를 추리는 작업은 참 골치 아픈 일인 것 같다. 일단 결제 요청 부터 시작하기로 결정했다. 내가 설계한 프로젝트에서는 크게 보면 두 가지 종.. 2022. 5. 29.
쿼리 작성 및 최적화 요새 스프링 프로젝트, DB, 자소서 수정, 토비 스프링, 코테 준비 등등을 하고 있다. 하루가 너무 짧기도 하고 잠을 적게 자도 괜찮은 체질이 되고 싶은 요즘이다. DB공부는 Real Mysql을 읽고 있다. 읽기 너무 어려운 책인데.. DB 질문도 신입 개발자 면접에서 디테일한 질문까지 필수라고 하기 때문에 열심히 정리하면서 읽고 있다. 쿼리 작성 및 최적화 부분을 공부중인데 이 부분에서 헷갈리는 개념을 정리해볼 생각이다. Join 기법 Nested Loop Join 중첩된 반복문과 유사한 방식으로 조인을 수행 반복문 외부의 테이블을 선행 테이블 & 외부 테이블이라 칭함 반복문 내부의 테이블은 후행 테이블 & 내부 테이블이라고 칭한다. 조건을 만족하는 선행 테이블 행을 추출 후 후행 테이블을 읽으며 .. 2022. 5. 17.
Flyway & DB Migration 을 적용시켜 보자 스프링 프로젝트를 진행하면서 나는 DB 테이블을 한 번에 다 생성하고 시작하는 것이 아닌 필요한 것을 만들어가면서 진행하고 있었다. 그러고 Front를 만들지 않기 때문에 DB data를 직접 mysql을 열어 넣어주고 수정하는 작업을 반복하게 되었다. 참 비효율적이라 생각했다. 그러던 도중 Flyway라는 Tool을 알게 되었다. 새로운 기술을 마주하면 항상 낯선 기분이지만 DDL을 자바에서 직접 관리를 하게 해주는 툴이라는 것을 알게 되었고, 나처럼 스키마의 잦은 변경이 일어날 경우에 사용해보면 좋겠다는 생각이 들었다. 그래서 한번 정리해보고 사용해 볼 생각이다. 혹시나 해서 Schema 가 뭐야? 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것! 1. 개념 스키마 - 전체적인 뷰 2.. 2022. 5. 3.
2022.04.29 「부트스트랩 관련」 ▶파트 1 (10시 ~ 2시) 1. mysql Ch.10 실행 계획 (2. 부트스트랩 관련 문의) => 되면 3. 프로젝트 html 정리 ▶파트 2 (3시 ~ 6시) 1. 부트스트랩 폴더 추가(느려지니 나중에 하자) 2. 자소서 수정 3. Controller 정의 ▶프로젝트 관련 1. 페이징 처리 시 DB 요청 => mysql 이므로 oracle의 rownum을 사용하지 못 한다. 하지만 비슷하게 따라할 수는 있다. 그래도 mysql을 배웠기 때문에 차별화된 방식을 사용할 것. => 방식은 여러 가지이지만 limit 함수를 사용한다. (검색 속도가 빠름) 2022. 4. 29.
2022.1.13의 기록 - 하루 정리 - DB 정의 DRD 관계선 및 엑셀정리 JSP 복습 코딩 - 오늘 공부 내용 - JSP 응답방식은 json, xml로도 응답가능한데 이건 rest WAS에 의해 jsp 웹 문서가 서블릿 클래스로 컴파일 될 때 9개의 내장 객체가 자동으로 선언된다. 젤 많이 쓰는게 request, response, session 객체 join_form.jsp 비정상적인 요청에 대한 응답 처리 response.sendRedirect(String url) : 클라이언트에게 301 상태코드와 URL 주소를 전달하여 클라이언트 브라우저의 요청 URL 주소를 변경하여 재요청하도록 지시하는 메소드 - 리다이렉트 이동 (경로는 최상위 루트 \ 로 잡음 , 원래는 contextroot가 기본이지만(자바일경우) ) ⇒ 리.. 2022. 1. 13.
2022.1.12의 기록(세미프로젝트 회의) [오늘 할일] JSP 블로그 코딩 세미프로젝트 DB 아웃라인 전체 잡기 [세미 팀플] > 세미 프로젝트에 필요한 DB 아웃라인을 팀장인 내가 전체적으로 짜보기로 결정. > 구체적으로 들여다 보며 테이블을 만들다보니 만만치 않은 작업임을 실감. > 긴급 팀 소집 회의 > 팀 회의 마무리 후 무엇을 식별, 비식별 , N:N 관계에 대해서 할지 논의 함. > 부모, 자식 테이블간의 관계와 erd 모델에서의 관계선 종류와 의미에 대해 공부 함. 관계선의 종류 실선(Identifying): 식별관계 => 부모테이블의 PK가 자식테이블의 FK/PK가 되는 경우 => 부모가 있어야 자식이 생기는 경우 점선(Non-Identifying): 비식별관계 => 부모테이블의 PK가 자식테이블의 일반속성이 되는 경우 => 부모.. 2022. 1. 13.
반응형