200302TIL

|

오늘 한 것

  • 자바스크립트 함수형 자바스크립트 기본기 수강하고 정리
  • 자바스크립트 함수형 순회와 이터러블 수강하고 정리
  • 블로그 글 쓰기 (2월 동안 뭘 했을까?)
  • 지원 기업 리스트한 후 자소서 초안

회고

한 달을 토익스피킹을 빙자해서 쉬고 나니 (나를 둘러싸고 있던 것들에서 잠시 유리되어 있다 보니) 다시 나를 돌아볼 여유가 생긴다. 나에게 좀더 관대해지고, 잠들 때에 후회하지 않는 하루가 되도록 나의 하루하루를 다시 만들어볼 생각이다. 그리고, 나의 과거를 단순히 과오로 취급하며 자책하기보다는 그것을 받아들이고 내가 바꿀 수 있는 오늘과 내일을 살 예정이다. 시간이 지나도 내가 뭘 원하는지 정확히 알 수는 없구나. 그렇다면 그냥 그때그때 하고 싶은 걸 하고, 배우고 싶은 것을 배우자. 다만 후회 없이!

삶예술로서의 문학

|

이 글은 비평 무크지 크릿터 1호에 실린 특집기사 <움직이는 별자리들: 포스트 대의제의 현장과 문학들>을 읽은 뒤, 생각과 함께 간단히 정리한 글입니다.

그 어느때보다도 미디어가 발달하고 서로 물리적으로 만나지 않고도 연결되어 있음을 느낄 수 있는 현재에, 사람들은 오히려 ‘모인다’. 이에 대해 저자 김미정은 ‘assembly’라는 단어가 가지고 있는 양면적인 뜻을 이야기하며 설명을 시작해나간다. 우리말로 ‘의회’와 ‘집회’ 는 영어로 둘 다 ‘assembly’에 해당하지만, 실제로는 ‘모인다’는 의미만 공유할 뿐 전혀 다른 말이다.

의회는 대의제적으로서 누군가를 대표하는 자들의 모임이지만, 집회는 스스로 무리를 이루고 자기 표현하는 사람들의 모임이다. 반드시 현장, 오프라인에서 누군가를 만나지는 않으며 일반적으로 미디어가 이 집회의 결속을 다지는 데에 중요한 역할을 하지만, 한편으로는 2010년대 이후 전 지구적 연쇄적 항의 표현에 있어 이 집회가 온, 오프라인에서 여러 다른 지역에서 산발적으로 가시화된 것 역시 사실이다.

다만 과거에는 이러한 집회 속에서 다수의 의견이 마치 모두를 대표하는 것처럼 비춰졌다면, 전혀 다른 사람들과 의견이 범람하는 미디어 속에서 마이너리티가 이전보다 더 가시화된다. 그리고 이 존재들은 “특별한 언어 행위나 통일된 주장 없이 단지 공공의 장에 모습을 드러내는 것만으로도 정치적 의지를 행위화(enactment)했다.”

이들의 움직임은 이전에 이토록 명확하게 관측된 적이 없었기에, 기존에 다수로서 여겨졌던 집단들은 큰 위기의식을 느끼게 되었다. 그리고 대표-위임 관계의 극복을 시도하는 자들과 그것을 신자유주의의 이념 아래 저지하려는 이들 간에 무수한 투쟁이 일어나게 되는데, 양쪽 다 민주주의의 이름붙임을 둘러싸고 누가 진정으로 민주주의의 자격이 있는지에 대한 양상으로 전개된다.

“그러므로 포스트 대의제의 현장은 혼돈과 무질서처럼 보일지 모른다. 하지만 이 현장은 모든 사회적 주체들의 근원적 다양성이 만개하고 있고, 앞서 언급했듯 새로운 자기구성, 자기조직화, 혹은 “모두에 의한 모두의 통치” 문제를 제기한다는 점에서 일단은 무수한 가능성들의 진원지로 보아야 한다.

이러한 투쟁은 “수년간 한국 문화예술계의 변화와 움직임(movement)으로 펼쳐졌다.” 다만 주목할 점은 이 고발과 항의를 시작된 진원지가 평론가 혹은 이름 있는 기성 작가가 아니라, “작가 지망생, 독자의 경험과 고발 등”이었다는 점이다. “기존 문단의 ‘구성적 외부(the constitutive exclusion)’에서 처음 문제가 제기되었고, 이는 공론장 안팎의 네트워킹을 통해 가능했다.”

이것이 어떻게 가능했는가. “지시적이고 표상적이었던 이전의 예술에 비해 오늘날 예술은 ‘직접적’이고 ‘제시적’인 양상으로 바뀌”었기 때문이다. 그럼으로서 “세계의 구축에 참여하는 모든 주체의 다양성과 거기에서 발명될 특이성을 드러낼 수 있”게 된 것이다. 이것은 더 나아가 무수한 개인들의 목소리를 통해서 가시화된다. 그 목소리는 보다 직접적이고, 보다 삶에 가깝다.

