<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>양파개발자 SW의 IT블로그</title>
    <link>https://oniondev.tistory.com/</link>
    <description>각종 개발 관련 포스팅을 하고 있습니다.
문의는 shiwoopark87@gmail.com 으로 주세요!</description>
    <language>ko</language>
    <pubDate>Tue, 11 Aug 2026 11:12:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jsilva</managingEditor>
    <image>
      <title>양파개발자 SW의 IT블로그</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2616244858118FB631</url>
      <link>https://oniondev.tistory.com</link>
    </image>
    <item>
      <title>[Python] 데코레이터 (Decorator)</title>
      <link>https://oniondev.tistory.com/22</link>
      <description>&lt;p&gt;이 문서는 파이썬 데코레이터에 대해 간단히 요점정리와 예제를 제공합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;&amp;lt;간단 개념 정리&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;데코레이터 (=decorator) :&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;- 다른함수를 인수로 받으면서 callable 을 리턴하는&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;callable&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- 데커레이터는 데커레이트되는 함수(인수로 받은 callable)에 어떤 처리를 수행한뒤, 인수로 받은 함수를 그대로 리턴하거나 다른 콜러블 객체를 리턴한다.&lt;/p&gt;
&lt;p&gt;- 런타임이 아닌 import 타임에 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1556156496557&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 간단 데코레이터 예제

def decorate(func):
    def decorated():
        print(&quot;데코레이터 실행 전&quot;)
        func()
        print(&quot;데코레이터 실행 후&quot;)
    return decorated
 
@decorate
def target():   
    print('target 함수 실행중임')
 
target()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;콜러블 (=callable) :&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;- 이름 뒤에 괄호를 사용해서 실행(call)할 수 있는 것.&lt;/p&gt;
&lt;p&gt;- __call__ 함수를 가지고 있는&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;클래스의 인스턴스&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 메소드&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;nonlocal 키워드 :&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;함수 A 안에 구현된 함수 &lt;span style=&quot;color: #333333;&quot;&gt;내장 함수&amp;nbsp;&lt;/span&gt;B의 지역변수가 함수 A 의 변수(자유 변수)를 명시적으로 참조하고자 할때 사용한다.&lt;/p&gt;
&lt;p&gt;아래 간단한 예제를 첨부한다.&lt;/p&gt;
&lt;pre id=&quot;code_1556154808660&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### 이력을 유지 안하는 잘 못된 고위 함수
 
def make_averager():
    count = 0
    total = 0
     
    def averager(value):
        count += 1
        total += value
        return total / count
    return averager
 
avg3 = make_averager()
avg3(10)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1556154855264&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### 이력을 유지 안하는 이동평균 계산 (nonlocal 사용)
 
def make_averager():
    count = 0
    total = 0
     
    def averager(value):
        nonlocal count, total
        count += 1
        total += value
        return total / count
    return averager
 
avg3 = make_averager()
avg3(10)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; width=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAvECd/btquN8PjGw3/kpdEfCkhTrpIlQBXCVXRNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAvECd/btquN8PjGw3/kpdEfCkhTrpIlQBXCVXRNK/img.png&quot; data-alt=&quot;클로저와 자유변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAvECd/btquN8PjGw3/kpdEfCkhTrpIlQBXCVXRNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAvECd%2FbtquN8PjGw3%2FkpdEfCkhTrpIlQBXCVXRNK%2Fimg.png&quot; width=&quot;352&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클로저와 자유변수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자유변수(=free variable) :&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 지역범위에 바인딩되어있지 않은 변수&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 글로벌 변수를 특정 함수 안에서 쓰면 해당 글로벌 변수는 자유변수이다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;클로저 (=closure) :&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 함수를 정의할때 존재하던 자유변수에 대한 바인딩을 유지하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;-&amp;nbsp;&lt;span&gt;클로저는 내포된함수(inner function) 안에서만 의미가 있다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- &lt;span style=&quot;color: #333333;&quot;&gt;클로저는 함수 본체에 정의하지 않고 참조하는 비전역(nonlocal) 변수를 포함한 확장 범위를 가진 함수다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 즉 클로져는 &lt;span style=&quot;color: #f41a18;&quot;&gt;inner 함수 + 해당 함수에서 참조하는 자유변수(nonlocal 변수) 까지 포함한 패키지&lt;/span&gt;를 뜻한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;&amp;lt;데코레이터 예제&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1556155165310&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### 개선된 clock 데커레이터
 
import time
import functools
 
def clock(func):
    @functools.wraps(func)
    def clocked(*args, **kwargs):
        t0 = time.time()
        result = func(*args, **kwargs)
        elapsed = time.time() - t0
        name = func.__name__
        arg_list = []
         
        if args:
            arg_list.append(','.join(repr(arg) for arg in args))
         
        if kwargs:
            paris = ['%s=%r' % (k, w) for k, w in sorted(kwargs.items())]
            arg_list.append(','.join(paris))
             
        arg_str = ','.join(arg_list)
        print(f'[{elapsed:.8f}] {name}({arg_str}) -&amp;gt; {result}')
        return result
    return clocked
         
     
