<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>shortcode</title>
    <link>https://shortcode.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 06:27:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>shortcode</managingEditor>
    <item>
      <title>C: 조합은 어디서 실질적으로 사용되고 있습니까?</title>
      <link>https://shortcode.tistory.com/548</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C: 조합은 어디서 실질적으로 사용되고 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 유형의 정렬이 보장되는 union max_align의 예를 가지고 있습니다. 나는 내 친구를 설명하기 위해 union이 실질적으로 사용되는 훨씬 더 간단한 예를 찾고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 텍스트를 파싱할 때 주로 조합을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다음과 같은 것을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef enum DataType { INTEGER, FLOAT_POINT, STRING } DataType ;

typedef union DataValue
{
    int v_int;
    float v_float;
    char* v_string;
}DataValue;

typedef struct DataNode
{
    DataType type;
    DataValue value;
}DataNode;

void myfunct()
{
    long long temp;
    DataNode inputData;

    inputData.type= read_some_input(&amp;amp;temp);

    switch(inputData.type)
    {
        case INTEGER: inputData.value.v_int = (int)temp; break;
        case FLOAT_POINT: inputData.value.v_float = (float)temp; break;
        case STRING: inputData.value.v_string = (char*)temp; break;
    }
}

void printDataNode(DataNode* ptr)
{
   printf(&quot;I am a &quot;);
   switch(ptr-&amp;gt;type){
       case INTEGER: printf(&quot;Integer with value %d&quot;, ptr-&amp;gt;value.v_int); break;
       case FLOAT_POINT: printf(&quot;Float with value %f&quot;, ptr-&amp;gt;value.v_float); break;
       case STRING: printf(&quot;String with value %s&quot;, ptr-&amp;gt;value.v_string); break;
   }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유니언이 어떻게 많이 사용되는지 확인하려면 &lt;a href=&quot;http://www.gnu.org/software/flex/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;flex&lt;/a&gt;/&lt;a href=&quot;http://www.gnu.org/software/bison/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-3&quot;&gt;bison&lt;/a&gt;을 사용하여 코드를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, &lt;a href=&quot;http://www.splint.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-5&quot;&gt;부목&lt;/a&gt;에는 TON의 조합이 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 일반적으로 데이터에 대한 다양한 보기를 원하는 조합을 사용해 왔습니다. 예를 들어 32비트 색상 값을 사용하여 32비트 값과 빨간색, 녹색, 파란색 및 알파 구성 요소를 모두 원하는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct rgba
{
  unsigned char r;
  unsigned char g;
  unsigned char b;
  unsigned char a;
};

union  
{
  unsigned int val;
  struct rgba components;
}colorval32;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NB 비트 마스킹 및 시프트를 통해 동일한 작업을 수행할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define GETR(val) ((val&amp;amp;0xFF000000) &amp;gt;&amp;gt; 24)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 노조의 접근 방식이 더 우아하다고 생각합니다&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 포트를 메모리에 매핑하여 레지스터 또는 I/O 포트를 바이트 단위뿐만 아니라 비트 단위로 액세스하려면 아래 예를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    typedef Union
{
  unsigned int a;
struct {
  unsigned bit0 : 1,
           bit1 : 1,
           bit2 : 1,
           bit3 : 1,
           bit4 : 1,
           bit5 : 1,
           bit6 : 1,
           bit7 : 1,
           bit8 : 1,
           bit9 : 1,
           bit10 : 1,
           bit11 : 1,
           bit12 : 1,
           bit13 : 1,
           bit14 : 1,
           bit15 : 1
} bits;
} IOREG;

# define PORTA (*(IOREG *) 0x3B)
...
unsigned int i = PORTA.a;//read bytewise
int j = PORTA.bits.bit0;//read bitwise
...
PORTA.bits.bit0 = 1;//write operation
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 에서,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unions&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 &lt;a href=&quot;http://en.wikipedia.org/wiki/Component_Object_Model&quot; papago-id=&quot;9-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;COM&lt;/a&gt; 개체 간에 데이터를 전달하는 하나의 표준 방식인 &lt;a href=&quot;http://en.wikipedia.org/wiki/Variant_type&quot; papago-id=&quot;9-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;태그&lt;/a&gt;가 지정된 &lt;a href=&quot;http://en.wikipedia.org/wiki/Variant_type&quot; papago-id=&quot;9-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;변형&lt;/a&gt;을 구현하는 데 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 은 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;union&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;type은 두 개체 사이에 임의의 데이터를 전달하기 위한 단일 자연 인터페이스를 제공할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 COM 개체는 다음 중 하나를 포함할 수 있는 변형(예: 유형 또는 )을 전달할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;double&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;float&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;든 간에, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;윈도우 C++ 코드에서 COM 객체를 다루어야 한다면 곳곳에서 변종을 볼 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.roblocher.com/whitepapers/oletypes.aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변형, 세이프레이, BSTR, 어머나!&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.boost.org/doc/libs/1_41_0/doc/html/variant.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부스트 변형&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;pre&gt;&lt;code&gt;struct cat_info
{
int legs;
int tailLen;
};

struct fish_info
{
bool hasSpikes;
};


union 
{
fish_info fish;
cat_info cat;
} animal_data;

struct animal
{
char* name;
int animal_type;
animal_data data;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조합은 다른 종류의 메시지가 있는 경우 유용하며, 이 경우에는 어떤 중간 수준에서도 정확한 유형을 알 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;발신자와 수신자만 메시지 실제 메시지를 구문 분석하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 레벨은 크기와 발신자 및/또는 수신자 정보만 알면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SDL은 http://www.libsdl.org/cgi/docwiki.cgi/SDL_Event 이벤트를 표현하기 위해 연합을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 이런것을 의미합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;union {
   long long a;
   unsigned char b[sizeof(long long)];
} long_long_to_single_bytes;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;21-0&quot;&gt;추가&lt;/strong&gt;됨:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 최근에 AIX 머신에서 64비트 머신 인디케이터를 바이트 배열로 변환하기 위해 이것을 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;std::string getHardwareUUID(void) {
#ifdef AIX
   struct xutsname m; // aix specific struct to hold the 64bit machine id
   unamex(&amp;amp;b);        // aix specific call to get the 64bit machine id
   long_long_to_single_bytes.a = m.longnid;
   return convertToHexString(long_long_to_single_bytes.b, sizeof(long long));
#else // Windows or Linux or Solaris or ...
   ... get a 6byte ethernet MAC address somehow and put it into mac_buf
   return convertToHexString(mac_buf, 6);
#endif
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 연합이 유용할 수 있는 또 다른 예가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(제 아이디어가 &lt;a href=&quot;http://www.agner.org/optimize/optimizing_cpp.pdf&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-1&quot;&gt;아니라&lt;/a&gt; c++ 최적화에 대해 설명하는 문서에서 이 내용을 발견했습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작은-&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.... 예를 들어, 공간 절약을 위해 조합을 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫째, 비조합 방식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void F3(bool useInt) {
    if (y) {
        int a[1000];
        F1(a);  // call a function which expects an array of int as parameter
    }
    else {
        float b[1000];
        F2(b);  // call a function which expects an array of float as parameter
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 a와 b의 라이브 범위가 겹치지 않기 때문에 동일한 메모리 영역을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;a와 b를 조합에 가입시키면 많은 CPU &lt;strong papago-id=&quot;28-1&quot;&gt;캐시 공간&lt;/strong&gt;을 절약할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void F3(bool useInt) {

    union {
        int a[1000];
        float b[1000];
    };

    if (y) {
        F1(a);  // call a function which expects an array of int as parameter
    }
    else {
        F2(b);  // call a function which expects an array of float as parameter
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조합을 사용하는 것은 물론 안전한 프로그래밍 방법은 아닙니다. a와 b의 사용이 겹치면 컴파일러로부터 경고를 받지 않기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시 공간을 많이 차지하는 큰 개체에 대해서만 이 메서드를 사용해야 합니다. ...&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;끝판왕의&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 식으로 노조를 이용한 적이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//Define type of structure
typedef enum { ANALOG, BOOLEAN, UNKNOWN } typeValue_t;
//Define the union
typedef struct  {
  typeValue_t typeValue;
  /*On this structure you will access the correct type of
    data according to its type*/
  union {
    float ParamAnalog;
    char  ParamBool;
  };
} Value_t;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 다양한 종류의 값을 가진 배열을 선언하여 데이터를 효율적으로 저장하고 다음과 같은 &quot;폴리모르프&quot; 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; void printValue ( Value_t value ) {
    switch (value.typeValue) {
       case BOOL:
          printf(&quot;Bolean: %c\n&quot;, value.ParamBool?'T':'F');
          break;
       case ANALOG:
          printf(&quot;Analog: %f\n&quot;, value.ParamAnalog);
          break;
       case UNKNOWN:
          printf(&quot;Error, value UNKNOWN\n&quot;);
          break;
    }
 }
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt; 
 &lt;li papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 유형으로 강제해야 하는 직렬 데이터를 읽을 때.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서 의미 값을 반환할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lex&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yacc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. (&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yylval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴리모픽 타입(polymorphic type)을 구현할 때, 특히 DSL 또는 일반 언어를 읽는 타입&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 종류를 취하도록 의도된 기능을 특별히 호출하는 디스패처를 구현할 때.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.informit.com/articles/article.aspx?p=710752&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;40-1&quot;&gt;최근에 벡터프로그래밍&lt;/a&gt;에 사용되는 어떤 유니언을 본 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;벡터 프로그래밍은 &lt;a href=&quot;http://en.wikipedia.org/wiki/MMX_(instruction_set)&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;40-3&quot;&gt;인텔 MMX 기술&lt;/a&gt;, GPU 하드웨어, &lt;a href=&quot;http://en.wikipedia.org/wiki/Cell_(microprocessor)&quot; papago-id=&quot;40-5&quot; rel=&quot;nofollow noreferrer&quot;&gt;IBM의 Cell&lt;/a&gt; Broadband &lt;a href=&quot;http://en.wikipedia.org/wiki/Cell_(microprocessor)&quot; papago-id=&quot;40-5&quot; rel=&quot;nofollow noreferrer&quot;&gt;Engine&lt;/a&gt; 등에 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;벡터는 128 비트 레지스터에 해당할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/SIMD&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;41-1&quot;&gt;SIMD&lt;/a&gt; 아키텍처에 매우 일반적으로 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하드웨어에 128비트 레지스터가 있으므로 레지스터/variable에 4개의 단일 정밀도 floating 포인트를 저장할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;벡터의 개별 요소를 구성하고 변환하고 추출하는 쉬운 방법은 결합을 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef union {
    vector4f vec; // processor-specific built-in type
    struct { // human-friendly access for transformations, etc
        float x;
        float y;
        float z;
        float w;
    };
    struct { // human-friendly access for color processing, lighting, etc
        float r;
        float g;
        float b;
        float a;
    };
    float arr[4]; // yet another convenience access
} Vector4f;

int main()
{
    Vector4f position, normal, color;
    // human-friendly access
    position.x = 12.3f;
    position.y = 2.f;
    position.z = 3.f;
    position.w = 1.f;

    // computer friendly access
    //some_processor_specific_operation(position.vec,normal.vec,color.vec);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PlayStation 3 멀티코어 프로그래밍 또는 그래픽 프로그래밍에서 길을 찾는다면 더 많은 것들을 직면할 가능성이 높습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 파티에 좀 늦었다는 것은 알지만, 실질적인 예로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Variant&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VB스크립트의 데이터 타입은 다음과 같이 구현됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Union&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 다음 코드는 &lt;a href=&quot;http://www.codeproject.com/KB/architecture/cvariant.aspx&quot; rel=&quot;nofollow&quot; papago-id=&quot;13-1&quot;&gt;여기&lt;/a&gt;에 없는 기사에서 가져온 단순화된 예입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct tagVARIANT
{
    union 
    {
        VARTYPE vt;
        WORD wReserved1;
        WORD wReserved2;
        WORD wReserved3;
        union 
        {
            LONG lVal;
            BYTE bVal;
            SHORT iVal;
            FLOAT fltVal;
            DOUBLE dblVal;
            VARIANT_BOOL boolVal;
            DATE date;
            BSTR bstrVal;
            SAFEARRAY *parray;
            VARIANT *pvarVal;
        };
    };
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(기사에 나와 있는 것처럼) 실제 구현은 &lt;em papago-id=&quot;46-1&quot;&gt;oaidl.h&lt;/em&gt; C 헤더 파일에서 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서로 다른 소켓 유형을 사용하지만 참조할 일반적인 유형을 원할 경우.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 예는 주조 작업을 절약하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef union {
  long int_v;
  float float_v;
} int_float;

void foo(float v) {
  int_float i;
  i.float_v = v;
  printf(&quot;sign=%d exp=%d fraction=%d&quot;, (i.int_v&amp;gt;&amp;gt;31)&amp;amp;1, ((i.int_v&amp;gt;&amp;gt;22)&amp;amp;0xff)-128, i.int_v&amp;amp;((1&amp;lt;&amp;lt;22)-1));
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void foo(float v) {
  long i = *((long*)&amp;amp;v);
  printf(&quot;sign=%d exp=%d fraction=%d&quot;, (i&amp;gt;&amp;gt;31)&amp;amp;1, ((i&amp;gt;&amp;gt;22)&amp;amp;0xff)-128, i&amp;amp;((1&amp;lt;&amp;lt;22)-1));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편의상, 저는 같은 클래스를 사용하여 xyzw 값과 rgba 값을 저장할 수 있도록 유니언을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#ifndef VERTEX4DH
    #define VERTEX4DH

    struct Vertex4d{

        union {
            double x;
            double r;
        };
        union {
            double y;
            double g;
        };
        union {
            double z;
            double b;
        };
        union {
            double w;
            double a;
        };

        Vertex4d(double x=0, double y=0,double z=0,double w=0) : x(x), y(y),z(z),w(w){}
    };

#endif
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 에서 수.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;X11/Xlib.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 .  IP (BSD ) 에  것은 거의 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;netinet/ip.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 프로토콜 구현은 유니온 컨스트럭트(union construct)를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조합은 또한 몇몇 장소(예를 &lt;a href=&quot;http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm&quot; papago-id=&quot;56-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;들어&lt;/a&gt; 부동 &lt;a href=&quot;http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm&quot; papago-id=&quot;56-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;소수점&lt;/a&gt; 비교 알고리즘에 대한 일부 기술)에서 바람직한 유형의 &lt;a href=&quot;http://en.wikipedia.org/wiki/Type_punning&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;56-1&quot;&gt;펀닝&lt;/a&gt;(punning)을 수행할 때 유용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1951269/c-where-is-union-practically-used&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/548</guid>
      <comments>https://shortcode.tistory.com/548#entry548comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:20:12 +0900</pubDate>
    </item>
    <item>
      <title>프로그래밍 방식으로 웹 페이지 읽기</title>
      <link>https://shortcode.tistory.com/547</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그래밍 방식으로 웹 페이지 읽기&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C/C++로 웹페이지를 동적으로 읽고 그로부터 정보를 추출하는 프로그램을 작성하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, ebay 경매를 팔로우하고 기록하기 위한 신청서를 작성하고자 한다면 상상해 보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹 페이지를 쉽게 잡을 수 있는 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능을 제공하는 라이브러리?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 특정 데이터를 얻기 위해 페이지를 파싱하는 쉬운 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cURL &lt;a href=&quot;http://curl.haxx.se/libcurl/c/example.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-1&quot;&gt;라이브러리&lt;/a&gt;를 살펴보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; #include &amp;lt;stdio.h&amp;gt;
 #include &amp;lt;curl/curl.h&amp;gt;

 int main(void)
 {
   CURL *curl;
   CURLcode res;

   curl = curl_easy_init();
   if(curl) {
     curl_easy_setopt(curl, CURLOPT_URL, &quot;curl.haxx.se&quot;);
     res = curl_easy_perform(curl);
      /* always cleanup */
    curl_easy_cleanup(curl);
   }
   return 0;
 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그건 그렇고, C++가 엄격하게 요구되지 않는다면요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 당신이 C#이나 자바를 시도해보길 권장합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 훨씬 쉽고 내장된 방법이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;winsock2.h&amp;gt;
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;iostream&amp;gt;
#pragma comment(lib,&quot;ws2_32.lib&quot;)
using namespace std;
int main (){
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &amp;amp;wsaData) != 0) {
        cout &amp;lt;&amp;lt; &quot;WSAStartup failed.\n&quot;;
        system(&quot;pause&quot;);
        return 1;
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname(&quot;www.google.com&quot;);
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host-&amp;gt;h_addr);
    cout &amp;lt;&amp;lt; &quot;Connecting...\n&quot;;
    if(connect(Socket,(SOCKADDR*)(&amp;amp;SockAddr),sizeof(SockAddr)) != 0){
        cout &amp;lt;&amp;lt; &quot;Could not connect&quot;;
        system(&quot;pause&quot;);
        return 1;
    }
    cout &amp;lt;&amp;lt; &quot;Connected.\n&quot;;
    send(Socket,&quot;GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n&quot;, strlen(&quot;GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n&quot;),0);
    char buffer[10000];
    int nDataLength;
    while ((nDataLength = recv(Socket,buffer,10000,0)) &amp;gt; 0){        
        int i = 0;
        while (buffer[i] &amp;gt;= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            cout &amp;lt;&amp;lt; buffer[i];
            i += 1;
        }
    }
    closesocket(Socket);
        WSACleanup();
    system(&quot;pause&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTTP 및 HTTPS를 지원하는 Windows용 무료 TCP/IP 라이브러리가 있습니다. 이 라이브러리를 사용하는 것은 매우 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;궁극 TCP/IP&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CUT_HTTPClient http;
http.GET(&quot;http://folder/file.htm&quot;, &quot;c:/tmp/process_me.htm&quot;);    
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 통해할 수도 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CUT_DataSource&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파생 클래스).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 HTTP&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;지원은 모두 여기에 있습니다 &lt;/font&gt;- &lt;font class=&quot;papago-parent&quot;&gt;PUT, HEAD 등&lt;/font&gt;. &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;, &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보안 소켓과 마찬가지로 프록시 서버에 대한 지원도 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네트워크를 통해 데이터를 읽고 xml 문서에서 데이터를 가져올 수 있는 Qt와 같은 라이브러리를 사용해 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://doc.qt.io/archives/4.6/xml-rsslisting-rsslisting-cpp.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;9-1&quot;&gt;다음&lt;/a&gt;은 xml 피드를 읽는 방법의 예입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 ebay 피드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소켓 프로그래밍으로 할 수는 있지만 페이지를 안정적으로 가져오는 데 필요한 프로토콜의 부분을 구현하는 것은 어렵습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.webdav.org/neon/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;10-1&quot;&gt;네온같은&lt;/a&gt; 도서관을 이용하는게 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 Linux 배포판에 설치될 가능성이 높습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;언더 FreeB&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SD는 fetch 라이브러리를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 구문 분석하려면 많은 페이지에서 유효한 XML을 사용하지 않으므로 실제 acc 기반 구문 분석기가 아니라 휴리스틱을 구현해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정규식 또는 상태 전환 기계를 사용하여 이를 구현할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시행착오를 많이 겪어야 하므로 Perl과 같은 스크립트 언어를 사용하는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네트워크 지연 시간이 길기 때문에 성능에 차이가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플랫폼에 대한 언급이 없으셔서 Win32에 대한 답변을 드립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 할 수 있는 은 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;URLDownloadToFile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IBindStatusCallback&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매개 변수를 다음으로 설정&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하려면 콜백 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 기능을 보다 유용하게 사용하기 위해서는 콜백 인터페이스를 구현해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;멀티플랫폼 QT 라이브러리에서 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;QByteArray WebpageDownloader::downloadFromUrl(const std::string&amp;amp; url)
{
    QNetworkAccessManager manager;
    QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url.c_str())));
    QEventLoop event;
    QObject::connect(response, &amp;amp;QNetworkReply::finished, &amp;amp;event, &amp;amp;QEventLoop::quit);
    event.exec();
    return response-&amp;gt;readAll();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 데이터는 파일에 저장하거나 std:::string으로 변환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const string webpageText = downloadFromUrl(url).toStdString();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가할 필요가 있다는 것을 기억하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;QT       += network
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;QT 프로젝트 구성으로 코드를 컴파일합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/389069/programmatically-reading-a-web-page&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/547</guid>
      <comments>https://shortcode.tistory.com/547#entry547comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:15:06 +0900</pubDate>
    </item>
    <item>
      <title>Encoding과 Coloration의 차이점은 무엇입니까?</title>
      <link>https://shortcode.tistory.com/546</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Encoding과 Coloration의 차이점은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 몇몇 질문들과 관련된 버그들을 보았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;encoding&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;collation&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 방문객들 중 누구라도 그 차이를 설명해 줄 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;영역?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인코딩은 사용된 문자 집합을 나타냅니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정렬순서는 정렬순서를 결정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조: http://dev.mysql.com/doc/refman/5.5/en/charset-general.html&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 &lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/95048/what-is-the-difference-between-collation-and-character-set&quot; papago-id=&quot;8-1&quot;&gt;프로그래머들&lt;/a&gt;한테 좋은 답이 있습니다&lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/95048/what-is-the-difference-between-collation-and-character-set&quot; papago-id=&quot;8-1&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/95048/what-is-the-difference-between-collation-and-character-set&quot; papago-id=&quot;8-1&quot;&gt;SE&lt;/a&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대조는 비교 연산자의 동작을 정의합니다: =, &amp;gt;, &amp;lt;, &amp;lt;=, &amp;gt;=...&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음이 인코딩에 대한 더 나은 정의라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인코딩은 숫자 목록을 이진법으로 변환하여 디스크에 저장하는 알고리즘입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 UTF-8은 다음과 같이 숫자열 1, 2, 3, 4를 번역합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;“00000001 00000010 00000011 00000100″.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출처 :&lt;a href=&quot;http://www.calipus.com/blog/what-is-the-difference-between-character-sets-encoding-collations/&quot; rel=&quot;nofollow&quot; papago-id=&quot;12-1&quot;&gt; &lt;/a&gt;http://www.calipus.com/blog/what-is-the-difference-between-character-sets-encoding-collations/&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/7723648/difference-between-encoding-and-collation&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/546</guid>
      <comments>https://shortcode.tistory.com/546#entry546comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:14:36 +0900</pubDate>
    </item>
    <item>
      <title>moment.js를 사용하여 날짜를 &amp;quot;MM/dd/yyyyy&amp;quot; 문자열로 변환</title>
      <link>https://shortcode.tistory.com/545</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;moment.js를 사용하여 날짜를 &quot;MM/dd/yyyyy&quot; 문자열로 변환&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery datepicker에서 날짜 값을 가져와야 제대로 된 ajax post를 할 수 있도록 string format &quot;MM/dd/yyyy&quot;로 바꿔야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지가 로드될 때 또는 날짜 선택기를 변경할 때 jquery ajax 호출이 이루어집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 가지고 있는 코드는 다음과.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var sTimestamp =
moment($(&quot;#start_ts&quot;).datepicker(&quot;getDate&quot;)).format(&quot;MM/dd/yyyy&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 &quot;MM/dd/yyyyyy&quot;로 바뀌지는 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 피들러를 사용하여 전선 아래로 전송된 것을 확인할 때, 이것은 몸통입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;startTimestamp=03%2FTh%2Fyyyy&amp;amp;endTimestamp=03%2FTh%2Fyyyy&amp;amp;pageSize=50&amp;amp;pageNum=0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Fiddler에서 작곡을 사용하고 본문을 다음으로 변경하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;startTimestamp=03/13/2013&amp;amp;endTimestamp=03/14/2013&amp;amp;pageSize=50&amp;amp;pageNum=0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제대로 된 답변을 받았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면, 제 질문은 moment.js를 사용하여 날짜 객체를 가져와서 문자열 &quot;MM/dd/yyyy&quot;로 포맷하는 방법이 있을까요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 데이트 상대에게 날짜를 받는 방법이 잘못된 건가요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그건 그렇고, 저는 datepicker.getDate가 jQuery 문서에서 알려주는 것이기 때문에 date 개체를 반환한다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;StartDate = moment(StartDate).format('MM-YYYY');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;...및 MySQL 날짜 형식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;StartDate = moment(StartDate).format('YYYY-MM-DD');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포맷 문자열에 케이스가 잘못 들어간 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서에 따르면 다음과 같은 효과가 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MM/DD/YYYY&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://momentjs.com/docs/#/displaying/format/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;moment.js 문서&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;date.format(&quot;MM/DD/YYYY&quot;) 또는 date.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;형식(&quot;MM-DD-YYYY&quot;)}&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고로 지원되는 기타 형식:&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;월:&lt;/font&gt;&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;15-0&quot;&gt;M&lt;/strong&gt; 12 ... 11 12&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-0&quot;&gt;모&lt;/strong&gt; 1일 2일 11일 12일&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;17-0&quot;&gt;MM&lt;/strong&gt; 01 02 ... 11 12&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;18-0&quot;&gt;MMM&lt;/strong&gt; Jan Feb...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;11월 12일&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;19-0&quot;&gt;MMMM&lt;/strong&gt; 1월 2월...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;11월12월&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2 papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일:&lt;/font&gt;&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;21-0&quot;&gt;d&lt;/strong&gt; 01 ... 56&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;22-0&quot;&gt;0번째&lt;/strong&gt; 1번째...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;5일 6일&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;23-0&quot;&gt;Su&lt;/strong&gt; Mo 추가...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Fr Sa&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;24-0&quot;&gt;ddd&lt;/strong&gt; Sun Mon...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프리샛&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;25-0&quot;&gt;ddd&lt;/strong&gt; 일요일 월요일...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;금요일 토요일&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2 papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연도:&lt;/font&gt;&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;27-0&quot;&gt;YY7071&lt;/strong&gt; ... 2930&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;28-0&quot;&gt;YYYY19701971&lt;/strong&gt;...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;2029 2030&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;29-0&quot;&gt;1970년1971년&lt;/strong&gt;...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;9999 +10000 +10001&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;.format('MM/DD/YYYY HH:mm:ss')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var momentObj = $(&quot;#start_ts&quot;).datepicker(&quot;getDate&quot;);

var yourDate = momentObj.format('L');
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/15411833/using-moment-js-to-convert-date-to-string-mm-dd-yyyy&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/545</guid>
      <comments>https://shortcode.tistory.com/545#entry545comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:12:49 +0900</pubDate>
    </item>
    <item>
      <title>SELECT에 sql%rowcount를 사용할 수 있습니까?</title>
      <link>https://shortcode.tistory.com/544</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SELECT에 sql%rowcount를 사용할 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 코드는 하나 이상의 행을 반환할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 것이다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sql%rowcount&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가져온 행 수를 반환하시겠습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from emp where empname = 'Justin' and dept='IT'
if sql%rowcount&amp;gt;0
    ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 제 샘플 절차입니다. 제가 사용하고 있는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sql%rowcount&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확한 방법으로?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE PROCEDURE Procn(in_Hid IN VARCHAR2,outInststatus OUT VARCHAR2,outSockid IN NUMBER,outport OUT VARCHAR2,outIP OUT VARCHAR2,outretvalue OUT NUMBER)
AS
BEGIN
select INST_STATUS into outInststatus from TINST_child where INST_ID = in_Hid and INST_STATUS = 'Y';
if outInststatus = 'Y' then 
     select PORT_NUMBER,STATIC_IP into outport,outIP from TINST where INST_ID = in_Hid and IP_PORT_STATUS = 'Y';
    if sql%rowcount &amp;gt;= 1 then
       select SOCK_ID into outSockid from TINST where PORT_NUMBER = outport AND STATIC_IP = outIP;  
       outretvalue := 0;
    else
       outretvalue := -12;
    end if;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
   outretvalue := -13;
end if;
END;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예, 사용 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SQL%ROWCOUNT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. PL/SQL에서 유효합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 PL/SQL에서 쿼리 결과는 PL/SQL 테이블과 같은 곳으로 이동해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PL/SQL은 결과를 &lt;em papago-id=&quot;6-1&quot;&gt;출력&lt;/em&gt;(단말기, 윈도우 등)으로 절대 전송하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT * FROM&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안 될 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DECLARE
  TYPE emp_t ...;
  emp_tab emp_t;

BEGIN
  SELECT *
  BULK COLLECT INTO emp_tab
  FROM emp
  WHERE empname = 'Justin' AND dept='IT';

  IF sql%rowcount &amp;gt; 0 THEN
    .. do something ...
  END IF;
END;
/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;10-0&quot;&gt;업데이트&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트된 질문은 다른 것을 찾고 있음을 나타냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 1: 예외 사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;0개의 행이 있거나 1개 이상의 행이 있는 경우, 이러한 경우는 별도로(오류로) 처리됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;BEGIN
  select PORT_NUMBER,STATIC_IP into outport, outIP
  from TINST
  where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    outretvalue := -12;
    RETURN;

  WHEN TOO_MANY_ROWS THEN
    outretvalue := -13;
    RETURN;
END;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 2: 집계 사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;집계를 사용하면 쿼리는 항상 한 행만 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 소스 행이 WHERE 절과 일치하면 두 결과 값이 모두 NULL이 되고, WHERE 절이 둘 이상의 행과 일치하면 최대값이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 쿼리는 원래 같은 행에 없었던 포트 번호와 IP 주소를 반환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select MAX(PORT_NUMBER), MAX(STATIC_IP) into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';

IF outport IS NULL OR outIP IS NULL THEN
    outretvalue := -12;
    RETURN;
END IF;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 3: ROWNUM 사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 쿼리는 최대 한 행을 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WHERE 절과 일치하는 행이 없으면 예외가 발생하여 다음을 처리해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;BEGIN
  select PORT_NUMBER, STATIC_IP into outport, outIP
  from TINST
  where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y'
  AND ROWNUM = 1;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    outretvalue := -12;
    RETURN;

END;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 의견에 근거하여&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 'select' 쿼리가 두 개 이상의 행을 반환하는 경우 첫 번째 행을 가져가서 처리하고자 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;... 이것은 효과가 있을 것입니다. 하지만 아마도 당신이 '첫 번째 것'이 무엇을 의미하는지 정의하지 않았기 때문에 당신의 기대만큼은 아닐 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE PROCEDURE Procn(in_Hid IN VARCHAR2, outInststatus OUT VARCHAR2,
    outSockid IN NUMBER, outport OUT VARCHAR2, outIP OUT VARCHAR2,
    outretvalue OUT NUMBER)
AS
BEGIN
    select INST_STATUS into outInststatus
    from TINST_child
    where INST_ID = in_Hid and INST_STATUS = 'Y';

    -- no need to check if outInstatus is Y, that's all it can be here

    -- restricting with `rownum` means you'll get at most one row, so you will
    -- not get too_many_rows. But it will be an arbitrary row - you have no
    -- criteria to determine which of the multiple rows you want. And you can
    -- still get no_data_found which will go to the same exception and set -12
    select PORT_NUMBER, STATIC_IP into outport, outIP
    from TINST
    where INST_ID = in_Hid and IP_PORT_STATUS = 'Y'
    and rownum &amp;lt; 2;

    -- no need to check sql%rowcount; it can only be 1 here

    -- not clear if this can return multiple rows too, and what should happen
    -- if it can; could use rownum restriction but with the same caveats
    select SOCK_ID into outSockid
    from TINST
    where PORT_NUMBER = outport AND STATIC_IP = outIP;   

    outretvalue := 0;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        outretvalue := -12;
END;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;exception&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;핸들러는 전체 &lt;a href=&quot;http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/overview.htm#i8859&quot; rel=&quot;nofollow&quot; papago-id=&quot;9-1&quot;&gt;블록&lt;/a&gt;에 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그 중에 하나라도&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;행을 찾을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;no_data_found&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예외는 해당 블록에서 처리되며 설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;outretvalue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-12&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 걸 원하신다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;outretvalue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일별로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 각각의 예외 처리 섹션이 있는 하위 블록으로 감쌀 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE PROCEDURE Procn(in_Hid IN VARCHAR2, outInststatus OUT VARCHAR2,
    outSockid IN NUMBER, outport OUT VARCHAR2, outIP OUT VARCHAR2,
    outretvalue OUT NUMBER)
AS
BEGIN
    BEGIN
        select INST_STATUS into outInststatus
        from TINST_child
        where INST_ID = in_Hid and INST_STATUS = 'Y';
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            outretvalue := -12;
    END;

    BEGIN
        select PORT_NUMBER, STATIC_IP into outport, outIP
        from TINST
        where INST_ID = in_Hid and IP_PORT_STATUS = 'Y'
        and rownum &amp;lt; 2;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            outretvalue := -13;
    END;

    BEGIN
        select SOCK_ID into outSockid
        from TINST
        where PORT_NUMBER = outport AND STATIC_IP = outIP;   
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            outretvalue := -14;
    END;

    outretvalue := 0;
END;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전화를 건 사람이 어떤 것이 필요한지 알아야 하는 경우에만 그렇게 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실패했고, 만일 당신이 그들 중 어떤 것도 정말로 실패할 것이라고 전혀 예상하지 않는다면, 아마도 예외를 전혀 잡지 않고 전화를 건 사람에게 생방송을 보게 하는 것이 더 일반적일 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;no_data_found&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 해야할지 결정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예외 조건이 사용자와 응용프로그램에 어떤 의미를 갖는지에 따라 달라집니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/13395131/is-it-possible-to-use-sqlrowcount-for-select&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/544</guid>
      <comments>https://shortcode.tistory.com/544#entry544comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:12:02 +0900</pubDate>
    </item>
    <item>
      <title>특정 쿠폰을 사용하는 WooCommerce 주문 목록을 검색하는 방법은?</title>
      <link>https://shortcode.tistory.com/543</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 쿠폰을 사용하는 WooCommerce 주문 목록을 검색하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지정된 쿠폰 코드를 사용하고 날짜 범위가 지정된 WooCommerce 주문 목록을 검색한 후 해당 주문에 적용된 할인 총액을 합산하는 기능을 작성하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구글 검색을 조금 하고 나니 뭔가를 사용해야 할 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$customer_orders = get_posts( array(
    'numberposts' =&amp;gt; -1,
    'meta_key'    =&amp;gt; ???,
    'meta_value'  =&amp;gt; $CouponToSearchFor,
    'post_type'   =&amp;gt; wc_get_order_types(),
    'post_status' =&amp;gt; array_keys( wc_get_order_statuses() ),
) ); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 봤습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'meta_key' =&amp;gt; 'coupon'
'meta_key' =&amp;gt; 'shop_coupon'
'meta_key' =&amp;gt; '_coupon'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그 중 아무 것도 작동하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 것이 어떤 것인지 어떻게 알 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;meta_key&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;code&gt;meta_value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건이 내게 필요한 것을 줄 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가적으로 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;meta_query&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;날짜 필터링을 수행하는 데 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;get_posts()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리, 맞습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 WooCommerce에서 사용한 쿠폰 코드를 저장하지 않기 때문에 코드가 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp_postmeta&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블. 저장합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp_woocommerce_order_items&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블, 아래 및 아래.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 주문 ID를 모두 받은 다음 원하는 합계 또는 세금 또는 할인을 받으려면 이 ID를 루프해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function wh_getOrderbyCouponCode($coupon_code, $start_date, $end_date) {
    global $wpdb;
    $return_array = [];
    $total_discount = 0;

    $query = &quot;SELECT
        p.ID AS order_id
        FROM
        {$wpdb-&amp;gt;prefix}posts AS p
        INNER JOIN {$wpdb-&amp;gt;prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
        WHERE
        p.post_type = 'shop_order' AND
        p.post_status IN ('&quot; . implode(&quot;','&quot;, array_keys(wc_get_order_statuses())) . &quot;') AND
        woi.order_item_type = 'coupon' AND
        woi.order_item_name = '&quot; . $coupon_code . &quot;' AND
        DATE(p.post_date) BETWEEN '&quot; . $start_date . &quot;' AND '&quot; . $end_date . &quot;';&quot;;

    $orders = $wpdb-&amp;gt;get_results($query);

    if (!empty($orders)) {
        $dp = ( isset($filter['dp']) ? intval($filter['dp']) : 2 );
        //looping throught all the order_id
        foreach ($orders as $key =&amp;gt; $order) {
            $order_id = $order-&amp;gt;order_id;
            //getting order object
            $objOrder = wc_get_order($order_id);

            $return_array[$key]['order_id'] = $order_id;
            $return_array[$key]['total'] = wc_format_decimal($objOrder-&amp;gt;get_total(), $dp);
            $return_array[$key]['total_discount'] = wc_format_decimal($objOrder-&amp;gt;get_total_discount(), $dp);
            $total_discount += $return_array[$key]['total_discount'];
        }
//        echo '&amp;lt;pre&amp;gt;';
//        print_r($return_array);
    }
    $return_array['full_discount'] = $total_discount;
    return $return_array;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드가 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;활성 하위 테마(또는 테마)의 php 파일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 플러그인 php 파일에서도 마찬가지입니다.&lt;/font&gt;&lt;/em&gt; &lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$orders = wh_getOrderbyCouponCode('my_code', '2016-09-17', '2016-10-07');
echo 'Total Discount : ' . $orders['full_discount'];
//print_r($orders);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 날짜가 안에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;YYYY-MM-DD&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;체재를 갖추다&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;print_r(array_keys(wc_get_order_statuses()));&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 다음과 같은 것을 출력할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Array
(
    [0] =&amp;gt; wc-pending
    [1] =&amp;gt; wc-processing
    [4] =&amp;gt; wc-on-hold
    [5] =&amp;gt; wc-completed
    [6] =&amp;gt; wc-cancelled
    [7] =&amp;gt; wc-refunded
    [8] =&amp;gt; wc-failed
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 테스트하고 작동합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/42769306/how-to-retrieve-a-list-of-woocommerce-orders-which-use-a-particular-coupon&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/543</guid>
      <comments>https://shortcode.tistory.com/543#entry543comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:11:29 +0900</pubDate>
    </item>
    <item>
      <title>인코딩 / 디코딩.EXE를 베이스64로</title>
      <link>https://shortcode.tistory.com/542</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인코딩 / 디코딩.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE를 베이스64로&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NETexe 파일을 Base-64 문자열로 인코딩한 다음 나중에 Powershell을 사용하여 Base64 문자열에서 .exe 파일로 디코딩합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 &lt;strong papago-id=&quot;2-1&quot;&gt;.exe 파일을 생성&lt;/strong&gt;한 것은 실행할 수 있는 응용 프로그램으로 윈도우에 인식할 수 없고 항상 인코딩 스크립트에 전달하는 파일과 길이가 다릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 여기서 잘못된 인코딩을 사용하고 있는 것 같은데 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트 인코딩:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Function Get-FileName($initialDirectory)
{   
 [System.Reflection.Assembly]::LoadWithPartialName(&quot;System.windows.forms&quot;) | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = &quot;All files (*.*)| *.*&quot;
$OpenFileDialog.ShowDialog() | Out-Null
$FileName = $OpenFileDialog.filename
$FileName

} #end function Get-FileName

$FileName = Get-FileName

$Data = get-content $FileName
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Data)
$EncodedData = [Convert]::ToBase64String($Bytes)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트 해독:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$Data = get-content $FileName
$Bytes = [System.Text.Encoding]::UTF8.GetBytes($Data)
$EncodedData = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($Bytes))

$EncodedData | Out-File ( $FileName )
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제의 원인은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;code&gt;Get-Content&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;없이.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-raw&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 줄 배열로 분할하여 코드를 파괴합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Text.Encoding&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이진 코드를 텍스트로 해석하여 코드를 파괴합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Out-File&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이진 코드가 아닌 텍스트 데이터용입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;올바른 접근법은 IO를 사용하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 읽기모든 &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.io.file.readallbytes(v=vs.110).aspx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-1&quot;&gt;바이트&lt;/a&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해독할 모든 &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes(v=vs.110).aspx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;바이트&lt;/a&gt; 기록:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비슷한 일을 하고 싶어하는 사람들을 위해 대안을 추가하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;윈도우는 다음과 함께 제공됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;certutil.exe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(인증서를 조작하는 도구) 파일을 64로 인코딩하고 디코딩할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;certutil -encode test.exe test.txt
certutil -decode test.txt test.exe
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 Swonkie의 순수한 PowerShell 버전의 답변으로, 유틸리티에 액세스할 수 있는 경우에는 잘 작동하지만 PowerShell 답변이 아닙니다. 이것이 제가 필요로 했던 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$SourceFile    = &quot;C:\Src\OriginalBinaryFile.dll&quot;
$B64File       = &quot;C:\Src\DllAsB64.txt&quot;
$Reconstituted = &quot;C:\Src\ReConstituted.dll&quot;

[IO.File]::WriteAllBytes($B64File,[char[]][Convert]::ToBase64String([IO.File]::ReadAllBytes($SourceFile)))

[IO.File]::WriteAllBytes($Reconstituted, [Convert]::FromBase64String([char[]][IO.File]::ReadAllBytes($B64File)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고로.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DllAsB64.txt를 특정 줄로 만든 경우 이 줄로 래핑됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;------- 인증서 시작-------&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-----------------------------&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 PowerShell 명령은 이러한 라인을 제거한 후 디코딩합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Certutil은 이들을 무시하므로 자체 출력 또는 PowerShell 출력을 디코딩합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/42592518/encode-decode-exe-into-base64&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/542</guid>
      <comments>https://shortcode.tistory.com/542#entry542comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:08:27 +0900</pubDate>
    </item>
    <item>
      <title>C 프로그램을 최적화하기 위해 어떤 코딩 기법을 사용합니까?</title>
      <link>https://shortcode.tistory.com/541</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 프로그램을 최적화하기 위해 어떤 코딩 기법을 사용합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item mr8&quot;&gt; 
     &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
      &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
     &lt;/svg&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 상태로는 이 질문은 우리의 Q&amp;amp;A 형식에 맞지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 참고 자료 또는 전문 지식에 의해 답변이 뒷받침되기를 기대하지만, 이 질문은 토론, 주장, 여론 조사 또는 토론을 요청할 가능성이 높습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 이 질문이 개선되고 다시 열릴 수 있다고 생각한다면,&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;안내&lt;/a&gt;를 받기 위해 헬프 &lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;센터를 방문&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;      &lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;닫힘&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;2-1&quot; title=&quot;2012-05-05 13:37:18Z&quot; papago-attr-id=&quot;1&quot;&gt;11년 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
   &lt;p class=&quot;mb0 mt12&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커뮤니티는 &lt;span class=&quot;relativetime&quot; papago-id=&quot;3-1&quot; title=&quot;2023-05-14 23:35:25Z&quot; papago-attr-id=&quot;2&quot;&gt;4개월 전&lt;/span&gt; 이 질문을 재개할 것인지 검토하고 비공개로 했습니다.&lt;/font&gt;&lt;/p&gt; 
   &lt;blockquote class=&quot;mb0 mt12&quot;&gt; 
    &lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원래 근접 사유가 해결되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
   &lt;/blockquote&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 년 전에 저는 비교적 고위급 임베디드 C 프로그래머 자리의 후보자들을 인터뷰하는 패널에 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 질문한 표준 질문 중 하나는 최적화 기술에 관한 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;후보자들 중에 답이 없는 분들이 계셔서 상당히 놀랐습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 후세를 위한 목록을 작성하기 위해 C 프로그램을 최적화할 때 보통 어떤 기술과 구성을 사용합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속도와 크기에 대한 최적화에 대한 답변이 모두 수락되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 일은 - 너무 일찍 최적화하지 마세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 덩어리를 신중하게 최적화하는 데 시간을 들이는 것은 드물지 않은 일입니다. 하지만 이 코드는 자신이 생각했던 병목 현상이 아니라는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 다른 말로 하면 &quot;빨리 만들기 전에, 잘 되게 하라&quot;는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 최적화하기 전에 알고리즘을 최적화할 수 있는 옵션이 있는지 조사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 최적화하는 것보다 불량한 알고리즘을 최적화함으로써 성능 향상을 찾는 것이 더 쉬울 것입니다. 알고리즘을 변경할 때 폐기해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선 최적화해야 하는 이유를 생각해 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무엇을 이루고자 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 어떤 이벤트에 대한 응답 시간을 개선하기 위해 시간이 중요한 영역을 최소화하기 위해 실행 순서를 변경할 수 있는 기회가 있다면 해결합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 어떤 외부 인터럽트에 대한 대응을 개선하려고 할 때, 사건 사이의 데드 타임에 어떤 준비를 할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 최적화해야 한다고 결정했으면 어느 비트를 최적화하시겠습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일러를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 자주 사용하는 부분에 관심을 집중합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 그 부분에 대해 어떻게 할 수 있겠습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상태 점검 최소화&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건(예: 루프에 대한 종료 조건)을 확인하는 것은 실제 처리에 소비되지 않는 시간입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프 언롤링과 같은 기술로 상태 점검을 최소화할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 상황에서는 기능 포인터를 사용하여 조건 점검을 제거할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 상태 머신을 구현하는 경우 개별 상태에 대한 핸들러를 작은 함수로 구현하고(프로토타입이 균일한) 다음 핸들러의 함수 포인터를 저장하여 &quot;다음 상태&quot;를 저장하는 것이 개별 상태에 구현된 핸들러 코드가 있는 큰 스위치 문을 사용하는 것보다 더 효율적이라는 것을 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사건 진술서&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;YMMV.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능 호출을 최소화합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 호출은 일반적으로 상황 저장(예: 레지스터에 포함된 로컬 변수를 스택에 기록하고 스택 포인터를 저장하는 등) 부담을 가지므로 호출하지 않아도 시간이 절약됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(공간이 아닌 속도에 최적화하는 경우) 한 가지 옵션은 인라인 기능을 사용하는 것입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 호출이 불가피한 경우 함수로 전달되는 데이터를 최소화합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 포인터를 통과하는 것이 구조를 통과하는 것보다 더 효율적일 가능성이 높습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속도를 최적화할 때 플랫폼에 적합한 기본 크기의 데이터 유형을 선택합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 32비트 프로세서에서는 8비트 또는 16비트 값보다 32비트 값을 조작하는 것이 더 효율적일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(측면 참고 - 컴파일러가 사용자가 생각하는 대로 수행하고 있는지 확인할 필요가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러가 8비트 값에 대해 16비트 산술을 수행할 것을 고집하는 상황이 발생했습니다. 모든 변환 및 변환을 함께 수행합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미리 계산할 수 있는 데이터를 찾고 초기화 중에 계산하거나 컴파일 시에 계산하는 것이 더 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 CRC를 구현할 때 크기에는 좋지만 성능에는 문제가 있는 다항식을 직접 사용하여 CRC 값을 즉시 계산하거나, 크기에 비해 훨씬 빠른 구현인 모든 중간 값의 표를 생성할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 현지화합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 덩어리를 자주 조작하는 경우, 프로세서는 데이터를 모두 캐시에 저장함으로써 속도를 높일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 컴파일러는 보다 현지화된 데이터에 적합한 더 짧은 명령어(예: 32비트 대신 8비트 오프셋을 사용하는 명령어)를 사용할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;같은 맥락에서 기능을 현지화합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;같은 이유로.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수행 중인 작업에 대해 가정할 수 있는 사항을 파악하고 이를 활용할 수 있는 방법을 찾을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 8비트 플랫폼에서 32비트 값에 대해 수행하는 유일한 연산이 증분일 경우 일반 산술 연산을 사용하는 대신 이 목적을 위해 특별히 인라인을 사용(또는 매크로를 생성)함으로써 컴파일러보다 더 잘 수행할 수 있음을 발견할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값비싼 지시를 피하세요. 분할이 대표적인 예입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;register&quot; 키워드는 여러분의 친구가 될 수 있습니다(비록 여러분의 컴파일러가 여러분의 레지스터 사용법에 대해 꽤 좋은 아이디어를 가지고 있기를 바랍니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;register&quot;를 사용하려면 먼저 &quot;register&quot;할 지역 변수를 선언해야 할 가능성이 높습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 유형과 일치해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 유형(예: 단축 및 int, 중복 및 float)의 혼합에 대해 산술을 수행하는 경우 컴파일러는 각 불일치에 대해 암시적 유형 변환을 추가하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 불필요할 수도 있는 낭비된 CPU 사이클입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에 나열된 대부분의 옵션은 나쁜 영향 없이 정상적인 업무 수행의 일부로 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 최고의 성능을 발휘하고자 한다면: - 오류 검사를 (안전하게) 비활성화할 수 있는 부분을 조사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;권장되지는 않지만, 공간과 주기를 절약할 수 있습니다. - 코드의 일부를 어셈블러에서 수작업으로 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 물론 코드를 더 이상 휴대할 수 없음을 의미하지만 문제가 아닌 경우에는 여기에서 비용을 절감할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 마음대로 사용할 수 있는 레지스터로 데이터를 이동하는 데 시간이 걸릴 수 있습니다(즉, 컴파일러의 레지스터 사용을 충족하기 위해).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 컴파일러가 자체적으로 꽤 잘 수행해야 한다는 것을 유의하십시오. (물론 예외도 있습니다.)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 사람들이 말했듯이 &lt;strong papago-id=&quot;27-1&quot;&gt;프로파일, 프로파일 프로파일입니다.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 기술에 관해서는 아직 언급되지 않은 것으로 생각됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;29-0&quot;&gt;핫&amp;amp;콜드 데이터 분리&lt;/strong&gt;:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CPU의 캐시 내에서 유지하는 것은 &lt;strong papago-id=&quot;29-2&quot;&gt;매우 중요합니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 구조를 자주 액세스하는(&quot;핫&quot;) 섹션과 거의 액세스하지 않는(&quot;콜드&quot;) 섹션으로 나누는 것이 이를 지원하는 한 가지 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 고객을 위한 구조가 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct Customer
{
    int ID;
    int AccountNumber;
    char Name[128];
    char Address[256];
};

Customer customers[1000];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 ID와 계정 번호에 많이 액세스하고 이름과 주소는 많이 액세스하고 싶지 않다고 가정해 보겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 할 일은 그것을 둘로 나누는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct CustomerAccount
{
    int ID;
    int AccountNumber;
    CustomerData *pData;
};

struct CustomerData
{
    char Name[128];
    char Address[256];
};

CustomerAccount customers[1000];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이와 같이 &quot;고객&quot; 어레이를 루프로 이동할 때 각 엔트리는 12바이트에 불과하므로 캐시에 더 많은 엔트리를 넣을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;렌더링 엔진의 내부 루프와 같은 상황에 적용할 수 있다면 이는 큰 성공이 될 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 좋아하는 기술은 좋은 프로파일러를 사용하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;병목 현상이 어디에 있는지 알려주는 좋은 프로필이 없다면 어떤 속임수와 기술도 도움이 되지 않을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 접했던 가장 일반적인 기술은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고리풀기&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 캐시 프리페치를 위한 루프 최적화(즉, NxM 단일 작업 대신 M 사이클의 N 작업 수행)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 정렬&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인라인 함수&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;손으로 만든 아스미 토막글&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 권장 사항에 관해서는 대부분 이미 소리가 들립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 좋은 알고리즘을 고르다&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일러를 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능이 20~30% 향상되지 않으면 최적화하지 않음&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저수준 최적화의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;fmpeg(모든 코드 측정을 위한 클럭 레벨 정확도)에서 START_TIMER/STOP_TIMER 매크로.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일링은 물론 프로파일링도 가능합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;엄청난 양의 손으로 코딩된 어셈블리(x264의 /common/x86 디렉토리에서 wc-l을 수행한 다음 대부분의 코드가 템플릿으로 작성되었다는 것을 기억하십시오).&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 신중하게 코딩합니다. 일반적으로 짧은 코드가 더 좋습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;영리한 하위 수준 알고리즘입니다. 제가 쓴 64비트 비트스트림 라이터처럼 if 한 개만 사용하고 if는 사용하지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://x264dev.multimedia.cx/?p=32&quot; papago-id=&quot;50-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;명시적&lt;/a&gt; 쓰기 &lt;a href=&quot;http://x264dev.multimedia.cx/?p=32&quot; papago-id=&quot;50-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;결합&lt;/a&gt;.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://x264dev.multimedia.cx/?p=8&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;51-1&quot;&gt;인텔의 캐시라인 분할 문제&lt;/a&gt;와 같은 프로세서의 중요한 이상한 측면을 고려하는 것입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조기 종료 점검 비용이 이를 통해 얻는 속도보다 훨씬 적은 손실 또는 거의 손실 없이 조기 종료할 수 있는 경우를 찾습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중앙값 계산과 같이 x86 SIMD 장치에 훨씬 더 적합한 작업을 위한 실제로 인라인 어셈블리(MMX 지원을 위해 컴파일 시간 확인 필요).&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;ul&gt; 
 &lt;li papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선, 더 나은/더 빠른 알고리즘을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설계상 느린 코드를 최적화하는 점은 없습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속도 최적화 시 메모리를 속도와 맞바꾸세요: 사전 계산된 값의 룩업 테이블, 바이너리 트리, 시스템 호출의 보다 빠른 맞춤형 구현...&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리 거래 속도: 인메모리 압축 사용&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;힙을 사용하지 않도록 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;크기가 동일한 개체에는 obstack 또는 pool-allocator를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;수명이 짧은 작은 것들을 스택에 올려놓습니다. alloca는 여전히 존재합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 악의 근원은 성숙기에 최적화하는 것입니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;;)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션은 설계상 CPU 시간이 많이 필요하지 않기 때문에 디스크와 메모리의 이진 파일 크기에 초점을 맞춥니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 주로 하는 일은 정적 크기의 어레이를 찾고 동적으로 할당된 메모리로 교체하는 것입니다. 나중에 메모리를 확보하는 데 추가적인 노력을 기울일 가치가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이너리의 크기를 줄이기 위해 컴파일 타임에 초기화되는 큰 배열을 찾고 초기화를 런타임으로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char buf[1024] = { 0, };
/* becomes: */
char buf[1024];
memset(buf, 0, sizeof(buf));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 바이너리에서 1024개의 제로 바이트가 제거됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DATA 섹션은 대신 런타임에 스택에 버퍼를 생성하고 0으로 채웁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: 네, 그리고 저는 물건을 현금화하는 것을 좋아합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C가 특정한 것은 아니지만 캐싱하는 것에 따라 성능이 크게 향상될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신: 리스트가 완성되면 알려주세요, 매우 궁금합니다. ;)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능하면 임의의 숫자가 아닌 0과 비교하고, 특히 루프에서는 0과 비교합니다. 0과 비교하는 것은 별도의 빠른 어셈블러 명령으로 구현되는 경우가 많기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 가능하다면 쓰기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (i=n; i!=0; --i) { ... }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (i=0; i!=n; ++i) { ... }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급되지 않은 또 다른 것:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;귀사의 요구사항을 파악하십시오. 발생 가능성이 없거나 발생할 수 없는 상황에 최적화하지 말고, 최대한의 비용 절감에 집중하십시오.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본/일반:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 없을 때는 최적화하지 마십시오.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플랫폼/CPU 파악...&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;...철저하게 알고 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 ABI를 알고있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러가 최적화 작업을 하도록 내버려 두시오.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 도움이 된 몇 가지 사항:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크기/메모리 옵션:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bool 저장에 비트 필드 사용&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;큰 전역 배열을 유니언과 중첩하여 재사용(주의)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속도 선택(주의):&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능한 경우 미리 계산된 테이블 사용&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중요한 기능/데이터를 빠른 메모리에 저장&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자주 사용하는 글로벌용 전용 레지스터 사용&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;0까지 카운트, 0 플래그는 무료입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요약하기 어려운...&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 구조:&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 사례에 따라 데이터 구조를 분할하는 것은 매우 중요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;플로우 컨트롤을 기반으로 접근하는 데이터를 보유하는 구조가 일반적입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 상황은 캐시 사용량을 크게 줄일 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시 라인 크기 및 프리페치 규칙을 고려합니다.&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구조의 구성원을 순서를 바꾸어서 코드에서 순차적으로 액세스하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;알고리즘:&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제에 대해 생각하고 올바른 알고리즘을 찾는 시간을 갖습니다.&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선택한 알고리즘의 한계를 알고 있습니다(10개의 요소를 정렬하는 radix-sort/quick-sort는 최선의 선택이 아닐 수 있습니다).&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로우 레벨:&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 프로세서의 경우 본체가 작은 루프는 롤을 풀지 않는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로세서는 이를 위한 자체 감지 메커니즘을 제공하며 파이프라인의 전체 섹션을 단락시킵니다.&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HW 프리페처를 신뢰합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 데이터 구조가 잘 설계되어 있다면 ;)&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;L2 캐시 라인 미스에 신경을 씁니다.&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로세서가 코어당 캐시를 더 작게 유지하기 때문에 애플리케이션의 로컬 작업 세트를 최대한 줄이십시오(C2D는 코어당 최대 3MB를 즐겼으며, iCore7은 코어당 최대 256KB + 쿼드 코어 다이의 경우 모든 코어에 공유 8MB를 제공합니다).&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무엇보다 중요한 것은: 일찍 측정하고, 자주 측정하고, 절대로 가정하지 않으며, 프로파일러가 검색한 데이터를 기반으로 사고와 최적화를 수행합니다(&lt;a href=&quot;http://softwarecommunity.intel.com/articles/eng/1437.htm&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;96-1&quot;&gt;PTU&lt;/a&gt;를 사용하십시오).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;97&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 힌트는 성능이 애플리케이션 성공의 핵심이며 설계 시 고려해야 하며 명확한 성능 목표를 가져야 한다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;98&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 완전한 것과는 거리가 멀지만 흥미로운 근거를 제공해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;99&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘날 최적화에서 가장 중요한 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시 존중 - 단순한 패턴으로 메모리에 접근하고, 재미로 루프를 풀지 않도록 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포인터 추적이 많은 데이터 구조 대신 배열을 사용하면 적은 양의 데이터를 사용하는 것이 더 빠를 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 너무 큰 것은 만들지 마세요.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지연 방지 - 다른 계산이 즉시 필요한 경우 분할 등을 방지합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 메모리 액세스(즉, a[b[c])에 의존하는 메모리 액세스는 좋지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예측 불가능성 방지 - 예측 불가능한 조건 또는 지연 시간이 더 많이 발생하는 조건을 가진 많은 if/else는 여러분을 정말 엉망으로 만들 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 유용한 수많은 분기 없는 수학 트릭이 있지만 지연 시간을 늘리고 필요한 경우에만 유용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 단순한 코드를 작성하고 미친 루프 조건을 갖지 마십시오.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 복사하여 붙여넣기(예: 루프 언롤링)하거나 루프의 순서를 손으로 다시 정렬하는 등의 최적화 작업에 신경 쓰지 마십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러는 보통 당신보다 이것을 더 잘하지만, 대부분은 그것을 되돌릴 만큼 똑똑하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 실행 프로파일을 수집하면 50%의 효과를 얻을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지 50%는 이러한 보고서를 분석하는 것을 다루고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 GCC 또는 VisualC++를 사용하는 경우 컴파일러가 이전 실행에서 정보를 가져온 후 명령을 다시 예약하여 CPU를 더 행복하게 만드는 &quot;profile guided optimization&quot;을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인라인 기능!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 프로파일링 팬들에게 영감을 받아 저는 제 애플리케이션을 프로파일링했고 MP3 프레임에서 비트 시프트를 수행하는 작은 기능을 발견했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션에서 모든 기능 호출의 약 90%를 수행하기 때문에 인라인 및 voila로 만들었습니다. 프로그램은 이전에 사용했던 CPU 시간의 절반을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 임베디드 시스템에서는 프로파일링 도구가 없었기 때문에 프로파일러를 사용하는 것은 좋지만 그다지 실용적이지는 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속도 최적화의 첫 번째 규칙은 - &lt;strong papago-id=&quot;0-1&quot;&gt;중요한 경로를 찾는&lt;/strong&gt; 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보통 이 길은 그리 길지도 않고 그리 복잡하지도 않다는 것을 알게 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 어떻게 최적화하느냐는 여러분이 무엇을 하고 있느냐와 여러분의 능력에 달려 있다고 일반적으로 말하기는 어렵습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 당신이 원하는 것은 보통 중요한 경로에서 memcpy를 피하므로, 당신은 DMA를 사용하거나 최적화할 필요가 있지만, 당신의 hw가 DMA를 가지고 있지 않다면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 만약 다시 쓰지 않는다면 memcpy 구현이 최선인지 확인하세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동적 할당을 내장된 상태에서 전혀 사용하지 마십시오. 그러나 어떤 이유로 동적 할당을 사용하는 경우 중요한 경로에서 수행하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드 우선 순위를 올바르게 구성합니다. 올바른 것은 실제 질문이며 시스템에 따라 다를 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 타임스탬프와 인덱스를 저장하는 병목, 단순 매크로를 분석하기 위해 매우 간단한 도구를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;90%의 사례에서 시간을 보내는 장소를 찾을 수 있는 실행(2-3개)은 거의 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 마지막은 &lt;strong papago-id=&quot;5-1&quot;&gt;코드 리뷰&lt;/strong&gt;는 매우 중요한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 경우 코드 검토 중 성능 문제를 매우 효과적인 방법으로 방지합니다. :)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능을 측정합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현실적이고 사소한 벤치마크를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/archives/000957.html&quot; papago-id=&quot;115-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;&quot;작은 N에게는 모든&lt;/a&gt; 것이 &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000957.html&quot; papago-id=&quot;115-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;빠르다&lt;/a&gt;&quot;는 것을 기억하세요&lt;a href=&quot;http://www.codinghorror.com/blog/archives/000957.html&quot; papago-id=&quot;115-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일러를 사용하여 핫스팟을 찾습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동적 메모리 할당, 디스크 액세스, 데이터베이스 액세스, 네트워크 액세스 및 사용자/커널 전환의 수가 줄어듭니다. 이는 종종 핫스팟이 되기 때문입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;118&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능을 측정합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;119&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 성능을 측정해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;때로는 공간이 더 많은지 아니면 속도가 더 빠른지를 결정해야 하므로 거의 반대의 최적화로 이어질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 공간을 최대한 활용하기 위해 구조물(예: #pragma pack(1))을 포장하고 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ewwyfdbe%28VS.71%29.aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;120-3&quot;&gt;구조물에 비트&lt;/a&gt; 필드를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 빠른 속도를 위해 프로세서 기본 설정에 맞춰 포장하고 비트 필드를 방지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;121&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 방법은 realoc을 통해 어레이를 확장하는 데 적합한 크기 조정 알고리즘을 선택하거나 특정 애플리케이션을 기반으로 자신만의 힙 관리자를 작성하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러와 함께 제공되는 것이 모든 응용 프로그램에 가능한 최선의 해결책이라고 가정하지 마십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;122&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 누군가가 그 질문에 대한 답을 가지고 있지 않다면, 그것은 그들이 많이 알지 못할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;123&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들이 많은 것을 알고 있는 것일 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 많은 것을 알고 있습니다(IMHO :-). 만약 제가 그 질문을 받았다면, 저는 여러분에게 다음과 같이 반문하고 있을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 그게 중요하다고 생각하세요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;124&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 성능에 대한 모든 우선순위 개념이 특정 상황에 의해 정보를 받지 못하면 정의에 의해 추측된다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성과를 위해서는 코딩 기술을 아는 것도 중요하다고 생각하지만, 진단을 통해 문제가 있고 그것이 무엇인지 밝혀지기 전까지는 &lt;strong papago-id=&quot;125-1&quot;&gt;사용&lt;/strong&gt;하지 않는 것을 아는 것이 더욱 중요하다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;126&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 저는 제 자신을 반박하고, 만약 그렇게 한다면, 문제를 야기하는 디자인 접근법을 어떻게 인식해야 하는지를 배울 수 있을 것입니다. 그래서 문제를 피할 수 있고, 초보자에게는 너무 이른 최적화처럼 들립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;127&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구체적인 예를 들어보자면, &lt;a href=&quot;https://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773&quot; papago-id=&quot;127-1&quot;&gt;이것은 최적화&lt;/a&gt;된 C &lt;a href=&quot;https://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773&quot; papago-id=&quot;127-1&quot;&gt;어플리케이션&lt;/a&gt;입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;128&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;멋진 리스트.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위 목록에서 보지 못한 팁을 하나 덧붙여서 어떤 경우에는 최소한의 비용으로 엄청난 최적화를 달성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;129&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이패스 링커&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 당신이  있다면, 은 그냥 이 main.c  lib를 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;c라고 하는 두개의 파일로 나누어진 어떤 애플리케이션을 가지고 있다면, 많은 경우에 당신은 단지 a를 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\#include &quot;lib.c&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 메인에서.c 그것은 완전히 링커를 우회할 것이고 컴파일러를 위한 훨씬 더 효율적인 최적화를 가능하게 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;132&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 간 종속성을 최적화하는 효과는 동일하지만 변경 비용은 일반적으로 더 높습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;133&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;때때로 구글은 최고의 알고리즘 최적화 도구입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 복잡한 문제를 가지고 있을 때, 약간의 검색을 통해 몇몇 박사학위를 가진 사람들이 이것과 잘 알려진 문제 사이의 지도를 찾았고 이미 대부분의 작업을 완료했다는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;134&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 좀 더 효율적인 알고리즘을 사용하여 최적화하는 것을 추천합니다. 그것을 사후적인 생각으로 하지 말고 처음부터 그렇게 코딩하세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러가 대상 프로세서에 대해 당신보다 더 많이 알고 있기 때문에 작은 것들에 대해 상세한 정보를 얻도록 하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;135&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선, 저는 루프를 사용하여 물건을 조회하는 일을 거의 하지 않고, 해시테이블에 항목을 추가한 다음 해시테이블을 사용하여 결과를 조회합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;136&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 조회할 문자열과 가능한 50개의 값이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 50 strcmps를 수행하는 대신 해시 테이블에 50개의 문자열을 모두 추가하고 각 문자열에 고유한 번호를 부여합니다(단 한 번만 수행하면 됨).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 해시 테이블에서 대상 문자열을 찾아보면 50개의 경우가 모두 있는 하나의 큰 스위치(또는 함수 포인터)가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;137&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 입력 세트(CSS 규칙 등)로 항목을 검색할 때 빠른 코드를 사용하여 가능한 유일한 솔루션을 추적한 다음 생각을 반복하여 일치하는 것을 찾습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일치하는 항목이 있으면 결과를 해시 테이블(캐시로)에 저장한 다음 나중에 동일한 입력 세트를 받으면 캐시 결과를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;138&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빠른 코드를 위한 주요 도구는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;139&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;hashtable - 빠른 조회 및 캐싱 결과용&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;140&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;qsort - 내가 사용하는 유일한 유형입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;141&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bsp - 영역별 검색용 (맵 렌더링 등)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;142&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/110684/what-coding-techniques-do-you-use-for-optimising-c-programs&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/541</guid>
      <comments>https://shortcode.tistory.com/541#entry541comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:06:06 +0900</pubDate>
    </item>
    <item>
      <title>현재 선택한 항목을 보존하면서 HTML 선택 옵션을 값별로 정렬하는 가장 효율적인 방법은 무엇입니까?</title>
      <link>https://shortcode.tistory.com/540</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 선택한 항목을 보존하면서 HTML 선택 옵션을 값별로 정렬하는 가장 효율적인 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery를 가지고 있는데, sorting helper가 내장되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 각 아이템의 2d 배열을 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;selected&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성이지만 자바스크립트가 내장되어 있지는 않은 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array.sort()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제대로 작동할 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션을 임시 배열로 추출하고 정렬한 다음 목록을 재구성합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var my_options = $(&quot;#my_select option&quot;);
var selected = $(&quot;#my_select&quot;).val();

my_options.sort(function(a,b) {
    if (a.text &amp;gt; b.text) return 1;
    if (a.text &amp;lt; b.text) return -1;
    return 0
})

$(&quot;#my_select&quot;).empty().append( my_options );
$(&quot;#my_select&quot;).val(selected);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort&quot; rel=&quot;noreferrer&quot; title=&quot;모질라의 정렬 문서&quot; papago-id=&quot;7-0&quot; papago-attr-id=&quot;2&quot;&gt;Mozilla의 정렬 문서&lt;/a&gt;(특히 compareFunction)와 &lt;a href=&quot;http://en.wikipedia.org/wiki/Sorting_algorithm&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-2&quot;&gt;위키피디아의 정렬 알고리즘 페이지&lt;/a&gt;가 해당됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정렬 대소문자를 둔감하게 만들고 싶다면 대체&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text.toLowerCase()&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에 표시된 정렬 기능은 정렬하는 방법을 보여줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;영어 이외의 언어를 정확하게 정렬하는 것은 복잡할 수 있습니다(&lt;a href=&quot;http://www.unicode.org/reports/tr10/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-1&quot;&gt;유니코드 대조 알고리즘&lt;/a&gt; 참조).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정렬 함수에서 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-3&quot;&gt;localCompare&lt;/a&gt;를 사용하는 것이 좋은 해결책입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;my_options.sort(function(a,b) {
    return a.text.localeCompare(b.text);
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Tom의 답변을 위에서 약간 수정하여 단순히 정렬된 요소를 반환하는 것이 아니라 실제로 정렬할 선택 상자의 내용을 수정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#your_select_box').sort_select_box();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 함수:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.sort_select_box = function(){
    // Get options from select box
    var my_options = $(&quot;#&quot; + this.attr('id') + ' option');
    // sort alphabetically
    my_options.sort(function(a,b) {
        if (a.text &amp;gt; b.text) return 1;
        else if (a.text &amp;lt; b.text) return -1;
        else return 0
    })
   //replace with sorted my_options;
   $(this).empty().append( my_options );

   // clearing any selections
   $(&quot;#&quot;+this.attr('id')+&quot; option&quot;).attr('selected', false);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방금 마크의 아이디어를 jquery 기능으로 포장했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#your_select_box').sort_select_box();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JQuery 함수:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.sort_select_box = function(){
    var my_options = $(&quot;#&quot; + this.attr('id') + ' option');
    my_options.sort(function(a,b) {
        if (a.text &amp;gt; b.text) return 1;
        else if (a.text &amp;lt; b.text) return -1;
        else return 0
    })
   return my_options;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 @Juan Perez에게 한 코멘트에서 언급한 해결책&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.sortOptions = function(){
    $(this).each(function(){
        var op = $(this).children(&quot;option&quot;);
        op.sort(function(a, b) {
            return a.text &amp;gt; b.text ? 1 : -1;
        })
        return $(this).empty().append(op);
    });
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;select&quot;).sortOptions();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 여전히 개선될 수 있지만, 더 이상 벨이나 휘파람을 추가할 필요는 없었습니다 :)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE6에서는 중첩 배열의 [0] 항목을 정렬하는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function sortSelect(selectToSort) {
    var arrOptions = [];

    for (var i = 0; i &amp;lt; selectToSort.options.length; i++)  {
        arrOptions[i] = [];
        arrOptions[i][0] = selectToSort.options[i].value;
        arrOptions[i][1] = selectToSort.options[i].text;
        arrOptions[i][2] = selectToSort.options[i].selected;
    }

    arrOptions.sort();

    for (var i = 0; i &amp;lt; selectToSort.options.length; i++)  {
        selectToSort.options[i].value = arrOptions[i][0];
        selectToSort.options[i].text = arrOptions[i][1];
        selectToSort.options[i].selected = arrOptions[i][2];
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 브라우저에서도 작동하는지 알아보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: 파이어폭스에서도 작동합니다, 우후!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것보다 더 쉬운 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;javascript나 jQuery에 내장된 method 중에 내가 놓친 것을 선별하는 방법이 있습니까, 아니면 이것이 최선의 방법입니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동해야 하는 종류의 &lt;a href=&quot;http://dev.jquery.com/ticket/255&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22-1&quot;&gt;폐쇄된 jQuery 티켓&lt;/a&gt;이 있지만 핵심에 포함되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery.fn.sort = function() {
  return this.pushStack( [].sort.apply( this, arguments ), []);
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://groups.google.com/group/jquery-en/browse_thread/thread/e0d6c199552dd1f7/2f05ad6d400dd962?lnk=gst&amp;amp;q=array+sorting&quot; rel=&quot;noreferrer&quot; papago-id=&quot;23-1&quot;&gt;구글 그룹 스레드&lt;/a&gt;를 참조하면 정렬에 사용되는 함수를 그냥 전달하는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function sortSelect(selectToSort) {
    jQuery(selectToSort.options).sort(function(a,b){ 
        return a.value &amp;gt; b.value ? 1 : -1; 
    });
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 더 나은 해결책입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JQuery에 전역 함수 선언&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.sortSelect = function() {
    var op = this.children(&quot;option&quot;);
    op.sort(function(a, b) {
        return a.text &amp;gt; b.text ? 1 : -1;
    })
    return this.empty().append(op);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 코드에서 함수를 호출합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_select&quot;).sortSelect();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;Array.sort()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본값은 각 원소를 문자열로 변환하여 비교하는 것입니다. 그래서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[&quot;value&quot;, &quot;text&quot;, &quot;selected&quot;]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 분류됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;value, text, selected&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 대부분의 경우 잘 작동할 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값만 정렬하거나 값을 숫자로 해석하려는 경우 비교 함수를 sort()로 전달할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;arrOptions.sort(function(a,b) { return new Number(a[0]) - new Number(b[0]); });
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨텍스트 선택기를 사용하려면 ID를 연결하면 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.sort_select_box = function(){
    var my_options = $(&quot;option&quot;, $(this));
    my_options.sort(function(a,b) {
        if (a.text &amp;gt; b.text) return 1;
        else if (a.text &amp;lt; b.text) return -1;
        else return 0
    });
    $(this).empty().append(my_options);
}

// Usando:
$(&quot;select#ProdutoFornecedorId&quot;, $($context)).sort_select_box();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조금 늦었지만, 가치가 있기 때문에 일반적으로 포함할 수 있는 더 복잡한 기능을 구현했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다양한 출력을 위한 몇 가지 옵션이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 재발할 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;OPTGROUP&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;레이블에 따라 태그를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.sortSelect = function(options){

    const OPTIONS_DEFAULT = {
        recursive:      true,   // Recurse into &amp;lt;optgroup&amp;gt;
        reverse:        false,  // Reverse order
        useValues:      false,  // Use values instead of text for &amp;lt;option&amp;gt; (&amp;lt;optgruop&amp;gt; is always label based)
        blankFirst:     true,   // Force placeholder &amp;lt;option&amp;gt; with empty value first, ignores reverse
    }

    if (typeof options != &quot;object&quot; || null === options) {
        options = OPTIONS_DEFAULT;
    }

    var sortOptions = function($root, $node, options){

        if ($node.length != 1) {
            return false;
        }

        if ($node[0].tagName != &quot;SELECT&quot; &amp;amp;&amp;amp; $node[0].tagName != &quot;OPTGROUP&quot;) {
            return false;
        }

        if (options.recursive) {
            $node.children('optgroup').each(function(k, v){
                return sortOptions($root, $(v), options);
            });
        }

        var $options        = $node.children('option, optgroup');
        var $optionsSorted  = $options.sort(function(a, b){

            if (options.blankFirst) {
                if (a.tagName == &quot;OPTION&quot; &amp;amp;&amp;amp; a.value == &quot;&quot;) {
                    return -1;
                }

                if (b.tagName == &quot;OPTION&quot; &amp;amp;&amp;amp; b.value == &quot;&quot;) {
                    return 1;
                }
            }

            var textA = (a.tagName == &quot;OPTION&quot; ? (options.useValues ? a.value : a.text) : a.label);
            var textB = (b.tagName == &quot;OPTION&quot; ? (options.useValues ? a.value : b.text) : b.label);

            if (textA &amp;gt; textB) {
                return options.reverse ? -1 : 1;
            }

            if (textA &amp;lt; textB) {
                return options.reverse ? 1 : -1;
            }

            return 0;

        });

        $options.remove();
        $optionsSorted.appendTo($node);

        return true;

    };

    var selected = $(this).val();
    var sorted = sortOptions($(this), $(this), {...OPTIONS_DEFAULT, ...options});
    $(this).val(selected);

    return sorted;

};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 당신은 전화할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sortSelect()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;n에 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;SELECT&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 ,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;OPTGROUP&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그룹의 옵션만 정렬할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').sortSelect();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;역순&quot; 옵션을 사용하여 순서를 바꿉니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').sortSelect({
    reverse: true
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 중요 클래스(예: &quot;js-sort&quot;)를 포함하는 경우에만 모든 선택 항목에 자동으로 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select.js-sort').each(function(k, v){
    $(v).sortSelect();
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery는 html 선택 요소에서 옵션을 정렬하는 데 아직도 충분히 도움이 되지 않는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정렬 옵션을 위한 일반 자바스크립트 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;function sortOptionsByText(a,b) {
  // I keep an empty value option on top, b.value comparison to 0 might not be necessary if empty value is always on top...
  if (a.value.length==0 || (b.value.length&amp;gt;0 &amp;amp;&amp;amp; a.text &amp;lt;= b.text)) return -1; // no sort: a, b
  return 1; // sort switches places: b, a
}
function sortOptionsByValue(a,b) {
  if (a.value &amp;lt;= b.value) return -1; // a, b
  return 1; // b, a
}
function clearChildren(elem) {
  if (elem) {
    while (elem.firstChild) {
      elem.removeChild(elem.firstChild);
    }
  }
}
function sortSelectElem(sel,byText) {
  const val=sel.value;
  const tmp=[...sel.options];
  tmp.sort(byText?sortOptionsByText:sortOptionsByValue);
  clearChildren(sel);
  sel.append(...tmp);
  sel.value=val;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;RACE: &amp;lt;select id=&quot;list&quot; size=&quot;6&quot;&amp;gt;
  &amp;lt;option value=&quot;&quot;&amp;gt;--PICK ONE--&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;1&quot;&amp;gt;HUMANOID&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;2&quot;&amp;gt;AMPHIBIAN&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;3&quot;&amp;gt;REPTILE&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;4&quot;&amp;gt;INSECTOID&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;button type=&quot;button&quot; onclick=&quot;sortSelectElem(document.getElementById('list'));&quot;&amp;gt;SORT LIST BY VALUE&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;button type=&quot;button&quot; onclick=&quot;sortSelectElem(document.getElementById('list'),true);&quot;&amp;gt;SORT LIST BY TEXT&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery와 함께 이것은 Chrome에서 데이터베이스 정렬되지 않은 요소에서 선택한 것을 정렬하는 데 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function(){
    
    var $list = $(&quot;#my_select&quot;);
    var selected = $(&quot;#my_select&quot;).val(); //save selected value
    
    $list.children().detach().sort(function(a, b) {
        return $(a).text().localeCompare($(b).text());
      }).appendTo($list);  //do the sorting locale for latin chars
    
    $(&quot;#my_select&quot;).val(selected); //select previous selected value

});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/45888/what-is-the-most-efficient-way-to-sort-an-html-selects-options-by-value-while&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/540</guid>
      <comments>https://shortcode.tistory.com/540#entry540comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:00:53 +0900</pubDate>
    </item>
    <item>
      <title>자바 프로젝트:ApplicationContext를 로드하지 못했습니다.</title>
      <link>https://shortcode.tistory.com/539</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바 프로젝트:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ApplicationContext를 로드하지 못했습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 JUNIT 테스트 케이스를 작성하는 Java Project가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;applicationinoContext.xml 파일을 root java source 디렉토리에 복사했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;StackOverflow에서 읽은 몇 가지 권장 설정으로 시도해 보았지만 여전히 동일한 오류가 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 프로젝트가 웹 프로젝트가 아닌 자바 프로젝트이기 때문에 이 오류가 발생하는 것입니까, 아니면 그게 중요합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디가 잘못되었는지 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={&quot;C:/projs/sortation/src/main/java/applicationContext.xml&quot;})
// Also tried these settings but they also didnt work,
//@ContextConfiguration(locations={&quot;classpath:applicationContext.xml&quot;})
//@ContextConfiguration(&quot;classpath:applicationContext.xml&quot;)
@Transactional
public class TestSS {

    @Autowired
    private EmsDao dao;

    @Test
    public void getSites() {

        List&amp;lt;String&amp;gt; batchid = dao.getList();

        for (String s : batchid) {
            System.out.println(s);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;maven을 사용하는 것 같습니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src/main/java)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이 경우에는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;applicationContext.xml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;줄을 늘어놓다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src/main/resources&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디렉토리 입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스 경로 디렉토리에서 복사되며 다음을 사용하여 액세스할 수 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ContextConfiguration(&quot;/applicationContext.xml&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/testing.html&quot; papago-id=&quot;6-1&quot;&gt;Spring-Documentation&lt;/a&gt;에서:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반 경로(예: &quot;context.xml&quot;)는 &lt;strong papago-id=&quot;6-3&quot;&gt;테스트 클래스가 정의된 패키지의 클래스&lt;/strong&gt; 경로 리소스로 처리됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;슬래시로 시작하는 경로는 &quot;/org/example/config.xml&quot;과 같이 &lt;strong papago-id=&quot;6-5&quot;&gt;정규화&lt;/strong&gt;된 클래스 &lt;strong papago-id=&quot;6-5&quot;&gt;경로 위치&lt;/strong&gt;로 처리됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 클래스 경로의 루트 디렉터리에 있는 파일을 참조할 때 슬래시를 추가하는 것이 중요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;절대 파일 경로로 작업하는 경우 'file:C:...'를 사용해야 합니다(설명서를 제대로 이해했다면).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 같은 문제가 있었고 테스트를 위해 다음 플러그인을 사용하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.9&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;useFile&amp;gt;true&amp;lt;/useFile&amp;gt;
        &amp;lt;includes&amp;gt;
            &amp;lt;include&amp;gt;**/*Tests.java&amp;lt;/include&amp;gt;
            &amp;lt;include&amp;gt;**/*Test.java&amp;lt;/include&amp;gt;
        &amp;lt;/includes&amp;gt;
        &amp;lt;excludes&amp;gt;
            &amp;lt;exclude&amp;gt;**/Abstract*.java&amp;lt;/exclude&amp;gt;
        &amp;lt;/excludes&amp;gt;
        &amp;lt;junitArtifactName&amp;gt;junit:junit&amp;lt;/junitArtifactName&amp;gt;
        &amp;lt;parallel&amp;gt;methods&amp;lt;/parallel&amp;gt;
        &amp;lt;threadCount&amp;gt;10&amp;lt;/threadCount&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IDE(식각 sts)에서 테스트가 정상적으로 실행되고 있었지만 명령 &lt;strong papago-id=&quot;10-1&quot;&gt;mvn 테스트&lt;/strong&gt;를 사용할 때 실패했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 시행착오 끝에 해결책은 위의 플러그인 구성에서 다음과 같은 두 줄의 병렬 테스트를 제거하는 것이라고 생각했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &amp;lt;parallel&amp;gt;methods&amp;lt;/parallel&amp;gt;
    &amp;lt;threadCount&amp;gt;10&amp;lt;/threadCount&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 누군가를 도와주기를 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제에 직면한 이유는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;during bootstrapping my spring project&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구현하는 클래스를 사용하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ApplicationListener&amp;lt;ContextRefreshedEvent&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 안으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onApplicationEvent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;7-1&quot;&gt;함수가 예외를 던집니다&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 애플리케이션 부트스트랩 포인트가 어떤 예외도 발생시키지 않도록 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우에는 테스트를 위해 &lt;a href=&quot;http://maven.apache.org/surefire/maven-surefire-plugin/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18-1&quot;&gt;maven surefire plugin&lt;/a&gt;을 사용하고 있었으므로 테스트 프로세스를 디버깅하기 위해 이 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mvn -Dmaven.surefire.debug test
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 문제에 직면했고, 그 때 Bean(@Bean)이 테스트 클래스에서 정확한 매개 변수가 주어지지 않아 제대로 인스턴스화되지 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5058294/java-project-failed-to-load-applicationcontext&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/539</guid>
      <comments>https://shortcode.tistory.com/539#entry539comment</comments>
      <pubDate>Wed, 20 Sep 2023 21:00:07 +0900</pubDate>
    </item>
    <item>
      <title>C/C++에서 div 또는 ldiv를 사용하는 이유는 무엇입니까?</title>
      <link>https://shortcode.tistory.com/538</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C/C++에서 div 또는 ldiv를 사용하는 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'/' 또는 '%' 대신 ldiv 또는 div를 사용하여 두 변수를 나누고 변조하는 특정한 이유가 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예. C99 §7.20.6.2/2는 다음과 같이 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ldiv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lldiv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numer / denom&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numer % denom&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로세서의 단일 DIV 명령을 통해 / 및 %의 결과를 파악할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 역사적으로 div()는 두 가지를 모두 얻을 수 있는 최적화된 방법을 제공하는 데 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 저는 새로운 컴파일러들이 / 및 % 연산을 단일 분할로 최적화할 수 있다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 Microsoft Visual C++에서 이러한 최적화를 본 적이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 경우 div()는 실제로 이점을 제공하지 않으며, 실제로 통화가 관련된 경우 속도가 더 느려질 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 사용하는 것보다 더 빠를 &lt;em papago-id=&quot;11-1&quot;&gt;것&lt;/em&gt;입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;계수와 나머지를 동시에 계산하려는 경우에는 연산자를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단답: 현대적인 환경에서는 그렇지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사람들은 왜 다음과 같은 혜택을 주는지 설명했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;약하거나 심지어 존재하지 않는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-1&quot;&gt;친구들은 좋은 관행을 해치는 유형의 커플링을 소개합니다(아래 단점 참조).&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;장점 : 아마도 없음&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 에게 를 걸면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업이 어셈블리 수준에서 한 번만 수행되도록 보장할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 대부분의 현대적 맥락에서:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CPU는 수학적 연산을 매우 잘 최적화하여 연산을 수 백만 번 수행하는 가장 안쪽 루프를 제외하고는 연산을 반복하여 수행할 경우 발생하는 모든 성능 히트가 다른 성능 히트보다 훨씬 적을 수 있습니다(다른 코드처럼 캐시 미스 등).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=&amp;gt;=&amp;gt; 의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 , .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현대의 컴파일러는 계수를 가져오는 하나의 분할 명령어만 생성하고 나머지는 그로부터 생성함으로써 어쨌든 옳은 일을 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;=&amp;gt; 실익 없음&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h1 papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단점: 디브와 친구들은 당신의 코드를 특정 유형에 연결합니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; (:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;long&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 (즉, 가 항상  합니다(을 들어, int  long 함), 을 사용하여 정적으로 알려져 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위해서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ldiv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오랫동안은 괜찮습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 하는 것이 하다는 을 금방 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ldiv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;암호를 활자로 묶다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;long&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각각 다음과 같다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반대로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 깨끗하게 유지하면서 실제로 사용되는 유형이 무엇이든 자동으로 조정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 특히 다음과 같은 두 가지 경우에 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 사용합니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typedef&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 활자를 추상화하다 보면 --&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서도 서투릅니다!&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿을 사용하여 실제 유형을 추상화합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿을 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 샘플은 '/' 및 '%'를 사용하는 코드가 깨끗하고 간단하며 int, long, long 등에 연결되지 않는 반면 코드를 사용하는 것을 보여줍니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;친구들은 서툴러집니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Testing with int
my_math_func_div_WRONG  says 6
my_math_func_OVERKILL   says 6  // Works but overkill cast to long
my_math_func_GOOD   says 6      // No div no headache.

Testing with int in long type
my_math_func_div_WRONG  says 6
my_math_func_OVERKILL   says 6  // Works but overkill cast to long
my_math_func_GOOD   says 6      // No div no headache.

Testing with actual long
my_math_func_div_WRONG  says 70503280   // FAIL
my_math_func_OVERKILL   says 500000006
my_math_func_GOOD   says 500000006      // No div no headache.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

// '/' and '%' are smart about type.
// This code is simple and will work with int, long, longlong, char, whatever.
template&amp;lt;typename T&amp;gt;
T my_math_func_GOOD( T number )
{
    T quotient = number / 10;
    T remainder = number % 10;
    // do something
    return quotient + remainder;
}

// div and friends are not smart about type.
// How do you write code smart about type with them ?

// Plus adds dependency on C's stdlib.
#include &amp;lt;stdlib.h&amp;gt;
template&amp;lt;typename T&amp;gt;
T my_math_func_div_WRONG( T number )
{
    // This will always downcast to int. Defeats purpose of template.
    div_t result = div( number, 10 );
    T quotient = result.quot;
    T remainder = result.rem;
    // do something
    return quotient + remainder;
}

template&amp;lt;typename T&amp;gt;
T my_math_func_OVERKILL( T number )
{
    // This will always cast to long (up from int, OVERKILL, possibly down from long long, FAIL). Defeats purpose of template.
    ldiv_t result = ldiv( number, 10 );
    T quotient = result.quot;
    T remainder = result.rem;
    // do something
    return quotient + remainder;
}

template&amp;lt;typename T&amp;gt;
void my_math_func_test( T number )
{
    T n;
    n = my_math_func_div_WRONG( number );
    std::cout &amp;lt;&amp;lt; &quot;my_math_func_div_WRONG\tsays &quot; &amp;lt;&amp;lt; n &amp;lt;&amp;lt; std::endl; // writes 6
    n = my_math_func_OVERKILL( number );
    std::cout &amp;lt;&amp;lt; &quot;my_math_func_OVERKILL\tsays &quot; &amp;lt;&amp;lt; n &amp;lt;&amp;lt; std::endl; // writes 6
    n = my_math_func_GOOD( number );
    std::cout &amp;lt;&amp;lt; &quot;my_math_func_GOOD\tsays &quot; &amp;lt;&amp;lt; n &amp;lt;&amp;lt; std::endl; // writes 6
}

// C99 allows absence of int argc, char **argv
int main()
{
    std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &quot;Testing with int&quot; &amp;lt;&amp;lt; std::endl;
    my_math_func_test&amp;lt;int&amp;gt;( 42 );
    std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &quot;Testing with int in long type&quot; &amp;lt;&amp;lt; std::endl;
    my_math_func_test&amp;lt;long&amp;gt;( 42 );
    std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &quot;Testing with actual long&quot; &amp;lt;&amp;lt; std::endl;
    my_math_func_test&amp;lt;long&amp;gt;( 5000000042 );
    // std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &quot;Testing with long long&quot; &amp;lt;&amp;lt; std::endl;
    // my_math_func_test&amp;lt;long long&amp;gt;( 50000000000000000042 );
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋아요, 나이가 더 많지만, 여기서 비틀거리기만 했어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 가장 중요한 차이점은 다음과 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;div()의 결과가 정의됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 표준에는 계수를 반올림하는 방법이 나와 있지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러는 CPU에 따라 다른 기계의 구현을 사용할 수 있어야 하기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;-무한으로 반올림 - 0으로 반올림이라는 두 가지 다른 구현이 존재합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 div (),는 후자를 하도록 지정되어 있으므로 휴대가 가능합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4565272/why-use-div-or-ldiv-in-c-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/538</guid>
      <comments>https://shortcode.tistory.com/538#entry538comment</comments>
      <pubDate>Wed, 20 Sep 2023 20:55:51 +0900</pubDate>
    </item>
    <item>
      <title>저장 프로시저에 대한 입력으로 사용자 정의 유형을 전달하려면 어떻게 해야 합니까?</title>
      <link>https://shortcode.tistory.com/537</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장 프로시저에 대한 입력으로 사용자 정의 유형을 전달하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 정의 유형과 관련된 두 가지 저장 프로시저가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째는 개체 ID를 수락하고 사용자 정의 유형의 해당 인스턴스를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째는 동일한 사용자 정의 유형의 인스턴스를 수락하고 이 인스턴스로 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 자바, JDBC와 약간의 봄 JDBC를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 저장 절차를 성공적으로 마쳤습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB에서 사용자 정의 유형의 인스턴스를 검색할 수 있지만 두 번째 저장 프로시저가 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 제가 가지고 있는 내용의 기본 개요는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스키마(PL/SQL)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create or replace type example_obj as object
  (ID     NUMBER,
   NAME   VARCHAR2(100))

create or replace type example_tab as table of example_obj

create or replace package
example as

procedure getExample
(p_id      in number,
 p_example out example_tab);

procedure useExample
(p_example  in example_tab);

end example;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;엔티티(Java) - Java에서 사용자 정의 유형을 나타냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class Example {
    public BigDecimal ID;
    public String Name;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mapper(자바) - SQL 유형에서 Java 유형 및 뒤로 맵&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class ExampleMapper extends Example implements SQLData {
    public static final String SQL_OBJECT_TYPE_NAME = &quot;example_obj&quot;;
    public static final String SQL_TABLE_TYPE_NAME  = &quot;example_tab&quot;;    

    @Override
    public String getSQLTypeName() throws SQLException {
        return SQL_TABLE_TYPE_NAME;
    }

    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException  {
        ID   = stream.readBigDecimal();
        Name = stream.readString();
    }

    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {
        stream.writeBigDecimal(ID);
        stream.writeString(Name);
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 저장 프로시저(Java) - ID가 지정된 예제 개체를 검색합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.springframework.jdbc.core.JdbcTemplate;

public Example getExample(BigDecimal ID) throws SQLException {
    String query = &quot;begin example.getExample(?, ?); end;&quot;;
    Connection connection = jdbcTemplate.getDataSource().getConnection();
    CallableStatement callableStatement = connection.prepareCall(query);

    callableStatement.setBigDecimal(&quot;p_id&quot;, ID);

    Map&amp;lt;String, Class&amp;lt;?&amp;gt;&amp;gt; typeMap = connection.getTypeMap();
    typeMap.put(Example.SQL_OBJECT_TYPE_NAME, ExampleMapper.class);
    callableStatement.registerOutParameter(&quot;p_example&quot;, Types.ARRAY, Example.SQL_TABLE_TYPE_NAME);
    connection.setTypeMap(typeMap);

    callableStatement.execute();

    Array array = (Array)callableStatement.getObject(&quot;p_example&quot;);
    Object[] data = (Object[])array.getArray();
    Example example = (Example)data[0]; // It's an ExampleMapper, but I only want Example
    return example;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앞서 말씀드린 것처럼 첫 번째 저장 절차가 제대로 진행되고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스에서 검색된 개체는 해당 Java 개체에 자동으로 매핑됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 단계는 이 사용자 정의 유형의 인스턴스를 수락하는 저장 프로시저를 호출하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 저장 프로시저(Java) - 예제 개체 사용 - 미완성&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public void useExample(Example example) throws SQLException {
    String query = &quot;begin example.useExample(?); end;&quot;;
    Connection connection = jdbcTemplate.getDataSource().getConnection();
    CallableStatement callableStatement = connection.prepareCall(query);

    // Is this required (as per getExample())?
    Map&amp;lt;String, Class&amp;lt;?&amp;gt;&amp;gt; typeMap = connection.getTypeMap();
    typeMap.put(Example.SQL_OBJECT_TYPE_NAME, ExampleMapper.class);
    connection.setTypeMap(typeMap);

    /***
     *** What goes here to pass the object in as a parameter?
     ***/
    callableStatement.setObject(&quot;p_example&quot;, ???);

    callableStatement.execute();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조금만 고민한 끝에 해결책을 개발할 수 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 관측치:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹에서는 이 작업을 수행하는 방법에 대한 문서가 많지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 정의 유형을 &lt;em papago-id=&quot;12-1&quot;&gt;입력&lt;/em&gt;으로 사용하는 것은 잘 지원되지 않는 것 같습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 제가 A를 사용해야 한다는 것을 알았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Struct&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(출력에 배열만 사용되었기 때문에) 반대 intuitive이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SQLData&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터페이스가 사용되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;writeSQL()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구조물을 수동으로 만들어야 한다는 걸 알았기 때문에 전화를 받은 적이 없습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;readSQL()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력을 매핑할 때 호출됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어레이 생성을 위해 DB별 코드를 사용해야 했는데, 이 코드는 Oracle 클래스를 의미했습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 일을 잘못 진행하고 있을 수도 있으니 제 해결책에 대한 의견을 듣고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public void useExample(Example example) throws SQLException {
    String query = &quot;begin example.useExample(?); end;&quot;;
    Connection connection = jdbcTemplate.getDataSource().getConnection();
    CallableStatement callableStatement = connection.prepareCall(query);

    Map&amp;lt;String, Class&amp;lt;?&amp;gt;&amp;gt; typeMap = connection.getTypeMap();
    typeMap.put(Example.SQL_OBJECT_TYPE_NAME, ExampleMapper.class);
    connection.setTypeMap(typeMap);

    // Manually convert the example object into an SQL type.
    Object[] exampleAttributes = new Object[]{example.ID, example.Name};
    Struct struct = connection.createStruct(type.getObjectType(), exampleAttributes);

    // Build the array using Oracle specific code.
    DelegatingConnection&amp;lt;OracleConnection&amp;gt; delegatingConnection = (DelegatingConnection&amp;lt;OracleConnection&amp;gt;) new DelegatingConnection(connection);
    OracleConnection oracleConnection = (OracleConnection) delegatingConnection.getInnermostDelegate();
    Object[] data = new Object[]{struct};
    Array array oracleConnection.createOracleArray(Example.SQL_TABLE_TYPE_NAME, data);

    // Set the input value (finally).
    callableStatement.setObject(&quot;p_example&quot;, array);

    callableStatement.execute();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 수동으로 변환할 필요는 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스트럭트는 절대 필요 없어요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 단순화된 버전입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;final OracleConnection oracleConnection = (OracleConnection) connection.getClass().
    getMethod(&quot;getUnderlyingConnection&quot;).invoke(connection);

List&amp;lt;Example&amp;gt; example = new ArrayList&amp;lt;&amp;gt;();
example.add(new Example(1L, &quot;something&quot;));
example.add(new Example(2L, &quot;something else&quot;));

Map&amp;lt;String, Class&amp;lt;?&amp;gt;&amp;gt; typeMap = connection.getTypeMap();
typeMap.put(Example.SQL_OBJECT_TYPE_NAME, Example.class);
connection.setTypeMap(typeMap);

Array array = oracleConnection.createOracleArray(Example.SQL_TABLE_TYPE_NAME, example.toArray());

statement.setObject(1, array);
statement.execute();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제 맵퍼와 예제 맵퍼를 하나의 클래스로 결합했습니다(간단하게 하기 위해)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예에서 또한 잘못된 점은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
public String getSQLTypeName() throws SQLException {
    return SQL_OBJECT_TYPE_NAME;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다시피 이 재정의된 메서드는 테이블 유형 이름이 아니라 개체 유형 이름을 반환해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/46069490/how-do-i-pass-a-user-defined-type-as-an-input-to-a-stored-procedure&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/537</guid>
      <comments>https://shortcode.tistory.com/537#entry537comment</comments>
      <pubDate>Wed, 20 Sep 2023 20:53:14 +0900</pubDate>
    </item>
    <item>
      <title>알파벳을 어떻게 반복합니까?</title>
      <link>https://shortcode.tistory.com/536</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;알파벳을 어떻게 반복합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;ol&gt; 
 &lt;li papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이썬에서는 단순히 문자를 ++로 사용할 수 있습니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 하는 효율적인 방법은 무엇입니까?&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 방법으로 URL을 반복하여 생성하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;www.website.com/term/#
www.website.com/term/a
www.website.com/term/b
www.website.com/term/c
www.website.com/term/d ... 
www.website.com/term/z 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단하게 소문자로 된 편리한 문자열을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 2 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from string import ascii_lowercase

for c in ascii_lowercase:
    # append to your url
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 3 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from string import ascii_lowercase as alc
for i in alc:
    print(f&quot;www.website.com/term/{i}&quot;)

# Result
# www.website.com/term/a
# www.website.com/term/b
# www.website.com/term/c
# ...
# www.website.com/term/x
# www.website.com/term/y
# www.website.com/term/z
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 계속 중첩을 원할 경우 다음과 같이 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
for i in alc:
    print(f&quot;www.website.com/term/{i}&quot;)
    for j in alc:
        print(f&quot;www.website.com/term/{i}{j}&quot;)

# Result
# www.website.com/term/a
# www.website.com/term/aa
# www.website.com/term/ab
# www.website.com/term/ac
# ...
# www.website.com/term/ax
# www.website.com/term/ay
# www.website.com/term/az
# www.website.com/term/b
# www.website.com/term/ba
# www.website.com/term/bb
# www.website.com/term/bc
# ...
# www.website.com/term/bx
# www.website.com/term/by
# www.website.com/term/bz
# www.website.com/term/c
# www.website.com/term/ca
# www.website.com/term/cb
# www.website.com/term/cc
# ...
# ...
# ...
# www.website.com/term/z
# www.website.com/term/za
# www.website.com/term/zb
# www.website.com/term/zc
# www.website.com/term/zd
# ...
# www.website.com/term/zx
# www.website.com/term/zy
# www.website.com/term/zz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 더하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;string.ascii_lowercase&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;및 기본 제공 기능도 살펴봐야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ord('a')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한 ASCII 값을 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'a'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;chr(ord('a'))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신에게 줄 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'a'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것들을 사용하면 문자 코드를 통해 증감할 수 있고 충분히 쉽게 앞뒤로 변환할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.asciitable.com/&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;ASCII&lt;/a&gt; 테이블은 항상 가지고 있는 좋은 책갈피이기도 &lt;a href=&quot;http://www.asciitable.com/&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;합니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최단 경로&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;for c in list(map(chr,range(ord('a'),ord('z')+1))):
    do_something(base_url+c)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반복 기능&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def plusplus(oldChar):
     return chr(ord(oldChar)+1)
plusplus('a') # output - b
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 옵션&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;url=www.website.com/term
my_char=ord('a') # convert char to ascii
while my_char&amp;lt;= ord('z'):
   my_char+=1 # iterate over abc
   my_url=url+chr(my_char)  # convert ascii to char
   do_something(my_url)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Brian 답변을 기반으로 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17182656/&lt;a href=&quot;https://stackoverflow.com/questions/17182656/how-do-i-iterate-through-the-alphabet&quot; target=&quot;_blank&quot; papago-id=&quot;19-1&quot;&gt;how-do-i-iterate-through-the-alphabet&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/536</guid>
      <comments>https://shortcode.tistory.com/536#entry536comment</comments>
      <pubDate>Sat, 22 Jul 2023 13:47:09 +0900</pubDate>
    </item>
    <item>
      <title>구성 맵 kubernetes 여러 환경</title>
      <link>https://shortcode.tistory.com/535</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구성 맵 kubernetes 여러 환경&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Kubernetes 클러스터의 구성 데이터를 사용하여 Spring Boot 애플리케이션을 배포하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 쿠버네티스 클러스터에서 메시지를 읽어 메시지를 출력하는 간단한 Rest Controller를 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    private String message = &quot;Message not coming from Kubernetes config map&quot;;

@RequestMapping(value=&quot;/echo&quot;, method=GET)
public String printKubeConfig() {
    return message;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 애플리케이션에서 구성 맵의 이름을 지정했습니다.yml&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring:
  application:
    name: echo-configmap
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에코 구성 맵&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: echo-configmap
data:
  application.properties: |-
    message=Hello from dev Kubernetes Configmap
  application_qa.properties: |-
    message=Hello from qa Kubernetes Configmap
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;QA, int, test 등과 같은 여러 환경이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구성 맵에서 환경별 속성을 지정하는 가장 좋은 방법은 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring boot 애플리케이션에서 액세스하는 방법은 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;qa에 , 내  from  Configmap&quot;를 반환해야 . &quot;qa Kubernetes Configmap&quot; 메시지는 &quot;hello&quot;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 향후 GIT에서 이러한 구성 파일을 읽을 계획도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 사용 사례를 어떻게 처리합니까?&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 상자에 설치되어 있는 것 이상의 도구를 사용하지 않고 필요한 것을 제공하는 답변을 제공해 드리겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 이 방법을 사용해 보고, 이 접근 방식을 관리하고 확장하는 것이 어려워진 경우 좀 더 정교한 방법으로 전환하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1단계: 환경별 버전 제어 구성 맵&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다과같은만들기와 같은 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;k8s/configmaps&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경당 하나의 구성 맵을 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;k8s/configmaps/properties.dev.yaml
k8s/configmaps/properties.qa.yaml
k8s/configmaps/properties.sit.yaml
k8s/configmaps/properties.uat.yaml
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 구성 맵에는 환경별 설정이 포함되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2단계: 환경별 네임스페이스 보유&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경별로 다음과 같은 k8s 네임스페이스를 생성합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; application-dev
 application-qa
 application-sit
 application-uat
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3단계: 환경별 구성 맵 생성&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;약간의 타격은 여기에 도움이 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
# apply-configmaps.sh
namespace=&quot;application-${ENVIRONMENT}&quot;
for configmap in ./k8s/configmaps/*.${ENVIRONMENT}.yml; do
    echo &quot;Processing ConfigMap $configmap&quot;
    kubectl apply -n ${namespace} -f $configmap
done
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 모든 환경에 대한 구성 맵을 &lt;em papago-id=&quot;17-1&quot;&gt;만들거나&lt;/em&gt; 업데이트하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENVIRONMENT=dev ./update-configmaps.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4단계: CI/CD로 작업 완료&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 CI/CD 파이프라인을 만들 수 있습니다. 구성 맵 소스가 변경되면 위에 표시된 명령을 실행하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요약&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특별한 도구 없이 원시 명령을 사용하여 다음을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 제어 구성&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경별 구성 관리&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구성 코드가 변경될 때 구성 업데이트 또는 생성&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 경우 CI/CD 파이프라인에서 동일한 접근 방식을 쉽게 적용&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 정교한 도구를 사용하여 동일한 문제를 해결하기 전에 이 기본적인 '첫 번째 원칙'을 따르는 것이 좋습니다. 대부분의 경우 큰 힘을 들이지 않고 직접 작업을 수행할 수 있으며, 핵심 개념을 학습하여 나중에 필요할 때까지 보다 정교한 도구를 절약할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 헬름에게 &lt;a href=&quot;https://helm.sh&quot; rel=&quot;noreferrer&quot; papago-id=&quot;28-1&quot;&gt;좋은&lt;/a&gt; 사용 사례처럼 들립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 템플릿에서 Kubernetes 리소스(ConfigMaps, Deployments 및 기타 필요한 모든 리소스)를 생성할 수 &lt;a href=&quot;https://docs.helm.sh/developing_charts&quot; rel=&quot;noreferrer&quot; papago-id=&quot;28-3&quot;&gt;있는 Helm&lt;/a&gt; Chart로 애플리케이션을 배포할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.helm.sh/developing_charts/&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;조타&lt;/a&gt; 장치 차트의 &lt;a href=&quot;https://docs.helm.sh/developing_charts/&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;설명서를 사용&lt;/a&gt;하여 조타 장치를 시작할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 차트를 작성한 후에는 다음과 같이 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;templates/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; YAML 수 입니다. ConfigMap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ printf &quot;%s-%s&quot; .Release.Name .Chart.Name }}
  labels:
    app: {{ .Chart.Name | trunc 63 | trimSuffix &quot;-&quot; }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace &quot;+&quot; &quot;_&quot; }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
data:
  application.properties: |-
    message={{ .Values.properties.message }}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 개체에  두 할 수 실제로는 YAML 템플릿).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;helm create&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 적절한 기본 배포를 생성합니다.).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ConfigMap을 볼륨으로 추가하기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;containers:
  - name: {{ .Chart.Name }}
    # [...]
    volumes:
      - name: property-volume
        mountPath: /etc/your-app/properties
volumes:
  - name: property-volume
    configMap:
      name: {{ printf &quot;%s-%s&quot; .Release.Name .Chart.Name }}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 장치 에는 각조장차는에가 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;values.yaml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿을 채우는 데 사용되는 기본값을 정의할 수 있는 파일입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 이렇게 수 에는 &quot; &quot; &quot; &quot; &quot; &quot; (ConfigMap &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; (&quot; ConfigMap &quot; &quot; &quot; &quot; 이 포함되어 ).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{{ .Values.properties.message }}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;식):&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;replicaCount: 1
image:
  repository: your-docker-image
  tag: your-docker-tag
properties:
  message: Hello!
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 이 도움말 차트와 &lt;a href=&quot;https://docs.helm.sh/helm/#helm-install&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-1&quot;&gt;명령&lt;/a&gt;을 사용하여 다른 구성으로 원하는 만큼 응용 프로그램을 배포합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 YAML 파일을 제공할 수 있습니다. 이 파일에서 특정 값을 재정의할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;values.yaml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 덮어씁니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--set&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ helm install --name dev --set image.tag=latest --set replicaCount=1 path/to/chart
$ helm install --name prod --set image.tag=stable --set replicaCount=3 --set properties.message=&quot;Hello from prod&quot; path/to/chart
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 질문과 관련하여: 물론 헬름 차트를 버전 관리에 넣어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 &lt;a href=&quot;https://docs.helm.sh/helm/#helm-upgrade&quot; rel=&quot;noreferrer&quot; papago-id=&quot;39-1&quot;&gt;명령&lt;/a&gt;을 사용하여 이미 배포된 응용 프로그램에 변경 사항을 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기밀이 아닌 데이터에 대한 각 Git 프로젝트에 이 도구를 사용할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/kubernetes-sigs/kustomize&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;40-1&quot;&gt;https://github.com/kubernetes-sigs/kustomize&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메타데이터에서 포드를 필터링할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mycomponent
    env: dev
    tier: backend
  name: mycomponent
  namespace: myapplication
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;kubectl get pods -n my application -l env=dev, tier=dll, app=mycomponent&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 응용 이 일적으애실때행에서 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;qa&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 응프용방않음에서 실행되는 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;production&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Kubernetes를 사용하면 다른 &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;환경에 대해 다른 네임스페이스를 사용&lt;/a&gt;하여 이러한 &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;분리&lt;/a&gt;를 수행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 식으로, 위에 있는 물체들은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prod&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 네스페개 다릅다에 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;qa&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네임스페이스입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 더 비싼 접근 방식은 다른 환경에 다른 k8s 클러스터를 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 설정을 하여 &quot; &quot; &quot; 를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Deployment&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 네임스페이스의 개체입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Deployment&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 이용할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ConfigMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Boot 속성을 포함하는 개체입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 부르자.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ConfigMap&lt;/code&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 &lt;strong papago-id=&quot;23-0&quot;&gt;에코&lt;/strong&gt; 속성.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 방식으로 모든 네임스페이스는 에코 &lt;strong papago-id=&quot;24-1&quot;&gt;속성&lt;/strong&gt;의 고유한 복사본을 가질 것입니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;ConfigMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각각은 자신이 속한 환경에 대한 특정 구성을 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Deployment&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 개가사다니를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ConfigMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경 변수를 사용하거나 파일을 읽음으로써 속성을 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 중요한 점은 에코 &lt;strong papago-id=&quot;28-1&quot;&gt;속성&lt;/strong&gt;을 변경하면&lt;/font&gt;&lt;/font&gt; &lt;code&gt;ConfigMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 응용 프로그램에서 이러한 새 값을 볼 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿠베르네테스는 지금까지 이 기능이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비교할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ConfigMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동적 구성 솔루션인 Spring Cloud Config로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유사한 동작을 수행할 수 있는 접근 방식으로는 클러스터에서 &lt;a href=&quot;https://github.com/fabric8io/configmapcontroller&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-1&quot;&gt;fabric8 ConfigMap 컨트롤러&lt;/a&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 컨트롤러는 클러스터에서 실행되는 프로세스이며 다음과 같은 경우에 응용 프로그램을 다시 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ConfigMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 구성 값을 읽을 수 있도록 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경될  시작하지될 수 있는 하고 Spring Cloud Config를 사용해야 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ConfigMaps&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응용 프로그램 이름 또는 포트와 같은 변경되지 않는 다른 속성에 대해 설명합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 사례를 살펴봐야 할 것처럼 들립니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;spring-cloud-config&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- &lt;a href=&quot;https://cloud.spring.io/spring-cloud-config/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;36-1&quot;&gt;https://cloud.spring.io/spring-cloud-config/&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;config-server는 git 저장소에 위치할 수 있는 구성을 제공하는 인프라 구성 요소입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 config-client 파일에 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;config-server&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작 시 현재 프로필에 적용 가능한 구성을 로드합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경에 따라 분기가 다르거나 환경별로 프로파일을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서 kubernetes를 할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SPRING_PROFILES_ACTIVE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경 변수입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/47728512/&lt;a href=&quot;https://stackoverflow.com/questions/47728512/config-map-kubernetes-multiple-environments&quot; target=&quot;_blank&quot; papago-id=&quot;71-1&quot;&gt;config-map-kubernetes-multiple-environments&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/535</guid>
      <comments>https://shortcode.tistory.com/535#entry535comment</comments>
      <pubDate>Sat, 22 Jul 2023 13:37:37 +0900</pubDate>
    </item>
    <item>
      <title>SQLSTATE[42S22]:열을 찾을 수 없음: 1054 'where 절'의 'id' 알 수 없는 열(SQL: 'id'에서 * 선택 = 5 제한 1)</title>
      <link>https://shortcode.tistory.com/534</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQLSTATE[42S22]:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;열을 찾을 수 없음: 1054 'where 절'의 'id' 알 수 없는 열(SQL: 'id'에서 * 선택 = 5 제한 1)&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;열을 사용하여 데이터베이스에서 특정 데이터를 가져오려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SongID&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 링크를 클릭했지만 다음 오류가 발생한 경우:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQLSTATE[42S22]:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;열을 찾을 수 없음: 'where' 절에서 1054 알 수 없는 열 'id'(SQL: select * from&lt;/font&gt;&lt;/font&gt;&lt;code&gt;songs&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;5 제한 1)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨트롤러 클래스:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;
use DB;

class SongsController extends Controller {
    public function index()
    {
        $name = $this-&amp;gt;getName();
        $songs = DB::table('songs')-&amp;gt;get();
        return view('songs.index', compact('songs','name'));
    }
    public function show($id)
    {
        $name = $this-&amp;gt;getName();
        $song = DB::table('songs')-&amp;gt;find($id);
        return view('songs.show', compact('song','name'));
    }

    private function getName()
    {
        $name = 'Tupac Amaru Shakur';
        return $name;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마이그레이션:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    public function up()
    {
            Schema::create('songs', function($table)
            {
                $table-&amp;gt;increments('SongID');
                $table-&amp;gt;string('SongTitle')-&amp;gt;index();
                $table-&amp;gt;string('Lyrics')-&amp;gt;nullable();
                $table-&amp;gt;timestamp('created_at');
            });
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;find()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동으로 기본 키 열이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 작업이 올바르게 작동하려면 모델에 기본 키를 설정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Song.php&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스 내에 행을 추가합니다...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protected $primaryKey = 'SongID';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스키마를 변경할 가능성이 있다면 모든 기본 키 열에 이름을 지정하는 것이 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 라라벨이 가정하는 것이고 아마도 앞으로 더 많은 두통으로부터 당신을 구해줄 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 컨트롤러의 모델 파일로 이동하여 기본 키 파일 이름을 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protected $primaryKey = 'info_id';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 정보 ID는 데이터베이스 테이블에서 사용할 수 있는 필드 이름입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &lt;a href=&quot;https://laravel.com/docs/eloquent#primary-keys&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18-1&quot;&gt;문서&lt;/a&gt;의 &quot;기본 키&quot; 섹션에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$song = DB::table('songs')-&amp;gt;find($id);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 당신은 방법을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;find($id)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Laravel의 경우 이 방법을 사용할 경우 'id'라는 열을 기본 키로 설정해야 합니다. 그러면 method를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;find()&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 용도로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;where('SongID', $id)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;find($id)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;protected $primaryKey = 'SongID';&lt;/code&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 id(SongID)를 가져갔기 때문에 기본 키를 알려주기 위해 모델에 추가한 후&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 larvel 5.8을 실행하고 있으며 같은 문제를 경험했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저에게 효과가 있었던 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bigIncrements('id')를 사용하여 기본 키를 정의했습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서명되지 않은 Big를 사용했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 참조 키를 정의하는 정수('user_id')입니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;    Schema::create('generals', function (Blueprint $table) {
        $table-&amp;gt;bigIncrements('id');
        $table-&amp;gt;string('general_name');
        $table-&amp;gt;string('status');
        $table-&amp;gt;timestamps();
    });


    Schema::create('categories', function (Blueprint $table) {
        $table-&amp;gt;bigIncrements('id');
        $table-&amp;gt;unsignedBigInteger('general_id');
        $table-&amp;gt;foreign('general_id')-&amp;gt;references('id')-&amp;gt;on('generals');
        $table-&amp;gt;string('category_name');
        $table-&amp;gt;string('status');
        $table-&amp;gt;timestamps();
    });
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에서 언급한 대로 DB::table을 사용할 수 있지만 'find'는 사용할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;\Illuminate\Support\Facades\DB::table('model_has_roles')-&amp;gt;where('model_id', 123)-&amp;gt;update(['role_id' =&amp;gt; 2]);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29347253/&lt;a href=&quot;https://stackoverflow.com/questions/29347253/sqlstate42s22-column-not-found-1054-unknown-column-id-in-where-clause-s&quot; target=&quot;_blank&quot; papago-id=&quot;29-1&quot;&gt;sqlstate42s22-column-not-found-1054-unknown-column-id-in-where-clause-s&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/534</guid>
      <comments>https://shortcode.tistory.com/534#entry534comment</comments>
      <pubDate>Sat, 22 Jul 2023 13:36:48 +0900</pubDate>
    </item>
    <item>
      <title>생성자 기능 대 공장 기능</title>
      <link>https://shortcode.tistory.com/533</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자 기능 대 공장 기능&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누가 자바스크립트에서 생성자 함수와 공장 함수의 차이를 명확히 할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 것 대신에 어떤 것을 사용해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 기적인생함다함사것음입다니는용다된께과와 함께 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; set 키워드가(JavaScript 로자새생함록개도성하를체으동j▁set,▁set함),록▁(▁keyword(ava도생키가성▁causes하which&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 내에서 해당 개체로 이동하고 개체를 반환합니다.):&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var objFromConstructor = new ConstructorFunction();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장 함수는 &quot;일반&quot; 함수와 같이 호출됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var objFromFactory = factoryFunction();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 그것이 &quot;공장&quot;으로 간주되기 위해서는 어떤 객체의 새로운 인스턴스를 반환해야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 만약 그것이 단지 부울 같은 것을 반환했다면 당신은 그것을 &quot;공장&quot; 함수라고 부르지 않을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 다음과 같이 자동으로 발생하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 어떤 경우에는 더 많은 유연성을 허용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매우 간단한 예에서 위에서 언급한 함수는 다음과 같이 보일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function ConstructorFunction() {
   this.someProp1 = &quot;1&quot;;
   this.someProp2 = &quot;2&quot;;
}
ConstructorFunction.prototype.someMethod = function() { /* whatever */ };

function factoryFunction() {
   var obj = {
      someProp1 : &quot;1&quot;,
      someProp2 : &quot;2&quot;,
      someMethod: function() { /* whatever */ }
   };
   // other code to manipulate obj in some way here
   return obj;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 공장 기능을 단순한 예보다 훨씬 더 복잡하게 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출고 시 기능의 한 가지 장점은 반환할 개체가 일부 매개 변수에 따라 여러 유형일 수 있다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;h1 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자 사용의 이점&lt;/font&gt;&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 책들은 당신에게 컨스트럭터를 사용하는 법을 가르칩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 사람들은 그 방법을 좋아합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var myFoo = new Foo();&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단점&lt;/font&gt;&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한  내용은 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 호출자가 생성자 구현과 밀접하게 연결되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장의 추가 유연성이 필요한 경우 모든 발신자(규칙이 아닌 예외적인 경우 인정)를 리팩터링해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ㅠㅠ&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버그이므로  검사를 추가하는 을 강하게 . ( 이한일반버인생그올호확출바되인합는다니위검하기지플해고것야추해려강게하력러는을하가사를트이보레일러었르게적성자가이므로▁is,▁to▁a▁strongly▁shouldor▁is▁check▁addingplate▁such▁you▁a▁construct▁correctly다▁consider합▁called▁bug니▁boiler▁common▁ensure▁(▁that)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if (!(this instanceof Foo)) { return new Foo() }&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; :  수  EDIT : ES6 (ES2015) 이후잊수없는을로▁)..&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;class&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자 또는 생성자가 오류를 던집니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 한다면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;instanceof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확인, 그것은 여부에 대한 모호함을 남깁니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필수 항목입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 생각에는, 그러면 안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 효과적으로 전기 회로를 단락시켰습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요건. 즉, 결점 #1을 삭제할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그 &lt;strong papago-id=&quot;28-1&quot;&gt;다음&lt;/strong&gt;에는 이름을 &lt;strong papago-id=&quot;28-1&quot;&gt;제외&lt;/strong&gt;한 모든 &lt;strong papago-id=&quot;28-1&quot;&gt;공장 기능&lt;/strong&gt;이 있고, 추가적인 보일러 플레이트, 대문자, 그리고 덜 유연합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맥락.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2 papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자가 개방/폐쇄 원칙을 깨다&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저의 주된 우려는 그것이 개방/폐쇄 원칙에 위배된다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자를 내보내기 시작하고, 사용자가 생성자를 사용하기 시작하면 공장의 유연성이 필요하다는 것을 알게 됩니다(예: 객체 풀을 사용하도록 구현을 전환하거나, 실행 컨텍스트 전체에서 인스턴스화하거나, 프로토타입 OOO를 사용하여 상속 유연성을 높이려면).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 당신은 꼼짝 못합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자를 호출하는 모든 코드를 해제하지 않고는 변경할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 성능 향상을 위해 개체 풀 사용으로 전환할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한, 생성자를 사용하는 것은 여러분에게 기만적인 것을 줍니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;instanceof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 컨텍스트 전체에서 작동하지 않으며, 생성자 프로토타입이 교체되면 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 반환을 시작하는 경우에도 실패합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자에서 임의 개체 내보내기로 전환합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 생성자에서 공장과 같은 동작을 사용하려면 이 작업을 수행해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장 사용의 이점&lt;/font&gt;&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 감소 - 보일러 플레이트가 필요하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;임의 개체를 반환하고 임의 프로토타입을 사용할 수 있으므로 동일한 API를 구현하는 다양한 유형의 개체를 보다 유연하게 만들 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 HTML5 및 플래시 플레이어의 인스턴스를 모두 만들 수 있는 미디어 플레이어 또는 DOM 이벤트 또는 웹 소켓 이벤트를 내보낼 수 있는 이벤트 라이브러리가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 공장에서는 실행 컨텍스트 전반에서 개체를 인스턴스화하고, 개체 풀을 활용하며, 보다 유연한 프로토타입 상속 모델을 구현할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장에서 건설업체로 전환할 필요가 없으므로 리팩터링은 문제가 되지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 사용에 대한  없음.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지 마. (그것은 만들 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나쁜 행동을 하다, 다음 점 참조).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체에  수  inside 일으로작동예는대에작이로로상개므를사동하체위다용여하있니수습반액내세할스부: 적하에예니다▁behaves있습▁(수스for세할▁the액▁as▁it▁object▁parent▁it▁would▁use).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;player.create()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에대한을 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;player&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 방법으로 호출하는 것처럼 말입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;call&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;apply&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;◦&lt;font class=&quot;papago-parent&quot;&gt;또한&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;매우 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;할 수 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로토타입을 상위 개체에 저장하면 동적으로 기능을 전환하고 개체 인스턴스화에 매우 유연한 다형성을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자본화 여부에 대한 모호성이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지 마.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;린트 공구는 불만을 표시한 다음 사용하려고 시도할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 위에서 설명한 이점을 취소할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 사람들은 그 방법을 좋아합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var myFoo = foo();&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var myFoo = foo.create();&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단점&lt;/font&gt;&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예상대로 작동하지 않습니다(위 참조).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책: 사용하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체를 된 경우). foo.bar -  (예: ()생가점 - 를로으표대호또법기경우출된괄호는법체instead표기개성자예▁doesn▁-).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ◦: foo.bar 모듈 -&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에대한을 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 모든 JavaScript 방법과 마찬가지로 -- 이점 참조).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자는 호출한 클래스의 인스턴스를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장 기능은 무엇이든 반환할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;임의 값을 반환해야 하거나 클래스에 대규모 설정 프로세스가 있는 경우 공장 함수를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자 함수 예제&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User(&quot;Jack&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;▁on에 으로 된 객체를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;User.prototype&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 및호라고 부릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;User&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 생된개사용으로 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;value.value.value.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;피연산자에 대한 인수 식을 선택적으로 처리합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;     let user = new User;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원인이 될 것입니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 부르다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;User&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;논쟁의 여지 없이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;53&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;53-1&quot;&gt;생성자가 객체&lt;/em&gt; 값을 &lt;em papago-id=&quot;53-1&quot;&gt;반환하지 않는 &lt;/em&gt;한 생성자가 만든 객체를 반환합니다. 객체 값은 대신 반환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 대부분 무시할 수 있는 에지 케이스입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3 papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;장단점&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 의해 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;55&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; true를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;instanceOf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;56&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자 함수의 연산자입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 생성자의할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;58&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자를 이미 사용한 후 속성입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;58-1&quot;&gt;생성자를 사용&lt;/em&gt;하여 생성자를 만든 경우에는 변경할 수 &lt;em papago-id=&quot;58-1&quot;&gt;없습니다&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;class&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 키워드&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 성자기다사확수있장습다를 할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extends&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;61&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 키워드&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;62&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생자함수반수없을 반환할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;63&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 값으로 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;형식이 에 개체데이형아로에무다에 의해 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;64&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출고 시 기능 예제&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;function User(name, age) {
  return {
    name,
    age,
  }
};

let user = User(&quot;Tom&quot;, 23);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;65&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 기서공기다능제호출다니됩외고하음을여은장▁is▁without▁here▁called 없이 부릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;66&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수의 인수와 반환되는 개체의 유형이 있는 경우 함수는 직접 또는 간접 사용에 전적으로 책임이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예에서는 인수에서 일부 속성이 설정된 단순 [Object Object]를 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;장단점&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출자로부터 객체 생성의 구현 복잡성을 쉽게 숨깁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 브라우저의 기본 코드 기능에 특히 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;67&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장 기능이 항상 동일한 유형의 객체를 반환할 필요는 없으며 반환할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;68&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 표시기로 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 경우, 공장 기능은 구조와 의미가 단순할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;69&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환된 개체는 일반적으로 공장 기능에서 상속되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;70&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;및  산재, 그고반환&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;71&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;instanceOf factoryFunction&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;72&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;73&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extends&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;74&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 함수에서 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;75&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서 대신 속성.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;76&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장 함수에 의해 사용되는 생성자의 속성.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장은 &quot;항상&quot; 더 낫습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;객체 지향 언어를 사용할 때&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;계약을 결정합니다(방법과 그들이 무엇을 할 것인지 결정합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 메소드를 노출하는 인터페이스를 만듭니다(자바스크립트에서는 인터페이스가 없으므로 구현을 확인하는 방법을 생각해내야 합니다).&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 각 인터페이스의 구현을 반환하는 팩토리를 만듭니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구현(새 개체로 생성된 실제 개체)은 공장 사용자/소비자에게 노출되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 공장 개발자가 계약을 파기하지 않는 한 새로운 구현을 확장하고 창출할 수 있다는 것을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 공장 소비자는 코드를 변경하지 않고도 새로운 API의 이점을 누릴 수 있습니다. 만약 새로운 구현을 사용하고 &quot;새로운&quot; 구현을 사용한다면 &quot;새로운&quot; 구현을 사용하기 위해 &quot;새로운&quot;을 사용하는 모든 라인을 변경해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들의 코드는 변하지 않아요&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장들 - 다른 무엇보다도 - 봄의 틀은 완전히 이 아이디어를 중심으로 지어집니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장은 추상화 계층이며, 모든 추상화와 마찬가지로 복잡성에 비용이 듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장 기반 API를 접하면 특정 API에 대한 공장을 파악하는 것이 API 소비자에게 어려울 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자의 경우 검색 가능성은 사소한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cctors와 공장 간에 결정할 때 복잡성이 유익성에 의해 정당화되는지 여부를 결정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Javascript 생성자는 이것 이외의 것을 반환하거나 정의되지 않은 것을 반환함으로써 임의의 공장이 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 js에서는 검색 가능한 API와 객체 풀링/캐싱이라는 두 가지 장점을 모두 활용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;77&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 공장 기능이 건설자 기능보다 우수하다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용사를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;78&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자 기능을 사용하여 우리는 객체를 생성하는 특정한 방법에 코드를 바인딩하는 반면 공장을 사용하면 자유로워지므로 우리 자신을 바인딩하지 않고 더 다양한 인스턴스를 생성할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 클래스가 있다고 가정해 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;111&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;const file = new CreateFile(이름)&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CreateFile 클래스를 리팩터하여 서버에서 지원하는 파일 형식에 대한 하위 클래스를 생성하려면 다음과 같이 고급 팩토리 함수를 작성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function CreateFile(name) {
  if (name.match(/\.pdf$/)) {
    return new FilePdf(name);
  } else if (name.match(/\.txt$/)) {
    return new FileTxt(name);
  } else if (name.match(/\.md$/)) {
    return new FileMd(name);
  } else {
    throw new Error(&quot;Not supprted file type&quot;);
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;79&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능을  수 . 사용자는 공장기능로, 는개구수있고, 로부터들다있니습라고 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;encapsulation&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;80&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;function createPerson(name) {
  const privateInfo = {};
  // we create person object
  const person = {
    setName(name) {
      if (!name) {
        throw new Error(&quot;A person must have a name&quot;);
      }
     privateInfo.name = name;
    },
     getName() {
       return privateInfo.name;
    },
 };
   person.setName(name);
   return person;
}
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;차이점에 대해서는 에릭 엘리엇이 아주 잘 설명했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 두 번째 질문에 대해서는:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 것 대신에 어떤 것을 사용해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;81&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 객체 지향적인 배경에서 온 것이라면, 생성자 함수는 당신에게 더 자연스럽게 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 식으로 사용하는 것을 잊어서는 안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;82&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 키워드&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8698726/&lt;a href=&quot;https://stackoverflow.com/questions/8698726/constructor-function-vs-factory-functions&quot; target=&quot;_blank&quot; papago-id=&quot;120-1&quot;&gt;constructor-function-vs-factory-functions&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/533</guid>
      <comments>https://shortcode.tistory.com/533#entry533comment</comments>
      <pubDate>Sat, 22 Jul 2023 13:36:13 +0900</pubDate>
    </item>
    <item>
      <title>Python: 지정된 날짜의 시작 및 끝 데이터 제공</title>
      <link>https://shortcode.tistory.com/532</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python: 지정된 날짜의 시작 및 끝 데이터 제공&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;day = &quot;13/Oct/2013&quot;
print(&quot;Parsing :&quot;,day)
day, mon, yr= day.split(&quot;/&quot;)
sday = yr+&quot; &quot;+day+&quot; &quot;+mon
myday = time.strptime(sday, '%Y %d %b')
Sstart = yr+&quot; &quot;+time.strftime(&quot;%U&quot;,myday )+&quot; 0&quot;
Send = yr+&quot; &quot;+time.strftime(&quot;%U&quot;,myday )+&quot; 6&quot;
startweek = time.strptime(Sstart, '%Y %U %w')
endweek = time.strptime(Send, '%Y %U %w')
print(&quot;Start of week:&quot;,time.strftime(&quot;%a, %d %b %Y&quot;,startweek))
print(&quot;End of week:&quot;,time.strftime(&quot;%a, %d %b %Y&quot;,endweek))
print(&quot;Data entered:&quot;,time.strftime(&quot;%a, %d %b %Y&quot;,myday))

out:
Parsing : 13/Oct/2013
Start of week: Sun, 13 Oct 2013
End of week: Sat, 19 Oct 2013
Sun, 13 Oct 2013
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지난 이틀 동안 파이썬을 배웠고 이것을 하는 더 깨끗한 방법이 있는지 궁금했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법은 효과가 있습니다... 보기 흉하고 각 날짜에 대해 새로운 시간 변수를 만들어야 하는 것은 어리석은 것 같습니다. 그리고 간단한 통화를 통해 주어진 날짜를 주 시작과 끝으로 상쇄하는 방법이 있어야 하지만 저는 인터넷이나 문서에서 효과가 있을 것 같은 어떤 것도 찾을 수 없었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;datetime&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 다음과 같은 주의 시작 및 끝(월요일부터 일요일까지)이 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from datetime import datetime, timedelta

day = '12/Oct/2013'
dt = datetime.strptime(day, '%d/%b/%Y')
start = dt - timedelta(days=dt.weekday())
end = start + timedelta(days=6)
print(start)
print(end)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;print(start.strftime('%d/%b/%Y'))
print(end.strftime('%d/%b/%Y'))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 시간 형식을 유지하고 현재 날짜를 참조하려면 약간의 변동이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from datetime import date, timedelta

today = date.today()
start = today - timedelta(days=today.weekday())
end = start + timedelta(days=6)
print(&quot;Today: &quot; + str(today))
print(&quot;Start: &quot; + str(start))
print(&quot;End: &quot; + str(end))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://pypi.org/project/pendulum/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;진자&lt;/a&gt; 모듈을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;today = pendulum.now()
start = today.start_of('week')
end = today.end_of('week')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Arrow&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import arrow
now = arrow.now()
start_of_week = now.floor('week')
end_of_week = now.ceil('week')
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;pip install pendulum
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;
import pendulum
 
today = pendulum.now()
 
start = today.start_of('week')
print(start.to_datetime_string())
 
end = today.end_of('week')
print(end.to_datetime_string())
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.pythonprogramming.in/python-get-start-and-end-date-of-current-week.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 발견된&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/19216334/&lt;a href=&quot;https://stackoverflow.com/questions/19216334/python-give-start-and-end-of-week-data-from-a-given-date&quot; target=&quot;_blank&quot; papago-id=&quot;11-1&quot;&gt;python-give-start-and-end-of-week-data-from-a-given-date&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/532</guid>
      <comments>https://shortcode.tistory.com/532#entry532comment</comments>
      <pubDate>Sat, 22 Jul 2023 13:34:37 +0900</pubDate>
    </item>
    <item>
      <title>왜 RabbitMQ 대신 셀러리를 사용합니까?</title>
      <link>https://shortcode.tistory.com/531</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 RabbitMQ 대신 셀러리를 사용합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알기로는 Celery는 분산된 작업 대기열입니다. 즉, 다른 서버로 작업/작업을 발송하고 결과를 반환해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;토끼&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MQ는 메시지 큐이며 그 이상은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 작업자는 메시지가 수신될 때 MQ를 듣고 작업을 실행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 정확히 셀러리가 제공하는 것을 달성하는데, 왜 셀러리가 필요한가요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맞아요, 당신은 셀러리가 전혀 필요하지 않아요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;분산 시스템을 설계할 때는 많은 옵션이 있으며 모든 상황에 맞는 올바른 방법은 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 사람들은 메시지 소비자가 대기열에 메시지가 나타나기를 기다리고, 일부 작업을 수행하고, 작업이 완료되면 메시지를 보내는 것이 더 유연하다는 것을 알게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;셀러리는 모든 것을 패키지로 포장하는 프레임워크이지만, 패키지 전체가 실제로 필요하지 않다면 RabbitMQ를 설정하고 모든 복잡성 없이 필요한 것만 구현하는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;게다가, 토끼.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MQ는 셀러리가 구현하는 태스크 대기열 시나리오 외에도 더 많은 시나리오에서 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 셀러리를 선택했다면 RabbitMQ에 대해 다시 한 번 생각해 보십시오. 셀러리의 메시지 큐잉 모델은 단순하며 RabbitMQ보다 Redis와 같은 것에 더 적합합니다. Rabbit에는 셀러리가 기본적으로 무시하는 다양한 옵션이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;셀러리는 기본적으로 당신이 말한 대로 할 수 있는 훌륭한 인터페이스를 제공하고 당신을 위해 모든 구성을 처리합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 손으로 할 수는 있지만, 셀러리를 다시 쓰는 것 뿐입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 생각에는 RabbitMQ보다 셀러리를 꽃과 다른 모니터링 패키지에 통합하는 것이 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 것은 사용 사례에 따라 다릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 셀러리가 제공하는 다른 기능들이 필요하지 않다면, Rabbit.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MQ는 쉽게 빠져나갈 수 있는 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 선택을 고려하는 것은 나쁜 생각이 아닐 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/9077687/&lt;a href=&quot;https://stackoverflow.com/questions/9077687/why-use-celery-instead-of-rabbitmq&quot; target=&quot;_blank&quot; papago-id=&quot;10-1&quot;&gt;why-use-celery-instead-of-rabbitmq&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/531</guid>
      <comments>https://shortcode.tistory.com/531#entry531comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:52:59 +0900</pubDate>
    </item>
    <item>
      <title>Python 예약 단어 및 내장 목록을 라이브러리에서 사용할 수 있습니까?</title>
      <link>https://shortcode.tistory.com/530</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 예약 단어 및 내장 목록을 라이브러리에서 사용할 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 예약 단어 및 내장 목록을 라이브러리에서 사용할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 작업을 수행하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; from x.y import reserved_words_and_builtins

 if x in reserved_words_and_builtins:
     x += '_'
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 사용할 수 있는 키워드인지 확인하고 예약된 키워드 목록을 가져오려면 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import keyword
&amp;gt;&amp;gt;&amp;gt; keyword.iskeyword('break')
True
&amp;gt;&amp;gt;&amp;gt; keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 
 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 
 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 
 'while', 'with', 'yield']
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 제공 이름(Python 3)도 포함하려면 &lt;a href=&quot;https://docs.python.org/3/library/builtins.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;모듈을 확인&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import builtins
&amp;gt;&amp;gt;&amp;gt; dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError',
 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError',
 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError',
 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError',
 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError',
 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning',
 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError',
 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit',
 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError',
 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_',
 '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__',
 '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool',
 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex',
 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',
 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr',
 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int',
 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map',
 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow',
 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set',
 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple',
 'type', 'vars', 'zip']
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 2의 경우 &lt;a href=&quot;https://docs.python.org/2/library/__builtin__.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;모듈을 사용&lt;/a&gt;해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import __builtin__
&amp;gt;&amp;gt;&amp;gt; dir(__builtin__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22864221/&lt;a href=&quot;https://stackoverflow.com/questions/22864221/is-the-list-of-python-reserved-words-and-builtins-available-in-a-library&quot; target=&quot;_blank&quot; papago-id=&quot;5-1&quot;&gt;is-the-list-of-python-reserved-words-and-builtins-available-in-a-library&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/530</guid>
      <comments>https://shortcode.tistory.com/530#entry530comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:51:01 +0900</pubDate>
    </item>
    <item>
      <title>mysql 비교에 적합한 루비 날짜 시간</title>
      <link>https://shortcode.tistory.com/529</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql 비교에 적합한 루비 날짜 시간&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Rails는 MySql에 정확하게 포맷된 날짜 시간을 자동으로 삽입하는 데 도움이 되었습니다. 제가 많은 생각을 할 필요가 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 유효성 검사를 수행하려면 저장된 mysql datetime 값(즉, 2008-07-02 18:00:00)이 &quot;지금&quot;보다 크거나 작은지 확인해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전화할 수 있습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DateTime.now&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Time.now&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 어떻게 하면 mysql like 형식으로 변환할 수 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;to_s(:db)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스에 적합한 형식으로 변환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Time.now.to_s(:db)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 시간은 데이터베이스의 UTC에 저장되므로 Rails에 지정된 시간대가 있으면 주의하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;적절한 비교를 수행하려면 이 값을 지정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Time.now.utc.to_s(:db)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOW()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루비에서 현재 시간을 생성하는 대신 MySQL에서 기능합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럴 필요 없어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;레일즈가 대신 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모델이 다음과 같은 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Widget&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 날에 생성된 모든 위젯을 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Thing.find(:all, :condition =&amp;gt; [&quot;created_at &amp;gt; ?&quot;, Time.now - 1.day])
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;레일은 타임스탬프를 올바른 형식으로 자동 변환합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1255983/&lt;a href=&quot;https://stackoverflow.com/questions/1255983/ruby-datetime-suitable-for-mysql-comparison&quot; target=&quot;_blank&quot; papago-id=&quot;15-1&quot;&gt;ruby-datetime-suitable-for-mysql-comparison&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/529</guid>
      <comments>https://shortcode.tistory.com/529#entry529comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:48:59 +0900</pubDate>
    </item>
    <item>
      <title>C에서 &amp;quot;signed int&amp;quot;가 &amp;quot;unsigned int&amp;quot;보다 빠른 이유는 무엇입니까?</title>
      <link>https://shortcode.tistory.com/528</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서 &quot;signed int&quot;가 &quot;unsigned int&quot;보다 빠른 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C는 왜 서, 그는유입니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;signed int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 빠른.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맞습니다. 이 웹 사이트(아래 링크)에서 여러 번 질문하고 답변한 것으로 알고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 대부분의 사람들은 차이가 없다고 말했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 작성했는데 우연히 상당한 성능 차이를 발견했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드의 &quot;서명되지 않은&quot; 버전이 &quot;서명된&quot; 버전보다 느린 이유는 무엇입니까(동일한 번호를 테스트하는 경우에도)?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(x86-64 Intel 프로세서를 사용하고 있습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유사 링크&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/8792162/faster-comparing-signed-than-unsigned-ints&quot; papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서명되지 않은 int보다 서명된 int를 더 빠르게 비교&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4712315/performance-of-unsigned-vs-signed-integers&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 없는 정수 대 부호 없는 정수의 성능&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 명령:&lt;/font&gt;&lt;/strong&gt; &lt;code&gt;gcc -Wall -Wextra -pedantic -O3 -Wl,-O3 -g0 -ggdb0 -s -fwhole-program -funroll-loops -pthread -pipe -ffunction-sections -fdata-sections -std=c11 -o ./test ./test.c &amp;amp;&amp;amp; strip --strip-all --strip-unneeded --remove-section=.note --remove-section=.comment ./test&lt;/code&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3&gt;&lt;code&gt;signed int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; »&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;10-0&quot;&gt;참고:&lt;/strong&gt; 명시적으로 선언해도 차이가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;signed int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 숫자로&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int isprime(int num) {
    // Test if a signed int is prime
    int i;
    if (num % 2 == 0 || num % 3 == 0)
        return 0;
    else if (num % 5 == 0 || num % 7 == 0)
        return 0;
    else {
        for (i = 11; i &amp;lt; num; i += 2) {
            if (num % i == 0) {
                if (i != num)
                    return 0;
                else
                    return 1;
            }
        }
    }
    return 1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;code&gt;unsigned int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; »&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;int isunsignedprime(unsigned int num) {
    // Test if an unsigned int is prime
    unsigned int i;
    if (num % (unsigned int)2 == (unsigned int)0 || num % (unsigned int)3 == (unsigned int)0)
        return 0;
    else if (num % (unsigned int)5 == (unsigned int)0 || num % (unsigned int)7 == (unsigned int)0)
        return 0;
    else {
        for (i = (unsigned int)11; i &amp;lt; num; i += (unsigned int)2) {
            if (num % i == (unsigned int)0) {
                if (i != num)
                    return 0;
                else
                    return 1;
            }
        }
    }
    return 1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드로 파일을 테스트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int main(void) {
    printf(&quot;%d\n&quot;, isprime(294967291));
    printf(&quot;%d\n&quot;, isprime(294367293));
    printf(&quot;%d\n&quot;, isprime(294967293));
    printf(&quot;%d\n&quot;, isprime(294967241)); // slow
    printf(&quot;%d\n&quot;, isprime(294967251));
    printf(&quot;%d\n&quot;, isprime(294965291));
    printf(&quot;%d\n&quot;, isprime(294966291));
    printf(&quot;%d\n&quot;, isprime(294963293));
    printf(&quot;%d\n&quot;, isprime(294927293));
    printf(&quot;%d\n&quot;, isprime(294961293));
    printf(&quot;%d\n&quot;, isprime(294917293));
    printf(&quot;%d\n&quot;, isprime(294167293));
    printf(&quot;%d\n&quot;, isprime(294267293));
    printf(&quot;%d\n&quot;, isprime(294367293)); // slow
    printf(&quot;%d\n&quot;, isprime(294467293));
    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;time ./test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;):&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Signed - real 0m0.949s
Unsigned - real 0m1.174s
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서명되지 않은 버전은 10~20% 느린 코드를 지속적으로 생성하기 때문에 당신의 질문은 정말 흥미롭습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 코드에는 여러 가지 문제가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 모두 두기이모두반다니됩환능다▁return니▁both됩을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위해서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;5&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;7&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 틀렸습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 시험은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if (i != num) return 0; else return 1;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프 본체는 오직 다음을 위해 실행되기 때문에 완전히 쓸모가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i &amp;lt; num&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 테스트는 소규모 프라임 테스트에 유용하지만 특수 케이싱은 실제로 유용하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서명되지 않은 버전의 캐스트는 중복됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 없습니다. 은 터널에텍출벤코신수없다습니뢰할드는미킹치를 .&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 당신은 다음을 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;clock()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터벤션 I/O 없이 CPU 집약적인 기능을 실행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 실행되기 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;num / 2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 대신에 시간&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sqrt(num)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 단순화하고 몇 가지 정확한 벤치마크를 실행해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

int isprime_slow(int num) {
    if (num % 2 == 0)
        return num == 2;
    for (int i = 3; i &amp;lt; num; i += 2) {
        if (num % i == 0)
            return 0;
    }
    return 1;
}

int unsigned_isprime_slow(unsigned int num) {
    if (num % 2 == 0)
        return num == 2;
    for (unsigned int i = 3; i &amp;lt; num; i += 2) {
        if (num % i == 0)
            return 0;
    }
    return 1;
}

int isprime_fast(int num) {
    if (num % 2 == 0)
        return num == 2;
    for (int i = 3; i * i &amp;lt;= num; i += 2) {
        if (num % i == 0)
            return 0;
    }
    return 1;
}

int unsigned_isprime_fast(unsigned int num) {
    if (num % 2 == 0)
        return num == 2;
    for (unsigned int i = 3; i * i &amp;lt;= num; i += 2) {
        if (num % i == 0)
            return 0;
    }
    return 1;
}

int main(void) {
    int a[] = {
        294967291, 0, 294367293, 0, 294967293, 0, 294967241, 1, 294967251, 0,
        294965291, 0, 294966291, 0, 294963293, 0, 294927293, 1, 294961293, 0,
        294917293, 0, 294167293, 0, 294267293, 0, 294367293, 0, 294467293, 0,
    };
    struct testcase { int (*fun)(); const char *name; int t; } test[] = {
        { isprime_slow, &quot;isprime_slow&quot;, 0 },
        { unsigned_isprime_slow, &quot;unsigned_isprime_slow&quot;, 0 },
        { isprime_fast, &quot;isprime_fast&quot;, 0 },
        { unsigned_isprime_fast, &quot;unsigned_isprime_fast&quot;, 0 },
    };

    for (int n = 0; n &amp;lt; 4; n++) {
        clock_t t = clock();
        for (int i = 0; i &amp;lt; 30; i += 2) {
            if (test[n].fun(a[i]) != a[i + 1]) {
                printf(&quot;%s(%d) != %d\n&quot;, test[n].name, a[i], a[i + 1]);
            }
        }
        test[n].t = clock() - t;
    }
    for (int n = 0; n &amp;lt; 4; n++) {
        printf(&quot;%21s: %4d.%03dms\n&quot;, test[n].name, test[n].t / 1000), test[n].t % 1000);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;clang -O2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS/X에서 다음 출력을 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;         isprime_slow:  788.004ms
unsigned_isprime_slow:  965.381ms
         isprime_fast:    0.065ms
unsigned_isprime_fast:    0.089ms
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 타이밍은 다른 시스템에서 OP의 관찰된 동작과 일치하지만, 보다 효율적인 반복 테스트로 인해 발생하는 극적인 개선을 보여줍니다: &lt;strong papago-id=&quot;35-1&quot;&gt;10000배&lt;/strong&gt; 더 빠릅니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;36-1&quot;&gt;서명되지 않은&lt;/em&gt; 상태에서 &lt;em papago-id=&quot;36-1&quot;&gt;기능이 느린&lt;/em&gt; 이유는 무엇입니까&lt;em papago-id=&quot;36-1&quot;&gt;?&lt;/em&gt;라는 질문과 관련하여 생성된 코드(&lt;a href=&quot;https://godbolt.org/g/r5PuD7&quot; papago-id=&quot;36-3&quot; rel=&quot;noreferrer&quot;&gt;gcc&lt;/a&gt; 7&lt;a href=&quot;https://godbolt.org/g/r5PuD7&quot; papago-id=&quot;36-3&quot; rel=&quot;noreferrer&quot;&gt;.2&lt;/a&gt; - O2)를 살펴보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;isprime_slow(int):
        ...
.L5:
        movl    %edi, %eax
        cltd
        idivl   %ecx
        testl   %edx, %edx
        je      .L1
.L4:
        addl    $2, %ecx
        cmpl    %esi, %ecx
        jne     .L5
.L6:
        movl    $1, %edx
.L1:
        movl    %edx, %eax
        ret

unsigned_isprime_slow(unsigned int):
        ...
.L19:
        xorl    %edx, %edx
        movl    %edi, %eax
        divl    %ecx
        testl   %edx, %edx
        je      .L22
.L18:
        addl    $2, %ecx
        cmpl    %esi, %ecx
        jne     .L19
.L20:
        movl    $1, %eax
        ret
       ...
.L22:
        xorl    %eax, %eax
        ret
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내부 루프는 매우 유사합니다. 같은 수의 명령어와 비슷한 명령어입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 다음은 몇 가지 잠재적인 설명입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;cltd&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 의부를확다니의 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eax&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에등니다에 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;edx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 는 명령 지연의 이 될 수.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eax&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 있는 명령어 바로지의수해정됩니다에 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;movl %edi, %eax&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이것은 서명되지 않은 버전보다 서명된 버전을 더 빨리 만들지 않고 더 느리게 만들 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프의 초기 명령어가 서명되지 않은 버전에 대해 잘못 정렬될 수 있지만 소스 코드의 순서를 변경하는 것은 타이밍에 영향을 미치지 않기 때문에 가능성이 낮습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;된 division opcode와 되지 않은 division opcode는 하지만, opcode는 opcode, opcode는 opcode는 opcode는 opcode, opcode는 opcode는 opcode는 opcode, opcode는 opcode는 opcode일 가능성이 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;idivl&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령은 더 적은 주기를 필요로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;divl&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;例명.&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;되지 않은 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;가 1% &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;, 이 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;는 그 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;가 상당히 커 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 서명된 부서는 서명되지 않은 부서보다 하나의 작은 정밀도로 운영되지만, 이 작은 변화에 대해서는 그 차이가 상당히 커 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 실리콘 구현에 더 많은 노력을 기울였다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;idivl&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호화된 분할이 부호화되지 않은 분할보다 더 흔하기 때문입니다(Intel에서 수년간 코딩 통계로 측정).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인텔 프로세스의 지침 표를 보고 있는 rcgldr이 언급했듯이, 아이비 브리지의 경우 DIV 32비트는 10마이크로ops, 19~27사이클, IDIV 9마이크로ops, 19~26사이클이 걸립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;벤치마크 시간은 이러한 시간과 일치합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가 마이크로-op은 IDIV(63/31비트)에 비해 DIV(64/32비트)의 피연산자가 길기 때문일 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 놀라운 결과는 우리에게 몇 가지 교훈을 줄 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최적화하는 것은 어려운 기술입니다. 겸손하고 미루세요.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확성은 종종 최적화에 의해 깨집니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 알고리즘을 선택하는 것이 최적화보다 훨씬 낫습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;항상 벤치마크 코드, 당신의 본능을 믿지 마세요.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 있는 정수 오버플로가 정의되지 않았기 때문에 컴파일러는 부호 있는 정수를 포함하는 코드에 대해 많은 가정과 최적화를 할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 없는 정수 오버플로는 감싸도록 정의되므로 컴파일러가 최적화할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://blog.llvm.org/2011/05/&lt;a href=&quot;http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html#signed_overflow&quot; rel=&quot;noreferrer&quot; papago-id=&quot;55-1&quot;&gt;what-every-c-programmer-should-know&lt;/a&gt;.html#signed_overflow 및 http://www.airs.com/blog/archives/120 &lt;a href=&quot;http://www.airs.com/blog/archives/120&quot; rel=&quot;noreferrer&quot; papago-id=&quot;55-3&quot;&gt;도&lt;/a&gt; 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AMD&lt;a href=&quot;http://www.agner.org/optimize/instruction_tables.pdf&quot; rel=&quot;nofollow&quot; papago-id=&quot;56-1&quot;&gt;/Intel에 대한 지침&lt;/a&gt; 사양(K7용):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Instruction Ops Latency Throughput
DIV r32/m32 32  24      23
IDIV r32    81  41      41
IDIV m32    89  41      41 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경우 은 i7의 경우 동일합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IDIVL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DIVL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;µops에 대해 약간의 차이가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 기계에서 -O3 어셈블리 코드가 서명(DIVL 대 IDIVL)에 의해서만 다르기 때문에 차이를 설명할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상당한 시간 차이가 나타나지 않을 수도 있는 대체 Wiki 후보 테스트입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

#define J 10
#define I 5

int main(void) {
  clock_t c1,c2,c3;
  for (int j=0; j&amp;lt;J; j++) {
    c1 = clock();
    for (int i=0; i&amp;lt;I; i++) {
      isprime(294967241);
      isprime(294367293);
    }
    c2 = clock();
    for (int i=0; i&amp;lt;I; i++) {
      isunsignedprime(294967241);
      isunsignedprime(294367293);
    }
    c3 = clock();
    printf(&quot;%d %d %d\n&quot;, (int)(c2-c1), (int)(c3-c2), (int)((c3-c2) - (c2-c1)));
    fflush(stdout);
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;샘플 출력&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;2761 2746 -15
2777 2777 0
2761 2745 -16
2793 2808 15
2792 2730 -62
2746 2730 -16
2746 2730 -16
2776 2793 17
2823 2808 -15
2793 2823 30
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 많은 경우 서명되지 않은 것이 서명된 것보다 빠릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2의 거듭제곱으로 나누면,&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;    unsigned int x=37;
    cout&amp;lt;&amp;lt;x/4;
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;짝수인 경우 번호를 확인할 때&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;    unsigned int x=37;
    cout&amp;lt;&amp;lt;(x%2==0)?&quot;even&quot;:&quot;odd&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/34165099/&lt;a href=&quot;https://stackoverflow.com/questions/34165099/in-c-why-is-signed-int-faster-than-unsigned-int&quot; target=&quot;_blank&quot; papago-id=&quot;66-1&quot;&gt;in-c-why-is-signed-int-faster-than-unsigned-int&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/528</guid>
      <comments>https://shortcode.tistory.com/528#entry528comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:48:02 +0900</pubDate>
    </item>
    <item>
      <title>MySQL의 필드 증가는 원자적입니까?</title>
      <link>https://shortcode.tistory.com/527</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL의 필드 증가는 원자적입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 MyISAM 테이블에 카운터를 추가하고 싶은 웹 사이트를 만들고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순화된 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE votes SET num = num + 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 연결이 동일한 쿼리를 수행하는 경우 문제가 발생합니까? 아니면 MySQL이 쿼리를 처리하고 테이블을 잠그거나 충돌이 없는지 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쓰기는 원자적이지만 증분에는 읽기도 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 문제는 읽기가 안전한지 여부입니다. 즉, 증분을 수행하는 다른 스레드가 동일한 값으로 증가하지 않을 것이라고 확신하십니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;의심이 갑니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;100% 정확한 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-- begin transaction here

select counter from myCounters where counter_id = 1 FOR UPDATE;

-- now the row is locked and nobody can read or modify its values

update myCounters set counter = ? where id = 1;

-- set ? to counter + 1 programmatically

commit; -- and unlock...
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 ISAM 테이블은 테이블 수준 잠금을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 업데이트 쿼리를 실행하는 동안 전체 테이블이 잠깁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순화된 사용 사례에 대한 답은 다음과 같습니다. 예, 이것은 스레드 세이프입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 다른 스토리지 엔진을 사용하거나 업데이트에 여러 테이블이 포함된 경우에는 그렇지 않을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 MySQL 설명서의 인용문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블 잠금을 사용하면 여러 세션을 테이블에서 동시에 읽을 수 있지만 세션이 테이블에 쓰려면 먼저 해당 세션에 대한 전용 액세스 권한을 얻어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트하는 동안 이 특정 테이블에 액세스하려는 다른 모든 세션은 업데이트가 완료될 때까지 기다려야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설계에 적합한 경우 자동 증분 열, 트랜잭션 또는 외부 동기화를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;건배!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예, 업데이트 쿼리를 실행하면 테이블(또는 InnoDB 형식 데이터베이스의 행)이 자동으로 잠깁니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 형식의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UPDATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원자력입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 형태의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UPDATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와의 트랜잭션을 사용하여 원자로 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT ... FOR UPDATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리가 더 복잡했지만 동일한 문제가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE CLB_SYNC_T SET PENDING_MESSAGES = PENDING_MESSAGES + ? WHERE USER_ID = ?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-1&quot;&gt;MyISAM&lt;/strong&gt;을 기본 엔진으로 사용하는 것은 도움이 되지 않았기 때문에 &lt;strong papago-id=&quot;16-3&quot;&gt;SELECT FOR&lt;/strong&gt; UPDATE 사용을 &lt;strong papago-id=&quot;16-3&quot;&gt;위해&lt;/strong&gt; 되돌아봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트를 위한 선택(&lt;strong papago-id=&quot;17-1&quot;&gt;SELECT FOR&lt;/strong&gt; UPDATE)을 통해 MySQL이 전체 테이블을 잠그지 않았기 때문에 행 업데이트를 위해 성능이 최대 10배 향상되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;InnoDB를 사용할 때의 또 다른 방법은 다음과 같이 여러 열의 고유 &lt;strong papago-id=&quot;18-1&quot;&gt;인덱스를 사용&lt;/strong&gt;하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블 'sessions' {unique_key(browser_session_id,profile_id) // 세션당 하나의 항목 삽입이 }회 수행되도록 보장합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세션에서 개수(browser_session_id) 선택&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자당 여러 세션이 허용되지 않으므로 고유한 세션의 결과를 보장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결론들&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;장점&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 삽입에는 사전 선택이 필요합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단점&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 경우에 적합한 것은 아닙니다.&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쓰기 성능이 느려지고 추가 관리가 필요할 수 있음&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4358732/&lt;a href=&quot;https://stackoverflow.com/questions/4358732/is-incrementing-a-field-in-mysql-atomic&quot; target=&quot;_blank&quot; papago-id=&quot;28-1&quot;&gt;is-incrementing-a-field-in-mysql-atomic&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/527</guid>
      <comments>https://shortcode.tistory.com/527#entry527comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:27:43 +0900</pubDate>
    </item>
    <item>
      <title>긴 16진수 문자열에서 파이썬 바이트 개체를 만드는 방법은 무엇입니까?</title>
      <link>https://shortcode.tistory.com/526</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;긴 16진수 문자열에서 파이썬 바이트 개체를 만드는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에 다음과 같은 16진수의 긴 시퀀스가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;000000000000484240&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;FA063DE5D0B744&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ADBED63A81&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;FAEA390000C8428640A43D5005BD44&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;훨씬 더 긴, 수 킬로바이트입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 python 2.6/3에서 바이트 객체로 변환하는 내장된 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;result = bytes.fromhex(some_hex_string)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python3를 포함한 Python 2.7 이상에서 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;result = bytearray.fromhex('deadbeef')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;0-0&quot;&gt;참고:&lt;/strong&gt; 시스템에 문제가 있는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bytearray.fromhex()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 2.6에서 기능합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;python.org 설명서에는 함수가 문자열을 인수로 수락하지만 적용하면 다음 오류가 발생한다고 나와 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
TypeError: fromhex() argument 1 must be unicode, not str`
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;16진수 코덱으로 이 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;i:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
&amp;gt;&amp;gt;&amp;gt; s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://doc.astro-wise.org/binascii.html#-unhexlify&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;binasci&lt;/a&gt; 모듈을 사용해 봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from binascii import unhexlify
b = unhexlify(myhexstr)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;import binascii

binascii.a2b_hex(hex_string)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그게 제가 한 방식입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/443967/&lt;a href=&quot;https://stackoverflow.com/questions/443967/how-to-create-python-bytes-object-from-long-hex-string&quot; target=&quot;_blank&quot; papago-id=&quot;10-1&quot;&gt;how-to-create-python-bytes-object-from-long-hex-string&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/526</guid>
      <comments>https://shortcode.tistory.com/526#entry526comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:12:11 +0900</pubDate>
    </item>
    <item>
      <title>Python에서 길이가 같은 여러 개의 목록 인터리브</title>
      <link>https://shortcode.tistory.com/525</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python에서 길이가 같은 여러 개의 목록 인터리브&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;1-1&quot;&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 답이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;      &lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/3678869/pythonic-way-to-combine-interleave-interlace-intertwine-two-lists-in-an-alte&quot; dir=&quot;ltr&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 목록을 교대로 결합(인터리브, 인터레이스, 서로 얽힘)하는 파이썬 방식?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(26개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot; papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마감됨&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;4-1&quot; title=&quot;2022-08-09 07:44:19Z&quot; papago-attr-id=&quot;1&quot;&gt;12개월 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이썬에서 같은 길이의 두 목록을 인터리브할 수 있는 좋은 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 주어진다고 해요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[1,2,3]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[10,20,30]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그것들을 로 바꾸고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[1,10,2,20,3,30]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문을 올리면서 다음을 간단히 수행할 수 있다는 것을 깨달았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[val for pair in zip(l1, l2) for val in pair]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;l1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;l2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 목록입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터리브할 N개의 리스트가 있다면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;lists = [l1, l2, ...]
[val for tup in zip(*lists) for val in tup]
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python&amp;gt;=2.3의 경우 &lt;a href=&quot;http://docs.python.org/2.3/whatsnew/section-slices.html&quot; papago-id=&quot;15-1&quot; rel=&quot;noreferrer&quot;&gt;확장 슬라이스&lt;/a&gt; 구문이 &lt;a href=&quot;http://docs.python.org/2.3/whatsnew/section-slices.html&quot; papago-id=&quot;15-1&quot; rel=&quot;noreferrer&quot;&gt;있습니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [0, 2, 4, 6, 8]
&amp;gt;&amp;gt;&amp;gt; b = [1, 3, 5, 7, 9]
&amp;gt;&amp;gt;&amp;gt; c = a + b
&amp;gt;&amp;gt;&amp;gt; c[::2] = a
&amp;gt;&amp;gt;&amp;gt; c[1::2] = b
&amp;gt;&amp;gt;&amp;gt; c
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c = a + b&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 정확하게 올바른 길이의 새 목록을 만드는 간단한 방법으로 사용됩니다(현 단계에서는 내용이 중요하지 않음).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 두 줄은 실제 인터리빙 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;b&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 사람은 요소를 할당합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 모든 짝수 색인에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 것은 요소를 할당합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;b&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 모든 홀수 지수에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정해진&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a = [1, 2, 3]
b = [10, 20, 30]
c = [100, 200, 300, 999]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 길이의 리스트를 가정하면 다음과 같은 인터리브 리스트를 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;itertools.chain&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;zip&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import itertools


list(itertools.chain(*zip(a, b)))
# [1, 10, 2, 20, 3, 30]
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대안&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://docs.python.org/3/library/itertools.html#itertools.zip_longest&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;itertools.zip_longest&lt;/code&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 동일하지 않은 리스트의 경우 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;zip_longest&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(권장):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[x for x in itertools.chain(*itertools.zip_longest(a, c)) if x is not None]
# [1, 100, 2, 200, 3, 300, 999]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 목록을 안전하게 인터리빙할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[x for x in itertools.chain(*itertools.zip_longest(a, b, c)) if x is not None]
# [1, 10, 100, 2, 20, 200, 3, 30, 300, 999]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://github.com/erikrose/more-itertools&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;more_itertools&lt;/code&gt;&lt;/a&gt;&lt;/em&gt;&lt;sup papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;+&lt;/font&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이터 도구 레시피와 함께 제공되는 라이브러리 및&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import more_itertools


list(more_itertools.roundrobin(a, b))
# [1, 10, 2, 20, 3, 30]

list(more_itertools.interleave(a, b))
# [1, 10, 2, 20, 3, 30]

list(more_itertools.interleave_longest(a, c))
# [1, 100, 2, 200, 3, 300, 999]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;code&gt;yield from&lt;/code&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 Python 3의 흥미로운 기능(권장하지는 않지만):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;list(filter(None, ((yield from x) for x in zip(a, b))))
# [1, 10, 2, 20, 3, 30]

list([(yield from x) for x in zip(a, b)])
# [1, 10, 2, 20, 3, 30]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;sub&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;sup papago-id=&quot;36-0&quot;&gt;+&lt;/sup&gt;다음을 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install more_itertools&lt;/code&gt;&lt;/sub&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다른 크기의 목록으로 이 작업을 수행할 방법이 필요했는데, 이 목록은 승인된 답변에 포함되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 솔루션은 제너레이터를 사용하며 그 사용법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def interleave(l1, l2):
    iter1 = iter(l1)
    iter2 = iter(l2)
    while True:
        try:
            if iter1 is not None:
                yield next(iter1)
        except StopIteration:
            iter1 = None
        try:
            if iter2 is not None:
                yield next(iter2)
        except StopIteration:
            iter2 = None
        if iter1 is None and iter2 is None:
            raise StopIteration()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; b = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
&amp;gt;&amp;gt;&amp;gt; list(interleave(a, b))
[1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 'e', 'f', 'g']
&amp;gt;&amp;gt;&amp;gt; list(interleave(b, a))
['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5, 'f', 'g']
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대안:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l1=[1,2,3]
&amp;gt;&amp;gt;&amp;gt; l2=[10,20,30]
&amp;gt;&amp;gt;&amp;gt; [y for x in map(None,l1,l2) for y in x if y is not None]
[1, 10, 2, 20, 3, 30]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 지도가 목록에서 병렬로 &lt;a href=&quot;http://docs.python.org/library/functions.html#map&quot; papago-id=&quot;41-1&quot; rel=&quot;noreferrer&quot;&gt;작동&lt;/a&gt;하기 때문에 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.python.org/release/2.2/lib/built-in-funcs.html&quot; papago-id=&quot;41-3&quot; rel=&quot;noreferrer&quot;&gt;2&lt;/a&gt;.2에서 &lt;a href=&quot;http://docs.python.org/release/2.2/lib/built-in-funcs.html&quot; papago-id=&quot;41-3&quot; rel=&quot;noreferrer&quot;&gt;동일하게 작동&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 자체로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출된 함수로서,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;map&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;튜플 목록을 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; map(None,l1,l2,'abcd')
[(1, 10, 'a'), (2, 20, 'b'), (3, 30, 'c'), (None, None, 'd')]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 튜플 목록을 평평하게 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 장점은,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;map&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 임의의 수의 목록에 대해 작동하며 길이가 다른 경우에도 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l1=[1,2,3]
&amp;gt;&amp;gt;&amp;gt; l2=[10,20,30]
&amp;gt;&amp;gt;&amp;gt; l3=[101,102,103,104]
&amp;gt;&amp;gt;&amp;gt; [y for x in map(None,l1,l2,l3) for y in x if y in not None]
[1, 10, 101, 2, 20, 102, 3, 30, 103, 104]
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 aix의 솔루션이 가장 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;2.2에서 작동해야 한다고 생각하는 또 다른 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; x=range(3)
&amp;gt;&amp;gt;&amp;gt; x
[0, 1, 2]
&amp;gt;&amp;gt;&amp;gt; y=range(7,10)
&amp;gt;&amp;gt;&amp;gt; y
[7, 8, 9]
&amp;gt;&amp;gt;&amp;gt; sum(zip(x,y),[])
Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
TypeError: can only concatenate list (not &quot;tuple&quot;) to list
&amp;gt;&amp;gt;&amp;gt; sum(map(list,zip(x,y)),[])
[0, 7, 1, 8, 2, 9]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 한 가지 더 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a=[x,y]
&amp;gt;&amp;gt;&amp;gt; [a[i][j] for j in range(3) for i in (0,1)]
[0, 7, 1, 8, 2, 9]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; sum((list(i) for i in zip(x,y)),[])
[0, 7, 1, 8, 2, 9]
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 방법도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;list1 = [1, 2, 3]
list2 = [10, 20, 30]

list(sum(zip(list1, list2), ()))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 생각은 비슷합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명단을 정리해 주세요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(zip 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;튜플로 납작하게 만들기(합(..., ()) 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명부로 전환.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;재미있는 접근법은 최종 목록의 위치를 키로 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from heapq import merge
from itertools import count

a = [1,2,3]
b = [10,20,30]

counter = count()
res = list(merge(a, b, key=lambda x: next(counter)))
print(res)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;산출량&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[1, 10, 2, 20, 3, 30]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 목록의 경우 다음과 같이 압축을 풀 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from heapq import merge
from itertools import count

a = [1, 2, 3]
b = [10, 20, 30]
c = [11, 21, 31]

counter = count()
res = list(merge(*[a, b, c], key=lambda x: next(counter)))
print(res)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;산출량&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[1, 10, 11, 2, 20, 21, 3, 30, 31]
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;[el for el in itertools.chain(*itertools.izip_longest([1,2,3], [4,5])) if el is not None]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 없으면 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 것.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;파이썬에서 길이가 같은 여러 목록을 인터리브&quot;라는 질문의 제목에 답하기 위해, 우리는 @ekhumoro의 2-list 답변을 일반화할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 @NPE의 (우아한) 솔루션과 달리 목록의 길이가 동일해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import itertools

def interleave(lists):
    &quot;&quot;&quot;Interleave a list of lists.

    :param lists: List of lists; each inner length must be the same length.
    :returns: interleaved single list
    :rtype: list

    &quot;&quot;&quot;
    if len(set(len(_) for _ in lists)) &amp;gt; 1:
        raise ValueError(&quot;Lists are not all the same length!&quot;)
    joint = list(itertools.chain(*lists))
    for l_idx, li in enumerate(lists):
        joint[l_idx::len(lists)] = li
    return joint
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; interleave([[0,2,4], [1, 3, 5]])
[0, 1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; interleave([[0,2,4], [1, 3, 5], [10, 11, 12]])
[0, 1, 10, 2, 3, 11, 4, 5, 12]
&amp;gt;&amp;gt;&amp;gt; interleave([[0,2,4], [1, 3, 5], [10, 11, 12], [13, 14, 15]])
[0, 1, 10, 13, 2, 3, 11, 14, 4, 5, 12, 15]
&amp;gt;&amp;gt;&amp;gt; interleave([[0,2,4], [1, 3, 5], [10, 11, 12], [13, 14]])
Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 10, in interleave
ValueError: Lists are not all the same length!
&amp;gt;&amp;gt;&amp;gt; interleave([[0,2,4]])
[0, 2, 4]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파티에 너무 늦었고, 좋은 답변들이 많지만, 저는 또한 다음을 사용하여 간단한 해결책을 제공하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extend()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;list1 = [1, 2, 3]
list2 = [10, 20, 30]

new_list = []
for i in range(len(list1)):
    new_list.extend([list1[i], list2[i]])
print(new_list)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[1, 10, 2, 20, 3, 30]
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/7946798/&lt;a href=&quot;https://stackoverflow.com/questions/7946798/interleave-multiple-lists-of-the-same-length-in-python&quot; target=&quot;_blank&quot; papago-id=&quot;66-1&quot;&gt;interleave-multiple-lists-of-the-same-length-in-python&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/525</guid>
      <comments>https://shortcode.tistory.com/525#entry525comment</comments>
      <pubDate>Sat, 22 Jul 2023 12:10:56 +0900</pubDate>
    </item>
    <item>
      <title>대응 라우터 및 스프링 부트 컨트롤러로 작업하는 방법</title>
      <link>https://shortcode.tistory.com/524</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대응 라우터 및 스프링 부트 컨트롤러로 작업하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 제 index.js 파일이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom'
import App from './components/App';

ReactDOM.render((
             &amp;lt;BrowserRouter&amp;gt;
                &amp;lt;App /&amp;gt;
             &amp;lt;/BrowserRouter&amp;gt;
             ), document.getElementById('root')
            );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이것은 App.js입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import React, { Component } from 'react';
import Main from './Main';

class App extends Component {
render() {
return (
      &amp;lt;div&amp;gt;
        &amp;lt;Main /&amp;gt;
      &amp;lt;/div&amp;gt;
  );
 }
}

export default App;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이건 제 메인.js 파일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import React, { Component } from 'react';
import { Switch, Route } from 'react-router-dom';
import Home from './Home';
import AdminHome from './AdminHome';

class Main extends Component {
render() {
return (
        &amp;lt;Switch&amp;gt;
          &amp;lt;Route exact path='/admin' component={AdminHome}/&amp;gt;
          &amp;lt;Route exact path='/' component={Home}/&amp;gt;
        &amp;lt;/Switch&amp;gt;
  );
 }
}

export default Main;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라우터가 /admin으로 라우팅되지 않지만 /로 라우팅되고 있습니다. 앱을 실행하고 URL 'localhost:8080/admin'을 누르면 흰색 레이블 오류가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 반응 라우터와 컨트롤러를 어떻게 사용해야 할지 완전히 혼란스럽습니다, 누가 저에게 방법을 제안할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 부트 컨트롤러의 모든 요청에 대해 index.&lt;strong papago-id=&quot;6-1&quot;&gt;dll을 반환&lt;/strong&gt;하는 것만으로 라우팅을 달성했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 되지 않는 모든 것을 제공하는 간단한 접근 방식&lt;/font&gt;&lt;/font&gt;&lt;code&gt;api&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React 앱은 ReGEx를 사용하는 API 컨트롤러를 만드는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ReactAppController {

    @RequestMapping(value = { &quot;/&quot;, &quot;/{x:[\\w\\-]+}&quot;, &quot;/{x:^(?!api$).*$}/**/{y:[\\w\\-]+}&quot; })
    public String getIndex(HttpServletRequest request) {
        return &quot;/index.html&quot;;
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 컨트롤러는 단순히 모든 것을 index.html로 리디렉션하여 리액트 및 리액트 라우터가 마법을 사용할 수 있도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ReGEx는 다음과 같이 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;'/'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루트와 일치합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;'/{x:[\\w\\-]+}'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째까지 모든 것이 일치합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\foo&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;'/{x:^(?!api$).*$}/**/{y:[\\w\\-]+}'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작하지 않는 모든 것과 일치합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;api&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\foo\bar?page=1&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적 리소스가 아니거나 api 호출이 아닌 경우 필터를 사용하여 index.html로 요청을 전달합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적 리소스는 /resources/static에 있는 경우 스프링 부팅을 통해 자동으로 제공됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;쉽게 필터링할 수 있도록 특정 폴더 /resources/&lt;strong papago-id=&quot;17-1&quot;&gt;static&lt;/strong&gt;/rct에 보관합니다. (regex를 사용한 두통은 원하지 않습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;index.반응 앱에 대한 경로:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://localhost:8080/rct/js/myreactapp.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 필터 RedirectToIndexFilter.java&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
public class RedirectToIndexFilter implements Filter {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        String requestURI = req.getRequestURI();

        if (requestURI.startsWith(&quot;/api&quot;)) {
            chain.doFilter(request, response);
            return;
        }

        if (requestURI.startsWith(&quot;/rct&quot;)) {
            chain.doFilter(request, response);
            return;
        }

        // all requests not api or static will be forwarded to index page. 
        request.getRequestDispatcher(&quot;/&quot;).forward(request, response);
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨트롤러에서 서버 index.html로&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Controller
public class AppController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @GetMapping(value = {&quot;/&quot;, &quot;&quot;})
    public String getIndex(HttpServletRequest request) {
        return &quot;/rct/index.html&quot;;
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨트롤러에서 서버로의 API 호출&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@RestController
public class ProjectController {

    private final ProjectService projectService;

    public ProjectController(ProjectService projectService) {
        this.projectService = projectService;
    }

    @GetMapping(&quot;/api/v1/projects/{id}&quot;)
    public ProjectData getProject(@PathVariable Long id) {
        projectService.get(id);
        ...
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 api 또는 정적이 아닌 모든 호출은 인덱스로 전달됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전달을 통해 대응 라우터에서 필요에 따라 URL을 유지하지만 index.html로 전달합니다.&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 이전에 게시된 컨트롤러의 업데이트된 버전입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;@Controller
public class ReactAppController {

    @RequestMapping(value = { &quot;/&quot;, &quot;/{x:[\\w\\-]+}&quot;, &quot;/{x:^(?!api$).*$}/*/{y:[\\w\\-]+}&quot;,&quot;/error&quot;  })
    public String getIndex(HttpServletRequest request) {
        return &quot;/index.html&quot;;
    }

}

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 경로를 사용하고 있다면 다음으로 이동하는 것이 어떻습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;HashRouter&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BrowserRouter&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 컨트롤러 폴더 아래:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UiController {
    /*
      /xyz and /abc are the urls which is used in react routing
     */
    @RequestMapping(value = { &quot;/&quot;, &quot;/xyz&quot;,&quot;/abc&quot;,&quot;/error&quot;  })
    public String getIndex(HttpServletRequest inRequest) {
        return &quot;/index.html&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;//Application 클래스에 ComponentScan을 추가하는 것을 잊지 마십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/47689971/&lt;a href=&quot;https://stackoverflow.com/questions/47689971/how-to-work-with-react-routers-and-spring-boot-controller&quot; target=&quot;_blank&quot; papago-id=&quot;29-1&quot;&gt;how-to-work-with-react-routers-and-spring-boot-controller&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/524</guid>
      <comments>https://shortcode.tistory.com/524#entry524comment</comments>
      <pubDate>Sat, 22 Jul 2023 11:54:26 +0900</pubDate>
    </item>
    <item>
      <title>외부 &amp;quot;C&amp;quot;는 함수 선언에만 필요합니까?</title>
      <link>https://shortcode.tistory.com/523</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 &quot;C&quot;는 함수 선언에만 필요합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 C 프로그램에서 호출해야 하는 C++ 함수를 작성했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 C 서 호 가 하 도 하 기 위 해 록 지 습 했 니 정 다 나 는 에 출 능 ▁c 습 니 했 다 지 ▁to 정 나▁specified ▁i 는 ▁from able ▁call ▁make 서 ▁c ▁it 에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-1&quot;&gt;함수&lt;/strong&gt; 선언에 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 C++ 코드를 컴파일했지만 컴파일러(Dignus Systems/C++)는 함수의 &lt;a href=&quot;http://en.wikipedia.org/wiki/Name_mangling&quot; papago-id=&quot;2-3&quot; rel=&quot;noreferrer&quot;&gt;이름&lt;/a&gt;을 망가트렸습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서, 그것은 분명히 그것을 존중하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하기 위해, 나는 덧붙였습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 &lt;strong papago-id=&quot;5-1&quot;&gt;정의&lt;/strong&gt;에 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이후 컴파일러는 C에서 호출 가능한 함수 이름을 생성했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 엄히말하면밀,면하,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 선언에만 지정하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 맞습니까? (&lt;a href=&quot;https://isocpp.org/wiki/faq/mixing-c-and-cpp#c-calls-cpp&quot; papago-id=&quot;7-1&quot; rel=&quot;noreferrer&quot;&gt;C++ FAQ&lt;/a&gt;에는 이에 대한 좋은 예가 있습니다.)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 정의에도 지정해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 이를 입증하는 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* ---------- */
/* &quot;foo.h&quot;    */
/* ---------- */

#ifdef __cplusplus
extern &quot;C&quot; {
#endif

/* Function declaration */
void foo(int);

#ifdef __cplusplus
}
#endif

/* ---------- */
/* &quot;foo.cpp&quot;  */
/* ---------- */

#include &quot;foo.h&quot;

/* Function definition */
extern &quot;C&quot;               // &amp;lt;---- Is this needed?
void foo(int i) {
  // do something...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 문제는 무언가를 잘못 코딩한 결과이거나 컴파일러 버그를 발견했을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 경우에도 스택 오버플로를 상담하여 어떤 것이 기술적으로 &quot;올바른&quot; 방법인지 확인하고 싶었습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선언에 포함되어 있고 정의 컴파일에 이미 표시되어 있는 한 함수 정의에 필요하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 표준은 구체적으로 다음을 명시합니다(7.5/5 연결 사양).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수는 명시적인 연결 사양이 확인된 후 연결 사양 없이 선언될 수 있습니다. 이전 선언에서 명시적으로 지정된 연결은 이러한 함수 선언의 영향을 받지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 저는 일반적으로 '를 넣었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의에서도 마찬가지입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 왜냐하면 외부 &quot;C&quot; 연결을 가진 함수이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 불필요하고 에 있을 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;virtual&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메소드 오버라이드에 대해) 하지만 저는 그들 중 한 명이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;b papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 질문을 잘못 이해한 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든, 저는 노력했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;
// foo.cpp
/* Function definition */

#include &quot;foo.h&quot;

void foo(int i) {
 //do stuff
}
void test(int i)
{
// do stuff
}

// foo.h
#ifdef __cplusplus
extern &quot;C&quot; {
#endif

/* Function declaration */
void foo(int);

#ifdef __cplusplus
}
#endif

void test(int);

&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 사용&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;nm&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일된 파일에서 기호를 보려면:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;
linuxuser$ nm foo.o
00000006 T _Z4testi
         U __gxx_personality_v0
00000000 T foo
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 외부 &quot;C&quot;로 선언된 함수의 이름이 헝클어지지 않으며 정의 시 외부 &quot;C&quot; 키워드가 필요하지 않음을 분명히 시사합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 &quot;C&quot; 없이 작성된 모든 C 라이브러리 코드가 필요했다면 C++ 프로그램에서 사용할 수 없었을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방금 이 상황에 직면했습니다...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유쾌한 경험이 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 나의 하나에서 선언되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void unused_isr(void) {}
void ADC_IRQHandler(void)     __attribute__ ((weak, alias(&quot;unused_isr&quot;))); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 어딘가에서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cpp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 I 정의:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void ADC_IRQHandler(void) {                                                                                  
    ...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 전달 선언을 다음으로 변경하는 것을 잊었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void ADC_IRQHandler(void);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AD 변환과 관련하여 제가 모든 것을 제대로 하고 있다는 것을 깨닫는 데 시간이 좀 걸렸지만, 정의에 &quot;외부 C&quot;를 추가하는 데 실패했습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extern &quot;C&quot; void ADC_IRQHandler(void) {                                                                                  
    ...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 상황에서 그것을 정의에 추가하는 습관을 갖는 것이 유용할 수 있는 이유는 단지 제 2센트입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 부분에 대해서는 제가 조금 전에 비슷한 문제가 있었고 제 머릿속에서 이 부분을 확실히 파악하는 데 시간이 좀 걸렸기 때문에 Brooks Moses만 이 부분을 제대로 건드렸기 때문에 좀 더 명확하게 진술할 필요가 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요약하면 헤더가 당신을 버릴 수도 있습니다. 컴파일러가 보는 모든 것은 cpp 파일이고 헤더가 외부 &quot;C&quot;와 함께 당신의 cpp에 다시 포함되지 않는다면, CXX 컴파일러가 C 링크, C로 만들기 위해서는 외부 &quot;C&quot;가 cpp 파일 어딘가(정의 또는 다른 선언)에 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ompiler는 헤더는 신경쓰지 않고 링커만 신경씁니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의 주위에는 필요하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;선언문 주변에 붙여놓기만 하면 빠져나갈 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 예에서 한 가지 메모는&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#ifdef __cplusplus
extern &quot;C&quot; {
#endif

/* Function declaration */
void foo(int);

#ifdef __cplusplus
}
#endif
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드가 전처리기 매크로 &quot;를 찾고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__cplusplus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;s&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 구현되지만 컴파일러에 따라 정의될 수도 있고 정의되지 않을 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제에서는 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선언문 주변에서, 하지만 &lt;strong papago-id=&quot;37-1&quot;&gt;당신&lt;/strong&gt;은 그곳에서 &quot;&quot;을 &lt;strong papago-id=&quot;37-1&quot;&gt;확인&lt;/strong&gt;하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__cplusplus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로 때문에 당신이 그렇게 했을 때 효과가 있었던 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/s&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sup&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 설명을 참조하십시오. Standard C++에는 다음이 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__cplusplus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로가 사전 처리기에 의해 정의됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러는 콜 사이트를 컴파일할 때 C 기호 이름과 호출 규칙을 사용해야 하며, 컴파일러는 함수 정의 자체를 컴파일할 때 C 기호 이름을 생성하고 C 호출 규칙을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의가 존재하는 번역 단위에서 볼 수 있는 외부-C 선언이 있다면, 외부-C를 정의에서 제외하는 것을 피할 수 있을지도 모릅니다만, 저는 그것을 확실히 모릅니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1380829/&lt;a href=&quot;https://stackoverflow.com/questions/1380829/is-extern-c-only-required-on-the-function-declaration&quot; target=&quot;_blank&quot; papago-id=&quot;43-1&quot;&gt;is-extern-c-only-required-on-the-function-declaration&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/523</guid>
      <comments>https://shortcode.tistory.com/523#entry523comment</comments>
      <pubDate>Sat, 22 Jul 2023 11:48:55 +0900</pubDate>
    </item>
    <item>
      <title>라라벨 4 웅변가와 열을 연결하는 방법은 무엇입니까?</title>
      <link>https://shortcode.tistory.com/522</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라라벨 4 웅변가와 열을 연결하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라는 테이블이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tenantdetails&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 포함하는 것.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Tenant_Id | First_Name | Last_Name | ........
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 나는 다시 찾고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;First_Name&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Last Name&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL의 연결 함수를 통해 하나의 열로.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 나는 나의 글에 씁니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;controller&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하기와 같이&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$tenants = Tenant::orderBy('First_Name')-&amp;gt;lists('CONCAT(`First_Name`,&quot; &quot;,`Last_Name`)','Tenant_Id');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 다음 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;pre&gt;&lt;code&gt; SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error 
 in your SQL syntax; check the manual that corresponds to your MySQL server
 version for the right syntax to use near '`,&quot; &quot;,`First_Name`)`, 
 `Id` from `tenantdetails` order by `F' at line 1 

 (SQL: select `CONCAT(`First_Name`,&quot; &quot;,`Last_Name`)`, `Id` 
 from `tenantdetails` order by `First_Name` asc).
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라라벨 웅변가의 MySQL 함수를 호출하는 동안 백트릭을 피할 수 있는 방법은 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 유창한 질의가 아닌 웅변에만 관심이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 부탁드립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갱신하다&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저를 도와주신 @Andreeco씨께 감사드립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래와 같이 Laravel 모델을 사용하여 보다 우아한 방식으로 이를 달성할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리 안에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;model&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function getTenantFullNameAttribute()
{
    return $this-&amp;gt;attributes['First_Name'] .' '. $this-&amp;gt;attributes['Last_Name'];
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 우리 안에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;controller&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$tenants = Tenant::orderBy('First_Name')-&amp;gt;get();
$tenants = $tenants-&amp;gt;lists('TenantFullName', 'Tenant_Id');
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Tenant::select('Tenant_Id', DB::raw('CONCAT(First_Name, &quot; &quot;, Last_Name) AS full_name'))
    -&amp;gt;orderBy('First_Name')
    -&amp;gt;lists('full_name', 'Tenant_Id');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쉬운 방법은 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;selectRaw&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Tailor에 의해 구현되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Jan 30, 2014&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/laravel/framework/issues/2918&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원천&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Tenant::selectRaw('CONCAT(First_Name, &quot; &quot;, Last_Name) as TenantFullName, id')-&amp;gt;orderBy('First_Name')-&amp;gt;lists('TenantFullName', 'id'))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선택한 결과에서 열을 선택하는 데 사용되는 lists(목록) 메서드입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 이름과 성에 연락하고 select 문에서 이 열에 새 별칭 이름을 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $tenants = Tenant::orderBy('First_Name')-&amp;gt;select(DB::row('CONCAT(`First_Name`,&quot; &quot;,`Last_Name`) as name'),'Tenant_Id')-&amp;gt;lists('name', 'id');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 목록에서 이 별칭을 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB&lt;strong papago-id=&quot;20-1&quot;&gt;::raw()&lt;/strong&gt;를 사용하여 필드의 값을 일치시켜야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Tenant::select(
          'Tenant_Id',
          DB::raw('CONCAT(First_Name,&quot;-&quot;,Last_Name) as full_name')

        )
       -&amp;gt;orderBy('First_Name')
       -&amp;gt;lists('full_name', 'Tenant_Id');
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리 작성기를 사용하여 다음과 같은 작업을 수행할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DB::table('Tenant')
-&amp;gt;selectRaw('CONCAT(First_Name, &quot; - &quot;, Last_Name) as fullName, id')
-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다 :)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22008487/&lt;a href=&quot;https://stackoverflow.com/questions/22008487/how-to-concatenate-columns-with-laravel-4-eloquent&quot; target=&quot;_blank&quot; papago-id=&quot;23-1&quot;&gt;how-to-concatenate-columns-with-laravel-4-eloquent&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/522</guid>
      <comments>https://shortcode.tistory.com/522#entry522comment</comments>
      <pubDate>Sat, 22 Jul 2023 11:48:12 +0900</pubDate>
    </item>
    <item>
      <title>Postgres 고유 제약 조건과 인덱스 비교</title>
      <link>https://shortcode.tistory.com/521</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Postgres 고유 제약 조건과 인덱스 비교&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.postgresql.org/docs/current/indexes-unique.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;문서&lt;/a&gt;를 이해할 수 있듯이 다음 정의는 동일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create table foo (
    id serial primary key,
    code integer,
    label text,
    constraint foo_uq unique (code, label));

create table foo (
    id serial primary key,
    code integer,
    label text);
create unique index foo_idx on foo using btree (code, label);    
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, &lt;a href=&quot;https://www.postgresql.org/docs/9.4/indexes-unique.html&quot; papago-id=&quot;2-1&quot; rel=&quot;noreferrer&quot;&gt;Postgres 9&lt;/a&gt;.4 &lt;a href=&quot;https://www.postgresql.org/docs/9.4/indexes-unique.html&quot; papago-id=&quot;2-1&quot; rel=&quot;noreferrer&quot;&gt;매뉴얼에는 다음&lt;/a&gt;과 같이 기재되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블에 고유 구속조건을 추가하는 권장 방법은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ALTER TABLE ... ADD CONSTRAINT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스를 사용하여 고유한 제약을 적용하는 것은 구현 세부사항으로 간주할 수 있으며 직접 접근해서는 안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(편집: 이 노트는 Postgres 9.5에서 매뉴얼에서 삭제되었습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 단지 좋은 스타일의 문제인가?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 변형들 중 하나를 선택할 경우(예: 성능)의 실질적인 결과는 무엇입니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 이 기본적이지만 중요한 문제에 대해 의구심이 들어 모범을 보이기로 결심했다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2개의 컬럼으로 구성된 &lt;em papago-id=&quot;8-1&quot;&gt;테스트테이블&lt;/em&gt; 마스터를 만듭니다.&lt;em papago-id=&quot;8-3&quot;&gt;con_id&lt;/em&gt; with unique contraint와 &lt;em papago-id=&quot;8-5&quot;&gt;ind_id&lt;/em&gt; indexed by unique index입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create table master (
    con_id integer unique,
    ind_id integer
);
create unique index master_unique_idx on master (ind_id);

    Table &quot;public.master&quot;
 Column |  Type   | Modifiers
--------+---------+-----------
 con_id | integer |
 ind_id | integer |
Indexes:
    &quot;master_con_id_key&quot; UNIQUE CONSTRAINT, btree (con_id)
    &quot;master_unique_idx&quot; UNIQUE, btree (ind_id)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표 설명(psql의 \d)에서는 고유 제약조건과 고유 인덱스를 구분할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고유성&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약을 위해 독특함을 확인해 봅시다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;test=# insert into master values (0, 0);
INSERT 0 1
test=# insert into master values (0, 1);
ERROR:  duplicate key value violates unique constraint &quot;master_con_id_key&quot;
DETAIL:  Key (con_id)=(0) already exists.
test=# insert into master values (1, 0);
ERROR:  duplicate key value violates unique constraint &quot;master_unique_idx&quot;
DETAIL:  Key (ind_id)=(0) already exists.
test=#
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예상대로 된다!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 키&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 마스터에 &lt;em papago-id=&quot;14-3&quot;&gt;있는&lt;/em&gt; 두 개의 열을 참조하는 두 개의 외부 키를 사용하여 세부 테이블을 &lt;em papago-id=&quot;14-1&quot;&gt;정의&lt;/em&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create table detail (
    con_id integer,
    ind_id integer,
    constraint detail_fk1 foreign key (con_id) references master(con_id),
    constraint detail_fk2 foreign key (ind_id) references master(ind_id)
);

    Table &quot;public.detail&quot;
 Column |  Type   | Modifiers
--------+---------+-----------
 con_id | integer |
 ind_id | integer |
Foreign-key constraints:
    &quot;detail_fk1&quot; FOREIGN KEY (con_id) REFERENCES master(con_id)
    &quot;detail_fk2&quot; FOREIGN KEY (ind_id) REFERENCES master(ind_id)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흠, 오류는 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;확실히 작동하도록 합시다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;test=# insert into detail values (0, 0);
INSERT 0 1
test=# insert into detail values (1, 0);
ERROR:  insert or update on table &quot;detail&quot; violates foreign key constraint &quot;detail_fk1&quot;
DETAIL:  Key (con_id)=(1) is not present in table &quot;master&quot;.
test=# insert into detail values (0, 1);
ERROR:  insert or update on table &quot;detail&quot; violates foreign key constraint &quot;detail_fk2&quot;
DETAIL:  Key (ind_id)=(1) is not present in table &quot;master&quot;.
test=#
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 열 모두 외부 키로 참조할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스를 사용한 제약 조건&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기존의 고유 인덱스를 사용하여 테이블 구속조건을 추가할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alter table master add constraint master_ind_id_key unique using index master_unique_idx;

    Table &quot;public.master&quot;
 Column |  Type   | Modifiers
--------+---------+-----------
 con_id | integer |
 ind_id | integer |
Indexes:
    &quot;master_con_id_key&quot; UNIQUE CONSTRAINT, btree (con_id)
    &quot;master_ind_id_key&quot; UNIQUE CONSTRAINT, btree (ind_id)
Referenced by:
    TABLE &quot;detail&quot; CONSTRAINT &quot;detail_fk1&quot; FOREIGN KEY (con_id) REFERENCES master(con_id)
    TABLE &quot;detail&quot; CONSTRAINT &quot;detail_fk2&quot; FOREIGN KEY (ind_id) REFERENCES master(ind_id)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 열 제약 조건 설명에는 차이가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부분 인덱스&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블 제약 조건 선언에서는 부분 인덱스를 만들 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 의 &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/sql-createtable.html&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;정의&lt;/a&gt;에서 직접 유래한다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;create table ...&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 에서는 .를 설정할 수 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WHERE clause&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부분 인덱스를 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;표현식(열뿐만 아니라)에 인덱스를 &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/sql-createindex.html&quot; papago-id=&quot;23-1&quot; rel=&quot;noreferrer&quot;&gt;작성&lt;/a&gt;하고 다른 매개변수(조합, 정렬 순서, NULL 배치)를 정의할 &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/sql-createindex.html&quot; papago-id=&quot;23-1&quot; rel=&quot;noreferrer&quot;&gt;수&lt;/a&gt;도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부분 인덱스를 사용하여 테이블 제약 조건을 추가할 수 &lt;strong papago-id=&quot;24-1&quot;&gt;없습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alter table master add column part_id integer;
create unique index master_partial_idx on master (part_id) where part_id is not null;

alter table master add constraint master_part_id_key unique using index master_partial_idx;
ERROR:  &quot;master_partial_idx&quot; is a partial index
LINE 1: alter table master add constraint master_part_id_key unique ...
                               ^
DETAIL:  Cannot create a primary key or unique constraint using such an index.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「」를 하는 또&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNIQUE INDEX&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNIQUE CONSTRAINT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 할 수 죠.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DROP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CREATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 제약 조건에서는 할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고유성은 제약사항입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스는 기존 모든 값을 빠르게 검색하여 지정된 값이 이미 존재하는지 확인할 수 있기 때문에 고유한 인덱스를 생성하여 구현됩니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개념적으로 인덱스는 구현 세부사항이며 고유성은 제약조건에만 관련되어야 한다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.postgresql.org/message-id/CAO8h7BJMX5V1TqzScTx2Nr1jH5iUFG8A071y-g1b_kdzpu9PDw%40mail.gmail.com&quot; rel=&quot;noreferrer&quot; papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전문&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 속도 성능은 동일해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다양한 사람들이 고유한 제약조건에 비해 고유한 인덱스의 이점을 제공하므로 단점이 있습니다. 고유한 제약조건은 지연될 수 있으며(트랜잭션이 끝날 때만 확인), 고유한 인덱스는 지연될 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 있는 은 을 하는 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ON CONFLICT ON CONSTRAINT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;clause(&lt;a href=&quot;https://stackoverflow.com/q/62292586/521799&quot; papago-id=&quot;36-1&quot;&gt;이&lt;/a&gt; 질문도 &lt;a href=&quot;https://stackoverflow.com/q/62292586/521799&quot; papago-id=&quot;36-1&quot;&gt;참조&lt;/a&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 동작하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sql prettyprint-override&quot;&gt;&lt;code&gt;CREATE TABLE T (a INT PRIMARY KEY, b INT, c INT);
CREATE UNIQUE INDEX u ON t(b);

INSERT INTO T (a, b, c)
VALUES (1, 2, 3)
ON CONFLICT ON CONSTRAINT u
DO UPDATE SET c = 4
RETURNING *;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작성 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[42704]: ERROR: constraint &quot;u&quot; for table &quot;t&quot; does not exist
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스를 구속조건으로 변환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sql prettyprint-override&quot;&gt;&lt;code&gt;DROP INDEX u;
ALTER TABLE t ADD CONSTRAINT u UNIQUE (b);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★★★★★★★★★★★.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;INSERT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이치노&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 SQL 식을 고유한 인덱스에서 사용할 수 있지만 제약 조건에서는 사용할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 동작하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE users (
    name text,
    UNIQUE (lower(name))
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;계속 작업하고 있어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE users (
    name text
);
CREATE UNIQUE INDEX uq_name on users (lower(name));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠금에 차이가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스를 추가해도 테이블에 대한 읽기 액세스는 차단되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;47-1&quot;&gt;ALTER&lt;/strong&gt; TABLE을 &lt;strong papago-id=&quot;47-1&quot;&gt;통해&lt;/strong&gt; 추가되므로 구속조건을 추가하면 테이블 잠금이 설정됩니다(따라서 모든 선택 항목이 차단됩니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문서는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ADD table_constraint [비활성]&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 테이블과 하여 새로운 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CREATE TABLE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 「」을 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOT VALID&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 현재 외부 키 제약에 대해서만 허용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &quot; &quot; &quot;로 표시되어 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOT VALID&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;53&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블 내의 모든 행이 제약조건을 충족하는지 확인하기 위해 잠재적인 초기 체크를 &lt;strong papago-id=&quot;53-1&quot;&gt;건너뜁니다&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제약조건은 후속 &lt;strong papago-id=&quot;53-3&quot;&gt;삽입 또는&lt;/strong&gt; 업데이트에 &lt;strong papago-id=&quot;53-3&quot;&gt;대해&lt;/strong&gt; 계속 적용됩니다(즉, 참조 테이블에 일치하는 행이 없는 한 실패합니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, &lt;em papago-id=&quot;53-5&quot;&gt;데이터베이스&lt;/em&gt;는 VALIDATE CONSTRARECT 옵션을 사용하여 검증될 때까지 테이블 내의 모든 행에 제약 조건이 유지된다고 가정하지 &lt;em papago-id=&quot;53-5&quot;&gt;않습니다&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 제약조건을 더해서 '부분적 고유성'이라고 부릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 일의성을 확보하는 방법에 대해서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고유한 제약 조건을 추가하면 제약 조건에 나열된 열 또는 열 그룹에 고유한 B-트리 인덱스가 자동으로 생성됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 행에만 적용되는 고유성 제한은 고유 제약으로 기술할 수 없지만 고유한 부분 인덱스를 생성하여 이러한 제한을 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: 테이블에 고유 구속조건을 추가할 때 권장되는 방법은 ALTER TABLE ... ADD RESTRAINT입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스를 사용하여 고유한 제약을 적용하는 것은 구현 세부사항으로 간주될 수 있으며 직접 액세스해서는 안 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 고유한 열에 수동으로 인덱스를 만들 필요가 없습니다. 그러면 자동으로 생성된 인덱스가 복제될 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 고유성을 보장하기 위해 인덱스를 생성하는 구속조건을 추가해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 어떻게 봐야 할까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;제약&quot;은 이 열이 고유해야 한다는 것을 &lt;em papago-id=&quot;60-1&quot;&gt;문법적&lt;/em&gt;으로 보장하는 것을 목표로 하며, &quot;인덱스&quot;는 &lt;em papago-id=&quot;60-3&quot;&gt;의미론적&lt;/em&gt;인 의미이며, &quot;실행 방법, 고유성 달성 방법, 구현 시 고유성이 무엇을 의미하는지&quot;에 관한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 Postgresql의 구현 방법은 매우 논리적입니다&lt;strong papago-id=&quot;60-5&quot;&gt;.첫&lt;/strong&gt; 번째로 &lt;strong papago-id=&quot;60-5&quot;&gt;열이 고유해야 한다고 선언한 &lt;/strong&gt;후 &lt;strong papago-id=&quot;60-5&quot;&gt;Postgresql에 의해 고유 인덱스를 추가하는 구현&lt;/strong&gt;이 추가됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 답변과 더불어 고유 제약 조건을 사용하여 인덱스와 같이 쿼리 속도를 높일 수 있는지 여부도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXPLAY(설명)에 표시된 대로 인덱스 스캔에 제약 조건이 실제로 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ALTER TABLE mytable
    ADD CONSTRAINT mytable_uc UNIQUE (other_id, name);

explain select * from mytable
    where name = 'name' and other_id = 154
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Index Scan using mytable_uc on mytable  (cost=0.28..2.29 rows=1 width=101)
  Index Cond: ((other_id = 154) AND ((name)::text = 'name'::text))
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;SELECT a.phone_number,count(*) FROM public.users a
Group BY phone_number Having count(*)&amp;gt;1;

SELECT a.phone_number,count(*) FROM public.retailers a
Group BY phone_number Having count(*)&amp;gt;1;

select a.phone_number from users a inner join users b
on a.id &amp;lt;&amp;gt; b.id and a.phone_number = b.phone_number order by a.id;


select a.phone_number from retailers a inner join retailers b
on a.id &amp;lt;&amp;gt; b.id and a.phone_number = b.phone_number order by a.id
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;DELETE FROM
    users a
        USING users b
WHERE
    a.id &amp;gt; b.id
    AND a.phone_number = b.phone_number;
    
DELETE FROM
    retailers a
        USING retailers b
WHERE
    a.id &amp;gt; b.id
    AND a.phone_number = b.phone_number;
    
CREATE UNIQUE INDEX CONCURRENTLY users_phone_number 
ON users (phone_number);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확인하는 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;insert into users(name,phone_number,created_at,updated_at) select name,phone_number,created_at,updated_at from users
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/23542794/&lt;a href=&quot;https://stackoverflow.com/questions/23542794/postgres-unique-constraint-vs-index&quot; target=&quot;_blank&quot; papago-id=&quot;65-1&quot;&gt;postgres-unique-constraint-vs-index&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/521</guid>
      <comments>https://shortcode.tistory.com/521#entry521comment</comments>
      <pubDate>Thu, 13 Apr 2023 21:55:01 +0900</pubDate>
    </item>
    <item>
      <title>Windows에서 bat 파일을 사용하여 폴더와 모든 콘텐츠를 삭제하려면 어떻게 해야 합니까?</title>
      <link>https://shortcode.tistory.com/520</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows에서 bat 파일을 사용하여 폴더와 모든 콘텐츠를 삭제하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 파일이 있는 폴더와 하위 폴더를 bat 파일을 사용하여 삭제하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 시도했지만 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@DEL D:\PHP_Projects\testproject\Release\testfolder*.*
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누구 도와줄 사람?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;@RD /S /Q &quot;D:\PHP_Projects\testproject\Release\testfolder&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://technet.microsoft.com/en-us/library/bb490990.aspx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-0&quot;&gt;설명&lt;/a&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디렉토리를 삭제(삭제)합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;RMDIR [/S] [/Q] [drive:]path RD [/S] [/Q] [drive:]path

/S      Removes all directories and files in the specified directory
        in addition to the directory itself.  Used to remove a directory
        tree.

/Q      Quiet mode, do not ask if ok to remove a directory tree with /S
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;code&gt;del /s /q c:\where ever the file is\*&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;rmdir /s /q c:\where ever the file is\&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;mkdir c:\where ever the file is\&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/7331056/&lt;a href=&quot;https://stackoverflow.com/questions/7331056/how-to-delete-a-folder-and-all-contents-using-a-bat-file-in-windows&quot; target=&quot;_blank&quot; papago-id=&quot;6-1&quot;&gt;how-to-delete-a-folder-and-all-contents-using-a-bat-file-in-windows&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/520</guid>
      <comments>https://shortcode.tistory.com/520#entry520comment</comments>
      <pubDate>Thu, 13 Apr 2023 21:54:26 +0900</pubDate>
    </item>
    <item>
      <title>C# 평탄화 json 구조</title>
      <link>https://shortcode.tistory.com/519</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C# 평탄화 json 구조&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C#(Newtonsoft로 표시됨)에 json-object가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Json.Linq.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JObject 객체)를 사용하여 사전에 평평하게 만들어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 설명하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;test&quot;,
    &quot;father&quot;: {
         &quot;name&quot;: &quot;test2&quot;
         &quot;age&quot;: 13,
         &quot;dog&quot;: {
             &quot;color&quot;: &quot;brown&quot;
         }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 다음과 같은 키-값 쌍이 있는 사전이 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[&quot;name&quot;] == &quot;test&quot;,
[&quot;father.name&quot;] == &quot;test2&quot;,
[&quot;father.age&quot;] == 13,
[&quot;father.dog.color&quot;] == &quot;brown&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 어떻게 해?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;JObject jsonObject=JObject.Parse(theJsonString);
IEnumerable&amp;lt;JToken&amp;gt; jTokens = jsonObject.Descendants().Where(p =&amp;gt; !p.HasValues);
Dictionary&amp;lt;string, string&amp;gt; results = jTokens.Aggregate(new Dictionary&amp;lt;string, string&amp;gt;(), (properties, jToken) =&amp;gt;
                    {
                        properties.Add(jToken.Path, jToken.ToString());
                        return properties;
                    });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네스트된 json 구조를 사전 객체에 평평하게 하는 것과 같은 요건이 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.bfcamara.com/post/75172803617/flatten-json-object-to-send-within-an-azure-hub&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;4-1&quot;&gt;여기&lt;/a&gt;서 해결책을 찾았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.NET에서는 Core 3.0이 하나의 방법입니다(Json).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET은 필요 없습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;5-3&quot;&gt;이건 분명 쉬워질 거야.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;using System.Linq;
using System.Text.Json;
(...)


public static Dictionary&amp;lt;string, JsonElement&amp;gt; GetFlat(string json)
{
    IEnumerable&amp;lt;(string Path, JsonProperty P)&amp;gt; GetLeaves(string path, JsonProperty p)
        =&amp;gt; p.Value.ValueKind != JsonValueKind.Object
            ? new[] { (Path: path == null ? p.Name : path + &quot;.&quot; + p.Name, p) }
            : p.Value.EnumerateObject() .SelectMany(child =&amp;gt; GetLeaves(path == null ? p.Name : path + &quot;.&quot; + p.Name, child));

    using (JsonDocument document = JsonDocument.Parse(json)) // Optional JsonDocumentOptions options
        return document.RootElement.EnumerateObject()
            .SelectMany(p =&amp;gt; GetLeaves(null, p))
            .ToDictionary(k =&amp;gt; k.Path, v =&amp;gt; v.P.Value.Clone()); //Clone so that we can use the values outside of using
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 표현력이 풍부한 버전을 다음에 나타냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시험&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;using System.Linq;
using System.Text.Json;
(...)

var json = @&quot;{
    &quot;&quot;name&quot;&quot;: &quot;&quot;test&quot;&quot;,
    &quot;&quot;father&quot;&quot;: {
            &quot;&quot;name&quot;&quot;: &quot;&quot;test2&quot;&quot;, 
         &quot;&quot;age&quot;&quot;: 13,
         &quot;&quot;dog&quot;&quot;: {
                &quot;&quot;color&quot;&quot;: &quot;&quot;brown&quot;&quot;
         }
        }
    }&quot;;

var d = GetFlat(json);
var options2 = new JsonSerializerOptions { WriteIndented = true };
Console.WriteLine(JsonSerializer.Serialize(d, options2));
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;산출량&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;test&quot;,
  &quot;father.name&quot;: &quot;test2&quot;,
  &quot;father.age&quot;: 13,
  &quot;father.dog.color&quot;: &quot;brown&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 표현력 높은 버전&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;using System.Linq;
using System.Text.Json;
(...)

static Dictionary&amp;lt;string, JsonElement&amp;gt; GetFlat(string json)
    {
        using (JsonDocument document = JsonDocument.Parse(json))
        {
            return document.RootElement.EnumerateObject()
                .SelectMany(p =&amp;gt; GetLeaves(null, p))
                .ToDictionary(k =&amp;gt; k.Path, v =&amp;gt; v.P.Value.Clone()); //Clone so that we can use the values outside of using
        }
    }


    static IEnumerable&amp;lt;(string Path, JsonProperty P)&amp;gt; GetLeaves(string path, JsonProperty p)
    {
        path = (path == null) ? p.Name : path + &quot;.&quot; + p.Name;
        if (p.Value.ValueKind != JsonValueKind.Object)
            yield return (Path: path, P: p);
        else
            foreach (JsonProperty child in p.Value.EnumerateObject())
                foreach (var leaf in GetLeaves(path, child))
                    yield return leaf;
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실 오늘 아침 SO에서 이 질문을 찾을 수 없었고 결국 저만의 확장 방법을 써서 반품하게 되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JValue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON BLOB의 리프 노드 값을 포함하는 객체.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 개선점을 제외하면 승인된 답변과 유사합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON 객체뿐만 아니라 사용자가 지정한 모든 JSON(어레이, 속성 등)을 처리합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리 사용량 감소&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출 없음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.Count()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 필요하지 않은 후손에게&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 사례에 따라 관련이 있을 수도 있고 없을 수도 있지만, 제 경우에 해당됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 JSON을 평평하게 만드는 법을 배웠다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://anotherdevblog.net/posts/flattening-json-in-json-net&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16-1&quot;&gt;블로그&lt;/a&gt;의 NET 오브젝트&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 쓴 확장 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public static class JExtensions
{
    public static IEnumerable&amp;lt;JValue&amp;gt; GetLeafValues(this JToken jToken)
    {
        if (jToken is JValue jValue)
        {
            yield return jValue;
        }
        else if (jToken is JArray jArray)
        {
            foreach (var result in GetLeafValuesFromJArray(jArray))
            {
                yield return result;
            }
        }
        else if (jToken is JProperty jProperty)
        {
            foreach (var result in GetLeafValuesFromJProperty(jProperty))
            {
                yield return result;
            }
        }
        else if (jToken is JObject jObject)
        {
            foreach (var result in GetLeafValuesFromJObject(jObject))
            {
                yield return result;
            }
        }
    }

    #region Private helpers

    static IEnumerable&amp;lt;JValue&amp;gt; GetLeafValuesFromJArray(JArray jArray)
    {
        for (var i = 0; i &amp;lt; jArray.Count; i++)
        {
            foreach (var result in GetLeafValues(jArray[i]))
            {
                yield return result;
            }
        }
    }

    static IEnumerable&amp;lt;JValue&amp;gt; GetLeafValuesFromJProperty(JProperty jProperty)
    {
        foreach (var result in GetLeafValues(jProperty.Value))
        {
            yield return result;
        }
    }

    static IEnumerable&amp;lt;JValue&amp;gt; GetLeafValuesFromJObject(JObject jObject)
    {
        foreach (var jToken in jObject.Children())
        {
            foreach (var result in GetLeafValues(jToken))
            {
                yield return result;
            }
        }
    }

    #endregion
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 내 통화 코드에서, 난 그냥 그 코드를&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Path&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로부터의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JValue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환된 객체:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var jToken = JToken.Parse(&quot;blah blah json here&quot;); 
foreach (var jValue in jToken.GetLeafValues()) 
{
    Console.WriteLine(&quot;{0} = {1}&quot;, jValue.Path, jValue.Value);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https&lt;a href=&quot;https://github.com/jsonfx/jsonfx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;21-1&quot;&gt;://github&lt;/a&gt;.com/jsonfx/jsonfx을 사용하여 json을 동적 개체로 역직렬화할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 Expando Object를 사용하여 원하는 것을 얻습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public Class1()
        {
            string json = @&quot;{
                                &quot;&quot;name&quot;&quot;: &quot;&quot;test&quot;&quot;,
                                &quot;&quot;father&quot;&quot;: {
                                     &quot;&quot;name&quot;&quot;: &quot;&quot;test2&quot;&quot;,
                                     &quot;&quot;age&quot;&quot;: 13,
                                     &quot;&quot;dog&quot;&quot;: {
                                         &quot;&quot;color&quot;&quot;: &quot;&quot;brown&quot;&quot;
                                     }
                                }
                            }&quot;;

            var reader = new JsonFx.Json.JsonReader();
            dynamic output = reader.Read(json);
            Dictionary&amp;lt;string, object&amp;gt; dict = new Dictionary&amp;lt;string, object&amp;gt;();

            GenerateDictionary((System.Dynamic.ExpandoObject) output, dict, &quot;&quot;);
        }

        private void GenerateDictionary(System.Dynamic.ExpandoObject output, Dictionary&amp;lt;string, object&amp;gt; dict, string parent)
        {
            foreach (var v in output)
            {
                string key = parent + v.Key;
                object o = v.Value;

                if (o.GetType() == typeof(System.Dynamic.ExpandoObject))
                {
                    GenerateDictionary((System.Dynamic.ExpandoObject)o, dict, key + &quot;.&quot;);
                }
                else
                {
                    if (!dict.ContainsKey(key))
                    {
                        dict.Add(key, o);
                    }
                }
            }
        }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSONPath를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$..*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON 구조의 모든 멤버를 가져오고 하위 항목이 없는 멤버를 필터링하여 컨테이너 속성을 건너뜁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var schemaObject = JObject.Parse(schema);
var values = schemaObject
    .SelectTokens(&quot;$..*&quot;)
    .Where(t =&amp;gt; !t.HasValues)
    .ToDictionary(t =&amp;gt; t.Path, t =&amp;gt; t.ToString());
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tymtam이 제공하는 코드와 지원되는 어레이를 기반으로 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    public static IEnumerable&amp;lt;KeyValuePair&amp;lt;string, string&amp;gt;&amp;gt; Flatten&amp;lt;T&amp;gt;(this T data, string seperator = &quot;:&quot;) where T : class
    {
        var json = JsonSerializer.Serialize(data);

        string GetArrayPath(string path, string name, int idx) =&amp;gt;
            path == null ? $&quot;{name}{seperator}{idx}&quot; : $&quot;{path}{seperator}{name}{seperator}{idx}&quot;;
        IEnumerable&amp;lt;(string Path, JsonElement Element)&amp;gt; GetLeaves(string path, string name, JsonElement element) =&amp;gt; element.ValueKind switch
        {
            JsonValueKind.Object =&amp;gt; element.EnumerateObject()
                .SelectMany(child =&amp;gt; GetLeaves(path == null ? name : $&quot;{path}{seperator}{name}&quot;, child.Name, child.Value)),
            JsonValueKind.Array =&amp;gt; element.EnumerateArray()
                .SelectMany((child, idx) =&amp;gt; child.ValueKind == JsonValueKind.Object
                        ? child.EnumerateObject().SelectMany(child =&amp;gt; GetLeaves(GetArrayPath(path, name, idx), child.Name, child.Value))
                        : new[] { (Path: GetArrayPath(path, name, idx), child) }
                    ),
            _ =&amp;gt; new[] { (Path: path == null ? name : $&quot;{path}{seperator}{name}&quot;, element) },
        };

        using JsonDocument document = JsonDocument.Parse(json); // Optional JsonDocumentOptions options
        return document.RootElement.EnumerateObject()
            .SelectMany(p =&amp;gt; GetLeaves(null, p.Name, p.Value))
            .ToDictionary(k =&amp;gt; k.Path, v =&amp;gt; v.Element.Clone().ToString()); //Clone so that we can use the values outside of using
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/7394551/&lt;a href=&quot;https://stackoverflow.com/questions/7394551/c-sharp-flattening-json-structure&quot; target=&quot;_blank&quot; papago-id=&quot;26-1&quot;&gt;c-sharp-flattening-json-structure&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/519</guid>
      <comments>https://shortcode.tistory.com/519#entry519comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:30:51 +0900</pubDate>
    </item>
    <item>
      <title>Python boto3를 사용하여 S3에서 JSON 파일 읽기</title>
      <link>https://shortcode.tistory.com/518</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python boto3를 사용하여 S3에서 JSON 파일 읽기&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;S3 버킷 '테스트'에서 JSON을 계속 따라다녔다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  'Details' : &quot;Something&quot; 
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드를 사용하여 이 JSON을 읽고 'Details' 키를 인쇄하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;s3 = boto3.resource('s3',
                    aws_access_key_id=&amp;lt;access_key&amp;gt;,
                    aws_secret_access_key=&amp;lt;secret_key&amp;gt;
                    )
content_object = s3.Object('test', 'sample_json.txt')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(repr(file_content))
print(json_content['Details'])
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 '&lt;strong papago-id=&quot;3-1&quot;&gt;string index는 정수&lt;/strong&gt;여야 한다'는 &lt;strong papago-id=&quot;3-1&quot;&gt;오류가 &lt;/strong&gt;발생하며 S3에서 파일을 다운로드하여 읽고 싶지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위 댓글에서도 언급했듯이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;repr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제거해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 속성에는 &lt;strong papago-id=&quot;2-1&quot;&gt;큰따옴표를 사용&lt;/strong&gt;해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;aws/s3에서 다음 파일 사용:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;Details&quot; : &quot;Something&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 Python 코드가 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import boto3
import json

s3 = boto3.resource('s3')

content_object = s3.Object('test', 'sample_json.txt')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(file_content)
print(json_content['Details'])
# &amp;gt;&amp;gt; Something
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 나에게 효과가 있었다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# read_s3.py

from boto3 import client

BUCKET = 'MY_S3_BUCKET_NAME'
FILE_TO_READ = 'FOLDER_NAME/my_file.json'
client = client('s3',
                 aws_access_key_id='MY_AWS_KEY_ID',
                 aws_secret_access_key='MY_AWS_SECRET_ACCESS_KEY'
                )
result = client.get_object(Bucket=BUCKET, Key=FILE_TO_READ) 
text = result[&quot;Body&quot;].read().decode()
print(text['Details']) # Use your desired JSON Key for your value 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한층 더 개선&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 코드 스니펫을 다음과 같이 부릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;read_s3.py&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AWS Id &amp;amp; Secret Keys를 직접 하드코드 하는 것은 좋지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;베스트 프랙티스의 경우는, 다음의 어느쪽인가를 고려할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(1) json 파일에서 AWS 자격 증명을 읽습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;aws_cred.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)는 로컬 스토리지에 저장됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from json import load
from boto3 import client
...
credentials = load(open('local_fold/aws_cred.json'))
client = client('s3',
                 aws_access_key_id=credentials['MY_AWS_KEY_ID'],
                 aws_secret_access_key=credentials['MY_AWS_SECRET_ACCESS_KEY']
                )
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(2) 환경변수(도입에 있어서 내가 선호하는 옵션)를 읽어냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    from os import environ
    client = boto3.client('s3',              
                         aws_access_key_id=environ['MY_AWS_KEY_ID'],
                           aws_secret_access_key=environ['MY_AWS_SECRET_ACCESS_KEY']
                         )
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 이제 셸 스크립트를 준비하겠습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;read_s3_using_env.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경변수 설정 및 python 스크립트 추가(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;read_s3.py&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# read_s3_using_env.sh
export MY_AWS_KEY_ID='YOUR_AWS_ACCESS_KEY_ID'
export MY_AWS_SECRET_ACCESS_KEY='YOUR_AWS_SECRET_ACCESS_KEY'
# execute the python file containing your code as stated above that reads from s3
python read_s3.py # will execute the python script to read from s3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 다음과 같이 단말기에서 셸 스크립트를 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sh read_s3_using_env.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가하기를 원했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;botocore.response.streamingbody&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 잘 어울린다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;json.load&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import json
import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
data = json.load(obj.get()['Body']) 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AWS Lambda에서 아래 코드를 사용하여 S3 버킷에서 JSON 파일을 읽고 python을 사용하여 처리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import json
import boto3
import sys
import logging

# logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

VERSION = 1.0

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = 'my_project_bucket'
    key = 'sample_payload.json'
    
    response = s3.get_object(Bucket = bucket, Key = key)
    content = response['Body']
    jsonObject = json.loads(content.read())
    print(jsonObject)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;복호화가 되지 않아 잠시 망설였습니다(s3개 오브젝트는 gzipped).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1543652/python-gzip-is-there-a-way-to-decompress-from-a-string?utm_medium=organic&amp;amp;utm_source=google_rich_qa&amp;amp;utm_campaign=google_rich_qa&quot; papago-id=&quot;25-1&quot;&gt;이&lt;/a&gt; 토론이 도움이 되었습니다.Python &lt;a href=&quot;https://stackoverflow.com/questions/1543652/python-gzip-is-there-a-way-to-decompress-from-a-string?utm_medium=organic&amp;amp;utm_source=google_rich_qa&amp;amp;utm_campaign=google_rich_qa&quot; papago-id=&quot;25-1&quot;&gt;gzip : 문자열에서 압축을 푸는 방법이 있습니까&lt;/a&gt;?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import boto3
import zlib

key = event[&quot;Records&quot;][0][&quot;s3&quot;][&quot;object&quot;][&quot;key&quot;]
bucket_name = event[&quot;Records&quot;][0][&quot;s3&quot;][&quot;bucket&quot;][&quot;name&quot;]

s3_object = S3_RESOURCE.Object(bucket_name, key).get()['Body'].read()

jsonData = zlib.decompress(s3_object, 16+zlib.MAX_WBITS)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jsonData를 인쇄하면 원하는 JSON 파일을 볼 수 있습니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AWS 자체에서 테스트를 실행하는 경우 CloudWatch 로그를 확인하십시오. lambda에서는 너무 길면 전체 JSON 파일을 출력하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;json 파일이 다음과 같은 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-json prettyprint-override&quot;&gt;&lt;code&gt;{
    &quot;test&quot;: &quot;test123&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;액세스 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dict&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;BUCKET=&quot;Bucket123&quot;

def get_json_from_s3(key: str):
    &quot;&quot;&quot;
    Retrieves the json file containing responses from s3. returns a dict

    Args:
        key (str): file path to the json file

    Returns:
        dict: json style dict
    &quot;&quot;&quot;
    data = client.get_object(Bucket=BUCKET, Key=key)
    json_text_bytes = data[&quot;Body&quot;].read().decode(&quot;utf-8&quot;)
    json_text = json.loads(json_text_bytes)
    return json_text
test_dict = get_json_from_s3(key=&quot;test.json&quot;)
print(test_dict[&quot;test&quot;])
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 S3를 지원하는 &lt;a href=&quot;https://cloudpathlib.drivendata.org/stable/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;30-1&quot;&gt;cloudpathlib&lt;/a&gt;과 Google Cloud Storage 및 Azure Blob Storage를 사용하면 쉽게 수행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 샘플입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import json
from cloudpathlib import CloudPath


# first, we'll write some json data so then we can later read it
CloudPath(&quot;s3://mybucket/asdf.json&quot;).write_text('{&quot;field&quot;: &quot;value&quot;}')
#&amp;gt; 18


# read data from S3
data = json.loads(
    CloudPath(&quot;s3://mybucket/asdf.json&quot;).read_text()
)

# look at the data
data
#&amp;gt; {'field': 'value'}

# access it now that it is loaded in Python
data[&quot;field&quot;] == &quot;value&quot;
#&amp;gt; True
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에는 특정 &lt;a href=&quot;https://cloudpathlib.drivendata.org/stable/other_client_settings/&quot; papago-id=&quot;31-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;옵션&lt;/a&gt; 또는 &lt;a href=&quot;https://cloudpathlib.drivendata.org/stable/authentication/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-3&quot;&gt;다른 인증 메커니즘&lt;/a&gt;을 &lt;a href=&quot;https://cloudpathlib.drivendata.org/stable/other_client_settings/&quot; papago-id=&quot;31-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;설정&lt;/a&gt;하거나 &lt;a href=&quot;https://cloudpathlib.drivendata.org/stable/caching/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-5&quot;&gt;영속&lt;/a&gt; 캐시를 유지하여 항상 S3에서 재다운로드할 필요가 없다는 점에서 몇 가지 이점이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/40995251/&lt;a href=&quot;https://stackoverflow.com/questions/40995251/reading-an-json-file-from-s3-using-python-boto3&quot; target=&quot;_blank&quot; papago-id=&quot;32-1&quot;&gt;reading-an-json-file-from-s3-using-python-boto3&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/518</guid>
      <comments>https://shortcode.tistory.com/518#entry518comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:29:16 +0900</pubDate>
    </item>
    <item>
      <title>Word press에서 태그 링크를 재생하는 방법</title>
      <link>https://shortcode.tistory.com/517</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Word press에서 태그 링크를 재생하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;투고 후에 태그를 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
 global $post;
 foreach(get_the_tags($post-&amp;gt;ID) as $tag) {
  echo '&amp;lt;li&amp;gt;'.$tag-&amp;gt;name.'&amp;lt;/li&amp;gt;';
  }
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 태그를 텍스트뿐만 아니라 질문 &lt;em papago-id=&quot;2-1&quot;&gt;아래&lt;/em&gt;의 태그를 클릭했을 때 스택 오버플로우에서와 같이 지정된 &lt;em papago-id=&quot;2-1&quot;&gt;태그로 필터링된 모든 투고를 표시&lt;/em&gt;하는 링크로 표시해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만드는 법?&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검색 결과를 표시하는 데 사용되는 페이지 템플릿은 무엇입니까?&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?php
global $post;
foreach(get_the_tags($post-&amp;gt;ID) as $tag)
{
    echo '&amp;lt;li&amp;gt;&amp;lt;a href=&quot;' . get_tag_link($tag-&amp;gt;term_id) . '&quot;&amp;gt;' . $tag-&amp;gt;name . '&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;';
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검색 결과를 표시하는 데 사용되는 페이지 템플릿: 검색 템플릿의 경우 태그 &lt;a href=&quot;http://codex.wordpress.org/Tag_Templates&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-3&quot;&gt;템플릿&lt;/a&gt; Tag_Template에 대해 &lt;a href=&quot;http://codex.wordpress.org/Creating_a_Search_Page&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;팔로우할&lt;/a&gt; 수 &lt;a href=&quot;http://codex.wordpress.org/Creating_a_Search_Page&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;있습니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;&amp;lt;?php echo get_tag_link($tag_id); ?&amp;gt;&quot;&amp;gt;tag name&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5078291/&lt;a href=&quot;https://stackoverflow.com/questions/5078291/how-to-diplay-tag-link-in-wordpress&quot; target=&quot;_blank&quot; papago-id=&quot;6-1&quot;&gt;how-to-diplay-tag-link-in-wordpress&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/517</guid>
      <comments>https://shortcode.tistory.com/517#entry517comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:28:14 +0900</pubDate>
    </item>
    <item>
      <title>경고 해결 방법: 리액트가 DOM 요소의 X 프로펠을 인식하지 않음</title>
      <link>https://shortcode.tistory.com/516</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고 해결 방법: 리액트가 DOM 요소의 X 프로펠을 인식하지 않음&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이어베이스 인증을 처리하기 위해 &lt;a href=&quot;https://react-firebase-js.com&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;react-firebase-js&lt;/a&gt;라고 하는 것을 사용하고 있습니다만, react와 프로바이더와 컨슈머의 아이디어에 대한 이해는 한정되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음에는 매우 큰 JSX를 최상위 레벨에서 구축했는데, 경고 없이 작동합니다. 없이 동작합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 컴포넌트로 나누려고 하면 제목과 다른 몇 가지 경고 메시지가 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 작업은 경고 없이 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// in App.js component

  render() {
    return (
        &amp;lt;header className=&quot;App-header&quot;&amp;gt;
            &amp;lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&amp;gt;
            &amp;lt;FirebaseAuthConsumer&amp;gt;
                {({ isSignedIn, user, providerId }) =&amp;gt; {
                    if (isSignedIn) {
                        return (
                           // ui for signed in user
                        );  
                    } else {
                        if (this.state.confirmationResult) {
                            return (
                                // ui to get a phone number sign in
                            );
                        } else {                  
                            return (
                                // ui to verify sms code that was sent
                            );
                        }
                    }
                }}
            &amp;lt;/FirebaseAuthConsumer&amp;gt;
        &amp;lt;/header&amp;gt;
    );
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이 보다 나은 디자인은 오류/경고를 발생시킨다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// in App.js component
render() {
    return (
      &amp;lt;MuiThemeProvider&amp;gt;
      &amp;lt;FirebaseAuthProvider {...config} firebase={firebase}&amp;gt;
        &amp;lt;div className=&quot;App&quot;&amp;gt;
          &amp;lt;IfFirebaseAuthed&amp;gt;
            &amp;lt;p&amp;gt;You're authed buddy&amp;lt;/p&amp;gt;
            &amp;lt;RaisedButton label=&quot;Sign Out&quot; onClick={this.signOutClick} /&amp;gt;
          &amp;lt;/IfFirebaseAuthed&amp;gt;
          &amp;lt;IfFirebaseUnAuthed&amp;gt;
              &amp;lt;Authenticater /&amp;gt;  // &amp;lt;-- this is the new component
        &amp;lt;/IfFirebaseUnAuthed&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/FirebaseAuthProvider&amp;gt;
      &amp;lt;/MuiThemeProvider&amp;gt;
    );
  }

// in my brand new Authenticator component...

  render() {
    return (
        &amp;lt;header className=&quot;App-header&quot;&amp;gt;
            &amp;lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&amp;gt;
            &amp;lt;FirebaseAuthConsumer&amp;gt;
                {({ isSignedIn, user, providerId }) =&amp;gt; {
                    if (isSignedIn) {
                        return (
                        &amp;lt;div&amp;gt;
                            &amp;lt;pre style={{ height: 300, overflow: &quot;auto&quot; }}&amp;gt;
                            {JSON.stringify({ isSignedIn, user, providerId }, null, 2)}
                            &amp;lt;/pre&amp;gt;
                        &amp;lt;/div&amp;gt;
                        );  
                    } else {
                        if (this.state.confirmationResult) {
                            return (
                                // ui to get a phone number sign in
                            );
                        } else {                  
                            return (
                                // ui to verify an sms code that was sent
                            );
                        }
                    }
                }}
            &amp;lt;/FirebaseAuthConsumer&amp;gt;
        &amp;lt;/header&amp;gt;
    );
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류/경고는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 가 [Error]를하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isSignedIn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DOM ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 어트리뷰트로  에 는,  「DOM」으로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;issignedin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;합니다&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모 컴포넌트에서 실수로 전달된 경우 DOM 요소에서 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 가 [Error]를하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;providerId&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DOM ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 어트리뷰트로  에 는,  「DOM」으로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;providerid&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;합니다&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모 컴포넌트에서 실수로 전달된 경우 DOM 요소에서 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[오류] 오류:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 reCAPTCHA 종속성을 로드할 수 없습니다! (익명 함수) (0.chunk.js:1216) [오류] 오류:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지정한 오류에 스택트레이스가 포함되어 있지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로바이더와 컨슈머의 사용법을 잘못 알고 있는 건가요, 아니면 리액트파이어베이스 코드에 오류가 있는 건가요, 아니면 다른 잘못된 작업을 하고 있는 건가요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마도 다음 행이 원인일 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;FirebaseAuthProvider {...config} firebase={firebase}&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 ★★★★★★★★★★★★★★★★★.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;config&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 현재 필드를 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isSignedIn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;providerId&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 그것들을 하위 컴포넌트로, 최종적으로 DOM 요소로 전송해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 필드를 전송하기 전에 개체에서 삭제해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const { providerId, isSignedIn, ...authProviderConfig } = config
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 하면,의 목적물 「」이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;authProviderConfig&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 하지 못하다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;providerId&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isSignedIn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★ 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 이상 혼란을 피하기 위해 Configuration개체를 명시적으로 재구축할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const authProviderConfig = { /* The fields from config FirebaseAuthProvider actually needs */ }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이 때 여러분도 확인해보셔야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FirebaseAuthProvider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 소품을 어떻게 사용하는지 확인하고 DOM 요소로 확산되지 않도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 자료: https://reactjs.org/warnings/&lt;a href=&quot;https://reactjs.org/warnings/unknown-prop.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;26-1&quot;&gt;unknown-prop&lt;/a&gt;.html&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 주의는 구성 요소에서 유효하지 않은 프로펠러를 전달했기 때문에 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 이것은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Component someUnknowprop='random-text' /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고를 트리거합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고를 없애기 위해서는 그 경고가 어디에서 오는 것인지 알아내야 한다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스택 트레이스를 통해 힌트를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소품 이름에 $를 추가해서 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.tsx 파일:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Wrapper $offset={isOffset}&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.style.tsx 파일에서는 다음 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;height: ${({ $offset }) =&amp;gt; ($offset ? 'calc(100% + 20px)' : '100%')};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 경우 IfFirebase를 사용할 때 이 오류가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;React-FireBase에서 컴포넌트를 자동 장착했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 컴포넌트 내부에서 함수를 반환해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 변경했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;IfFirebaseAuthed&amp;gt;
  ... My authenticated code here ...
&amp;lt;/IfFirebaseAuthed&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위해:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;IfFirebaseAuthed&amp;gt;
 {() =&amp;gt; (
    ... My authenticated code here ...
 )}
&amp;lt;/IfFirebaseAuthed&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이 이슈는 사라졌습니다.&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커스텀 소품 체크&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우 재사용 가능한 숨김 컴포넌트를 만들었습니다.(처음에는 텍스트가 마스크된 버튼이 마운트됩니다.)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;******&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 버튼을 클릭하면 CopyToClipboard 컴포넌트인 키(API 키)가 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const [hide, setHide] = useState(true);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hide&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버튼을 렌더링하고 있습니다(모든 소품을 펼칩니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Button onClick={() =&amp;gt; setHide(false)} {...props}&amp;gt;
     ******
&amp;lt;/Button&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 버튼을 클릭하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hide&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;False이며 CopyToClipboard 컴포넌트를 렌더링하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;CopyToClipboard
   {...props}
&amp;gt;
  {value}
&amp;lt;/CopyToClipboard&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제&lt;/font&gt;&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 시나리오에서, 나는 퍼지고 있다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{...props}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버튼과 CopyToClipboard 컴포넌트 양쪽으로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 CopyToClipboard의 일부 소품은 Button의 소품과 호환되지 않습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2 papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고치다&lt;/font&gt;&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 컴포넌트 상단에서 컴포넌트 고유의 소품(여기서는 CopyToClipboard)을 구축합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 나머지 소품을 양쪽 컴포넌트에 안전하게 배치하고 새로운 소품을 개별적으로 전달합니다(CopyToClipboard 컴포넌트에).&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;br&gt; 
&lt;pre&gt;&lt;code&gt;const {onCopy, ...restProps} = props
&lt;/code&gt;&lt;/pre&gt; 
&lt;br&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Button onClick={() =&amp;gt; setHide(false)} {...restProps}&amp;gt;
     ******
&amp;lt;/Button&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;br&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;CopyToClipboard
   onCopy={onCopy}
   {...props}
&amp;gt;
  {value}
&amp;lt;/CopyToClipboard&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/54468535/&lt;a href=&quot;https://stackoverflow.com/questions/54468535/how-to-solve-warning-react-does-not-recognize-the-x-prop-on-a-dom-element&quot; target=&quot;_blank&quot; papago-id=&quot;53-1&quot;&gt;how-to-solve-warning-react-does-not-recognize-the-x-prop-on-a-dom-element&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/516</guid>
      <comments>https://shortcode.tistory.com/516#entry516comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:27:40 +0900</pubDate>
    </item>
    <item>
      <title>Angular-ui 라우터는 2개의 상태를 동시에 활성화 합니다.</title>
      <link>https://shortcode.tistory.com/515</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular-ui 라우터는 2개의 상태를 동시에 활성화 합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개의 상태를 동시에 사용해야 합니다. 하나는 페이지용이고 다른 하나는 여러 개의 하위 상태가 있는 모달용입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 모달 상태를 호출하면 페이지 상태가 변경되어 내 페이지가 지워집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;my page의 child state child를 만드는 것은 modal이 여러 페이지에 사용되기 때문에 해결책이 되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$stateProvider
.state('user', {}) // page
.state('bookshelf', {}) // page
.state('books', {}) // modal
.state('books.read', {}) // sub state of modal
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 만약에 내가 하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;user&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 모달(modal)을 열면 상태가 바뀌어&lt;/font&gt;&lt;/font&gt;&lt;code&gt;books&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 내 모달에 콘텐츠가 있지만 페이지 내용은 지워집니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 고치죠?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UI에서는 이 방법이 불가능하다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 라우터&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 설명하는 것은 기본 상태와 &lt;em papago-id=&quot;8-1&quot;&gt;독립적&lt;/em&gt;으로 상태를 추적하는 모달 구성요소(지시문으로 작성되는 것이 이상적임)입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 UI를 생각할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;라우터는 상태 트리를 작성함으로써 동작합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;언제든지 트리의 한 가지만 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;브런치를 더 깊이 파고들 수 있습니다(즉,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;book&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;book.open&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;book.open.checked&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 동시에 두 장소에 있을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 문제의 또 다른 문제는 어떻게 두 개의 다른 트리의 상태를 하나의 URL로 시리얼화하느냐는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;불가능하다는 게 아니라 해결하기 어려운 문제일 뿐이에요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 문제를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/angular-ui/ui-router/issues/119&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/angular-ui/ui-router/issues/119&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/angular-ui/ui-router/issues/384&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/angular-ui/ui-router/issues/384&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/angular-ui/ui-router/issues/475&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/angular-ui/ui-router/issues/475&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 이러한 저장소를 확인하면 문제를 해결하는 데 더 많은 도움이 될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/afterglowtech/angular-detour&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/afterglowtech/angular-detour&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/stu-salsbury/angular-couch-potato&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/stu-salsbury/angular-couch-potato&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당면한 문제를 해결하는 한, 가장 쉬운 방법은 상태 구성 내의 모달 상태를 제어하는 것을 포기하는 것이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 루트 또는 추상 상태를 추가하고 모달(modal)이 열려 있는지 추적합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 다음과 &lt;a href=&quot;http://jsbin.com/donisogi/3/edit&quot; papago-id=&quot;22-1&quot;&gt;같이 이벤트&lt;/a&gt;를 사용하여 컨트롤러 간에 통신할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: 청취에는 &lt;a href=&quot;https://github.com/angular/angular.js/issues/4574&quot; papago-id=&quot;22-3&quot;&gt;퍼포먼스에 영향&lt;/a&gt;이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$rootScope&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;꼭 조사해 주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 (누군가 저를 자유롭게 수정해 주세요) 이 구현에는 이러한 문제가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AppCtrl&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;절대 파괴되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2015년 1월 15일 편집&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 매우 일반적인 사용 사례로 UI 라우터의 핵심 요소 중 하나가 UI &lt;a href=&quot;https://github.com/christopherthielen/ui-router-extras&quot; papago-id=&quot;26-1&quot;&gt;라우터&lt;/a&gt; 엑스트라라는 &lt;a href=&quot;https://github.com/christopherthielen/ui-router-extras&quot; papago-id=&quot;26-1&quot;&gt;플러그인&lt;/a&gt;/추가 기능을 유지하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 &quot;Future States&quot;라고 불리는 게으른 부하를 위한 유틸리티도 포함되어 있어 매우 유용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 작업 시간을 벌고 싶은 기능 중 하나는 URL(또는 로컬 스토리지) 내의 모든 상태를 유지하고 &quot;컴포넌트&quot;를 재사용할 수 있도록 하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;후자는 UI 라우터 로드맵에도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22313492/&lt;a href=&quot;https://stackoverflow.com/questions/22313492/angular-ui-router-get-two-states-active-in-parallel&quot; target=&quot;_blank&quot; papago-id=&quot;29-1&quot;&gt;angular-ui-router-get-two-states-active-in-parallel&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/515</guid>
      <comments>https://shortcode.tistory.com/515#entry515comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:25:54 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript 프로젝트에서 기존 C# 클래스 정의를 재사용하는 방법</title>
      <link>https://shortcode.tistory.com/514</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 프로젝트에서 기존 C# 클래스 정의를 재사용하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TypeScript&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;엔티티 프레임워크 도메인 모델이 이미 존재하는 MVC 프로젝트에 속하는 HTML 클라이언트 프로젝트에서 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2개의 프로젝트(클라이언트측과 서버측)를 완전히 분리해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 때 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON REST를 사용.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 나의 론론, 제 of는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;domain&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트측 오브젝트는 서버측 오브젝트와 일치해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;과거에는 보통 수동으로 이 작업을 수행했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; C#  정의)를 할 수 있는 ?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;POJO&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 。&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 C#을 TypeScript에 매핑할 수 있는 것은 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;POCO가 많거나 자주 변경될 수 있다고 생각되는 경우 변환기를 만들 수 있습니다. 즉, 다음과 같은 간단한 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class MyPoco {
    public string Name { get; set; }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export class MyPoco {
    public Name: string;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://typescript.codeplex.com/discussions/406685&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;Codeplex&lt;/a&gt;에 대해서도 C&lt;a href=&quot;https://typescript.codeplex.com/discussions/406685&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;#&lt;/a&gt;에서 자동 &lt;a href=&quot;https://typescript.codeplex.com/discussions/406685&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;생성&lt;/a&gt;에 대해 &lt;a href=&quot;https://typescript.codeplex.com/discussions/406685&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;설명&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 상태를 유지하기 위해 TypeLite는 C#에서 TypeScript 인터페이스를 생성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://type.litesolutions.net/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://type.litesolutions.net/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://vswebessentials.com/features/typescript&quot; papago-id=&quot;11-0&quot; rel=&quot;noreferrer&quot;&gt;Web&lt;/a&gt; Essentials를 통해 C# 파일을 TypeScript로 컴파일할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.d.ts&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 저장합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 다음 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.ts&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;files.complete files files files files files files files files.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/nxB5Q.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;vscode를 사용하는 경우 확장 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=rafaelsalguero.csharp2ts&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-1&quot;&gt;csharp2ts&lt;/a&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; C#하고, 「C#」을합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Convert C# to TypeScript&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령어 팔레트A 변환 예:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class Person
{
    /// &amp;lt;summary&amp;gt;
    /// Primary key
    /// &amp;lt;/summary&amp;gt;
    public int Id { get; set; }

    /// &amp;lt;summary&amp;gt;
    /// Person name
    /// &amp;lt;/summary&amp;gt;
    public string Name { get; set; }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export interface Person
{
    /**Primary key */
    Id : number;

    /**Person name */
    Name : string;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeLite 및 T4&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 TS는 둘 다 양호해 보였고, Type Lite 중 하나를 선택했을 뿐이며, Type Lite의 지원을 받기 위해 포크를 설치했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;19-0&quot;&gt;값&lt;/strong&gt; 유형,&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무효&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;21-0&quot;&gt;camel&lt;/strong&gt; Casing (TypeScript root doc은 낙타를 사용합니다.이것은 C#과 너무 잘 어울립니다)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;22-0&quot;&gt;퍼블릭&lt;/strong&gt; 필드(깨끗하고 읽기 쉬운 POCO를 좋아합니다.또, C# 컴파일러도 간단하게 할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈 생성 비활성화&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 C# &lt;strong papago-id=&quot;24-1&quot;&gt;인터페이스&lt;/strong&gt;가 필요했고 이제 나만의 것을 만들 때가 되었다고 생각하고 내가 필요한 것을 하는 간단한 T4 스크립트를 작성했다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Enums도 &lt;strong papago-id=&quot;24-3&quot;&gt;포함&lt;/strong&gt;됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;리포는 불필요합니다.T4는 100줄 미만입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브러리도 NuGet도 없이 이 단순한 T4 파일만 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Visual Studio &quot;T4 visual visual visual visual visual visual visual visual visual visual visual visual visual&quot;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 이 파일을 붙여넣습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「ACME」를 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마다 C#을 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;#= Interface&amp;lt;Acme.Duck&amp;gt;() #&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순서에는 문제가 있지만, 다음의 인터페이스에서는 기존의 타입이 모두 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터페이스만 사용하는 경우 파일 확장자는 .&lt;em papago-id=&quot;27-1&quot;&gt;d.ts일 &lt;/em&gt;수 있습니다.enum의 경우 변수가 인스턴스화되기 &lt;em papago-id=&quot;27-3&quot;&gt;때문&lt;/em&gt;에 .ts 파일이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;본을해해 해해해다다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;#@ template debug=&quot;true&quot; hostSpecific=&quot;true&quot; language=&quot;C#&quot; #&amp;gt;
&amp;lt;#@ output extension=&quot;.ts&quot; #&amp;gt;
&amp;lt;#@ Assembly Name=&quot;System.Core.dll&quot; #&amp;gt;
&amp;lt;#@ assembly name=&quot;$(TargetDir)ACME.Core.dll&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Reflection&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Collections.Generic&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Text&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Linq&quot; #&amp;gt;

&amp;lt;#= Interface&amp;lt;Acme.Bunny&amp;gt;() #&amp;gt;
&amp;lt;#= Interface&amp;lt;Acme.Duck&amp;gt;() #&amp;gt;
&amp;lt;#= Interface&amp;lt;Acme.Birdy&amp;gt;() #&amp;gt;
&amp;lt;#= Enums&amp;lt;Acme.CarrotGrade&amp;gt;() #&amp;gt;
&amp;lt;#= Interface&amp;lt;Acme.LinkParticle&amp;gt;() #&amp;gt;

&amp;lt;#+  
    List&amp;lt;Type&amp;gt; knownTypes = new List&amp;lt;Type&amp;gt;();

    string Interface&amp;lt;T&amp;gt;()
    {   
        Type t = typeof(T);     
        var sb = new StringBuilder();
        sb.AppendFormat(&quot;interface {0} {{\n&quot;, t.Name);
        foreach (var mi in GetInterfaceMembers(t))
        {
            sb.AppendFormat(&quot;  {0}: {1};\n&quot;, this.ToCamelCase(mi.Name), GetTypeName(mi));
        }
        sb.AppendLine(&quot;}&quot;);
        knownTypes.Add(t);
        return sb.ToString();
    }

    IEnumerable&amp;lt;MemberInfo&amp;gt; GetInterfaceMembers(Type type)
    {
        return type.GetMembers(BindingFlags.Public | BindingFlags.Instance)
            .Where(mi =&amp;gt; mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property);
    }

    string ToCamelCase(string s)
    {
        if (string.IsNullOrEmpty(s)) return s;
        if (s.Length &amp;lt; 2) return s.ToLowerInvariant();
        return char.ToLowerInvariant(s[0]) + s.Substring(1);
    }

    string GetTypeName(MemberInfo mi)
    {
        Type t = (mi is PropertyInfo) ? ((PropertyInfo)mi).PropertyType : ((FieldInfo)mi).FieldType;
        return this.GetTypeName(t);
    }

    string GetTypeName(Type t)
    {
        if(t.IsPrimitive)
        {
            if (t == typeof(bool)) return &quot;bool&quot;;
            if (t == typeof(char)) return &quot;string&quot;;
            return &quot;number&quot;;
        }
        if (t == typeof(decimal)) return &quot;number&quot;;            
        if (t == typeof(string)) return &quot;string&quot;;
        if (t.IsArray)
        {            
            var at = t.GetElementType();
            return this.GetTypeName(at) + &quot;[]&quot;;
        }
        if(typeof (System.Collections.IEnumerable).IsAssignableFrom(t)) 
        {
            var collectionType = t.GetGenericArguments()[0]; // all my enumerables are typed, so there is a generic argument
            return GetTypeName(collectionType) + &quot;[]&quot;;
        }            
        if (Nullable.GetUnderlyingType(t) != null)
        {
            return this.GetTypeName(Nullable.GetUnderlyingType(t));
        }
        if(t.IsEnum) return &quot;number&quot;;
        if(knownTypes.Contains(t)) return t.Name;
        return &quot;any&quot;;
    }

    string Enums&amp;lt;T&amp;gt;() // Enums&amp;lt;&amp;gt;, since Enum&amp;lt;&amp;gt; is not allowed.
    {
        Type t = typeof(T);        
        var sb = new StringBuilder();        
        int[] values = (int[])Enum.GetValues(t);
        sb.AppendLine(&quot;var &quot; + t.Name + &quot; = {&quot;);
        foreach(var val in values) 
        {
            var name = Enum.GetName(typeof(T), val);
            sb.AppendFormat(&quot;{0}: {1},\n&quot;, name, val);
        }
        sb.AppendLine(&quot;}&quot;);
        return sb.ToString();
    }
#&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트의 다음 레벨은 MVC Json Controller 클래스에서 서비스 인터페이스를 작성하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;강화해 보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;타이핑 프레임워크&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그게 네 문제를 해결해 주는 것 같아&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.nuget.org/packages/Reinforced.Typings/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;32-1&quot;&gt;NuGet&lt;/a&gt;에서 설치&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하여 'POCO'를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[TsInterface]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;using Reinforced.Typings.Attributes;
namespace YourNamespace {
    [TsInterface]
    public class YourPoco
    {
        public int YourNumber { get;set; }
        public string YourString { get;set; }
        public List&amp;lt;string&amp;gt; YourArray { get;set; }
        public Dictionary&amp;lt;int, object&amp;gt; YourDictionary { get;set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트 재구축&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 TypeScript에서 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%Your_Project_Directory%/Scripts/project.ts&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 수동으로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;module YourNamespace {
    export interface IYourPoco
    {
        YourNumber: number;
        YourString: string;
        YourArray: string[];
        YourDictionary: { [key: int]: any };
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대해 한 작업을 수행하고 &quot;POCO&quot;를 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;project.ts&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 코코&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/reinforced/Reinforced.Typings/wiki&quot; rel=&quot;noreferrer&quot; papago-id=&quot;40-1&quot;&gt;자세한&lt;/a&gt; 내용은 문서 Wiki를 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하기 위한 나의 접근 방식은 다음과 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성을 사용하여 C# 클래스를 선언하면 (T4 변환을 사용하여) .d.ts 파일이 생성됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://nuget.org/packages/T4TS&quot; papago-id=&quot;41-1&quot;&gt;Nuget에 패키지&lt;/a&gt;가 있고 소스를 &lt;a href=&quot;https://github.com/cskeppstedt/t4ts&quot; papago-id=&quot;41-3&quot;&gt;github&lt;/a&gt;에서 사용할 수 &lt;a href=&quot;https://github.com/cskeppstedt/t4ts&quot; papago-id=&quot;41-3&quot;&gt;있습니다&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아직 프로젝트를 진행 중인데, 지원이 꽤 광범위해요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio를 사용하는 경우 타이프라이터 확장자를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://visualstudiogallery.msdn.microsoft.com/e1d68248-f30e-4a5d-bf18-31399a0bcfa6&quot; rel=&quot;noreferrer&quot; papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio 갤러리&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://frhagn.github.io/Typewriter/index.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹사이트/문서&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갱신하다&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VS 2015에 Web &lt;a href=&quot;http://vswebessentials.com/&quot; papago-id=&quot;46-1&quot; rel=&quot;noreferrer&quot;&gt;Essentials&lt;/a&gt;가 설치되어 &lt;a href=&quot;http://vswebessentials.com/&quot; papago-id=&quot;46-1&quot; rel=&quot;noreferrer&quot;&gt;있는&lt;/a&gt; 경우 클래스 파일을 오른쪽 클릭하여 컨텍스트메뉴에서&amp;gt; [ Web Essentials ]&amp;gt; [ Create Typescript Intellisense File ]를 선택합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C# 클래스에서 TypeScript 인터페이스를 생성할 수 있는 작은 유틸리티를 만들었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://nuget.org/packages/TypeLite&quot; papago-id=&quot;47-1&quot;&gt;NuGet&lt;/a&gt; 패키지로 제공됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 문서는 &lt;a href=&quot;http://type.litesolutions.net/&quot; papago-id=&quot;47-3&quot;&gt;프로젝트&lt;/a&gt; 웹 페이지에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &lt;a href=&quot;http://frhagn.github.io/Typewriter/pages/examples.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;48-1&quot;&gt;도서관&lt;/a&gt; 타이프라이터를 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스, enum, 인터페이스 등뿐 아니라 api 컨트롤러도 변환할 수 있어 그야말로 훌륭합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 소스 .cs 파일을 저장하는 즉시 실행되므로 외부 도구를 트리거할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.cs를 저장하면 .ts가 갱신됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;T4 템플릿(&lt;a href=&quot;https://bitbucket.org/JamesDiacono/jdiacono/src/tip/JDiacono/TypeScript&quot; rel=&quot;noreferrer&quot; papago-id=&quot;51-1&quot;&gt;뷰&lt;/a&gt; 소스)을 사용한 작은 솔루션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 CLR POCO에서 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class Parent : Person
{
    public string Name { get; set; }
    public bool? IsGoodParent { get; set; }
    public virtual ICollection&amp;lt;Child&amp;gt; Children { get; set; }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 인터페이스:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;///&amp;lt;reference path=&quot;Child.d.ts&quot; /&amp;gt;
///&amp;lt;reference path=&quot;Person.d.ts&quot; /&amp;gt;
interface Parent extends Person {
    Name : string;
    IsGoodParent? : bool;
    Children : Child[];
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성된 모든 TypeScript 클래스/인터페이스에 대해 개별 파일을 만들어야 할 경우(즉, &quot;파일당 단일 클래스&quot; 방식으로) TypeGen을 &lt;a href=&quot;https://www.nuget.org/packages/TypeGen/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;54-1&quot;&gt;사용&lt;/a&gt;해 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지 매니저 콘솔에서 C# 클래스/enum에 따라 TypeScript 파일을 생성할 수 있는 도구입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 지원되는 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내보내기, Enum; TS 클래스 또는 인터페이스로 POCO 내보내기&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상속.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범용형&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컬렉션/네스트된 컬렉션 유형&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타 몇 가지 추가 기능이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오픈 소스이기도 합니다(&lt;a href=&quot;https://github.com/jburzynski/TypeGen&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;59-1&quot;&gt;github&lt;/a&gt;에서 확인할 수 있습니다).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오픈 소스 프로젝트 &lt;a href=&quot;http://nswag.org&quot; rel=&quot;nofollow&quot; papago-id=&quot;60-1&quot;&gt;NSwag&lt;/a&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GUI 에서는, 을 선택할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기존 NET 클래스&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET DLL 및 NET DLL에 대한 TypeScript 인터페이스를 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 프로젝트에서는 명령줄 툴과 T4 템플릿 지원 및 Web API 컨트롤러용 클라이언트 코드 생성도 제공합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;남성분들은&lt;strong papago-id=&quot;62-2&quot;&gt; &lt;/strong&gt;https://github.com/&lt;strong papago-id=&quot;62-2&quot;&gt;reinforced&lt;/strong&gt;/Reinforced.Typings을 보시기 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 지난 며칠간 Typelite와 t4 템플릿을 가지고 놀다가 이 프로젝트를 하게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 매우 심플하고 매력적으로 작용한다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지를 가져와 컨피규레이션파일(10초 정도)을 수정하고 빌드하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 작업이 문제 없이 자동으로 수행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저자를 축복하라!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;T4 템플릿의 단점은 VS에서 빌드하면 스캔된 어셈블리가 잠기고 VS를 재시작해야 한다는 것입니다(얼마나 어리석은 일입니까).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;T4 Toolbox + VS Cleaning Directive에는 몇 가지 회피책이 있지만, 어느 것도 효과가 없었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https&lt;a href=&quot;https://github.com/pankleks/TypeScriptBuilder&quot; papago-id=&quot;64-1&quot; rel=&quot;nofollow&quot;&gt;://&lt;/a&gt;github.com/pankleks/&lt;a href=&quot;https://github.com/pankleks/TypeScriptBuilder&quot; papago-id=&quot;64-1&quot; rel=&quot;nofollow&quot;&gt;TypeScriptBuilder&lt;/a&gt; 를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 작은 라이브러리는 C# 유형을 기반으로 TypeScript 유형 정의를 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;백엔드 C# 프로젝트에서 직접 사용하여 프런트엔드 TypeScript 프로젝트의 코드를 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 작은 콘솔 앱을 작성하여 사전 빌드 도구로 코드를 생성할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;b papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;풀 및 NET Core 프레임워크로 동작합니다.&lt;/font&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 의한 : nuget 설설:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Install-Package TypeScriptBuilder&lt;/code&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지원되는 기능&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형 종속성 해결&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범용&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상속 유형&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네임스페이스(모듈)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에넘&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특수한 유형&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전 변환(강력한 유형의 TS 인덱스 개체로)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 생성 제어 속성 세트&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;any&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 없는 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세내용 : https://github.com/pankleks/&lt;a href=&quot;https://github.com/pankleks/TypeScriptBuilder/blob/master/README.md&quot; rel=&quot;nofollow&quot; papago-id=&quot;78-1&quot;&gt;TypeScriptBuilder&lt;/a&gt;/blob/master/README.md&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Developer Community 페이지에 다음과 같은 기능 요청을 작성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://developercommunity.visualstudio.com/idea/1153873/reuse-existing-net-classes-for-typescript-definiti.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developercommunity.visualstudio.com/idea/1153873/reuse-existing-net-classes-for-typescript-definiti.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 답변에서 알 수 있듯이 많은 프로젝트가 이 문제를 해결하려고 시도하고 있지만 안타깝게도 이러한 프로젝트의 대부분은 단일 개발자 프로젝트로 진행 중 지원이 중단됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마이크로소프트가 대신 이 프로젝트들 중 하나를 유지한다면 정말 좋을 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.NET&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TypeScript&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;발전기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 중에서도 일부는 여전히 유지 보수되고 있지만, 한 명의 개발자에 크게 의존하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeLite:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/LukasKabrt/typelite/src/default/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://bitbucket.org/LukasKabrt/typelite/src/default/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 정의 생성기:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TypeScriptDefinitionGenerator&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TypeScriptDefinitionGenerator&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;타이프라이터:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/frhagn/Typewriter&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/frhagn/Typewriter&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Type Gen:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/jburzynski/TypeGen&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/jburzynski/TypeGen&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;강화되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;타이핑:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/reinforced/Reinforced.Typings&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/reinforced/Reinforced.Typings&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 조언은 처음부터 당신이 유지보수를 중단하고 현재 유지보수를 하고 있는 것으로 바꿀 준비가 되어 있는 프로젝트를 선택하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그 프로젝트가 더 이상 지원되지 않는다면, 저는 그 태그를 다른 것으로 바꿀 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 반대는 어떻습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;97&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/erecruit/TsT&quot; papago-id=&quot;97-1&quot; rel=&quot;nofollow&quot;&gt;erecruit&lt;/a&gt; TypeScript &lt;a href=&quot;https://github.com/erecruit/TsT&quot; papago-id=&quot;97-1&quot; rel=&quot;nofollow&quot;&gt;Translator&lt;/a&gt; 를 확인해 주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉시 사용할 수 있는 C# 지원이 제공되지만 실제로는 템플릿 기반(렌더링에 Nunjucks 사용)이므로 다른 모든 것(VB)을 생성할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET, F#, C++, XML, SQL - 템플릿으로 인코딩할 수 있는 모든 것.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;98&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로서 기능합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET 콘솔 프로그램, NodeJS 프로그램(Windows가 아닌 경우) 또는 &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/c61f8a99-cc0b-4b2e-8913-f00626c92a21&quot; papago-id=&quot;98-1&quot; rel=&quot;nofollow&quot;&gt;Visual Studio&lt;/a&gt; 확장 &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/c61f8a99-cc0b-4b2e-8913-f00626c92a21&quot; papago-id=&quot;98-1&quot; rel=&quot;nofollow&quot;&gt;기능&lt;/a&gt;으로 저장 시 생성 기능을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 빌드 서버를 만족시키기 위해 MSBuild 지원도 포함되어 있습니다. :-)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;99&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;난 도시애 솔루션이 좋아.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조금 더 늘렸어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 솔루션은 T4 템플릿을 사용한 코드 생성 기술도 기반으로 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 TypeScript 유형 및 환경 선언을 생성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상속 및 인터페이스 구현을 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범용, 배열 및 목록을 유형 필드로 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 설정에서 명시적으로 언급되지 않은 TypeScript 유형으로 변환됩니다(예를 들어 유형 A를 Import하고 TS 출력에서 필드의 유형, 기본 유형 및 인터페이스 등 다른 유형을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형 이름을 재정의할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Enum도 지원됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 예(프로젝트 저장소에서 찾을 수 있음):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// set extension of the generated TS file
&amp;lt;#@ output extension=&quot;.d.ts&quot; #&amp;gt;

// choose the type of TS import TsMode.Ambient || TsMode.Class
&amp;lt;# var tsBuilder = new TsBuilder(TsMode.Ambient); #&amp;gt;

// reference assembly with the c# types to be transformed
&amp;lt;#@ assembly name=&quot;$(SolutionDir)artifacts\...\CsT4Ts.Tests.dll&quot; #&amp;gt;

// reference namespaces
&amp;lt;#@ import namespace=&quot;CsT4Ts.Tests&quot; #&amp;gt;
&amp;lt;#
    //add types to processing
    tsBuilder.ConsiderType(typeof(PresetDTOBase), &quot;PresetBase&quot;);
    tsBuilder.ConsiderType(typeof(PresetDTO), &quot;Preset&quot;);
    tsBuilder.ConsiderType(typeof(TestInterface&amp;lt;,&amp;gt;));
#&amp;gt;

// include file with transformation algorithms
&amp;lt;#@ include file=&quot;CsT4Ts.t4&quot; #&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 당신은 결과를 얻을 것이다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//CsT4Ts.Tests.PresetDTOBase =&amp;gt; PresetBase
// CsT4Ts.Tests.PresetDTO =&amp;gt; Preset
// CsT4Ts.Tests.TestInterface`2 =&amp;gt; TestInterface
// CsT4Ts.Tests.TestEnum =&amp;gt; TestEnum

declare class PresetBase
{
    PresetId: string;
    Title: string;
    InterviewDate: string;
}

declare class Preset extends PresetBase
{
    QuestionsIds: string[];
}

declare interface TestInterface&amp;lt;TA, TB&amp;gt;
{
    A: string;
    B: number;
    C: TestEnum;
    D: TestEnum[];
    E: number[];
    F: TA;
    G: TB[];
}

declare enum TestEnum
{
    Foo = 10,
    Boo = 100
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;풀 솔루션을 확인하려면 여기를 클릭해 주세요.https://&lt;a href=&quot;https://bitbucket.org/chandrush/cst4ts&quot; rel=&quot;nofollow&quot; papago-id=&quot;108-1&quot;&gt;bitbucket&lt;/a&gt;.org/chandrush/cst4ts&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Bridge.net 를 사용할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 1.7부터는 C# 타입의 TypeScript 정의 생성을 지원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;http&lt;a href=&quot;http://bridge.net/docs/generate-typescript-definitions/&quot; papago-id=&quot;109-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;://&lt;/a&gt;bridge.net/docs/&lt;a href=&quot;http://bridge.net/docs/generate-typescript-definitions/&quot; papago-id=&quot;109-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;generate-typescript-definitions&lt;/a&gt;/ 를 참조해 주세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;110&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@citykid의 답변도 매우 마음에 들어 한 번에 네임스페이스 전체를 할 수 있도록 확장했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네임스페이스에 POCO 클래스를 삽입하고 T4 템플릿을 재구축하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각각 다른 파일을 생성하는 방법을 알고 싶지만, 그렇다고 세상이 끝나는 것은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;111&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 참조할 필요가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;맨 위에 있는 DLL 파일(필요한 클래스가 있는 곳)에서 네임스페이스를 언급해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집하는 모든 행에 ACME 마크가 붙어 있습니다.@citykid님, 감사합니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;#@ template debug=&quot;true&quot; hostSpecific=&quot;true&quot; language=&quot;C#&quot; #&amp;gt;
&amp;lt;#@ output extension=&quot;.ts&quot; #&amp;gt;
&amp;lt;#@ Assembly Name=&quot;System.Core.dll&quot; #&amp;gt;
&amp;lt;#@ assembly name=&quot;$(TargetDir)YOUR_DLL_NAME_HERE_ACME.dll&quot; #&amp;gt;
&amp;lt;#@ assembly name=&quot;$(TargetDir)YOUR_OTHER_DLL_NAME_HERE_ACME.dll&quot; #&amp;gt;
&amp;lt;#@ assembly name=&quot;$(TargetDir)YOUR_OTHER_DLL_NAME_HERE_ACME.dll&quot; #&amp;gt;
&amp;lt;#@ assembly name=&quot;$(TargetDir)YOUR_OTHER_DLL_NAME_HERE_ACME.dll&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Reflection&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Collections.Generic&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Text&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Linq&quot; #&amp;gt;
&amp;lt;#@ import namespace=&quot;System.Reflection&quot; #&amp;gt;

&amp;lt;#= Process(&quot;My.Very.Special.Namespace.ACME&quot;) #&amp;gt;
&amp;lt;#= Process(&quot;My.Other.Very.Special.Namespace.ACME&quot;) #&amp;gt;
&amp;lt;#= Process(&quot;My.Other.Very.Special.Namespace.ACME&quot;) #&amp;gt;
&amp;lt;#= Process(&quot;My.Other.Very.Special.Namespace.ACME&quot;) #&amp;gt;

&amp;lt;#+  

    List&amp;lt;Type&amp;gt; knownTypes = new List&amp;lt;Type&amp;gt;();

    string Process(string nameSpace) {
      var allass = AppDomain.CurrentDomain.GetAssemblies();
      var ss = &quot;&quot;;
      foreach (var ass in allass)
      {
         ss += ProcessAssembly(ass, nameSpace);
      }
      return ss;
    }

   string ProcessAssembly(Assembly asm, string nameSpace) {
      try {
            Type[] types;
            try
            {
                types = asm.GetTypes();
            }
            catch (ReflectionTypeLoadException e)
            {
                types = e.Types;
            }
            var s = &quot;&quot;;
            foreach (var t in types.Where(t =&amp;gt; t != null))
            {
               try {

               if (String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
               {
                    s += InterfaceOfType(t);
               }

               } catch (Exception e)
               {
               }
            }
            return s;      
      }
      catch (Exception ee2) {
        return &quot;// ERROR LOADING TYPES: &quot; + ee2;
      }

   }

    string InterfaceOfType(Type T)
    {   
        Type t = T;     
        var sb = new StringBuilder();
        sb.AppendFormat(&quot;interface {0} {{\r\n&quot;, t.Name);
        foreach (var mi in GetInterfaceMembers(t))
        {
            sb.AppendFormat(&quot;  {0}: {1};\r\n&quot;, this.ToCamelCase(mi.Name), GetTypeName(mi));
        }
        sb.AppendLine(&quot;}&quot;);
        knownTypes.Add(t);
        return sb.ToString();
    }

    string Interface&amp;lt;T&amp;gt;()
    {   
        Type t = typeof(T);     
        var sb = new StringBuilder();
        sb.AppendFormat(&quot;interface {0} {{\n&quot;, t.Name);
        foreach (var mi in GetInterfaceMembers(t))
        {
            sb.AppendFormat(&quot;  {0}: {1};\r\n&quot;, this.ToCamelCase(mi.Name), GetTypeName(mi));
        }
        sb.AppendLine(&quot;}&quot;);
        knownTypes.Add(t);
        return sb.ToString();
    }

    IEnumerable&amp;lt;MemberInfo&amp;gt; GetInterfaceMembers(Type type)
    {
        return type.GetMembers(BindingFlags.Public | BindingFlags.Instance)
            .Where(mi =&amp;gt; mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property);
    }

    string ToCamelCase(string s)
    {
        if (string.IsNullOrEmpty(s)) return s;
        if (s.Length &amp;lt; 2) return s.ToLowerInvariant();
        return char.ToLowerInvariant(s[0]) + s.Substring(1);
    }

    string GetTypeName(MemberInfo mi)
    {
        Type t = (mi is PropertyInfo) ? ((PropertyInfo)mi).PropertyType : ((FieldInfo)mi).FieldType;
        return this.GetTypeName(t);
    }

    string GetTypeName(Type t)
    {
        if(t.IsPrimitive)
        {
            if (t == typeof(bool)) return &quot;boolean&quot;;
            if (t == typeof(char)) return &quot;string&quot;;
            return &quot;number&quot;;
        }
        if (t == typeof(decimal)) return &quot;number&quot;;            
        if (t == typeof(string)) return &quot;string&quot;;
        if (t.IsArray)
        {            
            var at = t.GetElementType();
            return this.GetTypeName(at) + &quot;[]&quot;;
        }
        if(typeof (System.Collections.IEnumerable).IsAssignableFrom(t)) 
        {
            var collectionType = t.GetGenericArguments()[0]; // all my enumerables are typed, so there is a generic argument
            return GetTypeName(collectionType) + &quot;[]&quot;;
        }            
        if (Nullable.GetUnderlyingType(t) != null)
        {
            return this.GetTypeName(Nullable.GetUnderlyingType(t));
        }
        if(t.IsEnum) return &quot;number&quot;;
        if(knownTypes.Contains(t)) return t.Name;
        return &quot;any&quot;;
    }

    string Enums&amp;lt;T&amp;gt;() // Enums&amp;lt;&amp;gt;, since Enum&amp;lt;&amp;gt; is not allowed.
    {
        Type t = typeof(T);        
        var sb = new StringBuilder();        
        int[] values = (int[])Enum.GetValues(t);
        sb.AppendLine(&quot;var &quot; + t.Name + &quot; = {&quot;);
        foreach(var val in values) 
        {
            var name = Enum.GetName(typeof(T), val);
            sb.AppendFormat(&quot;{0}: {1},\r\n&quot;, name, val);
        }
        sb.AppendLine(&quot;}&quot;);
        return sb.ToString();
    }
#&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 솔루션은 프로젝트 어셈블리(및 레퍼링 어셈블리)를 사용하여 typescript와 c#의 상호작용에 관여하는 유형의 스캔을 시작하는 작은 codegen util을 작성하는 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 유틸리티는 둘 다 javascript를 d.ts...로 출력합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;빌드 후의 이벤트에서는 툴이라고 불리고 있습니다...마법처럼 기능합니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;113&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관심 있는 경우 Type Rpc를 &lt;a href=&quot;https://www.nuget.org/packages/TypedRpc/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;113-1&quot;&gt;사용&lt;/a&gt;할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 목적은 TypeScript에서 인터페이스를 작성하는 것뿐만 아니라의 서비스와의 모든 통신을 작성하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JsonRpc 프로토콜을 사용하여 넷.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버 클래스의 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[TypedRpc.TypedRpcHandler]
public class RpcServerExample
{
    public String HelloWorld()
    {
        return &quot;Hello World!&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성된 TypeScript 코드 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/// &amp;lt;reference path=&quot;Scripts/TypedRpc.ts&quot; /&amp;gt;

let rpc: TypedRpc.RpcServerExample = new TypedRpc.RpcServerExample();

var callback = function(data, jsonResponse) {
    console.log(data);
};

rpc.HelloWorld().done(callback).fail(callback);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 외의 사용 방법의 예에 대해서는, https://github.com/Rodris/&lt;a href=&quot;https://github.com/Rodris/TypedRpc&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;116-1&quot;&gt;TypedRpc&lt;/a&gt; 를 참조해 주세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/zijianhuang/webapiclientgen&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;117-0&quot;&gt;ASP.NET Web API Client&lt;/a&gt; Generators는 SDLC 중에 swag 툴 체인이나 다른 툴 체인보다 편리하고 오버헤드가 적을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;118&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그래머는 일반적으로 WebApiClientGen을 사용하여 클라이언트 API 코드를 생성하지만 이 프로젝트에서는 POCO 클래스에서 TypeScript 인터페이스를 생성하는 명령줄 프로그램인 POCO2TS.exe도 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Poco2t 중 하나를 사용하셔도 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;exe 또는 poco2ts 컴포넌트를 사용하여 코드 생성을 빌드 파이프라인과 통합할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;119&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;node.js를 통해 변환할 경우 이 패키지(csharp-to-typescript)를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/csharp-to-typescript&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;119-1&quot;&gt;https://www.npmjs.com/package/csharp-to-typescript&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sourcode : https://github.com/YuvrajSagarRana/&lt;a href=&quot;https://github.com/YuvrajSagarRana/csharp-to-typescript&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;120-1&quot;&gt;csharp-to-typescript&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;eg: 
// After installation, import the package.
var { CsharpToTs, getConfiguration } = require(&quot;csharp-to-typescript&quot;);

// Use CsharpToTs to convert your source code a. Method one give your source code as string:
const sourceCodeInString =   `public class Address
{
  public int Id {get; set;}
  public string Street { get; set; }
  public string City { get; set; }
}`

var outputTypescript = CsharpToTs(sourceCodeInString, getConfiguration());
console.log(outputTypescript);

// Output is

export class Address
{
  Id: number;
  Street: string;
  City: string;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;121&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VSCode를 사용하는 경우 TypeScript &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=adrianwilczynski.csharp-to-typescript&quot; papago-id=&quot;121-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;확장 C#&lt;/a&gt;을 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=adrianwilczynski.csharp-to-typescript&quot; papago-id=&quot;121-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;살펴볼&lt;/a&gt; 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://gitlab.com/trungk181/blog/-/raw/master/img/blog/convert-csharp-class-to-typescript-class-02.gif&quot; alt=&quot;C# 클래스를 TypeScript 인터페이스로 변환합니다.&quot; papago-attr-id=&quot;2&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;122&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭 한 번으로 C# 코드에서 변환하는 방법을 확인하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 공장 등 모든 클래스가 전환되는 것은 아니지만, 클라이언트 측에서는 충분합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터의 형태만 있으면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가끔 방문자 패턴을 사용해야 할 경우, 필요한 추가 방법으로 꾸밀 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 하는 데 5초밖에 걸리지 않았어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1분 전과 비교하면 대승이라고 할 수 있다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;123&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://trungk18.com/experience/convert-csharp-class-to-typescript-class/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;123-1&quot;&gt;자세한&lt;/a&gt; 내용은 블로그 투고를 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;124&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript와 C# DTO/POCO 클래스를 모두 생성하는 작은 커스텀 DSL을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DSL의 외관은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;output CSharp
output TypeScript

namespace MyLibrary.Logic.DataModel.DTOs

class Something

property int ID
property string Name
property DateTime DateTime
property int ForeignKeyID
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 단일 소스(DSL)를 가지며 2개의 C# 및 TypeScript 로직 모델 사이에 있는 DTO 모델을 갖게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;126&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 DTO 객체와 Logic Model 객체 간의 변환을 담당하는 메서드가 있는 C# 및 TypeScript DTOFactory 클래스를 작성합니다(DTO 생성의 일부는 직렬화 또는 IndexedDB에 저장하기 위해 익명 JSON으로 변환하는 직렬화 메서드입니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;127&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 어느 쪽이든 기종이 바뀌면 다시 일치할 때까지 컴파일 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;128&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12957820/&lt;a href=&quot;https://stackoverflow.com/questions/12957820/how-to-reuse-existing-c-sharp-class-definitions-in-typescript-projects&quot; target=&quot;_blank&quot; papago-id=&quot;128-1&quot;&gt;how-to-reuse-existing-c-sharp-class-definitions-in-typescript-projects&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/514</guid>
      <comments>https://shortcode.tistory.com/514#entry514comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:25:26 +0900</pubDate>
    </item>
    <item>
      <title>React.js: contentEditable의 onChange 이벤트</title>
      <link>https://shortcode.tistory.com/513</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React.js: contentEditable의 onChange 이벤트&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 변경 이벤트를 재생하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;contentEditable&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 기반 제어?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var Number = React.createClass({
    render: function() {
        return &amp;lt;div&amp;gt;
            &amp;lt;span contentEditable={true} onChange={this.onChange}&amp;gt;
                {this.state.value}
            &amp;lt;/span&amp;gt;
            =
            {this.state.value}
        &amp;lt;/div&amp;gt;;
    },
    onChange: function(v) {
        // Doesn't fire :(
        console.log('changed', v);
    },
    getInitialState: function() {
        return {value: '123'}
    }
});

React.renderComponent(&amp;lt;Number /&amp;gt;, document.body);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsfiddle.net/NV/kb3gN/1621/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-0&quot;&gt;JSFiddle 코드&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 나에게 효과가 있었던 가장 간단한 해결책이다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div
  contentEditable='true'
  onInput={e =&amp;gt; console.log('Text inside div', e.currentTarget.textContent)}
&amp;gt;
Text inside div
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구현의 오류를 &lt;a href=&quot;https://stackoverflow.com/questions/22677931/react-js-onchange-event-for-contenteditable/27255103#27255103&quot; papago-id=&quot;5-1&quot;&gt;수정&lt;/a&gt;하는 Sebastien Lorber의&lt;a href=&quot;https://stackoverflow.com/questions/22677931/react-js-onchange-event-for-contenteditable/27255103#27255103&quot; papago-id=&quot;5-1&quot;&gt; 답변을 참조&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;onInput 이벤트 및 옵션으로 onBlur을 폴백으로 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가 이벤트 전송을 방지하기 위해 이전 내용을 저장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 개인적으로 이것을 렌더링 함수로 사용하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var handleChange = function(event){
    this.setState({html: event.target.value});
}.bind(this);

return (&amp;lt;ContentEditable html={this.state.html} onChange={handleChange} /&amp;gt;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;a href=&quot;http://jsbin.com/vamuxayu/2/edit?js,output&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jsbin&lt;/font&gt;&lt;/a&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;contentEditable 주위에 이 간단한 래퍼를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var ContentEditable = React.createClass({
    render: function(){
        return &amp;lt;div
            onInput={this.emitChange}
            onBlur={this.emitChange}
            contentEditable
            dangerouslySetInnerHTML={{__html: this.props.html}}&amp;gt;&amp;lt;/div&amp;gt;;
    },
    shouldComponentUpdate: function(nextProps){
        return nextProps.html !== this.getDOMNode().innerHTML;
    },
    emitChange: function(){
        var html = this.getDOMNode().innerHTML;
        if (this.props.onChange &amp;amp;&amp;amp; html !== this.lastHtml) {

            this.props.onChange({
                target: {
                    value: html
                }
            });
        }
        this.lastHtml = html;
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가가 내 솔루션으로 NPM에 대한 프로젝트를 만들었다: 반응 &lt;em papago-id=&quot;10-1&quot;&gt;&lt;a href=&quot;https://github.com/lovasoa/react-contenteditable&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;10-1-0&quot;&gt;콘텐츠&lt;/a&gt;&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방금 제공한 HTML을 브라우저가 &quot;재포맷&quot;하려고 하면 컴포넌트가 항상 재렌더링되는 또 다른 문제가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/lovasoa/react-contenteditable/issues/18&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;11-1&quot;&gt;이것&lt;/a&gt; 좀 봐.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 프로덕션 콘텐츠 편집 가능 구현입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 옵션 중 몇 가지 추가 옵션이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;react-contenteditable&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 기능을 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;록&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML fragment를 삽입할 수 있는 명령형 API&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;콘텐츠 재포맷 기능&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3 papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요약:.&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FakeRainBrigand의 솔루션은 새로운 문제가 생기기 전까지는 꽤 잘 작동했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Content Editables는 귀찮고 React에 대처하기가 쉽지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsfiddle.net/kb3gN/8349/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-0&quot;&gt;이 JSFiddle&lt;/a&gt;은 문제를 나타냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보시는 바와 같이 몇 개의 문자를 입력하고 을 클릭하면 내용이 지워지지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 콘텐츠 가능을 마지막으로 알려진 &lt;a href=&quot;https://en.wikipedia.org/wiki/Document_Object_Model&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;20-3&quot;&gt;가상&lt;/a&gt; DOM 값으로 리셋하려고 하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 다음과 같이 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 필요하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;shouldComponentUpdate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐럿 위치 점프를 방지하려면&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React의 VDOM 확산 알고리즘에 의존할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;shouldComponentUpdate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이쪽입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신은 여분의 대사가 필요합니다. 그래서 언제든지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;shouldComponentUpdate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 「yes」를 반환합니다.DOM 컨텐츠가 실제로 갱신되고 있는 것을 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 버전에서는,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;componentDidUpdate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var ContentEditable = React.createClass({
    render: function(){
        return &amp;lt;div id=&quot;contenteditable&quot;
            onInput={this.emitChange}
            onBlur={this.emitChange}
            contentEditable
            dangerouslySetInnerHTML={{__html: this.props.html}}&amp;gt;&amp;lt;/div&amp;gt;;
    },

    shouldComponentUpdate: function(nextProps){
        return nextProps.html !== this.getDOMNode().innerHTML;
    },

    componentDidUpdate: function() {
        if (this.props.html !== this.getDOMNode().innerHTML) {
           this.getDOMNode().innerHTML = this.props.html;
        }
    },

    emitChange: function() {
        var html = this.getDOMNode().innerHTML;
        if (this.props.onChange &amp;amp;&amp;amp; html !== this.lastHtml) {
            this.props.onChange({
                target: {
                    value: html
                }
            });
        }
        this.lastHtml = html;
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가상 DOM은 &lt;em papago-id=&quot;30-1&quot;&gt;오래된&lt;/em&gt; 상태로 남아 있어 가장 효율적인 코드는 아닐 수 있지만 적어도 동작합니다:) &lt;a href=&quot;http://jsfiddle.net/kb3gN/8352/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;30-3&quot;&gt;버그는 해결&lt;/a&gt;되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세부사항:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐럿 점프를 피하기 위해 show Component Update를 넣으면 (적어도 키 입력에서는) 컨텐츠가 재렌더되지 않습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 컴포넌트가 키 스트로크로 재렌더되지 않는 경우 React는 이 콘텐츠에 대해 오래된 가상 DOM을 유지합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React가 콘텐츠의 오래된 버전을 가상 DOM 트리에 보관하고 있는 경우 콘텐츠의 값을 가상 DOM 내의 오래된 값으로 리셋하려고 하면 가상 DOM diff 동안 React는 DOM에 적용할 변경 사항이 없음을 계산합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 주로 다음과 같은 경우에 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음에는 컨텐츠에 저장 가능한 빈 공간이 있습니다(shouldComponentUpdate=true,prop=previous 이전 vdom=N/A).&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 일부 텍스트를 입력하면 렌더링이 금지됩니다(shouldComponentUpdate=false,prop=text, 이전 vdom=&quot;).&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 유효성 검사 버튼을 클릭한 후 해당 필드(shouldComponentUpdate=false,prop=previous previous vdom=&quot;)를 비우선 vdom=&quot;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로 생성된 가상 DOM과 오래된 가상 DOM이 모두 &quot; &quot;이기 때문에 리액트는 DOM에 접촉하지 않습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;되면 항상  때문에 '포커스'를 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onBlur&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트 핸들러&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div
  onBlur={e =&amp;gt; {
    console.log(e.currentTarget.textContent);
  }}
  contentEditable
  suppressContentEditableWarning={true}
&amp;gt;
  &amp;lt;p&amp;gt;Lorem ipsum dolor.&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 아마 당신이 찾고 있는 답은 아닐 것입니다만, 스스로 이 문제와 씨름하고 있고, 제안된 답변에 문제가 있어, 저는 그 대신 그것을 통제하지 않기로 결정했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;editable&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 「」입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; , , , 을합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 동안&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onChange&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제어에 의해 발사됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 내가  때&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;editable&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;된 내용을 로 채웁니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/** @jsx React.DOM */
'use strict';

var React = require('react'),
    escapeTextForBrowser = require('react/lib/escapeTextForBrowser'),
    { PropTypes } = React;

var UncontrolledContentEditable = React.createClass({
  propTypes: {
    component: PropTypes.func,
    onChange: PropTypes.func.isRequired,
    text: PropTypes.string,
    placeholder: PropTypes.string,
    editable: PropTypes.bool
  },

  getDefaultProps() {
    return {
      component: React.DOM.div,
      editable: false
    };
  },

  getInitialState() {
    return {
      initialText: this.props.text
    };
  },

  componentWillReceiveProps(nextProps) {
    if (nextProps.editable &amp;amp;&amp;amp; !this.props.editable) {
      this.setState({
        initialText: nextProps.text
      });
    }
  },

  componentWillUpdate(nextProps) {
    if (!nextProps.editable &amp;amp;&amp;amp; this.props.editable) {
      this.getDOMNode().innerHTML = escapeTextForBrowser(this.state.initialText);
    }
  },

  render() {
    var html = escapeTextForBrowser(this.props.editable ?
      this.state.initialText :
      this.props.text
    );

    return (
      &amp;lt;this.props.component onInput={this.handleChange}
                            onBlur={this.handleChange}
                            contentEditable={this.props.editable}
                            dangerouslySetInnerHTML={{__html: html}} /&amp;gt;
    );
  },

  handleChange(e) {
    if (!e.target.textContent.trim().length) {
      e.target.innerHTML = '';
    }

    this.props.onChange(e);
  }
});

module.exports = UncontrolledContentEditable;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위해서는 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;53-1&quot;&gt;MutationObserver&lt;/a&gt;를 사용하는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 당신에게 무슨 일이 일어나고 있는지 훨씬 더 잘 통제할 수 있게 해줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 브라우즈로 모든 키 스트로크를 해석하는 방법에 대해서도 자세하게 설명합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 TypeScript:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import * as React from 'react';

export default class Editor extends React.Component {
    private _root: HTMLDivElement; // Ref to the editable div
    private _mutationObserver: MutationObserver; // Modifications observer
    private _innerTextBuffer: string; // Stores the last printed value

    public componentDidMount() {
        this._root.contentEditable = &quot;true&quot;;
        this._mutationObserver = new MutationObserver(this.onContentChange);
        this._mutationObserver.observe(this._root, {
            childList: true, // To check for new lines
            subtree: true, // To check for nested elements
            characterData: true // To check for text modifications
        });
    }

    public render() {
        return (
            &amp;lt;div ref={this.onRootRef}&amp;gt;
                Modify the text here ...
            &amp;lt;/div&amp;gt;
        );
    }

    private onContentChange: MutationCallback = (mutations: MutationRecord[]) =&amp;gt; {
        mutations.forEach(() =&amp;gt; {
            // Get the text from the editable div
            // (Use innerHTML to get the HTML)
            const {innerText} = this._root;

            // Content changed will be triggered several times for one key stroke
            if (!this._innerTextBuffer || this._innerTextBuffer !== innerText) {
                console.log(innerText); // Call this.setState or this.props.onChange here
                this._innerTextBuffer = innerText;
            }
        });
    }

    private onRootRef = (elt: HTMLDivElement) =&amp;gt; {
        this._root = elt;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 lovasoa에 의해 이 대부분을 통합한 컴포넌트입니다.https://github.com/lovasoa/&lt;a href=&quot;https://github.com/lovasoa/react-contenteditable/blob/master/index.js&quot; rel=&quot;nofollow&quot; papago-id=&quot;55-1&quot;&gt;react-contenteditable&lt;/a&gt;/blob/master/index.js&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;emiss Change에서 이벤트를 시뮬레이트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;emitChange: function(evt){
    var html = this.getDOMNode().innerHTML;
    if (this.props.onChange &amp;amp;&amp;amp; html !== this.lastHtml) {
        evt.target = { value: html };
        this.props.onChange(evt);
    }
    this.lastHtml = html;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비슷한 방법을 성공적으로 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div
    spellCheck=&quot;false&quot;
    onInput={e =&amp;gt; console.log(&quot;e: &quot;, e.currentTarget.textContent}
    contentEditable=&quot;true&quot;
    suppressContentEditableWarning={true}
    placeholder=&quot;Title&quot;
    className=&quot;new-post-title&quot;
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/27255103&quot; papago-id=&quot;58-3&quot;&gt;다음은 Sebastien Lorber&lt;/a&gt;의 답변을 &lt;a href=&quot;https://stackoverflow.com/a/27255103&quot; papago-id=&quot;58-3&quot;&gt;바탕&lt;/a&gt;으로 한 후크 기반 버전입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const noop = () =&amp;gt; {};
const ContentEditable = ({
  html,
  onChange = noop,
}: {
  html: string;
  onChange?: (s: string) =&amp;gt; any;
}) =&amp;gt; {
  const ref = useRef&amp;lt;HTMLDivElement&amp;gt;(null);
  const lastHtml = useRef&amp;lt;string&amp;gt;('');

  const emitChange = () =&amp;gt; {
    const curHtml = ref.current?.innerHTML || '';
    if (curHtml !== lastHtml.current) {
      onChange(curHtml);
    }
    lastHtml.current = html;
  };

  useEffect(() =&amp;gt; {
    if (!ref.current) return;
    if (ref.current.innerHTML === html) return;
    ref.current.innerHTML = html;
  }, [html]);

  return (
    &amp;lt;div
      onInput={emitChange}
      contentEditable
      dangerouslySetInnerHTML={{ __html: html }}
      ref={ref}
    &amp;gt;&amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/57365612/6243352&quot; papago-id=&quot;59-1&quot;&gt;Saint&lt;/a&gt; Laurent의 &lt;a href=&quot;https://stackoverflow.com/a/57365612/6243352&quot; papago-id=&quot;59-1&quot;&gt;예&lt;/a&gt;를 사용하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div
  onBlur={e =&amp;gt; {
    console.log(e.currentTarget.textContent);
  }}
  contentEditable
  suppressContentEditableWarning={true}
&amp;gt;
    &amp;lt;p&amp;gt;Lorem ipsum dolor.&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 값을 설정하기 전까지는 완벽하게 동작합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 호출하는 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setState(e.currentTarget.textContent)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; , , , , , 을 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;currentTarget&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무효로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setState&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 동작합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;currentTarget&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 17가 있었던 은 액 1717.0을 사용하는 이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2개&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;e.target.innerText&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div
  onBlur={e =&amp;gt; setState(e.target.innerText)}
  contentEditable
  suppressContentEditableWarning={true}
&amp;gt;
    &amp;lt;p&amp;gt;Lorem ipsum dolor.&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22677931/&lt;a href=&quot;https://stackoverflow.com/questions/22677931/react-js-onchange-event-for-contenteditable&quot; target=&quot;_blank&quot; papago-id=&quot;67-1&quot;&gt;react-js-onchange-event-for-contenteditable&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/513</guid>
      <comments>https://shortcode.tistory.com/513#entry513comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:24:40 +0900</pubDate>
    </item>
    <item>
      <title>배열에 다음이 포함된 경우 각도 표현식</title>
      <link>https://shortcode.tistory.com/512</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배열에 다음이 포함된 경우 각도 표현식&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 요소에 클래스를 추가하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jobSet&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;식을 사용하여 승인하도록 선택되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;li class=&quot;approvalUnit&quot; ng-repeat=&quot;jobSet in dashboard.currentWork&quot; ng-class=&quot;{-1:'approved'}[selectedForApproval.indexOf(jobSet)]&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 꼭 바보같은 증거가 아니야.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하면 좋을까요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 약간 다른 구문을 사용하여 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ng-class=&quot;{'approved': selectedForApproval.indexOf(jobSet) === -1}&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/ARK5q/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플라스틱&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;복잡한 논리로 템플릿에 과부하를 걸면 안 됩니다.이것은 나쁜 습관입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;항상 단순하게 유지해야 한다는 것을 기억하세요!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 나은 접근법은 이 논리를 고객의 재사용 가능한 기능으로 추출하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$rootScope&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;.run(function ($rootScope) {
  $rootScope.inArray = function (item, array) {
    return (-1 !== array.indexOf(item));
  };
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 템플릿에서 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;li ng-class=&quot;{approved: inArray(jobSet, selectedForApproval)}&quot;&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 이 예가 훨씬 더 읽기 쉽고 유지보수가 쉽다는 것에 모두가 동의할 것이라고 생각한다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;초기화 중 어딘가에 이 코드를 넣습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Array.prototype.contains = function contains(obj) {
    for (var i = 0; i &amp;lt; this.length; i++) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다음과 같이 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;li ng-class=&quot;{approved: selectedForApproval.contains(jobSet)}&quot;&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17149552/&lt;a href=&quot;https://stackoverflow.com/questions/17149552/angular-expression-if-array-contains&quot; target=&quot;_blank&quot; papago-id=&quot;13-1&quot;&gt;angular-expression-if-array-contains&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/512</guid>
      <comments>https://shortcode.tistory.com/512#entry512comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:22:55 +0900</pubDate>
    </item>
    <item>
      <title>저장된 텍스트 영역에서 반응 표시 줄 바꿈</title>
      <link>https://shortcode.tistory.com/511</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장된 텍스트 영역에서 반응 표시 줄 바꿈&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이스북 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;React&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정 페이지에 여러 줄이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;textarea&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 사용자는 여러 줄의 텍스트를 입력할 수 있습니다(이 경우는 주소).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;textarea value={address} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주소를 표시하려고 할 때, 그래서...&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{address}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;줄 바꿈은 표시되지 않고 모두 한 줄에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;{address}&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결할 방법이 있나요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS를 사용할 이유가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/white-space&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;공백&lt;/a&gt; CSS 속성을 사용하면 브라우저에 새로운 회선을 처리하는 방법을 쉽게 지시할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;white-space: pre-line;
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프리라인&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공백 시퀀스는 축소됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;줄 바꿈 문자에서 줄이 끊어집니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;및 필요에 따라 라인 박스를 채웁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 데모를 확인해 주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
  #p_wrap {
    white-space: pre-line;
  }
&amp;lt;/style&amp;gt;

&amp;lt;textarea id=&quot;textarea&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;p id=&quot;p_standard&quot;&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;p id=&quot;p_wrap&quot;&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;script&amp;gt;
  textarea.addEventListener('keypress', function(e) {
    p_standard.textContent = e.target.value
    p_wrap.textContent = e.target.value
  })
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/mNI8T.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/mNI8T.png&quot; alt=&quot;브라우저 지원&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 예상대로 새로운 행(\n) 문자를 HTML 행 구분으로 변환해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반응에서 사용하는 방법에 대한 기사:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://medium.com/@kevinsimper/react-newline-to-break-nl2br-a1c240ba746#.l9sbqp5aw&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-1&quot;&gt;새 선을 끊기 위해 반응합니다(nl2br&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기사를 인용하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리액트의 모든 것이 기능이라는 것을 알고 있기 때문에 실제로는 할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;this.state.text.replace(/(?:\r\n|\r|\n)/g, '&amp;lt;br /&amp;gt;')
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 내부에 DOM 노드가 있는 문자열이 반환되므로 이 또한 허용되지 않습니다. 왜냐하면 문자열만 사용해야 하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;{this.props.section.text.split(“\n”).map(function(item) {
  return (
    {item}
    &amp;lt;br/&amp;gt;
  )
})}    
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리액트는 순수한 함수이고 두 개의 함수가 서로 옆에 있을 수 있기 때문에 이것도 허용되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tldr. 솔루션&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;{this.props.section.text.split(“\n”).map(function(item) {
  return (
    &amp;lt;span&amp;gt;
      {item}
      &amp;lt;br/&amp;gt;
    &amp;lt;/span&amp;gt;
  )
})}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 각 줄 바꿈을 한 스팬으로 줄 바꿈하고 있습니다. 스팬은 인라인으로 표시되므로 올바르게 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 제대로 작동하는 nl2br 라인 브레이크 솔루션이 도입되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책은 속성을 설정하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;white-space&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 내용을 표시하는 요소에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;textarea&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;white-space: pre-line;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;독립형 컴포넌트에 대한 Pete의 이전 제안은 중요한 한 가지를 놓쳤지만 훌륭한 해결책입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://reactjs.org/docs/lists-and-keys.html#keys&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-1&quot;&gt;필요&lt;/a&gt;한 키를 나열합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조금 조정했더니 버전(콘솔 경고 없음)은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const NewLineToBr = ({ children = '' }) =&amp;gt; children.split('\n')
  .reduce((arr, line, index) =&amp;gt; arr.concat(
    &amp;lt;Fragment key={index}&amp;gt;
      {line}
      &amp;lt;br /&amp;gt;
    &amp;lt;/Fragment&amp;gt;,
  ), [])
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React 16의 fragment를 &lt;a href=&quot;https://reactjs.org/docs/react-api.html#reactfragment&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;25-1&quot;&gt;사용&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 답변에 약간의 추가 사항:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;white-space&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;재산은 와 함께 사용하는 것이 좋다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;word-wrap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;넘치지 않도록 하기 위해서.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;p {
  white-space: pre-wrap;
  word-wrap: break-word;   
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React 16에서는 컴포넌트가 요소의 배열을 반환할 수 있습니다.즉, 다음과 같은 컴포넌트를 작성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export default function NewLineToBr({children = &quot;&quot;}){
  return children.split('\n').reduce(function (arr,line) {
    return arr.concat(
      line,
      &amp;lt;br /&amp;gt;
    );
  },[]);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;
  &amp;lt;NewLineToBr&amp;gt;{address}&amp;lt;/NewLineToBr&amp;gt;
&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹 사이트 버전 너무 좋아요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Fragment 컴포넌트에 대해서는 몰랐습니다만, 매우 편리합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 축소 방법을 사용할 필요는 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지도면 충분해.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 list는 respect에 키가 필요하지만 반복방식의 인덱스를 사용하는 것은 나쁜 습관입니다.eslint는 혼란스러운 버그가 생길 때까지 경고에서 이것을 계속 파기했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 다음과 같이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const NewLine = ({ children }) =&amp;gt;
   children.split(&quot;\n&quot;).map(line =&amp;gt; (
    &amp;lt;Fragment key={uuidv4()}&amp;gt;
      {line}
      &amp;lt;br /&amp;gt;
    &amp;lt;/Fragment&amp;gt;
  ));
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36260013/&lt;a href=&quot;https://stackoverflow.com/questions/36260013/react-display-line-breaks-from-saved-textarea&quot; target=&quot;_blank&quot; papago-id=&quot;32-1&quot;&gt;react-display-line-breaks-from-saved-textarea&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/511</guid>
      <comments>https://shortcode.tistory.com/511#entry511comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:21:53 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 코드 자동 가져오기</title>
      <link>https://shortcode.tistory.com/510</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio 코드 자동 가져오기&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹스톰에서 Visual Studio Code로 전환하는 중입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹스톰의 퍼포먼스는 최악입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio Code는 필요한 의존관계를 찾아 Import하는 데 그다지 도움이 되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 수작업으로 하고 있습니다만, 솔직히 말하면, 수동으로 검색해야 하는 Import를 webstorm이 검색하여 추가할 때까지 15초 정도 기다리겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/pjeiN.png&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/pjeiN.png&quot; alt=&quot;스크린샷: 가져오기를 찾을 수 없습니다.&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@sqo-gechev https://github.com/mgechev/&lt;a href=&quot;https://github.com/mgechev/angular2-seed&quot; papago-id=&quot;3-1&quot;&gt;angular2-seed&lt;/a&gt;의 angular2 seed를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 baseDir에는 다음과 같은 tsconfig.json이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    {
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es5&quot;,
    &quot;module&quot;: &quot;commonjs&quot;,
    &quot;declaration&quot;: false,
    &quot;removeComments&quot;: true,
    &quot;noLib&quot;: false,
    &quot;emitDecoratorMetadata&quot;: true,
    &quot;experimentalDecorators&quot;: true,
    &quot;sourceMap&quot;: true,
    &quot;pretty&quot;: true,
    &quot;allowUnreachableCode&quot;: false,
    &quot;allowUnusedLabels&quot;: false,
    &quot;noImplicitAny&quot;: true,
    &quot;noImplicitReturns&quot;: true,
    &quot;noImplicitUseStrict&quot;: false,
    &quot;noFallthroughCasesInSwitch&quot;: true
  },
  &quot;exclude&quot;: [
    &quot;node_modules&quot;,
    &quot;dist&quot;,
    &quot;typings/index.d.ts&quot;,
    &quot;typings/modules&quot;,
    &quot;src&quot;
  ],
  &quot;compileOnSave&quot;: false
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;src/client dir에 다음과 같은 것이 하나 더 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es5&quot;,
    &quot;module&quot;: &quot;commonjs&quot;,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;sourceMap&quot;: true,
    &quot;emitDecoratorMetadata&quot;: true,
    &quot;experimentalDecorators&quot;: true,
    &quot;removeComments&quot;: false,
    &quot;noImplicitAny&quot;: false,
    &quot;allowSyntheticDefaultImports&quot;: true
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 두 개가 있는지 모르겠어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;angualr 시드 프로젝트는 typecript gulp build tasks를 사용하기 때문에 컴파일이 다르다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하면 vscoode를 더 유용하게 사용할 수 있을까요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 지금 2018년.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Javascript에서를 위한 확장 Javascript Import를 사용하는 ).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;checkjs: true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 안에서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jsconfig.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript를 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 Import에는 add missing &lt;a href=&quot;https://code.visualstudio.com/docs/editor/editingevolved#_code-action&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-1&quot;&gt;import quick&lt;/a&gt; fix의 두 가지 유형이 있습니다.이 add missing quick fix는 오류 시 전구로 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Z60f0.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Z60f0.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;2&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/Docs/languages/javascript#_auto-imports&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot;&gt;그리고&lt;/a&gt; 자동 &lt;a href=&quot;https://code.visualstudio.com/Docs/languages/javascript#_auto-imports&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot;&gt;Import&lt;/a&gt; 제안.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;입력 시 제안 항목이 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 텍스트를 선택하고 Ctrl + Space를 눌러 제안 목록을 표시할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 가져오기 제안을 수락하면 파일 맨 위에 가져오기가 자동으로 추가됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Y7ybu.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Y7ybu.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;3&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 JavaScript와 TypeScript에서 즉시 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래도 자동 가져오기가 작동하지 않으면 &lt;a href=&quot;https://github.com/Microsoft/vscode/issues/new/choose&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-1&quot;&gt;문제를 해결&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래의 다양한 플러그인을 설치하여 작업을 진행하였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 경우 클래스 이름을 입력하자마자 자동으로 가져옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 클릭할 수 있는 전구가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 를 누르고 &quot;import..&quot; 라고 입력합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;」라고 하는 것도, 여러가지 옵션이 다양합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다 쓰는 편이에요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 인터페이스를 실장하는 실장은 도움이 되지만, 항상 기능하는 것은 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인 목록&lt;/font&gt;&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=christian-kohler.npm-intellisense&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;npm 인텔리센스&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=davidpiercedev.code-ngrx-snippets&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular 2 스니펫용 ngrx&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=DSKWRK.vscode-generate-getter-setter&quot; rel=&quot;noreferrer&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 도구 상자&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=fknop.vscode-npm&quot; rel=&quot;noreferrer&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;npm&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=iBotMedia.tstools&quot; rel=&quot;noreferrer&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TsTools&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=johnpapa.Angular2&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각도 조각(버전 9)&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jvitor83.types-autoinstaller&quot; rel=&quot;noreferrer&quot; papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 설치 유형&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome&quot; rel=&quot;noreferrer&quot; papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome용 디버거&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=pmneo.tsimporter&quot; rel=&quot;noreferrer&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 임포터&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=rbbit.typescript-hero&quot; rel=&quot;noreferrer&quot; papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript 히어로&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons&quot; rel=&quot;noreferrer&quot; papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;vcode 아이콘&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=sebastianbaar.vscode-add-angular2-files&quot; rel=&quot;noreferrer&quot; papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각도 파일 추가&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확장 스크린샷&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/JRS7Z.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/JRS7Zm.png&quot; alt=&quot;확장 스크린샷&quot; papago-attr-id=&quot;4&quot;&gt;&lt;/a&gt;&lt;br&gt; &lt;sup papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;* 풀 해상도를 &lt;em papago-id=&quot;30-1&quot;&gt;보려면 클릭&lt;/em&gt;하십시오.&lt;/font&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=steoates.autoimport&quot; papago-id=&quot;31-1&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong papago-id=&quot;31-1-0&quot;&gt;Auto&lt;/strong&gt;&lt;/a&gt; Import 플러그인은 Stoates에서 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=steoates.autoimport&quot; papago-id=&quot;31-1&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong papago-id=&quot;31-1-0&quot;&gt;사용&lt;/strong&gt;&lt;/a&gt;했는데, 매우 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 가능한 모든 가져오기에 대한 코드 작업 및 코드 완료를 자동으로 검색, 구문 분석 및 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Typescript 및 TSX와 연동됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tsconfig.app.json에서는 표준 Angular 10 앱에 다음이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;extends&quot;: &quot;./tsconfig.base.json&quot;,
  &quot;compilerOptions&quot;: {
    &quot;outDir&quot;: &quot;./out-tsc/app&quot;,
    &quot;types&quot;: []
  },
  &quot;files&quot;: [
    &quot;src/main.ts&quot;,
    &quot;src/polyfills.ts&quot;
  ],
  &quot;include&quot;: [
    &quot;src/**/*.d.ts&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;include like를 다음과 같이 변경했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &quot;include&quot;: [
    &quot;src/**/*.d.ts&quot;,
    &quot;src/**/*.ts&quot;
  ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 효과가 있었다&lt;/font&gt;&lt;/p&gt;&lt;h4 papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Javascript 프로젝트의 경우:&lt;/font&gt;&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정 플래그가 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jsconfig.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/1IiaU.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/1IiaU.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;6&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/umzD8.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/umzD8.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;7&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근에 이 문제에 부딪힌 사람이 있다면 자동 Import가 작동하도록 작업영역의 활자 스크립트를 사용하는 설정을 추가해야 한다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;40-1&quot;&gt;이렇게&lt;/em&gt; 하려면 작업영역 설정에 다음 행을 추가하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;typescript.tsdk&quot;: &quot;./node_modules/typescript/lib&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 vscode에서 활자 스크립트 파일을 연 상태에서 오른쪽 아래 구석에 있는 &lt;strong papago-id=&quot;41-1&quot;&gt;활자 스크립트 버전&lt;/strong&gt; 번호를 클릭합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;맨 위에 옵션이 나타나면 &quot;작업 공간 버전 사용&quot;을 선택한 &lt;strong papago-id=&quot;41-3&quot;&gt;다음 vscode&lt;/strong&gt;를 다시 로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 자동 Import가 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VS Code는 이 기능을 즉시 지원하지만, 기능이 작동하거나 작동하지 않을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알기로는 VS Code는 자동 Import에 필요한 데이터를 로드해야 합니다.이 작업은 거의 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 파일에서 모든 내보내기에 대한 데이터 로드&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;node_modules/@types에서 모든 내보내기의 데이터를 로드합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 파일 중 하나라도 가져오는 경우에만 node_modules/{packageName}의 모든 내보내기에 대한 데이터를 로드합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은, 다음의 코멘트에 기재되어 있습니다.https://github.com/microsoft/TypeScript/issues/31763#&lt;a href=&quot;https://github.com/microsoft/TypeScript/issues/31763#issuecomment-537226190&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;47-1&quot;&gt;issuecomment-537226190&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VS 코드 또는 특정 패키지의 유형 선언 중 하나의 버그로 인해 마지막 두 지점이 항상 작동하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 일반 Create-React-App에서는 react-bootstrap 자동 Import를 볼 수 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 수정한 것은 패키지 폴더를 node_modules에서 node_modules/@types로 수동으로 복사하고 형식 선언 파일(예: Button.d.ts)만 남겨두는 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;node_modules 폴더를 삭제하면 다시 작동이 중지되기 때문에 이는 좋지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저는 항상 수동으로 imports를 입력해야 하기 때문에 이것을 선호합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 방법을 시도했다가 실패한 후 이것이 저의 마지막 수단이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VS 코드 갱신 (v. 1.45.1)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지의 타입을 인스톨 합니다(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm install --save @types/react-bootstrap&lt;/code&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jsconfig.json 파일을 추가하고 다른 사람이 제안한 대로 설정을 사용하여 재생합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 Import를 위해 모든 플러그인을 시험해 봅니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 같은 문제가 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio Code(1.45.1 버전)가 타이프스크립트 프로젝트 중 하나에 대한 Import를 자동으로 추가하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우, 문제는 프로젝트 고유의 문제였고 VS Code에 확장을 추가할 필요가 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수정:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;importHelpers&quot;: true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tsconfig.json 파일의 compileOptions 섹션으로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VS 코드를 재시작합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tsconfig.json&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-json prettyprint-override&quot;&gt;&lt;code&gt;{
  &quot;compileOnSave&quot;: false,
  &quot;compilerOptions&quot;: {
    &quot;baseUrl&quot;: &quot;./&quot;,
    &quot;outDir&quot;: &quot;./dist/out-tsc&quot;,
    &quot;forceConsistentCasingInFileNames&quot;: true,
    &quot;strict&quot;: true,
    &quot;noImplicitOverride&quot;: true,
    &quot;noPropertyAccessFromIndexSignature&quot;: true,
    &quot;noImplicitReturns&quot;: true,
    &quot;noFallthroughCasesInSwitch&quot;: true,
    &quot;sourceMap&quot;: true,
    &quot;declaration&quot;: false,
    &quot;downlevelIteration&quot;: true,
    &quot;experimentalDecorators&quot;: true,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;importHelpers&quot;: true,
...
  },
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 채우다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;include&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 있는 JSON 객체의 첫 번째 레벨에 있는 속성&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tsconfig.editor.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;include&quot;: [
  &quot;src/**/*.ts&quot;
]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나한테는 잘 먹힌다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 필요에 따라 다음과 같이 다른 Typescript 파일 확장자를 추가할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;include&quot;: [
  &quot;src/**/*.ts&quot;,
  &quot;src/**/*.spec.ts&quot;,
  &quot;src/**/*.d.ts&quot;
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angular를 사용하고 있는 경우는, 다음의 각도와 같이 되어 있는 것을 확인해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tsconfig.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러는 포함되어 있지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(문제 단말기에서)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 이유에선지 이 선을 두 배로 늘렸는데 나한테는 안 통했어&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-json prettyprint-override&quot;&gt;&lt;code&gt;{
  &quot;module&quot;: &quot;esnext&quot;,
  &quot;moduleResolution&quot;: &quot;node&quot;,
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tsconfig.json에 &quot;typeRoots&quot; 속성을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;typeRoots&quot;: [
      &quot;node_modules/@types&quot;,
      &quot;node_modules/@angular&quot;,
      &quot;node_modules/@angular/common/http&quot;
    ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타 필요한 경로를 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 Typescript 버전 3.8.3에서 발견되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인텔리센스가 가장 좋지만, 저는 자동 Import 기능도 작동하지 않는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 Import가 동작하지 않는 경우에도 확장 설치를 시도했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;확장과 관련된 모든 설정을 다시 확인했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 캐시를 클리어하면 자동 Import 기능이 동작하기 시작했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C:\Users\Username\AppData\로밍\Code\Cache&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VSCode 새로고침(&amp;amp;)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: (보기) 메뉴에서 표시(숨김 항목)를 선택한 경우에만 AppData를 사용자 이름으로 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경우에 따라서는 Import와 관련된 오류가 있다고 생각할 수 있지만, 실제로는 사용되지 않는 기능이나 API를 사용하여 코딩하고 있는 경우도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 다음과 같이 코드화하려고 할 경우&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨스트럭터(http:Http) {&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;//...}&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 Http는 이미 폐지되어 새로운 버전에서는 HttpClient로 대체되어 있기 때문에 이 에러는 자동 Import 오류와 관련이 있을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &lt;a href=&quot;https://angular.io/guide/deprecations&quot; papago-id=&quot;78-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;폐지된 API&lt;/a&gt; 및 &lt;a href=&quot;https://angular.io/guide/deprecations&quot; papago-id=&quot;78-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;기능&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;타이프스크립트 임포터가 대신 작업합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=pmneo.tsimporter&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://marketplace.visualstudio.com/items?itemName=pmneo.tsimporter&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업영역 내에서 자동으로 타이프스크립트 정의를 검색하고 Enter 키를 누르면 가져옵니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ReactJs 또는 React-Native와 같은 JavaScript 프로젝트에서는 다음 단계를 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VC 코드에는 자동으로 자동 Import 플러그인이 포함되어 있기 때문에 먼저 모든 자동 Import 플러그인을 제거합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트의 루트에 jsconfig.json이라는 새 파일을 추가합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드를 추가합니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;{
   &quot;exclude&quot;: [&quot;node_modules&quot;]
}
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능을 추적하여 확인할 수 있는 &lt;a href=&quot;https://github.com/Microsoft/vscode/issues/818&quot; papago-id=&quot;86-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Visual Studio 코드&lt;/a&gt; 문제가 &lt;a href=&quot;https://github.com/Microsoft/vscode/issues/818&quot; papago-id=&quot;86-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;있습니다&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://visualstudio.uservoice.com/forums/293070-visual-studio-code/suggestions/13344849-auto-imports-in-typescript&quot; papago-id=&quot;86-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;User Voice&lt;/a&gt; 문제도 &lt;a href=&quot;https://visualstudio.uservoice.com/forums/293070-visual-studio-code/suggestions/13344849-auto-imports-in-typescript&quot; papago-id=&quot;86-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;있었지만&lt;/a&gt; Git Hub 문제로 투표를 옮겼다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TypeScript의 자동 Import 기능을 다시 사용할 수 있도록 하고 싶은 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/Microsoft/TypeScript/issues/7849&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;87-1&quot;&gt;여기서 TypeScript 자동 Import 문제를 추적하고 확인&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'Import'를 사용하고 있다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 Import를 위한 Devin Abbott의 JS 플러그인. 아래 코드를 사용하여 설치할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;npm install --global import-js&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VScode 1.57(2021년 5월)은 네이티브 &lt;em papago-id=&quot;89-1&quot;&gt;자동&lt;/em&gt; Import 기능을 연상시킵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 개선:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;h2 papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가져오기 명세서의 완료&lt;/font&gt;&lt;/h2&gt; 
 &lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JavaScript 및 TypeScript에서 자동 가져오기는 제안을 수락할 때 자동으로 가져오기를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VS Code 1.57을 사용하면 Import 스테이트먼트 자체를 작성할 때도 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/6QEEM.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/6QEEM.gif&quot; alt=&quot;Import 스테이트먼트에서 자동 Import -- https://media.githubusercontent.com/media/microsoft/vscode-docs/3e7e9293475f03a5263084d659f9dea6bf06dcc4/release-notes/images/1_57/ts-import.gif&quot; papago-attr-id=&quot;8&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Import를 수동으로 추가해야 할 경우 시간을 절약할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/38210604/&lt;a href=&quot;https://stackoverflow.com/questions/38210604/visual-studio-code-automatic-imports&quot; target=&quot;_blank&quot; papago-id=&quot;94-1&quot;&gt;visual-studio-code-automatic-imports&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/510</guid>
      <comments>https://shortcode.tistory.com/510#entry510comment</comments>
      <pubDate>Mon, 3 Apr 2023 22:56:34 +0900</pubDate>
    </item>
    <item>
      <title>Angular.js : 템플릿에서 ng-href를 사용하는 방법</title>
      <link>https://shortcode.tistory.com/509</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular.js : 템플릿에서 ng-href를 사용하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿을 포함한 1개의 index.html로 심플한 SPA를 작성하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ng-href 디렉티브에 문제가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;a ng-href=&quot;#/myPage&quot;&amp;gt;myPage&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;index.model에서는 동작하지만 템플릿에서는 동작하지 않습니다.링크는 클릭할 수 없습니다만, href는 아직 동작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;#/myPage&quot;&amp;gt;myPage&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;4-0&quot;&gt;내&lt;/strong&gt; 앱:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;index.syslog:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...
&amp;lt;body ng-app=&quot;myApp&quot;&amp;gt;
    &amp;lt;a ng-href=&quot;#/myPage&quot; target=&quot;_self&quot;&amp;gt;link&amp;lt;/a&amp;gt; &amp;lt;!-- work ! --&amp;gt;
    &amp;lt;div class=&quot;container&quot; ng-view=&quot;&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;app.filename:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'use strict';

angular.module('myApp',
        [ 'ngCookies', 'ngResource', 'ngSanitize', 'ngRoute' ]).config(
        function($routeProvider) {
            $routeProvider.when('/', {
                templateUrl : 'views/main.tpl.html',
                controller : 'MainCtrl'
            })

            .when('/myPage', {
                templateUrl : 'views/page.tpl.html',
                controller : 'MainCtrl'
            })

            .otherwise({
                redirectTo : '/'
            });
        });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;controller.controller.controllers&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'use strict';

    myApp.controller('MainCtrl', function() {
        this.myColor = 'blue';
    });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;page.tpl.displays (페이지.tpl.display)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;
    &amp;lt;a ng-href=&quot;#/myPage&quot; target=&quot;_self&quot;&amp;gt;link&amp;lt;/a&amp;gt; &amp;lt;!-- Dont work --&amp;gt;
    &amp;lt;a ng-href=&quot;#/myPage&quot; target=&quot;_self&quot;&amp;gt;link&amp;lt;/a&amp;gt; &amp;lt;!-- Dont work --&amp;gt;
    &amp;lt;a ng-href=&quot;#/myPage{{}}&quot;&amp;gt;link&amp;lt;/a&amp;gt; &amp;lt;!-- Dont work --&amp;gt;
    &amp;lt;a ng-href=&quot;#/{{ 'myPage' }}&quot;&amp;gt;link&amp;lt;/a&amp;gt; &amp;lt;!-- Dont work --&amp;gt;
    &amp;lt;a href=&quot;#/myPage&quot; target=&quot;_self&quot;&amp;gt;link&amp;lt;/a&amp;gt; &amp;lt;!-- Work ! --&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ng-href의 문제와 결과가 href와 다른 이유를 이해할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 각진 1.2를 쓴다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;ngHref&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 다음과 같이 각도 변수를 href 속성에 동적으로 바인드하기 위해 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a ng-href=&quot;#/{{myPathVariable}}&quot;/&amp;gt;Take Me Somewhere&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범위 내 위치:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$scope.myPathVariable = 'path/to/somewhere';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각도로 컴파일 한 후 다음과 같이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a ng-href=&quot;#/path/to/somewhere&quot; href=&quot;#/path/to/somewhere&quot; ... other angular attributes&amp;gt;Take Me Somewhere&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패스가 페이지에 하드코드 되어 있는 경우(링크가 페이지 로드 시 어디로 이동해야 하는지 알고 있습니다), href로 지정할 수 있기 때문에 세 번째 예가 기능합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ngHref&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS 로드 후 동적으로 루트를 결정하기 위해 각도가 필요한 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 사용자가 링크를 클릭하여 비활성 루트로 이동하는 것을 방지하고 각도가 링크를 가리키는 위치를 해독할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.angularjs.org/api/ng/directive/ngHref&quot; papago-id=&quot;2-1&quot;&gt;매뉴얼&lt;/a&gt;은 이쪽&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/23810995/&lt;a href=&quot;https://stackoverflow.com/questions/23810995/angular-js-how-to-use-ng-href-in-template&quot; target=&quot;_blank&quot; papago-id=&quot;15-1&quot;&gt;angular-js-how-to-use-ng-href-in-template&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/509</guid>
      <comments>https://shortcode.tistory.com/509#entry509comment</comments>
      <pubDate>Mon, 3 Apr 2023 22:55:35 +0900</pubDate>
    </item>
    <item>
      <title>Jackson JSON: json-tree에서 노드 이름 가져오기</title>
      <link>https://shortcode.tistory.com/508</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Jackson JSON: json-tree에서 노드 이름 가져오기&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Jackson을 사용하여 JSON 트리에서 노드 이름을 수신하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON-File은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;{  
    node1:&quot;value1&quot;,
    node2:&quot;value2&quot;,
    node3:{  
        node3.1:&quot;value3.1&quot;,
        node3.2:&quot;value3.2&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;있습니다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;JsonNode rootNode = mapper.readTree(fileReader);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 게 필요해요&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (JsonNode node : rootNode){
    if (node.getName().equals(&quot;foo&quot;){
        //bar
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잭슨 2+의 경우(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;com.fasterxml.jackson&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)의 방법은 조금 다릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Iterator&amp;lt;Entry&amp;lt;String, JsonNode&amp;gt;&amp;gt; nodes = rootNode.get(&quot;foo&quot;).fields();

while (nodes.hasNext()) {
  Map.Entry&amp;lt;String, JsonNode&amp;gt; entry = (Map.Entry&amp;lt;String, JsonNode&amp;gt;) nodes.next();

  logger.info(&quot;key --&amp;gt; &quot; + entry.getKey() + &quot; value--&amp;gt;&quot; + entry.getValue());
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 답변은 Jackson 2+ 이전 버전(원래 1.8용으로 작성)에 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Jackson 의 &lt;a href=&quot;https://stackoverflow.com/a/18342245/139010&quot; papago-id=&quot;7-1&quot;&gt;새로운&lt;/a&gt; 버전에서 동작하는 버전에 대해서는, @&lt;a href=&quot;https://stackoverflow.com/a/18342245/139010&quot; papago-id=&quot;7-1&quot;&gt;SupunSameera &lt;/a&gt;의 답변을 참조해 주세요&lt;a href=&quot;https://stackoverflow.com/a/18342245/139010&quot; papago-id=&quot;7-1&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;node name&quot;의 JSON 용어는 &quot;key&quot;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;에는 키가 포함되어 있지 않기 때문에, 다른 &lt;a href=&quot;http://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/JsonNode.html#fields%28%29&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-3&quot;&gt;방법&lt;/a&gt;으로 반복할 필요가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (Map.Entry&amp;lt;String, JsonNode&amp;gt; elt : rootNode.fields())
{
    if (&quot;foo&quot;.equals(elt.getKey()))
    {
        // bar
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;9-1&quot;&gt;키&lt;/em&gt;만 표시하면 다음과 같이 간단하게 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (String key : rootNode.fieldNames())
{
    if (&quot;foo&quot;.equals(key))
    {
        // bar
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키가 있는 노드를 찾으려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;foo&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;a href=&quot;http://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/JsonNode.html#get%28java.lang.String%29&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;직접 액세스&lt;/a&gt; 할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 루프를 사용하는 것보다 더 나은 성능(정시 검색)과 더 깨끗한/깨끗한 코드가 생성됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;JsonNode foo = rootNode.get(&quot;foo&quot;);
if (foo != null)
{
    // frob that widget
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;fields()와 field Names()는 모두 나에게 동작하지 않았다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 나는 키를 반복하는 방법을 찾기 위해 꽤 시간을 들여야 했다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것을 할 수 있는 두 가지 방법이 있다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나는 맵으로 변환하는 것입니다(더 많은 공간을 차지합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ObjectMapper mapper = new ObjectMapper();
Map&amp;lt;String, Object&amp;gt; result = mapper.convertValue(jsonNode, Map.class);
for (String key : result.keySet())
{
    if(key.equals(foo))
    {
        //code here
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 하나는 String 반복기를 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Iterator&amp;lt;String&amp;gt; it = jsonNode.getFieldNames();
while (it.hasNext())
{
    String key = it.next();
    if (key.equals(foo))
    {
         //code here
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 이쪽:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법은 유효하지만:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; JsonNode rootNode = objectMapper.readTree(file);
 Iterator&amp;lt;Map.Entry&amp;lt;String, JsonNode&amp;gt;&amp;gt; fields = rootNode.fields();
 while (fields.hasNext()) {
    Map.Entry&amp;lt;String, JsonNode&amp;gt; entry = fields.next();
    log.info(entry.getKey() + &quot;:&quot; + entry.getValue())
 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은, 이하에 해당하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;JsonNode rootNode = objectMapper.readTree(file);

while (rootNode.fields().hasNext()) {
    Map.Entry&amp;lt;String, JsonNode&amp;gt; entry = rootNode.fields().next();
    log.info(entry.getKey() + &quot;:&quot; + entry.getValue())
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러니까 주의해서 선언해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Iterator&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수로 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반드시 를 사용해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fasterxml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 라이브러리&lt;/font&gt;&lt;/font&gt;&lt;code&gt;codehaus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;JsonNode root = mapper.readTree(json);
root.at(&quot;/some-node&quot;).fields().forEachRemaining(e -&amp;gt; {
                              System.out.println(e.getKey()+&quot;---&quot;+ e.getValue());

        });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 줄에 잭슨 2+&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/7653813/&lt;a href=&quot;https://stackoverflow.com/questions/7653813/jackson-json-get-node-name-from-json-tree&quot; target=&quot;_blank&quot; papago-id=&quot;24-1&quot;&gt;jackson-json-get-node-name-from-json-tree&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/508</guid>
      <comments>https://shortcode.tistory.com/508#entry508comment</comments>
      <pubDate>Mon, 3 Apr 2023 22:54:59 +0900</pubDate>
    </item>
    <item>
      <title>WooCommerce Cart의 특정 제품 속성 및 메타 데이터 에코</title>
      <link>https://shortcode.tistory.com/507</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WooCommerce Cart의 특정 제품 속성 및 메타 데이터 에코&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트(작성자 의견 관련):&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-1&quot;&gt;&lt;a href=&quot;https://www.themepunch.com/essgrid-doc/essential-grid-documentation/&quot; papago-id=&quot;2-1-0&quot; rel=&quot;noreferrer&quot;&gt;Essential Grid 프리미엄&lt;/a&gt;&lt;/strong&gt; 플러그인을 &lt;strong papago-id=&quot;2-1&quot;&gt;&lt;a href=&quot;https://www.themepunch.com/essgrid-doc/essential-grid-documentation/&quot; papago-id=&quot;2-1-0&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;&lt;/strong&gt;하여 제품 페이지에 정상적으로 동작하는 메타 데이터를 표시하도록 WooCommerce cart.php를 커스터마이즈하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.themepunch.com/essgrid-doc/essential-grid-documentation/&quot; papago-id=&quot;3-3&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong papago-id=&quot;3-3-0&quot;&gt;Essential&lt;/strong&gt;&lt;/a&gt; Grid &lt;a href=&quot;https://www.themepunch.com/essgrid-doc/essential-grid-documentation/&quot; papago-id=&quot;3-3&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong papago-id=&quot;3-3-0&quot;&gt;플러그인&lt;/strong&gt;&lt;/a&gt;의 &lt;strong papago-id=&quot;3-1&quot;&gt;meta field&lt;/strong&gt; creator로 작성한 제품 속성 필드 및 커스텀 메타 필드를 표시하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트에는 속성(so)과 커스텀필드 slug를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 다음을 사용해 보고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo get_post_meta($product_id, 'pa_height', true );?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 다음과 같은 것도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo get_post_meta($product_id, 'eg-age-cal', true );?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이것들은 효과가 없는 것 같다.&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 방법으로 코드를 사용할 수 있게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo get_post_meta($product_id, '_regular_price', true );?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 코드가 작동한다는 걸 알아&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 커스텀 어트리뷰트와 커스텀필드에서 값을 취득하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;12-0&quot;&gt;업데이트&lt;/strong&gt;(WC 3+와의 호환성)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 코멘트에서 설명하신 후, 고객님이 &lt;a href=&quot;https://codecanyon.net/item/essential-grid-wordpress-plugin/7563340&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;Essential Grid Premium&lt;/a&gt; 플러그인&lt;em papago-id=&quot;13-3&quot;&gt;(상용&lt;/em&gt; 플러그인&lt;em papago-id=&quot;13-3&quot;&gt;)&lt;/em&gt;을 &lt;a href=&quot;https://codecanyon.net/item/essential-grid-wordpress-plugin/7563340&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;하여 고객님의 wooCommerce 제품과 관련된 커스텀 필드 및 속성을 만들고 있다는 것을 알게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;14-1&quot;&gt;이&lt;/strong&gt; 시점에서는 이 플러그인을 사용한 적이 없기 때문에 도움이 되지 않습니다.또한 이 플러그인의 데이터베이스 내 어디에 데이터가 저장되어 있는지 알 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WordPress/WooCommerce 함수를 사용하여 데이터를&lt;strong papago-id=&quot;15-1&quot;&gt; 얻을&lt;/strong&gt; 수 &lt;strong papago-id=&quot;15-1&quot;&gt;없기&lt;/strong&gt; 때문에 평소처럼 데이터를 사용할 수 &lt;strong papago-id=&quot;15-1&quot;&gt;없다고&lt;/strong&gt; 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움을 받는 가장 좋은 방법은 다음과 같습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 데이터베이스에서 해당 사용자 지정 필드 데이터를 검색/검색합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- &lt;strong papago-id=&quot;18-1&quot;&gt;Essential&lt;/strong&gt; Grid 플러그인 &lt;strong papago-id=&quot;18-1&quot;&gt;작성자&lt;/strong&gt;가 지원 스레드를 검색/질문합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 원래 답변은:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;20-0&quot;&gt;제품에 정의&lt;/strong&gt;되어 있는 &lt;strong papago-id=&quot;20-0&quot;&gt;속성의 경우&lt;/strong&gt; 변수와 함수를 사용하여 원하는 데이터를 얻으려면 다음과 같이 사용해야 합니다(이것은 값의 배열입니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// getting the defined product attributes
$product_attr = get_post_meta( $product_id, '_product_attributes' );

// displaying the array of values (just to test and to see output)
echo var_dump( $product_attr );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능을 사용할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;get_attributes()&lt;/code&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;22-0&quot;&gt;(더 &lt;/em&gt;권장사항), 다음과 같이 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Creating an object instance of the product
$_product = new WC_Product( $product_id );

// getting the defined product attributes
$product_attr = $_product-&amp;gt;get_attributes();

// displaying the array of values (just to test and to see output)
echo var_dump( $product_attr );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 코드가 테스트되어 동작하고 있다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;24-0&quot;&gt;카트 데이터가 쿠키와 세션에 설정&lt;/strong&gt;되었습니다.카트의 데이터와 아이템을 취득하려면 구문을 사용해야 &lt;strong papago-id=&quot;24-0&quot;&gt;합니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 다음과 같은 코드를 사용하여 카트에 있는 아이템(제품)을 가져올 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;foreach ( WC()-&amp;gt;cart-&amp;gt;get_cart() as $cart_item ) {
    $product = $cart_item['data'];
    if(!empty($product)){

        // getting the defined product attributes
        $product_attr = $_product-&amp;gt;get_attributes();

        // displaying the attributes array of values (just to test and to see output)
        echo var_dump( $product_attr ) . '&amp;lt;br&amp;gt;';
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 CART의 각 제품에 대한 속성 배열이 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/38487561/woocommerce-get-custom-product-attribute/38538673#38538673&quot; papago-id=&quot;27-2&quot;&gt;&lt;strong papago-id=&quot;27-2-0&quot;&gt;이&lt;/strong&gt;&lt;/a&gt; 스레드를 &lt;a href=&quot;https://stackoverflow.com/questions/38487561/woocommerce-get-custom-product-attribute/38538673#38538673&quot; papago-id=&quot;27-2&quot;&gt;&lt;strong papago-id=&quot;27-2-0&quot;&gt;기반&lt;/strong&gt;&lt;/a&gt;으로 한 솔루션. 동일한 코드 스니펫 내에서 속성을 가져옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;foreach ( WC()-&amp;gt;cart-&amp;gt;get_cart() as $cart_item ) {
    $product = $cart_item['data'];
    if(!empty($product)){

        // compatibility with WC +3
        $product_id = method_exists( $product, 'get_id' ) ? $product-&amp;gt;get_id() : $product-&amp;gt;id;

        // Getting &quot;height&quot; product attribute
        $myAttribute = array_shift( wc_get_product_terms( $product_id, 'pa_height', array( 'fields' =&amp;gt; 'names' ) ) );
        echo $myAttribute . '&amp;lt;br&amp;gt;';
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고 자료:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.woocommerce.com/wc-apidocs/class-WC_Product.html#_get_attributes&quot; rel=&quot;noreferrer&quot; papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WC_Product Class - get_attributes()&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/38487561/woocommerce-get-custom-product-attribute/38538673#38538673&quot; papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WooCommerce - 커스텀 제품 속성 가져오기&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/38798888/get-cart-products-id-on-checkout-woocommerce-page-to-display-product-images/38804401#38804401&quot; papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제품 이미지를 표시하려면 WooCommerce 체크아웃 페이지에서 카트 제품 ID 가져오기&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/functions/get_post_meta/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WordPress 코드 참조 - get_post_meta()&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/38813247/&lt;a href=&quot;https://stackoverflow.com/questions/38813247/echo-specific-product-attributes-and-meta-data-in-woocommerce-cart&quot; target=&quot;_blank&quot; papago-id=&quot;33-1&quot;&gt;echo-specific-product-attributes-and-meta-data-in-woocommerce-cart&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/507</guid>
      <comments>https://shortcode.tistory.com/507#entry507comment</comments>
      <pubDate>Mon, 3 Apr 2023 22:53:35 +0900</pubDate>
    </item>
    <item>
      <title>react - typescript를 사용하여 컨텍스트를 만들 때 네임스페이스 'ctx'를 찾을 수 없습니다.</title>
      <link>https://shortcode.tistory.com/506</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;react - typescript를 사용하여 컨텍스트를 만들 때 네임스페이스 'ctx'를 찾을 수 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트 진행 중인데&lt;/font&gt;&lt;/font&gt;&lt;code&gt;react&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typescript&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 에러가 발생하는 이유를 파악하는데 어려움을 겪고 있습니다.기본적으로 이 에러는 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;createContext&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것 때문에 인터넷에서 찾은 예들.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 여기서 얻은 것입니다.https://github.com/typescript-cheatsheets/&lt;a href=&quot;https://github.com/typescript-cheatsheets/react-typescript-cheatsheet&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;react-typescript-cheatsheet&lt;/a&gt; '콘텍스트' 섹션에 나와 있는 것과 같은 것을 사용하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import * as React from &quot;react&quot;;

export function createCtx&amp;lt;A&amp;gt;(defaultValue: A) {
type UpdateType = React.Dispatch&amp;lt;React.SetStateAction&amp;lt;typeof defaultValue&amp;gt;&amp;gt;;
const defaultUpdate: UpdateType = () =&amp;gt; defaultValue;
const ctx = React.createContext({
    state: defaultValue,
    update: defaultUpdate
});
function Provider(props: React.PropsWithChildren&amp;lt;{}&amp;gt;) {
    const [state, update] = React.useState(defaultValue);
    return &amp;lt;ctx.Provider value={{ state, update }} {...props} /&amp;gt;;
}
return [ctx, Provider] as [typeof ctx, typeof Provider];
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 이 오류가 발생할 때마다 네임스페이스를 찾을 수 없다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ctx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;행:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        return &amp;lt;ctx.Provider value={{ state, update }} {...props} /&amp;gt;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 그런지 아직도 모르겠어요. 누군가 제가 잘못하고 있는지 알 수 있어요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 tsconfig.json 입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
&quot;compilerOptions&quot;: {
&quot;target&quot;: &quot;es5&quot;,
&quot;lib&quot;: [
  &quot;dom&quot;,
  &quot;dom.iterable&quot;,
  &quot;esnext&quot;
],
&quot;allowJs&quot;: true,
&quot;skipLibCheck&quot;: true,
&quot;esModuleInterop&quot;: true,
&quot;allowSyntheticDefaultImports&quot;: true,
&quot;strict&quot;: false,
&quot;forceConsistentCasingInFileNames&quot;: true,
&quot;module&quot;: &quot;esnext&quot;,
&quot;moduleResolution&quot;: &quot;node&quot;,
&quot;resolveJsonModule&quot;: true,
&quot;isolatedModules&quot;: true,
&quot;noEmit&quot;: true,
&quot;jsx&quot;: &quot;preserve&quot;,
&quot;noImplicitAny&quot;: false,
&quot;strictNullChecks&quot;: false
},
&quot;include&quot;: [
&quot;src&quot;
]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 확장자는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.ts&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.tsx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 TypeScript는 다음과 같이 해석합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;ctx.Provider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배역을 맡아 활자를 찾으려 한다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Provider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네임스페이스에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ctx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/57242264/&lt;a href=&quot;https://stackoverflow.com/questions/57242264/cannot-find-namespace-ctx-error-when-creating-context-with-react-typescript&quot; target=&quot;_blank&quot; papago-id=&quot;16-1&quot;&gt;cannot-find-namespace-ctx-error-when-creating-context-with-react-typescript&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/506</guid>
      <comments>https://shortcode.tistory.com/506#entry506comment</comments>
      <pubDate>Mon, 3 Apr 2023 22:52:22 +0900</pubDate>
    </item>
    <item>
      <title>고객 일치 배송 구역 삭제..&amp;quot;. woocommerce 카트에 있는 메시지</title>
      <link>https://shortcode.tistory.com/505</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고객 일치 배송 구역 삭제..&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;. woocommerce 카트에 있는 메시지&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제품이 우리 바구니에 추가될 때마다, 카트의 메시지는&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고객 일치 배송 지역 영국 (#3)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;영국 배송(#table_rate-3) 배송 방법 인스턴스를 등록하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 나는 그들을 원하지 않는다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;백엔드의 설정에서는, 오프 할 수 있는 장소가 표시되지 않는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 모든 메시지를 삭제하고 싶지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;{product}이(가) 장바구니에 추가되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;남아야 해요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무쪼록 잘 부탁드립니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답변을 업데이트하기 위해 WooCommerce 3.0.7의 경우 배송 디버깅모드를 활성화/비활성화하는 경로는 &lt;strong papago-id=&quot;8-1&quot;&gt;WooCommerce&lt;/strong&gt; -&amp;gt;&lt;strong papago-id=&quot;8-1&quot;&gt; Shipping&lt;/strong&gt; -&amp;gt;&lt;strong papago-id=&quot;8-1&quot;&gt; Shipping&lt;/strong&gt; Options로 &lt;strong papago-id=&quot;8-3&quot;&gt;디버깅모드를 활성화/비활성화&lt;/strong&gt;하는 경로입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출하 디버깅 모드를 비활성화하려면 WooCommerce &lt;strong papago-id=&quot;9-1&quot;&gt;-&lt;/strong&gt;&amp;gt;&lt;strong papago-id=&quot;9-1&quot;&gt; System &lt;/strong&gt;status -&amp;gt;&lt;strong papago-id=&quot;9-1&quot;&gt; Tools&lt;/strong&gt;로 이동하여 &quot;&lt;strong papago-id=&quot;9-1&quot;&gt;Shipping&lt;/strong&gt; &lt;strong papago-id=&quot;9-3&quot;&gt;&lt;em papago-id=&quot;9-3-0&quot;&gt;Debug Mode&quot;&lt;/em&gt;&lt;/strong&gt; 체크박스와 &lt;strong papago-id=&quot;9-3&quot;&gt;&lt;em papago-id=&quot;9-3-0&quot;&gt;&quot;Save&lt;/em&gt;&lt;/strong&gt; changes&quot; 체크박스를 꺼야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 브라우저 쿠키를 지우고 한 번 테스트합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 문제가 해결되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹 사이트 주소 뒤에 붙여넣기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/wp-admin/admin.php?page=wc-settings&amp;amp;tab=shipping&amp;amp;section=options
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;디버깅 모드 활성화&quot; 선택을 취소합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/33671993/&lt;a href=&quot;https://stackoverflow.com/questions/33671993/remove-customer-matched-shipping-zone-message-in-woocommerce-cart&quot; target=&quot;_blank&quot; papago-id=&quot;12-1&quot;&gt;remove-customer-matched-shipping-zone-message-in-woocommerce-cart&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/505</guid>
      <comments>https://shortcode.tistory.com/505#entry505comment</comments>
      <pubDate>Mon, 3 Apr 2023 22:51:16 +0900</pubDate>
    </item>
    <item>
      <title>mongo에 인증할 수 없습니다. &amp;quot;auth failures&amp;quot;</title>
      <link>https://shortcode.tistory.com/504</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo에 인증할 수 없습니다. &quot;auth failures&quot;&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 명령을 사용하여 mongo 관리 사용자를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://docs.mongodb.org/manual/tutorial/add-user-administrator/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://docs.mongodb.org/manual/tutorial/add-user-administrator/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo 클라이언트에서 인증할 수 있을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; use admin
switched to db admin
&amp;gt; db.auth('admin','SECRETPASSWORD');
1
&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 다른 방법은 연결할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo - u admin -p SECRET PASSWORD&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: &quot;auth fails&quot; } at src/mongo/shell/db.js:L228
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 있다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;auth = true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;etc/mongod.conf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 무엇을 빠뜨리고 있나요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인증은 데이터베이스 수준에서 관리됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;database&amp;gt;.system.users&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 &quot; &quot;test&quot;에서 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test.system.users&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 에러에 ).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;admin.system.users&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).  쓸 수 직접 수  것은 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 모든 DB에서 읽고 쓸 수 있는 권한이 있다고 해서 직접 연결할 수 있는 것은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 자격 증명을 보유한 데이터베이스에 연결해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시험:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mongo admin -u admin -p SECRETPASSWORD
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세한 것에 대하여는,&lt;a href=&quot;http://docs.mongodb.org/manual/reference/privilege-documents/&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;http://docs.mongodb.org/manual/reference/&lt;a href=&quot;http://docs.mongodb.org/manual/reference/privilege-documents/&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt;privilege-documents&lt;/a&gt;/ 를 참조해 주세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 다음의 에러가 발생했습니다.필요한 것은, 사용자 인증 데이터가 격납되어 있는 데이터베이스를 지정하는 것이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo - u admin -p SECRET PASSWORD --authenticationDatabase admin&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2017년 11월 18일 갱신:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mongo admin -u admin -p
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 해결책입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mongo가 비밀번호를 입력하도록 지시할 것입니다.이렇게 하면 클리어 텍스트 비밀번호를 셸 이력에 입력하지 않게 됩니다.이것은 끔찍한 보안 관행일 뿐입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo 쉘을 업그레이드해야 할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 2.4.9의 mongo 셸을 로컬로 사용하고 있었는데 mongo 3 데이터베이스에 접속하려고 하면 오류가 발생하였습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;셸 버전을 3으로 업그레이드하면 문제가 해결되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당연한 것처럼 보일 수도 있지만, 작동하기 전에 u/n과 p/w 주위에 하나의 인용문을 사용해야만 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo admin - u 'user' -p 'password'&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MongoDB 3.0에서는 여러 인증 메커니즘을 지원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MongoDB Challenge and Response(SCRAM-SHA-1) - 3.0 디폴트&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MongoDB Challenge and Response (MONGODB-CR) - 이전 기본값(&amp;lt; 3.0)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;신규 사용자가 생성된 새로운 3.0 데이터베이스로 시작할 경우 SCRAM-SHA-1을 사용하여 작성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 때문에, 그 인증을 실시할 수 있는 드라이버가 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers&quot; papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://docs.mongodb.org/manual/release-notes/3.0-scram/ #completions-sha-1-completions&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기존 사용자 데이터를 사용하여 2.x에서 데이터베이스를 업그레이드한 경우에도 MONGODB-CR은 계속 사용되므로 사용자 인증 데이터베이스를 업그레이드해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram&quot; papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://docs.mongodb.org/manual/release-notes/3.0-scram/ #upgrade-mongodb-cr-to-mongodb&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SCRAM-SHA-1로 작성된 사용자와 MongoDB 3.0에 접속하여 인증 데이터베이스를 지정(커맨드라인 mongo 클라이언트 경유)하고 드라이버를 사용하는 경우 다른 메커니즘을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$&amp;gt; mongo - u USER - p PASSWORD -- authentication Database admin&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 &quot;admin&quot; 데이터베이스가 인증에 사용됩니다.이 데이터베이스도 기본값입니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것으로 문제가 해결되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;터미널 쉘로 이동하여 입력&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mongo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use db_name&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다음과 같이 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; db.createUser(
   {
     user: &quot;mongodb&quot;,
     pwd: &quot;dogmeatsubparflavour1337&quot;,
     roles: [ { role: &quot;dbOwner&quot;, db: &quot;db_name&quot; } ]
   }
 )
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 다음의 조작도 시험해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db.getUsers()&lt;/code&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;퀵 샘플:&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;const MongoClient = require('mongodb').MongoClient;

// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com:27017/?authMechanism=DEFAULT&amp;amp;authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options

// Use Connect Method to connect to the Server
MongoClient.connect(url)
  .then((db) =&amp;gt; {
    console.log(db);
    console.log('Casually connected correctly to server.');
    // Be careful with db.close() when working asynchronously
    db.close();
  })
  .catch((error) =&amp;gt; {
    console.log(error);
  });
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;43-1&quot;&gt;문제&lt;/em&gt;는 mongo documents에서 설명한 방법으로 작성된 사용자에게 기본 데이터베이스(테스트)에 접속할 권한이 없다는 것입니다.이 사용자는 &quot;userAdminAnyDatabase&quot; 및 &quot;dbAdminAnyDatabase&quot; 역할로 작성되어 있어도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 가능성:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자를 생성했을 때 실수로 인해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 데이터베이스 입력&lt;/font&gt;&lt;/font&gt;&lt;code&gt;admin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 당신이 원하는 것 말고도.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--authenticationDatabase&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 실제로 생성된 데이터베이스로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;mongodb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신을 곤경에 빠뜨린 것 같다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;셸을 열 때 기본적으로 데이터베이스를 사용하기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--authenticationDatabase test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--authenticationDatabase admin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 우연히&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;입력&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;53&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네가 뛰었을 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db.createUser(...)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;55&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongodb 인스턴스를 실행하고 있는 머신에 액세스 할 수 있다고 가정하면, y는 에서 인가를 무효로 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/mongod.conf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;56&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(삭제하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;authorization&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보안에 의해 중첩됩니다).그리고 서버를 재시작한 후 다음 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mongo
show users
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 결과를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;_id&quot; : &quot;test.myusername&quot;,
    &quot;user&quot; : &quot;myusername&quot;,
    &quot;db&quot; : &quot;test&quot;,
    &quot;roles&quot; : [
        {
            &quot;role&quot; : &quot;dbOwner&quot;,
            &quot;db&quot; : &quot;mydatabasename&quot;
        }
    ],
    &quot;mechanisms&quot; : [
        &quot;SCRAM-SHA-1&quot;,
        &quot;SCRAM-SHA-256&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값이 같다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;61&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 이유는 사용자를 만들 때 처음 실행하지 않았기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use admin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;62&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use desiredDatabaseName&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;63&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.이렇게 하면사용자를삭제할수있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db.dropUser(&quot;myusername&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;64&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 데이터베이스 아래에 다음과 같이 다른 사용자를 작성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;use desiredDatabaseName
db.createUser(...)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 입장이었던 누군가가 도움이 됐으면 좋겠다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것도 시도해 보세요:-&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mongo localhost:27017/admin -u admin -p SECRETPASSWORD
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4881208/how-to-secure-mongodb-with-username-and-password&quot; papago-id=&quot;67-1&quot;&gt;이&lt;/a&gt; 투고에서 &lt;a href=&quot;https://stackoverflow.com/questions/4881208/how-to-secure-mongodb-with-username-and-password&quot; papago-id=&quot;67-1&quot;&gt;찾았습니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 &lt;strong papago-id=&quot;68-1&quot;&gt;localhost&lt;/strong&gt;는 다른 호스트일 수도 있고 /&lt;strong papago-id=&quot;68-3&quot;&gt;admin은 &lt;/strong&gt;인증이 적용된 다른 데이터베이스일 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 특정 케이스지만 누군가 내 문제를 가지고 올 경우를 대비해서:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MongoHQ에서는 &quot;password&quot;라는 필드가 표시되지만 실제로는 비밀번호 해시일 뿐입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 사용자를 추가하고 암호를 다른 곳에 저장해야 합니다(Mongo가&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;본사에서 보여주지 않습니다.)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo 쉘에 로그인하는 적절한 방법은&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo localhost: 27017 - u 'uuuuu' - p '&amp;gt; xxxxx' -- authentication Database dbname&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;mongo admin -u root -p root

mongorestore -u root  --authenticationDatabase admin --db rtp_new mongo
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo 서버에 접속하고 있는 클라이언트의 mongo 버전을 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우 mongo 서버는 Mongo 4.0.0 버전인데 제 클라이언트는 2.4.9 버전입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongo 버전을 업데이트하여 mongo CLI를 업데이트합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는, 이 에러에 각를 떼어내는 에 발생하고 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongoURI가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것들을 제거하는 것은 마법처럼 효과가 있었다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/18216712/&lt;a href=&quot;https://stackoverflow.com/questions/18216712/cannot-authenticate-into-mongo-auth-fails&quot; target=&quot;_blank&quot; papago-id=&quot;77-1&quot;&gt;cannot-authenticate-into-mongo-auth-fails&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/504</guid>
      <comments>https://shortcode.tistory.com/504#entry504comment</comments>
      <pubDate>Sun, 5 Mar 2023 21:48:56 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스가 내 URL 끝에 %E2%80%8E을(를) 넣는데, 어떻게 된 거죠?</title>
      <link>https://shortcode.tistory.com/503</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스가 내 URL 끝에 %E2%80%8E을(를) 넣는데, 어떻게 된 거죠?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스가 이걸 라이브 사이트의 내 퍼멀링크 끝에... %E2%80%8E 왜 그런지 아는 사람?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;고마워 얘들아?!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-0&quot;&gt;MS&lt;/strong&gt; Word 또는 WordPad 또는 유사한 편집기에서 게시 제목을 복사하는 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문자는 줄의 끝과 같다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순서 1) 링크를 식별하고 WordPress 대시보드에 표시되는 게시물 또는 페이지를 엽니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2단계) 문제의 원인이 되는 보이지 않는 문자를 삭제해야 하므로 따옴표를 포함한 URL의 마지막 여러 문자를 삭제해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3단계) 삭제한 내용을 수동으로 다시 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4단계) [Update](업데이트)를 클릭하여 [Go](이동)을 클릭하여 수정된 게시물을 확인하여 문제가 해결되었는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.wpkb.com/fix-wordpress-links-%E2%80%8E-end/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.wpkb.com/fix-wordpress-links-%E2%80%8E-end/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-1&quot;&gt;이러한 보이지&lt;/strong&gt; 않는 &lt;strong papago-id=&quot;8-1&quot;&gt;유니코드&lt;/strong&gt; 문자는 실제로 존재합니다(의심 없이).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;화살표 키를 사용하여 커서를 이동할 때 이러한 항목을 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Word와 같은 형식 편집기에 의해 추가되곤 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;말도 안 되지만 Edge는 창 제목 =-O(암호 관리자 포함)나 MS Teams Wiki를 코드 스니펫(스페이스로 구분된 일반 텍스트 보존용)에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘날 거의 모든 일반 텍스트 편집기와 브라우저(따라서 모든 웹 앱)가 Unicode를 지원하며 &lt;strong papago-id=&quot;9-1&quot;&gt;Ctrl+Shift로 붙여넣어도 이&lt;/strong&gt;를 보존하기 때문에 이를 &lt;strong papago-id=&quot;9-1&quot;&gt;제거&lt;/strong&gt;하는 것은 복잡합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;백스페이스를 사용하려고 해도 보통 편집자는 rtl/ltr 텍스트 방향을 유지하기 위해 백스페이스를 유지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제목을 16진수 편집기에 복사하고 해당 문자를 제거한 후 다시 복사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 주소 표시줄에서 ASCII 부분만 복사하고(URL 인코딩된 경우) 모두(ctrl-a)를 선택하여 제목 필드를 지웁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용방법:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PSPad(네이티브)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모장++(HEX-Editor 플러그인 포함)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 보이지 않는 문자:&lt;/font&gt;&lt;/p&gt; 
&lt;div class=&quot;s-table-container&quot;&gt; 
 &lt;table class=&quot;s-table&quot;&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 포인트&lt;/font&gt;&lt;/th&gt; 
    &lt;th papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UTF-8 16진수&lt;/font&gt;&lt;/th&gt; 
    &lt;th papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름.&lt;/font&gt;&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;U+200B&lt;/font&gt;&lt;/td&gt; 
    &lt;td papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;e2 80 8b&lt;/font&gt;&lt;/td&gt; 
    &lt;td papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제로 폭 공간&lt;/font&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;U+200E&lt;/font&gt;&lt;/td&gt; 
    &lt;td papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;e2 80 8e&lt;/font&gt;&lt;/td&gt; 
    &lt;td papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왼쪽에서 오른쪽으로 마크&lt;/font&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'U+200F&lt;/font&gt;&lt;/td&gt; 
    &lt;td papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;e2 80 8f&lt;/font&gt;&lt;/td&gt; 
    &lt;td papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오른쪽에서 왼쪽 마크&lt;/font&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&amp;amp;number=128&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&amp;amp;number=128&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 어떤 편집기에서 복사했다면요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 해결책은 UTF-8 문자를 지원하지 않기 때문에 편집기에서 내용을 복사하여 '노트패드' 텍스트 편집기에 붙여넣기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트에서 '%E2%80%8E'와 같은 문자/텍스트가 버그임을 쉽게 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모두 인쇄할 수 없는 ASCII 문자입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;like these are all äÄçÇéÉêöÖÐþúÚ&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제거하려면 이 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;function remove_non_ascii(str) {
  
  if ((str===null) || (str===''))
       return false;
 else
   str = str.toString();
  
  return str.replace(/[^\x20-\x7E]/g, '');
}

console.log(remove_non_ascii('äÄçÇéÉêHello-WorldöÖÐþúÚ'));&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 WordPress가 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%E2%80%8E&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것들 대신.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 링크에서 하프 스페이스(&lt;kbd papago-id=&quot;35-1&quot;&gt;CTRL + Space&lt;/kbd&gt; 또는 )를 사용하는 경우 WordPress는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%E2%80%8E&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 방법 : + .ㄹ게요 : 텍스+  . . . . . . . . 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/10342012/&lt;a href=&quot;https://stackoverflow.com/questions/10342012/wordpress-putting-e2808e-at-the-end-of-my-url-howcome&quot; target=&quot;_blank&quot; papago-id=&quot;38-1&quot;&gt;wordpress-putting-e2808e-at-the-end-of-my-url-howcome&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/503</guid>
      <comments>https://shortcode.tistory.com/503#entry503comment</comments>
      <pubDate>Sun, 5 Mar 2023 21:48:11 +0900</pubDate>
    </item>
    <item>
      <title>3레벨의 MongoDB 중첩 조회</title>
      <link>https://shortcode.tistory.com/502</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3레벨의 MongoDB 중첩 조회&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스에서 단일 개체 계층 전체를 JSON으로 가져와야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로, 이 결과를 달성하기 위한 다른 솔루션에 대한 제안은 매우 감사할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MongoDB를 MongoDB와 함께 사용하기로 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$lookup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지지하다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세 가지 컬렉션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파티&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{ &quot;_id&quot; : &quot;2&quot;, &quot;name&quot; : &quot;party2&quot; }
{ &quot;_id&quot; : &quot;5&quot;, &quot;name&quot; : &quot;party5&quot; }
{ &quot;_id&quot; : &quot;4&quot;, &quot;name&quot; : &quot;party4&quot; }
{ &quot;_id&quot; : &quot;1&quot;, &quot;name&quot; : &quot;party1&quot; }
{ &quot;_id&quot; : &quot;3&quot;, &quot;name&quot; : &quot;party3&quot; }    
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주소.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{ &quot;_id&quot; : &quot;a3&quot;, &quot;street&quot; : &quot;Address3&quot;, &quot;party_id&quot; : &quot;2&quot; }
{ &quot;_id&quot; : &quot;a6&quot;, &quot;street&quot; : &quot;Address6&quot;, &quot;party_id&quot; : &quot;5&quot; }
{ &quot;_id&quot; : &quot;a1&quot;, &quot;street&quot; : &quot;Address1&quot;, &quot;party_id&quot; : &quot;1&quot; }
{ &quot;_id&quot; : &quot;a5&quot;, &quot;street&quot; : &quot;Address5&quot;, &quot;party_id&quot; : &quot;5&quot; }
{ &quot;_id&quot; : &quot;a2&quot;, &quot;street&quot; : &quot;Address2&quot;, &quot;party_id&quot; : &quot;1&quot; }
{ &quot;_id&quot; : &quot;a4&quot;, &quot;street&quot; : &quot;Address4&quot;, &quot;party_id&quot; : &quot;3&quot; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어드레스 코멘트&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{ &quot;_id&quot; : &quot;ac2&quot;, &quot;address_id&quot; : &quot;a1&quot;, &quot;comment&quot; : &quot;Comment2&quot; }
{ &quot;_id&quot; : &quot;ac1&quot;, &quot;address_id&quot; : &quot;a1&quot;, &quot;comment&quot; : &quot;Comment1&quot; }
{ &quot;_id&quot; : &quot;ac5&quot;, &quot;address_id&quot; : &quot;a5&quot;, &quot;comment&quot; : &quot;Comment6&quot; }
{ &quot;_id&quot; : &quot;ac4&quot;, &quot;address_id&quot; : &quot;a3&quot;, &quot;comment&quot; : &quot;Comment4&quot; }
{ &quot;_id&quot; : &quot;ac3&quot;, &quot;address_id&quot; : &quot;a2&quot;, &quot;comment&quot; : &quot;Comment3&quot; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 상대방이 대응하는 주소를 가지고 있는 것을 모두 취득해, 기록의 일부로서 코멘트를 수신할 필요가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 집약:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;db.party.aggregate([{
    $lookup: {
        from: &quot;address&quot;,
        localField: &quot;_id&quot;,
        foreignField: &quot;party_id&quot;,
        as: &quot;address&quot;
    }
},
{
    $unwind: &quot;$address&quot;
},
{
    $lookup: {
        from: &quot;addressComment&quot;,
        localField: &quot;address._id&quot;,
        foreignField: &quot;address_id&quot;,
        as: &quot;address.addressComment&quot;
    }
}])
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과가 좀 이상해요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 기록은 괜찮습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 파티는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_id: 4&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 없습니다(주소는 없습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 2개의 파티가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_id: 1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(다만, 주소가 다른 경우):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;_id&quot;: &quot;1&quot;,
    &quot;name&quot;: &quot;party1&quot;,
    &quot;address&quot;: {
        &quot;_id&quot;: &quot;2&quot;,
        &quot;street&quot;: &quot;Address2&quot;,
        &quot;party_id&quot;: &quot;1&quot;,
        &quot;addressComment&quot;: [{
            &quot;_id&quot;: &quot;3&quot;,
            &quot;address_id&quot;: &quot;2&quot;,
            &quot;comment&quot;: &quot;Comment3&quot;
        }]
    }
}{
    &quot;_id&quot;: &quot;1&quot;,
    &quot;name&quot;: &quot;party1&quot;,
    &quot;address&quot;: {
        &quot;_id&quot;: &quot;1&quot;,
        &quot;street&quot;: &quot;Address1&quot;,
        &quot;party_id&quot;: &quot;1&quot;,
        &quot;addressComment&quot;: [{
            &quot;_id&quot;: &quot;1&quot;,
            &quot;address_id&quot;: &quot;1&quot;,
            &quot;comment&quot;: &quot;Comment1&quot;
        },
        {
            &quot;_id&quot;: &quot;2&quot;,
            &quot;address_id&quot;: &quot;1&quot;,
            &quot;comment&quot;: &quot;Comment2&quot;
        }]
    }
}{
    &quot;_id&quot;: &quot;3&quot;,
    &quot;name&quot;: &quot;party3&quot;,
    &quot;address&quot;: {
        &quot;_id&quot;: &quot;4&quot;,
        &quot;street&quot;: &quot;Address4&quot;,
        &quot;party_id&quot;: &quot;3&quot;,
        &quot;addressComment&quot;: []
    }
}{
    &quot;_id&quot;: &quot;5&quot;,
    &quot;name&quot;: &quot;party5&quot;,
    &quot;address&quot;: {
        &quot;_id&quot;: &quot;5&quot;,
        &quot;street&quot;: &quot;Address5&quot;,
        &quot;party_id&quot;: &quot;5&quot;,
        &quot;addressComment&quot;: [{
            &quot;_id&quot;: &quot;5&quot;,
            &quot;address_id&quot;: &quot;5&quot;,
            &quot;comment&quot;: &quot;Comment5&quot;
        }]
    }
}{
    &quot;_id&quot;: &quot;2&quot;,
    &quot;name&quot;: &quot;party2&quot;,
    &quot;address&quot;: {
        &quot;_id&quot;: &quot;3&quot;,
        &quot;street&quot;: &quot;Address3&quot;,
        &quot;party_id&quot;: &quot;2&quot;,
        &quot;addressComment&quot;: [{
            &quot;_id&quot;: &quot;4&quot;,
            &quot;address_id&quot;: &quot;3&quot;,
            &quot;comment&quot;: &quot;Comment4&quot;
        }]
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것 좀 도와주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 MongoDB에 익숙하지 않지만 MongoDB는 제가 원하는 것을 할 수 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'문제'의 원인은 두 번째 집약 단계입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{ $unwind: &quot;$address&quot; }&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.이것에 의해, 와의 파티의 레코드가 삭제됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_id: 4&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(주소 배열이 비어있기 때문에) 통화 상대용으로 2개의 레코드를 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_id: 1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_id: 5&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(각각 2개의 주소가 있기 때문입니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주소가 없는 통화자의 삭제를 방지하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;preserveNullAndEmptyArrays&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하기 위한 스테이지 옵션&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 주소에 대한 파티의 복제를 방지하려면 파이프라인에 집계 단계를 추가해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 연산자와 함께 스테이지를 사용하여 출력에서 빈 주소 레코드를 제외합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;db.party.aggregate([{
  $lookup: {
    from: &quot;address&quot;,
    localField: &quot;_id&quot;,
    foreignField: &quot;party_id&quot;,
    as: &quot;address&quot;
  }
}, {
  $unwind: {
    path: &quot;$address&quot;,
    preserveNullAndEmptyArrays: true
  }
}, {
  $lookup: {
    from: &quot;addressComment&quot;,
    localField: &quot;address._id&quot;,
    foreignField: &quot;address_id&quot;,
    as: &quot;address.addressComment&quot;,
  }
}, {
  $group: {
    _id : &quot;$_id&quot;,
    name: { $first: &quot;$name&quot; },
    address: { $push: &quot;$address&quot; }
  }
}, {
  $project: {
    _id: 1,
    name: 1,
    address: {
      $filter: { input: &quot;$address&quot;, as: &quot;a&quot;, cond: { $ifNull: [&quot;$$a._id&quot;, false] } }
    } 
  }
}]);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mongodb &lt;strong papago-id=&quot;21-1&quot;&gt;3.6&lt;/strong&gt; 이상의 구문에서는 를 사용하지 않고 네스트필드를 결합하는 것은 매우 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;db.party.aggregate([
  { &quot;$lookup&quot;: {
    &quot;from&quot;: &quot;address&quot;,
    &quot;let&quot;: { &quot;partyId&quot;: &quot;$_id&quot; },
    &quot;pipeline&quot;: [
      { &quot;$match&quot;: { &quot;$expr&quot;: { &quot;$eq&quot;: [&quot;$party_id&quot;, &quot;$$partyId&quot;] }}},
      { &quot;$lookup&quot;: {
        &quot;from&quot;: &quot;addressComment&quot;,
        &quot;let&quot;: { &quot;addressId&quot;: &quot;$_id&quot; },
        &quot;pipeline&quot;: [
          { &quot;$match&quot;: { &quot;$expr&quot;: { &quot;$eq&quot;: [&quot;$address_id&quot;, &quot;$$addressId&quot;] }}}
        ],
        &quot;as&quot;: &quot;address&quot;
      }}
    ],
    &quot;as&quot;: &quot;address&quot;
  }},
  { &quot;$unwind&quot;: &quot;$address&quot; }
])
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36019713/&lt;a href=&quot;https://stackoverflow.com/questions/36019713/mongodb-nested-lookup-with-3-levels&quot; target=&quot;_blank&quot; papago-id=&quot;22-1&quot;&gt;mongodb-nested-lookup-with-3-levels&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/502</guid>
      <comments>https://shortcode.tistory.com/502#entry502comment</comments>
      <pubDate>Sun, 5 Mar 2023 21:47:26 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 데이터베이스에 존재하는 모든 역할을 나열하는 방법은 무엇입니까?</title>
      <link>https://shortcode.tistory.com/501</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle 데이터베이스에 존재하는 모든 역할을 나열하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle 데이터베이스에 존재하는 모든 역할을 나열하는 방법은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블에서 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ROLE_TAB_PRIVS
ROLE_SYS_PRIVS
ROLE_ROLE_PRIVS

SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'ROLETEST';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 만든 역할이 없어요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정답을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM DBA_ROLES;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;all_filename을 클릭합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;sql&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;SELECT SUBSTR(TRIM(rtp.role),1,12)          AS ROLE
     , SUBSTR(rp.grantee,1,16)              AS GRANTEE
     , SUBSTR(TRIM(rtp.privilege),1,12)     AS PRIVILEGE
     , SUBSTR(TRIM(rtp.owner),1,12)         AS OWNER
     , SUBSTR(TRIM(rtp.table_name),1,28)    AS TABLE_NAME
     , SUBSTR(TRIM(rtp.column_name),1,20)   AS COLUMN_NAME
     , SUBSTR(rtp.common,1,4)               AS COMMON
     , SUBSTR(rtp.grantable,1,4)            AS GRANTABLE
     , SUBSTR(rp.default_role,1,16)         AS DEFAULT_ROLE
     , SUBSTR(rp.admin_option,1,4)          AS ADMIN_OPTION
  FROM role_tab_privs rtp
  LEFT JOIN dba_role_privs rp
    ON (rtp.role = rp.granted_role)
 WHERE ('&amp;amp;1' IS NULL OR UPPER(rtp.role) LIKE UPPER('%&amp;amp;1%'))
   AND ('&amp;amp;2' IS NULL OR UPPER(rp.grantee) LIKE UPPER('%&amp;amp;2%'))
   AND ('&amp;amp;3' IS NULL OR UPPER(rtp.table_name) LIKE UPPER('%&amp;amp;3%'))
   AND ('&amp;amp;4' IS NULL OR UPPER(rtp.owner) LIKE UPPER('%&amp;amp;4%'))
 ORDER BY 1
        , 2
        , 3
        , 4
;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;SQLPLUS&amp;gt; @all_roles '' '' '' '' '' ''
SQLPLUS&amp;gt; @all_roles 'somerol' '' '' '' '' ''
SQLPLUS&amp;gt; @all_roles 'roler' 'username' '' '' '' ''
SQLPLUS&amp;gt; @all_roles '' '' 'part-of-database-package-name' '' '' ''
etc.
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/20725581/&lt;a href=&quot;https://stackoverflow.com/questions/20725581/how-to-list-all-the-roles-existing-in-oracle-database&quot; target=&quot;_blank&quot; papago-id=&quot;7-1&quot;&gt;how-to-list-all-the-roles-existing-in-oracle-database&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/501</guid>
      <comments>https://shortcode.tistory.com/501#entry501comment</comments>
      <pubDate>Sun, 5 Mar 2023 21:46:43 +0900</pubDate>
    </item>
    <item>
      <title>흐름(원어민 반응)에서 'this.state' 사용에 대한 오류가 표시됨</title>
      <link>https://shortcode.tistory.com/500</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흐름(원어민 반응)에서 'this.state' 사용에 대한 오류가 표시됨&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용하려고 할 때마다 다음 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 코드:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오브젝트 리터럴:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 유형은 정의되지 않은 유형과 호환되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;형식 매개 변수를 선언하는 것을 잊으셨습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;State&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;식별자의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Component&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;?:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 문제를 일으키는 코드입니다(다른 곳에서도 발생합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class ExpandingCell extends Component {
    constructor(props) {
    super(props);
    this.state = {
        isExpanded: false
    };
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다 =)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하려면 상태 속성의 유형을 정의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class ComponentA extends Component {
    state: {
        isExpanded: Boolean
    };
    constructor(props) {
        super(props);
        this.state = {
            isExpanded: false
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플로우를 &lt;em papago-id=&quot;9-1&quot;&gt;사용&lt;/em&gt;하고 있으며,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴포넌트의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;constructor&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1.&lt;strong papago-id=&quot;12-0&quot;&gt; 작성&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;type&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위해서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.state&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;type State = { width: number, height: number }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2.&lt;strong papago-id=&quot;14-0&quot;&gt; &lt;/strong&gt;이것으로 컴포넌트를 &lt;strong papago-id=&quot;14-0&quot;&gt;초기화&lt;/strong&gt;합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;type&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export default class MyComponent extends Component&amp;lt;Props, State&amp;gt; { ... }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3.&lt;strong papago-id=&quot;15-0&quot;&gt; &lt;/strong&gt;이제 &lt;strong papago-id=&quot;15-0&quot;&gt;설정&lt;/strong&gt;할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흐름 오류 &lt;em papago-id=&quot;16-1&quot;&gt;없이&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  constructor(props: any) {
    super(props)
    this.state = { width: 0, height: 0 }
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 예시는 를 갱신하는 보다 완전한 예입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴포넌트의 폭과 높이를 사용하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onLayout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// @flow

import React, {Component} from 'react'
import {View} from 'react-native'

type Props = {
  someNumber: number,
  someBool: boolean,
  someFxn: () =&amp;gt; any,
}

type State = {
  width: number,
  height: number,
}

export default class MyComponent extends Component&amp;lt;Props, State&amp;gt; {

  constructor(props: any) {
    super(props)

    this.state = {
      width: 0,
      height: 0,
    }
  }

  render() {

    const onLayout = (event) =&amp;gt; {
      const {x, y, width, height} = event.nativeEvent.layout
      this.setState({
        ...this.state,
        width: width,
        width: height,
      })
    }

    return (
      &amp;lt;View style={styles.container} onLayout={onLayout}&amp;gt;

        ...

      &amp;lt;/View&amp;gt;
    )
  }
}

const styles = StyleSheet.create({
  container: {
    display: 'flex',
    flexDirection: 'column',
    justifyContent: 'center',
    alignItems: 'center',
  },
})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흐름 유형으로 상태를 무시할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;:any&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 이는 권장되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 상태가 더 커지고 복잡해지면 길을 잃게 될 것이다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class ExpandingCell extends Component {

    state: any;

    constructor(props) {
        super(props);
        this.state = {
            isExpanded: false
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;삭제하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/* @flow */&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;in your code flite top&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36860349/&lt;a href=&quot;https://stackoverflow.com/questions/36860349/flow-react-native-is-giving-me-errors-for-using-this-state&quot; target=&quot;_blank&quot; papago-id=&quot;24-1&quot;&gt;flow-react-native-is-giving-me-errors-for-using-this-state&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/500</guid>
      <comments>https://shortcode.tistory.com/500#entry500comment</comments>
      <pubDate>Sun, 5 Mar 2023 21:46:05 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스 에이잭스 요청 핸들러에서 쿠키를 설정하려면 어떻게 해야 합니까?</title>
      <link>https://shortcode.tistory.com/499</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스 에이잭스 요청 핸들러에서 쿠키를 설정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;wp ajax request handler에 cookie를 설정하려고 하는데 실패하였습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누가 좀 도와줬으면 좋겠어요.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트측 코드는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var foo = $('#foo');
$.ajax({
    url: 'http://127.0.0.1/wordpress/wp-admin/admin-ajax.php',
    type:   'post',
    dataType:   'json',
    cache:  'false',
    data: { 'action' : 'foo', 'foo' : foo.val(), 'nonce' : foo.data('nonce') },
    success: function(data) { console.debug(data) },
    error: function() { console.error('fail') }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function foo() {
    check_ajax_referer( 'foo-my-nonce', 'nonce', 'what?!' );

    if (isset($_POST['foo'])) {
        $dir = pathinfo($_SERVER['REQUEST_URI']);
        $dir['dirname'] = $dir['dirname'].'/';
        setcookie('foo', $_POST['foo'], time()+62208000, $dir['dirname'], $_SE    RVER['HTTP_HOST']);

        $output = array('response' =&amp;gt; 'success', 'message' =&amp;gt; 'have fun');
    }
    else
        $output = array('response' =&amp;gt; 'failed', 'message' =&amp;gt; 'you are a loser');

    header(&quot;Content-type: application/json&quot;);
    echo json_encode( $output );
    exit;
 }

 add_action('wp_ajax_nopriv_foo','foo');
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋아, 얘들아 내가 고쳤어&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿠키 경로를 현재 'post' 또는 'dirname' 대신 '/'(루트)로 설정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;setcookie('foo', $_POST['foo'], time()+62208000, $dir['dirname'], $_SERVER['HTTP_HOST']);&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;setcookie('foo', $_POST['foo'], time()+62208000, '/', $_SERVER['HTTP_HOST']);&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8357423/&lt;a href=&quot;https://stackoverflow.com/questions/8357423/how-do-i-set-a-cookie-in-a-wordpress-ajax-request-handler&quot; target=&quot;_blank&quot; papago-id=&quot;8-1&quot;&gt;how-do-i-set-a-cookie-in-a-wordpress-ajax-request-handler&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>shortcode</author>
      <guid isPermaLink="true">https://shortcode.tistory.com/499</guid>
      <comments>https://shortcode.tistory.com/499#entry499comment</comments>
      <pubDate>Sun, 5 Mar 2023 21:45:29 +0900</pubDate>
    </item>
  </channel>
</rss>