본문 바로가기

Back-End/DataBase

(10)
재고 감소로 보는 동시성 제어 목차초기 셋팅문제 상황문제 해결법synchronizedPessimistic LockOptimistic LockNamed LockRedis1. 초기 셋팅2. 문제 상황단일 스레드가 실행할 때는 정상적으로 테스트가 통과되는 것을 볼 수 있다.하지만 만약에 동시에 100개의 스레드가 재고 수량 감소를 요청하면 어떨까?1️⃣ 동시에 100개의 요청에 대한 테스트 코드를 보면 ExcutorService를 이용해 100개의 요청을 동시에 실행2️⃣ CountDownLatch로 모든 요청이 끝날 때 까지 대기3️⃣ stockService.decrease(1L, 1L);를 100번 실행하여 재고를 100개 감소4️⃣ assertEquals를 이용해 재고가 0인지 검증내 예상 : 예상 재고 수량 = 0개실제 : 88개왜..
데이터베이스 연결(Driver) 1. 데이터베이스 드라이버란?데이터베이스 드라이버는 애플리케이션과 데이터베이스 간의 소통을 돕는 중개자이다. 드라이버는 애플리케이션의 요청을 데이터베이스가 이해할 수 있는 형태로 변환하며, 결과를 다시 애플리케이션이 이해할 수 있는 형태로 전달한다.드라이버의 종류 : 다양한 데이터베이스 시트템마다 호환되는 드라이버가 있다. 예를 들어 Oracle, MySQL, PostgreSQL 등 각 데이터베이스 제품에 맞는 특정 드라이버가 필요하다.2. 드라이버 동자 방식1) 연결 초기화Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mydb", "user", "password");  연결 설정 : 드라이버는 데이..
SQL로 복잡한 쿼리 실습하기 1. 테이블 확장1) 기존 테이블CREATE TABLE users ( id SERIAL, name VARCHAR(255));2) 컬럼 추가users 테이블에 새로운 정보를 추가email : 사용자의 이메일 주소created_ad : 계정 생성 날짜status  : 계정 상태 (활성 / 비활성)ALTER TABLE usersADD COLUMN email VARCHAR(255);ALTER TABLE usersADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAP;ALTER TABLE usersADD COLUMN status ENUM('active', 'inactive') DEFAULT 'active';3) 추가 테이블 생성products : 상품 저장..
SQL로 요리하듯 데이터 다루기 1. 데이터 조리 시작하기(DDL - Data Definition Language)DDL은 데이터 구조를 정의하거나 수정하는 데 사용된다. 이는 재료를 담는 그릇, 즉 테이블을 만드는 과정과 비슷하다.테이블 만들기 : CREATE TABLE 로 새로운 재료함을 마련하는 방법. 각 성분의 특성(열의 데이터 타입과 속성)을 정의테이블 개조하기 : ALTER TABLE 로 이미 만든 재료함에 변화를 주는 방법. 재료를 추가하거나 불필요한 재료를 제거할 수 있다.테이블 제거하기 : 사용하지 않는 재료함을 DROP TABLE 로 철거하는 방법// 테이블 만들기 : 새로운 재료함 마련CREATE TABLE users ( id SERIAL, name VARCHAR(255), email VARCHAR..
Spring JdbcTemplate의 RowMapper() 이 글을 쓰게 된 이유는 JDBCTemplate에서 MySql을 사용하며 RowMapper()를 쓰는데 자꾸 헷갈려서 쓰게 됐음.JdbcTemplate의 RowMapper는 SQL 쿼리 결과인 ResultSet을 자바(일반적으로 엔티티 객체)로 변환하는 역할을 한다.JdbcTemplate를 사용하여 데이터를 조회할 때 SQL 쿼리를 실행하고, 그 결과를 자바 객체로 변환하는 과정에서 중요한 부분이 바로 RowMapper이다.1. RowMapper란?RowMapper는 ResultSet의 각 행을 자바 객체로 변환하는 인터페이스이다. RowMapper의 작동방식은SQL 쿼리 결과를 행 단위로 반환. RowMapper는 ResultSet의 한 행을 자바 객체로 매핑하는 역할을 한다.그럼 RowMapper 인..
커넥션 풀과 데이터소스 커넥션 풀데이터 베이스 커넥션 획득 과정애플리케이션 로직은 DB 드라이버를 통해 커넥션 조회DB 드라이버는 DB와 TCP/IP 커넥션 연결(3 way handshake)DB 드라이버는 TCP/IP 커넥션이 연결되면, ID, PW와 기타 부가정보를 DB에 전달.DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성DB는 커넥션 생성이 완료 되었다는 응답을 보냄DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환이러한 커넥션 획득 과정은 복잡하고 시간도 많이 소모된다. 그럼 결과적으로 고객이 애플리케이션을 사용할 때 응답 속도에 영향을 줌.우리가 전에 DriverManager를 사용해서 커넥션을 생성할 때 이런 식으로 일일이 생성해줬다.그래서 이러한 문제를 해결하기 위해 커넥션 풀이란..
JDBC - CRUD 내가 JDBC를 공부하는 이유 -> 일단 이러한 LOW레벨의 동작원리를 알아야지 나중에 Template이나 JPA를 사용할 때 어쨋든 이 JDBC 기반으로 동작하기 때문에 이 근본이 되는 기술을 알아야한다고 생각했다.일단 들어가기 앞서 전체적인 JDBC를 이용한 DB 연결 및 데이터 처리 흐름애플리케이션 "DB와 연결해서 데이터를 가져오거나 저장하고 싶다"고 요청DriverManager등록된 여러 데이터베이스 드라이버 중에서 요청된 DB 유형(ex. MySql)에 맞는 드라이버를 선택DB 드라이버는 URL로 판단! (ex. Jdbc:mysql, Jdbc:h2 ..)DB 드라이버선택된 드라이버가 DB와 TCP/IP로 연결을 시도DB에 ID, PW를 보내 인증 과정을 진행.연결이 성공하면 Connection..
SQL 기초 3 (Join) Join문을 쓰는 이유 : 조회를 하고 싶은데 원하는 데이터가 A테이블, B테이블에 각각 있을 때 사용한다.Join문 원리 : 테이블A와 테이블 B에 공통적인 컬럼이 있다면 둘이 연결 시킬 수 있다!left join : 공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미한다. 구조는 A_table as a left  join B_table as b on a.공통컬럼 = b.공통컬럼 B_table에 데이터가 없어도 조회가 가능하다! 벤다이어그램으로 생각해보면 A테이블의 데이터와 A테이블과 B테이블의 교집합 부분left join을 써준뒤 on 뒤에는 별칭.공통컬럼 = 별칭. 공통컬럼을 적어주면 된다. Inner join : 공통 컬럼 (키값) 을 기준으로, 두 테이블 ..