Database 7

4. 스프링과 문제해결 - 스프링 트랜잭션 처리

1. 비지니스(서비스) 계층에서 트랜잭션 처리하기가 생각보다 쉽지 않다 앞서 3장에서(https://hongod.tistory.com/25?category=1063676) 트랜잭션을 시작하고 종료하는 계층을 비지니스 계층이라고 했었다. 이 비지니스 계층의 코드를 작성할 때 가장 중요한 원칙이 하나 있는데 바로 최대한 의존성을 버리고 순수한 자바코드로 작성해야한다는 것이다. 프렌젠테이션 계층은 웹, 서블릿 HTTP 와 같은 기술에 의존하고, 데이터 접근 계층은 JDBC, JPA와 같은 구체적인 DB 접근 기술에 의존하기 때문에 차후 기술 발전에 따른 코드 수정은 불가피하지만, 서비스 계층만은 핵심 비지니스 로직이 바뀌기 전에는 수정하지 않도록 순수한 자바 코드로 격리해놔야 유지보수와 테스트가 용이한 애플리..

ODBC란?

이 글은 Microsoft 사에서 제공하는 ODBC 관련 공식 문서(https://docs.microsoft.com/en-us/sql/odbc/reference/what-is-odbc?view=sql-server-ver15)를 읽고 번역한 글이며, 영어 실력이 미천하여 오역이 다수 포함될 수 있습니다. 문제가 될 시 삭제하겠습니다. ODBC란? 컴퓨팅 세상에는 ODBC에 대한 많은 오해가 있다. End user 에게는 윈도우즈 제어판의 아이콘일 뿐이고, 어플리케이션 개발자에게는 데이터 접근 routines을 포함한 라이브러리이며, 그 외 많은 사람들에게는 수 많은 DB 접근 문제들에 대한 해답이다. 그 중에서 ODBC를 가장 잘 설명해주는 말은 'DB API에 대한 스펙'이라고 할 수 있다. 이 API는..

Database/DB 일반 2022.07.04

기초적인 DB 인덱스 사용 원리

이 글은 '친절한 SQL 튜닝(저자 조시형, 출판사 (주)DBian)을 읽고 정리한 글입니다. 1.SQL 튜닝 1. SQL이 느린 이유 SQL이 느린 이유는 대부분의 경우 I/O, 특히 디스크 I/O 때문인데 이 I/O는 프로세스의 일시적 중지(sleep)를 일으킵니다. 특히나 디스크 I/O는 메인 메모리 I/O에 비하면 매우 오래 걸립니다. 만약 동시 다발적으로 디스크 I/O 요청이 들어오면 I/O를 수행하는 시간에 대기시간 까지 추가되어 더 오래 걸리게 됩니다. 물론 I/O 요청이 발생하면 DBMS가 우선적으로 메인 메모리에 있는 캐시를 탐색하고 여기서 같은 내용에 대한 I/O를 찾지 못한 경우에만 실제 디스크 I/O 요청을 수행하기 때문에 실제 디스크 I/O로 이어지는 것을 많이 줄일 수 있지만, ..

Database/DB 일반 2022.07.04

3. 트랜잭션 이해

1. 거래(영어 : Transaction) 한 건의 완성 A에게서 B에게로 5000원을 송금하는 과정은 아래의 두 가지 동작으로 나눌 수 있다. 1) A의 잔고에서 5000원을 차감 2) B의 잔고에서 5000원을 증가 만약에 1)의 과정만 수행되고 2)의 과정이 수행되기 전에 오류로 인해 DB 커넥션이 끊어져버리면 어떻게될까? 거래가 제대로 수행되지 않고 A의 잔고에서 5000원이 증발해버린 상황이 펼처지게된다. 회계로 따지면 차/대가 불일치하는 상황(?)이 펼쳐지게 되는 것이다. 이렇게, 작게 봤을 때에는 부분으로 나뉘어지지만 전체적으로 하나의 과정으로 처리돼야하는 DB 통신 과정은 DB에서 제공하는 트랜잭션이라는 기능을 이용하면 각 파트들이 모두 다 함께 수행되거나, 그렇지 않으면 모두 수행 되지 ..

2. Connection Pool 과 DataSource 의 이해

private void close(Connection con, Statement stmt, ResultSet rs) { JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(stmt); JdbcUtils.closeConnection(con); } 1. DB 커넥션을 얻는 대가 DB 커넥션을 얻는 코드는 짧지만 생각보다 코스트가 비싼 행위이다. 애플리케이션 밑바닥의 TCP/IP 3-way handshake 과정부터 시작해서 ID, PW 를 보내 인증과정까지 거쳐야 비로소 커넥션 객체가 DB 드라이버로 부터 돌아오기 때문에 DB 연결이 필요한 시점 마다 DriverManger를 통해 커넥션 요청부터 시작하면 쿼리 수행 시간에 연결 요청 시간이 추가되기 때문에 성능..

1. JDBC 이해

- 일반적으로 애플리케이션 서버와 DB 서버간의 통신은 1. 커넥션 연결 (애플리케이션 -> DB 서버) 2. SQL 전달 (애플리케이션 -> DB 서버) 3. 처리 결과 응답 (DB 서버 -> 애플리케이션 서버) 의 큰 세 가지 축으로 이루어진다. - 애플리케이션 개발자 입자에서 고역인 것은 이런 애플레케이션 DB 간 통신 방식이 DB 벤더에 따라 모두 다르다는 것이다. 즉 서로 다른 언어, 비유하자면 MySql은 한국어, Oracle은 영어, PostgresSQL은 독일어 등등... 서로 다른 언어로 통신하기 때문에 아~주먼 과거의 개발자들은 DB를 바꾸게 되면 애플리케이션 코드에서도 위 세 가지 통신을 위한 코드들을 모두 새로 배워서 바꿔야했다(한국어 쓰다가 독일어 배워서 쓰고...). - 위와 같..