분류 전체보기

회고

Oracle RDS 대용량 데이터 삭제시 주의할 점

현재 회사에서 운영중인 서비스의 사용자 접속 로그 테이블 데이터를 따로 관리하지 않아 보존주기만큼을 제외하고 데이터를 삭제한 후 주기적으로 로그를 삭제하는 스케줄링 작업을 진행중이였습니다. 50gb정도 되는 테이블을 작업해야하고, 평소 db를 공부하면서 트랜잭션을 너무 길게 가져가면 undo 로그가 커지고 너무 짧게 가져가면 컨텍스트 스위칭 비용이나 데이터베이스 콜 비용이 크다고 알고 있어 1천건 ~ 10만건 단위로 테스트 해보면서 삭제했습니다. 작업의 80%정도 완료했을 때 db 모니터링 상 문제가 발생해 작업을 지연하게 되었는데 트랜잭션을 커밋해도 아카이브 로그에 데이터가 일정 기간 존재하고, Amazon RDS 환경에서는 아카이브 로그 공간이 한 번 커진 이후에는 줄어들지 않아 비용이 지속적으로 발..

Computer Science/Database

[Oracle] 다중 서버 - 단일 DB 사용 시 활용 할 수 있는 배타Lock 동시성 제어

다음과 같은 관계에서 사용자가 비밀번호를 변경할 때 최근 사용한 N개의 비밀번호와 일치하는지 확인하는 로직은 어떻게 구현할까? 아래와 같이 결과집합을 뽑아서 애플리케이션에서 비교하거나, 한단계 더 쿼리를 감싸 과거 비밀번호와 변경할 비밀번호를 비교할 수 있다.@Transactional method{select * from (select * from password_his where user_id = :user_id order by rev desc)where rownum 하지만 스프링은 멀티쓰레드 방식으로 클라이언트 콜을 받기 때문에 두 개이상의 비밀번호 변경 요청이 들어온다면 첫번째로 처리한 요청은 정상적으로 비밀번호를 비교하고, 변경할 수 있지만 그 다음에 들어오는 요청들은 별도로 처리해야한다. ..

Computer Science/Database

[Oracle] 친절한 SQL 튜닝 6장 1절 기본 DML 튜닝

인덱스와 DML 성능INSERT, DELETE 인덱스는 정렬된 자료구조이므로 자리를 찾아가서 작업해야한다.UPDATE 변경된 컬럼을 참조하는 인덱스만 찾아서 변경하면 된다(인덱스에 포함된 정보가 변경됐을 때만)하지만 이 경우는 정렬을 맞춰줘야하기 때문에 이전 인덱스 정보 삭제 후 삽입하는 두 개의 오퍼레이션 발생한다. 무결성제약과 DML 성능PK, FK 제약은 Check, Not Null 과 다르게 실제 데이터를 조회해봐야하기 때문에 성능에 더 큰 영향을 미친다. Redo 로깅Redo 로그는 트랜잭션 데이터가 유실됐을 때 트랜잭션을 재현함으로써 유실 이전 상태로 복구하는데 사용 Redo 로그의 용도는 아래와 같다.Database Recovery물리적으로 디스크가 깨지는 Media Fail 발생시 데이터베..

Computer Science/Database

[Oracle] 오라클 성능 고도화의 원리 2권 1장 3절 인덱스 원리와 활용

Index Range Scan인덱스 루트 블록에서 리프블록까지 수직적으로 탐색한 후 리프 블록을 필요한 범위만 스캔하는 방식인덱스의 선두컬럼이 조건절에 사용되면 Index Range Scan 활용인덱스를 타는 것 자체보다 인덱스 스캔 범위를 최소화하고 인덱스에서 최대한 필터링하고 테이블 액세스를 하는 것이 중요 Index Full Scan최초의 수직적 탐색 이후 모든 리프블록을 수평적으로 탐색하는 스캔 인덱스의 선두컬럼이 조건절에 없으면 우선적으로 옵티마이저는 Table Full Scan을 고려하지만 대용량 테이블이어서 부담이크다면 인덱스를 활용하는 방법을 고려한다. 데이터 저장공간은 컬럼 길이 * 레코드 수에 의해 결정되므로 인덱스가 차지하는 면적은 테이블보다 훨씬 적다. 테이블 전체를 스캔하기보다 인..

Computer Science/Database

[Oracle] Java 개발자가 읽어본 친절한 SQL튜닝(SQL 파싱)

SQL의 실행과정을 아십니까..? SQLD를 공부할 때까진 이것만 생각했었습니다. 하지만 친절한 SQL 책을 읽으면서 DBMS에 쿼리를 날리면 어떤 과정을 통해 결과집합을 얻는지 배울 수 있었습니다. sql 실행 과정우선 SQL은 절차적인 언어가 아닌 Structured Query Language로 구조적 질의 언어입니다. 원하는 결과집합을 구조적으로 질의하지만 결과집합을 만들어내는 과정은 절차적으로 수행해야하고 아래와 같은 과정을 거칩니다. SQL에 문법적, 의미상 오류가 없는지 체크하는 파싱최적화 하기 쉬운 형태로 쿼리 변환을 하고 다양한 후보군이 될만한 실행계획 생성 및 비용 계산 실행엔진이 실행할 수 있는 프로시저로 변환하는 과정프로시저 실행 후 결과반환 SQL 파싱원래 DBMS는 I/O작업을 많..

회고

올해 취업한 개발자의 2024년 회고

https://anythingis.tistory.com/74 2022년 25살 회고대학교도 졸업하기도 하고 최근에 블로그를 하기 시작하면서 22년도 끝나가는데 올해를 회고해보려고 한다. 개발 📋Node.js CRUD 게시판 전공자이긴 하지만 학점을 위한 공부만 하고 수업실습도anythingis.tistory.com22년 회고 이후 오랜만에 써봅니다. 자바와 스프링을 이제 막 접했던 2년전과 지금 큰 차이는 없는 것 같지만 ... 나중에 보고 얼마나 성장했는가를 위해 작성해봅니다. 싸피 수료1학기의 주요 프로젝트인 2인 1조 프로젝트에서 전 백엔드 개발자를 지망했는데 운좋게 프론트엔드 지망하시는 분과 조가 되었습니다. 이전까진 백엔드를 혼자 맡게되면 ERD 설계는 어떻게 하지 하는 고민이 있었는데 기본 ..

스프링

Spring Transaction

트랜잭션?https://anythingis.tistory.com/171 [DB] 트랜잭션, 애플리케이션의 트랜잭션 제어트랜잭션이란 데이터를 저장할 때 단순히 파일에 저장해도 되지만, 데이터베이스에 저장하는 가장 큰 이유입니다. 트랜잭션은 그대로 번역하면 거래인데, 데이터베이스에선 하나의 거래를 안anythingis.tistory.com주로 DB에서 활용되는 개념이지만, 애플리케이션에서 데이터를 다루고 DB에 저장하기에, DB에서 커밋이 되거나 롤백 된 후 비즈니스 로직까지 연계된 로직을 처리하기 위해 스프링도 트랜잭션 기능을 제공합니다. 스프링 트랜잭션스프링은 다양한 DB 접근 기술과 같이 활용할 수 있습니다.JDBCpublic void accountTransfer(String fromId, String..

개발로그

Jenkins Nginx Reverse Proxy 적용

AWS 클라우드 서버에서 백엔드와 프론트엔드를 배포중이고, 젠킨스까지 하나의 서버에서 진행하려고 합니다. Nginx 활용한 리버스 프록시, SSL 적용https://anythingis.tistory.com/175 프록시 서버, Nginx 설정(리버스 프록시, SSL)(Ubuntu 24.03ver)프록시 서버 왜 쓸까?기본 웹 서비스 통신의 방식입니다.www.naver.com을 치면 이런 화면을 받아오는 것과 같습니다.  이후 로그인을 하는 등 비즈니스 로직과 관련된 부분을 동작하면 백엔드에anythingis.tistory.com  직접적인 포트노출을 줄이고 HTTPS 적용을 위해 Nginx를 활용해 리버스 프록시 서버로 활용중이고 젠킨스를 추가 설정합니다. 활용중인 Nginx Confserver { ..

비오베베
'분류 전체보기' 카테고리의 글 목록