DB part.1

2025. 6. 7. 19:27·Daily Logs/TIL (Today I Learned)

안녕하세요! 데이터베이스 탐험에 오신 여러분을 환영합니다. "데이터는 그냥 엑셀에 정리하면 되는 거 아니야?" 라고 생각하셨나요? 만약 여러분이 수많은 데이터를 효율적으로 관리해야 하는 데이터 수집가라면, 어디에 데이터를 저장하고 싶으세요?

노트에? 엑셀에? 아니면… 데이터베이스(DB)에? 정답은 당연히 데이터베이스입니다! 오늘은 왜 개발자들이 데이터베이스를 사랑하는지, 그리고 그 첫걸음인 SQL은 무엇인지 알아보겠습니다.

왜 우리는 엑셀 대신 데이터베이스를 선택할까?

'그냥 더 전문적이니까' 같은 느낌적인 느낌은 잠시 접어두고, 데이터베이스가 압도적으로 좋은 이유 4가지를 확실하게 알려드릴게요.

1. 데이터 인출, 마법처럼 쉽게! (feat. SQL)

수십 개의 엑셀 시트를 뒤지며 조건에 맞는 데이터를 찾는다고 상상해보세요. 벌써부터 머리가 아파오죠? 😫 하지만 데이터베이스에서는 **SQL(Structured Query Language)**이라는 마법 같은 언어로 원하는 데이터를 단 몇 줄의 명령어로 쏙쏙 뽑아낼 수 있습니다.

2. 안전한 백업과 복구는 기본!

"컴퓨터가 고장 나서 데이터가 다 날아갔어요..." 데이터베이스를 사용하면 이런 끔찍한 상황을 막을 수 있습니다. DB는 체계적인 백업과 복구 기능을 제공하며, 특히 AWS RDS 같은 클라우드 서비스는 특정 시점으로 데이터를 되돌리는 PIT(Point-In-Time) 복구 등 강력한 기능으로 여러분의 소중한 데이터를 안전하게 지켜줍니다.

3. 데이터 중복? 그런 건 없다!

엑셀 작업을 하다 보면 같은 데이터가 여기저기 복사되어 헷갈리는 경우가 많습니다. 데이터베이스는 데이터를 중앙에서 관리하기 때문에 중복을 원천적으로 방지하고, 데이터의 일관성을 유지해줍니다. 데이터가 파편화되어 생기는 아래와 같은 문제점도 사라지죠.

  • 관리자 입장에서 여러 데이터 채널을 신경 써야 하는 번거로움
  • 데이터가 중복 저장되어 발생할 수 있는 혼란과 용량 낭비

4. 비밀 데이터는 비밀스럽게!

회원 정보, 결제 기록 등 민감한 데이터를 아무나 볼 수 있다면 큰일이겠죠? 데이터베이스는 사용자별로 데이터에 접근할 수 있는 권한을 세밀하게 설정할 수 있어 강력한 보안을 자랑합니다.


데이터베이스, 모르면 대화가 안 돼요 (실무 엿보기)

"뜬구름 잡는 얘기 같다고요?" 제가 과거 게임 회사에서 실제로 받았던 메일의 일부를 각색해서 보여드릴게요.

안녕하세요. A에서 전달받은 데이터베이스 분석 결과를 공유드립니다.

1. 로그 데이터베이스

  • 개선 요청안: 테이블 하나에 데이터가 과도하게 집중되는 문제를 해결하기 위해 특정 단위로 테이블 분리 필요.
  • 적용안 건의: 일 단위로 테이블을 분리하고, 로그 데이터는 3개월 보관 후 2차 백업 및 삭제.

2. 게임 데이터베이스

  • 인덱스 개선 (Game_User 테이블):
    • 개선 요청안: 유니크 넌클러스터드 인덱스 변경 요청.
    • 적용안 건의: ID가 유니크하지 않아 넌클러스터드 인덱스로 변경. ID에 대한 레인지 검색 시에도 인덱스 SEEK 탐색이 가능함.
  • ...

어떤가요? 인덱스, 테이블 분리, 클러스터드... 외계어처럼 들리시나요? 현업에서는 개발자 간에, 혹은 DBA(데이터베이스 관리자)와 이런 내용으로 끊임없이 소통해야 합니다. 기본적인 지식이 없다면 협업은 불가능에 가깝습니다. 그만큼 데이터베이스는 개발자에게 선택이 아닌 필수 상식입니다.

SQL 여정의 첫걸음: 준비물 체크와 기본기

자, 이제 본격적으로 데이터베이스의 언어, SQL을 배워봅시다!

