지난 교육의 내용을 아래의 이미지 한장으로 표현할 수 있겠습니다. 저작권 때문에 직접 그린 것입니다.
이전 교육과정에서 MySQL DB를 설치하였습니다. 다시 말씀드리지만 SI 개발자에게 DB 활용능력은 절대적으로 필요합니다. 제가 SI 에 대한 설명을 드리지 않았습니다. 네이버에 "SI 개발" 로 검색해보면 좀 비참한 현실을 그린 내용이 나옵니다. System integration 의 약자로 시스템 통합 개발을 의미하겠죠? 1990년대 말부터 각 단위 기능별로 만들어져 있는 시스템을 통합개발해서 업무효율을 높이기위해 개발 프로젝트를 정말 많이 했더랍니다. 그 시절에는 MSG 조금 뿌려서 이력서에 활용가능한 언어로 "J(ava)" 라고 J만 써도 바로 반강제로 취업되던 시절이었습니다. 수시로 PM, PL 들이 와서 친구들 없냐고, 연락되는 사람 대우 좋으니까 빨리 오라고, 혹시 다른 데 취업해 있더라도 이쪽으로 오게 할 수 없냐고 지겹도록 들었습니다. 그만큼 고생도 많았습니다. 주말이 뭐에요? 아~ 아침 10시까지 출근할 수 있는 날이요? 라고 쉬는 날이란게 거의 없었죠. 저는 그나마 대기업 하청업체에서 일했기 때문에 일요일에는 쉬었습니다. 퇴근은 오늘 안에 할 수가 없었습니다. 일찍 갈 수 있는 날에는 또 술마시러 끌려가야 했거든요. 고생도 많았지만 정말 재미있었습니다. 아쉬운 것은 그 때 제가 초짜여서 급여를 많이 못받았습니다. 그리고 빨때 꽂은 사람들이 많아서 좀 많이 뜯겼었죠. 그 바닦이 좀 그랬어요. 첨부터 좋은 회사에 갔으면 그럴 일 없었겠지만 뭐 능력이 안되서 어쩔 수 없는 노릇이었죠. 그런데 요즘은 이 SI 라는 의미가 그냥 개발자 중에서도 막노동 급 단계로 취부하는 경향이 있습니다. 어감은 좀 그렇지만 다른 시각으로 보면 개발방법이 그 만큼 표준화 되어 있어서 어느 수준의 개발능력을 가진 사람들이라면 어디 가서든 일을 맡아서 할 수 있다는 의미로도 해석되니 쉽게 말해 돈 벌 수 있는 채널이 무궁무진하다고 좋게 생각할 수도 있습니다.
SI 개발자로 취업활동을 하려면 어느 정도의 소양이 되어야 하는가가 궁금하실 수도 있을 겁니다. 과연 내가 어는 정도까지 알아야 개발업무에 투입될 수 있을까? 저는 그 시작을 DB 활용능력이라고 봅니다. DB 활용능력을 다시 말하면 얼마나 SQL 구현을 자유자재로 할 수 있냐, DB 구조를 보고 데이터가 어떻게 관리되고 활용하려면 어떤식으로 사용해야 겠구나라고 인지할 수 있으면 이미 상당한 수준이 되신 겁니다. 그런데 이게 막상 어렵거나 그런게 아닙니다. 지금 부터 그 과정을 무리가 가지 않는 수준에서 설명을 드리겠습니다.
SQL은 DB 에 데이터를 조회하거나 저장 혹은 구조를 변경하는 언어입니다. SQL도 코딩의 일부인 것입니다. 일반 적인 SQL은 DB 별도 크게 다르지 않습니다. 그래서 SQL을 익혀두시면 처음 다뤄보는 DB 데이터도 쉽게 추출해 보실 수 있습니다. 물론 함수나 사용법이 DB마다 차이가 없는 것은 아닙니다. 하지만 그런 것을은 구글링해서 언제든지 바로 찾아볼 수 있기 때문에 걱정하실 필요 없습니다. SQL은 Structured Query Language 입니다. Standard가 아닌 Structured 입니다. 구조화 혹은 체계화된 질의 언어라는 뜻입니다. 그래서 SQL을 배우기는 참 쉽습니다.
SQL로 할 수 있는 일은 데이터 조회, 입력, 삭제, 수정을 할 수 있습니다. 이런 작업을 수행하는 SQL을 DML 이라고 합니다. 데이터를 넣을 테이블 구조를 만들거나 변경, 삭제도 할 수 있습니다. 이것을 DDL 이라고 합니다. 그 밖에도 사용자 계정을 만들거나 권한을 주거나 파티션을 만들거나 여러가지를 할 수 있는데 이 영역은 SI 개발자의 영역이 아닙니다. 이 부분은 DB adminiatrator 가 하는 역활이니 천천히 배우셔도 됩니다. 이번에는 SQL DML 중 데이터 조회하는 과정에 대해 설명을 드리도록 하겠습니다.
MySQL 서비스를 실행합니다. Window Service 관리화면을 실행합니다.
MySQL80 을 선택하고 시작을 누릅니다.
MySQL Workbench 를 실행합니다. 저는 Windows 8을 사용하고 있기 때문에 아래와 같이 검색해서 찾아 실행합니다.
아래 Local instance MySQL80 을 클릭합니다.
암호를 입력하고 SQL 창에서 실습을 하면서 설명을 하겠습니다. 그러기에 앞서 주석에 대해 설명을 드립니다.
주석은 쉽게 말해 Coding 내용을 이해하기 쉽도록 설명을 적는 곳이라고 생각하면 됩니다. SQL도 Coding 의 한 종류이다 보니 주석을 생각보다 많이 적게됩니다. 주석은 아래와 같이 /* ... */ 로 시작과 끝을 감싸서 구간 전체를 주석처리할 수도 있고 -- 뒤로 한 줄 전체가 주석되는 방법도 있습니다.
MySQL은 DB를 선택하는 과정이 있습니다. 목록을 보기위해서는 show 명령어를 사용합니다.
show databases; <ctrl + enter>
명령어 끝에 세미콜론(;)이 있는데, 이게 명령의 끝이라는 것의 명시합니다. 커서가 위치한 부분의 SQL을 (;) 있는 부분까지 실행됩니다. 명령어는 특수한 경우를 제외하고는 대부분 대소문자를 가리지 않습니다. 대소문자를 가려야 하는 경우는 교육과정을 따라오다보면 자연스럽게 알 수 있을 거라고 봅니다.
DB 사용은 use 명령어로 전환이 가능합니다. 그리고 DB 안에 포함된 테이블 목록을 볼 때도 show 명령어를 사용합니다. 실제 데이터는 테이블안에 일종의 엑셀의 표와 같은 형태로 존재합니다. 이해가 쉽도록 설명하자면 DB는 폴더고 테이블은 그 안에 든 엑셀 파일입니다. 엑셀파일 안에는 데이타가 있는 거죠.
world 연습 DB는 구조가 간단해서 설명하거나 이해하기가 쉬울 겁니다. sakila DB는 처음 DB를 접하시는 분은 좀 복잡하게 보일 것 같습니다. world 에 대해 과정을 마친 후, sakila 과정을 준비해보겠습니다.
world DB 안에는 city, country, countrylanguage 3개의 테이블이 존재 합니다. 그리고 이 테이블들은 아래의 구조로 되어 있습니다. 여기서 city 테이블은 어떤 컬럼이 있는 지 구조를 확인 해볼 수 있습니다. 컬럼 목록을 볼 때도 show 목록을 사용할 수 있습니다.
show columns from city; <ctrl + enter>
city 테이블은 엑셀로 친다면 아래과 같은 컬럼으로 데이터를 관리합니다. Field 가 컬럼명, Type은 데이터 유형, Null 은 Null 값허용 여부를 의미합니다. Key는 키값인데 PRI 로 표신된 컬럼이 Primary key를 의미하며 중복을 허용하지 않으며 Null 값 또한 허용하지 않습니다. 전 체 데이터 중에서 한 행을 구별할 수 있는 기준이 됩니다. Default는 기본값을 의미합니다. 데이터를 입력할 때 컬럼에 어떠한 값도 입력하지 않으면 자동으로 Default 에 지정한 값으로 입력됩니다. Extra 에 auto_incremnet 는 자동 증감을 의미하는데 이런 경우 데이터를 신규로 입력하면 ID컬럼의 숫자값이 자동 입력됩니다. 일단 구조만 이해하시고 자세한 언급한 내용은 앞으로도 계속 보게 될테니 이해가 안가더라도 넘어가시길 바랍니다.
여기 까지해서 DB - 테이블 - 컬럼 순으로 연결된다는 것을 이해하셨을 겁니다. 그럼 나머지 country, countrylanguage 도 어떤 컬럼이 전체 테이블들이 어떻게 연결되는지 보겠습니다.
중심은 country 이고 countrylanguage와 city는 각각 CountryCode 로 연결이 됩니다. 영어로 되어 있지만 대충 국가와 도시, 그리고 사용하는 언어 등으로 짐작해 볼 수 있겠습니다. country 테이블 데이터를 조회 해보겠습니다. 이제 부터 본격 적으로 SQL이 시작됩니다. 이전에 사용했던 show 명령어나 use 명령어는 MySQL 만의 언어이니 다른 DB에서 사용하지 않습니다만, 데이터를 조회하는 SQL은 다른 DB에서도 다 통합니다.
데이터를 조회하는 SQL은 SELECT 로 시작합니다. 사용 문법은 select {조회할 컬럼명} from {테이블명} [where 조건] 입니다. 여기서 컬럼을 모를 때는 * 로 전체 컬럼을 조회해 볼 수 있습니다. 당연히 select id, name, country 등 출력할 컬럼을 명시해서 사용하 수도 있습니다. 대충 보니 도시명과 구역, 국가코드, 인구수 등이 관리되나 보군요.
데이터 조회에 조건을 넣어 보겠습니다. 인구수가 1천만명 이상인 도시가 있는지 조회해봅니다.
몸바이가 있군요. 호텔 뭄바이의 그 뭄바이겠죠. 혹시 서울도 데이터가 존재하는지 확인 해볼까요? 문자열 값은 '문자' 형태로 따옴표로 감싸서 사용합니다. 서울은 1천만이 조금 안되네요. 데이터가 맞는지 여부는 일단 넘어 가겠습니다.
이와같이 데이터를 조회하는 조건에서는 등식 혹은 부등식을 통해서 조건을 줄 수 있다는 것을 확인 했습니다. 그런데 문자열 같은 경우 한가지 더 짚고 넘아거야 할 것이 있습니다. 문자열 값을 찾을 때 대소문자를 가립니다. 그런데 이 Workbench 툴은 대문자로 조건을 줬는데도 검색이 되는 군요. 이것은 일반 프로그래밍 코딩에서 통하지 않을 것입니다. 사실 문자열은 대소문자가 섞여 있을 가능성이 있을 때는 별도의 조치를 취해 조회를 하는 방법이 있습니다.
대소문자가 섞여 있는 컬럼은 upper(컬럼)으로 모두 대문자로 바꿔서 비교하는 방법이 일반적입니다. upper는 소문자를 모두 대문자로 바꿔주는 함수입니다. 문자열 컬럼에서만 사용해야 합니다. 숫자 컬럼에서 사용하면 안되고 사용할 필요도 없겠지요.
단, 위와 같이 사용할 때 주의해야 할 점이 있습니다 조건에 컬럼에 함수를 쓰면 성능이 느려집니다. 교육을 하는 과정에서는 와닿을지 모르겠지만 실전에서는 이런 부분 때문에 어려움이 많습니다. 그래서 성능까지 고려한 SQL 을 써야 합니다. 이번에는 조건을 2개 줘보겠습니다. 조건을 처음 줄 때는 where 를 쓰지만 2번 째 부터는 and 나 or 같은 관계연산자를 사용합니다. And 는 전 / 후 조건이 모두 만족하는 대상이고 or 는 둘 중 하나만 만족해도 됩니다. 경험으로 or는 사용할 때 주의를 해야 합니다. 조회 조건에 데이터 누출현상이 발생하는 원인이 될 때가 많습니다. 실제 코딩에서는 조건이 많이 들어가는 편입니다. 그렇다보니 or가 들어가면 착각을 하기 쉽습니다.
데이터 조회에 대해서는 한번 쭉 훑어 봤습니다. 이제 테이블 간 연결을 통해 데이터를 출력하는 과정을 한번 더 살펴보겠습니다. city 테이블과 country 테이블을 연결해 보겠습니다. 연결하는 방법은 2가지가 존재합니다.
첫번째 where 조건을 통한 join 방법으로 아래와 같이 볼 수 있습니다.
두번째로 ANSI 방법으로 join 하는 방법이 있습니다. 개인적으로 이 방법을 선호하는데 희한하게 국내 개발자들 중에는 이런 문법을 모르시는 분들이 많이 봤습니다. join 될 대상 테이블에 대해 join 방식과 조건을 명시적으로 표현하는데, 이렇게 하면 SQL 이 복잡해도 분석하기 좋고 어떤 테이블이 사용되는지 분석하기가 쉽습니다. 나중에 다시 교육하겠지만 두 테이블 간에 한 쪽에 데이터가 없는 경우를 대비해서 left outer join 이나 right outer join 할 때도 편하고 무엇보다도 ANSI SQL은 어떤 DB에서건 통한다는 겁니다. 개발하는 시스템의 DB가 오라클에서 DB2로 변경할 때 ANSI 형태로 SQL을 개발했다면 수정할 내용이 적어집니다. 참고로 ANSI 는 미국표준입니다.
이번 교육은 테이블 join 에 대해 맛만 보고 마무리를 하겠습니다. 다음 교육 때 join 을 응용한 좀더 어려운 예제를 보면서 SQL 심화 과정을 진행하겠습니다. 수고하셨습니다. 학습일 끝내실 때 MySQL 서비스를 종료하세요.
'MySQL' 카테고리의 다른 글
#6 프로그래밍 개발자 교육 - SQL : 함수(function) 사용법 - 숫자 (0) | 2020.05.14 |
---|---|
#5 프로그래밍 개발자 교육 - SQL : 함수(function) 사용법 - 문자열 (0) | 2020.05.12 |
#4 프로그래밍 개발자 교육 - SQL : 데이터 유형 (0) | 2020.05.12 |
#3 프로그래밍 개발자 교육 - SQL : 테이블 join의 유형 (0) | 2020.05.11 |
#1 프로그래밍 개발자 교육 - 시작하기, DB설치 (1) | 2020.05.08 |