<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>goodsource</title>
    <link>https://goodsource.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 1 Jul 2026 11:00:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>goodsources</managingEditor>
    <item>
      <title>빠른(낮은) 코드 쓰는 법?</title>
      <link>https://goodsource.tistory.com/1646</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빠른(낮은) 코드 쓰는 법?&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&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 상태로는 이 질문은 우리의 Q&amp;amp;A 형식에 맞지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실, 참고 자료 또는 전문 지식에 의해 답변이 뒷받침되기를 기대하지만, 이 질문은 토론, 주장, 여론 조사 또는 토론을 요청할 가능성이 높습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 이 질문이 개선되고 다시 열릴 수 있다고 생각한다면,&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/help/reopen-questions&quot;&gt;안내&lt;/a&gt;를 받기 위해 헬프 &lt;a href=&quot;/help/reopen-questions&quot;&gt;센터를 방문&lt;/a&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;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;닫힘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2012-09-16 20:49:21Z&quot; papago-attr-id=&quot;1&quot;&gt;11년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 낮은 수준의 코드 최적화와 기본적인 머신 아키텍처의 이점을 활용하는 방법에 대해 더 알고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 주제에 대해 어디서 읽어야 할지 좋은 조언을 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 C/C++와 같은 낮은 수준의 언어로 과학적 컴퓨팅(숫자 크런치가 많지만 &lt;em&gt;이뿐만 아니라&lt;/em&gt;)의 맥락에서 최적화에 관심이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 특히 기계가 어떻게 작동하는지에 대해 잘 이해하지 않는 한 명확하지 않은 최적화 방법에 관심이 있습니다(아직은 그렇지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 실행 중인 기계에 대해 아무것도 알지 못한 채 더 나은 알고리즘이 더 빠르다는 것은 분명합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행렬의 열이나 행을 먼저 통과하는 것이 중요하다는 것은 전혀 명백하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(인접한 위치에 저장된 요소가 연속적으로 읽히도록 행렬을 순환하는 것이 좋습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주제에 대한 기본적인 조언이나 기사에 대한 조언을 가장 환영합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;답들&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 훌륭한 조언들로 답을 얻었어요 제가 읽을 시간보다 훨씬 더 많은 것들을요&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 그들 모두의 목록입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인텔의 &lt;a href=&quot;http://www.intel.com/intelpress/sum_swcb2.htm&quot; rel=&quot;noreferrer&quot;&gt;소프트웨어 최적화 요리책&lt;/a&gt; (book)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.akkadia.org/drepper/cpumemory.pdf&quot; rel=&quot;noreferrer&quot;&gt;모든 프로그래머가 메모리에 대해 알아야 &lt;/a&gt;할 것 (pdf book)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt;훌륭한 코드 쓰기, 2권: 낮은&lt;/a&gt; 수준으로 &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt;생각하기,&lt;/a&gt; 높은 &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt;수준으로 쓰기&lt;/a&gt; (책)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Agner Fog에 &lt;a href=&quot;http://www.agner.org/optimize/&quot; rel=&quot;noreferrer&quot;&gt;의한 소프트웨어&lt;/a&gt; 최적화 &lt;a href=&quot;http://www.agner.org/optimize/&quot; rel=&quot;noreferrer&quot;&gt;리소스&lt;/a&gt; (pdf manual 5개 세부)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어느 것을 사용할지 결정하기 위해서는 약간의 스킴 시간이 필요할 것입니다(모두를 위한 시간이 없습니다).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Drepper의 모든 &lt;a href=&quot;http://www.akkadia.org/drepper/cpumemory.pdf&quot; rel=&quot;noreferrer&quot;&gt;프로그래머가 메모리에 대해 알아야&lt;/a&gt; 할 &lt;a href=&quot;http://www.akkadia.org/drepper/cpumemory.pdf&quot; rel=&quot;noreferrer&quot;&gt;사항 [pdf]&lt;/a&gt;는 저수준 최적화의 한 측면을 잘 참조한 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Intel 아키텍처의 경우 이는 매우 귀중합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.intel.com/intelpress/sum_swcb2.htm&quot; rel=&quot;noreferrer&quot;&gt;Software Optimization Cookbook, 2판&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;읽은 지 몇 년이 지났지만, &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt;훌륭한 코드&lt;/a&gt;를 써라,&lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt; 2권:&lt;/a&gt; 낮은 &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt;수준&lt;/a&gt;을 생각하다,&lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/1593270658&quot; rel=&quot;nofollow noreferrer&quot;&gt; 높은 수준&lt;/a&gt;을 써라, 랜달 하이드가 쓴 글은 꽤 괜찮았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C/C++ 코드가 어떻게 어셈블리로 변환되는지에 대한 좋은 예를 제공합니다. 예를 들어, 큰 코드가 있을 때 실제로 발생하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;switch&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진술.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한, altdevblogaday.com 은 게임 개발에 초점을 맞추고 있지만, 프로그래밍 기사들이 여러분에게 몇 가지 아이디어를 줄 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;낮은 수준의 일을 하는 비트 조작과 현명한 방법에 대한 흥미로운 책은 &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/0201914654&quot; rel=&quot;nofollow noreferrer&quot;&gt;해커의 딜라이트&lt;/a&gt;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 낮은 수준의 코딩에 관심이 있는 모든 사람들이 읽을 가치가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확인: http://www.agner.org/optimize/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C와 C++는 일반적으로 속도 때문에 사용되는 언어입니다( 언급하지 않은 포트란 무시).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;icc 컴파일러가 많이 하는 이점은 많은 부동 소수점 숫자 크런치를 위한 SSE 명령어 세트입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또 다른 가능한 것은 CPU가 남은 작업을 자유롭게 할 수 있도록 하면서 그래픽 카드에서 매우 빠른 부동 소수점 작업을 수행하기 위해 Nvidia/Ati용 CUDA와 Stream API를 각각 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이에 대한 또 다른 접근법은 실제 비교입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Blitz++(http://www.oonumerics.org/blitz/) 같은 라이브러리에서 수치/과학 컴퓨팅에 대한 공격적인 최적화를 구현한 다음 관심 있는 연산(예: 행렬 곱셈)을 수행하는 간단한 프로그램을 작성할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Blitz++를 사용하여 작업을 수행할 때 동일한 작업을 수행하는 클래스를 작성하고 Blitz++가 더 빠르다는 것을 입증하면 그 이유를 깨달을 때까지 구현 방법을 조사하기 시작합니다. (만약 당신의 클래스가 훨씬 더 빠르다면 Blitz++ 개발자에게 알릴 수 있습니다!)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 결국 많은 것들에 대해 배워야 합니다. 예를 들어:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메모리 캐시 액세스 패턴&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;식 템플릿(Google 검색 결과 재식 템플릿 위에는 몇 가지 잘못된 링크가 있습니다. - 논의하고자 하는 핵심 시나리오/속성은 데이터 세트에 대한 하나의 루프 동안 모두 적용되도록 일련의 연산에서 많은 연속적인 단계를 인코딩할 수 있다는 것입니다.)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 CPU별 지침(비휴대용 기술을 사용했는지 확인하지는 않았지만)...&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/0201479605&quot; rel=&quot;nofollow noreferrer&quot;&gt;이너 루프스&lt;/a&gt;라는 책을 통해서 많은 것을 배웠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금은 컴퓨터 용어로 보면 아주 오래되었지만, 아주 잘 쓰여져 있고 Rick Booth는 자신의 주제에 대해 너무나 열정적이어서 CPU를 날리는 데 필요한 사고방식을 보는 것이 여전히 가치가 있다고 말할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/6852670/how-to-write-fast-low-level-code&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1646</guid>
      <comments>https://goodsource.tistory.com/1646#entry1646comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:50:18 +0900</pubDate>
    </item>
    <item>
      <title>Python, MySQL 및 SELECT 출력은 키에 대한 열 이름을 사용하여 사전에 출력합니다.</title>
      <link>https://goodsource.tistory.com/1645</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python, MySQL 및 SELECT 출력은 키에 대한 열 이름을 사용하여 사전에 출력합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이썬 내에서 SELECT 문을 실행하고 있는 MySQL 테이블이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python MySQLDB API에서 키가 열 이름이고 값이 반환된 행에 있는 사전 배열을 커서를 통해 출력할 수 있는 것이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html&quot; rel=&quot;noreferrer&quot;&gt;효과&lt;/a&gt;가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cursor = conn.cursor(dictionary=True)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import mysql.connector # pip install mysql-connector-python

conn = mysql.connector.connect(host=&quot;localhost&quot;, user=&quot;user&quot;, passwd=&quot;pass&quot;, database=&quot;dbname&quot;)
cursor = conn.cursor(dictionary=True)
sql = &quot;SELECT * FROM `table` WHERE 1&quot;
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
    row[&quot;col&quot;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사전 커서를 사용하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cursor = conn.cursor (MySQLdb.cursors.DictCursor)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/7268178/python-mysql-and-select-output-to-dictionary-with-column-names-for-keys&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1645</guid>
      <comments>https://goodsource.tistory.com/1645#entry1645comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:50:12 +0900</pubDate>
    </item>
    <item>
      <title>도커 런도커 런</title>
      <link>https://goodsource.tistory.com/1644</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 런&lt;/font&gt;&lt;/font&gt;&lt;img&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;multiple commands=&quot;&quot;&gt;&lt;/multiple&gt;&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 명령어를 여러 개 실행하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run image cd /path/to/somewhere &amp;amp;&amp;amp; python a.py
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이것은 &quot;No such file or directory&quot; 오류를 내게 주는데, 왜냐하면 그것은 해석되기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;docker run image cd /path/to/somewhere&quot; &amp;amp;&amp;amp; &quot;python a.py&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;&quot;나 ()같은 ESCAPE 문자가 필요한 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 저도 노력했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run image &quot;cd /path/to/somewhere &amp;amp;&amp;amp; python a.py&quot;
docker run image (cd /path/to/somewhere &amp;amp;&amp;amp; python a.py)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이것들은 효과가 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://docs.docker.com/reference/run/&quot;&gt;도커 &lt;/a&gt;런&lt;a href=&quot;https://docs.docker.com/reference/run/&quot;&gt; 레퍼런스&lt;/a&gt;를 찾아봤지만 이스케이프 캐릭터에 대한 힌트를 찾지 못했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커에서 여러 명령을 실행하려면 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/bin/bash -c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 세미콜론&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run image_name /bin/bash -c &quot;cd /path/to/somewhere; python a.py&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;command1(cd)이 0(오류 없음) exit 상태를 반환한 경우에만 command2(python)가 실행될 필요가 있는 경우 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run image_name /bin/bash -c &quot;cd /path/to/somewhere &amp;amp;&amp;amp; python a.py&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 몇 가지 방법으로 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작업 디렉토리를 변경하려면 -w 옵션을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;blockquote&gt; 
   &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-w, --workdir=&quot;&quot; 컨테이너 내부의 작업 디렉토리&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt; &lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://docs.docker.com/engine/reference/commandline/run/ #set-working-directory--w&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 인수를 /bin/bash에 전달합니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;docker run image /bin/bash -c &quot;cd /path/to/somewhere; python a.py&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 컨테이너 내부에서 명령어를 파이프에 넣을 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bash -c &quot;&amp;lt;command1&amp;gt; | &amp;lt;command2&amp;gt;&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run img /bin/bash -c &quot;ls -1 | wc -l&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 원격에서 셸을 호출하지 않고 출력이 로컬 터미널로 리디렉션됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;bash -c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 중인 명령이 비교적 간단한 경우에 잘 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 제어 문자로 가득 찬 긴 일련의 명령을 실행하려고 하면 복잡해질 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 외부에서 제 명령을 프로세스에 주입함으로써 이 문제를 성공적으로 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;cat script.sh | docker run -i &amp;lt;image&amp;gt; /bin/bash&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Eddy Hernandez의 논평에서 적절한 대답을 하기 위해 그리고 알파인은 배시가 아닌 재와 함께 나오기 때문에 매우 정확합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문은 이제 &lt;a href=&quot;https://stackoverflow.com/questions/35689628/starting-a-shell-in-the-docker-alpine-container&quot;&gt;도커 알파인 컨테이너에서 셸&lt;/a&gt;을 시작하는 것과 관련이 있으며, 이는 다음을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sh&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/bin/sh&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/bin/ash/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP의 질문에 근거하여:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;docker run image sh -c &quot;cd /path/to/somewhere &amp;amp;&amp;amp; python a.py&quot;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TL;DR;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker run --entrypoint /bin/sh image_name -c &quot;command1 &amp;amp;&amp;amp; command2 &amp;amp;&amp;amp; command3&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;승인된 답변에 대한 우려 사항은 아래와 같습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아무도 그것에 대해 언급하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker run image_name /bin/bash -c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진입 지점에 명령을 추가할 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 인기 있는 이미지는 이를 올바르게 처리할 수 있을 정도로 똑똑하지만 그렇지 않은 이미지도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 도커 파일을 상상해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;FROM alpine
ENTRYPOINT [&quot;echo&quot;]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 그것을 지으려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;echo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 중:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker run echo /bin/sh -c date
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진입 지점에 명령이 추가되어 결과가 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;echo &quot;/bin/sh -c date&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 진입점을 재정의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker run --entrypoint /bin/sh echo -c date
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/run/#cmd-default-command-or-options&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 런 참조&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과를 컨테이너 외부의 로컬 컴퓨터에서 하나의 파일에 저장하려면 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c &quot;grep root /etc/passwd &amp;gt; /result.txt&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령 결과는 다음에서 확인할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/tmp/result.txt&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 로컬 머신에서.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 와 같은 일을 하려고 온 다른 사람들을 위해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-compose&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 단지 가식을 차리면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bash -c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 명령을 따옴표로 묶고 함께 결합합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 OPs 예제에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-compose run image bash -c &quot;cd /path/to/somewhere &amp;amp;&amp;amp; python a.py&quot;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 셸에서 실행되는 명령어도 상관없다면 실행할 여러 명령어 주위에 일련의 외부 괄호를 붙이면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run image (cd /path/to/somewhere &amp;amp;&amp;amp; python a.py)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명백하지 않은 경우, 만약&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a.py&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 특정한 디렉토리에서 실행되어야 하고, 간단한 래퍼 스크립트를 만들어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cd&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트를 실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,교체하다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CMD [ 'python', 'a.py' ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 무엇이든지&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CMD [ '/wrapper' ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wrapper&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 내용이 포함된 루트 디렉토리(또는 당신에게 편리한 곳)에서&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;#!/bin/sh
set -e
cd /path/to/somewhere
python a.py
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 상황에서, 아마 다시 쓰는 것도 고려해보세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a.py&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포장지가 필요 없도록 말입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해내든지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;os.chdir()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요한 위치에 저장하거나 환경에서 구성하는 디렉토리 또는 유사한 디렉토리에서 데이터 파일을 찾도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/28490874/docker-run-image-multiple-commands&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>docker</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1644</guid>
      <comments>https://goodsource.tistory.com/1644#entry1644comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:50:06 +0900</pubDate>
    </item>
    <item>
      <title>크롬 확장 메시지 전달: 응답이 전송되지 않음</title>
      <link>https://goodsource.tistory.com/1643</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬 확장 메시지 전달: 응답이 전송되지 않음&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내용 스크립트와 확장자 사이에 메시지를 전달하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내용 스크립트에 있는 내용은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;chrome.runtime.sendMessage({type: &quot;getUrls&quot;}, function(response) {
  console.log(response)
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 배경화면에 제가 가지고 있는 것은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.type == &quot;getUrls&quot;){
      getUrls(request, sender, sendResponse)
    }
});