준비물 체크 ✔️

학습을 위해 여러분의 컴퓨터에 아래 2가지가 준비되었다고 가정하겠습니다.

  1. 로컬 MySQL 설치
  2. 데이터베이스 클라이언트 (쿼리 실행 도구)
    • Mac: DBeaver, DataGrip, TablePlus(유료) 등
    • Windows: HeidiSQL, DBeaver 등

 잠깐! 관계형 데이터베이스의 종류 MySQL 외에도 세상에는 다양한 관계형 데이터베이스가 있어요. Oracle, PostgreSQL, MS-SQL 등이 각자의 장점을 가지고 널리 쓰이고 있답니다. 우리는 그중 가장 대중적이고 배우기 쉬운 MySQL을 기준으로 학습할 거예요!

쿼리(Query)란 무엇일까?

데이터베이스에 데이터를 넣고(INSERT), 조회하고(SELECT), 수정하고(UPDATE), 삭제하는(DELETE) 모든 명령을 쿼리라고 부릅니다. 쿼리는 목적에 따라 크게 5가지로 나뉩니다.

  • DDL (Data Definition Language): 데이터 구조를 정의. (CREATE, ALTER, DROP...)
  • DQL (Data Query Language): 데이터를 조회. (SELECT)
  • DML (Data Manipulation Language): 데이터를 조작(삽입, 수정, 삭제). (INSERT, UPDATE, DELETE)
  • DCL (Data Control Language): 데이터 접근 권한을 제어. (GRANT, REVOKE...)
  • TCL (Transaction Control Language): 트랜잭션을 제어. (COMMIT, ROLLBACK...)

이 중에서 백엔드 개발자라면 DQL(SELECT)과 DML은 반드시 능숙하게 다룰 줄 알아야 합니다. 오늘은 그중에서도 가장 중요한 DQL(SELECT)을 집중적으로 파헤쳐 보겠습니다.


DQL(SELECT) 핵심 문법 파헤치기

아래와 같은 가상의 축구 선수 테이블로 SELECT 쿼리를 배워보겠습니다.

soccer_players 테이블

IDNameAgeSkill
1 메시 35 팬텀드리블
2 홀란드 22 오프더볼
3 음바페 24 순간속도
Sheets로 내보내기

soccer_player_nations 테이블

IDNation
1 아르헨티나
2 노르웨이
3 프랑스
Sheets로 내보내기

1. 칼럼 선택하기 (SELECT)

SELECT 뒤에 원하는 칼럼 이름을, FROM 뒤에 테이블 이름을 적어주면 됩니다.

SQL
 
-- 이름과 나이 칼럼만 가져오기
SELECT Name, Age FROM soccer_players;

모든 칼럼을 가져오고 싶다면 *(와일드카드)를 사용할 수 있습니다.

SQL
 
SELECT * FROM soccer_players;

⚠️ 현업 주의보: SELECT * 사용은 지양하세요! *는 편리하지만, 실제 서비스 코드에서는 절대 사용하지 않는 것이 좋습니다.

  • 성능 문제: 불필요한 데이터까지 모두 가져와 네트워크 트래픽과 DB 부하를 증가시킵니다.
  • 유지보수 문제: 테이블 구조가 변경(칼럼 추가/삭제)될 때, 코드가 예기치 않은 오류를 뿜어낼 수 있습니다. 필요한 칼럼만 명시적으로 지정하는 습관을 들입시다!

2. 조건으로 필터링하기 (WHERE)

WHERE 절을 사용하면 원하는 데이터만 쏙쏙 골라낼 수 있습니다.

SQL
 
-- 나이가 31세 이상이거나 23세 미만인 선수의 이름만 조회하기
SELECT Name FROM soccer_players WHERE Age >= 31 OR Age < 23;

WHERE 절에서는 다양한 비교 연산자를 사용할 수 있습니다. (=, !=, >, <, BETWEEN, LIKE 등)

3. 테이블 합치기 (JOIN)

여러 테이블에 흩어져 있는 정보를 합쳐서 보고 싶을 때 JOIN을 사용합니다. 두 테이블의 공통된 키(Key)를 기준으로 데이터를 연결하는 연산이죠.

SQL
 
-- 선수 이름과 국적을 함께 조회하기
-- 두 테이블에 모두 ID가 1, 2, 3인 데이터가 있으므로 해당 데이터를 기준으로 합침
SELECT a.Name, b.Nation
FROM soccer_players a
INNER JOIN soccer_player_nations b ON a.ID = b.ID;

