Android, Cocos2d, Java Web, Linux, reading...

Django에서 'port already in use' 에러가 뜰 때


저번 포스팅에서 python manage.py runserver을 할 때 아무런 탈 없이 잘 실행됐지만 저 상태에서(즉, hello 프로젝트가 있는 상태에서) 다른 프로젝트를 만들어 실행해보니 저렇게 ‘port already in use’ 라는 에러가 발생했다.

참고 : 환경은 Ubuntu 16.04 이다.

아마 hello 프로젝트에서 이미 해당 포트를 사용하고 있어서 그런 것 같다. 이럴 때마다 포트를 바꿔서 서버를 실행해줄 수도 있지만 더 간단하게 기존 서버를 죽이는 방법을 알아보자. 정말 간단하다.
터미널 창에 ps aux | grep -i manage 라고 입력하면

이렇게 프로세스들을 볼 수 있다. 우리는 python manage.py runserver에서 에러가 났기 때문에 이 부분을 죽여야 한다. 2번째를 보면 62942라고 써져있는데 이는 process_id 즉, pid이다. 다음과 같이 kill 명령어를 써주면 된다.

kill -9 62942

-9 옵션은 강제 종료를 뜻한다. 그러고 나서 다시 python manage.py runserver를 입력했는데 또 ‘port already in use’ 에러가 떴다. pid = 62942인 프로세스가 안 죽었나 ps aux | grep -i manage 로 다시 확인해봤는데

62942가 없다. 그런데, 보면 /usr/bin/python manage.py runserver가 있었다. 이거도 영향을 미치나 해서 똑같은 방법으로 죽였다.

kill -9 62946

그러고 나서 python manage.py runserver를 해봤더니

잘 동작한다.

阅读全文 »


Django로 hello world 띄우기[2]


이번 포스팅에서는 hello world를 직접 띄워볼 것이다. 장고 프로젝트는 여러 앱들로 구성이 되고(물론 1개의 앱으로도 구성 가능) 여기서 앱은 웹사이트를 기능별로 분리해놓은 단위라고 생각하면 된다.

해당 프로젝트로 가보면 pooh앱과 프로젝트의 이름과 동일한 이름(hello)의 디렉토리가 하나 더 있음을 확인할 수 있는데, 이 hello 디렉토리는 기본적인 설정을 담고 있다.

이전 포스팅의 구성도를 보면 pooh앱의 hello 함수를 호출한다고 했으므로 pooh앱에 hello 함수 기능을 ‘hello world’를 띄워주는 것으로 만들어주면 된다. pooh앱의 views.py를 열어보자.

열면 맨 위 두 줄은 원래 있던 부분이고 빨간색 부분들은 추가해 준 부분이다. 추가된 부분을 보면 페이지 요청을 받았을 때 Hello world를 띄워주는 기능을 하는 것이다. 하지만 아까 구성도에서도 봤듯이 views.hello가 실행되기 위해서는 먼저 pooh앱이 실행되는 조건을 맞춰줘야 한다. 그 조건을 맞춰주기 위해 아까 기본적인 설정을 담고 있다고 했던 hello디렉토리의 urls.py를 열어보자(즉, 최종 경로는 ~/hello/hello/urls.py).

urlpatterns는 서버로 요청이 들어오면누가 어떻게 처리할지 담당자를 지정하는 역할을 하고 urlpatterns의 [ ]의 url(a,b)에서 a는 주소, b는 a로 접속했을때 누가 처리해줄 것인지를 정해주는 역할을 한다. 즉, url(r’^admin/’, admin.site.urls)를 해석해보면 /admin/으로 접속했을 때 admin이라는 녀석이 처리하라는 뜻이다. 일단 만들어져 있는 것이니 한 번 어떻게 처리되는지 확인해보자. manage.py가 있는 곳으로 가서

python manage.py runserver

해당 서버로 들어가서 주소대로(127.0.0.1:8000/admin) 접속을 해보면