@clock
def snooze(seconds):
    time.sleep(seconds)
     
@clock
def factorial(n):
    return 1 if n &amp;lt; 2 else n * factorial(n - 1)
 
print('*' * 40, 'Calling snooze(.123)')
snooze(.123)
 
print('*' * 40, 'Calling factorial(6)')
print('6! = ', factorial(6))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;파이썬에서 제공해주는 functools.wraps 데코레이터 :&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;functools.wraps 를 사용하지 않은 데커레이터는 데커레이트된 함수의 메타데이터를 자신의 것으로 변경한다. functools.wraps 를 사용하면 데커레이트된 함수의 메타데이터를 복사해서 데커레이트의 내포함수에 복사해주게 되므로, 메타 데이터를 덮어 써서 생기는미묘한 문제들을 방지할 수 있다. 그러니 일반적으로 데커레이터를 만들때는 거의 functools.wraps 를 사용해야 한다고 보면 된다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;&amp;lt;매개변수(parameter)가 있는 데코레이터 예제&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- parameter 가 있는 데코레이터의 경우, 2 depth 의 내장함수를 가진다.&lt;/p&gt;
&lt;p&gt;- 데코레이터 팩토리 -&amp;gt; 데코레이터 -&amp;gt; 데코레이트 되는 함수 순으로 랩핑됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1556157102616&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 매개변수화된 clock() 데커레이터
 
import time
 
DEFAULT_FMT = '[{elapsed:0.8f}s] {name} ({args}) -&amp;gt; {result}'
 
def clock(fmt=DEFAULT_FMT):
    def decorate(func):
        def clocked(*_args):
            print('=====================')
            t0 = time.time()
            _result = func(*_args)
            elapsed = time.time() - t0
            name = func.__name__
            args = ', '.join(repr(arg) for arg in _args)
            result = repr(_result)
            print(fmt.format(**locals()))
            return _result
        return clocked
    return decorate
 
 
if __name__ == '__main__':
    @clock()
    def snooze(seconds):
        time.sleep(seconds)
 
    for i in range(3):
        snooze(.123)
 
=====================
output
=====================
[0.12581611s] snooze (0.123) -&amp;gt; None
=====================
[0.12309694s] snooze (0.123) -&amp;gt; None
=====================
[0.12816191s] snooze (0.123) -&amp;gt; None
 
 
    @clock('{name} ({args}) dt={elapsed:0.3f}s')
    def snooze2(seconds):
        time.sleep(seconds)
         
    for i in range(3):
        snooze2(.123)
 
=====================
snooze2 (0.123) dt=0.125s
=====================
snooze2 (0.123) dt=0.126s
=====================
snooze2 (0.123) dt=0.124s&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python</category>
      <category>Decorator</category>
      <category>Python</category>
      <category>데코레이터</category>
      <category>파이썬</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/22</guid>
      <comments>https://oniondev.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 25 Apr 2019 10:43:16 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] 리터럴(literal = 숫자&amp;amp;문자)의 종류와 용법</title>
      <link>https://oniondev.tistory.com/21</link>
      <description>&lt;h4&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;String (문자열) literal&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 파이썬 3.0 부터는 자동으로 유니코드 문자열로 취급되며,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;접두사 b&lt;/b&gt;&lt;/span&gt; 를 붙이면 바이트 리터럴로 취급된다&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 파이썬 2 에서는 기본 리터럴이 바이트 리터럴이며, &lt;b&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;접두사 u&lt;/span&gt;&lt;/b&gt; 를 붙이면 유니코드 문자열로 취급된다 (파이썬 3와 약간 반대쥬?)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Escape sequence (백슬래시 문자열들, 개행문자... 같은거) 를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 그외 쓸만한 문자열 리터럴의 속성들을 적어봄&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1554983231866&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Basic string
# 문자열 기본
print(&quot;example1&quot;)
print('example2')
s = &quot;&quot;&quot;
&quot;example3&quot; !!!
'따옴표 있어도 그냥 출력됨'
&quot;&quot;&quot;
print(s)


# 자동 접합 (concat)
# 인접해 있으면 그냥 자동으로 붙는다
s = &quot;hello !!!&quot; &quot;nice to meet you&quot;
print(s)


