728x90

전체 글 199

MongoDB 구성

용어 기본 Database Database는 Collection의 모음이다. Admin 인증과 권한 부여 역할 일부 관리 작업을 하려면 Admin Database에 대한 접근이 필요하다. ex) 서버 Shut Down, User Role 제어 Local 모든 MongoDB Instance는 Local Database를 소유한다. Oplog와 같은 replcation 절차에 필요한 정보를 저장한다. startupo_log와 같은 instance 진단 정보를 저장한다. local database 자체는 복제 되지 않는다. Config Sharded Cluster에서 각 Shard의 정보를 저장한다. Collection 특징 동적 스키마를 갖고 있어서 스키마를 수정하려면 필드 값을 추가/수정/삭제 하면된다. ..

DB 2024.02.18

SQL VS NoSQL (MongoDB 공부 전 )

SQL 구성 테이블 형태로 데이터가 저장된다. 새로운 컬럼이 추가 되고 정규화를 통한 데이터를 테이블 마다 별도로 저장할수있다. 장점 데이터 중복을 방지할 수 있다. Join의 성능이 좋다. 복잡하고 다양한 쿼리가 가능하다. 잘못된 입력을 방지할 수 있다. 단점 하나의 레코드를 확인하기 위해 여러 테이블을 Join하여 가시성이 떨어진다. 스키마가 엄격해서 변경에 대한 공수가 크다. Scaling 장단점 Sacale-Out이 가능하지만, 설정이 어렵다. 확장할 때마다 App단의 수정이 필요하다. 전통적으로 Scale-Up위주로 확장했다. NoSQL 용도? 관계형 데이터 베이스로 할수 없거나 하기 어려운 작업을 하기위해 사용 그래서 절대 SQL의 대체 품이 아니다. 함께 사용하거나 서비스 요구상황에 따라 사..

DB 2024.02.18

동시성 제어

동시성 제어 방법 게시물에 컬럼을 추가를 통한 구현 비관적 락, 낙관적 락 구성 조회시 컬럼만 읽어오면됨(장점) 쓰기시 게시물 레코드에 대한 경합이 발생(병목 발생) 하나의 자원(게시물)을 두고 락 대기 같은 회원이 하나에 게시물에 대해 여러번 좋아요를 누를수있음(문제 발생) 테이블 추가를 통한 구현 낙관적락, 비관적락 으로 해결 하기 힘들때 구성 조회시 매번 count쿼리 연산(병목 발생) 쓰기시 경합없이 인서트만 발생(장점) 회원정보등 다양한 정보 저장 가능(장점) 위 방법 중 병목 발생 1 > 2 -> 쓰기 지점의 병목은 하나의 레코드를 점유 하고 있다. 2 > 1 -> 조회 지점의 병목은 카운트 쿼리를 매번 읽는다. 병목 해결 방법 이전에 프로세스에 대한 성질을 우선 이해한다. 좋아요 수는 높은 ..

Server 2024.02.18

[낙관적락/Optimistic Lock]_기본 개념 (비관적 락/PESSIMISTIC 짧은 설명 포함)

비관적 락/PESSIMISTIC 동시성 제어를 위한 가장 보편적인 방법 락을 통한 줄세우기 단점 락을 통한 동시성 제어는 불필요한 대기 상태를 만듬 동시성이 빈번하지 않은 쿼리로 인해 다른 쿼리가 대기 된다. 낙관적인락/ Optimistic Lock 동시성 이슈가 빈번하지 않길 기대하고, 어플리케이션에서 제어한다. 단점 실패에 대한 처리를 직접 구현해야 한다. CAS(Compare And Set)을 통해 제어 Compare/비교 그리고 Set/설정 비교해서 맞으면 설정 틀리면 설정 안한다. 예) 이름 잔액 버전 홍길동 1000 1 트랜잭션_1 READ_홍길동 잔고 -> 1000, (1) 트랜잭션_2 READ_홍길동 잔고 -> 1000, (1) 트랜잭션_1 UPDATE(홍길동 잔고 -100), (2) WH..

Server 2024.02.15

[비관적인락/PESSIMISTIC]_쓰기락 테스트

트랜잭션을 테스트 해보기 위해서 다른 SQL편집기를 열어서 테스트 해야한다. 테스트 방법 START TRANSACTION; 트랜잭션을 실행한다. QUERY문 실행 SELECT .... FOR UPDATE를 해야 쓰기락이 걸린다. 완료후 COMMIT한다. 트랜잭션 및 락 상태 확인 락 상태 확인 SELECT * FROM performance_schema.data_locks WHERE LOCK_TYPE = 'RECORD'; 여러 ROW가 출력되는 이유는 여러 락이 동시에 잡혀서 그런다. LOCK_MODE가 X 는 쓰기락이 잡혀있다라는 뜻이다. INDEX_NAME : 어느 인덱스에 락이 잡혀있는지 출력된다. LOCK_DATA : Index VALUE 트랜잭션이 상태 확인 SELECT * FROM informa..