이렇게 장고 admin이 잘 실행됨을 알 수 있다. 즉, admin으로 지정해준 것처럼 특정 앱에서 처리하도록 지정해줄 수가 있다. 나중에 이런 식으로 admin에 대해서 그리고 다른 앱들에 대해서도 다뤄보자.
지금은 admin이나 다른 앱들 말고 그냥 주소(127.0.0.1:8000)만 입력했을 때 hello world가 나오도록 할 것이다.

아까와 같이 hello 디렉토리의 urls.py를 열어서(최종 경로는 ~/hello/hello/urls.py) urlpatterns에다가 추가해주면 된다. r’^’ 즉, 뒤에 뭐가 따로 없기 때문에 그냥 주소만 입력한 경우를 의미하고 pooh앱이 자신의 views.py에서 hello 함수를 호출하는 것이므로 pooh을 담당자로 지정해준 것이다. 하지만 url 함수로 인해 pooh.views가 아닌 pooh.urls라고 지정해준 것이다.
그리고 pooh앱이 같은 디렉토리(hello)에 없기 때문에 include를 사용하였다. 단, include를 사용하도록 하기 위해서 import에 include를 포함시켜야 줘야한다.

종합해보면 127.0.0.1:8000로 접속할 때 pooh앱을 실행하도록 한 것이다. 즉, pooh앱이 어떠한 경우에 실행이 되는지를 지정해 줬다는 말이다. pooh앱이 실행되는 경우를 지정해줬으니 이제 어느 경우에 hello함수가 실행되는지를 지정해줘야 한다. 왜냐하면 우리는 최종적으로 views.py에 있는 hello함수가 실행되도록 해야 하기 때문이다. 이 hello함수가 실행되도록 하기 위해서 pooh앱에서(~/hello/pooh) urls.py를 하나 더 만들어주자.
(pooh앱에서 urls.py를 만들어줘야 하는 이유는 아까 urlpatterns에서 url 지정해줄 때 include(pooh.urls), 즉, urls.py에서 처리하라고 지정해줬는데 pooh앱에는 urls.py가 없기 때문이다)

이렇게 만들어주면 된다. url쪽에 ^$가 있는데 이게 바로 빈 경로 즉, 주소만 입력한 경우를 나타낸 것이다. 그리고 아까는 hello와 pooh가 경로가 달랐기 때문에 include를 이용했지만 이번엔 urls.py와 views.py가 pooh앱 경로에 같이 있기 때문에 include를 따로 쓰지 않고 views.index와 같이 바로 파일명과 함수를 사용해주면 된다. 대신 views.index를 사용하기 위해서 from . import views를 적어줘야 한다. 이를 해석해보면 .은 현재 디렉토리(~/hello/pooh)를 의미하고 현재 디렉토리에서 views라는 모듈을 가져다 쓰겠다라는 뜻이 된다.

이제 모든 설정이 끝났다. 이제 manage.py가 있는 디렉토리에서 서버를 실행해주고 확인해주면 된다.

python manage.py runserver

해당 주소(127.0.0.1:8000)로 접속해보면

Hello world가 출력됨을 확인할 수 있다.

阅读全文 »


LVM 실습(1) - 파티션 설정


  • LVM 파티션 설정

저번 포스팅 때 배웠던 내용들을 직접 리눅스에서 실행해보도록 하자. 조금 길어질 거 같아 이번 포스팅에서는 파티션 설정해주는 것까지만 해볼 예정이다. 필자는 개인서버가 없어서 VM에서 진행을 했다. 기회가 돼서 실서버에서 했을 때도 크게 다르지 않아 참고하면 될 것 같다.

일단, 처음에는 그냥 귀찮아서 VM에 있는 칼리리눅스로 실습을 진행하였고 추후에 하는 것은 대부분 우분투일 것 같다. 먼저 fdisk -l 이라는 명령어를 통해 현재 디스크 상태를 확인할 수 있다.