# Raw string
# 문자열 내부에 모든 특수 기능을 제거
print(&quot;이것은 \n 개행될것이다&quot;)
print(r&quot;This \n is \&quot;' raw string example&quot;)
print(r'''따옴표 ' 또는 &quot; 를 사용하는예''')


# Format string
# 변수를 문자열 안에 (파이썬 3.6 이상 지원)
name = &quot;silva&quot;
print(f&quot;My name is {name}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Number (숫자) literal&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;- 접두사 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0b/0o/0x&lt;/span&gt; 를 붙이면 각각 2, 8, 16진수로 간주됨 (0b 에서 0 는 숫자 제로임)&lt;/p&gt;
&lt;p&gt;- 소수점 있는 리터럴은 항상 10진수로 해석됨&lt;/p&gt;
&lt;p&gt;- .01 은 0.01 과 같음&lt;/p&gt;
&lt;p&gt;- 5e2 는 5 x 10의제곱 과 같음&lt;/p&gt;
&lt;p&gt;- 허수에 대한 리터럴은 알파벳 j or J 사용 (ex. 1.2 + 3.2j)&lt;/p&gt;
&lt;pre id=&quot;code_1554984866205&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(0b11) # 3
print(0o11) # 9
print(0x11) # 17

print(.001 == 0.001)  # True

print(2e3)  # 2000.0

print(4 + 23j)  # (4+23j)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/21</guid>
      <comments>https://oniondev.tistory.com/21#entry21comment</comments>
      <pubDate>Thu, 11 Apr 2019 21:16:38 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 인스턴스 메소드의 종류와 용법 (Instance methods): Public, Protected, Private 접근제어자 (Access Modifiers)</title>
      <link>https://oniondev.tistory.com/20</link>
      <description>&lt;p&gt;이 포스팅은 &lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;파이썬 3&lt;/b&gt;&lt;/span&gt; 기준으로 인스턴스 메소드에 대하여 이야기 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;본 내용에 앞서 아래 2가지 용어를 먼저 짚고 넘어가는게 좋겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- 인스턴스:&lt;/b&gt; 클래스의 생성자가 실행되어 얻어진 클래스 객체&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- 인스턴스 메소드:&lt;/b&gt; 인스턴스에 바인딩된 함수&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모든 인스턴스 메소드의 생김새는 일단 아래와 비슷하게 생겼죠&lt;/p&gt;
&lt;pre id=&quot;code_1554725819901&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyClass:
  def my_method(self, *args, **kwargs):
    # some code comes here ...
    pass&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;클래스 하위에 소속 되어있고, 공통적으로 암묵적 첫번째 positional argument 인 &lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&amp;nbsp;를 가지고 있습니다.&lt;/p&gt;
&lt;p&gt;여기서 self 는 인스턴스 자체를 가리킵니다.&lt;/p&gt;
&lt;p&gt;즉, 모든 인스턴스 메소드는 인스턴스 정보에 대한 접근이 가능하며, 이를 이용한 각종 작업 수행이 가능하다는 얘기가 되겠지요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 Python의 이 인스턴스 메소드들 에게도 &lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;Public, Protected, Private 의 구분이 있을까&lt;/b&gt;&lt;/span&gt;요?&lt;/p&gt;
&lt;p&gt;음. 답변부터 해드리면 &lt;b&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;암묵적으로는 있지만, 언어적으로는 없다&lt;/span&gt;&lt;/b&gt; 라고 할수 있겠네요.&lt;/p&gt;
&lt;p&gt;자, 그럼 이제부터 종류별로 그 속성을 살펴보면서 왜 그런지 설명을 드리죠.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1. Public method&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 언더바가 없이 시작하는 메소드&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- 어디서나 호출이 가능한 공용 함수&lt;/p&gt;
&lt;p&gt;- 하위 클래스 override 허용&lt;/p&gt;
&lt;p&gt;- 일반적으로 작성되는 대부분의 메소드를 차지&lt;/p&gt;
&lt;h4&gt;2. Protected method&lt;/h4&gt;
&lt;p&gt;- &lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;언더바 1개&lt;/b&gt;&lt;/span&gt;로 시작하는 메소드&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 어디서나 호출이 가능하지만, &lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;암묵적 규칙에 의해&lt;/b&gt; &lt;b&gt;본 클래스 내부와 하위클래스 에서만&lt;/b&gt;&lt;/span&gt; 호출해야 하는 함수&lt;/p&gt;
&lt;p&gt;- 하위 클래스 override 허용&lt;/p&gt;
&lt;p&gt;- &lt;s&gt;성숙한 파이썬 코더만이 제대로 사용가능한 함수&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;- 참고링크:&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/questions/11483366/protected-method-in-python&quot;&gt;https://stackoverflow.com/questions/11483366/protected-method-in-python&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- 아래 Django 라이브러리에서 가져온 protected method override 샘플코드가 있으니 감상해보세요~&lt;/p&gt;
&lt;pre id=&quot;code_1554726924369&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class StreamingHttpResponse(HttpResponseBase):
    &quot;&quot;&quot;
    A streaming HTTP response class with an iterator as content.

    This should only be iterated once, when the response is streamed to the
    client. However, it can be appended to or replaced with a new iterator
    that wraps the original content (or yields entirely new content).
    &quot;&quot;&quot;

    streaming = True

    def __init__(self, streaming_content=(), *args, **kwargs):
        super(StreamingHttpResponse, self).__init__(*args, **kwargs)
        # `streaming_content` should be an iterable of bytestrings.
        # See the `streaming_content` property methods.
        self.streaming_content = streaming_content

    @property
    def content(self):
        raise AttributeError(
            &quot;This %s instance has no `content` attribute. Use &quot;
            &quot;`streaming_content` instead.&quot; % self.__class__.__name__
        )

    @property
    def streaming_content(self):
        return map(self.make_bytes, self._iterator)

    @streaming_content.setter
    def streaming_content(self, value):
        self._set_streaming_content(value)

    def _set_streaming_content(self, value):
        # Ensure we can never iterate on &quot;value&quot; more than once.
        self._iterator = iter(value)
        if hasattr(value, 'close'):
            self._closable_objects.append(value)

    def __iter__(self):
        return self.streaming_content

    def getvalue(self):
        return b''.join(self.streaming_content)


class FileResponse(StreamingHttpResponse):
    &quot;&quot;&quot;
    A streaming HTTP response class optimized for files.
    &quot;&quot;&quot;
    block_size = 4096

    def _set_streaming_content(self, value):
        if hasattr(value, 'read'):
            self.file_to_stream = value
            filelike = value
            if hasattr(filelike, 'close'):
                self._closable_objects.append(filelike)
            value = iter(lambda: filelike.read(self.block_size), b'')
        else:
            self.file_to_stream = None
        super(FileResponse, self)._set_streaming_content(value)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. Private method&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;언더바 2개&lt;/b&gt;&lt;/span&gt;로 시작하는 메소드&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- 본 클래스 내부에서만 사용이 가능&lt;/p&gt;
&lt;p&gt;- 하위클래스 상속 및 호출이 불가능 (오류남)&lt;/p&gt;
&lt;p&gt;- 외부 호출이 불가능 (오류남)&lt;/p&gt;
&lt;p&gt;- 실제로 많이 쓰이지는 않는것으로 보임&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-----&lt;/p&gt;
&lt;p&gt;이제 조금 의문이 풀리셨나요?&lt;/p&gt;
&lt;p&gt;protected 메소드의 경우, 암묵적 rule 이 있기 때문에 위와같이 말씀을 드렸던 것입니다.&lt;/p&gt;
&lt;p&gt;실제로 라이브러리 코드들을 보면 protected method 를 외부에서 호출하는 경우는 없고요,&lt;/p&gt;
&lt;p&gt;간혹 가다가 protected instance variable (self._some_var) 를 접근하는 경우는 있습니다. (only 조회 목적으로)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위에서 설명한 것들을 간단하게 코드로 구현해 보았으니&lt;/p&gt;
&lt;p&gt;실제 동작이 궁금하신 분들은 아래 코드를 복붙하여 실행해보세요~&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1554727496821&quot; class=&quot;python prettyprint&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person:
    name = None

    def __init__(self, name):  # constructor
        self.name = name

    def __get_trailing_text(self):  # private method
        return &quot;Nice to meet you !!!&quot;

    def _hello(self):  # protected method
        return &quot;Hello {}, {}&quot;.format( self.name, self.__get_trailing_text() )

    def hello(self):  # public method
        print(self._hello())


class Man(Person):
    def _hello(self):
        # self.__get_trailing_text() 사용 불가
        return &quot;Hello Mr.{}&quot;.format(self.name)

p = Person(&quot;mark&quot;)
p.hello()  # Hello mark, Nice to meet you !!!

try:
    p.__get_trailing_text()
except Exception as e:
    print(e)  # AttributeError

m = Man(&quot;silva&quot;)
m.hello()  # Hello Mr.silva

# 가능은 하지만 좋지 않은 용법
m._hello()  # Hello Mr.silva

try:
    m.__get_trailing_text()  
except Exception as e:
    print(e)  # AttributeError
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- END -&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>accessmodifiers</category>
      <category>private</category>
      <category>Protected</category>
      <category>Python</category>
      <category>접근제어</category>
      <category>접근제어자</category>
      <category>파이썬</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/20</guid>
      <comments>https://oniondev.tistory.com/20#entry20comment</comments>
      <pubDate>Mon, 8 Apr 2019 21:51:20 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] class method 와 static method</title>
      <link>https://oniondev.tistory.com/19</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 포스팅에서는 파이썬에 클래스 메소드와 스태틱 메소드의 성격을 알아보고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두가지 메소드의 차이점을 한번 비교해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;---&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스 메소드 (= @classmethod 데코레이터 함수)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- class 자체에 바인딩 된 메소드 (인스턴스에서 호출 불가)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- class 자체를 암묵적인 첫번째 파라미터로 넘겨받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 그로인해 함수 안에서 클래스 자체에서 들고있는 모든 정보에 접근이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 반대로 클래스 인스턴스 정보는 접근이 불가능하다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 메소드 내에서 class state 를 변경할 수 있으며 이는 현재 메모리에 올라가 있는 해당 클래스의 모든 인스턴스에 영향을 줄 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 그래서 이 부분은 클래스 메소드 생성 시, 매우 주의해야 함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 일반적으로 클래스의 factory method (cls object 를 리턴) 로 많이 사용한다. (constructor 비슷)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스태틱 메소드 (= @staticmethod 데코레이터 함수)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- class 자체에 바인딩 된 메소드&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 암묵적 첫번째 파라미터가 없다. 전부 명시적 파라미터만 입력 받아 처리 함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 클래스 자체 정보 접근이 불가능함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 스펙을 보면 사실 일반 함수와 별다를게 없는거나 마찬가지지만, 특정 클래스와 관련이 있다고 생각되기에 그냥 클래스에다가 붙여놓은 유틸성 함수라고 생각하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 일반적으로 클래스와 관련된 유틸리티 함수들을 만들때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스 메소드 VS 스태틱 메소드&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- class 메소드는 항상&amp;nbsp;첫번째 암묵적 파라미터로 cls 를 넘겨받지만 static 메소드는 그런게 없다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- class 메소드는 클래스 정보에 접근 &amp;amp; 수정이 가능하지만 static method 는 그렇지 못하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잘 사용된 예 - Best Practice&lt;/span&gt;&lt;/h4&gt;
&lt;script src=&quot;https://gist.github.com/Shiwoo-Park/72e82806be3126abc606c7ebb10cc8a9.js&quot;&gt;&lt;/script&gt;
&lt;h4&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;참고 링크&amp;gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.geeksforgeeks.org/class-method-vs-static-method-python/&quot;&gt;https://www.geeksforgeeks.org/class-method-vs-static-method-python/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://realpython.com/instance-class-and-static-methods-demystified/&quot;&gt;https://realpython.com/instance-class-and-static-methods-demystified/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/19</guid>
      <comments>https://oniondev.tistory.com/19#entry19comment</comments>
      <pubDate>Sat, 6 Apr 2019 10:39:50 +0900</pubDate>
    </item>
    <item>
      <title>Tistory 블로그에 코드블록 집어넣기</title>
      <link>https://oniondev.tistory.com/18</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 하이라이팅 필요없고 그냥 간단하게 그냥 넣고 싶을때&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;티스토리 기본 에디팅 화면에서 상단에 &quot;...&quot; 버튼 눌러보면 거기에 &quot;코드블럭&quot; 이라고 있다. 그거 사용하면 됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;----------&lt;/p&gt;
&lt;p&gt;2. 하이라이팅 X, 줄번호 O&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Line number 필요 없으면 심플하게 여길 이용해도 좋다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Django Template Language syntax 까지 제공하는 것으로 봐서 꽤 커버리지 넓어 보임.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그냥 코드 넣고 스타일 고르고 (나는 Zenbrun 이 좋더라) &lt;span style=&quot;color: #008100;&quot;&gt;&lt;b&gt;HIGHLIGHT!!&lt;/b&gt; &lt;/span&gt;버튼 누르면&lt;/p&gt;
&lt;p&gt;왼쪽 하단에 하이라이팅 된 html 코드가 쫙 나온다. 그거 &lt;b&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;편집기&amp;gt; HTML 모드&lt;/span&gt;&lt;/b&gt;에서 복붙하면 됨.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pinetools.com/syntax-highlighter&quot;&gt;https://pinetools.com/syntax-highlighter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1554184918414&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://pinetools.com/syntax-highlighter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://pinetools.com/syntax-highlighter&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Online Syntax highlighter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Syntax highlighting of pasted code&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;pinetools.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-------&lt;/p&gt;
&lt;p&gt;3. 하이라이팅 + 줄번호&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Github 에서 제공하는 Gist 라는 코드 snippet 저장소가 있다.&lt;/p&gt;
&lt;p&gt;여기에 코드를 저장해두면 embed 라는 기능을 제공하는데 거기서 복사해온 script 코드를&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;편집기 &amp;gt; HTML 모드&lt;/span&gt;&lt;/b&gt; 에서 원하는 위치에 넣어주면 아래처럼 예쁘게 코드 블럭이 생긴다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;요건 내꺼 gist 에서 퍼온 파이썬 코드 snippet 이다.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Shiwoo-Park/c7e10226de20658fb8798884ed32d4a3.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/18</guid>
      <comments>https://oniondev.tistory.com/18#entry18comment</comments>
      <pubDate>Tue, 2 Apr 2019 14:53:53 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] innerHTML 의 함정</title>
      <link>https://oniondev.tistory.com/17</link>
      <description>&lt;p&gt;나는 평소에 JQuery 에 익숙해져 있다가, 최근 들어서 pure javascript (=Vanila JS) 를 되도록 사용하기 위해 노력하고 있다.&lt;/p&gt;