JOIN의 종류

  • INNER JOIN: 두 테이블에 모두 존재하는 데이터만 합칩니다. (가장 흔하게 사용)
  • LEFT JOIN: 왼쪽 테이블의 모든 데이터와, 오른쪽 테이블에서 일치하는 데이터를 가져옵니다.
  • RIGHT JOIN: 오른쪽 테이블의 모든 데이터와, 왼쪽 테이블에서 일치하는 데이터를 가져옵니다.
  • FULL OUTER JOIN: 두 테이블의 모든 데이터를 가져옵니다.

실력 점검! 연습 문제 풀어보기

이제 배운 내용을 활용해 직접 쿼리를 작성해볼 시간입니다! 아래 테이블들을 보고 문제의 답을 찾아보세요.

players 테이블

PlayerIDNameAgePositionTeamID
101 손흥민 30 FW 1
102 김민재 26 DF 2
103 이강인 22 MF 3
104 황희찬 27 FW 4
Sheets로 내보내기

teams 테이블

TeamIDTeamNameLeague
1 토트넘 홋스퍼 PL
2 바이에른 뮌헨 분데스리가
3 파리 생제르맹 리그 1
4 울버햄튼 PL
Sheets로 내보내기

문제 1) 모든 선수의 Name과 포지션(Position)을 조회하는 쿼리를 작성하세요.

문제 2) 나이가 25세 이상 30세 이하인 선수의 Name과 Age를 조회하는 쿼리를 작성하세요.

문제 3) INNER JOIN을 사용하여 각 선수의 Name과 그 선수가 속한 팀의 이름(TeamName)을 조회하는 쿼리를 작성하세요.

문제 4) 포지션이 공격수(FW)이면서, 소속 리그가 프리미어 리그(PL)인 선수의 이름을 조회하는 쿼리를 작성하세요. (JOIN과 WHERE를 함께 사용해야 합니다!)

정답 확인하기

정답 1)

SQL
 
SELECT Name, Position FROM players;

정답 2)

SQL
 
SELECT Name, Age FROM players WHERE Age BETWEEN 25 AND 30;
-- 또는
SELECT Name, Age FROM players WHERE Age >= 25 AND Age <= 30;

정답 3)

SQL
 
SELECT p.Name, t.TeamName
FROM players p
INNER JOIN teams t ON p.TeamID = t.TeamID;

정답 4)

SQL
 
SELECT p.Name
FROM players p
INNER JOIN teams t ON p.TeamID = t.TeamID
WHERE p.Position = 'FW' AND t.League = 'PL';

 

마무리하며

오늘은 데이터베이스가 왜 중요한지, 그리고 데이터를 조회하는 가장 기본적인 SELECT 쿼리 문법에 대해 알아봤습니다. 처음에는 조금 어색할 수 있지만, 오늘 배운 내용만 잘 익혀도 데이터를 훨씬 자유자재로 다룰 수 있게 될 거예요.

다음 시간에는 데이터를 정렬하는 ORDER BY, 그룹화하는 GROUP BY 등 더 강력한 SELECT 기능들을 배워보겠습니다. 꾸준히 따라오시면 어느새 당신도 DB 고수! 💪

 

'Daily Logs > TIL (Today I Learned)' 카테고리의 다른 글

DB part.3  (0) 2025.06.09
DB part.2  (0) 2025.06.08
JWT (Json Web Token)  (1) 2025.05.22
Package Manager (npm,yarn,pnpm)  (0) 2025.01.15
Nestjs DI(container) 의존성 주입에 대하여  (0) 2024.12.11
'Daily Logs/TIL (Today I Learned)' 카테고리의 다른 글
  • DB part.3
  • DB part.2
  • JWT (Json Web Token)
  • Package Manager (npm,yarn,pnpm)
Jcob.moon
Jcob.moon
반가워요~ 하루하루 꾸준히 코딩 작성하는 곳입니다 !!
  • Jcob.moon
    Pixelated Thoughts
    Jcob.moon
  • 전체
    오늘
    어제
    • HelloWorld (177) N
      • Daily Logs (125)
        • TIL (Today I Learned) (64)
        • Algorithm Practice (55)
        • Dev Book Notes (6)
      • Deep Dives (36)
        • 문제 해결 (Troubleshooting) (3)
        • CS Fundamentals (22)
        • Career Prep (4)
        • Technical Notes (7)
      • Project Log (7)
      • Any (3)
      • Cooperation (5) N
        • Github (2)
        • Conventions (1)
        • Git (1)
        • Postman (1) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
Jcob.moon
DB part.1
상단으로

티스토리툴바