40G짜리 하드디스크가 있음을 확인할 수 있다. 우리는 여러 디스크를 묶어 볼륨그룹으로 만든 후 논리 볼륨으로 다시 나눌 것이기 때문에 디스크가 여러 개 필요하다(물론 디스크 하나를 볼륨그룹으로 묶을 수도 있지만 필자는 여러 디스크를 하나의 그룹으로 묶을 때를 실습하고자했기 때문에 그런 것이다). 그러면 VM에서 (가상)디스크를 추가해보자.

먼저, User VM(여기서는 Kali linux)을 끈다. 끈 상태에서 ‘Edit virtual machine settings’을 누른다.

왼쪽의 하드디스크 그림을 클릭한 후 Add버튼을 누른다.

그림에 표시된 대로 눌러준다. 물론 용도가 다르다면 다른 옵션을 선택해도 되지만 잘 모르겠으면 그림처럼 하면 된다.

필자는 5G로 지정했지만 사이즈는 마음대로 지정할 수 있다.

다 하고 나면 이렇게 잘 추가됐음을 확인할 수 있다. 그림에서는 5G만 추가했으나 필자는 따로 7G도 추가를 했기 때문에 저렇게 5G, 7G가 보이는 것이다. 그러고 밑에 OK버튼을 눌러주면 끝이다. 이제 다시 User VM(여기서는 Kali linux)을 켜고 fdisk -l 을 입력해보자.

아까 40G만 있었던 것과 달리 5G, 7G가 추가됐음을 확인할 수 있다. 저번 포스팅 때 먼저 파티션을 지정해줘야 한다고 했다. 따라서 fdisk 명령어를 통해 LVM으로 만들어 줄 디스크의 파티션을 지정해주자.

fdisk [디스크 이름] 을 해주게 되면 명령어를 Command (m for help) : 가 뜬다. m을 누르면 help기 때문에 각 옵션들을 볼 수 있다.

각 옵션들에 대해서 간단하게 설명을 해보자면

​ a : 부팅파티션을 설정할 수 있다.

​ b : BSD로 디스크라벨을 설정한다.

​ c : DOS 호환가능한 플래그 설정한다.

​ d : 파티션을 삭제할 수 있다.

​ l : 설정 가능한 파티션 타입을 보여준다.

​ m : 파티션 설정 도움말을 보여준다.

​ n : 새로운 파티션을 생성(추가)한다.

​ o : 새로운 도스파티션 테이블을 생성한다.

​ p : 현재 설정된 파티션정보를 보여준다.

​ q : 설정된 정보를 저장하지 않고 fdisk를 빠져 나간다.

​ s : SUN 디스크라벨을 생성한다.

​ t : 파티션 타입을 변경한다.

​ u : 유닛(units)정보를 열람하거나 변경할 수 있다.

​ v : 지정된 파티션을 검사한다.

​ w : 현재까지 설정한 파티션정보를 저장하고 fdisk를 빠져나간다.

​ x : 파티션설정 전문가 모드로 이 전문가 모드에서는 실린더(cylinder)수나 헤드(head)수 그리고 트랙(track)당 섹터(sector)수를 변경할 수 있다.


참고 블로그 : http://faq.hostway.co.kr/Linux_ETC/8215



다시 돌아와서 우리는 새로 LVM이라는 것을 만들어 줄 것이기 때문에 n을 누른다. n을 누르면 파티션 타입을 p를 눌러 주파티션을 선택한다. 그 다음은 파티션 번호인데 이것도 1~4까지 가능하지만, 아직 아무것도 안돼있으므로 필자는 그냥 첫번째인 1번을 해줬고 그렇게 되면 이제 /dev/sdb1이 될 것이다. 각 sector들도 지정해줄 수가 있지만 필자는 모두 엔터를 눌러 default값을 넣었다. 다 해주면 맨 밑에 보이듯이 Linux 타입의 파티션1이 잘 만들어졌다고 나오고 그림에는 없지만 해보면 다시 Command (m for help) : 가 뜬다.