“삶, 세계가 텍스트에 직접 육박, 기입될 때 (…) 우리는 그것을 ‘작품’이라 부르기를 주저해 왔다. 그러나 예술 다큐메이션은 예술을 기록(document)하고, 지시(refer)함으로써 예술이 “현존하거나 가시적이지 않다는 점, 오히려 부재하거나 가려져 있다는 사실”을 드러낸다.”

“작품을 접하면서 각자 안의 무언가가 건드려지고 거기에서 각자만의 내밀한 재의미화, 재맥락화가 생길 때 그것이 얼마나 문학적인지를 계측하는 것은 어딘지 혹독한 일이다. (…) 독자는 어떤 매개를 요하는 균질적 대상이라기보다 그 스스로 문학(예술) 과정에 참여하고 작품의 의미를 완성시켜가는 복잡한 주체다.”

“‘별이 총총한 하늘’을 보고 갈 길을 알 수 있었던 시대가 있었다고 한다. 시간도 흐르지 않고 밤하늘의 별을 따라 내면의 격정 등과 겨루지 않고 그 별들의 인도에 따라 주어진 생을 영위하는 것으로 충분한 세계였다고 한다. (…) 그 세계는 외부를 상상치 않고 하늘에 늘 변함없이 놓인 그 별자리에 정초되던 세계였을 따름이다.”

“지금은 스스로가 밤하늘의 별자리를 만들고, 오히려 별자리도 이동시키는 와중의 시대인지 모른다. 외부의 초월적이고 선험적인 준거들이 더는 제 기능을 못한다고 하더라도 그것은 애통함이나 묵념의 대상이 아니다. 필부필부인 우리가 오히려 별이 되고 별자리를 대신할(어쩌면 늘 대신해 왔을) 역량을 갖고 있음을 지금 확인하고 있기 때문이다.”

굿플레이스에서 무수히 대변되는 인간의 유한함과 이웃집의 윤리 (neighborhood ethic) 가 생각나는 글이었다. 치디는 그 스스로 윤리학 수업을 하는 교수이지만 정작 그 자신은 우유부단하며 많은 부조리에 둘러싸여 있다. 많은 철학가의 빛나는 별과 같은 말들이 희미해지는 순간, 치디는 바로 옆에 있는 엘리노어에게서 길을 찾는다. 정답이 아닌, 길을.

우리는 항상 부조리하고 유한한 인간이고, 종종 아니 많이 그릇된 행동을 한다. 그럼에도 불구하고 우리는 더 나은 선택을 할 수 있다. 이 선택이 결과적으로 선이 될지 악이 될지에 대해서 너무 연연해 하지 말라. 우리는 그때그때 더 나은 선택을 했을 뿐이니까. 우리가 바꿀 수 있는 것은 과거나 현재, 혹은 먼 미래가 아니다. 우리는 단지 더 나은 내일을 희망할 뿐이다.

마지막으로 너무나 마음깊이 사랑하게 된 구절.

“인간(예술)은 늘 주어진 세계에 구속되어 있지만 동시에 그 조건을 극복하고 세계를 다시 구축하는 존재다.”

초보자를 위한 장고 뿌시기 7 html에 스타일 적용하기

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

장고에서는 뼈대가 되는 html을 만들어 두고 재활용하는 것이 가능하다. 그러기 위해서는 우선 settings.py에서 templates의 경로를 잡아 주어야 한다.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'MyFirstDjango', 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

이 폴더 (MyFirstDjango) 내의 templates 경로를 읽어올 수 있게 해 준다.

그리고 templates 폴더 내에 base.html을 만들고 아래와 같이 부트스트랩의 기본 템플릿을 가져와준다.


<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

    <title>My First Django</title>
  </head>
  <body>
    {% block content %}
    {% endblock %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
  </body>
</html>

내부에 만들어놓은 block을 통해 이 base.html을 재사용하는 것이 가능해진다. main.html을 아래와 같이 바꾸고 base.html을 extends 하게 되면


{% extends 'base.html' %}

{% block content %}
<h1>
    Hello, Django!
</h1>

<a href='{% url "lovely:first" %}'>first</a>
<a href='{% url "lovely:second" %}'>second</a>
<a href='{% url "lovely:third" %}'>third</a>
{% endblock %}

img

이애 더하여, static을 지정해줄 수 있다. static이란 정적 파일로, 프로젝트 안에 있으면서 계속 재사용할 수 있는 css, js, 이미지, 폰트 등을 뜻한다. ststic 역시 다음과 같이 경로를 지정해 주어야 한다.

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'MyFirstDjango', 'static')
]

그 후 MyFirstDjango 폴더 안에 static 폴더를 만들어 주는데, 이 때 프로젝트 폴더 자체가 아닌 프로젝트 폴더 아래의 MyFirstDjango 폴더 아래에 static 폴더를 생성해야 한다. 이로 인한 실수를 해서 30분 정도 헤맸다…. static 아래에 font, css, js 등의 폴더를 생성해준다. 그리고 css 폴더 아래에 project.css 라는 css 파일을 생성해주고, 아래와 같이 커스텀한다.