&lt;p&gt;왜냐? ES6 이후로 js 가 많이 좋아졌다고도 하고... Vue.js 를 앞으로 사용할일이 좀 있는데..&lt;/p&gt;
&lt;p&gt;거기서도 JQuery를 같이 쓸거 같지도 않고...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여튼, 그래서 최근에는 Vanila JS로 엥간한 자바스크립트 코딩을 하려고 한다.&lt;/p&gt;
&lt;p&gt;그래서, 어제 일을하다가 평소에 JQuery 로 내가 아주 즐겨쓰던 함수인 append() 를 어떻게 하면 Vanila JS 로 짤 수 있을까 생각하다가, 그냥 생각없이 element 의 innerHTML 에다가 다른 html string 을 덧붙여보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;얼추 UI 상으로 보았을때는 크게 문제가 없어보이는데...&lt;/p&gt;
&lt;p&gt;이렇게 짯더니 문제점... 내가 할당했던 click 이벤트가 사라졌다는 것이다 !!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서 innerHTML 에 대한 내용을 찾아봤다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;normal&quot;&gt;innerHTML :&amp;nbsp;요소(element)의&amp;nbsp;자손의&amp;nbsp;HTML&amp;nbsp;직렬화를&amp;nbsp;포함하는&amp;nbsp;DOMString&amp;nbsp;입니다.&amp;nbsp;Setting&amp;nbsp;the&amp;nbsp;value&amp;nbsp;of&amp;nbsp;innerHTML&amp;nbsp;의&amp;nbsp;값을&amp;nbsp;설정(대입)하면&amp;nbsp;요소의&amp;nbsp;모든&amp;nbsp;자손이&amp;nbsp;제거되고,&amp;nbsp;문자열&amp;nbsp;htmlString에&amp;nbsp;지정된&amp;nbsp;HTML을&amp;nbsp;파싱하고,&amp;nbsp;생성된&amp;nbsp;노드로&amp;nbsp;대체합니다.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 이런 말도 쓰여있었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;normal&quot;&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;요소(element)의 내용을 변경하는 대신 HTML을 문서(document)에 삽입하려면,&amp;nbsp;&lt;b&gt;&lt;a style=&quot;color: #f41a18;&quot; href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML&quot;&gt;insertAdjacentHTML()&lt;/a&gt;&amp;nbsp;&lt;/b&gt;메서드를 사용하십시오.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉, innerHTML 을 사용하게되면 해당 태그(element) 의 모든 하위 html 이 새로운 html 로 통째로 재생성 된다는 뜻이다.&lt;/p&gt;
&lt;p&gt;그래서, 본 element를 포함한 모든 자손 element 의 각종 속성(event 포함)이 사라지게 되는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래에 처음에 실수했던 코드와 수정 후 코드 예제를 첨부한다.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Shiwoo-Park/3acd8cf0e8ee818d9c06ec3d4fba2d8c.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;innerHTML 대신 insertAdjacentHTML 을 사용한 것이 보이는가?&lt;/p&gt;
&lt;p&gt;이 함수는 삽입하고자 하는 html 을 이미 사용중인 element 는 건드리지 않고 원하는 위치에 넣어준다.&lt;/p&gt;
&lt;p&gt;자세한 내용은 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고하도록 하자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- End -&lt;/p&gt;</description>
      <category>각종 개발지식</category>
      <category>innerhtml</category>
      <category>insertAdjacentHTML</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>tip</category>
      <category>web</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/17</guid>
      <comments>https://oniondev.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 2 Apr 2019 14:20:21 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Garbage collection</title>
      <link>https://oniondev.tistory.com/16</link>
      <description>&lt;p&gt;&lt;span&gt;이 포스팅에서는 파이썬의 Garbage collection 이 어떻게 이루어 지는지, 간단히 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Garbage collection: 프로그램이 자동으로 메모리 공간을 비워주는 것. (=Memory recycling)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Reference: 참조, 특정 메모리 공간을 다른 곳에서 포인터 형식으로 가져다 쓸때 그것을 &quot;참조 하고 있다&quot; 고 표현한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;파이썬은 아래의 2가지 방식을 활용하여 Garbage Collection 을 수행한다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span&gt;1. Reference counting&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 모든 파이썬 object 는 reference count 라는 것을 가지고 있다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 이것은 다른 곳에서 이 object 를 참조하는 개수로서, 0보다 크다면 어디선가 이 object 를 사용중이라는 것을 뜻한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 그래서 Garbage collection 시에는, 이 Reference count == 0 가 되면 object 를 삭제 한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- &lt;span style=&quot;color: #333333;&quot;&gt;Cascading effect&lt;span&gt;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;삭제가 일어날때, 참조가 꼬리에 꼬리를 무는경우가 많아 동시에 메모리에서 해제 되는경우가 비일비재 하다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- Reference count 하나만 체크 해서는 cyclical reference 에 대한 garbage collection 을 처리할 수 없다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 일반적으로 Thread safe 하지 못하다. 즉, 파이썬으로 멀티 스레딩을 하게되면 이 reference count 가 제대로 카운팅 하지 못하여 garbage collection 이 되지 못한다. (자세한 내용이 궁금하다면 파이썬 GIL 을 찾아보자)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- 즉 파이썬은 multi-threading &amp;lt; multi-processing ...&lt;br /&gt;&lt;br /&gt;&lt;span&gt;2. Tracing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- Mark and sweep 방식 사용 : 사용중인 object 를 마킹 하고 마킹 안된 것들을 다 지우는 방법&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 파이썬은 그 중에서도 Generational Garbage Collection&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;이라는 &lt;span style=&quot;color: #333333;&quot;&gt;용법&lt;/span&gt;을 씀&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- &quot;대부분의 object 들이 일찍 죽는다&quot; 라는 성질을 이용 (한번 쓰이고 마는 애들이 많다는 뜻)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 파이썬 프로세스가 생성될때 3개의 generation list 를 만듬 (generation 0, generation 1, generation 2)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 최근에 생성된 object 일수록 generation 숫자가 작다 (최초 생성 시, generation 0 에 속함)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 각 리스트는reference count 가 0보다 큰 것들만 담아두고 있음&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 각각의 list 는 길이에 대한 threshold 값을 가지고 있어서 그 값을 넘어서면, 해당 generation list 를 포함 하여 younger list 들도 함께 generational garbage collection을 수행. (= 리스트 오브젝트들의 cyclic reference 를 체크 하여 일괄 삭제 작업을 수행)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- generation 0 이 조금 더 빈번하게 clean 작업을 수행&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- garbage collection 이 끝났는데 해당 generation list 에서 살아남은 object 들은 next generation 으로 승격&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- generation 2 이상으로 승격된 애들은 프로세스가 죽을때까지 살아있게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- End -&lt;/span&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/16</guid>
      <comments>https://oniondev.tistory.com/16#entry16comment</comments>
      <pubDate>Sat, 30 Mar 2019 23:31:10 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 서브쿼리 (Sub Query) 의 종류</title>
      <link>https://oniondev.tistory.com/14</link>
      <description>&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;lt;사용되는 위치에 따른 분류&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;1. 중첩된 쿼리 (&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Nested&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;Query) : SELECT 되는 컬럼에 사용된 서브쿼리&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;2. 서브 쿼리 (&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Sub&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;Query) : WHERE 절에 사용되는 경우.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;3. 파생 테이블 (&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(255, 0, 0);&quot;&gt;Derived&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;) : FROM 절에 사용된 서브쿼리, 일반적으로 RDBMS 전체적으로 인라인뷰(Inline View) 또는 서브셀렉트(Sub Select) 라 부르기도 한다.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;lt;서브쿼리의 반환 특헝에 따른 분류&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;1. 스칼라 서브쿼리 (&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Scalar&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;Sub Query) : 하나의 값(하나의 레코드)만 반환하는 쿼리&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Apple SD Gothic Neo'; color: #323333; -webkit-text-stroke: #323333}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Apple SD Gothic Neo'; color: #323333; -webkit-text-stroke: #323333; min-height: 15.0px}