하지만 우리는 LVM을 만들어 줄 것이기 때문에 파티션 타입을 Linux -> Linux LVM으로 바꿔줘야 한다. 파티션 타입은 l을 통해 볼 수 있다.

여러 종류가 있지만 LVM을 만들어주기 위해서는 8e를 입력해줘야 한다고 나와 있다.

먼저 파티션 타입을 바꿔주는 t 명령어를 입력한 후 8e를 입력해준다. 밑의 p는 아까와는 다르게 현재 설정된 파티션 정보를 출력해주는 명령어이다. 밑에 보면 Linux LVM 타입의 /dev/sdb1이라는 이름으로 잘 설정되었다. 단지 정보만을 보여주는 것이기 때문에 안 해도 상관없다. 그 다음으로 현재까지 설정한 파티션 정보를 저장하기 위해 w를 입력해준다.

다시 fdisk -l 을 입력해보면 아까와 또 달리 각 디스크의 밑부분에 Linux LVM 타입의 /dev/sdb1, /dev/sdc1가 만들어졌음을 확인할 수 있다. 다음 포스팅에서는 이제 물리볼륨부터 파일시스템으로 만들어 마운트시키는 것까지 해보겠다.

阅读全文 »


LVM이란?


  • LVM이란?

LVM이란 Logical Volume Manager의 약자로 논리 볼륨 관리자라는 뜻이다. 우리가 사용하는 물리적인 (하드)디스크 여러 개를 논리적인 디스크으로 할당하여 유연하게 관리할 수 있게 해준다.

예를 들어, 처음 설치할 때 /home 파티션에 5GB를 할당했다. 그러고 나서 이 파티션을 늘려주려면 운영체제를 다시 새로 설치한 다음 파티션을 다시 할당해줘야 하는 반면 LVM을 이용하면 그런 과정을 거치지 않고 /home 파티션 크기를 늘려줄 수 있다. 반대로 필요없는 어떤 파티션이 있다면 이것을 줄여 어떤 필요한 다른 파티션에 사용할 수도 있다. 파티션 뿐만 아니라 하드 디스크를 추가해 해당 파티션의 용량을 늘릴 수도 있다. LVM은 이렇게 유연하게 파티션을 이용할 수 있어 매우 유용하다.

해당 설명에 대한 이해를 좀 더 돕기 위하여 다음 그림들을 보도록 하자.

해당 그림에서 보이듯이 500G 하드디스크가 있는데 1TB 하드디스크를 추가하고 싶다. LVM을 사용하지 않는다면 일단 500G 하드디스크를 1TB 하드디스크로 교체해줘야 한다. 그러기 위해서는 500G에 저장된 데이터를 먼저 백업하고 500G 하드디스크를 umount시킨 후 1TB 하드디스크를 다시 mount시키고 백업했던 데이터를 불러오는 등의 복잡한 과정을 거쳐야 한다. 그리고 총 늘어난 용량을 보면 500G -> 1TB 즉, 500G가 늘어난 것을 알 수 있다.

이번엔 LVM을 이용한 경우를 보자. 상황은 똑같이 1TB 하드디스크를 추가하고 싶다. LVM을 이용하면 500G 하드디스크를 umount 시킬 필요없이 바로 추가해서 사용할 수 있다. 물론 나름대로의 설치과정이 있지만 하드디스크를 umount시키고 다른 하드디스크를 다시 mount시키고 이럴 필요가 없다. 그리고 1TB가 그대로 추가된 것이기 때문에 늘어난 용량도 500G -> 1.5TB 즉, 1TB가 늘어난 것을 알 수 있다. LVM을 이용하지 않은 경우와 비교했을 때 LVM을 이용한 경우가 과정도 덜 복잡하고 추가된 용량도 더 많음을 확인할 수 있다.


이제 LVM의 전체적인 구조를 보도록 하자.


1. 파티션(Partition)

하나의 하드디스크에 대해 영역(구역)을 나누는 것을 말한다. fdisk 명령어로 파티션을 설정할 수 있다.

2. 물리 볼륨(PV, Physical Volume)

