티스토리 뷰

728x90

무쓸모톤을 마무리하면서 운영진들께서 아주 깜짝 선물을 준비하셨다..^^

바로 백엔드와 프론트엔드를 나눠 스터디를 구성한 뒤 서로 자발적인 공부를 하는 방식이었다.

이런 식으로 매주 질문이 나온다.

728x90

공부할 내용은 이렇게 정해져 있다. 발표할 수요일이 되면 나는 질문 4개를 잘 대답할 정도의 실력을 갖추고 그 내용을 블로그에 적어서 공유하면 된다.

기간은 아쉽게도 8월 한 달 동안 진행될 예정이었고 매주 수요일에 서로 공부한 내용을 공유하는 방식이었다. 나는 이러한 방식이 다른 사람들 앞에서 발표하는 것이 아직도 떨리는 나로써는 아주 좋은 기회가 될 것 같아서 설렜다.

 

첫 번째 주제

첫 번째 주제는 "Database의 종류 및 특징 + 쿼리문 이해" 이다. 제목을 보고 작년 2학년 2학기에 데이터베이스 라는 과목을 배운 시절이 생각난다. 우리과 교수님이 연구년이어서 새로 오신 교수님이 계셨는데 정말 우리에게 많은 것을 잘 알려주시려고 하셨고 우리 눈높이에 맞춰 잘 설명해주시던 아주 열정 높은 교수님이 생각났다. 그러면서 중간 고사를 아주 거하게 먹고난 뒤 친구들과 부대찌개를 먹고 가위바위보로 아이스크림 내기를 하며 친구 자취방에서 한 숨 자면ㅅ...

 

추억 회상은 여기까지 하고 작년 데이터베이스 과목을 생각해보았다. mySQL과 수 많은 쿼리문.. 정작 어떤 식으로 써야할지는 감도 안왔던 과목이었다. 이번 기회를 통해 다시 한번 되짚어보면서 실제로 내가 배웠던 Django에서는 어떤 방식으로 적용되고 있는지, 어떻게 사용해야하는지 등 여러 방면으로 생각해보기로 했다.

 

질문 1 : Database가 필요한 이유가 무엇일까요?

우선 Database가 무엇인지 알아봐야한다.

Database(데이터베이스)란 모인 정보(데이터)들이 논리적으로 연결되어있으며 그 내용을 구조화함으로써 검색과 갱신의 효율을 높인 자료의 집합체라고 설명할 수 있다. 하지만 데이터베이스만으로는 아무것도 하지 못한다. 데이터베이스를 가지고 검색, 추가, 삭제, 갱신 등 여러 행동을 하기 위해서는 데이터베이스 관리 시스템(DBMS)가 필요하다.

 

그러면 이제 DBMS를 통해서 데이터베이스를 조작한다는 것을 알았다. 그럼 이제 질문으로 돌아가서 왜 데이터베이스가 필요한 것일까?

 

자, 현재 데이터베이스는 어디서 활용되고 있을까?

가장 먼저 생각나는 것은 군대이다... 예시로 이번 달 진급자를 찾아야한다. 그러면 하나하나 불러서 물어보자.

 

"너 이번에 상병으로 진급하냐? 안한다고? 상병된지 3개월이 넘었다고? 근데 왜 짜증내냐? ....내 아래로 다 집합시켜"

 

이런 불상사가 일어난다. 사실 군대를 갔다온 사람이든 아니든 그냥 검색하면 나온다는 것을 알고 있다. 여기서 중요한 것은 많은 데이터(우리 중대원 300명)에서 검색을 통해 내가 원하는 조건을 만족시키는 데이터(진급 예정자)를 찾아내는 것이다.

 

또 다른 예시를 보자.

요즘 백신 예약을 해야 백신을 맞을 수 있다. 하지만 그 경쟁률은 수강신청 못지 않다. 내가 만약 백신 예약에 성공을 했다면 접종 당일에 병원은 어떤 방식으로 접종 대상자를 확인할까?

먼저 보건당국에서 수많은 국민 중 접종 예약을 성공한 사람을 1차로 추출하고 그 다음 지역과 병원에 맞게 2차로 데이터를 추출하여 접종 대상자 명단을 보낼 것이다. 그럼 병원에서는 8월 9일 예약한 사람을 찾아서 나열하면 8월 9일에 접종 예정인 사람들을 확인할 수 있다.

 