span.s1 {font-kerning: none}
span.s2 {font-kerning: none; color: #ff2500; -webkit-text-stroke: 0px #ff2500}
span.s3 {font-kerning: none; color: #3366ff; -webkit-text-stroke: 0px #3366ff}
span.s4 {font-kerning: none; color: #3333ff; -webkit-text-stroke: 0px #3333ff}
&lt;/span&gt;&lt;/style&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;


&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;2. 로우 서브쿼리 (&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Row&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 11pt;&quot;&gt;Sub Query) : 컬럼개수에는 상관 없이 단 하나의 레코드(Row)만 반환하는 쿼리.&lt;/span&gt;&lt;/p&gt;</description>
      <category>각종 개발지식</category>
      <category>Database</category>
      <category>db</category>
      <category>MySQL</category>
      <category>query</category>
      <category>subquery</category>
      <category>서브쿼리</category>
      <category>쿼리</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/14</guid>
      <comments>https://oniondev.tistory.com/14#entry14comment</comments>
      <pubDate>Wed, 2 Nov 2016 18:15:56 +0900</pubDate>
    </item>
    <item>
      <title>Django ORM - DB Select 시, String concat 하기. (문자열 합치기)</title>
      <link>https://oniondev.tistory.com/12</link>
      <description>&lt;p&gt;아래의 예제는 모델별로 원하는 정보를 id 와 text 라는 키로 프로세싱 하여 되돌려주는 API 이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;annotate()&lt;/span&gt; 로 리턴필드명을 지정하고,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Concat()&lt;/span&gt; 를 사용하여 model 의 필드 값들을 붙일 수 있으며, &lt;span style=&quot;color: rgb(0, 85, 255);&quot;&gt;output_field&lt;/span&gt; 값을 지정하여 필드 타입도 지정할 수 있다.&lt;/p&gt;&lt;p&gt;필드값 사이사이에 일반 문자열을 넣고 싶다면 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Value&lt;/span&gt; 라는 Object 를 활용할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background: rgb(241, 240, 240);&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;class&lt;/span&gt; MyAPIView&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;APIView&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;

    &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;def&lt;/span&gt; get&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;self&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
        ret &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; APIResult&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;
        ret_dic &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 0, 0); font-weight: bold;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;

        &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'key'&lt;/span&gt; &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;in&lt;/span&gt; req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;GET&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
            ret_dic&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'error'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;&quot;키 정보가 없습니다.&quot;&lt;/span&gt;
        &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
            &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'search'&lt;/span&gt; &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;in&lt;/span&gt; req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;GET&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;and&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;GET&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'search'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
                need_search &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: rgb(7, 71, 38);&quot;&gt;True&lt;/span&gt;

            items &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;]&lt;/span&gt;
            &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;GET&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'key'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: rgb(68, 170, 221);&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'model1'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
                text &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; functions&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;Concat&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;V&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'[ #'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'id'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; V&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;' ] '&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'title'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; output_field&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;CharField&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;
                items &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; MyModel1&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;objects&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;annotate&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0); font-weight: bold;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;F&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'uid'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; text&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;text&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;values&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'id'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'text'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;

            &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;elif&lt;/span&gt; req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;GET&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'key'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: rgb(68, 170, 221);&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'model2'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
                text &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; functions&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;Concat&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;V&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'[ #'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'id'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; V&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;' - '&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'state'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; V&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'] '&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'title'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; output_field&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;CharField&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;
                items &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; MyModel2&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;objects&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;annotate&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0); font-weight: bold;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;F&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'field1'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; text&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;text&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;values&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'id'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'text'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;

            &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; need_search&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;:&lt;/span&gt;
                items &lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt; items&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0); font-weight: bold;&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;text__contains&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;=&lt;/span&gt;req&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;GET&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'search'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;

            ret&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;add_object&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'items'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: rgb(128, 0, 0); font-weight: bold;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;items&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;.&lt;/span&gt;order_by&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(230, 0, 0);&quot;&gt;'-id'&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;

        &lt;span style=&quot;color: rgb(64, 0, 0); font-weight: bold;&quot;&gt;return&lt;/span&gt; JsonResponse&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;(&lt;/span&gt;data&lt;span style=&quot;color: rgb(128, 96, 48);&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <category>concat</category>
      <category>Django</category>
      <category>orm</category>
      <category>String</category>
      <category>장고</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/12</guid>
      <comments>https://oniondev.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 2 Nov 2016 16:23:41 +0900</pubDate>
    </item>
    <item>
      <title>네트워크 더 쉽게, 더 깊게 #1 : 네트워크 전반에 대한 이해</title>
      <link>https://oniondev.tistory.com/11</link>
      <description>&lt;p&gt;이 글은, [&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;네트워크 더 쉽게, 더 깊게&lt;/span&gt;] 라는 책을 읽고 중요하다 싶은 내용을 정리한 것입니다 ^^&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;용어&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ISP : Internet Service Provider, 통신사업자와 비슷.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;LAN : Local Area Network. 작은 범위의 컴퓨터 네트워크.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;WAN : Wide Area Network. LAN 과 LAN 을 연결하는 대규모 네트워크&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;MAN : Metropoliysn Area Network, LAN 과 WAN 의 중간범위 네트워크.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인트라넷(=Intranet) : 독립적인 사내 네트워크. 인터넷은 제공 X, 주로 인사, 재무회계, 고객정보관리, 사내 문서 및 정보 관리, 사내 포털, 사내 시설 예약 등에 사용. 기밀성이 중요한 데이터가 이곳에서 관리 됨.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;네트워크 이중화 : 장애를 고려한 예비용 구성.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;네트워크 세그먼트 : 라우터를 통하지 않고 통신할 수 있는 범위 (=순수 LAN의 구성 복잡도를 알수 있음)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;내용 요약&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;&amp;lt;네트워크 구분&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 이용하는 입장에 따라 : 일반용 / 기업용&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 이용하는 장소에 따라 : 가정용 / 기업용&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 가정용과 기업용 차이 : 사용 앱, 물리적 네트워크 규모&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 일반적으로 가정용 보다는 기업용 네트워크가 고성능이고 신뢰성도 요구된다. 기기 가격도 고가이며, 보안 측면의 고려가 필요하여 작업도 복잡해짐.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;&amp;lt;네트워크 규모 측정&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. 소규모 네트워크&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 대략 3영역 (LAN) 이상으로 영역당 100 포트 미만&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 인터넷 - 라우터 - L2 스위치 - IP전화기(혹은 무선AP) - PC&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. 중규모 거점 네트워크&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 대략 5영역 (LAN) 이상으로 영역당 100~200 포트&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 라우터 이중화 구성 필요&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 서버룸이 생기면서 네트워크 세그먼트도 커짐.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 상호 접근 가능한 PC 집합이 다양하게 형성되면서 VLAN 기능을 가진 L2 스위치와 이를 연결해주는 L3 스위치가 필요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. 대규모 거점 네트워크&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 대략 5영역 (LAN) 이상으로 영역당 200 포트 이상&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 라우터 + 스위치 이중화 구성&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 방화벽은 전용기기로 도입&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- IP 전화를 위한 음성 교환기 설치 : IP-PBX or SIP 장비로 통화 중계&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 무선 LAN 컨트롤러 설치 : 여러개의 AP 에 대한 전파 간섭 등 고려하여 설치 위치 선정.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;&amp;lt;네트워크 이중화&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 구성 1. 하나의 라우터로 복수의 WAN 회선 보유&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 구성 2. 복수의 라우터로 각각 WAN 회선 보유&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 두번째 구성이 훨씬 안정적임. 전자의 경우 하나의 라우터가 죽어버리면 서비스가 불가능해짐.&lt;/p&gt;</description>
      <category>각종 개발지식</category>
      <category>network</category>
      <category>네트워크</category>
      <author>jsilva</author>
      <guid isPermaLink="true">https://oniondev.tistory.com/11</guid>
      <comments>https://oniondev.tistory.com/11#entry11comment</comments>
      <pubDate>Tue, 1 Nov 2016 18:05:22 +0900</pubDate>
    </item>
  </channel>
</rss>