function getUrls(request, sender, sendResponse){
  var resp = sendResponse;
  $.ajax({
    url: &quot;http://localhost:3000/urls&quot;,
    method: 'GET',
    success: function(d){
      resp({urls: d})
    }
  });

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 내가 ajax call 전에 응답을 보내면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getUrls&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수, 응답은 성공적으로 전송되지만, 응답을 전송할 때 ajax 호출의 성공 방법에서는 전송되지 않습니다. 디버깅을 시작하면 포트가 코드 내부에 null임을 알 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sendResponse&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/mv3/messaging/#simple&quot; rel=&quot;nofollow noreferrer&quot;&gt;다음&lt;/a&gt;에 대한 &lt;a href=&quot;https://developer.chrome.com/docs/extensions/mv3/messaging/#simple&quot; rel=&quot;nofollow 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;&gt;sendResponse()를 비동기적으로 사용하려면 onMessage 이벤트 처리기에 true 반환을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 당신은 단지 추가하기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;return true;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 전화한 후에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getUrls&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응답 함수를 비동기적으로 호출할 것임을 나타냅니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 설명서(&lt;a href=&quot;https://developer.chrome.com/docs/extensions/reference/runtime/#event-onMessage&quot; rel=&quot;nofollow noreferrer&quot;&gt;예&lt;/a&gt;: &lt;a href=&quot;https://developer.chrome.com/docs/extensions/reference/runtime/#event-onMessage&quot; rel=&quot;nofollow noreferrer&quot;&gt;설명서&lt;/a&gt;)에는 언급되어 있지 않기 때문에 개발자가 이를 놓쳤을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;합격한 답변이 맞습니다, 단순화한 샘플 코드를 추가하고 싶어서요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 특정 메시지가 비동기로 처리될지 여부를 개발자들에게 알려주기 때문에 (제가 보기에는) API가 잘 설계되어 있지 않다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다양한 메시지를 처리할 경우 전달된 sendResponse 함수가 비동기식으로 불릴지 여부를 알 수 없기 때문에 불가능한 작업이 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;chrome.extension.onMessage.addListener(function (request, sender, sendResponseParam) {
if (request.method == &quot;method1&quot;) {
    handleMethod1(sendResponse);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 어떻게 알아요 깊은 곳이 있나요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;handleMethod1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;통화가 비동기화됩니까, 아닌가요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게 수정하는 사람이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;handleMethod1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비동기적인 것을 도입함으로써 발신자를 꺾을 것이라는 것을 알고 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;chrome.extension.onMessage.addListener(function (request, sender, sendResponseParam) {

    var responseStatus = { bCalled: false };

    function sendResponse(obj) {  //dummy wrapper to deal with exceptions and detect async
        try {
            sendResponseParam(obj);
        } catch (e) {
            //error handling
        }
        responseStatus.bCalled= true;
    }

    if (request.method == &quot;method1&quot;) {
        handleMethod1(sendResponse);
    }
    else if (request.method == &quot;method2&quot;) {
        handleMethod2(sendResponse);
    }
    ...

    if (!responseStatus.bCalled) { //if its set, the call wasn't async, else it is.
        return true;
    }

});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 메시지 처리 방법에 관계없이 반환 값이 자동으로 처리됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 응답 함수를 호출하는 것을 잊지 않는 것으로 가정한 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬이 우리를 위해 이것을 자동화했을 수도 있다는 것을 주목하세요. 왜 그들이 하지 않았는지 모르겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 라이브러리인 https://github.com/lawlietmester/webextension 을 사용하면 이것이 콜백 없이 파이어폭스 방식으로 Chrome과 FF 모두에서 작동하도록 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Browser.runtime.onMessage.addListener( request =&amp;gt; new Promise( resolve =&amp;gt; {
    if( !request || typeof request !== 'object' || request.type !== &quot;getUrls&quot; ) return;

    $.ajax({
        'url': &quot;http://localhost:3000/urls&quot;,
        'method': 'GET'
    }).then( urls =&amp;gt; { resolve({ urls }); });
}) );
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/20077487/chrome-extension-message-passing-response-not-sent&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>javascript</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1643</guid>
      <comments>https://goodsource.tistory.com/1643#entry1643comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:58 +0900</pubDate>
    </item>
    <item>
      <title>브라우저 뒤로가기 버튼을 사용할 때 페이지를 강제로 다시 로드하는 방법은?</title>
      <link>https://goodsource.tistory.com/1642</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저 뒤로가기 버튼을 사용할 때 페이지를 강제로 다시 로드하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게든 사용자가 브라우저 뒤로 버튼을 누른 것을 감지하고 jquery를 사용하여 페이지를 새로고침(컨텐츠와 CSS를 다시 로드)해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery를 통해 그러한 동작을 탐지하는 방법은?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜냐하면 지금 브라우저에서 뒤로가기 버튼을 사용하면 일부 요소가 다시 로드되지 않기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 웹사이트의 링크를 사용하면 모든 것이 새로 고쳐지고 올바르게 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중요한!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 원하는 것을 잘못 이해한 사람도 있을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 페이지를 새로 고치고 싶지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뒤로 버튼을 누른 후에 로드된 페이지를 새로 고치고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좀 더 구체적으로 말씀드리면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 1페이지를 방문하고 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1페이지에 있는 동안 - 그는 2페이지로 연결되는 링크를 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그는 2페이지로 리디렉션됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금 (중요한 부분!)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그는 1페이지로 돌아가기를 원하기 때문에 브라우저의 뒤로 버튼을 클릭합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그는 페이지 1에 돌아왔고, 이제 페이지 1이 다시 로드되고 있으며 &quot;당신이 돌아왔다!&quot;와 같은 경고가 표시됩니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용가능&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pageshow&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저가 히스토리 트래버설을 통해 페이지로 이동할 때 상황을 처리하기 위한 이벤트:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.addEventListener( &quot;pageshow&quot;, function ( event ) {
  var historyTraversal = event.persisted || 
                         ( typeof window.performance != &quot;undefined&quot; &amp;amp;&amp;amp; 
                              window.performance.navigation.type === 2 );
  if ( historyTraversal ) {
    // Handle page restore.
    window.location.reload();
  }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTTP 캐시도 관련되어 있을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캐시해야 하는 리소스만 캐시하려면 서버에서 적절한 캐시 관련 HTTP 헤더를 설정해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;강제 재로드를 수행하여 브라우저가 HTTP 캐시를 무시하도록 유도할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.location.reload( true )&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 하지만 저는 그것이 최선의 해결책이라고 생각하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 다음을 확인하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MDN에 대한 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Working_with_BFCache&quot; rel=&quot;noreferrer&quot;&gt;BFCache&lt;/a&gt; 기사 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Working_with_BFCache&quot; rel=&quot;noreferrer&quot;&gt;작업&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/&quot; rel=&quot;noreferrer&quot;&gt;WebKit 페이지 캐시 II &lt;/a&gt;– 브래디 아이슨의 &lt;a href=&quot;https://webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/&quot; rel=&quot;noreferrer&quot;&gt;언로드 이벤트&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/pageshow&quot; rel=&quot;noreferrer&quot;&gt;페이지MDN&lt;/a&gt;에서 이벤트 참조 표시&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1195440/ajax-back-button-and-dom-updates/1195934#1195934&quot;&gt;Ajax, Back 버튼&lt;/a&gt; 및 &lt;a href=&quot;https://stackoverflow.com/questions/1195440/ajax-back-button-and-dom-updates/1195934#1195934&quot;&gt;DOM 업데이트&lt;/a&gt; 질문&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/17432899/javascript-bfcache-pageshow-event-event-persisted-always-set-to-false&quot;&gt;JavaScript - bfcache/pageshow event - event.persisted가 항상 false로 설정되어 있습니까?&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://web.dev/bfcache/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캐시 앞으로/앞으로 이동&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;게시된 지 오래되었지만 오래된 브라우저를 지원할 필요가 없다면 더 우아한 솔루션을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 체크를 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;performance.navigation.type
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저 지원을 포함한 문서는 다음과 같습니다. https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지가 과거 기록에서 로드되었는지 확인하려면 다음 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(performance.navigation.type == 2){
   location.reload(true);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기록으로 이동하여 페이지에 액세스했음을 나타냅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 가능성은...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;0:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;링크, 북마크, 양식 제출 또는 스크립트를 따르거나 주소 표시줄에 URL을 입력하여 페이지에 액세스했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;1:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Load 버튼을 클릭하거나 Location.reload() 메서드를 통해 페이지에 액세스했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;255:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 방법은&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 여기에 나와 있습니다. https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고 &lt;em&gt;성능.항법.&lt;/em&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;이제&lt;/em&gt; &lt;em&gt;performanceNavigationTiming&lt;/em&gt;.type에서 '&lt;em&gt;navigate&lt;/em&gt;' / '&lt;em&gt;reload&lt;/em&gt;' / 'back_forward' / 'prenender'를 반환하는 performanceNavigationTiming&lt;em&gt;.type&lt;/em&gt;이 더 이상 사용되지 않습니다. &lt;em&gt;https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming/type&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;performance.navigation&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이(는) 더 이상 사용되지 않습니다. 다음을 시도해 볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var perfEntries = performance.getEntriesByType(&quot;navigation&quot;);

if (perfEntries[0].type === &quot;back_forward&quot;) {
    location.reload();
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;jQuery( document ).ready(function( $ ) {
    
   //Use this inside your document ready jQuery 
   $(window).on('popstate', function() {
       location.reload(true);
   });
    
 });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뒤로 또는 앞으로 버튼을 클릭한 경우, ajax를 사용하는 경우에도 100% 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 스크립트의 다른 부분에 잘못된 구성이 있는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 일부 페이지(이전 게시물)에서 상태를 다음과 같이 설정하는 경우 페이지를 다시 로드하지 &lt;strong&gt;않을&lt;/strong&gt; 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.history.pushState('', null, './');`
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 당신이 사용할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;history.pushState();&lt;/code&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/History/pushState&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;&gt;대부분의 경우 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;history.pushState(url, '', url); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;것은 아니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.history&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;... &lt;strong&gt;URL&lt;/strong&gt;이 정의되었는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저에게 문제를 해결해 준 대안은 페이지의 캐시를 비활성화하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 브라우저가 캐시된 버전을 사용하는 대신 서버에서 페이지를 가져오게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Response.AppendHeader(&quot;Cache-Control&quot;,&quot;no-cache, no-store, must-revalidate&quot;);
Response.AppendHeader(&quot;Pragma&quot;, &quot;no-cache&quot;);
Response.AppendHeader(&quot;Expires&quot;, &quot;0&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이전의 답변에서 나온 모든 해결책을 시도했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아무도 일 안 했어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결국 이 해결책을 찾았는데 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function () {
    window.onpageshow = function(event) {
        if (event.persisted) {
            window.location.reload();
        }
    };
})();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 이 페이지는 사용자가 뒤로 버튼을 클릭할 경우 가장 최신의 재로드 페이지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const [entry] = performance.getEntriesByType(&quot;navigation&quot;);

// Show it in a nice table in the developer console
console.table(entry.toJSON());

if (entry[&quot;type&quot;] === &quot;back_forward&quot;)
    location.reload();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처는 &lt;a href=&quot;https://w3c.github.io/navigation-timing/#sec-performance-navigation-types&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;를 참조&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;숨김 입력을 새로 고침 표시기로 사용해야 하며 값은 &quot;아니오&quot;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;hidden&quot; id=&quot;refresh&quot; value=&quot;no&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 jQuery를 사용하여 해당 값을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뒤로 단추를 누르면 숨겨진 필드의 값은 원래 페이지를 떠날 때와 동일한 값을 유지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 페이지를 처음 로드할 때 입력 값은 &quot;아니오&quot;가 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지로 돌아가면 &quot;예&quot;가 되고, 자바스크립트 코드가 새로 고침을 트리거합니다.&lt;/font&gt;&lt;/p&gt;&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 브라우저에서 작동하는 JS 솔루션&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 페이지로 다시 이동할 때 &quot;&lt;a href=&quot;https://web.dev/bfcache/&quot; rel=&quot;nofollow noreferrer&quot;&gt;bfcache&quot;&lt;/a&gt;가 발생하는 것을 방지하지 못했기 때문인지 이 페이지의 다른 많은 접근 방식 중 어느 것도 제게 적합하지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만, 저는 A를 등록한다는 것을 발견했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.onbeforeunload&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;핸들러는 대부분의 브라우저에서 저를 위해 작동하며, 저는 그것이 &quot;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event&quot; rel=&quot;nofollow noreferrer&quot;&gt;bfcache&quot;를 암시적으로 무효화&lt;/a&gt;하기 때문에 작동한다고 믿습니다&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event&quot; rel=&quot;nofollow noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;window.onbeforeunload = function() {
  window.location.reload(true);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 이벤트는 &quot;뒤로&quot; 버튼 탐색이 아닌 다른 경우에 발생할 수 있지만, 제 경우에는 문제가 되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2021년 8월에 나열된 브라우저의 최신 버전에서 다음 플랫폼에서 테스트했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스: Chrome과 Firefox에서 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android: Chrome, Firefox, Opera에서 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OS X: Chrome과 Safari에서 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iOS: Safari에서는 &lt;strong&gt;작동하지 않습니다.&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저 같은 경우에는 모바일을 별로 신경 쓰지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 IE에 관심이 있지만 IE에 접근할 수 없어서 테스트를 할 수 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;만약 누군가가 IE에서 이것을 시도하고 결과를 댓글로 보고할 수 있다면 도움이 될 것입니다.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iOS Safari를 수정하는 서버측 응답 헤더&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control&quot; rel=&quot;nofollow noreferrer&quot;&gt;응답 헤더&lt;/a&gt;를 사용하여 브라우저 캐시를 무효화하면 iOS Safari도 작동한다는 것을 알았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 보내기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Cache-Control: no-store, must-revalidate
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iOS Safari를 수정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설정 방법은 이 &lt;a href=&quot;https://stackoverflow.com/a/2068407/470844&quot;&gt;SO 답변&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Cache-Control&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다양한 플랫폼에서의 응답 헤더.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재장전은 쉽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;location.reload(true);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;역탐지는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 같은 문제가 있었습니다. 백버튼을 누르면 위치 필드에 표시된 url이 업데이트되지만 페이지 내용이 변경되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 사람들이 지적한 것처럼, document.location의 변경이 백버튼에 의한 것인지 아니면 다른 것에 의한 것인지 'pageshow' - 이벤트를 잡아냄으로써 감지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 내 문제는 내가 뒤로 버튼을 눌렀을 때 '페이지쇼'가 전혀 작동하지 않는다는 것이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유일하게 발생한 것은 위치 필드의 url은 변경되었지만 페이지 내용은 변경되지 않았습니다. 왜 그럴까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event 에서 원인을 파악할 수 있는 열쇠를 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;pageshow'라고 표시됩니다. 이벤트는 &quot;같은 창이나 탭에 있는 다른 페이지에서 페이지로 이동&quot; 또는 &quot;브라우저의 앞으로 또는 뒤로 버튼을 사용하여 페이지로 돌아가기&quot;에 의해 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 저는 &quot;제가 그 페이지로 돌아가는 건가요?&quot;라고 묻게 되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;페이지를 식별하는 것은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 내 백 버튼이 &quot;페이지로 돌아가기&quot; 이외의 다른 것을 했다면, 물론 &quot;showpage&quot;는 전혀 트리거되지 않을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 제가 정말로 페이지로 돌아간 건가요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 제가 항상 같은 &quot;페이지&quot;에 머물러 있는 것일까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지란 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지는 어떻게 식별됩니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL로?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뒤로 버튼을 클릭해도 페이지가 바뀌지 않는 것으로 드러났습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방금 제 url의 일부였던 해시(#+something)를 변경했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL에서 변경되는 것이 해시뿐인 경우 브라우저는 다른 페이지로 간주하지 않는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 버튼 클릭 시 URL을 조작하는 코드를 수정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해시를 변경하는 것 외에 '#'을 빼고 해시와 동일한 값을 부여한 쿼리 파라미터도 추가했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 내 새 URL은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/some Url?id=something #something&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱에서 &quot;다른 페이지&quot;로 간주하는 모든 페이지는 이제 쿼리 문자열 매개 변수 'id'에 대한 값이 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저에 관한 한 이들은 서로 다른 &quot;페이지&quot;입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것으로 문제가 해결되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'페이지쇼' - 이벤트가 트리거링 및 백버튼 작동을 시작했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 최신 파이어폭스와 크롬에서 11월 21일에 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    window.addEventListener( &quot;pageshow&quot;, function ( event ) {
     var perfEntries = performance.getEntriesByType(&quot;navigation&quot;);
     if (perfEntries[0].type === &quot;back_forward&quot;) {
       location.reload();
     }
    });
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 html 헤더 파일에 다음 메타태그를 사용하세요, 이것은 나에게 효과가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Chrome 96에서는 [0]을(를) 수행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뒤로가기 버튼을 사용할 때 type은 'reload'입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 Safari에 대해 탐지하는 버전이며 탐지된 경우 공식적으로 사용되지 않는 이전 코드를 실행합니다(그러나 여전히 Safari에 있음).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let isSafari = navigator.vendor &amp;amp;&amp;amp; navigator.vendor.indexOf('Apple') &amp;gt; -1 &amp;amp;&amp;amp;
navigator.userAgent &amp;amp;&amp;amp;
navigator.userAgent.indexOf('CriOS') == -1 &amp;amp;&amp;amp;
navigator.userAgent.indexOf('FxiOS') == -1;

if(isSafari) {
    window.addEventListener( &quot;pageshow&quot;, function ( event ) {
        let historyTraversal = event.persisted || 
                            ( typeof window.performance != &quot;undefined&quot; &amp;amp;&amp;amp; 
                                window.performance.navigation.type === 2 );
        if (historyTraversal) {
        // Handle page restore.
        window.location.reload();
        }
    });
} else {
    let perfEntries = performance.getEntriesByType(&quot;navigation&quot;)
    if (perfEntries[0].type === &quot;back_forward&quot;) {
        window.location.reload(true);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구/신형 모바일 및 데스크톱 브라우저에서 작동하는 것으로 보이는 버전은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.addEventListener(&quot;pageshow&quot;, function (event) {
  var historyTraversal = event.persisted,
    perf = window.performance,
    perfEntries =
      perf &amp;amp;&amp;amp; perf.getEntriesByType &amp;amp;&amp;amp; perf.getEntriesByType(&quot;navigation&quot;),
    perfEntryType = perfEntries &amp;amp;&amp;amp; perfEntries[0] &amp;amp;&amp;amp; perfEntries[0].type,
    navigationType = perf &amp;amp;&amp;amp; perf.navigation &amp;amp;&amp;amp; perf.navigation.type;
  if (
    historyTraversal ||
    perfEntryType === &quot;back_forward&quot; ||
    navigationType === 2 
  ) {
    // Handle page restore.
    window.location.reload();
  }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 최근에 제 리액트 애플리케이션 중 하나에서 같은 종류의 문제에 직면했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼을 클릭할 때마다 2페이지로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;history.push(url)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;method inside &lt;strong&gt;that&lt;/strong&gt; visit 2 &lt;strong&gt;page button&lt;/strong&gt; function 후 &lt;strong&gt;브라우저 뒤로가기 버튼&lt;/strong&gt;을 &lt;strong&gt;클릭&lt;/strong&gt;하면 URL만 변경되지만 해당 &lt;strong&gt;페이지는 다시 로드&lt;/strong&gt;되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뒤로 버튼을 클릭하는 동안 페이지를 다시 로드하려면 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.location.assign(url)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;method inside that &lt;strong&gt;visit&lt;/strong&gt; 2 &lt;strong&gt;page 버튼&lt;/strong&gt; 기능&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/strong&gt;&lt;/em&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;true&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;import {useHistory} from 'react-router-dom'

const App = () =&amp;gt; {

const history = useHistory()

const handleClick = () =&amp;gt; {
  // history.push('/page-2-url') // Don't use this
  window.location.assign('/page-2-url') // use this
}

  return &amp;lt;div&amp;gt;
    &amp;lt;button onClick={handleClick}&amp;gt;Go to Page 2&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
}

export default App;&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;&gt;나는 가장 좋은 답을 찾았고 그것은 나에게 완벽하게 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 링크에서 이 간단한 스크립트를 사용하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;A HREF=&quot;javascript:history.go(0)&quot;&amp;gt;next page&amp;lt;/A&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 버튼 클릭 이벤트.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;INPUT TYPE=&quot;button&quot; onClick=&quot;history.go(0)&quot; VALUE=&quot;next page&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 페이지를 사용할 때 먼저 페이지를 새로 고친 다음 다음 페이지로 이동합니다. 다시 돌아오면 마지막으로 새로 고친 상태가 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 CAS 로그인에서 그것을 사용했고 제가 원하는 것을 줍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그게 도움이 되길..&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://www.htmlgoodies.com/tutorials/getting_started/article.php/3479551#itself&quot; rel=&quot;nofollow 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;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/43043113/how-to-force-reloading-a-page-when-using-browser-back-button&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1642</guid>
      <comments>https://goodsource.tistory.com/1642#entry1642comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:51 +0900</pubDate>
    </item>
    <item>
      <title>특정 URL에 대해 Spring Security 3.2 CSRF 사용 안 함</title>
      <link>https://goodsource.tistory.com/1641</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 URL에 대해 Spring Security 3.2 CSRF 사용 안 함&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring security 3.2를 사용하여 Spring MVC 응용 프로그램에서 CSRF를 활성화했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;my spring-security.xml&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;http&amp;gt;
 &amp;lt;intercept-url pattern=&quot;/**/verify&quot;  requires-channel=&quot;https&quot;/&amp;gt;
 &amp;lt;intercept-url pattern=&quot;/**/login*&quot;  requires-channel=&quot;http&quot;/&amp;gt;
 ...
 ...
 &amp;lt;csrf /&amp;gt;
&amp;lt;/http&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요청 URL에 '확인'이 포함된 요청에 대해 CSRF를 비활성화하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;My SecurityConfig.java&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

private CsrfMatcher csrfRequestMatcher = new CsrfMatcher();

@Override
public void configure(HttpSecurity http) throws Exception {

    http.csrf().requireCsrfProtectionMatcher(csrfRequestMatcher);

}

class CsrfMatcher implements RequestMatcher {
    @Override
    public boolean matches(HttpServletRequest request) {

        if (request.getRequestURL().indexOf(&quot;verify&quot;) != -1)
            return false;
        else if (request.getRequestURL().indexOf(&quot;homePage&quot;) != -1)         
            return false;

        return true;
    }
}

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;crf filter는 'verify'에서 제출한 CSRF 토큰을 검증하고, Invalid token exception(403)은 내가 http에서 http로 요청을 제출할 때 던집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 시나리오에서 crf 토큰 인증을 비활성화하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 직접적인 대답이 아니라는 것을 알지만, 사람들은 보통 이런 종류의 질문을 검색할 때 스프링 버전을 지정하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 스프링 시큐리티(spring security) 때문에 일부 경로를 무시할 수 있는 &lt;a href=&quot;http://docs.spring.io/autorepo/docs/spring-security/4.0.x/apidocs/org/springframework/security/config/annotation/web/configurers/CsrfConfigurer.html#ignoringAntMatchers-java.lang.String...-&quot;&gt;방법이 존재&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 CSRF 보호가 무시되도록 보장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GET, HEAD, TRACE, Options (기본값)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 &quot;/sockjs/&quot;로 시작하는 요청은 무시한다고 명시적으로 말합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.csrf()&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.AntMatchers 무시(&quot;/sockjs/**&quot;)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.그리고&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 대답이 다른 사람에게 도움이 되었으면 좋겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;Spring Boot에서 특정 URL에 대해 CSFR을 비활성화하는 방법&lt;/em&gt;을 검색하는 이 질문을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 설명된 솔루션 http://blog.netgloo.com/2014/09/28/spring-boot-enable-the-csrf-check-selectively-only-for-some-requests/ 을 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 URL에서 CSFR 컨트롤을 사용하지 않도록 설정할 수 있는 Spring Security 구성입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    // Build the request matcher for CSFR protection
    RequestMatcher csrfRequestMatcher = new RequestMatcher() {

      // Disable CSFR protection on the following urls:
      private AntPathRequestMatcher[] requestMatchers = {
          new AntPathRequestMatcher(&quot;/login&quot;),
          new AntPathRequestMatcher(&quot;/logout&quot;),
          new AntPathRequestMatcher(&quot;/verify/**&quot;)
      };

      @Override
      public boolean matches(HttpServletRequest request) {
        // If the request match one url the CSFR protection will be disabled
        for (AntPathRequestMatcher rm : requestMatchers) {
          if (rm.matches(request)) { return false; }
        }
        return true;
      } // method matches

    }; // new RequestMatcher

    // Set security configurations
    http
      // Disable the csrf protection on some request matches
      .csrf()
        .requireCsrfProtectionMatcher(csrfRequestMatcher)
        .and()
      // Other configurations for the http object
      // ...

    return;
  } // method configure


  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) 
      throws Exception {

    // Authentication manager configuration  
    // ...

  }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Boot 1.2.2(및 Spring Security 3.2.6)와 함께 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security v4.1을 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 읽기와 테스트를 거친 후 XML 구성을 사용하여 특정 URL에 대한 CSRF 보안 기능을 비활성화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/security&quot;
             xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
             xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
             xmlns:util=&quot;http://www.springframework.org/schema/util&quot;
             xsi:schemaLocation=&quot;
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd&quot;&amp;gt;

    &amp;lt;http pattern=&quot;/files/**&quot; security=&quot;none&quot; create-session=&quot;stateless&quot;/&amp;gt;

    &amp;lt;http&amp;gt;
        &amp;lt;intercept-url pattern=&quot;/admin/**&quot; access=&quot;hasAuthority('GenericUser')&quot; /&amp;gt;
        &amp;lt;intercept-url pattern=&quot;/**&quot; access=&quot;permitAll&quot; /&amp;gt;
        &amp;lt;form-login 
            login-page=&quot;/login&quot; 
            login-processing-url=&quot;/login&quot;
            authentication-failure-url=&quot;/login&quot;
            default-target-url=&quot;/admin/&quot;
            password-parameter=&quot;password&quot;
            username-parameter=&quot;username&quot;
        /&amp;gt;
        &amp;lt;logout delete-cookies=&quot;JSESSIONID&quot; logout-success-url=&quot;/login&quot; logout-url=&quot;/admin/logout&quot; /&amp;gt;
        &amp;lt;http-basic /&amp;gt;
        &amp;lt;csrf request-matcher-ref=&quot;csrfMatcher&quot;/&amp;gt;
    &amp;lt;/http&amp;gt;

    &amp;lt;beans:bean id=&quot;csrfMatcher&quot; class=&quot;org.springframework.security.web.util.matcher.OrRequestMatcher&quot;&amp;gt;
        &amp;lt;beans:constructor-arg&amp;gt;
            &amp;lt;util:list value-type=&quot;org.springframework.security.web.util.matcher.RequestMatcher&quot;&amp;gt;
                &amp;lt;beans:bean class=&quot;org.springframework.security.web.util.matcher.AntPathRequestMatcher&quot;&amp;gt;
                    &amp;lt;beans:constructor-arg name=&quot;pattern&quot; value=&quot;/rest/**&quot;/&amp;gt;
                    &amp;lt;beans:constructor-arg name=&quot;httpMethod&quot; value=&quot;POST&quot;/&amp;gt;
                &amp;lt;/beans:bean&amp;gt;
                &amp;lt;beans:bean class=&quot;org.springframework.security.web.util.matcher.AntPathRequestMatcher&quot;&amp;gt;
                    &amp;lt;beans:constructor-arg name=&quot;pattern&quot; value=&quot;/rest/**&quot;/&amp;gt;
                    &amp;lt;beans:constructor-arg name=&quot;httpMethod&quot; value=&quot;PUT&quot;/&amp;gt;
                &amp;lt;/beans:bean&amp;gt;
                &amp;lt;beans:bean class=&quot;org.springframework.security.web.util.matcher.AntPathRequestMatcher&quot;&amp;gt;
                    &amp;lt;beans:constructor-arg name=&quot;pattern&quot; value=&quot;/rest/**&quot;/&amp;gt;
                    &amp;lt;beans:constructor-arg name=&quot;httpMethod&quot; value=&quot;DELETE&quot;/&amp;gt;
                &amp;lt;/beans:bean&amp;gt;
            &amp;lt;/util:list&amp;gt;
        &amp;lt;/beans:constructor-arg&amp;gt;
    &amp;lt;/beans:bean&amp;gt;

    //...

&amp;lt;/beans:bean&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위 구성으로 시작하는 모든 URL의 POST|PUT|DEELETE 요청에 &lt;strong&gt;대해서&lt;/strong&gt;만 CSRF 보안을 활성화합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/rest/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 URL 패턴에 대해 명시적으로 비활성화하고 일부 URL 패턴에 대해 활성화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
public class SecurityConfig {

    @Configuration
    @Order
    public static class GeneralWebSecurityConfig extends WebSecurityConfigurerAdapter {
        
        
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().ignoringAntMatchers(&quot;/rest/**&quot;).and()
            .authorizeRequests()
            .antMatchers(&quot;/&quot;).permitAll()
            .antMatchers(&quot;/home/**&quot;,&quot;/search/**&quot;,&quot;/geo/**&quot;).authenticated().and().csrf()
            .and().formLogin().loginPage(&quot;/login&quot;)
            .usernameParameter(&quot;username&quot;).passwordParameter(&quot;password&quot;)
            .and().exceptionHandling().accessDeniedPage(&quot;/error&quot;)
            .and().sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;http ...&amp;gt;
    &amp;lt;csrf request-matcher-ref=&quot;csrfMatcher&quot;/&amp;gt;

    &amp;lt;headers&amp;gt;
        &amp;lt;frame-options policy=&quot;SAMEORIGIN&quot;/&amp;gt;
    &amp;lt;/headers&amp;gt;

    ...
&amp;lt;/http&amp;gt;

&amp;lt;b:bean id=&quot;csrfMatcher&quot;
    class=&quot;AndRequestMatcher&quot;&amp;gt;
    &amp;lt;b:constructor-arg value=&quot;#{T(org.springframework.security.web.csrf.CsrfFilter).DEFAULT_CSRF_MATCHER}&quot;/&amp;gt;
    &amp;lt;b:constructor-arg&amp;gt;
        &amp;lt;b:bean class=&quot;org.springframework.security.web.util.matcher.NegatedRequestMatcher&quot;&amp;gt;
          &amp;lt;b:bean class=&quot;org.springframework.security.web.util.matcher.AntPathRequestMatcher&quot;&amp;gt;
            &amp;lt;b:constructor-arg value=&quot;/chat/**&quot;/&amp;gt;
          &amp;lt;/b:bean&amp;gt;
        &amp;lt;/b:bean&amp;gt;
    &amp;lt;/b:constructor-arg&amp;gt;
&amp;lt;/b:bean&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;을 비열한.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; http
        .csrf()
            // ignore our stomp endpoints since they are protected using Stomp headers
            .ignoringAntMatchers(&quot;/chat/**&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제: https://docs.spring.io/spring-security/site/docs/4.1.x/reference/htmlsingle/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;security=&quot; none&quot;을(를) 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 spring-security-config.xml에서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;security:intercept-url pattern=&quot;/*/verify&quot; security=&quot;none&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/22524470/spring-security-3-2-csrf-disable-for-specific-urls&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1641</guid>
      <comments>https://goodsource.tistory.com/1641#entry1641comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:41 +0900</pubDate>
    </item>
    <item>
      <title>MariaDB Analyze FORMAT=JSON 출력에서 전체 시간을 계산할 수 없습니다.</title>
      <link>https://goodsource.tistory.com/1640</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB Analyze FORMAT=JSON 출력에서 전체 시간을 계산할 수 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB에서 몇 가지 쿼리를 최적화하려고 하는데 ANALIZE FORMAT=JSON 기능이 매우 유용하다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 어떤 복합적인 조인의 경우, 시간이 맞지 않거나, 그에 근접하는 사례들을 접하게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동할 때의 예로, 하나의 쿼리의 경우 query_block r_total_time_ms가 약 239ms였습니다. 쿼리 자체에는 11개의 테이블이 포함되어 있었고, 그 11개 중 하나는 거의 227ms를 차지하여 쿼리에 소요된 시간의 대부분을 차지했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스를 변경하는 과정이 분명히 있었고, 이를 통해 해당 요소를 1ms 미만으로 줄였고, 총 쿼리 시간은 1ms를 조금 넘었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다른 경우에는 쿼리_block r_total_time_ms가 163ms를 약간 넘습니다. 쿼리에는 9개의 테이블 및/또는 하위 쿼리가 포함되며 구성 요소 중 가장 &lt;em&gt;높은&lt;/em&gt; r_total_time_ms가 15ms를 조금 넘습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 모든 구성 요소의 &lt;em&gt;합계&lt;/em&gt;는 약 25ms입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 나머지 시간은 어디에서 보내는 것일까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 140달러 짜리들은 뭘 하고 있는 거지?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구분할 수 있는 방법이 있다면, 그게 뭔지 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 제가 애를 먹고 있는 분석 결과입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ANALYZE
{
  &quot;query_block&quot;: {
    &quot;select_id&quot;: 1,
    &quot;r_loops&quot;: 1,
    &quot;r_total_time_ms&quot;: 163.18,
    &quot;filesort&quot;: {
      &quot;sort_key&quot;: &quot;tcontent.lastUpdate&quot;,
      &quot;r_loops&quot;: 1,
      &quot;r_total_time_ms&quot;: 0.0147,
      &quot;r_limit&quot;: 20,
      &quot;r_used_priority_queue&quot;: false,
      &quot;r_output_rows&quot;: 2,
      &quot;r_buffer_size&quot;: &quot;252&quot;,
      &quot;temporary_table&quot;: {
        &quot;table&quot;: {
          &quot;table_name&quot;: &quot;tcontent&quot;,
          &quot;access_type&quot;: &quot;index_merge&quot;,
          &quot;possible_keys&quot;: [
            &quot;IX_TContent&quot;,
            &quot;IX_TContent_1&quot;,
            &quot;IX_TContent_2&quot;,
            &quot;IX_TContent_5&quot;,
            &quot;IX_tcontent_mobileExclude&quot;,
            &quot;IX_tcontent_displaystart&quot;,
            &quot;IX_tcontent_displaystop&quot;,
            &quot;IX_tcontent_approved&quot;,
            &quot;IX_tcontent_active&quot;,
            &quot;IX_tcontent_display&quot;,
            &quot;IX_tcontent_type&quot;,
            &quot;ntID_Type_subType_Display_DisplayStart_DisplayStop_mobileExclude&quot;,
            &quot;ix_tcontent_SiteID_Active_Filename_Type&quot;
          ],
          &quot;key_length&quot;: &quot;2,2,2,2,2,78,106&quot;,
          &quot;index_merge&quot;: {
            &quot;union&quot;: {
              &quot;range&quot;: {
                &quot;key&quot;: &quot;IX_tcontent_display&quot;,
                &quot;used_key_parts&quot;: [&quot;Display&quot;]
              },
              &quot;range&quot;: {
                &quot;key&quot;: &quot;IX_tcontent_display&quot;,
                &quot;used_key_parts&quot;: [&quot;Display&quot;]
              },
              &quot;intersect&quot;: {
                &quot;range&quot;: {
                  &quot;key&quot;: &quot;IX_tcontent_approved&quot;,
                  &quot;used_key_parts&quot;: [&quot;Approved&quot;]
                },
                &quot;range&quot;: {
                  &quot;key&quot;: &quot;IX_tcontent_active&quot;,
                  &quot;used_key_parts&quot;: [&quot;Active&quot;]
                },
                &quot;range&quot;: {
                  &quot;key&quot;: &quot;IX_tcontent_display&quot;,
                  &quot;used_key_parts&quot;: [&quot;Display&quot;]
                },
                &quot;range&quot;: {
                  &quot;key&quot;: &quot;IX_TContent_2&quot;,
                  &quot;used_key_parts&quot;: [&quot;SiteID&quot;]
                },
                &quot;range&quot;: {
                  &quot;key&quot;: &quot;IX_TContent_5&quot;,
                  &quot;used_key_parts&quot;: [&quot;ModuleID&quot;]
                }
              }
            }
          },
          &quot;r_loops&quot;: 1,
          &quot;rows&quot;: 2583,
          &quot;r_rows&quot;: 3966,
          &quot;r_total_time_ms&quot;: 15.183,
          &quot;filtered&quot;: 96.129,
          &quot;r_filtered&quot;: 98.664,
          &quot;attached_condition&quot;: &quot;tcontent.Active = 1 and tcontent.Approved = 1 and tcontent.searchExclude = 0 and tcontent.SiteID = 'CAE' and tcontent.ModuleID = '00000000000000000000000000000000000' and tcontent.ContentID &amp;lt;&amp;gt; '00000000000000000000000000000000001' and tcontent.`Type` &amp;lt;&amp;gt; 'Module' and (tcontent.Display = 1 or tcontent.Display = 2 and (tcontent.DisplayStart &amp;lt;= '2018-01-09 15:17:00' and (tcontent.DisplayStop &amp;gt;= '2018-01-09 15:17:00' or tcontent.DisplayStop is null) or tcontent.DisplayStart &amp;lt;= '2019-01-09 15:17:00' and (tcontent.DisplayStop &amp;gt;= '2018-01-09 15:17:00' or tcontent.DisplayStop is null))) and (tcontent.mobileExclude is null or tcontent.mobileExclude in (0,1))&quot;
        },
        &quot;table&quot;: {
          &quot;table_name&quot;: &quot;&amp;lt;subquery2&amp;gt;&quot;,
          &quot;access_type&quot;: &quot;eq_ref&quot;,
          &quot;possible_keys&quot;: [&quot;distinct_key&quot;],
          &quot;key&quot;: &quot;distinct_key&quot;,
          &quot;key_length&quot;: &quot;105&quot;,
          &quot;used_key_parts&quot;: [&quot;contentHistID&quot;],
          &quot;ref&quot;: [&quot;func&quot;],
          &quot;r_loops&quot;: 3913,
          &quot;rows&quot;: 1,
          &quot;r_rows&quot;: 5.1e-4,
          &quot;r_total_time_ms&quot;: 6.2577,
          &quot;filtered&quot;: 100,
          &quot;r_filtered&quot;: 100,
          &quot;attached_condition&quot;: &quot;tcontent.Display = 1 or tcontent.Display = 2 and (tcontent.DisplayStart &amp;lt;= '2018-01-09 15:17:00' and (tcontent.DisplayStop &amp;gt;= '2018-01-09 15:17:00' or tcontent.DisplayStop is null) or tcontent.DisplayStart &amp;lt;= '2019-01-09 15:17:00' and (tcontent.DisplayStop &amp;gt;= '2018-01-09 15:17:00' or tcontent.DisplayStop is null))&quot;,
          &quot;materialized&quot;: {
            &quot;unique&quot;: 1,
            &quot;query_block&quot;: {
              &quot;select_id&quot;: 2,
              &quot;table&quot;: {
                &quot;table_name&quot;: &quot;tcontentcategories&quot;,
                &quot;access_type&quot;: &quot;ALL&quot;,
                &quot;possible_keys&quot;: [&quot;PRIMARY&quot;],
                &quot;r_loops&quot;: 1,
                &quot;rows&quot;: 166,
                &quot;r_rows&quot;: 166,
                &quot;r_total_time_ms&quot;: 0.2246,
                &quot;filtered&quot;: 100,
                &quot;r_filtered&quot;: 0.6024,
                &quot;attached_condition&quot;: &quot;tcontentcategories.path like '%D3386B7B-5056-8740-7CA949A8C39FACF3%'&quot;
              },
              &quot;table&quot;: {
                &quot;table_name&quot;: &quot;tcontentcategoryassign&quot;,
                &quot;access_type&quot;: &quot;ref&quot;,
                &quot;possible_keys&quot;: [
                  &quot;PRIMARY&quot;,
                  &quot;IX_tcontentcategoryassign_categoryID&quot;
                ],
                &quot;key&quot;: &quot;IX_tcontentcategoryassign_categoryID&quot;,
                &quot;key_length&quot;: &quot;105&quot;,
                &quot;used_key_parts&quot;: [&quot;categoryID&quot;],
                &quot;ref&quot;: [&quot;dbMuraCMS.tcontentcategories.categoryID&quot;],
                &quot;r_loops&quot;: 1,
                &quot;rows&quot;: 53,
                &quot;r_rows&quot;: 33,
                &quot;r_total_time_ms&quot;: 0.0413,
                &quot;filtered&quot;: 100,
                &quot;r_filtered&quot;: 100,
                &quot;using_index&quot;: true
              }
            }
          }
        },
        &quot;table&quot;: {
          &quot;table_name&quot;: &quot;tfiles&quot;,
          &quot;access_type&quot;: &quot;eq_ref&quot;,
          &quot;possible_keys&quot;: [&quot;PRIMARY&quot;],
          &quot;key&quot;: &quot;PRIMARY&quot;,
          &quot;key_length&quot;: &quot;105&quot;,
          &quot;used_key_parts&quot;: [&quot;fileID&quot;],
          &quot;ref&quot;: [&quot;dbMuraCMS.tcontent.FileID&quot;],
          &quot;r_loops&quot;: 2,
          &quot;rows&quot;: 1,
          &quot;r_rows&quot;: 1,
          &quot;r_total_time_ms&quot;: 0.0109,
          &quot;filtered&quot;: 100,
          &quot;r_filtered&quot;: 100,
          &quot;attached_condition&quot;: &quot;trigcond(trigcond(tcontent.FileID is not null))&quot;
        },
        &quot;table&quot;: {
          &quot;table_name&quot;: &quot;tcontentstats&quot;,
          &quot;access_type&quot;: &quot;eq_ref&quot;,
          &quot;possible_keys&quot;: [&quot;PRIMARY&quot;],
          &quot;key&quot;: &quot;PRIMARY&quot;,
          &quot;key_length&quot;: &quot;182&quot;,
          &quot;used_key_parts&quot;: [&quot;contentID&quot;, &quot;siteID&quot;],
          &quot;ref&quot;: [&quot;dbMuraCMS.tcontent.ContentID&quot;, &quot;dbMuraCMS.tcontent.SiteID&quot;],
          &quot;r_loops&quot;: 2,
          &quot;rows&quot;: 1,
          &quot;r_rows&quot;: 0,
          &quot;r_total_time_ms&quot;: 0.0127,
          &quot;filtered&quot;: 100,
          &quot;r_filtered&quot;: 100,
          &quot;attached_condition&quot;: &quot;trigcond(trigcond(tcontent.ContentID is not null and tcontent.SiteID is not null))&quot;
        },
        &quot;table&quot;: {
          &quot;table_name&quot;: &quot;tparent&quot;,
          &quot;access_type&quot;: &quot;ref&quot;,
          &quot;possible_keys&quot;: [
            &quot;IX_TContent&quot;,
            &quot;IX_TContent_2&quot;,
            &quot;IX_tcontent_active&quot;,
            &quot;ntID_Type_subType_Display_DisplayStart_DisplayStop_mobileExclude&quot;,
            &quot;ix_tcontent_SiteID_Active_Filename_Type&quot;
          ],
          &quot;key&quot;: &quot;IX_TContent&quot;,
          &quot;key_length&quot;: &quot;106&quot;,
          &quot;used_key_parts&quot;: [&quot;ContentID&quot;],
          &quot;ref&quot;: [&quot;dbMuraCMS.tcontent.ParentID&quot;],
          &quot;r_loops&quot;: 2,
          &quot;rows&quot;: 1,
          &quot;r_rows&quot;: 238,
          &quot;r_total_time_ms&quot;: 1.5375,
          &quot;filtered&quot;: 100,
          &quot;r_filtered&quot;: 0.4202,
          &quot;attached_condition&quot;: &quot;trigcond(tcontent.Display = 1 or tcontent.Display = 2 and (tparent.`Type` &amp;lt;&amp;gt; 'Calendar' and tcontent.DisplayStart &amp;lt;= '2018-01-09 15:17:00' and (tcontent.DisplayStop &amp;gt;= '2018-01-09 15:17:00' or tcontent.DisplayStop is null) or tparent.`Type` = 'Calendar' and tcontent.DisplayStart &amp;lt;= '2019-01-09 15:17:00' and (tcontent.DisplayStop &amp;gt;= '2018-01-09 15:17:00' or tcontent.DisplayStop is null))) and trigcond(tparent.SiteID = tcontent.SiteID and tparent.Active = 1 and trigcond(tcontent.ParentID is not null))&quot;
        },
        &quot;table&quot;: {
          &quot;table_name&quot;: &quot;tcontentfilemetadata&quot;,
          &quot;access_type&quot;: &quot;ALL&quot;,
          &quot;possible_keys&quot;: [
            &quot;IX_tcontentfilemetadata_contenthistid&quot;,
            &quot;IX_tcontentfilemetadata_fileid&quot;
          ],
          &quot;r_loops&quot;: 2,
          &quot;rows&quot;: 1,
          &quot;r_rows&quot;: 0,
          &quot;r_total_time_ms&quot;: 0.0045,
          &quot;filtered&quot;: 100,
          &quot;r_filtered&quot;: 100,
          &quot;attached_condition&quot;: &quot;trigcond(tcontentfilemetadata.fileid = tcontent.FileID and tcontentfilemetadata.contenthistid = tcontent.ContentHistID)&quot;
        }
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/48176711/cant-account-for-full-time-in-mariadb-analyze-format-json-output&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1640</guid>
      <comments>https://goodsource.tistory.com/1640#entry1640comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:31 +0900</pubDate>
    </item>
    <item>
      <title>1비트 길이의 데이터 타입을 C로 생성할 수 있습니까?</title>
      <link>https://goodsource.tistory.com/1639</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1비트 길이의 데이터 타입을 C로 생성할 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 데이터 유형을 만들고자 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;uint1_t&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.그게 가능하긴 해?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;boole 데이터 타입의 크기는 1바이트로 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 부울 값에는 한 비트만 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 C는 기본적으로 bool에 한 비트만 사용합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 그렇다면 나머지 7개는 어떻게 되는 겁니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 비트가 충분한 곳에서 8비트를 사용하는 것은 공간 낭비로 보입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 비트를 차지하는 유형을 만드는 것은 실제로 가능하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 주소를 지정할 수 있는 가장 작은 단위는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(이것은 정의상 1바이트이며 일반적으로 반드시 8비트 길이일 필요는 없지만, 표준 C에서는 8비트보다 짧을 수 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 통해 접근할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef _Bool uint1_t;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdbool.h&amp;gt;
typedef bool uint1_t;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 부울 변수가 0 또는 1 값만 저장하더라도 (적어도) 1 바이트를 차지할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원칙적으로 비트 필드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef struct
{
    unsigned int x : 1;
} uint1_t;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 그것은 또한 적어도 하나의 바이트를 차지할 것입니다. (그리고 아마도 한 바이트만큼의 바이트를 차지할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;; 일반적으로 4바이트)를 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.x&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값에 액세스할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비트 필드를 사용하는 것은 문제가 있습니다(예: 비트 필드를 보유한 스토리지 유닛이 차지하는 공간과 같이 대부분의 측면이 구현 정의되어 있습니다). 비트 필드를 사용하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sup&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/2478565/drew-mcgowen&quot;&gt;Drew McGowen&lt;/a&gt;, &lt;a href=&quot;https://stackoverflow.com/users/1147772/drax&quot;&gt;Drax&lt;/a&gt;, &lt;a href=&quot;https://stackoverflow.com/users/2993960/fiddling-bits&quot;&gt;Fiddling Bits&lt;/a&gt;가 제안한 수정안을 포함합니다.&lt;/font&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 사람들이 믿는 것과는 달리, C99에는 한 비트의 데이터 유형이 &lt;strong&gt;있습니다&lt;/strong&gt;: 그것은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_Bool&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 크기가 1인 비트 필드를 선언할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;C에서 개별 비트를 어드레싱할 수 없다는 사실은 1비트 데이터 유형이 존재할 수 없다는 것을 의미하지 &lt;em&gt;않습니다&lt;/em&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 논쟁은 기본적으로 사과와 오렌지를 비교하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 스토리지의 크기가 무엇인지에 대한 유형은 존재하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sizeof&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)는 1바이트보다 작습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니요, 불가능합니다. uint8_t가 가장 작은 데이터 유형입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구조 내에서는 비트 필드를 사용할 수 있지만, 그 외에는 1비트의 데이터 유형을 가질 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 만들 수 있는 가장 작은 객체는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sizeof == 1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그 물건은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CHAR_BIT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;거의 모든 플랫폼에서 볼 수 있는 크기의 비트는 8입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 당신이 만들 수 있는 가장 작은 물체는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int8_t&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아카&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비트 필드를 사용하여 많은 1비트 숫자를 더 큰 개체로 인코딩할 수 있지만, 이것이 문제의 해결책은 아닙니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비트 필드를 사용하는 것이 이와 같은 상황에 가장 근접할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;A 내에 설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 각각의 분야.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폭을 결정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct foo
{
  unsigned int bla   :1;  /* this uses only 1 bit */
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 사례는 여전히 다른 부분을 '낭비'합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 만약 당신이 다른 분야를 가지고 있다면 당신은 효과적으로 각각의 비트를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부울 값을 나타내다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bit_field&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://en.wikipedia.org/wiki/Bit_field&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단답형은 &quot;아니오&quot;입니다. 비트 필드를 제외한 모든 유형은 전체 바이트 수에 매핑되어야 &lt;em&gt;합니다&lt;/em&gt;(여러 비트 필드가 모두 적합한 경우 동일한 바이트를 차지합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf&quot; rel=&quot;nofollow&quot;&gt;말의 입&lt;/a&gt;에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;b&gt;&lt;font papago-translate=&quot;translated&quot;&gt;6.2.6 형식의 표시&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;
 &lt;br&gt;
 &lt;br&gt; 
 &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;b&gt;&lt;font papago-translate=&quot;translated&quot;&gt;6.2.6.1 일반&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;
 &lt;br&gt;
 &lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1 모든 유형의 표현은 이 하위 조항에 명시된 것을 제외하고는 불특정입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;
 &lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2 비트 필드를 제외하고, 객체는 하나 이상의 바이트의 연속된 시퀀스로 구성되며, 그 수, 순서 및 인코딩은 명시적으로 지정되거나 구현이 정의됩니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;
 &lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3 부호가 없는 비트 필드에 저장된 값과 부호가 없는 문자 형식의 객체는 순수 이진 표기법을 사용하여 표시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;sup&gt;49)&lt;/sup&gt;&lt;/font&gt;&lt;/font&gt;
 &lt;br&gt;
 &lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4 다른 객체 유형의 비트 필드가 아닌 객체에 저장된 값은 다음과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;n&lt;/em&gt; ×&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CHAR_BIT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;bits, where&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;n&lt;/em&gt;은 해당 유형의 개체 크기(바이트)입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값을 유형 개체로 복사할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned char [&lt;em&gt;n&lt;/em&gt;]&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(예를 들어, 에 의해)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcpy&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;); 결과적인 바이트 집합을 다음과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값의 &lt;em&gt;개체 표현&lt;/em&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비트 필드에 저장된 값은 다음과 같이 구성됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;m비트&lt;/em&gt;, 어디에&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;m&lt;/em&gt;은 비트 필드에 지정된 크기입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개체 표현은 다음의 집합입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;비트&lt;/em&gt; 필드는 주소 지정 가능한 저장 장치에 포함되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개체 표현이 동일한 두 값(NaNs 제외)은 동일하지만, 동일한 값을 비교하는 값은 서로 다른 개체 표현일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;hr&gt; 
 &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;sup&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;49) 2진 숫자 0과 1을 사용하는 정수의 위치 표현으로, 연속적인 비트로 표현되는 값은 1로 시작하고, 가장 높은 위치의 비트를 제외하고 2의 연속적인 적분 거듭제곱을 곱합니다. (&lt;em&gt;미국 국립 정보 처리 시스템 사전&lt;/em&gt;에서 채택.)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바이트는 다음을 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CHAR_BIT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비트 및 유형의 값&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned char&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0에서 2 사이입니다&lt;sup&gt;&lt;code&gt;CHAR_BIT − 1&lt;/code&gt;&lt;/sup&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/sup&gt;&lt;/font&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예, a:1에서 1비트 변수를 생성할 수 있습니다. 값만 할당할 수 있지만 검색할 수는 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;8비트는 유형의 최소 크기입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서브바이트 저장이 꼭 필요한 경우 비트 필드를 사용하여 여러 &quot;작은&quot; 요소를 함께 결합할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이것은 거의 큰 문제가 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기계는 많은 메모리를 가지고 있고 이런 종류의 메모리 낭비에 대해 걱정할 필요는 거의 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/25268106/is-it-possible-to-create-a-data-type-of-length-one-bit-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1639</guid>
      <comments>https://goodsource.tistory.com/1639#entry1639comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:21 +0900</pubDate>
    </item>
    <item>
      <title>각도 2에서 colspan이 알려진 네이티브 속성이 아닌 이유는 무엇입니까?</title>
      <link>https://goodsource.tistory.com/1638</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도 2에서 colspan이 알려진 네이티브 속성이 아닌 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 우리가 이런 코드를 시도한다면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td [colspan]=&quot;1 + 1&quot;&amp;gt;Column&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 이 항목:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td colspan=&quot;{{1 + 1}}&quot;&amp;gt;Column&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 곧 그것을 알게 됩니다.&quot;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;colspan&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알려진 네이티브 속성이 아닙니다.&quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;A2 문서를 통해 다음과 같은 내용을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소에 colspan 속성이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;colspan 속성이 있지만 보간 및 속성 바인딩은 속성이 아닌 속성만 설정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 대신 이렇게 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td [attr.colspan]=&quot;1 + 1&quot;&amp;gt;Column&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 정도면 충분히 공평합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문:.&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 질문은, 왜?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;colspan&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DOM의 속성이 아니며, 만약 DOM이 누락되어 있다면, 브라우저는 HTML이 아닌 DOM을 렌더링하기 때문에 어떻게 테이블을 렌더링할 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 Chrome inspector를 열고 properties 탭으로 이동하면 colspan을 Element의 속성으로 볼 수 있는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DOM이 이러한 불일치를 나타내는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;**유사한 예&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;label for=...&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성과 속성이 항상 1:1인 것은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자주 접하게 되는 예로는 라벨 태그가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;label for=&quot;someId&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도에 있음&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;label [for]=&quot;someId&quot;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 오류로 실패하고 다음과 같이 바인딩해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;label attr.for=&quot;{{someId}}&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;label [attr.for]=&quot;someId&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지만&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;label [htmlFor]=&quot;someId&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우에도 효과가 있을 것이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;htmlFor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DOM에 반영되는 속성입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기여하다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 https://developer.mozilla.org/de/docs/Web/API/HTMLLabelElement 도 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;htmlFor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재산&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Properties&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구간)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고 &lt;a href=&quot;https://stackoverflow.com/questions/258469/what-is-the-difference-between-attribute-and-property&quot;&gt;항목속성과 속성의 차이점은 무엇입니까?&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;colSpan&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부동산 실명&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableCellElement 에 의하면.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;colSpan&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 반영되는 속성입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;colspan&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 속성(uppercase)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;S&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td [colSpan]=&quot;1 + 1&quot;&amp;gt;Column&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://plnkr.co/edit/BZelYOraELdprw5GMKPr?p=preview 도 참조&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 Angular가 속성에 바인딩되는 이유&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성능상의 이유로 기본적으로 Angular가 속성에 바인딩됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성에 바인딩하는 것은 속성이 DOM에 반영되고 DOM이 변경되면 변경 후 일치할 수 있는 CSS 스타일이 재평가될 수 있기 때문에 비용이 많이 듭니다. 반면 속성은 변경된 자바스크립트 개체의 값에 불과합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;attr.&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 값비싼 행동에 대해 노골적으로 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 질문은 왜 colspan은 DOM의 속성이 아니고, 만약 그것이 누락되어 있다면 브라우저가 HTML이 아닌 DOM을 렌더링하기 때문에 어떻게 테이블을 렌더링할 수 있는지 입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Colspan은 DOM의 속성이지만 속성이 아니므로 읽기 전용이며 속성이기 때문에 브라우저에서 렌더링합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 Chrome inspector를 열고 properties 탭으로 이동하면 colspan을 Element의 속성으로 볼 수 있는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬은 검사할 때 속성과 속성을 모두 보여줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 따를 것을 고려한다면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  &amp;lt;table&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;A&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td colspan=&quot;2&quot; id=&quot;xyz&quot;&amp;gt;B&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
  &amp;lt;/table&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;document.getElementById('xyz').colspan&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과를 보다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재산이 아니기 때문에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;but document.getElementById('xyz').id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과를 보다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xyz&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부동산이니까요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular의 Attribute &amp;amp; Properties:&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저는 HTML을 파싱할 때 파싱된 HTML의 인메모리 DOM 표현을 생성합니다. 속성의 데이터는 종종 DOM에 존재하는 속성의 초기값이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;colspan은 DOM 속성이 아니기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 colSpan( 대문자 S)은 colSpan 속성을 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬 개발 도구에 표시된 요소:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/fwgFh.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/fwgFh.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;html 속성이 속성 DOM 속성에 저장되어 있음을 알 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 콜스팬이 이미지 아래에서 관찰할 수 있는 DOM colSpan 속성에 반영되어 있음을 인지하는 것이 중요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular에서 속성 바인딩을 사용할 경우 이러한 DOM 속성으로 문자 그대로 1 대 1로 바인딩됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 colSpan 속성에 바인딩하려면 다음 구문이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td [colSpan]=&quot;1 + 1&quot;&amp;gt;Column&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 구문으로 지적하신 대로 Angular의 속성에 직접 바인딩할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td [attr.colspan]=&quot;1 + 1&quot;&amp;gt;Column&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DOM이 이러한 불일치를 나타내는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일관성의 이유로 모든 DOM 속성은 낮은 낙타 케이스입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 속성을 1 대 1 방식으로 DOM 속성으로 변환할 수 있는 것은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;class 속성을 예로 들자면, HTML의 class 속성이 2개의 DOM 속성으로 귀결되는 것을 예제 이미지에서 볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;classList&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;className&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/35615751/why-is-colspan-not-a-known-native-attribute-in-angular-2&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1638</guid>
      <comments>https://goodsource.tistory.com/1638#entry1638comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:14 +0900</pubDate>
    </item>
    <item>
      <title>Python, 디렉토리 문자열에 후행 슬래시 추가, os 독립적으로</title>
      <link>https://goodsource.tistory.com/1637</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python, 디렉토리 문자열에 후행 슬래시 추가, os 독립적으로&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;후행 슬래시를 추가하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*nix의 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;win32)에서 디렉토리 문자열로, 테일링 슬래시가 아직 존재하지 않는 경우?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사합니다!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;os.path.join(path, '')&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직 없는 경우 후행 슬래시를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;할수있습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;os.path.join(path, '', '')&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;os.path.join(path_with_a_trailing_slash, '')&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 당신은 여전히 한 번의 후행 슬래시만 얻을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디렉터리와 파일 이름을 연결하려면 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;os.path.join(directory, filename)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 제거하고 싶다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.\..\..\blah\&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;경로, 사용&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;os.path.join(os.path.normpath(directory), filename)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 통해 수동으로 작업할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;path = ...

import os
if not path.endswith(os.path.sep):
    path += os.path.sep
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만, 보통 사용하는 것이 훨씬 더 깨끗합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 것을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;os.path.normcase(path)
    Normalize the case of a pathname. On Unix and Mac OS X, this returns the path unchanged; on case-insensitive filesystems, it converts the path to lowercase. On Windows, it also converts forward slashes to backward slashes.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 이 &lt;a href=&quot;http://docs.python.org/library/os.path.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;페이지&lt;/a&gt;에서 다른 것을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2736144/python-add-trailing-slash-to-directory-string-os-independently&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1637</guid>
      <comments>https://goodsource.tistory.com/1637#entry1637comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:06 +0900</pubDate>
    </item>
    <item>
      <title>Xcode의 All Exceptions 중단점을 사용할 때 특정 예외 무시</title>
      <link>https://goodsource.tistory.com/1636</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode의 All Exceptions 중단점을 사용할 때 특정 예외 무시&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode에서 All Exceptions 중단점을 구성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/KZCQZ.png&quot; alt=&quot;screenshot of an exception breakpoint configured in Xcode breakpoint pain, configured to make a sound when an exception is thrown&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode는 때때로 다음과 같은 라인에서 멈춥니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[managedObjectContext save:&amp;amp;error];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 역추적을 통해&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/A8Sh9.png&quot; alt=&quot;backtrace showing NSPersistentStoreCoordinator throwing an exception inside the call to save:&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;계속을 클릭하면 아무 일도 없었던 것처럼 프로그램이 계속됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게 하면 이러한 &quot;정상적인&quot; 예외를 무시하면서도 내 코드에 있는 예외에 대해 디버거가 중지되도록 할 수 있습니까?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(Core Data가 내부적으로 예외를 던지고 잡기 때문에 이런 일이 발생한다는 것을 알고 있으며, Xcode는 예외가 발생할 때마다 프로그램을 일시 중지해 달라는 제 요청을 단순히 존중하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만, 저는 제 자신의 코드 디버깅으로 돌아갈 수 있도록 이것들을 무시하고 싶습니다!)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사회자: 이것은 &quot;&lt;a href=&quot;https://stackoverflow.com/questions/8109102/xcode-4-exception-breakpoint-filtering&quot;&gt;Xcode&lt;/a&gt; 4 &lt;a href=&quot;https://stackoverflow.com/questions/8109102/xcode-4-exception-breakpoint-filtering&quot;&gt;예외 중단점 필터링&quot;&lt;/a&gt;과 유사하지만&lt;a href=&quot;https://stackoverflow.com/questions/8109102/xcode-4-exception-breakpoint-filtering&quot;&gt;,&lt;/a&gt; 이 질문은 요점을 파악하는 데 시간이 너무 오래 걸리고 유용한 답이 없다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;연결될 수 있습니까?&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;핵심 데이터 예외의 경우 일반적으로 Xcode에서 &quot;모든 예외&quot; 중단점을 제거하고 대신 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기호 중단점 추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objc_exception_throw&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중단점 조건을 다음으로 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(BOOL)(! (BOOL)[[(NSException *)$x0 className] hasPrefix:@&quot;_NSCoreData&quot;])&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성된 중단점은 다음과 같이 보여야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/laAHN.png&quot; alt=&quot;Configuring the Breakpoint&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 클래스 이름 앞에 붙는 것에 따라 결정되는 모든 개인 코어 데이터 예외를 무시합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_NSCoreData&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제어 흐름에 사용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;적절한 레지스터는 실행 중인 대상 장치/시뮬레이터에 따라 달라집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.sealiesoftware.com/blog/archive/2013/09/12/objc_explain_So_you_crashed_in_objc_msgSend_iPhone_5s_Edition.html&quot; rel=&quot;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;&gt;이 기법은 다른 조건에 쉽게 적용될 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;까다로운 부분은 BOOL과 NS Exception 캐스트를 제작하여 조건에 만족하는 것이었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;훨씬 더 간단한 구문으로 Objective-C 예외를 선택적으로 무시할 수 있는 allldb 스크립트를 작성했고, OS X, iOS 시뮬레이터, 32bit 및 64bit ARM을 모두 처리합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치&lt;/font&gt;&lt;/h1&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 스크립트를 삽입합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/Library/lldb/ignore_specified_objc_exceptions.py&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 될만한 곳이 있을 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;import lldb
import re
import shlex

# This script allows Xcode to selectively ignore Obj-C exceptions
# based on any selector on the NSException instance

def getRegister(target):
    if target.triple.startswith('x86_64'):
        return &quot;rdi&quot;
    elif target.triple.startswith('i386'):
        return &quot;eax&quot;
    elif target.triple.startswith('arm64'):
        return &quot;x0&quot;
    else:
        return &quot;r0&quot;

def callMethodOnException(frame, register, method):
    return frame.EvaluateExpression(&quot;(NSString *)[(NSException *)${0} {1}]&quot;.format(register, method)).GetObjectDescription()

def filterException(debugger, user_input, result, unused):
    target = debugger.GetSelectedTarget()
    frame = target.GetProcess().GetSelectedThread().GetFrameAtIndex(0)

    if frame.symbol.name != 'objc_exception_throw':
        # We can't handle anything except objc_exception_throw
        return None

    filters = shlex.split(user_input)

    register = getRegister(target)


    for filter in filters:
        method, regexp_str = filter.split(&quot;:&quot;, 1)
        value = callMethodOnException(frame, register, method)

        if value is None:
            output = &quot;Unable to grab exception from register {0} with method {1}; skipping...&quot;.format(register, method)
            result.PutCString(output)
            result.flush()
            continue

        regexp = re.compile(regexp_str)

        if regexp.match(value):
            output = &quot;Skipping exception because exception's {0} ({1}) matches {2}&quot;.format(method, value, regexp_str)
            result.PutCString(output)
            result.flush()

            # If we tell the debugger to continue before this script finishes,
            # Xcode gets into a weird state where it won't refuse to quit LLDB,
            # so we set async so the script terminates and hands control back to Xcode
            debugger.SetAsync(True)
            debugger.HandleCommand(&quot;continue&quot;)
            return None

    return None

def __lldb_init_module(debugger, unused):
    debugger.HandleCommand('command script add --function ignore_specified_objc_exceptions.filterException ignore_specified_objc_exceptions')
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/.lldbinit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;command script import ~/Library/lldb/ignore_specified_objc_exceptions.py &lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;교체하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/Library/lldb/ignore_specified_objc_exceptions.py&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 곳에 저장했다면 정확한 경로를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode에서 중단점을 추가하여 &lt;strong&gt;Objective-C&lt;/strong&gt; 예외를 모두 잡습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중단점을 편집하고 다음 명령으로 디버거 명령을 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ignore_specified_objc_exceptions name:NSAccessibilityException className:NSSomeException&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 다음과 같은 예외를 무시합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSException&lt;/code&gt; &lt;code&gt;-name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성냥들&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSAccessibilityException&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오어&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-className&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성냥들&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSSomeException&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 보여야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/DQIDO.png&quot; alt=&quot;Screenshot showing a breakpoint set in Xcode per the instructions&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 경우, 당신은 다음을&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ignore_specified_objc_exceptions className:_NSCoreData&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트 및 자세한 내용은 http://chen.do/blog/2013/09/30/selectively-ignoring-objective-c-exceptions-in-xcode/ 을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무시하고 싶은 여러 예외를 던지는 제3 파트 라이브러리와 같은 코드 블록이 있을 때에 대한 빠른 답변을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무시할 코드의 예외 던지기 블록 앞과 뒤에 두 개의 중단점을 설정합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예외에서 멈출 때까지 프로그램을 실행하고 '중단점 목록'을 디버거 콘솔에 입력하여 '모든 예외' 중단점의 수를 찾으면 다음과 같습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2: 이름 = {'objc_exception_throw', '_cxa_throw'}, 위치 = 2 옵션: 사용 안 함 2.1: 여기서 = libobjc.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디립&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objc_exception_throw, address = 0x00007fff8f8da6b3, unresolved, hit count = 0 2.2: where = libc++abi.dylib&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;__cxa_throw, 주소 = 0x00007ff8d19 fab7, 미해결, 적중 횟수 = 0&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 브레이크 포인트 2를 의미합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 xcode에서 첫 번째 중단점(예외 던지기 코드 전)을 편집하고 작업을 'debugger command'로 변경하고 '중단점 비활성화 2'를 입력합니다(그리고 '자동으로 계속'을 설정합니다..).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.' 확인란)을 누릅니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오펜딩 라인 이후의 중단점에 대해서도 동일하게 수행하고 '중단점 활성화 2' 명령을 받습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 모든 중단점 예외가 켜지고 꺼지기 때문에 필요할 때만 활성화됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/14370632/ignore-certain-exceptions-when-using-xcodes-all-exceptions-breakpoint&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1636</guid>
      <comments>https://goodsource.tistory.com/1636#entry1636comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:49:00 +0900</pubDate>
    </item>
    <item>
      <title>*nnnng-template 출력에 대해 각도2가 없습니다.</title>
      <link>https://goodsource.tistory.com/1635</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*nnnng-template 출력에 대해 각도2가 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 내 *ngFor 루프가 아무것도 출력되지 않는지 잘 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;html 파일에 다음 코드가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;table class=&quot;table table-hover&quot;&amp;gt;
    &amp;lt;thead&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Email&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Company&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Status&amp;lt;/th&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/thead&amp;gt;
    &amp;lt;tbody&amp;gt;
        &amp;lt;!-- NGFOR ATTEMPTED HERE -- no content printed --&amp;gt;
        &amp;lt;ng-template *ngFor=&quot;let xb of tempData&quot;&amp;gt;
            &amp;lt;tr data-toggle=&quot;collapse&quot; data-target=&quot;#demo1&quot; class=&quot;accordion-toggle&quot;&amp;gt;
                &amp;lt;td&amp;gt;{{ xb.name }}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;{{ xb.email }}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;{{ xb.company }}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;{{ xb.status }}&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;!-- other content --&amp;gt;
        &amp;lt;/ng-template&amp;gt;
    &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 간단한 구성요소에는 다음과 같은 것이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Component }        from '@angular/core';

@Component({
    selector: 'my-profile-exhibitors',
    templateUrl: './profile-exhibitors.component.html',
    styleUrls: ['./profile-exhibitors.component.scss']
})
export class ProfileExhibitorsComponent {
    public tempData: any = [
        {
            'name': 'name1',
            'email': 'email1@gmail',
            'company': 'company',
            'status': 'Complete'
        },
        {
            'name': 'name2',
            'email': 'email2@gmail',
            'company': 'company',
            'status': 'Incomplete'
        }
    ];
    constructor() {}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드를 실행하면 출력이 0이 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 이상한 것은 디버그 도구를 사용하여 요소를 선택하면 다음과 같이 표시된다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/9Vlch.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/9Vlch.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 물건을 제대로 인식하는 것 같지만 아무것도 출력하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 원하는 것은&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-ts prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;ng-container *ngFor=&quot;let xb of tempData&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-ts prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;ng-template ngFor let-xb [ngForOf]=&quot;tempData&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스 가져오기도:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;ng-template ngFor let-xb [ngForOf]=&quot;tempData&quot; let-index=&quot;index&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/43177742/ngfor-on-ng-template-outputs-nothing-angular2&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1635</guid>
      <comments>https://goodsource.tistory.com/1635#entry1635comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:48:51 +0900</pubDate>
    </item>
    <item>
      <title>텍스트 입력을 클릭하면 양식 필드가 포커스를 바꿉니다.</title>
      <link>https://goodsource.tistory.com/1634</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 입력을 클릭하면 양식 필드가 포커스를 바꿉니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래에 검색 양식이 있는데 선택 입력 유형 2개와 키워드로 검색할 수 있는 텍스트 입력 필드 1개가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 이유에서인지 키워드 텍스트 상자를 클릭하면 바로 Category에 대한 첫 번째 선택 상자 드롭다운으로 포커스가 바뀌고 키워드 텍스트 상자에 아무것도 입력할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 이런 일이 일어나는지 누가 알 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$categories_list = array();
$ratings_list = array();

try {
$query = $dbh-&amp;gt;query(&quot;SELECT category, genre, rating FROM posts WHERE 1
GROUP BY category, genre, rating&quot;);
$query-&amp;gt;setFetchMode(PDO::FETCH_ASSOC);
$iterator = new IteratorIterator($query);
foreach ($iterator as $row) {
    if (empty($row['category']) == false &amp;amp;&amp;amp; !in_array($row['category'],
$categories_list))
        $categories_list[] = $row['category'];
    if (empty($row['rating']) == false &amp;amp;&amp;amp; !in_array($row['rating'],
$ratings_list))
        $ratings_list[] = $row['rating'];
}
} catch (Exception $e) {
echo '&amp;lt;p&amp;gt;', $e-&amp;gt;getMessage(), '&amp;lt;/p&amp;gt;';
}
?&amp;gt;


&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;Search Completed Stories&amp;lt;/h2&amp;gt;
&amp;lt;form name=&quot;search&quot; method=&quot;get&quot; 
action=&quot;http://example.com/searchB/&quot;&amp;gt;
&amp;lt;label&amp;gt;
    Category:
    &amp;lt;select name=&quot;category&quot;&amp;gt;
        &amp;lt;?php foreach($categories_list as $category) : ?&amp;gt;
            &amp;lt;option&amp;gt;&amp;lt;?php echo $category; ?&amp;gt;&amp;lt;/option&amp;gt;
        &amp;lt;?php endforeach; ?&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/label&amp;gt;
&amp;lt;label&amp;gt;
    Rating:
    &amp;lt;select name=&quot;rating&quot;&amp;gt;
            &amp;lt;option value=&quot;&quot;&amp;gt;Any&amp;lt;/option&amp;gt;
        &amp;lt;?php foreach($ratings_list as $rating) : ?&amp;gt;
            &amp;lt;option&amp;gt;&amp;lt;?php echo $rating; ?&amp;gt;&amp;lt;/option&amp;gt;
        &amp;lt;?php endforeach; ?&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/label&amp;gt;
&amp;lt;label&amp;gt;
    Keywords:
    &amp;lt;input type=&quot;text&quot; name=&quot;keywords&quot;&amp;gt;
&amp;lt;/label&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;active&quot; value=&quot;0&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 대신 라벨 태그를 탑 태그로 변경해서 문제를 해결한 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것이 갈등을 극복한 것 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드 텍스트 입력을 클릭한 후 포커스가 즉시 첫 번째 선택 상자로 다시 바뀌는 문제는 선택 입력을 둘러싼 요소로 인해 발생할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 입력 요소와 연결된 레이블을 클릭하면 포커스가 해당 입력 요소로 이동됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 해결하기 위해 선택한 입력에 대한 레이블과 입력 요소를 구분하여 HTML 구조를 수정할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드의 업데이트 버전은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;Search Completed Stories&amp;lt;/h2&amp;gt;
&amp;lt;form name=&quot;search&quot; method=&quot;get&quot; action=&quot;http://example.com/searchB/&quot;&amp;gt;
&amp;lt;label for=&quot;category&quot;&amp;gt;Category:&amp;lt;/label&amp;gt;
&amp;lt;select name=&quot;category&quot; id=&quot;category&quot;&amp;gt;
    &amp;lt;?php foreach($categories_list as $category) : ?&amp;gt;
        &amp;lt;option&amp;gt;&amp;lt;?php echo $category; ?&amp;gt;&amp;lt;/option&amp;gt;
    &amp;lt;?php endforeach; ?&amp;gt;
&amp;lt;/select&amp;gt;

&amp;lt;label for=&quot;rating&quot;&amp;gt;Rating:&amp;lt;/label&amp;gt;
&amp;lt;select name=&quot;rating&quot; id=&quot;rating&quot;&amp;gt;
    &amp;lt;option value=&quot;&quot;&amp;gt;Any&amp;lt;/option&amp;gt;
    &amp;lt;?php foreach($ratings_list as $rating) : ?&amp;gt;
        &amp;lt;option&amp;gt;&amp;lt;?php echo $rating; ?&amp;gt;&amp;lt;/option&amp;gt;
    &amp;lt;?php endforeach; ?&amp;gt;
&amp;lt;/select&amp;gt;

&amp;lt;label for=&quot;keywords&quot;&amp;gt;Keywords:&amp;lt;/label&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;keywords&quot; id=&quot;keywords&quot;&amp;gt;

&amp;lt;input type=&quot;hidden&quot; name=&quot;active&quot; value=&quot;0&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
 &amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/31215727/form-field-changes-focus-when-i-click-on-the-text-input&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1634</guid>
      <comments>https://goodsource.tistory.com/1634#entry1634comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:48:44 +0900</pubDate>
    </item>
    <item>
      <title>팩트 테이블과 차원 테이블의 차이?</title>
      <link>https://goodsource.tistory.com/1633</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블과 차원 테이블의 차이?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블과 차원 테이블의 차이점은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들면 매우 도움이 될 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 웨어하우스 모델링에서 별 &lt;strong&gt;스키마&lt;/strong&gt;와 &lt;strong&gt;눈송이 스키마&lt;/strong&gt;는 &lt;strong&gt;사실&lt;/strong&gt; 및 차원 &lt;strong&gt;테이블&lt;/strong&gt;로 구성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에는 판매 수량, 판매 금액 및 평균 판매와 같은 차원의 기본 키와 관련 사실 또는 측정(계산이 가능한 속성)이 모두 포함됩니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;치수 테이블:&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;치수표는 사실표에 기록된 모든 측정에 대한 설명 정보를 제공합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;치수는 사실표의 비교만큼 상대적으로 매우 작습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 사용되는 치수는 사람, 제품, 장소 및 시간입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/aB9k9.jpg&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/aB9k9.jpg&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.dataintegration.ninja/loading-star-schema-dimensions-facts-in-parallel/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지 소스&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 팩트 테이블과 차원 테이블을 구별하는 방법에 대한 매우 간단한 답인 것 같습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;치수를 사물이나 사물로 생각하는 것이 도움이 될 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제품과 같은 것은 비즈니스 행사에 관여하지 않고 존재할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원은 당신의 명사입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 세일과 같은 비즈니스 행사와는 별개로 존재할 수 있는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제품, 직원, 장비 등 모든 것이 존재합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원이 어떤 일을 하거나 어떤 일을 합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;직원들은 팔고 고객들은 삽니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;직원과 고객은 차원의 예입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제품은 판매되며, 제품에 뭔가를 가했기 때문에 치수이기도 합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실은 동사입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블의 항목은 차원 테이블에서 발생하는 개별 이벤트를 표시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제품 판매는 팩트 테이블에 기록됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;판매 이벤트는 어떤 제품이 판매되었는지, 어떤 직원이 판매했는지, 어떤 고객이 구매했는지에 따라 알 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제품, 직원 및 고객은 모두 행사, 판매를 설명하는 차원입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 사실 표는 일반적으로 일종의 정량적 데이터를 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;판매 수량, 품목당 가격, 총 가격 등입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처 : http://arcanecode.com/2007/07/23/dimensions-versus-facts-in-data-warehousing/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 부분에 대한 답변입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원 테이블이 팩트 테이블이 될 수 있는지 없는지 이해하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단답형(INMO)은 아니오입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 이유는 두 종류의 테이블이 서로 다른 이유로 만들어졌기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 데이터베이스 설계 관점에서 차원 테이블은 항상 차원 테이블(또는 그 이상)을 상위 테이블로 가지는 사실 테이블과 같은 상위 테이블을 가질 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 팩트 테이블은 집계될 수 있지만 차원 테이블은 집계되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또 다른 이유는 팩트 테이블은 제자리에서 업데이트되지 않는 반면 차원 테이블은 제자리에서 업데이트될 수 있기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실 및 차원 표는 일반적으로 Star Schema라고 하는 것으로 나타납니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스타 스키마의 주된 목적은 복잡한 정규화된 테이블 집합을 단순화하고 매우 효율적인 방식으로 쿼리할 수 있는 하나의 데이터베이스 구조로 데이터를 통합하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 간단한 형태로 팩트 테이블이 포함되어 있습니다(예:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;StoreSales) 및 하나 이상의 차원 테이블.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 차원 항목에는 0, 1개 이상의 팩트 테이블이 연결되어 있습니다(차원 테이블의 예:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지리, 품목, 공급업체, 고객, 시간 등).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원에 부모가 있는 것도 유효할 것이며, 이 경우 모델은 &quot;스노우 플레이크&quot; 유형입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 설계자들은 이러한 종류의 설계를 피하려고 하는데, 이는 더 많은 결합을 유발하여 성능이 저하되기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;StoreSales 예제에서 지리 차원은 열(GeoID, ContententName, CountryName, StateProvName, CityName, StartDate, EndDate)로 구성될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Snow Flakes 모델에서는 Geo 정보에 대한 두 개의 정규화된 표(Content Table, Country Table)를 가질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스타 스키마에서 많은 예시를 찾을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 스타 스키마 모델 &lt;a href=&quot;https://web.archive.org/web/20181218014813/http://www.nagesh.com/publications/technology/173-inmon-vs-kimball-an-analysis.html&quot; rel=&quot;noreferrer&quot;&gt;Inmon vs.&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20181218014813/http://www.nagesh.com/publications/technology/173-inmon-vs-kimball-an-analysis.html&quot; rel=&quot;noreferrer&quot;&gt; 킴볼&lt;/a&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;킴벌은 여러분도 이곳에 가보고 싶어할지도 모르는 좋은 포럼이 있습니다. 바로 &lt;a href=&quot;http://forum.kimballgroup.com/&quot; rel=&quot;noreferrer&quot;&gt;킴벌 포럼&lt;/a&gt;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 4NF에 대한 예제에 대한 설명에 답하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4NF를 위반하는 팩트 테이블의 예:&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;영업사실(ID, 영업점ID, 영업사원)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID, 품목ID, 금액, 시간&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;신분증)&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4NF를 위반하지 않는 팩트 테이블의 예:&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;집계매출액(지점ID,총금액)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 관계는 4NF에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막 예는 다소 흔하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;초간단 설명:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블 : 룩업 ID를 함께 매핑한 데이터 테이블입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 응용프로그램의 중심에 있는 주요 테이블 중 하나입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원 테이블: 사실 테이블에서 자주 반복되는 값(예: 도시 이름 또는 상태)을 저장하는 데 사용되는 조회 테이블입니다.&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;a 팩트&lt;/strong&gt; &lt;strong&gt;=&lt;/strong&gt; &lt;strong&gt;액션&lt;/strong&gt;: 판매, 거래, 접근&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;a 차원&lt;/strong&gt; &lt;strong&gt;=&lt;/strong&gt; &lt;strong&gt;객체&lt;/strong&gt;: 판매자, 고객, 날짜, 가격&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼...&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실은 언제, 어디서, 무엇을, 누가, 어떻게에 대한 치수를 참조합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정말 흥미로운 것은 속성이 차원인지 사실인지를 결정하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 주문에 포함된 각 항목의 가격 또는 계약에 기록된 보험의 최대 금액.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 올바른 접근 방법은 없으며, 상황에 맞는 접근 방법만 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신: 만약 내가 이 용어들을 만든다면 &lt;strong&gt;로그 테이블&lt;/strong&gt;과 &lt;strong&gt;오브젝트&lt;/strong&gt; 테이블을 선호할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Dimension table&lt;/strong&gt; Dimension table은 팩트 테이블에 저장된 측정값의 속성을 포함하는 테이블입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 표는 노드에서 횡단하는 데 사용할 수 있는 계층 구조, 범주 및 논리로 구성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;팩트 테이블&lt;/strong&gt;에는 비즈니스 프로세스의 측정값이 포함되어 있으며 차원 테이블에 대한 외래 키가 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제 – 비즈니스 프로세스가 벽돌 제조인 경우&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 사람/기계가 생산한 평균 벽돌 수 – 비즈니스 프로세스 측정&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 간단한 형태로, 차원 테이블은 모든 '항목'의 목록을 보관하는 '마스터' 테이블과 같은 것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블은 모든 트랜잭션을 설명하는 트랜잭션 테이블입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 영업사원별 총매출액, 지점별 총매출액과 같은 집계(그룹화)된 데이터도 독립적인 팩트 테이블로 존재할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 입장에서는.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원 테이블 : 마스터 데이터&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블 : 트랜잭션 데이터&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블은 주로 비즈니스 팩트와 치수 테이블의 주요 키를 참조하는 외국 키로 구성됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원 테이블은 주로 텍스트 필드인 설명 속성으로 구성됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원 테이블에는 대리 키, 자연 키 및 특성 집합이 포함됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반대로 팩트 테이블에는 외부 키, 측정값 및 축약된 치수가 포함됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차원 테이블은 사실 테이블의 측정을 위한 설명적 또는 상황에 맞는 정보를 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반면에, 팩트 표는 기업의 측정치를 제공합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 표의 크기를 비교할 때 치수표보다 팩트표가 더 큽니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비교 표에서는 사실 표보다 더 많은 차원이 표시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실 표에서는 관측되는 사실의 개수가 적습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;치수 테이블을 먼저 로드해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블을 로드하는 동안 치수 테이블을 봐야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 팩트 테이블에 치수 테이블의 기본 키인 측도, 팩트 및 외래 키가 있기 때문입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더보기: 차원 테이블과 팩트 테이블 | 차원 테이블 vs 팩트 테이블 http://www.differencebetween.net/technology/hardware-technology/dimension-table-and-fact-table/ #&lt;a href=&quot;http://www.differencebetween.net/technology/hardware-technology/dimension-table-and-fact-table/#ixzz3SBp8kPzo&quot; rel=&quot;nofollow&quot;&gt;ixzz3SBP8kPzo&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관계 데이터베이스 사용자의 경우 차원은 마스터 테이블과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트는 트랜잭션 테이블과 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Dimension table : Dimension table이라고 불리는 특성화된 날짜에 대한 정보를 유지할 수 있을 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예: 시간 차원, 제품 차원.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팩트 테이블 : 메트릭 또는 사전 계산 데이터에 대한 정보를 유지할 수 있을 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예: 판매 사실, 주문 사실&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Star 스키마 : 차원 테이블 양식을 시작 스키마로 하는 하나의 팩트 테이블 링크.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/fXvfU.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지 설명을 여기에 입력합니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/20036905/difference-between-fact-table-and-dimension-table&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>database</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1633</guid>
      <comments>https://goodsource.tistory.com/1633#entry1633comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:48:36 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security 및 @Async(인증된 사용자 혼합)</title>
      <link>https://goodsource.tistory.com/1632</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security 및 @Async(인증된 사용자 혼합)&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 스프링과 함께 비동기적으로 메소드를 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Async&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이 메서드는 다음과 같이 주석이 달린 다른 메서드를 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@PreAuthorize&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 춘계 보안 주석&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증 작업을 수행하려면 설정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContextHolder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에의 모드&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MODE_INHERITABLETHREADLOCAL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 인증 정보가 비동기 호출로 전달되도록 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금까지는 모든 것이 잘 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 로그아웃하고 다른 사용자로 로그인하면 비동기 방식으로 SecurityContextHolder가 로그아웃한 이전 사용자의 인증 정보를 저장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 원치 않는 원인이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AccessDenied&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예외.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동기 호출에는 그런 문제가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정의했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;task:executor id=&quot;executors&quot; pool-size=&quot;10&quot;/&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그래서 실행자 풀의 스레드가 초기화되면 인증 정보를 덮어쓰지 않는 것이 문제가 될 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 것 같다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MODE_INHERITABLETHREADLOCAL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스레드 풀에서 올바르게 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능한 해결책으로 서브클래스를 시도하고 전파할 메서드를 재정의할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContext&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수동으로 실행자를 선언합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;task:executor&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다음과 같은 것.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public void execute(final Runnable r) {
    final Authentication a = SecurityContextHolder.getContext().getAuthentication();

    super.execute(new Runnable() {
        public void run() {
            try {
                SecurityContext ctx = SecurityContextHolder.createEmptyContext();
                ctx.setAuthentication(a);
                SecurityContextHolder.setContext(ctx);
                r.run();
            } finally {
                SecurityContextHolder.clearContext();
            }
        }
    });
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 그 문제에 부딪혔습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ThreadPoolTask를 구성하는 것이 중요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행자가 올바르게 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DelegatingSecurityContextAsyncTaskExecutor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 또한 initialize() 메서드를 호출하는 것이 중요합니다. 그렇지 않으면 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Bean(&quot;threadPoolTaskExecutor&quot;)
public TaskExecutor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(20);
    executor.setMaxPoolSize(1000);
    executor.setWaitForTasksToCompleteOnShutdown(true);
    executor.setThreadNamePrefix(&quot;Async-&quot;);
    executor.initialize(); // this is important, otherwise an error is thrown
    return new DelegatingSecurityContextAsyncTaskExecutor(executor);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비즈니스 로직에서 비동기적으로 호출되는 메소드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
@Async(&quot;threadPoolTaskExecutor&quot;)
public void methodName() {
    [..]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트 &lt;/strong&gt;-&lt;strong&gt; 기타 접근&lt;/strong&gt; 방식 -&lt;strong&gt; 자세한 정보&lt;/strong&gt;:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보안 컨텍스트(즉, 인증 정보)만 위임하려는 경우에는 위에서 설명한 솔루션이 완벽하게 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 특정 상황에서는 MDC 컨텍스트나 요청 컨텍스트와 같은 다른 스레드 정보를 위임하거나 실행자 스레드로 전달되는 방법을 더 많이 제어하기를 원할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 로컬 스레드 정보를 실행자 스레드에 수동으로 바인딩할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 작업을 수행할 수 있는 방법에 대해서는 @axtavt의 답변에서 이미 설명되어 있지만 이제 작업 데코레이터를 사용하여 보다 우아한 방식으로 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TaskDecorator는 요청 스레드의 컨텍스트를 변수로 저장하고 해당 컨텍스트를 실행자 스레드에서 액세스할 수 있도록 클로징으로 바인딩합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스레드 실행이 완료되면 실행자 스레드에서 컨텍스트가 지워져서 스레드가 재사용될 때 정보가 사라집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private static class ContextCopyingDecorator implements TaskDecorator {
    @NonNull
    @Override
    public Runnable decorate(@NonNull Runnable runnable) {
        // store context in variables which will be bound to the executor thread
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Map&amp;lt;String, String&amp;gt; mdcContextMap = MDC.getCopyOfContextMap();
        return () -&amp;gt; { // code runs inside executor thread and binds context
            try {
                if (requestAttributes != null) {
                    RequestContextHolder.setRequestAttributes(requestAttributes);
                }
                if (securityContext != null) {
                    SecurityContextHolder.setContext(securityContext);
                }
                if (mdcContextMap != null) {
                    MDC.setContextMap(mdcContextMap);
                }
                runnable.run();
            } finally {
                MDC.clear();
                RequestContextHolder.resetRequestAttributes();
                SecurityContextHolder.clearContext();
            }
        };
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TaskExecutor를 생성하는 동안 TaskDecorator는 설정된 TaskDecorator 메서드와 함께 TaskExecutor에 할당됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Bean(&quot;threadPoolTaskExecutor&quot;)
public TaskExecutor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(20);
    executor.setMaxPoolSize(1000);
    executor.setWaitForTasksToCompleteOnShutdown(true);
    executor.setThreadNamePrefix(&quot;Async-&quot;);
    executor.setTaskDecorator(new ContextCopyingDecorator());
    return executor;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 두 가지 접근 방식을 모두 결합할 수도 있습니다(예: TaskDecorator를 사용하여 MDC 컨텍스트를 복사하고 DelegatingSecurityContextAsyncTask를 사용하는 경우).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보안 컨텍스트의 경우 실행자)를 사용하지만 복잡성이 증가하기 때문에 이 작업을 권장하지는 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TaskDecorator를 사용하는 경우 보안 컨텍스트를 함께 설정할 수도 있으며 보안 컨텍스트만 설정하면 되는 경우 DelegatingSecurityContextAsyncTask를 사용하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행자 접근.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;이는 향후 조사가 필요한 힌트일 뿐&lt;/strong&gt;입니다. (저는 너무 피곤하지만 누군가가 향후 조사에 유용하다고 생각할 수도 있습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오늘 우연히 깃허브를 &lt;a href=&quot;https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/task/DelegatingSecurityContextAsyncTaskExecutor.java&quot; rel=&quot;noreferrer&quot;&gt;보게&lt;/a&gt; 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보안 컨텍스트를 위임하여 보안 컨텍스트를 &quot;통과&quot;하도록 설계된 것으로 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Async&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불러.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 이 게시물을 보세요: 스프링 &lt;a href=&quot;http://www.websitedevelopmentny.org/blog/wievblog.php?id=1641&quot; rel=&quot;noreferrer&quot;&gt;시큐리티 3.2&lt;/a&gt; M1 &lt;a href=&quot;http://www.websitedevelopmentny.org/blog/wievblog.php?id=1641&quot; rel=&quot;noreferrer&quot;&gt;하이라이트, 서블릿&lt;/a&gt; 3 &lt;a href=&quot;http://www.websitedevelopmentny.org/blog/wievblog.php?id=1641&quot; rel=&quot;noreferrer&quot;&gt;API 지원&lt;/a&gt;은 강력한 관련이 있는 것처럼 들립니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;랄프와 오크의 정보를 이용해서...&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Async가 표준 작업 실행자 태그와 함께 작동하도록 하려면 다음과 같이 Spring XML 구성을 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;task:annotation-driven executor=&quot;_importPool&quot;/&amp;gt;
&amp;lt;task:executor id=&quot;_importPool&quot; pool-size=&quot;5&quot;/&amp;gt;

&amp;lt;bean id=&quot;importPool&quot;
          class=&quot;org.springframework.security.task.DelegatingSecurityContextAsyncTaskExecutor&quot;&amp;gt;
     &amp;lt;constructor-arg ref=&quot;_importPool&quot;/&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 @Async 메서드에서 사용할 풀을 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Async(&quot;importPool&quot;)
public void run(ImportJob import) {
   ...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Async 메서드를 호출할 때마다 스레드 풀 스레드는 호출 스레드와 동일한 보안 컨텍스트를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미 언급했듯이 풀링된 스레드 환경의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DelegatingSecurityContextAsyncTaskExecutor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에 사용되어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MODE_INHERITABLETHREADLOCAL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(&lt;a href=&quot;https://github.com/spring-projects/spring-security/issues/6856#issuecomment-518787966&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순하게 남기기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DelegatingSecurityContextAsyncTaskExecutor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비동기 작업을 위해 기본 Spring Boot 풀만 사용하는 Spring Boot 프로젝트에 대한 구성:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
    private final ThreadPoolTaskExecutor defaultSpringBootAsyncExecutor;

    public AsyncConfig(ThreadPoolTaskExecutor defaultSpringBootAsyncExecutor) {
        this.defaultSpringBootAsyncExecutor = defaultSpringBootAsyncExecutor;
    }

    @Override
    public Executor getAsyncExecutor() {
        return new DelegatingSecurityContextAsyncTaskExecutor(defaultSpringBootAsyncExecutor);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Ralph 답변을 바탕으로 달성할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Aync event&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Spring&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;threadpooling&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://docs.spring.io/autorepo/docs/spring-security/4.0.0.M1/apidocs/org/springframework/security/task/DelegatingSecurityContextAsyncTaskExecutor.html 을 사용하여 보안을 위임합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;샘플코드&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;bean id=&quot;applicationEventMulticaster&quot;
    class=&quot;org.springframework.context.event.SimpleApplicationEventMulticaster&quot;&amp;gt;
    &amp;lt;property name=&quot;taskExecutor&quot;&amp;gt;
        &amp;lt;ref bean=&quot;delegateSecurityAsyncThreadPool&quot;/&amp;gt;
    &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;

&amp;lt;bean id=&quot;threadsPool&quot;
    class=&quot;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&quot;&amp;gt;
&amp;lt;/bean&amp;gt;


&amp;lt;bean id=&quot;delegateSecurityAsyncThreadPool&quot;
    class=&quot;org.springframework.security.task.DelegatingSecurityContextTaskExecutor&quot;&amp;gt;
    &amp;lt;constructor-arg ref=&quot;threadsPool&quot;/&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@axtavt의 답변에 추가하기 위해 다른 메소드도 재정의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
    public &amp;lt;T&amp;gt; Future&amp;lt;T&amp;gt; submit(Callable&amp;lt;T&amp;gt; task) {
        ExecutorService executor = getThreadPoolExecutor();
        final Authentication a = SecurityContextHolder.getContext().getAuthentication();
        try {
            return executor.submit(new Callable&amp;lt;T&amp;gt;() {
                @Override
                public T call() throws Exception {
                    try {
                        SecurityContext ctx = SecurityContextHolder.createEmptyContext();
                        ctx.setAuthentication(a);
                        SecurityContextHolder.setContext(ctx);
                        return task.call();
                    } catch (Exception e) {
                        slf4jLogger.error(&quot;error invoking async thread. error details : {}&quot;, e);
                        return null;
                    } finally {
                        SecurityContextHolder.clearContext();
                    }
                }
            });
        } catch (RejectedExecutionException ex) {
            throw new TaskRejectedException(&quot;Executor [&quot; + executor + &quot;] did not accept task: &quot; + task, ex);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JNDI 관리 스레드 풀이 있는 Enterprise Jboss Server를 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제게 효과가 있었던 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableAsync
public class AsyncAppConfig {

    public static final String THREAD_POOL_ID = &quot;threadPoolId&quot;;

    @Bean(THREAD_POOL_ID)
    public DelegatingSecurityContextAsyncTaskExecutor secureThreadPool(
            DefaultManagedTaskExecutor jbossManagedTaskExecutor) {
        return new DelegatingSecurityContextAsyncTaskExecutor(jbossManagedTaskExecutor);
    }

    @Bean
    public DefaultManagedTaskExecutor jbossManagedTaskExecutor() {
        return new DefaultManagedTaskExecutor() {
            @Override
            public void afterPropertiesSet() throws NamingException {
                // gets the ConcurrentExecutor configured by Jboss
                super.afterPropertiesSet();
                // Wraps the jboss configured ConcurrentExecutor in a securityContext aware delegate
                setConcurrentExecutor(new DelegatingSecurityContextExecutor(getConcurrentExecutor(), getContext()));
            }
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring security 6을 사용하면 명시적인 컨텍스트 저장을 비활성화해야 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;websecurityConfig에서 아래와 같이 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코틀린에 대한 토막글입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .securityContext().requireExplicitSave(false).and().....
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/5246428/spring-security-and-async-authenticated-users-mixed-up&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1632</guid>
      <comments>https://goodsource.tistory.com/1632#entry1632comment</comments>
      <pubDate>Tue, 7 Nov 2023 20:48:28 +0900</pubDate>
    </item>
    <item>
      <title>사용자 입력을 허용하지 않는 텍스트 입력이 있는 jQuery Datepicker</title>
      <link>https://goodsource.tistory.com/1631</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 입력을 허용하지 않는 텍스트 입력이 있는 jQuery Datepicker&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 상자 입력과 함께 jQuery Datepicker를 사용하는 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).datepicker({
  // options
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 사용자가 텍스트 상자에 임의의 텍스트를 입력하는 것을 허용하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 상자가 포커스를 얻거나 사용자가 클릭하면 Datepicker(데이트 픽커)가 팝업되되 키보드를 사용하는 모든 사용자 입력(복사 및 붙여넣기)은 텍스트 상자에서 무시하도록 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 날짜 선택 달력에서만 텍스트 상자를 채우고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능한가요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 1.2.6&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;날짜 선택기 1.5.2&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 입력에 읽기 &lt;strong&gt;전용&lt;/strong&gt; 특성을 사용할 수 있어야 하며 jQuery는 여전히 내용을 편집할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type='text' id='foo' readonly='true'&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 경험을 바탕으로 Adhip Gupta가 제안한 해결책을 추천합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).attr( 'readOnly' , 'true' );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 코드에서는 사용자가 새 문자를 입력할 수 없지만 문자를 삭제할 수 &lt;strong&gt;있습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).keypress(function(event) {event.preventDefault();});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한, 이것은 자바스크립트가 비활성화된 사용자들에게 이 양식을 쓸모없게 만들 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; readonly=&quot;true&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).keypress(function(event) {event.preventDefault();});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 곳에서 날짜 선택기를 재사용하는 경우 다음과 같은 방법을 사용하여 자바스크립트를 통해 텍스트 상자를 수정하는 것이 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).attr( 'readOnly' , 'true' );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이트 상대를 초기화하는 장소의 바로 다음/이전.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; readonly=&quot;true&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포스트백 후 텍스트 상자의 값이 손실됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차라리 완벽하게 작동하는 브래드8118의 제안을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).keypress(function(event) {event.preventDefault();});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: IE에서 작동하려면 '키 누르기' 대신 '키다운'을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;날짜 선택기를 초기화한 후:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;.project-date&quot;).datepicker({
    dateFormat: 'd M yy'
});

$(&quot;.project-date&quot;).keydown(false);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$(&quot;#txtfromdate&quot;).datepicker({         
    numberOfMonths: 2,
    maxDate: 0,               
    dateFormat: 'dd-M-yy'       
}).attr('readonly', 'readonly');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery에서 read only 특성을 추가합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 가지 방법이 있습니다. (제가 알기로는)&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;옵션 A:&lt;/strong&gt; 텍스트 필드를 읽기 전용으로 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;옵션 B:&lt;/strong&gt; 커서를 포커스로 바꿉니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ti를 흐리게 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성을 설정하여 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onfocus=&quot;this.blur()&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;날짜 선택기 텍스트 필드로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; name=&quot;currentDate&quot; id=&quot;currentDate&quot; onfocus=&quot;this.blur()&quot; readonly/&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;게인 포커스에 대한 날짜 선택에서 팝업으로 이동하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;.selector&quot;).datepicker({ showOn: 'both' })
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 입력을 원하지 않을 경우 입력 필드에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; name=&quot;date&quot; readonly=&quot;readonly&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방금 이걸 발견해서 여기에 공유합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 옵션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://eonasdan.github.io/bootstrap-datetimepicker/Options/#ignorereadonly&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://eonasdan.github.io/bootstrap-datetimepicker/Options/ # ignore 읽기 전용&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;br/&amp;gt;
&amp;lt;!-- padding for jsfiddle --&amp;gt;
&amp;lt;div class=&quot;input-group date&quot; id=&quot;arrival_date_div&quot;&amp;gt;
  &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;arrival_date&quot; name=&quot;arrival_date&quot; required readonly=&quot;readonly&quot; /&amp;gt;
  &amp;lt;span class=&quot;input-group-addon&quot;&amp;gt;
    &amp;lt;span class=&quot;glyphicon-calendar glyphicon&quot;&amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#arrival_date_div').datetimepicker({
  format: &quot;YYYY-MM-DD&quot;,
  ignoreReadonly: true
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;음정은 이렇습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/matbaric/wh1cb6cy/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://jsfiddle.net/matbaric/wh1cb6cy/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;bootstrap-datetimepicker.js 버전은 4.17.45입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 스레드가 오래되었다는 것을 알고 있지만, 동일한 문제가 발생하는 다른 사람들을 위해 @Brad8118 솔루션을 구현합니다(입력 내용을 읽기만 하도록 선택하면 사용자가 선택한 경우 datepicker에서 삽입된 날짜 값을 삭제할 수 없기 때문에 선호합니다). 또한 사용자가 값을 붙여넣는 것을 방지해야 합니다(@ErikPhilips가 제안하는 것처럼).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;d to need), 저는 여기에 이 추가 사항을 남겨두었는데, 이것은 저에게 효과가 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).bind('paste',function(e) { e.preventDefault(); //disable paste });&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 https://www.dotnettricks.com/learn/jquery/disable-cut-copy-and-paste-in-textbox-using-jquery-javascript 에서 그리고 내가 사용한 전체 스크립트(대신 펑위안첸/데이트피커 플러그인 사용):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('[data-toggle=&quot;datepicker&quot;]').datepicker({
    autoHide: true,
    pick: function (e) {
        e.preventDefault();
        $(this).val($(this).datepicker('getDate', true));
    }
}).keypress(function(event) {
    event.preventDefault(); // prevent keyboard writing but allowing value deletion
}).bind('paste',function(e) {
    e.preventDefault()
}); //disable paste;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/tags/att_input_readonly.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;읽기&lt;/a&gt;만 추가하는 대신 키 &lt;a href=&quot;https://www.w3schools.com/jsref/event_onkeypress.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;누르기&lt;/a&gt;=&quot;&lt;a href=&quot;https://www.w3schools.com/jsref/event_onkeypress.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;reath&lt;/a&gt; false;&quot;를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/datePickerClickInput.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;데모&lt;/a&gt;는 일정관리를 텍스트 필드 위에 놓아서 입력할 수 없도록 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;입력 필드를 HTML에서만 읽도록 설정할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; readonly=&quot;true&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input class=&quot;date-input&quot; type=&quot;text&quot; readonly=&quot;readonly&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.date-input {
      background-color: white;
      cursor: pointer;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 jQuery Calendar 플러그인이 적어도 저에게는 일반적으로 날짜를 선택하는 데 더 잘 작동한다는 것을 발견했습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$('.date').each(function (e) {
    if ($(this).attr('disabled') != 'disabled') {
        $(this).attr('readOnly', 'true');
        $(this).css('cursor', 'pointer');
        $(this).css('color', '#5f5f5f');
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결 방법은 여기에 당신의 답이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 상자 컨트롤에서 사용자 입력을 제한한 경우 jquery를 사용하지 않을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; id=&quot;my_txtbox&quot; readonly /&amp;gt;  &amp;lt;!--HTML5--&amp;gt;

&amp;lt;input type=&quot;text&quot; id=&quot;my_txtbox&quot; readonly=&quot;true&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$(&quot;#my_txtbox&quot;.prop ('readonly', true)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매력적으로 작용했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 상자를 사용하는 대신 버튼을 사용할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 수동으로 날짜를 작성하지 않았으면 하는 저에게 가장 적합합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/h7zpq.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/h7zpq.gif&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 질문에 이미 답했고 대부분이 속성을 사용할 것을 제안했습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 단지 나의 시나리오를 공유하고 대답하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML &lt;strong&gt;요소&lt;/strong&gt;에 속성을 &lt;strong&gt;추가&lt;/strong&gt;한 후 이 속성을 &lt;strong&gt;동적&lt;/strong&gt;으로 만들 수 없다는 문제에 직면했습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 작성 시간에 둘 다로 설정을 시도하기도 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 나는 당신이 그것을 또한 설정하고 싶다면 사용하지 말 것을 제안할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#my_txtbox&quot;).datepicker({
    // options
});

$(&quot;#my_txtbox&quot;).keypress(function(event) {
    return ( ( event.keyCode || event.which ) === 9 ? true : false );
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키만 누를 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우회할 키 &lt;strong&gt;코드&lt;/strong&gt;를 더 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 두 가지를 모두 추가했고 여전히 양식을 제출하기 때문에 아래와 같은 코드입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제거 후에는 정상적으로 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://jsfiddle.net/shantaram/hd9o7eor/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://jsfiddle.net/shantaram/hd9o7eor/&lt;/font&gt;&lt;/a&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() {
  $('#id-checkbox').change( function(){
  	$('#id-input3').prop('required', $(this).is(':checked'));
  });
  $('#id-input3').datepicker();
  $(&quot;#id-input3&quot;).keypress(function(event) {
    return ( ( event.keyCode || event.which ) === 9 ? true : false );
});
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script src=&quot;https://code.jquery.com/ui/1.12.1/jquery-ui.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;link href=&quot;https://code.jquery.com/ui/jquery-ui-git.css&quot; rel=&quot;stylesheet&quot;/&amp;gt;

&amp;lt;form action='https://jsfiddle.net/'&amp;gt;
Name:  &amp;lt;input type=&quot;text&quot; name='xyz' id='id-input3' readonly='true' required='true'&amp;gt; 
    &amp;lt;input type='checkbox' id='id-checkbox'&amp;gt; Required &amp;lt;br&amp;gt;
    &amp;lt;br&amp;gt;
    &amp;lt;input type='submit' value='Submit'&amp;gt;
&amp;lt;/form&amp;gt;&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;&gt;Time picker의 ID(DatetimePicker의 ID)를 사용자의 ID로 바꿉니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 사용자가 키보드 입력을 더 이상 입력할 수 없지만, 시간 팝업에 액세스할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$(&quot;#my_txtbox&quot;).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;keypress(function(이벤트) {event.preventDefault();};&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 소스를 사용해 보십시오: https://github.com/jonthornton/jquery-timepicker/issues/109&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문은 오래된 답이 많고 읽기만 하는 것이 일반적으로 받아들여지는 해결책인 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 현대 브라우저에서 더 나은 접근방식은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;inputmode=&quot;none&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 입력 태그에서:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; ... inputmode=&quot;none&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 스크립트로 수행하는 것을 선호하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(selector).attr('inputmode', 'none');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트를 많이 해본 적은 없지만, 제가 사용했던 안드로이드 셋업에서는 잘 작동하고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우에는 제가 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;disableTextInput&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;소유물&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$( &quot;.datepicker&quot; ).datepicker({'dateFormat' : 'd-m-y', 'disableTextInput':true });
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 숨겨진 필드를 사용하여 값을 저장할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        &amp;lt;asp:HiddenField ID=&quot;hfDay&quot; runat=&quot;server&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$(&quot;#my_txtbox&quot;).datepicker ({ 옵션:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        onSelect: function (dateText, inst) {
            $(&quot;#&amp;lt;% =hfDay.ClientID %&amp;gt;&quot;).val(dateText);
        }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 날짜 선택기에서 날짜를 선택하고 텍스트 상자 안에 입력하지 않으려면 다음 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(function () {
    $(&quot;#datepicker&quot;).datepicker({ maxDate: &quot;-1D&quot; }).attr('readonly', 'readonly');
    $(&quot;#datepicker&quot;).readonlyDatepicker(true);

});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/153759/jquery-datepicker-with-text-input-that-doesnt-allow-user-input&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1631</guid>
      <comments>https://goodsource.tistory.com/1631#entry1631comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:42:00 +0900</pubDate>
    </item>
    <item>
      <title>C#을 사용한 MySQL에 대한 매개변수화된 쿼리</title>
      <link>https://goodsource.tistory.com/1630</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C#을 사용한 MySQL에 대한 매개변수화된 쿼리&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 코드가 있습니다(모든 관련 섹션이라고 생각되는 내용을 포함했습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private String readCommand = &quot;SELECT LEVEL FROM USERS WHERE VAL_1 = ? AND VAL_@ = ?;&quot;;
public bool read(string id)
{
    level = -1;
    MySqlCommand m = new MySqlCommand(readCommand);
    m.Parameters.Add(new MySqlParameter(&quot;&quot;, val1));
    m.Parameters.Add(new MySqlParameter(&quot;&quot;, val2));
    MySqlDataReader r = m.ExecuteReader();
    if (r.HasRows)
        level = Convert.ToInt32(r.GetValue(0).ToString());
    r.Close();
    return true;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 작업을 실행하면 첫 번째 매개 변수를 추가할 때 IndexOutOfBoundsException이 표시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 무엇을 잘못했지요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 이 방법을 사용해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private String readCommand = 
             &quot;SELECT LEVEL FROM USERS WHERE VAL_1 = @param_val_1 AND VAL_2 = @param_val_2;&quot;;

public bool read(string id)
{
    level = -1;
    MySqlCommand m = new MySqlCommand(readCommand);
    m.Parameters.AddWithValue(&quot;@param_val_1&quot;, val1);
    m.Parameters.AddWithValue(&quot;@param_val_2&quot;, val2);
    level = Convert.ToInt32(m.ExecuteScalar());
    return true;
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    MySqlConnection con = new MySqlConnection(&quot;server=localhost;User Id=root;database=result;password=1234&quot;);
    con.Open();

    MySqlCommand cmd = new MySqlCommand(&quot;Select * from users where username=?username and password=?password&quot;, con);
    cmd.Parameters.Add(new MySqlParameter(&quot;username&quot;, this.Login1.UserName));
    cmd.Parameters.Add(new MySqlParameter(&quot;password&quot;, this.Login1.Password)); 

    MySqlDataReader dr = cmd.ExecuteReader();
    if (dr.HasRows ==true)
    {
        e.Authenticated = true;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리에 명명된 매개 변수를 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;String readCommand = &quot;SELECT LEVEL FROM USERS WHERE VAL_1 = ?param1 AND VAL_2 = ?param2&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 MySqlParameter 개체를 다음과 같이 인스턴스화할 때 매개 변수 이름을 전달합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;m.Parameters.Add(new MySqlParameter(&quot;param1&quot;, val1));
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;m.Parameters.AddWithValue(&quot;parameter&quot;,value) 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수화된 쿼리의 경우 더 나은 옵션이 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySql은 아닌 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 클래스는 이름 없는 매개 변수를 지원합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하고 싶다면 Odbc 드라이버를 통해 MySql db에 액세스할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리의 매개 변수 이름을 지정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;SELECT LEVEL FROM USERS WHERE VAL_1 = @val1 AND VAL_2 = @val2;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수 지시자 &quot;@&quot;을 선택했지만 MySql의 최근 버전을 선택했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터는 &quot;@&quot;와 &quot;?&quot;를 모두 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 올바른 매개 변수 이름을 전달하도록 매개 변수 생성기를 업데이트합니다(여기에 매개 변수 표시기를 포함할 필요는 없지만).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;m.Parameters.Add(new MySqlParameter(&quot;val1&quot;, val1));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신. 이미 알고 계시거나, 토막글에서 누락된 것일 수도 있지만, ExecuteReader의 인스턴스에서 Read를 호출하는 것을 잊어버리신 것 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sql을 여러 번 실행하려면 다음 방법을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;conn.Open();
cmd.Connection = conn;

cmd.CommandText = &quot;INSERT INTO myTable VALUES(NULL, @number, @text)&quot;;
cmd.Prepare();

cmd.Parameters.AddWithValue(&quot;@number&quot;, 1);
cmd.Parameters.AddWithValue(&quot;@text&quot;, &quot;One&quot;);

for (int i=1; i &amp;lt;= 1000; i++)
{
    cmd.Parameters[&quot;@number&quot;].Value = i;
    cmd.Parameters[&quot;@text&quot;].Value = &quot;A string value&quot;;

    cmd.ExecuteNonQuery();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;처음에는 &quot;ExecuteNonQuery&quot;를 사용하지 않고 가짜 값으로 매개 변수를 추가한 다음 루프 안에서 실제 값을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 링크 참조: https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/652978/parameterized-query-for-mysql-with-c-sharp&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1630</guid>
      <comments>https://goodsource.tistory.com/1630#entry1630comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:51 +0900</pubDate>
    </item>
    <item>
      <title>scanf와 scanf_s의 차이</title>
      <link>https://goodsource.tistory.com/1629</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;scanf와 scanf_s의 차이&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사이의 차이점은 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf_s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;? 저는 대학교에서 배우고 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 하지만 제 개인 컴퓨터인 비주얼 스튜디오에서는 계속 경고를 보내고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나는 모든 것을 바꿔야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf_s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로그램이 구축되지 않을 겁니다&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(Visual Studio 2013을 사용하고 있습니다)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 특히 마이크로소프트 컴파일러에 속하는 기능입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;scanf&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원래는 입력하는 콘솔 입력을 읽고 변수 유형에 할당합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 배열이 있는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;first_name[5]&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 당신은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;알렉스&quot;의 경우에는 문제가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 어레이를 가지고 있고 &quot;알렉산더&quot;를 할당하는 경우 어레이에 포함된 5개의 슬롯을 초과하는 것을 볼 수 있으므로 C는 어레이에 속하지 않는 메모리에 계속 기록하고 first_name에 속하지 않는 메모리 슬롯에 액세스하여 기록하려고 할 경우 프로그램이 충돌하거나 충돌하지 않을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기가 이 곳입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf_s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;들어옵니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;scanf_s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 버퍼 크기를 지정하고 실제로 입력의 한계를 제어하여 건물 전체를 충돌시키지 않을 수 있는 인수(파라미터)를 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;scanf_s()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C99 표준(또는 이전 표준)에 의해 설명되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C99(또는 이전)를 대상으로 하는 컴파일러를 사용하려면 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C11 Standard(그리고 나중에는 C11 Standard)의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf_s()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보다 사용하기가 훨씬 어렵습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버퍼 오버플로에 대한 보안을 개선합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C11&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fscanf_s()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;: http://port70.net/ ~&lt;a href=&quot;http://port70.net/~nsz/c/c11/n1570.html#K.3.5.3.2&quot;&gt;nsz/c/c11/n1570.html#K.3.5.3.2&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;~~~~~~~~~~~~~~~~&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 C99 컴파일러를 가지고 있다면 다음을 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf_s()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장자로서 휴대성을 잃지 말고 컴파일러 문서를 확인해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 오류를 방지하려면 &amp;lt;&amp;gt;: &amp;lt;_CRT_SECure_NO_WARNINGS&amp;gt; 사이의 항목을 한 자리에 붙여넣는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;솔루션 탐색기에서 프로젝트를 클릭하고 속성을 클릭하면 해당 장소로 바로 이동할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 구성 속성으로 이동한 다음 c/c++, 전처리기로 이동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 전처리기 정의에서, 모든 것이 끝난 후에, 세미콜론을 추가하고 그것을 붙여넣습니다. 그런 다음 apply를 누르고 ok를 누릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 문제는 해결되어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/21434735/difference-between-scanf-and-scanf-s&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1629</guid>
      <comments>https://goodsource.tistory.com/1629#entry1629comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:44 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 데이터베이스에 255 char 이상 저장하는 방법?</title>
      <link>https://goodsource.tistory.com/1628</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 데이터베이스에 255 char 이상 저장하는 방법?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL의 텍스트 필드만 255로 설정됩니다. 255자 이상의 데이터를 저장하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 5.0.3 이전의 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/char.html&quot; rel=&quot;noreferrer&quot;&gt;VARCHAR&lt;/a&gt;는 255자까지만 저장할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최대 65535자(64KB)를 저장하려면 &lt;strong&gt;TEXT&lt;/strong&gt; 열을 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최대 16777216(16MB) 문자를 저장하려면 &lt;strong&gt;미디엄&lt;/strong&gt; 텍스트 열을 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최대 4294967296자(4GB)를 저장하려면 LONG &lt;strong&gt;TEXT&lt;/strong&gt; 열을 사용합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용에 대한 주의 사항은 설명서의 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html&quot; rel=&quot;noreferrer&quot;&gt;스토리지 요구&lt;/a&gt; 사항 섹션을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;5.0.3 이후 버전의 MySQL은 VARCHAR에 최대 65535 문자를 저장할 수 있습니다(단, 65535 바이트 이상을 한 행에 저장할 수 없습니다).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TEXT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 유형:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE t_text (value TEXT NOT NULL);

INSERT
INTO    t_text
SELECT  RPAD('', 1000, '*');

SELECT  LENGTH(value)
FROM    t_text;

---

1000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 유형을 varchar로 변경합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 4.0 -- 문자열 유형의 최대 길이 저장소(바이트):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CHAR(255); 
VARCHAR(255); 
TINYBLOB, TINYTEXT &amp;lt; 2^8; 
BLOB, TEXT &amp;lt; 2^16; 
MEDIUMBLOB, MEDIUMTEXT &amp;lt; 2^24; 
LONGBLOB, LONGTEXT &amp;lt; 2^32; 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;나는 URL 링크&lt;/strong&gt;를 저장하기 &lt;strong&gt;위해&lt;/strong&gt; VARCHAR(255)를 가지고 있었고 사용자는 MySql 5.7 아래에서 ~300자의 링크를 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;VARCHAR(1024)&lt;/strong&gt;로 전환하면 잘 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/1476987/how-to-store-more-than-255-char-in-mysql-database&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1628</guid>
      <comments>https://goodsource.tistory.com/1628#entry1628comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:38 +0900</pubDate>
    </item>
    <item>
      <title>C#에서 XML 파일을 읽고 구문 분석하려면 어떻게 해야 합니까?</title>
      <link>https://goodsource.tistory.com/1627</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C#에서 XML 파일을 읽고 구문 분석하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C#에서 XML 파일을 읽고 구문 분석하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열 또는 파일에서 XML을 읽을 수 있는 XmlDocument.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;using System.Xml;

XmlDocument doc = new XmlDocument();
doc.Load(&quot;c:\\temp.xml&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;doc.LoadXml(&quot;&amp;lt;xml&amp;gt;something&amp;lt;/xml&amp;gt;&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 아래 노드를 찾으세요. 이렇게.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;XmlNode node = doc.DocumentElement.SelectSingleNode(&quot;/book/title&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;foreach(XmlNode node in doc.DocumentElement.ChildNodes){
   string text = node.InnerText; //or loop through its children as well
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 노드 안의 텍스트를 이렇게 읽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;string text = node.InnerText;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성을 읽거나&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;string attr = node.Attributes[&quot;theattributename&quot;]?.InnerText
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성이 존재하지 않으면 null이 되므로 [&quot;something&quot;]에서 항상 null을 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml-overview&quot; rel=&quot;noreferrer&quot;&gt;LINQ에서 XML&lt;/a&gt;&lt;/strong&gt;로의 예:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@&quot;C:\contacts.xml&quot;);


// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants(&quot;contact&quot;)
            where (int)c.Attribute(&quot;id&quot;) &amp;lt; 4
            select c.Element(&quot;firstName&quot;).Value + &quot; &quot; +
                   c.Element(&quot;lastName&quot;).Value;


foreach (string name in query)
{
    Console.WriteLine(&quot;Contact's Full Name: {0}&quot;, name);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;참조&lt;/strong&gt;: MSDN에서 &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml-overview&quot; rel=&quot;noreferrer&quot;&gt;XML로의 LINQ&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 제가 xml 사이트 맵을 읽기 위해 작성한 응용 프로그램입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Windows.Forms; 
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;

namespace SiteMapReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(&quot;Please Enter the Location of the file&quot;);

            // get the location we want to get the sitemaps from 
            string dirLoc = Console.ReadLine();

            // get all the sitemaps 
            string[] sitemaps = Directory.GetFiles(dirLoc);
            StreamWriter sw = new StreamWriter(Application.StartupPath + @&quot;\locs.txt&quot;, true);

            // loop through each file 
            foreach (string sitemap in sitemaps)
            {
                try
                {
                    // new xdoc instance 
                    XmlDocument xDoc = new XmlDocument();

                    //load up the xml from the location 
                    xDoc.Load(sitemap);

                    // cycle through each child noed 
                    foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                    {
                        // first node is the url ... have to go to nexted loc node 
                        foreach (XmlNode locNode in node)
                        {
                            // thereare a couple child nodes here so only take data from node named loc 
                            if (locNode.Name == &quot;loc&quot;)
                            {
                                // get the content of the loc node 
                                string loc = locNode.InnerText;

                                // write it to the console so you can see its working 
                                Console.WriteLine(loc + Environment.NewLine);

                                // write it to the file 
                                sw.Write(loc + Environment.NewLine);
                            }
                        }
                    }
                }
                catch { }
            }
            Console.WriteLine(&quot;All Done :-)&quot;); 
            Console.ReadLine(); 
        }

        static void readSitemap()
        {
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빈 붙여넣기 코드 http://pastebin.com/yK7cSNeY&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 가지 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml Serializer.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;읽을 대상 스키마가 있는 클래스를 사용합니다. XmlSerializer를 사용하여 Xml의 데이터를 클래스 인스턴스로 로드합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Linq 2 xml&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml 텍스트 판독기.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml 문서&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XPath Document(읽기 전용 액세스&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터셋을 사용하여 XML 문자열을 읽을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정보 제공을 위해 이 글을 올립니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 중 하나를 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx&quot; rel=&quot;noreferrer&quot;&gt;XmlSerializer 클래스&lt;/a&gt; 사용&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx&quot; rel=&quot;noreferrer&quot;&gt;XmlDocument 클래스&lt;/a&gt; 사용&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제는 제공된 msdn 페이지에 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb308960.aspx&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML에 연결합니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;VB도.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NET은 C#보다 컴파일러를 통한 xml 구문 분석 지원이 훨씬 뛰어납니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택권과 욕구가 있다면 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms364068.aspx#vb9overview_topic6&quot; rel=&quot;noreferrer&quot;&gt;확인해보세요.&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.xml.xmltextreader(v=vs.110).aspx&quot; rel=&quot;nofollow noreferrer&quot;&gt;XmlTextReader&lt;/a&gt; 클래스를 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원하는 장소에 따라 다른 방법이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XmlDocument는 XDocument보다 가볍지만 문자열에 XML이 포함되어 있는지 최소한으로 확인하려는 경우 정규식이 가능한 가장 빠르고 가벼운 선택이 될 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, API에 대해 SpecFlow를 사용하여 Smoke Tests를 구현했는데 유효한 XML의 결과 중 하나를 테스트하고 정규식을 사용하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이 XML에서 값을 추출해야 한다면 XDocument로 구문 분석하여 더 빠르고 코드를 적게 사용하고자 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 큰 XML로 작업해야 하는 경우 XmlDocument를 사용할 것입니다(그리고 때로는 1M 행 정도인 XML로 작업할 때도 있습니다). 그러면 한 줄씩 읽을 수도 있습니다. 왜 그럴까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Visual Studio에서 800MB 이상의 개인 바이트를 열어 보십시오. 운영 환경에서도 2GB 이상의 개체가 있으면 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 잘 할 수 있지만, 그렇게 해서는 안됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행이 많이 포함된 문서를 구문 분석해야 하는 경우 이 문서는 CSV일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XDocument의 예시를 많이 보기 때문에 이 코멘트를 작성하게 되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XDocument는 큰 문서나 XML 내용이 유효한지만 확인하려는 경우에는 적합하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 자체가 의미가 있는지 확인하려면 Schema가 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 또한 제안된 답변에 대해 반대 의견을 내놨는데, 그 이유는 그것 자체가 위의 정보를 필요로 한다고 생각하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시간당 10번씩 200M의 XML이 유효한지 확인해야 한다고 생각해보세요. XDocument는 많은 자원을 낭비할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;prasanna venkatesh는 또한 문자열을 데이터셋에 채우도록 시도할 수 있으며, 이것은 또한 유효한 XML을 나타낼 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 코드 라인이 거의 없는 xml 파일을 구문 분석하는 오픈 소스 라이브러리인 &lt;a href=&quot;https://www.nuget.org/packages/ChoETL.NETStandard&quot; rel=&quot;nofollow noreferrer&quot;&gt;Cinchoo ETL&lt;/a&gt;을 사용한 또 다른 접근 방식입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;using (var r = ChoXmlReader&amp;lt;Item&amp;gt;.LoadText(xml)
       .WithXPath(&quot;//item&quot;)
      )
{
    foreach (var rec in r)
        rec.Print();
}

public class Item
{
    public string Name { get; set; }
    public string ProtectionLevel { get; set; }
    public string Description { get; set; }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;샘플 fiddle: https://dotnetfiddle.net/otYq5j&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;면책 사항:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 도서관의 저자입니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;public void ReadXmlFile()
{
    string path = HttpContext.Current.Server.MapPath(&quot;~/App_Data&quot;); // Finds the location of App_Data on server.
    XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, &quot;XMLFile7.xml&quot;)); //Combines the location of App_Data and the file name
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                break;
            case XmlNodeType.Text:
                columnNames.Add(reader.Value);
                break;
            case XmlNodeType.EndElement:
                break;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫 번째 문을 피하고 XmlTextReader의 생성자에서 경로 이름만 지정할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 파일에서 특정 값을 검색하려는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; XmlDocument _LocalInfo_Xml = new XmlDocument();
            _LocalInfo_Xml.Load(fileName);
            XmlElement _XmlElement;
            _XmlElement = _LocalInfo_Xml.GetElementsByTagName(&quot;UserId&quot;)[0] as XmlElement;
            string Value = _XmlElement.InnerText;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/642293/how-do-i-read-and-parse-an-xml-file-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>XML</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1627</guid>
      <comments>https://goodsource.tistory.com/1627#entry1627comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:32 +0900</pubDate>
    </item>
    <item>
      <title>특급 JS내의 여만</title>
      <link>https://goodsource.tistory.com/1626</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특급 JS내의 여만&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 아직도 Yeoman과 Express의 예를 들어보고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다음을 시도해 보았는데 &quot;좋아요&quot;라는 반응을 보았지만, 저는 경로를 병합하는 데 어려움을 겪고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(가독성을 위해 지나치게 단순화됨)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mkdir test
cd test
express
mkdir app
cd app
mkdir js
cd js
yeoman angular
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 Gruntfile.js에서 &quot;output:dist&quot;를 &quot;output:../..public&quot;으로 변경했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 두 서버 모두 자체적으로 잘 실행됩니다(예: yeoman server 및 node app.js).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금 'yoman build'를 실행하여 express 앱에서 /public에 minimated JS를 출력할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;경로가 어떻게 합쳐질지 좀 애매한데요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;급행 노선이 아닌 Angular 노선을 올리려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;github의 angular-express-seed 예제들은 괜찮아 보이지만, 저는 여전히 Yeoman이 프로젝트에 통합되기를 원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 제안이든 감사히 받겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요먼 + expressjs의 경우 이 구조를 추천합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mkdir app
cd app
yeoman angular
express .
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 당신의 dir 트리는 이렇게 보여야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.
├── app
│&amp;nbsp;&amp;nbsp; ├── 404.html
│&amp;nbsp;&amp;nbsp; ├── favicon.ico
│&amp;nbsp;&amp;nbsp; ├── index.html
│&amp;nbsp;&amp;nbsp; ├── robots.txt
│&amp;nbsp;&amp;nbsp; ├── scripts
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── controllers
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── main.js
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── vendor
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── angular.js
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── angular.min.js
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── es5-shim.min.js
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── json3.min.js
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── yeoman-test.js
│&amp;nbsp;&amp;nbsp; ├── styles
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── main.css
│&amp;nbsp;&amp;nbsp; └── views
│&amp;nbsp;&amp;nbsp;     └── main.html
├── app.js
├── Gruntfile.js
├── package.json
├── public
│&amp;nbsp;&amp;nbsp; ├── images
│&amp;nbsp;&amp;nbsp; ├── javascripts
│&amp;nbsp;&amp;nbsp; └── stylesheets
│&amp;nbsp;&amp;nbsp;     └── style.css
├── routes
│&amp;nbsp;&amp;nbsp; ├── index.js
│&amp;nbsp;&amp;nbsp; └── user.js
├── test
│&amp;nbsp;&amp;nbsp; ├── lib
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── angular-mocks.js
│&amp;nbsp;&amp;nbsp; └── spec
│&amp;nbsp;&amp;nbsp;     └── controllers
│&amp;nbsp;&amp;nbsp;         └── main.js
├── testacular.conf.js
└── views
    ├── index.jade
    └── layout.jade
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 중복된 것을 제거할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;public&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디렉토리(Directory).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rm -rf public
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 지금은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 정적 파일을 서비스할 dir를 변경해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 줄 변경:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.use(express.static(path.join(__dirname, 'public')));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 항목에 대해:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.use(express.static(path.join(__dirname, 'app')));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 그 정도는 되어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 두 개의 &quot;인덱스&quot; 파일이 있다는 점에서 한 가지 주의할 점이 있습니다. 하나는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;views/index.jade&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다른 하나는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app/index.html&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 제거하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app/index.html&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재는 여만을 깨뜨리고 있으므로, 나의 조언은 길을 없애라는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app/index.jade&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 약간 다른 설정이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;yo angular
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Gruntfile.js를 업데이트하여 구성을 'app'에서 'public'으로 변경합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그다음에 하오&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;express .
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;app.js를 열고 이 app.get ('/', routes와 같은 경로 매핑이 없는지 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;색인);&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;노드 서버가 실제로 &quot;그룬트 서버&quot;를 실행할 때 로드되는 파일과 동일한 index.html을 제공하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 공용 디렉토리를 삭제한 다음 앱 디렉토리를 공용으로 이동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rm -rf public
mv app public
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 프로젝트는 모든 요구 사항을 포함하는 것 같습니다(MongoDB에 대한 옵션 지원도 포함되어 있음). https://github.com/DaftMonk/generator-angular-fullstack&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방금 현지에서 시도해봤는데 효과가 있네요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;npm install -g generator-angular-fullstack

yo angular-fullstack [appname]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 GitHub 페이지를 참고하세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 내가 평판이 있다면 @btford의 답변에 대해 논평할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치를 추가하고 싶었을 뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;express .&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;끝나고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yo angular&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;grunt-created 패키지를 덮어씁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@jperezaguinaga 가 보고한대로 grunt를 깰 json 파일.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;패키지 사본을 꼭 저장해 두십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치하기 전 json&lt;/font&gt;&lt;/font&gt;&lt;code&gt;express .&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그런 다음 원래 패키지에 다음 종속성을 추가합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;json:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;dependencies&quot; : { 
  &quot;express&quot;: &quot;3.3.4&quot;,
  &quot;jade&quot;: &quot;*&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 솔루션에 문제가 있습니다. express는 여전히 index.html 대신 index.jade를 로드하려고 하지만 localhost:3000/index.html express render를 올바르게 입력하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;app.js에서 이 줄을 제거하는 것을 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//app.get('/', routes.index);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공유해줘서 고마워, D.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 다른 사람들이 이전에 제안한 단계이지만 모두 번호가 매겨진 단계의 모음입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전을 기준으로 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여만 1.0.4 &amp;amp; 익스프레스 3.3.8&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1) 프로젝트 디렉토리와 cd를 작성합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2) 설치 각도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;yo angular
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(su에 로그인하지 않은 경우 다음 두 줄을 실행해야 함)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;bower install
sudo npm install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3) 패키지 이름을 바꿉니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;json to package_yo.json (따라서 express' 버전의 package.json에서 덮어쓰지 않습니다)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4) Express Express -cless -Hs 설치(또는 원하는 기타 Express 옵션 설치)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo npm install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;5) Express' public 디렉토리를 삭제하고 Express' app.js: app.use(require('less-middleware')({ src: &lt;em&gt;_dirname &lt;/em&gt;+ &lt;em&gt;'/app'}), app.&lt;/em&gt;use&lt;em&gt;(express.static(path.join(&lt;/em&gt;_dirname, 'app'))의 경로에 대해 'public'을 'app'으로 변경합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;6) express' 기본 경로( app.get('/', 경로)를 삭제합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;index); ) (이제 express는 angular의 /app 폴더에 지정된 경로를 대신 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;7) 서버 시작 npm 시작&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(그럼 요만의 웰컴페이지는 localhost:3000/에서 보실 수 있습니다.)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/14106248/yeoman-inside-expressjs&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularjs</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1626</guid>
      <comments>https://goodsource.tistory.com/1626#entry1626comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:22 +0900</pubDate>
    </item>
    <item>
      <title>가입 대 WHERE의 Oracle SQL 쿼리 필터</title>
      <link>https://goodsource.tistory.com/1625</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가입 대 WHERE의 Oracle SQL 쿼리 필터&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;내측 접합부&lt;/em&gt;의 경우 필터 적용 성능에 차이가 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JOIN ON&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조항이나.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WHERE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조항?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 것이 더 효율적일까요, 아니면 옵티마이저가 그들을 동등하게 만들까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가입&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
AND d.name         = 'IT'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어디에&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
WHERE d.name       = 'IT'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 11gR2&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차이가 없어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵티마이저는 두 경우 모두 동일한 계획을 생성해야 하며, 특정 쿼리에 대한 가장 효율적인 접근 방식이 무엇인지에 따라 두 경우 모두에서 결합 전, 후 또는 결합 중에 술어를 적용할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 일반적으로 옵티마이저가 무엇인가를 할 &lt;em&gt;수&lt;/em&gt; 있다는 사실이 특정 쿼리에서 옵티마이저가 &lt;em&gt;실제로&lt;/em&gt; 무엇인가를 한다는 보장은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리가 복잡해짐에 따라 가능한 모든 쿼리 계획을 철저히 고려하는 것이 불가능해집니다. 즉, 완벽한 정보와 완벽한 코드가 있더라도 최적화자는 원하는 모든 작업을 수행할 시간이 없을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 쿼리에 대해 생성된 실제 계획이 실제로 일치하는지 확인해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 필터 기준을 에 넣는 것을 선호합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;where&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 웨어하우스 쿼리의 경우, 필터 조건을 조인에 넣으면 쿼리가 상당히 오래 지속되는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, [&lt;em&gt;&lt;strong&gt;날짜&lt;/strong&gt;&lt;/em&gt;] 필드별로 색인된 [&lt;em&gt;&lt;strong&gt;표&lt;/strong&gt;&lt;/em&gt; 1]과 [&lt;em&gt;&lt;strong&gt;파티션&lt;/strong&gt;&lt;/em&gt;] 필드별로 구분된 [&lt;em&gt;&lt;strong&gt;표&lt;/strong&gt;&lt;/em&gt; 2]가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;표 &lt;em&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/em&gt;는 쿼리에서 가장 큰 표이며 다른 데이터베이스 서버에 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;&lt;strong&gt;driving_site&lt;/strong&gt;&lt;/em&gt; hint를 사용하여 옵티마이저에게 표 &lt;em&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/em&gt; 파티션을 사용하도록 지시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select /*+driving_site(b)*/ a.key, sum(b.money) money
  from schema.table1 a
  join schema2.table2@dblink b
    on a.key = b.key
 where b.partition = to_number(to_char(:i,'yyyymm'))
   and a.date = :i
 group by a.key`
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 식으로 쿼리를 하면 결과를 반환하는 데 30~40초 정도 걸립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 식으로 질의를 하지 않으면 결과 없이 실행을 취소할 때까지 10분 정도 걸립니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/25330234/oracle-sql-query-filter-in-join-on-vs-where&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1625</guid>
      <comments>https://goodsource.tistory.com/1625#entry1625comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:15 +0900</pubDate>
    </item>
    <item>
      <title>ODBC ExecuteNonQuery()가 중단됨</title>
      <link>https://goodsource.tistory.com/1624</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ODBC ExecuteNonQuery()가 중단됨&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재미있는 문제가 생겼어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;INSERT 명령과 UPDATE 명령을 데이터베이스에 실행하는 데이터 커넥터가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 때때로 모든 것이 정상적으로 실행되고 쿼리가 삽입되지만 ExecuteNonQuery 메서드가 중지되고 데이터 커넥터가 중지되며 예외가 발생하지 않으며 시간 초과도 발생하지 않는다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 조각이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    OdbcCommand insertCommand = dbConnection.CreateCommand();

    insertCommand.CommandText = @&quot;INSERT INTO `table` 
                    (name, creation, modified, modified_by)
                    VALUES (
                    ?, ?, ?, ?)&quot;;

    insertCommand.Parameters.AddWithValue(&quot;@name&quot;, operation.ExternalProductionOrderLineOperationId);
    insertCommand.Parameters.AddWithValue(&quot;@produced_qty&quot;, Convert.ToDecimal(operation.Quantity));
    insertCommand.Parameters.AddWithValue(&quot;@product_operation_type&quot;, productionOrder.ProductOperationType);
    insertCommand.Parameters.AddWithValue(&quot;@product_articulus&quot;, productionOrder.ProductArticulus);

    _logger.LogInformation(&quot;Operacija paruosta exportinimui!&quot;); &amp;lt;----------- THIS IS THE PLACE, sometimes it runs okey, sometimes it freezes

    try
    {
        var n = insertCommand.ExecuteNonQuery();

        if (n != 0)
        {
            await UpdateProductionOrderLineOperation(productionOrder, operation, true);
            _logger.LogInformation(&quot;operation nr: {x} exported&quot;, counter);
        }
        else
        {
            _logger.LogInformation(&quot;operation nr: {x} failed to export&quot;);
        }
    }
    catch (InvalidOperationException e)
    {
        _logger.LogInformation(&quot;InvalidOperationException: {x}&quot;, e.ToString());
    }
    catch (Exception e)
    {
        _logger.LogInformation(&quot;Exception: {x}&quot;, e.ToString());
    }
}
catch (OdbcException e)
{
    _logger.LogInformation(&quot;OdbcException: {x}&quot;, e.ToString());
}
catch (Exception e)
{
    _logger.LogInformation(&quot;Exception: {x}&quot;, e.ToString());
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드 줄을 블록을 사용하여 입력합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제가 해결될 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;van = insert명령어를 입력합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비쿼리 실행();&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 시도 블록을 Odbc 명령 위에 놓거나 연결을 열 때 더 낫습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러분이 경험하고 있는 오류는 예외 처리 전에 발생하기 때문에 앱이 망가지는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/67049911/odbc-executenonquery-hangs&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1624</guid>
      <comments>https://goodsource.tistory.com/1624#entry1624comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:08 +0900</pubDate>
    </item>
    <item>
      <title>MySQL Workbench 호환되지 않는/비표준 서버</title>
      <link>https://goodsource.tistory.com/1623</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL Workbench 호환되지 않는/비표준 서버&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL을 사용하는 것이 처음이라 학교에서 다운로드해야 했는데, 계속 오류 메시지가 나타납니다(아래 사진).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 xampp를 사용하고 있고 사용자 이름 root을 사용하여 연결하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포트 또한 나에게 말해주는 것과 일치합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진행은 가능하지만 기능이 많이 빠져있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호환되지 않는/표준이 아닌 서버 버전 또는 연결 프로토콜이 탐지되었습니다(10.0.10).&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 데이터베이스에 대한 연결은 설정할 수 있지만 데이터베이스가 지원되는 MySQL 버전과 완전히 호환되지 않으므로 일부 MySQL Workbench 기능이 제대로 작동하지 않을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL Workbench는 MySQL Server 버전 5.1, 5.5, 5.6 및 5.7용으로 개발 및 테스트되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/hLDgw.png&quot; alt=&quot;PICTURE HERE&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 보기에 당신은 최신 XAMPP를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;MySQL Workbench&lt;/strong&gt;를 연 후 새로운 연결을 설정하는 대신 &lt;strong&gt;Ctrl+R&lt;/strong&gt;을 누르거나 상단 &lt;strong&gt;메뉴의 DATABAST 탭&lt;/strong&gt;을 클릭하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Reverse Engineer&lt;/strong&gt;를 선택하고 필요한 정보를 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 가셔도 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySql 워크벤치가 충돌하거나 호환성 문제가 나타나지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 버전의 XAMPP는 MySQL 대신 MariaDB를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL Workbench는 &lt;a href=&quot;https://stackoverflow.com/questions/33927871/mysql-workbench-6-3-5-crashes-when-opening-xampp-mysql-local-database&quot;&gt;MySQL과 함께 작동하도록 설계&lt;/a&gt;되어 있으며, MariaDB의 교체가 매우 유사하지 않기 때문에 문제가 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 MySQL Workbench를 XAMPP와 함께 사용하고 싶다면 MySQL을 사용하는 XAMPP의 &lt;em&gt;마지막&lt;/em&gt; 버전을 설치해 보는 것이 해결책이 될 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 버전은 아마 (2014년 8월?)의 1&lt;a href=&quot;http://code.stephenmorley.org/articles/xampp-version-history-apache-mysql-php/&quot; rel=&quot;noreferrer&quot;&gt;.8.3&lt;/a&gt; 버전일 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 다운로드할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XAMPP 소스가 이전 버전을 위조합니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB를 사용하는 최신 XAMPP를 사용하는 경우 MySQL Workbench에서 'Connect to Database'를 사용하지 말고 'Reverse Engineer'를 사용하고 필요한 자격 증명을 제공하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그게 다에요, 번거롭지 마세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전 6.3.7(빌드 1199)의 &lt;strong&gt;MySQL Workbench가 충돌&lt;/strong&gt;하는 것과 같은 메시지가 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책을 찾지 못했지만 다음은 해결 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼을 누르시면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Continue anyway&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 데이터베이스를 열기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use toto&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그런 다음(제 경우에는 1분이면 충분합니다) 잠시 기다렸다가 충돌 없이 쿼리를 호출할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;https://bugs.mysql.com/bug.php?id=76909&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;&gt;WAMP 3.2.0에서도 같은 실험을 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB는 포트 3306(일반 MySQL 포트)을 수신하도록 구성되었으며 MySQL 8은 포트 3308에서 수신합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 경우라면 DB가 2개라는 사실에 속지 마세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 해결하기 위해서는 원하는 DB를 선택해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL을 원했고 MySQL WorkBench에 포트 3308에서 MySQL에 대한 연결을 열도록 요청했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL Workbench를 버리고 MariaDB용 브라우저를 사용하면 무료 버전이 제공됩니다. https://www.upscene.com/downloads/dbw&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 능력에 한계가 있지만, 연결하고 탐색하는 데는 문제가 없었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Denwer&lt;/strong&gt;를 동시에 사용하고 있어서 비슷한 문제가 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제 해결 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;덴어 저지&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 서버 재시작&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수익! 이제 Workbench에서 데이터베이스를 열 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 아이디어는 denwer가 MySQL이 정상적으로 시작할 수 없게 하는 로컬 서버를 시작하고 있었다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL과 동시에 denwer를 사용하려면 MySQL(포인트 4) 다음에 시작하면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우에는 XAMPP 설치 전에 MySql 서버와 워크벤치를 이미 설치하고 설정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존 설정을 계속 진행하고 싶었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XAMPP로 MySql 서버도 설치했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XAMPP 내부에서 mysql을 시작했는데 MySql Workbench에 접속했을 때 같은 오류가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워크벤치가 XAMPP와 함께 설치된 서버와 연결하려고 했기 때문에 호환되지 않는 것으로 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 나는 mysql을 XAMPP에서 중지하고 수동으로 mysql 서버를 시작했습니다(이전 설정 및 설치된 서버).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;window에서 수동으로 mysql을 시작하는 방법에 대해서는 &lt;a href=&quot;https://stackoverflow.com/questions/1509148/how-to-start-mysql-server-on-windows-xp#:%7E:text=To%20start%20the%20mysqld%20server,of%20MySQL%20on%20your%20system&quot;&gt;이&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/45394509/installing-and-integrating-xampp-with-an-existing-mysql-server&quot;&gt;기존 SqlServer를 사용하도록 XAMPP를 구성&lt;/a&gt;할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 저도 같은 문제가 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저에게는 어떤 방법도 통하지 않았지만, 그 후 제 MariaDB가 같은 포트를 사용하고 있다는 것을 알게 되었고, 그것을 제거하여 문제를 해결했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 같은 문제가 있었는데, XAMPP config 파일에서 mysql server port를 3306에서 3308로 변경했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[mysqld] 포트=3308&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/35376109/mysql-workbench-incompatible-nonstandard-server&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1623</guid>
      <comments>https://goodsource.tistory.com/1623#entry1623comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:41:01 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스의 양식을 사용하여 파일 업로드</title>
      <link>https://goodsource.tistory.com/1622</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워드프레스의 양식을 사용하여 파일 업로드&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워드프레스 테마의 업로드라는 폴더에 파일을 업로드하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 파일을 업로드 하지 않고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누가 도와줄 수 있습니까? 아래는 제 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 코드&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
    &amp;lt;input type=&quot;file&quot; name=&quot;file&quot;&amp;gt;
    &amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[upload]&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 함수 숏코드의 php 코드입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;php 파일&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;functions upload ()
{
$file = $_FILES['file'];
$name = $file['name'];
$path = &quot;/uploads/&quot; . basename($name);
if (move_uploaded_file($file['tmp_name'], $path)) {
    echo &quot; Move succeed&quot;;
} else {
 echo &quot; Move failed. Possible duplicate?&quot;;
}
}

add_shortcode('upload','upload');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 기능을 사용해 보세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 내용을 정의합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;function.php&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
function upload_user_file( $file = array() ) {

    require_once( ABSPATH . 'wp-admin/includes/admin.php' );

      $file_return = wp_handle_upload( $file, array('test_form' =&amp;gt; false ) );

      if( isset( $file_return['error'] ) || isset( $file_return['upload_error_handler'] ) ) {
          return false;
      } else {

          $filename = $file_return['file'];

          $attachment = array(
              'post_mime_type' =&amp;gt; $file_return['type'],
              'post_title' =&amp;gt; preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
              'post_content' =&amp;gt; '',
              'post_status' =&amp;gt; 'inherit',
              'guid' =&amp;gt; $file_return['url']
          );

          $attachment_id = wp_insert_attachment( $attachment, $file_return['url'] );

          require_once(ABSPATH . 'wp-admin/includes/image.php');
          $attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
          wp_update_attachment_metadata( $attachment_id, $attachment_data );

          if( 0 &amp;lt; intval( $attachment_id ) ) {
            return $attachment_id;
          }
      }

      return false;
}
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 쓰면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &amp;lt;?php
    if(isset($_POST['upload']))
    {
       if( ! empty( $_FILES ) ) 
       {
          $file=$_FILES['file'];
          $attachment_id = upload_user_file( $file );

       }
    }
    ?&amp;gt;

&amp;lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
    &amp;lt;input type=&quot;file&quot; name=&quot;file&quot;&amp;gt;
    &amp;lt;input type=&quot;submit&quot; name=&quot;upload&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 정의 폴더에 업로드하고 싶다면 이 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 함수를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;functions.php&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function upload_user_file( $file = array(),$path ) {
    if(!empty($file)) 
    {


        $upload_dir=$path;
        $uploaded=move_uploaded_file($file['tmp_name'], $upload_dir.$file['name']);
        if($uploaded) 
        {
            echo &quot;uploaded successfully &quot;;

        }else
        {
            echo &quot;some error in upload &quot; ;print_r($file['error']);  
        }
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;형체를 짓다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;template file&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것처럼.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
    &amp;lt;input type=&quot;file&quot; name=&quot;file&quot;&amp;gt;
    &amp;lt;input type=&quot;submit&quot; name=&quot;upload&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전처럼 템플릿 파일로 업로드 기능 호출&lt;/font&gt;&lt;/font&gt;&lt;code&gt;get_header();&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(isset($_POST['upload']))
    {

       if( ! empty( $_FILES ) ) 
       {
          $file=$_FILES['file'];   // file array
          $upload_dir=wp_upload_dir();
          $path=$upload_dir['basedir'].'/myuploads/';  //upload dir.
          if(!is_dir($path)) { mkdir($path); }
          $attachment_id = upload_user_file( $file ,$path);

       }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/29445097/upload-file-using-a-form-in-wordpress&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1622</guid>
      <comments>https://goodsource.tistory.com/1622#entry1622comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:40:55 +0900</pubDate>
    </item>
    <item>
      <title>XML 하위 요소 추가</title>
      <link>https://goodsource.tistory.com/1621</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 하위 요소 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell을 사용하여 XML 트리에 여러 하위 요소를 추가하고자 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 요소를 추가하는 것은 알고, 하나 또는 여러 개의 속성을 추가하는 것은 알고 있지만, 여러 개의 요소를 추가하는 방법은 이해할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10524389/powershell-inserting-multiple-xml-elements&quot;&gt;하위 XML 트리를 텍스트로 쓰는&lt;/a&gt; 것도 한 가지 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 한 번에 요소가 추가되지 않아서 이 방법을 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지 요소를 추가하려면 다음과 같이 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[xml]$xml = get-content $nomfichier
$newEl = $xml.CreateElement('my_element')
[void]$xml.root.AppendChild($newEl)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잘 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 트리는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$xml | fc
class XmlDocument
{
  root =
    class XmlElement
    {
      datas =
        class XmlElement
        {
          array1 =
            [
              value1
              value2
              value3
            ]
        }
      my_element =     &amp;lt;-- the element I just added
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 'my_element'에 하위 요소를 추가하겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 비슷한 방법을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$anotherEl = $xml.CreateElement('my_sub_element')
[void]$xml.root.my_element.AppendChild($anotherEl) &amp;lt;-- error because $xml.root.my_element is a string
[void]$newEl.AppendChild($anotherEl)               &amp;lt;-- ok
$again = $xml.CreateElement('another_one')
[void]$newEl.AppendChild($again)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 다음과 같은 XML 트리를 제공합니다(부분적으로 표시됨).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;my_element =
  class XmlElement
  {
    my_sub_element =
    another_one =
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것들은 속성이지 하위 요소가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 요소는 다음과 같이 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;my_element =
  [
    my_sub_element
    another_one
  ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;질문&lt;/strong&gt;:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 요소를 한 번에 하나씩 추가하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 예를 살펴봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Document creation
[xml]$xmlDoc = New-Object system.Xml.XmlDocument
$xmlDoc.LoadXml(&quot;&amp;lt;?xml version=`&quot;1.0`&quot; encoding=`&quot;utf-8`&quot;?&amp;gt;&amp;lt;Racine&amp;gt;&amp;lt;/Racine&amp;gt;&quot;)

# Creation of a node and its text
$xmlElt = $xmlDoc.CreateElement(&quot;Machine&quot;)
$xmlText = $xmlDoc.CreateTextNode(&quot;Mach1&quot;)
$xmlElt.AppendChild($xmlText)

# Creation of a sub node
$xmlSubElt = $xmlDoc.CreateElement(&quot;Adapters&quot;)
$xmlSubText = $xmlDoc.CreateTextNode(&quot;Network&quot;)
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)

# Creation of an attribute in the principal node
$xmlAtt = $xmlDoc.CreateAttribute(&quot;IP&quot;)
$xmlAtt.Value = &quot;128.200.1.1&quot;
$xmlElt.Attributes.Append($xmlAtt)

# Add the node to the document
$xmlDoc.LastChild.AppendChild($xmlElt);

# Store to a file 
$xmlDoc.Save(&quot;c:\Temp\Temp\Fic.xml&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집됨&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비고 : &lt;a href=&quot;https://stackoverflow.com/questions/4822575/saving-an-xml-file-in-powershell-requires-complete-path-why&quot;&gt;저장에서 상대 경로를 사용하면 원하는 대로 사용&lt;/a&gt;할 수 &lt;a href=&quot;https://stackoverflow.com/questions/4822575/saving-an-xml-file-in-powershell-requires-complete-path-why&quot;&gt;없습니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 API를 이용하여 노드별로 구성하는 대신, 손으로 xml을 만드는 것을 선호합니다. iho는 손으로 훨씬 더 가독성이 높고 mainable이 될 것이기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$pathToConfig = $env:windir + &quot;\Microsoft.NET\Framework64\v4.0.30319\Config\web.config&quot;

$xml = [xml] (type $pathToConfig)

[xml]$appSettingsXml = @&quot;
&amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&quot;WebMachineIdentifier&quot; value=&quot;$webIdentifier&quot; /&amp;gt;
&amp;lt;/appSettings&amp;gt;
&quot;@


$xml.configuration.AppendChild($xml.ImportNode($appSettingsXml.appSettings, $true))
$xml.Save($pathToConfig)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드 샘플을 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML을 처음부터 만드는 데 필요한 모든 것을 갖추고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function addElement($e1, $name2, $value2, $attr2)
{
    if ($e1.gettype().name -eq &quot;XmlDocument&quot;) {$e2 = $e1.CreateElement($name2)}
    else {$e2 = $e1.ownerDocument.CreateElement($name2)}
    if ($attr2) {$e2.setAttribute($value2,$attr2)}
    elseif ($value2) {$e2.InnerText = &quot;$value2&quot;}
    return $e1.AppendChild($e2)
}

function formatXML([xml]$xml)
{
    $sb = New-Object System.Text.StringBuilder
    $sw = New-Object System.IO.StringWriter($sb)
    $wr = New-Object System.Xml.XmlTextWriter($sw)
    $wr.Formatting = [System.Xml.Formatting]::Indented
    $xml.Save($wr)
    return $sb.ToString()
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...이제 두 기능을 사용하여 새 XML-오브젝트를 생성하고 표시해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$xml = New-Object system.Xml.XmlDocument
$xml1 = addElement $xml &quot;a&quot;
$xml2 = addElement $xml1 &quot;b&quot;
$xml3 = addElement $xml2 &quot;c&quot; &quot;value&quot;
$xml3 = addElement $xml2 &quot;d&quot; &quot;attrib&quot; &quot;attrib_value&quot;

write-host `nFormatted XML:`r`n`n(formatXML $xml.OuterXml)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Formatted XML:

 &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&amp;gt;
&amp;lt;a&amp;gt;
  &amp;lt;b&amp;gt;
    &amp;lt;c&amp;gt;value&amp;lt;/c&amp;gt;
    &amp;lt;d attrib=&quot;attrib_value&quot; /&amp;gt;
  &amp;lt;/b&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방문하시는 분들을 위해서요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부모 문서에 네임스페이스가 있어서 문제가 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ImportNode&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빈 공간을 추가하고 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmnls=&quot;&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가져온 xml의 요소, 내 앱에 문제 발생&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 답변에 따라 확장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 해결하려면 상위 문서에서 네임스페이스가 설정된 더미 노드에 래핑합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$pathToConfig = $env:windir + &quot;\Microsoft.NET\Framework64\v4.0.30319\Config\web.config&quot;

$xml = [xml] (type $pathToConfig)
$root = $xml.get_DocumentElement()
$namespaceuri = $root.NamespaceURI

[xml]$appSettingsXml = @&quot;
&amp;lt;Dummy xmlns=&quot;$namespaceuri&quot;&amp;gt;
    &amp;lt;appSettings&amp;gt;
        &amp;lt;add key=&quot;WebMachineIdentifier&quot; value=&quot;$webIdentifier&quot; /&amp;gt;
    &amp;lt;/appSettings&amp;gt;
&amp;lt;/Dummy&amp;gt;
&quot;@


$xml.configuration.AppendChild($xml.ImportNode($appSettingsXml.Dummy.appSettings, $true))
$xml.Save($pathToConfig)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/10987318/adding-xml-sub-elements&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1621</guid>
      <comments>https://goodsource.tistory.com/1621#entry1621comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:40:47 +0900</pubDate>
    </item>
    <item>
      <title>FALSE와 TRUE의 이상한 정의, 왜?</title>
      <link>https://goodsource.tistory.com/1620</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FALSE와 TRUE의 이상한 정의, 왜?&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&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 &lt;b&gt;답변이 있습니다&lt;/b&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/17010041/why-define-true-1-1-in-a-c-boolean-macro-instead-of-simply-as-1&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순히 1이 아닌 C 부울 매크로에서 #define TRUE(1==1)를 사용하는 이유는 무엇입니까?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(8개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;닫힘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2013-10-14 12:49:28Z&quot;&gt;9년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 작업하고 있는 어떤 코드에서 저는 진실과 거짓에 대한 이상한 재정의를 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 수표를 좀 더 엄격하게 하기 위해 그런 것들을 본 적이 있지만, 제 마음에는 이 일이 좀 이상해서 누가 그런 정의를 내리는 데 적절한 이유가 무엇인지 말해줄 수 있는지 궁금합니다. 그 옆에 제 의견이 있는 아래를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define FALSE (1 != 1) // why not just define it as &quot;false&quot; or &quot;0&quot;?
#define TRUE (!FALSE)  // why not just define it as &quot;true&quot; or &quot;1&quot;?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드베이스에는 이상한 특이점들이 많이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 표준 유형에 대해 다음과 같은 재정의가 있는 것과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define myUInt32 unsigned integer // why not just use uint32_t from stdint?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 모든 작은 별난 소리들은 제가 무언가 명백한 것을 놓치고 있는 것처럼 느끼게 해주지만, 저는 정말 요점을 알 수가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;참고:&lt;/strong&gt; 엄밀하게는 c++ 코드이지만 'c' 프로젝트에서 포팅된 것일 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;휴대성&lt;/em&gt;이 목적인 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define FALSE (1 != 1) // why not just define it as &quot;false&quot; or &quot;0&quot;?
#define TRUE (!FALSE)  // why not just define it as &quot;true&quot; or &quot;1&quot;?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들은 이를 지원하는 언어(C++)에서 부울 형식을 사용하는 반면 그렇지 않은 언어에서는 여전히 사용 가능한 숫자 값을 제공합니다(명시적 부울 데이터 형식을 사용했음에도 불구하고 C - C99 및 C11까지 포함).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부울을 가능한 곳에 두는 것이 기능 과부하에 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define myUInt32 unsigned integer // why not just use uint32_t from stdint?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좋아요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stdint&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러분은 그런 것들을 당연하게 생각할지도 모르지만, 세상은 넓고 넓습니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드는 그것을 인식합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;면책 사항:&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개인적으로, 저는 표준을 고수하고 1990년 이후에 출시된 컴파일러가 필수 조건임을 간단히 언급하고자 &lt;em&gt;합니다&lt;/em&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 우리는 해당 프로젝트의 기본 요구사항이 무엇인지 모릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TRWTF는 문제가 된 코드의 작성자가 이에 대해 나란히 논평을 통해 설명하지 않았다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#define FALSE (1 != 1) // why not just define it as &quot;false&quot; or &quot;0&quot;?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 생각하기에는 표현의 &lt;em&gt;종류가&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(1!=1)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부울 값에 대한 언어 지원에 따라 다릅니다. C++인 경우 유형은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bool&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그렇지 않으면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반면에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 입니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 두 언어로, 그리고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서는 인식되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;엄밀하게는 c++ 코드이지만 'c' 프로젝트에서 포팅된 것일 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 앞서 언급한 것처럼 휴대성에 관한 것이지만, 실제로는 훨씬 이상입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;언어를 준수하기 위해&lt;/em&gt; 언어 정의를 교묘하게 이용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 황당해 보이는 매크로들은 언뜻 보기에는 그렇게 황당하지 않지만, 사실은 C와 C++ 모두에게 다음과 같은 것을 보장하기 때문에 기발합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TRUE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FALSE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 값(및 유형)이 정확합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(비록 컴파일러가 그런 키워드가 없는 C 컴파일러라 할지라도, 당신은 사소한 것으로 다음과 같은 것을 쓸 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define TRUE true&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C++ 코드에서는 언어가 정의하기 때문에 이러한 구문은 쓸모가 없을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드로.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 C와 C++가 동일한 코드 기반에서 원활하게 상호 운용되도록 하려면 (다른 코드 스타일을 사용하지 않는 한) 둘 다에 적합한 &quot;something&quot;이 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 매크로가 정의되는 방식은 C++ 표준이 어떤 값인지에 대해 명확하게 모호하다는 것을 증명하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C++ 표준은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유형 boole의 값이 true 또는 false입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[...]&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0 값, null 포인터 값 또는 null 멤버 포인터 값은 false로 &lt;em&gt;변환&lt;/em&gt;되며, 다른 값은 true로 변환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[...]&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유형 bool의 prvalue를 유형 int의 prvalue로 변환할 수 있으며 false는 0이 되고 true는 1이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 개의 특정 값이 존재하고 이름이 무엇인지, 그리고 이 값들이 어떤 정수 값으로 변환되고 어떤 정수 값에서 변환되는지는 언급하지 않지만 이러한 값이 &lt;strong&gt;무엇인지&lt;/strong&gt;는 언급하지 &lt;strong&gt;않습니다&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 그 가치들이 분명히&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(&lt;em&gt;그리고&lt;/em&gt; 부수적으로 당신은 옳을 것이라고 추측했을지도 모릅니다) 하지만 사실은 그렇지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제 값은 의도적으로 정의되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 포인터(특히 널 포인터)가 정의되는 방식과 유사합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0의 정수 리터럴은 널 포인터로 변환되고 널 포인터는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 동일한 것을 비교합니다...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;허허허 허허허허허...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;등.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 것이 무엇으로 변환되고 무엇이 되지 않는지에 대해서는 많은 이야기가 있지만, 널 포인터가 0의 이진법을 가져야 한다는 &lt;strong&gt;것&lt;/strong&gt;은 어디에도 &lt;strong&gt;언급&lt;/strong&gt;되지 않습니다. (사실은 그렇지 않은 몇몇 이국적인 구조들이 있습니다!)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 마이그레이션된 오래된 코드, 표준이 아닌 C++ 컴파일러의 코드, 크로스 컴파일러 코드(휴대성), 하위 호환성을 지원하기 위한 코드 스타일, 나쁜 습관 등의 역사적인 이유가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇몇 컴파일러들이 있었는데 그들은 아직&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;cstdint&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 정수형의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;uint32_t&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 아니면 그들은 하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;cstdbool&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 훌륭한 프로그래머는 자신의 프로그램이 여러 컴파일러에 걸쳐 잘 정의되도록 하기 위해 모든 것을 정의하고 사전 프로세서를 많이 사용해야 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오늘은 저희가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;cstdint&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true/false&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;cstdbool&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 모두가 행복합니다!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 정의의 좋은 점은 TRUE 또는 FALSE에서 정수로의 암묵적 변환을 피하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 컴파일러가 잘못된 함수 오버로드를 선택하지 않도록 하는 데 유용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에는 네이티브 부울 타입이 없었기 때문에 다른 곳에서 &quot;false&quot; 또는 &quot;true&quot;를 정의하지 않고는 엄격하게 사용할 수 없었습니다. 그러면 어떻게 정의하시겠습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 주장이 나에게 적용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UInt32 - C는 원래 uint32_t 및 stdint의 다른 유형을 가지고 있지 않았기 때문에 정확한 크기의 정수를 얻을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 아키텍처로 포팅한 경우에는 다음과 같은 정의를 변경하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UInt32는 부호 없는 정수 32비트 너비와 동일한 길이 또는 짧은 길이입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FALSE와 FALSE의 차이를 설명하는 멋진 설명이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 답변이 설명을 해주긴 했지만 조금 더 이해하는데 도움이 될 수도 있을 것 같습니다. &lt;a href=&quot;https://stackoverflow.com/questions/5663601/what-is-the-difference-between-false-and-false&quot;&gt;여기&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/19359381/strange-definition-of-false-and-true-why&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1620</guid>
      <comments>https://goodsource.tistory.com/1620#entry1620comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:40:38 +0900</pubDate>
    </item>
    <item>
      <title>왜 C 언어들은 if 문장에서 간단한 조건 주위에 부모를 필요로 합니까?</title>
      <link>https://goodsource.tistory.com/1619</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 C 언어들은 if 문장에서 간단한 조건 주위에 부모를 필요로 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바보같이 들리지만 몇 년 동안 저는 이를 필요로 하는 사용 사례를 생각해내지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빠른 구글 검색은 가치 있는 것을 아무것도 드러내지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기억에서 Bjarne Stroustrup이 언급한 사용 사례가 있었지만, 그것에 대한 참고 자료를 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 왜 C 언어로 이것을 가질 수 없습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int val = 0;
if val
  doSomehing();
else
  doSomehinglse();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &quot;렉서에 지원을 추가하는 것을 귀찮아하지 않았다&quot;는 이유를 받아들일 수 있습니다. 이 구문이 다른 언어 구성 요소를 파괴하는지 알고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C/C++에 얼마나 많은 특이한 구문 기능들이 있는지를 고려해 볼 때, 저는 이것이 많은 복잡성을 더했을 것이라고 생각하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;식 주위에 괄호가 없는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 문장의 의미는 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if x * x * b = NULL;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런가요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (x*x)
    (*b) = NULL;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (x)
    (*x) * b = NULL;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(물론 이것들은 어리석은 예시이며 명백한 이유로 작동하는 것도 아니지만 요점은 이해합니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TLDR: 구문 모호성의 가능성까지 제거하려면 C에서 괄호가 필요합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 해석하는 방법을 알려주십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if x ++ b;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바보같지만...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if( x ) ++b;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if( x++ ) b;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 &quot;x&quot;에 오버로드 연산자가 있을 수도 있고, 그러면...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if( x ++ b){;}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마틴 요크가 언급했듯이 &quot;++&quot;가 우선 순위가 더 높기 때문에 연산자에 티빗 과부하를 추가할 수밖에 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현대 컴파일러를 다룰 때는 C++와 함께 오는 과부하 상태를 허용하기 전까지는 그가 전적으로 옳습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &quot;왜 그런 것을 원할까요?&quot;라는 질문보다 &quot;왜 그런 것을 원할까요?&quot;라는 질문이 더 좋을 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불필요한 다른 엣지 케이스를 렉서에 도입하여 4자를 추가로 입력하는 것을 피할 수 있으며, 이미 가능한 모든 케이스를 지원하는 간단한 구문에 예외를 허용함으로써 스펙에 복잡성을 더합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로그래밍 언어에서 큰 가치가 없는 모호함은 말할 것도 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지 더 기억해야 할 사항은 C는 테이프 스토리지가 일반적이었던 시기에 생성되었기 때문에 임의 검색을 수행하거나 현재 파일 또는 다른 파일을 역주행하는 것은 실제로 불가능했습니다. 따라서 다른 파일보다 어떤 것(즉, 선언 전달)을 우선해야 하는 이유도 설명할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수의 사용) 컴파일러가 스스로 파악할 수 있어야 함에도 불구하고).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순히 진술서의 조건조항을 종료하는 수단에 불과합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 언어들은 파이썬에서 &quot;그때&quot; 또는 &quot;if 조건&lt;strong&gt;:(다음에 반환됨)&quot;&lt;/strong&gt;과 같은 다른 수단을 사용합니다. (: 항상 파이썬에서 나를 가져오게 해줘 나는 그것들을 계속 빼놓게 되고 결과적으로 즉시 명백하지 않은 오류를 얻게 됩니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴퓨터 문법은 일반적으로 문장이나 표현의 다른 부분을 식별하는 독특한 메커니즘을 좋아합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 점에서 다른 어떤 언어보다 낫거나 최악은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C/C++의 엉킴 문제는 문법적 관점에서 모호성을 보여주는 사례이며, 정확한 작동을 보장하기 위해 특별한 경우로 다루어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(즉, 컴파일러 구현자를 위한 추가 작업을 추가합니다.)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 이 구문을 좋아하지만 구문 분석의 모호성을 피하기 위해서는 다음과 같은 형식이어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 문장의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if val 
{ 
    doSomething();
    doOthers();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 진술에 대해:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if val: 
   doSomething();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 상당한 공백을 원하지 않는 한, 당신은 조건이 어떤 언어에서 끝날 때 그것이 () 어떤 언어에서 조건 주위에 그것이 키워드이고 답에 주어진 것과 같은 경우를 구별할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x * x * b = NULL이 항상 false로 평가하는 한 조건일 수 있다면, &lt;em&gt;(xx&lt;/em&gt;) 컴파일러의 &lt;em&gt;경우 b&lt;/em&gt;에 NULL을 할당하는 것은 조건이 언제 끝나고 다음 작업이 시작되는지 알 수 있는 방법이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 컴파일러가 언제 상태가 종료되는지 알 수 있는 명시적인 &quot;백마커&quot;가 있어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C(++), Java, c# 및 기타 언어에서는 () F#에서 조건을 표시하는 키워드 '그때'이고, 다른 언어에서는 새 줄/오목입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;근본적인 이유는 C와 친구들은 '그때' 키워드가 없기 때문에 조건 표현을 구분하는 다른 방법이 필요하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파스칼이나 PL/1처럼 괄호가 필요 없는 언어들.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파스칼, PL/1 등이 'do'를 가지는 'while'에도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로그래머가 원하는 출력을 얻기 위해 어떤 식(산술, 논리, 할당 등 일련의 연산자를 포함한)을 풀어야 하는지를 이해하는 데 도움이 되기 때문입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에 조건을 둘러싼 부언이 존재하는 이유를 적어도 하나의 예를 들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 다음을 생각해 봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;while(1) do_something();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위는 무한 루프에서 영원히 do_something()을 부를 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부모가 필요한 이유는 다음 사항이 애매하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;while 1 ; do_something();&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 무언가를 평가하고 그 동안에는 아무것도 하지 않는다는 뜻입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 위의 코드 샘플과 같은 의미입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 C 구문 부모에서 조건 평가를 중심으로 이것이 필요한 한 가지 이유를 보여주고, (일치성을 위해) 동일한 구문을 확장함으로써 if 문으로 확장되는 것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;취소자:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 완전히 틀릴 수도 있고, 그 표어가 있는 이유가 완전히 다를 수도 있지만, 적어도 한 가지 예시를 보여줬습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;
 &lt;strike&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'괄호'와 '부모'를 혼동하시는 것 같습니다.&lt;/font&gt;&lt;/strike&gt;&lt;/p&gt;
&lt;strike&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 C에서 가능합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;void doSomething(){}
void doSomethingElse(){}

void main() {
    int val = 0;
    if( val ) 
        doSomething();
    else
        doSomethingElse();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/strike&gt;
&lt;p&gt;
 &lt;strike&gt;&lt;/strike&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 &quot;C&quot; 언어가 파레시스 사용을 강제하는 것은 아니며 선택적으로 교정기를 유지합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Go(이슈) 프로그래밍 언어는 &lt;a href=&quot;https://stackoverflow.com/questions/1712172/whats-your-take-on-the-programming-language-go/1716703#1716703&quot;&gt;정반대&lt;/a&gt;의 역할을 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;9호에서 동일한 문장을 쓰는 올바른 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if val {
    doSomething();
} else {
    doSomethingElse();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 다음 사항이 유효하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if x * x * b = NULL; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 중 하나여야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if x*x {
    *b=NULL;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 만약 x {&lt;em&gt;xb&lt;/em&gt;=&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NULL; }&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 괄호는 괄호의 부재로 인해 발생하는 모호함을 제거합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부모를 빠뜨리면 실제로 애매모호한 일이 생기는 구체적인 경우는 생각나지 않지만 어딘가에 구석이 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로컬로 선언된 변수와 관련이 있을 수 있습니다(에서와 같이).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if (bool b = foo())...&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;괄호가 없는 곳에서, 만약에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bool&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;형식 선언 또는 전체 조건입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;후자의 경우에는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;b&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조건의 일부가 아니라 if-statement 기관의 첫 번째 토큰이 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C를 사용하면 다음을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (x) { // As opposed to java where you need to do if (x == something)
   // your code
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위에서 볼 수 있듯이 유연성은 다른 사람들이 보여준 것처럼 모호함을 야기합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2061593/why-do-c-languages-require-parens-around-a-simple-condition-in-an-if-statement&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1619</guid>
      <comments>https://goodsource.tistory.com/1619#entry1619comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:40:32 +0900</pubDate>
    </item>
    <item>
      <title>Java Config를 사용한 Spring Security 사용자 지정 인증 필터</title>
      <link>https://goodsource.tistory.com/1618</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Java Config를 사용한 Spring Security 사용자 지정 인증 필터&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 웹 어플리케이션에서 Java config를 사용하여 URL 요청 파라미터에 제공된 암호화된 토큰을 사용하여 외부 웹 서비스에 대한 인증을 수행하도록 Spring Security를 구성하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Login Portal(로그인 포털)의 요청을 가로채는 보안 필터(모두 인증/인증)가 있으면 좋겠습니다. 이 필터는 Authentication Provider(인증 공급자)를 사용하여 인증 프로세스의 비즈니스 로직을 처리합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인 포털 --&amp;gt; '\authenticate'(+토큰) --&amp;gt; 토큰을 다시 로그인 포털(WS)로 인증 --&amp;gt; 성공하면 역할을 얻고 사용자를 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필터를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
public final class OEWebTokenFilter extends GenericFilterBean {
    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
        if (request instanceof HttpServletRequest) {
             OEToken token = extractToken(request);
             // dump token into security context (for authentication-provider to pick up)
             SecurityContextHolder.getContext().setAuthentication(token);
        }
    }   
    chain.doFilter(request, response);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증 공급자...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
public final class OEWebTokenAuthenticationProvider implements AuthenticationProvider {
    @Autowired
    private WebTokenService webTokenService;

    @Override
    public boolean supports(final Class&amp;lt;?&amp;gt; authentication) {
        return OEWebToken.class.isAssignableFrom(authentication);
    }

    @Override
    public Authentication authenticate(final Authentication authentication) {
         if (!(authentication instanceof OEWebToken)) {
             throw new AuthenticationServiceException(&quot;expecting a OEWebToken, got &quot; + authentication);
        }

        try {
            // validate token locally
            OEWebToken token = (OEWebToken) authentication;
            checkAccessToken(token);

            // validate token remotely
            webTokenService.validateToken(token);

            // obtain user info from the token
            User userFromToken = webTokenService.obtainUserInfo(token);

            // obtain the user from the db
            User userFromDB = userDao.findByUserName(userFromToken.getUsername());

            // validate the user status
            checkUserStatus(userFromDB);

            // update ncss db with values from OE
            updateUserInDb(userFromToken, userFromDB);

            // determine access rights
            List&amp;lt;GrantedAuthority&amp;gt; roles = determineRoles(userFromDB);

            // put account into security context (for controllers to use)
            return new AuthenticatedAccount(userFromDB, roles);
        } catch (AuthenticationException e) {
            throw e;
        } catch (Exception e) {
             // stop non-AuthenticationExceptions. otherwise full stacktraces returned to the requester
             throw new AuthenticationServiceException(&quot;Internal error occurred&quot;);
        }
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나의 스프링 보안 구성&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    OESettings oeSettings;

    @Bean(name=&quot;oeAuthenticationService&quot;)
    public AuthenticationService oeAuthenticationService() throws AuthenticationServiceException {
        return new AuthenticationServiceImpl(new OEAuthenticationServiceImpl(), oeSettings.getAuthenticateUrl(), oeSettings.getApplicationKey());
    }

    @Autowired
    private OEWebTokenFilter tokenFilter;

    @Autowired
    private OEWebTokenAuthenticationProvider tokenAuthenticationProvider;

    @Autowired
    private OEWebTokenEntryPoint tokenEntryPoint;

    @Bean(name=&quot;authenticationManager&quot;)
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth)  throws Exception {
        auth.authenticationProvider(tokenAuthenticationProvider);
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean () {  
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();     
        registrationBean.setFilter(tokenFilter);    
        registrationBean.setEnabled(false);
        return registrationBean;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers(&quot;/authenticate**&quot;).permitAll()
            .antMatchers(&quot;/resources/**&quot;).hasAuthority(&quot;ROLE_USER&quot;)
            .antMatchers(&quot;/home**&quot;).hasAuthority(&quot;ROLE_USER&quot;)
            .antMatchers(&quot;/personSearch**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            // Spring Boot actuator endpoints
            .antMatchers(&quot;/autoconfig**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/beans**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/configprops**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/dump**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/env**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/health**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/info**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/mappings**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/metrics**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .antMatchers(&quot;/trace**&quot;).hasAuthority(&quot;ROLE_ADMIN&quot;)
            .and()
                .addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class)
                .authenticationProvider(tokenAuthenticationProvider)
                .antMatcher(&quot;/authenticate/**&quot;)
                .exceptionHandling().authenticationEntryPoint(tokenEntryPoint)
            .and()
                .logout().logoutSuccessUrl(oeSettings.getUrl());
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 문제는 SpringConfig 클래스의 필터 구성입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필터 구성에 .antMatcher(&quot;/authenticate/**&quot;)를 추가하여 /authenticate URL에 대한 요청일 때만 필터가 적용되도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.and()
                .addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class)
                .authenticationProvider(tokenAuthenticationProvider)
                .antMatcher(&quot;/authenticate/**&quot;)
                .exceptionHandling().authenticationEntryPoint(tokenEntryPoint)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 모든 URL에 이 줄이 있으면 인증하지 않고 수동으로 /home으로 이동하여 줄을 제거하면 /home이 인증됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 URL에만 적용 가능한 필터를 선언해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 URL의 보안을 유지하면서 이를 구현하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증 공급자를 참여시키기 전에 필터에서 인증 상태를 확인하여 문제를 해결했습니다. ..&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.and()
    .addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class)
    .authenticationProvider(tokenAuthenticationProvider)
    .exceptionHandling().authenticationEntryPoint(tokenEntryPoint)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필터&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
        throws IOException, ServletException {

    logger.debug(this + &quot;received authentication request from &quot; + request.getRemoteHost() + &quot; to &quot; + request.getLocalName());

    if (request instanceof HttpServletRequest) {
        if (isAuthenticationRequired()) {
            // extract token from header
            OEWebToken token = extractToken(request);

            // dump token into security context (for authentication-provider to pick up)
            SecurityContextHolder.getContext().setAuthentication(token);
        } else {
            logger.debug(&quot;session already contained valid Authentication - not checking again&quot;);
        }
    }

    chain.doFilter(request, response);
}

    private boolean isAuthenticationRequired() {
    // apparently filters have to check this themselves.  So make sure they have a proper AuthenticatedAccount in their session.
    Authentication existingAuth = SecurityContextHolder.getContext().getAuthentication();
    if ((existingAuth == null) || !existingAuth.isAuthenticated()) {
        return true;
    }

    if (!(existingAuth instanceof AuthenticatedAccount)) {
        return true;
    }

    // current session already authenticated
    return false;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/27507862/spring-security-custom-authentication-filter-using-java-config&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1618</guid>
      <comments>https://goodsource.tistory.com/1618#entry1618comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:40:24 +0900</pubDate>
    </item>
    <item>
      <title>액체 베이스:오류 업데이트 함수/저장 프로시저 mysql</title>
      <link>https://goodsource.tistory.com/1617</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;액체 베이스:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 업데이트 함수/저장 프로시저 mysql&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mysql에서 Liquibase를 사용하는데 create function을 시도할 때 아래 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Liquibase 실행 중 예기치 않은 오류 발생:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 구문에 오류가 있습니다. MariaDB 서버 버전에 해당하는 설명서에서 'in varchar2' 근처에서 사용할 올바른 구문을 확인하십시오. varchar2 반환 varchar2는&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 나의 기능 파일 MyFunction입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sql:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create or replace function MyFuncion(p_id in varchar2) 
return varchar2 is Result varchar2(50);
begin   Result := 'bbbb' || p_id;  
return(Result); end MyFuncion;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 변경 로그 종료&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;changeSet author=&quot;taibc&quot; id=&quot;sqlFile-example2&quot;&amp;gt;
    &amp;lt;sqlFile dbms=&quot;ttdp_thanh, mysql&quot;
            encoding=&quot;utf8&quot;
            endDelimiter=&quot;\n/&quot; 
            path=&quot;MyFunction.sql&quot;
            relativeToChangelogFile=&quot;true&quot;
            splitStatements=&quot;true&quot;
            stripComments=&quot;true&quot;/&amp;gt;
      &amp;lt;rollback&amp;gt;
        DROP Function MyFunction;         
    &amp;lt;/rollback&amp;gt;     
&amp;lt;/changeSet&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좀 도와 줄래요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/51413813/liquibase-error-update-function-store-procedure-mysql&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1617</guid>
      <comments>https://goodsource.tistory.com/1617#entry1617comment</comments>
      <pubDate>Thu, 2 Nov 2023 21:40:14 +0900</pubDate>
    </item>
    <item>
      <title>JQuery event.preventDefault()가 설정된 경우 window.open에 팝업 차단 무시</title>
      <link>https://goodsource.tistory.com/1616</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JQuery event.preventDefault()가 설정된 경우 window.open에 팝업 차단 무시&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 대화상자를 보여주고 싶습니다.&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;조건 1에서 JQuery 대화를 여는 것과 같은 요구 사항이 있으며 조건 1이 충족되지 않으면 해당 클릭 이벤트의 'href' 태그가 참조하는 페이지로 이동합니다.&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;font class=&quot;papago-parent&quot;&gt;이제 이 기능은 다른 URL(내 Spring 컨트롤러를 실행하고 응답을 반환하는)을 실행하여 해당 조건을 확인합니다.&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;팝업 차단기에 의해 차단되는 window.open에서만 모든 기능이 완벽하게 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('a[href*=/viewpage?number]').live('click', function(e) {
    e.preventDefault();
    redirectionURL = this.href;
    pageId= getUrlVars(redirectionURL)[&quot;number&quot;];
    $.getJSON(&quot;redirect/&quot; + pageId, {}, function(status) {
        if (status == null) {
            alert(&quot;Error in verifying the status.&quot;);
        } else if(!status) {
            $(&quot;#agreement&quot;).dialog(&quot;open&quot;);
        } else {
            window.open(redirectionURL);
        }
    });
});
&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;e.preventDefault();&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드에서 팝업 차단기는 페이지를 차단하지 않지만 조건 1의 경우 대화를 열고 'href' 페이지를 엽니다.&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;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;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제가 해결되면 대화의 OK 이벤트에 대한 탐색과 같은 해결해야 할 다른 문제가 있습니다. :)&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;window.open&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;em papago-id=&quot;3-1&quot;&gt;사용&lt;/em&gt;되는 경우(클릭 등).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 경우, 당신이 전화하는 것은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.open&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;em papago-id=&quot;4-0&quot;&gt;나중&lt;/em&gt;에, 행사중이 아니라, 왜냐하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.getJSON&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;/p&gt; 
&lt;ol&gt; 
 &lt;li&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;window.open&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;/p&gt;&lt;/li&gt; 
 &lt;li&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;브라우저의 UI를 잠그기 때문에 페스트처럼 일반적으로 피해야 하는 아약스 호출을 동기화합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.getJSON&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;$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
&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;$.getJSON&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;code&gt;async: false&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;/p&gt; &lt;pre&gt;&lt;code&gt;$.ajax({
    url:      &quot;redirect/&quot; + pageId,
    async:    false,
    dataType: &quot;json&quot;,
    data:     {},
    success:  function(status) {
        if (status == null) {
            alert(&quot;Error in verifying the status.&quot;);
        } else if(!status) {
            $(&quot;#agreement&quot;).dialog(&quot;open&quot;);
        } else {
            window.open(redirectionURL);
        }
    }
});
&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;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&gt;&lt;s papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsbin.com/ohujur&quot; rel=&quot;noreferrer&quot; papago-id=&quot;24-0&quot;&gt;라이브 예시&lt;/a&gt; | &lt;a href=&quot;http://jsbin.com/ohujur/edit&quot; rel=&quot;noreferrer&quot; papago-id=&quot;24-2&quot;&gt;라이브 소스&lt;/a&gt;&lt;/font&gt;&lt;/s&gt; &lt;em papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(JSBin 변경으로 인해 라이브 링크가 더 이상 작동하지 않음)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;jQuery(function($) {
  // This version doesn't work, because the window.open is
  // not during the event processing
  $(&quot;#theButton&quot;).click(function(e) {
    e.preventDefault();
    $.getJSON(&quot;http://jsbin.com/uriyip&quot;, function() {
      window.open(&quot;http://jsbin.com/ubiqev&quot;);
    });
  });
});
&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;p&gt;&lt;s papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsbin.com/ohujur/2&quot; rel=&quot;noreferrer&quot; papago-id=&quot;27-0&quot;&gt;라이브 예시&lt;/a&gt; | &lt;a href=&quot;http://jsbin.com/ohujur/2/edit&quot; rel=&quot;noreferrer&quot; papago-id=&quot;27-2&quot;&gt;라이브 소스&lt;/a&gt;&lt;/font&gt;&lt;/s&gt; &lt;em papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(JSBin 변경으로 인해 라이브 링크가 더 이상 작동하지 않음)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;jQuery(function($) {
  // This version does work, because the window.open is
  // during the event processing. But it uses a synchronous
  // ajax call, locking up the browser UI while the call is
  // in progress.
  $(&quot;#theButton&quot;).click(function(e) {
    e.preventDefault();
    $.ajax({
      url:      &quot;http://jsbin.com/uriyip&quot;,
      async:    false,
      dataType: &quot;json&quot;,
      success:  function() {
        window.open(&quot;http://jsbin.com/ubiqev&quot;);
      }
    });
  });
});
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 직접 일부 작업을 수행하는 경우에만 브라우저 차단 없이 window.open을 호출할 수 있습니다.&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;blockquote&gt; 
 &lt;ol&gt; 
  &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;var my window = window.open(&quot;)&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;32&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;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요청이 완료되면, 그냥 mywindow.location = 'http://google.com '에 전화하세요.&lt;/font&gt;&lt;/li&gt; 
 &lt;/ol&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;34&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;pre&gt;&lt;code&gt;$scope.testCode = function () {
    var newWin = $window.open('', '_blank');
    service.testCode().then(function (data) {
        $scope.testing = true;
        newWin.location = '/Tests/' + data.url.replace(/[&quot;]/g, &quot;&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;pre&gt;&lt;code&gt;$('#myButton').click(function () {
    var redirectWindow = window.open('http://google.com', '_blank');
    $.ajax({
        type: 'POST',
        url: '/echo/json/',
        success: function (data) {
            redirectWindow.location;
        }
    });
});
&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;나는 이 http://jsfiddle.net/safeeronline/70kdacL4/1/ 을 만지작거리고 있습니다.&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;Windows(윈도우)는 사용자 시작 이벤트(예: 클릭 콜백)와 동일한 스택(&lt;a href=&quot;https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;37-1&quot;&gt;마이크로태스킹&lt;/a&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;strong papago-id=&quot;38-1&quot;&gt;URL이 없는 창&lt;/strong&gt;을 만들 수 있으며, &lt;em papago-id=&quot;38-3&quot;&gt;비동기적으로라도 그&lt;/em&gt; 창의 &lt;em papago-id=&quot;38-3&quot;&gt;URL을 알게&lt;/em&gt; 되면 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.onclick = () =&amp;gt; {
  // You MUST create the window on the same event
  // tick/stack as the user-initiated event (e.g. click callback)
  const googleWindow = window.open();

  // Do your async work
  fakeAjax(response =&amp;gt; {
    // Change the URL of the window you created once you
    // know what the full URL is!
    googleWindow.location.replace(`https://google.com?q=${response}`);
  });
};

function fakeAjax(callback) {
  setTimeout(() =&amp;gt; {
    callback('example');
  }, 1000);
}
&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 class=&quot;papago-parent&quot;&gt;현대 브라우저는 빈 페이지(흔히 호출됨)로 창을 엽니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;about:blank&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), 그리고 URL을 얻기 위한 비동기 작업이 상당히 빠르다고 가정하면 결과적인 UX는 대부분 괜찮습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 사용자가 기다리는 동안 로드 메시지(또는 다른 메시지)를 창에 렌더링하려면 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14-1&quot;&gt;Data URI&lt;/a&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.open('data:text/html,&amp;lt;h1&amp;gt;Loading...&amp;lt;%2Fh1&amp;gt;');
&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;이 코드는 저를 도와줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 몇몇 사람들에게 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('formSelector').submit( function( event ) {

    event.preventDefault();

    var newWindow = window.open('', '_blank', 'width=750,height=500');

    $.ajax({

        url: ajaxurl,
        type: &quot;POST&quot;,
        data: { data },

    }).done( function( response ) {

        if ( ! response ) newWindow.close();
        else newWindow.location = '/url';

    });
});
&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;font class=&quot;papago-parent&quot;&gt;두 번째 부분은 한 코멘트에 언급된 링크에 target=&quot;_blank&quot;를 추가하는 것이었습니다.&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;요약: 사용자가 시작한 이벤트에서 window.open을 호출해야 합니다. 이 경우 링크를 클릭하면 해당 링크에 target=&quot;_blank&quot;가 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 예에서 링크는 class=&quot;button- twitter&quot;를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.button-twitter').click(function(e) {
  e.preventDefault();
  var href = $(this).attr('href');
  var tweet_popup = window.open(href, 'tweet_popup', 'width=500,height=300');
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;45-1&quot;&gt;링크&lt;/strong&gt; 요소를 사용해 보고 javascript로 클릭합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a id=&quot;SimulateOpenLink&quot; href=&quot;#&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&amp;lt;/a&amp;gt;
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function openURL(url) {
    document.getElementById(&quot;SimulateOpenLink&quot;).href = url
    document.getElementById(&quot;SimulateOpenLink&quot;).click()
}
&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;이렇게 쓰시면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//do stuff
var id = 123123141;
openURL(&quot;/api/user/&quot; + id + &quot;/print&quot;) //this open webpage bypassing pop-up blocker
openURL(&quot;https://www.google.com&quot;) //Another link
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var url = window.open(&quot;&quot;, &quot;_blank&quot;);
url.location = &quot;url&quot;;
&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;p papago-id=&quot;49&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;50&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;const popupWindow = window.open(&quot;&quot;, &quot;_blank&quot;);
popupWindow.document.write(&quot;&amp;lt;div&amp;gt;Loading, Plesae wait...&amp;lt;/div&amp;gt;&quot;)
&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;pre&gt;&lt;code&gt;popupWindow.document.write(resonse.url)
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/9514698/bypass-popup-blocker-on-window-open-when-jquery-event-preventdefault-is-set&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1616</guid>
      <comments>https://goodsource.tistory.com/1616#entry1616comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:49 +0900</pubDate>
    </item>
    <item>
      <title>Flower : 플레이 스토어용 버전 코드 업그레이드</title>
      <link>https://goodsource.tistory.com/1615</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Flower : 플레이 스토어용 버전 코드 업그레이드&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;blockquote&gt; 
 &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;flotter build apk --build-name=1.0.2 --build-number=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;local.properties를 이렇게 변경할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; flutter.versionName=2.0.0
 flutter.versionCode=2
 flutter.buildMode=release
&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;blockquote&gt; 
 &lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 1이 이미 다른 APK 또는 Android App 번들에 할당되어 있으므로 APK 또는 Android App 번들에 다른 버전 코드를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Sq3um.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Sq3um.png&quot; alt=&quot;version in pubspec.yaml file&quot;&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;/p&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;Android의 경우:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;A.B.C&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 class=&quot;papago-parent&quot;&gt;대표합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;versionName&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;1.0.0&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;code&gt;X&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;+&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;versionCode&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;1&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;2&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;3&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;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행하는 것을 &lt;strong papago-id=&quot;17-0&quot;&gt;잊지&lt;/strong&gt; 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;flutter build apk&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;flutter run&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 class=&quot;papago-parent&quot;&gt;뛸때&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;flutter build apk&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;flutter run&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;version&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;pubspec&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;versionName&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;versionCode&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;local.properties&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;build.gradle (app)&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&gt;&lt;code&gt;flutter build apk&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;code&gt;flutter run&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;versionName&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;versionCode&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;apk를 위하여&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iOS의 경우:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;A.B.C&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;CFBundleShortVersionString&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;1.0.0&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;/p&gt; 
&lt;p&gt;&lt;code&gt;X&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;+&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;CFBundleVersion&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&gt;&lt;code&gt;1&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;2&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;3&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&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행하는 것을 &lt;strong papago-id=&quot;42-0&quot;&gt;잊지&lt;/strong&gt; 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;flutter build ipa&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;flutter run&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&gt;&lt;/p&gt;&lt;p papago-id=&quot;45&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;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;pubspec.yaml&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: 1.0.2+2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 &lt;strong papago-id=&quot;48-1&quot;&gt;VER_NAME&lt;/strong&gt;이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;+&lt;/code&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VER_CODE&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;em papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책:&lt;/font&gt;&lt;/em&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;pubspec.yaml 안에 이것을 추가합니다(아마도 설명 뒤에, 설명과 동일한 들여쓰기, 이름 등).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;):&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;version: 2.0.0+2&lt;/code&gt;&lt;/strong&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;그러면 패키지가 플러터 로컬 디렉토리 안으로 들어가나요?(이 작업을 잊지 마십시오)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설명:&lt;/font&gt;&lt;/em&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;font class=&quot;papago-parent&quot;&gt;버전 코드는 2이고 이름은 2.0.0입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러터 앱 업데이트 할때마다 버전코드 강제변경 꼭!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가 정보:&lt;/font&gt;&lt;/em&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;안드로이드 앱이 구축될 때마다 안드로이드/앱 안에서 build.gradle/ 버전 코드와 이름을 찾습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 일반적으로 floter pubspec.yaml을 변경할 때마다 변경되는 local.properties에 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;57&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;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 &quot;X.Y.Z+n&quot;은 버전 &lt;strong papago-id=&quot;58-1&quot;&gt;이름&lt;/strong&gt;을 나타내고 &quot;&lt;strong papago-id=&quot;58-1&quot;&gt;n&lt;/strong&gt;&quot;은 &lt;strong papago-id=&quot;58-3&quot;&gt;버전 번호&lt;/strong&gt;를 나타냅니다.&lt;/font&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;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;code&gt;pubspec.yaml&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&gt;&lt;/li&gt; 
 &lt;li&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;업데이트 대상&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;local.properties&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;flutter pub get&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;지휘.&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;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 를 실행하여 apk 또는 app 번들을 구축할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;flutter build apk&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;flutter build appbundle&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 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;p&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;당신이 이미 변경한 경우.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;versionCode&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&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;strong papago-id=&quot;69-1&quot;&gt;라이브러리에서 선택&lt;/strong&gt;을 클릭하고 이미 전송된 빌드를 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Y57UU.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Y57UU.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;저의 경우, 두 개의 파일을 변경하여 똑같은 문제를 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1- pubspec.yam:&lt;/font&gt;&lt;/strong&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;출처:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: 1.0.0+1
&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;대상:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: 1.0.0+2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2- in 안드로이드/locale.properties&lt;/font&gt;&lt;/strong&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;pre&gt;&lt;code&gt;flutter.versionName=1.0.0
flutter.versionCode=1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;76&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;flutter.versionName=1.0.0
flutter.versionCode=2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3- 마지막 작업:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;flutter clean
flutter packages get
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;78-0&quot;&gt;앱의 버전 번호 업데이트&lt;/strong&gt; 앱의 기본 버전 번호는 1.0.0입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트하려면 pubspec.yaml 파일로 이동하여 다음 줄을 업데이트합니다.&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;버전: 1.0.0+1&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 번호는 위 예제의 1.0.0과 같이 점으로 구분된 3개의 숫자와 위 예제의 1과 같은 선택적인 빌드 번호이며 +로 구분됩니다.&lt;/font&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;버전과 빌드 번호는 각각 --build-name 및 --build-number를 지정하여 Fluter의 빌드에서 재정의할 수 있습니다.&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;Android에서 build-name은 versionName으로 사용되고 build-number는 versionCode로 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 Android 설명서의 Version your app을 참조하십시오.&lt;/font&gt;&lt;/p&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;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;84-1&quot;&gt;pubsec. &lt;/strong&gt;yam 파일로&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;버전: &lt;strong papago-id=&quot;85-1&quot;&gt;1.0.0+1&lt;/strong&gt;에서 버전: &lt;strong papago-id=&quot;85-3&quot;&gt;1.0.0+2&lt;/strong&gt;로 변경&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;86&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;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 -&amp;gt; 열기 -&amp;gt; 당신의 플러터 코드 작업공간 -&amp;gt; 프로젝트의 안드로이드 아이콘&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 build.gradel로 이동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0.0'
}
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '2'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0.2'
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 &lt;strong papago-id=&quot;90-1&quot;&gt;local.property&lt;/strong&gt; 파일을 마지막으로 하나 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sdk.dir=C:/Users/Admin/AppData/Local/Android/Sdk
flutter.sdk=D:\\flutter_windows\\flutter
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;sdk.dir=C:/Users/Admin/AppData/Local/Android/Sdk
flutter.sdk=D:\\flutter_windows\\flutter
flutter.buildMode=debug
flutter.versionName=1.0.2
flutter.versionCode=2
&lt;/code&gt;&lt;/pre&gt;&lt;p 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;많은 제안들이 pubspec에서 버전을 업데이트하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 배포에 따라 이러한 값을 사용하지 않을 수도 있습니다.&lt;/font&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;flotter build --build-number=X --build-name=&lt;strong papago-id=&quot;93-3&quot;&gt;Y&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;94-2&quot;&gt;X&lt;/strong&gt;는 &lt;strong papago-id=&quot;94-0&quot;&gt;버전&lt;/strong&gt; &lt;strong papago-id=&quot;94-2&quot;&gt;코드&lt;/strong&gt;로 사용됩니다. &lt;strong papago-id=&quot;94-4&quot;&gt;Y&lt;/strong&gt;는 &lt;strong papago-id=&quot;94-6&quot;&gt;버전 이름&lt;/strong&gt;으로 사용됩니다.&lt;/font&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;테스트하려면 build를 실행하고 local.properties를 확인하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 flotter 2.10.2 버전에 대해서는 다음 단계를 따릅니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&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;1단계: 다음의 변경 사항을 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pubspec.yaml&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    //change version 1.0.0+1 to 1.0.0+2
version: 1.0.0+2
    
    environment:
      sdk: &quot;&amp;gt;=2.16.1 &amp;lt;3.0.0&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;2단계: 의 변경에 따른 변경&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;android\local.properties&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;flutter.sdk=C:\\flutter
flutter.buildMode=release

// Change here flutter.versionName=1.0.0 to flutter.versionName 1.0.1
flutter.versionName=1.0.1

 //Change here flutter.versionCode=1 to flutter.versionCode=2
flutter.versionCode=2

flutter.minSdkVersion=21
flutter.targetSdkVersion=31
flutter.compileSdkVersion=31
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;android{
//....
  defaultConfig {
  //....
  version code:2
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;on Android&amp;gt;app&amp;gt;Build.gradle from your project의 root 폴더&lt;/font&gt;&lt;/p&gt;&lt;p&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&gt;&lt;code&gt;pubspec.yml&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 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;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전과 빌드 번호는 각각 --build-name 및 --build-number를 지정하여 Fluter의 빌드에서 재정의할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://flutter.dev/docs/deployment/android#updating-the-apps-version-number&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https:// flutter.dev/ docs/ 배포/ android # updating- 더 apps 버전- 번호&lt;/font&gt;&lt;/a&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;Android/app/build.gradle에서 덮어쓰기를 통해 완전히 자신만의 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;106&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;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;defplotVersionName&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;108&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;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;versionCode&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;&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;versionNumber&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;예를 들어, 1.0.0+1에서 1.1.0+1 플레이 스토어는 다음과 같은 오류를 던집니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;versionCode&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 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;versionNumber&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 class=&quot;papago-parent&quot;&gt;당신은 또한 당신의 것을 바꾸어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;versionCode&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;- 에서와 같이 1.0.0+1에서 1.1.0+2로 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;pubspec.yaml 예제 '버전 1.0.3+4의 첫 번째 변경 플러터 버전&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;안드로이드의 경우 floter 버전 코드와 이름처럼 버전 이름과 코드를 동일하게 변경하는 대신 local.properties로 이동합니다.&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;IOS의 경우 generated로 이동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;xcconfig than chnage FLUTER_BUILD_NAME=1.0.3 FLUTER_BUILD_NUMBER=4'&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;저도 같은 문제가 있었는데 안드로이드 스튜디오를 다시 시작해서 해결합니다.&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&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; pubspec.yml&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;version: 1.0.0+1&lt;/code&gt;&lt;/li&gt; 
 &lt;li&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;code&gt;version: 1.0.0+2&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;flutter build ios --release-name --release-number&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 class=&quot;papago-parent&quot;&gt;ios에서 버전을 업데이트 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;flutter pub get &amp;amp;&amp;amp; flutter run&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;안드로이드용 버전을 업데이트합니다( android/local.properties).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;저는 그 첫번째 앱을 &lt;strong papago-id=&quot;123-1&quot;&gt;Default Version&lt;/strong&gt; Name 1.0.0 &lt;strong papago-id=&quot;123-3&quot;&gt;Version Number&lt;/strong&gt; 1로 인식했기 때문에 이것은 1.0.0+1을 의미합니다.&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;pubspec.yaml에 1.0.0+2로 작성한 후 앱을 업데이트했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&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;code&gt;App Bundle&lt;/code&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;, 로 변경하였습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;APK&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&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;/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;versionName&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&gt;&lt;code&gt;versionCode&lt;/code&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 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;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;4 (0.0.2)&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 나는 iOS 작동 방식에 익숙해서 이것이 이상하게 보였습니다.&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;build/code&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;code&gt;version&lt;/code&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 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;version&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 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;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;0.0.3+1&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&gt;&lt;code&gt;1&lt;/code&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&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;그럼 플레이 스토어에서는 어떻게 작동하는 겁니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 헷갈리네요.&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;&lt;strong papago-id=&quot;141-1&quot;&gt;앱 번들&lt;/strong&gt;을 업로드하기 전에 Release 이름을 먼저 작성합니다.&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/WaCdO.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/WaCdO.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;예를 들어 안드로이드 버전 3을 만든다면,&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;143&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android의 경우 pubspec.yaml로 이동하여 여기서 편집합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: 3.0.0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;144&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 flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '3'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '3.0' 
&lt;/code&gt;&lt;/pre&gt;&lt;p&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&gt;&lt;code&gt;project/android/app/build.gradle&lt;/code&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 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;defaultConfig {
    versionCode 2 // this needs to be updated
    versionName &quot;1.0.5&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;147&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;148&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;app/build.gradle' 파일에서 이렇게 해왔습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}else {
    flutterVersionCode = '4'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}else {
    flutterVersionName = '1.3'
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;149&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/53570575/flutter-upgrade-the-version-code-for-play-store&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>android</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1615</guid>
      <comments>https://goodsource.tistory.com/1615#entry1615comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:40 +0900</pubDate>
    </item>
    <item>
      <title>swift는 subview를 추가하여 제거합니다.</title>
      <link>https://goodsource.tistory.com/1614</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;swift는 subview를 추가하여 제거합니다.&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;하위 보기 추가하기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var testView: UIView = UIView(frame: CGRectMake(0, 0, 320, 568))
testView.backgroundColor = UIColor.blueColor()
testView.alpha = 0.5
testView.tag = 100
super.view.userInteractionEnabled = false
self.view.userInteractionEnabled = true
self.view.addSubview(testView)
&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;override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let point = touch.locationInView(self.view)
    
    if(testView.tag==100){
        println(&quot;Tag 100&quot;)
        testView.removeFromSuperview()
    }
    else{
        println(&quot;tag not found&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;/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;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;@IBAction func infoView(sender: UIButton) {
    var testView: UIView = UIView(frame: CGRectMake(0, 0, 320, 568))
    testView.backgroundColor = UIColor.blueColor()
    testView.alpha = 0.5
    testView.tag = 100
    testView.userInteractionEnabled = true
    self.view.addSubview(testView)

    let aSelector : Selector = &quot;removeSubview&quot;
    let tapGesture = UITapGestureRecognizer(target:self, action: aSelector)
    testView.addGestureRecognizer(tapGesture)
}

func removeSubview(){
    println(&quot;Start remove sibview&quot;)
    if let viewWithTag = self.view.viewWithTag(100) {
        viewWithTag.removeFromSuperview()
    }else{
        println(&quot;No!&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;/font&gt;&lt;/p&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;스위프트 3+&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@IBAction func infoView(sender: UIButton) {
    let testView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
    testView.backgroundColor = .blue
    testView.alpha = 0.5
    testView.tag = 100
    testView.isUserInteractionEnabled = true
    self.view.addSubview(testView)

    let aSelector : Selector = #selector(GasMapViewController.removeSubview)
    let tapGesture = UITapGestureRecognizer(target:self, action: aSelector)
    testView.addGestureRecognizer(tapGesture)
}

func removeSubview(){
    print(&quot;Start remove sibview&quot;)
    if let viewWithTag = self.view.viewWithTag(100) {
        viewWithTag.removeFromSuperview()
    }else{
        print(&quot;No!&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&gt;&lt;/font&gt;&lt;code&gt;viewWithTag&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;tag&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;override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let point = touch.locationInView(self.view)

    if let viewWithTag = self.view.viewWithTag(100) {
        print(&quot;Tag 100&quot;)
        viewWithTag.removeFromSuperview()
    } else {
        print(&quot;tag not found&quot;)
    }
}
&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;foo&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;removeFromSuperview&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;foo.removeFromSuperview()
&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;사용자 지정 CollectionViewCell 내부에 보기가 있으며 해당 보기에 그래프가 포함되어 있습니다.&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;cell.cellView.addSubview(graph)
graph.tag = 10
&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;이제 제거할 코드 블록에서(제스처 Recognizer Function의 경우)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if let removable = cell.cellView.viewWithTag(10){
   removable.removeFromSuperview()
}
&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;cell.cellView.addSubview(graph)
graph.tag = 10
&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;XCode 8과 Swift 3을 사용하여 이 코드를 테스트했습니다.&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;SuperView에 Custom View를 추가하려면 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;self.view.addSubview(myView)&lt;/code&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;Superview에서 Custom View를 제거하려면 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;self.view.willRemoveSubview(myView)&lt;/code&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/28197079/swift-addsubview-and-remove-it&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Swift</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1614</guid>
      <comments>https://goodsource.tistory.com/1614#entry1614comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:29 +0900</pubDate>
    </item>
    <item>
      <title>각지지 않은 페이지 내에 각지지 않은 2가지 구성요소 분사</title>
      <link>https://goodsource.tistory.com/1613</link>
      <description>&lt;h2 papago-id=&quot;0&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;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 Angular 1 -&amp;gt; Angular 2의 업그레이드 경로와 Angular 1 작업에서 수행한 한 가지 작업은 앱이 아닌 공용 페이지에서 일부 구성 요소를 재사용하는 것입니다.&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;이러한 페이지는 효과적으로 정적 HTML이며(레일에 의해 렌더링되지만), 일부 Angular 2 구성요소는 페이지 내에 제자리에 떨어집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 작업은 Angular 1에서 시작하여 필요한 지시사항과 구성요소를 제공하는 모듈로 문서 요소를 부트스트랩했습니다.&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;Angular 2를 사용하면 전부 또는 전혀 아닌 것처럼 보입니다.&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;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적 HTML 페이지에서 필요에 따라 Angular 2 구성 요소를 사용하는 것이 가능합니까, 아니면 단일 루트 요소 SPA 설계로 전환해야 합니까?&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;그래서 제가 처음에 생각했던 것보다 간단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://angular.io/docs/js/latest/api/platform/browser/bootstrap-function.html#!#bootstrapping-multiple-applications&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;Angular &lt;/a&gt;2&lt;a href=&quot;https://angular.io/docs/js/latest/api/platform/browser/bootstrap-function.html#!#bootstrapping-multiple-applications&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt; 문서&lt;/a&gt;에는 여러 앱의 부트스트래핑에 관한 몇 가지 특정한 문구가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;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;이러한 리소스를 나타내는 Angular 서비스도 동일한 브라우저 창을 점유하는 모든 Angular 애플리케이션에서 공유되어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 이유로 Angular는 모든 공유 서비스를 저장하는 하나의 글로벌 플랫폼 개체를 생성하고, 각 Angular 애플리케이션 인젝터는 플랫폼 인젝터를 부모로 합니다.&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;한 페이지에 여러 개의 응용 프로그램이 있는 경우 Angular는 각 응용 프로그램 인젝터의 서비스를 해당 응용 프로그램의 개인 서비스로 취급합니다.&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;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;아직 시도하지 않은 한 가지는 Angular 2 구성 요소 이외에서 사용하기 위한 Angular 2 &lt;a href=&quot;https://angular.io/docs/ts/latest/guide/attribute-directives.html&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;저는 그것이 작동하지 않을 것이고 부트스트랩은 지시사항이 아닌 구성요소에서만 작동한다고 생각합니다.&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;지침의 관점에서, 저는 Angular 2가 정적 페이지 전체에 살수 동작을 위해 실제로 설계된 것이 아니며 아마도 그런 방식으로 사용되어서는 안 된다고 제안하고 싶습니다.&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;/blockquote&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 지금 Angular2를 사용하고 있는 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/niczero/ng2-es5-file-upload/blob/master/demo/index.html 의 예를 참조하십시오. 내 '정적' 페이지 중 일부는 당신이 루비를 사용하는 것과 같은 방식으로 펄에 의해 생성됩니다.&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;a href=&quot;https://github.com/umdjs/umd&quot; papago-id=&quot;15-1&quot; rel=&quot;nofollow&quot;&gt;범용 모듈&lt;/a&gt; 정의를 &lt;a href=&quot;https://github.com/umdjs/umd&quot; papago-id=&quot;15-1&quot; rel=&quot;nofollow&quot;&gt;사용&lt;/a&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/35418243/sprinkling-angular-2-components-inside-a-non-angular-page&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularjs</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1613</guid>
      <comments>https://goodsource.tistory.com/1613#entry1613comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:22 +0900</pubDate>
    </item>
    <item>
      <title>pandas데이터프레임 다중 인덱스에서 열 선택</title>
      <link>https://goodsource.tistory.com/1612</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;pandas데이터프레임 다중 인덱스에서 열 선택&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;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/18470323/selecting-columns-from-pandas-multiindex&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;(13개 답변)&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;2019-01-300 06:53:35Z&quot; papago-attr-id=&quot;1&quot;&gt;4년 전&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;다음 pd가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 프레임:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Name    0                       1                      ...
Col     A           B           A            B         ...
0       0.409511    -0.537108   -0.355529    0.212134  ...
1       -0.332276   -1.087013    0.083684    0.529002  ...
2       1.138159    -0.327212    0.570834    2.337718  ...
&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;MultiIndex 열이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;names=['Name', 'Col']&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;Name&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라벨은 0에서 n까지이고, 각각의 라벨에는 2개가 있습니다.&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;/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;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;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;) 이 DataFrame의 열입니다.&lt;/font&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&gt;&lt;/font&gt;&lt;code&gt;get_level_values&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;In [13]:

df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([[1,2],['A','B']])
print df
          1                   2          
          A         B         A         B
0  0.543980  0.628078  0.756941  0.698824
1  0.633005  0.089604  0.198510  0.783556
2  0.662391  0.541182  0.544060  0.059381
3  0.841242  0.634603  0.815334  0.848120
In [14]:

print df.iloc[:, df.columns.get_level_values(1)=='A']
          1         2
          A         A
0  0.543980  0.756941
1  0.633005  0.198510
2  0.662391  0.544060
3  0.841242  0.815334
&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;방법 1:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.xs('A', level='Col', axis=1)
&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;자세한 내용은 http://pandas.pydata.org/pandas-docs/stable/advanced.html#cross-section 을 참조하십시오.&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;방법 2:.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.loc[:, (slice(None), 'A')]
&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;strong papago-id=&quot;19-0&quot;&gt;주의&lt;/strong&gt; 사항&lt;strong papago-id=&quot;19-0&quot;&gt;:&lt;/strong&gt; 이 메서드를 사용하려면 레이블을 정렬해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 http://pandas.pydata.org/pandas-docs/stable/advanced.html#the-need-for-sortedness-with-multiindex 을 참조하십시오.&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;EDIT* 현재 가장 좋은 방법은 indexSlice를 사용하여 다중 인덱스를 선택하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;idx = pd.IndexSlice
A = df.loc[:,idx[:,'A']]
B = df.loc[:,idx[:,'B']]
&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;URL : https://stackoverflow.com/questions/25189575/pandas-dataframe-select-columns-in-multiindex&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1612</guid>
      <comments>https://goodsource.tistory.com/1612#entry1612comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:15 +0900</pubDate>
    </item>
    <item>
      <title>문자열의 마지막 4자를 얻는 방법은?</title>
      <link>https://goodsource.tistory.com/1611</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;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;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/24044851/how-do-you-use-string-substringwithrange-or-how-do-ranges-work-in-swift&quot; dir=&quot;ltr&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;String.substringWithRange를 어떻게 사용합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(또는 Swift에서 Range는 어떻게 작동합니까?)&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;(33개 답변)&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;2015-10-09:15:51Z&quot; papago-attr-id=&quot;1&quot;&gt;7년 전&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;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;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;var a = &quot;StackOverFlow&quot;
var last4 = a.lastFour // That's what I want to do
print(last4) // prints Flow
&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;스위프트 2:&lt;/font&gt;&lt;/strong&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;substringFromIndex&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let a = &quot;StackOverFlow&quot;
let last4 = a.substringFromIndex(a.endIndex.advancedBy(-4))
&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;suffix&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;characters&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let last4 = String(a.characters.suffix(4))
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 3:&lt;/font&gt;&lt;/strong&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;스위프트 3에서 첫번째 솔루션의 구문은 다음으로 변경되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let last4 = a.substring(from:a.index(a.endIndex, offsetBy: -4))
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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;스위프트 4+:&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;Swift 4에서는 더욱 편리해집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let last4 = a.suffix(4)
&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;결과 유형이 새 유형입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Substring&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;String&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;code&gt;String&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;let last4 = String(a.suffix(4))
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;String substr = a.substring(a.length() - 4)
&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;font class=&quot;papago-parent&quot;&gt;스위프트에서 대표팀에 앞서서는 유형이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let a = &quot;1234567890&quot;
let last4 = String(a.characters.suffix(4))
print(last4)
&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;스위프트 3.0에서 작업.&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/32849789/how-to-get-last-4-characters-of-a-string&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Swift</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1611</guid>
      <comments>https://goodsource.tistory.com/1611#entry1611comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:09 +0900</pubDate>
    </item>
    <item>
      <title>텍스트를 변경할 때마다 UITtextView가 맨 위로 스크롤되도록 하려면 어떻게 해야 합니까?</title>
      <link>https://goodsource.tistory.com/1610</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트를 변경할 때마다 UITtextView가 맨 위로 스크롤되도록 하려면 어떻게 해야 합니까?&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;UITextView&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;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;UITextView&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&gt;&lt;code&gt;UITextView&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;UITextView&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&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;UITextView&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&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;&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;UITextView&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;노력했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;contentOffset&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;scrollRangeToVisible&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 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 class=&quot;lang-obj-c prettyprint-override&quot;&gt;&lt;code&gt;UITextView*note;
[note setContentOffset:CGPointZero animated:YES];
&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;Swift 버전 (Xcode 9.3에서 iOS 11이 탑재된 Swift 4.1):&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;note.setContentOffset(.zero, animated: true)
&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;iOS 8에서 이 문제를 가진 사람이 있다면, 저는 그냥 설정을 하는 것을 발견했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UITextView's&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;scrollRangeToVisible&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;NSRange&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;location:0&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;length:0&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 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;/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;myTextView.text = &quot;Text that is long enough to scroll&quot;
myTextView.scrollRangeToVisible(NSRange(location:0, length:0))
&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;pre&gt;&lt;code&gt;    override func viewDidLoad() {
        textView.scrollEnabled = false
        textView.text = &quot;your text&quot;
    }

    override func viewDidAppear(animated: Bool) {
        textView.scrollEnabled = true
    }
&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;pre&gt;&lt;code&gt;scrollRangeToVisible(NSMakeRange(0, 0))
&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;pre&gt;&lt;code&gt;override func viewDidAppear(animated: Bool)
&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;텍스트 뷰를 편집할 수 없는 HTML에서 attributedString을 사용하고 있었습니다.&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;[yourTextView setScrollEnabled:NO];
yourTextView.text = yourtext;
[yourTextView setScrollEnabled:YES];
&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;override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        let desiredOffset = CGPoint(x: 0, y: -self.textView.contentInset.top)
        self.textView.setContentOffset(desiredOffset, animated: false)
    })
}
&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;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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그렇다면 당신은 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt; [textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES]; &lt;/code&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;iOS 10 및 Swift 3의 경우 다음과 같이 수행했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;override func viewDidLoad() {
    super.viewDidLoad()
    textview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    textView.isScrollEnabled = 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;스위프트와 iOS의 최신 버전에 문제가 있는지 잘 모르겠습니다.&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;이렇게 iOS 9 Release에서 작동하여 화면에 표시되기 전에 보기 텍스트가 위쪽으로 스크롤됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (void)viewDidLoad
{
    [super viewDidLoad];
    textView.scrollEnabled = NO;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    textView.scrollEnabled = YES;
}
&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;사용자가 스크롤 애니메이션을 경험하지 않아도 텍스트 뷰가 제대로 나타나는 업데이트된 답변이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        self.introductionText.scrollRangeToVisible(NSMakeRange(0, 0))
    })
&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;저는 그렇게 했습니다.&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;스위프트 4:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension UITextView {

    override open func draw(_ rect: CGRect)
    {
        super.draw(rect)
        setContentOffset(CGPoint.zero, animated: false)
    }

 }
&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;  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async {
      self.textView.scrollRangeToVisible(NSRange(location: 0, length: 0))
    }
  }
&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;strong papago-id=&quot;37-1&quot;&gt;DidLayoutSubviews&lt;/strong&gt;를 호출해야 했습니다(인사이드뷰 DidLoad를 호출하는 것은 너무 빨랐습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    myTextView.setContentOffset(.zero, animated: true)
&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;NSRange r  = {0,0};
[yourTextView setSelectedRange:r];
&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;/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;내 문제는 보기가 나타나면 textView를 상단으로 스크롤하도록 설정하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;iOS 10.3.2와 스위프트 3의 경우.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책 1:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // It doesn't work. Very strange.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // It works, but with an animation effection.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책 2:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // It works.       
    self.textView.contentOffset = CGPoint.zero
}
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
&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;talePageText.scrollEnabled = false
talePageText.textColor = UIColor.blackColor()
talePageText.font = UIFont(name: &quot;Bradley Hand&quot;, size: 24.0)
talePageText.contentOffset = CGPointZero
talePageText.scrollRangeToVisible(NSRange(location:0, length:0))
talePageText.scrollEnabled = true
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;[txtView setContentOffset:CGPointMake(0.0, 0.0) animated:YES];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;45&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;46&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;textView.scrollEnabled = false

/* Set the content of your textView here */

textView.scrollEnabled = true
&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;이렇게 하면 텍스트 보기를 설정한 후 텍스트 끝까지 스크롤할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 3:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;49-0&quot;&gt;viewWillLayoutSubviews&lt;/strong&gt;는 변경할 위치입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;49-2&quot;&gt;viewWillAppear&lt;/strong&gt;도 작동해야 하지만 논리적으로는 &lt;strong papago-id=&quot;49-6&quot;&gt;viewWillLayoutSubviews&lt;/strong&gt;에서 &lt;strong papago-id=&quot;49-4&quot;&gt;레이아웃&lt;/strong&gt;을 수행해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메서드와 관련하여 &lt;strong papago-id=&quot;50-1&quot;&gt;RangeToVisible&lt;/strong&gt; 스크롤 및 &lt;strong papago-id=&quot;50-3&quot;&gt;setContentOffset&lt;/strong&gt;이 모두 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 &lt;strong papago-id=&quot;50-5&quot;&gt;setContentOffset&lt;/strong&gt;을 사용하면 애니메이션을 끄거나 켤 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;51-1&quot;&gt;UITextView&lt;/strong&gt;의 이름이 다음 &lt;strong papago-id=&quot;51-3&quot;&gt;이름&lt;/strong&gt;으로 지정되었다고 가정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UIT &lt;strong papago-id=&quot;51-3&quot;&gt;textView&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Connects to the TextView in the interface builder.
@IBOutlet weak var yourUITextView: UITextView!

/// Overrides the viewWillLayoutSubviews of the super class.
override func viewWillLayoutSubviews() {

    // Ensures the super class is happy.
    super.viewWillLayoutSubviews()

    // Option 1:
    // Scrolls to a range of text, (0,0) in this very case, animated.
    yourUITextView.scrollRangeToVisible(NSRange(location: 0, length: 0))

    // Option 2:
    // Sets the offset directly, optional animation.
    yourUITextView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
&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;font class=&quot;papago-parent&quot;&gt;이는 RyanTCBs의 답변을 기반으로 하지만 동일한 솔루션의 Objective-C 변형입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (void) viewWillAppear:(BOOL)animated {
    // For some reason the text view, which is a scroll view, did scroll to the end of the text which seems to hide the imprint etc at the beginning of the text.
    // On some devices it is not obvious that there is more text when the user scrolls up.
    // Therefore we need to scroll textView to the top.
    [self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    [textview setContentOffset:CGPointZero animated:NO];
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;-(void) viewDidAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}

- (void)viewWillAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;ViewWillappear&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;ViewDidDisappear&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;/li&gt; 
 &lt;li&gt;&lt;code&gt;[mytextView setContentOffset:CGPointZero animated:YES];&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;/li&gt; 
&lt;/ul&gt;&lt;pre&gt;&lt;code&gt;[self.textView scrollRectToVisible:CGRectMake(0, 0, 320, self.textView.frame.size.height) animated:NO];
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제 해결: iOS = 10.2 Swift 3 UITextView&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;displayText.contentOffset.y = 0
&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;문제가 있었지만 텍스트 뷰의 경우 일부 사용자 정의 뷰의 하위 뷰를 View Controller에 추가했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 해결책도 제게 효과가 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제를 해결하기 위해 0.1초 지연을 추가한 다음 스크롤을 활성화했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 나에게 효과가 있었다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;textView.isScrollEnabled = false
..
textView.text = // set your text here

let dispatchTime = DispatchTime.now() + 0.1
DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
   self.textView.isScrollEnabled = true
}
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    textView.attributedText = newText //or textView.text = ...

    //this part of code scrolls to top
    textView.contentOffset.y = -64
    textView.scrollEnabled = false
    textView.layoutIfNeeded() //if don't work, try to delete this line
    textView.scrollEnabled = true
&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;정확한 위치로 스크롤하여 화면 맨 위에 표시하려면 다음 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    var scrollToLocation = 50 //&amp;lt;needed position&amp;gt;
    textView.contentOffset.y = textView.contentSize.height
    textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;contentOffset.y를 설정하면 텍스트 끝까지 스크롤한 다음 RangeToVisible을 스크롤 ToLocation 값까지 스크롤합니다.&lt;/font&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;iOS 9의 경우 스크롤RangeToVisible(1행은 굵은 글꼴, 다른 행은 일반 글꼴) 메서드의 속성 문자열로 작동하지 않았습니다.&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;그래서 나는 다음을 사용해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;textViewMain.attributedText = attributedString
textViewMain.scrollRangeToVisible(NSRange(location:0, length:0))
delay(0.0, closure: { 
                self.textViewMain.scrollRectToVisible(CGRectMake(0, 0, 10, 10), animated: false)
            })
&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;func delay(delay:Double, closure:()-&amp;gt;Void) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}
&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;view.layoutIfNeeded()
textView.contentOffset = CGPointMake(textView.contentInset.left, textView.contentInset.top)
&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;잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyViewController: ... 
{
  private offsetY: CGFloat = 0
  @IBOutlet weak var textView: UITextView!
  ...

  override viewWillAppear(...) 
  {
      ...
      offsetY = self.textView.contentOffset.y
      ...
  }
  ...
  func refreshView() {
      let offSetY = textView.contentOffset.y
      self.textView.setContentOffset(CGPoint(x:0, y:0), animated: true)
      DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
        [unowned self] in
        self.textView.setContentOffset(CGPoint(x:0, y:self.offSetY), 
           animated: true)
        self.textView.setNeedsDisplay()
      }
  }
&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/1234242/how-do-i-force-a-uitextview-to-scroll-to-the-top-every-time-i-change-the-text&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1610</guid>
      <comments>https://goodsource.tistory.com/1610#entry1610comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:47:02 +0900</pubDate>
    </item>
    <item>
      <title>관계 열은 어디서 같습니까?</title>
      <link>https://goodsource.tistory.com/1609</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;stats()&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 class=&quot;papago-parent&quot;&gt;저는 보통.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;::where('column_name' 'column_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;/p&gt; 
&lt;pre&gt;&lt;code&gt;Player::where('column_name', 'column_value')-&amp;gt;get();
&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;public function roleplay()
{
    return $this-&amp;gt;hasOne('App\Database\Frontend\User\Roleplay', 'user_id', 'id');
}
&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;Player::whereHas('roleplay', function($q){
   $q-&amp;gt;where('column_name', 'value');
})-&amp;gt;get();
&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;Laravel 8^ : 문서 &lt;a href=&quot;https://laravel.com/docs/9.x/eloquent-relationships&quot; rel=&quot;noreferrer&quot; papago-id=&quot;6-1&quot;&gt;관계 존재 쿼리&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Product::with('categoreys')-&amp;gt;whereRelation('categoreys', 'status', '0')
                                            -&amp;gt;get();
&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/43105870/where-relationship-column-equals&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1609</guid>
      <comments>https://goodsource.tistory.com/1609#entry1609comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:46:52 +0900</pubDate>
    </item>
    <item>
      <title>클릭시 이 요소를 자바스크립트로 전달하고 클릭한 요소에 클래스를 추가하는 방법</title>
      <link>https://goodsource.tistory.com/1608</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;아래와 같은 html 네비게이션 코드를 가지고 있었습니다.&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 Data(string) {
  //1. get some data from server according to month year etc.,
  //2. unactive all the remaining li's and make the current clicked element active by adding &quot;active&quot; class to the element
  $('.filter').removeClass('active');
  $(this).addClass('active');
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div class=&quot;row&quot; style=&quot;padding-left:21px;&quot;&amp;gt;
  &amp;lt;ul class=&quot;nav nav-tabs&quot; style=&quot;padding-left:40px;&quot;&amp;gt;
    &amp;lt;li class=&quot;active filter&quot;&amp;gt;&amp;lt;a href=&quot;#month&quot; onclick=&quot;Data('month')&quot;&amp;gt;This Month&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#year&quot; onclick=&quot;Data('year')&quot;&amp;gt;Year&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last60&quot; onclick=&quot;Data('last60')&quot;&amp;gt;60 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last90&quot; onclick=&quot;Data('last90')&quot;&amp;gt;90 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;/div&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;2&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;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;/ul&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;ol&gt; 
 &lt;li papago-id=&quot;6&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 class=&quot;papago-parent&quot;&gt;당신이 당신을 도울 수 있는 방법이 있나요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&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;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭한 요소를 가져오려면 다음 html을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;row&quot; style=&quot;padding-left:21px;&quot;&amp;gt;
    &amp;lt;ul class=&quot;nav nav-tabs&quot; style=&quot;padding-left:40px;&quot;&amp;gt;
        &amp;lt;li class=&quot;active filter&quot;&amp;gt;&amp;lt;a href=&quot;#month&quot; onclick=&quot;Data('month', this)&quot;&amp;gt;This Month&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#year&quot; onclick=&quot;Data('year', this)&quot;&amp;gt;Year&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last60&quot; onclick=&quot;Data('last60', this)&quot;&amp;gt;60 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last90&quot; onclick=&quot;Data('last90', this)&quot;&amp;gt;90 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt; 
&amp;lt;/div&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;pre&gt;&lt;code&gt; function Data(string, el)
 {
     $('.filter').removeClass('active');
     $(el).parent().addClass('active');
 } 
&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;&amp;lt;script&amp;gt;
function Data(string)
{      
  $('.filter').removeClass('active');
  $(this).parent('.filter').addClass('active') ;
} 
&amp;lt;/script&amp;gt;
&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&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;strong papago-id=&quot;3-1&quot;&gt;학명&lt;/strong&gt; 앞에&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-3&quot;&gt;그리고&lt;/strong&gt; 부모님을 위한 수업을 추가해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 앵커 태그를 클릭하고 있기 때문에 그렇지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;filter&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;&amp;lt;div class=&quot;row&quot; style=&quot;padding-left:21px;&quot;&amp;gt;
    &amp;lt;ul class=&quot;nav nav-tabs&quot; style=&quot;padding-left:40px;&quot;&amp;gt;
        &amp;lt;li class=&quot;active filter&quot;&amp;gt;&amp;lt;a href=&quot;#month&quot; onclick=&quot;Data(this)&quot;&amp;gt;This Month&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#year&quot; onclick=&quot;Data(this)&quot;&amp;gt;Year&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last60&quot; onclick=&quot;Data(this)&quot;&amp;gt;60 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last90&quot; onclick=&quot;Data(this)&quot;&amp;gt;90 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;

&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    function Data(element)
    {     
       element.removeClass('active');
       element.addClass('active') ;
    }
&amp;lt;/script&amp;gt;
&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;font class=&quot;papago-parent&quot;&gt;이를 참조하기 위해 함수에 다른 매개 변수를 추가해 봅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수의 &quot;a&quot; 요소에 추가하려고 하는 동안 처음에는 li 요소에 대한 active class도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;한번 해보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;row&quot; style=&quot;padding-left:21px;&quot;&amp;gt;
 &amp;lt;ul class=&quot;nav nav-tabs&quot; style=&quot;padding-left:40px;&quot;&amp;gt;
      &amp;lt;li class=&quot;active filter&quot;&amp;gt;&amp;lt;a href=&quot;#month&quot; onclick=&quot;Data('month',this)&quot;&amp;gt;This Month&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#year&quot; onclick=&quot;Data('year',this)&quot;&amp;gt;Year&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last60&quot;  onclick=&quot;Data('last60',this)&quot;&amp;gt;60 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class=&quot;filter&quot;&amp;gt;&amp;lt;a href=&quot;#last90&quot;  onclick=&quot;Data('last90',this)&quot;&amp;gt;90 Days&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt; 

&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
  function Data(string,element)
    { 
      //1. get some data from server according to month year etc.,
      //2. unactive all the remaining li's and make the current clicked element active by adding &quot;active&quot; class to the element
      $('.filter').removeClass('active');

      $(element).parent().addClass('active') ;

    } 
&amp;lt;/script&amp;gt;
&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;addEventListener&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;this&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;p&gt;&lt;strong papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;button id=&quot;button&quot;&amp;gt;Year&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;(function () {
    var btn = document.getElementById('button');
    btn.addEventListener('click', function () {
        Date('#year');
    }, false);
})();

 function Data(string)
          {
                $('.filter').removeClass('active');
                $(this).parent().addClass('active') ;
          } 
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js&quot;&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery-2.1.0.js&quot;&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;script type=&quot;text/javascript&quot; &amp;gt;
function openOnImageClick(event)
{
//alert(&quot;Jai Sh Raam&quot;);
// document.getElementById(&quot;images&quot;).src = &quot;fruits.jpg&quot;;
var target = event.target || event.srcElement; // IE

console.log(target);
console.log(target.src);
 var img = document.createElement('img');
 img.setAttribute('src', target.src);
  img.setAttribute('width', '200');
   img.setAttribute('height', '150');
  document.getElementById(&quot;images&quot;).appendChild(img);


}


&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h1&amp;gt;Screen Shot View&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Click the Tiger to display the Image&amp;lt;/p&amp;gt;

&amp;lt;div id=&quot;images&quot; &amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;img src=&quot;tiger.jpg&quot; width=&quot;100&quot; height=&quot;50&quot; alt=&quot;unfinished bingo card&quot; onclick=&quot;openOnImageClick(event)&quot; /&amp;gt;
&amp;lt;img src=&quot;sabaLogo1.jpg&quot; width=&quot;100&quot; height=&quot;50&quot; alt=&quot;unfinished bingo card&quot; onclick=&quot;openOnImageClick(event)&quot; /&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt; 
&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;URL : https://stackoverflow.com/questions/19998711/how-to-pass-this-element-to-javascript-onclick-function-and-add-a-class-to-that&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1608</guid>
      <comments>https://goodsource.tistory.com/1608#entry1608comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:46:46 +0900</pubDate>
    </item>
    <item>
      <title>Android Retrofit 라이브러리에서 클래스의 변환기를 만들 수 없습니다.</title>
      <link>https://goodsource.tistory.com/1607</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Retrofit 라이브러리에서 클래스의 변환기를 만들 수 없습니다.&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;발리를 사용하는 것에서 레트로핏으로 마이그레이션하고 있는데, 이전에 JSONObject 응답을 gson 주석을 구현하는 객체로 변환할 때 사용했던 gson 클래스가 이미 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;retrofit을 사용하여 http get request를 하려고 하는데 다음 오류와 함께 앱이 충돌하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; Unable to start activity ComponentInfo{com.lightbulb.pawesome/com.example.sample.retrofit.SampleActivity}: java.lang.IllegalArgumentException: Unable to create converter for class com.lightbulb.pawesome.model.Pet
    for method GitHubService.getResponse
&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;http://square.github.io/retrofit/&quot; papago-id=&quot;2-1&quot;&gt;개조&lt;/a&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;retro http 요청을 실행하려는 제 활동입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class SampleActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(&quot;**sample base url here**&quot;)
                .build();

        GitHubService service = retrofit.create(GitHubService.class);
        Call&amp;lt;Pet&amp;gt; callPet = service.getResponse(&quot;41&quot;, &quot;40&quot;);
        callPet.enqueue(new Callback&amp;lt;Pet&amp;gt;() {
            @Override
            public void onResponse(Response&amp;lt;Pet&amp;gt; response) {
                Log.i(&quot;Response&quot;, response.toString());
            }

            @Override
            public void onFailure(Throwable t) {
                Log.i(&quot;Failure&quot;, t.toString());
            }
        });
        try{
            callPet.execute();
        } catch (IOException e){
            e.printStackTrace();
        }

    }
}
&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;나의 API가 된 나의 인터페이스&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface GitHubService {
    @GET(&quot;/ **sample here** /{petId}/{otherPet}&quot;)
    Call&amp;lt;Pet&amp;gt; getResponse(@Path(&quot;petId&quot;) String userId, @Path(&quot;otherPet&quot;) String otherPet);
}
&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;public class Pet implements Parcelable {

    public static final String ACTIVE = &quot;1&quot;;
    public static final String NOT_ACTIVE = &quot;0&quot;;

    @SerializedName(&quot;is_active&quot;)
    @Expose
    private String isActive;
    @SerializedName(&quot;pet_id&quot;)
    @Expose
    private String petId;
    @Expose
    private String name;
    @Expose
    private String gender;
    @Expose
    private String age;
    @Expose
    private String breed;
    @SerializedName(&quot;profile_picture&quot;)
    @Expose
    private String profilePicture;
    @SerializedName(&quot;confirmation_status&quot;)
    @Expose
    private String confirmationStatus;

    /**
     *
     * @return
     * The confirmationStatus
     */
    public String getConfirmationStatus() {
        return confirmationStatus;
    }

    /**
     *
     * @param confirmationStatus
     * The confirmation_status
     */
    public void setConfirmationStatus(String confirmationStatus) {
        this.confirmationStatus = confirmationStatus;
    }

    /**
     *
     * @return
     * The isActive
     */
    public String getIsActive() {
        return isActive;
    }

    /**
     *
     * @param isActive
     * The is_active
     */
    public void setIsActive(String isActive) {
        this.isActive = isActive;
    }

    /**
     *
     * @return
     * The petId
     */
    public String getPetId() {
        return petId;
    }

    /**
     *
     * @param petId
     * The pet_id
     */
    public void setPetId(String petId) {
        this.petId = petId;
    }

    /**
     *
     * @return
     * The name
     */
    public String getName() {
        return name;
    }

    /**
     *
     * @param name
     * The name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     *
     * @return
     * The gender
     */
    public String getGender() {
        return gender;
    }

    /**
     *
     * @param gender
     * The gender
     */
    public void setGender(String gender) {
        this.gender = gender;
    }

    /**
     *
     * @return
     * The age
     */
    public String getAge() {
        return age;
    }

    /**
     *
     * @param age
     * The age
     */
    public void setAge(String age) {
        this.age = age;
    }

    /**
     *
     * @return
     * The breed
     */
    public String getBreed() {
        return breed;
    }

    /**
     *
     * @param breed
     * The breed
     */
    public void setBreed(String breed) {
        this.breed = breed;
    }

    /**
     *
     * @return
     * The profilePicture
     */
    public String getProfilePicture() {
        return profilePicture;
    }

    /**
     *
     * @param profilePicture
     * The profile_picture
     */
    public void setProfilePicture(String profilePicture) {
        this.profilePicture = profilePicture;
    }


    protected Pet(Parcel in) {
        isActive = in.readString();
        petId = in.readString();
        name = in.readString();
        gender = in.readString();
        age = in.readString();
        breed = in.readString();
        profilePicture = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(isActive);
        dest.writeString(petId);
        dest.writeString(name);
        dest.writeString(gender);
        dest.writeString(age);
        dest.writeString(breed);
        dest.writeString(profilePicture);
    }

    @SuppressWarnings(&quot;unused&quot;)
    public static final Parcelable.Creator&amp;lt;Pet&amp;gt; CREATOR = new Parcelable.Creator&amp;lt;Pet&amp;gt;() {
        @Override
        public Pet createFromParcel(Parcel in) {
            return new Pet(in);
        }

        @Override
        public Pet[] newArray(int size) {
            return new Pet[size];
        }
    };
}
&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;IE:&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 class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;    public class foo {
      @SerializedName(&quot;name&quot;)
      String firstName;
      @SerializedName(&quot;name&quot;)
      String lastName;
    }
&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 class=&quot;lang-kotlin prettyprint-override&quot;&gt;&lt;code&gt;     @SerializedName(&quot;name&quot;) val firstName: String
     @SerializedName(&quot;name&quot;) val lastName: 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;strong papago-id=&quot;10-0&quot;&gt;업데이트&lt;/strong&gt;: 이 논리는 상속을 통해서도 성립됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하위 클래스와 동일한 Serialized 이름을 가진 개체를 가진 상위 클래스로 확장하면 이와 같은 문제가 발생합니다.&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;2.0.0&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;, 기본 변환기는 agson 변환기였지만,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;2.0.0&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;ResponseBody&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;blockquote&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 class=&quot;papago-parent&quot;&gt;기본적으로 Retrofit은 HTTP 본문을 OkHttp의 것으로만 병렬화할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ResponseBody&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;type 그리고 그것은 오직 그것을 받아들일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RequestBody&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;@Body&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;/p&gt; 
&lt;/blockquote&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;2.0.0+&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;, Gson 변환기를 사용할 것을 명시적으로 지정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(&quot;**sample base url here**&quot;)
    .addConverterFactory(GsonConverterFactory.create())
    .build();
&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;compile 'com.squareup.retrofit2:converter-gson:2.1.0'
&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;compile ('com.squareup.retrofit2:retrofit:2.1.0')
&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;font class=&quot;papago-parent&quot;&gt;문서에서:&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;참고: 이 사이트는 새로운 2.0 API를 위해 아직 확장 중입니다.&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; @SerializedName(&quot;name&quot;) val name: String
 @SerializedName(&quot;name&quot;) val firstName: String
&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;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;implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
&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;저는 스포티파이 json 결과에서 pojo를 만들고 Gson 형식을 지정하기 위해 http://www.jsonschema2pojo.org/ 을 사용했습니다.&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;맥의 좋은 옵션 중 하나는 Quicktype입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://itunes.apple.com/us/app/paste-json-as-code-quicktype/id1330801220&quot; rel=&quot;noreferrer&quot; papago-id=&quot;29-1&quot;&gt;https://itunes.apple.com/us/app/paste-json-as-code-quicktype/id1330801220&lt;/a&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;제 경우는 레트로핏 2.0을 탑재한 Moshi 라이브러리를 사용하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Moshi
implementation 'com.squareup.moshi:moshi-kotlin:1.9.3'
// Retrofit with Moshi Converter
implementation 'com.squareup.retrofit2:converter-moshi:2.9.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;커스텀 Moshi json 컨버터 어댑터 팩토리 오브젝트를 Moshi 컨버터 팩토리 컨스트럭터에 전달하는 것을 잊었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private val moshi = Moshi.Builder() // adapter
    .add(KotlinJsonAdapterFactory())
    .build()

private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create()) // &amp;lt;- missing moshi json adapter insance
    .baseUrl(BASE_URL)
    .build()
&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&gt;&lt;/font&gt;&lt;code&gt;.addConverterFactory(MoshiConverterFactory.create(moshi))&lt;/code&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;저의 경우, 제 모달 클래스 안에 TextView 객체가 있었는데 GSON은 그것을 직렬화하는 방법을 몰랐습니다.&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;font class=&quot;papago-parent&quot;&gt;저 같은 경우는 'id'를 연작명으로 사용한 것인데요, 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; @SerializedName(&quot;id&quot;)
var node_id: String? = null
&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;pre&gt;&lt;code&gt; @SerializedName(&quot;node_id&quot;)
var node_id: String? = null
&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;font class=&quot;papago-parent&quot;&gt;저는 'id'가 기본 속성이라는 것을 잊었습니다.&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;font class=&quot;papago-parent&quot;&gt;그래서 제가 가진 것은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Json(name = &quot;items&quot;)
private ArrayList&amp;lt;ItemModel&amp;gt; items;
&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;@Json(name = &quot;items&quot;)
private List&amp;lt;ItemModel&amp;gt; items;
&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;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;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우 실수로 &lt;a href=&quot;https://stackoverflow.com/questions/28957285/what-is-the-basic-purpose-of-serializedname-annotation-in-android-using-gson&quot; papago-id=&quot;41-1&quot;&gt;시리얼라이즈드&lt;/a&gt; 네임을 이렇게 썼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@SerializedName(&quot;name&quot;,&quot;time&quot;)
String name,time; 
&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;pre&gt;&lt;code&gt;@SerializedName(&quot;name&quot;)
String name;

@SerializedName(&quot;time&quot;)
String time;
&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;저의 경우 SUPERCLASS 모델에 이 필드가 정의되어 있는 것이 문제였습니다.&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;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;build.gradle&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;minifyEnabled true
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;minifyEnabled false
&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;제 문제를 해결했습니다.&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;kotlinx.serialization&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;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;@Serializable&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Serializable
data class MyClass(
    val id: String
)
&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;Serialization&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;br&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;@kotlinx.serialization.Serializable&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;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@kotlinx.serialization.Serializable
data class RadioSearchPodcastDto(
    val playables: List&amp;lt;Playable&amp;gt;,
    val searchTag: SearchTag,
    val totalCount: Int
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;56&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;interface PodcastRadioApi {
     @GET(&quot;/podcasts/search&quot;)
     suspend fun getPodcastBySearch(@Query(&quot;query&quot;) query: String,
                                    @Query(&quot;count&quot;) count: Int,
                                    @Query(&quot;offset&quot;) offset: Int,
                                    @Query(&quot;partner&quot;) partner: String): RadioSearchPodcastDto
}
&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;모두, 메인 클래스와 모든 서브 클래스(Playable, SearchTag, ...)를 의미합니다.&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;내 코드에 Daggar를 사용하고 있으며 개조 인스턴스에 Gson 변환기를 구현해야 했습니다.&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;pre&gt;&lt;code&gt;@Provides
    @Singleton
    Retrofit providesRetrofit(Application application,OkHttpClient client) {
        String SERVER_URL=URL;
        Retrofit.Builder builder = new Retrofit.Builder();
        builder.baseUrl(SERVER_URL);
        return builder
                .client(client)
                .build();
    }
&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;이것이 제가 결국 하게 된 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Provides
    @Singleton
    Retrofit providesRetrofit(Application application,OkHttpClient client, Gson gson) {
        String SERVER_URL=URL;
        Retrofit.Builder builder = new Retrofit.Builder();
        builder.baseUrl(SERVER_URL);
        return builder
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫번째 예에 컨버터가 없고 Gson을 인스턴스화하지 않았다면 이렇게 추가할 수 있습니다. 이렇게 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();

   gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }
&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;이것이 나 같은 사람에게 도움이 되기를 다시 한번 바랍니다.&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;제 경우에는 ConverterFactory를 Moshi에서 Gson으로 변경해야 했고 그것은 의지가 되었습니다.&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;.addConverterFactory(GsonConverterFactory.create())&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&gt;&lt;code&gt;@XNullable&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 papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 moshi를 사용하는데 저의 경우 &lt;strong papago-id=&quot;68-1&quot;&gt;@JsonClass 주석&lt;/strong&gt;이 빠져있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@JsonClass(generateAdapter = true)
data class Response (
    val summary: String?
)
&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;.asLenient()&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;MoshiConverterFactory.create(moshi)&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;MoshiConverterFactory.create(moshi).asLenient()&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;그리고 logcat에서 원인을 알 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&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;제 프로젝트에서는 무엇이 잘못된 것인지를 보여주었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Caused by: java.lang.IllegalArgumentException:
Platform class java.sql.Time (with no annotations)
requires explicit JsonAdapter to be registered
for class java.sql.Time finishTime
&lt;/code&gt;&lt;/pre&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;Time finishTime&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; 일시적으로 &quot;String&quot;으로 종류를 변경했는데&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;String&quot;으로 종류를 변경했는데 오류가 사라졌습니다.&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;제 경우에는 제가 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Moshi&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;Retrofit&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;/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;나는 a를 정의하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;body&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;Response&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;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;82&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;@JsonSerializable
data class Balance(
    @field:Json(name = &quot;balance&quot;) var balance: Double,
    @field:Json(name = &quot;currency&quot;) var currency: Currency
&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;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Currency&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 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;그래서 완성하고 문제를 해결했습니다!&lt;/font&gt;&lt;/font&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/32367469/unable-to-create-converter-for-my-class-in-android-retrofit-library&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>android</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1607</guid>
      <comments>https://goodsource.tistory.com/1607#entry1607comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:46:37 +0900</pubDate>
    </item>
    <item>
      <title>uitabbar controller 숨김 방법</title>
      <link>https://goodsource.tistory.com/1606</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;uitabbar controller 숨김 방법&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;UITabBarController&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;hidesBottomBarWhenPushed&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;예를 들어, 응용프로그램에서 숨기기 단추를 누를 때 숨기려고 합니다.&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;구글에서 기사를 많이 읽었는데 어떻게 해야 하는지 모르겠어요.&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;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;// Method call
[self hideTabBar:self.tabBarController];   
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;pre&gt;&lt;code&gt;// Method implementations
- (void)hideTabBar:(UITabBarController *) tabbarcontroller
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
        }
    }

    [UIView commitAnimations];   
}

- (void)showTabBar:(UITabBarController *) tabbarcontroller
{       
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {
        NSLog(@&quot;%@&quot;, view);

        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];

        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
        }
    }

    [UIView commitAnimations]; 
}
&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;가로, 세로, 아이패드 모두에서 작동할 수 있도록 수정된 Setomidor의 답변(320 및 480 값은 아이폰에서만 작동)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (void) hideTabBar:(UITabBarController *) tabbarcontroller 
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    float fHeight = screenRect.size.height;
    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
    {
        fHeight = screenRect.size.width;
    }

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
            view.backgroundColor = [UIColor blackColor];
        }
    }
    [UIView commitAnimations];
}



- (void) showTabBar:(UITabBarController *) tabbarcontroller 
{   
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height - tabbarcontroller.tabBar.frame.size.height;

    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
    {
        fHeight = screenRect.size.width - tabbarcontroller.tabBar.frame.size.height;
    }

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {   
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];            
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
        }       
    }
    [UIView commitAnimations]; 
}
&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;또한 UID 장치 방향 변경으로 iOS 6에 도입된 변경 사항을 처리하고 장치가 누워있을 때도 제대로 작동하도록 코드를 수정했습니다.&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;[self.tabBarController.tabBar setHidden:YES];
&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;Saurahb과 karlbecker_com의 솔루션은 훌륭하지만, 탭 바가 백업되는 동안 보기에 테이블 &lt;strong papago-id=&quot;9-1&quot;&gt;뷰&lt;/strong&gt;가 포함되어 있을 때 분명한 팝업 효과를 일으킬 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 수정을 해서 (UITabBar Controller의 범주로) 단일 기능으로 결합했습니다.&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;방향 설정 및 장치 친화적입니다.&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;UIT탭바컨트롤러+쇼&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;HideBar.m:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#import &quot;UITabBarController+ShowHideBar.h&quot;

@implementation UITabBarController (ShowHideBar)

- (void) setHidden:(BOOL)hidden{

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height;
    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ){
        fHeight = screenRect.size.width;
    }

    if(!hidden) fHeight -= self.tabBar.frame.size.height;

    [UIView animateWithDuration:0.25 animations:^{
        for(UIView *view in self.view.subviews){
            if([view isKindOfClass:[UITabBar class]]){
                [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
            }else{
                if(hidden) [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
            }
        }
    }completion:^(BOOL finished){
        if(!hidden){

            [UIView animateWithDuration:0.25 animations:^{

                for(UIView *view in self.view.subviews)
                {
                    if(![view isKindOfClass:[UITabBar class]])
                        [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
                }

            }];
        }
    }];

}

@end
&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;UIT탭바컨트롤러+쇼&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Hide Bar.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;h:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;

@interface UITabBarController (ShowHideBar)

- (void) setHidden:(BOOL)hidden;

@end
&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;[self.tabBarController setHidden:YES];
[self.tabBarController setHidden:NO];
&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;Saurabh의 위 답변은 풍경 방향으로도 확장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;+ (void) hideTabBar:(UITabBarController *) tabbarcontroller {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    //Support for landscape views
    int orientation = [[UIDevice currentDevice] orientation];
    int x_pos = 480;
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        x_pos = 320;
    }

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, x_pos, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, x_pos)];
        }       
    }   
    [UIView commitAnimations]; 
}
&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&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;는 showTabBar() 하는 x_pos입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;431&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;271&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;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@karlbecker_com Answer는 아이폰4와 아이폰5 모두에 적합합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래쪽에 있는 iOS7 검은색 막대에 문제가 있는 사람은 탭바 컨트롤러를 반투명으로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

// To Hide the black line in IOS7 only, this extra bit is required
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@&quot;7.0&quot;)) {
    [self.tabBarController.tabBar setTranslucent:YES];
}  
&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iMonoTouch (Xamarin.i) 로 karlbecker_com 의&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &quot;OS를 참조합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 유일한 차이점은 UITabBarController에서 상속되는 클래스에 메서드를 구현했기 때문에 &quot;에 대한 참조입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tabbarcontroller&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;&quot; &quot;로 대체되었습니다.&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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public void HideTabBar()
{
    var screenRect = UIScreen.MainScreen.Bounds;
    float fHeight = screenRect.Height;
    if(UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft
       || UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
    {
        fHeight = screenRect.Width;
    }

    UIView.BeginAnimations(null);
    UIView.SetAnimationDuration(0.4);
    foreach(UIView view in this.View.Subviews)
    {
        if(view is UITabBar)
        {
            view.Frame = new RectangleF(view.Frame.X, fHeight, view.Frame.Width, view.Frame.Height);
        } 
        else 
        {
            view.Frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, fHeight);
            view.BackgroundColor = UIColor.Black;
        }
    }
    UIView.CommitAnimations();
}

public void ShowTabBar()
{   
    var screenRect = UIScreen.MainScreen.Bounds;
    float fHeight = screenRect.Height - 49f;
    if(UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft
       || UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
    {
        fHeight = screenRect.Width - 49f;
    }

    UIView.BeginAnimations(null);
    UIView.SetAnimationDuration(0.4);
    foreach(UIView view in this.View.Subviews)
    {
        if(view is UITabBar)
        {
            view.Frame = new RectangleF(view.Frame.X, fHeight, view.Frame.Width, view.Frame.Height);
        } 
        else 
        {
            view.Frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, fHeight);
        }
    }
    UIView.CommitAnimations();
}
&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 class=&quot;papago-parent&quot;&gt;iOS8에서는 설정만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hidden&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;tabBar&lt;/code&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rootTabVC = UITabBarController()
rootTabVC?.tabBar.hidden = true
&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;didFinishLaunchingWithOptions&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;appdelegate&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; 이전 iOS 버전에서 정확하게 기억이 난다면 당신도 설정할 필요가 있다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;frame&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;tabBar&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;tabbar&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;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IOS 7.1 이후 &lt;strong papago-id=&quot;32-1&quot;&gt;&quot;Swift&quot;&lt;/strong&gt; 솔루션:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;self.tabBarController?.tabBar.hidden = true // hide tabbar
self.tabBarController?.tabBar.hidden = false // show tabbar
&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;이것이 도움이 되기를 바랍니다!&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;pre&gt;&lt;code&gt;[self presentModalViewController:myFullscreenViewController animated:YES];
&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;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 class=&quot;papago-parent&quot;&gt;을 무시하는.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dismissModalViewController:animated:&lt;/code&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;아래 솔루션은 TabBar 애니메이션으로 전체 화면 모드로 전환해야 하는 것과 정확히 동일한 사용 사례에서 잘 작동합니다.&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;ol&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;&lt;strong papago-id=&quot;39-1&quot;&gt;UITTabBar&lt;/strong&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;strong papago-id=&quot;40-1&quot;&gt;UI&lt;/strong&gt; 이미지를 &lt;strong papago-id=&quot;40-3&quot;&gt;UImageView&lt;/strong&gt;에 추가합니다. &lt;strong papago-id=&quot;40-5&quot;&gt;UITabBar&lt;/strong&gt;와 프레임이 동일합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 보기 크기를 조정하고 &lt;strong papago-id=&quot;41-1&quot;&gt;self.tabBarController&lt;/strong&gt;에 배치합니다&lt;strong papago-id=&quot;41-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;41-1&quot;&gt;보기&lt;/strong&gt;;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;42-1&quot;&gt;UITabBar&lt;/strong&gt;의 알파를 0.0으로 설정합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;43-1&quot;&gt;UIMageView&lt;/strong&gt; with &lt;strong papago-id=&quot;43-3&quot;&gt;UITabBar&lt;/strong&gt; 스냅샷을 &lt;strong papago-id=&quot;43-5&quot;&gt;self.tabBarController&lt;/strong&gt;에 배치합니다&lt;strong papago-id=&quot;43-5&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;43-5&quot;&gt;보기&lt;/strong&gt;;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&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;#import &quot;QuartzCore/CALayer.h&quot;

@implementation FTBFirstViewController {
   BOOL hidden;
   UIImageView *fakeTabBarImageView;
   UIView *viewToResize;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //////////////////////////////
    // Create your viewToResize
    //////////////////////////////
    [self.view addSubview:viewToResize];

    hidden = NO;
}

- (void)hideTabBar:(id)sender {
    if (!hidden) {
        //
        // to create the fake UITabBar
        fakeTabBarImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
        UIImage *fakeTabBarImage = [self imageScreenshotFromView:self.tabBarController.tabBar];
        fakeTabBarImageView.image = fakeTabBarImage;
        fakeTabBarImageView.frame = self.tabBarController.tabBar.frame;
        //
        // to resize underlying UIView
        viewToResize.frame = (CGRect){viewToResize.frame.origin.x, viewToResize.frame.origin.y + 20.f, viewToResize.frame.size.width, viewToResize.frame.size.height + fakeTabBarImageView.frame.size.height};
        //
        // to hide real UITabBar
        self.tabBarController.tabBar.alpha = 0.0;
        //
        // to add views in exactly this order
        [self.tabBarController.view addSubview:viewToResize];
        [self.tabBarController.view addSubview:fakeTabBarImageView];
        //
        // do any sort of animation
        [UIView animateWithDuration:0.8 animations:^{
            fakeTabBarImageView.frame = (CGRect){fakeTabBarImageView.frame.origin.x, fakeTabBarImageView.frame.origin.y + fakeTabBarImageView.frame.size.height, fakeTabBarImageView.frame.size};
        }];

        hidden = YES;
    } else {
        [UIView animateWithDuration:0.8 animations:^{
                fakeTabBarImageView.frame = (CGRect){fakeTabBarImageView.frame.origin.x, fakeTabBarImageView.frame.origin.y - fakeTabBarImageView.frame.size.height, fakeTabBarImageView.frame.size};
        } completion:^(BOOL complete){
            self.tabBarController.tabBar.alpha = 1.0;
            [fakeTabBarImageView removeFromSuperview];
            fakeTabBarImageView = nil;

            viewToResize.frame = self.view.frame;
            [self.view addSubview:viewToResize];

            [fakeTabBarImageView removeFromSuperview];
        }]; 

        hidden = NO;
    }
}

- (UIImage *)imageScreenshotFromView:(UIView *)aView {
    UIImage *viewImage;

    UIGraphicsBeginImageContextWithOptions(aView.bounds.size, aView.opaque, [[UIScreen mainScreen] scale]);
    [aView.layer renderInContext:UIGraphicsGetCurrentContext()];
    viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return viewImage;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;45&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;내 앱에는 UITabBarController가 루트 뷰로 있고 각 탭에는 UINavigationController가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UINavigationController 중 하나에 UICollectionViewController가 맨 위 보기 컨트롤러로 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 UICollectionView에서 항목을 선택할 때 세부 보기 컨트롤러를 탐색 스택에 밀어 넣었으면 했습니다.&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;UITToolbar와 UITabbar를 수동으로 배치하고 UITabBar Controller와 내장 UIToolbar를 사용하지 않는 것으로 쉽게 해결할 수 있었을 것입니다. 하지만 너무 리팩터링이 심하고 우아하지 않은 것 같습니다.&lt;/font&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;결국 제 솔루션은 꽤 간단했습니다. UITabBarController의 범위를 화면 하단에서 확장하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세 보기 컨트롤러에 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Extend the UITabBarController to shift the tab bar off screen
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGRect tabBarControllerFrame = self.tabBarController.view.frame;
    if (animated) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
        tabBarControllerFrame.size.height = screenRect.size.height +
            self.tabBarController.tabBar.frame.size.height;
        [self.tabBarController.view setFrame:tabBarControllerFrame];
        [UIView commitAnimations];
    }
    else {
        tabBarControllerFrame.size.height = screenRect.size.height +
            self.tabBarController.tabBar.frame.size.height;
        [self.tabBarController.view setFrame:tabBarControllerFrame];
    }

    // Now show the toolbar
    [self.navigationController setToolbarHidden:NO animated:animated];
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Ensure the UITabBarController remains extended when subviews are laid out
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGRect tabBarControllerFrame = self.tabBarController.view.frame;
    tabBarControllerFrame.size.height = screenRect.size.height + 
        self.tabBarController.tabBar.frame.size.height;
    [self.tabBarController.view setFrame:tabBarControllerFrame];
}
&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;그런 다음 사용자가 다시 UIN 탐색 컨트롤러의 맨 위로 팝업할 때 탭 바를 다시 표시하기 위해 이 내용을 맨 위 보기 컨트롤러에 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Hide toolbar
    [self.navigationController setToolbarHidden:YES animated:animated];

    // Tab bar back on to screen
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGRect tabBarControllerFrame = self.tabBarController.view.frame;
    if (tabBarControllerFrame.size.height != screenRect.size.height) {
        if (animated) {
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.5];
            tabBarControllerFrame.size.height = screenRect.size.height;
            [self.tabBarController.view setFrame:tabBarControllerFrame];
            [UIView commitAnimations];
        }
        else {
            tabBarControllerFrame.size.height = screenRect.size.height;
            [self.tabBarController.view setFrame:tabBarControllerFrame];
        }
    }
}
&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;@Saurabh 코드의 신속하고 수정된 버전&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;49&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;func setTabBarHidden (bool:Bool){
        for view in tabBarController!.view.subviews {
            if (view.isKindOfClass(UITabBar)){
                let tabBar = view as! UITabBar
                UIView.animateWithDuration(0.3, animations: { () -&amp;gt; Void in
                    var offset = CGFloat(50)
                    if (bool == false){
                        offset = -50;
                    }
                    tabBar.frame = CGRect(origin: CGPointMake(tabBar.frame.origin.x, tabBar.frame.origin.y + offset), size: tabBar.frame.size)
             })   
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;50&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;override func viewDidLoad() {
     setTabBarHidden(true)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;51&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;override func viewWillDisappear(animated: Bool) {
    setTabBarHidden(false)
}
&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 class=&quot;papago-parent&quot;&gt;애니메이션이 포함된 빠른 버전, 속성을 설정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isHideTabBar&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;self.isHideTabBar = !self.isHideTabBar
UIView.animate(withDuration: 0.5, animations: {
    self.tabBarController?.tabBar.frame = (self.tabBarController?.tabBar.frame.offsetBy(dx: 0, dy: self.isHideTabBar ? 100 : -100))!
 })
&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;swift 5 및 ios 14.0용 업데이트 및 작동&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*
    Shows or hides the tabbar

    :param: hidden            whether to show or hide the tabbar
    :param: animationDuration the animation's duration
*/
extension UITabBarController {
    func setHidden(hidden:Bool, animationDuration:TimeInterval = 0.25) {
        
        let screenRect = UIScreen.main.bounds
        var fHeight = screenRect.size.height
        
        if !hidden {
            fHeight -= self.tabBar.frame.size.height
        }
        
        UIView.animate(withDuration: animationDuration, animations: {
            for view in self.view.subviews {
                if view is UITabBar {
                    view.frame = CGRect(
                        x: view.frame.origin.x,
                        y: fHeight,
                        width: view.frame.size.width,
                        height: view.frame.size.height)
                }
            }
        })
    }
}
&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;보다 직접적인 포트(테스트되지 않음):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*
    Shows or hides the tabbar

    :param: hidden            whether to show or hide the tabbar
    :param: animationDuration the animation's duration
*/
extension UITabBarController {
    func setHidden(hidden:Bool, animationDuration:TimeInterval = 0.25) {
        
        let screenRect = UIScreen.main.bounds
        var fHeight = screenRect.size.height
        
        if UIApplication.shared.statusBarOrientation.isLandscape {
            fHeight = screenRect.size.width
        }
        
        if !hidden {
            fHeight -= self.tabBar.frame.size.height
        }
        
        UIView.animate(withDuration: animationDuration, animations: {
            for view in self.view.subviews {
                if view is UITabBar {
                    view.frame = CGRect(
                        x: view.frame.origin.x,
                        y: fHeight,
                        width: view.frame.size.width,
                        height: view.frame.size.height)
                }
                else if hidden {
                    view.frame = CGRect(
                        x: view.frame.origin.x,
                        y: view.frame.origin.y,
                        width: view.frame.size.width,
                        height: fHeight)
                }
            }
        }, completion: { finished in
            if !hidden {
                UIView.animate(withDuration: animationDuration, animations: {
                    for view in self.view.subviews {
                        if !(view is UITabBar) {
                            view.frame = CGRect(
                                x: view.frame.origin.x,
                                y: view.frame.origin.y,
                                width: view.frame.size.width,
                                height: fHeight)
                        }
                    }
                })
            }
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;56&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;57&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;extension UITabBarController {
    func setBarHiddenAnimated(_ hidden:Bool) {
        UIView.animate(withDuration: 0.3, animations: {
            if hidden {
                self.tabBar.transform = CGAffineTransform(translationX: 0, y: self.tabBar.frame.size.height)
            } else {
                self.tabBar.transform = CGAffineTransform.identity
            }
        })
    }
}
&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;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;URL : https://stackoverflow.com/questions/5272290/how-to-hide-uitabbarcontroller&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1606</guid>
      <comments>https://goodsource.tistory.com/1606#entry1606comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:46:24 +0900</pubDate>
    </item>
    <item>
      <title>사이트가 주기적으로 중단되고 &amp;quot;Myql connect error [localhost]: (2002) Connection rejected (400)&amp;quot; 오류가 발생합니다.</title>
      <link>https://goodsource.tistory.com/1605</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사이트가 주기적으로 중단되고 &quot;Myql connect error [localhost]: (2002) Connection rejected (400)&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;사이트는 CMS Bitrix에서 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;주기적으로 사이트가 실패하고 오류가 발생합니다. 연결이 거부되었습니다. mysqld가 다시 시작된 후 모든 것이 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 다시 떨어진 후 2-3일 정도 효과가 있습니다.&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;하지만 곧 오류가 날 겁니다.&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;비트릭스는 상당히 &quot;무거운&quot; sql 쿼리를 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리 제한이 부족한 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;관리자 패널에서 Settings-&amp;gt;Performance(러시아 버전을 사용하는지 다른 버전을 사용하는지 알 수 없습니다)를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 &quot;무거운&quot; 쿼리나 구성요소를 결정하는 데 도움이 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 사이트에서 Cashing이 활성화되어 있는지 확인합니다.&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;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;URL : https://stackoverflow.com/questions/51039424/periodically-site-falls-with-error-mysql-connect-error-localhost-2002-conn&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1605</guid>
      <comments>https://goodsource.tistory.com/1605#entry1605comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:46:08 +0900</pubDate>
    </item>
    <item>
      <title>크기 8 - Valgrind + C의 잘못된 판독값</title>
      <link>https://goodsource.tistory.com/1604</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크기 8 - Valgrind + 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;Valgrind가 오류를 보고합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Invalid read of size 8&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;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;struct symbol *st[PARSER_HASH_SIZE];
&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;내 프로그램이 초기화되면 이 배열의 모든 요소는 0으로 초기화됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;memset(&amp;amp;st[0], 0, sizeof(st));
&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 class=&quot;papago-parent&quot;&gt;내 프로그램은 의 인스턴스를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct symbol&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;따라서 이 배열의 요소 중 NULL이 되는 요소는 거의 없고 다른 요소는 유효한 값이 됩니다.&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;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드는 할당된 항목을 삭제하려고 하고 라인에서 valgrind 불만 사항을 제기합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sym = st[i]; sym != NULL; sym = sym-&amp;gt;next&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct symbol *sym = NULL;

/* cleaning the symbol table entries */
for(i = 0; i &amp;lt; PARSER_HASH_SIZE; i++) {
    for(sym = st[i]; sym != NULL; sym = sym-&amp;gt;next) { /* &amp;lt;-- Valgrind complains here */
        free(sym);
    }
}
&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 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&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;sym&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;sym-&amp;gt;next&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;/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;struct symbol *next_sym = NULL;

for(sym = st[i]; sym != NULL; ) {
    next_sym = sym-&amp;gt;next;
    free(sym);
    sym = next_sym;
}
&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;pre&gt;&lt;code&gt;struct symbol *st[PARSER_HASH_SIZE];
&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;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;내 프로그램이 초기화되면, 이 배열의 모든 요소는 0으로 초기화됩니다.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;memset(&amp;amp;st[0], 0, sizeof(st));
&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;배열을 없애다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (int i = 0; i &amp;lt; PARSER_HASH_SIZE; i++)
{
    st[i] = 0;
}
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4035769/invalid-read-of-size-8-valgrind-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1604</guid>
      <comments>https://goodsource.tistory.com/1604#entry1604comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:46:02 +0900</pubDate>
    </item>
    <item>
      <title>zLib을 사용하여 감압 및 팽창</title>
      <link>https://goodsource.tistory.com/1603</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;zLib을 사용하여 감압 및 팽창&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;gcc로 리눅스(Ubuntu 8.04)의 zpipe&lt;em papago-id=&quot;1-1&quot;&gt;&lt;a href=&quot;http://www.zlib.net/zpipe.c&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1-0&quot;&gt;.c&lt;/a&gt;&lt;/em&gt; 예제를 컴파일하려고 하는데 몇 가지 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[ubuntu@eeepc:~/Desktop] gcc zpipe.c
/tmp/ccczEQxz.o: In function `def':
zpipe.c:(.text+0x65): undefined reference to `deflateInit_'
zpipe.c:(.text+0xd3): undefined reference to `deflateEnd'
zpipe.c:(.text+0x150): undefined reference to `deflate'
zpipe.c:(.text+0x1e8): undefined reference to `deflateEnd'
zpipe.c:(.text+0x27b): undefined reference to `deflateEnd'
/tmp/ccczEQxz.o: In function `inf':
zpipe.c:(.text+0x314): undefined reference to `inflateInit_'
zpipe.c:(.text+0x382): undefined reference to `inflateEnd'
zpipe.c:(.text+0x3d7): undefined reference to `inflate'
zpipe.c:(.text+0x44b): undefined reference to `inflateEnd'
zpipe.c:(.text+0x4c1): undefined reference to `inflateEnd'
zpipe.c:(.text+0x4f6): undefined reference to `inflateEnd'
collect2: ld returned 1 exit status
[ubuntu@eeepc:~/Desktop]
&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;zLib-dev를 올바르게 설치했는데 왜 이런 오류가 발생하는지 기억하세요?&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;zlib 라이브러리와도 연결해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령줄의 거의 끝에 -lz만 추가하면 됩니다.&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;URL : https://stackoverflow.com/questions/1632201/error-deflate-and-inflate-with-zlib&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1603</guid>
      <comments>https://goodsource.tistory.com/1603#entry1603comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:45:55 +0900</pubDate>
    </item>
    <item>
      <title>mysql2 버전(0.3.2)은 이제 Rails 3.1의 일부이므로 ActiveRecord 어댑터가 번들로 제공되지 않습니다.</title>
      <link>https://goodsource.tistory.com/1602</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql2 버전(0.3.2)은 이제 Rails 3.1의 일부이므로 ActiveRecord 어댑터가 번들로 제공되지 않습니다.&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;안녕하세요 저는 레일을 실행할 때 레일 버전 3.0.7을 사용하고 있습니다. 모델 작업 이름: 문자열이 경고를 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WARNING: This version of mysql2 (0.3.2) doesn't ship with the ActiveRecord adapter bundled anymore as it's now part of Rails 3.1
WARNING: Please use the 0.2.x releases if you plan on using it in Rails &amp;lt;= 3.0.x
/usr/lib/ruby/gems/1.8/gems/activerecord-3.0.7/lib/active_record/connection_adapters/abstract/connection_specification.rb:71:in `establish_connection': Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (no such file to load -- active_record/connection_adapters/mysql2_adapter) (RuntimeError)
    from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.7/lib/active_record/connection_adapters/abstract/connection_specification.rb:60:in `establish_connection'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.7/lib/active_record/connection_adapters/abstract/connection_specification.rb:55:in `establish_connection'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.7/lib/active_record/railtie.rb:59
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.7/lib/active_support/lazy_load_hooks.rb:36:in `instance_eval'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.7/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.7/lib/active_support/lazy_load_hooks.rb:43:in `run_load_hooks'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.7/lib/active_support/lazy_load_hooks.rb:42:in `each'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.7/lib/active_support/lazy_load_hooks.rb:42:in `run_load_hooks'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.7/lib/active_record/base.rb:1904
    from /home/sun/railsapp/dog/vendor/plugins/attribute_fu/init.rb:1
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/plugin.rb:81
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/initializable.rb:25:in `instance_exec'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/initializable.rb:25:in `run'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/initializable.rb:50:in `run_initializers'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/initializable.rb:49:in `each'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/initializable.rb:49:in `run_initializers'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/application.rb:134:in `initialize!'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/application.rb:77:in `send'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/application.rb:77:in `method_missing'
    from /home/sun/railsapp/dog/config/environment.rb:5
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/application.rb:103:in `require'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/application.rb:103:in `require_environment!'
    from /usr/lib/ruby/gems/1.8/gems/railties-3.0.7/lib/rails/commands.rb:16
    from script/rails:6:in `require'
    from script/rails:6
&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;active record- adapter2- mysql를 설치하려고 하면 다음 기준으로 active record- adapter2- adapter 오류: 어떤 저장소에서도 'active record- mysql2- mysql'(&amp;gt; = 0)의 유효한 보석을 찾을 수 없습니다.&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;문제는 레일 3.0.x 버전과 호환되지 않는 최신 버전의 mysql2를 설치하려고 하기 때문입니다.&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;따라서 젬 파일에서 mysql2 gem의 행을 다음과 같이 변경합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gem 'mysql2', '&amp;lt; 0.3'
&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&gt;&lt;/font&gt;&lt;code&gt;bundle&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;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 새로운 mysql2 gem 파일(제 생각에는 0.2.7)이 나오면 문제를 해결할 것입니다.&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;sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Users/YOUR_USER_NAME/.rvm/gems/1.8/gems/mysql2-0.2.7/lib/mysql2/mysql2.bundle
&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;gem 'mysql2', '&amp;lt; 0.3'은 Rails 3.0.7(3.1 이전)의 유일한 방법입니다.&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 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;벤더/bundle/ruby/gems/1.9.1/mysql/rb2-0.3.2/lib/active_record/connection_adapters$[rails307]$lsem_mysql2_adapter.adaptermqsql2_adapter.&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;mysql2 gem version 0.2.x에서 mysql2_adapter.rb 파일을 가져와서 위 위치에 복사합니다.&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;이제 젬파일에 있는 'mysql2'라는 gem만으로도 저에게 효과가 있습니다.&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;@evevans에서 제공하는 솔루션을 사용해 본 후에도 버전에 문제가 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 @rubyconvict의 제안을 읽으며, 파일을 이리저리 밀기보다는 gem에 -v 옵션을 사용하는 것을 생각했습니다.&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;드림호스트의 무서운 &quot;version of mysql2(0.3.2)&quot; 메시지에 대한 고민이 결국 해결된 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# in mysql, create example_app &amp;amp; example_app_test ...
# ... for the purposes of this example only, production == development db
rails new example_app --database=mysql --freeze
cd example_app
vim config/database.yml
#   change settings for host, user, password ...
#   ... database for test (example_app_test) ...
#   ... &amp;amp; database for production &amp;amp; development (example_app)

vim Gemfile
#   gem 'mysql2', '&amp;lt; 0.3'

gem uninstall mysql2        # if installed: gem list -d mysql2
gem install mysql2 -v 0.2.7 
rake db:migrate     
&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;vim config/routes.rb...)&lt;/em&gt; 수정과 같은 다른 RoR 재미로 이동할 수 있습니다.&lt;/font&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;blockquote&gt; 
 &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고: Rails &amp;lt;= 3.0.x&amp;gt;에서 0.2.x 릴리스를 사용할 경우 사용하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단히 말해서 mysql2 gem에 0.2.x 분기의 최신 버전을 사용하면 됩니다.&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/5840742/version-of-mysql2-0-3-2-doesnt-ship-with-the-activerecord-adapter-bundled-any&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1602</guid>
      <comments>https://goodsource.tistory.com/1602#entry1602comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:45:49 +0900</pubDate>
    </item>
    <item>
      <title>SQL 0(음의 값인 경우)</title>
      <link>https://goodsource.tistory.com/1601</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 0(음의 값인 경우)&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;그래서 음의 값을 0으로 바꾸고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 두 가지 솔루션을 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SUM(IF(ordered_item.amount &amp;lt; 0, 0, ordered_item.amount)) as purchases
&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;SUM(CASE WHEN ordered_item.amount &amp;lt; 0 THEN 0 ELSE ordered_item.amount END) as purchases
&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;em papago-id=&quot;0-1&quot;&gt;성적&lt;/em&gt;을 낼 수 있을까요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 부정적인 것을 부정적인 것으로 바꿀 수 있는 &lt;em papago-id=&quot;0-3&quot;&gt;더&lt;/em&gt; 간단한 해결책이 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&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 papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_greatest&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;GREATEST()&lt;/a&gt; 함수를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SUM(GREATEST(ordered_item.amount, 0)) as purchases
&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;CREATE TABLE ordered_item ( 
order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
amount INT UNSIGNED NOT NULL, 
PRIMARY KEY (`order_id `) 
); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/5.0/en/integer-types.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://dev.mysql.com/doc/refman/5.0/en/integer-types.html&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;/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;(abs(x)+x)/2&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;5와 -5로 시도하면 각각 5와 0이 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;계산 집약적인지는 확실하지 않지만 다음과 같이 쓰기 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Select (ABS(ordered_item.amount) + ordered_item.amount ) / 2 as purchases
from ordered_item
&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;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/29968334/sql-0-if-negative-value&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1601</guid>
      <comments>https://goodsource.tistory.com/1601#entry1601comment</comments>
      <pubDate>Wed, 18 Oct 2023 22:04:26 +0900</pubDate>
    </item>
    <item>
      <title>angularjs: ng-message가 항상 표시됨</title>
      <link>https://goodsource.tistory.com/1600</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angularjs: ng-message가 항상 표시됨&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;pre&gt;&lt;code&gt;&amp;lt;form name=&quot;loginForm&quot;&amp;gt;
  &amp;lt;label class=&quot;item item-input&quot;&amp;gt;
    &amp;lt;input type=&quot;email&quot; placeholder=&quot;Email&quot; ng-model=&quot;data.email&quot; name=&quot;email&quot; required&amp;gt;
  &amp;lt;/label&amp;gt;
  &amp;lt;div ng-messages=&quot;loginForm.email.$error&quot; style=&quot;color:maroon&quot;&amp;gt;
    &amp;lt;div ng-message=&quot;required&quot;&amp;gt;Please input a valid e-mail address&amp;lt;/div&amp;gt;
    &amp;lt;div ng-message=&quot;email&quot;&amp;gt;You did not enter your email address correctly...&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/form&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;ngMessages directive를 javascript에 포함시켰으며 angular-messages.js 파일을 가져왔습니다.&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;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;하나의 ng 메시지만 넣으려고 하면 결과는 같습니다.&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;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;edit: 제 설명이 명확하지 않은 경우 https://s9.postimg.cc/du9230tdb/Screen_Shot_2015_06_26_at_17_09_24.png 결과를 출력합니다.&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;실제로 모듈에 ngMessage를 포함하고 있는지 확인해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var app = angular.module('app', [
    'ngMessages'
])
&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;&amp;lt;script src=&quot;/scripts/vendors/angular-messages/angular-messages.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&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;&amp;lt;form name=&quot;loginForm&quot;&amp;gt;
    &amp;lt;label class=&quot;item item-input&quot;&amp;gt;
        &amp;lt;input type=&quot;email&quot; placeholder=&quot;Email&quot; ng-model=&quot;data.email&quot; name=&quot;email&quot; required&amp;gt;
    &amp;lt;/label&amp;gt;
    &amp;lt;div ng-messages=&quot;loginForm.email.$error&quot; style=&quot;color:maroon&quot;&amp;gt;
        &amp;lt;div ng-message=&quot;required&quot;&amp;gt;Please input a valid e-mail address&amp;lt;/div&amp;gt;
        &amp;lt;div ng-message=&quot;email&quot;&amp;gt;You did not enter your email address correctly...&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/form&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;a href=&quot;http://plnkr.co/edit/zNmwZkoxZcgwO9i1zs39?p=preview.&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;9-0&quot;&gt;여기 플렁커에 대한 작업 복사본이 있습니다&lt;/a&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;a href=&quot;https://code.angularjs.org/1.4.8/docs/api/ngMessages/directive/ngMessages&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;10-1&quot;&gt;Angularjs 문서&lt;/a&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;기본적으로 ngMessages는 한 번에 하나의 오류만 표시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 모든 메시지를 표시하려면 ngMessages 지시문을 포함하는 요소에 ngMessages-multiple 속성 플래그를 사용하여 이를 수행할 수 있습니다.&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;https://stackoverflow.com/a/26649335/4534064&quot; papago-id=&quot;12-1&quot;&gt;링크&lt;/a&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;ngMessage 모듈과 라이브러리도 포함하고 있는지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/31483558/4534064&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-messages=&quot;loginForm.email.$error&quot; ng-show=&quot;loginForm.email.$invalid &amp;amp;&amp;amp; loginForm.email.$touched&quot;&amp;gt;
...
&amp;lt;/div&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;이 속임수가 내 목숨을 구했어요.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/31057120/angularjs-ng-message-always-showing&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularjs</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1600</guid>
      <comments>https://goodsource.tistory.com/1600#entry1600comment</comments>
      <pubDate>Wed, 18 Oct 2023 22:04:19 +0900</pubDate>
    </item>
    <item>
      <title>UIView 하위 클래스의 Nib을 로드하는 올바른 방법</title>
      <link>https://goodsource.tistory.com/1599</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UIView 하위 클래스의 Nib을 로드하는 올바른 방법&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&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;UIView&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;nib 파일을 사용하여 인터페이스를 설명하고자 합니다.&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;이제 작업 지시자가 포함된 로딩 지시자 뷰라고 가정해 보겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 보기를 인스턴스화하고 보기 컨트롤러 보기로 애니메이션화하는 이벤트를 하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 뷰의 인터페이스를 프로그래밍 방식으로 설명할 수 있었습니다. 요소를 프로그래밍 방식으로 만들고 프레임을 init 방식으로 설정하는 등 말이죠.&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;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;저는 이 방법을 사용해 왔지만, 잘못된 것이라고 확신합니다. (이것은 단지 선택 도구가 있는 보기일 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; - (id)initWithDataSource:(NSDictionary *)dataSource {
        self = [super init];
        if (self){
            self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@&quot;%@&quot;, [self class]] owner:self options:nil] objectAtIndex:0];
            self.pickerViewData = dataSource;
            [self configurePickerView];
        }
        return self;
    }
&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;FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
    selectView.delegate = self;

    selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
&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;IB에서 프레임을 픽업하는 것보다 수작업으로 프레임을 설정해야 합니다.&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;/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;strong papago-id=&quot;11&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;FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@&quot;%@&quot;,[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
    selectView.delegate = self;
    [selectView configurePickerViewWithData:ds];
    selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
    selectView.alpha = 0.9;
    [self.view addSubview:selectView];
    [UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
                            selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
                            selectView.alpha = 1;
                        } completion:^(BOOL finished) {
                        }];
&lt;/code&gt;&lt;/pre&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;정확한 실습이 여전히 필요함&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;보기 컨트롤러를 사용하여 이 작업을 수행하고 nib 이름으로 init를 수행했어야 했습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드의 UIView 초기화 방법으로 nib을 설정했어야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 제가 한 일이 괜찮은가요?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;MyViewClass *myViewObject = [[[NSBundle mainBundle] loadNibNamed:@&quot;MyViewClassNib&quot; owner:self options:nil] objectAtIndex:0]
&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;hr&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-1&quot;&gt;&quot;first&lt;/strong&gt; Object&lt;strong papago-id=&quot;15-1&quot;&gt;&quot;&lt;/strong&gt;를 사용하면 좀 더 깨끗합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NSray와 NSMutable Array에서 편리한 방법은 &quot;first Object&quot;입니다.&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;테이블 헤더로 사용할 xib를 로드하는 전형적인 예가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 파일에 당신의 클래스.m.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return [[NSBundle mainBundle] loadNibNamed:@&quot;TopArea&quot; owner:self options:nil].firstObject;
}
&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 class=&quot;papago-parent&quot;&gt;에서.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TopArea.xib&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, File Owner(파일 &lt;strong papago-id=&quot;18-1&quot;&gt;소유자&lt;/strong&gt;)를 클릭하고 &lt;strong papago-id=&quot;18-1&quot;&gt;파일 소유자&lt;/strong&gt;를 Your Class(&lt;strong papago-id=&quot;18-1&quot;&gt;유어&lt;/strong&gt; 클래스)로&lt;strong papago-id=&quot;18-1&quot;&gt; 설정&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 실제로 &lt;strong papago-id=&quot;18-3&quot;&gt;YourClass.h&lt;/strong&gt;에는 IBOUTlet 속성이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TopArea.xib&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;/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;TopArea.xib&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;strong papago-id=&quot;21-1&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;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;CustomView&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;xib&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&gt;&lt;code&gt;File's Owner&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;/p&gt; 
&lt;ul&gt; 
 &lt;li&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;File's Owner&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 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;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;xib&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;CustomView&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;Custom Class&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;CustomView&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;/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&gt;&lt;code&gt;IBOutlet&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&gt;&lt;code&gt;.h&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;/li&gt; 
 &lt;li&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;.xib&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;Connection Inspector&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;. 여기서 정의한 모든 IBOUTLET이 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.h&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;/li&gt; 
 &lt;li papago-id=&quot;40&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&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;.m&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;CustomView&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; 클래스, override the&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;init&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;-(CustomView *) init{
    CustomView *result = nil;
    NSArray* elements = [[NSBundle mainBundle] loadNibNamed: NSStringFromClass([self class]) owner:self options: nil];
    for (id anObject in elements)
    {
        if ([anObject isKindOfClass:[self class]])
        {
            result = anObject;
            break;
        }
    }
    return result;
}
&lt;/code&gt;&lt;/pre&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;이제 당신이 당신의 짐을 싣고 싶을 때.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CustomView&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;[[CustomView alloc] init];&lt;/code&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;ol&gt; 
 &lt;li&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;MyView .h/.m  .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIView&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&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;같은 이름의 xib 만들기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MyView.xib&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;/li&gt; 
 &lt;li&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;UIViewController&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;NSObject&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;XIB로&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 이미지 참조&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/vZlhT.png&quot; alt=&quot;enter image description here&quot;&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 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;img src=&quot;https://i.stack.imgur.com/isK3K.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&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&gt;&lt;code&gt;MyView&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; 3과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&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;컨트롤 배치는 IBOUTlet을 만듭니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;View를 로드하는 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UIViewController *controller=[[UIViewController alloc] initWithNibName:@&quot;MyView&quot; bundle:nil];
MyView* view=(MyView*)controller.view;
[self.view addSubview:myview];
&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;도움이 되길 바랍니다.&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;strong papago-id=&quot;61-0&quot;&gt;명확화&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;UIViewController&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;xib 및 View를 로드하는 데 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIViewController&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;하스는 사실&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MyView&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MyView xib에 할당한 파일입니다.&lt;/font&gt;&lt;/font&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;&lt;strong papago-id=&quot;65-0&quot;&gt;데모&lt;/strong&gt; &lt;a href=&quot;http://dl.dropbox.com/u/78701794/TestApp.zip&quot; rel=&quot;noreferrer&quot; papago-id=&quot;65-2&quot;&gt;여기&lt;/a&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;2년 후에 여기서 내 질문에 답하는 건...&lt;/font&gt;&lt;/p&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*

Prerequisites
-------------
- In IB set the view's class to the type hook up any IBOutlets
- In IB ensure the file's owner is blank

*/

public protocol CreatedFromNib {
    static func createFromNib() -&amp;gt; Self?
    static func nibName() -&amp;gt; String?
}

extension UIView: CreatedFromNib { }

public extension CreatedFromNib where Self: UIView {

    public static func createFromNib() -&amp;gt; Self? {
        guard let nibName = nibName() else { return nil }
        guard let view = NSBundle.mainBundle().loadNibNamed(nibName, owner: nil, options: nil).last as? Self else { return nil }
        return view
    }

    public static func nibName() -&amp;gt; String? {
        guard let n = NSStringFromClass(Self.self).componentsSeparatedByString(&quot;.&quot;).last else { return nil }
        return n
    }
}

// Usage:
let myView = MyView().createFromNib()
&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&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&gt;&lt;code&gt;InfoView&lt;/code&gt;&lt;/p&gt; 
&lt;p&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;처음에는 파일을 만들고,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;InfoView.xib&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;InfoView.swift&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 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;import Foundation
import UIKit

class InfoView: UIView {
    class func instanceFromNib() -&amp;gt; UIView {
    return UINib(nibName: &quot;InfoView&quot;, bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;그다음에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;File's Owner&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&gt;&lt;code&gt;UIViewController&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 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;a href=&quot;https://i.stack.imgur.com/YSsmC.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/YSsmC.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&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;View&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&gt;&lt;code&gt;InfoView&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 class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/GoOtG.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/GoOtG.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&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;File's Owner&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;그리고 당신의 것을 연결합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;view&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&gt;&lt;code&gt;InfoView&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 class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Uiu0F.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Uiu0F.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;58&quot;&gt;&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;InfoView&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;a href=&quot;https://i.stack.imgur.com/5VXwM.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/5VXwM.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;그런 다음 작업을 사용자 지정 클래스의 버튼에 문제 없이 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/nYctT.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/nYctT.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;MainViewController&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;pre&gt;&lt;code&gt;func someMethod() {
    var v = InfoView.instanceFromNib()
    v.frame = self.view.bounds
    self.view.addSubview(v)
}
&lt;/code&gt;&lt;/pre&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뷰 컨트롤러를 사용하여 xib를 초기화하고 viewController.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;view를 사용하거나 사용자가 수행한 방식으로 수행할 수 있습니다.&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;UIView&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&gt;&lt;code&gt;UIView&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 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;65&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 정의 보기에서 콘센트가 없는 경우 직접 A를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIViewController&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&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;strong papago-id=&quot;93-0&quot;&gt;업데이트:&lt;/strong&gt; 사용자의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UIViewController *genericViewCon = [[UIViewController alloc] initWithNibName:@&quot;CustomView&quot;];
//Assuming you have a reference for the activity indicator in your custom view class
CustomView *myView = (CustomView *)genericViewCon.view;
[parentView addSubview:myView];
//And when necessary
[myView.activityIndicator startAnimating]; //or stop
&lt;/code&gt;&lt;/pre&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;UIViewController&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;pre&gt;&lt;code&gt;YourCustomController *yCustCon = [[YourCustomController alloc] initWithNibName:@&quot;YourXibName&quot;].
&lt;/code&gt;&lt;/pre&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;[parentView addSubview:yCustCon.view];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;97&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 xib를 로드하는 동안 다른 뷰 컨트롤러(이미 다른 뷰에 사용 중임)를 소유자로 전달하는 것은 컨트롤러의 뷰 속성이 변경되고 원래 뷰에 액세스하려는 경우 참조가 없기 때문에 좋지 않습니다.&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;strong papago-id=&quot;69-0&quot;&gt;편집:&lt;/strong&gt; 파일 소유자와 동일한 메인으로 새 xib을 설정한 경우 이 문제가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIViewController&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스 및 뷰 속성을 새 xib 뷰에 연결했습니다.&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;즉,&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MainView Controller -- manages -- mainView&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;CustomView - 필요한 경우 xibas에서 로드해야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&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 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;YourMainViewController&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;code&gt;self.view&lt;/code&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;-(void)viewDidLoad:(){
  UIView *childView= [[[NSBundle mainBundle] loadNibNamed:@&quot;YourXibName&quot; owner:self options:nil] objectAtIndex:0];
}
&lt;/code&gt;&lt;/pre&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;URL : https://stackoverflow.com/questions/15405916/correct-way-to-load-a-nib-for-a-uiview-subclass&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1599</guid>
      <comments>https://goodsource.tistory.com/1599#entry1599comment</comments>
      <pubDate>Wed, 18 Oct 2023 22:04:13 +0900</pubDate>
    </item>
    <item>
      <title>angularjs로 ng가 아닌 다른 접두사를 사용해도 될까요?</title>
      <link>https://goodsource.tistory.com/1598</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angularjs로 ng가 아닌 다른 접두사를 사용해도 될까요?&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;angularjs는 처음입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서를 읽었을 때, 나는 그것이 다음을 사용하는 것을 발견했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng&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;&amp;lt;body ng:controller=&quot;PhoneListCtrl&quot;&amp;gt;
  &amp;lt;ul&amp;gt;
    &amp;lt;li ng:repeat=&quot;phone in phones&quot;&amp;gt;
      {{phone.name}}
      &amp;lt;p&amp;gt;{{phone.snippet}}&amp;lt;/p&amp;gt;
    &amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&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;x&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;x&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;ng&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;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;7-1&quot;&gt;v1.0.0rc1&lt;/strong&gt; 이후로는 모두 동등합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-show=&quot;isVisible&quot;&amp;gt;Using ng-show&amp;lt;/div&amp;gt;
&amp;lt;div ng:show=&quot;isVisible&quot;&amp;gt;Using ng:show&amp;lt;/div&amp;gt;
&amp;lt;div data-ng-show=&quot;isVisible&quot;&amp;gt;Using data-ng-show&amp;lt;/div&amp;gt;
&amp;lt;div x-ng-show=&quot;isVisible&quot;&amp;gt;Using x-ng-show&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;ng-show:isVisible&quot;&amp;gt;Using class=&quot;ng-show:isVisible&quot;&amp;lt;/div&amp;gt;
&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;다음은 http://jsfiddle.net/vojtajina/Fgf3Q/ 입니다.&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;그러나 이것의 주된 이유는 유효한 html을 허용한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서, 당신은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x-*&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;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 정보는 &lt;a href=&quot;https://docs.angularjs.org/api/ng/provider/$compileProvider#directive&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;11-1&quot;&gt;문서&lt;/a&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;URL : https://stackoverflow.com/questions/9746916/can-i-use-another-prefix-instead-of-ng-with-angularjs&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularjs</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1598</guid>
      <comments>https://goodsource.tistory.com/1598#entry1598comment</comments>
      <pubDate>Wed, 18 Oct 2023 22:04:02 +0900</pubDate>
    </item>
    <item>
      <title>파일 크기 기준을 충족하기 위해 파일에 삽입할 특정 길이의 문자열을 생성하는 방법?</title>
      <link>https://goodsource.tistory.com/1597</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;자동으로 파일을 생성해주는 C#로 작성된 윈도우 어플리케이션이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 파일의 크기, 예를 들어 100KB, 생성할 파일의 개수를 알고 있습니다.&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;long fileSizeInKB = (1024 * 100); //100KB
int numberOfFiles = 5;

for(var i = 0; i &amp;lt; numberOfFiles - 1; i++) {
     var dataSize = fileSizeInKB;
     var buffer = new byte[dataSize];
     using (var fs = new FileStream(File, FileMode.Create, FileAccess.Write)) {

     }
}
&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;char&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;string myString = new string('*', 5000);
&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;이것은 5,000개의 별들을 제공합니다. 필요에 따라 조정합니다.&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 content = new string('A', fileSizeInKB);
&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;이제 필요한 만큼의 A가 포함된 문자열을 확보했습니다.&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;string contentString = &quot;Lorem Ipsum...&quot;;
for (int i = 0; i &amp;lt; fileSizeInKB / contentString.Length; i++)
  //write contentString to file

if (fileSizeInKB % contentString.Length &amp;gt; 0)
  // write remaining substring of contentString to file
&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;편집: 유니코드에 저장할 경우, 유니코드는 문자당 2바이트를 사용하므로 파일 크기를 절반으로 줄여야 할 수도 있습니다.&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;font class=&quot;papago-parent&quot;&gt;100KB가 필요하다고요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제없습니다..&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;100 * 1024 * 8 = 819200 비트.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 글자는 16비트입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;819200 / 16 = 51200.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;51,200자를 파일에 꽂아야 합니다.&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;귀하의 질문에 대한 부분적인 답변으로 저는 최근 거의 모든 크기의 'junk' 파일을 쉽게 만들 수 있는 휴대용 WPF 앱을 만들었습니다. https://github.com/webmooch/FileCreator&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/5032041/how-to-generate-string-of-a-certain-length-to-insert-into-a-file-to-meet-a-file&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>string</category>
      <author>goodsources</author>
      <guid isPermaLink="true">https://goodsource.tistory.com/1597</guid>
      <comments>https://goodsource.tistory.com/1597#entry1597comment</comments>
      <pubDate>Wed, 18 Oct 2023 22:03:56 +0900</pubDate>
    </item>
  </channel>
</rss>