물리 볼륨은 각각의 파티션을 LVM으로 사용하기 위해 형식을 변환시킨 것으로 해당 파티션을 물리볼륨을 만들어주면 LVM은 디스크를 하나의 물리볼륨으로 간주하게 되어 볼륨그룹에 포함시킬 수 있게 된다.

3. 볼륨 그룹(VG, Volume Group)

각 물리 볼륨을 그룹으로 설정한다. 여러 개의 물리 볼륨을 하나의 그룹으로 만들 수도 있고 1개의 물리 볼륨을 하나의 그룹으로 만들수도 있으며 예를 들어, 5개의 물리 볼륨이 있다고 할 때 2개를 하나의 그룹, 3개를 또 하나의 다른 그룹 등 이런 식으로 유동적으로 만들 수 있다. 밑의 그림도 참고하길 바란다.

4. 논리 볼륨(LV, Logical Volume)

볼륨 그룹에서 나눈 파티션이 논리 볼륨이라고 생각하면 된다. LVM을 이용해 크기를 확장 및 축소할 수 있고 이 부분을 사용자가 사용하게 된다.

5. 파일 시스템

논리 볼륨을 디스크에서 사용하기 위해 사용할 논리볼륨을 파일시스템으로 만들어준다.


정리하면 LVM은 각 디스크에 먼저 파티션을 설정한 후 각각의 파티션들을 물리볼륨으로 만든다. 그 다음 이 물리볼륨들을 볼륨그룹으로 묶고 이 그룹에서 다시 논리 볼륨으로 나눠준 후 파일시스템으로 만들어 사용하는 것이다. 다음 포스팅에는 이 내용들을 실제로 적용해보자. 필자는 서버가 따로 없어 VM에서 진행할 것이다.


참고 블로그 : http://sgbit.tistory.com/12
(그림이나 내용을 여기서 많이 참고했습니다.)

阅读全文 »


Django로 hello world 띄우기[1]


  • Django란?

Django는 파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션 프레임워크(web application framework)로, 쉽고 빠르게 웹사이트를 개발할 수 있도록 해준다.


Django를 사용하기 위해서는 먼저 Django를 설치해줘야 하는데 필자는 Ubuntu 16.04 LTS에서 진행하였다. 설치하기 전에 pip가 최신 버전으로 되도록 업그레이드를 시켜준다.

$ sudo pip install –upgrade pip
pip를 최신 버전으로 해줬으면 이젠 Django를 설치해보자

$ sudo pip install Django
설치가 끝났으면 먼저 프로젝트를 생성해줘야 한다.

$ django-admin startproject hello

ls를 통해 보면 hello라는 이름의 프로젝트가 생성되었음을 확인할 수 있다. 필자는 ~경로에 했기 때문에 저런 것이지만, 따로 새 디렉토리를 만든 후 해당 디렉토리에서 프로젝트를 생성해줄 수도 있다. 어떤 것들이 만들어졌는지 확인해보자.