그럼 다시 생각해보자. 데이터베이스가 왜 필요할까?

앞서 나온 예시 2가지 처럼 우리는 살면서 수많은 데이터들과 밀접하게 살아왔다. 이런 데이터 중에서 나에게 필요한 데이터만 검색하거나 내가 만든 데이터를 추가하면서 살고 있다. 하지만 내가 추가하거나 검색한 데이터가 나만의 데이터라면 어떤 문제가 발생할까?

이번 달 진급자를 찾기 위해서 뒤진 파일이 사실 중대에서 관리하는 파일이 아닌 나만 가지고 있어서 최신화가 되지 않은 파일이라면? 병원에서 가지고 있는 파일이 사실 올해 초 갱신되고 이후로는 건들지 않았던 파일이라면?

 

만약 일반 매장에서 데이터베이스를 쓴다면 이런 식으로 쓸 것 이다.

 

그러면 우리가 원하는 데이터를 찾을 수 없다. 따라서 우리는 데이터베이스를 통해 같은 데이터베이스를 공유하여 내가 필요한 데이터를 보고 상대방이 새로 추가한 데이터를 편집하면서 쓸모없는 데이터를 삭제하여 누구에게나 같은 데이터들을 사용 할 수 있게 하는 것이 바로 데이터베이스의 목적이다.

 

질문2 : RDB와 NoSQL의 개념과 특징을 설명해주세요.

우선 RDB와 NoSQL이 뭔지 알아보자.

우리가 앞서 배운 데이터베이스는 크게 두 가지로 나뉜다. 관계형 데이터베이스관계형 데이터베이스만이 아닌 것으로 나뉜다. 말이 좀 복잡하긴 한데 뒤 내용을 읽게 된다면 제대로 이해할 수 있을 것이다.

 

RDB란?

관계형 데이터 베이스는 RDBMS로 Relational DataBase Management System, 즉 말 그대로 관계를 가지고 있는 데이터 베이스 관리 시스템이다. 관계형 데이터 베이스는 데이터를 묶는 집합체(테이블)이 여러 개인 대신에 그 집합체끼리 관계를 잘 설명하여 우리가 원하는 정보가 있을 때 연계된 데이터까지 같이 가져올 수 있다. 

 

예시를 들어서 아까 예시 중 하나인 군대로 가보자. 진급자를 찾아야하는데 진급 평가에서 좋은 점수를 받아 조기 진급을 하는 사람이 있다. 이런 경우에는 두 가지를 한꺼번에 봐야한다.

 

1. 진급 한달 전인 사람

2. 모든 진급 평가에서 특급을 받은 사람

 

이렇게 두 가지를 봐야하는데 진급 한 달 전이면서 특급이 아닌 사람도 있고 특급이지만 진급이 한참 먼 사람도 있다. 이 두 조건을 합쳤을 때 겹치는 사람이 있는데 이럴 때 우리가 사용하는 집합체(테이블) 간의 관계를 나타내기 위해 외래키(Foreign Key)를 사용한다.

1, 2번은 어디서 뽑은 데이터일까? 바로 국방부에 있는 중대원 신상을 가져와서 만든 데이터이다. 우리는 1, 2번 데이터에서 존재하는 사람이 국방부 중대원 신상에도 존재한다는 것을 알려줘야하기 때문에 국방부에서 사용하는 군번(Primary Key, 기본키) 를 가져와 1, 2번 데이터에도 넣는다. 그러면 다른 사람이 봐도 국방부에서 가져온 군번이 외래키로 존재하기 때문에 1, 2번 데이터는 국방부와 관련이 있다는 것을 알게된다. 이것이 바로 RDB이다.

 

NoSQL란?

관계형 데이터베이스만이 아닌것 (Not only SQL) 으로 말하며 관계형 테이블(데이터의 집합체)으로만 이뤄지지 않은 것을 의미합니다. 쉽게 말하면 NoSQL은 관계형 데이터베이스 이외의 형식으로 데이터를 저장하는 데이터베이스라는 뜻이다.

 

