연결
연결은 작업 공간 안의 .lnc 파일(LightNote Connection)입니다. Git으로
버전 관리할 수 있고 컴퓨터 사이에서 옮길 수 있습니다. 폴더의 연결은 사이드바의
연결 패널(데이터베이스 아이콘)에 표시되며, 각각 상태 점(초록은 연결됨, 회색은
연결 안 됨, 빨강은 오류)과 그 아래에 연결에 속한 스크립트가 있습니다.
새로 만들기 → 새 DB 연결 또는 패널의 버튼으로 만듭니다. 파일 트리에서
.lnc를 열어도 패널로 이동합니다. 목록 아래에는 선택한 연결의 개체 트리가
있습니다. 연결의 상황에 맞는 메뉴에는 연결/연결 끊기, 새 스크립트,
SQL 콘솔, 연결 편집이 있습니다.
연결이 없는 폴더: 비어 있는 연결 패널은 새 연결…과
데이터베이스 파일 열기…를 제공하고, 폴더에 이미 있는 SQLite와 DuckDB 데이터베이스
파일을 각각 연결 버튼과 함께 보여 줍니다. 데이터베이스는 확장자가 아니라 파일 내용으로
알아봅니다(.db는 둘 중 어느 것일 수도 있습니다). 한 번 클릭하면 파일 옆에
연결(.lnc)을 만들어 이름으로 파일을 가리키고(둘은 함께 옮겨 다닙니다) 바로
연결합니다.
스크립트: 스크립트는 일반 .sql 파일이며 다른 파일처럼
코드 탭에서 열립니다(기록, 변경 막대, 버전 저장 포함). 탭 도구 모음의
맨 앞에 연결 선택기와 실행 버튼이 있고, 결과는 처음 실행할 때
편집기 아래에 나타납니다(옆에 두려면 실행 → 결과를 옆에 표시).
스크립트의 원본 연결은 .lnc에 저장되며, 스크립트를 다시 열면 이미
그 연결을 가리킵니다. 선택기에서 다른 연결을 고르면 그 탭에만 적용됩니다. 원본을
바꾸려면 이 스크립트에 항상 "…" 사용을 사용하세요. 원본이 없는 스크립트는
폴더에 연결이 하나뿐이어도 연결 없음으로 열립니다. 직접 고르지 않은
데이터베이스를 가리킨 채 열리는 스크립트는 없습니다. SQL 콘솔은 파일이 없는
탭이며 이미 연결에 묶여 있습니다. 결과의 분석 영역은 스크립트 옆
(query.sql.analysis.json)에 쿼리마다 하나씩 저장됩니다. 파일에는 차트,
피벗 테이블, 각 쿼리의 SQL이 들어가며 데이터는 들어가지 않습니다.
탭마다 세션 하나: 스크립트 탭마다 데이터베이스와 자체 세션을 엽니다. 한
탭의 오래 걸리는 쿼리가 다른 탭이나 개체 트리를 막지 않고, 한 탭의 Commit이
다른 탭의 변경을 확정하지도 않습니다. 임시 테이블과 SET 명령은 실행한
탭에서만 유효합니다. 서버가 연결 수를 제한한다면 연결 편집에서
탭마다 세션 하나를 끄세요. SQLite와 DuckDB 파일은 항상 같은 세션을 공유합니다
(SQLite에서는 쓰기 하나가 파일 전체를 잠급니다). 패널에는 연결마다 열린 세션 수가
표시됩니다.
드라이버: SQLite와 DuckDB(파일)는 네이티브 지원; PostgreSQL,
MySQL/MariaDB, SQL Server, 범용은 ODBC를 통해; Oracle은
ODBC 없이 네이티브로 지원됩니다. SQL Server는 Microsoft의
msodbcsql 드라이버를 사용하며(기기에 설치 필요) Windows
인증 또는 사용자/비밀번호 방식과 채널 암호화 옵션(Encrypt /
인증서 신뢰)을 제공합니다. Oracle의 경우 설정 → 데이터베이스에서
Oracle Instant Client 폴더를 지정하세요 — 설치할 필요 없이 실행
시 로드됩니다. Oracle 연결에는 네 가지 모드가 있습니다: 서비스
이름(호스트/포트/서비스), SID(호스트/포트/SID), TNS
이름(클라이언트 폴더의 tnsnames.ora 별칭), 전체
TNS 설명자(텍스트 필드에 붙여넣기).
비밀번호: 비밀번호 저장을 체크하면 .lnc
파일 내부에 암호화되어 저장됩니다(다른 기기에서도 열리는 이동
가능한 암호화). 체크하지 않으면 비밀번호는 저장되지 않고 연결할
때마다 물어봅니다. 암호화에는 도움말 → 암호 문구 설정에서
지정한 작업 공간별 암호 문구를 사용합니다. 안전하게 보관하세요 —
이것이 없으면 다른 곳에서 비밀번호를 열 수 없습니다. 암호 문구는 로컬
기기에만 캐시되며(Git으로 전송되지 않음) 유지됩니다.
열 때 연결을 켜면 그 연결의 스크립트를 열 때 자동으로 연결됩니다. 자동 연결은 조용히 이루어집니다. 비밀번호를 입력해야 하면(묻기 모드이거나, 컴퓨터에 암호 문구가 캐시되지 않은 암호화) 스크립트는 방해하지 않고 연결 안 된 상태로 열립니다.
운영 환경을 안심하고: 연결 편집의 환경 칸은 이 데이터베이스가 개발,
스테이징, 운영 중 무엇인지 알려 주며, 그 색은 .sql 탭의 연결 선택기, 탭 위쪽의 띠, 연결
패널의 배지에 나타납니다. 운영 연결에서는 데이터베이스를 바꾸는 것(INSERT, UPDATE,
DELETE, CREATE, DROP, 프로시저 등)이 실행 전에 무엇이 실행될지 보여 주고 확인을
받으며, WHERE 없는 UPDATE/DELETE는 강조됩니다. 기본 버튼은 취소이고, 그리드의
변경 내용을 저장할 때도 똑같이 묻습니다. 읽기 전용을 켜면 스크립트, 그리드, 테이블의 데이터 어디에서든
데이터베이스를 바꾸는 것은 LightNote를 떠나기 전에 거부됩니다. 그리드는 더 이상 편집을 제공하지 않고, SQLite에서는
파일이 읽기 전용으로 열립니다. 읽기만 하는지 LightNote가 판단할 수 없는 것(BEGIN … END 블록,
DECLARE)은 쓰기로 취급합니다.
SSH 터널: SSH 서버(배스천) 뒤에 있는 데이터베이스는 SSH 터널에서 작업 공간의 SSH
연결(.lns)을 고릅니다. 원격 터미널과 같은 것으로, 사용자, 키 또는 암호화된 비밀번호를 씁니다.
호스트와 포트는 SSH 서버에서 본 데이터베이스의 것이 됩니다(보통 localhost). 연결하면
LightNote가 터널을 열고 그 길로 데이터베이스에 연결하며, 연결을 끊으면 터널도 닫힙니다. 터널은 연결할 때만
열리고(파일을 열 때는 절대 열리지 않음), .lns는 작업 공간 안에 있어야 하며, 명령을 실행하는 ssh
옵션(ProxyCommand, LocalCommand, -F)은 거부됩니다. -J는
괜찮습니다. 허용 목록에 있는 옵션만 통과합니다(-J, -i, -4/-6, -C, 연결·암호·인증 키를 지정한 -o). -A, -R, -I, -E도 거부됩니다. 터널을 쓰는 연결은 직접 연결해 버릴 AI(MCP), lnote, 블록에서는 열리지 않습니다.
서버 정보: 연결할 때 앱은 데이터베이스가 스스로에 대해 알려 주는 정보를 묻습니다 — 버전, 현재 데이터베이스와 스키마, 사용자, 크기, 인코딩, 데이터 정렬, 시간대, 그리고 서버가 쓰기를 받는지 (복제본은 받지 않습니다). 버전은 연결의 도구 설명에 표시되고, 나머지는 연결의 컨텍스트 메뉴에 있는 서버 정보…에 복사 버튼과 함께 표시됩니다. 서버가 알려 주지 않는 정보(이전 버전, 권한 없음)는 오류 없이 빠집니다. AI에게 오류 설명이나 계획 분석을 요청할 때 버전도 함께 보냅니다. AI가 제안할 수 있는 구문이 버전에 따라 달라지기 때문입니다.
SQLite의 외래 키: SQLite는 연결이 요청할 때만 선언된 외래 키(와
ON DELETE CASCADE)를 적용하며, 앱의 연결은 이를 요청합니다. 다른 행이 참조하는 행을
삭제하거나 존재하지 않는 레코드를 참조하는 행을 넣으면 거부되고, CASCADE는 스키마대로 자식
행을 삭제합니다. 연결 편집…의 외래 키 검사 확인란으로 끌 수 있습니다 — 순서가 맞지 않는
대량 적재 때만. 켜도 파일에 이미 있는 데이터는 검사하지 않습니다. 서버 정보…는 검사하지 않는
도구가 기록한, 이미 있는 깨진 참조(존재하지 않는 레코드를 가리키는 행)를 테이블별로 셉니다.
실행과 결과 보기
실행: Ctrl+Enter는 커서 위치의 문을 실행하고
Alt+X는 스크립트 전체를 실행합니다. 결과는 페이지 단위로
표시되며, 각각 결과 탭과 하단 작업 바를 가집니다:
다음 블록 가져오기, 결과 고정, 전체
개수, 행 제한 변경, 새로고침(재실행), SQL 보기/복사,
내보내기..., 선택한 행에서 SQL 생성. 무엇이 하나의 문인지는 텍스트 자체가 정합니다. BEGIN … END 블록과 $$ … $$ 본문은 나뉘지 않으며, /(Oracle)나 GO(SQL Server)만 있는 줄도 구분합니다.
도움을 받으며 SQL 쓰기: Ctrl+Space는 문맥에 따라 완성합니다.
FROM, JOIN, UPDATE, INTO 다음에는
데이터베이스의 테이블이 나오고(공백을 입력하면 목록이 저절로 열립니다),
별칭. 다음에는 그 테이블의 열이 나옵니다(점을 입력하면 저절로 열립니다).
FROM을 아직 쓰지 않았어도, 트리에서 아무것도 펼치지 않아도 됩니다.
LightNote는 데이터베이스 카탈로그를 백그라운드에서 읽고, 열은 텍스트가 그 테이블에 이를
때만 읽습니다. 문이 여러 개인 스크립트에서는 Ctrl+Enter로 실행될 문이 강조됩니다.
문이 실패하면 편집기에서 그 문이 표시되고, 데이터베이스가 가리킨 이름(존재하지 않는
테이블이나 열, 구문 오류의 위치)에 물결 밑줄이 생기며, 커서가 그곳으로 이동하고, 마우스를
올리면 메시지가 나타납니다. 테이블 이름에서 Ctrl+클릭하거나 F12를 누르면
데이터가, F4를 누르면 속성이 열립니다. 서식 지정(Shift+Alt+F)은
도구를 설치하지 않아도 SQL을 정리합니다. 절마다 한 줄, SELECT 항목이 여러
개면 한 줄에 하나, AND/OR와 하위 쿼리는 들여씁니다. 바뀌는 것은
공백과 키워드의 대소문자뿐이며 이름, 텍스트, 주석은 결코 바뀌지 않습니다. 쿼리가 아닌
문(CREATE, BEGIN … END 블록)은 그대로 둡니다.
결과 고정: 결과 전체를 데이터베이스에서 한 번에 읽어 로컬 테이블에 보관합니다 (메모리에 들어가지 않으면 디스크에 저장합니다). 그 뒤로는 표가 데이터베이스를 조회하지 않고 스크롤되고, 행 수가 정확해지며(전체 개수 세기가 필요 없습니다), 머리글을 클릭하면 정렬되고(다시 누르면 내림차순, 세 번째로 누르면 데이터베이스가 준 순서로 돌아갑니다), 내보내기도 로컬 사본에서 읽습니다. 머리글 정렬은 10만 행까지 쓸 수 있습니다. 그보다 크면 거부하고 머리글 툴팁에 이유를 알려 줍니다. 페이지마다 사본 전체를 다시 정렬해야 해서 표를 훑는 데 다시 몇 분이 걸리기 때문입니다. 첫 페이지에서 결과 전체가 도착한 경우에는 고정하지 않아도 정렬할 수 있습니다. 행이 이미 메모리에 있기 때문입니다. 정렬할 수 없는 것은 아직 페이지 단위로 가져오는 중인 결과의 앞부분입니다. 그럴 때 머리글은 화면에 있는 것에만 해당하는 순서를 주장하게 됩니다.
차트와 피벗 테이블은 결과 전체를 대상으로 하며, 원래 차트가 없던 데이터베이스에서도 마찬가지입니다. 고정이 끝까지 가지 못하면(중지를 눌렀거나 상한에 도달한 경우) 행은 로컬에 남지만 차트와 피벗 테이블은 서버에 남습니다. 결과의 일부만 합계하면 잘못된 값이 나오기 때문입니다. 이때 표를 정렬해도 가져온 행만 정렬되며 결과 전체는 아닙니다.
새로고침은 고정을 해제하고 쿼리를 다시 실행합니다. 고정 여부와 상관없이, 표를 한 번 지나간 페이지는 로컬에 보관됩니다. 그 페이지로 되돌아가 스크롤해도 데이터베이스를 다시 조회하지 않습니다. 고정은 한 번에 하나만 실행됩니다. 결과가 두 개 열려 있을 때 다른 쪽에서 결과 고정을 누르면 이유와 함께 거부되며, 진행 중인 작업은 중단되지 않습니다. 멈추려면 해당 탭에서 중지를 사용하세요.
결과 그리드: 행을 돌려주는 쿼리마다 테이블 이름으로 된 탭이 생깁니다(전체 SQL은 탭 도움말에 있습니다). 다시 실행하면 이 탭들이 바뀌지만, 고정한 탭(탭을 오른쪽 클릭 → 결과 탭 고정)은 비교할 수 있도록 남습니다. ×는 결과를 닫습니다. 탭 옆의 실행 요약은 몇 행이 왔고 얼마나 걸렸는지, 또는 오류를 빨간색으로 보여 주며, 클릭하면 메시지가 열립니다. 바닥글에도 행 수와 시간이 표시되고, 결과가 아직 일부뿐이면 다음 블록 가져오기와 전체 개수 세기가 나타납니다. 그리드 위의 막대에 나머지가 모여 있습니다: 새로고침, 고정, 제한, 분석 메뉴, 값, 열, 내보내기(SQL 복사, SQL 보기, SQL 생성 포함). 창이 좁으면 버튼은 사라지기 전에 글자부터 줄입니다. 머리글에는 각 열의 형식(텍스트, 숫자, 날짜…)이 표시되고, 테이블의 키 열에는 열쇠가 붙습니다. 마우스를 올리면 형식 이름이 나옵니다. 머리글을 끌면 열 순서가 바뀌고, 열(또는 머리글 오른쪽 클릭)로 열을 숨기고 표시하며 너비를 내용에 맞출 수 있습니다. 이 선택은 새로고침, 제한 변경, 정렬 후에도 유지됩니다.
셀: NULL은 흐린 기울임꼴로 표시되어 빈 텍스트와 구분되고, 숫자는 오른쪽 정렬됩니다.
여러 셀을 선택하면 바닥글에 선택 개수와, 숫자라면 합계와 평균이 나타납니다. 값(또는 상황 메뉴의
패널에서 값 보기)은 선택한 셀의 전체 값을 자르지 않고 옆에 보여 주며, 서식 지정으로 JSON/XML을
화면에서만 정리합니다. 패널의 레코드 버튼은 값을 행 전체를 전치한 표(한 줄에 한 열, 이름 옆에 값)로
바꾸며, 이 표는 커서를 따라갑니다(셀 메뉴의 레코드 전체 보기로도 열 수 있습니다). 셀 메뉴의
이 값으로 필터 / 이 값 제외는 그 셀로 WHERE를 붙여 쿼리를 다시 실행하고,
참조된 레코드로 이동은 열의 외래 키를 따라가 그 값으로 부모 테이블을 조회합니다.
그리드 검색과 필터: 그리드에 포커스가 있을 때 Ctrl+F는 그리드 검색 칸으로 가며, 아무
열에나 텍스트가 포함된 행만 보여 줍니다. 편집기에 포커스가 있을 때의 Ctrl+F는 그대로 SQL 검색입니다. 옆의
깔때기는 고급 필터(열별 조건, AND/OR)를 열고, 필터가 걸린 열의 머리글에는 깔때기가 붙습니다. 차트의 막대,
피벗 테이블의 셀, 품질의 빈도 높은 값을 클릭하면 선택이 되어 그리드 위에 태그로 표시되며, ×로 뺄 수
있습니다. 바닥글은 전체 중 몇 행이 남았는지 알려 줍니다. 검색과 필터는 로컬 사본에서 전체 결과에 적용됩니다.
결과가 전부 왔다면 바로 적용되고, 첫 부분만 있으면 칸이 회색이 되며 이유가 표시됩니다(화면에 있는 것만 거르면 다음
부분에 있는 행이 숨겨지기 때문입니다). 고정하면 사용할 수 있습니다. 검색이나 필터가 켜져 있는 동안 차트, 피벗
테이블, 품질도 그리드와 같은 범위를 다룹니다. 이 중 어느 것도 쿼리를 바꾸지 않습니다. 데이터베이스에서 거르려면
이 값으로 필터를 쓰거나 WHERE를 작성하세요.
차트와 피벗 테이블: 계산하는 곳. 분석 메뉴에는 차트, 피벗 테이블,
품질, 분석 영역이 있고, 분석 대상에서 로컬 데이터와 전체 테이블(서버에서) 중
하나를 고릅니다(적용 중인 쪽에 체크 표시). 결과가 첫 페이지에 전부 들어오면 기본값은 로컬입니다.
LightNote는 화면에 있는 결과를 그대로 집계하므로 축, 집계, 구간을 바꿀 때마다 데이터베이스에 다시 묻지
않습니다. 로컬 엔진이 DuckDB이므로 서버에서 그 SQL이 실행되지 않는 Oracle, SQL Server, PostgreSQL,
MySQL에서도 차트를 쓸 수 있습니다. 결과가 잘려서 오면 로컬은 이유와 함께 사용할 수 없습니다.
일부만 집계하면 틀린 숫자가 나오고, 잘렸다고 알려도 막을 수 없습니다. 차트에서 읽는 것은 막대의 높이이기
때문입니다. 서버를 고르면 쿼리 전체를 집계하며 조정할 때마다 쿼리를 한 번 실행합니다. 그리드에 검색이나
필터가 있는 동안에는 쓸 수 없습니다(걸러낸 범위는 여기에만 있으니까요). 데이터베이스가 텍스트로 주는 숫자
열(Oracle의 NUMBER 등)은 숫자로 인식하고, 01310처럼 0으로 시작하는 식별자는 텍스트로
둡니다. Oracle, SQL Server, PostgreSQL, MySQL에서 결과가 아직 일부뿐이면 차트는 이유와 함께 회색이 되고,
결과를 고정하면 켜집니다.
결과의 데이터 품질. 분석 메뉴의 품질은 파일 테이블과 같은 열별 프로필을 그리드 옆에 엽니다. 계산은 DuckDB가 합니다. 결과가 전부 왔거나 고정했다면 로컬 사본에서, 데이터베이스가 DuckDB라면 데이터베이스 자체에서 계산합니다. Oracle, SQL Server, PostgreSQL 등에서 결과가 아직 일부뿐이면 패널은 설명할 수 없는 이유를 알려 주고 그 자리에서 결과 고정을 제안합니다. 고정이 상한에서 멈추면 쿼리를 좁히라고 권합니다. 일부만 담은 프로필은 다른 테이블을 설명하게 되기 때문입니다. 빈도 높은 값을 클릭하면 그리드가 걸러집니다(검색처럼 선택이 됩니다). 데이터베이스에서 거르려면 셀 메뉴의 이 값으로 필터를 쓰세요.
분석에 사용된 데이터의 양. 차트, 피벗 테이블, 품질, 분석 영역 위에 한 줄이 계산이 모든 데이터를 사용했는지(로컬 사본에서는 행 수를 자동으로 셉니다), 아니면 데이터베이스에서 쿼리 전체를 대상으로 계산했는지 알려 줍니다. 데이터베이스에서는 세기 위해 쿼리를 다시 실행해야 하므로 행 수는 행 수 세기 링크로 셉니다. 고정이 끝까지 가지 못하고 멈췄는데 그리드에 검색이나 필터가 있으면, 분석은 가져온 부분만 대상으로 할 수 있으므로 이 줄이 경고 색으로 데이터 일부라고 표시합니다. 같은 문장이 분석 영역 보고서의 설명에도 들어갑니다.
데이터 스냅샷: 저장된 스크립트의 분석은 데이터가 아니라 카드를 스크립트 옆에 보관합니다. 다시 보려면 데이터베이스가 필요합니다. 분석 영역의 데이터 스냅샷 버튼은 결과 전체를 카드와 함께 스크립트 옆의 Parquet 파일로 저장합니다. 이 파일을 열면 연결 없이 그 시점의 데이터로 같은 분석을 볼 수 있습니다. 명시적인 동작이며 창이 먼저 알려 줍니다. 이 파일은 데이터베이스 데이터의 복사본이고, 폴더가 Git에 들어가거나 공유되면 함께 전달됩니다. 결과 전체가 여기 있을 때만 사용할 수 있습니다. 첫 부분만 있으면 먼저 고정하세요 (버튼의 도움말에 나와 있습니다).
실행 계획: 실행 메뉴의 실행 계획은 커서 위치 구문의 계획을
가져와(SQLite, DuckDB, PostgreSQL, MySQL) 계획 탭에 보여 줍니다. 단계의 트리를 보여 주고
가장 무거운 단계를 강조한 뒤 그 의미를 한 문장으로 알려 줍니다. PostgreSQL과 MySQL에서는
자체 비용(그 단계의 비용에서 안쪽 단계들의 비용을 뺀 값)이 가장 큰 단계와 전체에서
차지하는 비율, DuckDB에서는 가장 많은 행을 만드는 단계, 비용을 알려 주지 않는 SQLite에서는
테이블 전체 읽기입니다. 인덱스가 있는 데이터베이스에서 단계가 테이블 전체를 읽으면, 걸러 내는
열에 인덱스를 두면 보통 이를 피할 수 있다고 덧붙입니다(열 지향인 DuckDB에서는 테이블 전체
읽기가 보통이라 이 조언이 나오지 않습니다). 쿼리의 별칭(FROM orders o)은 테이블
이름으로 바뀝니다. 텍스트로 보기는 같은 트리를 들여써서 보여 주고, 계획 복사로
복사할 수 있습니다. 숫자는 플래너의 추정치이며 쿼리는 실행되지 않습니다. 직접 입력한
EXPLAIN도 LightNote가 결과를 알아보면 계획 탭에서 열리고, 알아보지 못한 것은
그리드에 남습니다. 한 구문으로 실행 계획을 내주지 않는 데이터베이스(SQL Server, Oracle)에서는 이
항목이 비활성화되며, 이유가 도구 설명에 표시됩니다.
AI로 분석: 강조 표시는 어느 단계가 무거운지 알려 줍니다. 계획 탭의
AI로 분석 버튼은 플래너가 왜 그것을 골랐는지, 무엇을 바꿔야 하는지 AI에게 묻습니다.
쿼리, 계획, 그리고 읽는 테이블의 스키마가 전송됩니다. 이미 있는 인덱스도 포함되므로 AI가 이미 있는
인덱스를 만들라고 제안하지 않습니다. 값은 전송 전에 제거되며 (따옴표 안의 텍스트와 숫자는
?가 되고 주석은 빠집니다), 전송될 내용 보기로 무엇이 가는지 정확히 확인할 수 있습니다.
제안은 새 스크립트로 편집기에서 열리며 아무것도 실행되지 않습니다.
스키마
테이블의 데이터: 스키마 트리에서 테이블을 더블 클릭하면 해당 탭이
데이터 하위 탭으로 열립니다. 그리드 위에는 WHERE와
ORDER BY 두 칸이 있고 Enter로 적용됩니다. 둘 다
데이터베이스로 보내지므로 화면에 보이는 행만이 아니라 테이블 전체에
적용됩니다. 열 머리글을 클릭해도 데이터베이스에서 정렬하며(오름차순, 내림차순,
정렬 없음) ORDER BY가 채워집니다. 셀 메뉴의 이 값으로 필터는
조건을 WHERE에 추가하며, 보이는 상태로 편집할 수 있습니다. 이 탭은
스크립트 탭처럼 데이터베이스와 자체 세션을 가집니다. 속성으로 테이블을 열면
데이터를 조회하지 않습니다. 쿼리는 데이터 하위 탭이 표시될 때만 실행됩니다. ORDER BY가 비어 있으면 행은 기본 키 순서로 옵니다(어떤 키인지 입력란에 표시됩니다). 순서가 전혀 없으면 데이터베이스가 페이지마다 같은 순서를 보장하지 않아, 스크롤할 때 행이 반복되거나 빠질 수 있었습니다. 머리글로 정렬하면 값이 같은 행은 키로 순서를 정합니다.
데이터 편집: 기본 키(또는 NOT NULL 열의 고유 키)가 있는 테이블의 그리드에서 셀을 더블클릭하거나 F2를 누르거나 바로 입력을 시작합니다. 편집기는 열의 형식을 따릅니다. 날짜는 달력, 참/거짓은 목록, 숫자는 숫자만 받는 입력란, JSON은 확정할 때 검사합니다. 지운 텍스트는 NULL이 아니라 빈 텍스트가 됩니다. NULL은 별도의 동작입니다(셀 메뉴의 NULL로 설정, 또는 긴 텍스트도 편집하는 값 패널의 NULL 버튼). Insert는 새 행을 추가하고(기본값으로 남긴 열에는 데이터베이스 기본값이 들어갑니다), 행 복제는 선택한 행을 키만 빼고 복사하며, Del은 행을 삭제 표시합니다(다시 누르면 해제). 이 모든 것은 바로 데이터베이스로 가지 않습니다. 변경 내용은 보류 상태로 그리드에 색으로 표시되고(변경은 호박색, 새 행은 녹색, 삭제는 취소선이 있는 빨간색), 위의 띠에 개수가 나옵니다. 검토…는 실행될 SQL을 보여 주고 스크립트로 복사합니다. 저장은 모든 것을 하나의 트랜잭션으로 기록하며, 각 UPDATE와 DELETE가 정확히 한 행에 적용되는지 확인합니다. 읽은 뒤 다른 세션이 행을 바꾸거나 삭제했거나 어떤 문이 실패하면 아무것도 기록되지 않고 변경 내용은 그리드에 남습니다. 버리기는 모두 되돌립니다. 보류 중인 변경이 있을 때 그리드를 다시 불러오거나 필터를 바꾸거나 탭을 닫으면 먼저 묻습니다.
그리드가 편집되지 않을 때는 이유를 알려 줍니다(버튼의 도움말과, 편집하려고
할 때 나타나는 띠). 기본 키도, NOT NULL 열의 고유 키도 없는 테이블은 읽기 전용입니다. 키가
없으면 각 편집이 어느 행을 바꿀지 알 수 없습니다. 스크립트 탭에서도 쿼리가 하나의
테이블에서 그 열을 나열하고(또는 SELECT *를 쓰고) 키를 포함하는
SELECT이면 결과를 편집할 수 있습니다. 조인, 하위 쿼리, 계산되거나 이름이 바뀐
열, DISTINCT, GROUP BY, UNION이 있으면 결과는 읽기
전용입니다. 이진 열은 그리드에서 편집할 수 없습니다. 그리고 탭에 트랜잭션이 열려
있고(자동 커밋 꺼짐) 보류 중인 문이 있으면, 저장하기 전에 확정하거나 되돌리세요. 그리드를
저장하면 그 문들도 함께 확정됩니다.
객체 속성: 스키마 트리의 테이블에서 F4를 누르면(또는 컨텍스트 메뉴의 속성) 해당 탭이 구조 쪽으로 바로 열립니다. 데이터 옆에 네 개의 하위 탭이 있습니다: 열(번호, 이름, 유형, NULL 허용,
기본값, 기본 키 열에는 키 아이콘), 키(기본 키·외래 키·고유·체크 제약. 외래 키를 더블 클릭하면
참조된 테이블이 열립니다), 인덱스, DDL — 객체의 CREATE TABLE로,
복사하거나 .sql로 저장하거나 편집 가능한 탭에서 열 수 있습니다. 데이터베이스가
완성된 DDL을 제공하지 않을 때(PostgreSQL과 SQL Server에는 해당 명령이 없습니다) LightNote는
메타데이터에서 재구성합니다(DDL 명령이 권한 부족으로 거부될 때도 마찬가지입니다). 그리고 그
사실을 탭에 명확히 표시합니다. 열 카탈로그조차 읽을 수 없으면(권한이 없거나 카탈로그를 사용할 수
없음) 재구성할 재료가 없습니다. 이때 탭은 조용히 비어 있는 대신 그 이유를 알려 줍니다. 테이블의 컨텍스트 메뉴에는 탭을 열지
않고 DDL 복사도 있습니다.
개체 트리: 연결 패널의 목록 아래에 있는 선택한 연결의
트리는 테이블과 뷰를 나누어(각각 아이콘으로) 보여 주고, 기본 키에 속한
열에 열쇠 아이콘을 붙입니다. 트리에는 프로시저 및 함수, 트리거, 시퀀스도 표시됩니다(데이터베이스에 있는 경우). 프로시저, 함수 또는 트리거를 더블 클릭하면 해당 연결의 SQL 콘솔에 소스 코드가 열립니다. 각 테이블 옆에는 대략적인 행 수가, 툴팁에는 주석이 표시됩니다. 이는 데이터베이스가 보관하는 추정치이며 COUNT(*)가 아닙니다. 시스템 스키마(SYS, pg_catalog 등)는 숨겨지며, 목록 끝의 항목으로 표시할 수 있습니다. 필터 상자는 이미 불러온 것을 바로 걸러 내고, 2글자부터는 데이터베이스에서도 검색합니다. 아무도 펼치지 않은 개체는 맨 위의 데이터베이스에서 폴더에 나타납니다. 스크립트 안에서는 Ctrl+Alt+O(연결 선택기의 테이블로 이동…)로 키보드에서 검색을 열 수 있고, 테이블 이름 위에서 F12를 누르면 해당 탭이 열립니다.
메타데이터 새로고침. 스크립트에서 CREATE, ALTER, DROP, RENAME을 실행하면 트리, 자동 완성, 테이블 속성이 몇 초 뒤 테이블·열·형식을 스스로 다시 읽습니다. 트리에서 열어 둔 항목은 접히지 않습니다. 자동 커밋이 꺼져 있으면 Commit(또는 Rollback)까지 다시 읽기를 기다립니다. 그 전까지는 변경이 다른 세션에 존재하지 않기 때문입니다. 구조가 외부에서 바뀌었을 때(다른 프로그램, 마이그레이션)는 스크립트 도구 모음, 연결 메뉴, 트리 필터 옆의 메타데이터 새로고침 버튼이나 테이블 속성의 새로고침을 사용하세요.
스키마 탐색: 테이블을 우클릭하면
SELECT를 편집기에 삽입, 데이터 미리보기, 행 개수,
정규화된 이름 복사를 선택하거나 SQL 생성 하위 메뉴를 열어
INSERT/UPDATE/MERGE를 선택할 수 있습니다: 테이블의 열 목록이
표시되어 포함과 키를 체크할 수 있고, 실시간 미리보기가
표시되며 편집기에 명령이 삽입됩니다(MERGE는 ANSI 형식으로 생성되며,
드라이버가 지원하지 않으면 경고가 표시됩니다). 결과 그리드에서는
하단 바의 SQL 생성 버튼으로 선택한 행의 값이 채워진
INSERT/UPDATE/DELETE를 만듭니다(단일 테이블
SELECT 쿼리일 때만 사용 가능). 트리에서 탐색한 테이블과
열 이름은 추가 데이터베이스 조회 없이 해당 연결의 .sql
편집기 자동완성(Ctrl+Space)에도 나타나기 시작합니다.
ER 다이어그램: 테이블 폴더의 상황에 맞는 메뉴에서 테이블의 ER
다이어그램은 모든 테이블을 그립니다. 테이블의 메뉴에서 ER 다이어그램 (이 테이블과 이 테이블이
참조하는 테이블)은 그 테이블과 외래 키가 가리키는 테이블을 그립니다. 결과는 데이터 사전에
있는 노트로, mermaid erDiagram 블록이 들어 있습니다. 열과 형식,
PK/FK, 그리고 각 외래 키를 관계로 표시합니다 (열이 NULL을 허용하면 선택, 키가 기본 키
자체이면 일대일). 노트의 텍스트이므로 Git으로 버전 관리되고 다른 다이어그램처럼 편집됩니다. 테이블이
40개를 넘으면 나머지는 빠지며, 노트에 그 수가 적힙니다.
파일을 테이블로 가져오기: 파일을 테이블로 가져오기… (연결 메뉴와
테이블 폴더의 메뉴)와 파일을 이 테이블로 가져오기… (테이블의 메뉴)는 CSV, TSV 또는
Excel 스프레드시트를 데이터베이스로 가져옵니다. 결과 내보내기의 반대 방향입니다. 창에는 각
열에서 읽은 형식과 함께 미리 보기가 표시됩니다. 형식은 모든 셀이 맞을 때만 적용됩니다 (앞에
0이 없는 정수 — 01310은 코드이므로 텍스트로 남습니다 —, 마침표 또는 쉼표를 쓰는 소수,
ISO 날짜, 참/거짓). dd/mm/yyyy 날짜는 월이 먼저 올 수도 있으므로 텍스트로 남습니다. 빈
셀은 NULL이 됩니다. 구분 기호는 표 보기와 같은 방식으로 감지합니다. 테이블 만들기는 파일
이름을 사용하고, 테이블에 추가는 먼저 파일의 열이 그 테이블에 있는지 확인합니다. 모든 작업은
하나의 트랜잭션으로 진행됩니다. 한 행이라도 실패하면 아무것도 남지 않으며, 이번 가져오기에서
만든 테이블은 삭제됩니다. 잠금은 여기에서도 적용됩니다. 읽기 전용 연결은 거부하고, 운영 연결은 먼저
묻습니다. DuckDB 연결에서는 데이터베이스가 CSV를 직접 읽으며 행 수 제한이 없습니다. 다른 연결에서는
제한이 100,000행입니다.
내보내기, 변수, 트랜잭션
결과 내보내기: 결과 그리드를 우클릭하고 결과 내보내기...를
선택하면 CSV(구분자, 따옴표 문자, 항상 따옴표, 헤더 행, NULL
텍스트), JSON Lines 또는 SQL(테이블 이름이 포함된
INSERT문)로 저장할 수 있으며, 행 개수 제한도 선택할 수
있습니다. 내보내기는 화면에 보이는 것뿐 아니라 전체 쿼리를
스트리밍 방식(페이지 단위 재조회)으로 처리합니다.
오늘의 노트에 결과 추가: 그리드의 내보내기 메뉴에서 오늘의 노트에
추가는 화면에 보이는 그대로의 표 (보이는 열을 그리드 순서대로, 검색과 필터를 적용한 상태)를
가져오고, 바로 아래에 쿼리를 sql 블록으로 넣습니다. 숫자가 어디서 나왔는지
노트에 남습니다. NULL은 NULL로 표시되고, 숫자는 오른쪽 정렬되며, 표가 결과 전체가
아닐 때 (처음 200행이거나 이미 불러온 행만일 때) 기울임꼴 줄로 알려 줍니다.
스크립트 변수: 스크립트의 한 줄에 @set 이름 = 값을 쓰면
변수를 정의합니다. 접두사 @ 덕분에 데이터베이스로 보내지지 않습니다
(Postgres/DuckDB/SQL Server의 실제 SET과 충돌하지 않습니다).
:name 참조는 실행 전에 바뀝니다(문자열과 주석 밖에서만. ::type
캐스트와 :1 같은 바인드는 그대로입니다). 값이 없는 :name이
있으면 실행 전에 입력을 묻습니다. 실행 메뉴의 변수…는 이미 정의된 변수
화면(편집/추가/제거)을 엽니다.
매개변수: :이름이 있는 문을 실행하면(PostgreSQL을 제외하면
?, ?1, ?2도 해당되며, PostgreSQL에서
?는 JSON 연산자입니다) 쿼리 매개변수 창이 그 문과 모든 매개변수를
마지막으로 쓴 값으로 채워서 보여 주고, 각 매개변수의 목록에는 이전 값이 남습니다. 다른
값으로 다시 실행하려면 칸 하나만 바꾸면 됩니다. 값은 그대로 SQL에 들어가므로 텍스트는
작은따옴표로 감쌉니다('abc'). 스크립트가 @set으로 정의한 것은
묻지 않습니다. 실행할 때마다 묻기를 끄면 그 탭은 묻지 않고 마지막 값을 사용합니다.
나중에 바꾸려면 변수…를 사용하세요.
쿼리 기록: 실행 메뉴의 기록…은 이 연결에서 성공적으로
실행한 최근 구문을 SQL / 시각 / 소요 시간 / 행 열로 보여 주는 창을 엽니다. 하나를
골라 다시 실행, 편집기에 삽입, 복사(두 번 클릭하면 삽입)하거나
기록 지우기를 사용하세요. 기록은 로컬 컴퓨터에만 보관됩니다(Git에도
.lnc에도 들어가지 않습니다).
모든 연결의 기록: 기록 창에서 모든 연결을 켜면 모든 데이터베이스의 쿼리를 최신순으로 연결 열과 함께 보고, 필터 칸으로 전부 검색할 수 있습니다. 다시 실행은 이 연결의 쿼리에만 쓸 수 있고, 다른 연결의 쿼리는 편집기에 삽입되므로 올바른 데이터베이스에서 실행하세요.
트랜잭션: 자동 커밋 옵션(기본값 켜짐)은 실행 메뉴에 있습니다. 끄면 변경은 확정(Commit)하거나 취소(Rollback)할 때까지 보류되고, 탭 도구 모음에 두 명령과 함께 트랜잭션 · 보류 N이 표시됩니다. 트랜잭션이 열린 상태로 탭을 닫거나, 연결을 바꾸거나, 연결을 끊으면 어떻게 할지 묻습니다.
목차
편집
- 개요
- 시작하기
- 작업 공간과 창
- 활동 센터: 작업과 메시지
- 코드 편집기
- Markdown과 위키링크
- 다이어그램(Mermaid)
- 수식과 화학(LaTeX)
- 노트 안의 달력
- 번호 매기기와 상호 참조
- 인용과 참고문헌
- 학술 논문 규격
- 연결 그래프
- 표(Parquet, CSV, JSON, Excel)
- 분석 영역: 피벗 테이블과 여러 차트
- PDF와 이미지
- 이미지: 스크린샷에 주석 달기
- HTML 페이지(.html)
- 인쇄
- 폴더처럼 열리는 Zip(.zip)
- 블록(.lnb)
- 작업(칸반 / 간트)
- 사용자 지정 표(.lnd)
- 베이스(노트 저장 쿼리)
도구
- 파일 검색과 보류 중 패널
- 버전 관리(쉬운 Git)
- 스냅샷과 백업
- 변경 사항 검토(체크포인트)
- 파일 비교(diff)
- 코드 실행(F5)
- 터미널과 AI CLI
- 선택 영역에 대한 AI 어시스턴트(Ctrl+K / Ctrl+I)
- 내 컴퓨터의 AI
- AI 세션
- AI 채팅
- HTTP API 테스트(.lnh)
- 데이터베이스(.lnc)
- SSH 연결(.lns)
- 보안: 암호 문구, PIN, 보안 Markdown
- 일일 노트, 빠른 캡처, 트레이
- 오래된 노트 다시 찾기
- 휴대폰에서 노트 사용하기
- 오디오 녹음(음성·회의)과 AI 전사
- 스티커 메모
- 캘린더
- 명령 팔레트
자동화(AI / 스크립트)
참고