본문 바로가기

Backend

(42)
DriverManager 이해하고 사용하기 안녕하세요, 이번 글에서는 Java에서 Connection을 얻는 방법 중에 하나인 DriverManager를 통한 커넥션 획득에 대해 적어보겠습니다. DriverManager앞선 글(JDBC)에서 애플리케이션에서 Database를 사용하려면 아래 세 가지 행위가 필요하다 말씀드렸는데요,커넥션을 연결한다.SQL을 Database 서버에 전달한다.결과를 응답받는다.JDBC에서는 Connection을 연결한 뒤 반환받는 Connection Interface를 통해 SQL을 전달하고, 커밋 혹은 롤백을 할 수 있도록 구성되어 있습니다. Connection을 획득하면, 해당 객체를 활용해서 그 뒤의 작업들을 하실 수 있습니다. 따라서 각 Database 벤더사들은 해당 Connection을 가져오는 방법을 구..
JDBC 이해하고 사용해보기 안녕하세요, 오늘 포스팅에서는 JDBC란 무엇이며 어떻게 사용하는 지에 대해 간략하게 포스팅을 해보려고 합니다. 애플리케이션에서 Database를 사용하는 방법흔히 서비스를 개발하는 백엔드 엔지니어들은 애플리케이션을 개발하면서 database를 데이터 저장 수단으로 사용하게 됩니다. database를 순수하게 사용하려면 크게 세가지의 과정이 필요한데요. 커넥션을 연결한다.SQL을 Database 서버에 전달한다.결과를 응답받는다.이를 도식화 하면 아래 그림과 같이 사용되게 됩니다. 만약 내가 개발한 서버가 Oracle DBMS를 사용한다면 Oracle의 Connection을 획득하고, Oracle sql을 전달하고, 결과를 받아서 애플리케이션 서버에서 사용하면 됩니다.문제점이렇게 개발되어 운영을 잘 하다..
MySQL의 잠금(Lock) 안녕하세요, 오늘은 MySQL의 Lock에 대해 살펴보겠습니다. 잠금(Lock)이란 동시성을 제어하는 기능입니다. 예를 들어 여러 커넥션에서 하나의 레코드를 수정할 수 있게 되면 그 결과를 예측하기 어려울 것입니다. 잠금은 여러 커넥션에서 변경을 시도할 경우 특정한 단위 (레코드, 테이블)에 대해 하나의 커넥션만 변경할 수 있게끔 만들어 주는 역할을 합니다.  Lock을 이해하려면 트랜잭션에 관해서도 이해가 필요합니다. Lock은 위에 서술하였듯 동시성을 제어하는 기능이고, 트랜잭션은 하나의 논리적인 작업 단위 안에서 데이터 정합성을 보장해 주는 역할을 합니다. 트랜잭션의 격리 수준에 따라서 여러 트랜잭션의 작업 내용을 어떻게 공유하고, 차단할지 Lock이 결정하게 됩니다. 트랜잭션MySQL에서 트랜잭션..
NoOffset 방식을 통한 MySQL 페이징 쿼리 튜닝 안녕하세요, 이번 글에서는 MySQL의 offset 기반 페이징 방식의 문제점과 이를 개선하는 방법에 대해 적어보도록 하겠습니다. 페이징 쿼리란?페이징 쿼리란 원하는 전체 데이터에 대해 부분적으로 나누어 데이터를 조회 및 처리하는 방법을 말합니다. 이렇게 되면 한 번에 처리할 데이터 양이 적어지게 되고 DB 및 애플리케이션 서버의 리소스 사용 효율을 높일 수 있습니다. 이를 통해 결과적으로 서비스 이용자들에게 더 빠른 응답 시간과 더 나은 서비스 경험을 제공할 수 있게 됩니다. 1-1. Limit & Offset보통 페이징 쿼리를 작성하면 DB에서 제공하는 Limit & Offset 구문을 사용하는 경우가 많습니다. 사실 저 역시도 실무에서 이 방식을 많이 사용하는데요. 쿼리로는 다음과 같이 작성할 수 ..
B+-Tree의 구조 이해를 통한 효율적인 Index 사용 법 정리. 안녕하세요, 이번 글에서는 MySQL index가 사용하는 B+-Tree 자료구조의 동작방식을 살펴보고 그를 통해 index를 조금 더 이해하는 글을 적어보려 합니다. SQL 튜닝이란, 인덱스를 통해 접근할 페이지의 개수를 줄여 성능을 높이는 과정이라 생각합니다. 그러니 인덱스를 잘 이해하고 있다면 인덱스를 잘 활용할 수 있는 SQL을 작성할 수 있을 것이고, 훨씬 더 성능 좋은 애플리케이션을 만들 수 있을 것입니다. 1. B+-TreeB+-Tree 는 아래의 조건을 만족시키는 Rooted Tree 구조를 말합니다.루트로부터 모든 leaf 노드로의 길이는 동일하다 (Balanced Tree)루트, 리프 노드가 아닌 모든 노드는 n/2 ~ n개의 자식 노드를 가질 수 있다.모든 리프 노드는 (n-1)/2 ..
MySQL의 문자열 데이터 타입 비교 2. VARCHAR vs TEXT 저번 글에 이어 MySQL의 VARCHAR 타입과 TEXT 타입을 정리해 보도록 하겠습니다. 일반적으로 RDBMS에서 TEXT나 BLOB과 같은 대용량 데이터를 지정하는 컬럼 타입을 LOB 타입이라 합니다. 저번 글에서 CHAR 타입과 VARCHAR 타입에 대해 이야기 했었는데요. 문자열 타입 중에 매우 긴 타입을 저장할 때는 CHAR 타입을 사용할 수 없습니다. (255자까지밖에 저장할 수 없음). 따라서 VARCHAR 타입과 TEXT 타입 중 선택을 해야 합니다. VARCHAR 타입은 만능일까?VARCHAR 타입을 CHAR타입과 비교하여 설명하는 많은 글을 읽어보면, 가장 강조하는 부분이 데이터를 저장할 때 필요한 공간만큼만 할당하여 사용한다입니다. 이렇게만 읽으면 varchar 타입은 항상 필요한 ..
MySQL의 문자열 데이터 타입 비교 1. CHAR vs VARCHAR MySQL을 사용하다 보면, 문자열 데이터 타입을 어떤 것을 사용하여 저장할지 항상 고민이 많이 됩니다. 보통은 저장되는 데이터의 길이를 정확히 제한하기 어렵기 때문에 varchar 타입을 관습적으로 많이 사용하게 되는 것 같습니다. 오늘은 이러한 습관을 좀 없애보고자 정확히 각 타입의 장단점을 비교하고 언제 char 타입을 사용하는 것이 유리한 지, 언제 varchar타입을 사용하는 것이 유리한 지 정리해보려 합니다.char vs varchar통상 일반적인 문자열을 저장할 때 CHAR 혹은 VARCHAR 중 하나의 타입을 선택하게 됩니다. 추후에 TEXT와 VARCHAR을 비교하는 글도 작성하겠지만, TEXT의 경우 매우 긴 문자열을 저장할 때 고민할 요소이지, 255자 정도 이내에서 사용할 데이터..
Spring Boot의 의존성 관리 및 Bean 생성 과정 안녕하세요. 이번 포스팅에서는 SpringBoot가 어떻게 자동적으로 필요한 Dependencies를 받아오는지, 필요한 Bean들을 생성하는지에 대한 포스팅을 진행해보려 합니다. Dependencies 관리 만약에 저희가 maven project로 다음의 dependency만 추가한 뒤, package를 실행해 보면 어떠한 일이 벌어질까요? org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test 보시는 바와 같이 정말 많은 의존성 패키지들이 추가됩니다. 심지어 저희는 spring-boot-starter-web이나 spring-boot-starter-test의 버전조차 명시하지 않았는..