Server 2024.02.06

[비관적인락/PESSIMISTIC]_쓰기락과 읽기락

동시성 제어를 위한 가장 보편적인 방법 락을 통한 줄세우기 (순차적인 실행) 중요_1! 락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요 락을 유지 하는동안 다른 트랜잭션 또한 대기 하게 되고 그러면 서버 성능이 낮아 진다. 최악의 경우에는 단일 쓰레드와 같은 효과를 볼수 있다. Connection Pool을 관리 하는 경우에 Connection Pool 고갈이 발생할수 있다. MySQL에서 락의 범위를 잡는 방법 MySQL에서는 트랜잭션의 커밋 혹은 롤백시점에 잠금이 풀린다. 즉. 트랜잭션이 곧 락의 범위 이다. MySQL에서 락의 범위를 줄인다. == 하나의 트랜잭션을 최소화 한다 예) S3 업로드가 트랜잭션에 추가가 되어 있다 S3 업로드 하는 중에도 트랜잭션이 유지 되므로 S3..

Server 2024.02.06

멀티 스레드 환경에 대한 이해

멀티 스레드 환경 대부분 하나의 웹 서버는 여러개의 요청을 동시에 수행할수 있다. 즉. 작성한 코드 한 줄은 동시에 수행 될 수 있다. 그래서 하나의 자원(DB Row, 서버 글로벌 변수 등..)을 두고 여러 개의 연산들이 경합한다.(데이터 정합성을 깨뜨릴 수 있다.) 예) 100원을 출금 하는 요청이 동시에 발생한다면? 이름 잔액 홍길동 1000 트랜잭션1 READ(홍길동 잔고) > 1000 트랜잭션2 READ(홍길동 잔고) > 1000 트랜잭션1 UPDATE(홍길동 잔고 - 100) > 900 트랜잭션2 UPDATE(홍길동 잔고 - 100) > 900 결과. -200이 되어 800원이 되어야 하지만 트랜잭션2 에서는 1000원으로 읽었기 때문에 900원으로 UPDATE 된다. 그래서 없는돈 100원이..

BackEnd 2024.02.05

트랜잭션 설정 및 아주아주 간단한 팁

트랜잭션 설정 방법 @Transactional import org.springframework.transaction.support.TransactionTemplate; 위에 꺼를 사용해야 좀더 다양한 설정을 할수있다. 주의해야 할점 Proxy방식으로 동작 하기 때문에 Class를 상속 받는 특정 개체가 만들어진다. 그래서 inner 함수를 호출하게 될경우 트랜잭션이 제대로 실행되지 않는다. // Transactional이 제대로 동작하지 않는 경우 // Proxy 패턴이므로 제대로 동작하지 않는다. public Member create(Member member) { return getMember(member); } @Transactional private Member getMember(Member mem..

BackEnd/Spring Boot 2024.02.03

[디자인 패턴] 추상 팩토리 패턴

설명 여러개의 타입(콘텐츠, 미디어) 별 통계,정산 하는 추상 팩토리 패턴 생성 // 통계 인터페이스 interface 통계 { fun 작업1() } // 정산 인터페이스 interface 정산 { fun 작업2() } // 콘텐츠통계 class 콘텐츠통계 : 통계 { override fun 작업1() { println("콘텐츠통계 작업1") } } // 미디어통계 class 미디어통계 : 통계 { override fun 작업1() { println("미디어통계 작업1") } } // 콘텐츠정산 class 콘텐츠정산 : 정산 { override fun 작업2() { println("콘텐츠정산 작업2") } } // 미디어정산 class 미디어정산 : 정산 { override fun 작업2() { prin..

Server 2024.02.03

Mysql Procedure

Mysql Procedure 복수의 쿼리를 실행하는데 있어서 중간 쿼리들의 오류를 방지하기 위해 일괄 처리하는 명령어입니다. 사용 방법 DELIMITER $$ CREATE PROCEDURE '프로시저명' ( IN 파라미터명 데이터 타입, IN 파라미터명 데이터 타입, OUT 파라미터명 반환 데이터 타입 ) BEGIN DECLARE 변수명 VARCHAR (45) DEFAULT NULL; 수행할 쿼리 ... END $$ DELIMITER ; 출처: https://kdg-is.tistory.com/239 [realizers:티스토리]

DB 2024.02.03
728x90