NoSQL은 크게 3가지로 나뉜다.1) 문서 데이터베이스2) 키-값 데이터베이스3) 그래프 데이터베이스세 가지 데이터 베이스의 특징은 무엇일까? 바로 서로 관계만으로 이뤄지지 않았다는 것이다. 관계형 데이터베이스는 하나의 관계만 끊어져도 테이블이 검색이 되지 않는다던가 내가 데이터를 추가했을 때 입력이 되지 않는 오류가 생기는 등 여러 오류가 발생할 가능성이 있다. 하지만 NoSQL는 그렇지 않다.

 

형식(column and row)을 지키지 않으면 입력조차 안되는 관계형 데이터 베이스와는 달리 NoSQL는 어떠한 데이터든 저장할 수 있다. 게다가 RDBMS보다 더 많은 양의 데이터를 더 많은 데이터베이스에서 더 빨리 찾아낼 수 있다. 근데 왜 다들 NoSQL만 안쓰고 SQL도 쓰는 것일까?그것은 바로 대부분의 상황은 SQL로 대응가능한 상황이기 때문이다. 특별한 경우에서만 주로 NoSQL를 사용하고 우리가 흔히 만들었던, 나로 예를 들면 무쓸모톤의 찐품명품의 상품 DB처럼 간단한 데이터들로만 구성되기 때문에 대부분 SQL을 사용한다. 하지만 언제 어디서 사용하게 될지도 모르니 NoSQL도 알아둬야한다.

 

질문3 : 4개의 DB 쿼리문에 대해 설명해주세요 (select, insert, update, delete)

우리가 앞서 알아봤던 데이터베이스에서 정보를 검색하려면 어떻게 해야할까? Ctrl + F ?앞서 말했다시피 RDB는 형식에 굉장히 민감하다. 그래서 우리는 데이터를 사용할 때도 일정한 문법에 맞춰 사용해야한다. 이번 질문에 대한 답변은 그 문법을 알아보는 시간이 될 것이다.

 

1) SELECT

우리가 가장 많이 쓸 쿼리문이자 매우 기초적인 쿼리문이다. SELECT는 말 그대로 데이터를 선택(추출)하는 것이다. 내가 원하는 데이터를 선택하여 가져오는 것으로 찾는 기능으로 봐도 될 것이다.쿼리문을 배우기 전 가장 중요한 점은 앞서 말했듯이 쿼리문을 쓸 때는 문법에 항상 주의하여야한다. 쿼리문을 쓸 때 난 수많은 오류가 났었는데 그 오류 중 거의 80퍼센트는 이상한 곳에 들어있는 공백이나 대소문자 오타였다. 이 글을 보는 사람은 나와 같이 오류가 생기지 않도록 한컴 타자 연습을 많이하자.

 

SELECT 쿼리문 사용 예시

SELECT는 처음부터 원하는 값 딱 1개를 바로 지정해서 가져올 수 없다. 먼저 내 검색 조건에 일치하는 열을 찾아야한다.

> SELECT (검색할 열) from (테이블 이름)
예시) 멋쟁이 사자처럼 정보에서 전화번호만 찾고 싶을 떄
	SELECT phoneNumber from LikeLion;

이런 식으로 SELECT와 from을 이용해서 원하는 열을 찾을 수 있다. 만약 모든 열을 찾고 싶다면 검색할 열에 '*'을 넣으면 된다.

이렇게 열을 찾으면 여러 개의 행이 나온다. 그 행 중 만약 내가 원하는 조건의 값을 찾고 싶다면 where를 추가해주면 된다.

> SELECT (검색할 열) from (테이블 이름) where (조건)
예시) 멋쟁이 사자처럼 정보에서 이름이 김멋사인 사람의 전화번호만 찾고 싶을 떄
	SELECT phoneNumber from LikeLion where name='김멋사';

검색 조건으로 AND, OR, NOT 이 있는데 사용할 때는 where과 똑같이 사용하면 된다.

 

2) INSERT

insert는 삽입 쿼리문이다. 내가 새로 추가하고 싶은 정보를 넣고 싶을 때 사용한다.

 

INSERT 쿼리문 사용 예시

 

> INSERT INTO (열 구조) values (넣을 값들)
예시) 멋쟁이 사자처럼 정보에 이름이 김멋사인 사람의 전화번호와 나이를 넣고 싶을 때
	INSERT INTO LikeLion values ('김멋사', '010-1234-5678', '24');

3) UPDATE