h1 {
    font-size: 50px;
}

이를 사용하기 위해서는 base.html의 가장 하단에 {% load static %}라고 쓰고, 이 스타일 시트를 불러와 주면 된다.


{% load static %}
<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
      <link rel="stylesheet" href="{% static 'css/project.css' %}">

    <title>My First Django</title>
  </head>
  <body>
    {% block content %}
    {% endblock %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
  </body>
</html>

그리고 main 페이지를 들어가보면

img

물론 main 페이지 이외에 다른 페이지에도 extends 하여 base.html을 적용할 수 있다. 그리고 여러 개의 base.html을 만들어 각각 다른 뼈대를 적용할 수도 있다.

초보자를 위한 장고 뿌시기 6 링크 타고 다른 페이지 넘어가기

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

먼저 새로운 앱을 생성한다. 프로젝트의 기본 urls.py에 path를 추가해줄 수도 있지만, 앱의 개수가 많아질 경우 코드가 복잡해질 수 있다. 그렇기 때문에 앱 내에 urls.py 파일을 생성하고, 해당 코드에서 해당 앱의 경로를 관리한다.

from django.urls import path
from .views import first, second, third

app_name="lovely"
urlpatterns = [
    path('first/', first, name="first"), # 순서대로 경로, views에 있는 함수, 경로를 불러주는 이름
    path('second/', second, name="second"),
    path('third/', third, name="third"),
]

위의 경로들은 기본주소/lovely/first 와 같은 형태로 접근 가능하다. 이 때 프로젝트의 기본 urls.py에 해당 앱의 경로를 include 해준다.

from django.contrib import admin
from django.urls import path, include
from posts.views import main

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', main, name="main"),
    path('lovely/', include('lovely.urls')), # lovely로 시작하는 경로는 이제 lovely의 urls.py에서 관리
]

이제 main 화면에서 lovely 앱의 first, second, third로 가는 경로를 생성한다. lovely/first 와 같은 형식으로 경로를 지정해줄 수 있지만, 이 경우 유지보수성이 떨어지게 된다. 코드를 보다 간결하고 가독성 있게 하기 위해 lovely 앱의 urls.py에서 지정해준 app_name 과 템플릿 언어를 사용하여 다음과 같이 적을 수 있다.

views
views
views

초보자를 위한 장고 뿌시기 5 HTML 띄우기

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

View, Template View : 클라이언트의 요청 처리 및 응답을 주는 역할 Template : HTML과 같이 사용자에게 보여주는 역할

  1. 경로를 만들어준다. naver.com은 도메인 /(slash)가 들어가면 경로 즉, url = domain + 경로 저번에 서버를 실행시키고/admin이라고 했을 때 그 뒤의 /admin이 경로가 되었던 것 프로젝트 이름 폴더 > urls.py의 urlpatternslist 형태로 경로들이 들어 있다.
  2. 그 경로에 해당하는 view를 만들어준다. 그 경로에 가면 어떤 서버로 가라! urls.py : 장고에서 경로를 생성하고 어디로 갈지 알려주는 네비게이션 역할
  3. 해당 View에서 요청을 처리하여 응답을 한다.

장고에서 views.py에 코딩을 할 때 두 가지 방법 가능

  1. 함수로 view 짜기 <- 여기서는 주로 이 방식 사용
  2. 클래스로 view 짜기

실습!

  1. urls.py의 urlpatterns에 path를 추가해준다!
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', 어떤-곳으로?),
]
  1. posts 폴더의 views.py에서 main이라는 함수를 정의해준다.
from django.shortcuts import render

def main(request):
    return render(request, 어떤 html을 띄워줄건지 <- html 경로)
  • render : html을 response로 뿌려줄 때 사용하는 함수
    1. posts 폴더에 templates > posts 폴더를 생성하고, 그 안에 main.html 파일을 생성한다.
  • 왜 templates 안에 app 이름과 똑같은 posts 폴더를 만들까? -> render 함수가 html 등의 파일을 가져올 때 templates 폴더에서 가져온다. 만약 다른 앱(폴더)에 똑같은 이름의 다른 html이 있다면 의도치 않은 html을 가져올 가능성을 방지하기 위해서!
  • html의 이름을 main.html로 한 까닭은 함수의 이름이 main이기 때문에 알아보기 쉽도록!
<h1>
    Hello, Django!
</h1>
  1. main 함수의 render를 html 경로로 바꾸어 준다.
def main(request):
    # request에 대해 posts/main.html을 render해줘!
    return render(request, 'posts/main.html')
  1. urls.py의 경로를 main 함수로 바꾸어 준다.
from django.contrib import admin
from django.urls import path
from posts.views import main

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', main), # 콤마 꼭!
    # -> 아무 경로도 없을 때 posts > views > main 함수로 가라!
]
  • 콤마 반드시!
  • 아무 경로도 없을 때 posts > views > main 함수로 가라!
  • 그럼 main 함수에서는 posts/main.html을 렌더링한 결과를 뿌려준다.
views