본문 바로가기

Data

(13)
Join이 가장 기본적이고 핵심적인 문법이다 쿼리를 돌려봤는데 너무 느려서 머리를 싸매고 문제를 찾았다. 하지만 프론트, 백엔드 모두 작성된 것은 문제가 없었고... 도대체 문제가 무엇인지 몰라서 발광(?)에 가까운 심정으로 모니터만 뚫어져라 쳐다봤다. 문제는 생각보다 간단했다. 사용하는 테이블 중 한 테이블에 JOIN이 안 걸려있던 것이다. 수억 건에 달하는 데이터를 전부 호출하니 당연하게도 느릴 수밖에 없는 구조였다. 이때서야 JOIN의 중요성을 깨달았다. 다른 문법이야 옳고 그름이 쉽게 보이는데, 테이블 하나에 조인이 걸려있냐 안 걸렸냐 그것은 문법상 오류도 아니므로 돌려봐서 문제를 깨닫기도 어렵다. 실제로 돌려볼 때는 데이터가 없었으니 더 문제가 없다고 생각했다.
독특한 SQL 사용방법, WHERE 0 = ? SQL을 보다 WHERE 절에 특이한 조건을 넣는 패턴을 보게 됐다. SELECT * FROM TABLE WHERE 0 = ? 이런 패턴이다. 도대체 왜 0을 넣을까 생각을 하고 고민도 많이 해봤지만, 해답은 간단했다. 내가 작업 중인 프로그램에서는 보편적으로 0, 1을 사용하여 성공실패를 나타내기 때문이었다. 0 = ? 이 TRUE라면 어떤 조건을 실패했을 경우 성립되는 조건이라는 것이었다. 너무 어려웠는데 밥 먹고 차분히 생각해보니 바로 답이 나와버렸다... 역시 사람은 휴식이 필요해!
집계함수 중 COUNT(*)은 대체 뭘까? 쿼리를 보다가 COUNT(*)이라는 표현을 접했다. 이 짧은 함수가 이해가 잘 되지 않아서 정리해봤다. 1. COUNT() SQL 문법 중 COUNT()는 집계함수로 분류된다. 집계함수를 쉽게 인식하자면 다음과 같다. 여러 행의 데이터를 하나의 그룹으로 묶는다. 묶은 그룹을 기준으로 하나의 결과값을 도출한다. 집계함수는 여러 데이터에서 단 하나의 결과값을 얻고자 할 때 사용한다. COUNT()는 이런 측면에서 보면 정말로 단순하다. COUNT('A')라고 표현하면, 'A'라는 값을 가진 행의 개수를 출력한다. COUNT(1)이라고 표현하면, 1이라는 값을 가진 행의 개수를 출력한다. 그렇다면 COUNT(*)는 대체 뭘까? 간단히 생각하면 그 어떤 값이라도 있는 행의 개수를 출력한다는 것이다. 여기서 의문..
마이바티스 간단하게 알아보기 - 4 (동적 쿼리) # MyBatis - Dynamic ## features 1. if 2. choose (when, otherwise) 3. trim (where, set) 4. foreach ## if SELECT * FROM BLOG WHERE state = ‘ACTIVE’ AND title like #{title} AND author_name like #{author.name} ## choose, when, foreach SELECT * FROM BLOG WHERE state = ‘ACTIVE’ AND title like #{title} AND author_name like #{author.name} AND featured = 1 ## trim, where, set - trim은 쓸 일이 없을 것 같다 SELECT ..
마이바티스 간단하게 알아보기 - 3 (XML) # MyBatis - XML ## elements 1. cache - 해당 네임스페이스 설정 2. cache-ref - 다른 네임스페이스 설정 참조 3. resultMap - DB Data를 Object에 로드하는 방법 정의 4. sql - SQL 재사용 5. insert 6. update 7. delete 8. select ## select SELECT * FROM PERSON WHERE ID = #{id} ### parameter #{PreparedStatement} - JDBC 사용하면 PreparedStatement에는 "?" 형태로 파라미터 전달 ## insert, update, delete - id: PK - useGeneratedKeys, keyProperty: Id 자동 생성 insert ..
마이바티스 간단하게 알아보기 - 2 (설정) # MyBatis - Setup ## Mapper Setting ### structure - configuration - properties - settings - typeAliases - typeHandlers - objectFactory - plugins - environments - environment - transactionManager - dataSource - databaseIdProvider - mappers ### properties - in Java properties - in properties element ### settings - Alias - 대소문자 구분하지 않음 - Mappers - SQL 구문이 있는 곳을 지정
마이바티스 간단하게 알아보기 - 1 (소개) ## Introduce - Database's SQL, Procedure, Advanced Mapping features to Java POJO - Use XML or Annotation for mapping ## DI Framework for MyBatis - MyBatis-Spring - MyBatis-Guice ## SqlSession - 스프링이나 쥬스와 같은 의존성 삽입 프레임워크와 함께 사용할때 SqlSessions은 DI프레임워크에 의해 생성되고 삽입된다. - 그래서 SqlSessionFactoryBuilder나 SqlSessionFactory가 필요하지 않을 것이기 때문에 SqlSession섹션으로 바로 넘어가도 무방하다. - 추가적인 정보는 MyBatis-Spring이나 MyBatis-G..
마이바티스 간단하게 알아보기 - 0 JPA를 사용하더라도 MyBatis 기능은 같이 사용하는 경우가 많다. 오래된 프로그램이라면 순수하게 MyBatis나 더 나아가 iBatis를 사용할 수도 있다. 적어도 한국에서는 적어도 읽을 줄은 알아야 문제가 되지 않는 파트가 요 녀석이다. 중요한 기능을 중심으로 알아보도록 하겠다. 소개 및 설치 설정 XML 작성 동적 쿼리 작성
ResultMap은 반드시 써야 하나? MyBatis를 배우면서 resultMap에 대해서 배웠다. select, update 같은 구문으로 데이터를 가져오고 resultMap으로 DTO에 넣는 방식이었다. 배울 당시에는 아무런 생각이 없었는데, 현업에서는 막상 쓰는 사람도 있고 안 쓰는 사람도 있어서 궁금함이 생겼다. resultMap을 사용안해도 데이터를 가져올 수 있다면 왜 존재하는 거지? MyBatis 공식 홈페이지에서는 엄청나게 강력한 기능이라고 자랑까지 하던 기능인데 말이다. 핵심 키워드는 '자동'이었다. 쿼리를 자동으로 짤 수 있을 정도로 정형화되고 단순한 쿼리라면 일반 select 문으로도 충분하다. 하지만, 서브 쿼리를 깊게 파고들고 조인에 조인이 이어지고 여기저기 누더기처럼 엮어있고 데이터 양도 방대하다면 자동으로 짜는 쿼리..
SQL 기본 문법 자주 쓰는 SQL 문법 SELECT - extracts data from a database UPDATE - updates data in a database DELETE - deletes data from a database INSERT INTO - inserts new data into a database CREATE DATABASE - creates a new database ALTER DATABASE - modifies a database CREATE TABLE - create a table ALTER TABLE - modifies a table DROP TABLE - deletes a table CREATE INDEX - creates an index (search key) DROP INDEX -..