update는 갱신 시 사용하는 쿼리문이다. 내가 기존에 존재하는 데이터에 수정하고 싶은 정보가 있을 때 사용한다.

 

UPDATE 쿼리문 사용 예시

> UPDATE (테이블 이름) SET (열 이름) = (변경할 값) WHERE (조건);
예시) 멋쟁이 사자처럼 정보에 이름이 김멋사이면서 24살인 사람의 전화번호를 8765-4321로 바꾸고 싶을 때
	UPDATE LikeLion SET phoneNumber = '010-8765-4321' WHERE name = '김멋사' AND age = '24';

 

4) DELETE

delete는 삭제 시 사용하는 쿼리문이다. 내가 기존에 존재하는 데이터를 삭제하고 싶을 때 사용한다.

 

UPDATE 쿼리문 사용 예시

> DELETE FROM (테이블 이름) WHERE (조건);
예시) 멋쟁이 사자처럼 정보에 이름이 김멋사인 사람의 정보를 없앨 때
	DELETE FROM LikeLion WHERE name='김멋사';

 

 

질문4 : ORM이 무엇인지 설명해주세요

ORM이란 무엇일까?

일단 말로 먼저 풀어서 설명하자면 ORM은 Object Relational Mapping 즉, 객체-관계 매핑의 줄임말이다.

우리는 자바나 파이썬에서 클래스를 사용해서 객체 지향 프로그래밍을 하고 데이터베이스에서는 관계를 이용해 RDB를 조작하기도 한다. 근데 이 둘을 어떻게 묶어서 사용해야 ORM을 사용할 수 있을까?

 

사실 ORM은 멋쟁이 사자처럼에서 Django를 배울 때 이미 배웠었다.

 

여기 예시로 우리가 만든 모델이 있다.

class Item(models.Model):
    item_name = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField()
    author = models.ForeignKey('account.User', on_delete= models.CASCADE)

여기 안에는 수많은 값이 들어있는데 여기서 Item 이름에 '책' 이라는 단어가 들어간 Item들을 모으고 싶다면 어떻게 코딩을 했을까?

 

wanted_item = Item.objects.get(item_name = '책')

이렇게 되면 여러 Item들이 나온다. 우리가 아까 배운 SELECT 문과 굉장히 흡사하다.

 

생각을 바꿔보면 장고에서 데이터를 묶어서 보관하기 위해 사용하던 모델은 관계형 데이터베이스로 설명할 수 있고 앞서 설명한 RDB의 특징 중 하나인 외래키(Foreign Key)를 모델 속에서 볼 수 있다.

 

그럼 우리가 아래 썼던 코드는 무엇일까?

 

> SELECT (검색할 열) from (테이블 이름) where (조건)
예시) Item 테이블에서 이름에 '책'이 들어가는 부분을 찾고 싶을 때
	SELECT item_name from Item Like '책';

다음과 같이 SQL 쿼리문으로 바꿀 수 있다.

 

방금 전 깨달은 것을 보면 모델이라고 하는 관계형 데이터베이스를 SQL 쿼리문을 사용하지 않고 파이썬 코드를 이용해 추출하는 과정을 진행했다.

 

이것을 가능하게 해주는 것이 바로 ORM이다.

 

요약하자면 객체 지향 프로그래밍의 모델(클래스)과 관계형 데이터베이스의 모델(테이블)을 같이 사용해야하는데 이 때 서로 데이터 불일치가 발생한다. 하지만 ORM이 객체 지향 프로그래밍과 관계형 데이터베이스의 데이터들을 매핑(연결하고 변환)하여 객체를 통해 간접적으로 관계형 데이터베이스를 다룰 수 있도록 해준다.

 

 

 

 

1주차를 마치며..

이렇게 ORM을 마지막으로 4개의 질문에 대한 답변을 성공했다. 오랜만에 데이터베이스를 다시 살펴보니 학교에서 머릴 싸매면서 쿼리문들을 외웠던 기억이 난다. 하지만 지금은 그렇게 성적에 얽매이지도 않고 마음도 급하지 않게 천천히 구글링을 하면서 나만의 말로 정리를 하니 진짜 공부를 하는 것 같았다.

이제 3주가 남았는데 남은 과정들도 궁금해진다. 과연 내가 달달 외우면서 공부했던 것들이 지금 나에게 도움이 될까? 정말 기대가 되는 날들이다.

728x90
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크