<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>prostudy</title>
    <link>https://prostudy.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 19 Jun 2026 04:42:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>prostudy</managingEditor>
    <image>
      <title>prostudy</title>
      <url>https://tistory1.daumcdn.net/tistory/5289773/attach/f362f5be5f3b4e1da8dbb01a1e2f1745</url>
      <link>https://prostudy.tistory.com</link>
    </image>
    <item>
      <title>MySQL 3.23을 pyodbc 3.07과 연결</title>
      <link>https://prostudy.tistory.com/2354</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 3.23을 pyodbc 3.07과 연결&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;UnixODBC 및 pyodbc 3.07을 사용하는 Ubuntu 16 클라이언트에서 오래된 MySQL 3.23 서버에 연결하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL Connector/ODBC 버전 3개와 Maria 버전 2개를 사용해 보았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB:&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;MySQL-ODBC &lt;strong papago-id=&quot;2-0&quot;&gt;5.3.9&lt;/strong&gt; 새로운 mysql 인증 방식만 지원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 접속할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-0&quot;&gt;MySQL-ODBC 5&lt;/strong&gt;.1&lt;strong papago-id=&quot;3-0&quot;&gt;.13&lt;/strong&gt; 인증방식용 스위치가 있는데, 이 스위치가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc.connect(dsn)&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;[MySQL][ODBC 5.1 Driver]Driver does not support server versions under 4.1.1&lt;/code&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;strong papago-id=&quot;5-0&quot;&gt;MySQL-ODBC&lt;/strong&gt; 3&lt;strong papago-id=&quot;5-0&quot;&gt;.51&lt;/strong&gt;에는 다음 두 가지 문제가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&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;[MySQL][ODBC 3.51 Driver]Transactions are not enabled (4000) (SQLSetConnnectAttr(SQL_ATTR_AUTOCOMMIT))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;pyodbc는 autocommit을 기본값으로 false로 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 접속할 때 접속할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc.connect(dsn, autocommit=True)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 연결 시 커서가 표시되지만 모든 커서가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;execute(sql) 예외 발생&lt;/font&gt;&lt;/font&gt;&lt;code&gt;('HY000', 'The driver did not supply an error!')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;셸에서 isql을 사용한 접속 테스트&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isql -v [dsn]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세션을 제공하지만 모든 스테이트먼트에 실패합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[ISQL]ERROR: Could not SQLExecute&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 unixodbc의 문제인 것 같습니다.&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;strong papago-id=&quot;14-1&quot;&gt;mysql-client&lt;/strong&gt;를 설치했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, programmysql은 서버 접속에 실패합니다.&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;strong papago-id=&quot;15-0&quot;&gt;mariadb-client&lt;/strong&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-1&quot;&gt;MariaDB ODBC-Driver 3&lt;/strong&gt;.0&lt;strong papago-id=&quot;16-1&quot;&gt;.2&lt;/strong&gt;를 다운로드했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 드라이버를 isql과 함께 사용하면 다음 오류가 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[S1000][unixODBC][ma-3.0.2]Plugin old_password could not be loaded: lib/mariadb/plugin/old_password.so: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 함께 일할 수 있는 응답이다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ODBC-Option PLUGIN_DIR이 있지만 플러그인 위치를 알 수 없습니다.&lt;/font&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;strong papago-id=&quot;18-0&quot;&gt;MariaDB ODBC-Driver 2&lt;/strong&gt;.0&lt;strong papago-id=&quot;18-0&quot;&gt;.13은&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;('HY000', &quot;[HY000] [unixODBC][ma-2.0.13]You have an error in your SQL syntax near 'SQL_AUTO_IS_NULL=0' at line 1 (1064) (SQLDriverConnect)&quot;)&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 class=&quot;papago-parent&quot;&gt;이것을 바꿀 수 있는 방법이 없을 것 같아서.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;막다른 길이에요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;unixodbc/pyodbc를 통해 이 오래된 MySql에 액세스할 수 있는 방법이 있는지 알고 싶습니다.&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;아니면 MariaDB용 플러그인 old_password.so를 어디서 구할 수 있는지 아는 사람이 있나요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;apt-get을 통해 설치된 mariadb-client는 연결할 수 있으므로 방법이 있을 것입니다.&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 papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 했던 것과 같은 토끼굴에 다른 사람이 빠지지 않도록(더 좋은 것은, 다른 사람이 제가 중단한 곳에서 문제를 해결할 수 있도록!) 대답에 넣었습니다.댓글에 맞지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 좀 귀찮을 거야, 미안해.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개요&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu 16.04 컨테이너 쌍, &lt;a href=&quot;http://live.dadanini.at/mysql/downloads_html/mysql-3.23.html&quot; papago-id=&quot;27-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Oracle에서 제공되는 MySQL&lt;/a&gt; 3.23 &lt;a href=&quot;http://live.dadanini.at/mysql/downloads_html/mysql-3.23.html&quot; papago-id=&quot;27-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;다운로드&lt;/a&gt;, 그리고 당신이 언급한 모든 클라이언트 libs를 사용하여 당신의 투고에서 언급된 오류 조건(완전하고 훌륭한 질문 감사합니다!)을 재현할 수 있었습니다.&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;아래는 당신이 언급한 각 장소에서 추가 해결책을 찾다가 발견한 것입니다. 그리고 몇 가지 &quot;다음 단계&quot; 유형의 정보와 이야기의 교훈에 대해 개론합니다.&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;이 모든 테스트는 최신 버전의 Python 2, UnixODBC 및&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(경유)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)는 2017년 26월 11일 현재 재고 Ubuntu 16.04 도커 컨테이너에 사용할 수 있습니다.&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;사용된 URL은 모두 링크되어 있지만, 이 소프트웨어의 대부분이 20년 이상 된 것을 고려하면 역사가 시사하는 바가 있다면 시간이 지남에 따라 사라질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 원한다면, 제 셸 스크립트/도커 파일/수정된 드라이버 소스를 투고할 수 있습니다.댓글에 PING만 해주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;old_password.so 및 MariaDB 커넥터/ODBC 3.0.2&lt;/font&gt;&lt;/h1&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;제가 한 일은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 Connector&lt;a href=&quot;https://downloads.mariadb.org/connector-odbc/3.0.2/&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;/ODBC&lt;/a&gt; 3.0&lt;a href=&quot;https://downloads.mariadb.org/connector-odbc/3.0.2/&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;.2&lt;/a&gt; 바이너리를 &lt;a href=&quot;https://downloads.mariadb.org/connector-odbc/3.0.2/&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;설치&lt;/a&gt;하고 Python을 통해 연결을 시도했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ODBC 설정 후 발생한 오류와 동일한 오류입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.ini&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 이름 &quot;files&quot;를 지정합니다.즉, 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin')
pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: lib/mariadb/plugin/old_password.so: cannot open shared object file: No such file or directory (2059) (SQLDriverConnect)')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ODBC 코드는 충분히 오래된 인증 프로토콜을 알리는 MySQL 서버와 함께 제공되는 경우 Connector&lt;a href=&quot;https://downloads.mariadb.org/connector-c/&quot; papago-id=&quot;37-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;/C MariaDB 드라이버용&lt;/a&gt;으로 작성된 컴파일된 플러그인을 로드하려고 시도합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;code&gt;strace&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ODBC 접속 시행의 출력에 의해 이것이 결정되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는, Connector/C MariaDB 드라이버의 컴포넌트인 것을 알 수 있습니다만, 그 드라이버의 바이너리 릴리스에 포함되어 있는 라이브러리는 아닙니다.&lt;/font&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;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 플러그인 모듈이 많이 있는 것으로 나타났습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커넥터/C 드라이버의 소스에 포함되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Connector&lt;a href=&quot;https://downloads.mariadb.org/connector-c/3.0.2/&quot; papago-id=&quot;41-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;/C&lt;/a&gt; 3.0&lt;a href=&quot;https://downloads.mariadb.org/connector-c/3.0.2/&quot; papago-id=&quot;41-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;.2 소스&lt;/a&gt;를 다운로드하여 다음과 같이 배포된 &quot;auth&quot; 유형의 플러그인용 문서, 소스 및 빌드 시스템을 열었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뭘 찾을 수 있는지 보려고요&lt;/font&gt;&lt;/font&gt;&lt;/p&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;Connector/C의 다양한 컴포넌트는 메인 드라이버 라이브러리에 &quot;정적으로&quot; 링크된 플러그인 또는 동적 라이브러리 자체로서 컴파일할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 드라이버의 빌드 프로세스에서는 양쪽 모두 스태틱(static)이 생성되기 때문에 따옴표로 &quot;static&quot;이라고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.a&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다이나믹( )&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;) 버전&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mariadbclient&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 빌드 시스템에서 특정 플러그인이 스태틱으로 선언된 경우 해당 플러그인의 코드는 양쪽 모두에 스태틱하게 포함됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mariadbclient&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아티팩트&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 소스&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 1개의 작은 소스 파일에 있는 것처럼 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;plugins/auth/old_password.c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빌드 시스템(CMake)을 변경하여 CMAKE의 동적 라이브러리를 생성할 수 있을 것으로 생각됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;커넥터/C 소스에는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmake/plugins.cmake&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 플러그인의 &quot;메시지&quot; 역할을 하는 파일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;cmake 매크로가 포함되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;REGISTER_PLUGIN&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&gt;&lt;/font&gt;&lt;code&gt;STATIC&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DYNAMIC&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;논쟁.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그 파일을 검색했다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 행을 찾았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REGISTER_PLUGIN(&quot;AUTH_OLDPASSWORD&quot; &quot;${CC_SOURCE_DIR}/plugins/auth/old_password.c&quot; &quot;old_password_client_plugin&quot; &quot;STATIC&quot; &quot;&quot; 0)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 유망해 보였다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;생산한 &lt;em papago-id=&quot;40-1&quot;&gt;유사&lt;/em&gt;한 라인의 모델화&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.so&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REGISTER_PLUGIN(&quot;AUTH_OLDPASSWORD&quot; &quot;${CC_SOURCE_DIR}/plugins/auth/old_password.c&quot; &quot;old_password_client_plugin&quot; &quot;DYNAMIC&quot; &quot;old_password&quot; 1)
&lt;/code&gt;&lt;/pre&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 개 설치했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-dev&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지와 기타 툴은 깔끔하게 구축할 수 있었습니다(플러그인만 해도 CURL이나 OpenSSL은 필요없었습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니나 다를까,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_old_password.so&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&gt;&lt;/font&gt;&lt;code&gt;plugins/auth&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빌드 아티팩트로서의 디렉토리.- 플러그인을 찾기 위해 Python 코드가 필요했습니다.그 때문에, 아직 찾을 수 없는 에러가 발생하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lib/mariadb/plugin/old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 공급한 것은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PLUGIN_DIR&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ODBC 연결 문자열에 대한 질문에서 언급한 인수, 내 컴파일 이름 변경&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드를 실행하여 새로운 오류가 발생하였습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;진행!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;conn = pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin;PLUGIN_DIR=/home/mysql/zclient/mdb-c/plugins/auth')
pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: /home/mysql/zclient/mdb-c/plugins/auth/old_password.so: undefined symbol: ma_scramble_323 (2059) (SQLDriverConnect)')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일된 아티팩트가 손상된 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ma_scramble_323&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수의 정의.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인은 런타임에 동적으로 로드되기 때문에 프로그램은 계속 시작되지만 다음 작업을 시도하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dload&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인이 터집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;게다가 이 함수는 &quot;구&quot; MySQL 프로토콜 인증 메커니즘의 주요 암호 해싱 엔트리 포인트인 것처럼 보여 그냥 버릴 수 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Connector/C 소스에서 해당 함수와 헤더에 대한 선언을 찾았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mariadb_com.h&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;53&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), 단,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;include&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 곳에 그것을 주입하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.c&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 예감은 이것이 두 가지 불행한 행동의 상호작용이라는 것이다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 Connector/C 빌드 시스템에 의해 컴파일된 플러그인은 Connector&lt;em papago-id=&quot;55-1&quot;&gt;/C 플러그인&lt;/em&gt; 또는 이와 유사한 플러그인에 &lt;em papago-id=&quot;55-1&quot;&gt;의해서만 링크&lt;/em&gt;된다고 가정하여 셋업됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 플러그인이 컴파일될 때 플러그인 자체가 &quot;공통&quot; 커넥터/C 기능에 링크되지 않는다는 것을 의미합니다.그것은 플러그인이 로딩되어 있는 것으로, 이러한 기능을 이미 사용할 수 있어야 하기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;커넥터/C가 아닌 커넥터/ODBC를 사용하고 있기 때문에 이러한 공통 기능은 존재하지 않거나 액세스할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스에서 Connector/ODBC를 구축하려면 Connector/C가 필요합니다.따라서 새로운 Connector/ODBC 라이브러리를 컴파일하여 적절한 기능을 포함하도록 할 수 있을 것입니다만, 저는 이 토끼구멍을 열고 싶지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째, 심지어 이 시스템을 구축하도록 지시받았을 때에도&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;56&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;독립 실행형(다른 것은 컴파일하지 않음) 모드의 플러그인은 CMake 종속성 분석에서 다음을 설명하는 파일을 검색하거나 링크하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ma_scramble_323&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 CMake의 문제일 수 있지만 빌드 시스템이 위에서 설명한 사용 사례를 염두에 두고 구성되어 있지 않기 때문일 수 있습니다.&lt;/font&gt;&lt;/font&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ma_scramble_323&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&gt;&lt;/font&gt;&lt;code&gt;libmariadb/ma_password.c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 매우 작고 단순한 소스 파일이며 Connector/C 프로젝트의 다른 라이브러리에는 크게 의존하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;61&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그 인.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'가난한 남자의 링크'(우웩)를 하고 그냥 그 소스들을 베꼈어요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ma_scramble_323&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;62&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 기능하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;63&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일. 이러한 함수는 다른 함수로 불리며,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ma_password.c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;64&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 복사했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 말씀드리지만, 이것은 매우 쉬웠습니다(또는 옵션입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ma_password.c&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그 자체에 의존관계가 있거나 더 복잡했다면, 나는 문제를 &quot;올바른&quot; 방법으로 해결하기 위해 고도의 CMake-fu를 멈추고, 떨어뜨리고, 익혀야 했을 것이다.&lt;/font&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;66&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(아사이드) 이 시점에서 저는 정기적으로 실행되어야만 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysqladmin flush-hosts&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;67&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트에 실패하는 경우가 너무 많아서 자주 이 작업을 수행해야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마 더 나은 방법이 있을 거야 하지만 난 그걸 모르고 크론도 알아&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;68&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로운 '인라인' 소스를 통해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_old_password.so&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;이번에는, 다음과 같이 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: name mismatch (2059) (SQLDriverConnect)')
&lt;/code&gt;&lt;/pre&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;ODBC가 파일을 찾을 수 있도록 파일 이름을 변경한 것과 관련이 있다고 생각했습니다(이 파일은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.so&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&gt;&lt;/font&gt;&lt;code&gt;mysql_old_password.so&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;plugins/auth/CMakeLists.txt&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&gt;&lt;/font&gt;&lt;code&gt;mysql_old_password&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&gt;&lt;/font&gt;&lt;code&gt;old_password&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;75&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 되었습니다.&lt;/font&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;76&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인은 그 자체로 소스인 것이 판명되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.c&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&gt;&lt;/font&gt;&lt;code&gt;mysql_old_password&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;78&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 기존의 문제일 가능성이 있습니다(즉, 지금까지 성공한 적이 없습니다).그리고, 지금까지 아무도 구축하거나 테스트한 적이 없는 것 같은 코드를 작성하고 있는 경우는, 성공할 가능성이 높지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든, 나는 똑같이 했다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;s/mysql_old_password/old_password/&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;이번에는 다음과 같은 권한이 있는 아티팩트를 생성했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;80&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 스크립트를 다시 실행해 보니&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;conn = pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin;PLUGIN_DIR=/home/mysql/zclient/mdb-c/plugins/auth')
pyodbc.Error: ('HY000', u&quot;[HY000] [unixODBC][ma-3.0.2]Access denied for user: 'admin@hostname' (Using password: NO) (1045) (SQLDriverConnect)&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;81&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 이상했어.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는...&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;82&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트 테스트 박스에도 3.23 서버가 설치되어 있는 명령줄 클라이언트(시스템 라이브러리 경로가 아닌 tarball 경유)가 포함되어 있으며, 이러한 자격 증명으로 정상적으로 접속할 수 있습니다(테스트할 수 없었습니다).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;83&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제대로 쓸 수 없었기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PLUGIN_DIR&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;84&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그 인을 어디에 넣어야 하는지 알 수 없었습니다.시스템에 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;85&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;MySQL 서버를 통상적인 &quot;초단순, 테스트 전용&quot;으로 셋업했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GRANT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;86&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;s, 대상&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localhost&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;87&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;88&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 데이터베이스,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;admin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;89&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 패스워드 및 eponymous 패스워드.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;90&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패스워드를 포기하고 empty/null로 설정해 패스워드 인증을 무효로 해, 로그인 할 수 있는 것을 확인했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;91&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;pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Error in server handshake (2012) (SQLDriverConnect)')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;92&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 죽음의 종소리임이 판명되었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 오류를 조사하다가 &lt;a href=&quot;https://github.com/Expensify/Bedrock/issues/55&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;92-1&quot;&gt;GitHub 문제를 발견&lt;/a&gt;했습니다.이 문제는 기본적인 클라이언트/서버 프로토콜의 호환성을 나타내는 것으로 사람들이 꽤 확신하고 있는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 시점에서 나는 포기했다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;old_password.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;93&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;접근.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB 드라이버 코드 3.0.2 버전(C 또는 ODBC)은 MySQL 프로토콜의 오래된 사투리를 제대로 사용하지 못하는 것 같습니다. 그러나 이 과정에서 놓친 수정 사항이 많이 있을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 경로 시도&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;113&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문에서 언급하신 몇 가지 다른 사항을 시도해 보았습니다. 이 부분에 대해 간단히 설명하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;94&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;찾으셨겠지만 디세블로 하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SQL_AUTO_IS_NULL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;95&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB 2.0 ODBC 드라이버 패밀리의 동작이 제대로 작동하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://bugs.mysql.com/bug.php?id=29270&quot; papago-id=&quot;95-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이 버그&lt;/a&gt; 스레드 및&lt;a href=&quot;https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html&quot; papago-id=&quot;95-3&quot; rel=&quot;nofollow noreferrer&quot;&gt; ODBC&lt;/a&gt; 커넥터 &lt;a href=&quot;https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html&quot; papago-id=&quot;95-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;파라미터&lt;/a&gt; &lt;a href=&quot;https://bugs.mysql.com/bug.php?id=29270&quot; papago-id=&quot;95-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;목록&lt;/a&gt;에는 해당 필드의 설정을 디세블로 하는 방법에 대한 몇 가지 제안이 있습니다( ).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Option=8388608&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;96&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명백하고 명확하죠?) 하지만 플래그를 강제로 비활성화 또는 활성화하려고 해도 연결 문자열 또는 ODBC에 있는지 여부에 관계없이 동작은 변경되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.ini&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;97&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 표시합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;118&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://downloads.mysql.com/archives/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;118-1&quot;&gt;MySQL 아카이브&lt;/a&gt; 사이트에서 사용할 수 있는 이전 버전의 ODBC 커넥터가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;안타깝게도 컴파일된 버전은 모두 32비트 Linux용이지만 저는 가지고 있지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스로부터 구축해 보았습니다만, 툴 체인을 구성하는 것조차 매우 귀찮았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1999년부터 &lt;a href=&quot;https://github.com/rwestlund/freesweep/issues/1&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;118-3&quot;&gt;시스템 식별 파일을 수동으로 설치&lt;/a&gt;해야 하는 시점에서는 분실 원인인 것을 알고 있었지만, 모든 Dep와 오래된 버전을 설치하고 컴파일을 시도했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 에러의 수나 다양성에 의해서, 이 어프로치를 포기하게 되었습니다(C표준의 미스매치, 게다가 UnixODBC의 거의 모든 부분과의 호환성의 결여).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C코더나 오래된 Linux 빌드 시스템 전문가가 아니기 때문에 이러한 문제에 대한 간단한 수정이 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;119&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.devart.com/odbc/mysql/download.html&quot; papago-id=&quot;119-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;서드파티제의 MySQL&lt;/a&gt; ODBC &lt;a href=&quot;https://www.devart.com/odbc/mysql/download.html&quot; papago-id=&quot;119-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;커넥터를 시험&lt;/a&gt;해 봤지만 작동하지 않았습니다. 5.* 패밀리와 같은 오류입니다.&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;98&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커넥터/ODBC 라이브러리의 2.50.39 버전을 컴파일했습니다(아카이브에서는 소스만 사용 가능).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러기 위해서, 저는 처음에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libmysqlclient.so.10&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;99&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3.23 버전의 서버용 파일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위해서는 3.23 서버의 소스를 변경하여 다음 문제를 해결해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;errno&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;100&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 문제(삭제)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;101&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한 조항.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extern int errno&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;102&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;my_sys.h&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;103&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), libtool OS 정의 파일을 소스 디렉토리의 다양한 위치에 복사합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/share/libtool/build-aux/config.{guess,sub}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;104&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;105&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mit-pthreads&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;106&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mit-pthreads/config/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;107&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;libmysqlclient&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;108&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 라이브러리&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--with-mit-threads --without-server --without-docs --without-bench&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;109&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;mysql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;110&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후 클라이언트 프로그램, 하지만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;111&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한 파일&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libmysqlclient&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;112&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;libmysqlclient.so.10&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;113&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브러리가 컴파일되어 &lt;a href=&quot;https://downloads.mysql.com/archives/c-odbc/&quot; papago-id=&quot;113-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;아카이브에서 커넥터/ODBC의 &lt;/a&gt;2.&lt;a href=&quot;https://downloads.mysql.com/archives/c-odbc/&quot; papago-id=&quot;113-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;50.39 버전&lt;/a&gt;을 구축했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위해서는 메인 MySQL에서 일부 소스를 변경해야 합니다(참조 파일 삭제).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;asm/atomic.h&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;114&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시스템 식별 libtool 해킹을 다른 라이브러리와 동일하게 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;검출에 실패했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;115&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;libs(Ubuntu에 설치)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libiodbc2-dev&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;116&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지)에 들어가 있기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/include&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;117&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/local/include&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;118&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 스위치로 설정했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--with-mysql-includes=$path_to_3.23_mysql_binary_dir/include --with-mysql-libs=$path_to_compiled_libmysqlclient.so.10_files_from_mysql_server_3.23_sources --with-iodbc-includes=/usr/include/iodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;119&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그리고 그것은 앞서 말한 것 외에는 문제없이 건설되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;atomic.h&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;120&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 그 후에 새로 컴파일한 파일을 통해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libmyodbc.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;121&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python/UnixODBC에서 seg fault를 발생시켰습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;발그린드&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gdb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;122&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;123&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 아카이브에는 오래된 바이너리 RPM 버전의 Connector/ODBC가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모두 32비트이며, 최신 Linux는 거의 모두 64비트입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 파일들을 &lt;a href=&quot;https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit&quot; papago-id=&quot;123-1&quot;&gt;shimming하기&lt;/a&gt; 위해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i386&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;124&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아키텍처와 필요한 라이브러리.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;64비트 Python/UnixODBC에서 로드하지 못했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;myodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;125&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인이 정상적으로 실행되어 일반적인 &quot;file not found&quot; 오류가 반환됩니다.이 에러는 결국 콜에 실패한 것으로 거슬러 올라갑니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dlopen&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;126&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;립툴스&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dlopen&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;127&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(UnixODBC에 의해 사용되는) 래퍼(wrappers)는 대부분의 사람들에 의해 매우 디버깅이 불가능한 것으로 간주되고 있습니다.또한 상당한 번거로움을 겪은 후 저의 기본적인 Valgrind 트릭은 아키텍처 호환성이 없는 것을 동적으로 로드할 수 없는 것으로 생각되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i386&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;128&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x86-64&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;129&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;) ODBC 백엔드&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;152&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;솔루션/나머지&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;130&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 고객 측에서 코드를 다시 작성하는 것이 더 쉬울 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 기존 Python 비ODBC MySQL 드라이버를 랩하는 Python 모듈을 만들 수 있습니다(@Flipper).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PA는 질문에 대한 코멘트에서 제안되었으며, 해킹을 '충분히'&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;131&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 모듈을 호출하는 코드를 너무 많이 리팩터링할 필요가 없는 모듈로 인터페이스하여 전개하기 전에 철저히 테스트합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;짜증나고 위험하다는 건 알지만 그게 최선책일 거야&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 모듈을 작성할 때는, 의 내부 코드의 일부를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;132&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범용 ODBC 구문/et cetera 를 처리합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;133&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가짜 ODBC 백엔드를 개발할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;134&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ODBC Python MySQL 이외의 드라이버를 호출했습니다만, 이것은 어려울 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pyodbc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;135&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;님의 백엔드 플러그 기능은 주로 심 코드를 &quot;확장&quot;하는 것이 아니라 컴파일된 라이브러리를 대상으로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;159&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;160&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;161&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB 사람들에게 버그를 제출하면 고칠 수 있을 거예요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과적으로 발생한 프로토콜 오류가 &quot;이것은 모든 수준에서 기본적으로 호환되지 않습니다.&quot;인지 아니면 &quot;인증 시스템이 수정만 하면 모든 것이 작동합니다.&quot;인지 잘 모르겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 볼 가치가 있을지도 몰라.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;162&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 2.50 커넥터/ODBC 코드의 32비트 RPM(64비트 Python/UnixODBC 환경에는 로드되지 않음)이 있으므로 전체 스택(또는 운영 체제 배포)을 32비트 코드로 변환할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 일반적이지 않은 컴파일 파일을 사용하는 경우 이는 상당한 문제가 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu/Debian은 특히 오래된 아키텍처에서 패키지를 사용할 수 있도록 하는 데 매우 능숙하지만, 이는 여전히 까다로울 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 것을 변환해도 동작이 바뀔 수 있기 때문에, 32비트의 낡은 특성은, 당신의 앱으로 작업하고 있는 사람에게 있어서, 계속 이상한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 2.50 드라이버가 32비트 런타임에서 액세스 했을 때만 동작하는 경우이며, 그 후에 다른 문제가 발생할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;향후 클라이언트 코드의 유지 보수 부담이 매우 낮아질 가능성이 있는 경우(프로젝트가 작거나 변경될 가능성이 없는 경우)에만 이 방법을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;163&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이야기의 도덕성&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;164&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소프트웨어는 &lt;em papago-id=&quot;164-1&quot;&gt;빠르게&lt;/em&gt; 썩는다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트가 하위 호환성을 유지하기 위해 지속적으로 작업하지 않는 한 특히 웹 소프트웨어에서 작업이 중단될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;165&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성물 자체가 부서지는 것이 아니라 우주가 그 아래에서 수백만 가지 작은 방식으로 변하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가가 이러한 모든 작은 변화들과 그것들을 되돌릴 방법을 알 만큼 충분히 오래 있지 않는 한, 모든 것을 &quot;그냥&quot; 작동하는 곳으로 시간/개정하는 것은 매우 어렵다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;166&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 드라이버와 같이 &quot;일반적인&quot; 바이너리일지라도 바이너리를 &lt;em papago-id=&quot;166-1&quot;&gt;얻을&lt;/em&gt; 수 &lt;em papago-id=&quot;166-1&quot;&gt;있습니다&lt;/em&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터넷과 공유하는 것이 이상적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;167&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 의존관계/툴 체인 목록 전체를 엄격하게 문서화하여 &lt;em papago-id=&quot;167-1&quot;&gt;인간&lt;/em&gt;을 위해 &lt;em papago-id=&quot;167-1&quot;&gt;문서화합니다&lt;/em&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 자동 툴의 프로그램 의존성 목록을 읽는 데 필요한 도구 자체가 사용되지 않게 된다고 가정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서화할 만큼 명백한 것은 없습니다.아키텍처, 커널 ABI, libc 동작 등 아무것도 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 Docker와 같은 &quot;모든 커널의 박스&quot;에 있기 때문에 더 많은 의존관계를 프로그래밍 방식으로 저장할 수 있지만 기대하지는 마십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;168&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Zac B가 보여준 것처럼 UnixODBC 및 pyodbc 3.07을 사용하는 Ubuntu 16 클라이언트에서 MySQL 3.23 서버를 연결하는 실질적인 방법은 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;169&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FlipperPA는 가능한 한 다음 솔루션으로 pypi.python.org/pypi/MySQL-python/1.2.4을 사용할 것을 제안했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 시도해보았다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;170&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;apt를 &lt;strong papago-id=&quot;170-2&quot;&gt;통해&lt;/strong&gt; 설치된 &lt;strong papago-id=&quot;170-0&quot;&gt;MySQL-python&lt;/strong&gt;은 이전 MySQL에 연결할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 3.23에서 동작하지 않는 시스템 mysql-client libs를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;171&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;pip을 &lt;strong papago-id=&quot;171-2&quot;&gt;통해&lt;/strong&gt; 설치된 &lt;strong papago-id=&quot;171-0&quot;&gt;MySQL-python&lt;/strong&gt;도 마찬가지입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;171-6&quot;&gt;libmysqlclient-dev&lt;/strong&gt; 패키지에 포함된 &lt;strong papago-id=&quot;171-4&quot;&gt;mysql_config&lt;/strong&gt;에서 libs를 가져옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 3.23에서도 동작하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 여기서 뭔가 수정할 수 있는 기회가 있어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;172&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;172-1&quot;&gt;libmariadb-client-lgpl-dev&lt;/strong&gt;를 설치하면 mysql_config와 매우 유사한 &lt;strong papago-id=&quot;172-3&quot;&gt;mariadb_config&lt;/strong&gt;가 나타납니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 Ubuntu 16의 mariadb-client는 위와 같이 MySQL 3.23과 연동됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ln -s /usr/bin/mariadb_config mysql_config
pip install MySQL-python
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;173&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이걸로 충분해.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python에서 오래된 MySQL Server를 연결할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;174&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;175&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/47350382/&lt;a href=&quot;https://stackoverflow.com/questions/47350382/connect-mysql-3-23-with-pyodbc-3-07&quot; target=&quot;_blank&quot; papago-id=&quot;175-1&quot;&gt;connect-mysql-3-23-with-pyodbc-3-07&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2354</guid>
      <comments>https://prostudy.tistory.com/2354#entry2354comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:33:32 +0900</pubDate>
    </item>
    <item>
      <title>16진수 색상 값(#fffff )을 정수 값으로 변환합니다.</title>
      <link>https://prostudy.tistory.com/2353</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;16진수 색상 값(#fffff )을 정수 값으로 변환합니다.&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;서버로부터 16진수 컬러 값을 수신하고 있습니다(이 형식에서는,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#xxxxxx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,예&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#000000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검정색)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 값을 정수로 변환하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;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&gt;&lt;/font&gt;&lt;code&gt;Integer.valueOf(&quot;0x&quot; + passedColor.substring(1, passedColor.length()))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 많은 육탄성 검사를 받다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0x000000&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;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기, 다른 조언은 없나요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;08-03 21:06:24.673: ERROR/AndroidRuntime(20231): java.lang.NumberFormatException: unable to parse '0x00C8FBFE' as integer&lt;/code&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;Android SDK를 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setBackgroundColor(int color)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수는 짐작하신 바와 같이 정수 색상 값을 취합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 이 질문의 반대입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/6539879/how-to-convert-a-color-integer-to-a-hex-string-in-android&quot; papago-id=&quot;12-1&quot;&gt;Android에서 색 정수를 16진수 문자열로 변환하는 방법&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;진짜 답은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Color.parseColor(myPassedColor)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android에서는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;myPassedColor&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 되다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hex&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;#000&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;#000000&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;#00000000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 이 &lt;a href=&quot;http://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt;함수&lt;/a&gt;는 다음과 같은 &lt;a href=&quot;http://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt;단축 16진수 값을 지원&lt;/a&gt;하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#000&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;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답은 매우 간단합니다.안드로이드에서 16진수 색상을 int로 변환하고 싶다면 아래 예시와 같이 안드로이드 &lt;strong papago-id=&quot;22-1&quot;&gt;컬러&lt;/strong&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;pre&gt;&lt;code&gt;Color.parseColor(&quot;#a8a8a8&quot;);
&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;Integer.parseInt(myString.replaceFirst(&quot;#&quot;, &quot;&quot;), 16) 
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;#AAAAAA&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드가 활용할 수 있는 형태로 변환하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그냥 사용하시면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0xFFAAAAAA&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드가 자동으로 색을 알 수 있게 해줬습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 주의사항&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FF&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;말하고 있다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;alpha&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가치. 도움이 되었으면 좋겠다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;진짜 답은 이렇게 단순하고 쉬운 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;String white = &quot;#ffffff&quot;;
int whiteInt = Color.parseColor(white);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나도 같은 문제에 직면해 있었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 해서 해결할 수 있었어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CQM이 말했듯이 Color.parseColor()를 사용하는 것이 이 문제에 대한 좋은 해결책입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용한 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;this.Button_C.setTextColor(Color.parseColor(prefs.getString(&quot;color_prefs&quot;, String.valueOf(R.color.green))));
&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;이 경우 기본 설정(color_prefs)에서 색상 선택을 변경할 때 버튼의 텍스트 색상(Button_C)을 변경하는 것이 목표입니다.&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;a href=&quot;https://stackoverflow.com/users/727429&quot; papago-id=&quot;34-1&quot;&gt;CQM&lt;/a&gt;의 &lt;a href=&quot;https://stackoverflow.com/questions/6935057/convert-hex-color-value-ffffff-to-integer-value/14533352#14533352&quot; papago-id=&quot;34-3&quot;&gt;답변&lt;/a&gt;과 &lt;a href=&quot;https://stackoverflow.com/questions/10230331/how-to-convert-3-digit-html-hex-colors-to-6-digit-flex-hex-colors/54594932#54594932&quot; papago-id=&quot;34-7&quot;&gt;다른&lt;/a&gt; &lt;a href=&quot;https://stackoverflow.com/users/5806201&quot; papago-id=&quot;34-5&quot;&gt;질문&lt;/a&gt;에 대한 ovokerie-ogbeta의 &lt;a href=&quot;https://stackoverflow.com/questions/10230331/how-to-convert-3-digit-html-hex-colors-to-6-digit-flex-hex-colors/54594932#54594932&quot; papago-id=&quot;34-7&quot;&gt;답변&lt;/a&gt;을 바탕으로 이 솔루션을 생각해냈습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (colorAsString.length() == 4) { // #XXX
    colorAsString = colorAsString.replaceAll(&quot;#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])&quot;, &quot;#$1$1$2$2$3$3&quot;);
}

int color = Color.parseColor(colorAsString);
&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;값을 static const로 전달할 수 있는 경우 16진수 값을 Android(android.graphics)로 변환할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Color)를 사용하여 이 온라인 컨버터를 사용하여 color reference를 const에 입력합니다.즉, color converter는 이 color #EE5670 = 0xFFEEE5670의 값을 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;static const Color redColor = const Color(0xFFEE5670);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://convertingcolors.com/hex-color-EE5670.html?search=#EE5670&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://convertingcolors.com/hex-color-EE5670.html?search=#EE5670&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에서 공유 기본 설정 색상 코드를 가져온 다음 정수로 변환하고 레이아웃 배경 색상을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    sharedPreferences = getSharedPreferences(mypref, Context.MODE_PRIVATE);
    String sw=sharedPreferences.getString(name, &quot;&quot;);
    relativeLayout.setBackgroundColor(Color.parseColor(sw));
&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;&amp;lt;shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; &amp;gt;
    &amp;lt;solid android:color=&quot;@color/white&quot;/&amp;gt;
    &amp;lt;size android:height=&quot;20dp&quot;
        android:width=&quot;20dp&quot;/&amp;gt;
&amp;lt;/shape&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; Drawable mDrawable = getActivity().getResources().getDrawable(R.drawable.bg_rectangle_multicolor);
mDrawable.setColorFilter(Color.parseColor(color), PorterDuff.Mode.SRC_IN);
mView1.setBackground(mDrawable);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컬러로...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;#FFFF&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;색상이 투명하면...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;set Alpha&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;mView1.setAlpha(x);&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; 플로트 9f)x 로 0-1 Ej (0.9f)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;행운을 빌어요&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;44&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/6935057/&lt;a href=&quot;https://stackoverflow.com/questions/6935057/convert-hex-color-value-ffffff-to-integer-value&quot; target=&quot;_blank&quot; papago-id=&quot;44-1&quot;&gt;convert-hex-color-value-ffffff-to-integer-value&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2353</guid>
      <comments>https://prostudy.tistory.com/2353#entry2353comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:32:40 +0900</pubDate>
    </item>
    <item>
      <title>Firebug 또는 유사한 도구를 사용하여 JavaScript/jQuery 이벤트 바인딩을 디버깅하는 방법</title>
      <link>https://prostudy.tistory.com/2352</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Firebug 또는 유사한 도구를 사용하여 JavaScript/jQuery 이벤트 바인딩을 디버깅하는 방법&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;상당히 복잡하고 복잡한 DOM 조작을 하기 &lt;a href=&quot;http://en.wikipedia.org/wiki/Document_Object_Model&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;위해&lt;/a&gt; jQuery를 사용하는 웹 애플리케이션을 디버깅해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 요소에 바인딩된 이벤트 중 일부는 실행되지 않고 단순히 작동을 중지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션 소스를 편집할 수 있다면 드릴다운하여 Firebug를 많이 &lt;a href=&quot;http://en.wikipedia.org/wiki/Firebug_%28software%29&quot; papago-id=&quot;2-1&quot; rel=&quot;noreferrer&quot;&gt;추가&lt;/a&gt;할 것입니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;console.log()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문장과 코멘트/코멘트 코드의 일부를 사용하여 문제를 특정합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 응용 프로그램 코드를 편집할 수 없으며 Firebug 또는 유사한 도구를 사용하여 Firefox에서 완전히 작동해야 한다고 가정합니다.&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;Firebug는 DOM을 탐색하고 조작할 수 있도록 하는 데 매우 능숙합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다만, 지금까지 Firebug로 이벤트 디버깅을 하는 방법을 알 수 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 특정 시간에 특정 요소에 바인드된 이벤트 핸들러의 목록을 보고 싶을 뿐입니다(Firebug JavaScript 중단점을 사용하여 변경 내용을 추적).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 Firebug에는 바인딩된 이벤트를 볼 수 있는 기능이 없거나 제가 너무 멍청해서 찾을 수 없습니다. :-)&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;현재 DOM을 편집할 수 있는 방법과 마찬가지로 요소에 바인딩된 이벤트를 보고 편집하는 것이 이상적입니다.&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;a href=&quot;https://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106#447106&quot; papago-id=&quot;6-1&quot;&gt;DOM 노드에서 이벤트청취자를 찾는 방법&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 요소에  가정합니다(예를 들어, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$('#foo').click(function() { console.log('clicked!') });&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 검사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 1.3.x&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;var clickEvents = $('#foo').data(&quot;events&quot;).click;
jQuery.each(clickEvents, function(key, value) {
  console.log(value) // prints &quot;function() { console.log('clicked!') }&quot;
})
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 1.4.x&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;var clickEvents = $('#foo').data(&quot;events&quot;).click;
jQuery.each(clickEvents, function(key, handlerObj) {
  console.log(handlerObj.handler) // prints &quot;function() { console.log('clicked!') }&quot;
})
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(jQuery는 핸들러를 내부에 저장합니다)를 참조해 주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 1.8.x&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;var clickEvents = $._data($('#foo')[0], &quot;events&quot;).click;
jQuery.each(clickEvents, function(key, handlerObj) {
  console.log(handlerObj.handler) // prints &quot;function() { console.log('clicked!') }&quot;
})
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.sprymedia.co.uk/article/Visual+Event+2&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;Visual&lt;/a&gt; Event라는 &lt;a href=&quot;http://www.sprymedia.co.uk/article/Visual+Event+2&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;멋진&lt;/a&gt; 북마클릿이 있어 요소에 연결된 모든 이벤트를 표시할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다양한 유형의 이벤트(마우스, 키보드 등)에 대한 강조 표시가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서를 놓으면 이벤트 핸들러의 본문, 첨부 방법 및 파일/행 번호(WebKit 및 Opera)가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트를 수동으로 트리거할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소에 연결된 이벤트 핸들러를 검색하는 표준 방법이 없기 때문에 모든 이벤트를 찾을 수는 없지만 jQuery, 프로토타입, MoTools, YUI 등과 같은 인기 라이브러리에서 작동합니다.&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;FireQuery를 &lt;a href=&quot;http://firequery.binaryage.com/#features&quot; papago-id=&quot;15-1&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Firebug의 HTML 탭에 DOM 요소에 연결된 이벤트가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 요소에 연결된 모든 데이터를 표시합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.data&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;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 특정 요소/이벤트에 대한 모든 이벤트 핸들러를 나열할 수 있는 플러그인입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.listHandlers = function(events, outputFunction) {
    return this.each(function(i){
        var elem = this,
            dEvents = $(this).data('events');
        if (!dEvents) {return;}
        $.each(dEvents, function(name, handler){
            if((new RegExp('^(' + (events === '*' ? '.+' : events.replace(',','|').replace(/^on/i,'')) + ')$' ,'i')).test(name)) {
               $.each(handler, function(i,handler){
                   outputFunction(elem, '\n' + i + ': [' + name + '] : ' + handler );
               });
           }
        });
    });
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// List all onclick handlers of all anchor elements:
$('a').listHandlers('onclick', console.info);

// List all handlers for all events of all elements:
$('*').listHandlers('*', console.info);

// Write a custom output function:
$('#whatever').listHandlers('click',function(element,data){
    $('body').prepend('&amp;lt;br /&amp;gt;' + element.nodeName + ': &amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;' + data + '&amp;lt;\/pre&amp;gt;');
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Src: (블로그) -&amp;gt;&lt;a href=&quot;http://james.padolsey.com/javascript/debug-jquery-events-with-listhandlers/&quot; papago-id=&quot;19-1&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;http://james.padolsey.com/javascript/&lt;a href=&quot;http://james.padolsey.com/javascript/debug-jquery-events-with-listhandlers/&quot; papago-id=&quot;19-1&quot; rel=&quot;noreferrer&quot;&gt;debug-jquery-events-with-listhandlers&lt;/a&gt;/&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WebKit Developer Console(Chrome, Safari 등에 있음)을 사용하여 요소에 대한 첨부된 이벤트를 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10213703/how-do-i-view-events-fired-on-an-element-in-chrome-web-developer&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 스택 오버플로우 질문에 대한 자세한 내용은&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;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;$._data(htmlElement, &quot;events&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery 1.7 이상,&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;$._data(document, &quot;events&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$._data($('.class_name').get(0), &quot;events&quot;)&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동료의 제안대로 console.log &amp;gt; alert:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var clickEvents = $('#foo').data(&quot;events&quot;).click;
jQuery.each(clickEvents, function(key, value) {
    console.log(value);
})
&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;jQuery는 다음 위치에 이벤트를 저장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;a#somefoo&quot;).data(&quot;events&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;console.log($(&quot;a#somefoo&quot;).data(&quot;events&quot;))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 해당 요소에 연결된 이벤트를 나열합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 Chrome(v29)에서 DevTools를 사용하면 다음 두 가지 팁이 이벤트 디버깅에 매우 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developers.google.com/chrome-developer-tools/docs/console#accessing_recently_selected_elements_and_objects&quot; rel=&quot;noreferrer&quot; papago-id=&quot;31-1&quot;&gt;마지막으로 선택한 DOM&lt;/a&gt; 요소의 jQuery 이벤트를 나열하는 중&lt;/font&gt;&lt;/p&gt;
  &lt;ul&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&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;blockquote&gt; 
     &lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$._data ($&lt;a href=&quot;https://developers.google.com/chrome-developer-tools/docs/console#accessing_recently_selected_elements_and_objects&quot; rel=&quot;noreferrer&quot; papago-id=&quot;33-1&quot;&gt;0&lt;/a&gt;, &quot;이벤트&quot;) //jQuery 1.7+를 전제로 합니다.&lt;/font&gt;&lt;/p&gt;
    &lt;/blockquote&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연관된 모든 jQuery 이벤트 개체를 나열하고 관심 이벤트를 확장한 다음 &quot;handler&quot; 속성의 기능을 마우스 오른쪽 버튼으로 클릭한 다음 &quot;Show function definition&quot;을 선택합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지정된 함수를 포함하는 파일이 열립니다.&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;p&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developers.google.com/chrome-developer-tools/docs/commandline-api#monitoreventsobject_events&quot; rel=&quot;noreferrer&quot; papago-id=&quot;36-1&quot;&gt;monitorEvents&lt;/a&gt;() 명령어 사용&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FireBug 크루가 EventBug 확장 작업을 하고 있는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;FireBug - Events에 다른 패널이 추가됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;이벤트 패널에는 이벤트 유형별로 그룹화된 페이지에 모든 이벤트 핸들러가 나열됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 이벤트 유형에 대해 열어서 청취자가 바인딩된 요소와 함수 소스의 요약을 볼 수 있습니다.&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://blog.getfirebug.com/2009/09/18/eventbug-rising/&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;Getfirebug 블로그 엔트리&quot; papago-id=&quot;38-1&quot; papago-attr-id=&quot;7&quot;&gt;이벤트 버그 발생&lt;/a&gt;&lt;/font&gt;&lt;/p&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;a href=&quot;https://chrome.google.com/webstore/detail/dbhhnnnpaeobfddmlalhnehgclcmjimi&quot; rel=&quot;nofollow&quot; papago-id=&quot;40-1&quot;&gt;jQuery&lt;/a&gt; Debugger도 찾았습니다.&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&gt;&lt;strong&gt;&lt;code&gt;ev&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소 옆에 있는 아이콘&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Firefox Developer &lt;em papago-id=&quot;42-1&quot;&gt;Tools&lt;/em&gt;의 Inspector 패널에는 요소에 바인딩된 모든 이벤트가 나열됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 + + 요소를 선택합니다(예: 스택 오버플로의 위쪽 화살표).&lt;/font&gt;&lt;/p&gt; 
&lt;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;ev&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&gt;&lt;a href=&quot;https://i.stack.imgur.com/9QYSA.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/9QYSA.png&quot; alt=&quot;이벤트 툴팁&quot; papago-attr-id=&quot;2&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 기호를 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;||&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 이벤트에 대한 기호, 그러면 핸들러의 행에 디버거가 열립니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;자세한 내용은 https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_event_listeners&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;49-1&quot;&gt;Examine_event_listeners&lt;/a&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;아쉽게도 이 기능을 예쁘게 사용할 수 있는 방법을 찾을 수 없었습니다.최소화된 라인으로 오픈하는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/3216583/beautify-javascript-and-css-in-firebug/33753982#33753982&quot; papago-id=&quot;50-1&quot;&gt;Firefox/Firebug에서 Javascript와 CSS를 아름답게 하는 방법&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Firefox 42에서 테스트.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://groups.google.com/group/firebug/browse_thread/thread/607400c545ce6048?pli=1&quot; papago-id=&quot;52-1&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;이 실&quot; papago-attr-id=&quot;5&quot;&gt;이&lt;/a&gt; 스레드에 &lt;a href=&quot;http://groups.google.com/group/firebug/browse_thread/thread/607400c545ce6048?pli=1&quot; papago-id=&quot;52-1&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;이 실&quot; papago-attr-id=&quot;6&quot;&gt;따르면&lt;/a&gt; Firebug에서는 DOM 요소의 리스너에 연결된 이벤트를 표시할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tj111이 제안하는 것이 최선인 것 같습니다.또한 HTML 뷰어에서 요소를 우클릭하여 [이벤트 로그(Log Events)]를 클릭하면 특정 DOM 요소에 대해 어떤 이벤트가 발생하는지 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 &lt;em papago-id=&quot;53-1&quot;&gt;이벤트&lt;/em&gt;가 특정 기능을 발생시킬 수 있는지 확인하기 위해 그렇게 할 수 있을 것 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 2.0에서 Firebug는 HTML &lt;a href=&quot;https://getfirebug.com/wiki/index.php/HTML_Panel&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;54-3&quot;&gt;패널&lt;/a&gt; 내에서 현재 선택된 요소의 모든 이벤트를 나열하는 &lt;a href=&quot;https://getfirebug.com/wiki/index.php/Events_Side_Panel&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;54-1&quot;&gt;이벤트&lt;/a&gt; 패널을 도입했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/p9fUo.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/p9fUo.png&quot; alt=&quot;Firebug의 *이벤트* 사이드 패널&quot; papago-attr-id=&quot;4&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;55-1&quot;&gt;또한&lt;/em&gt; [&lt;a href=&quot;https://getfirebug.com/wiki/index.php/Events_Side_Panel#Options_Menu&quot; papago-id=&quot;55-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;Show&lt;/a&gt; &lt;em papago-id=&quot;55-1&quot;&gt;Wraped&lt;/em&gt; Listeners]&lt;em papago-id=&quot;55-1&quot;&gt;옵션&lt;/em&gt;이 선택되어 있는 경우 jQuery 이벤트바인딩으로 둘러싸인 이벤트청취자를 표시할 수 있습니다.이 옵션은 [&lt;a href=&quot;https://getfirebug.com/wiki/index.php/Events_Side_Panel#Options_Menu&quot; papago-id=&quot;55-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;Events]&lt;/a&gt;패널의 [Options]메뉴를 통해 접근할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 패널에서 이벤트핸들러를 디버깅하는 워크플로우는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버깅할 이벤트청취자가 있는 요소를 선택합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;58-1&quot;&gt;이벤트&lt;/em&gt; 사이드 패널 내에서 관련 이벤트 아래의 함수를 마우스 오른쪽 버튼으로 클릭하고 &lt;em papago-id=&quot;58-3&quot;&gt;중단점&lt;/em&gt; 설정을 &lt;em papago-id=&quot;58-3&quot;&gt;선택&lt;/em&gt;합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트를 트리거하다&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=&amp;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;a href=&quot;https://blog.getfirebug.com/2014/06/10/firebug-2-0/#dom-events-inspector&quot; rel=&quot;nofollow&quot; papago-id=&quot;61-0&quot;&gt;Firebug&lt;/a&gt; 2에는 DOM 이벤트의 디버깅/검사가 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/570960/&lt;a href=&quot;https://stackoverflow.com/questions/570960/how-to-debug-javascript-jquery-event-bindings-with-firebug-or-similar-tools&quot; target=&quot;_blank&quot; papago-id=&quot;62-1&quot;&gt;how-to-debug-javascript-jquery-event-bindings-with-firebug-or-similar-tools&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2352</guid>
      <comments>https://prostudy.tistory.com/2352#entry2352comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:31:52 +0900</pubDate>
    </item>
    <item>
      <title>Android 앱을 프로그래밍 방식으로 종료하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2351</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android 앱을 프로그래밍 방식으로 종료하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문은 몇 번 읽었기 때문에 몇 번인가 질문을 받았을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 고객은 사용자가 클릭해서 종료할 수 있는 버튼을 앱에 넣기를 원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 글을 &lt;a href=&quot;https://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon/2034238&quot; papago-id=&quot;1-1&quot;&gt;읽고&lt;/a&gt; 전화를 걸었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;finish()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 마침은 현재 진행 중인 활동을 종료하는 것 뿐이죠?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 활동이 많기 때문에 이 경우 모든 활동의 인스턴스를 통과하여 완료하거나 모든 활동을 싱글톤 패턴으로 만들어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;i i i도 i i i i 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity.moveTaskToBack(true)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;홈 화면으로 이동할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 프로세스를 종료하는 것이 아니라 백그라운드입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&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;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;API 16에서 릴리스된 finishAffinity 메서드는 진행 중인 모든 작업을 닫고 앱을 닫습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;this.finishAffinity();
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 액티비티와 그 바로 아래의 모든 액티비티를 현재 태스크에서 동일한 선호도를 가진 액티비티를 완료합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 일반적으로 응용 프로그램을 다른 작업(예를 들어 인식되는 콘텐츠유형의 ACTION_VIEW에서)으로 기동할 수 있고 사용자가 업 네비게이션으로 현재 작업을 종료하고 자신의 작업으로 전환했을 때 사용됩니다.&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;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&gt;&lt;br&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;API 21 이후 다음 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;finishAndRemoveTask();
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 작업의 모든 작업을 완료하고 최근 작업 목록에서 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getActivity().finish();
System.exit(0);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/6330200/how-to-quit-android-application-programmatically&quot; papago-id=&quot;12-1&quot;&gt;출처&lt;/a&gt;: &lt;a href=&quot;https://stackoverflow.com/questions/6330200/how-to-quit-android-application-programmatically&quot; papago-id=&quot;12-1&quot;&gt;Android&lt;/a&gt; 어플리케이션을 &lt;a href=&quot;https://stackoverflow.com/questions/6330200/how-to-quit-android-application-programmatically&quot; papago-id=&quot;12-1&quot;&gt;프로그래밍&lt;/a&gt; 방식으로 &lt;a href=&quot;https://stackoverflow.com/questions/6330200/how-to-quit-android-application-programmatically&quot; papago-id=&quot;12-1&quot;&gt;종료하는 방법&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;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;Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 
&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;모든 액티비티를 종료하려면 System.exit();를 호출할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(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;응용 프로그램을 종료하려면 버튼을 누른 이벤트 내에서 다음 코드를 사용하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt; @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle(&quot;Exit Application?&quot;);
        alertDialogBuilder
                .setMessage(&quot;Click yes to exit!&quot;)
                .setCancelable(false)
                .setPositiveButton(&quot;Yes&quot;,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton(&quot;No&quot;, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;System.exit(0);&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;따라서 다음 두 가지 상황이 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;액티비티를 종료할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 응용 프로그램을 종료합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();
&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;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;android.os.Process.killProcess(android.os.Process.myPid()); 
&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;모노 발달을 위해&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;process.KillProcess(Process.MyPid());
&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;this.finishAffinity()&lt;/code&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;blockquote&gt; 
 &lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 액티비티와 그 바로 아래의 모든 액티비티를 현재 태스크에서 동일한 선호도를 가진 액티비티를 완료합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 일반적으로 응용 프로그램을 다른 작업(예를 들어 인식되는 콘텐츠유형의 ACTION_VIEW에서)으로 기동할 수 있고 사용자가 업 네비게이션으로 현재 작업을 종료하고 자신의 작업으로 전환했을 때 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 사용자가 두 번째 응용 프로그램의 다른 액티비티로 이동한 경우 작업 전환의 일부로 이러한 액티비티를 모두 원래 작업에서 제거해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 종료에서는 이전 액티비티로 결과를 전달할 수 없습니다.이렇게 할 경우 예외가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;android.os.Process.killProcess(android.os.Process.myPid());
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업(작업 스택)을 지우고 새 작업을 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 사용하면 매우 유용하며 모든 활동을 종료할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt; @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자마린에서 달성.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 onClic에 넣습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;moveTaskToBack(true);
    finish()
&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;font class=&quot;papago-parent&quot;&gt;버튼 클릭으로 사용하는 경우가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
&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;Android에 대한 &lt;a href=&quot;https://stackoverflow.com/questions/3226495/android-exit-application-code/3226743#3226743&quot; papago-id=&quot;35-1&quot;&gt;자세한&lt;/a&gt; 설명을 보려면 이 질문을 읽으십시오. - 응용 &lt;a href=&quot;https://stackoverflow.com/questions/3226495/android-exit-application-code/3226743#3226743&quot; papago-id=&quot;35-1&quot;&gt;프로그램 코드를 종료&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이걸 쓰세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;finishAffinity(); finish() 대신 이 버튼에서 finishAffinity(); 이 버튼이 작동하지 않으면 매니페스트에 Android:noHistory=&quot;true&quot;를 추가하고 uisng finish(); 또는 finishAffinity(); 로 액티비티를 완료할 수도 있습니다.&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;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; finish();
 moveTaskToBack(true);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 메서드를 종료/종료 버튼에 연결&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public void quitGame(View view) {
        if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;singletop 및 finish() onCreate를 사용하여 호출된 ghost 액티비티가 유효합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용만 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;moveTaskToBack(true);&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;System.exit(1) 대신 System.exit(0)을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;finish();
 finishAffinity();
 System.exit(0);
&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;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아직도 궁금해 하는 사람이 있다면,&lt;strong papago-id=&quot;44-1&quot;&gt; 자마린&lt;/strong&gt;을 위해서.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android(내 경우 Monogame도 실행 중) &lt;strong papago-id=&quot;44-1&quot;&gt;명령어&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FinishAndRemoveTask()&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;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아, 아, 아, 맞다!&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단편적으로&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;getActivity().finishAndremoveTask();&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;액티비티에서&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;finish And Remove Task();&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;백프레스의 코드를 사용하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
&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;어플리케이션에서 EventBus(또는 실제로 다른 pub/sub 라이브러리)를 사용하여 액티비티 간에 통신하는 경우 명시적 이벤트를 전송할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 이  모든 을 해야 의 활동을 할 수 있다는 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;finish()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위해 상속을 통해 쉽게 shim 액티비티 클래스를 &lt;em papago-id=&quot;12-1&quot;&gt;만들&lt;/em&gt; 수 있습니다.이러한 클래스는 이 이벤트를 듣고 서브클래스가 다른 모든 것을 구현하도록 합니다.그러면 모든 액티비티가 이 추가 레이어에서 상속되도록 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;킬 청취자는 특정 상황에서 죽음을 피하는 것과 같은 오버라이드를 통해 추가 기능을 추가할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;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;android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
&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;finishAffinity();
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 될 수 있어 나도 해봤어.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;this.finishAffinity();&lt;/code&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;/p&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;finish();&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;System.exit(0);&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17719634/&lt;a href=&quot;https://stackoverflow.com/questions/17719634/how-to-exit-an-android-app-programmatically&quot; target=&quot;_blank&quot; papago-id=&quot;61-1&quot;&gt;how-to-exit-an-android-app-programmatically&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2351</guid>
      <comments>https://prostudy.tistory.com/2351#entry2351comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:31:08 +0900</pubDate>
    </item>
    <item>
      <title>Amazon EC2 - Maria에 원격으로 연결할 수 없음DB</title>
      <link>https://prostudy.tistory.com/2350</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Amazon EC2 - Maria에 원격으로 연결할 수 없음&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB&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;EC2 서버를 설정하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php, larabel 등을 설치했습니다.&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;ul&gt; 
 &lt;li papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마리아에 사용자를 생성했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB&lt;/font&gt;&lt;/li&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;my.cnf에서 enabled bind-address = 0.0.0&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;5&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;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Security Group에서 Mysql/Aurora, 포트 3306, TCP, 모든 IP(착신 및 발신 모두)에 대해 열린 규칙&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;ERROR 2003 (HY000): Can't connect to MySQL server on 'yyz.yyz.yyz.yyz' (110)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 뭘 할 수 있을까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;난 어떤 종류의 iptables도 가지고 있지 않아. 모든 것은 단순해야 해.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 :-는 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문자열로 아마존 네트워크 외부에서 접속하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql -u myuser -pmypwd -h yyz.yyz.yyz.yyz -D myschema
&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;mysql -u myuser -p -h localhost -P 3306 -D myschema
&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;추신. 참고로, 여기 MariaDB 사용자가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;+---------------------------------------------+-----------+
| host                                        | user      |
+---------------------------------------------+-----------+
| %                                           | myuser    |
| 127.0.0.1                                   | root      |
| ::1                                         | root      |
| ip-yyz-yy-zz-yyz.us-west-2.compute.internal | root      |
| localhost                                   | root      |
| localhost                                   | myuser    |
+---------------------------------------------+-----------+
&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;EC2 인스턴스에는 내부와 외부의 2개의 IP 주소가 있습니다.&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;사용자 테이블이 내부 IP 주소로부터의 액세스를 허가하는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ip-yyz-yy-zz-yyz.us-west-2.compute.internal | root 
&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;외부 AWS에서 내부 주소로 연결하려고 합니까?&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;외부 주소에 접속하려면 , 유저 리스트에 추가할 필요가 있습니다.&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;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;운용이 아닌 트러블 슈팅의 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;* | root&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 papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저에서 https&lt;a href=&quot;https://xyz.xyz.xyz.xyz:3306&quot; papago-id=&quot;19-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;://xyz.xyz.xyz.xyz:3306&lt;/a&gt; 을 &lt;a href=&quot;https://xyz.xyz.xyz.xyz:3306&quot; papago-id=&quot;19-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;시험&lt;/a&gt;할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;접속은 되지 않습니다만, 타임 아웃이 되면, 머신으로부터 그 주소로 가는 루트가 없는 것을 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그것이 어떤 종류의 횡설수설이라면, 즉시 MySQL 포트가 보이는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋은 소식과 나쁜 소식.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋은 소식:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제 해결했어!&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나쁜 소식:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리 모두 맞았다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Security Group의 3306 포트를 열기에 충분했습니다.&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;거기서 포트 3306을 활성화하고 마법처럼 작동했어!&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수리에 시간을 내주셔서 감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/51424307/&lt;a href=&quot;https://stackoverflow.com/questions/51424307/amazon-ec2-cant-connect-remotely-to-mariadb&quot; target=&quot;_blank&quot; papago-id=&quot;24-1&quot;&gt;amazon-ec2-cant-connect-remotely-to-mariadb&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2350</guid>
      <comments>https://prostudy.tistory.com/2350#entry2350comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:30:34 +0900</pubDate>
    </item>
    <item>
      <title>maria db 및 s3에 대한 클라우드 주조 공장 내 자동 백업</title>
      <link>https://prostudy.tistory.com/2349</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;maria db 및 s3에 대한 클라우드 주조 공장 내 자동 백업&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;당사는 여러 애플리케이션에 대해 swisscom에서 제공하는 Cloud Foundry를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 클라우드 주조 공장 내에서 db 및 s3용 자동 백업을 가장 잘 구현할 수 있는 방법을 자문해 보겠습니다.&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;이 2개의 앱을 사용하여 mariadb와 mongodb를 백업합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/seinol/db-dumper&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/seinol/db-dumper&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/seinol/cf-backup-rotation&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/seinol/cf-backup-rotation&lt;/font&gt;&lt;/a&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;한 앱은 덤프를 생성하여 1시간마다 s3 스토리지에 저장하며, 다른 앱은 백업 메커니즘에 따라 각 서비스의 백업 엔드포인트를 트리거합니다(매시간 10회, 매일 최대 20회 백업).&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;최근에는 이 공식 백업 솔루션도 이용할 수 있지만 아직 사용하지 않았습니다.https&lt;a href=&quot;https://github.com/swisscom/backman&quot; papago-id=&quot;6-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;://&lt;/a&gt;github.com/&lt;a href=&quot;https://github.com/swisscom/backman&quot; papago-id=&quot;6-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;swisscom&lt;/a&gt;/backman&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;URL : https://stackoverflow.com/questions/56276523/&lt;a href=&quot;https://stackoverflow.com/questions/56276523/automated-backup-within-cloud-foundry-for-maria-db-and-s3&quot; target=&quot;_blank&quot; papago-id=&quot;7-1&quot;&gt;automated-backup-within-cloud-foundry-for-maria-db-and-s3&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2349</guid>
      <comments>https://prostudy.tistory.com/2349#entry2349comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:29:30 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript에서 현재 연도 가져오기</title>
      <link>https://prostudy.tistory.com/2348</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JavaScript에서 현재 연도 가져오기&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;JavaScript에서 현재 연도를 얻으려면 어떻게 해야 합니까?&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;new Date().getFullYear()  // returns the current year
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-0&quot;&gt;사용 &lt;/strong&gt;예: 항상 현재 연도를 표시하는 페이지 바닥글:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;document.getElementById(&quot;year&quot;).innerHTML = new Date().getFullYear();&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;footer {
  text-align: center;
  font-family: sans-serif;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;footer&amp;gt;
    ©&amp;lt;span id=&quot;year&quot;&amp;gt;&amp;lt;/span&amp;gt; by Donald Duck
&amp;lt;/footer&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;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자의 &lt;strong papago-id=&quot;4-3&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date#static_methods&quot; papago-id=&quot;4-3-0&quot; rel=&quot;noreferrer&quot;&gt;전체&lt;/a&gt;&lt;/strong&gt; 메서드 &lt;strong papago-id=&quot;4-3&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date#static_methods&quot; papago-id=&quot;4-3-0&quot; rel=&quot;noreferrer&quot;&gt;목록&lt;/a&gt;&lt;/strong&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;// Return today's date and time
var currentTime = new Date()

// returns the month (from 0 to 11)
var month = currentTime.getMonth() + 1

// returns the day of the month (from 1 to 31)
var day = currentTime.getDate()

// returns the year (four digits)
var year = currentTime.getFullYear()

// write output MM/dd/yyyy
document.write(month + &quot;/&quot; + day + &quot;/&quot; + year)
&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;new Date().getDate()          // Get the day as a number (1-31)
new Date().getDay()           // Get the weekday as a number (0-6)
new Date().getFullYear()      // Get the four digit year (yyyy)
new Date().getHours()         // Get the hour (0-23)
new Date().getMilliseconds()  // Get the milliseconds (0-999)
new Date().getMinutes()       // Get the minutes (0-59)
new Date().getMonth()         // Get the month (0-11)
new Date().getSeconds()       // Get the seconds (0-59)
new Date().getTime()          // Get the time (milliseconds since January 1, 1970)
&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;HTML 웹 페이지에 삽입하여 출력하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;p class=&quot;text-center&quot;&amp;gt;Copyright &amp;amp;copy; 
        &amp;lt;script&amp;gt;
            var CurrentYear = new Date().getFullYear()
            document.write(CurrentYear)
        &amp;lt;/script&amp;gt;
    &amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 페이지 출력은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저작권 © 2018&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;JS 코드 한 줄로 현재 연도를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;Copyright &amp;lt;script&amp;gt;document.write(new Date().getFullYear());&amp;lt;/script&amp;gt;&amp;lt;/p&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;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;금년도에는 Date &lt;strong papago-id=&quot;10-1&quot;&gt;클래스에서 getFullYear&lt;/strong&gt;()를 사용할 수 있지만 요건에 따라 사용할 수 있는 함수가 많습니다.일부 함수는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var now = new Date()
console.log(&quot;Current Time is: &quot; + now);

// getFullYear function will give current year 
var currentYear = now.getFullYear()
console.log(&quot;Current year is: &quot; + currentYear);

// getYear will give you the years after 1990 i.e currentYear-1990
var year = now.getYear()
console.log(&quot;Current year is: &quot; + year);

// getMonth gives the month value but months starts from 0
// add 1 to get actual month value 
var month = now.getMonth() + 1
console.log(&quot;Current month is: &quot; + month);

// getDate gives the date value
var day = now.getDate()
console.log(&quot;Today's day is: &quot; + day);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;javascript는 이렇게 간단하게 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 대규모 애플리케이션에서 도움이 되는 &lt;a href=&quot;https://momentjs.com/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-1&quot;&gt;momentJs&lt;/a&gt; 플러그인을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;new Date().getDate()          // Get the day as a number (1-31)
new Date().getDay()           // Get the weekday as a number (0-6)
new Date().getFullYear()      // Get the four digit year (yyyy)
new Date().getHours()         // Get the hour (0-23)
new Date().getMilliseconds()  // Get the milliseconds (0-999)
new Date().getMinutes()       // Get the minutes (0-59)
new Date().getMonth()         // Get the month (0-11)
new Date().getSeconds()       // Get the seconds (0-59)
new Date().getTime()          // Get the time (milliseconds since January 1, 1970)
&lt;/code&gt;&lt;/pre&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 generate(type,element)
{
	var value = &quot;&quot;;
	var date = new Date();
	switch (type) {
		case &quot;Date&quot;:
			value = date.getDate();		// Get the day as a number (1-31)
			break;
		case &quot;Day&quot;:
			value = date.getDay();		// Get the weekday as a number (0-6)
			break;
		case &quot;FullYear&quot;:
			value = date.getFullYear();	// Get the four digit year (yyyy)
			break;
		case &quot;Hours&quot;:
			value = date.getHours();	// Get the hour (0-23)
			break;
		case &quot;Milliseconds&quot;:
			value = date.getMilliseconds();	// Get the milliseconds (0-999)
			break;
		case &quot;Minutes&quot;:
			value = date.getMinutes();     // Get the minutes (0-59)
			break;
		case &quot;Month&quot;:
			value = date.getMonth();	// Get the month (0-11)
			break;
		case &quot;Seconds&quot;:
			value = date.getSeconds();	// Get the seconds (0-59)
			break;
		case &quot;Time&quot;:
			value = date.getTime();		// Get the time (milliseconds since January 1, 1970)
			break;
	}

	$(element).siblings('span').text(value);
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;li{
  list-style-type: none;
  padding: 5px;
}

button{
  width: 150px;
}

span{
  margin-left: 100px;
}&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://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;


&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Date',this)&quot;&amp;gt;Get Date&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Day',this)&quot;&amp;gt;Get Day&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('FullYear',this)&quot;&amp;gt;Get Full Year&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Hours',this)&quot;&amp;gt;Get Hours&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Milliseconds',this)&quot;&amp;gt;Get Milliseconds&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;

	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Minutes',this)&quot;&amp;gt;Get Minutes&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Month',this)&quot;&amp;gt;Get Month&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Seconds',this)&quot;&amp;gt;Get Seconds&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;button type=&quot;button&quot; onclick=&quot;generate('Time',this)&quot;&amp;gt;Get Time&amp;lt;/button&amp;gt;
		&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&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;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예를 들어, 바닥글의 스크립트를 참조하지 않고 표시할 위치에 배치할 수 있습니다.또, 다른 대답과 같은 장소에 배치할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;new Date().getFullYear()&amp;gt;document.write(new Date().getFullYear());&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 바닥글의 저작권 참고 사항&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Copyright 2010 - &amp;lt;script&amp;gt;new Date().getFullYear()&amp;gt;document.write(new Date().getFullYear());&amp;lt;/script&amp;gt;
&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;strong papago-id=&quot;14-1&quot;&gt;클래스&lt;/strong&gt; Date를 인스턴스화하고 &lt;strong papago-id=&quot;14-3&quot;&gt;getFullYear&lt;/strong&gt; 메서드를 호출하여 &lt;strong papago-id=&quot;14-5&quot;&gt;yyy&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;let currentYear = new Date().getFullYear();
&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;strong papago-id=&quot;15-1&quot;&gt;currentYear&lt;/strong&gt; 변수는 사용자가 찾는 값을 유지합니다.&lt;/font&gt;&lt;/p&gt;&lt;h1 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TL, DR&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 기재되어 있는 답변의 &lt;strong papago-id=&quot;17-3&quot;&gt;대부분&lt;/strong&gt;은 로컬 머신의 타임 존과 오프셋(클라이언트측)에 근거해 현년이 필요한 경우에만 정답입니다.&lt;strong papago-id=&quot;17-1&quot;&gt;이것&lt;/strong&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;ul&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹 서버의 시계(단, 업데이트되었는지 확인)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시간 API 및 CDN&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세부 사항&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;Date&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;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &quot;MDN 웹 문서: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date&quot; papago-id=&quot;24-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;JavaScript&lt;/a&gt; 날짜&quot; &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date&quot; papago-id=&quot;24-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;개체&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편의를 위해 관련 문서를 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;/blockquote&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.tizag.com/javascriptT/javascriptdate.php&quot; papago-id=&quot;27-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이&lt;/a&gt;를 언급하는 또 다른 소스는 &lt;a href=&quot;http://www.tizag.com/javascriptT/javascriptdate.php&quot; papago-id=&quot;27-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;JavaScript 날짜&lt;/a&gt; 및 &lt;a href=&quot;http://www.tizag.com/javascriptT/javascriptdate.php&quot; papago-id=&quot;27-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;시간&lt;/a&gt; 객체입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;/blockquote&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수 있는 신뢰할 수 있는 소스는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;30&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;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시간 API 및 CDN:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;  &lt;/font&gt;&lt;/font&gt;&lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://timezonedb.com/api&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://timezonedb.com/api&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;http://worldtimeapi.org&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://worldtimeapi.org&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;http://worldclockapi.com&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://worldclockapi.com&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;http://www.geonames.org/export/ws-overview.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.geonames.org/export/ws-overview.html&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타 관련 API : https://www.&lt;a href=&quot;https://www.programmableweb.com/category/time/api&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;35-1&quot;&gt;programmableweb&lt;/a&gt;.com/category/time/api&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&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;그러나 단순히 시간 정확도에 관심이 없거나 사용 사례에 로컬 머신의 시간에 비례하는 시간 값이 필요한 경우 Javascript를 안전하게 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Date&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;Date.now()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new Date().getFullYear()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(당년도의 경우).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES6 Javascript를 Angular, React, VueJs 등의 프레임워크와 함께 사용하는 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 프로젝트 편의를 위해 타사 유틸리티 라이브러리를 통합해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;code&gt;DayJS&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 불변의 데이터 구조를 가진 가장 인기 있는 경량 라이브러리 중 하나입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dayJS&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;year&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 간단한 코드 한 줄에 넣을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;dayjs().year()
&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;font class=&quot;papago-parent&quot;&gt;그래서 다음 프로젝트에 dayjs를 사용하는 것이 좋습니다.&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/6002254/&lt;a href=&quot;https://stackoverflow.com/questions/6002254/get-the-current-year-in-javascript&quot; target=&quot;_blank&quot; papago-id=&quot;46-1&quot;&gt;get-the-current-year-in-javascript&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2348</guid>
      <comments>https://prostudy.tistory.com/2348#entry2348comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:28:51 +0900</pubDate>
    </item>
    <item>
      <title>PHP에서 유용한 오류 메시지를 얻으려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2347</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP에서 유용한 오류 메시지를 얻으려면 어떻게 해야 합니까?&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;PHP 스크립트를 실행하려고 하면 빈 화면이 나타납니다.&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;무엇이 잘못되었는지 알아내는 것은 매우 어렵다.&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;Java처럼 PHP가 유용한 오류 메시지를 생성하도록 하는 방법이 있습니까?&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;구문 오류의 경우 php.ini에서 오류 표시를 활성화해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로는 &quot;고객&quot;이 오류 메시지를 표시하지 않도록 하기 위해 이러한 기능은 꺼져 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;다음&lt;/a&gt;의 2개의 지시에 대해서는, PHP 메뉴얼의 이 &lt;a href=&quot;http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;페이지를 참조&lt;/a&gt;해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;error_reporting&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;display_errors&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;display_errors&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;php수 파일에 .php.ini는 .htaccess.htaccess.는 .htaccess.ini입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;php_flag  display_errors        on
php_value error_reporting       2039
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Gumbo 서급)에 e) E_ALL의 에 대해 (Gumbo에서을 사용하는 것을 하는 것이 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;error_reporting&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 오류를 가져오려면 여기를 클릭하십시오. &lt;a href=&quot;http://docs.php.net/manual/en/errorfunc.constants.php&quot; papago-id=&quot;9-1&quot; rel=&quot;noreferrer&quot;&gt;자세한 정보&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타 3가지 항목: (1) 모든 오류가 발생하므로 오류 로그 파일을 확인할 수 있습니다(로깅이 비활성화되지 않은 경우).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(2) 다음 2 행을 추가하면 구문 오류가 아닌 오류를 디버깅하는 데 도움이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;error_reporting(-1);
ini_set('display_errors', 'On');
&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;(3) PhpEd와 &lt;a href=&quot;http://www.nusphere.com/products/phped.htm&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;PhpEd는 더 자세한 정보를 제공할 수 있는 디버거도 함께 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(PhpEd 디버거는 xdebug와 매우 유사하며 에디터에 직접 통합되어 있기 때문에 모든 작업을 1개의 프로그램으로 수행할 수 있습니다.)&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;Cartman &lt;a href=&quot;http://www.ibm.com/developerworks/library/os-debug/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;링크&lt;/a&gt;도 매우 좋습니다&lt;a href=&quot;http://www.ibm.com/developerworks/library/os-debug/&quot; papago-id=&quot;12-3&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;http://www.ibm.com/&lt;a href=&quot;http://www.ibm.com/developerworks/library/os-debug/&quot; papago-id=&quot;12-3&quot; rel=&quot;noreferrer&quot;&gt;developerworks&lt;/a&gt;/library/os-debug/&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;ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
&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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://php.net/manual/en/function.error-reporting.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://php.net/manual/en/function.error-reporting.php&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드는 모든 오류를 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 =&amp;gt; 'E_ERROR',
        0x0002 =&amp;gt; 'E_WARNING',
        0x0004 =&amp;gt; 'E_PARSE',
        0x0008 =&amp;gt; 'E_NOTICE',
        0x0010 =&amp;gt; 'E_CORE_ERROR',
        0x0020 =&amp;gt; 'E_CORE_WARNING',
        0x0040 =&amp;gt; 'E_COMPILE_ERROR',
        0x0080 =&amp;gt; 'E_COMPILE_WARNING',
        0x0100 =&amp;gt; 'E_USER_ERROR',
        0x0200 =&amp;gt; 'E_USER_WARNING',
        0x0400 =&amp;gt; 'E_USER_NOTICE',
        0x0800 =&amp;gt; 'E_STRICT',
        0x1000 =&amp;gt; 'E_RECOVERABLE_ERROR',
        0x2000 =&amp;gt; 'E_DEPRECATED',
        0x4000 =&amp;gt; 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf(&quot;%s Error in file \xBB%s\xAB at line %d: %s\n&quot;, $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler(&quot;ErrorHandler&quot;);

// other php code

?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드로 빈 페이지를 생성하는 유일한 방법은 셧다운 핸들러에 오류가 발생했을 때입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트하지 않고 자신의 CMS에서 복사하여 붙여 넣었습니다만, 확실히 동작하고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버깅할 파일에 다음 행을 포함할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;error_reporting(E_ALL);
ini_set('display_errors', '1');
&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;이로 인해 php.ini의 기본 설정이 덮어쓰게 되어 PHP가 오류를 로그에 보고하게 됩니다.&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&gt;&lt;code&gt;....\logs\php_error.log&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;....\logs\apache_error.log&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 papago-id=&quot;25&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;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;&quot;tail -f&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그 파일 및 빈 화면이 나타나면 IE의 &quot;view&quot; -&amp;gt; &quot;source&quot; 메뉴 옵션을 사용하여 원시 출력을 표시합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP 구성&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php&lt;a href=&quot;https://stackoverflow.com/questions/8684609/dude-wheres-my-php-ini&quot; papago-id=&quot;29-1&quot;&gt;.ini&lt;/a&gt;의 2개의 엔트리는 오류 출력을 지시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://il1.php.net/manual/en/errorfunc.configuration.php#ini.display-errors&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;display_errors&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://il1.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;error_reporting&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ol&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;strong papago-id=&quot;11-1&quot;&gt;프로덕션에서는&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; is is is is to to to to to to to로 설정되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Off&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(일반적으로 생산 현장에서의 에러 표시는 바람직하지 않기 때문에, 이것은 좋은 일입니다!).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다만, &lt;strong papago-id=&quot;14-1&quot;&gt;개발&lt;/strong&gt;에서는, 다음과 같이 설정할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;On&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 class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;15-1&quot;&gt;체크&lt;/strong&gt;!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;error_reporting&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; 5.3의 는로 (PHP 5.3의 경우)로 되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;E_ALL &amp;amp; ~E_NOTICE &amp;amp; ~E_STRICT &amp;amp; ~E_DEPRECATED&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모르겠으면 '알겠습니다'로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;E_ALL&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;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;체크&lt;/strong&gt;!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워워!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;체크 없음!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php.ini를 변경할 수 없습니다!&lt;/font&gt;&lt;/h2&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;일반적으로 공유 호스트는 php.ini 파일을 변경할 수 없기 때문에 이 옵션은 사용할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 두려워하지 마세요!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 &lt;a href=&quot;https://www.php.net/manual/en/configuration.file.per-user.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;39-1&quot;&gt;방법이 있어&lt;/a&gt;!&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;40&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;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 스크립트에서는 실행 시 php.ini 엔트리를 변경할 수 있습니다.&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 class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;&lt;strong&gt;&lt;a href=&quot;http://il1.php.net/manual/en/function.error-reporting.php&quot; rel=&quot;noreferrer&quot;&gt;error_reporting&lt;/a&gt;&lt;/strong&gt;(E_ALL);
&lt;strong&gt;&lt;a href=&quot;http://php.net/ini_set&quot; rel=&quot;noreferrer&quot;&gt;ini_set&lt;/a&gt;&lt;/strong&gt;(&quot;display_errors&quot;, &quot;On&quot;);&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;이 두 줄은 위와 같이 php.ini 엔트리를 변경하는 것과 같은 효과를 발휘합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아주 좋아요!&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아직 공백 페이지/500 에러가 표시된다!&lt;/font&gt;&lt;/h2&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;font class=&quot;papago-parent&quot;&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;strong papago-id=&quot;45-1&quot;&gt;컴파일&lt;/strong&gt; 시 &lt;strong papago-id=&quot;45-1&quot;&gt;실패&lt;/strong&gt;합니다.즉, php.ini 값을 사용합니다.변경하지 않았다면 에러 표시가 허용되지 않을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러 로그&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 PHP는 기본적으로 오류를 기록합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공유 호스팅에서는 전용 폴더 또는 문제 스크립트와 같은 폴더에 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php.ini 에 액세스 할 수 있는 경우는, 엔트리에서 찾을 수 있습니다.&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;저는 항상 php 스크립트의 맨 위에서 이 구문을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;&lt;a href=&quot;http://www.xdebug.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;50-1&quot;&gt;xdebug&lt;/a&gt;&quot;라고 불리는 매우 유용한 확장자가 있습니다.이 확장자는 보고서를 훨씬 더 좋게 만듭니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 실제 문제 해결을 위해 일반적으로 SO에서 다음을 권장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;error_reporting(~0); ini_set('display_errors', 1);
&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 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;완벽한 바리안트에서는, 그것을 netable로 하는 것도 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;php.ini&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;PHP에 오류를 기록하여 구문 및 시작 오류를 파악합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 개략적으로 설명하는 설정에는 PHP 버전에 관계없이 엄격한 오류, 알림 및 경고가 모두 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 고려 사항:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://xdebug.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;56-1&quot;&gt;Xdebug&lt;/a&gt;를 설치하고 IDE를 사용하여 원격 디버깅을 활성화합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 항목도 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.phptherightway.com/#error_reporting&quot; rel=&quot;noreferrer&quot; papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러 리포트(PHP The Right Way)&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.php.net/errorfunc.constants.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전 정의된&lt;sup papago-id=&quot;59-1&quot;&gt;&lt;em papago-id=&quot;59-1-0&quot;&gt;Docs&lt;/em&gt;&lt;/sup&gt; 상수&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://php.net/function.error-reporting.php&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;error_reporting()&lt;/code&gt;&lt;sup&gt;&lt;em papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서&lt;/font&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://php.net/display_errors&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;display_errors&lt;/code&gt;&lt;sup&gt;&lt;em papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서&lt;/font&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 오류 또는 경고를 표시하기 위해 후크를 등록할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 index.debug의 선두에 추가하면 문제를 디버깅하는 데 도움이 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 매우 쿨하다면, 다음을 시도해 볼 수 있다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$test_server = $_SERVER['SERVER_NAME'] == &quot;127.0.0.1&quot; || $_SERVER['SERVER_NAME'] == &quot;localhost&quot; || substr($_SERVER['SERVER_NAME'],0,3) == &quot;192&quot;;

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬에서 실행 중인 경우에만 오류가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 test_server 변수를 적절한 다른 장소에서 사용할 수도 있습니다.&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;스크립트가 실행되기 전에 발생한 에러는 검출되지 않지만, 99%의 에러는 문제가 되지 않습니다.&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;error_reporting(E_ERROR | E_WARNING | E_PARSE);
&lt;/code&gt;&lt;/pre&gt;&lt;h1 papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 로드된 상태와 런타임 구성의 문제입니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구문 오류 또는 구문 분석 오류가 &lt;strong papago-id=&quot;21-1&quot;&gt;컴파일&lt;/strong&gt; 또는 &lt;strong papago-id=&quot;21-3&quot;&gt;구문&lt;/strong&gt; 분석 단계에서 발생한다는 것을 인식하는 것이 중요합니다. 즉, PHP는 코드를 실행하기도 전에 문제를 해결합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 PHP를 수정하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&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;ini_set&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.htaccess (런타임 컨피규레이션파일)를 사용하는 코드에서는 &lt;strong papago-id=&quot;23-1&quot;&gt;로드된 기본&lt;/strong&gt; 설정만 재생됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개발 시 항상 WSOD를 회피하는 방법&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WSOD를 피하기 위해 &lt;strong papago-id=&quot;24-1&quot;&gt;로드된 컨피규레이션파일&lt;/strong&gt;에 다음 파일이 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&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;error_reporting&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;-1&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;em papago-id=&quot;27-1&quot;&gt;이것은, 실행중의 PHP &lt;/em&gt;의&lt;em papago-id=&quot;27-1&quot;&gt; 버전에 관계없이&lt;/em&gt;, 모든 &lt;em papago-id=&quot;27-1&quot;&gt;비트가 유효&lt;/em&gt;하게 되어 &lt;em papago-id=&quot;27-1&quot;&gt;있기 때문&lt;/em&gt;에, &lt;em papago-id=&quot;27-1&quot;&gt;동등한 E_ALL &lt;/em&gt;입니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;E_ALL의 상수 값은 PHP의 다른 버전 간에 변경될 수 있으므로 하드 코드하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;된 설정 중 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;php.ini&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; &quot;파일&quot;을 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;apache.conf&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;httpd.conf&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;virtual host&quot; 입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 파일은 시작 단계(예를 들어 apache httpd 또는 php-fpm을 처음 시작할 때)에 한 번만 읽혀지고 런타임 구성 변경에 의해 덮어씁니다.&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;display_errors = 1&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;code&gt;error_reporting = -1&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;em papago-id=&quot;33-1&quot;&gt;WSOD&lt;/em&gt;가 표시되지 않도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ini_set('display_errors', 1);&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;error_reporting(E_ALL);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일어날 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드된 구성 파일(php.ini)을 찾는 방법&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드된 구성 파일을 찾으려면 다음 코드만 사용하여 새 PHP 파일을 생성하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
phpinfo();
&lt;/code&gt;&lt;/pre&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;strong papago-id=&quot;36-1&quot;&gt;Loaded&lt;/strong&gt; &lt;strong papago-id=&quot;36-3&quot;&gt;Configuration File&lt;/strong&gt;과 Additional &lt;strong papago-id=&quot;36-3&quot;&gt;.ini 파일&lt;/strong&gt;을 &lt;strong papago-id=&quot;36-1&quot;&gt;확인&lt;/strong&gt;합니다.이 파일들은 보통 의 맨 위에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;phpinfo()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드된 모든 구성 파일에 대한 절대 경로가 포함됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「」가 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(none)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 대신 구성 &lt;strong papago-id=&quot;39-1&quot;&gt;파일(php.ini) 경로&lt;/strong&gt;에 php.ini가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 &lt;a href=&quot;https://raw.githubusercontent.com/php/php-src/master/php.ini-development&quot; papago-id=&quot;39-3&quot; rel=&quot;noreferrer&quot;&gt;여기서 PHP에 번들된 stock&lt;/a&gt; php&lt;a href=&quot;https://raw.githubusercontent.com/php/php-src/master/php.ini-development&quot; papago-id=&quot;39-3&quot; rel=&quot;noreferrer&quot;&gt;.ini를 다운로드&lt;/a&gt;하여 php.ini로 설정 파일 경로에 복사하고 php 사용자가 해당 파일에서 읽을 수 있는 충분한 권한을 가지고 있는지 확인할 수 &lt;a href=&quot;https://raw.githubusercontent.com/php/php-src/master/php.ini-development&quot; papago-id=&quot;39-3&quot; rel=&quot;noreferrer&quot;&gt;있습니다&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드하려면 httpd 또는 php-fpm을 재시작해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 PHP 소스와 함께 제공되는 &lt;em papago-id=&quot;39-5&quot;&gt;개발&lt;/em&gt; php.ini 파일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러니 생산에는 사용하지 말아주세요!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1 papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로덕션에서는 이 작업을 수행하지 마십시오.&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;이것이 개발 중에 WSOD를 회피하는 가장 좋은 방법입니다.&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;ini_set('display_errors', 1);&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&gt;&lt;code&gt;error_reporting(E_ALL);&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; 경우  .를 사용하면  파일에 PHP가  구문  해석 오류가 수&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&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;꺼졌어요.&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;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 사람PHP의 은, 「PHP」(PHP)가  「합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디폴트로는 꺼집니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 여기서 경험했던 것과 같은 좌절감이 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP는 기동시에 이미 오프가 되어 있기 때문에, 구문이나 해석 에러가 발생해, 출력할 것이 아무것도 없는 상태가 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 당신의 대는 that that that를 기대하고 ?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ini_set('display_errors',1);&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP 스크립트의 맨 위에 있는 것은 피해야 하지만, PHP가 런타임에 도달하지 못할 것이기 때문에 코드를 해석할 수 없는 것은 문제가 되지 않습니다.&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;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;php.ini의 confortale.&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;/etc/php.ini&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/php/php.ini&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;php.ini&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;phpinfo()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Loaded Configuration File&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맨 위에 있는 것이 가장 나중에 로드되는 것인지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 파일에서 display_errors를 검색합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인스턴스는 3개뿐이며, 그 중 2개는 코멘트입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주석 없는 행을 다음과 같이 변경합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;display_errors = stdout
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 될지는 모르겠지만, 여기 php 프로젝트용 표준 설정 파일의 일부가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자신의 서버에서도 Apache 설정에 크게 의존하지 않는 경향이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러 소실 문제는 전혀 없기 때문에, 여기 있는 것을 보면 알 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;APPLICATON_LIVE를 표시하도록 편집되었습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( &quot;%^(www.)?livedomain.com$%&quot;, $_SERVER[&quot;HTTP_HOST&quot;]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( &quot;%^(www.)?devdomain.net$%&quot;, $_SERVER[&quot;HTTP_HOST&quot;]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die(&quot;INVALID HOST REQUEST (&quot;.$_SERVER[&quot;HTTP_HOST&quot;].&quot;)&quot;);
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL &amp;amp; ~E_STRICT);
ini_set ( &quot;display_errors&quot;, &quot;0&quot;);
ini_set ( &quot;display_startup_errors&quot;, &quot;0&quot;);
ini_set ( &quot;log_errors&quot;, 1);
ini_set ( &quot;log_errors_max_len&quot;, 0);
ini_set ( &quot;error_log&quot;, APPLICATION_ROOT.&quot;logs/php_error_log.txt&quot;);
ini_set ( &quot;display_errors&quot;, &quot;0&quot;);
ini_set ( &quot;display_startup_errors&quot;, &quot;0&quot;);

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( &quot;display_errors&quot;, &quot;1&quot;);
    ini_set ( &quot;display_startup_errors&quot;, &quot;1&quot;);
    ini_set ( &quot;html_errors&quot;, &quot;1&quot;);
    ini_set ( &quot;docref_root&quot;, &quot;http://www.php.net/&quot;);
    ini_set ( &quot;error_prepend_string&quot;, &quot;&amp;lt;div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'&amp;gt;&quot;);
    ini_set ( &quot;error_append_string&quot;, &quot;&amp;lt;/div&amp;gt;&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;110&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 &lt;a href=&quot;https://xdebug.org&quot; rel=&quot;noreferrer&quot; papago-id=&quot;110-1&quot;&gt;xdebug&lt;/a&gt;를 사용하여 자세한 정보를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;111&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP의 오류와 예외를 보다 잘 가시화하기 위해 &lt;a href=&quot;https://tracy.nette.org/en/&quot; papago-id=&quot;111-1&quot; rel=&quot;noreferrer&quot;&gt;Nette&lt;/a&gt; Tracy를 &lt;a href=&quot;https://tracy.nette.org/en/&quot; papago-id=&quot;111-1&quot; rel=&quot;noreferrer&quot;&gt;추천&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/B1gSC.png&quot; alt=&quot;Nette Tracy screenshot&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;error_reporting(E_ALL | E_STRICT);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 php.ini에서 표시 오류를 설정합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;113&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://de.php.net/manual/en/function.set-error-handler.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;113-1&quot;&gt;독자적&lt;/a&gt;인 에러 핸들러를 PHP 에 등록할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 모든 오류를 파일에 덤프하면 이러한 불명확한 경우에 도움이 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 &lt;a href=&quot;http://de.php.net/manual/en/function.error-reporting.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;113-3&quot;&gt;error_reporting&lt;/a&gt;이 무엇으로 설정되어 있는지에 관계없이 함수가 호출됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;매우 기본적인 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP에서 유용한 오류를 얻기 위해 필요한 두 가지 주요 항목은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ini_set('display_errors',1);
 error_reporting(E_ALL);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 관계자에 의해 지적된 바와 같이 보안상의 이유로 디폴트로는 꺼집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유용한 힌트로서 사이트를 셋업할 때 다양한 환경에 맞게 스위치를 켜면 로컬 및 개발 환경에서 이러한 오류가 기본적으로 켜지도록 하는 것이 편리합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은, 다음의 코드로 실행할 수 있습니다(최초부터 액티브하게 하기 위해서, index.php 또는 설정 파일에 있는 것이 이상적입니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php.ini를 열고 다음과 같이 설정되어 있는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;display_errors = On
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버를 재시작합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;118&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 에디터로 PHPStorm을 사용해 보는 것도 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;에디터에서 입력하는 동안 많은 PHP 및 기타 구문 오류가 발견됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;119&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu 사용자라면 단말기에 접속하여 이 명령어를 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo tail -50f /var/log/apache2/error.log
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;50달러&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;error.log&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;apache2 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;122&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;완전한 에러 보고를 유효하게 하려면 , 다음의 순서를 스크립트에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;error_reporting(E_ALL);
&lt;/code&gt;&lt;/pre&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ini_set('display_errors', '1');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;124&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러를 강제로 표시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로덕션 서버에서는 이 기능을 꺼야 하지만 개발 중에는 꺼서는 안 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;ERRORS&quot;는 개발자가 자신의 실수를 알고 시스템을 완벽하게 작동시키기 위해 해결할 수 있는 가장 유용한 요소입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;126&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP는 개발자들에게 오류가 발생하는 이유와 위치를 알 수 있는 더 나은 방법을 제공합니다. 따라서 개발자들은 이러한 오류를 알게 됨으로써 그들의 코드를 여러 가지 방법으로 개선할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;127&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트 맨 위에 있는 두 줄에 모든 오류 메시지를 표시하기 위한 가장 좋은 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;error_reporting(E_ALL);
ini_set(&quot;display_errors&quot;, 1);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;128&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IDE에서 &lt;a href=&quot;http://xdebug.org&quot; rel=&quot;noreferrer&quot; papago-id=&quot;128-1&quot;&gt;xdebug&lt;/a&gt;와 같은 디버거 도구를 사용하는 다른 방법입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;129&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 있는 모든 훌륭한 답변과 더불어 MySQLi 및 PDO 라이브러리에 대한 특별 언급을 하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;130&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;131&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;132&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환 유형에서 메서드가 잘못되었는지 확인하지 않도록 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;133&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 좋은 옵션은 예외를 &lt;a href=&quot;https://secure.php.net/manual/language.exceptions.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;133-1&quot;&gt;발생시키도록 라이브러리&lt;/a&gt;를 구성하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;134&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQLi&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;135&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트 맨 위에 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;55&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 사용 전에 이 가장 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new mysqli()&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;mysqli_connect()&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;h3 papago-id=&quot;139&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PDO&lt;/font&gt;&lt;/h3&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;PDO::ATTR_ERRMODE&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;code&gt;PDO::ERRMODE_EXCEPTION&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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 class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE =&amp;gt; PDO::ERRMODE_EXCEPTION
]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;143&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-php prettyprint-override&quot;&gt;&lt;code&gt;$pdo-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
&lt;/code&gt;&lt;/pre&gt;&lt;p&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;완전한 에러 리포트(통지 및 엄밀한 메시지 포함)를 netable로 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 사람들은 이것이 너무 장황하다고 생각하지만, 시도해 볼 가치가 있다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;error_reporting&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;로로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;E_ALL | E_STRICT&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;ini.ini.ini.ini.ini.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;error_reporting = E_ALL | E_STRICT
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;E_STRICT&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 papago-id=&quot;148&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;error_reporting = (E_ALL | E_STRICT) &amp;amp; ~E_NOTICE
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;65&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; '아, 하다, 하다' 이런 것도 꼭 해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&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;ini.ini.ini.ini로 하게 되어 .&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 5 PHP 5.2.4로 합니다.&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;On&lt;/code&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;display_errors = &quot;On&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;152&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전이 5.2.4 이후인 경우 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;display_errors = &quot;stderr&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;153&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;error_reporting 및 display_errors ini 설정 외에도 웹 서버의 로그 파일에서 구문 오류를 가져올 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP를 개발할 때 개발 시스템의 웹 서버 로그인을 편집기에 로드합니다.&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;pre&gt;&lt;code&gt;[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;154&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;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;ini_set()&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;/ . . / php.ini / .htaccess / .user.ini&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;69&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display_errors&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;70&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;error_reporting&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;충분히 커버되었습니다.&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;ul&gt; 
   &lt;li papago-id=&quot;159&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://php.net/ini_set&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;159-0&quot;&gt;&lt;code papago-id=&quot;159-0-0&quot;&gt;ini_set()&lt;/code&gt;&lt;/a&gt; 런타임 오류에만 적용됩니다.&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;160&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://php.net/php.ini&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;160-0&quot;&gt;&lt;code papago-id=&quot;160-0-0&quot;&gt;php.ini&lt;/code&gt;&lt;/a&gt; 는 주로 개발 설정에 대해 편집해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Webserver와 CLI 버전은 종종 php.ini가 다릅니다.)&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;161&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.php.net/manual/en/configuration.changes.php&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;161-0&quot;&gt;&lt;code papago-id=&quot;161-0-0&quot;&gt;.htaccess&lt;/code&gt;&lt;/a&gt; 플래그는 날짜가 지난 설정에 대해서만 작동합니다(새로운 호스트 검색!&lt;/font&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;72&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.php.net/manual/en/configuration.file.per-user.php&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;72-0&quot;&gt;&lt;code papago-id=&quot;72-0-0&quot;&gt;.user.ini&lt;/code&gt;&lt;/a&gt; are partial php.ini for modern setup (FCGI/FPM)&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;p papago-id=&quot;163&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;런타임 오류에 대한 대체 수단으로서 다음과 같은 것을 자주 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;set_error_handler(&quot;var_dump&quot;);   // ignores error_reporting and `@` suppression
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://php.net/error_get_last&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;code&gt;error_get_last()&lt;/code&gt;&lt;/a&gt;&lt;/p&gt; &lt;p papago-id=&quot;164&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;error_display가 비활성화되어 있는 경우 마지막 런타임 알림/경고/오류를 가져오는 데 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.phperrormsg.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;code&gt;$php_errormsg&lt;/code&gt;&lt;/a&gt;&lt;/p&gt; &lt;p papago-id=&quot;165&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 PHP 런타임 메시지도 포함하는 슈퍼로컬 변수입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;isset()&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&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;167&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 많은 사람들을 불쾌하게 할 것이라는 것을 알지만, 새로 온 사람들이 사용해서는 안 &lt;strong papago-id=&quot;167-5&quot;&gt;됩니다&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드가 동작하고 있는 것을 확인한 후에 통지 &lt;strong papago-id=&quot;167-7&quot;&gt;&lt;em papago-id=&quot;167-7-0&quot;&gt;억제&lt;/em&gt;&lt;/strong&gt;를 추가할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 전에는 없었어.&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;168&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;if(isset($_POST['sumbit']))
#                  ↑↑
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;74&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드가 다음과 같이 흐트러져 있으면 유용한 알림을 받을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;75&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;empty&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;array_keys_exists&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;a href=&quot;https://stackoverflow.com/a/4261242&quot; papago-id=&quot;77-1&quot;&gt;사용&lt;/a&gt;하는 것이 더 &lt;a href=&quot;https://stackoverflow.com/a/4261242&quot; papago-id=&quot;77-1&quot;&gt;현명&lt;/a&gt;할 수 있으므로 알림 및 경고는 최소한 로그에 기록됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.php.net/manual/en/function.assert-options.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;code&gt;assert_options(ASSERT_ACTIVE|ASSERT_WARNING);&lt;/code&gt;&lt;/a&gt;&lt;/p&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;assert()&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;p papago-id=&quot;175&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP7은 php.ini에도 필요합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;code&gt;declare(strict_types=1);&lt;/code&gt;&lt;/a&gt;&lt;/p&gt; &lt;p papago-id=&quot;176&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP를 엄밀하게 입력된 언어로 벤딩하는 것은 많은 논리 오류를 수정하지는 않지만 디버깅을 위한 옵션은 분명합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong papago-id=&quot;177&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PDO / MySQLi&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;178&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Phil은 이미 PDO&lt;a href=&quot;https://stackoverflow.com/a/52324601&quot; papago-id=&quot;178-1&quot;&gt;/MySQLi&lt;/a&gt; 오류 &lt;a href=&quot;https://stackoverflow.com/a/52324601&quot; papago-id=&quot;178-1&quot;&gt;보고&lt;/a&gt; 옵션을 &lt;a href=&quot;https://stackoverflow.com/a/52324601&quot; papago-id=&quot;178-1&quot;&gt;언급&lt;/a&gt;했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 다른 데이터베이스 API에도 유사한 옵션이 존재합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;179&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://php.net/json_last_error&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;179-0&quot;&gt;&lt;code papago-id=&quot;179-0-0&quot;&gt;json_last_error()&lt;/code&gt;&lt;/a&gt; + &lt;a href=&quot;http://php.net/json_last_error_msg&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;179-2&quot;&gt;&lt;code papago-id=&quot;179-2-0&quot;&gt;json_last_error_msg&lt;/code&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;180&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON 해석의 경우.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://php.net/preg_last_error&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;code&gt;preg_last_error()&lt;/code&gt;&lt;/a&gt;&lt;/p&gt; &lt;p papago-id=&quot;181&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정규식을 위해서.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/3757071/php-debugging-curl&quot; papago-id=&quot;182&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CURLOPT_상세&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p papago-id=&quot;183&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컬 요구를 디버깅하려면 최소한 CURLOPT_VERBOSE가 필요합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/12199353/how-can-i-debug-exec-problems&quot;&gt;&lt;code&gt;shell/exec()&lt;/code&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;80&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;2&amp;gt;&amp;amp;1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;81&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$errno($errno)입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;186&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/1475297/&lt;a href=&quot;https://stackoverflow.com/questions/1475297/phps-white-screen-of-death&quot; target=&quot;_blank&quot; papago-id=&quot;186-1&quot;&gt;phps-white-screen-of-death&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2347</guid>
      <comments>https://prostudy.tistory.com/2347#entry2347comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:28:05 +0900</pubDate>
    </item>
    <item>
      <title>file_get_contents(): 코드 1에서 SSL 작업이 실패했습니다.암호화를 활성화하지 못했습니다.</title>
      <link>https://prostudy.tistory.com/2346</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;file_get_contents(): 코드 1에서 SSL 작업이 실패했습니다.암호화를 활성화하지 못했습니다.&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;서버에 작성한 PHP 페이지에서 이 REST 서비스에 액세스하려고 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그 문제를 이 두 줄로 압축했다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 PHP 페이지는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$response = file_get_contents(&quot;https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&amp;amp;SingleLine=3042+N+1050+W&amp;amp;outFields=*&amp;amp;outSR=102100&amp;amp;searchExtent=&amp;amp;f=json&quot;);

echo $response; ?&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;2행째에 다음의 에러가 표시된다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고: file_get_contents(): SSL 작업이 코드 1로 실패했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OpenSSL 오류 메시지: 오류: 14090086: SSL 루틴:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SSL3_GET_SERVER_CERTIFICATE: 2행의 ...php에서 증명서 검증에 실패했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/font&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;경고: file_get_contents(): 2행에서 암호화를 활성화하지 못했습니다.&lt;/font&gt;&lt;/li&gt; 
    &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고: file_get_contents(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&amp;amp;SingleLine=3042+N+1050+W&amp;amp;outFields=*&amp;amp;outSR=102100&amp;amp;searchExtent=&amp;amp;f=json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;): 스트림을 열지 못했습니다.회선 2의 ...에서 작업이 실패했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
   &lt;/ul&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Gentoo 서버를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근에 PHP 버전 5.6으로 업그레이드했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제가 발생한 것은 업그레이드 후입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;REST 서비스를 다음과 같은 주소로 대체했을 때 발견했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;https://www.google.com&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 class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전의 시도에서 나는 다음과 같이 설정했다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;“verify_peer”=&amp;gt;false&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;a href=&quot;https://stackoverflow.com/questions/15076819/file-get-contents-ignoring-verify-peer-false&quot; papago-id=&quot;11-1&quot;&gt;file_get_peer=&amp;gt;false ignoring&lt;/a&gt; verify_peer=&amp;gt;false 라고 기재되어 있듯이, 그것을 인수로서 file_get_files 에 전달했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 작가가 지적한 것처럼, 그것은 아무런 차이가 없었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php.ini 파일에 다음 행이 있는지 서버 관리자에게 문의했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;extension=sysl.sysl.syslog&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;allow_url_fopen = 온&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Gentoo에 있기 때문에 openssl은 빌드 시 컴파일되며 php.ini 파일에는 설정되어 있지 않다고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 확인했습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;allow_url_fopen&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동작하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제의 특수성 때문에&lt;/font&gt;&lt;font 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;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 링크는 다음 항목에 매우 도움이 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/en/migration56.openssl.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://php.net/manual/en/migration56.openssl.php&lt;/font&gt;&lt;/a&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;PHP 5.6에서 ssl을 열기 위해 수행된 변경을 설명하는 공식 문서 여기서 false로 설정해야 할 파라미터가 하나 더 발견되었습니다: &quot;false_peer_name&quot;=&amp;gt; false&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;21-0&quot;&gt;주의:&lt;/strong&gt; 이는 보안에 매우 큰 영향을 &lt;em papago-id=&quot;21-2&quot;&gt;미칩니다&lt;/em&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;검증을 디세블로 하면 &lt;a href=&quot;https://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot; papago-id=&quot;21-4&quot; rel=&quot;noreferrer&quot;&gt;MITM&lt;/a&gt; 공격자가 &lt;a href=&quot;https://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot; papago-id=&quot;21-4&quot; rel=&quot;noreferrer&quot;&gt;비활성&lt;/a&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;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;&amp;lt;?php
$arrContextOptions=array(
    &quot;ssl&quot;=&amp;gt;array(
        &quot;verify_peer&quot;=&amp;gt;false,
        &quot;verify_peer_name&quot;=&amp;gt;false,
    ),
);  

$response = file_get_contents(&quot;https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&amp;amp;SingleLine=3042+N+1050+W&amp;amp;outFields=*&amp;amp;outSR=102100&amp;amp;searchExtent=&amp;amp;f=json&quot;, false, stream_context_create($arrContextOptions));

echo $response; ?&amp;gt;
&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;a href=&quot;https://curl.haxx.se/docs/caextract.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;23-1&quot;&gt;혹시&lt;/a&gt; 컬 번들로 괜찮으시겠습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 웹 서버에 저장하여 php를 실행하는 사용자에게 파일 읽기 권한을 부여하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 이 코드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;$arrContextOptions= [
    'ssl' =&amp;gt; [
        'cafile' =&amp;gt; '/path/to/bundle/cacert.pem',
        'verify_peer'=&amp;gt; true,
        'verify_peer_name'=&amp;gt; true,
    ],
];

$response = file_get_contents(
    'https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&amp;amp;SingleLine=3042+N+1050+W&amp;amp;outFields=*&amp;amp;outSR=102100&amp;amp;searchExtent=&amp;amp;f=json',
    false,
    stream_context_create($arrContextOptions)
);
&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;접속하려는 사이트의 루트 증명서가 컬번들에 포함되어 있는 것이 바람직합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않은 경우에도 사이트의 루트 인증서를 가져와 인증서 파일에 넣을 때까지 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OpenSSL이 컴퓨터에 설치되어 있는지 확인한 후 이를 php.ini에 추가함으로써 이 문제를 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;openssl.cafile=/usr/local/etc/openssl/cert.pem
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 컬을 사용하는 커스텀 함수를 작성하면 이 문제를 회피할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function file_get_contents_curl( $url ) {

  $ch = curl_init();

  curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE );
  curl_setopt( $ch, CURLOPT_HEADER, 0 );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE );

  $data = curl_exec( $ch );
  curl_close( $ch );

  return $data;

}
&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;file_get_contents_curl&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;file_get_contents&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https로 시작하는 URL을 호출할 때마다 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 PHP 5.6을 사용하고 있습니다.openssl 확장이 활성화 되어 있어야 합니다.구글 맵 api verify_peer를 호출하는 동안 false Below 코드가 작동하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$arrContextOptions=array(
    &quot;ssl&quot;=&amp;gt;array(
         &quot;verify_peer&quot;=&amp;gt;false,
         &quot;verify_peer_name&quot;=&amp;gt;false,
    ),
);  
$url = &quot;https://maps.googleapis.com/maps/api/geocode/json?latlng=&quot;
      . $latitude
      . &quot;,&quot;
      . $longitude
      . &quot;&amp;amp;sensor=false&amp;amp;key=&quot;
      . Yii::$app-&amp;gt;params['GOOGLE_API_KEY'];

$data = file_get_contents($url, false, stream_context_create($arrContextOptions));

echo $data;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제의 희생양이 된 후에&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php를 php5.6으로 업데이트한 후 나에게 맞는 솔루션을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디폴트에서는, 다음과 같이 증명서를 배치하기 위한 올바른 디렉토리를 취득합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;php -r &quot;print_r(openssl_get_cert_locations()['default_cert_file']);&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 이를 사용하여 증명서를 취득하고 위의 코드에서 찾은 기본 위치에 저장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;wget http://curl.haxx.se/ca/cacert.pem -O &amp;lt;default location&amp;gt;
&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;기본적으로 환경변수 SSL_CERT_FILE을 다음 링크에서 다운로드한SSL 증명서의 PEM 파일 경로로 설정해야 합니다.http&lt;a href=&quot;http://curl.haxx.se/ca/cacert.pem&quot; papago-id=&quot;35-1&quot; rel=&quot;noreferrer&quot;&gt;://&lt;/a&gt;curl.haxx.se/ca/&lt;a href=&quot;http://curl.haxx.se/ca/cacert.pem&quot; papago-id=&quot;35-1&quot; rel=&quot;noreferrer&quot;&gt;cacert&lt;/a&gt;.pem&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이걸 알아내는데 시간이 많이 걸렸어요&lt;/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;PHP 버전이 5인 경우 단말기에 다음 명령을 입력하여 cURL을 설치해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install php5-curl
&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;ol&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 링크에서 CA 증명서를 다운로드합니다.https&lt;a href=&quot;https://curl.haxx.se/ca/cacert.pem&quot; papago-id=&quot;39-1&quot; rel=&quot;noreferrer&quot;&gt;://&lt;/a&gt;curl.haxx.se/ca/&lt;a href=&quot;https://curl.haxx.se/ca/cacert.pem&quot; papago-id=&quot;39-1&quot; rel=&quot;noreferrer&quot;&gt;cacert&lt;/a&gt;.pem&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;php.ini를 찾아 엽니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;curl.cainfo&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;strong papago-id=&quot;13-1&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;curl.cainfo =&quot;C:\wamp\htdocs\cert\cacert.pem&quot;&lt;/code&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WAMP/XAMPP(apache 서버)를 재기동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;됐다!&lt;/font&gt;&lt;/li&gt; 
&lt;/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;/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;curl&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP의 확장자세한 것은, PHP 입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다음 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function file_get_contents_ssl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3000); // 3 sec.
    curl_setopt($ch, CURLOPT_TIMEOUT, 10000); // 10 sec.
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
&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;a href=&quot;https://www.php.net/manual/en/function.file-get-contents.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;48-1&quot;&gt;file_get_contents(..)&lt;/a&gt; 함수와 같이 동작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;echo file_get_contents_ssl(&quot;https://www.example.com/&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Example Domain&amp;lt;/title&amp;gt;
...
&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;같은 문제에 부딪혔는데 아무 것도 작동하지 않았기 때문에 추가하려고 합니다(예를 들어 cacert.pem 파일 다운로드, php.ini의 cafile 설정 등).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NGINX 를 사용하고 있고 SSL 증명서에 「증명서」가 부속되어 있는 경우는, 중간 증명서 파일을 메인 「mydomain.com.crt」파일과 조합해 사용할 필요가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache는 중간 인증서 전용 설정이 있지만 NGINX는 그렇지 않으므로 일반 인증서와 동일한 파일 내에 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 오류가 발생하는 이유는 PHP에 신뢰할 수 있는 인증 기관 목록이 없기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP 5.6 이후에는 시스템에서 신뢰하는 CA를 자동으로 로드합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것으로 문제를 해결할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세한 것에 대하여는, http://php.net/manual/en/&lt;a href=&quot;http://php.net/manual/en/migration56.openssl.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;54-1&quot;&gt;migration56&lt;/a&gt;.openssl.php 를 참조해 주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 요청 컨텍스트에서 CA 번들을 수동으로 지정해야 하기 때문에 PHP 5.5 이전 버전은 올바르게 설정하기가 매우 &lt;em papago-id=&quot;55-1&quot;&gt;어렵습니다&lt;/em&gt;. 코드 주위에 뿌리고 싶지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 PHP 버전이 5.6보다 작을 경우 SSL 검증이 무효가 되는 것을 코드로 결정했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$req = new HTTP_Request2($url);
if (version_compare(PHP_VERSION, '5.6.0', '&amp;lt;')) {
    //correct ssl validation on php 5.5 is a pain, so disable
    $req-&amp;gt;setConfig('ssl_verify_host', false);
    $req-&amp;gt;setConfig('ssl_verify_peer', false);
}
&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;XAMPP 및 OSX의 PHP 7에서도 동일한 오류가 발생하였습니다.&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;위의 답변은 https&lt;a href=&quot;https://stackoverflow.com/a/26151993/2360229&quot; papago-id=&quot;57-1&quot;&gt;://stackoverflow&lt;/a&gt;.com/에 기재되어 있습니다만, 저는 문제가 완전히 해결되지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;file_get_contents()를 다시 작동시키기 위해 완전한 증명서 체인을 제공해야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 했어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루트/중간 증명서 취득&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선 루트 &lt;em papago-id=&quot;59-1&quot;&gt;증명서&lt;/em&gt;와 중간 증명서가 무엇인지 알아내야 했다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 편리한 방법은 아마도 &lt;a href=&quot;https://www.sslshopper.com/ssl-checker.html#hostname=www.whatsyoururl.de&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;60-1&quot;&gt;ssl&lt;/a&gt; shopper와 같은 온라인 인증 도구일 것입니다.&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;거기서 3개의 증명서, 1개의 서버 증명서, 2개의 체인 증명서(하나는 루트, 다른 하나는 중간 증명서)를 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 인터넷에서 검색만 하면 돼요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 경우, 루트는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;thawte DV SSL SHA256 CA&lt;/font&gt;&lt;/strong&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;그리고 그의 URL&lt;a href=&quot;https://www.thawte.com/roots/thawte_Primary_Root_CA-G3_SHA256.pem&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;64-1&quot;&gt; thawte&lt;/a&gt;.com로 연결됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 이 증명서를 텍스트 파일에 넣고 중간자에게도 똑같이 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다 했어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;65&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;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;Linux 또는 OS X에서는 openssl을 사용하여 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;openssl s_client -showcerts -connect whatsyoururl.de:443 &amp;lt;/dev/null 2&amp;gt;/dev/null|openssl x509 -outform PEM &amp;gt; /tmp/whatsyoururl.de.cert
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;67&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;68&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;cat /tmp/thawteRoot.crt &amp;gt; /tmp/chain.crt
cat /tmp/thawteIntermediate.crt &amp;gt;&amp;gt; /tmp/chain.crt
cat /tmp/tmp/whatsyoururl.de.cert &amp;gt;&amp;gt; /tmp/chain.crt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;체인을 찾을 수 있는 위치를 PHP에 알립니다.&lt;/font&gt;&lt;/strong&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;편리한 함수 openssl_get_cert_locations()가 있습니다.이 함수는 PHP가 증명서 파일을 찾고 있는 장소를 알려줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 이 파라미터는 증명서 파일의 위치를 file_get_contents()에 지시합니다.&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;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 제 PHP 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$arrContextOptions=array(
    &quot;ssl&quot;=&amp;gt;array(
        &quot;cafile&quot; =&amp;gt; &quot;/Applications/XAMPP/xamppfiles/share/openssl/certs/chain.pem&quot;,
        &quot;verify_peer&quot;=&amp;gt; true,
        &quot;verify_peer_name&quot;=&amp;gt; true,
    ),
);

$response = file_get_contents($myHttpsURL, 0, stream_context_create($arrContextOptions));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이상입니다. file_get_contents()가 다시 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CURL도 없고 보안 결함도 없기를 바랍니다.&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;&quot;&lt;a href=&quot;https://localhost/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;73-1&quot;&gt;https://localhost&lt;/a&gt;/...&quot; 파일을 열려고 하는 자기서명증명서를 가진 개발자 머신에서도 동일한 ssl 문제가 발생하였습니다(ph 7, Windows에서는 xampp).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;root-certificate-assembly(cacert.pem)는 정상적으로 동작하지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다운로드 받은 cacert.pem의 apache server.crt-File에서 코드를 수동으로 복사하고 php.ini의 openssl.crt-pem 엔트리를 실행했습니다.&lt;/font&gt;&lt;/p&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;ca-certificates&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;a href=&quot;https://support.plesk.com/hc/en-us/articles/115002459314-Error-while-sending-an-email-via-contact-form-with-recaptcha-used&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17-1&quot;&gt;자세히&lt;/a&gt; 나와 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# yum reinstall ca-certificates
...
# update-ca-trust force-enable 
# update-ca-trust extract
&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;a href=&quot;https://stackoverflow.com/a/38272278&quot; papago-id=&quot;76-1&quot;&gt;설명&lt;/a&gt;하는 대로, 문제의 1 사이트의 증명서를 명시적으로 허가하는 것도 필요합니다(특히, 1 사이트가 자신의 서버이며, 이미 .pem이 액세스 가능한 경우).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# cp /your/site.pem /etc/pki/ca-trust/source/anchors/
# update-ca-trust extract
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Cent에서 PHP 5.6으로 업그레이드한 후 이 SO 오류가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS 6은 갱신할 필요가 있는 값싼SSL 보안 증명서를 가진 서버 자체에 액세스하려고 했습니다만, 그 대신 letsencrypt 증명서를 설치하고 위의 두 가지 절차를 통해 문제가 해결되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 왜 두 번째 단계가 필요했는지 모르겠다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유용한 명령어&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;openssl 버전 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP cli ssl 현재 설정 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# php -i | grep ssl
openssl
Openssl default config =&amp;gt; /etc/pki/tls/openssl.cnf
openssl.cafile =&amp;gt; no value =&amp;gt; no value
openssl.capath =&amp;gt; no value =&amp;gt; no value
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;    &amp;lt;?php
$arrContextOptions=array(
    &quot;ssl&quot;=&amp;gt;array(
        &quot;verify_peer&quot;=&amp;gt;false,
        &quot;verify_peer_name&quot;=&amp;gt;false,
    ),
);  

$response = file_get_contents(&quot;https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&amp;amp;SingleLine=3042+N+1050+W&amp;amp;outFields=*&amp;amp;outSR=102100&amp;amp;searchExtent=&amp;amp;f=json&quot;, false, stream_context_create($arrContextOptions));

echo $response; ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 PHP 7.2만 테스트하면 정상적으로 동작합니다.&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;에러에 대해서&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[2017년 5월 11일 19:19:13 미국/시카고] PHP 경고: file_get_contents(): 코드 1로 SSL 작업이 실패했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OpenSSL 오류 메시지: 오류: 14090086:SSL 루틴:ssl3_get_server_certificate:증명서 검증 실패&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;openssl에서 참조하는 증명서와 디렉토리의 권한을 확인했습니까?&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;var_dump(openssl_get_cert_locations());
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;array(8) {
  [&quot;default_cert_file&quot;]=&amp;gt;
  string(21) &quot;/usr/lib/ssl/cert.pem&quot;
  [&quot;default_cert_file_env&quot;]=&amp;gt;
  string(13) &quot;SSL_CERT_FILE&quot;
  [&quot;default_cert_dir&quot;]=&amp;gt;
  string(18) &quot;/usr/lib/ssl/certs&quot;
  [&quot;default_cert_dir_env&quot;]=&amp;gt;
  string(12) &quot;SSL_CERT_DIR&quot;
  [&quot;default_private_dir&quot;]=&amp;gt;
  string(20) &quot;/usr/lib/ssl/private&quot;
  [&quot;default_default_cert_area&quot;]=&amp;gt;
  string(12) &quot;/usr/lib/ssl&quot;
  [&quot;ini_cafile&quot;]=&amp;gt;
  string(0) &quot;&quot;
  [&quot;ini_capath&quot;]=&amp;gt;
  string(0) &quot;&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 한동안 당황스러웠지만 내 &quot;certs&quot; 폴더에 755개의 권한이 있어야 하는 700개의 권한이 있다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 폴더는 키의 폴더가 아니라 증명서의 폴더입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SSL &lt;a href=&quot;https://serverfault.com/questions/259302/best-location-for-ssl-certificate-and-private-keys-on-ubuntu&quot; papago-id=&quot;87-1&quot;&gt;권한&lt;/a&gt;에 대해&lt;a href=&quot;https://serverfault.com/questions/259302/best-location-for-ssl-certificate-and-private-keys-on-ubuntu&quot; papago-id=&quot;87-1&quot;&gt; &lt;/a&gt;이 &lt;a href=&quot;https://serverfault.com/questions/259302/best-location-for-ssl-certificate-and-private-keys-on-ubuntu&quot; papago-id=&quot;87-1&quot;&gt;링크를 읽을&lt;/a&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;한번 해봤는데&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;chmod 755 certs
&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;h2 papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;12.4/Mamp 6.6/Homebrew 3.5.2/Opensl@3 수정&lt;/font&gt;&lt;/h2&gt; 
&lt;h4 papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;터미널&lt;/font&gt;&lt;/h4&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;openssl version -a
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 의견은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...
OPENSSLDIR: &quot;/opt/homebrew/etc/openssl@3&quot;
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 나는 홈브루의 디르를 뒤졌다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/opt/homebrew/etc/openssl@3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cert.pem을 찾아 mamp의 현재 버전의 php.ini 파일이 homebrew의 올바른 openssl 버전의 cert.pem을 가리키고 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h4 papago-id=&quot;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php.ini에 추가&lt;/font&gt;&lt;/h4&gt; 
&lt;pre&gt;&lt;code&gt;openssl.cafile=/opt/homebrew/etc/openssl@3/cert.pem
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 때 다른 보안 페이지에 대해 동일한 문제가 발생했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wget&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;file_get_contents&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 조사(이 질문에 대한 응답도 포함)를 통해 Curl과 PHP-Curl을 설치하는 간단한 해결책이 도출되었습니다.제가 제대로 이해했다면 Curl은 문제를 해결한 Comodo용 루트 CA를 가지고 있습니다.&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;Curl 및 PHP-Curl 애드온을 설치한 후 Apache를 다시 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install curl
sudo apt-get install php-curl
sudo /etc/init.d/apache2 reload
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 모두 작동한다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 Windows 10 머신(localhost)에서 XAMPP를 실행하고 있었는데 최근 PHP 8로 업그레이드했습니다.file_get_contents()를 통해 로컬호스트 HTTPS 링크를 열려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 php.ini 파일에 다음과 같은 행이 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;openssl.cafile=&quot;C:\Users\[USER]\xampp\apache\bin\curl-ca-bundle.crt&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 &quot;외부&quot; URL을 검증하기 위해 사용되는 증명서 번들로, 일부 사람들이 논의한 것처럼 Mozilla의 패키지입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;XAMPP가 그렇게 온 것인지, 아니면 내가 과거에 설정한 것인지 모르겠다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어느 시점에서 로컬호스트에 HTTPS를 설정했기 때문에 다른 증명서 번들이 생성되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 번들을 사용하여 &quot;localhost&quot; URL을 검증해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;번들이 어디에 있는지 기억하기 위해 httpd-ssl.conf를 열었더니 다음과 같은 행이 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SSLCertificateFile &quot;conf/ssl.crt/server.crt&quot; 
&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;(완전한 경로는 C:였습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;\Users[USER]\xampp\apache\conf\ssl.crt\server.crt)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;localhost와 outside URL을 동시에 동작시키기 위해 localhost &quot;server.crt&quot; 파일의 내용을 Mozilla 번들 &quot;curl-ca-bundle.crt&quot;에 복사했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.
.
.
m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
-----END CERTIFICATE-----

Localhost--I manually added this
================================
-----BEGIN CERTIFICATE-----
MIIDGDCCAgCgAwIBAgIQIH+mTLNOSKlD8KMZwr5P3TANBgkqhkiG9w0BAQsFADAU
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 시점에서 추가 설정 없이 localhost URL과 outside URL 모두에서 file_get_contents()를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;file_get_contents(&quot;https://localhost/...&quot;);
file_get_contents(&quot;https://google.com&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$csm = stream_false_create(['ssl' =&amp;gt; ['sl_files_get_contents' ]), $sourceCountry=file_get_contents('https://api.wipmania.com/'.$ip.'?website.com', FALSE, $csm);&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;110&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/26148701/&lt;a href=&quot;https://stackoverflow.com/questions/26148701/file-get-contents-ssl-operation-failed-with-code-1-failed-to-enable-crypto&quot; target=&quot;_blank&quot; papago-id=&quot;110-1&quot;&gt;file-get-contents-ssl-operation-failed-with-code-1-failed-to-enable-crypto&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2346</guid>
      <comments>https://prostudy.tistory.com/2346#entry2346comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:27:27 +0900</pubDate>
    </item>
    <item>
      <title>Google Colab: Google 드라이브에서 데이터를 읽는 방법</title>
      <link>https://prostudy.tistory.com/2345</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Google Colab: Google 드라이브에서 데이터를 읽는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gDrive에 대한 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/projects/my_project/my_data*&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;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 gColab에는 간단한 노트북이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 다음과 같은 것을 하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for file in glob.glob(&quot;/projects/my_project/my_data*&quot;):
    do_something(file)
&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;유감스럽게도, 모든 예(예: https://colab.&lt;a href=&quot;https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;research&lt;/a&gt;.google.com/notebook#fileId=&lt;a href=&quot;https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;/v2/&lt;/a&gt;v2&lt;a href=&quot;https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;/vari&lt;/a&gt;/disc&lt;a href=&quot;https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;/io.ipynb&lt;/a&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;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도와줘서 고마워요!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;편집&lt;/strong&gt;: 2020년 2월부터 드라이브를 자동으로 마운트할 수 있는 1등급 UI가 추가되었습니다.&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;Mount Drive(드라이브 마운트) 버튼이 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭하면 드라이브를 마운트하기 위한 사용 권한 프롬프트가 표시되고 노트북으로 돌아가면 드라이브 파일이 설정되지 않은 상태로 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;완성된 흐름은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Rj69d.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Rj69d.png&quot; alt=&quot;드라이브 자동 마운트 예시&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/a&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;다음 코드 스니펫을 실행하여 Google 드라이브 파일을 마운트할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 파일 브라우저 측면 패널에서 또는 명령줄 유틸리티를 사용하여 드라이브 파일과 상호 작용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://colab.research.google.com/drive/1srw_HFWQ2SMgmWIawucXfusGzrj1_U0q&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 노트북의 예가 있습니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://pythonhosted.org/PyDrive/&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;좋은&lt;/a&gt; 소식입니다. PyDrive는 CoLab에서 최고 수준의 지원을 받고 있습니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PyDrive는 Google Drive python 클라이언트용 래퍼입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 을 사용하는 경우와 마찬가지로 폴더에서 모든 파일을 &lt;strong papago-id=&quot;14-3&quot;&gt;다운로드&lt;/strong&gt;하는 방법의 예입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;glob&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;!pip install -U -q PyDrive
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

# 1. Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

# choose a local (colab) directory to store the data.
local_download_path = os.path.expanduser('~/data')
try:
  os.makedirs(local_download_path)
except: pass

# 2. Auto-iterate using the query syntax
#    https://developers.google.com/drive/v2/web/search-parameters
file_list = drive.ListFile(
    {'q': &quot;'1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk' in parents&quot;}).GetList()

for f in file_list:
  # 3. Create &amp;amp; download by id.
  print('title: %s, id: %s' % (f['title'], f['id']))
  fname = os.path.join(local_download_path, f['title'])
  print('downloading to {}'.format(fname))
  f_ = drive.CreateFile({'id': f['id']})
  f_.GetContentFile(fname)


with open(fname, 'r') as f:
  print(f.read())
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 가 있는 해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;drive.ListFile&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;a href=&quot;https://developers.google.com/drive/v2/web/search-parameters&quot; papago-id=&quot;18-1&quot; rel=&quot;noreferrer&quot;&gt;Google Drive HTTP&lt;/a&gt; API에서 &lt;a href=&quot;https://developers.google.com/drive/v2/web/search-parameters&quot; papago-id=&quot;18-1&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;되는 파라미터와 일치하는 사전입니다(커스터마이즈 할 수 있습니다).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;q&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 papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 경우 파일/폴더는 Google 드라이브에서 ID(&lt;strong papago-id=&quot;20-1&quot;&gt;1SuKSw8M4ACBznKjnNrYvJ5wxuqJ-YCk&lt;/strong&gt; 피프)로 인코딩됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하려면 검색을 루트할 폴더에 해당하는 특정 ID를 Google Drive에서 검색해야 합니다.&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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 들어, 를를 to to to to to to the the the the to to로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;/projects/my_project/my_data&quot;&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;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/eSeHs.png&quot; alt=&quot;구글 드라이브&quot; papago-attr-id=&quot;2&quot;&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;CoLab에 다운로드할 파일이 포함되어 있는지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PyDrive에서 사용하기 위해 폴더 ID를 가져오려면 url을 보고 id 파라미터를 추출합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 폴더에 대응하는 URL은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/Mq9Gl.png&quot; alt=&quot;https://drive.google.com/drive/folders/1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk&quot; papago-attr-id=&quot;3&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 id는 URL의 마지막 부분입니다.&lt;strong papago-id=&quot;24-1&quot;&gt;1SuKSw8M4ACBznKjnNrYvJ5wxuqJ-YCK&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋은 답변 감사합니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Google 드라이브에서 Colab으로 일회성 파일 몇 개를 가져오는 가장 빠른 방법: 드라이브 도우미 로드 및 마운트&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from google.colab import drive
&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;drive.mount('/content/drive')
&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;새 탭에서 링크를 엽니다.-&amp;gt; 코드가 나타납니다. Google 드라이브에 액세스할 수 있게 되었는지 확인하는 프롬프트에 다시 복사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!ls &quot;/content/drive/My Drive&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 필요에 따라 파일을 복사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!cp &quot;/content/drive/My Drive/xy.py&quot; &quot;xy.py&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 복사되었는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!ls
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 한 일은 첫 번째다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive/')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고나서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;%cd /content/drive/My Drive/Colab Notebooks/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 csv 파일을 읽을 수 있는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df = pd.read_csv(&quot;data_example.csv&quot;)
&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;from google.colab import drive
drive.mount(&quot;/content/drive&quot;, force_remount=True)
&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;a href=&quot;https://colab.research.google.com&quot; papago-id=&quot;35-1&quot; rel=&quot;noreferrer&quot;&gt;CO Lab&lt;/a&gt;에 마운트하는 가장 쉽고 빠른 방법이라는 것을 알게 되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mount directory location&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 있도록 하기 위해 매개 만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;drive.mount&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 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;force_remount&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전에 로드되었는지 여부에 관계없이 드라이브를 마운트해야 하는 경우에만 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;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;IO&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;colab https://colab.research.google.com/&lt;a href=&quot;https://colab.research.google.com/notebooks/io.ipynb&quot; papago-id=&quot;40-1&quot; rel=&quot;noreferrer&quot;&gt;notebooks&lt;/a&gt;/io.ipynb에서의 조작&lt;/font&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;파일을 collab에 영구적으로 저장할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;드라이브에서 파일을 가져올 수도 있고 파일을 다 쓸 때마다 파일을 다시 저장할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Colab 세션에 Google 드라이브를 마운트하려면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/gdrive')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 파일 시스템에 쓰듯이 구글 드라이브에 쓰기만 하면 됩니다. 지금 보면 구글 드라이브가 파일 탭에 로드됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 콜라브에서 모든 파일에 액세스할 수 있으며, 이 파일에서 읽고 쓸 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경은 드라이브에서 실시간으로 수행되며, 파일에 대한 액세스 링크가 있는 사용자는 콜라브에서 사용자가 변경한 내용을 볼 수 있습니다.&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;예&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;with open('/content/gdrive/My Drive/filename.txt', 'w') as f:
   f.write('values')
&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;a href=&quot;https://github.com/WittmannF/easycolab&quot; rel=&quot;noreferrer&quot; papago-id=&quot;45-1&quot;&gt;easycolab&lt;/a&gt;을 만들기로 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import easycolab as ec
ec.mount()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 「 」를 해 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;!pip install easycolab&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mount()&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;from google.colab import drive
drive.mount(‘/content/drive’)
cd ‘/content/gdrive/My Drive/’
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴더의 모든 파일을 읽으려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import glob
from google.colab import drive
drive.mount('/gdrive', force_remount=True)

#!ls &quot;/gdrive/My Drive/folder&quot;

files = glob.glob(f&quot;/gdrive/My Drive/folder/*.txt&quot;)
for file in files:  
  do_something(file)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive')
&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;os&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PC에서 파일에 액세스하는 방법과 마찬가지로 파일에 액세스하는 라이브러리&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;화면 왼쪽에 있는 코드 스니펫을 사용하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://i.stack.imgur.com/WqyPW.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;52-1&quot;&gt;여기에 이미지 설명 입력&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;VM에 Google 드라이브 마운트&quot; 삽입&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 실행하고 URL에 코드를 복사하여 붙여넣습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 !ls를 사용하여 디렉토리를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!ls /gdrive
&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;대부분의 경우 &quot;/gdrive/My drive&quot; 디렉터리에 원하는 것이 있습니다.&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;from google.colab import drive
drive.mount('/gdrive')
import glob

file_path = glob.glob(&quot;/gdrive/My Drive/***.txt&quot;)
for file in file_path:
    do_something(file)
&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;colab 노트북(**.ipnb)의 파일을 읽는 방법에는 여러 가지가 있습니다.그 중 몇 가지는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;런타임의 가상 머신에 Google 드라이브를 마운트하는 중입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/47480133/6484358&quot; papago-id=&quot;59-1&quot;&gt;여기&lt;/a&gt;와 &lt;a href=&quot;https://www.kdnuggets.com/2018/02/google-colab-free-gpu-tutorial-tensorflow-keras-pytorch.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;59-3&quot;&gt;여기&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;google.colab 사용.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;files.files.&lt;a href=&quot;https://www.kdnuggets.com/2018/02/essential-google-colaboratory-tips-tricks.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;60-1&quot;&gt;files가 가장&lt;/a&gt; 쉬운 솔루션&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developers.google.com/drive/v3/web/about-sdk&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;61-1&quot;&gt;네이티브 REST&lt;/a&gt; API 사용&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://gsuitedevs.github.io/PyDrive/docs/build/html/index.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;62-1&quot;&gt;PyDrive&lt;/a&gt;와 같은 API에 대한 래퍼 사용&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;63-0&quot;&gt;방법 1과 방법&lt;/strong&gt; &lt;strong papago-id=&quot;63-2&quot;&gt;2&lt;/strong&gt;는 나에게 &lt;strong papago-id=&quot;63-2&quot;&gt;효과&lt;/strong&gt;가 있었고, 나머지는 알아낼 수 없었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 할 수 있는 사람이 있다면, 다른 사람이 시도했던 것처럼 우아한 답변을 써주세요.잘 부탁드립니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;64&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;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Google 드라이브를 마운트할 수 없어서 이 라이브러리를 설치했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Install a Drive FUSE wrapper.
# https://github.com/astrada/google-drive-ocamlfuse

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2&amp;gt;&amp;amp;1 &amp;gt; /dev/null
!apt-get update -qq 2&amp;gt;&amp;amp;1 &amp;gt; /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse

from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass

!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} &amp;lt; /dev/null 2&amp;gt;&amp;amp;1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설치 및 인가 프로세스가 완료되면 먼저 드라이브를 마운트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!mkdir -p drive
!google-drive-ocamlfuse drive
&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;설치 후 Google 드라이브를 마운트할 수 있었습니다. Google 드라이브의 모든 것이 &lt;strong papago-id=&quot;67-1&quot;&gt;&lt;em papago-id=&quot;67-1-0&quot;&gt;/content/drive&lt;/em&gt;&lt;/strong&gt;에서 시작됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!ls /content/drive/ML/../../../../path_to_your_folder/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 파일을 읽기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;path_to_your_folder&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위 경로를 사용하여 팬더로 접습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd
df = pd.read_json('drive/ML/../../../../path_to_your_folder/file.json')
df.head(5)
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&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;/blockquote&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;71-0&quot;&gt;두&lt;/strong&gt; 번째 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;읽고 싶은 파일이 현재 작업 디렉토리에 있는 경우 편리합니다.&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;from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
  print('User uploaded file &quot;{name}&quot; with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Google 드라이브의 폴더 계층 아래에 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/content/drive/ML/../../../../path_to_your_folder/
&lt;/code&gt;&lt;/pre&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;import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df
&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;모든 데이터를 colab 서버의 '.' 위치에 다운로드하는 클래스를 작성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 https://github.com/brianmanderson/&lt;a href=&quot;https://github.com/brianmanderson/Copy-Shared-Google-to-Colab&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;77-1&quot;&gt;Copy-Shared-Google-to-Colab&lt;/a&gt; 에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!pip install PyDrive


from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
import os

class download_data_from_folder(object):
    def __init__(self,path):
        path_id = path[path.find('id=')+3:]
        self.file_list = self.get_files_in_location(path_id)
        self.unwrap_data(self.file_list)
    def get_files_in_location(self,folder_id):
        file_list = drive.ListFile({'q': &quot;'{}' in parents and trashed=false&quot;.format(folder_id)}).GetList()
        return file_list
    def unwrap_data(self,file_list,directory='.'):
        for i, file in enumerate(file_list):
            print(str((i + 1) / len(file_list) * 100) + '% done copying')
            if file['mimeType'].find('folder') != -1:
                if not os.path.exists(os.path.join(directory, file['title'])):
                    os.makedirs(os.path.join(directory, file['title']))
                print('Copying folder ' + os.path.join(directory, file['title']))
                self.unwrap_data(self.get_files_in_location(file['id']), os.path.join(directory, file['title']))
            else:
                if not os.path.exists(os.path.join(directory, file['title'])):
                    downloaded = drive.CreateFile({'id': file['id']})
                    downloaded.GetContentFile(os.path.join(directory, file['title']))
        return None
data_path = 'shared_path_location'
download_data_from_folder(data_path)
&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;Google Colab 노트북에서 Google Drive zip을 추출하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import zipfile
from google.colab import drive

drive.mount('/content/drive/')

zip_ref = zipfile.ZipFile(&quot;/content/drive/My Drive/ML/DataSet.zip&quot;, 'r')
zip_ref.extractall(&quot;/tmp&quot;)
zip_ref.close()
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@wenkesj&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;디렉토리 및 서브디렉토리를 카피하는 것에 대해서 말하고 있습니다.&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;저는 다음과 같은 해결책을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def copy_directory(source_id, local_target):
  try:
    os.makedirs(local_target)
  except: 
    pass
  file_list = drive.ListFile(
    {'q': &quot;'{source_id}' in parents&quot;.format(source_id=source_id)}).GetList()
  for f in file_list:
    key in ['title', 'id', 'mimeType']]))
    if f[&quot;title&quot;].startswith(&quot;.&quot;):
      continue
    fname = os.path.join(local_target, f['title'])
    if f['mimeType'] == 'application/vnd.google-apps.folder':
      copy_directory(f['id'], fname)
    else:
      f_ = drive.CreateFile({'id': f['id']})
      f_.GetContentFile(fname)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 gDrive는 파일을 너무 많이 복사하는 것을 좋아하지 않는 것 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 「Permanent Link」를 사용하여 하는 것을 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gdown&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;a href=&quot;https://stackoverflow.com/questions/48735600/file-download-from-google-drive-to-colaboratory&quot; papago-id=&quot;24-1&quot;&gt;같이&lt;/a&gt; 프리 인스톨 완료&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;collab 노트북을 사용하여 Google 드라이브에서 이미지 읽기&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;import glob
images_list = glob.glob(&quot;add google drive path/*.jpg&quot;)
print(images_list)
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&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;font class=&quot;papago-parent&quot;&gt;txt 파일, YOLOv4 트레이닝에 필요&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;file = open(&quot;/content/drive/MyDrive/project data/obj/train.txt&quot;, &quot;w&quot;) 
file.write(&quot;\n&quot;.join(images_list)) 
file.close() 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;87&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/48376580/&lt;a href=&quot;https://stackoverflow.com/questions/48376580/google-colab-how-to-read-data-from-my-google-drive&quot; target=&quot;_blank&quot; papago-id=&quot;87-1&quot;&gt;google-colab-how-to-read-data-from-my-google-drive&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2345</guid>
      <comments>https://prostudy.tistory.com/2345#entry2345comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:26:50 +0900</pubDate>
    </item>
    <item>
      <title>MySQL에서 선택한 값의 쉼표로 구분된 문자열</title>
      <link>https://prostudy.tistory.com/2344</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL에서 선택한 값의 쉼표로 구분된 문자열&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL에서 선택한 값을 쉼표로 구분된 문자열로 변환합니다.&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;SELECT id
FROM table_level
WHERE parent_id = 4;
&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;'5'
'6'
'9'
'10'
'12'
'14'
'15'
'17'
'18'
'779'
&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;&quot;5,6,9,10,12,14,15,17,18,779&quot;
&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;SELECT GROUP_CONCAT(id)
FROM table_level
WHERE parent_id = 4
GROUP BY parent_id;
&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;parent_id 행이 여러 개 있는 경우.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT GROUP_CONCAT(id) FROM table_level where parent_id=4 GROUP BY parent_id;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공백을 콤마로 바꾸려면.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT REPLACE(id,' ',',') FROM table_level where parent_id=4;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql의 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;group_concat()&lt;/a&gt; 함수를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT GROUP_CONCAT(id) FROM table_level where parent_id=4 GROUP BY parent_id;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 연결 문자열이 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;5,6,9,10,12,14,15,17,18,779 
&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;SELECT CONCAT('&quot;',GROUP_CONCAT(id),'&quot;') FROM table_level 
where parent_id=4 group by parent_id;
&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; &quot;5,6,9,10,12,14,15,17,18,779&quot;
&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;set group_concat_max_len&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;pre&gt;&lt;code&gt;SET GLOBAL  group_concat_max_len = 999999;
SELECT GROUP_CONCAT(id)  FROM table_level where parent_id=4 group by parent_id;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그룹내의 값의 디폴트 구분은, 쉼표()입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 구분 기호를 지정하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SEPARATOR&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;SELECT GROUP_CONCAT(id SEPARATOR '|')
FROM `table_level`
WHERE `parent_id`=4
GROUP BY `parent_id`;
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;5|6|9|10|12|14|15|17|18|779&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;SEPARATOR ''&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT GROUP_CONCAT(id SEPARATOR '')
FROM `table_level`
WHERE `parent_id`=4
GROUP BY `parent_id`;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18-1&quot;&gt;자세한&lt;/a&gt; 내용은 GROUP_CONCAT를 참조하십시오.&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;mysql에서 메서드 사용&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL Server에서 작업하는 사용자: 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;STRING_AGG&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;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GROUP_CONCAT를 사용하여 유연성을 높이는 다른 방법을 다음에 제시하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT GROUP_CONCAT('&quot;',id,'&quot;') FROM table_level where parent_id=4 GROUP BY parent_id;
&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;&quot;181&quot;,&quot;187&quot;,&quot;193&quot;,&quot;199&quot;,&quot;205&quot;,&quot;211&quot;,&quot;217&quot;,&quot;223&quot;,&quot;229&quot;,&quot;235&quot;,&quot;239&quot;,&quot;243&quot;,&quot;247&quot;,&quot;251&quot;
&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;font class=&quot;papago-parent&quot;&gt;이것은 반환값을 직접 사용하고 싶은 경우에 도움이 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;SELECT GROUP_CONCAT(id) as ids FROM table_level where parent_id=4 group by parent_id;
&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/19558443/&lt;a href=&quot;https://stackoverflow.com/questions/19558443/comma-separated-string-of-selected-values-in-mysql&quot; target=&quot;_blank&quot; papago-id=&quot;25-1&quot;&gt;comma-separated-string-of-selected-values-in-mysql&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2344</guid>
      <comments>https://prostudy.tistory.com/2344#entry2344comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:26:13 +0900</pubDate>
    </item>
    <item>
      <title>열려 있는 MySQL 연결 수를 확인하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2343</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;열려 있는 MySQL 연결 수를 확인하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&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;mysql_connect&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP에서 Apache에서 실행 중입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 전화하면 알아&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_connect&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;같은 파라미터로 100회 기능하면 항상 같은 접속링크가 반환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결이 이미 존재하면 새 연결이 시작되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 확실히 하고 싶은 게 있어&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_connect&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로운 것을 시작하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;mysql_connect&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 호출&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache에 설정이 있습니까?아니면 Apache 또는 MySQL 로그 파일에 이 수의 연결을 기록할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 방법이 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SHOW STATUS WHERE `variable_name` = 'Threads_connected'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 를 실행하여 에서 원하는 값을 찾을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Id&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기둥.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 PHP API에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&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;SHOW PROCESSLIST&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,너무.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 첫 번째 것은 너에게 효과가 있을 거야.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15-1&quot;&gt;다른 STATUS&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;코드를 실행하기 전과 실행 후의 값을 확인하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# mysql -e 'SHOW STATUS WHERE variable_name LIKE &quot;Threads_%&quot; OR variable_name = &quot;Connections&quot;'

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Connections       | 22742 |
| Threads_cached    | 1     |
| Threads_connected | 87    |
| Threads_created   | 549   |
| Threads_running   | 51    |
+-------------------+-------+
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;접속&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 서버에 대한 연결 시도 횟수(성공 여부)입니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드_캐치&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드 캐시의 스레드 수입니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드_연결됨&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 열려 있는 접속의 수.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드_작성필&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결을 처리하기 위해 생성된 스레드 수입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Threads_created가 크면 thread_cache_size 값을 늘릴 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시 미스 레이트는 Threads_created/Connections로 계산할 수 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드_실행 중&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sleeve 상태가 아닌 스레드 수.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&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;mysqladmin status
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Threads:&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;count. 현재 연결에 대한 자세한 내용은 다음 명령을 사용하여 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;user@host:~$ mysqladmin -uroot -ppass extended-status | grep Threads
| Threads_cached                           | 0           |
| Threads_connected                        | 3           |
| Threads_created                          | 3           |
| Threads_running                          | 1           |

user@host:~$ mysqladmin -uroot -ppass processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 53 | root | localhost |    | Sleep   | 258  |       |                  |
| 54 | root | localhost |    | Sleep   | 253  |       |                  |
| 58 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고:&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;code&gt;mysqladmin -v -uroot -ppass processlist&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 유사하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;show full processlist&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커맨드는, 임의의 일의 프리픽스로 단축해, 동시에 호출할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;user@host:~$ mysqladmin -v -uroot -ppass proc stat
+----+------+-----------+----+---------+------+-------+-----------------------+
| Id | User | Host      | db | Command | Time | State | Info                  |
+----+------+-----------+----+---------+------+-------+-----------------------+
| 53 | root | localhost |    | Sleep   | 951  |       |                       |
| 54 | root | localhost |    | Sleep   | 946  |       |                       |
| 65 | root | localhost |    | Query   | 0    |       | show full processlist |
+----+------+-----------+----+---------+------+-------+-----------------------+
Uptime: 1675  Threads: 3  Questions: 171  Slow queries: 0  Opens: 235  
Flush tables: 1  Open tables: 57  Queries per second avg: 0.102
&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;MySQL &lt;strong papago-id=&quot;34-1&quot;&gt;명령어 show&lt;/strong&gt; processlist를 사용하여 연결 수를 가져올 수 있습니다.&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;접속 수는 보이지 않지만 mysql 서버로의 접속은 제한할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/6502036/&lt;a href=&quot;https://stackoverflow.com/questions/6502036/how-can-i-see-how-many-mysql-connections-are-open&quot; target=&quot;_blank&quot; papago-id=&quot;36-1&quot;&gt;how-can-i-see-how-many-mysql-connections-are-open&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2343</guid>
      <comments>https://prostudy.tistory.com/2343#entry2343comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:25:40 +0900</pubDate>
    </item>
    <item>
      <title>GitHub에서 Python 패키지를 설치하는 방법은?</title>
      <link>https://prostudy.tistory.com/2342</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GitHub에서 Python 패키지를 설치하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot; papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;1-1&quot;&gt;이 질문에는 이미 답변&lt;/b&gt;이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;     &lt;/font&gt;&lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/8247605/configuring-so-that-pip-install-can-work-from-github&quot; dir=&quot;ltr&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;github에서 pip 설치가 작동하도록 구성&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;(8개의 답변)&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;2016-03-17 03:56:42Z&quot; papago-attr-id=&quot;1&quot;&gt;6년&lt;/span&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;/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;나는 httpie의 새로운 기능을 사용하고 싶다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 github repo https://&lt;a href=&quot;https://pypi.python.org/pypi/httpie&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-3&quot;&gt;github&lt;/a&gt;.com/jkbr/httpie에는 있지만 python 패키지인덱스 https://pypi.python.org/pypi/httpie에는 없습니다.&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;github repo에서 httpie 패키지를 설치하려면 어떻게 해야 하나요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 노력했다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pip install https://github.com/jkbr/httpie
&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;하지만 &quot;cannot unpack&quot; (해제할 수 없습니다)라는 오류가 표시되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Nodejs에서는 이렇게 github에서 패키지를 설치할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;npm install git+https://github.com/substack/node-optimist.git
&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;올바른 git URL을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pip install git+https://github.com/jkbr/httpie.git#egg=httpie
&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;pip 설명서의 &lt;a href=&quot;https://pip.pypa.io/en/stable/topics/vcs-support/&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;&lt;em papago-id=&quot;10-1-0&quot;&gt;VCS&lt;/em&gt;&lt;/a&gt; &lt;a href=&quot;https://pip.pypa.io/en/stable/topics/vcs-support/&quot; papago-id=&quot;10-1&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; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잊지 말고 다음 항목을 기입해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;egg=&amp;lt;projectname&amp;gt;&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;a href=&quot;https://pip.pypa.io/en/stable/cli/pip_install/#working-out-the-name-and-version&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;이름을 명시적&lt;/a&gt;으로 지정하는 부분.이 방법을 사용하면 setup.py 스크립트를 실행할 필요 없이 프로젝트의 메타데이터를 추적할 수 있습니다.&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;github에서 Python 패키지를 설치하려면 해당 저장소를 복제해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git clone https://github.com/jkbr/httpie.git
&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;그런 다음 해당 디렉토리에서 setup.py 파일을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo python setup.py install
&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;URL : https://stackoverflow.com/questions/15268953/&lt;a href=&quot;https://stackoverflow.com/questions/15268953/how-to-install-python-package-from-github&quot; target=&quot;_blank&quot; papago-id=&quot;15-1&quot;&gt;how-to-install-python-package-from-github&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2342</guid>
      <comments>https://prostudy.tistory.com/2342#entry2342comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:24:26 +0900</pubDate>
    </item>
    <item>
      <title>Redux 스토어 상태를 리셋하는 방법</title>
      <link>https://prostudy.tistory.com/2341</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Redux 스토어 상태를 리셋하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리덕스&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&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;가 두의 사용자 계정(예: 2개의 사용자 계정)을 있다고해 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;u1&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;u2&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;br&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;ol&gt; 
 &lt;li&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; &quot; &quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;u1&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;/li&gt; 
 &lt;li&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; &quot; &quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;u1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그아웃 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &quot; &quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;u2&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;/li&gt; 
&lt;/ol&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;는 &quot; &quot;와 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;u1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;청소하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 사용자가 로그아웃할 때 Redux 저장소를 초기 상태로 재설정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위한 한 가지 방법은 응용 프로그램에 루트 리덕터를 쓰는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 를, 에된 리덕터에 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;combineReducers()&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;USER_LOGOUT&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;초기 .action은 원래 상태로 되돌립니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 루트 리덕터가 다음과 같은 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const rootReducer = combineReducers({
  /* your app’s top-level reducers */
})
&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 class=&quot;papago-parent&quot;&gt; 해서 이름을  수 요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;appReducer&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;rootReducer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const appReducer = combineReducers({
  /* your app’s top-level reducers */
})

const rootReducer = (state, action) =&amp;gt; {
  return appReducer(state, action)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 이제  것을  주면 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rootReducer&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;USER_LOGOUT&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 class=&quot;papago-parent&quot;&gt;아시다시피, 리듀서는 다음과 같이 호출되면 초기 상태를 반환해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;첫 번째 논쟁으로 삼을 수 있습니다.&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;state&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;appReducer&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;/p&gt; 
&lt;pre&gt;&lt;code&gt; const rootReducer = (state, action) =&amp;gt; {
  if (action.type === 'USER_LOGOUT') {
    return appReducer(undefined, action)
  }

  return appReducer(state, action)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이제 제, now, 언, 지, now&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;USER_LOGOUT&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 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;action.type&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뿐만 아니라.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p 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;const appReducer = combineReducers({
  /* your app’s top-level reducers */
})

const rootReducer = (state, action) =&amp;gt; {
  if (action.type === 'USER_LOGOUT') {
    return appReducer(undefined, action)
  }

  return appReducer(state, action)
}
&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;a href=&quot;https://github.com/rt2zz/redux-persist&quot; rel=&quot;noreferrer&quot; papago-id=&quot;34-1&quot;&gt;redux-persist&lt;/a&gt;를 사용하는 경우 스토리지를 청소해야 할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Redux-persist는 스토리지 엔진에 상태 복사본을 보관하며, 상태 복사본은 새로 고침 시 그곳에서 로드됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 적절한 &lt;a href=&quot;https://github.com/rt2zz/redux-persist#storage-engines&quot; papago-id=&quot;35-1&quot; rel=&quot;noreferrer&quot;&gt;스토리지&lt;/a&gt; 엔진을 Import한 후 다음 상태로 설정하기 전에 상태를 해석해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 스토리지 상태 키를 청소합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const rootReducer = (state, action) =&amp;gt; {
    if (action.type === SIGNOUT_REQUEST) {
        // for all keys defined in your persistConfig(s)
        storage.removeItem('persist:root')
        // storage.removeItem('persist:otherKey')

        return appReducer(undefined, action);
    }
    return appReducer(state, action);
};
&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;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;37-0&quot;&gt;Dan&lt;/a&gt; Abramov의 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;37-2&quot;&gt;답변&lt;/a&gt;은 정확합니다.단, 이 접근방식과 함께 react-router-redux 패키지를 사용할 때 이상한 문제가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 「(으)」로 하지 않는 이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재의 라우팅 리듀서를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이  아래의 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const rootReducer = (state, action) =&amp;gt; {
  if (action.type === 'USER_LOGOUT') {
    const { routing } = state
    state = { routing } 
  }
  return appReducer(state, action)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;액션을 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const RESET_ACTION = {
  type: &quot;RESET&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로 각 에서는 리듀서(Reduceer)를 사용하고 합니다.&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;switch&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;if-else&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 리듀서를 통해 여러 작업을 처리할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 그 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;switch&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;const INITIAL_STATE = {
  loggedIn: true
}

const randomReducer = (state=INITIAL_STATE, action) {
  switch(action.type) {
    case 'SOME_ACTION_TYPE':

       //do something with it

    case &quot;RESET&quot;:

      return INITIAL_STATE; //Always return the initial state

   default: 
      return state; 
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 부르면 항상 요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RESET&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; stateaction, reducer로 스토어를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그아웃의 경우 다음과 같은 처리를 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const logoutHandler = () =&amp;gt; {
    store.dispatch(RESET_ACTION)
    // Also the custom logic like for the rest of the logout handler
}
&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;font class=&quot;papago-parent&quot;&gt;스토어는 항상 기본값이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;store.dispatch(RESET_ACTION)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 더 좋은 은 씬씬 a a a a a a a a a a a a a a a a a a a a a a a a a a a a가 있는 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LOGOUT_ACTION&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;  this 를 디스패치하면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LOGOUT_ACTION&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커스텀 미들웨어는 Redx-Saga 또는 Redx-Thunk를 사용하여 이 액션을 대행 수신할 수 있습니다.&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;다만, 어느 쪽이든, 다른 액션 「RESET」를 디스패치 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 스토어 로그아웃 및 리셋이 동기화되어 스토어가 다른 사용자 로그인을 준비할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;53-1&quot;&gt;Dan&lt;/a&gt; Abramov의 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;53-3&quot;&gt;답변&lt;/a&gt;에 &lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;53-1&quot;&gt;대한&lt;/a&gt; 간단한 답변입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const rootReducer = combineReducers({
    auth: authReducer,
    ...formReducers,
    routing
});


export default (state, action) =&amp;gt;
  rootReducer(action.type === 'USER_LOGOUT' ? undefined : state, action);
&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;&lt;strong papago-id=&quot;54-1&quot;&gt;Redux&lt;/strong&gt; Toolkit 및/&lt;strong papago-id=&quot;54-3&quot;&gt;또는&lt;/strong&gt; Typescript 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const appReducer = combineReducers({
  /* your app’s top-level reducers */
});

const rootReducer = (
  state: ReturnType&amp;lt;typeof appReducer&amp;gt;,
  action: AnyAction
) =&amp;gt; {
/* if you are using RTK, you can import your action and use it's type property instead of the literal definition of the action  */
  if (action.type === logout.type) {
    return appReducer(undefined, { type: undefined });
  }

  return appReducer(state, action);
};
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt; const reducer = (state = initialState, { type, payload }) =&amp;gt; {

   switch (type) {
      case RESET_STORE: {
        state = initialState
      }
        break
   }

   return state
 }
&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;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;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서 사용자를 로그아웃할 때 인 상태 &quot;cookie&quot;)를입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localStorage&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&gt;&lt;code&gt;IndexedDB&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Web SQL&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;window.location.reload()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로 또는 수 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;등&lt;/font&gt;에서는, DOM &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;하는 것만이, &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;한 방법입니다&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 영속적인 상태를 삭제하고 브라우저를 새로 고치는 것이 이전 사용자의 정보가 다음 사용자에게 유출되지 않도록 하는 유일한 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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&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; Redx를 사용하여 Redx를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;initialState&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&gt;&lt;code&gt;{ user: { name, email }}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 네스트에 이된 속성  &quot;예: &quot;가&quot; &quot;예: &quot;가&quot; &quot;예: &quot;가&quot; &quot;이 경우&quot;)에서 되는 것을 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;state.user.email&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;user is undefined&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(「」 「」 「」)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const appReducer = combineReducers({
  tabs,
  user
})

const initialState = appReducer({}, {})

const rootReducer = (state, action) =&amp;gt; {
  if (action.type === 'LOG_OUT') {
    state = initialState
  }

  return appReducer(state, action)
}
&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;NGRX4 업데이트&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;NGRX 4로 이행하는 경우 &lt;a href=&quot;https://github.com/ngrx/platform/blob/master/MIGRATION.md&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;54-1&quot;&gt;이행가이드&lt;/a&gt;에서 다음 사항을 알 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rootreducer&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;이 듀를 the the the the 로 되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ActionReducerMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;56&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;이 &lt;font 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;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 솔루션은 &lt;a href=&quot;https://github.com/ngrx/platform/blob/master/docs/store/api.md#injecting-reducers&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;72-1&quot;&gt;NGRX4 Github 문서&lt;/a&gt;의 meta-reducers API 섹션에서 영감을 받았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NGRX의 NGRX를 하여 이렇게 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ActionReducerMap&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;//index.reducer.ts
export const reducers: ActionReducerMap&amp;lt;State&amp;gt; = {
    auth: fromAuth.reducer,
    layout: fromLayout.reducer,
    users: fromUsers.reducer,
    networks: fromNetworks.reducer,
    routingDisplay: fromRoutingDisplay.reducer,
    routing: fromRouting.reducer,
    routes: fromRoutes.reducer,
    routesFilter: fromRoutesFilter.reducer,
    params: fromParams.reducer
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그럼 에는 '내부'에서해 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app.module&lt;/code&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;//app.module.ts
import { IndexReducer } from './index.reducer';
import { StoreModule, ActionReducer, MetaReducer } from '@ngrx/store';
...
export function debug(reducer: ActionReducer&amp;lt;any&amp;gt;): ActionReducer&amp;lt;any&amp;gt; {
    return function(state, action) {

      switch (action.type) {
          case fromAuth.LOGOUT:
            console.log(&quot;logout action&quot;);
            state = undefined;
      }
  
      return reducer(state, action);
    }
  }

  export const metaReducers: MetaReducer&amp;lt;any&amp;gt;[] = [debug];

  @NgModule({
    imports: [
        ...
        StoreModule.forRoot(reducers, { metaReducers}),
        ...
    ]
})

export class AppModule { }
&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;이는 기본적으로 NGRX 4에서도 같은 효과를 얻을 수 있는 하나의 방법입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;60-1&quot;&gt;Dan&lt;/a&gt; Abramov의 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;60-3&quot;&gt;답변&lt;/a&gt;에 따라 작성된 타이프스크립트를 사용할 때의 회피책(리듀스 타이핑은 합격할 수 없음)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 인수로 reducer하기 때문에 초기 루트 상태를 상수로 캐시합니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// store

export const store: Store&amp;lt;IStoreState&amp;gt; = createStore(
  rootReducer,
  storeEnhacer,
)

export const initialRootState = {
  ...store.getState(),
}

// root reducer

const appReducer = combineReducers&amp;lt;IStoreState&amp;gt;(reducers)

export const rootReducer = (state: IStoreState, action: IAction&amp;lt;any&amp;gt;) =&amp;gt; {
  if (action.type === &quot;USER_LOGOUT&quot;) {
    return appReducer(initialRootState, action)
  }

  return appReducer(state, action)
}


// auth service

class Auth {
  ...

  logout() {
    store.dispatch({type: &quot;USER_LOGOUT&quot;})
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그아웃 링크를 클리어하고 페이지를 갱신하기만 하면 됩니다.&lt;/font&gt;&lt;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;62&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/redux-utilities/redux-actions&quot; rel=&quot;noreferrer&quot; papago-id=&quot;62-1&quot;&gt;redux-actions&lt;/a&gt;를 사용하는 경우 HOF(&lt;em papago-id=&quot;62-3&quot;&gt;Higher Order&lt;/em&gt; Function)를 사용한 간단한 회피책을 소개합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;handleActions&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { handleActions } from 'redux-actions';

export function handleActionsEx(reducer, initialState) {
  const enhancedReducer = {
    ...reducer,
    RESET: () =&amp;gt; initialState
  };
  return handleActions(enhancedReducer, initialState);
}
&lt;/code&gt;&lt;/pre&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; 다음에 and고 and and를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;handleActionsEx&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;handleActions&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;67&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/35641992/5399745&quot; papago-id=&quot;67-0&quot;&gt;댄의 답변&lt;/a&gt;은 이 문제에 대한 좋은 아이디어를 주지만 잘 풀리지 않았다.왜냐하면 나는 이 &lt;a href=&quot;https://stackoverflow.com/a/35641992/5399745&quot; papago-id=&quot;67-0&quot;&gt;문제&lt;/a&gt;를 사용하고 있기 때문이다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;redux-persist&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;69&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「 」와 함께 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;redux-persist&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;70&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지나치다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;지속 동작을 트리거하지  때문에  것을 알았습니다(내 경우  Native, 즉 내  Native&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AsyncStorage&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;72&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 참조해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;await AsyncStorage.removeItem('persist:root');
&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;await persistor.flush(); // or await persistor.purge();
&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;저도 안 먹혔어요.그냥 소리만 질렀어요.(예: &quot;&lt;strong papago-id=&quot;92-1&quot;&gt;뜻밖&lt;/strong&gt;의 열쇠 _ &lt;strong papago-id=&quot;92-1&quot;&gt;persist...&quot;&lt;/strong&gt;라고 불평하는 등&lt;strong papago-id=&quot;92-1&quot;&gt;)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;73&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;건 '다 하다'가 '다'가 '다'가 '다'가 '다'가 '다'가'가 되면  환원제가 '' 예요.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 내가 원하는 건 단지 모든 개별 리듀서를 초기 상태로 되돌리는 것뿐이에요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RESET&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 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;handleActionsEx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;75&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 「 않습니다( 1개의 라이너에 ).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RESET: () =&amp;gt; initialState&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;76&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메타프로그래밍을 너무 좋아해서 견딜 수가 없었어요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;77&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;77-1&quot;&gt;Dan&lt;/a&gt; Abramov의 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;77-3&quot;&gt;답변&lt;/a&gt;, Ryan &lt;a href=&quot;https://stackoverflow.com/users/2658126/ryan-irilli&quot; papago-id=&quot;77-5&quot;&gt;Irilli&lt;/a&gt;의 &lt;a href=&quot;https://stackoverflow.com/a/37338532/11573842&quot; papago-id=&quot;77-7&quot;&gt;답변&lt;/a&gt;, &lt;a href=&quot;https://stackoverflow.com/users/5303509/rob-moorman&quot; papago-id=&quot;77-9&quot;&gt;그리고 Rob&lt;/a&gt; Moorman의 &lt;a href=&quot;https://stackoverflow.com/a/38199389/11573842&quot; papago-id=&quot;77-11&quot;&gt;답변&lt;/a&gt;을 &lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;77-1&quot;&gt;조합&lt;/a&gt;하여, 이 답변이 유지되는 이유를 설명합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;router&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;78&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스테이트 트리의 다른 모든 것을 초기화하면 다음과 같은 결과가 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const rootReducer = (state, action) =&amp;gt; appReducer(action.type === LOGOUT ? {
    ...appReducer({}, {}),
    router: state &amp;amp;&amp;amp; state.router || {}
  } : state, action);
&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;font class=&quot;papago-parent&quot;&gt;따라서 로그아웃액션 작성자를 디스패치할 때는 클리어 스테이트에도 액션을 디스패치합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;100&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;export const clearUserRecord = () =&amp;gt; ({
  type: CLEAR_USER_RECORD
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;101&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;export const logoutUser = () =&amp;gt; {
  return dispatch =&amp;gt; {
    dispatch(requestLogout())
    dispatch(receiveLogout())
    localStorage.removeItem('auth_token')
    dispatch({ type: 'CLEAR_USER_RECORD' })
  }
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;102&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;const userRecords = (state = {isFetching: false,
  userRecord: [], message: ''}, action) =&amp;gt; {
  switch (action.type) {
    case REQUEST_USER_RECORD:
    return { ...state,
      isFetching: true}
    case RECEIVE_USER_RECORD:
    return { ...state,
      isFetching: false,
      userRecord: action.user_record}
    case USER_RECORD_ERROR:
    return { ...state,
      isFetching: false,
      message: action.message}
    case CLEAR_USER_RECORD:
    return {...state,
      isFetching: false,
      message: '',
      userRecord: []}
    default:
      return state
  }
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 최선인지 잘 모르겠어요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Redx가 초기 상태의 동일한 변수를 참조하지 않도록 하기 위한 나의 조치:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// write the default state as a function
const defaultOptionsState = () =&amp;gt; ({
  option1: '',
  option2: 42,
});

const initialState = {
  options: defaultOptionsState() // invoke it in your initial state
};

export default (state = initialState, action) =&amp;gt; {

  switch (action.type) {

    case RESET_OPTIONS:
    return {
      ...state,
      options: defaultOptionsState() // invoke the default function to reset this part of the state
    };

    default:
    return state;
  }
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;79&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수를 만들었습니다를 강화하고  Redux를 .&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;action.type&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;80&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;트리거합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;구현에 대한 생각은 &lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;80-1&quot;&gt;Dan&lt;/a&gt; Abramov가 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;80-3&quot;&gt;답변&lt;/a&gt;에서 말한 &lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;80-1&quot;&gt;것&lt;/a&gt;과 동일합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Github: https://github.com/wwayne/&lt;a href=&quot;https://github.com/wwayne/redux-reset&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;107-1&quot;&gt;redux-reset&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 해결책이 나에게 효과가 있었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메타 리듀서에 리셋 상태 기능을 추가했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;열쇠는 사용법이었다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return reducer(undefined, action);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;81&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이치노&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;82&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/syslogers/index.ts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export function resetState(reducer: ActionReducer&amp;lt;State&amp;gt;): ActionReducer&amp;lt;State&amp;gt; {
  return function (state: State, action: Action): State {

    switch (action.type) {
      case AuthActionTypes.Logout: {
        return reducer(undefined, action);
      }
      default: {
        return reducer(state, action);
      }
    }
  };
}

export const metaReducers: MetaReducer&amp;lt;State&amp;gt;[] = [ resetState ];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;113&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;app.disc.ts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { StoreModule } from '@ngrx/store';
import { metaReducers, reducers } from './reducers';

@NgModule({
  imports: [
    StoreModule.forRoot(reducers, { metaReducers })
  ]
})
export class AppModule {}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;114-0&quot;&gt;댄&lt;/a&gt; 아브라모프의 답변이 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;114-2&quot;&gt;사건&lt;/a&gt;을 해결하는 데 도움이 되었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나, 나는 전체 상태를 클리어 할 필요가 없는 경우를 만났다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이렇게 했어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const combinedReducer = combineReducers({
    // my reducers 
});

const rootReducer = (state, action) =&amp;gt; {
    if (action.type === RESET_REDUX_STATE) {
        // clear everything but keep the stuff we want to be preserved ..
        delete state.something;
        delete state.anotherThing;
    }
    return combinedReducer(state, action);
}

export default rootReducer;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@&lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;115-1&quot;&gt;dan-abramov&lt;/a&gt; answer의 확장일 뿐입니다.특정 키가 리셋되지 않도록 유지해야 할 경우가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const retainKeys = ['appConfig'];

const rootReducer = (state, action) =&amp;gt; {
  if (action.type === 'LOGOUT_USER_SUCCESS' &amp;amp;&amp;amp; state) {
    state = !isEmpty(retainKeys) ? pick(state, retainKeys) : undefined;
  }

  return appReducer(state, action);
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 접근방식은 매우 옳습니다.특정 상태 &quot;NAME&quot;을 파기하여 다른 상태를 무시하고 유지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const rootReducer = (state, action) =&amp;gt; {
    if (action.type === 'USER_LOGOUT') {
        state.NAME = undefined
    }
    return appReducer(state, action)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상태를 초기 상태로 리셋하기 위해 다음 코드를 작성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const appReducers = (state, action) =&amp;gt;
   combineReducers({ reducer1, reducer2, user })(
     action.type === &quot;LOGOUT&quot; ? undefined : state,
     action
);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;83&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;댄 &lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;83-1&quot;&gt;아브라모프&lt;/a&gt;의 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;83-3&quot;&gt;답변&lt;/a&gt;이 내게는 잘 &lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;83-1&quot;&gt;먹혔지만&lt;/a&gt;, 그것이 ESLint를 촉발시켰다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;no-param-reassign&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;84&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 - https://eslint.org/docs/rules/&lt;a href=&quot;https://eslint.org/docs/rules/no-param-reassign&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;84-1&quot;&gt;no-param-reassign&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 다음과 같이 대처하고, 반드시 상태 복사본을 작성합니다(내 이해로는, Redoxy 작업입니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { combineReducers } from &quot;redux&quot;
import { routerReducer } from &quot;react-router-redux&quot;
import ws from &quot;reducers/ws&quot;
import session from &quot;reducers/session&quot;
import app from &quot;reducers/app&quot;

const appReducer = combineReducers({
    &quot;routing&quot;: routerReducer,
    ws,
    session,
    app
})

export default (state, action) =&amp;gt; {
    const stateCopy = action.type === &quot;LOGOUT&quot; ? undefined : { ...state }
    return appReducer(stateCopy, action)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;121&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 주정부의 복사본을 만드는 것이 좀 복잡할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 그다지 좋은 것은 아니지만, 보다 요령 있게 읽혀지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export default (state, action) =&amp;gt; {
    return appReducer(action.type === &quot;LOGOUT&quot; ? undefined : state, action)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;122&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 응용 프로그램 &lt;em papago-id=&quot;122-1&quot;&gt;&lt;strong papago-id=&quot;122-1-0&quot;&gt;시작&lt;/strong&gt;&lt;/em&gt; 시 리듀서 상태는 &lt;em papago-id=&quot;122-3&quot;&gt;&lt;strong papago-id=&quot;122-3-0&quot;&gt;새로워지고&lt;/strong&gt;&lt;/em&gt; &lt;em papago-id=&quot;122-7&quot;&gt;&lt;strong papago-id=&quot;122-7-0&quot;&gt;기본&lt;/strong&gt;&lt;/em&gt; InitialState로 새로워집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;123&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;APP 초기 로드에 대해 호출하는 액션을 추가하여 기본 &lt;em papago-id=&quot;123-1&quot;&gt;&lt;strong papago-id=&quot;123-1-0&quot;&gt;상태&lt;/strong&gt;&lt;/em&gt;를 &lt;em papago-id=&quot;123-1&quot;&gt;&lt;strong papago-id=&quot;123-1-0&quot;&gt;유지&lt;/strong&gt;&lt;/em&gt;해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;124&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응용 프로그램에서 로그아웃하는 동안 기본 &lt;em papago-id=&quot;124-3&quot;&gt;&lt;strong papago-id=&quot;124-3-0&quot;&gt;상태&lt;/strong&gt;&lt;/em&gt;를 &lt;em papago-id=&quot;124-1&quot;&gt;&lt;strong papago-id=&quot;124-1-0&quot;&gt;재할당&lt;/strong&gt;&lt;/em&gt;하면 리듀서도 새 것과 &lt;em papago-id=&quot;124-5&quot;&gt;&lt;strong papago-id=&quot;124-5-0&quot;&gt;동일&lt;/strong&gt;&lt;/em&gt;하게 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메인 APP 컨테이너&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  componentDidMount() {   
    this.props.persistReducerState();
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;126&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메인 APP 리듀서&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const appReducer = combineReducers({
  user: userStatusReducer,     
  analysis: analysisReducer,
  incentives: incentivesReducer
});

let defaultState = null;
export default (state, action) =&amp;gt; {
  switch (action.type) {
    case appActions.ON_APP_LOAD:
      defaultState = defaultState || state;
      break;
    case userLoginActions.USER_LOGOUT:
      state = defaultState;
      return state;
    default:
      break;
  }
  return appReducer(state, action);
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;127&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* logoutUser(action) {
  try {
    const response = yield call(UserLoginService.logout);
    yield put(LoginActions.logoutSuccess());
  } catch (error) {
    toast.error(error.message, {
      position: toast.POSITION.TOP_RIGHT
    });
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;128&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/458193/dan-abramov&quot; papago-id=&quot;128-1&quot;&gt;Dan&lt;/a&gt; Abramov의 &lt;a href=&quot;https://stackoverflow.com/a/35641992/11573842&quot; papago-id=&quot;128-3&quot;&gt;답변&lt;/a&gt;으로는 파라미터화된 셀렉터의 캐시를 클리어할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 셀렉터가 있는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;export const selectCounter1 = (state: State) =&amp;gt; state.counter1;
export const selectCounter2 = (state: State) =&amp;gt; state.counter2;
export const selectTotal = createSelector(
  selectCounter1,
  selectCounter2,
  (counter1, counter2) =&amp;gt; counter1 + counter2
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;129&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 로그아웃 시 다음과 같이 릴리스해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;selectTotal.release();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;130&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;131&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 샘플은 &lt;a href=&quot;https://ngrx.io/guide/store/selectors&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;131-1&quot;&gt;ngrx 문서&lt;/a&gt;에서 가져온 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;132&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나에게 효과가 있는 빠르고 쉬운 옵션은 &lt;a href=&quot;https://www.npmjs.com/package/redux-reset&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;132-1&quot;&gt;redux-reset&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;133&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-js prettyprint-override&quot;&gt;&lt;code&gt;import reduxReset from 'redux-reset'
// ...
const enHanceCreateStore = compose(
    applyMiddleware(...),
    reduxReset()  // Will use 'RESET' as default action.type to trigger reset
)(createStore)
const store = enHanceCreateStore(reducers)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;134&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그아웃 기능으로 '리셋' 디스패치&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;store.dispatch({
    type: 'RESET'
})
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;135&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Redux Toolkit을 사용한 접근법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;
export const createRootReducer = (history: History) =&amp;gt; {
  const rootReducerFn = combineReducers({
    auth: authReducer,
    users: usersReducer,
    ...allOtherReducers,
    router: connectRouter(history),
  });

  return (state: Parameters&amp;lt;typeof rootReducerFn&amp;gt;[0], action: Parameters&amp;lt;typeof rootReducerFn&amp;gt;[1]) =&amp;gt;
    rootReducerFn(action.type === appActions.reset.type ? undefined : state, action);
};

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;85&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 그냥 사용하지 않는거죠?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;return module.exports.default()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;86&quot;&gt;&lt;font 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;export default (state = {pending: false, error: null}, action = {}) =&amp;gt; {
    switch (action.type) {
        case &quot;RESET_POST&quot;:
            return module.exports.default();
        case &quot;SEND_POST_PENDING&quot;:
            return {...state, pending: true, error: null};
        // ....
    }
    return state;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;87&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;87-0&quot;&gt;주의:&lt;/strong&gt; 액션 기본값을 다음과 같이 설정하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;88&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이 경우 체크박스를  때문에 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;action.type&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;89&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; statementswitch 내부로 합니다.&lt;/font&gt;&lt;/font&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;store.dispatch({type: '@@redux/INIT'})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;'@@redux/INIT'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;90&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 redux가 redux를 사용할 때 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;createStore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;91&quot;&gt;&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;단, redex의 프라이빗 구현 세부사항으로 간주될 수 있으므로 구매자는 주의하시기 바랍니다.&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;92&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저에게 가장 효과가 있었던 것은,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;initialState&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;93&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;94&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  const reducer = createReducer(initialState,
  on(proofActions.cleanAdditionalInsuredState, (state, action) =&amp;gt; ({
    ...initialState
  })),
&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;예를들면&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;const initialState = {
  isLogged: false
}
//this will be your action
export const resetReducer = () =&amp;gt; {
  return {
    type: &quot;RESET&quot;
  }
}

export default (state = initialState, {
  type,
  payload
}) =&amp;gt; {
  switch (type) {
    //your actions will come her
    case &quot;RESET&quot;:
      return {
        ...initialState
      }
  }
}

//and from your frontend
dispatch(resetReducer())&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&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/35622588/&lt;a href=&quot;https://stackoverflow.com/questions/35622588/how-to-reset-the-state-of-a-redux-store&quot; target=&quot;_blank&quot; papago-id=&quot;149-1&quot;&gt;how-to-reset-the-state-of-a-redux-store&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2341</guid>
      <comments>https://prostudy.tistory.com/2341#entry2341comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:23:56 +0900</pubDate>
    </item>
    <item>
      <title>jQuery.parseJSON이 JSON에서 이스케이프된 단일 따옴표로 인해 &amp;quot;Invalid JSON&amp;quot; 오류를 발생시킵니다.</title>
      <link>https://prostudy.tistory.com/2340</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery.parseJ&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SON이 JSON에서 이스케이프된 단일 따옴표로 인해 &quot;Invalid JSON&quot; 오류를 발생시킵니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 지금  것은 음음음음음 i i i i i i i i i i i i i i i 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jQuery.post()&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; 오브젝트(예: JSON 오브젝트)를.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{ &quot;var&quot;: &quot;value&quot;, ... }&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값에 단일 따옴표가 되어 있는 (「」와 같이  됩니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;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;jQuery는 유효한 JSON 문자열을 해석할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://i.stack.imgur.com/jKAtL.png&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;다음은 &lt;/a&gt;(Chrome의 &lt;a href=&quot;https://i.stack.imgur.com/jKAtL.png&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;콘솔에서 실행&lt;/a&gt;)의 예입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data = &quot;{ \&quot;status\&quot;: \&quot;success\&quot;, \&quot;newHtml\&quot;: \&quot;Hello \\\'x\&quot; }&quot;;
eval(&quot;x = &quot; + data); // { newHtml: &quot;Hello 'x&quot;, status: &quot;success&quot; }

$.parseJSON(data); // Invalid JSON: { &quot;status&quot;: &quot;success&quot;, &quot;newHtml&quot;: &quot;Hello \'x&quot; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 정상이야?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON을 통해 하나의 견적을 제대로 전달할 수 있는 방법은 없습니까?&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;a href=&quot;http://www.json.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;6-1&quot;&gt;JSON&lt;/a&gt; 웹사이트의 스테이트 머신 다이어그램에 따르면 이스케이프된 이중 따옴표만 허용되며 단일 따옴표는 허용되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작은따옴표는 이스케이프할 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/15Kqv.gif&quot; alt=&quot;http://www.json.org/string.gif&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;7-0&quot;&gt;업데이트&lt;/b&gt; - 관심 있는 사용자를 위한 자세한 정보:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Douglas Crockford는 JSON 사양이 문자열 내에서 이스케이프된 단일 따옴표를 허용하지 않는 이유를 구체적으로 밝히지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;단,&lt;/a&gt; JavaScript &lt;a href=&quot;http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;부록E&lt;/a&gt;의 JSON에 대한 설명 중:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;&quot;&lt;a href=&quot;http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;좋은&lt;/a&gt; 부분&quot;은 다음과 같습니다.&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;JSON의 설계 목표는 최소, 휴대용, 텍스트 및 JavaScript의 하위 집합이었습니다.&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;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 모든 JSON 구현이 동의해야 하는 규칙이 하나 적기 때문에 이중 따옴표를 사용하여 문자열만 정의할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 결과 문자열 내의 단일 따옴표 문자는 실수로 문자열을 종료할 수 없습니다.정의상 문자열은 이중 따옴표로 끝나기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 정식 사양에서는 단일 따옴표 문자를 이스케이프할 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;hr&gt; Digging a little bit deeper, Crockford's 
&lt;a href=&quot;http://www.json.org/java/index.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;org.json&lt;/font&gt;&lt;/a&gt; implementation of JSON for Java is more permissible and 
&lt;em papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한다&lt;/font&gt;&lt;/em&gt; allow single quote characters:
&lt;p&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;toString 메서드에 의해 생성되는 텍스트는 JSON 구문 규칙에 엄밀하게 준거합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨스트럭터들은 수용하는 텍스트에 대해 더 관대합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;...&lt;/font&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li papago-id=&quot;15&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;/blockquote&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;a href=&quot;https://github.com/douglascrockford/JSON-java/blob/master/JSONTokener.java&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt;JSONTokener&lt;/a&gt; 소스 코드를 통해 확인됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;nextString&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 단일 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public String nextString(char quote) throws JSONException {
    char c;
    StringBuffer sb = new StringBuffer();
    for (;;) {
        c = next();
        switch (c) {

        ...

        case '\\':
            c = this.next();
            switch (c) {

            ...

            case '&quot;':
            case '\'':
            case '\\':
            case '/':
                sb.append(c);
                break;
        ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 메서드의 맨 위에는 다음과 같은 유용한 코멘트가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정식 JSON 형식에서는 작은 따옴표 안에 문자열을 넣을 수 없지만 구현에서는 문자열을 받아들일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 일부 구현에서는 단일 인용문을 사용할 수 있지만, 이 인용문에 의존해서는 안 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;널리 사용되는 대부분의 구현은 이 점에서 상당히 제한적이며 단일 따옴표로 묶인 문자열 및/또는 이스케이프된 단일 따옴표를 포함하는 JSON을 거부합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;마지막으로 이 문제를 원래 질문으로 되돌리기 위해 먼저 브라우저의 네이티브 JSON 파서 또는 &lt;a href=&quot;https://github.com/douglascrockford/JSON-js/blob/master/json2.js&quot; papago-id=&quot;21-3&quot; rel=&quot;noreferrer&quot;&gt;json2.js&lt;/a&gt;와 같은 로드된 라이브러리를 사용합니다(옆으로 보면 jQuery 로직의 기반이 되는 라이브러리가 있습니다).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JSON&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery는 jQuery를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;parseJSON: function( data ) {
    ...

    // Attempt to parse using the native JSON parser first
    if ( window.JSON &amp;amp;&amp;amp; window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    ...

    jQuery.error( &quot;Invalid JSON: &quot; + data );
},
&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;이러한 구현은 공식 JSON 사양에만 준거하고 단일 따옴표는 받지 않으므로 jQuery도 마찬가지인 것으로 알고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;되지 않으므로 \'따옴표를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\u0027&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;a href=&quot;http://www.utf8-chartable.de/&quot; papago-id=&quot;25-1&quot;&gt; &lt;/a&gt;http://www.&lt;a href=&quot;http://www.utf8-chartable.de/&quot; papago-id=&quot;25-1&quot;&gt;utf8-chartable&lt;/a&gt;.de/ 를 참조해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: 댓글에서 backticks라는 단어를 잘못 사용한 것을 양해 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 말은 백슬래시였어.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 요점은 다른 문자열 안에 중첩된 문자열이 있는 경우 단일 따옴표를 피하기 위해 백슬래시를 많이 사용하는 대신 유니코드를 사용하는 것이 더 유용하고 읽을 수 있다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 중첩되지 않았다면, 그냥 평범한 옛 인용문을 넣는 것이 정말로 더 쉽다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 어디에 있는지 이해하고 스펙을 보면 이스케이프되지 않은 작은 따옴표를 올바르게 해석해야 한다는 것을 알 수 있습니다.&lt;/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;jquery의 jQuery.parseJ를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SON 함수는 JSON 문자열을 해석하지만 json_encode로 준비된 데이터에 단일 따옴표가 있는 경우 해석 오류가 발생합니다.&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;실장중에, 다음과 같은 실수가 있는 것은 아닐까요(PHP - 서버측).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$data = array();

$elem = array();
$elem['name'] = 'Erik';
$elem['position'] = 'PHP Programmer';
$data[] = json_encode($elem);

$elem = array();
$elem['name'] = 'Carl';
$elem['position'] = 'C Programmer';
$data[] = json_encode($elem);

$jsonString = &quot;[&quot; . implode(&quot;, &quot;, $data) . &quot;]&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 단계는 JSON 인코딩된 문자열을 JS 변수에 저장하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
employees = jQuery.parseJSON('&amp;lt;?=$marker; ?&amp;gt;');
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot; 가 아닌 &quot; &quot; 를 사용해도 오류가 발생합니다.&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;해결책:&lt;/font&gt;&lt;/strong&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;비트마스크 JSON_HEX_APOS를 사용하여 다음과 같은 작은 따옴표를 변환한 것이 유일한 효과입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;json_encode($tmp, JSON_HEX_APOS);
&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;font class=&quot;papago-parent&quot;&gt;코드가 잘못되었거나 제대로 작성되지 않았습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;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;empid = &quot; T'via&quot;
empid =escape(empid)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단일 견적서를 포함한 가치를 얻을 수 있는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var xxx  = request.QueryString(&quot;empid&quot;)
xxx= unscape(xxx)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리에 단일 따옴표를 포함하는 값을 검색/삽입하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xxx=Replace(empid,&quot;'&quot;,&quot;''&quot;)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Cake를 사용하여 유사한 문제 해결&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP가 PHP 네이티브를 사용하여 JavaScript 스크립트 블록을 출력합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;json_encode&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$contractorCompanies&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에는 작은 따옴표가 있고 위와 같이 예상된 값이 포함되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;json_encode($contractorCompanies)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유효한 JSON이기 때문에 피해가지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php $this-&amp;gt;Html-&amp;gt;scriptBlock(&quot;var contractorCompanies = jQuery.parseJSON( '&quot;.(json_encode($contractorCompanies).&quot;' );&quot;); ?&amp;gt;
&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;JSON 인코딩된 문자열 주위에 addslash()를 추가하면 따옴표를 피할 수 있습니다.그러면 Cake/PHP는 올바른 Javascript를 브라우저에 에코할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS 에러가 사라집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php $this-&amp;gt;Html-&amp;gt;scriptBlock(&quot;var contractorCompanies = jQuery.parseJSON( '&quot;.addslashes(json_encode($contractorCompanies)).&quot;' );&quot;); ?&amp;gt;
&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;XHR 요청의 JSON 개체를 HTML5 data-* 속성에 저장하려고 했습니다.&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 제가 한 일은 하나의 인용문을 대체하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IT 코드와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;#39;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;stringify() 메서드 뒤에 regex를 사용하여 다음 방법으로 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var productToString = JSON.stringify(productObject);
var quoteReplaced = productToString.replace(/'/g, &quot;&amp;amp;#39;&quot;);
var anchor = '&amp;lt;a data-product=\'' + quoteReplaced + '\' href=\'#\'&amp;gt;' + productObject.name + '&amp;lt;/a&amp;gt;';
// Here you can use the &quot;anchor&quot; variable to update your DOM element.
&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 class=&quot;papago-parent&quot;&gt;서버 측에서는 어떻게 JSON을 생성합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브러리 기능을 사용하고 있습니까(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;json_encode&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 JSON 스트링을 수동으로 작성합니까?&lt;/font&gt;&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&gt;&lt;/font&gt;&lt;code&gt;\'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;큰따옴표를 사용하고 있는 것을 보면, 당연히 작은따옴표를 피할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 아직 버전 1.4.1로 업데이트하지 않았기 때문에 그것이 당신의 jQuery 오류의 원인인지 확인할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2275359/&lt;a href=&quot;https://stackoverflow.com/questions/2275359/jquery-parsejson-throws-invalid-json-error-due-to-escaped-single-quote-in-json&quot; target=&quot;_blank&quot; papago-id=&quot;52-1&quot;&gt;jquery-parsejson-throws-invalid-json-error-due-to-escaped-single-quote-in-json&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2340</guid>
      <comments>https://prostudy.tistory.com/2340#entry2340comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:23:18 +0900</pubDate>
    </item>
    <item>
      <title>리스트 내의 고유값 발생을 카운트하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2339</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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 공백 행을 입력하면 해당 값 중 고유 값이 몇 개인지 사용자에게 알려줍니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;난 문제를 해결하기 위해서가 아니라 실생활에서 이걸 만들고 있는 거야.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;enter: happy
enter: rofl
enter: happy
enter: mpg8
enter: Cpp
enter: Cpp
enter:
There are 4 unique words!
&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;# ask for input
ipta = raw_input(&quot;Word: &quot;)

# create list 
uniquewords = [] 
counter = 0
uniquewords.append(ipta)

a = 0   # loop thingy
# while loop to ask for input and append in list
while ipta: 
  ipta = raw_input(&quot;Word: &quot;)
  new_words.append(input1)
  counter = counter + 1

for p in uniquewords:
&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;목록에 있는 단어 수를 어떻게 세는지 모르겠어요.&lt;/font&gt;&lt;/font&gt;&lt;br&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;또한&lt;a href=&quot;http://docs.python.org/library/collections.html#collections.Counter&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;컬렉션을 &lt;a href=&quot;http://docs.python.org/library/collections.html#collections.Counter&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.python.org/library/collections.html#collections.Counter&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;코드&lt;/a&gt;를 리팩터링하는 카운터:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from collections import Counter

words = ['a', 'b', 'c', 'a']

Counter(words).keys() # equals to list(set(words))
Counter(words).values() # counts the elements' frequency
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;['a', 'c', 'b']
[2, 1, 1]
&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;a href=&quot;https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-1&quot;&gt;세트&lt;/a&gt;를 사용하여 중복을 제거한 후 &lt;a href=&quot;https://docs.python.org/3/library/functions.html#len&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-3&quot;&gt;len&lt;/a&gt; 함수를 사용하여 세트의 요소를 카운트할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;len(set(new_words))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;values, counts = np.unique(words, return_counts=True)&lt;/code&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세&lt;/font&gt;&lt;/h3&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import numpy as np

words = ['b', 'a', 'a', 'c', 'c', 'c']
values, counts = np.unique(words, return_counts=True)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://numpy.org/doc/stable/reference/generated/numpy.unique.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;numpy.unique&lt;/a&gt; 함수는 입력 목록의 정렬된 고유 요소를 카운트와 함께 &lt;strong papago-id=&quot;12-3&quot;&gt;반환&lt;/strong&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;['a', 'b', 'c']
[2, 1, 3]
&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;a href=&quot;http://docs.python.org/library/stdtypes.html#set&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-1&quot;&gt;세트&lt;/a&gt; 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;words = ['a', 'b', 'c', 'a']
unique_words = set(words)             # == set(['a', 'b', 'c'])
unique_word_count = len(unique_words) # == 3
&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;words = []
ipta = raw_input(&quot;Word: &quot;)

while ipta:
  words.append(ipta)
  ipta = raw_input(&quot;Word: &quot;)

unique_word_count = len(set(words))

print &quot;There are %d unique words!&quot; % unique_word_count
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;aa=&quot;XXYYYSBAA&quot;
bb=dict(zip(list(aa),[list(aa).count(i) for i in list(aa)]))
print(bb)
# output:
# {'X': 2, 'Y': 3, 'S': 1, 'B': 1, 'A': 2}
&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;ndarray에는 &lt;a href=&quot;https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.unique.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;unique&lt;/a&gt;라는 numpy 메서드가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;np.unique(array_name)
&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;&amp;gt;&amp;gt;&amp;gt; np.unique([1, 1, 2, 2, 3, 3])
array([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; a = np.array([[1, 1], [2, 3]])
&amp;gt;&amp;gt;&amp;gt; np.unique(a)
array([1, 2, 3])
&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;시리즈에는 call &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17-1&quot;&gt;value_counts()&lt;/a&gt; 함수가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Series_name.value_counts()
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고유한 값의 히스토그램을 여기에 표시하려면 oneliner&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import numpy as np    
unique_labels, unique_counts = np.unique(labels_list, return_counts=True)
labels_histogram = dict(zip(unique_labels, unique_counts))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 어떻게 해?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd
#List with all words
words=[]

#Code for adding words
words.append('test')


#When Input equals blank:
pd.Series(words).nunique()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;목록에 있는 고유 값 수를 반환합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;get&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;lst = ['a', 'b', 'c', 'c', 'c', 'd', 'd']

dictionary = {}
for item in lst:
    dictionary[item] = dictionary.get(item, 0) + 1
    
print(dictionary)
&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;{'a': 1, 'b': 1, 'c': 3, 'd': 2}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;ipta = raw_input(&quot;Word: &quot;) ## asks for input
words = [] ## creates list
unique_words = set(words)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세트가 가장 쉬운 방법이지만 dict를 사용하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;some_dict.has(key)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 키와 값만 사전을 채웁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 입력되어 있는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;words[]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자의 입력을 사용하여 목록의 고유한 단어를 숫자에 매핑하는 dict를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;word_map = {}
i = 1
for j in range(len(words)):
    if not word_map.has_key(words[j]):
        word_map[words[j]] = i
        i += 1                                                             
num_unique_words = len(new_map) # or num_unique_words = i, however you prefer
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;판다를 이용한 기타 방법&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd

LIST = [&quot;a&quot;,&quot;a&quot;,&quot;c&quot;,&quot;a&quot;,&quot;a&quot;,&quot;v&quot;,&quot;d&quot;]
counts,values = pd.Series(LIST).value_counts().values, pd.Series(LIST).value_counts().index
df_results = pd.DataFrame(list(zip(values,counts)),columns=[&quot;value&quot;,&quot;count&quot;])
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 형식으로 결과를 내보낼 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 사항이 유효합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;람다 함수는 중복된 단어를 필터링합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;inputs=[]
input = raw_input(&quot;Word: &quot;).strip()
while input:
    inputs.append(input)
    input = raw_input(&quot;Word: &quot;).strip()
uniques=reduce(lambda x,y: ((y in x) and x) or x+[y], inputs, [])
print 'There are', len(uniques), 'unique words'
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 세트를 사용하고 싶지만, 또 다른 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;uniquewords = []
while True:
    ipta = raw_input(&quot;Word: &quot;)
    if ipta == &quot;&quot;:
        break
    if not ipta in uniquewords:
        uniquewords.append(ipta)
print &quot;There are&quot;, len(uniquewords), &quot;unique words!&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;ipta = raw_input(&quot;Word: &quot;) ## asks for input
words = [] ## creates list

while ipta: ## while loop to ask for input and append in list
  words.append(ipta)
  ipta = raw_input(&quot;Word: &quot;)
  words.append(ipta)
#Create a set, sets do not have repeats
unique_words = set(words)

print &quot;There are &quot; +  str(len(unique_words)) + &quot; unique words!&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 나만의 버전입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def unique_elements():
    elem_list = []
    dict_unique_word = {}
    for i in range(5):# say you want to check for unique words from five given words
        word_input = input('enter element: ')
        elem_list.append(word_input)
        if word_input not in dict_unique_word:
            dict_unique_word[word_input] = 1
        else:
            dict_unique_word[word_input] += 1
    return elem_list, dict_unique_word
result_1, result_2 = unique_elements() 
# result_1 holds the list of all inputted elements
# result_2 contains unique words with their count
print(result_2)
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12282232/&lt;a href=&quot;https://stackoverflow.com/questions/12282232/how-do-i-count-occurrence-of-unique-values-inside-a-list&quot; target=&quot;_blank&quot; papago-id=&quot;33-1&quot;&gt;how-do-i-count-occurrence-of-unique-values-inside-a-list&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2339</guid>
      <comments>https://prostudy.tistory.com/2339#entry2339comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:09:00 +0900</pubDate>
    </item>
    <item>
      <title>MySQLdb를 사용하여 커서를 닫아야 하는 경우</title>
      <link>https://prostudy.tistory.com/2338</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQLdb를 사용하여 커서를 닫아야 하는 경우&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;WSGI 웹 앱을 만들고 있으며 MySQL 데이터베이스를 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문장을 실행하고 결과를 얻기 위한 커서를 제공하는 MySQLdb를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;1-1&quot;&gt;커서를 가져오고 닫는 표준 방법은 무엇입니까?&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 커서의 지속 시간은 어느 정도입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;거래할 때마다 커서를 새로 받아야 하나요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커밋하기 전에 커서를 닫아야 한다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;중간 커밋이 필요 없는 트랜잭션 세트를 검색하여 각 트랜잭션에 대해 새로운 커서를 얻을 필요가 없는 중요한 이점이 있습니까?&lt;/font&gt;&lt;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 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;with&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;1.2에서는 1.2.5로 설정되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLdb.Connection&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;a href=&quot;https://github.com/farcepest/MySQLdb1/blob/2204283605e8c450223965eda8d8f357d5fe4c90/MySQLdb/connections.py&quot; papago-id=&quot;6-3&quot; rel=&quot;noreferrer&quot;&gt;github&lt;/a&gt;)를 사용하여 &lt;a href=&quot;http://docs.python.org/2/library/stdtypes.html#context-manager-types&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;컨텍스트 매니저&lt;/a&gt; 프로토콜을 구현합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def __enter__(self):
    if self.get_autocommit():
        self.query(&quot;BEGIN&quot;)
    return self.cursor()

def __exit__(self, exc, value, tb):
    if exc:
        self.rollback()
    else:
        self.commit()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&amp;amp;A에 관한 Q는 여러 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with&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;a href=&quot;http://effbot.org/zone/python-with-statement.htm&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;Python의 &quot;with&quot; 스테이트먼트를 읽어보실&lt;/a&gt; 수 있습니다만, 기본적으로는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__enter__&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;with&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;block&quot;, &quot;block&quot;, &quot;block&quot;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__exit__&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;with&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 블록을 할 수 .&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 옵션 구문을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with EXPR as VAR&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;__enter__&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 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;connection = MySQLdb.connect(...)
with connection as cursor:            # connection.__enter__ executes at this line
    cursor.execute('select 1;')
    result = cursor.fetchall()        # connection.__exit__ executes after this line
print result                          # prints &quot;((1L,),)&quot;
&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;with&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;__exit__&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;self.rollback()&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;self.commit()&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;close()&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 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;__exit__&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의되어  해도 , 이 이 정의되어 있기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설령 정의되어 있어도 상관없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 접속 관리만 하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 예에 다음 코드를 추가하면 쉽게 확인할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;try:
    cursor.execute('select 1;')
    print 'cursor is open;',
except MySQLdb.ProgrammingError:
    print 'cursor is closed;',
if connection.open:
    print 'connection is open'
else:
    print 'connection is closed'
&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;출력 &quot;cursor is open, connection is open&quot; 이 stdout 으로 출력됩니다.&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;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html&quot; papago-id=&quot;26-1&quot; rel=&quot;noreferrer&quot;&gt;왜냐고&lt;/a&gt;요? &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html&quot; papago-id=&quot;26-1&quot; rel=&quot;noreferrer&quot;&gt;MySQL&lt;/a&gt; C &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html&quot; papago-id=&quot;26-1&quot; rel=&quot;noreferrer&quot;&gt;API&lt;/a&gt;를 기반으로 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLdb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈 설명서에서 &quot;&lt;a href=&quot;http://mysql-python.sourceforge.net/MySQLdb.html#connection-objects&quot; papago-id=&quot;27-1&quot; rel=&quot;noreferrer&quot;&gt;MySQL은 커서를 지원하지 않지만 커서&lt;/a&gt;는 쉽게&lt;a href=&quot;http://mysql-python.sourceforge.net/MySQLdb.html#connection-objects&quot; papago-id=&quot;27-1&quot; rel=&quot;noreferrer&quot;&gt; 에뮬레이트할&lt;/a&gt; 수 &lt;a href=&quot;http://mysql-python.sourceforge.net/MySQLdb.html#connection-objects&quot; papago-id=&quot;27-1&quot; rel=&quot;noreferrer&quot;&gt;있습니다.&quot;&lt;/a&gt;라고 암시한 바와 같이,는 커서 개체를 구현하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정말이지,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLdb.cursors.BaseCursor&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;object&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커밋/커밋과 관련하여 커서에 이러한 제한을 가하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle &lt;a href=&quot;http://forums.mysql.com/read.php?50,578823,578941#msg-578941&quot; papago-id=&quot;29-1&quot; rel=&quot;noreferrer&quot;&gt;개발자&lt;/a&gt;는 다음과 같이 &lt;a href=&quot;http://forums.mysql.com/read.php?50,578823,578941#msg-578941&quot; papago-id=&quot;29-1&quot; rel=&quot;noreferrer&quot;&gt;말했습니다&lt;/a&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cur.commit()보다 앞의 cnx.commit()가 더 논리적으로 들립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마도 당신은 &quot;더 이상 필요하지 않으면 커서를 닫아라&quot;라는 규칙으로 갈 수 있을 것이다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 커서를 닫기 전에 commit()를 지정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 커넥터/Python의 경우 큰 차이는 없지만 다른 데이터베이스도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 주제에 대한 &quot;표준 관행&quot;에 근접할 것으로 예상합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중간 커밋이 필요 없는 트랜잭션 세트를 검색하여 각 트랜잭션에 대해 새로운 커서를 얻을 필요가 없는 중요한 이점이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매우 의심스럽지만, 그렇게 하려고 하면 또 다른 인적 오류가 발생할 수 있습니다.&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;34&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;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오버헤드는 무시할 수 있고 데이터베이스 서버에는 전혀 영향을 주지 않습니다.이것은 완전히 MySQLdb의 실장 내에 있습니다.새로운 커서를 작성했을 때 무슨 일이 일어나는지 궁금하다면 &lt;a href=&quot;https://github.com/farcepest/MySQLdb1/blob/master/MySQLdb/cursors.py&quot; papago-id=&quot;35-1&quot; rel=&quot;noreferrer&quot;&gt;github에서 확인&lt;/a&gt;할 수 &lt;a href=&quot;https://github.com/farcepest/MySQLdb1/blob/master/MySQLdb/cursors.py&quot; papago-id=&quot;35-1&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; 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;with&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;MySQLdb.Connection&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;__enter__&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;__exit__&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;with&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 블록의 끝을 추적하거나 닫을 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서 오브젝트를 세밀하게 관리하는 것이 그렇게 중요한 경우&lt;a href=&quot;http://docs.python.org/2/library/contextlib.html#contextlib.closing&quot; papago-id=&quot;42-1&quot; rel=&quot;noreferrer&quot;&gt; contextlib&lt;/a&gt;을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.python.org/2/library/contextlib.html#contextlib.closing&quot; papago-id=&quot;42-1&quot; rel=&quot;noreferrer&quot;&gt;커서&lt;/a&gt; 객체가 정의되지 않은 사실을 보완하기 위해 닫기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__exit__&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또&lt;/font&gt; 이 &lt;font class=&quot;papago-parent&quot;&gt;경우&lt;/font&gt;, 접속 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;때, 접속 &lt;font class=&quot;papago-parent&quot;&gt;오브젝트&lt;/font&gt;를 사용하여 접속 오브젝트를 강제 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;도 있습니다&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with&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; &quot;closed;  closed : block 이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &quot;my_my_my_my_my_my_my_my_my_my_mym&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from contextlib import closing
import MySQLdb

with closing(MySQLdb.connect(...)) as my_conn:
    with closing(my_conn.cursor()) as my_curs:
        my_curs.execute('select 1;')
        result = my_curs.fetchall()
try:
    my_curs.execute('select 1;')
    print 'my_curs is open;',
except MySQLdb.ProgrammingError:
    print 'my_curs is closed;',
if my_conn.open:
    print 'my_conn is open'
else:
    print 'my_conn is closed'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;with closing(arg_obj)&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;code&gt;__enter__&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;__exit__&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;em papago-id=&quot;37-1&quot;&gt;호출&lt;/em&gt;합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;close&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ( 블록을 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; (이것이 동작하고 있는 것을 확인하려면 , 간단하게 클래스를 정의해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Foo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;__enter__&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&gt;&lt;code&gt;__exit__&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;close&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;print&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&gt;&lt;code&gt;with Foo(): pass&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 때 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with closing(Foo()): pass&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 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;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째로 는 MySQLdb가 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BEGIN&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(「」를 사용하고  경우)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with connection&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;블록의 마지막에 트랜잭션을 커밋 또는 롤백합니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;이는 MySQLdb의 기본 동작으로, 모든 DML 문을 즉시 커밋하는 MySQL의 기본 동작으로부터 사용자를 보호합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매니저를 할 때인 MySQLdb를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BEGIN&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; if  ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with connection&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;autocommit이 실제로는 바이패스되어 있을 때만 디세블로 되어 있다고 생각할 수 있습니다.&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;closing&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경 내용을 롤백할 수 없고 동시성 버그가 나타나기 시작하며 그 이유를 바로 알 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;code&gt;with closing(MySQLdb.connect(user, pass)) as VAR&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;54-1&quot;&gt;접속&lt;/em&gt; 오브젝트를 에 바인드합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;VAR&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;with MySQLdb.connect(user, pass) as VAR&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;em papago-id=&quot;56-1&quot;&gt;커서&lt;/em&gt; 오브젝트를 에 &lt;em papago-id=&quot;56-1&quot;&gt;바인드합니다&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;VAR&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;의 &quot;&quot;를 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;connection&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 class=&quot;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&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;는 Attribute로 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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 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 papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서에 대한 모든 참조가 제거됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서가 범위를 벗어납니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;접속이 타임아웃 되었습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버 관리 도구를 통해 연결이 수동으로 닫힙니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 테스트하려면 다음 행을 하나씩 실행하면서 열린 연결을 모니터링합니다(Workbench 또는 를 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.6/en/show-processlist.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;76-1&quot;&gt;사용&lt;/a&gt;).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;with MySQLdb.connect(...) as my_curs:
    pass
my_curs.close()
my_curs.connection          # None
my_curs.connection.close()  # throws AttributeError, but connection still open
del my_curs                 # connection will close here
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'with' 키워드를 사용하여 다시 쓰는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'With'는 자동으로 커서를 닫는 데 주의를 기울입니다(관리되지 않는 리소스이므로 중요).&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;from contextlib import closing
import MySQLdb

''' At the beginning you open a DB connection. Particular moment when
  you open connection depends from your approach:
  - it can be inside the same function where you work with cursors
  - in the class constructor
  - etc
'''
db = MySQLdb.connect(&quot;host&quot;, &quot;user&quot;, &quot;pass&quot;, &quot;database&quot;)
with closing(db.cursor()) as cur:
    cur.execute(&quot;somestuff&quot;)
    results = cur.fetchall()
    # do stuff with results

    cur.execute(&quot;insert operation&quot;)
    # call commit if you do INSERT, UPDATE or DELETE operations
    db.commit()

    cur.execute(&quot;someotherstuff&quot;)
    results2 = cur.fetchone()
    # do stuff with results2

# at some point when you decided that you do not need
# the open connection anymore you close it
db.close()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;sup papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: 이 답변은 MySQLdb의 드롭인 대체품이자 MySQLdb의 유지보수가 중단된 이후 사실상 최신 버전의 MySQLdb에 &lt;a href=&quot;https://github.com/PyMySQL/PyMySQL&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;78-1&quot;&gt;대한&lt;/a&gt; 답변입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 있는 모든 것이 레거시 MySQLdb에 대해서도 &lt;em papago-id=&quot;78-3&quot;&gt;맞는다고&lt;/em&gt; 생각합니다만, 아직 확인하지 않았습니다.&lt;/font&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선 몇 가지 사실:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&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;Python의 구문은 컨텍스트 매니저의 구문을 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__enter__&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;  전 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;with&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;__exit__&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;/li&gt; 
 &lt;li papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결에는 커서 생성 및 반환 외에 아무것도 하지 않는 메서드와 커밋 또는 롤백(예외가 느려졌는지 여부에 따라 다름)하는 메서드가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;84-5&quot;&gt;접속&lt;/em&gt;은 닫히지 &lt;em papago-id=&quot;84-5&quot;&gt;않습니다&lt;/em&gt;.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PyMy 커서&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL은 순전히 Python에서 구현된 추상화이며 MySQL &lt;sup papago-id=&quot;85-1&quot;&gt;1&lt;/sup&gt;자체에는 이와 동등한 개념이 없습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서는 아무것도 하지 않는 메서드와 커서를 &quot;닫는&quot; 메서드가 있습니다(즉, 상위 연결에 대한 커서의 참조를 무효화하고 커서에 저장된 데이터를 폐기하는 것을 의미합니다).&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서는 생성된 연결에 대한 참조를 유지하지만 연결은 생성한 커서에 대한 참조를 유지하지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;88&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;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html&quot; papago-id=&quot;89-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;://&lt;/a&gt;docs.python.org/3/&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html&quot; papago-id=&quot;89-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;reference&lt;/a&gt;/datamodel.html,에 따르면 CPython(기본 Python 구현)은 참조 카운트를 사용하여 참조 수가 0이 되면 개체를 자동으로 삭제합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것들을 종합하면, 다음과 같은 순진한 코드는 &lt;em papago-id=&quot;90-1&quot;&gt;이론적&lt;/em&gt;으로 문제가 있다는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Problematic code, at least in theory!
import pymysql
with pymysql.connect() as cursor:
    cursor.execute('SELECT 1')

# ... happily carry on and do something unrelated
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;65&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&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; Python을 실행하면 Python을 실행할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SHOW FULL PROCESSLIST&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;66&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 쉘에서 생성한 유휴 연결을 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL의 기본 연결 수는 &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_connections&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;66-1&quot;&gt;151개&lt;/a&gt;로 &lt;em papago-id=&quot;66-3&quot;&gt;많지&lt;/em&gt; 않기 때문에, 이러한 연결을 열어두는 프로세스가 많으면 이론적으로 문제가 발생하기 시작할 수 있습니다.&lt;/font&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;단, CPython에서는 &lt;em papago-id=&quot;67-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;cursor&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;를 들어 됨) 또는 &quot;완료됨&quot;(예: &quot;완료됨&quot;)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cursor&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;는 ) 0에  참조  카운트가 카운트가 0으로 떨어집니다.그러면 0으로 됩니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__del__&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;이치노&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 쉘에 Python을 실행하여 을 수행할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cursor = 'arbitrary value'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;71&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하면, 에서 .;  、 [ ] 、 [ ] 、 [ ] 、 [ ] 、 [ ] 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SHOW PROCESSLIST&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★★★★★★★★★★★★★.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;73&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나, 이것에 의존하는 것은 부적절하며, 이론적으로는 CPython 이외의 Python 실장에서는 실패할 수 있습니다.&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;.close()&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;connection(Python이 개체를 파괴할 때까지 기다리지 않고 데이터베이스에서 연결을 해제합니다.&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 contextlib
import pymysql
with contextlib.closing(pymysql.connect()) as conn:
    with conn as cursor:
        cursor.execute('SELECT 1')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 보기 흉하지만 Python이 오브젝트를 파괴하여 데이터베이스 접속을 해방하는 것에 의존하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 이렇게 명시적으로 연결을 닫는 경우 &lt;em papago-id=&quot;102-1&quot;&gt;커서&lt;/em&gt;를 닫는 것은 전혀 의미가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로, 여기서 두 번째 질문에 답합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 커서를 얻는 데 많은 비용이 드나요, 아니면 큰 문제가 되지 않나요?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니요, 커서를 인스턴스화해도 MySQL에 전혀 영향을 주지 않고 &lt;a href=&quot;https://github.com/PyMySQL/PyMySQL/blob/0.7.10/pymysql/cursors.py#L34-L47&quot; papago-id=&quot;105-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;기본적&lt;/a&gt;으로 아무 것도 &lt;a href=&quot;https://github.com/PyMySQL/PyMySQL/blob/0.7.10/pymysql/cursors.py#L34-L47&quot; papago-id=&quot;105-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;하지&lt;/a&gt; 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중간 커밋이 필요 없는 트랜잭션 세트를 검색하여 각 트랜잭션에 대해 새로운 커서를 얻을 필요가 없는 중요한 이점이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 상황적이어서 일반적인 대답을 하기 어렵다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;https&lt;a href=&quot;https://dev.mysql.com/doc/refman/en/optimizing-innodb-transaction-management.html&quot; papago-id=&quot;107-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;://&lt;/a&gt;dev.mysql.com/doc/refman/en/&lt;a href=&quot;https://dev.mysql.com/doc/refman/en/optimizing-innodb-transaction-management.html&quot; papago-id=&quot;107-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;optimizing-innodb-transaction-management&lt;/a&gt;.html의 표현대로 &quot;&lt;em papago-id=&quot;107-3&quot;&gt;어플리케이션이 초당 수천 &lt;/em&gt;번 &lt;em papago-id=&quot;107-3&quot;&gt;커밋하면&lt;/em&gt; 성능 &lt;em papago-id=&quot;107-3&quot;&gt;문제가 발생&lt;/em&gt;할 수 &lt;em papago-id=&quot;107-3&quot;&gt;있으며&lt;/em&gt; 2~&lt;em papago-id=&quot;107-3&quot;&gt;3시간마다 커밋하면 다른 성능&lt;/em&gt; 문제가 &lt;em papago-id=&quot;107-3&quot;&gt;발생&lt;/em&gt;할 수 &lt;em papago-id=&quot;107-3&quot;&gt;있습니다.&quot;&lt;/em&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 커밋에 대해 퍼포먼스 오버헤드를 지불하지만 트랜잭션을 장시간 열어두면 다른 접속이 잠금을 기다리는 데 시간을 할애할 가능성이 높아지고 교착 상태가 발생할 위험이 높아지며 다른 접속에 의해 실행되는 검색 비용이 증가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;sup papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;sup papago-id=&quot;108-0&quot;&gt;1&lt;/sup&gt; &lt;em papago-id=&quot;108-2&quot;&gt;MySQL&lt;/em&gt;에는 &lt;a href=&quot;https://dev.mysql.com/doc/refman/en/cursors.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;108-4&quot;&gt;커서&lt;/a&gt;라고 불리는 구조가 있지만 저장 프로시저 내에만 존재합니다.PyMy와는 완전히 다릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 커서 및 여기서는 관련이 없습니다.&lt;/font&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 실행에 하나의 커서를 사용하고 코드 끝에 커서를 닫는 것이 좋을 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 제품은 사용하기 쉽고 효율성 이점도 있을 수 있습니다(그 점에 대해서는 언급하지 마십시오).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;conn = MySQLdb.connect(&quot;host&quot;,&quot;user&quot;,&quot;pass&quot;,&quot;database&quot;)
cursor = conn.cursor()
cursor.execute(&quot;somestuff&quot;)
results = cursor.fetchall()
..do stuff with results
cursor.execute(&quot;someotherstuff&quot;)
results2 = cursor.fetchall()
..do stuff with results2
cursor.close()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;110&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;이 방법으로 문제가 발생하는 것은 fetchone()을 사용하여 첫 번째 쿼리의 모든 결과를 반복하기 전에 두 번째 커서를 실행해야 하는 경우뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;111&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 모든 데이터를 꺼내는 즉시 커서를 닫으십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래야 코드 뒷부분을 묶을 걱정을 하지 않아도 됩니다.&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; 및 mysqlphp mysql처럼 .&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;첫 번째 데이터를 인쇄하기 전에 코드 시작 부분에서 i를 시작합니다.&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;50x&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;76&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(내부 에러가 기억나지 않는다) 에러 메세지가 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;114&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/5669878/&lt;a href=&quot;https://stackoverflow.com/questions/5669878/when-to-close-cursors-using-mysqldb&quot; target=&quot;_blank&quot; papago-id=&quot;114-1&quot;&gt;when-to-close-cursors-using-mysqldb&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2338</guid>
      <comments>https://prostudy.tistory.com/2338#entry2338comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:08:15 +0900</pubDate>
    </item>
    <item>
      <title>Larabel Migration을 사용하여 타임스탬프 열의 기본값을 현재 타임스탬프로 설정하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2337</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Larabel Migration을 사용하여 타임스탬프 열의 기본값을 현재 타임스탬프로 설정하려면 어떻게 해야 합니까?&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;CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP&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;Laravel Schema Builder / Migrations lar lar lar 。&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;Laravel 문서를 여러 번 살펴보았는데, 타임스탬프 열의 기본값을 어떻게 해야 할지 모르겠습니다.&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;timestamps()&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;0000-00-00 00:00&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 기둥 모두 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&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; 표현이이기 때문에, 이 표현은 given색 、 신색 、 신신 、 당 given 、 당 given 、 given given 、 given given given given given given 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DB::raw()&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;CURRENT_TIMESTAMP&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;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('created_at')-&amp;gt;default(DB::raw('CURRENT_TIMESTAMP'));
&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Larabel 5.1.25(PR &lt;a href=&quot;https://github.com/laravel/framework/pull/10962&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;10962&lt;/a&gt; 및&lt;a href=&quot;https://github.com/laravel/framework/commit/15c487fecc00c1a58837ce5692396fec78a5bd9d&quot; papago-id=&quot;10-3&quot; rel=&quot;noreferrer&quot;&gt; 15c487fe&lt;/a&gt;를 &lt;a href=&quot;https://github.com/laravel/framework/pull/10962&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;참조&lt;/a&gt;) 이후 새로운 버전을 사용할 수 있게 되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;useCurrent()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컬럼 수식자 메서드를 사용하여 컬럼에 대해 동일한 기본값을 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('created_at')-&amp;gt;useCurrent();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서는 &quot;MySQL&quot;을할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ON UPDATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서 절로 하다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DB::raw()&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('updated_at')-&amp;gt;default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
&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;다시 말씀드리지만 Laravel 8.36.0(&lt;a href=&quot;https://github.com/laravel/framework/pull/36817&quot; papago-id=&quot;15-1&quot; rel=&quot;noreferrer&quot;&gt;PR&lt;/a&gt; 36817 &lt;a href=&quot;https://github.com/laravel/framework/pull/36817&quot; papago-id=&quot;15-1&quot; rel=&quot;noreferrer&quot;&gt;참조&lt;/a&gt;)에서 새로운 버전을 사용할 수 있게 되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;useCurrentOnUpdate()&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;useCurrent()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컬럼에 대해 동일한 기본값을 얻기 위한 수식자:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('updated_at')-&amp;gt;useCurrent()-&amp;gt;useCurrentOnUpdate();
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고차스&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;br&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.7  MySQL 5.7 ★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0000-00-00 00:00:00&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 class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;Larabel&lt;/a&gt; 5&lt;a href=&quot;https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;.2 업그레이드가이드&lt;/a&gt;에 기재되어 있는 바와 같이 레코드를 데이터베이스에 삽입하면 모든 타임스탬프 컬럼에 유효한 디폴트값이 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;useCurrent()&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;시 컬럼 수식자5.를 사용하여 (Larabel 5.1.25)를  수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;nullable()&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;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Postgre&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL © Larabel 4.x&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;br&gt;&lt;br&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;4. 4.x &quot;Postgre&quot;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 드라이버는 타임스탬프 값을 저장하기 위해 기본 데이터베이스 정밀도를 사용했습니다.&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;CURRENT_TIMESTAMP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 정밀도로 열에서 함수 Postgre&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL은 사용 가능한 더 높은 정밀도로 타임스탬프를 생성하므로 소수 두 번째 부분으로 타임스탬프를 생성합니다. 이&lt;a href=&quot;http://sqlfiddle.com/#!15/3a6ff/1&quot; papago-id=&quot;26-1&quot; rel=&quot;noreferrer&quot;&gt; SQL&lt;/a&gt; 피들링을 &lt;a href=&quot;http://sqlfiddle.com/#!15/3a6ff/1&quot; papago-id=&quot;26-1&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; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;카본은 마이크로초가 저장될 것으로 예상하지 않기 때문에 타임스탬프 해석에 실패합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;치 않은  것을 는 어플리케이션에 으로 부여해야 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CURRENT_TIMESTAMP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;이것들&quot;은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;  $table-&amp;gt;timestamp('created_at')-&amp;gt;default(DB::raw('CURRENT_TIMESTAMP(0)'));
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 5.이이라벨 5.0 이후&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;timestamp()&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기둥 0이를 막을 수 있는 생략성 정밀도를 사용하여로 변경되었다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Larabel 4.x 문제를 지적해 주신 &lt;a href=&quot;https://stackoverflow.com/users/1024530/andrewhl&quot; papago-id=&quot;31-1&quot;&gt;@andrewhl님&lt;/a&gt; 감사합니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Chanaka &lt;a href=&quot;https://stackoverflow.com/users/4309588/chanaka-karunarathne&quot; papago-id=&quot;32-1&quot;&gt;Karunarathne &lt;/a&gt;님의 신작 소개에 감사드립니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;useCurrentOnUpdate()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;숏컷이 있어요&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&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;created_at&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;updated_at&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;§:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$t-&amp;gt;timestamp('created_at')-&amp;gt;default(DB::raw('CURRENT_TIMESTAMP'));
$t-&amp;gt;timestamp('updated_at')-&amp;gt;default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL version &amp;gt; = 5.6. MySQL = 5.6.5인 것이 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CURRENT_TIMESTAMP&lt;/code&gt;&lt;/p&gt;&lt;p&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;태그  Laravel 5.1 2015-12-02 -에  lar lar lar lar lar lar lar lar lar lar lar5 . 1 . 26 ★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;useCurrent()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이치노&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Schema::table('users', function ($table) {
    $table-&amp;gt;timestamp('created')-&amp;gt;useCurrent();
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/laravel/framework/pull/10962&quot; rel=&quot;noreferrer&quot; papago-id=&quot;40-0&quot;&gt;PR 10962&lt;/a&gt;(&lt;a href=&quot;https://github.com/laravel/framework/commit/15c487fecc00c1a58837ce5692396fec78a5bd9d&quot; papago-id=&quot;40-2&quot; rel=&quot;noreferrer&quot;&gt;이후&lt;/a&gt; 커밋 &lt;a href=&quot;https://github.com/laravel/framework/commit/15c487fecc00c1a58837ce5692396fec78a5bd9d&quot; papago-id=&quot;40-2&quot; rel=&quot;noreferrer&quot;&gt;15c487fe&lt;/a&gt;)가 이 추가로 이어졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관심 있는 문제 &lt;a href=&quot;https://github.com/laravel/framework/issues/3602&quot; rel=&quot;noreferrer&quot; papago-id=&quot;41-1&quot;&gt;3602&lt;/a&gt; 및 &lt;a href=&quot;https://github.com/laravel/framework/issues/11518&quot; rel=&quot;noreferrer&quot; papago-id=&quot;41-3&quot;&gt;11518&lt;/a&gt;을 읽어보실 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 MySQL 5.7(기본 구성)에서는 시간 필드에 기본값을 정의하거나 null을 정의해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;43&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;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;레코드가 &lt;strong papago-id=&quot;44-3&quot;&gt;작성되었지만 수정&lt;/strong&gt;되지 않은 경우 updated_at 열에 null이 &lt;strong papago-id=&quot;44-1&quot;&gt;있으면&lt;/strong&gt; 더 편리합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;db 크기를 줄이고(오케이, 조금만), 데이터가 수정된 적이 없다는 것을 한눈에 알 수 있습니다.&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('created_at')-&amp;gt;useCurrent();
$table-&amp;gt;timestamp('updated_at')-&amp;gt;default(DB::raw('NULL ON UPDATE CURRENT_TIMESTAMP'))-&amp;gt;nullable();
&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;(라라벨 7+8에서는 mysql 8).&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: Laravel 8부터 다음 기능도 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('created_at')-&amp;gt;useCurrent();
$table-&amp;gt;timestamp('updated_at')-&amp;gt;nullable()-&amp;gt;useCurrentOnUpdate();
&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;이것을 지적해 주신 @bilogic 덕분입니다.&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;이것은 사실로 통하지 않는다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('created_at')-&amp;gt;default('CURRENT_TIMESTAMP');
&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;타임스탬프 선택과 함께 제공되는 '기본값 0'은 제거되지 않고 사용자 정의 기본값만 추가됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 견적을 빼놓고는 그게 좀 필요해요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB를 조작하는 모든 것이 Laravel4에서 나오는 것은 아닙니다.&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;$table-&amp;gt;timestamps()-&amp;gt;default('CURRENT_TIMESTAMP');
&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;그게 가능한지 보려고 한 시간째 찾고 있어요.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;53-0&quot;&gt;업데이트:&lt;/strong&gt; Paulos Freita의 &lt;a href=&quot;https://stackoverflow.com/questions/18067614/how-can-i-set-the-default-value-of-a-timestamp-column-to-current-timestamp-on-u/20822267#20822267&quot; papago-id=&quot;53-2&quot;&gt;답변&lt;/a&gt;은 가능하지만 구문은 간단하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 Paulo Freitas 제안을 &lt;a href=&quot;https://stackoverflow.com/a/20822267/397195&quot; papago-id=&quot;54-1&quot;&gt;사용&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;s&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;이 문제를 할 때까지 Larabel 뒤에 할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Schema::create&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/s&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    Schema::create(&quot;users&quot;, function($table){
        $table-&amp;gt;increments('id');
        $table-&amp;gt;string('email', 255);
        $table-&amp;gt;string('given_name', 100);
        $table-&amp;gt;string('family_name', 100);
        $table-&amp;gt;timestamp('joined');
        $table-&amp;gt;enum('gender', ['male', 'female', 'unisex'])-&amp;gt;default('unisex');
        $table-&amp;gt;string('timezone', 30)-&amp;gt;default('UTC');
        $table-&amp;gt;text('about');
    });
    DB::statement(&quot;ALTER TABLE &quot;.DB::getTablePrefix().&quot;users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나한테는 놀라운 효과가 있었어.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 시간을 설정하려면 레벨 7, 8에서 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('column_name')-&amp;gt;useCurrent();
&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;dateTime 열의 현재 날짜/시간을 설정하려면 다음과 같이 하십시오(검색할 때처럼).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;dateTime('signed_when')-&amp;gt;useCurrent();
&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;Larabel에서 사용하는 커스터마이즈는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 타임스탬프의 기본 created_at&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;레코드 업데이트 시 타임스탬프 업데이트&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;helpers.php&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라라벨&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

if (!function_exists('database_driver')) {
    function database_driver(): string
    {
        $connection = config('database.default');
        return config('database.connections.' . $connection . '.driver');
    }
}

if (!function_exists('is_database_driver')) {
    function is_database_driver(string $driver): bool
    {
        return $driver === database_driver();
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;composer에는 다음 내용을 composer&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;autoload&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조력자&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php php php php php php php php php php php php php php php 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &quot;autoload&quot;: {
        &quot;files&quot;: [
            &quot;app/Services/Uploads/Processors/processor_functions.php&quot;,
            &quot;app/helpers.php&quot;
        ]
    },
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 라라벨 모델에 다음과 같은 것을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        if (is_database_driver('sqlite')) {
            $table-&amp;gt;timestamps();
        } else {
            $table-&amp;gt;timestamp('created_at')-&amp;gt;default(\DB::raw('CURRENT_TIMESTAMP'));
            $table-&amp;gt;timestamp('updated_at')
                -&amp;gt;default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
        }
&lt;/code&gt;&lt;/pre&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;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;이를 통해 우리 팀은 유닛 테스트에 sqlite를 계속 사용할 수 있습니다.&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;ON UPDATE CURRENT_TIMESTAMP&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;MySQL sqlite 에iteite 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 됩니다.확인해보니 제 Laravel 4.2에서 동작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamp('created_at')-&amp;gt;default(DB::raw('CURRENT_TIMESTAMP'));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 도움이 됐으면 좋겠다.&lt;/font&gt;&lt;/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;DB::statement(&quot;ALTER TABLE orders CHANGE updated_at updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP&quot;);
&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;Larabel 5에서는, 다음과 같이 심플합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;timestamps(); //Adds created_at and updated_at columns.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서: http://laravel.com/docs/5.1/migrations#&lt;a href=&quot;http://laravel.com/docs/5.1/migrations#creating-columns&quot; rel=&quot;nofollow&quot; papago-id=&quot;74-1&quot;&gt;creating-columns&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/18067614/&lt;a href=&quot;https://stackoverflow.com/questions/18067614/how-can-i-set-the-default-value-of-a-timestamp-column-to-the-current-timestamp-w&quot; target=&quot;_blank&quot; papago-id=&quot;75-1&quot;&gt;how-can-i-set-the-default-value-of-a-timestamp-column-to-the-current-timestamp-w&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2337</guid>
      <comments>https://prostudy.tistory.com/2337#entry2337comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:07:38 +0900</pubDate>
    </item>
    <item>
      <title>dict에서 값 목록을 가져오려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2336</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;dict에서 값 목록을 가져오려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python에서 dict의 값 목록을 가져오려면 어떻게 해야 하나요?&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;Java에서는 Map의 값을 목록으로 가져오는 것이 매우 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;list = map.values();&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python에서도 마찬가지로 간단한 방법으로 dict에서 값 목록을 얻을 수 있는지 궁금합니다.&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;a href=&quot;https://docs.python.org/library/stdtypes.html#dict.values&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-0&quot;&gt;&lt;code papago-id=&quot;4-0-0&quot;&gt;dict.values&lt;/code&gt;&lt;/a&gt; 는 사전 값의 &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#dict-views&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-2&quot;&gt;&lt;em papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뷰&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;를 반환하기 때문에 로 묶어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;list(d.values())
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;* &lt;a href=&quot;https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;연산자&lt;/a&gt;를 사용하여 dict_values의 압축을 해제할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; d = {1: &quot;a&quot;, 2: &quot;b&quot;}
&amp;gt;&amp;gt;&amp;gt; [*d.values()]
['a', 'b']
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 목록 개체&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; d = {1: &quot;a&quot;, 2: &quot;b&quot;}
&amp;gt;&amp;gt;&amp;gt; list(d.values())
['a', 'b']
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것을 할 수 있는 확실한 방법은 하나, 바람직하게는 하나뿐이어야 한다.&lt;/font&gt;&lt;/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&gt;&lt;/font&gt;&lt;code&gt;list(dictionary.values())&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&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 Python3를 고려하면 어떤 것이 더 빠를까요?&lt;/font&gt;&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;[*L]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[].extend(L)&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;list(L)&lt;/code&gt;&lt;/h3&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;small_ds = {x: str(x+42) for x in range(10)}
small_df = {x: float(x+42) for x in range(10)}

print('Small Dict(str)')
%timeit [*small_ds.values()]
%timeit [].extend(small_ds.values())
%timeit list(small_ds.values())

print('Small Dict(float)')
%timeit [*small_df.values()]
%timeit [].extend(small_df.values())
%timeit list(small_df.values())

big_ds = {x: str(x+42) for x in range(1000000)}
big_df = {x: float(x+42) for x in range(1000000)}

print('Big Dict(str)')
%timeit [*big_ds.values()]
%timeit [].extend(big_ds.values())
%timeit list(big_ds.values())

print('Big Dict(float)')
%timeit [*big_df.values()]
%timeit [].extend(big_df.values())
%timeit list(big_df.values())
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;Small Dict(str)
256 ns ± 3.37 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
338 ns ± 0.807 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
336 ns ± 1.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Small Dict(float)
268 ns ± 0.297 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
343 ns ± 15.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
336 ns ± 0.68 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Big Dict(str)
17.5 ms ± 142 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16.5 ms ± 338 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16.2 ms ± 19.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Big Dict(float)
13.2 ms ± 41 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
13.1 ms ± 919 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
12.8 ms ± 578 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
&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;인텔(R) Core(TM) i7-8650U CPU @ 1.90GHz에서 실행.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과&lt;/font&gt;&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&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;* operator&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;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중요한 빅 딕셔너리용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;list()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조금 더 빠를 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음의 예를 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;songs = [
{&quot;title&quot;: &quot;happy birthday&quot;, &quot;playcount&quot;: 4},
{&quot;title&quot;: &quot;AC/DC&quot;, &quot;playcount&quot;: 2},
{&quot;title&quot;: &quot;Billie Jean&quot;, &quot;playcount&quot;: 6},
{&quot;title&quot;: &quot;Human Touch&quot;, &quot;playcount&quot;: 3}
]

print(&quot;====================&quot;)
print(f'Songs --&amp;gt; {songs} \n')
title = list(map(lambda x : x['title'], songs))
print(f'Print Title --&amp;gt; {title}')

playcount = list(map(lambda x : x['playcount'], songs))
print(f'Print Playcount --&amp;gt; {playcount}')
print (f'Print Sorted playcount --&amp;gt; {sorted(playcount)}')

# Aliter -
print(sorted(list(map(lambda x: x['playcount'],songs))))
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;strong papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전에서 특정 키의 값 목록을 가져옵니다.&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 간단한 방법은 반복하여 이해를 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;list_of_keys&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.한다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;list_of_keys&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키가 아닌 키가 포함됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;d&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.get()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;method를 사용하여 기본값을 반환할 수 있습니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디폴트로는 변경할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;res = [d[k] for k in list_of_keys] 
# or
res = [d.get(k) for k in list_of_keys]
&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;대부분의 경우 Python에는 키 아래에 값을 가져올 수 있는 메서드가 내장되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;itemgetter()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빌트인부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;operator&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;from operator import itemgetter
res = list(itemgetter(*list_of_keys)(d))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데모:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;d = {'a':2, 'b':4, 'c':7}
list_of_keys = ['a','c']
print([d.get(k) for k in list_of_keys])
print(list(itemgetter(*list_of_keys)(d)))
# [2, 7]
# [2, 7]
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전 목록에서 동일한 키의 값 가져오기&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;매핑과 마찬가지로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;itemgetter()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 키 값을 가져오려면 목록을 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;list_of_dicts = [ {&quot;title&quot;: &quot;A&quot;, &quot;body&quot;: &quot;AA&quot;}, {&quot;title&quot;: &quot;B&quot;, &quot;body&quot;: &quot;BB&quot;} ]

list_comp = [d['title'] for d in list_of_dicts]
itmgetter = list(map(itemgetter('title'), list_of_dicts))
print(list_comp)
print(itmgetter)
# ['A', 'B']
# ['A', 'B']
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;out: dict_values([{1:a, 2:b}])

in:  str(dict.values())[14:-3]    
out: 1:a, 2:b
&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;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;35&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/16228248/&lt;a href=&quot;https://stackoverflow.com/questions/16228248/how-can-i-get-list-of-values-from-dict&quot; target=&quot;_blank&quot; papago-id=&quot;35-1&quot;&gt;how-can-i-get-list-of-values-from-dict&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2336</guid>
      <comments>https://prostudy.tistory.com/2336#entry2336comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:06:35 +0900</pubDate>
    </item>
    <item>
      <title>Java 스크립트의 배열에서 하위 하위 개체의 키 값을 매핑하는 방법</title>
      <link>https://prostudy.tistory.com/2335</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Java 스크립트의 배열에서 하위 하위 개체의 키 값을 매핑하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 배열의 값에 액세스하려고 했습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필드 개체 내의 키와 모델 내부 키 개체의 값에 액세스하려고 합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;formFields = [
        {
            &quot;title&quot;: &quot;Criteria Details&quot;,
            &quot;columns&quot;: 2,
            &quot;fields&quot;: {
                &quot;criteriaName&quot;: {
                    &quot;type&quot;: &quot;text&quot;,
                    &quot;label&quot;: &quot;Criteria Name&quot;,
                    &quot;id&quot;: 'criteriaName',
                    &quot;model&quot;: &quot;CRITERIA 1&quot;,
                    &quot;required&quot;: true,
                    &quot;show&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Criteria Name is required',
                    ]
                },
                &quot;criteriaType&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Criteria type&quot;,
                    &quot;id&quot;: &quot;criteriaType&quot;,
                    &quot;options&quot;: ['Dependent', 'Independent', 'Static'],
                    &quot;model&quot;: &quot;Dependent&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Criteria Type is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;table&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Table&quot;,
                    &quot;id&quot;: &quot;table&quot;,
                    &quot;options&quot;: [&quot;Table1&quot;],
                    &quot;model&quot;: &quot;Table1&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Table is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;column&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Column&quot;,
                    &quot;id&quot;: &quot;column&quot;,
                    &quot;options&quot;: [&quot;Column1&quot;],
                    &quot;model&quot;: &quot;Column1&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Column is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;joinType&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Join Type&quot;,
                    &quot;id&quot;: &quot;joinType&quot;,
                    &quot;options&quot;: [&quot;AND&quot;, &quot;OR&quot;],
                    &quot;model&quot;: &quot;OR&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Join Type is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;operator&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Operator&quot;,
                    &quot;id&quot;: &quot;operator&quot;,
                    &quot;options&quot;: [&quot;&amp;lt;&quot;, &quot;&amp;lt;=&quot;, &quot;&amp;lt;&amp;gt;&quot;, &quot;=&quot;, &quot;&amp;gt;=&quot;, &quot;&amp;gt;&quot;, &quot;EXISTS&quot;, &quot;IN&quot;, &quot;IS NOT NULL&quot;, &quot;NULL&quot;, &quot;LIKE&quot;, &quot;NOT EXISTS&quot;, &quot;NOT IN&quot;, &quot;NOT LIKE&quot;],
                    &quot;model&quot;: &quot;&amp;gt;=&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Operator is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;valueType&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Value Type&quot;,
                    &quot;id&quot;: &quot;valueType&quot;,
                    &quot;options&quot;: [&quot;Dependent SQL&quot;, &quot;SQL&quot;, &quot;VALUE&quot;],
                    &quot;model&quot;: &quot;SQL&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Value Type is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;dataType&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Data Type&quot;,
                    &quot;id&quot;: &quot;dataType&quot;,
                    &quot;options&quot;: [&quot;DATE&quot;, &quot;NUMBER&quot;, &quot;STRING&quot;],
                    &quot;model&quot;: &quot;NUMBER&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Data Type is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;format&quot;: {
                    &quot;type&quot;: &quot;text&quot;,
                    &quot;label&quot;: &quot;Format&quot;,
                    &quot;id&quot;: &quot;format&quot;,
                    &quot;model&quot;: &quot;Config&quot;,
                    &quot;required&quot;: false,
                    &quot;show&quot;: true,
                },
                &quot;parameterMandatory&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Parameter Mandatory&quot;,
                    &quot;id&quot;: &quot;parameterMandatory&quot;,
                    &quot;options&quot;: [&quot;NO&quot;, &quot;YES&quot;],
                    &quot;model&quot;: &quot;YES&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Parameter Mandatory is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;link&quot;: {
                    &quot;type&quot;: &quot;select&quot;,
                    &quot;label&quot;: &quot;Link&quot;,
                    &quot;id&quot;: &quot;link&quot;,
                    &quot;options&quot;: [&quot;KB&quot;],
                    &quot;model&quot;: &quot;KB&quot;,
                    &quot;required&quot;: false,
                    &quot;show&quot;: true,
                },
                &quot;sequence&quot;: {
                    'type': &quot;text&quot;,
                    &quot;label&quot;: &quot;Sequence&quot;,
                    &quot;id&quot;: &quot;sequence&quot;,
                    &quot;model&quot;: &quot;SEQ1&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Sequence is required',
                    ],
                    &quot;show&quot;: true,
                },
                &quot;value&quot;: {
                    &quot;type&quot;: &quot;description_notes&quot;,
                    &quot;label&quot;: &quot;Value&quot;,
                    &quot;id&quot;: &quot;value&quot;,
                    &quot;model&quot;: &quot;VAL&quot;,
                    &quot;required&quot;: true,
                    &quot;rules&quot;: [
                        v =&amp;gt; !!v || 'Value is required',
                    ],
                    &quot;show&quot;: true,
                }
            }
        },
        {
            'title': &quot;Notes&quot;,
            &quot;columns&quot;: 1,
            &quot;fields&quot;: {
                &quot;description&quot;: {
                    &quot;type&quot;: &quot;description_notes&quot;,
                    &quot;label&quot;: &quot;Description&quot;,
                    &quot;id&quot;: &quot;description&quot;,
                    &quot;required&quot;: false,
                    &quot;model&quot;: 'abcde',
                    &quot;show&quot;: true,
                }
            }
        }
    ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;**** 제가 시도했던 출력은 이렇습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;*** &lt;strong papago-id=&quot;3-1&quot;&gt;위와 같이 &lt;/strong&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-1&quot;&gt; 어떤 방법을 사용해야 합니까?&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;criteriaDetails: [
    {&quot;criteriaName&quot;: &quot;CRITERIA 1&quot;}, 
    {&quot;criteriaType&quot;: &quot;Dependent&quot;},
    {&quot;table&quot;: &quot;Table1&quot;},
    {&quot;column&quot;: &quot;Column1&quot;},
    {&quot;joinType&quot;: &quot;OR&quot;},
    {&quot;operator&quot;: &quot;&amp;gt;=&quot;},
    {&quot;valueType&quot;: &quot;SQL&quot;},
    {&quot;dataType&quot;: &quot;NUMBER&quot;},
    {&quot;format&quot;: &quot;Config&quot;},
    {&quot;parameterMandatory&quot;: &quot;YES&quot;},
    {&quot;link&quot;: &quot;KB&quot;},
    {&quot;sequence&quot;: &quot;SEQ1&quot;},
    {&quot;value&quot;: &quot;VAL&quot;},
    {&quot;description&quot;: &quot;abcde&quot;}
]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 코드를 시도했습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const field = this.formFields.map(field =&amp;gt; {
      return Object.entries(field.fields)
})
console.log(field)
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하면 좋을까요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하는 방법.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제발 도와주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;Thanks..
&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;fields&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;model&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 속성:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;const formFields=[{&quot;title&quot;:&quot;Criteria Details&quot;,&quot;columns&quot;:2,&quot;fields&quot;:{&quot;criteriaName&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;label&quot;:&quot;Criteria Name&quot;,&quot;id&quot;:'criteriaName',&quot;model&quot;:&quot;CRITERIA 1&quot;,&quot;required&quot;:!0,&quot;show&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Criteria Name is required',]},&quot;criteriaType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Criteria type&quot;,&quot;id&quot;:&quot;criteriaType&quot;,&quot;options&quot;:['Dependent','Independent','Static'],&quot;model&quot;:&quot;Dependent&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Criteria Type is required',],&quot;show&quot;:!0,},&quot;table&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Table&quot;,&quot;id&quot;:&quot;table&quot;,&quot;options&quot;:[&quot;Table1&quot;],&quot;model&quot;:&quot;Table1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Table is required',],&quot;show&quot;:!0,},&quot;column&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Column&quot;,&quot;id&quot;:&quot;column&quot;,&quot;options&quot;:[&quot;Column1&quot;],&quot;model&quot;:&quot;Column1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Column is required',],&quot;show&quot;:!0,},&quot;joinType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Join Type&quot;,&quot;id&quot;:&quot;joinType&quot;,&quot;options&quot;:[&quot;AND&quot;,&quot;OR&quot;],&quot;model&quot;:&quot;OR&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Join Type is required',],&quot;show&quot;:!0,},&quot;operator&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Operator&quot;,&quot;id&quot;:&quot;operator&quot;,&quot;options&quot;:[&quot;&amp;lt;&quot;,&quot;&amp;lt;=&quot;,&quot;&amp;lt;&amp;gt;&quot;,&quot;=&quot;,&quot;&amp;gt;=&quot;,&quot;&amp;gt;&quot;,&quot;EXISTS&quot;,&quot;IN&quot;,&quot;IS NOT NULL&quot;,&quot;NULL&quot;,&quot;LIKE&quot;,&quot;NOT EXISTS&quot;,&quot;NOT IN&quot;,&quot;NOT LIKE&quot;],&quot;model&quot;:&quot;&amp;gt;=&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Operator is required',],&quot;show&quot;:!0,},&quot;valueType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Value Type&quot;,&quot;id&quot;:&quot;valueType&quot;,&quot;options&quot;:[&quot;Dependent SQL&quot;,&quot;SQL&quot;,&quot;VALUE&quot;],&quot;model&quot;:&quot;SQL&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Value Type is required',],&quot;show&quot;:!0,},&quot;dataType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Data Type&quot;,&quot;id&quot;:&quot;dataType&quot;,&quot;options&quot;:[&quot;DATE&quot;,&quot;NUMBER&quot;,&quot;STRING&quot;],&quot;model&quot;:&quot;NUMBER&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Data Type is required',],&quot;show&quot;:!0,},&quot;format&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;label&quot;:&quot;Format&quot;,&quot;id&quot;:&quot;format&quot;,&quot;model&quot;:&quot;Config&quot;,&quot;required&quot;:!1,&quot;show&quot;:!0,},&quot;parameterMandatory&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Parameter Mandatory&quot;,&quot;id&quot;:&quot;parameterMandatory&quot;,&quot;options&quot;:[&quot;NO&quot;,&quot;YES&quot;],&quot;model&quot;:&quot;YES&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Parameter Mandatory is required',],&quot;show&quot;:!0,},&quot;link&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Link&quot;,&quot;id&quot;:&quot;link&quot;,&quot;options&quot;:[&quot;KB&quot;],&quot;model&quot;:&quot;KB&quot;,&quot;required&quot;:!1,&quot;show&quot;:!0,},&quot;sequence&quot;:{'type':&quot;text&quot;,&quot;label&quot;:&quot;Sequence&quot;,&quot;id&quot;:&quot;sequence&quot;,&quot;model&quot;:&quot;SEQ1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Sequence is required',],&quot;show&quot;:!0,},&quot;value&quot;:{&quot;type&quot;:&quot;description_notes&quot;,&quot;label&quot;:&quot;Value&quot;,&quot;id&quot;:&quot;value&quot;,&quot;model&quot;:&quot;VAL&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Value is required',],&quot;show&quot;:!0,}}},{'title':&quot;Notes&quot;,&quot;columns&quot;:1,&quot;fields&quot;:{&quot;description&quot;:{&quot;type&quot;:&quot;description_notes&quot;,&quot;label&quot;:&quot;Description&quot;,&quot;id&quot;:&quot;description&quot;,&quot;required&quot;:!1,&quot;model&quot;:'abcde',&quot;show&quot;:!0,}}}]
    
const output = [];
formFields.forEach(({ fields }) =&amp;gt; {
  Object.entries(fields).forEach(([key, { model }]) =&amp;gt; {
    output.push({ [key]: model });
  });
});
console.log(output);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;({ fields})&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 class=&quot;papago-parent&quot;&gt;에 상당합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;formFields.forEach((obj) =&amp;gt; {
    Object.entries(obj.fields)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;Object.entries&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 2개의 값을 가진 배열을 반환합니다.첫 번째 값은 현재 키이고 두 번째 값은 키와 관련된 개체입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 때문에, 델의 IT스탭에 의한&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(([key, { model }])&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;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;formFields.forEach((curObj) =&amp;gt; {
  Object.entries(curObj.fields).forEach(([key, fieldValues]) =&amp;gt; {
    output[key] = fieldValues.model;
  });
});
&lt;/code&gt;&lt;/pre&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;const formFields = [{&quot;title&quot;:&quot;Criteria Details&quot;,&quot;columns&quot;:2,&quot;fields&quot;:{&quot;criteriaName&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;label&quot;:&quot;Criteria Name&quot;,&quot;id&quot;:'criteriaName',&quot;model&quot;:&quot;CRITERIA 1&quot;,&quot;required&quot;:!0,&quot;show&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Criteria Name is required',]},&quot;criteriaType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Criteria type&quot;,&quot;id&quot;:&quot;criteriaType&quot;,&quot;options&quot;:['Dependent','Independent','Static'],&quot;model&quot;:&quot;Dependent&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Criteria Type is required',],&quot;show&quot;:!0,},&quot;table&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Table&quot;,&quot;id&quot;:&quot;table&quot;,&quot;options&quot;:[&quot;Table1&quot;],&quot;model&quot;:&quot;Table1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Table is required',],&quot;show&quot;:!0,},&quot;column&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Column&quot;,&quot;id&quot;:&quot;column&quot;,&quot;options&quot;:[&quot;Column1&quot;],&quot;model&quot;:&quot;Column1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Column is required',],&quot;show&quot;:!0,},&quot;joinType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Join Type&quot;,&quot;id&quot;:&quot;joinType&quot;,&quot;options&quot;:[&quot;AND&quot;,&quot;OR&quot;],&quot;model&quot;:&quot;OR&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Join Type is required',],&quot;show&quot;:!0,},&quot;operator&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Operator&quot;,&quot;id&quot;:&quot;operator&quot;,&quot;options&quot;:[&quot;&amp;lt;&quot;,&quot;&amp;lt;=&quot;,&quot;&amp;lt;&amp;gt;&quot;,&quot;=&quot;,&quot;&amp;gt;=&quot;,&quot;&amp;gt;&quot;,&quot;EXISTS&quot;,&quot;IN&quot;,&quot;IS NOT NULL&quot;,&quot;NULL&quot;,&quot;LIKE&quot;,&quot;NOT EXISTS&quot;,&quot;NOT IN&quot;,&quot;NOT LIKE&quot;],&quot;model&quot;:&quot;&amp;gt;=&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Operator is required',],&quot;show&quot;:!0,},&quot;valueType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Value Type&quot;,&quot;id&quot;:&quot;valueType&quot;,&quot;options&quot;:[&quot;Dependent SQL&quot;,&quot;SQL&quot;,&quot;VALUE&quot;],&quot;model&quot;:&quot;SQL&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Value Type is required',],&quot;show&quot;:!0,},&quot;dataType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Data Type&quot;,&quot;id&quot;:&quot;dataType&quot;,&quot;options&quot;:[&quot;DATE&quot;,&quot;NUMBER&quot;,&quot;STRING&quot;],&quot;model&quot;:&quot;NUMBER&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Data Type is required',],&quot;show&quot;:!0,},&quot;format&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;label&quot;:&quot;Format&quot;,&quot;id&quot;:&quot;format&quot;,&quot;model&quot;:&quot;Config&quot;,&quot;required&quot;:!1,&quot;show&quot;:!0,},&quot;parameterMandatory&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Parameter Mandatory&quot;,&quot;id&quot;:&quot;parameterMandatory&quot;,&quot;options&quot;:[&quot;NO&quot;,&quot;YES&quot;],&quot;model&quot;:&quot;YES&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Parameter Mandatory is required',],&quot;show&quot;:!0,},&quot;link&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Link&quot;,&quot;id&quot;:&quot;link&quot;,&quot;options&quot;:[&quot;KB&quot;],&quot;model&quot;:&quot;KB&quot;,&quot;required&quot;:!1,&quot;show&quot;:!0,},&quot;sequence&quot;:{'type':&quot;text&quot;,&quot;label&quot;:&quot;Sequence&quot;,&quot;id&quot;:&quot;sequence&quot;,&quot;model&quot;:&quot;SEQ1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Sequence is required',],&quot;show&quot;:!0,},&quot;value&quot;:{&quot;type&quot;:&quot;description_notes&quot;,&quot;label&quot;:&quot;Value&quot;,&quot;id&quot;:&quot;value&quot;,&quot;model&quot;:&quot;VAL&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Value is required',],&quot;show&quot;:!0,}}},{'title':&quot;Notes&quot;,&quot;columns&quot;:1,&quot;fields&quot;:{&quot;description&quot;:{&quot;type&quot;:&quot;description_notes&quot;,&quot;label&quot;:&quot;Description&quot;,&quot;id&quot;:&quot;description&quot;,&quot;required&quot;:!1,&quot;model&quot;:'abcde',&quot;show&quot;:!0,}}}]
let result = []
formFields.forEach(item =&amp;gt; {
    const entries = Object.entries(item.fields)
    entries.forEach(([key, { model }]) =&amp;gt; {
        result.push({
            [key]: model
        })
    })
})
console.log(result)&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하는 방법은 여러 가지가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array.prototype.reduce()&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;Object.entries&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키와 값을 추출하는 정적 방법&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const formFields=[{&quot;title&quot;:&quot;Criteria Details&quot;,&quot;columns&quot;:2,&quot;fields&quot;:{&quot;criteriaName&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;label&quot;:&quot;Criteria Name&quot;,&quot;id&quot;:'criteriaName',&quot;model&quot;:&quot;CRITERIA 1&quot;,&quot;required&quot;:!0,&quot;show&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Criteria Name is required',]},&quot;criteriaType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Criteria type&quot;,&quot;id&quot;:&quot;criteriaType&quot;,&quot;options&quot;:['Dependent','Independent','Static'],&quot;model&quot;:&quot;Dependent&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Criteria Type is required',],&quot;show&quot;:!0,},&quot;table&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Table&quot;,&quot;id&quot;:&quot;table&quot;,&quot;options&quot;:[&quot;Table1&quot;],&quot;model&quot;:&quot;Table1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Table is required',],&quot;show&quot;:!0,},&quot;column&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Column&quot;,&quot;id&quot;:&quot;column&quot;,&quot;options&quot;:[&quot;Column1&quot;],&quot;model&quot;:&quot;Column1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Column is required',],&quot;show&quot;:!0,},&quot;joinType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Join Type&quot;,&quot;id&quot;:&quot;joinType&quot;,&quot;options&quot;:[&quot;AND&quot;,&quot;OR&quot;],&quot;model&quot;:&quot;OR&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Join Type is required',],&quot;show&quot;:!0,},&quot;operator&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Operator&quot;,&quot;id&quot;:&quot;operator&quot;,&quot;options&quot;:[&quot;&amp;lt;&quot;,&quot;&amp;lt;=&quot;,&quot;&amp;lt;&amp;gt;&quot;,&quot;=&quot;,&quot;&amp;gt;=&quot;,&quot;&amp;gt;&quot;,&quot;EXISTS&quot;,&quot;IN&quot;,&quot;IS NOT NULL&quot;,&quot;NULL&quot;,&quot;LIKE&quot;,&quot;NOT EXISTS&quot;,&quot;NOT IN&quot;,&quot;NOT LIKE&quot;],&quot;model&quot;:&quot;&amp;gt;=&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Operator is required',],&quot;show&quot;:!0,},&quot;valueType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Value Type&quot;,&quot;id&quot;:&quot;valueType&quot;,&quot;options&quot;:[&quot;Dependent SQL&quot;,&quot;SQL&quot;,&quot;VALUE&quot;],&quot;model&quot;:&quot;SQL&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Value Type is required',],&quot;show&quot;:!0,},&quot;dataType&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Data Type&quot;,&quot;id&quot;:&quot;dataType&quot;,&quot;options&quot;:[&quot;DATE&quot;,&quot;NUMBER&quot;,&quot;STRING&quot;],&quot;model&quot;:&quot;NUMBER&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Data Type is required',],&quot;show&quot;:!0,},&quot;format&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;label&quot;:&quot;Format&quot;,&quot;id&quot;:&quot;format&quot;,&quot;model&quot;:&quot;Config&quot;,&quot;required&quot;:!1,&quot;show&quot;:!0,},&quot;parameterMandatory&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Parameter Mandatory&quot;,&quot;id&quot;:&quot;parameterMandatory&quot;,&quot;options&quot;:[&quot;NO&quot;,&quot;YES&quot;],&quot;model&quot;:&quot;YES&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Parameter Mandatory is required',],&quot;show&quot;:!0,},&quot;link&quot;:{&quot;type&quot;:&quot;select&quot;,&quot;label&quot;:&quot;Link&quot;,&quot;id&quot;:&quot;link&quot;,&quot;options&quot;:[&quot;KB&quot;],&quot;model&quot;:&quot;KB&quot;,&quot;required&quot;:!1,&quot;show&quot;:!0,},&quot;sequence&quot;:{'type':&quot;text&quot;,&quot;label&quot;:&quot;Sequence&quot;,&quot;id&quot;:&quot;sequence&quot;,&quot;model&quot;:&quot;SEQ1&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Sequence is required',],&quot;show&quot;:!0,},&quot;value&quot;:{&quot;type&quot;:&quot;description_notes&quot;,&quot;label&quot;:&quot;Value&quot;,&quot;id&quot;:&quot;value&quot;,&quot;model&quot;:&quot;VAL&quot;,&quot;required&quot;:!0,&quot;rules&quot;:[v=&amp;gt;!!v||'Value is required',],&quot;show&quot;:!0,}}},{'title':&quot;Notes&quot;,&quot;columns&quot;:1,&quot;fields&quot;:{&quot;description&quot;:{&quot;type&quot;:&quot;description_notes&quot;,&quot;label&quot;:&quot;Description&quot;,&quot;id&quot;:&quot;description&quot;,&quot;required&quot;:!1,&quot;model&quot;:'abcde',&quot;show&quot;:!0,}}}]

const output = formFields.reduce((accumulator, { fields }) =&amp;gt; {
  return Object.assign(accumulator, Object.entries(fields)
    .reduce((accumulatorInside, [key, { model }]) =&amp;gt; {
      accumulatorInside[key] = model;
      return accumulatorInside;
    }, {})
  )
}, {});

console.log(output);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 루프를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const output = {};

for (let index = 0; index &amp;lt; formFields.length; index++) {
  for (let key in formFields[index].fields) {
    if (formFields[index].fields.hasOwnProperty(key))
      output[key] = formFields[index].fields[key].model;
  }
}

console.log(output);
&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;Array.prototype.forEach()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(@performance answer에서, 그것도 상향 조정)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const output = {};

formFields.forEach(({ fields }) =&amp;gt; {
  Object.entries(fields).forEach(([key, { model }]) =&amp;gt; {
    output[key] = model;
  });
});

console.log(output);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든 기본적인 생각은 같다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성에서 반복하여 값을 설정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능 관점에서: 범위를 벗어나는 폐쇄는 그렇지 않은 기능보다 느리고,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for...in&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프가 가장 빠르지만 가장 상세하게 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조심해!&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for...in&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프에는 몇 가지 경고가 있습니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 소유물 검사를 하는 이유는 시제품 복사를 방지하기 위해서입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 루프의 유일한 문제입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 다음 명령을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환된 어레이와 함께 루프&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Object.getOWnPropertyNames()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시제품을 이동하지 않고 안전하기 때문에 정적 방법을 사용하는 대신 시간이 더 복잡해집니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 부작용을 원하지 않을 때 고려해야 할 사항입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array.prototype.forEach()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 가능한 한 많은 속도를 코드에서 짜내야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/53514883/&lt;a href=&quot;https://stackoverflow.com/questions/53514883/how-to-map-key-values-in-sub-sub-objects-from-an-array-in-java-script&quot; target=&quot;_blank&quot; papago-id=&quot;30-1&quot;&gt;how-to-map-key-values-in-sub-sub-objects-from-an-array-in-java-script&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2335</guid>
      <comments>https://prostudy.tistory.com/2335#entry2335comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:03:05 +0900</pubDate>
    </item>
    <item>
      <title>일식이 시작되지 않음 - Java 가상 시스템을 찾을 수 없습니다.</title>
      <link>https://prostudy.tistory.com/2334</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일식이 시작되지 않음 - Java 가상 시스템을 찾을 수 없습니다.&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;Eclipse는 어제 정상적으로 동작하고 있었습니다(약 1년 전 설치 후).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기동시에 갑자기 다음의 에러가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the following locations:
C:\Program Files\eclipse\jre\bin\javaw.exe
javaw.exe in your current PATH&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;머신에 관련된 Eclipse/Java는 변경하지 않았습니다만, 어제 Windows 업데이트가 머신에 적용되었기 때문에, 그것과 관계가 있을지도 모릅니다(Java에 영향을 주는 것은 없습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PATH에 무언가를 추가하거나 Eclipse ini에 -vm 옵션을 추가하거나(이것을 실행할 수 없음), jre 폴더를 Eclipse\jre에 복사하는 것에 대한 다른 모든 게시물을 살펴보았습니다(이는 효과가 있었지만 장기적으로는 좋지 않은 것 같습니다).&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;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;Windows 7, Eclipse Helios and Java 1.6.0_26.&lt;/code&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;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;5-0&quot;&gt;권장방법&lt;/strong&gt; : 고객님의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eclipse.ini&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 jdk 설치를 가리키고 있는지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://wiki.eclipse.org/Eclipse.ini#-vm_value:_Windows_Example&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;자세한&lt;/a&gt; 것은 이쪽.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;꼭 추가해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-vm&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;before &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-vmargs&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★ 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 인(Pass )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;vm&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 class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://wiki.eclipse.org/FAQ_How_do_I_run_Eclipse%3F#Find_the_JVM&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;http://wiki.eclipse.org/FAQ_How_do_I_run_Eclipse%3F#Find_the_JVM&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;11-0&quot;&gt;주의&lt;/em&gt;: 이클립스는 JAVA_를 참조하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;HOME 환경 변수.&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;Java 버전과 Eclipse가 모두 동일한 아키텍처에 속해 있는지 확인하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;64비트 일식을 위해 64비트 Java를 설치합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일식&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ini:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;--launcher.defaultAction  
--launcher.XXMaxPermSize  
256M  
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize&amp;lt;br/&amp;gt;
256m  
--launcher.defaultAction  
openFile  
-showsplash  
org.eclipse.platform
-vm
C:\Program Files\Java\jdk1.7.0_21\jre\bin\server\jvm.dll&amp;lt;br/&amp;gt;
--launcher.XXMaxPermSize  
256m  
--launcher.defaultAction  
openFile  
-vmargs  
-Dosgi.requiredJavaVersion=1.7  
&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;font class=&quot;papago-parent&quot;&gt;반드시 처음일 필요는 없지만 파일 끝에는 있을 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저 같은 경우에는 부족한 게 거의 없었어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Eclipse가 64비트 버전인 동안 64비트의 JDK와 JRE를 설치하지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;완료 후 PATH 변수 이클립스로 JDK\bin 경로를 설정하면 정상적으로 동작합니다.&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;eclipse.ini&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;file besides &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eclipse.exe&lt;/code&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;-vm
C:\Program Files\Java\jdk1.7.0_21\jre\bin\server\jvm.dll 
 //find it if you are having another JDK version.
&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;strong papago-id=&quot;19-1&quot;&gt;그리고 넌 가도 돼&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바 업데이트 후에도 같은 문제가 발생하였습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 붙인다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-vm
C:\Program Files\Java\jre6\bin\javaw.exe
&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;를 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;javaw.exe&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;eclipse.ini&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;filename을 클릭합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 도움이 되길 바라.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 같은 문제가 있었어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PATH env 변수를 파괴한 것은, 인스톨 한 프로그램입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PATH 환경변수를 확인합니다.&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;Java 경로를 설정한 후 일식을 열 수 없는 경우 다음 단계를 수행하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일식을 추출한 이클립스 폴더로 이동합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/7MmNU.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/7MmNU.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모장에서 Eclipse 파일 열기(기본적으로 메모장에서 열림)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 줄 입력&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-vm
C:/Program Files/Java/jdk-11.0.2/bin/javaw.exe
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jdk-11.0.2. 위의 위치에서 얻을 수 있는 Java 버전이어야 합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/01Rpt.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/01Rpt.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;2&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫번째&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Java 32와 64비트가 모두 설치되어 있는지 확인합니다.&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;Windows에서의 경로 설정&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;윈도 8&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마우스 포인터를 화면 오른쪽 하단 모서리로 끕니다.&lt;/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;Search(검색) 아이콘을 클릭하고 다음을 입력합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제어판&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[컨트롤 패널]-&amp;gt; [시스템]-&amp;gt; [상세설정]을 클릭합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경변수를 클릭하고 시스템변수에서 PATH를 찾아 클릭합니다.&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;[편집(Edit)]창에서 클래스 위치를 PATH 값에 추가하여 PATH를 변경하거나 변수 이름이 모두 대문자인지 확인합니다.&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;PATH 항목이 없는 경우 새 변수를 추가하고 이름으로 PATH를 추가하고 값으로 클래스의 위치를 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;창문을 닫으세요.&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;명령 프롬프트 창을 다시 열고 Java 코드를 실행합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Puppet ATG 설치 Centos 경유.&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PATH에서 Java 가상 시스템을 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;47&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;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;학습 변수&lt;strong papago-id=&quot;48-1&quot;&gt;:&lt;/strong&gt;&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;$syslog_home=&quot;/opt/syslog/product/syslog/jdk1.8.0_45/bin&quot;&lt;/font&gt;&lt;/strong&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;이 &quot;{$&lt;strong papago-id=&quot;50-1&quot;&gt;java_home}&quot;&lt;/strong&gt; Java Exec 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;require common, java
Exec {
    path =&amp;gt; [ &quot;${java_home}&quot;, &quot;/usr/bin&quot;, &quot;/bin&quot;, &quot;/usr/sbin&quot;, &quot;${temp_directory}&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;strong papago-id=&quot;51-1&quot;&gt;Centos&lt;/strong&gt; 7에서는 이 문제를 해결했습니다(큰 문제가 발생한 후).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yum upgrade&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;vm&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;/p&gt; 
&lt;p&gt;&lt;code&gt;~/eclipse/java-oxygen/eclipse/eclipse.ini&lt;/code&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대상:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-vm
/etc/alternatives/jre/bin
&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 class=&quot;papago-parent&quot;&gt;은,  최신의 인스톨을 ).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;java&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;/p&gt;&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Eclipse가 JRE/JDK를 찾지 못하거나 잘못된 버전을 찾지 못할 경우 다음 두 줄을 Eclipse&lt;em papago-id=&quot;57-1&quot;&gt;&lt;strong papago-id=&quot;57-1-0&quot;&gt;.ini&lt;/strong&gt;&lt;/em&gt; 파일의 선두에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-vm
[your-path-to-java-executable]
&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;32비트 버전의 Java를 다운로드하여 설치한 후 경로를 설정합니다.&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;Oracle 사이트로 이동하여 Java SDK를 검색하십시오. 동일한 Eclipse 아키텍처(x86, x64)를 사용하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 이런 일이 있었어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 자바우를 찾았어&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C의 exe:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;\Windows\&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows 업데이트 후 System32가 삭제되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 번 더 복사하면 이클립스는 잘 시작했어&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Check os, eclipse 및 Java가 32비트인지 64비트인지 여부&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;JRE 폴더를 이클립스 디렉토리에 복사할 수도 있습니다.이 폴더는 정상적으로 동작합니다.&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;자바버전이 업데이트 되어 기계에서 문제가 발생하였습니다(60에서 66).&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;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &lt;strong papago-id=&quot;64-1&quot;&gt;파일에서는,&lt;/strong&gt; 이클립스.&lt;strong papago-id=&quot;64-1&quot;&gt;ini&lt;/strong&gt; 를 인스톨 하고 있는 경우에 사용할 수 있습니다(&lt;strong papago-id=&quot;64-3&quot;&gt;예&lt;/strong&gt;: C:\Program Files\Java\jre1.8.0_66\bin).&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우 설치된 버전이 jre1.8.0_60이므로 눈에 띄지 않을 수도 있습니다(60이 아닌 66).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트하면 열 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PATH 등이 올바르게 설정되어 있는 상태로, 어제 같은 문제가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령줄에서 열 수 있으며, 지금 바로 두 번 클릭하기만 하면 됩니다.&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;지금은 &quot;&lt;strong papago-id=&quot;67-1&quot;&gt;관리자&lt;/strong&gt;로서 실행&quot;&lt;strong papago-id=&quot;67-1&quot;&gt;하기&lt;/strong&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;Java 폴더가 업데이트될 때 이 문제가 발생할 수 있습니다.&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;Eclipse 폴더를 열고 eclipse.ini 파일을 검색합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;exclipse.ini 파일을 열고 jre 버전이 Java 폴더에서 사용 가능한 jre와 동일한지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JRE가 jre1.8.0_101에서 jre1.8.0_111로 변경되었을 때도 같은 문제가 있었습니다.&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;C:\Program Files\Java\jre1.8.0_101\bin에서 C:\Program Files\Java\jre1.8.0_111\bin으로&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;이 경우 패스가 따옴표(&quot;)로 둘러싸인 것이 문제였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-vm 
&quot;C:\Program Files\Java\jdk1.8.0_25\bin&quot;
&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;-vm 
C:\Program Files\Java\jdk1.8.0_25\bin
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 솔루션은 &lt;strong papago-id=&quot;74-1&quot;&gt;PATH에 JDK&lt;/strong&gt;의 &quot;&lt;strong papago-id=&quot;74-1&quot;&gt;bin&quot; 디렉토리를 포함&lt;/strong&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;/font&gt;&lt;/font&gt;&lt;code&gt;PATH&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경 변수&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Windows 7/8/10:&lt;/code&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왼쪽 페인으로 [컨트롤 패널] ( [ ( Optional ) System and Security ]⇒ [ System ]⇒ [ Advanced System settings ]을 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[ Advanced ]탭으로 전환 push [ Environment Variables ]버튼을 누릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시스템 변수(아래쪽 창)에서 아래로 스크롤하여 &quot;경로&quot;를 선택하고 &quot;편집&quot;을 클릭합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&quot;.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JDK bin 디렉토리를 JAVA 폴더에서 복사하여 &quot;Edit..&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&quot;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jdk 패스는 일식 중에 변경해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ini 여기:&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;/Users/you_username/eclipse/jee-photon/Eclipse.app/Contents/Eclipse/Eclipse.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ini&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;이클립스를재시작한후:)&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12426810/&lt;a href=&quot;https://stackoverflow.com/questions/12426810/eclipse-wont-start-no-java-virtual-machine-was-found&quot; target=&quot;_blank&quot; papago-id=&quot;83-1&quot;&gt;eclipse-wont-start-no-java-virtual-machine-was-found&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2334</guid>
      <comments>https://prostudy.tistory.com/2334#entry2334comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:02:12 +0900</pubDate>
    </item>
    <item>
      <title>Javascript를 사용하여 DOM 요소를 대체하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2333</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Javascript를 사용하여 DOM 요소를 대체하려면 어떻게 해야 합니까?&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;DOM의 요소를 교환하려고 합니다.&lt;/font&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;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대체하고 싶은 요소&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;span&amp;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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 어떻게 가서 그걸 하겠어?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Node/replaceChild&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;replace&lt;/a&gt; Child&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Node/replaceChild&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;()&lt;/a&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;div&amp;gt;
    &amp;lt;a id=&quot;myAnchor&quot; href=&quot;http://www.stackoverflow.com&quot;&amp;gt;StackOverflow&amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;script type=&quot;text/JavaScript&quot;&amp;gt;
  var myAnchor = document.getElementById(&quot;myAnchor&quot;);
  var mySpan = document.createElement(&quot;span&quot;);
  mySpan.innerHTML = &quot;replaced anchor!&quot;;
  myAnchor.parentNode.replaceChild(mySpan, myAnchor);
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h1 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/replaceWith&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-0&quot;&gt;&lt;code papago-id=&quot;7-0-0&quot;&gt;A.replaceWith(span)&lt;/code&gt;&lt;/a&gt; - 부모 불필요&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반 양식:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;target.replaceWith(element)
&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&gt;&lt;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 예:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A.replaceWith(span)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고도의 사용법&lt;/font&gt;&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 값을 전달할 수 있습니다(또는 산포 연산자 사용).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;...&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;임의의 문자열 값이 텍스트 요소로 추가됩니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;15&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;// Initially [child1, target, child3]

target.replaceWith(span, &quot;foo&quot;)     // [child1, span, &quot;foo&quot;, child3]

const list = [&quot;bar&quot;, span]
target.replaceWith(...list, &quot;fizz&quot;)  // [child1, &quot;bar&quot;, span, &quot;fizz&quot;, child3]
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&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;null&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;/h3&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;타겟이 null이 될 가능성이 있는 경우 newish를 사용하는 것을 고려할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;?.&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;em papago-id=&quot;9-0&quot;&gt;옵션 체인&lt;/em&gt; 연산자.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대상이 존재하지 않으면 아무 일도 일어나지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/62824031/974045&quot; papago-id=&quot;9-2&quot;&gt;자세한&lt;/a&gt; 것은 이쪽.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;target?.replaceWith?.(element)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 DOM 방식&lt;/font&gt;&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/45656649/974045&quot; papago-id=&quot;10-0&quot;&gt;상세보기&lt;/a&gt; -&lt;/font&gt;&lt;/font&gt;&lt;code&gt;child.before&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;child.after&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/43838105/974045&quot; papago-id=&quot;12-0&quot;&gt;상세보기&lt;/a&gt; -&lt;/font&gt;&lt;/font&gt;&lt;code&gt;parent.prepend&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;parent.append&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/replaceWith&quot; rel=&quot;noreferrer&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mozilla 문서&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://caniuse.com/#feat=dom-manip-convenience&quot; rel=&quot;noreferrer&quot; papago-id=&quot;26-0&quot;&gt;지원&lt;/a&gt; 대상 브라우저 - 22년2월 96 %&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;var a = A.parentNode.replaceChild(document.createElement(&quot;span&quot;), A);
&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;a는 치환된A 요소입니다&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;이 질문은 매우 오래되었지만, Microsoft 인증을 받기 위해 공부하고 있는 자신을 발견했고, 학습서에서는 다음과 같은 질문을 사용할 것을 제안했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;oldElement.replaceNode(newElement)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검색해보니 IE에서만 지원되는 것 같아요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;도...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그냥 재밌는 쪽지로 여기에 넣어야겠다고 생각했어요;)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 비슷한 문제가 있어서 이 실을 찾았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;교체는 제게는 효과가 없었고, 부모님 곁으로 가는 것은 제 처지에 있어서 어려웠습니다.&lt;/font&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 class=&quot;papago-parent&quot;&gt;HTML이 작업을 완료했습니다.&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;currEl = &amp;lt;div&amp;gt;hello&amp;lt;/div&amp;gt;
newElem = &amp;lt;span&amp;gt;Goodbye&amp;lt;/span&amp;gt;
currEl.outerHTML = newElem
# currEl = &amp;lt;span&amp;gt;Goodbye&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;HTML Element&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Node&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&gt;&lt;/font&gt;&lt;code&gt;Node.replaceWith(newNode)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예에서는 오리진노드에서 모든 Atribute와 서브를 유지해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const links = document.querySelectorAll('a')

links.forEach(link =&amp;gt; {
  const replacement = document.createElement('span')
  
  // copy attributes
  for (let i = 0; i &amp;lt; link.attributes.length; i++) {
     const attr = link.attributes[i]
     replacement.setAttribute(attr.name, attr.value)
  }
  
  // copy content
  replacement.innerHTML = link.innerHTML
  
  // or you can use appendChild instead
  // link.childNodes.forEach(node =&amp;gt; replacement.appendChild(node))

  link.replaceWith(replacement)
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 요소가 있는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;#link-1&quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;#link-2&quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;#link-3&quot;&amp;gt;Link 3&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;#link-4&quot;&amp;gt;Link 4&amp;lt;/a&amp;gt;
&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 class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;span href=&quot;#link-1&quot;&amp;gt;Link 1&amp;lt;/span&amp;gt;
&amp;lt;span href=&quot;#link-2&quot;&amp;gt;Link 2&amp;lt;/span&amp;gt;
&amp;lt;span href=&quot;#link-3&quot;&amp;gt;Link 3&amp;lt;/span&amp;gt;
&amp;lt;span href=&quot;#link-4&quot;&amp;gt;Link 4&amp;lt;/span&amp;gt;
&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;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;39-3&quot;&gt;&lt;code papago-id=&quot;39-3-0&quot;&gt;createElement&lt;/code&gt;&lt;/a&gt;를 만든 후 대상 요소의 상위 요소에서 를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const newElement = document.createElement(/*...*/);
const target = document.getElementById(&quot;my-table&quot;);
target.parentNode.replaceChild(newElement, target);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 요소의 시작점이 HTML인 경우 부모(또는 현대 환경에서는 요소 자체)에서 를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const target = document.getElementById(&quot;my-table&quot;);
target.insertAdjacentHTML(&quot;afterend&quot;, theHTMLForTheNewElement);
target.parentNode.removeChild(target); // Or: `target.remove()`
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 좋은 방법이야.&lt;/font&gt;&lt;font 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;Element.outerHTML = template;&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Get the current element
var currentNode = document.querySelector('#greeting');

// Replace the element
currentNode.outerHTML =
    '&amp;lt;div id=&quot;salutations&quot;&amp;gt;' +
        '&amp;lt;h1&amp;gt;Hi, universe!&amp;lt;/h1&amp;gt;' +
        '&amp;lt;p&amp;gt;The sun is always shining!&amp;lt;/p&amp;gt;' +
    '&amp;lt;/div&amp;gt;';
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;LI 요소의 치환 예&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function (element) {
    let li = element.parentElement;
    let ul = li.parentNode;   
    if (li.nextSibling.nodeName === 'LI') {
        let li_replaced = ul.replaceChild(li, li.nextSibling);
        ul.insertBefore(li_replaced, li);
    }
}
&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;var parent = document.createElement(&quot;div&quot;);
var child = parent.appendChild(document.createElement(&quot;a&quot;));
var span = document.createElement(&quot;span&quot;);

// for IE
if(&quot;replaceNode&quot; in child)
  child.replaceNode(span);

// for other browsers
if(&quot;replaceWith&quot; in child)
  child.replaceWith(span);

console.log(parent.outerHTML);
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/843680/&lt;a href=&quot;https://stackoverflow.com/questions/843680/how-to-replace-dom-element-in-place-using-javascript&quot; target=&quot;_blank&quot; papago-id=&quot;44-1&quot;&gt;how-to-replace-dom-element-in-place-using-javascript&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2333</guid>
      <comments>https://prostudy.tistory.com/2333#entry2333comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:00:50 +0900</pubDate>
    </item>
    <item>
      <title>C에서의 템플릿 시뮬레이션(큐 데이터 타입의 경우)</title>
      <link>https://prostudy.tistory.com/2332</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서의 템플릿 시뮬레이션(큐 데이터 타입의 경우)&lt;/font&gt;&lt;/h2&gt;
&lt;p&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;queue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다아다&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에는 '큐'만  수 .&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;큐에 저장할 수 있는 것은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 것은 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C++&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;, &quot; &quot;의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C&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;#define&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;queue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 모든 데이터 유형을 포함할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&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;strong papago-id=&quot;8-0&quot;&gt;:&lt;/strong&gt; 사용하고 싶지 &lt;strong papago-id=&quot;8-0&quot;&gt;않습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;void*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조금 위험하고 이상한 런타임 에러를 일으키기 쉽다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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;h2 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿 리스트 작성&lt;/font&gt;&lt;/h2&gt; 
&lt;h3 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;목록을 정의할 매크로&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 다음과 같이 부릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;define_list(type)&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 class=&quot;papago-parent&quot;&gt;그런 다음 목록의 모든 함수에 대한 함수 포인터를 포함하는 글로벌 구조를 만들고 목록의 각 인스턴스에서 해당 글로벌 구조에 대한 포인터를 가집니다(&lt;a href=&quot;https://en.wikipedia.org/wiki/Virtual_method_table&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;가상 메서드&lt;/a&gt; 테이블과 얼마나 유사한지 주의).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 종류의 것:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;#define define_list(type) \
\
    struct _list_##type; \
    \
    typedef struct \
    { \
        int (*is_empty)(const struct _list_##type*); \
        size_t (*size)(const struct _list_##type*); \
        const type (*front)(const struct _list_##type*); \
        void (*push_front)(struct _list_##type*, type); \
    } _list_functions_##type; \
    \
    typedef struct _list_elem_##type \
    { \
        type _data; \
        struct _list_elem_##type* _next; \
    } list_elem_##type; \
    \
    typedef struct _list_##type \
    { \
        size_t _size; \
        list_elem_##type* _first; \
        list_elem_##type* _last; \
        _list_functions_##type* _functions; \
    } List_##type; \
    \
    List_##type* new_list_##type(); \
    bool list_is_empty_##type(const List_##type* list); \
    size_t list_size_##type(const List_##type* list); \
    const type list_front_##type(const List_##type* list); \
    void list_push_front_##type(List_##type* list, type elem); \
    \
    bool list_is_empty_##type(const List_##type* list) \
    { \
        return list-&amp;gt;_size == 0; \
    } \
    \
    size_t list_size_##type(const List_##type* list) \
    { \
        return list-&amp;gt;_size; \
    } \
    \
    const type list_front_##type(const List_##type* list) \
    { \
        return list-&amp;gt;_first-&amp;gt;_data; \
    } \
    \
    void list_push_front_##type(List_##type* list, type elem) \
    { \
        ... \
    } \
    \
    _list_functions_##type _list_funcs_##type = { \
        &amp;amp;list_is_empty_##type, \
        &amp;amp;list_size_##type, \
        &amp;amp;list_front_##type, \
        &amp;amp;list_push_front_##type, \
    }; \
    \
    List_##type* new_list_##type() \
    { \
        List_##type* res = (List_##type*) malloc(sizeof(List_##type)); \
        res-&amp;gt;_size = 0; \
        res-&amp;gt;_first = NULL; \
        res-&amp;gt;_functions = &amp;amp;_list_funcs_##type; \
        return res; \
    }

#define List(type) \
    List_##type

#define new_list(type) \
    new_list_##type()
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범용 인터페이스&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;16&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-c prettyprint-override&quot;&gt;&lt;code&gt;#define is_empty(collection) \
    collection-&amp;gt;_functions-&amp;gt;is_empty(collection)

#define size(collection) \
    collection-&amp;gt;_functions-&amp;gt;size(collection)

#define front(collection) \
    collection-&amp;gt;_functions-&amp;gt;front(collection)

#define push_front(collection, elem) \
    collection-&amp;gt;_functions-&amp;gt;push_front(collection, elem)
&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;h3 papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 예&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;19&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-c prettyprint-override&quot;&gt;&lt;code&gt;/* Define the data structures you need */
define_list(int)
define_list(float)

int main()
{
    List(int)* a = new_list(int);
    List(float)* b = new_list(float);

    push_front(a, 5);
    push_front(b, 5.2);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 정말로 C에 어떤 종류의 템플릿을 가지고 싶다면 당신은 그 정도의 트릭을 사용할 수 있지만, 그것은 다소 추하다(C++를 사용하면 더 간단하다).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 않습니다.즉, 1개의 포인터를 저장할 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;void*&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;포인터, yeah \o/)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시는 그것을 사용하지 않기를 바랍니다.p&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;22&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;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 실제 템플릿이 아닌 텍스트 대체 매크로를 사용하기 때문에 몇 가지 제한이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1회 정의&lt;/font&gt;&lt;/h3&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 유닛당 각 타입을 1회만 정의할 수 있습니다.&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;define_&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★★★★★★★★★★★★★.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 단어 유형&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;List&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;signed char&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;unsigned long&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;const bar&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;struct foo&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;char*&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;void*&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;typedef&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;그런 타입부터.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;define_list(int) /* OK */
define_list(char*) /* Error: pointer */
define_list(unsigned long) /* Error: several words */

typedef char* char_ptr;
typedef unsigned long ulong;
define_list(char_ptr) /* OK */
define_list(ulong) /* OK */
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중첩 목록을 작성하려면 동일한 트릭을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 건 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define&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; 's'라고 할 수 있을 거예요&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;queue.h:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define TYPE int
#define TYPED_NAME(x) int_##x
#include &quot;queue_impl.h&quot;
#undef TYPE
#undef TYPED_NAME

#define TYPE float
#define TYPED_NAME(x) float_##x
#include &quot;queue_impl.h&quot;
#undef TYPE
#undef TYPED_NAME
...
&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;queue_module을 클릭합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;h:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//no include guard, of course
typedef struct
{
    TYPE *data;
    ...
} TYPED_NAME(queue);

void TYPED_NAME(queue_insert) (TYPED_NAME(queue) *queue, TYPE data)
{
    ...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 전문가가 에 100%는 확실치 는, 구조(100%의 「」, 「전처리를  수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int_queue&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;float_queue&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;void int_queue_insert(int_queue *queue, int data);
void float_queue_insert(float_queue *queue, float data);
&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; ', 는 '템플릿'의 5행 과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;queue.h&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 구현은 한 번만 작성하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 인터페이스를 완전히 일치시킬 수 없지만 최소한 완벽한 타입 세이프 큐템플릿을 얻을 수 있습니다(C는 오버로드된 함수를 지원하지 않기 때문에 함수는 타입명을 전송해야 합니다).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;void* 데이터를 포함하는 큐를 구현하고 이 void*를 모든 유형 또는 int와 같은 원시 유형에 대한 포인터로 해석합니다.&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;#define을 사용하는 것은 가능하지만, 디버깅에 대해 생각해 보십시오.무슨 문제가 있으면...&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;오랫동안 궁금했는데, 이제 누구나 이해할 수 있는 확답이 생겼으니 봐!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Data Structures 코스를 수강할 때 Standish의 &quot;Data Structures, Algorithms in C&quot;라는 책을 읽어야 했습니다.그것은 고통스러웠습니다.제너릭도 없고, 빈약한 표기법도 없고, 영장도 없는 글로벌 상태 돌연변이도 가득했습니다.하지만 저는 그의 코드 스타일을 채택하는 것이 미래의 모든 프로젝트를 망친다는 것을 알고 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 좋은 방법, 그러니까 더 좋은 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만져보기 전의 모습입니다(사실 인간이 읽을 수 있는 포맷으로 만들기 위해 만진 것입니다). 정말 보기 흉하고 여러 가지 면에서 틀렸습니다만, 참고용으로 일람표시를 하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define MaxIndex 100

int Find(int A[])
{
    int j;

    for (j = 0; j &amp;lt; MaxIndex; ++j) {
        if (A[j] &amp;lt; 0) {
            return j;
        }
    }

    return -1;
}

int main(void)
{
    // reminder: MaxIndex is 100.
    int A[MaxIndex];

    /**
     * anonymous scope #1
     *     initialize our array to [0..99],
     *     then set 18th element to its negative value(-18)
     *     to make the search more interesting.
     */
    {
        // loop index, nothing interesting here.
        int i;

        // initialize our array to [0..99].
        for (i = 0; i &amp;lt; MaxIndex; ++i) {
            A[i] = i * i;
        }

        A[17]= -A[17];
    }

    /**
     * anonymous scope #2
     *     find the index of the smallest number and print it.
     */
    {
        int result = Find(A);

        printf(
            &quot;First negative integer in A found at index = %d.\n&quot;,
            result
        );
    }

    // wait for user input before closing.
    getchar();

    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 프로그램은 여러 가지 작업을 끔찍할 정도로 나쁜 스타일로 수행합니다.특히 단일 범위 내에서만 사용되는 글로벌 매크로를 설정하지만 이후 모든 코드를 계속 오염시킵니다.매우 나쁨으로 인해 Windows API가 대규모로 글로벌 범위 오염을 일으킵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 이 프로그램은 인수를 포함하는 구조가 없는 어레이로 전달합니다.즉, 어레이는 Find 함수에 도달하면 착하시 불능 상태가 됩니다.어레이의 크기를 알 수 없게 되어 메인 및 Find가 글로벌 매크로에 의존하게 되었습니다.매우 불량합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하면서도 코드를 단순하게 유지하는 방법에는 두 가지가 있습니다.첫 번째 방법은 배열을 100개의 정수로 이루어진 배열로 정의하는 글로벌 구조를 작성하는 것입니다.이 방법을 통해 배열을 전달하면 배열의 길이가 유지됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 방법은 어레이의 길이를 find 인수로 전달하고 어레이를 작성하기 전에 #define만 사용하고 #define을 사용합니다.스코프가 실행 시 오버헤드가 0인 sizeof(A)/sizeof(A[0])를 통해 어레이의 크기를 인식하기 때문에 컴파일러는 100을 추론하여 붙여넣습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 세 번째 방법으로 해결하기 위해 범용 어레이를 작성하기 위한 헤더를 만들었습니다.추상적인 데이터 타입이지만 자동화된 데이터 구조라고 부르고 싶습니다.&lt;/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;Simple Array.h&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * Make sure that all the options needed are given in order to create our array.
 */
#ifdef OPTION_UNINSTALL
    #undef OPTION_ARRAY_TYPE
    #undef OPTION_ARRAY_LENGTH
    #undef OPTION_ARRAY_NAME    
#else 
    #if (!defined OPTION_ARRAY_TYPE) || !defined OPTION_ARRAY_LENGTH || (!defined OPTION_ARRAY_NAME)
        #error &quot;type, length, and name must be known to create an Array.&quot;
    #endif

    /** 
     * Use the options to create a structure preserving structure for our array.
     *    that is, in contrast to pointers, raw arrays.
     */
    struct {
        OPTION_ARRAY_TYPE data[OPTION_ARRAY_LENGTH];
    } OPTION_ARRAY_NAME;

    /**
     * if we are asked to also zero out the memory, we do it.
     * if we are not granted access to string.h, brute force it.
     */
    #ifdef OPTION_ZERO_MEMORY
        #ifdef OPTION_GRANT_STRING
            memset(&amp;amp;OPTION_ARRAY_NAME, 0, OPTION_ARRAY_LENGTH * sizeof(OPTION_ARRAY_TYPE));
        #else
            /* anonymous scope */
            {
                int i;
                for (i = 0; i &amp;lt; OPTION_ARRAY_LENGTH; ++i) {
                    OPTION_ARRAY_NAME.data[i] = 0;
                }
            }
        #endif
        #undef OPTION_ZERO_MEMORY
    #endif
#endif
&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;이 헤더는 기본적으로 모든 C 데이터 구조 헤더가 C 프리프로세서를 사용해야 하는 경우(PHP/Templating toolkit/ASP/자신의 임베디드 가능한 스크립트 언어와는 대조적으로 lisp에 관계없이)와 같아야 합니다.&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;#include &amp;lt;stdio.h&amp;gt;

int Find(int A[], int A_length)
{
    int j;

    for (j = 0; j &amp;lt; A_length; ++j) {
        if (A[j] &amp;lt; 0) {
            return j;
        }
    }

    return -1;
}

int main(void)
{
    // std::array&amp;lt;int, 100&amp;gt; A;
    #define OPTION_ARRAY_TYPE int
    #define OPTION_ARRAY_LENGTH 100
    #define OPTION_ARRAY_NAME A
    #include &quot;SimpleArray.h&quot;    

    /**
     * anonymous scope #1
     *     initialize our array to [0..99],
     *     then set 18th element to its negative value(-18)
     *     to make the search more interesting.
     */
    {
        // loop index, nothing interesting here.
        int i;

        // initialize our array to [0..99].
        for (i = 0; i &amp;lt; (sizeof(A.data) / sizeof(A.data[0])); ++i) {
            A.data[i] = i * i;
        }

        A.data[17]= -A.data[17];
    }

    /**
     * anonymous scope #2
     *     find the index of the smallest number and print it.
     */
    {
        int result = Find(A.data, (sizeof(A.data) / sizeof(A.data[0])));

        printf(
            &quot;First negative integer in A found at index = %d.\n&quot;,
            result
        );
    }

    // wait for user input before closing.
    getchar();

    // making sure all macros of SimpleArray do not affect any code
    // after this function; macros are file-wide, so we want to be 
    // respectful to our other functions.
    #define OPTION_UNINSTALL
    #include &quot;SimpleArray.h&quot;

    return 0;
}
&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;순수 C와 C의 프리프로세서로 순진한 std::array를 발명했습니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우린 매크로를 사용했지만 악마는 아니야. 우리가 뒷처리를 하니까!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;델의 매크로는 모두 정의되어 있지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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 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;(sizeof(A.data) / sizeof(A.data[0]))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 컴파일러에 오버헤드는 없지만, 아이들에게는 적합하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;나중에 PHP와 같은 보다 친숙한 프리프로세서를 사용해 아이에게 친숙하게 만들 수 있습니다.&lt;/font&gt;&lt;/font&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;이 문제를 해결하기 위해 &quot;자유&quot; 어레이 데이터 구조에서 메서드 역할을 하는 유틸리티 라이브러리를 만들 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Simple Array Utils.h&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * this is a smart collection that is created using options and is 
 *      removed from scope when included with uninstall option.
 *
 * there are no guards because this header is meant to be strategically
 *     installed and uninstalled, rather than kept at all times.
 */
#ifdef OPTION_UNINSTALL
    /* clean up */
    #undef ARRAY_FOREACH_BEGIN
    #undef ARRAY_FOREACH_END
    #undef ARRAY_LENGTH
#else
    /** 
     * array elements vary in number of bytes, encapsulate common use case 
     */
    #define ARRAY_LENGTH(A) \
        ((sizeof A.data) / (sizeof A.data[0]))

    /**
     * first half of a foreach loop, create an anonymous scope,
     * declare an iterator, and start accessing the items. 
     */
    #if defined OPTION_ARRAY_TYPE
        #define ARRAY_FOREACH_BEGIN(name, iter, arr)\
            {\
                unsigned int iter;\
                for (iter = 0; iter &amp;lt; ARRAY_LENGTH(arr); ++iter) {\
                    OPTION_ARRAY_TYPE name = arr.data[iter];
    #endif

    /** 
     * second half of a foreach loop, close the loop and the anonymous scope 
     */
    #define ARRAY_FOREACH_END \
            }\
        }
#endif
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 기능이 풍부한 라이브러리이며 기본적으로는&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ARRAY_LENGH :: 데이터 필드가 -&amp;gt; int 인 모든 것&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;OPTION_ARRAY_SIZE가 아직 정의되어 있거나 재정의되어 있는 경우에는 헤더에 foreach 루프를 실행하는 방법도 정의되어 있습니다.이것은 귀엽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 미쳐보자.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Simple Array.h&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * Make sure that all the options needed are given in order to create our array.
 */
#ifdef OPTION_UNINSTALL
    #ifndef OPTION_ARRAY_TYPE
        #undef OPTION_ARRAY_TYPE
    #endif

    #ifndef OPTION_ARRAY_TYPE    
        #undef OPTION_ARRAY_LENGTH
    #endif

    #ifndef OPTION_ARRAY_NAME    
        #undef OPTION_ARRAY_NAME    
    #endif

    #ifndef OPTION_UNINSTALL
        #undef OPTION_UNINSTALL
    #endif
#else 
    #if (!defined OPTION_ARRAY_TYPE) || !defined OPTION_ARRAY_LENGTH || (!defined OPTION_ARRAY_NAME)
        #error &quot;type, length, and name must be known to create an Array.&quot;
    #endif

    /** 
     * Use the options to create a structure preserving structure for our array.
     *    that is, in contrast to pointers, raw arrays.
     */
    struct {
        OPTION_ARRAY_TYPE data[OPTION_ARRAY_LENGTH];
    } OPTION_ARRAY_NAME;

    /**
     * if we are asked to also zero out the memory, we do it.
     * if we are not granted access to string.h, brute force it.
     */
    #ifdef OPTION_ZERO_MEMORY
        #ifdef OPTION_GRANT_STRING
            memset(&amp;amp;OPTION_ARRAY_NAME, 0, OPTION_ARRAY_LENGTH * sizeof(OPTION_ARRAY_TYPE));
        #else
            /* anonymous scope */
            {
                int i;
                for (i = 0; i &amp;lt; OPTION_ARRAY_LENGTH; ++i) {
                    OPTION_ARRAY_NAME.data[i] = 0;
                }
            }
        #endif
        #undef OPTION_ZERO_MEMORY
    #endif
#endif
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Simple Array Utils.h&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * this is a smart collection that is created using options and is 
 *      removed from scope when included with uninstall option.
 *
 * there are no guards because this header is meant to be strategically
 *     installed and uninstalled, rather than kept at all times.
 */
#ifdef OPTION_UNINSTALL
    /* clean up, be mindful of undef warnings if the macro is not defined. */
    #ifdef ARRAY_FOREACH_BEGIN
        #undef ARRAY_FOREACH_BEGIN
    #endif

    #ifdef ARRAY_FOREACH_END
        #undef ARRAY_FOREACH_END
    #endif

    #ifdef ARRAY_LENGTH
        #undef ARRAY_LENGTH
    #endif
#else
    /** 
     * array elements vary in number of bytes, encapsulate common use case 
     */
    #define ARRAY_LENGTH(A) \
        ((sizeof A.data) / (sizeof A.data[0]))

    /**
     * first half of a foreach loop, create an anonymous scope,
     * declare an iterator, and start accessing the items. 
     */
    #if defined OPTION_ARRAY_TYPE
        #define ARRAY_FOREACH_BEGIN(name, iter, arr)\
            {\
                unsigned int iter;\
                for (iter = 0; iter &amp;lt; ARRAY_LENGTH(arr); ++iter) {\
                    OPTION_ARRAY_TYPE name = arr.data[iter];
    #endif

    /** 
     * second half of a foreach loop, close the loop and the anonymous scope 
     */
    #define ARRAY_FOREACH_END \
            }\
        }
#endif
&lt;/code&gt;&lt;/pre&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;메인&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

// std::array&amp;lt;int, 100&amp;gt; A;
#define OPTION_ARRAY_TYPE int
#define OPTION_ARRAY_LENGTH 100
#define OPTION_ARRAY_NAME A
#include &quot;SimpleArray.h&quot;  
#define OPTION_UNINSTALL
#include &quot;SimpleArray.h&quot;  

int Find(int A[], int A_length)
{
    int j;

    for (j = 0; j &amp;lt; A_length; ++j) {
        if (A[j] &amp;lt; 0) {
            return j;
        }
    }

    return -1;
}

int main(void)
{
    #define OPTION_ARRAY_NAME A
    #define OPTION_ARRAY_LENGTH (sizeof(A.data) / sizeof(A.data[0]))
    #define OPTION_ARRAY_TYPE int

    #include &quot;SimpleArray.h&quot;

    /**
     * anonymous scope #1
     *     initialize our array to [0..99],
     *     then set 18th element to its negative value(-18)
     *     to make the search more interesting.
     */
    {
        #include &quot;SimpleArrayUtils.h&quot;

        printf(&quot;size: %d.\n&quot;, ARRAY_LENGTH(A));

        ARRAY_FOREACH_BEGIN(item, i, A)
            A.data[i] = i * i;
        ARRAY_FOREACH_END

        A.data[17] = -A.data[17];


        // uninstall all macros.
        #define OPTION_UNINSTALL
        #include &quot;SimpleArrayUtils.h&quot;
    }

    /**
     * anonymous scope #2
     *     find the index of the smallest number and print it.
     */
    {
        #include &quot;SimpleArrayUtils.h&quot;        
        int result = Find(A.data, (sizeof(A.data) / sizeof(A.data[0])));

        printf(
            &quot;First negative integer in A found at index = %d.\n&quot;,
            result
        );

        // uninstall all macros.
        #define OPTION_UNINSTALL
        #include &quot;SimpleArrayUtils.h&quot;
    }

    // wait for user input before closing.
    getchar();

    // making sure all macros of SimpleArray do not affect any code
    // after this function; macros are file-wide, so we want to be 
    // respectful to our other functions.
    #define OPTION_UNINSTALL
    #include &quot;SimpleArray.h&quot;

    return 0;
}
&lt;/code&gt;&lt;/pre&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;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 PHP의 힘을 강조하는 이유는 HTML 문서의 컨텍스트 밖에서 PHP를 본 사람은 거의 없기 때문입니다.그러나 C 문서나 다른 텍스트 파일에서는 PHP를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Templating Toolkit을 사용하면 원하는 스크립트 언어를 매크로에 추가할 수 있습니다.이러한 언어는 네임스페이스, 변수 및 실제 함수를 갖추고 있기 때문에 C 프리프로세서보다 훨씬 좋습니다.이러한 언어는 코드를 생성하는 실제 스크립트를 디버깅하기 때문에 C 프리프로세서가 아니라 C 프리프로세서보다 훨씬 쉽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버깅을 하는 것은 주로 익숙하기 때문입니다(정신이 정상인 사람은 C 프리프로세서를 가지고 노는 데 몇 시간을 할애하고 익숙해지는 사람).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;거의 없습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 PHP를 사용하여 이를 수행하는 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;심플 어레이&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    class SimpleArray {
        public $length;
        public $name;
        public $type;

        function __construct($options) {
            $this-&amp;gt;length = $options['length'];
            $this-&amp;gt;name = $options['name'];
            $this-&amp;gt;type = $options['type'];
        }

        function getArray() {
            echo ($this-&amp;gt;name . '.data');
        }

        function __toString() {            
            return sprintf (
                &quot;struct {\n&quot; .
                &quot;    %s data[%d];\n&quot; .
                &quot;} %s;\n&quot;
                ,
                $this-&amp;gt;type,
                $this-&amp;gt;length,
                $this-&amp;gt;name
            );          
        }
    };
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;main.discloss.main.discloss.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
&amp;lt;?php include('SimpleArray.php'); ?&amp;gt;

int Find(int *A, int A_length)
{
    int i;

    for (i = 0; i &amp;lt; A_length; ++i) 
    {
        if (A[i] &amp;lt; 0) {
            return i;
        }
    }

    return -1;
}

int main(int argc, char **argv)
{
    &amp;lt;?php 
        $arr = new SimpleArray(array(
            'name' =&amp;gt; 'A',
            'length' =&amp;gt; 100,
            'type' =&amp;gt; 'int'
        ));
        echo $arr;
    ?&amp;gt;

    printf(&quot;size of A: %d.\n&quot;, &amp;lt;?php echo($arr-&amp;gt;length); ?&amp;gt;);

    /* anonymous scope */
    {
        int i;

        for (i = 0; i &amp;lt; &amp;lt;?php echo($arr-&amp;gt;length)?&amp;gt;; ++i) {
            &amp;lt;?php $arr-&amp;gt;getArray(); ?&amp;gt;[i] = i * i;
        }   
        &amp;lt;?php $arr-&amp;gt;getArray(); ?&amp;gt;[17] = -&amp;lt;?php $arr-&amp;gt;getArray()?&amp;gt;[17];
    }

    int result = Find(&amp;lt;?php $arr-&amp;gt;getArray();?&amp;gt;, &amp;lt;?php echo $arr-&amp;gt;length; ?&amp;gt;);
    printf(
        &quot;First negative integer in A found at index = %d.\n&quot;,
        result
    );

    getchar();       

    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;려려를 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;php main.php &amp;gt; main.c&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고나서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gcc main.c -o main
./main
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 오브젝트 C와 매우 비슷해 보입니다.이는 기본적으로 목적 C가 하는 일이기 때문입니다.단, 컴파일 시간의 &quot;매크로스&quot;를 실제 런타임에 링크하는 경향이 있습니다(예를 들어 C가 실행 중인 런타임에 php를 사용할 수 있었던 것처럼, C는 php와 대화할 수 있고, php는 C와 대화할 수 있습니다.단, php는 다수의 brack과 같은 작은 언어입니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ets)의 주요 차이점은 오브젝트 C는 여기서와 같이 &quot;정적&quot;구조를 만드는 방법을 가지고 있지 않다는 것입니다.실제로 오브젝트 C의 오브젝트는 런타임이며, 그 때문에 접근 비용이 훨씬 비싸지만 훨씬 유연하고 구조를 유지하는 반면, C 구조는 헤더가 스코프를 벗어나자마자 바이트로 축소됩니다(개체로서의 위치).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내부 태그 부착 유니언을 사용하여 원래 상태로 되돌릴 수 있습니다.)...&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;다음으로 (프리프로세서를 통해) 인스턴스화하여 같은 C 파일에서 여러 유형을 &lt;em papago-id=&quot;80-1&quot;&gt;사용&lt;/em&gt;할 수 있는 버전을 나타냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define DEFINE_LL_NODE(CONCRETE_TYPE) \
  struct node_of_ ## CONCRETE_TYPE \
    { \
      CONCRETE_TYPE data; \
      struct node_of_ ## CONCRETE_TYPE *next; \
    };

#define DECLARE_LL_NODE(CONCRETE_TYPE,VARIABLE_NAME) \
  struct node_of_ ## CONCRETE_TYPE VARIABLE_NAME;

/* Declarations for each type.  */
DEFINE_LL_NODE(int)
DEFINE_LL_NODE(char)

int main (void)
{
  /* Declaration of instances of each type.  */
  DECLARE_LL_NODE (int, foo)
  DECLARE_LL_NODE (char, bar)

  /* And you can then use these instances.  */
  foo.data = 1;
  foo.next = NULL;

  bar.data = 'c';
  bar.next = NULL;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;cpp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해했습습니니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct node_of_int { int data; struct node_of_int *next; };

struct node_of_char { char data; struct node_of_char *next; };

int main (void)
{
  struct node_of_int foo;
  struct node_of_char bar;

  foo.data = 1;
  foo.next = ((void *)0);

  bar.data = 'c';
  bar.next = ((void *)0);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서는 프리프로세서 매크로에서는 고품질 템플릿과 같은 작업을 할 수 없습니다.왜냐하면 이러한 매크로는 한 번만 확장되기 때문에 데이터 구조를 재입력할 수 있지만, 일단 처리되면 프로그램 전체가 해당됩니다.&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;void *&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;C c 、 C 、 C c c c c c 。&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;약화된 유형 체크를 수정하려면 구조물에 &quot;type&quot; 필드를 포함시키는 것을 고려하십시오.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 건축시 한 번 사용, 무효가 아니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 구조 유지 보수와 관련된 함수 내에서 유형 검사가 부족하다는 점을 개선할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그런 이라면, 그 일은 당신에게도 중요합니다.&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;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;38-1&quot;&gt;정말&lt;/em&gt; 하고 싶다면 간단한 방법으로 해결할 수 있다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typedef&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef int data_t;

struct queue
{
  data_t* data;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;data_t&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&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;s. 단, 한 &lt;em papago-id=&quot;42-1&quot;&gt;번&lt;/em&gt;에 여러 유형을 &lt;em papago-id=&quot;42-1&quot;&gt;사용&lt;/em&gt;할 수 없습니다(적어도 C++ 템플릿의 특정 동작을 C 플레인에서 시뮬레이션할 수 있는 방법은 없습니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 답변에서는 코드 gen 매크로 중 하나를 사용하여 C11 과부하 매크로로 마무리합니다.이렇게 하면 콜사이트에 너무 많은 타입 정보를 낭비할 필요가 없어집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://en.cppreference.com/w/c/language/generic&quot; rel=&quot;nofollow&quot; papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://en.cppreference.com/w/c/language/generic&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 본 댓글 몇 개에 대한 댓글입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 C에서 이 문제를 해결하는 방법은 #define 매크로와 함수 포인터를 중심으로 하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 버전에서는 C++ 템플릿은 코드를 복사하고 기호를 생성하여 원본을 텍스트로 &quot;파라미터화&quot;하는 단순한 방법이었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 스카이는 상상력을 발휘하는 방법의 한계입니다.여러 가지 점에서 활자체크 등에 관해서는 컴파일러의 도움을 크게 기대하지 않기 때문에 주의해 주십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 &quot;C++를 사용하는 것은 어떨까요?&quot;라고 말하는 것은 역효과를 가져옵니다.&lt;/font&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;이유를 짐작할 수 있나요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1990년 초였기 때문에 C++와 C++에 템플릿 아이디어가 있었지만, 거의 구현되지 않았습니다.&lt;/font&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;C++는 적어도 함수 포인터를 사용하여 더 이상 클래스 메서드를 시뮬레이션할 필요가 없기 때문에 어느 정도 쉬워졌습니다. 왜냐하면, 음, 당신은 그것에 대한 네이티브 언어 지원을 받았기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 C에서와 마찬가지로 #define이 파라메트릭 프로그래밍의 유일한 친구였습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;#define q(t) \
  typedef struct _q_##t {t v; struct q_##t *next} q_##t;

q(char);
q(int);

int main(void)
{
  q_char qc;
  q_int qi;

  qc.v = 'c';
  qc.next = (void *) 0;

  qi.v = 42;
  qi.next = (void *) 0;

  return 0;
}
&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;p papago-id=&quot;97&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/10950828/&lt;a href=&quot;https://stackoverflow.com/questions/10950828/simulation-of-templates-in-c-for-a-queue-data-type&quot; target=&quot;_blank&quot; papago-id=&quot;97-1&quot;&gt;simulation-of-templates-in-c-for-a-queue-data-type&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2332</guid>
      <comments>https://prostudy.tistory.com/2332#entry2332comment</comments>
      <pubDate>Mon, 3 Oct 2022 16:00:04 +0900</pubDate>
    </item>
    <item>
      <title>MySQL의 기본 ON DELETE 동작은 무엇입니까?</title>
      <link>https://prostudy.tistory.com/2331</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL의 기본 ON DELETE 동작은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;MySQL&lt;/a&gt; 문서를 구문 분석하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 명확해질 수 있어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SET NULL, NO ACTION, RESTRICT, CASCED 및 SET DEFAULT의 5가지 가능성이 있는 것 같습니다.&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;NO ACTION과 RESTRICT는 같은 작업(FK를 망가뜨리는 DB 변경 방지)을 수행하며, 이것이 기본값이므로 ON DELETE 절을 생략하면 NO ACTION(또는 RESTRICT - 같은 작업)이 됩니다.&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;SET NULL을 사용하면 부모 행을 삭제할 수 있으며 FK를 NULL로 설정할 수 있습니다.&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;CASCADE는 자녀 행을 삭제합니다.&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;SET DEFAULT는 절대 사용하지 마십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 어느 정도 맞습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 맞습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;조치&lt;/strong&gt; 없음: [...] InnoDB는 &lt;strong papago-id=&quot;8-0&quot;&gt;상위&lt;/strong&gt; 테이블의 삭제 또는 업데이트 작업을 거부합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;RESTRICT: 부모 테이블의 삭제 또는 업데이트 작업을 &lt;strong papago-id=&quot;9-0&quot;&gt;거부&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;RESTRICT(또는 NO ACTION)를 지정하는 것은 삭제 시 또는 업데이트 시 절을 생략하는 것과 같습니다. [...&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;NO ACTION&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RESTRICT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동의어입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 없을 때 사용하므로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ON DELETE / UPDATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조항, 이것이 기본 행동이다.&lt;/font&gt;&lt;/font&gt;&lt;/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;SETNULL:또는 업데이트를 부모 테이블과 아이가 테이블에서 NULL.[...]에 외래 키 열 또는 행을 행을 삭제합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외국 칼럼 NULL하지 않NULL(또는 InnoDB또는 업데이트를 삭제 허용하지 않는다)로 발표되지 않을 경우 설정됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CASCADE:또는 업데이트를 부모 테이블과 자동 또는을 업데이트하고 아이 테이블에서 일치하는 행을 삭제합니다.[...]이 한줄로 늘어선 삭제를 클릭합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;계단식 표 지우는 외국인 칼럼(또는 업데이트).&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SETDEFAULT:이 행동은 파서를 통해, 하지만InnoDB 토대 표 정의 DELETESETDEFAULT 또는 업데이트 SETDEFAULT 조항 ONON이 들어 있는 인정 받고 있다.&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;그래서 기본적으로 그 옵션을 사용하지 못한다.&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/1027656/what-is-mysqls-default-on-delete-behavior&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2331</guid>
      <comments>https://prostudy.tistory.com/2331#entry2331comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:58:12 +0900</pubDate>
    </item>
    <item>
      <title>Python 문자열에서 HTML 제거</title>
      <link>https://prostudy.tistory.com/2330</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 문자열에서 HTML 제거&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from mechanize import Browser
br = Browser()
br.open('http://somewebpage')
html = br.response().readlines()
for line in html:
  print line
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 파일로 한 줄을 인쇄할 때 형식 자체가 아닌 각 HTML 요소의 내용만 표시할 수 있는 방법을 찾고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「」를 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'&amp;lt;a href=&quot;whatever.example&quot;&amp;gt;some text&amp;lt;/a&amp;gt;'&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;'&amp;lt;b&amp;gt;hello&amp;lt;/b&amp;gt;'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안녕하세요' 등을 출력합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;떻게해 해???&lt;/font&gt;&lt;/font&gt;&lt;/font&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 태그를 제거하기 위해 항상 이 기능을 사용했습니다. Python stdlib만 필요하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 3의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from io import StringIO
from html.parser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        super().__init__()
        self.reset()
        self.strict = False
        self.convert_charrefs= True
        self.text = StringIO()
    def handle_data(self, d):
        self.text.write(d)
    def get_data(self):
        return self.text.getvalue()

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 2의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from HTMLParser import HTMLParser
from StringIO import StringIO

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.text = StringIO()
    def handle_data(self, d):
        self.text.write(d)
    def get_data(self):
        return self.text.getvalue()

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
&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;텍스트 처리를 위해 HTML 태그를 삭제해야 하는 경우 간단한 정규 표현으로 충분합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;7-1&quot;&gt;XSS 공격을 방지하기 위해 사용자 생성 HTML을 삭제하려는 경우 이 옵션을 사용하지 마십시오.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;7-1&quot;&gt; 모든 태그 또는 트래킹을 제거하는 안전한 방법은 아닙니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 정규식은 대부분의 HTML 태그를 상당히 안정적으로 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import re

re.sub('&amp;lt;[^&amp;lt;]+?&amp;gt;', '', text)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지 못하는 regex를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;...&amp;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;+&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;&amp;lt;&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;?&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;찾을 수 있는 최소 문자열과 일치함을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 들어, 「 」를 지정하면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;p&amp;gt;Hello&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일치합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;'p&amp;gt;&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;&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;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;&amp;lt;..Hello..&amp;gt;&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;/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 class=&quot;papago-parent&quot;&gt; 「」의 경우.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;&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;html로 를 들어&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;2 &amp;lt; 3&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;&amp;amp;...&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;, 그 때문에 anyway anyway anyway anyway anyway anyway&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;^&amp;lt;&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;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BeautifulSoup 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from bs4 import BeautifulSoup

html_str = '''
&amp;lt;td&amp;gt;&amp;lt;a href=&quot;http://www.fakewebsite.example&quot;&amp;gt;Please can you strip me?&amp;lt;/a&amp;gt;
&amp;lt;br/&amp;gt;&amp;lt;a href=&quot;http://www.fakewebsite.example&quot;&amp;gt;I am waiting....&amp;lt;/a&amp;gt;
&amp;lt;/td&amp;gt;
'''
soup = BeautifulSoup(html_str)

print(soup.get_text())
#or via attribute of Soup Object: print(soup.text)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.crummy.com/software/BeautifulSoup/bs4/doc/#specifying-the-parser-to-use&quot; papago-id=&quot;24-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;다음&lt;/a&gt;과 같이 파서를 명시적으로 지정하는 것이 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BeautifulSoup(html_str, features=&quot;html.parser&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력을 재현할 수 있도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쇼트 버전!&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;import re, cgi
tag_re = re.compile(r'(&amp;lt;!--.*?--&amp;gt;|&amp;lt;[^&amp;gt;]*&amp;gt;)')

# Remove well-formed tags, fixing mistakes by legitimate users
no_tags = tag_re.sub('', user_input)

# Clean up anything else by escaping
ready_for_web = cgi.escape(no_tags)
&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;a href=&quot;https://github.com/mitsuhiko/markupsafe/blob/0.23/markupsafe/__init__.py#L21&quot; papago-id=&quot;27-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;정규식 소스:&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/mitsuhiko/markupsafe/blob/0.23/markupsafe/__init__.py#L21&quot; papago-id=&quot;27-0&quot; rel=&quot;nofollow noreferrer&quot;&gt; 마크업&lt;/a&gt; 세이프&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 버전에서는 HTML 엔티티도 처리되지만 이 빠른 버전에서는 처리되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;28&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;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;&amp;lt;i&amp;gt;italicizing&amp;lt;/i&amp;gt;&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;i&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 임의로 입력해서 완전히 무해하게 만드는 것은 또 다른 문제입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 있는  않은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;!--&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; 조정) 및 angle-displus(각도)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;blah &amp;lt;&amp;lt;&amp;lt;&amp;gt;&amp;lt;blah&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 온전합니다.)&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 온전합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTMLParser 버전은 닫히지 않은 코멘트 안에 있는 경우 완전한 태그를 그대로 둘 수도 있습니다.&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;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;{{ firstname }} {{ lastname }}&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;firstname = '&amp;lt;a'&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;lastname = 'href=&quot;http://evil.example/&quot;&amp;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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Mediros!&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 제외)가 통과합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이들 태그 자체가 완전한 태그는 아니기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반 HTML 태그를 제거하는 것만으로는 충분하지 않습니다.&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;고 d d&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strip_tags&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 에 대한 답변의 표제 참조)은과 같은경고를 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;결과 문자열이 HTML 안전하다는 보장은 전혀 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 'NEVER'는 'NEVER'의 를 '로 마크합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strip_tags&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;code&gt;escape()&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;/p&gt; 
&lt;/blockquote&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;h2 papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTMLParser를 사용하여 태그를 제거하려면 여러 번 실행해야 합니다.&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문에 대한 상위 답을 회피하는 것은 쉽다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.mehmetince.net/django-strip_tags-bypass-vulnerability-exploit/&quot; papago-id=&quot;46-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;다음&lt;/a&gt; 문자열(&lt;a href=&quot;https://www.mehmetince.net/django-strip_tags-bypass-vulnerability-exploit/&quot; papago-id=&quot;46-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;출처&lt;/a&gt; 및 &lt;a href=&quot;https://www.mehmetince.net/django-strip_tags-bypass-vulnerability-exploit/&quot; papago-id=&quot;46-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;토론&lt;/a&gt;):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;img&amp;lt;!-- --&amp;gt; src=x onerror=alert(1);//&amp;gt;&amp;lt;!-- --&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;때가 HTMLParser, HTMLParser를 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;img...&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;보여서 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;안 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;요&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTMLParser를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★★★★★★★★만 빼고,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;!-- comments --&amp;gt;&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=x onerror=alert(1);//&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 2014년 3월 장고 프로젝트에서 드러났다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 들들 their their their their&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strip_tags&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 이 질문에 대한 상위 답변과 동일했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/django/django/blob/1.7.7/django/utils/html.py#L170&quot; papago-id=&quot;51-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;새 버전&lt;/a&gt;은 기본적으로 &lt;a href=&quot;https://github.com/django/django/blob/1.7.7/django/utils/html.py#L170&quot; papago-id=&quot;51-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;다시&lt;/a&gt; 실행해도 문자열이 변경되지 않을 때까지 루프에서 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# _strip_once runs HTMLParser once, pulling out just the text of all the nodes.

def strip_tags(value):
    &quot;&quot;&quot;Returns the given HTML with all tags stripped.&quot;&quot;&quot;
    # Note: in typical case this loop executes _strip_once once. Loop condition
    # is redundant, but helps to reduce number of executions of _strip_once.
    while '&amp;lt;' in value and '&amp;gt;' in value:
        new_value = _strip_once(value)
        if len(new_value) &amp;gt;= len(value):
            # _strip_once was not able to detect more tags
            break
        value = new_value
    return value
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 이 항상 '어느 때'의 가 되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 약약면면면면면면면면면면면면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strip_tags()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;54-0&quot;&gt;2015년 &lt;/strong&gt;3월 &lt;strong papago-id=&quot;54-0&quot;&gt;19일 갱신&lt;/strong&gt;:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1.4.20, 1.6.11, 1.7.7 및 1.8c1 이전 버전의 Django에는 버그가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 버전은 strip_tags() 함수에 무한 루프를 입력할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상기 고정판을 재현하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.djangoproject.com/weblog/2015/mar/18/security-releases/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;54-2&quot;&gt;자세한&lt;/a&gt; 것은 이쪽.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;55&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;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;샘플 코드는 HTML 엔티티를 취급하지 않습니다.Django 및 Markup Safe 패키지 버전은 취급합니다.&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;a href=&quot;https://pypi.python.org/pypi/MarkupSafe&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;57-1&quot;&gt;Markup&lt;/a&gt; Safe 라이브러리에서 추출한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;편리하고 빠릅니다(C가 네이티브 Python 버전으로 속도를 높였습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Google &lt;a href=&quot;https://developers.google.com/appengine/docs/python/tools/libraries27&quot; papago-id=&quot;57-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;App&lt;/a&gt; Engine에 &lt;a href=&quot;https://developers.google.com/appengine/docs/python/tools/libraries27&quot; papago-id=&quot;57-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;포함&lt;/a&gt;되어 &lt;a href=&quot;http://jinja.pocoo.org/docs/intro/#markupsafe-dependency&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;57-5&quot;&gt;Jinja2(2.7 이상),&lt;/a&gt; Mako, Pylons 등이 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 장고 1.7의 장고 템플릿과 쉽게 연동됩니다.&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;Django의 strip_tags나 최신 &lt;em papago-id=&quot;58-1&quot;&gt;버전의 HTML 유틸리티&lt;/em&gt;도 좋지만, Markup Safe보다 편리하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &lt;a href=&quot;https://github.com/django/django/blob/1.7.1/django/utils/html.py&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;58-3&quot;&gt;파일에서는 필요&lt;/a&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;em papago-id=&quot;59-1&quot;&gt;제거&lt;/em&gt;해야 하는 경우 블리치 라이브러리가 &lt;a href=&quot;http://bleach.readthedocs.org/en/latest/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;59-3&quot;&gt;좋습니다&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;사용자는 이탤릭체는 사용할 수 있지만 iframe은 만들 수 없습니다.&quot;와 같은 규칙을 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;태그 스트리퍼의 속성을 이해하십시오!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;흐릿한 테스트를 해봐!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://gist.github.com/tgs/5b6bba6891565762fe39&quot; papago-id=&quot;60-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기 제&lt;/a&gt;가 이 답을 찾기 위해 사용한 &lt;a href=&quot;https://gist.github.com/tgs/5b6bba6891565762fe39&quot; papago-id=&quot;60-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;코드가 있습니다&lt;/a&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;em papago-id=&quot;61-0&quot;&gt;양지바른&lt;/em&gt; 메모 - 질문 자체는 콘솔로의 인쇄에 관한 것이지만, 이것은 &quot;열에서 HTML 삭제&quot;에 대한 구글의 상위 결과입니다.그래서 이 답변은 99%가 웹에 관한 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;62-1&quot;&gt;태그&lt;/em&gt;를 제거하고 HTML 엔티티를 일반 텍스트로 디코딩하는 방법이 필요했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 솔루션은 Eloff의 답변에 근거한 것입니다(엔티티를 제거하기 때문에 사용할 수 없었습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import html.parser

class HTMLTextExtractor(html.parser.HTMLParser):
    def __init__(self):
        super(HTMLTextExtractor, self).__init__()
        self.result = [ ]

    def handle_data(self, d):
        self.result.append(d)

    def get_text(self):
        return ''.join(self.result)

def html_to_text(html):
    &quot;&quot;&quot;Converts HTML to plain text (stripping tags and converting entities).
    &amp;gt;&amp;gt;&amp;gt; html_to_text('&amp;lt;a href=&quot;#&quot;&amp;gt;Demo&amp;lt;!--...--&amp;gt; &amp;lt;em&amp;gt;(&amp;amp;not; \u0394&amp;amp;#x03b7;&amp;amp;#956;&amp;amp;#x03CE;)&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;')
    'Demo (\xac \u0394\u03b7\u03bc\u03ce)'

    &quot;Plain text&quot; doesn't mean result can safely be used as-is in HTML.
    &amp;gt;&amp;gt;&amp;gt; html_to_text('&amp;amp;lt;script&amp;amp;gt;alert(&quot;Hello&quot;);&amp;amp;lt;/script&amp;amp;gt;')
    '&amp;lt;script&amp;gt;alert(&quot;Hello&quot;);&amp;lt;/script&amp;gt;'

    Always use html.escape to sanitize text before using in an HTML context!

    HTMLParser will do its best to make sense of invalid HTML.
    &amp;gt;&amp;gt;&amp;gt; html_to_text('x &amp;lt; y &amp;amp;lt z &amp;lt;!--b')
    'x &amp;lt; y &amp;lt; z '

    Named entities are handled as per HTML 5.
    &amp;gt;&amp;gt;&amp;gt; html_to_text('&amp;amp;nosuchentity; &amp;amp;apos; ')
    &quot;&amp;amp;nosuchentity; ' &quot;
    &quot;&quot;&quot;
    s = HTMLTextExtractor()
    s.feed(html)
    return s.get_text()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 테스트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;html = '&amp;lt;a href=&quot;#&quot;&amp;gt;Demo &amp;lt;em&amp;gt;(&amp;amp;not; \u0394&amp;amp;#x03b7;&amp;amp;#956;&amp;amp;#x03CE;)&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;'
print(repr(html_to_text(html)))
&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 class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;'Demo (¬ Δημώ)'
&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;strong papago-id=&quot;65-0&quot;&gt;보안 노트:&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;65-2&quot;&gt;HTML&lt;/em&gt; 제거(HTML을 일반 텍스트로 변환)와 HTML &lt;em papago-id=&quot;65-4&quot;&gt;삭제&lt;/em&gt;(일반 텍스트를 HTML로 변환)를 혼동하지 마십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 답변은 HTML을 삭제하고 엔티티를 일반 텍스트로 디코딩합니다.이렇게 하면 HTML 컨텍스트에서 결과를 안전하게 사용할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ::&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;lt;script&amp;amp;gt;alert(&quot;Hello&quot;);&amp;amp;lt;/script&amp;amp;gt;&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; will will will will will will 로 변환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(&quot;Hello&quot;);&amp;lt;/script&amp;gt;&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;이는 100% 올바른 동작이지만 결과적인 플레인텍스트가 HTML 페이지에 그대로 삽입되어 있는 경우에는 분명 충분하지 않습니다.&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 출력에 일반 텍스트 문자열을 삽입할 &lt;em papago-id=&quot;69-1&quot;&gt;때&lt;/em&gt;마다 HTML이 포함되어 있지 않은 것을 &quot;알고 있다&quot;고 해도(예를 들어 HTML 콘텐츠를 삭제했기 때문에) 항상 HTML을 이스케이프합니다(&lt;em papago-id=&quot;69-3&quot;&gt;사용&lt;/em&gt;).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 OP는 결과를 &lt;em papago-id=&quot;70-1&quot;&gt;콘솔&lt;/em&gt;로 출력하는 것에 대해 질문했고, 이 경우 HTML 이스케이프는 필요하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASCII 제어 문자는 불필요한 동작(특히 Unix 시스템에서)을 트리거할 수 있으므로 대신 삭제할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import re
text = html_to_text(untrusted_html_input)
clean_text = re.sub(r'[\0-\x1f\x7f]+', '', text)
# Alternatively, if you want to allow newlines:
# clean_text = re.sub(r'[\0-\x09\x0b-\x1f\x7f]+', '', text)
print(clean_text)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에는 다음과 같은 간단한 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def remove_html_markup(s):
    tag = False
    quote = False
    out = &quot;&quot;

    for c in s:
        if c == '&amp;lt;' and not quote:
            tag = True
        elif c == '&amp;gt;' and not quote:
            tag = False
        elif (c == '&quot;' or c == &quot;'&quot;) and tag:
            quote = not quote
        elif not tag:
            out = out + c

    return out
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이디어에 대해서는, http&lt;a href=&quot;http://youtu.be/2tu9LTDujbw&quot; papago-id=&quot;72-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;://&lt;/a&gt;youtu.be/&lt;a href=&quot;http://youtu.be/2tu9LTDujbw&quot; papago-id=&quot;72-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;2tu9LTDujbw&lt;/a&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;http://youtu.be/HPkNPcYed9M?t=35s 에서 동작하고 있는 것을 확인할 수 있습니다.http://youtu.be/&lt;a href=&quot;http://youtu.be/HPkNPcYed9M?t=35s&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;73-1&quot;&gt;HPkNPcYed9M&lt;/a&gt;?t=35s&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PS - 클래스(파이썬을 사용한 스마트 디버깅에 대해)에 관심이 있으시다면 http://www.udacity.com/overview/Course/cs259/&lt;a href=&quot;http://www.udacity.com/overview/Course/cs259/CourseRev/1&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;74-1&quot;&gt;CourseRev&lt;/a&gt;/1 링크를 드리겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무료입니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;천만에요!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;:)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://lxml.de/lxmlhtml.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;76-1&quot;&gt;lxml.&lt;/a&gt;html 기반 솔루션(lxml은 네이티브 라이브러리이며 순수 python 솔루션보다 성능이 향상될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈을 설치하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install lxml&lt;/code&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 태그 제거&lt;/font&gt;&lt;/h3&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;from lxml import html


## from file-like object or URL
tree = html.parse(file_like_object_or_url)

## from string
tree = html.fromstring('safe &amp;lt;script&amp;gt;unsafe&amp;lt;/script&amp;gt; safe')

print(tree.text_content().strip())

### OUTPUT: 'safe unsafe safe'

&lt;/code&gt;&lt;/pre&gt; 
&lt;h3 papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미리 위생화된 HTML을 사용하여 모든 태그 제거(일부 태그 삭제)&lt;/font&gt;&lt;/h3&gt; 
&lt;pre class=&quot;lang-python prettyprint-override&quot;&gt;&lt;code&gt;from lxml import html
from lxml.html.clean import clean_html

tree = html.fromstring(&quot;&quot;&quot;&amp;lt;script&amp;gt;dangerous&amp;lt;/script&amp;gt;&amp;lt;span class=&quot;item-summary&quot;&amp;gt;
                            Detailed answers to any questions you might have
                        &amp;lt;/span&amp;gt;&quot;&quot;&quot;)

## text only
print(clean_html(tree).text_content().strip())

### OUTPUT: 'Detailed answers to any questions you might have'
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, lxml.dll의 정확한 기능에 대해서는, http://lxml.de/lxmlhtml.html#&lt;a href=&quot;http://lxml.de/lxmlhtml.html#cleaning-up-html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;80-1&quot;&gt;cleaning-up-html&lt;/a&gt; 를 참조해 주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트로 변환하기 전에 삭제할 특정 태그를 더 제어해야 할 경우 원하는 &lt;a href=&quot;http://lxml.de/api/lxml.html.clean.Cleaner-class.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;81-3&quot;&gt;옵션&lt;/a&gt;을 사용하여 사용자 &lt;a href=&quot;http://lxml.de/api/lxml.html.clean.Cleaner-class.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;81-1&quot;&gt;지정 lxml&lt;/a&gt; Cleaner를 만듭니다.다음은 예를 제시하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-python prettyprint-override&quot;&gt;&lt;code&gt;cleaner = Cleaner(page_structure=True,
                  meta=True,
                  embedded=True,
                  links=True,
                  style=True,
                  processing_instructions=True,
                  inline_style=True,
                  scripts=True,
                  javascript=True,
                  comments=True,
                  frames=True,
                  forms=True,
                  annoying_tags=True,
                  remove_unknown_tags=True,
                  safe_attrs_only=True,
                  safe_attrs=frozenset(['src','color', 'href', 'title', 'class', 'name', 'id']),
                  remove_tags=('span', 'font', 'div')
                  )
sanitized_html = cleaner.clean_html(unsafe_html)
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;text_content()&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;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;from lxml.etree import tostring

print(tostring(tree, method='text', encoding='unicode'))

&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 HTML 태그를 삭제하고 놀라울 정도로 빠른 라이브러리를 기반으로 HTML 엔티티를 디코딩하는 간단한 솔루션입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from lxml import html

def strip_html(s):
    return str(html.fromstring(s).text_content())

strip_html('Ein &amp;lt;a href=&quot;&quot;&amp;gt;sch&amp;amp;ouml;ner&amp;lt;/a&amp;gt; Text.')  # Output: Ein schöner Text.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 엔티티 엔티티 등)를가 있는 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;),&lt;a href=&quot;https://stackoverflow.com/a/925630/1094246&quot; papago-id=&quot;48-1&quot;&gt; Eloff의 답변&lt;/a&gt;에 handle_entityref 메서드를 추가했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def handle_entityref(self, name):
        self.fed.append('&amp;amp;%s;' % name)
    def get_data(self):
        return ''.join(self.fed)

def html_to_text(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 태그를 모두 삭제하는 가장 쉬운 방법은 BeautifulSoup을 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from bs4 import BeautifulSoup  # Or from BeautifulSoup import BeautifulSoup

def stripHtmlTags(htmlTxt):
    if htmlTxt is None:
            return None
        else:
            return ''.join(BeautifulSoup(htmlTxt).findAll(text=True)) 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;승인된 답변의 코드를 시도했지만 &quot;RuntimeError: maximum recursion depth exceeded&quot;라는 메시지가 떴습니다.이것은 위의 코드 블록에서는 발생하지 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Beautiful Soup 패키지가 바로 이 기능을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from bs4 import BeautifulSoup

soup = BeautifulSoup(html)
text = soup.get_text()
print(text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에서는, 현재 인정되고 있는 회답과 유사한 솔루션을 소개합니다(https://&lt;a href=&quot;https://stackoverflow.com/a/925630/95989&quot; papago-id=&quot;49-1&quot;&gt;stackoverflow&lt;/a&gt;.com/a/925630/95989),. 단, 내부 솔루션을 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;HTMLParser&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;pre papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;def strip_text(텍스트):&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;파서 = HTMLParser()&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;parser.farc_data = parts.farces&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;parser.feed(텍스트)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.return ' (부품)&lt;/font&gt;&lt;/pre&gt;&lt;p papago-id=&quot;93&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;import html
import re

def html_to_txt(html_text):
    ## unescape html
    txt = html.unescape(html_text)
    tags = re.findall(&quot;&amp;lt;[^&amp;gt;]+&amp;gt;&quot;,txt)
    print(&quot;found tags: &quot;)
    print(tags)
    for tag in tags:
        txt=txt.replace(tag,'')
    return txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;완벽할지는 모르겠지만, 제 사용 사례는 해결되었고 단순해 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &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;하나의 프로젝트를 위해 HTML을 삭제해야 했지만 css와 js도 필요했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 나는 엘로프스의 대답을 변형시켰다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.strict = False
        self.convert_charrefs= True
        self.fed = []
        self.css = False
    def handle_starttag(self, tag, attrs):
        if tag == &quot;style&quot; or tag==&quot;script&quot;:
            self.css = True
    def handle_endtag(self, tag):
        if tag==&quot;style&quot; or tag==&quot;script&quot;:
            self.css=False
    def handle_data(self, d):
        if not self.css:
            self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
&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;다른 HTML 파서(&lt;a href=&quot;http://www.crummy.com/software/BeautifulSoup/&quot; papago-id=&quot;96-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;lxml&lt;/a&gt; 또는 &lt;a href=&quot;http://www.crummy.com/software/BeautifulSoup/&quot; papago-id=&quot;96-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;Beautiful&lt;/a&gt; Soup 등)를 사용할 수 있습니다.이것은 텍스트만을 추출하는 기능을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 행 문자열에서 태그를 삭제하는 regex를 실행할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &lt;a href=&quot;http://docs.python.org/howto/regex&quot; papago-id=&quot;96-5&quot; rel=&quot;nofollow noreferrer&quot;&gt;Python&lt;/a&gt; 문서를 &lt;a href=&quot;http://docs.python.org/howto/regex&quot; papago-id=&quot;96-5&quot; rel=&quot;nofollow noreferrer&quot;&gt;참조&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;97&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Eloff의 답변을 Python 3.1에 성공적으로 사용했습니다.[감사합니다]&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;98&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 3.2.3으로 업그레이드하여 오류가 발생하였습니다.&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;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응답자 Thomas K 덕분에 여기에 &lt;a href=&quot;https://stackoverflow.com/questions/11061058/using-htmlparser-in-python-3-2&quot; papago-id=&quot;51-1&quot;&gt;제공&lt;/a&gt;된 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;super().__init__()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드로 변환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def __init__(self):
    self.reset()
    self.fed = []
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;...이렇게 하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def __init__(self):
    super().__init__()
    self.reset()
    self.fed = []
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 3.2.3에서는 동작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 한번 Thomas K의 수정과 위에 제공된 Eloff의 오리지널 코드에게 감사드립니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML-Parser를 사용하는 솔루션은 한 번만 실행되면 모두 중단될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;html_to_text('&amp;lt;&amp;lt;b&amp;gt;script&amp;gt;alert(&quot;hacked&quot;)&amp;lt;&amp;lt;/b&amp;gt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(&quot;hacked&quot;)&amp;lt;/script&amp;gt;
&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;HTML-Parser 를 사용하는 경우는, 0 이 치환될 때까지 Tags 를 카운트 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
        self.containstags = False

    def handle_starttag(self, tag, attrs):
       self.containstags = True

    def handle_data(self, d):
        self.fed.append(d)

    def has_tags(self):
        return self.containstags

    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html):
    must_filtered = True
    while ( must_filtered ):
        s = MLStripper()
        s.feed(html)
        html = s.get_data()
        must_filtered = s.has_tags()
    return html
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 빠른 수정으로 더욱 최적화될 수 있지만 올바르게 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드는 빈 태그가 아닌 모든 태그를 &quot;로 대체하고 지정된 입력 텍스트에서 모든 html 태그를 제거합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;./file.py 입력 출력을 사용하여 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    #!/usr/bin/python
import sys

def replace(strng,replaceText):
    rpl = 0
    while rpl &amp;gt; -1:
        rpl = strng.find(replaceText)
        if rpl != -1:
            strng = strng[0:rpl] + strng[rpl + len(replaceText):]
    return strng


lessThanPos = -1
count = 0
listOf = []

try:
    #write File
    writeto = open(sys.argv[2],'w')

    #read file and store it in list
    f = open(sys.argv[1],'r')
    for readLine in f.readlines():
        listOf.append(readLine)         
    f.close()

    #remove all tags  
    for line in listOf:
        count = 0;  
        lessThanPos = -1  
        lineTemp =  line

            for char in lineTemp:

            if char == &quot;&amp;lt;&quot;:
                lessThanPos = count
            if char == &quot;&amp;gt;&quot;:
                if lessThanPos &amp;gt; -1:
                    if line[lessThanPos:count + 1] != '&amp;lt;&amp;gt;':
                        lineTemp = replace(lineTemp,line[lessThanPos:count + 1])
                        lessThanPos = -1
            count = count + 1
        lineTemp = lineTemp.replace(&quot;&amp;amp;lt&quot;,&quot;&amp;lt;&quot;)
        lineTemp = lineTemp.replace(&quot;&amp;amp;gt&quot;,&quot;&amp;gt;&quot;)                  
        writeto.write(lineTemp)  
    writeto.close() 
    print &quot;Write To --- &amp;gt;&quot; , sys.argv[2]
except:
    print &quot;Help: invalid arguments or exception&quot;
    print &quot;Usage : &quot;,sys.argv[0],&quot; inputfile outputfile&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sören-lövborg의 답변을 파이썬 3으로 수정한 것&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from html.parser import HTMLParser
from html.entities import html5

class HTMLTextExtractor(HTMLParser):
    &quot;&quot;&quot; Adaption of http://stackoverflow.com/a/7778368/196732 &quot;&quot;&quot;
    def __init__(self):
        super().__init__()
        self.result = []

    def handle_data(self, d):
        self.result.append(d)

    def handle_charref(self, number):
        codepoint = int(number[1:], 16) if number[0] in (u'x', u'X') else int(number)
        self.result.append(unichr(codepoint))

    def handle_entityref(self, name):
        if name in html5:
            self.result.append(unichr(html5[name]))

    def get_text(self):
        return u''.join(self.result)

def html_to_text(html):
    s = HTMLTextExtractor()
    s.feed(html)
    return s.get_text()
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;109&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 StripTags(text):
     finished = 0
     while not finished:
         finished = 1
         start = text.find(&quot;&amp;lt;&quot;)
         if start &amp;gt;= 0:
             stop = text[start:].find(&quot;&amp;gt;&quot;)
             if stop &amp;gt;= 0:
                 text = text[:start] + text[start+stop+1:]
                 finished = 0
     return text
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;110&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 Github readmes를 해석하고 있는데, 다음 사항이 잘 작동한다는 것을 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import re
import lxml.html

def strip_markdown(x):
    links_sub = re.sub(r'\[(.+)\]\([^\)]+\)', r'\1', x)
    bold_sub = re.sub(r'\*\*([^*]+)\*\*', r'\1', links_sub)
    emph_sub = re.sub(r'\*([^*]+)\*', r'\1', bold_sub)
    return emph_sub

def strip_html(x):
    return lxml.html.fromstring(x).text_content() if x else ''
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;111&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 나서.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;readme = &quot;&quot;&quot;&amp;lt;img src=&quot;https://raw.githubusercontent.com/kootenpv/sky/master/resources/skylogo.png&quot; /&amp;gt;

            sky is a web scraping framework, implemented with the latest python versions in mind (3.4+). 
            It uses the asynchronous `asyncio` framework, as well as many popular modules 
            and extensions.

            Most importantly, it aims for **next generation** web crawling where machine intelligence 
            is used to speed up the development/maintainance/reliability of crawling.

            It mainly does this by considering the user to be interested in content 
            from *domains*, not just a collection of *single pages*
            ([templating approach](#templating-approach)).&quot;&quot;&quot;

strip_markdown(strip_html(readme))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 마크다운 및 html을 올바르게 삭제합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;113&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BeautifulSoup, html2text 또는 @Eloff의 코드를 사용하면 대부분의 경우 일부 html 요소, javascript 코드...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 다음 라이브러리를 조합하여 마크다운 포맷(Python 3)을 삭제할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import re
import html2text
from bs4 import BeautifulSoup
def html2Text(html):
    def removeMarkdown(text):
        for current in [&quot;^[ #*]{2,30}&quot;, &quot;^[ ]{0,30}\d\\\.&quot;, &quot;^[ ]{0,30}\d\.&quot;]:
            markdown = re.compile(current, flags=re.MULTILINE)
            text = markdown.sub(&quot; &quot;, text)
        return text
    def removeAngular(text):
        angular = re.compile(&quot;[{][|].{2,40}[|][}]|[{][*].{2,40}[*][}]|[{][{].{2,40}[}][}]|\[\[.{2,40}\]\]&quot;)
        text = angular.sub(&quot; &quot;, text)
        return text
    h = html2text.HTML2Text()
    h.images_to_alt = True
    h.ignore_links = True
    h.ignore_emphasis = False
    h.skip_internal_links = True
    text = h.handle(html)
    soup = BeautifulSoup(text, &quot;html.parser&quot;)
    text = soup.text
    text = removeAngular(text)
    text = removeMarkdown(text)
    return text
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나한테는 잘 먹히지만, 물론 향상될 수 있어.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 코드!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것에 의해, 그 안에 있는 모든 종류의 태그와 컨텐츠가 삭제됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def rm(s):
    start=False
    end=False
    s=' '+s
    for i in range(len(s)-1):
        if i&amp;lt;len(s):
            if start!=False:
                if s[i]=='&amp;gt;':
                    end=i
                    s=s[:start]+s[end+1:]
                    start=end=False
            else:
                if s[i]=='&amp;lt;':
                    start=i
    if s.count('&amp;lt;')&amp;gt;0:
        self.rm(s)
    else:
        s=s.replace('&amp;amp;nbsp;', ' ')
        return s
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 텍스트에 &lt;strong papago-id=&quot;117-1&quot;&gt;&amp;lt;&amp;lt;&lt;/strong&gt; 고객명 &amp;gt;&amp;gt; 기호가 포함되어 있으면 완전한 결과를 얻을 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# This is a regex solution.
import re
def removeHtml(html):
  if not html: return html
  # Remove comments first
  innerText = re.compile('&amp;lt;!--[\s\S]*?--&amp;gt;').sub('',html)
  while innerText.find('&amp;gt;')&amp;gt;=0: # Loop through nested Tags
    text = re.compile('&amp;lt;[^&amp;lt;&amp;gt;]+?&amp;gt;').sub('',innerText)
    if text == innerText:
      break
    innerText = text

  return innerText.strip()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong papago-id=&quot;118&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2020년 갱신&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;119&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/mozilla/bleach&quot; papago-id=&quot;119-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Mozilla Blich&lt;/a&gt; 라이브러리를 &lt;a href=&quot;https://github.com/mozilla/bleach&quot; papago-id=&quot;119-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;사용&lt;/a&gt;하면 유지할 태그와 속성을 맞춤화할 수 있으며 값에 따라 속성을 필터링할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 설명해야 할 2가지 사례를 제시하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;121&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1) HTML 태그 및 속성을 허용하지 않음&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;122&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;샘플 미가공 텍스트&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;raw_text = &quot;&quot;&quot;
&amp;lt;p&amp;gt;&amp;lt;img width=&quot;696&quot; height=&quot;392&quot; src=&quot;https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-768x432.jpg&quot; class=&quot;attachment-medium_large size-medium_large wp-post-image&quot; alt=&quot;Ethereum Classic 51% Attack: Okex Crypto Exchange Suffers $5.6 Million Loss, Contemplates Delisting ETC&quot; style=&quot;float:left; margin:0 15px 15px 0;&quot; srcset=&quot;https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-768x432.jpg 768w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-300x169.jpg 300w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-1024x576.jpg 1024w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-696x392.jpg 696w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-1068x601.jpg 1068w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-747x420.jpg 747w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-190x107.jpg 190w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-380x214.jpg 380w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-760x428.jpg 760w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc.jpg 1280w&quot; sizes=&quot;(max-width: 696px) 100vw, 696px&quot; /&amp;gt;Cryptocurrency exchange Okex reveals it suffered the $5.6 million loss as a result of the double-spend carried out by the attacker(s) in Ethereum Classic 51% attack. Okex says it fully absorbed the loss as per its user-protection policy while insisting that the attack did not cause any loss to the platform&amp;amp;#8217;s users. Also as part [&amp;amp;#8230;]&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The post &amp;lt;a rel=&quot;nofollow&quot; href=&quot;https://news.bitcoin.com/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc/&quot;&amp;gt;Ethereum Classic 51% Attack: Okex Crypto Exchange Suffers $5.6 Million Loss, Contemplates Delisting ETC&amp;lt;/a&amp;gt; appeared first on &amp;lt;a rel=&quot;nofollow&quot; href=&quot;https://news.bitcoin.com&quot;&amp;gt;Bitcoin News&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt; 
&quot;&quot;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;123&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2) 모든 HTML 태그와 속성을 raw 텍스트에서 삭제&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# DO NOT ALLOW any tags or any attributes
from bleach.sanitizer import Cleaner
cleaner = Cleaner(tags=[], attributes={}, styles=[], protocols=[], strip=True, strip_comments=True, filters=None)
print(cleaner.clean(raw_text))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;124&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;Cryptocurrency exchange Okex reveals it suffered the $5.6 million loss as a result of the double-spend carried out by the attacker(s) in Ethereum Classic 51% attack. Okex says it fully absorbed the loss as per its user-protection policy while insisting that the attack did not cause any loss to the platform&amp;amp;#8217;s users. Also as part [&amp;amp;#8230;]
The post Ethereum Classic 51% Attack: Okex Crypto Exchange Suffers $5.6 Million Loss, Contemplates Delisting ETC appeared first on Bitcoin News. 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3 srcset 속성을 가진 img 태그만 허용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from bleach.sanitizer import Cleaner
# ALLOW ONLY img tags with src attribute
cleaner = Cleaner(tags=['img'], attributes={'img': ['srcset']}, styles=[], protocols=[], strip=True, strip_comments=True, filters=None)
print(cleaner.clean(raw_text))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;126&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;&amp;lt;img srcset=&quot;https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-768x432.jpg 768w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-300x169.jpg 300w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-1024x576.jpg 1024w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-696x392.jpg 696w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-1068x601.jpg 1068w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-747x420.jpg 747w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-190x107.jpg 190w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-380x214.jpg 380w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc-760x428.jpg 760w, https://news.bitcoin.com/wp-content/uploads/2020/08/ethereum-classic-51-attack-okex-crypto-exchange-suffers-5-6-million-loss-contemplates-delisting-etc.jpg 1280w&quot;&amp;gt;Cryptocurrency exchange Okex reveals it suffered the $5.6 million loss as a result of the double-spend carried out by the attacker(s) in Ethereum Classic 51% attack. Okex says it fully absorbed the loss as per its user-protection policy while insisting that the attack did not cause any loss to the platform&amp;amp;#8217;s users. Also as part [&amp;amp;#8230;]
The post Ethereum Classic 51% Attack: Okex Crypto Exchange Suffers $5.6 Million Loss, Contemplates Delisting ETC appeared first on Bitcoin News. 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;127&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하는데 내가 뭘 하고 있는지 모르겠어.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 태그를 제거하여 HTML 테이블에서 데이터를 가져옵니다.&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;문자열 &quot;name&quot;을 사용하고 문자열 &quot;name1&quot;을 HTML 태그 없이 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;x = 0
anglebrackets = 0
name1 = &quot;&quot;
while x &amp;lt; len(name):
    
    if name[x] == &quot;&amp;lt;&quot;:
        anglebrackets = anglebrackets + 1
    if name[x] == &quot;&amp;gt;&quot;:
        anglebrackets = anglebrackets - 1
    if anglebrackets == 0:
        if name[x] != &quot;&amp;gt;&quot;:
            name1 = name1 + name[x]
    x = x + 1
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;import re

def remove(text):
    clean = re.compile('&amp;lt;.*?&amp;gt;')
    return re.sub(clean, '', text)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;129&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법은 완벽하게 작동하며 추가 설치가 필요하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import re
import htmlentitydefs

def convertentity(m):
    if m.group(1)=='#':
        try:
            return unichr(int(m.group(2)))
        except ValueError:
            return '&amp;amp;#%s;' % m.group(2)
        try:
            return htmlentitydefs.entitydefs[m.group(2)]
        except KeyError:
            return '&amp;amp;%s;' % m.group(2)

def converthtml(s):
    return re.sub(r'&amp;amp;(#?)(.+?);',convertentity,s)

html =  converthtml(html)
html.replace(&quot;&amp;amp;nbsp;&quot;, &quot; &quot;) ## Get rid of the remnants of certain formatting(subscript,superscript,etc).
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;130&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/753052/&lt;a href=&quot;https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python&quot; target=&quot;_blank&quot; papago-id=&quot;130-1&quot;&gt;strip-html-from-strings-in-python&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2330</guid>
      <comments>https://prostudy.tistory.com/2330#entry2330comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:57:33 +0900</pubDate>
    </item>
    <item>
      <title>비누 연장 설치 방법</title>
      <link>https://prostudy.tistory.com/2329</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;Soap 설치 방법&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;blockquote&gt; 
 &lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;치명적인 오류: 16행의 /home/user/mysite.com/path/to/file.php에서 클래스 'SoapClient'를 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DreamHost에서 사이트를 호스팅하고 있는데 서드파티 설치를 지원하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갱신:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는:이 문자에 그php.ini 파일 복사했다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://sxi.sabrextreme.com/dh-phpini&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹사이트에서 API를 사용하고 있는데 다음과 같이 되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#######################################################################
## You need to enable the following extensions in your PHP.ini file&amp;nbsp;&amp;nbsp;##
## php_openssl.dll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ##
## php_soap.dll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;##
#######################################################################
&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;다음은 내 php.ini 파일의 확장자 목록입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension=php_bz2.dll
;extension=php_cpdf.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_dbx.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_java.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_msql.dll
;extension=php_mysql.dll
;extension=php_oci8.dll
**extension=php_openssl.dll**
;extension=php_oracle.dll
;extension=php_pdf.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
;extension=php_sockets.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
;extension=php_w32api.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
;extension=php_yaz.dll
;extension=php_zip.dll
&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;문제는 확장자 php_soap.dll을 찾을 수 없다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;h1 papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows 의 경우&lt;/font&gt;&lt;/h1&gt; 
&lt;ol&gt; 
 &lt;li&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;extension=php_soap.dll&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extension=soap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;php&lt;em papago-id=&quot;13-1&quot;&gt;.ini&lt;/em&gt; 를 &lt;em papago-id=&quot;13-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;soap.ini&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;em papago-id=&quot;14-1&quot;&gt;conf.d&lt;/em&gt; 디렉토리로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&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;/li&gt; 
&lt;/ol&gt; 
&lt;h1 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Linux의 경우&lt;/font&gt;&lt;/h1&gt; 
&lt;h2 papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu:&lt;/font&gt;&lt;/h2&gt; 
&lt;h3 papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP7&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;em papago-id=&quot;19&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;pre&gt;&lt;code&gt;sudo apt-get install php7.0-soap 
sudo systemctl restart apache2
&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;PHP5&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install php-soap
sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OpenSuse:&lt;/font&gt;&lt;/h2&gt; 
&lt;h3 papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP7&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;em papago-id=&quot;23&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;pre&gt;&lt;code&gt;sudo zypper in php7-soap
sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;24&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;pre&gt;&lt;code&gt;sudo zypper in php7-soap
sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&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;strong papago-id=&quot;25-1&quot;&gt;ubuntu&lt;/strong&gt; 내&lt;/font&gt;&lt;/font&gt;&lt;code&gt;php_soap&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;strong papago-id=&quot;26-1&quot;&gt;사용&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/soap.installation.php&quot; papago-id=&quot;26-3&quot; rel=&quot;noreferrer&quot;&gt;레퍼런스&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install php7.0-soap
sudo systemctl restart apache2.service
&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;이전 버전의 php의 경우 아래 명령을 사용하여 apache를 재시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;apt-get install php-soap
&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;php.ini에서 다음 행을 찾습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;;extension=soap
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후 세미를 제거하&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 아파치 서버&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음의 순서에 따라 주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; 1) Locate php.ini in your apache bin folder, I.e Apache/bin/php.ini
 2) Remove the ; from the beginning of extension=php_soap.dll
 3) Restart your Apache server (by using : 
    # /etc/init.d/apache2 restart OR 
    $ sudo /etc/init.d/apache2 restart OR 
    $ sudo service apache2 restart)
 4) Look up your phpinfo();

 you may check here as well,if this does not solve your issue:  
 https://www.php.net/manual/en/soap.requirements.php
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu에서는 php7을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;3:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt install php7.3-soap 
sudo service apache2 restart
&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;제 php.ini에 extension=syslog_syslog.syslog가 없는 것도 같은 문제가 있었습니다만, 이것은 php.ini를 이전과 이전 버전에서 복사했기 때문입니다(좋은 생각은 아닙니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ext 디렉토리에서 dll을 찾았기 때문에 직접 php.ini extension=dll_dll.dll에 넣기만 하면 됩니다.apache 재시작 후 모든 작업이 soap :)&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;Linux Ubuntu 사용방법...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install php7.1-soap 
&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;php_soap.ao&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;/usr/lib/php/20160303/&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ls /usr/lib/php/20160303/ | grep -i soap
soap.so
php_soap.so
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;sudo vi /etc/php/7.1/cli/php.ini
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;회선을 변경합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;;extension=php_soap.dll&lt;/code&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;p&gt;&lt;code&gt;extension=php_soap.so&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo systemctl restart apache2
&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;Checking...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;php -m | more
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Dreamhost는 현재 PHP 5.3 빌드에 SoapClient를 포함하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;dreamhost 제어판의 도메인 설정 섹션에서 php 버전을 전환할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서와 같이 지원되지 않으며 어떠한 도움도 받지 않지만 커스텀 확장을 설치할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러기 위해서는 &lt;a href=&quot;http://wiki.dreamhost.com/Advanced_PHP_configuration&quot; papago-id=&quot;41-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;먼저 php&lt;/a&gt; 5의 &lt;a href=&quot;http://wiki.dreamhost.com/Advanced_PHP_configuration&quot; papago-id=&quot;41-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;로컬 설치를 설정&lt;/a&gt;해야 합니다.이 과정에서 필요한 확장자를 컴파일하거나 그 후 php.ini에 동적으로 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu+php 5.6+nginx에 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt install php5.6-soap
sudo systemctl restart nginx
sudo systemctl restart php5.6-fpm.service
&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;p papago-id=&quot;44&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/2509143/&lt;a href=&quot;https://stackoverflow.com/questions/2509143/how-do-i-install-soap-extension&quot; target=&quot;_blank&quot; papago-id=&quot;44-1&quot;&gt;how-do-i-install-soap-extension&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2329</guid>
      <comments>https://prostudy.tistory.com/2329#entry2329comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:36:15 +0900</pubDate>
    </item>
    <item>
      <title>오류: '../build/debug/sqlclient' 모듈을 찾을 수 없습니다.</title>
      <link>https://prostudy.tistory.com/2328</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류: '../build/debug/sqlclient' 모듈을 찾을 수 없습니다.&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;디렉토리에서 표준 npm install mariasql --save를 실행했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버 파일 -node app.http을 실행할 때 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 오류가 반환됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; Error: Cannot find module '../build/Debug/sqlclient'
        at Function.Module._resolveFilename (module.js:338:15)
        at Function.Module._load (module.js:280:25)
        at Module.require (module.js:364:17)
        at require (module.js:380:17)
        at Object.&amp;lt;anonymous&amp;gt; (/home/asa/Dropbox/justRent/development/node_modules/mariasql/lib/Client.js:12:11)
        at Module._compile (module.js:456:26)
        at Object.Module._extensions..js (module.js:474:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:312:12)
        at Module.require (module.js:364:17)
&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;노드 측에서 문제가 되지 않기를 바랍니다. 권한을 올바르게 설정하지 않은 경우 DB 서버가 모든 호스트로부터 연결을 수신하고 있는지 확인하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'DBPASSWORD' WITH GRANT OPTION;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 사용자 테이블에서 이 설정을 마친 후 maria sql 패키지를 노드에 재설치하여 시도합니다.&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;URL : https://stackoverflow.com/questions/37851168/&lt;a href=&quot;https://stackoverflow.com/questions/37851168/error-cannot-find-module-build-debug-sqlclient&quot; target=&quot;_blank&quot; papago-id=&quot;4-1&quot;&gt;error-cannot-find-module-build-debug-sqlclient&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2328</guid>
      <comments>https://prostudy.tistory.com/2328#entry2328comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:33:48 +0900</pubDate>
    </item>
    <item>
      <title>SELECT... GROUP BY 쿼리에서 반복 방지</title>
      <link>https://prostudy.tistory.com/2327</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SELECT... GROUP BY 쿼리에서 반복 방지&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;마리아DB 10.3.29를 작업 중입니다.&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;SELECT
    MIN(IF(v &amp;gt; 0, v, v*100)) AS min,
    MAX(IF(v &amp;gt; 0, v, v*100)) AS max
FROM tab
WHERE someCondition = 0
GROUP BY someGroup;
&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;IF(v &amp;gt; 0, v, v*100)&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 class=&quot;papago-parent&quot;&gt;내가 틀렸을 수도 있고 마리아DB는 반복하지 않을 만큼 똑똑할 수도 있다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든 가능하면 피하고 싶어요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;SELECT
    IF(v &amp;gt; 0, v, v*100) as val
    MIN(val) AS min,
    MAX(val) AS max
FROM tab
WHERE someCondition = 0
GROUP BY someGroup;
&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;단, 이 동작은 I dought I dought I doice&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GROUP BY&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;a href=&quot;https://mariadb.com/kb/en/aggregate-functions/&quot; papago-id=&quot;7-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;집약&lt;/a&gt; 함수를 &lt;a href=&quot;https://mariadb.com/kb/en/aggregate-functions/&quot; papago-id=&quot;7-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;사용&lt;/a&gt;하려면 보유해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/create-table/#create-temporary-table&quot; papago-id=&quot;7-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;임시&lt;/a&gt; 테이블을 사용하는 것이 좋습니까? 만약 그렇다면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리 옵티마이저는 한 행에 한 번만 계산할 수 있을 정도로 스마트합니다.&lt;/font&gt;&lt;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;CTE를 사용해 볼 수도 있지만, 옵티마이저는 원래 SQL과 동일한 쿼리를 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;with T1 as (
   SELECT
   IF(v &amp;gt; 0, v, v*100) as val, 
   other_columns…
   FROM tab
   WHERE someCondition = 0
)
SELECT min(val), max(val)
from T1…
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/69710441/&lt;a href=&quot;https://stackoverflow.com/questions/69710441/avoid-repetition-in-select-group-by-query&quot; target=&quot;_blank&quot; papago-id=&quot;10-1&quot;&gt;avoid-repetition-in-select-group-by-query&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2327</guid>
      <comments>https://prostudy.tistory.com/2327#entry2327comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:23:33 +0900</pubDate>
    </item>
    <item>
      <title>Vue.js 및 Vuex: 이거.$store가 정의되지 않았습니다.</title>
      <link>https://prostudy.tistory.com/2326</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Vue.js 및 Vuex: 이거.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$store가 정의되지 않았습니다.&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;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;내 저장소는 다음과 같습니다. obs: vuex 플러그인을 설치했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   import Vue from 'vue';
import Vuex from 'vuex';


Vue.use(Vuex)

const state = {
    titulo: &quot;please, change title&quot;
}


const mutations = {
    changeTitle(state, title) {
        state.title= title
    }
}


export default new Vuex.Store({

    state : state,
    mutations : mutations
})
&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;My App.vue&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;template&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;show-title-component &amp;gt;&amp;lt;/show-title-component&amp;gt;
      &amp;lt;change-title-component&amp;gt;&amp;lt;/change-title-component&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;


import ShowTitleComponent from './components/ShowtitleComponent';
import ChangeTitleComponent from './components/ChangeTitleComponent';
import store from './vuex/store';

export default {

components: {ShowTitleComponent, ChangeTitleComponent},
store,
data: function() {
  return {title: 'placeholder'}
}


}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류를 생성하는 구성 요소:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;template&amp;gt;&amp;lt;div&amp;gt;{{ title}}&amp;lt;/div&amp;gt;&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;

export default {
    name: &quot;show-title-component&quot;,
    computed: {
      title() {
        return this.$store.state.title   /** error   here */
      }
    }
}

&amp;lt;/script&amp;gt;
&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;store&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;strong papago-id=&quot;1-1&quot;&gt;Vue&lt;/strong&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;앱 진입점(app.js, main.js 또는 index.js)에는 다음 코드가 포함되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import store from './store'

new Vue({
 ...
 store,
 ...
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후 를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.$store&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 컴포넌트에서든&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 아키텍처를 추천합니다.https://vuex.vuejs.org/en/&lt;a href=&quot;https://vuex.vuejs.org/en/structure.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-1&quot;&gt;structure&lt;/a&gt;.html&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;스토어 파일은 Javascript(.js) 파일이어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일명을 변경하고, 서버를 재기동하면, 이것이 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$140 오류가 사라집니다.&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;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;App.vue&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import store from './vuex/store';  /** in my case, it should be js file. */
&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;main.js 파일&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import Vue from &quot;vue&quot;;
import App from &quot;./App.vue&quot;;
import router from &quot;./router&quot;;
import Vuex from 'vuex';
import {store}  from './store'  //use curly braces to around store. 

Vue.config.productionTip = false;

Vue.use(Vuex);

new Vue({
  router,
  store,
  render: (h) =&amp;gt; h(App),
}).$mount(&quot;#app&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 나한테 효과가 있었어.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저 같은 경우에는 모듈을 사용하고 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;돌연변이, 행동, 게터에 아무 문제 없이 접근할 수 있었다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 주 정부는 아니야&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책은 모듈을 사용하는 경우 모듈의 네임스페이스를 사용하여 액세스해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세한 것에 대하여는, &lt;a href=&quot;https://vuex.vuejs.org/guide/modules.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17-1&quot;&gt;메뉴얼&lt;/a&gt;을 참조해 주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
 state: { ... },
 mutations: { ... },
 actions: { ... }
}

const store = new Vuex.Store({
    modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -&amp;gt; `moduleA`'s state
store.state.b // -&amp;gt; `moduleB`'s state
&lt;/code&gt;&lt;/pre&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;기본적으로는 모듈 내의 액션, 돌연변이 및 getter는 글로벌 네임스페이스에 등록되어 있습니다.&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;1. 반드시 스토어 디렉토리를 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;2.&lt;/font&gt;&lt;code&gt;npm i vuex -S&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3. 확인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src／store/index.js&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갖고 있다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;import Vuex from 'vuex'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Vue.use(Vuex)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4. 확인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src／main.js&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갖고 있다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;import store from './store'&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/47814626/&lt;a href=&quot;https://stackoverflow.com/questions/47814626/vue-js-and-vuex-this-store-is-undefined&quot; target=&quot;_blank&quot; papago-id=&quot;25-1&quot;&gt;vue-js-and-vuex-this-store-is-undefined&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2326</guid>
      <comments>https://prostudy.tistory.com/2326#entry2326comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:22:35 +0900</pubDate>
    </item>
    <item>
      <title>Maven에 종속성 추가</title>
      <link>https://prostudy.tistory.com/2325</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Maven에 종속성 추가&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;가지고 있는 jar 파일을 maven 2의 종속 시스템에 추가하려면 어떻게 해야 하나요?&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;h3 papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1. JAR에 groupId, artifictId 및 버전을 지정하여 저장소에 추가합니다.&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내부 저장소가 없고 로컬 저장소에 JAR을 추가하려는 경우 임의의 groupId/artifactIds를 사용하여 다음과 같이 설치할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mvn install:install-file -DgroupId=com.stackoverflow... -DartifactId=yourartifactid... -Dversion=1.0 -Dpackaging=jar -Dfile=/path/to/jarfile
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내부 저장소가 있는 경우 내부 저장소로 배포할 수도 있으며, 조직 내 다른 개발자가 이를 사용할 수 있도록 할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 저장소의 웹 기반 인터페이스를 사용하여 아티팩트를 추가할 뿐이지만, 다음을 사용하여 동일한 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mvn deploy:deploy-file ...&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;h3 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2. 종속 프로젝트를 업데이트하여 이 JAR을 참조합니다.&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 요소에 다음 항목을 추가하여 JAR을 사용하는 프로젝트의 pom.xml 종속성을 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt;
    ...
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;com.stackoverflow...&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;artifactId...&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    ...
&amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 메이븐 저장소에 없는 종속성을 지정할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;팀의 중앙 저장소가 없거나 CI 서버가 &lt;a href=&quot;http://en.wikipedia.org/wiki/Continuous_integration&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9-1&quot;&gt;있는&lt;/a&gt; 경우 유용하게 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;com.stackoverflow&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;commons-utils&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;
        &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;
        &amp;lt;systemPath&amp;gt;${basedir}/lib/commons-utils.jar&amp;lt;/systemPath&amp;gt;
    &amp;lt;/dependency&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 class=&quot;papago-parent&quot;&gt;당신의 질문은 오해를 불러일으킬 수 있습니다.왜냐하면 우리가 이해하는 수준이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;maven&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;maven&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Eclipse&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트에 jar 파일을 추가하고 싶을 때는 보통 jar를 수동으로 다운로드한 후 &lt;strong papago-id=&quot;14-1&quot;&gt;lib&lt;/strong&gt; 디렉토리에 드롭합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;메이븐은 이런 식으로 하면 안 돼&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업내용은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://mvnrepository.com&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;mvnrepository&lt;/a&gt;로 이동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가할 라이브러리 검색&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;복사하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dependency&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에의 진술&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pom.xml&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경유하여 재구축하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mvn&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&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;maven&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;접속하여 다운로드 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jar&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;jar&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 class=&quot;papago-parent&quot;&gt;그래서 만약에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공유 파일도 필요했고, 그것도 다운로드 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&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;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;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;com.stackoverflow...&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;artifactId...&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;/p&gt;&lt;/li&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;mvn install&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;항아리를 다운로드하려고 하면 실패합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 프로세스에서는 오류 메시지와 함께 jar를 설치하는 완전한 명령을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령어를 복사해서 실행해! 쉽잖아?!&lt;/font&gt;&lt;/font&gt;&lt;/p&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;단순히 POM 업데이트 방법을 묻는 것이 아니라 &quot;유명한 저장소&quot;에 종속성을 밀어내는 방법을 묻는 것이라고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그렇다면, &lt;a href=&quot;http://maven.apache.org/guides/mini/guide-central-repository-upload.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;30-1&quot;&gt;이것&lt;/a&gt;이 당신이 읽고 싶은 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또, 내부 저장소 서버를 셋업 하고 싶은 유저의 &lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-repositories.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-1&quot;&gt;경우&lt;/a&gt;는, 여기를 봐 주세요(Maven 2 를 사용하는 경우의 문제의 절반은 문서를 찾는 것입니다).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/396245/&lt;a href=&quot;https://stackoverflow.com/questions/396245/add-a-dependency-in-maven&quot; target=&quot;_blank&quot; papago-id=&quot;32-1&quot;&gt;add-a-dependency-in-maven&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2325</guid>
      <comments>https://prostudy.tistory.com/2325#entry2325comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:18:09 +0900</pubDate>
    </item>
    <item>
      <title>구성 요소에서 getter를 사용할 수 있는 경우 v-overlay 값을 변경하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2324</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구성 요소에서 getter를 사용할 수 있는 경우 v-overlay 값을 변경하려면 어떻게 해야 합니까?&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;strong papago-id=&quot;1-1&quot;&gt;Vue.js&lt;/strong&gt; 애플리케이션 컴포넌트에서 Vuex 스토리지에서 정보를 가져옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 구성 요소 내에서 스토리지의 데이터를 사용할 수 없을 때까지 &lt;a href=&quot;https://vuetifyjs.com/ru/components/overlays&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;1-3&quot;&gt;v-overlay&lt;/a&gt;(프리로더)를 표시하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;얼마나 정확하게 만들죠?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;template&amp;gt;

  &amp;lt;v-navigation-drawer
    v-model=&quot;open&quot;
    absolute
    right&amp;gt;

    &amp;lt;v-overlay
      :absolute=&quot;absolute&quot;
      :opacity=&quot;opacity&quot;
      :value=&quot;overlay&quot;&amp;gt;

      &amp;lt;v-progress-circular
        indeterminate
        size=&quot;64&quot;&amp;gt;
      &amp;lt;/v-progress-circular&amp;gt;

    &amp;lt;/v-overlay&amp;gt;

    &amp;lt;v-checkbox
      v-if=&quot;!overlay&quot;
      hide-details
      v-model=&quot;selectedGenders&quot;
      v-for=&quot;gender in genders&quot;
      :label=&quot;gender&quot;
      :value=&quot;gender&quot;
      :key=&quot;gender&quot;&amp;gt;
    &amp;lt;/v-checkbox&amp;gt;

    &amp;lt;v-checkbox
      v-if=&quot;!overlay&quot;
      hide-details
      v-model=&quot;selectedIncomeRanges&quot;
      v-for=&quot;incomeRange in incomeRanges&quot;
      :label=&quot;incomeRange&quot;
      :value=&quot;incomeRange&quot;
      :key=&quot;incomeRange&quot;&amp;gt;
    &amp;lt;/v-checkbox&amp;gt;

  &amp;lt;/v-navigation-drawer&amp;gt;

&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
import {
  mapGetters,
  mapActions
} from 'vuex'

export default {
  name: 'RightNavigationDrawer',
  props: {
    open: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {
      absolute: true,
      opacity: 0.8,
      overlay: true,
      selectedGenders: [],
      selectedIncomeRanges: []
    }
  },
  mounted () {
    this.getGenders()
    this.getIncomeRanges()
  },
  computed: mapGetters('customStore', [
    'genders',
    'incomeRanges'
  ]),
  methods: mapActions('customStore', [
    'getGenders',
    'getIncomeRanges'
  ])
}
&amp;lt;/script&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;loading&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상태를 vuex로 표시하여 다른 vuex 상태와 같이 모든 구성 요소에서 사용할 수 있도록 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스토어에서 다음 항목을 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;loading&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 class=&quot;papago-parent&quot;&gt;다음으로 다음과 같이 컴포넌트에서 호출되는 로드 액션을 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;loadData({ commit, dispatch }) {
  commit('SET_LOADING', true);
  const loader1 = dispatch('getGenders')
  const loader2 = dispatch('getIncomeRanges')
  Promise.all([loader1, loader2]).then(() =&amp;gt; {
    commit('SET_LOADING', false);
  })
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;Promise.all&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로딩 액션으로부터 일련의 약속을 받아, 이러한 약속이 모두 해결될 때까지 해결되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 모든 걸 확실하게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getGenders&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getIncomeRanges&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;행동은 약속도 돌려준다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 컴포넌트에서는 맵만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;loading&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;loadData&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...mapState('customStore', ['loading']),
...mapActions('customStore', ['loadData'])
&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;mounted&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 액션을 호출하려면:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mounted() {
  this.loadData()
}
&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;loading&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 어디든지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;overlay&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 class=&quot;papago-parent&quot;&gt;이것은 우수한 패턴입니다. 왜냐하면 지금은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;loading&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 다른 상태와 함께 vuex에 한 번만 저장되며 로컬로 관리 및 전달되지 않고 모든 구성 요소에서 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://jsfiddle.net/sh0ber/kofehbr0/&quot; papago-id=&quot;16-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;이것&lt;/a&gt;은 타임아웃으로 AJAX 콜을 시뮬레이트하는 &lt;a href=&quot;https://jsfiddle.net/sh0ber/kofehbr0/&quot; papago-id=&quot;16-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;데모&lt;/a&gt;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(이 예에서는 단일 파일을 사용하여 vuex + vue를 관리하고 있기 때문에 약간 다르게 보이지만 쉽게 따라할 수 있습니다.)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시계를 차다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Vuex 스토리지에서 가져옵니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 이 값은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.overlay = true&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;watch: {
    overlay (val) {
      val &amp;amp;&amp;amp; setTimeout(() =&amp;gt; {
        this.overlay = false
      }, 3000)
    },
  },
&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;a href=&quot;https://codepen.io/pen/?&amp;amp;editable=true&amp;amp;editors=101&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-1&quot;&gt;코드펜 팔로우&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/59102489/&lt;a href=&quot;https://stackoverflow.com/questions/59102489/how-to-change-the-value-of-v-overlay-if-getters-are-available-in-component&quot; target=&quot;_blank&quot; papago-id=&quot;20-1&quot;&gt;how-to-change-the-value-of-v-overlay-if-getters-are-available-in-component&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2324</guid>
      <comments>https://prostudy.tistory.com/2324#entry2324comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:26:48 +0900</pubDate>
    </item>
    <item>
      <title>const char*연결</title>
      <link>https://prostudy.tistory.com/2323</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;const char*연결&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 두 개의 연속 문자를 연결해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const char *one = &quot;Hello &quot;;
const char *two = &quot;World&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하면 좋을까요?&lt;/font&gt;&lt;/p&gt; 
&lt;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;C 인터페이스를 갖춘 서드파티 라이브러리의 s는, 간단하게 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::string&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;6-1&quot;&gt;이&lt;/em&gt; 예에서 &lt;em papago-id=&quot;6-3&quot;&gt;1&lt;/em&gt;과 2는 char 상수를 가리키는 char 포인터입니다.&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;strcat(one,two); // append string two to string one.
&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;대신 결과를 유지하기 위해 별도의 변수(char 배열)를 사용해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char result[100];   // array to hold the result.

strcpy(result,one); // copy string one into the result.
strcat(result,two); // append string two to the result.
&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;C의 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char buf[100];
strcpy(buf, one);
strcat(buf, two);
&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;C++ 방식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;std::string buf(one);
buf.append(two);
&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;#define one &quot;hello &quot;
#define two &quot;world&quot;
#define concat(first, second) first second

const char* buf = concat(one, two);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::string&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;#include &amp;lt;string&amp;gt;

std::string result = std::string(one) + std::string(two);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;const char *one = &quot;Hello &quot;;
const char *two = &quot;World&quot;;

string total( string(one) + two );

// to use the concatenation as const char*, use:
total.c_str()
&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;strong papago-id=&quot;5-0&quot;&gt;: 변경됨&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;string total = string(one) + string(two);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;string total( string(one) + two );&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;퍼포먼스상의 이유(스트링 2 및 임시 스트링 합계)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// string total(move(move(string(one)) + two));  // even faster?
&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;C++ 를 사용하고 있다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::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;C스타일의 스트링 대신?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;std::string one=&quot;Hello&quot;;
std::string two=&quot;World&quot;;

std::string three= one+two;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문자열을 C 함수에 전달해야 할 경우, 단순히 전달만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;three.c_str()&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;문자열 크기를 모르는 경우 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main(){
    const char* q1 = &quot;First String&quot;;
    const char* q2 = &quot; Second String&quot;;

    char * qq = (char*) malloc((strlen(q1)+ strlen(q2))*sizeof(char));
    strcpy(qq,q1);
    strcat(qq,q2);

    printf(&quot;%s\n&quot;,qq);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 하나의 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// calculate the required buffer size (also accounting for the null terminator):
int bufferSize = strlen(one) + strlen(two) + 1;

// allocate enough memory for the concatenated string:
char* concatString = new char[ bufferSize ];

// copy strings one and two over to the new buffer:
strcpy( concatString, one );
strcat( concatString, two );

...

// delete buffer:
delete[] concatString;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 특별히 C++ 표준 라이브러리를 사용하지 않거나 사용할 수 없는 경우를 제외하고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::string&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마 더 안전할 거예요&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 라이브러리와 함께 C++를 사용하고 있는 것 같기 때문에 C++를 사용할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const char *&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&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&gt;&lt;/font&gt;&lt;code&gt;const char *&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::string&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const char *a = &quot;hello &quot;; 
const char *b = &quot;world&quot;; 
std::string c = a; 
std::string d = b; 
cout &amp;lt;&amp;lt; c + d;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선 동적 메모리 공간을 만들어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 두 줄을 그 안에 묶으면 돼요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 c++ &quot;string&quot; 클래스를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;구식 C 방식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  char* catString = malloc(strlen(one)+strlen(two)+1);
  strcpy(catString, one);
  strcat(catString, two);
  // use the string then delete it when you're done.
  free(catString);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로운 C++ 방식&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  std::string three(one);
  three += two;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strstream&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공식적으로는 권장되지 않지만, C 스트링으로 작업할 필요가 있는 경우에도 매우 유용한 도구라고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char result[100]; // max size 100
std::ostrstream s(result, sizeof result - 1);

s &amp;lt;&amp;lt; one &amp;lt;&amp;lt; two &amp;lt;&amp;lt; std::ends;
result[99] = '\0';
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;one&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 나서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;two&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&gt;&lt;/font&gt;&lt;code&gt;\0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::ends&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&gt;&lt;/font&gt;&lt;code&gt;99&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자 - 공백이 남아 있지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 마지막 위치에 수동으로 씁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;const char* one = &quot;one&quot;;
const char* two = &quot;two&quot;;
char result[40];
sprintf(result, &quot;%s%s&quot;, one, two);
&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;메모리의 동적 할당에서 strcpy 명령을 사용하지 않고 2개의 고정 char 포인터를 연결합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const char* one = &quot;Hello &quot;;
const char* two = &quot;World!&quot;;

char* three = new char[strlen(one) + strlen(two) + 1] {'\0'};

strcat_s(three, strlen(one) + 1, one);
strcat_s(three, strlen(one) + strlen(two) + 1, two);

cout &amp;lt;&amp;lt; three &amp;lt;&amp;lt; endl;

delete[] three;
three = nullptr;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1995053/&lt;a href=&quot;https://stackoverflow.com/questions/1995053/const-char-concatenation&quot; target=&quot;_blank&quot; papago-id=&quot;40-1&quot;&gt;const-char-concatenation&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2323</guid>
      <comments>https://prostudy.tistory.com/2323#entry2323comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:25:32 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript에서 정의되지 않은 변수를 확인하는 방법</title>
      <link>https://prostudy.tistory.com/2322</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JavaScript에서 정의되지 않은 변수를 확인하는 방법&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;alert( x );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하면 이 오류를 발견할 수 있을까요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JavaScript에서는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&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 class=&quot;papago-parent&quot;&gt;존재하지 않는 것에는 또 다른 가치가 있다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DOM이 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서 내에서 구조를 찾을 수 없는 거의 모든 경우이지만 JavaScript 자체에서 찾을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용되는 값입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘째, 아니요, 직접적인 등가물은 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대해 구체적으로 확인하고 싶은 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 다음 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (yourvar === null) // Does not execute if yourvar is `undefined`
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 존재하는지 여부를 확인하는 경우, 이 작업은 다음과 같이만 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;try&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;code&gt;catch&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;typeof&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;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;등가로서&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 변수가 &lt;em papago-id=&quot;15-1&quot;&gt;선언&lt;/em&gt;되었는지 여부를 확인하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;pre&gt;&lt;code&gt;if (yourvar !== undefined) // Any scope
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 버전에서는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typeof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;재할당할 수 있었기 때문에 연산자가 안전하게 정의되지 않았는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수처럼요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 방식은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (typeof yourvar !== 'undefined') // Any scope
&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;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2009년에 발표된 ECMAScript 5에서는 재배정이 수정되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 안전하게 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;===&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&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;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검사하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하지 않고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typeof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;~하듯이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한동안 읽기 전용이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Truthy&quot; rel=&quot;noreferrer&quot; papago-id=&quot;28-1&quot;&gt;truthy인지&lt;/a&gt; 여부를 확인하려면 다음 절차를 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (yourvar)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://lists.evolt.org/archive/Week-of-Mon-20050214/099714.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원천&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 다음과 같은지 여부를 실제로 검정할 수 있는 유일한 방법은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 작업을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;defined&quot;는 JavaScript의 객체입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (typeof someVar === 'undefined') {
  // Your variable is undefined
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 스레드의 다른 솔루션 중 일부는 변수가 정의되어 있어도(예를 들어 NULL 또는 0으로 설정) 정의되어 있지 않다고 믿게 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기술적으로 적절한 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typeof x === &quot;undefined&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가끔 게으름을 피워 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;x == 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;그러나 정의되지 않은 변수 x와 null을 포함하는 변수 x가 모두 true를 반환할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 쉽고 간단한 버전은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (!x) {
   //Undefined
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (typeof x !== &quot;undefined&quot;) {
    //Do something since x is defined.
}
&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;function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
&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;ol&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-0&quot;&gt;정의&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-0&quot;&gt;정의&lt;/strong&gt;되지 않음 - 변수가 선언되지도 않았습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 가지 경우를 모두 확인하는 유일한 안전한 방법은 사용입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typeof myVar === 'undefined'&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;myVar === undefined&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(1)을 사용하다&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「myVar is defined」는, 「myVar is not defined」라고 하는 경우는,  번호 not defined」라고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;myVar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선언도 안 되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;OP는 구체적으로 &quot;정의되지 않은&quot; 케이스(2)에 대해 묻습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sup papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신: 현대의 ES6 세계에서 '케이스 2'가 드물어지고 있는 것은 이해하지만, 일부 오래된 레거시 컴포넌트는 여전히 과거에 존재합니다.&lt;/font&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오퍼레이터가 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;undefined&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;void 0&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 papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 '오류', '오류', '오류', '오류', '오류'를 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;존재하지도 않아!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;52-1&quot;&gt;값&lt;/strong&gt;이 &lt;strong papago-id=&quot;52-3&quot;&gt;할당&lt;/strong&gt;되는 것과는 다른 선언되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var x; // declaration
x = 2; // assignment
&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;x&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ''라는  됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;code&gt;x&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;존재/선언되었지만 값이 할당되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하려면 , 을 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typeof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 존재하는지 여부를 확인하는 다른 방법은 처음에 받은 것과 동일한 오류를 발생시킵니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(typeof x  !==  &quot;undefined&quot;) {
    alert(x);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; '이러다'에 되어 있는 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 돌아올 뿐이다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;x&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;em papago-id=&quot;62-1&quot;&gt;선언&lt;/em&gt;되어 아직 할당되지 않은 경우 OR로 선언되지 않았습니다.&lt;/font&gt;&lt;/font&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인정된 답변은 정확합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이 경우에도 하실 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;try ... catch&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 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;var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;catch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;블록 레벨의 스코프를 작성하기 때문에, 조금 지저분합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론, 이 예에서는, 에러 처리의 베스트 프랙티스는 다루지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&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;window&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 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;if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function isNotDefined(value) {
  return typeof value === &quot;undefined&quot;;
}
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ternary 조건부 연산자를 사용할 수도 있습니다.&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;&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;var a = &quot;hallo world&quot;;
var a = !a ? document.write(&quot;i dont know 'a'&quot;) : document.write(&quot;a = &quot; + a);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;&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;//var a = &quot;hallo world&quot;;
var a = !a ? document.write(&quot;i dont know 'a'&quot;) : document.write(&quot;a = &quot; + a);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;73&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;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수를 초기화하지 않으면 예외가 &quot;Uncatched ReferenceError: 변수가 정의되지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&quot;&lt;/font&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;undefined&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;var x; 

if (x === undefined) {
    alert(&quot;x is undefined&quot;);
} else {
     alert(&quot;x is defined&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 선언된 것을 확인하기 위해 작은 함수를 사용하여 javascript 파일의 잡동사니를 줄입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 존재할 뿐만 아니라 값이 할당되었는지 확인하기 위해 값 체크를 추가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 조건은 변수가 정의되었지만 인스턴스화되지 않은 경우(아래 예 참조) 코드 내에서 값을 참조하려고 하면 오류가 발생하므로 변수도 인스턴스화되었는지 여부를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;되지 않음 - &quot;Not instantized - &quot; &quot;Not instantized&quot; (인스턴스화되지 않음)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var my_variable;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 스턴스 instant instant -&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var my_variable = &quot;&quot;;&lt;/code&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function varExists(el) { 
  if ( typeof el !== &quot;undefined&quot; &amp;amp;&amp;amp; typeof el.val() !== &quot;undefined&quot; ) { 
    return true; 
  } else { 
    return false; 
  } 
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;80&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;if ( varExists(variable_name) ) { // checks that it DOES exist } 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;81&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;if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;82&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/858181/&lt;a href=&quot;https://stackoverflow.com/questions/858181/how-to-check-a-not-defined-variable-in-javascript&quot; target=&quot;_blank&quot; papago-id=&quot;82-1&quot;&gt;how-to-check-a-not-defined-variable-in-javascript&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2322</guid>
      <comments>https://prostudy.tistory.com/2322#entry2322comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:22:06 +0900</pubDate>
    </item>
    <item>
      <title>관찰 가능한 목록 결합 후 모두 완료될 때까지 기다립니다.</title>
      <link>https://prostudy.tistory.com/2321</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;strong papago-id=&quot;1-0&quot;&gt;TL;DR&lt;/strong&gt; 변환 방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task.whenAll(List&amp;lt;Task&amp;gt;)&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;RxJava&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;List&amp;lt;Task&amp;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;Task&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;a href=&quot;https://github.com/BoltsFramework/Bolts-Android#tasks-in-parallel&quot; papago-id=&quot;6-3&quot; rel=&quot;noreferrer&quot;&gt;볼트 사이트의 예&lt;/a&gt;에 따라 목록의 모든 작업이 완료되면 &lt;em papago-id=&quot;6-1&quot;&gt;완료&lt;/em&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&gt;&lt;code&gt;Bolts&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;RxJava&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;Observable&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;merge&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;zip&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;concat&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타...&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 을 사용하다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;List&amp;lt;Observable&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 해도 될 것 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Observables&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 그 문서를 제대로 이해한다면 말이야.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;RxJava&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검색해 보았습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&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;flatMap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&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;public Observable&amp;lt;Boolean&amp;gt; whenAll(List&amp;lt;Observable&amp;lt;Boolean&amp;gt;&amp;gt; tasks) {
    return Observable.from(tasks)
            //execute in parallel
            .flatMap(task -&amp;gt; task.observeOn(Schedulers.computation()))
            //wait, until all task are executed
            //be aware, all your observable should emit onComplete event
            //otherwise you will wait forever
            .toList()
            //could implement more intelligent logic. eg. check that everything is successful
            .map(results -&amp;gt; true);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/ReactiveX/RxJava/issues/3532#issuecomment-157509946&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;병렬 실행의 또 다른 좋은 예&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;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;a href=&quot;http://reactivex.io/RxJava/javadoc/rx/Observable.html#zip%28java.lang.Iterable,%20rx.functions.FuncN%29&quot; rel=&quot;noreferrer&quot; papago-id=&quot;23-1&quot;&gt;집&lt;/a&gt; 교환원을 찾으시는 것 같네요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 다른 사용법이 있으니 예를 들어 보겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다양한 유형의 간단한 관측 가능 변수가 몇 개 있다고 가정해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Observable&amp;lt;Integer&amp;gt; obs1 = Observable.just(1);
Observable&amp;lt;String&amp;gt; obs2 = Observable.just(&quot;Blah&quot;);
Observable&amp;lt;Boolean&amp;gt; obs3 = Observable.just(true);
&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;이 모든 것을 기다리는 가장 간단한 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -&amp;gt; i + &quot; &quot; + s + &quot; &quot; + b)
.subscribe(str -&amp;gt; System.out.println(str));
&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;zip 함수에서는 매개변수가 zip되는 관측치의 유형에 해당하는 구체적인 유형을 가집니다.&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;List&amp;lt;Observable&amp;lt;?&amp;gt;&amp;gt; obsList = Arrays.asList(obs1, obs2, obs3);

Observable.zip(obsList, (i) -&amp;gt; i[0] + &quot; &quot; + i[1] + &quot; &quot; + i[2])
.subscribe(str -&amp;gt; System.out.println(str));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;Observable&amp;lt;Observable&amp;lt;?&amp;gt;&amp;gt;&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;Observable&amp;lt;Observable&amp;lt;?&amp;gt;&amp;gt; obsObs = Observable.from(obsList);

Observable.zip(obsObs, (i) -&amp;gt; i[0] + &quot; &quot; + i[1] + &quot; &quot; + i[2])
.subscribe(str -&amp;gt; System.out.println(str));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 두의 zip만 할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Object[]&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;목록에 있는 관측 가능성의 유형 및 개수를 미리 알 수 없기 때문에 매개 변수입니다.&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;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;1 Blah true&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;33-0&quot;&gt;편집:&lt;/strong&gt; Zip을 사용할 때,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Observables&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모두 같은 수의 아이템을 방출합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;Observable&amp;lt;Integer&amp;gt; obs1 = Observable.from(new Integer[]{1,2,3}); //Emits three items
Observable&amp;lt;String&amp;gt; obs2 = Observable.from(new String[]{&quot;Blah&quot;,&quot;Hello&quot;}); //Emits two items
Observable&amp;lt;Boolean&amp;gt; obs3 = Observable.from(new Boolean[]{true,true}); //Emits two items
&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;1, Blah, True&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;2, Hello, True&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지퍼&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 관측치가 완성됐기 때문에 지퍼가 잠기지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제안된 제안 중 zip&lt;a href=&quot;https://stackoverflow.com/a/35363084/365237&quot; papago-id=&quot;39-1&quot;&gt;()&lt;/a&gt;은 실제로 관측 가능한 결과를 서로 결합합니다.이것은 원하는 것일 수도 있고 그렇지 않을 수도 있지만 질문에서는 질문되지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문에서 원하는 것은 각 작업을 하나씩 또는 병렬로 실행하는 것이었습니다(지정되지 않았지만 Linked Bolts의 예는 병렬 실행에 관한 것이었습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 zip()은 관찰 가능한 항목이 하나라도 완료되면 즉시 완료되므로 요구 사항을 위반합니다.&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;Observatables 병렬 실행의 경우 &lt;a href=&quot;https://stackoverflow.com/a/35365371/365237&quot; papago-id=&quot;40-1&quot;&gt;다른&lt;/a&gt; 응답에 &lt;a href=&quot;https://stackoverflow.com/a/35365371/365237&quot; papago-id=&quot;40-1&quot;&gt;제시&lt;/a&gt;된 platMap()은 &lt;a href=&quot;http://reactivex.io/RxJava/1.x/javadoc/rx/Observable.html#merge-java.lang.Iterable-&quot; rel=&quot;noreferrer&quot; papago-id=&quot;40-3&quot;&gt;괜찮지만 &lt;/a&gt;merge()가 더 간단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Observatables 오류 시 Marge가 종료됩니다.모든 Observatable이 완료될 때까지 종료를 연기하면 &lt;a href=&quot;http://reactivex.io/RxJava/1.x/javadoc/rx/Observable.html#mergeDelayError-java.lang.Iterable-&quot; rel=&quot;noreferrer&quot; papago-id=&quot;40-5&quot;&gt;mergeDelayError()&lt;/a&gt;가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1개씩은 Observable&lt;a href=&quot;http://reactivex.io/RxJava/1.x/javadoc/rx/Observable.html#concat-java.lang.Iterable-&quot; papago-id=&quot;41-1&quot; rel=&quot;noreferrer&quot;&gt;.concat() static&lt;/a&gt; 메서드를 사용해야 한다고 &lt;a href=&quot;http://reactivex.io/RxJava/1.x/javadoc/rx/Observable.html#concat-java.lang.Iterable-&quot; papago-id=&quot;41-1&quot; rel=&quot;noreferrer&quot;&gt;생각&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;javadoc 상태는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;concat(198.199)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Itherable &amp;gt; sequence) 반복 가능한 관측 가능을 연속해서 하나의 관측 가능으로 평탄화한다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 반환 값이 아닌 작업 완료에만 관심이 있는 경우 관찰 &lt;a href=&quot;http://reactivex.io/RxJava/1.x/javadoc/rx/Observable.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;44-3&quot;&gt;가능&lt;/a&gt; 대신 완료 &lt;a href=&quot;http://reactivex.io/RxJava/1.x/javadoc/rx/Completable.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;44-1&quot;&gt;테이블&lt;/a&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;TLDR: 태스크와 완료 시 온컴플리트이벤트를 1대 1로 실행할 경우 Completetable.concat()이 가장 적합하다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;병렬 실행의 경우 Completable.merge() 또는 Completable.mergeDelayError()는 솔루션과 같이 발음됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전자는 모든 complete 테이블의 오류에 대해 즉시 중지되고, 후자는 둘 중 하나에 오류가 있더라도 모두 실행된 후 오류를 보고합니다.&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;코틀린과 함께&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Observable.zip(obs1, obs2, BiFunction { t1 : Boolean, t2:Boolean -&amp;gt;

})
&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 papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 인수 유형은 인수 수: BiFunction for 2 Function 3 for 3 Function 4 for 4 ...에 따라 변경됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러분들도 아마 보셨을 거예요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;zip&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2개의 관측치를 사용하는 연산자.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스태틱 방식도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Observable.zip&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;zip(java.lang.Iterable&amp;lt;? extends Observable&amp;lt;?&amp;gt;&amp;gt; ws, FuncN&amp;lt;? extends R&amp;gt; zipFunction)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한&lt;a href=&quot;http://reactivex.io/RxJava/javadoc/&quot; rel=&quot;nofollow&quot; papago-id=&quot;53-1&quot;&gt; 내용은 javadoc&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JavaRx Observatibles와 RxKotlin으로 코틀린에서 몇 가지 계산 코드를 작성하고 있습니다.&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;또한 모든 CPU 코어를 사용하기 위해 Observatibles를 병렬로 실행해야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 결국 다음과 같은 해결책을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Volatile var results: MutableList&amp;lt;CalculationResult&amp;gt; = mutableListOf()

fun doALotOfCalculations(listOfCalculations: List&amp;lt;Calculation&amp;gt;): Observable&amp;lt;Pair&amp;lt;String, CalculationResult&amp;gt;&amp;gt; {

    return Observable.create { subscriber -&amp;gt;
        Observable.concatEager(listOfCalculations.map { calculation: Calculation -&amp;gt;
            doCalculation(calculation).subscribeOn(Schedulers.computation()) // function doCalculation returns an Observable with only one result
        }).subscribeBy(
            onNext = {
                results.add(it)
                subscriber.onNext(Pair(&quot;A calculation is ready&quot;, it))

            },
            onComplete = {
                subscriber.onNext(Pair(&quot;Finished: ${results.size}&quot;, findBestCalculation(results)) 
                subscriber.onComplete()
            },
            onError = {
                subscriber.onError(it)
            }
        )
    }
}
&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;비슷한 문제가 있었습니다.Resent Search Provider에서 저장된 제안을 통합하는 동시에 rest call에서 검색 항목을 가져와야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AUTHORITY를 조합하여 하나의 통합 목록을 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;@MyDogTom 솔루션을 사용하려고 했는데 아쉽게도 Observable은 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;RxJava에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 조사를 한 후에 나는 나에게 맞는 해결책을 찾았다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; fun getSearchedResultsSuggestions(context : Context, query : String) : Single&amp;lt;ArrayList&amp;lt;ArrayList&amp;lt;SearchItem&amp;gt;&amp;gt;&amp;gt;
{
    val fetchedItems = ArrayList&amp;lt;Observable&amp;lt;ArrayList&amp;lt;SearchItem&amp;gt;&amp;gt;&amp;gt;(0)
    fetchedItems.add(fetchSearchSuggestions(context,query).toObservable())
    fetchedItems.add(getSearchResults(query).toObservable())

    return Observable.fromArray(fetchedItems)
        .flatMapIterable { data-&amp;gt;data }
        .flatMap {task -&amp;gt; task.observeOn(Schedulers.io())}
        .toList()
        .map { ArrayList(it) }
}
&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;font class=&quot;papago-parent&quot;&gt;그런 다음 platMapItable을 사용하여 작업을 검토하고 플랫맵을 사용하여 결과를 배열에 배치하면 나중에 재활용 보기로 가져올 수 있습니다.&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;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Project Reactor를 사용하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Mono.when&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;Mono.when(publisher1, publisher2)
.map(i-&amp;gt; {
    System.out.println(&quot;everything is done!&quot;);
    return i;
}).block()
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/35357919/&lt;a href=&quot;https://stackoverflow.com/questions/35357919/combine-a-list-of-observables-and-wait-until-all-completed&quot; target=&quot;_blank&quot; papago-id=&quot;59-1&quot;&gt;combine-a-list-of-observables-and-wait-until-all-completed&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2321</guid>
      <comments>https://prostudy.tistory.com/2321#entry2321comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:21:00 +0900</pubDate>
    </item>
    <item>
      <title>#1273 &amp;ndash; 불명확한 대조: 'utf8mb4_unicode_520_ci'</title>
      <link>https://prostudy.tistory.com/2320</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;#1273 – 불명확한 대조: 'utf8mb4_unicode_520_ci'&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;strong papago-id=&quot;1-1&quot;&gt;로컬&lt;/strong&gt; WAMP 서버에 WordPress 웹사이트가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 라이브 서버에 데이터베이스를 업로드하면 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#1273 – Unknown collation: ‘utf8mb4_unicode_520_ci’
&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;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 서버와 라이브 서버가 다른 버전의 MySQL을 실행하고 있기 때문에 이 오류가 발생한 것으로 생각됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 편집기에서 sql 파일 열기&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 검색 및 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;utf8mb4_unicode_520_ci&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;utf8mb4_unicode_ci&lt;/code&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장 후 새 mySql DB에 업로드&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;img src=&quot;https://i.stack.imgur.com/eiwa7.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;1&quot;&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;ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 안에서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.sql&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;pre&gt;&lt;code&gt;ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 알고 의 우우, in니 in in in in in in in&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 실행되고 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQL 5.5&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;br&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;MySQL 5.6&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;br&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;.sql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 서버에서 내보낸 파일입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 5는 MySQL 5.5를 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;utf8mb4_unicode_520_ci&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;br&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;MySQL 5.6 my my my my 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&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;MySQL 5.6&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;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 5.5에서 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 복사해 . - 복사해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.sql&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;br&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;utf8mb4unicode520_ci&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;utf8mb4_unicode_520_ci&lt;/code&gt;&lt;br&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;code&gt;utf8mb4_unicode_ci&lt;/code&gt;&lt;br&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;한 내용을 .- 「 Import 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.sql&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;filename을 클릭합니다.&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;텍스트 에디터에서 sql 파일을 엽니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;33-0&quot;&gt;1. 검색:&lt;/strong&gt; &lt;strong papago-id=&quot;33-2&quot;&gt;utf8mb4_unicode_ci&lt;/strong&gt; 치환&lt;strong papago-id=&quot;33-2&quot;&gt;:&lt;/strong&gt; utf8_general_ci &lt;strong papago-id=&quot;33-4&quot;&gt;(모두 &lt;/strong&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;strong papago-id=&quot;34-0&quot;&gt;2. 검색:&lt;/strong&gt; &lt;strong papago-id=&quot;34-2&quot;&gt;utf8mb4_unicode_520_ci&lt;/strong&gt; 치환&lt;strong papago-id=&quot;34-2&quot;&gt;:&lt;/strong&gt; utf8_general_ci &lt;strong papago-id=&quot;34-4&quot;&gt;(모두 &lt;/strong&gt;치환)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;35-0&quot;&gt;3. 검색:&lt;/strong&gt; &lt;strong papago-id=&quot;35-2&quot;&gt;utf8mb4 &lt;/strong&gt;치환: utf8 &lt;strong papago-id=&quot;35-4&quot;&gt;(모두 &lt;/strong&gt;치환)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장 후 업로드!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 교환&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sed -i 's/utf8mb4_unicode_520_ci/utf8mb4_unicode_ci/g' your_sql_file.sql
&lt;/code&gt;&lt;/pre&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;br&gt; &lt;code&gt;utf8mb4_unicode_520_ci&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;utf8mb4_unicode_ci&lt;/code&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;mysql 워크벤치를 사용하여 내보낸 mysql에 데이터를 Import하는 데 어려움을 겪었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대조 문제입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 에러는 다음과 같이 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 편집기를 사용하여 .sql 파일 열기&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;utf8mb4_0900_ai_ci&quot;를 &quot;utf8mb4_general_ci&quot;로 바꿉니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 .sql로 저장하고 가져오기&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있었다&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모장++에서 dump.sql 파일을 열고 CTRL+H를 눌러 문자열 &quot;&lt;strong papago-id=&quot;45-1&quot;&gt;utf8mb4_0900_ai_ci&lt;/strong&gt;&quot;를 찾아 대체한 후 &quot;&lt;strong papago-id=&quot;45-3&quot;&gt;utf8mb4_general_ci&lt;/strong&gt;&quot;로 대체했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스 링크&lt;a href=&quot;https://www.freakyjolly.com/resolved-when-i-faced-1273-unknown-collation-utf8mb4_0900_ai_ci-error/&quot; papago-id=&quot;45-5&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;https://www.freakyjolly.com/&lt;a href=&quot;https://www.freakyjolly.com/resolved-when-i-faced-1273-unknown-collation-utf8mb4_0900_ai_ci-error/&quot; papago-id=&quot;45-5&quot; rel=&quot;noreferrer&quot;&gt;resolved-when-i-faced-1273-unknown-collation-utf8mb4_0900_ai_ci-error&lt;/a&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;검색 및 치환:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;utf8mb4_unicode_520_ci
&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;utf8_general_ci
&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;sql 파일 전체&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;데이터 정렬 오류 #1273 - 알 수 없는 데이터 정렬: 'utf8mb4_unicode_520_ci'는 내보낼 MySQL 버전과 Import할 MySQL 서버가 다르기 때문에 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 최신 버전의 Wordpress 라이브러리는 사이트가 실행 중인 SQL 버전을 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 버전 5.6 이상을 사용하는 경우 &quot;utf8mb4_unicode_520_ci&quot;라고 하는 새롭고 개선된 Unicode Collation Algorithm(UCA; 유니코드 조합 알고리즘)의 사용을 전제로 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 WordPress 사이트를 MySQL의 새로운 5.6 버전에서 이전 5.6 버전의 MySQL로 이동하지 않는 한 매우 유용합니다.&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;이 문제를 해결하려면 SQL 내보내기 파일을 편집하고 검색 및 바꾸기를 수행하여 'utf8mb4_unicode_520_ci'의 모든 인스턴스를 'utf8mb4_unicode_ci'로 변경해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 PHPMyAdmin 이 있는 경우는, 다음의 순서에 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스의 [내보내기]&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[ Custom ]옵션 버튼을 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[ Format - specific options ]섹션으로 이동하여 데이터베이스 시스템 또는 이전 MySQL 서버의 드롭다운을 변경하여 출력 호환성을 NONE에서 MYSQL40으로 최대화합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맨 아래로 스크롤하여 [GO]을 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 오류는 MySQL의 다른 버전이 충돌하기 때문에 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 편집기에서 sql 파일 열기&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 utf8mb4_0900_ai_ci를 찾아 utf8mb4_unicode_ci로 바꿉니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 mySql DB 파일 저장 및 시도&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 한 번 시도해보니, 난 괜찮아.&lt;/font&gt;&lt;/strong&gt; &lt;a href=&quot;https://i.stack.imgur.com/KGmbN.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/KGmbN.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;2&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 경우로 대체한다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;utf8_general_ci&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 세드하고요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' MY_DB.sql 
sed -i 's/utf8mb4_unicode_520_ci/utf8_general_ci/g' MY_DB.sql 
&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;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;이렇게 해서 메모장에서 .sql 파일을 열고 CTRL + H를 클릭하여 문자열 &quot;&lt;strong papago-id=&quot;63-1&quot;&gt;utf8mb4_0900_ai_ci&lt;/strong&gt;&quot;를 찾아 대체하고 &quot;&lt;strong papago-id=&quot;63-3&quot;&gt;utf8mb4_general_ci&lt;/strong&gt;&quot;로 바꿉니다.&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&gt;&lt;/font&gt;&lt;code&gt;WORDPRESS&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설치:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;#1273 - Unknown collation: 'utf8mb4_unicode_520_ci&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;phpmyadmin의 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;export method&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Format-specific options&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(커스텀 내보내기)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MYSQL40&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금 Import를 시도하면 다음 오류 메시지가 표시될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;1064 - You have an error in your SQL syntax; .....&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 나이든 사람들이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TYPE&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&gt;&lt;/font&gt;&lt;code&gt;ENGINE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 MySQL 5.5에서 삭제되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 엽니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.sql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;file, 모든 인스턴스 검색 및 치환&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TYPE=&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&gt;&lt;/font&gt;&lt;code&gt;ENGINE=&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 수입은 순조롭게 진행될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1273 - 불명확한 대조: 'utf8mb4_0900_ai_ci'&lt;/font&gt;&lt;/strong&gt;&lt;/em&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;내 경우 DB를 가져올 수 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;81&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;ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다. 단&lt;strong papago-id=&quot;82-1&quot;&gt;,&lt;/strong&gt; 에서 이 값으로 변경합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;82-1&quot;&gt;SQL&lt;/strong&gt; 파일로 문제 해결&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENGINE=InnoDB DEFAULT CHARSET=latin1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;strong papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갱신했다&lt;/font&gt;&lt;/strong&gt;&lt;/em&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;em papago-id=&quot;84-1&quot;&gt;utf8mb4_general_ci&lt;/em&gt;'를 사용하여 문제를 해결합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
&lt;/code&gt;&lt;/pre&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;/font&gt;&lt;/font&gt;&lt;code&gt;COLLATE&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&gt;&lt;/font&gt;&lt;code&gt;ENGINE&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&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;송신원:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENGINE=InnoDB AUTO_INCREMENT=429 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
&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;ENGINE=InnoDB;
&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;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 답변이 대조로 대체하도록 권장하는 것은 매우 이상합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개발 중인 MySQL 버전과 실제 가동 중인 MySQL 버전을 사용하려는 경우 매우 좋지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 로컬 mysql 서버는 같아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 SHOW COLATION 쿼리를 실행하여 서버가 지원하는 모든 조회를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;xampp 등의 툴을 사용하여 서버를 기동하는 경우 mysql 서버가 아닌 maria db server와 함께 배송될 수 있습니다.&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;당신이 해야 할 일은 현재의 mysql(진짜 mariadb)을 실제 mysql로 바꾸는 것입니다.&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;maria db server를 mysql server로 대체하기만 하면 됩니다.&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/42385099/&lt;a href=&quot;https://stackoverflow.com/questions/42385099/1273-unknown-collation-utf8mb4-unicode-520-ci&quot; target=&quot;_blank&quot; papago-id=&quot;95-1&quot;&gt;1273-unknown-collation-utf8mb4-unicode-520-ci&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2320</guid>
      <comments>https://prostudy.tistory.com/2320#entry2320comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:20:13 +0900</pubDate>
    </item>
    <item>
      <title>SQL LIKE와 IN을 함께 사용</title>
      <link>https://prostudy.tistory.com/2319</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL LIKE와 IN을 함께 사용&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;LIKE와 IN을 함께 사용할 수 있는 방법이 있나요?&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;SELECT * FROM tablename WHERE column IN ('M510%', 'M615%', 'M515%', 'M612%');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 기본적으로 열을 여러 문자열과 일치시킬 수 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나의 쿼리로 이 작업을 수행하는 다른 방법이 있습니까?아니면 찾고 있는 문자열 배열을 루프해야 합니까?&lt;/font&gt;&lt;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;IN과 함께 서브스트링을 사용하면 어떨까요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from tablename where substring(column,1,4) IN ('M510','M615','M515','M612')
&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;개개의 LIKE와 OR을 조합하는 것으로, 1개의 쿼리로 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM tablename
WHERE column LIKE 'M510%'
OR    column LIKE 'M615%'
OR    column LIKE 'M515%'
OR    column LIKE 'M612%';
&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;LIKE나 행 단위 함수 등의 기능이 항상 잘 확장되는 것은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블이 커질 것 같으면 테이블에 다른 열을 추가하여 필드의 처음 4개 문자를 개별적으로 저장하는 것을 고려할 수 &lt;em papago-id=&quot;6-1&quot;&gt;있습니다&lt;/em&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;pre&gt;&lt;code&gt;SELECT * FROM tablename WHERE newcolumn IN ('M510','M615','M515','M612');
&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;em papago-id=&quot;8-1&quot;&gt;데이터&lt;/em&gt;가 변경될 때 필요한 지점으로 이동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 새로운 열은 4가지 특수 유형 중 하나임을 나타내는 부울(Boolean)로 사용할 수 있습니다(특수 그룹이 자주 변경되지 않는 경우).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 쿼리가 훨씬 더 빨라집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM tablename WHERE is_special = 1;
&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;이러한 스토리지 요건과 속도의 트레이드오프는 대규모 데이터베이스에 도움이 됩니다.일반적으로 디스크 공간은 저렴하고 CPU는 소중하며 데이터를 쓰는 것보다 읽는 빈도가 훨씬 높습니다.&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;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;LIKE&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; with 、 &quot; &quot; &quot; 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OR&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OR 묶음인 IN의 긴 버전을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM tablename 
WHERE column LIKE 'M510%'
OR column LIKE 'M615%'
OR column LIKE 'M515%'
OR column LIKE 'M612%';
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;SELECT * FROM tablename
  WHERE column IN 
    (select column from  tablename 
    where column like 'M510%' 
    or column like 'M615%' 
    OR column like 'M515%' 
    or column like'M612%'
    )
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;substr([column name],
       [desired starting position (numeric)],
       [# characters to include (numeric)]) in ([complete as usual])
&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;substr([column name],1,4) in ('M510','M615', 'M515', 'M612')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다른 방법을 시도했다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블에 값이 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
    1   M510
    2   M615
    3   M515
    4   M612
    5   M510MM
    6   M615NN
    7   M515OO
    8   M612PP
    9   A
    10  B
    11  C
    12  D
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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;여기서 콜 1~8은 유효하지만 나머지 콜은 무효입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  SELECT COL_VAL
    FROM SO_LIKE_TABLE SLT
   WHERE (SELECT DECODE(SUM(CASE
                              WHEN INSTR(SLT.COL_VAL, COLUMN_VALUE) &amp;gt; 0 THEN
                               1
                              ELSE
                               0
                            END),
                        0,
                        'FALSE',
                        'TRUE')
            FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('M510', 'M615', 'M515', 'M612'))) =
         'TRUE'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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;INSTR 함수를 사용하여 검색한 것은 테이블 매치 내의 값 중 하나를 입력으로 하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 ZERO보다 큰 인덱스를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블의 값이 입력과 일치하지 않을 경우 ZERO를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 인덱스는 성공적인 일치를 나타내기 위해 합산한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있는 것 같아요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 됐으면 좋겠다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와일드카드와 함께 서브쿼리를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; SELECT 'Valid Expression'
 WHERE 'Source Column' LIKE (SELECT '%Column' --FROM TABLE)
&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; SELECT 'Valid Expression'
 WHERE 'Source Column' LIKE ('%Source%' + '%Column%')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것까지 시도해 볼 수 있다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE  FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(   
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) &amp;gt; 0)
  BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) &amp;gt; 0) 
      BEGIN  
        INSERT INTO @Strings VALUES (@text)
          BREAK 
      END 
    IF (@index &amp;gt; 1) 
      BEGIN  
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
        SET @text = RIGHT(@text, (LEN(@text) - @index)) 
      END 
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END
&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;쿼리&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from my_table inner join (select value from fn_split('M510', 'M615', 'M515', 'M612',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;완전히 동적인 솔루션에서는 커서와 온도 테이블을 조합하여 이를 달성할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 솔루션에서는 시작 위치나 길이를 알 필요가 없으며 SQL 쿼리에 OR을 추가하지 않고도 확장할 수 있습니다.&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;이 예에서는 특정 텍스트 목록이 '상세' 안에 있는 테이블에서 ID, 세부 정보 및 작성 날짜를 선택한다고 가정합니다.&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;먼저 검색 문자열이 포함된 테이블 FilterTable을 Search라는 열에 만듭니다.&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;insert into [DATABASE].dbo.FilterTable
select 'M510' union
select 'M615' union
select 'M515' union 
select 'M612'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다음과 같이 데이터를 필터링할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DECLARE @DATA NVARCHAR(MAX)

CREATE TABLE #Result (ID uniqueIdentifier, Details nvarchar(MAX), Created datetime)

DECLARE DataCursor CURSOR local forward_only FOR  
SELECT '%' + Search + '%'
FROM [DATABASE].dbo.FilterTable

OPEN DataCursor   
FETCH NEXT FROM DataCursor INTO @DATA   

WHILE @@FETCH_STATUS = 0   
BEGIN   

    insert into #Result
        select ID, Details, Created
        from [DATABASE].dbo.Table (nolock)
        where Details like @DATA

   FETCH NEXT FROM DataCursor INTO @DATA   
END   

CLOSE DataCursor   
DEALLOCATE DataCursor 

select * from #Result
drop table #Result
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 됐으면 좋겠다&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;select * 
from tablename
where regexp_like (column, '^M510|M615|^M515|^M612')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: 이 방법은 코드 M615가 컬럼 중앙에 있을 때 일치하도록 해도 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지 코드는 열이 이 코드로 시작하는 경우에만 일치합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2318126/&lt;a href=&quot;https://stackoverflow.com/questions/2318126/using-sql-like-and-in-together&quot; target=&quot;_blank&quot; papago-id=&quot;33-1&quot;&gt;using-sql-like-and-in-together&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2319</guid>
      <comments>https://prostudy.tistory.com/2319#entry2319comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:19:24 +0900</pubDate>
    </item>
    <item>
      <title>Debian 10 MariaDB '소켓 '/var/run/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.양말' (2)'</title>
      <link>https://prostudy.tistory.com/2318</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Debian 10 MariaDB '소켓 '/var/run/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.&lt;/font&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;굿나잇 커뮤니티&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;Debian10에 MariaDB를 설치할 수 없어 절망하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Stackoverflow와 유사한 질문이 있지만 문제를 해결하는 데 도움이 되는 질문은 없습니다.&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;$ sudo apt update
$ sudo apt install mariadb-server
&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;$ sudo mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결점:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;root에 대한 현재 비밀번호 입력(없을 경우 입력):&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 2002(HY000):&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;소켓 '/var/run/mysqld/mysqld'를 통해 로컬 MySQL 서버에 연결할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;양말' (2)&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://i.stack.imgur.com/jNzNY.png&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;systemmd 오류&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysqld.sock이라는 파일을 검색해도 결과가 표시되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ cd /etc/init.d/
$ mysqld_safe
$ sudo find / -type s | grep mysqld.sock
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무런 결과도 얻지 못했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아닌 것 같다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysqld.sock&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;blockquote&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://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run&quot; papago-id=&quot;11-1&quot;&gt;Stackoverflow&lt;/a&gt;: &lt;a href=&quot;https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run&quot; papago-id=&quot;11-1&quot;&gt;ERROR&lt;/a&gt; 2002&lt;a href=&quot;https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run&quot; papago-id=&quot;11-1&quot;&gt;(HY000):&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run&quot; papago-id=&quot;11-1&quot;&gt; 소켓 '/var/run/mysqld/mysqld'를 통해 로컬 MySQL 서버에 연결할 수 없습니다.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run&quot; papago-id=&quot;11-1&quot;&gt;양말' (2)&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누가 이 문제 좀 도와주시겠어요?&lt;/font&gt;&lt;/p&gt; 
&lt;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;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;밀리727&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt;&lt;pre&gt;&lt;code&gt;systemctl stop mysql
systemctl stop mariadb
chkconfig --del mysql
systemctl disable mysql
systemctl disable mariadb
systemctl enable mariadb.service
systemctl start mariadb.service
&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;URL : https://stackoverflow.com/questions/59934971/&lt;a href=&quot;https://stackoverflow.com/questions/59934971/debian-10-mariadb-cant-connect-to-local-mysql-server-through-socket-var-run&quot; target=&quot;_blank&quot; papago-id=&quot;15-1&quot;&gt;debian-10-mariadb-cant-connect-to-local-mysql-server-through-socket-var-run&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2318</guid>
      <comments>https://prostudy.tistory.com/2318#entry2318comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:18:33 +0900</pubDate>
    </item>
    <item>
      <title>변수가 null이 아닌지 확인하는 방법</title>
      <link>https://prostudy.tistory.com/2317</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 null이 아닌지 확인하는 방법&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;null&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;if (myVar) {...}
&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;if (myVar !== null) {...}
&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 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;if&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; if 「」의 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;myVar&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;em papago-id=&quot;7-1&quot;&gt;진부&lt;/em&gt;하다(즉, 평가 대상)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&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;myVar&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; is is is is is is other is is is is 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JavaScript에서 truthy가 아닌 유일한 값은 다음과 같습니다(일명 &lt;em papago-id=&quot;11-1&quot;&gt;falsey&lt;/em&gt; 값).&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;null&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;0&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&quot;&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 문자열빈 문자열')&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;false&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 NULL이 아닌지를 테스트하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;if (myVar !== null) {...}&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;myVar&lt;/font&gt;' &lt;font class=&quot;papago-parent&quot;&gt;null&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;myVar가 false&lt;/font&gt;일 경우 &lt;font class=&quot;papago-parent&quot;&gt;실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ★★★★★★★★★★★★★★★★★」&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NaN&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 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;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;if(myVar) { code }&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;myVar&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;false, 0, &quot;&quot;, null, undefined, NaN&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;myVar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(그 후 실행을 중지하고 예외를 발생시킵니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;★★★★★★★★★★★★★★★★의 코드&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if(myVar !== null) {code}&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;myVar&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;null&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;/ul&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 모든 것(&lt;a href=&quot;https://dorey.github.io/JavaScript-Equality-Table/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;26-1&quot;&gt;src&lt;/a&gt;)이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한다면&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/91POQ.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/91POQ.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;1&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=&lt;strong papago-id=&quot;28-0&quot;&gt;=(&lt;/strong&gt;부정&lt;strong papago-id=&quot;28-2&quot;&gt;!=)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/nkpj6.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/nkpj6.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;2&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;29-2&quot;&gt;==&lt;/strong&gt;&lt;strong papago-id=&quot;29-0&quot;&gt;=(&lt;/strong&gt;부정!==)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/DIqvq.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/DIqvq.png&quot; alt=&quot;여기에 이미지 설명 입력&quot; papago-attr-id=&quot;3&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 게시물을 읽어보십시오&lt;a href=&quot;http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-2/&quot; papago-id=&quot;30-1&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;http://enterprisejquery.com/2010/10/&lt;a href=&quot;http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-2/&quot; papago-id=&quot;30-1&quot; rel=&quot;noreferrer&quot;&gt;how-good-c-habits-can-encourage-bad-javascript-habits-part-2&lt;/a&gt;/&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 JavaScript에 대한 몇 가지 유용한 힌트가 있지만, 한 가지 언급되는 것은 다음과 같은 null을 확인해야 한다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(myvar) { }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 또한 당신이 깨닫지 못할 수 있는 '거짓'으로 여겨지는 것에 대해서도 언급하고 있다.&lt;/font&gt;&lt;/p&gt;&lt;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;Ajax 콜을 했는데 데이터를 문자열 형식으로 늘로 돌려받았어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 확인을 해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(value != '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;즉, null은 실제로는 null이 아니라 null로 읽히는 문자열이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;36-0&quot;&gt;편집:&lt;/strong&gt; 저는 이것을 &lt;em papago-id=&quot;36-2&quot;&gt;판매&lt;/em&gt;해야 할 방법으로 판매하지 않는다는 것을 이해해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법밖에 없는 시나리오가 있었는데&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 그런지는 모르겠지만...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;백엔드를 쓴 사람이 자료를 잘못 제시하고 있었을지도 모르지만 어쨌든 이건 현실이에요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 옳지 않다는 것을 이해하는 사람에 의해 낮게 투표되고, 그리고 그것이 실제로 도움이 되는 사람에 의해 상향 투표되는 것을 보는 것은 실망스러운 일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;37-1&quot;&gt;오브&lt;/a&gt;를 사용했다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(typeof(variable) !== &quot;undefined&quot;) {
    //it exist
    if(variable !== null) {
        //and is not null
    }
    else {
        //but is null
    }
}
else {
    //it doesn't
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(0)이 의미하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(-1 또는 0 이외의 임의의 숫자)는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 다음 값은 truthy, null, undefined, 0, &quot; &quot; (빈 문자열), false, NaN이 아닙니다.&lt;/font&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;id와 같은 번호 타입을 사용하지 않는다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (id) {}
&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;값이 0인 id 타입의 경우 (id) {}인 경우 사용할 수 없습니다. 왜냐하면 (0)이 false를 의미하고, 이는 true id 번호로 유효함을 의미하기 때문입니다.&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;따라서 ID 유형에는 다음을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ((Id !== undefined) &amp;amp;&amp;amp; (Id !== null) &amp;amp;&amp;amp; (Id !== &quot;&quot;)) {

} else {

}
&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;다른 문자열 유형의 경우 null, 정의되지 않은 빈 문자열이 모두 false로 평가되기 때문에 (string) {}인 경우 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (string_type_variable) { }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;myVar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;block이 실행되지 않으면 null이 됩니다.그렇지 않으면 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;if (myVar != null) {...}&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;pre&gt;&lt;code&gt;if(![false, 0, &quot;&quot;, null, undefined, NaN].includes(myVar)){

   // It's not a null value

}
&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;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;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 예에서는 &lt;strong papago-id=&quot;49-1&quot;&gt;myVar&lt;/strong&gt; 값이 참인지 확인하고 &lt;strong papago-id=&quot;49-3&quot;&gt;{...}&lt;/strong&gt; 내에서 코드를 실행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;49-3&quot;&gt;}&lt;/strong&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;두 번째 예시는 &lt;strong papago-id=&quot;50-1&quot;&gt;myVar&lt;/strong&gt;가 null과 같지 않은지 평가하며, 이 경우 &lt;strong papago-id=&quot;50-3&quot;&gt;{...}&lt;/strong&gt; 내에서 코드가 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;50-3&quot;&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 더 많은 기술을 위해 조건문을 살펴볼 것을 제안합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일단 익숙해지면, 언제 필요할지 결정할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4361585/&lt;a href=&quot;https://stackoverflow.com/questions/4361585/how-to-check-if-a-variable-is-not-null&quot; target=&quot;_blank&quot; papago-id=&quot;52-1&quot;&gt;how-to-check-if-a-variable-is-not-null&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2317</guid>
      <comments>https://prostudy.tistory.com/2317#entry2317comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:17:37 +0900</pubDate>
    </item>
    <item>
      <title>특정 서브스트링 뒤에 문자열을 얻는 방법</title>
      <link>https://prostudy.tistory.com/2316</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 서브스트링 뒤에 문자열을 얻는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 서브스트링 뒤에 문자열을 얻으려면 어떻게 해야 하나요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;&quot;world&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;my_string=&quot;hello python world, I'm a beginner&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;...이 경우는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;, I'm a beginner&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 쉬운 방법은 아마도 당신의 목표 단어를 분할하는 것이다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;my_string=&quot;hello python world , i'm a beginner&quot;
print(my_string.split(&quot;world&quot;,1)[1])
&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;split은 분할할 단어(또는 문자)를 사용하며 분할 횟수에 대한 제한(선택사항)을 지정합니다.&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;이 예에서는 &quot;world&quot;로 분할하고 분할을 1개로 제한합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무도 이 일에 대해 언급하지 않았다니 놀랍군요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;partition&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;def substring_after(s, delim):
    return s.partition(delim)[2]

s1=&quot;hello python world, I'm a beginner&quot;
substring_after(s1, &quot;world&quot;)

# &quot;, I'm a beginner&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IMHO, 이 솔루션은 @arshajii의 솔루션보다 읽기 쉽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 외에는 @arshajii가 가장 빠르다고 생각합니다.불필요한 카피나 투고를 하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;s1 = &quot;hello python world , i'm a beginner&quot;
s2 = &quot;world&quot;

print(s1[s1.index(s2) + len(s2):])
&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;s2&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;s1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그 후 를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;s1.find(s2)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와는 반대로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;index&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;-1&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;s2&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;s1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 사용하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; my_string.partition(&quot;world&quot;)[2]
&quot; , i'm a beginner &quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 옵션이 &lt;strong papago-id=&quot;21-1&quot;&gt;다른 옵션보다 빠르기&lt;/strong&gt; 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;딜리미터가 없는 경우 빈 문자열이 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; my_string.partition(&quot;Monty&quot;)[2]  # delimiter missing
''
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원래 문자열을 사용할 경우 &lt;em papago-id=&quot;14-1&quot;&gt;다음&lt;/em&gt; 값에서 두 번째 값이 반환되었는지 테스트합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;str.partition()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비어 있지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;prefix, success, result = my_string.partition(delimiter)
if not success: result = prefix
&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;를 사용할 수도 있습니다.제한은 1 입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; my_string.split(&quot;world&quot;, 1)[-1]
&quot; , i'm a beginner &quot;
&amp;gt;&amp;gt;&amp;gt; my_string.split(&quot;Monty&quot;, 1)[-1]  # delimiter missing
&quot;hello python world , i'm a beginner &quot;
&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;strong papago-id=&quot;16-1&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;str.partition()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 비해 15%&lt;em papago-id=&quot;17-1&quot;&gt; 정도&lt;/em&gt; 고속화됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;str.split()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;                                missing        first         lower         upper          last
      str.partition(...)[2]:  [3.745 usec]  [0.434 usec]  [1.533 usec]  &amp;lt;3.543 usec&amp;gt;  [4.075 usec]
str.partition(...) and test:   3.793 usec    0.445 usec    1.597 usec    3.208 usec    4.170 usec
      str.split(..., 1)[-1]:  &amp;lt;3.817 usec&amp;gt;  &amp;lt;0.518 usec&amp;gt;  &amp;lt;1.632 usec&amp;gt;  [3.191 usec]  &amp;lt;4.173 usec&amp;gt;
            % best vs worst:         1.9%         16.2%          6.1%          9.9%          2.3%
&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;em papago-id=&quot;19-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;[...]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;...&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최악이군&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 표는 아래에 제시된 세 가지 옵션 모두에 대한 포괄적인 타임 트라이얼로 작성되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 3.7.4에서 2.9GHz Intel Core i7 및 16GB RAM을 탑재한 2017년형 15인치 Macbook Pro에서 테스트를 수행했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 스크립트는 랜덤하게 선택된 딜리미터가 존재하는지 여부에 관계없이 랜덤한 문장을 생성하고 생성된 문장의 다른 위치에서 랜덤 순서로 테스트를 실행하고(테스트 중에 발생하는 랜덤 OS 이벤트를 고려하여 가장 공정한 결과를 생성) 결과 표를 인쇄합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import random
from itertools import product
from operator import itemgetter
from pathlib import Path
from timeit import Timer

setup = &quot;from __main__ import sentence as s, delimiter as d&quot;
tests = {
    &quot;str.partition(...)[2]&quot;: &quot;r = s.partition(d)[2]&quot;,
    &quot;str.partition(...) and test&quot;: (
        &quot;prefix, success, result = s.partition(d)\n&quot;
        &quot;if not success: result = prefix&quot;
    ),
    &quot;str.split(..., 1)[-1]&quot;: &quot;r = s.split(d, 1)[-1]&quot;,
}

placement = &quot;missing first lower upper last&quot;.split()
delimiter_count = 3

wordfile = Path(&quot;/usr/dict/words&quot;)  # Linux
if not wordfile.exists():
    # macos
    wordfile = Path(&quot;/usr/share/dict/words&quot;)
words = [w.strip() for w in wordfile.open()]

def gen_sentence(delimiter, where=&quot;missing&quot;, l=1000):
    &quot;&quot;&quot;Generate a random sentence of length l

    The delimiter is incorporated according to the value of where:

    &quot;missing&quot;: no delimiter
    &quot;first&quot;:   delimiter is the first word
    &quot;lower&quot;:   delimiter is present in the first half
    &quot;upper&quot;:   delimiter is present in the second half
    &quot;last&quot;:    delimiter is the last word

    &quot;&quot;&quot;
    possible = [w for w in words if delimiter not in w]
    sentence = random.choices(possible, k=l)
    half = l // 2
    if where == &quot;first&quot;:
        # best case, at the start
        sentence[0] = delimiter
    elif where == &quot;lower&quot;:
        # lower half
        sentence[random.randrange(1, half)] = delimiter
    elif where == &quot;upper&quot;:
        sentence[random.randrange(half, l)] = delimiter
    elif where == &quot;last&quot;:
        sentence[-1] = delimiter
    # else: worst case, no delimiter

    return &quot; &quot;.join(sentence)

delimiters = random.choices(words, k=delimiter_count)
timings = {}
sentences = [
    # where, delimiter, sentence
    (w, d, gen_sentence(d, w)) for d, w in product(delimiters, placement)
]
test_mix = [
    # label, test, where, delimiter sentence
    (*t, *s) for t, s in product(tests.items(), sentences)
]
random.shuffle(test_mix)

for i, (label, test, where, delimiter, sentence) in enumerate(test_mix, 1):
    print(f&quot;\rRunning timed tests, {i:2d}/{len(test_mix)}&quot;, end=&quot;&quot;)
    t = Timer(test, setup)
    number, _ = t.autorange()
    results = t.repeat(5, number)
    # best time for this specific random sentence and placement
    timings.setdefault(
        label, {}
    ).setdefault(
        where, []
    ).append(min(dt / number for dt in results))

print()

scales = [(1.0, 'sec'), (0.001, 'msec'), (1e-06, 'usec'), (1e-09, 'nsec')]
width = max(map(len, timings))
rows = []
bestrow = dict.fromkeys(placement, (float(&quot;inf&quot;), None))
worstrow = dict.fromkeys(placement, (float(&quot;-inf&quot;), None))

for row, label in enumerate(tests):
    columns = []
    worst = float(&quot;-inf&quot;)
    for p in placement:
        timing = min(timings[label][p])
        if timing &amp;lt; bestrow[p][0]:
            bestrow[p] = (timing, row)
        if timing &amp;gt; worstrow[p][0]:
            worstrow[p] = (timing, row)
        worst = max(timing, worst)
        columns.append(timing)

    scale, unit = next((s, u) for s, u in scales if worst &amp;gt;= s)
    rows.append(
        [f&quot;{label:&amp;gt;{width}}:&quot;, *(f&quot; {c / scale:.3f} {unit} &quot; for c in columns)]
    )

colwidth = max(len(c) for r in rows for c in r[1:])
print(' ' * (width + 1), *(p.center(colwidth) for p in placement), sep=&quot;  &quot;)
for r, row in enumerate(rows):
    for c, p in enumerate(placement, 1):
        if bestrow[p][1] == r:
            row[c] = f&quot;[{row[c][1:-1]}]&quot;
        elif worstrow[p][1] == r:
            row[c] = f&quot;&amp;lt;{row[c][1:-1]}&amp;gt;&quot;
    print(*row, sep=&quot;  &quot;)

percentages = []
for p in placement:
    best, worst = bestrow[p][0], worstrow[p][0]
    ratio = ((worst - best) / worst)
    percentages.append(f&quot;{ratio:{colwidth - 1}.1%} &quot;)

print(&quot;% best vs worst:&quot;.rjust(width + 1), *percentages, sep=&quot;  &quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;regex를 사용하여 이 작업을 수행하려면 &lt;a href=&quot;http://www.regular-expressions.info/brackets.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;34-1&quot;&gt;캡처&lt;/a&gt;되지 않은 그룹을 사용하여 &quot;world&quot;라는 단어를 얻은 후 모든 것을 캡처할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(?:world).*
&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;a href=&quot;http://rubular.com/r/u1k4Mkqbvp&quot; rel=&quot;noreferrer&quot; papago-id=&quot;35-1&quot;&gt;테스트&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Python 3.&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;removeprefix&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;이치노&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; 'TestHook'.removeprefix('Test')
'Hook'
&amp;gt;&amp;gt;&amp;gt; 'BaseTestCase'.removeprefix('Test')
'BaseTestCase'
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서: https://docs.python.org/3.9/library/stdtypes.html#str.&lt;a href=&quot;https://docs.python.org/3.9/library/stdtypes.html#str.removeprefix&quot; rel=&quot;noreferrer&quot; papago-id=&quot;38-1&quot;&gt;removeprefix&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;발표: https://docs.python.org/3.9/&lt;a href=&quot;https://docs.python.org/3.9/whatsnew/3.9.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;39-1&quot;&gt;whatsnew&lt;/a&gt;/3.9.html&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라는 패키지를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;substring&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;pip install substring&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.  및 끝 수 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 시작 및 끝 문자/인디케이터만 언급하면 서브스트링을 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p 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;import substring
s = substring.substringByChar(&quot;abcdefghijklmnop&quot;, startChar=&quot;d&quot;, endChar=&quot;n&quot;)
print(s)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;44&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;# s = defghijklmn
&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;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import re

my_string=&quot;hello python world , i'm a beginner&quot;
p = re.compile(&quot;world(.*)&quot;)
print(p.findall(my_string))

# [&quot; , i'm a beginner &quot;]
&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;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법으로 re 모듈을 사용하여 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import re

string = '...below...as higher prices mean lower demand to be expected. Generally, a high reading is seen as negative (or bearish), while a low reading is seen as positive (or bullish) for the Korean Won.'

# use re.split with regex to match the exact word
stringafterword = re.split('\\blow\\b',string)[-1]

print(stringafterword)
# ' reading is seen as positive (or bullish) for the Korean Won.'

# the generic code is:
re.split('\\bTHE_WORD_YOU_WANT\\b',string)[-1]
&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;URL : https://stackoverflow.com/questions/12572362/&lt;a href=&quot;https://stackoverflow.com/questions/12572362/how-to-get-a-string-after-a-specific-substring&quot; target=&quot;_blank&quot; papago-id=&quot;49-1&quot;&gt;how-to-get-a-string-after-a-specific-substring&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2316</guid>
      <comments>https://prostudy.tistory.com/2316#entry2316comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:16:46 +0900</pubDate>
    </item>
    <item>
      <title>PHP 함수의 전역 변수 액세스</title>
      <link>https://prostudy.tistory.com/2315</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP 함수의 전역 변수 액세스&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 프로그래밍 언어 스코프 규칙에 따르면, 나는 그들 내부의 함수 밖에서 정의된 변수에 액세스할 수 있는데, 왜 이 코드가 작동하지 않는가?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    $data = 'My data';

    function menugen() {
        echo &quot;[&quot; . $data . &quot;]&quot;;
    }

    menugen();
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 「」입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[]&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;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문에 답하려면 함수 자체에서 액세스할 글로벌 변수를 선언해야 하기 때문에 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$data = 'My data';

function menugen() {
    global $data; // &amp;lt;-- Add this line

    echo &quot;[&quot; . $data . &quot;]&quot;;
}

menugen();
&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; 않으면 그외이,, 음음음음음음음음 it it it it it it it it it it it로 접속할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$GLOBALS['data']&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;em papago-id=&quot;6-1&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/language.variables.scope.php&quot; papago-id=&quot;6-1-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;변수&lt;/a&gt;&lt;/em&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;글로벌을 사용&lt;/strong&gt;하지 말고 데이터를 매개 변수로 전달하는 &lt;strong papago-id=&quot;7-1&quot;&gt;것&lt;/strong&gt;이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 위의 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$data = 'My data';

function menugen($data) { // &amp;lt;-- Declare the parameter
    echo &quot;[&quot; . $data . &quot;]&quot;;
}

menugen($data); // &amp;lt;-- And pass it at call time
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 중 하나를 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    $data = 'My data';

    function menugen() {
        global $data;
        echo &quot;[&quot; . $data . &quot;]&quot;;
    }

    menugen();
&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;&amp;lt;?php
    $data = 'My data';

    function menugen() {
        echo &quot;[&quot; . $GLOBALS['data'] . &quot;]&quot;;
    }

    menugen();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 글로벌을 과도하게 사용하면 코드가 불량해질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;평소에는 필요한 것을 건네주는 것이 좋다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 글로벌 데이터베이스 개체를 참조하는 대신 데이터베이스에 핸들을 전달하고 이에 따라 조치를 취해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 &lt;a href=&quot;http://en.wikipedia.org/wiki/Dependency_injection&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;또 다른 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;?php

$data = 'My data';

$menugen = function() use ($data) {

    echo &quot;[&quot;.$data.&quot;]&quot;;
};

$menugen();
&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;strong papago-id=&quot;13-0&quot;&gt;업데이트 2020-01-13:&lt;/strong&gt; Peter Mortensen 요청&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;PHP 5.3.0에서는 폐기를 작성할 수 있는 익명 기능을 지원하고 있습니다.&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;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;$data&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;use&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;절을 클릭합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 범위의 문제이다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 다음과 같이 글로벌 변수를 &lt;em papago-id=&quot;18-1&quot;&gt;피해야&lt;/em&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;매개 변수로 전달해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$data = 'My data';

function menugen($data)
{
    echo $data;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;20-0&quot;&gt;또는&lt;/em&gt; 수업시간에 가지고 접속할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyClass
{
    private $data = &quot;&quot;;

    function menugen()
    {
        echo this-&amp;gt;data;
    }

}
&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;@MatteoTassinari의 답변도 참조해 주십시오.이 답변에 액세스하려면 글로벌하다고 마크할 수 있지만 글로벌 변수는 일반적으로 필요하지 않으므로 코딩에 대해 다시 생각해 보는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오랜 세월 동안 저는 항상 다음 형식을 사용해 왔습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;?php
    $data = &quot;Hello&quot;;

    function sayHello(){
        echo $GLOBALS[&quot;data&quot;];
    }

    sayHello();
?&amp;gt;
&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;$GLOBALS는 PHP를 통해 글로벌 변수를 참조할 수 있도록 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$_SERVER, $_POST 등을 사용한 적이 있는 경우 모르는 사이에 글로벌 변수를 참조하게 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;?php

    $data = 'My data';

    $menugen = function() use ($data) {

        echo &quot;[ $data ]&quot;;
    };

    $menugen();
?&amp;gt;
&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;echo &quot;[&quot; . $data . &quot;]&quot;
&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;로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;echo &quot;[$data]&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP는 PHP를 참조해 주세요.&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;global&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;use&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정답입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$functionName = function($stuff) use ($globalVar) {
 //do stuff
}
$output = $functionName($stuff);
$otherOutput = $functionName($otherStuff);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 올바르지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function functionName($stuff) use ($globalVar) {
 //do stuff
}
$output = functionName($stuff);
$otherOutput = functionName($otherStuff);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구체적인 예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    $data = 'My data';

    $menugen = function() use ($data) {
        echo &quot;[&quot; . $data . &quot;]&quot;;
    }

    $menugen();
&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;$prefix&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;익명의 함수에 전달됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;글로벌 스코프가 길인 것 같아요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은, 어레이의 프리픽스를 파괴하지 않는 방법으로 부가하기 위한 솔루션입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private function array_prefix($prefix, $arr) {
  $GLOBALS['prefix'] = $prefix;
  return array_map(
    function($ele) {
      return $GLOBALS['prefix'].$ele;
    },
    $arr
  );
}
&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&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;global&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키워드 및&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$GLOBALS&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;em papago-id=&quot;37-1&quot;&gt;예를 들어 여러 함수를 사용하여 매번&lt;/em&gt; &quot;&lt;em papago-id=&quot;37-1&quot;&gt;쓰기&quot;를 해야 하는&lt;/em&gt; 경우)는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;$variable = 42;  // the global variable you want to access

// write a function which returns it
function getvar(){ 
    global $variable; 
    return $variable; 
}

//--------------

function func1()
{
    // use that getter function to get the global variable
    echo getvar();  // 42
}

function func2()
{
    echo getvar();  // 42
}
...
&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;$data = 'My data';

function menugen($data)
{
    echo $data;
}
&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;URL : https://stackoverflow.com/questions/15687363/&lt;a href=&quot;https://stackoverflow.com/questions/15687363/access-a-global-variable-in-a-php-function&quot; target=&quot;_blank&quot; papago-id=&quot;39-1&quot;&gt;access-a-global-variable-in-a-php-function&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2315</guid>
      <comments>https://prostudy.tistory.com/2315#entry2315comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:15:35 +0900</pubDate>
    </item>
    <item>
      <title>어떻게 조건부로의 반응 요소들에 특성을 추가하니?</title>
      <link>https://prostudy.tistory.com/2314</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 조건부로의 반응 요소들에 특성을 추가하니?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;있는 방법 특정한 조건이 충족되는 것의 반응 요소에 특성을 추가하니?&lt;/font&gt;&lt;/p&gt; 
&lt;p&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; 폼 및 readOnly Atribut을  &quot;readOnly&quot; 때문에 이 알 수.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;readOnly=&quot;false&quot;&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;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;(Parse오류:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예상치 못한 식별자)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;function MyInput({isRequired}) {
  return &amp;lt;input classname=&quot;foo&quot; {isRequired ? &quot;required&quot; : &quot;&quot;} /&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네가 지난 값truthy지 않다 듣자 하니, 특정 특성에 대한의 반응 지적인 특성을 생략하기에 충분하다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const InputComponent = function() {
    const required = true;
    const disabled = false;

    return (
        &amp;lt;input type=&quot;text&quot; disabled={disabled} required={required} /&amp;gt;
    );
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과를 초래할 것이다:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; required&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;:누가 how/why 이 일이 일어났는 지에 호기심이 많다고, ReactDOM의 소스 코드에 선 30과 167은 DOMProperty.js 파일 구체적으로에서 정보를 사용할 수 있Update를 설정합니다.&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;Juandemarco의 해답은 보통이지만 여기 다른 선택은 정확하다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 어떻게 같은 물체를 건설한다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var inputProps = {
  value: 'foo',
  onChange: this.handleChange
};

if (condition) {
  inputProps.disabled = true;
}
&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;input
    value=&quot;this is overridden by inputProps&quot;
    {...inputProps}
    onChange={overridesInputProps}
 /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 React-Bootstrap(버전 0.32.4)을 통해 Bootstrap의 버튼 사용에 대한 예제: 있다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var condition = true;

return (
  &amp;lt;Button {...(condition ? {bsStyle: 'success'} : {})} /&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 class=&quot;papago-parent&quot;&gt;, 「」의 어느쪽인가를 선택할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{bsStyle: 'success'}&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 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 class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Button&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;하지 않기 &lt;font class=&quot;papago-parent&quot;&gt;컴포넌트&lt;/font&gt;에는 &lt;font 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;.false는 반환&lt;/font&gt;된 오브젝트에 속성이 존재하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/31163693/how-do-i-conditionally-add-attributes-to-react-components/35428331#comment83214168_35428331&quot; papago-id=&quot;17-1&quot;&gt;Andy Polhill의 코멘트에 근거&lt;/a&gt;한 대체 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var condition = true;

return (
  &amp;lt;Button bsStyle={condition ? 'success' : undefined} /&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 두  컴포넌트 &quot; &quot; &quot; 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;Button/&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 »&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;props&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;bsStyle&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;undefined&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;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;var condition = true;

var props = {
  value: 'foo',
  ...(condition &amp;amp;&amp;amp; { disabled: true })
};

var component = &amp;lt;div {...props} /&amp;gt;;
&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;var condition = true;

var component = (
  &amp;lt;div value=&quot;foo&quot; {...(condition &amp;amp;&amp;amp; { disabled: true })} /&amp;gt; 
);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 하는 방법은 이렇다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;26-0&quot;&gt;조건부&lt;/strong&gt;여:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Label
    {...{
      text: label,
      type,
      ...(tooltip &amp;amp;&amp;amp; { tooltip }),
      isRequired: required
    }}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건부가 없는 경우 (내 생각에) 더 읽기 쉽기 때문에 저는 여전히 일반적인 소품 전달 방식을 선호한다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;28-0&quot;&gt;조건&lt;/strong&gt; 없이:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Label text={label} type={type} tooltip={tooltip} isRequired={required} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건이 true인 경우 커스텀 속성을 추가합니다(aria-* 또는 data-* 사용).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{...this.props.isTrue &amp;amp;&amp;amp; {'aria-name' : 'something here'}}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건이 참일 경우 스타일 속성을 추가한다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{...this.props.isTrue &amp;amp;&amp;amp; {style : {color: 'red'}}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)의 할 수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{isVisible &amp;amp;&amp;amp; &amp;lt;SomeComponent /&amp;gt;}&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyComponent extends React.Component {
  render() {
    return (
      &amp;lt;div someAttribute={someCondition &amp;amp;&amp;amp; someValue} /&amp;gt;
    );
  }
}
&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;ECMAScript 6을 사용하면 이렇게 간단하게 쓸 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// First, create a wrap object.
const wrap = {
    [variableName]: true
}
// Then, use it
&amp;lt;SomeComponent {...{wrap}} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;「」를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&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;합니다: works works 、 works works 、 works works works works works works works 。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const name = &quot;someName&quot;;

return (
    &amp;lt;input name={name ? name : undefined} /&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ajax 콜 후에 상태가 변화하고 부모 컴포넌트가 다시 렌더링되기 때문에 이 방법은 동작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;render : function () {
    var item;
    if (this.state.isRequired) {
        item = &amp;lt;MyOwnInput attribute={'whatever'} /&amp;gt;
    } else {
        item = &amp;lt;MyOwnInput /&amp;gt;
    }
    return (
        &amp;lt;div&amp;gt;
            {item}
        &amp;lt;/div&amp;gt;
    );
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 사용자 정의 컨테이너에 특성 스타일 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const DriverSelector = props =&amp;gt; {
  const Container = props.container;
  const otherProps = {
    ...( props.containerStyles &amp;amp;&amp;amp; { style: props.containerStyles } )
  };

  return (
    &amp;lt;Container {...otherProps} &amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React [1]에 나열된 일부 부울 속성의 경우:&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input disabled={disabled} /&amp;gt;

// renders either `&amp;lt;input&amp;gt;` or `&amp;lt;input disabled&amp;gt;` 
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타 Atribute의 경우:&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div aria-selected= {selected ? &quot;&quot; : undefined} /&amp;gt;

// renders either `&amp;lt;div aria-selected&amp;gt;&amp;lt;/div&amp;gt;` or `&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;`
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[1] 부울 속성 목록:https://github.com/facebook/react/blob/&lt;a href=&quot;https://github.com/facebook/react/blob/3f9480f0f5ceb5a32a3751066f0b8e9eae5f1b10/packages/react-dom/src/shared/DOMProperty.js#L318-L345&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;40-1&quot;&gt;3f9480f0f5ceb5a32a3751066f0b8e9eae5f1b10&lt;/a&gt;/packages/react-dom/src/shared/DOMProperty.js#L318-L345&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;반응에서 구성요소를 조건부로 렌더링할 수 있지만 소품, className, id 등의 특성도 렌더링할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반응에서는 구성요소를 조건부로 렌더링하는 데 도움이 되는 3진 &lt;a href=&quot;https://en.wikipedia.org/wiki/Ternary_operation#Computer_science&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;42-1&quot;&gt;연산자&lt;/a&gt;를 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 구성요소 및 구성요소의 스타일 속성을 조건부로 렌더링하는 방법도 보여 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 간단한 예를 제시하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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;class App extends React.Component {
  state = {
    isTrue: true
  };

  render() {
    return (
      &amp;lt;div&amp;gt;
        {this.state.isTrue ? (
          &amp;lt;button style={{ color: this.state.isTrue ? &quot;red&quot; : &quot;blue&quot; }}&amp;gt;
            I am rendered if TRUE
          &amp;lt;/button&amp;gt;
        ) : (
          &amp;lt;button&amp;gt;I am rendered if FALSE&amp;lt;/button&amp;gt;
        )}
      &amp;lt;/div&amp;gt;
    );
  }
}

ReactDOM.render(&amp;lt;App /&amp;gt;, document.getElementById(&quot;root&quot;));&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://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div id=&quot;root&quot;&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 관점에서는 여러 개의 조건부 소품을 관리하는 가장 좋은 방법은 @brigand의 &lt;em papago-id=&quot;15-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;if&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;h2 papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ifVal 도우미&lt;/font&gt;&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 대로 이름을 변경합니다(iv, condVal, cv, _, ...).&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도우미 함수를 정의하여 값을 반환하거나 조건이 충족되면 다른 값을 반환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// components-helpers.js
export const ifVal = (cond, trueValue=true, falseValue=null) =&amp;gt; {
  return cond ? trueValue : falseValue
}
&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;cond&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;em papago-id=&quot;19-1&quot;&gt;또는&lt;/em&gt; truthy),&lt;/font&gt;&lt;/font&gt;&lt;code&gt;trueValue&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;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.한다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cond&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&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;em papago-id=&quot;23-1&quot;&gt;또는&lt;/em&gt; 가짜),&lt;/font&gt;&lt;/font&gt;&lt;code&gt;falseValue&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환됨 - 또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 디폴트(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)는 보통 Prop를 React 컴포넌트에 전달하거나 전달하지 않는 올바른 값입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수는 &quot;개선된 반응 3원 연산자&quot;로 생각할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환된 값에 대한 제어가 더 필요한 경우 개선하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 가지 소품과 함께 사용합시다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(복잡한) 소품 오브젝트 작성&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;// your-code.js
import { ifVal } from './components-helpers.js'

// BE SURE to replace all true/false with a real condition in you code
// this is just an example

const inputProps = {
  value: 'foo',
  enabled: ifVal(true), // true
  noProp: ifVal(false), // null - ignored by React
  aProp: ifVal(true, 'my value'), // 'my value'
  bProp: ifVal(false, 'the true text', 'the false text') // 'my false value',
  onAction: ifVal(isGuest, handleGuest, handleUser) // it depends on isGuest value
};

 &amp;lt;MyComponent {...inputProps} /&amp;gt;
&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;a href=&quot;https://github.com/JedWatson/classnames&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;64-1&quot;&gt;이름 유틸리티&lt;/a&gt;를 사용하여 클래스를 조건부로 관리하는 일반적인 방법과 비슷하지만 소품에 맞게 조정되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;65&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;66&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;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법으로 반복 연산자의 &lt;em papago-id=&quot;29-1&quot;&gt;구문&lt;/em&gt; 노이즈를 바꿉니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;...&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;? :&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소품이나 기능 호출이 많은 경우, 매우 귀찮을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개발자로서 우리의 최우선 과제는 문제를 해결하는 가장 &lt;em papago-id=&quot;71-1&quot;&gt;명백&lt;/em&gt;한 코드를 작성하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;너무 많은 경우 &lt;em papago-id=&quot;71-3&quot;&gt;우리&lt;/em&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;72&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;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;&amp;lt;input checked={true} type=&quot;checkbox&quot;  /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리액트 기능 컴포넌트에서는 이와 같은 것을 시도하여 불필요한 태그 속성을 생략할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div className=&quot;something&quot; ref={someCondition ? dummyRef : null} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ref, 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;Button {...(isWeb3Enabled ? {} : { isExternal: true })}&amp;gt;
    Metamask
&amp;lt;/Button&amp;gt;
&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;em papago-id=&quot;76-1&quot;&gt;&lt;a href=&quot;https://facebook.github.io/react/tips/if-else-in-JSX.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;76-1-0&quot;&gt;포스트 JSX In&lt;/a&gt;&lt;/em&gt; Deepth를 고려하면 다음과 같은 방법으로 문제를 해결할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (isRequired) {
  return (
    &amp;lt;MyOwnInput name=&quot;test&quot; required='required' /&amp;gt;
  );
}
return (
    &amp;lt;MyOwnInput name=&quot;test&quot; /&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성의 값을 함수로 하고 싶은 사람에게 도움이 될 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { RNCamera } from 'react-native-camera';
[...]

export default class MyView extends React.Component {

    _myFunction = (myObject) =&amp;gt; {
        console.log(myObject.type); //
    }

    render() {

        var scannerProps = Platform.OS === 'ios' ? 
        {
            onBarCodeRead : this._myFunction
        } 
        : 
        { 
            // here you can add attribute(s) for other platforms
        }

        return (
            // it is just a part of code for MyView's layout
            &amp;lt;RNCamera 
                ref={ref =&amp;gt; { this.camera = ref; }}
                style={{ flex: 1, justifyContent: 'flex-end', alignItems: 'center', }}
                type={RNCamera.Constants.Type.back}
                flashMode={RNCamera.Constants.FlashMode.on}
                {...scannerProps}
            /&amp;gt;
        );
    }
}
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const InputText= ({required = false , disabled = false, ...props}) =&amp;gt; 
         (&amp;lt;input type=&quot;text&quot; disabled={disabled} required={required} {...props} /&amp;gt;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 해서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;InputText required disabled/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 변수 &quot; &quot; &quot; 가 지정됨&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isRequired&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;렌더링 메서드(클래스를 사용하는 경우) 또는 반환 스테이트먼트(함수 컴포넌트를 사용하는 경우)에서 다음 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;MyComponent required={isRequired ? 'true' : undefined} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;React에서는 Propes로 부모에서 자녀로 값을 전달합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;값이 거짓일 경우 소품으로 전달되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 상황에 따라 3진수(조건 연산자)를 사용할 수도 있습니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/31163693/&lt;a href=&quot;https://stackoverflow.com/questions/31163693/how-do-i-conditionally-add-attributes-to-react-components&quot; target=&quot;_blank&quot; papago-id=&quot;83-1&quot;&gt;how-do-i-conditionally-add-attributes-to-react-components&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2314</guid>
      <comments>https://prostudy.tistory.com/2314#entry2314comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:14:48 +0900</pubDate>
    </item>
    <item>
      <title>ubuntu 서버에서 pip install mariadb 오류 발생</title>
      <link>https://prostudy.tistory.com/2313</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ubuntu 서버에서 pip install mariadb 오류 발생&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;mariadb 모듈을 설치하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install mariadb&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;Collecting mariadb
  Using cached https://files.pythonhosted.org/packages/15/73/250a30543f9987af2e3f7856f29917fa22580cd6b457b8e2df0d6d80b3f3/mariadb-1.0.1.tar.gz
    Complete output from command python setup.py egg_info:
    MariaDB Connector/Python requires MariaDB Connector/C &amp;gt;= 3.1.5, found version 3.0.3
    
    ----------------------------------------
Command &quot;python setup.py egg_info&quot; failed with error code 2 in /tmp/pip-build-f3yri8cs/mariadb/
&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;pip install --upgrade setuptools&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;pip install mariadb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래도 안 되는데 어떻게 하면 문제를 해결할 수 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제에 대한 해결책을 찾았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;pip install mariadb를 실행하려면 다음 절차를 따릅니다.&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;오래된 버전 대신 python3.9를 사용하고 있습니다.&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;Python 3.9 설치:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.9
&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;Pip3 설치:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt install python3-pip
&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;mariadb의 repo 추가:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
&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;apt-transport-https 가 설정된 프로벤스를 수신했을 경우는, 다음과 같이 인스톨 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install -y apt-transport-https
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 업데이트를 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
&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;이것으로, 다음의 최신의 Connector/c 를 인스톨 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install libmariadb3
sudo apt-get install libmariadb-dev
&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;sudo pip3 install mariadb
&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;code&gt;MariaDB Connector/Python requires MariaDB Connector/C &amp;gt;= 3.1.5, found version 3.0.3&lt;/code&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;올바른 버전의 MariaDB Connector/C를 설치합니다&lt;a href=&quot;https://downloads.mariadb.org/connector-c/3.1.5/&quot; papago-id=&quot;5-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;.&lt;/a&gt;https://downloads.mariadb.org/&lt;a href=&quot;https://downloads.mariadb.org/connector-c/3.1.5/&quot; papago-id=&quot;5-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;connector-c&lt;/a&gt;/3.1.5/&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB Connector/C의 최신 버전을 설치해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 버전의 ubuntu(MariaDB Connector/C는 실제 버전을 제공하지 않음)를 가지고 있으므로 MariaDB 웹사이트에서 다운로드해야 합니다.&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;MariaDB Connector/C 3.1.8 MariaDB는 EOLed Ubuntu 플랫폼 이외의 바이너리 패키지도 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 버전은 3.1.9이며 여기에서 &lt;a href=&quot;https://downloads.mariadb.com/Connectors/c/connector-c-3.1.9/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18-1&quot;&gt;다운로드&lt;/a&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;ubuntu: 18.04의 버전은 다른 사람들이 말했듯이 충분히 최신 버전이 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이오닉에서 작업한 건데&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;
mkdir -p /tmp/mdbccbin
cd /tmp/mdbccbin

curl -O https://downloads.mariadb.com/Connectors/c/connector-c-3.1.10/mariadb-connector-c-3.1.10-ubuntu-bionic-amd64.tar.gz

echo &quot;1b5b513f44967efadf5eae5e34952cd61f94655575d45b5a9182ea1b91d1d1fa  mariadb-connector-c-3.1.10-ubuntu-bionic-amd64.tar.gz&quot; | sha256sum -c

# get root
sudo su

tar xvf mariadb-connector-c-3.1.10-ubuntu-bionic-amd64.tar.gz --directory /usr --strip-components 1

echo &quot;/usr/lib/mariadb/&quot; &amp;gt; /etc/ld.so.conf.d/mariadb.conf
ldconfig

# back to regular user
exit

python3 -m pip install --user mariadb

&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;sudo apt purge libmariadb3 
sudo apt purge libmariadb-dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(하나를 제거하면 다른 것도 제거되는 것 같습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://downloads.mariadb.com/Connectors/c/&quot; papago-id=&quot;6-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;MariaDB&lt;/a&gt; Connector&lt;a href=&quot;https://downloads.mariadb.com/Connectors/c/&quot; papago-id=&quot;6-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;/C&lt;/a&gt; 다운로드 후&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3개의 디렉토리를 찾을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;include&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lib&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 당신이 필요로 하는 것을 얻습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;노력하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install mariadb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 작업을 하기 전에, 저처럼 혼자서 어디에 둘지 생각해 보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 알아낸 건&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo mv -f bin/mariadb_config /usr/bin/
sudo mv -f include/mariadb    /usr/local/include/
sudo mv -f lib/mariadb        /usr/local/lib/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제, 당신은 할 수 있다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install mariadb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단, 할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;import mariadb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 다음 사항이 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export LD_LIBRARY_PATH=/usr/local/lib/mariadb/
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/63628125/&lt;a href=&quot;https://stackoverflow.com/questions/63628125/error-pip-install-mariadb-on-ubuntu-server&quot; target=&quot;_blank&quot; papago-id=&quot;33-1&quot;&gt;error-pip-install-mariadb-on-ubuntu-server&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2313</guid>
      <comments>https://prostudy.tistory.com/2313#entry2313comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:14:08 +0900</pubDate>
    </item>
    <item>
      <title>Mockito : doAnswer vs then Return</title>
      <link>https://prostudy.tistory.com/2312</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mockito : doAnswer vs then Return&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;추후 유닛 테스트에는 Mockito를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;언제 사용해야 할지 혼란스럽다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doAnswer&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;thenReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누가 좀 자세히 도와줄 수 있어요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 제가 해봤는데&lt;/font&gt;&lt;/font&gt;&lt;code&gt;thenReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;thenReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메서드 호출을 모의했을 때 반환값을 알고 있는 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 정의된 값은 조롱된 메서드를 호출할 때 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;thenReturn(T value)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메서드가 호출되었을 때 반환되는 반환값을 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;@Test
public void test_return() throws Exception {
    Dummy dummy = mock(Dummy.class);
    int returnValue = 5;

    // choose your preferred way
    when(dummy.stringLength(&quot;dummy&quot;)).thenReturn(returnValue);
    doReturn(returnValue).when(dummy).stringLength(&quot;dummy&quot;);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;Answer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 조롱된 메서드가 호출되었을 때 추가 액션을 수행해야 하는 경우(예를 들어 이 메서드콜의 파라미터에 따라 반환값을 계산해야 하는 경우)에 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;doAnswer()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;generic을 사용하여 void 메서드를 stub할 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Answer&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;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응답은 실행되는 액션과 모의 조작 시 반환되는 값을 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;@Test
public void test_answer() throws Exception {
    Dummy dummy = mock(Dummy.class);
    Answer&amp;lt;Integer&amp;gt; answer = new Answer&amp;lt;Integer&amp;gt;() {
        public Integer answer(InvocationOnMock invocation) throws Throwable {
            String string = invocation.getArgumentAt(0, String.class);
            return string.length() * 2;
        }
    };

    // choose your preferred way
    when(dummy.stringLength(&quot;dummy&quot;)).thenAnswer(answer);
    doAnswer(answer).when(dummy).stringLength(&quot;dummy&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;doAnswer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;thenReturn&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;ol&gt; 
 &lt;li papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spy가 아닌 Mock을 사용하고 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;stubing 메서드는 값을 반환하는 것이지 void 메서드는 아닙니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 Book Service를 조롱합시다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface BookService {
    String getAuthor();
    void queryBookTitle(BookServiceCallback callback);
}
&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 class=&quot;papago-parent&quot;&gt;Author() 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doAnswer&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;thenReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;BookService service = mock(BookService.class);
when(service.getAuthor()).thenReturn(&quot;Joshua&quot;);
// or..
doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        return &quot;Joshua&quot;;
    }
}).when(service).getAuthor();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용할 때 주의해 주세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doAnswer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 메서드를 전달할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;when&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Will throw UnfinishedStubbingException
doAnswer(invocation -&amp;gt; &quot;Joshua&quot;).when(service.getAuthor());
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 언제 사용하시겠습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doAnswer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;thenReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음의 2가지 사용 사례를 생각할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;void 메서드를 &quot;정지&quot;하고 싶은 경우.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;doAnswer를 사용하면 메서드 호출 시 몇 가지 추가 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 queryBook에서 콜백을 트리거합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제목.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;BookServiceCallback callback = new BookServiceCallback() {
    @Override
    public void onSuccess(String bookTitle) {
        assertEquals(&quot;Effective Java&quot;, bookTitle);
    }
};
doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        BookServiceCallback callback = (BookServiceCallback) invocation.getArguments()[0];
        callback.onSuccess(&quot;Effective Java&quot;);
        // return null because queryBookTitle is void
        return null;
    }
}).when(service).queryBookTitle(callback);
service.queryBookTitle(callback);
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mock 대신 Spy를 사용하는 경우&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;when을 사용하면 Return on Spy Mockito가 실제 메서드를 호출하고 답변을 스텁합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 다음 예시와 같이 실제 메서드를 호출하지 않을 경우 문제를 일으킬 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;List list = new LinkedList();
List spy = spy(list);
// Will throw java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
when(spy.get(0)).thenReturn(&quot;java&quot;);
assertEquals(&quot;java&quot;, spy.get(0));
&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;doAnswer를 사용하면 안전하게 스텁할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;List list = new LinkedList();
List spy = spy(list);
doAnswer(invocation -&amp;gt; &quot;java&quot;).when(spy).get(0);
assertEquals(&quot;java&quot;, spy.get(0));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 메서드 호출 시 추가 작업을 수행하지 않으려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doReturn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;List list = new LinkedList();
List spy = spy(list);
doReturn(&quot;java&quot;).when(spy).get(0);
assertEquals(&quot;java&quot;, spy.get(0));
&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;ul&gt; 
 &lt;li 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;(...)&lt;/strong&gt;을 사용해야 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업을 수행해야 하거나 실행 시 값을 계산해야 할 경우 &lt;strong papago-id=&quot;38-1&quot;&gt;address(...)&lt;/strong&gt;를 사용해야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;URL : https://stackoverflow.com/questions/36615330/&lt;a href=&quot;https://stackoverflow.com/questions/36615330/mockito-doanswer-vs-thenreturn&quot; target=&quot;_blank&quot; papago-id=&quot;39-1&quot;&gt;mockito-doanswer-vs-thenreturn&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2312</guid>
      <comments>https://prostudy.tistory.com/2312#entry2312comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:13:01 +0900</pubDate>
    </item>
    <item>
      <title>MySQL의 기존 필드에 문자열을 추가하려면 어떻게 해야 합니까?</title>
      <link>https://prostudy.tistory.com/2311</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL의 기존 필드에 문자열을 추가하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 레코드의 코드를 현재 상태로 업데이트하고 싶은데, 표준적인 아이디어가 있습니까?&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;예를 들어 코드가 apple_1 및 apple_2인 경우 apple_1_standard 및 apple_2_standard여야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;id   code
------------
1    apple_1 
1    apple_2
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Psuedo 쿼리:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;update categories set code = code + &quot;_standard&quot; where id = 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예상 결과:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;id   code
----------------------
1    apple_1_standard 
1    apple_2_standard
&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;문자열 연결을 위해 MySQL의 함수를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE categories SET code = CONCAT(code, '_standard') WHERE id = 1;
&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;이미지 필드를 업데이트하여 늘 필드를 무시하고 완전한 URL을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE test SET image = CONCAT('https://my-site.com/images/',image) WHERE image IS NOT NULL;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3765631/&lt;a href=&quot;https://stackoverflow.com/questions/3765631/how-can-i-append-a-string-to-an-existing-field-in-mysql&quot; target=&quot;_blank&quot; papago-id=&quot;8-1&quot;&gt;how-can-i-append-a-string-to-an-existing-field-in-mysql&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2311</guid>
      <comments>https://prostudy.tistory.com/2311#entry2311comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:11:26 +0900</pubDate>
    </item>
    <item>
      <title>데이터 테이블에서 기본 슬롯 isOpen 수정 Vuetify 2.0</title>
      <link>https://prostudy.tistory.com/2310</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 테이블에서 기본 슬롯 isOpen 수정 Vuetify 2.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;안녕하세요, 그룹 행을 사용자 지정하기 위해 그룹 헤더 슬롯을 수정했습니다. 다만 기본적으로 Open = false로 설정하려고 하는데 방법을 찾을 수 없습니다. 도와주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;template v-if=&quot;group_by&quot; v-slot:group.header={group,items,headers,isOpen,toggle}&amp;gt;
    &amp;lt;td v-for=&quot;header in headers&quot; @click=&quot;toggle(items[0].category)&quot;&amp;gt;
        &amp;lt;template v-if=&quot;header.group_header&quot;&amp;gt;
            &amp;lt;template v-if=&quot;link_row&quot;&amp;gt;
                &amp;lt;strong&amp;gt;&amp;lt;a :href=setInvoiceLink(group)&amp;gt;{{group}}&amp;lt;/a&amp;gt; ({{getQuantity(group)}})&amp;lt;/strong&amp;gt;
            &amp;lt;/template&amp;gt;
            &amp;lt;template v-else&amp;gt;
                &amp;lt;strong&amp;gt;{{group}} ({{getQuantity(group)}})&amp;lt;/strong&amp;gt;
            &amp;lt;/template&amp;gt;
            &amp;lt;strong style=&quot;color:blue&quot; v-if=&quot;group_extra_title&quot;&amp;gt; - {{getExtraTitle(group,group_extra_title)}}&amp;lt;/strong&amp;gt;
        &amp;lt;/template&amp;gt;
        &amp;lt;template v-if=&quot;header.sum&quot;&amp;gt;
            &amp;lt;strong&amp;gt;{{MoneyFormat(getSuma(header.value,group))}}&amp;lt;/strong&amp;gt;
        &amp;lt;/template&amp;gt;
        &amp;lt;template v-if=&quot;header.value == 'data-table-select'&quot;&amp;gt;
            &amp;lt;v-checkbox 
                :disabled=&quot;enable_if&quot;
                :input-value=&quot;check_checkbox(group)&quot;
                @change=&quot;selectAllInvoiceAction(group,$event)&quot; 
                &amp;gt;&amp;lt;/v-checkbox&amp;gt;
        &amp;lt;/template&amp;gt;
    &amp;lt;/td&amp;gt;
&amp;lt;/template&amp;gt;
&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;group-by&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;v-data-table&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GitHub 코드를 자세히 보니 Push Request가 추가되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isOpen&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;group-header&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;slot 및 그 사용 예를 나타냅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;v-container&amp;gt;
    &amp;lt;v-data-table :items=&quot;items&quot; :headers=&quot;headers&quot; group-by=&quot;type&quot;&amp;gt;
      &amp;lt;template #group.header=&quot;{ isOpen, toggle }&quot;&amp;gt;
        &amp;lt;v-btn @click=&quot;toggle&quot; icon&amp;gt;
          &amp;lt;v-icon&amp;gt;
            {{ isOpen ? '$minus' : '$plus' }}
          &amp;lt;/v-icon&amp;gt;
        &amp;lt;/v-btn&amp;gt;
      &amp;lt;/template&amp;gt;
    &amp;lt;/v-data-table&amp;gt;
  &amp;lt;/v-container&amp;gt;
&amp;lt;/template&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;font class=&quot;papago-parent&quot;&gt;버튼을 추가하여 모든 것을 동시에 열거나 닫는 경우 다음 스택오버플로우 질문을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/61012221/collapse-or-expand-groups-in-vuetify-2-data-table&quot; papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2 데이터 테이블에서 그룹 축소 또는 확장&lt;/font&gt;&lt;/a&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&gt;&lt;/font&gt;&lt;code&gt;v-data-table&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;props&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스 코드로부터.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VDataTable/VDataTable.ts#L77&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;v-data-table 소스 코드&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;***편집*****&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결할 방법을 고민한 끝에 이 솔루션을 찾았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;build&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;chunk-vendors.[hash].js&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;dist/js&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴더 삭제&lt;/font&gt;&lt;/font&gt;&lt;code&gt;!&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;genGroupedRows:function(t,e){var n=this;return t.map((function(t){return n.openCache.hasOwnProperty(t.name)||n.$set(n.openCache,t.name,!0)
&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;genGroupedRows:function(t,e){var n=this;return t.map((function(t){return n.openCache.hasOwnProperty(t.name)||n.$set(n.openCache,t.name,0)
&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;청크 파일은 ugliify 프로세스로 인해 읽기 어렵습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 당신은 단지 그 사람을 찾기만 하면 된다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;genGroupedRows&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 중간에 기능을 하고 느낌표를 삭제합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, Vuetify의 소스코드에 디폴트로 닫힌 그룹을 작성하도록 지시하는 것입니다.&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;/font&gt;&lt;/font&gt;&lt;code&gt;dev&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 vuetify 모듈에서 소스 코드를 변경해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일함수명&lt;/font&gt;&lt;/font&gt;&lt;code&gt;genGroupedRows&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p 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;작업 예: https://&lt;a href=&quot;https://codepen.io/joke1/pen/bGEPdYL&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;28-1&quot;&gt;codepen&lt;/a&gt;.io/joke1/pen/bGEPdYL&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;false&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;...
mounted () {
    let table = this.$refs.table;
    let keys = Object.keys(table.$vnode.componentInstance.openCache);
     keys.forEach(x =&amp;gt; {
    table.$vnode.componentInstance.openCache[x] = 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;v-data-table ref=&quot;table&quot; ...&amp;gt;&amp;lt;/v-data-table&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;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@jk1에서 제공한 솔루션은 나에게 완벽하게 작동했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 첫 번째 그룹을 &quot;열린 상태&quot;로 유지하여 키 배열에서 마지막 엔트리를 삭제(팝핑)하여 쉽게 이 작업을 수행할 수 있도록 해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let table = this.$refs.table;
let keys = Object.keys(table.$vnode.componentInstance.openCache);
keys.pop() //remove last element so that first group stays open
keys.forEach(x =&amp;gt; {
    table.$vnode.componentInstance.openCache[x] = false;
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 마법처럼 작동했다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/61351208/&lt;a href=&quot;https://stackoverflow.com/questions/61351208/modify-default-slot-isopen-in-data-table-vuetify-2-0&quot; target=&quot;_blank&quot; papago-id=&quot;31-1&quot;&gt;modify-default-slot-isopen-in-data-table-vuetify-2-0&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2310</guid>
      <comments>https://prostudy.tistory.com/2310#entry2310comment</comments>
      <pubDate>Mon, 19 Sep 2022 23:10:50 +0900</pubDate>
    </item>
    <item>
      <title>파일 크기(바이트)를 사람이 읽을 수 있는 문자열로 변환</title>
      <link>https://prostudy.tistory.com/2309</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 크기(바이트)를 사람이 읽을 수 있는 문자열로 변환&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능을 사용하여 파일 크기(바이트)를 사람이 읽을 수 있는 크기로 변환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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 getReadableFileSizeString(fileSizeInBytes) {
  var i = -1;
  var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
  do {
    fileSizeInBytes /= 1024;
    i++;
  } while (fileSizeInBytes &amp;gt; 1024);

  return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
}

console.log(getReadableFileSizeString(1551859712)); // output is &quot;1.4 GB&quot;&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;하지만 이것이 100% 정확한 것은 아닌 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getReadableFileSizeString(1551859712); // output is &quot;1.4 GB&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ㅇㅇㅇㅇㅇ로 해야 되는 거 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;1.5 GB&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잃어가고 것 .&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가가완 전해 ?해 해?? ???&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 니면면 더법 ?법 ??? ???&lt;/font&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;/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;/**
 * Format bytes as human-readable text.
 * 
 * @param bytes Number of bytes.
 * @param si True to use metric (SI) units, aka powers of 1000. False to use 
 *           binary (IEC), aka powers of 1024.
 * @param dp Number of decimal places to display.
 * 
 * @return Formatted string.
 */
function humanFileSize(bytes, si=false, dp=1) {
  const thresh = si ? 1000 : 1024;

  if (Math.abs(bytes) &amp;lt; thresh) {
    return bytes + ' B';
  }

  const units = si 
    ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 
    : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
  let u = -1;
  const r = 10**dp;

  do {
    bytes /= thresh;
    ++u;
  } while (Math.round(Math.abs(bytes) * r) / r &amp;gt;= thresh &amp;amp;&amp;amp; u &amp;lt; units.length - 1);


  return bytes.toFixed(dp) + ' ' + units[u];
}


console.log(humanFileSize(1551859712))  // 1.4 GiB
console.log(humanFileSize(5000, true))  // 5.0 kB
console.log(humanFileSize(5000, false))  // 4.9 KiB
console.log(humanFileSize(-10000000000000000000000000000))  // -8271.8 YiB
console.log(humanFileSize(999949, true))  // 999.9 kB
console.log(humanFileSize(999950, true))  // 1.0 MB
console.log(humanFileSize(999950, true, 2))  // 999.95 kB
console.log(humanFileSize(999500, true, 0))  // 1 MB&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;function humanFileSize(size) {
    var i = Math.floor( Math.log(size) / Math.log(1024) );
    return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이진법 또는 십진법 중 어느 쪽을 사용할지에 따라 달라집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 RAM은 항상 바이너리로 측정되므로 1551859712를 ~1로 나타냅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;4GiB가 맞습니다.&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;한편, 하드 디스크 제조원은 십진법을 사용하는 것을 좋아하기 때문에, 약 1.6이라고 부릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GB&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;또한 플로피 디스크는 두 시스템을 혼합하여 사용합니다. 1MB는 실제로 1024000바이트입니다.&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;blockquote&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빅 넘버를 나타내는 방법에는 다음 두 가지가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1000 = 10 3(기본값 10) 또는 1024 = 2 10(기본값 2)의 배수로 표시할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1000으로 나누면 SI 프리픽스명을 사용하고, 1024로 나누면 IEC 프리픽스명을 사용하는 경우가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 1024로 나누는 것부터 시작된다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 응용 프로그램에서 SI 프리픽스 이름을 사용하며 일부 응용 프로그램에서는 IEC 프리픽스 이름을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 상황은 엉망이다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SI 프리픽스 이름이 표시되는 경우 번호가 1000으로 나누어져 있는지 1024로 나누어져 있는지 알 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/UnitsPolicy&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://wiki.ubuntu.com/UnitsPolicy&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Template:Quantities_of_bytes&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://en.wikipedia.org/wiki/Template:Quantities_of_bytes&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Object.defineProperty(Number.prototype,'fileSize',{value:function(a,b,c,d){
 return (a=a?[1e3,'k','B']:[1024,'K','iB'],b=Math,c=b.log,
 d=c(this)/c(a[0])|0,this/b.pow(a[0],d)).toFixed(2)
 +' '+(d?(a[1]+'MGTPEZY')[--d]+a[2]:'Bytes');
},writable:false,enumerable:false});
&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;는 음  this음음음음음음음 no no no를 포함하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;loop&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;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용방법:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IEC 프리픽스&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;console.log((186457865).fileSize()); // default IEC (power 1024)
//177.82 MiB
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SI 프리픽스&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;console.log((186457865).fileSize(1)); //1,true for SI (power 1000)
//186.46 MB 
//kB,MB,GB,TB,PB,EB,ZB,YB
&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;파일 크기를 계산하기 위해 항상 바이너리 모드를 사용했기 때문에 IEC를 기본값으로 설정했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1024의 전력 사용&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 기능 중 하나를 짧은 oneliner 함수로 사용하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SI&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function fileSizeSI(a,b,c,d,e){
 return (b=Math,c=b.log,d=1e3,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'kMGTPEZY'[--e]+'B':'Bytes')
}
//kB,MB,GB,TB,PB,EB,ZB,YB
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IEC&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function fileSizeIEC(a,b,c,d,e){
 return (b=Math,c=b.log,d=1024,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
}
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용방법:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;console.log(fileSizeIEC(7412834521));
&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;기능에 대해 궁금한 점이 있으면 물어보세요.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sizeOf = function (bytes) {
  if (bytes == 0) { return &quot;0.00 B&quot;; }
  var e = Math.floor(Math.log(bytes) / Math.log(1024));
  return (bytes/Math.pow(1024, e)).toFixed(2)+' '+' KMGTP'.charAt(e)+'B';
}
&lt;/code&gt;&lt;/pre&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; sizeOf(2054110009);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &quot; GB&quot; /=&amp;gt; &quot;1.91 GB&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;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Of size Of(7054110);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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;//=&amp;gt; &quot;6.73 MB&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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; ( sizeOf() ( (3*1024*1024);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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; &quot;00 &quot;//=&amp;gt; &quot;3.00 MB&quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ReactJS 컴포넌트로서의 솔루션&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Bytes = React.createClass({
    formatBytes() {
        var i = Math.floor(Math.log(this.props.bytes) / Math.log(1024));
        return !this.props.bytes &amp;amp;&amp;amp; '0 Bytes' || (this.props.bytes / Math.pow(1024, i)).toFixed(2) + &quot; &quot; + ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i]
    },
    render () {
        return (
            &amp;lt;span&amp;gt;{ this.formatBytes() }&amp;lt;/span&amp;gt;
        );
    }
});
&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;strong papago-id=&quot;33-0&quot;&gt;업데이트&lt;/strong&gt; 여기서 es6을 사용하는 사용자의 경우 동일한 구성 요소의 상태 비저장 버전입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const sufixes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const getBytes = (bytes) =&amp;gt; {
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
  return !bytes &amp;amp;&amp;amp; '0 Bytes' || (bytes / Math.pow(1024, i)).toFixed(2) + &quot; &quot; + sufixes[i];
};

const Bytes = ({ bytes }) =&amp;gt; (&amp;lt;span&amp;gt;{ getBytes(bytes) }&amp;lt;/span&amp;gt;);

Bytes.propTypes = {
  bytes: React.PropTypes.number,
};
&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;a href=&quot;https://stackoverflow.com/users/2450730/cocco&quot; papago-id=&quot;34-1&quot;&gt;cocco&lt;/a&gt;의 아이디어를 바탕으로 보다 간결하지만 보다 포괄적인 예를 제시하겠습니다.&lt;/font&gt;&lt;/p&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;title&amp;gt;File info&amp;lt;/title&amp;gt;

&amp;lt;script&amp;gt;
&amp;lt;!--
function fileSize(bytes) {
    var exp = Math.log(bytes) / Math.log(1024) | 0;
    var result = (bytes / Math.pow(1024, exp)).toFixed(2);

    return result + ' ' + (exp == 0 ? 'bytes': 'KMGTPEZY'[exp - 1] + 'B');
}

function info(input) {
    input.nextElementSibling.textContent = fileSize(input.files[0].size);
} 
--&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
&amp;lt;label for=&quot;upload-file&quot;&amp;gt; File: &amp;lt;/label&amp;gt;
&amp;lt;input id=&quot;upload-file&quot; type=&quot;file&quot; onchange=&quot;info(this)&quot;&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt; 
&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;function fileSize(b) {
    var u = 0, s=1024;
    while (b &amp;gt;= s || -b &amp;gt;= s) {
        b /= s;
        u++;
    }
    return (u ? b.toFixed(1) + ' ' : b) + ' KMGTPEZY'[u] + 'B';
}
&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;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소수 자릿수가 숫자의 크기에 비례하는 &quot;파일 관리자&quot; 동작(예: Windows 탐색기)을 원했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 어떤 대답도 이 일을 하지 않는 것 같다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function humanFileSize(size) {
    if (size &amp;lt; 1024) return size + ' B'
    let i = Math.floor(Math.log(size) / Math.log(1024))
    let num = (size / Math.pow(1024, i))
    let round = Math.round(num)
    num = round &amp;lt; 10 ? num.toFixed(2) : round &amp;lt; 100 ? num.toFixed(1) : round
    return `${num} ${'KMGTPEZY'[i-1]}B`
}
&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;humanFileSize(0)          // &quot;0 B&quot;
humanFileSize(1023)       // &quot;1023 B&quot;
humanFileSize(1024)       // &quot;1.00 KB&quot;
humanFileSize(10240)      // &quot;10.0 KB&quot;
humanFileSize(102400)     // &quot;100 KB&quot;
humanFileSize(1024000)    // &quot;1000 KB&quot;
humanFileSize(12345678)   // &quot;11.8 MB&quot;
humanFileSize(1234567890) // &quot;1.15 GB&quot;
&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;2020년부터 IEC(전원 1024, 기본값), SI(전원 1000) 및 JEDEC(대체 SI 단위 표기)의 포맷을 지원하는 파일 크기의 npm 패키지를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;npm install file-size

import filesize from &quot;filesize&quot;;

// outputs: 186.46 MB
filesize(186457865).human('si');

// outputs: 177.82 MiB
filesize(186457865).human();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/file-size&quot; rel=&quot;noreferrer&quot; papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.npmjs.com/package/file-size&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;filesize&lt;/code&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/filesize&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.npmjs.com/package/filesizehttpswww.npmjs.com/package/&lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션도 많고 사용법도 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;filesize(265318); // &quot;259.1 KB&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뛰어난 예에서 발췌하여&lt;/font&gt;&lt;/p&gt;&lt;p 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;h2 papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메트릭 접두사:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;/**
 * Format file size in metric prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeMetric = (fileSize) =&amp;gt; {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kB', 'MB', 'GB', 'TB'];
  let quotient = Math.floor(Math.log10(size) / 3);
  quotient = quotient &amp;lt; units.length ? quotient : units.length - 1;
  size /= (1000 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이진 접두사:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;/**
 * Format file size in binary prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeBinary = (fileSize) =&amp;gt; {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kiB', 'MiB', 'GiB', 'TiB'];
  let quotient = Math.floor(Math.log2(size) / 10);
  quotient = quotient &amp;lt; units.length ? quotient : units.length - 1;
  size /= (1024 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};
&lt;/code&gt;&lt;/pre&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;예:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;// Metrics prefix
formatFileSizeMetric(0)      // 0 bytes
formatFileSizeMetric(-1)     // 1 bytes
formatFileSizeMetric(100)    // 100 bytes
formatFileSizeMetric(1000)   // 1 kB
formatFileSizeMetric(10**5)  // 10 kB
formatFileSizeMetric(10**6)  // 1 MB
formatFileSizeMetric(10**9)  // 1GB
formatFileSizeMetric(10**12) // 1 TB
formatFileSizeMetric(10**15) // 1000 TB

// Binary prefix
formatFileSizeBinary(0)     // 0 bytes
formatFileSizeBinary(-1)    // 1 bytes
formatFileSizeBinary(1024)  // 1 kiB
formatFileSizeBinary(2048)  // 2 kiB
formatFileSizeBinary(2**20) // 1 MiB
formatFileSizeBinary(2**30) // 1 GiB
formatFileSizeBinary(2**40) // 1 TiB
formatFileSizeBinary(2**50) // 1024 TiB
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 있습니다. 대용량 파일에도 사용 가능 -_-&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function formatFileSize(size)
{
    var sizes = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'];
    for (var i = 1; i &amp;lt; sizes.length; i++)
    {
        if (size &amp;lt; Math.pow(1024, i)) return (Math.round((size/Math.pow(1024, i-1))*100)/100) + sizes[i-1];
    }
    return size;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/20463021/1414809&quot; papago-id=&quot;50-1&quot;&gt;coco의 답변&lt;/a&gt;에 근거해, 약간 불명료한(솔직히, 내가 익숙했던 것은 그대로/추가되어 있다) 후행 0을 나타내지 않지만, 여전히 0을 서포트하고 있어, 다른 사람에게 도움이 되고 싶다.&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;false&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 fileSizeSI(size) {
    var e = (Math.log(size) / Math.log(1e3)) | 0;
    return +(size / Math.pow(1e3, e)).toFixed(2) + ' ' + ('kMGTPEZY'[e - 1] || '') + 'B';
}


// test:
document.write([0, 23, 4322, 324232132, 22e9, 64.22e12, 76.22e15, 64.66e18, 77.11e21, 22e24].map(fileSizeSI).join('&amp;lt;br&amp;gt;'));&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;1551859712 / 1024 = 1515488
1515488 / 1024 = 1479.96875
1479.96875 / 1024 = 1.44528198242188
&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 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&gt;&lt;/font&gt;&lt;code&gt;1551859712&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;1.5&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;1000으로 나눗셈을 해야 하는데 바이트는 1024의 10진수 청크로 카운트되기 때문에 기가바이트 값이 더 작습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;불필요한 분수 반올림 없이 SI 시스템을 위한 단순하고 짧은 &quot;Pretty Bytes&quot; 함수입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 숫자 크기는 사람이 읽을 수 있어야 하기 때문에, &quot;1/1000분의 1&quot; 표시는 더 이상 사람이 아니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소수 자릿수는 기본적으로 2로 설정되어 있지만 함수를 다른 값으로 호출할 때 수정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 표시되는 것은 디폴트 소수점2 자리입니다.&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;코드는 짧고 Number String Trippets 메서드를 사용합니다.&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;// Simple Pretty Bytes with SI system
// Without fraction rounding

function numberPrettyBytesSI(Num=0, dec=2){
if (Num&amp;lt;1000) return Num+&quot; Bytes&quot;;
Num =(&quot;0&quot;.repeat((Num+=&quot;&quot;).length*2%3)+Num).match(/.{3}/g);
return Number(Num[0])+&quot;.&quot;+Num[1].substring(0,dec)+&quot; &quot;+&quot;  kMGTPEZY&quot;[Num.length]+&quot;B&quot;;
}

console.log(numberPrettyBytesSI(0));
console.log(numberPrettyBytesSI(500));
console.log(numberPrettyBytesSI(1000));
console.log(numberPrettyBytesSI(15000));
console.log(numberPrettyBytesSI(12345));
console.log(numberPrettyBytesSI(123456));
console.log(numberPrettyBytesSI(1234567));
console.log(numberPrettyBytesSI(12345678));&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;a href=&quot;https://stackoverflow.com/a/20463021/1414809&quot; papago-id=&quot;58-1&quot;&gt;cocco의 답변은 &lt;/a&gt;흥미롭지만 다음과 같은 문제가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/q/14034180/64750&quot; papago-id=&quot;59-0&quot;&gt;소유&lt;/a&gt;하지 않은 네이티브 유형 또는 유형 &lt;a href=&quot;https://stackoverflow.com/q/14034180/64750&quot; papago-id=&quot;59-0&quot;&gt;수정&lt;/a&gt; 안 함&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;60&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;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(TypeScript 사용자용 Bonus) TypeScript에서 잘 재생되지 않음&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Type Script:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt; /**
 * Describes manner by which a quantity of bytes will be formatted.
 */
enum ByteFormat {
  /**
   * Use Base 10 (1 kB = 1000 bytes). Recommended for sizes of files on disk, disk sizes, bandwidth.
   */
  SI = 0,
  /**
   * Use Base 2 (1 KiB = 1024 bytes). Recommended for RAM size, size of files on disk.
   */
  IEC = 1
}

/**
 * Returns a human-readable representation of a quantity of bytes in the most reasonable unit of magnitude.
 * @example
 * formatBytes(0) // returns &quot;0 bytes&quot;
 * formatBytes(1) // returns &quot;1 byte&quot;
 * formatBytes(1024, ByteFormat.IEC) // returns &quot;1 KiB&quot;
 * formatBytes(1024, ByteFormat.SI) // returns &quot;1.02 kB&quot;
 * @param size The size in bytes.
 * @param format Format using SI (Base 10) or IEC (Base 2). Defaults to SI.
 * @returns A string describing the bytes in the most reasonable unit of magnitude.
 */
function formatBytes(
  value: number,
  format: ByteFormat = ByteFormat.SI
) {
  const [multiple, k, suffix] = (format === ByteFormat.SI
    ? [1000, 'k', 'B']
    : [1024, 'K', 'iB']) as [number, string, string]
  // tslint:disable-next-line: no-bitwise
  const exp = (Math.log(value) / Math.log(multiple)) | 0
  // or, if you'd prefer not to use bitwise expressions or disabling tslint rules, remove the line above and use the following:
  // const exp = value === 0 ? 0 : Math.floor(Math.log(value) / Math.log(multiple)) 
  const size = Number((value / Math.pow(multiple, exp)).toFixed(2))
  return (
    size +
    ' ' +
    (exp 
       ? (k + 'MGTPEZY')[exp - 1] + suffix 
       : 'byte' + (size !== 1 ? 's' : ''))
  )
}

// example
[0, 1, 1024, Math.pow(1024, 2), Math.floor(Math.pow(1024, 2) * 2.34), Math.pow(1024, 3), Math.floor(Math.pow(1024, 3) * 892.2)].forEach(size =&amp;gt; {
  console.log('Bytes: ' + size)
  console.log('SI size: ' + formatBytes(size))
  console.log('IEC size: ' + formatBytes(size, 1) + '\n')
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 TypeScript로 작성된 국제화 구현입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'petabyte']
const BYTES_PER_KB = 1000


/**
 * Format bytes as human-readable text.
 *
 * @param sizeBytes Number of bytes.
 *
 * @return Formatted string.
 */
export function humanFileSize(sizeBytes: number | bigint): string {
    let size = Math.abs(Number(sizeBytes))

    let u = 0
    while(size &amp;gt;= BYTES_PER_KB &amp;amp;&amp;amp; u &amp;lt; UNITS.length-1) {
        size /= BYTES_PER_KB
        ++u
    }

    return new Intl.NumberFormat([], {
        style: 'unit',
        unit: UNITS[u],
        unitDisplay: 'short',
        maximumFractionDigits: 1,
    }).format(size)
}
&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;[]&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;fr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디폴트 이외의 현지화를 강제합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;console.log(humanFileSize(0))
console.log(humanFileSize(9))
console.log(humanFileSize(99))
console.log(humanFileSize(999))
console.log(humanFileSize(1000))
console.log(humanFileSize(1001))
console.log(humanFileSize(1023))
console.log(humanFileSize(1024))
console.log(humanFileSize(1025))
console.log(humanFileSize(100_000))
console.log(humanFileSize(1_000_000))
console.log(humanFileSize(1_000_000_000))
console.log(humanFileSize(1_000_000_000_000))
console.log(humanFileSize(1_000_000_000_000_000))
console.log(humanFileSize(1_000_000_000_000_000_000))
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;// fr
0 o
9 o
99 o
999 o
1 ko
1 ko
1 ko
1 ko
1 ko
100 ko
1 Mo
1 Go
1 To
1 Po
1 000 Po

// en-US
0 byte
9 byte
99 byte
999 byte
1 kB
1 kB
1 kB
1 kB
1 kB
100 kB
1 MB
1 GB
1 TB
1 PB
1,000 PB
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/14919494/860099&quot; papago-id=&quot;67-1&quot;&gt;이것은 mpen&lt;/a&gt; answer의 크기 개선입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function humanFileSize(bytes, si=false) {
  let u, b=bytes, t= si ? 1000 : 1024;     
  ['', si?'k':'K', ...'MGTPEZY'].find(x=&amp;gt; (u=x, b/=t, b**2&amp;lt;1));
  return `${u ? (t*b).toFixed(1) : bytes} ${u}${!si &amp;amp;&amp;amp; u ? 'i':''}B`;    
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;true&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code snippet-currently-hidden&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;function humanFileSize(bytes, si=false) {
  let u, b=bytes, t= si ? 1000 : 1024;     
  ['', si?'k':'K', ...'MGTPEZY'].find(x=&amp;gt; (u=x, b/=t, b**2&amp;lt;1));
  return `${u ? (t*b).toFixed(1) : bytes} ${u}${!si &amp;amp;&amp;amp; u ? 'i':''}B`;    
}


// TEST
console.log(humanFileSize(5000));      // 4.9 KiB
console.log(humanFileSize(5000,true)); // 5.0 kB&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;@Andrew V의 타이프스크립트 버전이 새 &quot;템플릿 리터럴 유형&quot;으로 응답합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;export const humanFileSize = (bytes: number): `${number} ${'B' | 'KB' | 'MB' | 'GB' | 'TB'}` =&amp;gt; {
    const index = Math.floor(Math.log(bytes) / Math.log(1024));
    return `${Number((bytes / Math.pow(1024, index)).toFixed(2)) * 1} ${(['B', 'KB', 'MB', 'GB', 'TB'] as const)[index]}`;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하시는 분&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Angular&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 라고 하는 패키지가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;angular-pipes&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 파이프에 접속되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;72&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;import { BytesPipe } from 'angular-pipes';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;73&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;{{ 150 | bytes }} &amp;lt;!-- 150 B --&amp;gt;
{{ 1024 | bytes }} &amp;lt;!-- 1 KB --&amp;gt;
{{ 1048576 | bytes }} &amp;lt;!-- 1 MB --&amp;gt;
{{ 1024 | bytes: 0 : 'KB' }} &amp;lt;!-- 1 MB --&amp;gt;
{{ 1073741824 | bytes }} &amp;lt;!-- 1 GB --&amp;gt;
{{ 1099511627776 | bytes }} &amp;lt;!-- 1 TB --&amp;gt;
{{ 1073741824 | bytes : 0 : 'B' : 'MB' }} &amp;lt;!-- 1024 MB --&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/fknop/angular-pipes/blob/master/docs/math.md#bytes&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;74-0&quot;&gt;문서에 링크&lt;/a&gt;합니다.&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&gt;&lt;/font&gt;&lt;code&gt;bytes.toFixed(dp)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;번호를 매긴 후 다음과 같이 문자열로 돌아갑니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return Number(bytes.toFixed(dp)).toString() + &quot; &quot; + units[u];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 100.00 GiB가 아닌 100 GiB가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;js 단위로 &lt;a href=&quot;https://stackoverflow.com/questions/62147160/tofixed-dynamically-in-js?noredirect=1&amp;amp;lq=1&quot; papago-id=&quot;77-1&quot;&gt;동적&lt;/a&gt;으로 질문 &lt;a href=&quot;https://stackoverflow.com/questions/62147160/tofixed-dynamically-in-js?noredirect=1&amp;amp;lq=1&quot; papago-id=&quot;77-1&quot;&gt;toFixed()&lt;/a&gt;에 대한 참조&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;난 10년만 늦었어! es6에&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;function humanReadableSize(bytes) {
    let size = parseInt(data)
    for (let unit of ['b', 'Kb', 'Mb', 'Gb']) {
        if (size &amp;lt; 1024) return `${size.toFixed(2)} ${unit}`
        size /= 1024.0
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사람이 읽을 수 있는 형식도 가능한 크기 변환 기능을 썼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;JS&lt;/code&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;const bitBase = 8;
const suffixes = {
  bit: 'b',
  b: 'B',
  kb: 'KB',
  mb: 'MB',
  gb: 'GB',
  tb: 'TB',
};
const multipliers = {
  bit: {
    toBitHr: 1,
    toB: 1 / bitBase,
    toKB: 1 / (bitBase * 1e3),
    toMB: 1 / (bitBase * 1e6),
    toGB: 1 / (bitBase * 1e9),
    toTB: 1 / (bitBase * 1e12),
  },
  B: {
    toBit: bitBase,
    toBHr: 1,
    toKB: 1 / 1e3,
    toMB: 1 / 1e6,
    toGB: 1 / 1e9,
    toTB: 1 / 1e12,
  },
  KB: {
    toBit: 1 / (bitBase * 1e3),
    toB: 1e3,
    toKBHr: 1,
    toMB: 1 / 1e3,
    toGB: 1 / 1e6,
    toTB: 1 / 1e9,
  },
  MB: {
    toBit: bitBase * 1e6,
    toB: 1e6,
    toKB: 1e3,
    toMBHr: 1,
    toGB: 1 / 1e3,
    toTB: 1 / 1e6,
  },
  GB: {
    toBit: bitBase * 1e9,
    toB: 1e9,
    toKB: 1e6,
    toMB: 1e3,
    toGBHr: 1,
    toTB: 1 / 1e3,
  },
  TB: {
    toBit: bitBase * 1e12,
    toB: 1e12,
    toKB: 1e9,
    toMB: 1e6,
    toGB: 1e3,
    toTBHr: 1,
  },
};

const round = (num, decimalPlaces) =&amp;gt; {
  const strNum = num.toString();
  const isExp = strNum.includes('e');
  if (isExp) {
    return Number(num.toPrecision(decimalPlaces + 1));
  }

  return Number(
    `${Math.round(Number(`${num}e${decimalPlaces}`))}e${decimalPlaces * -1}`,
  );
};

function conv(
  value,
  hr,
  rnd,
  multiplier,
  suffix,
) {
  let val = value * multiplier;
  if ((value * multiplier) &amp;gt; Number.MAX_SAFE_INTEGER) {
    val = Number.MAX_SAFE_INTEGER;
  }
  if (val &amp;lt; Number.MIN_VALUE) val = 0;
  if ((rnd || rnd === 0) &amp;amp;&amp;amp; val &amp;lt; Number.MAX_SAFE_INTEGER) {
    val = round(val, rnd);
  }
  if (hr) return `${val}${suffix}`;
  return val;
}

const MemConv = (function _() {
  return {
    bit(value) {
      return {
        toBitHr(opts = {}) {
          return conv(
            value,
            true,
            opts.round || false,
            multipliers.bit.toBitHr,
            suffixes.bit,
          );
        },
        toB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.bit.toB,
            suffixes.b,
          );
        },
        toKB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.bit.toKB,
            suffixes.kb,
          );
        },
        toMB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.bit.toMB,
            suffixes.mb,
          );
        },
        toGB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.bit.toGB,
            suffixes.gb,
          );
        },
        toTB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.bit.toTB,
            suffixes.tb,
          );
        },
      };
    },
    B(value) {
      return {
        toBit(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.B.toBit,
            suffixes.bit,
          );
        },
        toBHr(opts = {}) {
          return conv(
            value,
            true,
            opts.round || false,
            multipliers.B.toBHr,
            suffixes.b,
          );
        },
        toKB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.B.toKB,
            suffixes.kb,
          );
        },
        toMB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.B.toMB,
            suffixes.mb,
          );
        },
        toGB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.B.toGB,
            suffixes.gb,
          );
        },
        toTB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.B.toTB,
            suffixes.tb,
          );
        },
      };
    },
    KB(value) {
      return {
        toBit(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.KB.toBit,
            suffixes.bit,
          );
        },
        toB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.KB.toB,
            suffixes.b,
          );
        },
        toKBHr(opts = {}) {
          return conv(
            value,
            true,
            opts.round || false,
            multipliers.KB.toKBHr,
            suffixes.kb,
          );
        },
        toMB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.KB.toMB,
            suffixes.mb,
          );
        },
        toGB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.KB.toGB,
            suffixes.gb,
          );
        },
        toTB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.KB.toTB,
            suffixes.tb,
          );
        },
      };
    },
    MB(value) {
      return {
        toBit(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.MB.toBit,
            suffixes.bit,
          );
        },
        toB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.MB.toB,
            suffixes.b,
          );
        },
        toKB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.MB.toKB,
            suffixes.kb,
          );
        },
        toMBHr(opts = {}) {
          return conv(
            value,
            true,
            opts.round || false,
            multipliers.MB.toMBHr,
            suffixes.mb,
          );
        },
        toGB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.MB.toGB,
            suffixes.gb,
          );
        },
        toTB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.MB.toTB,
            suffixes.tb,
          );
        },
      };
    },
    GB(value) {
      return {
        toBit(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.GB.toBit,
            suffixes.bit,
          );
        },
        toB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.GB.toB,
            suffixes.b,
          );
        },
        toKB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.GB.toKB,
            suffixes.kb,
          );
        },
        toMB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.GB.toMB,
            suffixes.mb,
          );
        },
        toGBHr(opts = {}) {
          return conv(
            value,
            true,
            opts.round || false,
            multipliers.GB.toGBHr,
            suffixes.gb,
          );
        },
        toTB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.GB.toTB,
            suffixes.tb,
          );
        },
      };
    },
    TB(value) {
      return {
        toBit(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.TB.toBit,
            suffixes.bit,
          );
        },
        toB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.TB.toB,
            suffixes.b,
          );
        },
        toKB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.TB.toKB,
            suffixes.kb,
          );
        },
        toMB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.TB.toMB,
            suffixes.mb,
          );
        },
        toGB(opts = {}) {
          return conv(
            value,
            opts.hr || false,
            opts.round || false,
            multipliers.TB.toGB,
            suffixes.gb,
          );
        },
        toTBHr(opts = {}) {
          return conv(
            value,
            true,
            opts.round || false,
            multipliers.TB.toTBHr,
            suffixes.tb,
          );
        },
      };
    },
  };
}());

const testCases = [1, 10, 150, 1000, 74839.67346];
const HRSuffixes = Object.values(suffixes);
const roundDecimals = 2;
const precision = Number(`0.${'0'.repeat(roundDecimals)}5`);
const SCIENTIFIC_NOT_NUMBER_REGXP = /[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?/g;
const SUFFIX_REGXP = /[a-z]+$/i;
const CONVERSION_TO_REGXP = /(?&amp;lt;=to).*(?=hr+$)|(?&amp;lt;=to).*(?=hr+$)?/i;

for (const conversionFrom of (Object.keys(MemConv))) {
  for (const tCase of testCases) {
    const convFunc = MemConv[conversionFrom](tCase);
    for (const [conversionToFn, f] of Object.entries(convFunc)) {
      const conversionTo = (conversionToFn.match(CONVERSION_TO_REGXP) || [conversionToFn])[0];

      const result = f();
      const humanReadable = f({ hr: true });
      const rounded = f({ round: roundDecimals });
      const roundedAndHumanReadable = f({ hr: true, round: roundDecimals });


      console.log({
        value: tCase,
        from: conversionFrom,
        to: conversionTo,
        result,
        humanReadable,
        rounded,
        roundedAndHumanReadable,
      });
    }
  }
}&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.typescriptlang.org/play?jsx=0&amp;amp;module=1#code/PQKgBApgzgNglgOwC4FoAmcoEMBGMJhYBORA9gO4o6loCeKUSt+YIwAsAFCiSyKoZseAkQgBHAK5xRKAFZQ0pAMasOnOAFsADqSJJCUKBD1gAZmQ1gA5FkPGkVgNxcu-Y6axKCASQCyEDQBhUgQANzAAby4wMBw4JAAuMAAKUKwYCQgkhAkNHGMASjAAXgA+SOiYsCRSACF4gAkiZNItJCgAfiSIsgkENC6wHLzjAF8CpMYiRABzZ04q6rqWtqhugAsiJKQiTIAaMF7+weH8onHJndn5xZralfbBiM3BjxgjA6OB7Nyzi6HfsYblUagBpe6tdobLbVXYQT6kPrfAEjc4TMBTa6VGJgiGrJ4vJJvD6HRHHH6o-6nIHYpa+PFQyKbbZwhFIk6AtGXaYIOa0mr0h6daGvdIkr4cyno6lEYE40gAcQZayZMJ2+1J7Ipf3RmN5cqWSqFBKIove8M15JROu1NIWINIABVldCWRqJbauRirvr+U7lSazeKyciZVTOcDRsDaklUulMp6imUKvb5fUkELXbD3SHJTbvTy+amlunjSKiWKLR7rWNpRG-bUmmXItWw7qfUXbqRwZnVW6q7nPf89Z2HT3IcLVUGB1qa16ZQaBS6+9mZ1a29yscWl83nqaK+a2evOeHUYvFcu9-2j6GT+3C+ejRPAwfg7ON3Pz87e1fVze87Wm6+tu-q7oSZiVv+Q51melSjJU4KxmkGRZHOSblFEIGlhOWbqmut5SkBo5pvEYH7hBh6WgR+YLg2P7Mn+VEAV6I7ngG5YUW+x6EZ+frgk2z7dK2d5Eeego4SueFQXOw4dmJ7FTq++HMaeZyPpeDFSUx0GiX6T74hxxLKTpvEgd+Em-lpwk8axfrmQZimccZMkwWpcHAvSSHxqhMroSmXbYasuGstpLm6VhpGCY5RnSR+tFYfRaohdZ+a2QlUV7tOsUiaZXbjkFknJYOYUFlueUKZlSnZTx8VdvSAkOT0xUfmlXb6YyllFe+OWtQ67WTpVTnVTR9ZmRpSU5t1NlyXZFXgTFoVxaNMTwfaSpeShiYlBhDaRQVnWTdxqUzRFGYZfNkGLTltUOuN15XdND50ed5ELSlgG5WOd2Me9LEneVZFZQ9I2wSB4n7ZpXVHR9vXyuDjyGZdv2qXabWNs0GXI-eZUOvZHWQ4d1Ew-9uNza9SPNddy1gKtMTOhtCZodt-m3Xt+MTc5LUkyRZ2NRdlFY56bGJfdgulcBAWA1VwMfTd8r5ezouU49OPy2TQNi3LdLfVZyvHU9YPq9LmvU-K-XBYTKnYxLfVG0NMvzqbSzOg1CMtnrxMGytXCrUoISMLE8S1LYBDFGAAAc8wQAAHjoJh+wgAdQBIpimHA0fQCULNxIk1g4FYeyVDgSRWLUBeVAA1sX1jguX9p5CX9J1zEMzV1YSrN9UbfOnXUZcDHcf6AnAcaBIMBIHAWjwMYUBZ5hMQ590u1IE0SQAIyF1h69gMAgdIMHHx8TGYBrzvKQ5wfBDgGvEAAMwFJvdXH6fu-JBfIesCfEAAGwP3pz9nzfkHD+18IAAE4-5jW3q-d+RhP43zXgAJkgStR+YBj7z1ZrnWB8IGyrxPmgtW0Cv630IdrYhN9v5kJqOtE+Z8b5gOof6ChEAkFoNGGgxCLMebEKAfvEBJCUG3XXnfJh-EYQbz9J5Ohu8b6kP-iwqhs0WGMLgmg6RmCeF70vvAn+TDn56KPiI+Rht8GSJArQl+JCmH0xkV-JR9oOGVFoZoks8Qkg4N0aoreX9vHlREQ4p+ximFKjMTYgBsjRFqMqLY1xdx3HaIEQgxB+iRFsKMb4ph0jKEhIMSYrsLsJHsM3n3Tg-dY66CHv7fQXws7JGGJ6A4aAIBKE0OkAACjATw0AtrJkwcPfQUwAByuQs7DAAHQ1AAModmSAUYEAywCYAAKKxyzsM3I4zEBKAyM0qAyQrAQCsPMyocBTApBWbHIorjRBIAkEQBAYARmonqZsmo7TRCtKgHAEIyRmmtI0B0rpXhZ4AGoT4FBOY4lw9pbn3Mec8s4yRaQAAMAAkERfBYCQOscZXxkiIuMMkdFERhijAgBi-5bSYCdO6VAUYKLIXkspS06ltKQWfxQGvBlaCoWlK4KYPoSgJ4hDAAnUIyL7TIUZjKNBDFqCkHwFgBAaCHloE9GAAAPkNSoo9x6T2njCWVlRk6p3TkRTe1zKj4H0MhLO0qr5gD1RPKecBUZLPOckOMKFP7OoNW6ogRRyiEqIOM3wABBAAGgAfSmeGgAYss6N3ghmOmWQqZZAAlK1xY7VhxDWGqNsaE1JpTWmjNmbIynM9XagAPE8zkYaU3RoAGrhoADIAFVllFDzWAAADMCM5KRkhqq1dqsdxQp0DqKAAMlnWAOtDbUSFpjXGxNybU3pqzTmxYfb8XIU+P0KF3t7TDuSJsIocKHlgBJchUYGLTVp2jgy4E17HnIXmKtcpg8xXVLAP4IIIRwhh2SIKhAwqfmPOjXMpIfgAjBDCCzd93C97eplZyXdixDgQDuTe1xAVGgY32sjOe4xUPYZw3hx54rJWUcow6sh9G-y0mYxOPFIZx06uLMxv1rqZ7jJzpMuoRGmP0afenaAgn4hicWCe+jTieO3USoMBVSqVUO1GGRrDzGUO0dY-RxjBnKPsc2FxmKxnsPsdqZq7VFmlOUb44aqA0mkDCdqLJ7DEmM4uZwJ5mI8nKOKeY7iFTHjSCKogMq4aYxtMUew3p4DdHmNVCMw5qzqxxlmds9xlLVRrOcZy-ZvLMQnMBt8-EYT4J-NVG81JquNXAvYeC-RncFlwJqaixp0jYcIjkYIwl3D8K-1hGS3ltLJWwCmaIOZyClnFgFaRLNw882qhlYE0JpcNWYh1Zc3kRrBpFgtcozQ8aqmIvqZi+cOLA3FiJdG6tmIE2SvTeW4fdLC3Ms2bs3Nj7a2x4uuc654TSptsYhTs+qTrcDuWeO9hmoeMVSDU69FzTN3Vv3YlY9xd3kwevaK79ybi3+hvdwX90rAP-Ubcqwjjz2PduTL86tprR2xNadsGATNQ2HmOloFoCAtb4NAbCAAbSsDnKwABdUoBo4f3AdVtAbKHbtuN5uzc7kXUc9ciP1jH3OaNJex89vL+OfsrfJ1Nr7hWzfvcm+togLnajuZk-TiHkmKtIBh+luHAVXZI+131nT9HMdjZS8blLUlsfE7QKTsH9vHfuaaGDhnTO-ss6qD7r6YXYgXa61drTvXdd-ZD0b3HUfMvZZt2TonVulsE-N3byn-GHfjKd7iZPbufPjIa8zw7GfPNtYhuRFH3WPbXcL0HyjJeLfh7YxXmb9fbcvdryTxf1eSvx9b8J+kHezVd-2732HA+LzZ5H-n9Hxf9cjaxzPsvFvTe5eX+0Djdeq9x6b0DtvF5d+Q5c9Dw-3ux+iOHEZ+aOE+8Wd2V++mt+KEeO8+se5ez+32j+eWm+X+zoP+7ujOXuzGme7Os8XO1GvO-OgugGiGoQYuZc0usuZCPYCuTMSuV+Ku8SauSOHWueWuY+BeOuk+g21G1+oezGs+9GD+xWT+LmyBYhqBH+5W4y4Izunurue+UmOcOBCmx+Z24Wmuo+U0fwF+eW0+k2whJm8Ba+cBSB1uKBKWm+8hdwmBXeqeeW6eqClmuIfuQkXB+hKWhhJWxh8OrIiBEhlhUh1hMhAmth3Y6M9h9WjhKWzhNMx+8MbBw+HBOh0M4+PBEBVQPh42d+Nez+leVhc+Fhr+RR9GNhX+O+Shv+4yB+aefeLh6Wp2p+qR5+4BKuMQORYeeR4hWWC+b+gRL+q+AxFuFRIOdOFuDO-+9RR+rhoE7WKR2hbRmRHRVGw20BRhPRJuphIx+RQRpRIRvGYRLeERGB1RWBSAsRzG8ReBBgnO+uxBAuQu5BYutc1BtIcOgo9Bvk8WyucxgU6uWhl2YBKxeu-BGxvhWxKWohhOvRkhsJ0h+qzeLm9ICh0RHuahQWGhLRSxIJgeWRnRUBhuMB+wgxhRhxIhK+MeZh2Om+qJdh5xDhmJzWx+CsyRGuwJAeReBhRJD2JJ6+2xBR-RZRJhJRwxIp2GdJX+1WjJMRzJrOcx9UxGHUXJvBkB4JxJmxsB2Oke9+VJCBoxxxKJlRURspe2Vx9GNxx+5sjkoBqpBJaxN6EJuR2pepQpBpexQx1JuxG+RpYaX+oOZp4y0xThDRCRcxwBtprReJ3J3hvJN+WppJbpLm5JCJ0J+pNJhpSJQO9J-o6J2BABuBbOdxhB8KjxpBCGwGYuTc7xxYcORo3xmGvxTB-xbM7JQJeeMZap2R8ZghhmUJxRKZwpFJop+x4pI5kpfpSoaJQZqhhZ6h-xOJnJnh7RYJ6xmpkJrpnpqZDecJwRaZRx2Zsh05DJkxneKh8p-ecxbJIB0Z9pqxXRQhA5lJ7pmZnp8Ju5iJgOx50pExk2DOPeMxgBipmhOeuJ95a5TpG5LpSZ25w5B5L5Y53pEpiwm+J5pAVRZ5yh5pl5jRIWF47h7suhsWq5l+GpfJiZApEeARyZXpHpvpR5Am6FoSRA+ZIZcRYZme8okZyOd5K5oJZF65FFm5sFvRO5S+gpSF9FX5VOLe6FZxWFNRlxuF4ZSm+B9xRBfOTxZBVZ7cVBMuHxZC34jZqIvBfxTRImrBt54F-F+JD5vZpeW5Yl8Fn56ZYpyFE5qFfpzoM5ilWBc5QFRZi5CxHJnZEFglUFwlMFVFg5fR0lblUlb5DF35AmPlp5-555vmKlXFSwN5UZNlxFGRdlkFBuUV3RTlklcVSVlVH5EloRjFLeaVkR+ZgFoZsxFlSR1ly5hV3BxVEVpVCZIlMViFVVPpNV+5rlh5KVjVJp+ZdRbVwFFlNpvFBV6RvVsZumDl-J5hQ58VsVtVw1jm3lAZf5JWUxFplGVpEZ6MP44VPJ5Fg10VYOup75E1dVU1slLmTVhS+Zyl85WJBm6lpZPOWlFZwuFBVgPctZCpjiX6cyUKAqQqIqjySA0AGYWGiyqNjAgQIcs8YcIuG8J8-aBwa8AArMTUTf2hTQAOwAAs4ct8YC4y381Nt8tN38kuCy-6DQmaUymVWcAA8jgLIC0m5g6vsrtvJosl8AACKsqArvBZyIJc2Jz6BaCfKYBQZZwhrEr9rjIYpWD9pWB4oQD87Yqjohhy0ApigFCjCk2Moq0BxTKBDeDLKpreDxreCBDRpDIC2Og+2dr0hZrRqZrpqRrtJZzAAi4oCgqS4dAi79ooBgKS4gDjLx2J3J2grJAi4QDLKS7R2x3p1J2S6goFAdDACjiLJTKdrxqe0xqh0Kjh2R0i5YAoAABeJdaKwAcAjt+ggQAtQyLaWaUy3gA90ajoAtIdYdEdYcwAyQHQtaxQNQBQ4yIA89xQmwoKaKBQmq89i9y9q969m9295dPdMKMQpgugKQiy4qM8UG8aFgU2nqQtItwq3eEAtA+yOlYQRQHOyQFcH9pA5yTA-OQDAGlZP9IukukKqGl9M2yQmNONcCYDWNSASD0AvBN9wG8aQqWc39FBt9Du99FgkuyQaDIc6ecD19-6IuhD3yIQjopA8aGmpgkuT9YAL9ot4yEAyA0w0ACD2DQqMDKuWDYQd9DDpAdSdDUGjDzDtR2KSg6wyQ-dg9w9o9Qy49k9Dd4dRQOWtDwG4jCAsjCA0DCdnNlmiyA8otEAaAfNe+6ymV+jYjRDEjwm7aFAxg6DcydxADtAKDWlYDu25j6Wiy9uWc8eTjoQhjD9pAGg+d0jEjzDPjgDwDAT5yETIDEAYDCTCAMTcTwTzGljsc1jaAXOyc48Wc5DcC4A9u8wFj-6og5T+gYcpgcyYZiy6wuQyqXOWAaAuALALTyQEQYABMBA4w7TDTIYNjWcrTwzXwSQst8tYoNM8R0tUzaA4a-QDQXTCAPTfTwgMzQzIzHMN4CzltSzit4z599G0t0ATQIa2tnIXqnTgKuzUW+z+A8jSAijyQztrt7tnt3tvt-tQygdtQwd2j7Suj2qYuUuBQZjqzDTdzRAdjz6dSLz3T7z-TEAXzPz1dtd3g9d090LYACLZjEzqtOGUAmaIY9znIjzLyFtSINjmzaA2zrzez2LuLSjfzbtjoHtXtPtftAdQdmaU9jdULXGsLpj-a0DFLAcjTNLSITQqL6cdSXwLLWzOznLwg3LvzNddd4rOjUrsr8LsrdT6W56wAmwXdcAkyaNAjzj9DRjTDCAwjq2tzUADz+aTzF62rWLurgK3zPLLtfLArQLwroLorRrkrejVgcLCLYZMQnrqr0c6L-rvTXLQbeLBrhLMbJLZL5rq2tgRgegZDaTVLAOJQ06VgI4xySbBgpbGYmTYDjTqb1bYctbHY9bxbdgZbLb5yirtLRA3rNbMoPbf2Jb9g5boDg76zHb1gdb8RMQU7ZbjTVbU6YcGLbzmbwgy7jb07bbneC7VjwqNjqb+7q7GYjTDzi9kAxTZ7pT0AVb4K6trKzrYA86VLDzpQYcp7qNT7TTYAKAYAb7XyUGNxkA5oDpV7M7WTg7z7FTm71g47l7fb17iHzT06jTdLplDbsHA7VE0zyHVgqH+H6Ho6mHYAd7-7NjZTL7oHGtH7X767FTv797-Oj79HFTIHYHmtIQNx1zlGw8kW4yMApAMwQzq29BVTh1VQ5gsTSQOTeTNWNQSnBjLjLrzDNWrHihf227Or+AOn6zxnzLGzWrHLAbRnsOCN6WBHFbOHKLx7JHS7YZ9ns7VLuHZwC7pHnIE7zGsHjn7byHtHtjne8RgXyLwX2H0ASrWzTne+EXFHPNqbUm2yuy-DQX4X6etMGecEPsMKqDbTXAQAA&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TSVersion&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;test&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import assert from 'assert';

function test() {
  const testCases = [1, 10, 150, 1000, 74839.67346];
  const HRSuffixes = Object.values(suffixes);
  const roundDecimals = 2;
  const precision = Number(`0.${'0'.repeat(roundDecimals)}5`);
  const SCIENTIFIC_NOT_NUMBER_REGXP = /[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?/g;
  const SUFFIX_REGXP = /[a-z]+$/i;
  const CONVERSION_TO_REGXP = /(?&amp;lt;=to).*(?=hr+$)|(?&amp;lt;=to).*(?=hr+$)?/i;

  for (const conversionFrom of (Object.keys(MemConv) as (keyof typeof MemConv)[])) {
    for (const tCase of testCases) {
      const convFunc = MemConv[conversionFrom](tCase);
      for (const [conversionToFn, f] of Object.entries(convFunc)) {
        const conversionTo = (conversionToFn.match(CONVERSION_TO_REGXP) || [conversionToFn])[0];
        const expectedSuffix = suffixes[conversionTo.toLowerCase() as keyof typeof suffixes];
        const multiplier = multipliers[conversionFrom][conversionToFn as keyof typeof multipliers[typeof conversionFrom]];
        const expectedResult = tCase * multiplier &amp;gt; Number.MAX_SAFE_INTEGER
            ? Number.MAX_SAFE_INTEGER
            : tCase * multiplier;

        const result = f();
        const humanReadable = f({ hr: true });
        const rounded = f({ round: roundDecimals });
        const roundedAndHumanReadable = f({ hr: true, round: roundDecimals });

        const resHrNumber = Number((humanReadable.match(SCIENTIFIC_NOT_NUMBER_REGXP) || [''])[0]);
        const resHrSuffix = (humanReadable.match(SUFFIX_REGXP) || [0])[0];
        const resRoundHrNumber = Number((roundedAndHumanReadable.match(SCIENTIFIC_NOT_NUMBER_REGXP) || [''])[0]);
        const resRoundHrSuffix = (roundedAndHumanReadable.match(SUFFIX_REGXP) || [0])[0];

        if (/hr$/i.test(conversionToFn)) {
          const resNumber = Number((humanReadable.match(SCIENTIFIC_NOT_NUMBER_REGXP) || [''])[0]);
          const resSuffix = (humanReadable.match(SUFFIX_REGXP) || [0])[0];
          assert(typeof result === 'string');
          assert(typeof resSuffix === 'string');
          assert(typeof resRoundHrNumber === 'number');
          assert(typeof rounded === 'string');
          assert(result === humanReadable);
          assert(resSuffix === expectedSuffix);
          assert(resNumber &amp;lt;= expectedResult + precision &amp;amp;&amp;amp; resNumber &amp;gt;= expectedResult - precision);
        } else {
          assert(typeof result === 'number');
          assert(result === resHrNumber);
          assert(typeof rounded === 'number');
          assert(result &amp;lt;= expectedResult + precision &amp;amp;&amp;amp; result &amp;gt;= expectedResult - precision);
        }

        console.log({
          value: tCase,
          from: conversionFrom,
          to: conversionToFn,
          result,
          humanReadable,
          rounded,
          roundedAndHumanReadable,
        });

        assert(typeof resHrSuffix === 'string');
        assert(typeof resHrNumber === 'number');
        assert(resHrSuffix === expectedSuffix);
        assert(resHrSuffix === resRoundHrSuffix);
        assert(HRSuffixes.includes(resHrSuffix));
      }
    }
  }
}
test();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;Usage&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// GB to GB humanReadable
console.log(MemConv.GB(11.1942).toGBHr()); // 11.1942GB;
// GB to MB
console.log(MemConv.GB(11.1942).toMB());// 11194.2;
// MB to MB humanReadable
console.log(MemConv.MB(11.1942).toGB({ hr: true }));// 0.011194200000000001GB;
// MB to MB humanReadable with rounding
console.log(MemConv.MB(11.1942).toGB({ hr: true, round: 3 }));// 0.011GB;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;let bytes = 1024 * 10 * 10 * 10 ;&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;console.log(getReadable File Size String(바이트))&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;1000.0이 반환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1MB가 아닌 б instead&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/10420352/&lt;a href=&quot;https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string&quot; target=&quot;_blank&quot; papago-id=&quot;84-1&quot;&gt;converting-file-size-in-bytes-to-human-readable-string&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2309</guid>
      <comments>https://prostudy.tistory.com/2309#entry2309comment</comments>
      <pubDate>Wed, 14 Sep 2022 21:41:54 +0900</pubDate>
    </item>
    <item>
      <title>python's eval() vs. ast.literal_eval() 사용</title>
      <link>https://prostudy.tistory.com/2308</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;python's eval() vs. ast.literal_eval() 사용&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 코드에 문제가 있어서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval()&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 class=&quot;papago-parent&quot;&gt;이제 나는 한 번도 사용할 필요가 없었다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval()&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;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자로부터 입력을 받고 있는 상황입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;datamap = input('Provide some data here: ')
&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;datamap&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 class=&quot;papago-parent&quot;&gt;여기저기 찾아보니&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결할 수 있을 거야&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 사용하기 전에 입력의 종류를 확인할 수 있을 것 같아서 보안상의 대책을 강구할 수 있을 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;datamap = eval(input('Provide some data here: ')
if not isinstance(datamap, dict):
    return
&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 class=&quot;papago-parent&quot;&gt;데이터가 입력되는 즉시 또는 입력된 후에 평가합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;datamap&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&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;ast&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;.literal_eval()&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;code&gt;datamap = eval(input('Provide some data here: '))&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;em papago-id=&quot;13-1&quot;&gt;안전&lt;/em&gt;하지 않다고 판단하기 전에 실제로 코드를 평가한다는 의미입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수가 호출되는 즉시 코드를 평가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html&quot; papago-id=&quot;13-3&quot; rel=&quot;noreferrer&quot;&gt;의 위험성&lt;/a&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;a href=&quot;https://docs.python.org/3/library/ast.html#ast.literal_eval&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-0&quot;&gt;&lt;code papago-id=&quot;14-0-0&quot;&gt;ast.literal_eval&lt;/code&gt;&lt;/a&gt; 입력이 유효한 Python 데이터형이 아닌 경우 예외를 발생시키므로 입력이 올바르지 않은 경우 코드가 실행되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ast.literal_eval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요할 때 언제든지.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;보통 리터럴 Python 문을 평가해서는 안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.python.org/library/ast.html#ast.literal_eval&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17-0&quot;&gt;&lt;code papago-id=&quot;17-0-0&quot;&gt;ast.literal_eval()&lt;/code&gt;&lt;/a&gt; Python 구문 중 일부만 유효하다고 간주합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;제공된 문자열 또는 노드는 문자열, 바이트, 숫자, 튜플, 목록, 딕트, 세트, 부울란 및 Python 리터럴 구조로만 구성될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;None&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;/blockquote&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;__import__('os').system('rm -rf /a-path-you-really-care-about')&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;ast.literal_eval()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에러가 발생하지만 파일은 삭제됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;ast.literal_eval()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 대로 안전하게 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;eval&lt;strong papago-id=&quot;25-0&quot;&gt;:&lt;/strong&gt; 이것은 매우 강력하지만 신뢰할 수 없는 입력에서 평가하는 문자열을 받아들이는 경우에도 매우 &lt;strong papago-id=&quot;25-0&quot;&gt;위험&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;평가 대상 문자열이 &quot;os.system('rm -rf /')&quot;이라고 가정하면 컴퓨터상의 모든 파일이 삭제됩니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ast&lt;strong papago-id=&quot;26-0&quot;&gt;.literal_eval:&lt;/strong&gt; 표현식 노드 또는 Python 리터럴 또는 컨테이너 디스플레이를 포함하는 문자열을 안전하게 &lt;strong papago-id=&quot;26-0&quot;&gt;평가&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제공된 문자열 또는 노드는 문자열, 바이트, 숫자, 튜플, 목록, 딕트, 세트, 부울란, 없음, 바이트 및 집합의 Python 리터럴 구조로만 구성될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 문::&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;eval(expression, globals=None, locals=None)
import ast
ast.literal_eval(node_or_string)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;28&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;# python 2.x - doesn't accept operators in string format
import ast
ast.literal_eval('[1, 2, 3]')  # output: [1, 2, 3]
ast.literal_eval('1+1') # output: ValueError: malformed string


# python 3.0 -3.6
import ast
ast.literal_eval(&quot;1+1&quot;) # output : 2
ast.literal_eval(&quot;{'a': 2, 'b': 3, 3:'xyz'}&quot;) # output : {'a': 2, 'b': 3, 3:'xyz'}
# type dictionary
ast.literal_eval(&quot;&quot;,{}) # output : Syntax Error required only one parameter
ast.literal_eval(&quot;__import__('os').system('rm -rf /')&quot;) # output : error

eval(&quot;__import__('os').system('rm -rf /')&quot;) 
# output : start deleting all the files on your computer.
# restricting using global and local variables
eval(&quot;__import__('os').system('rm -rf /')&quot;,{'__builtins__':{}},{})
# output : Error due to blocked imports by passing  '__builtins__':{} in global

# But still eval is not safe. we can access and break the code as given below
s = &quot;&quot;&quot;
(lambda fc=(
lambda n: [
    c for c in 
        ().__class__.__bases__[0].__subclasses__() 
        if c.__name__ == n
    ][0]
):
fc(&quot;function&quot;)(
    fc(&quot;code&quot;)(
        0,0,0,0,&quot;KABOOM&quot;,(),(),(),&quot;&quot;,&quot;&quot;,0,&quot;&quot;
    ),{}
)()
)()
&quot;&quot;&quot;
eval(s, {'__builtins__':{}})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 코드 기기 in in in in in in&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;().__class__.__bases__[0]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단지 그 자체일 뿐이다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 모든 &lt;strong papago-id=&quot;30-1&quot;&gt;서브클래스&lt;/strong&gt;를 인스턴스화했습니다.여기서 메인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;enter code here&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 n이라는 &lt;strong papago-id=&quot;31-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;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;code&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; 및 &quot;&quot; &quot; &quot; &quot; &quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;function&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이치노&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;은 '보다 낫다'와  방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CPython&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오브젝트 서브클래스에 접속하여 시스템을 접속합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;python 3.7 ast.literal_eval()부터는 엄격해졌습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;임의 숫자의 덧셈과 뺄셈은 더 이상 허용되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.python.org/3/whatsnew/3.7.html?highlight=ast%20literal_eval&quot; rel=&quot;noreferrer&quot; papago-id=&quot;36-1&quot;&gt;링크&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python은 평가에 &lt;em papago-id=&quot;37-1&quot;&gt;열심&lt;/em&gt;입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval(input(...))&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;3)가 (Python 3)에 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나중에 데이터를 어떻게 처리하든 상관없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;39-1&quot;&gt;그러므로&lt;/strong&gt;, &lt;strong papago-id=&quot;39-1&quot;&gt;이것은 안전&lt;/strong&gt;하지 않다. 특히 당신이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 입력&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ast.literal_eval&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;/p&gt; 
&lt;hr&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;__import__('os').system('rm -rf /a-path-you-really-care-about')
&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;최근의 Python3 에서는 단순한 문자열을 해석하는 것이 아니라 ast.parse() 메서드를 사용하여 AST를 작성하고 해석해야 합니다.&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;이것은 간단한 산술식을 안전하게 평가하기 위해 Python 3.6+에서 ast.parse()를 올바르게 사용하는 완전한 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import ast, operator, math
import logging

logger = logging.getLogger(__file__)

def safe_eval(s):

    def checkmath(x, *args):
        if x not in [x for x in dir(math) if not &quot;__&quot; in x]:
            raise SyntaxError(f&quot;Unknown func {x}()&quot;)
        fun = getattr(math, x)
        return fun(*args)

    binOps = {
        ast.Add: operator.add,
        ast.Sub: operator.sub,
        ast.Mult: operator.mul,
        ast.Div: operator.truediv,
        ast.Mod: operator.mod,
        ast.Pow: operator.pow,
        ast.Call: checkmath,
        ast.BinOp: ast.BinOp,
    }

    unOps = {
        ast.USub: operator.neg,
        ast.UAdd: operator.pos,
        ast.UnaryOp: ast.UnaryOp,
    }

    ops = tuple(binOps) + tuple(unOps)

    tree = ast.parse(s, mode='eval')

    def _eval(node):
        if isinstance(node, ast.Expression):
            logger.debug(&quot;Expr&quot;)
            return _eval(node.body)
        elif isinstance(node, ast.Str):
            logger.debug(&quot;Str&quot;)
            return node.s
        elif isinstance(node, ast.Num):
            logger.debug(&quot;Num&quot;)
            return node.value
        elif isinstance(node, ast.Constant):
            logger.info(&quot;Const&quot;)
            return node.value
        elif isinstance(node, ast.BinOp):
            logger.debug(&quot;BinOp&quot;)
            if isinstance(node.left, ops):
                left = _eval(node.left)
            else:
                left = node.left.value
            if isinstance(node.right, ops):
                right = _eval(node.right)
            else:
                right = node.right.value
            return binOps[type(node.op)](left, right)
        elif isinstance(node, ast.UnaryOp):
            logger.debug(&quot;UpOp&quot;)
            if isinstance(node.operand, ops):
                operand = _eval(node.operand)
            else:
                operand = node.operand.value
            return unOps[type(node.op)](operand)
        elif isinstance(node, ast.Call):
            args = [_eval(x) for x in node.args]
            r = checkmath(node.func.id, *args)
            return r
        else:
            raise SyntaxError(f&quot;Bad syntax, {type(node)}&quot;)

    return _eval(tree)


if __name__ == &quot;__main__&quot;:
    logger.setLevel(logging.DEBUG)
    ch = logging.StreamHandler()
    logger.addHandler(ch)
    assert safe_eval(&quot;1+1&quot;) == 2
    assert safe_eval(&quot;1+-5&quot;) == -4
    assert safe_eval(&quot;-1&quot;) == -1
    assert safe_eval(&quot;-+1&quot;) == -1
    assert safe_eval(&quot;(100*10)+6&quot;) == 1006
    assert safe_eval(&quot;100*(10+6)&quot;) == 1600
    assert safe_eval(&quot;2**4&quot;) == 2**4
    assert safe_eval(&quot;sqrt(16)+1&quot;) == math.sqrt(16) + 1
    assert safe_eval(&quot;1.2345 * 10&quot;) == 1.2345 * 10

    print(&quot;Tests pass&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전만  더  수 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;json.loads&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;json dicts son 、 json dicts 、 json dicts 에 son 、 json dicts 。&lt;/font&gt;&lt;/font&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;code&gt;literal_eval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&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;ast.literal_eval()&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;디버거에서 했는데,  'J IDEA'가 돌아왔어요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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 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;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;그것은 잘 작동했다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공유 코드 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import ast
sample_string = '[{&quot;id&quot;:&quot;XYZ_GTTC_TYR&quot;, &quot;name&quot;:&quot;Suction&quot;}]'
output_value = ast.literal_eval(sample_string)
print(output_value)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 버전 3.6입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/15197673/&lt;a href=&quot;https://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval&quot; target=&quot;_blank&quot; papago-id=&quot;54-1&quot;&gt;using-pythons-eval-vs-ast-literal-eval&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2308</guid>
      <comments>https://prostudy.tistory.com/2308#entry2308comment</comments>
      <pubDate>Wed, 14 Sep 2022 21:40:59 +0900</pubDate>
    </item>
    <item>
      <title>Drupal의 기본 비밀번호 암호화 방법은 무엇입니까?</title>
      <link>https://prostudy.tistory.com/2307</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Drupal의 기본 비밀번호 암호화 방법은 무엇입니까?&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;Drupal 6/7이 패스워드를 저장하기 위해 기본적으로 사용하는 보안이 무엇인지 알아보려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MD5, AES, SHA인가요?&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;Drupal 8과 Drupal 7은 기본적으로 SHA512를 소금과 함께 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패스워드의 최종 해시(&lt;a href=&quot;http://en.wikipedia.org/wiki/Key_stretching&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-3&quot;&gt;스트레칭&lt;/a&gt;이라고 불리는 보안 기술)를 생성하기 위한 계산 비용을 증가시키기 위해 PHP의 &lt;a href=&quot;http://www.php.net/manual/en/function.hash.php&quot; rel=&quot;noreferrer&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;Drupal 8에서는 구현이 객체 지향적입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해시 메서드를 정의하는 &lt;a href=&quot;http://api.drupal.org/api/drupal/core!lib!Drupal!Core!Password!PasswordInterface.php/interface/PasswordInterface/8&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;Password&lt;/a&gt; Interface가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 인터페이스의 기본 실장은 &lt;a href=&quot;https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Password!PhpassHashedPassword.php/class/PhpassHashedPassword/8&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-3&quot;&gt;PhpassHashedPassword&lt;/a&gt; 클래스에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 클래스의 &lt;a href=&quot;http://api.drupal.org/api/drupal/core!lib!Drupal!Core!Password!PhpassHashedPassword.php/function/PhpassHashedPassword::hash/8&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-5&quot;&gt;해시&lt;/a&gt; 메서드는 SHA512를 통과하는 &lt;a href=&quot;http://api.drupal.org/api/drupal/core!lib!Drupal!Core!Password!PhpassHashedPassword.php/function/PhpassHashedPassword::crypt/8&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-7&quot;&gt;암호화&lt;/a&gt; 메서드를 해시 알고리즘, 암호 및 생성된 솔트로 호출합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스의 crypt 메서드는 Drupal 7의 &lt;a href=&quot;http://api.drupal.org/api/drupal/includes!password.inc/function/_password_crypt/7&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-9&quot;&gt;_password_crypt()&lt;/a&gt; 메서드와 거의 동일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Drupal 7에서는 구현은 &lt;a href=&quot;http://api.drupal.org/api/drupal/includes--password.inc/function/user_hash_password/7&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;user_hash_password()&lt;/a&gt;와 _password_crypt&lt;a href=&quot;http://api.drupal.org/api/drupal/includes--password.inc/function/_password_crypt/7&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-3&quot;&gt;()&lt;/a&gt;의 두 가지 글로벌 함수로 분할됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Drupal 6은 소금 없이 MD5를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련된 함수는 &lt;a href=&quot;http://api.drupal.org/api/drupal/modules--user--user.module/function/user_save/6&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;user_save()&lt;/a&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;다음은 Drupal 7의 해시 예시입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;pass&quot; : &quot;$S$Dxl65&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;W9p07LfQ&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;U7jvy5CnsyDpMoLujiAgzy123khcg1&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OJi/P9PKS&quot;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자 0 ~ 2는 유형입니다($S$는 Drupal 7).&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자 3은 이 목록의 문자 위치를 기준으로 한 log2 라운드의 수(X)입니다. ' . 0123456789&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefijklmnopqrstuvxyz 예에서는 15로 매핑됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자 4-11은 SALT입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지는 2^X 라운드를 사용하는 SHA512 해시입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 base64를 사용하여 이진 결과를 문자열로 변환합니다.&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;$count = 1 &amp;lt;$count_log2;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$password = 해시 알고리즘, $password. $password, TRUE);&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;{ $syslog = hashsyslogalgo, $syslog. $password, TRUE}를 실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;} 동안 (--$count);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체 프로세스는 mydrupalsite\includes\password.inc에서 확인할 수 있습니다.&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;www\includes\password.inc에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function user_check_password($password, $account) {
  if (substr($account-&amp;gt;pass, 0, 2) == 'U$') {
    // This may be an updated password from user_update_7000(). Such hashes
    // have 'U' added as the first character and need an extra md5().
    $stored_hash = substr($account-&amp;gt;pass, 1);
    $password = md5($password);
  }
  else {
    $stored_hash = $account-&amp;gt;pass;
  }

  $type = substr($stored_hash, 0, 3);
  switch ($type) {
    case '$S$':
      // A normal Drupal 7 password using sha512.
      $hash = _password_crypt('sha512', $password, $stored_hash);
      break;
    case '$H$':
      // phpBB3 uses &quot;$H$&quot; for the same thing as &quot;$P$&quot;.
    case '$P$':
      // A phpass password generated using md5.  This is an
      // imported password or from an earlier Drupal version.
      $hash = _password_crypt('md5', $password, $stored_hash);
      break;
    default:
      return FALSE;
  }
  return ($hash &amp;amp;&amp;amp; $stored_hash == $hash);
}
&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;&quot;// Sha512를 사용한 일반 Drupal 7 비밀번호&quot;라고 명확하게 쓰여 있습니다.&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;Drupal 6 core의 경우 MD5를 사용하고 있으며, 염분은 사용하지 않는 것으로 알고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;드루팔 7에서는 좀 더 고도의 해시가 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이에 관한 좋은 기사는 &lt;a href=&quot;http://joncave.co.uk/2011/01/password-storage-in-drupal-and-wordpress/&quot; papago-id=&quot;20-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이쪽&lt;/a&gt; -&lt;a href=&quot;http://joncave.co.uk/2011/01/password-storage-in-drupal-and-wordpress/&quot; papago-id=&quot;20-1&quot; rel=&quot;nofollow noreferrer&quot;&gt; &lt;/a&gt;。&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;drupal 8은 Phpass(변경판)를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;드루팔 7은 SHA-512 + 소금을 사용합니다.&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;drupal 6과 이전 버전은 소금 없이 md5를 사용하고 있었다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 drupal.org에서 찾은 링크입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Password%21PhpassHashedPassword.php/function/PhpassHashedPassword%3A%3Acrypt/8.2.x&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Password%21PhpassHashedPassword.php/function/PhpassHashedPassword%3A%3Acrypt/8.2.x&lt;/font&gt;&lt;/a&gt; &lt;a href=&quot;https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Password%21PhpassHashedPassword.php/function/PhpassHashedPassword%3A%3Ahash/8.2.x&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Password%21PhpassHashedPassword.php/function/PhpassHashedPassword%3A%3Ahash/8.2.x&lt;/font&gt;&lt;/a&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5031662/&lt;a href=&quot;https://stackoverflow.com/questions/5031662/what-is-drupals-default-password-encryption-method&quot; target=&quot;_blank&quot; papago-id=&quot;27-1&quot;&gt;what-is-drupals-default-password-encryption-method&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2307</guid>
      <comments>https://prostudy.tistory.com/2307#entry2307comment</comments>
      <pubDate>Wed, 14 Sep 2022 21:40:13 +0900</pubDate>
    </item>
    <item>
      <title>max()를 사용하여 그룹을 사용하여 SQL을 다른 테이블로 이행합니다.</title>
      <link>https://prostudy.tistory.com/2306</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;max()를 사용하여 그룹을 사용하여 SQL을 다른 테이블로 이행합니다.&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;font class=&quot;papago-parent&quot;&gt;칼럼 데이터 '스트리트'를 집으로 옮기고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 집에는 여러 개의 문이 있습니다(같은 house_id).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 그것들을 종합해서 최신 'created_at' 레코드에서 'street' 입력을 얻어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Vxv6K.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상황.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;insert into house h ('street') 
    select street 
    from door d 
    where d.house_id = h.id 
    group by house_id 
    having max(created_at)
&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;update&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리, 값 설정&lt;/font&gt;&lt;/font&gt;&lt;code&gt;street&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;house&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 중 하나는 row-limitig 구를 사용한 관련 서브쿼리입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;update house 
set street = (
    select d.street
    from door d
    where d.house_id = house.id
    order by created_at desc
    limit 1
)
&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;limit&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구문은 데이터베이스에 따라 다르지만 (거의) 모두 동일한 기능을 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/62564361/&lt;a href=&quot;https://stackoverflow.com/questions/62564361/sql-insert-into-another-table-migration-with-group-by-having-max&quot; target=&quot;_blank&quot; papago-id=&quot;12-1&quot;&gt;sql-insert-into-another-table-migration-with-group-by-having-max&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2306</guid>
      <comments>https://prostudy.tistory.com/2306#entry2306comment</comments>
      <pubDate>Wed, 14 Sep 2022 21:35:33 +0900</pubDate>
    </item>
    <item>
      <title>JSFiddle과 JS가 같은 PHP Sandbox가 있나요?</title>
      <link>https://prostudy.tistory.com/2305</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSFiddle과 JS가 같은 PHP Sandbox가 있나요?&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; papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;1-1&quot;&gt;마감되었습니다.&lt;/b&gt; 이 질문은 충족되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/help/closed-questions&quot; papago-id=&quot;1-3&quot;&gt;스택&lt;/a&gt; 오버플로우 &lt;a href=&quot;/help/closed-questions&quot; papago-id=&quot;1-3&quot;&gt;가이드라인&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 답변을 받고 있지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; 
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;     &lt;/font&gt;&lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;hr class=&quot;my12 outline-none baw0 bb bc-powder-400&quot;&gt; 
  &lt;div class=&quot;fw-nowrap fc-black-600&quot;&gt; 
   &lt;div class=&quot;d-flex fd-column lh-md&quot;&gt; 
    &lt;div class=&quot;mb0 d-flex&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;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;2-1&quot;&gt;툴, 라이브러리&lt;/b&gt; 또는 &lt;b papago-id=&quot;2-1&quot;&gt;마음&lt;/b&gt;에 드는 &lt;b papago-id=&quot;2-1&quot;&gt;오프 사이트&lt;/b&gt; 자원을 &lt;b papago-id=&quot;2-1&quot;&gt;추천 또는 찾도록 요구&lt;/b&gt;하는 질문은 의견이나 스팸을 유도하기 때문에 스택 오버플로우에서는 주제를 벗어납니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신, &lt;a href=&quot;http://meta.stackoverflow.com/q/254394/&quot; papago-id=&quot;2-3&quot;&gt;문제&lt;/a&gt; 및 문제를 해결하기 위해 지금까지 수행된 작업을 &lt;a href=&quot;http://meta.stackoverflow.com/q/254394/&quot; papago-id=&quot;2-3&quot;&gt;설명&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;mb0 mt6 d-flex&quot;&gt; 
     &lt;p class=&quot;ml24 pl2&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;3-1&quot; title=&quot;2014-06-10 06:52:33Z&quot; papago-attr-id=&quot;1&quot;&gt;8년 전에 문&lt;/span&gt;을 닫았어요&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;ml24 pl2&quot;&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;div class=&quot;mt24 d-flex gsx gs8&quot;&gt; 
   &lt;a class=&quot;s-btn s-btn__outlined flex--item js-post-notice-edit-post&quot; href=&quot;/posts/4616159/edit&quot; papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문을 개선하다&lt;/font&gt;&lt;/a&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;JSFiddle과 JS가 같은 PHP Sandbox가 있나요?&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;만약 당신이 PHP 코드로 플레이할 온라인 사이트를 찾고 있다면, 시도해 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://phpfiddle.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://phpfiddle.org/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://ideone.com/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://ideone.com/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://codeanywhere.net/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://codeanywhere.net/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.tehplayground.com/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.tehplayground.com/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://sandbox.onlinephpfunctions.com/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://sandbox.onlinephpfunctions.com/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://codepad.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://codepad.org/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://eval.in/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://eval.in/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://implode.io/ (Laravel 프레임워크 버전을 첨부할 수 &lt;a href=&quot;https://implode.io/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-0&quot;&gt;없습니다)&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://3v4l.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://3v4l.org/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP4에서 시작하는 모든 PHP 버전에서 코드를 테스트할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 환경에 필요한 것이 있으면 &lt;a href=&quot;http://php.net/manual/en/runkit.sandbox.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18-1&quot;&gt;Runkit&lt;/a&gt; 확장 기능은 PHP 샌드박스를 제공하는 것을 목적으로 합니다.&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;Runkit_Sandbox 클래스를 인스턴스화하면 자체 범위 및 프로그램 스택을 가진 새 스레드가 생성됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨스트럭터에 전달된 일련의 옵션을 사용하여 이 환경은 프라이머리 인터프리터가 실행할 수 있는 서브셋으로 제한될 수 있으며 사용자 제공 코드를 실행하기 위한 보다 안전한 환경을 제공할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Runkit을 사용하지 않고 서버에 PHP 콘솔을 원하는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://seld.be/notes/php-console-in-your-browser&quot; rel=&quot;noreferrer&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Jordi Boggiano의 블로그 - 브라우저의 PHP 콘솔&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://github.com/seldaek/php-console&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://github.com/seldaek/php-console&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4616159/&lt;a href=&quot;https://stackoverflow.com/questions/4616159/is-there-a-php-sandbox-something-like-jsfiddle-is-to-js&quot; target=&quot;_blank&quot; papago-id=&quot;23-1&quot;&gt;is-there-a-php-sandbox-something-like-jsfiddle-is-to-js&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <author>prostudy</author>
      <guid isPermaLink="true">https://prostudy.tistory.com/2305</guid>
      <comments>https://prostudy.tistory.com/2305#entry2305comment</comments>
      <pubDate>Wed, 14 Sep 2022 21:33:55 +0900</pubDate>
    </item>
  </channel>
</rss>