이를 한 눈에 보기 쉽게 나타내보면

  • hello/ 디렉토리 바깥의 디렉토리는 단순히 프로젝트를 담는 공간입니다. 이 이름은 원하는대로 지정해줄 수 있다.

  • manage.py: Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티로 이에 대한 자세한 정보는 https://docs.djangoproject.com/ko/2.0/ref/django-admin/ 에서 확인할 수 있다.

  • hello/ 디렉토리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장되고, 이 디렉토리 내의 이름을 이용하여, (mysite.urls 와 같은 식으로) 프로젝트 어디서나 Python 패키지들을 import 할 수 있다.

  • hello/__init__.py: Python 으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일이다. 자세한 내용은 https://docs.python.org/3/tutorial/modules.html#tut-packages 를 참고하기 바란다.

  • hello/settings.py: Django project의 환경/구성을 저장하는 곳으로 https://docs.djangoproject.com/ko/2.0/topics/settings/ 에서 환경 설정이 어떻게 동작하는지 확인할 수 있다.

  • hello/urls.py: Django project 의 URL 선언을 저장한다. https://docs.djangoproject.com/ko/2.0/topics/http/urls/ 에 URL에 대한 자세한 내용들이 나와있다.

  • hello/wsgi.py: 현재 프로젝트를 서비스 하기 위한 WSGI 호환 웹 서버의 진입점이라고 생각하면 된다. https://docs.djangoproject.com/ko/2.0/howto/deployment/wsgi/ 에 자세하게 나와있다.

    이에 대한 내용은 django사이트( https://docs.djangoproject.com/ko/2.0/intro/tutorial01/ )에서 퍼왔습니다.

프로젝트를 생성했으니 해당 프로젝트에 대한 서버가 잘 동작하는지 확인해보자.

manage.py가 있는 경로로 가서

$ python manage.py runserver

보면 http://127.0.0.1:8000/ 에서 실행이 됨을 확인할 수 있다. 실제로 들어가보면

잘 실행되고 있음을 확인할 수 있다.

우리는 위와 같이 만들어 줄 것이다. 프로젝트를 만들어줬기 때문에 manage.py가 있는 경로로 가서 앱을 만들어주자.

$ python manage.py startapp pooh

pooh라는 디렉토리가 생겼다. 한 번 들어가보면

앱이 잘 생성되었음을 확인할 수 있다. 앱을 추가했을 때의 전체구조를 다시 보게 되면

다음 포스팅에는 환경설정 등을 통해 hello world를 띄워보자.

阅读全文 »


[MySQL] 데이터 존재 여부 검색



test2라는 테이블이 있다. 여기서 member가 faker인 사람의 정보를 조회하고 싶다. 물론 DB에서는 조회하는 쿼리를 입력하면 바로 나온다.

mysql> select * from test2 where member=’faker’;


처음에 그런 생각이 들었다. exists가 데이터 존재 여부를 검색하는 함수라고 하는데 exist를 쓰지않고도 위처럼 쿼리를 넣으면 바로 결과가 나와서 굳이 쓸 필요가 있나 싶었다. 하지만 이건 DB에서 작업할 때의 얘기고 다른 시스템과 결합되면 얘기는 달라진다.

예를 들어, 각 멤버들을 조회하는 챗봇이 있다고 가정하자. 만약 해당 멤버가 있으면 DB의 값들을 불러오고, 없으면 ‘해당 멤버는 존재하지 않습니다’라고 메시지를 띄우고 싶다. 이럴 때 exists함수를 이용하면 편하다.

exists함수는 ()안의 쿼리가 참이면 1을 반환하고, 거짓이면 0을 반환한다.


test2의 member컬럼에 ‘faker’가 있기 때문에 ‘select * from test2 where member=’faker’;’는 참이 돼 exists 함수는 1을 반환하게 된다. 아까 했던 얘기와 연결시켜 보면

select exists(‘멤버 조회하는 쿼리’); = 1 —> DB값 불러오기

select exists(‘멤버 조회하는 쿼리’); = 0 —> ‘해당 멤버는 존재하지 않습니다’ 메시지 띄우기

이런 식으로 코드를 짤 수 있는 것이다.



<참고>

위의 그림을 보면 exists함수를 썼을 때 이름이 exists(select * from test2 where member='faker')로 나와있다. 쿼리가 길어지면 이름 역시 더 길어진다. 이럴 때는 이름을 설정해주면 된다. 뒤에 as '이름'을 붙여보자.
아까처럼 쿼리문이 아닌 hi라는 이름으로 결과값을 반환한다.

阅读全文 »


[MySQL] INSERT문 여러 개 한 번에 넣기



test2라는 테이블을 만들고 컬럼에 맞게 데이터들을 넣고 싶다. 그래서 insert문을 이용해 데이터들을 넣어주었다.


데이터가 잘 들어갔는지 확인해보자.

각입력값

잘 들어가 있다. 그런데, 이렇게 한 명 넣을 때마다 하나 하나 입력해주기가 너무 귀찮다. 이렇게 할 필요없이 한 번에 넣는 방법이 있다.

mysql> insert into 테이블(컬럼1, 컬럼2, 컬럼3) values(‘값1’, ‘값2’, ‘값3’), (‘값4’, ‘값5’, ‘값6’), (‘값7’, ‘값8’, ‘값9’), (‘값10’, ‘값11’, ‘값12’);


이렇게 넣고 싶은 값들을 쭉 나열해서 적어주면 된다.

阅读全文 »


[MySQL] UPDATE문에서 자기 테이블 서브쿼리 이용하기



member라는 테이블에 정보들이 나와 있다. 이 테이블에서 POOH라는 member_id의 member_name을 git의 member_name으로 바꾸려고 한다. 그래서 쿼리를 이용해 해당 결과값을 반환하도록 한 후 이 값으로 update해주도록 쿼리를 짰다.


하지만, 에러가 떴다. 이 에러를 해석하면, MySQL은 UPDATE나 DELETE시 자기 자신 테이블의 데이터를 바로 사용하지 못한다는 뜻이다. 즉, member 테이블을 update하는데 select member_name from member~ 이렇게 member 테이블(자기 자신 테이블)의 데이터를 바로 사용하지 못한다는 것이다. 그러면 자기 테이블의 데이터는 사용하면서 자기 테이블에서 참조해오지 않게 하면 된다. 그 때 사용하는 것이 서브쿼리이다.



  • 서브쿼리란?

서브쿼리란 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말하는데, 반드시 괄호로 묶어줘서 써야 하고 해당 조건에 근거한 값들을 검색하는 select문장을 작성할 때 유용하다.

서브쿼리만 따로 한 번 작성을 해보자.

하지만 또 에러가 뜬다. 이 오류도 해석해보면 파생된 테이블(서브쿼리)은 반드시 별명(이름)을 가져야 한다는 뜻이다. 즉, 이름 같은 것을 통해 구분을 해주려고 하는 것이다. 따라서, 이름을 지어주면 해결된다. 여기서 파생된 테이블은 서브쿼리를 의미하는데, 서브쿼리를 실행해보면 해당 테이블에 대한 결과값이기 때문에 파생된 테이블이라고 하는 것이다.


나는 a라고 이름을 지었으나 이름은 지어주고 싶은대로 해주면 되고, as를 써서 해줄 수도 있고 그냥 이름만 써서 해줄 수도 있다. 둘 중 아무 방법이나 선택하면 된다.


이를 조금 더 구체적으로 해석해보면, ‘as a’ 부분은 단지 서브쿼리의 이름이고 잘 보면, select * from member;처럼 우리가 일반적으로 보는 select * from (테이블)의 구조인데, (테이블) 자리에 서브쿼리에 대한 결과값 즉, 파생된 테이블이 반환되기 때문에 테이블을 조회해주는 쿼리와 같은 구조임을 알 수 있다. 그리고 파생된 테이블에서 select한 것이기 때문에 자기 자신 테이블(member)를 참조하지 않아 아까와 같은 오류가 뜨지 않게 된다.그래서 실제로 비교해보면, 결과값이 같다.


참고 : 첫번째 쿼리를 보면 서브쿼리의 반환값이 member_name이기 때문에 *를 쓰지 않고 member_name을 써줘도 똑같은 값이 나온다.

그럼 이를 이용해 다시 POOH의 member_name을 git의 member_name으로 바꿔보자.


서브쿼리의 이름도 지정해줬고, 파생된 테이블에서 select한 값으로 update한 것이기 때문에 자기 자신 테이블(member)을 참조하지도 않아 아까와 같은 오류들이 뜨지 않고 잘 실행된다.

이제 member 테이블을 다시 확인해보자.


잘 바뀌었음을 확인할 수 있다. 이 서브쿼리는 UPDATE문에서만 해당되는 얘기는 아니고 서브쿼리를 사용할 수 있는 상황이면 다 똑같이 통용되는 얘기다.

阅读全文 »