<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cafebook</title>
    <link>https://cafebook.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 06:25:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>cafebook</managingEditor>
    <item>
      <title>왜 GWT 대신 jQuery를 사용해야 합니까?</title>
      <link>https://cafebook.tistory.com/570</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 GWT 대신 jQuery를 사용해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;문&lt;/b&gt; 닫았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문은&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/help/closed-questions&quot;&gt;의견&lt;/a&gt;에 입각한&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 답변을 받지 않고 있습니다.&lt;/font&gt;&lt;/div&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&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문을 개선하고 싶으십니까?&lt;/b&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/posts/1205278/edit&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;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2014-08-220 02:21:47Z&quot; papago-attr-id=&quot;1&quot;&gt;9년전&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/1205278/edit&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문을 개선합니다.&lt;/font&gt;&lt;/a&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 새로운 프로젝트를 위해 jQuery와 GWT 중에서 결정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한동안 자바스크립트로 프로그래밍을 하지 않았고, 지난 며칠 동안 GWT를 알아보고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 브라우저와 모든 브라우저에 대해 다양한 JS를 생성하는 것은 꽤 멋진 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바에서 개발하는 것은 jQuery를 사용하는 같은 것보다 더 많은 시간이 걸립니다 (적어도 이 프로젝트의 경우).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명서가 부족합니다(예를 들어, 페이지를 설계할 때 어떤 요소를 사용해야 하는지 어떻게 알 수 있습니까? -- 설명서가 충분하지 않습니다).)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 대부분의 프로젝트에 jQuery를 사용해왔는데 꽤 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 고객에게 jQuery가 이 프로젝트에 더 적합하다고 설득하고 싶고 이를 뒷받침할 더 많은 주장이 필요합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제이쿼리로 가겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 GWT 프로젝트를 유지하다가 결국 두 번이나 다시 써야 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리팩터된 GWT 앱으로 첫번째, JQuery에서 두번째.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오랫동안 자바스크립트를 심각하게 만지지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막은 2002년쯤입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 자바 개발자라서 GWT에 대한 첫인상이 좋았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 그것은 단지 인상에 불과했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT에서 발견한 문제점:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클라이언트/서버 구조를 따르도록 강요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결국 제가 원하는 것은 AJAX와 좋은 위젯입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT의 위젯 자체가 그렇게 보기 좋게 보이지는 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 미적으로 Adobe Flex를 선호합니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 비교를 좀 더 가까이 하기 위해, JQuery의 UI는 GWT보다 더 좋아 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 JQuery에서 제공하는 멋진 테마 롤러 지원도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DWR 해봤어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;훌륭해.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT보다 DWR을 사용하여 자바 코드에서 AJAX를 활성화하는 것이 훨씬 쉽습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT를 사용한다면 결국 자바스크립트를 배울 수 밖에 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SpringSource의 Arjen은 XML과 SOAP에 대해 다음과 같이 말한 적이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;어떻게 웹 서비스를 개발하면서 XML을 모르십니까? SOAP는 XML입니다. 피할 수 없습니다.&quot;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT도 마찬가지입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결국은 자바스크립트로 끝납니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현실적으로 자바스크립트는 자바에 비해 그리 어렵지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바보다 자바스크립트를 아는 사람이 더 많습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;웹 디자이너들도 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 프로그래머인데 자바스크립트가 무섭다고요?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 다시 쓴 프로젝트로 돌아가죠.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 GWT 신청서를 다시 작성했을 때, 다시 작성하는 데 거의 두 달이 걸렸습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery를 사용하면 2주가 걸렸고, 자바스크립트에 녹슬었습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery를 사용하면 하드코드 자바스크립트를 작성할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 원래 JQuery를 쓰는 거예요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT로 코드를 유지하는 것은 끔찍합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드에서 최근에 한 변화를 보고 싶으십니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집하러...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT를 기다립니다... 5분...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헹구다...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반복해서 실수가 없기를 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 다시 컴파일하고 5분 정도 더 기다려야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헹구고 반복합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery(JQuery)로 줄을 바꾸어 브라우저를 새로 고칩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다 했어요.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 여기서 객관적이지 않다는 것을 알지만, 나는 단지 내 경험을 공유할 뿐입니다 :) 도덕은 자바스크립트를 두려워하지 않는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글은 어쨌든 자바스크립트를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 자바스크립트를 이해하지 못하지만 (아마도) 자바에 더 편한 사람들이 있는 팀에 GWT를 사용할 것을 제안합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT를 사용하면 호환성 테스트에서 몇 주가 아니더라도 며칠을 절약할 수 있으며, 이 언어를 처음 접하는 사람들이 부딪치는 많은 &lt;a href=&quot;https://stackoverflow.com/questions/2749952/what-are-the-top-javascript-pitfalls&quot;&gt;일반적인 자바스크립트 함정&lt;/a&gt;을 피할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 &lt;a href=&quot;http://code.google.com/webtoolkit/doc/latest/DevGuideClientBundle.html#Image_Sprites&quot; rel=&quot;nofollow noreferrer&quot;&gt;CSS 스프라이트&lt;/a&gt;, 임베디드 &lt;a href=&quot;http://google-web-toolkit.googlecode.com/svn/javadoc/latest/index.html?com/google/gwt/resources/client/ClientBundle.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;데이터&lt;/a&gt; 등을 &lt;a href=&quot;http://code.google.com/webtoolkit/doc/latest/DevGuide.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;위한&lt;/a&gt; 뛰어난 패키징 기능도 갖추고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 &lt;strong&gt;당신&lt;/strong&gt;이 자바스크립트를 &lt;strong&gt;알고 이해한다면,&lt;/strong&gt; 나는 &lt;strong&gt;당신&lt;/strong&gt;이 선택한 라이브러리가 무엇이든 &lt;strong&gt;자바스크립트를 사용할 것&lt;/strong&gt;입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT에서 생성된 코드를 자세히 확인해 본 적은 없지만 구글 I/O에서 몇 가지 예를 보았는데, 모든 것이 사탕과 반짝임처럼 보이지만, 당신은 기존 방식대로 더 우아한 자바스크립트 코드를 만들 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그룹이 Java에 가장 익숙하고 클라이언트 측 기능을 상당량 수행할 계획이라면 최소한 GWT를 평가해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;타입 세이프티, 이클립스 디버깅, 서버측/클라이언트측 간의 공유 코드 등은 자바 개발팀이 편안하게 느낄 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 팀이 jQuery나 다른 자바스크립트 라이브러리로 자바스크립트 프로그래밍에 익숙하다면 순수 자바스크립트인 기술을 고수하는 것이 더 쉬울 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 대부분의 자바스크립트 개발자들에게 생소한 페이지의 큰 부분을 넘겨받는 방식을 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지를 넘겨받으면 일반적인 GWT 코드는 페이지의 기존 요소에 기능을 추가하는 대신 자체 DOM 요소를 만드는 것을 좋아합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 많은 GWT 앱에 &quot;로딩&quot;이 있는 이유입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&quot; 페이지가 처음 로드될 때 화면을 표시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 필요하지 않지만 GWT 개발의 가장 일반적인 스타일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT에서 생성된 코드가 나온다는 사실은 대부분의 GWT 개발자들에게 관련성이 적습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT를 사용하면 자바를 일반 자바 *.class 파일과 동등한 파일로 컴파일할 수 있지만 웹 브라우저가 해석 방법을 이해하는 자바스크립트 구문으로 컴파일할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 템플릿 기반 코드 생성기보다는 컴파일러와 더 유사합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;생성된 코드를 검사해야 하는 경우가 있지만 대부분의 경우 디버깅은 Java 디버거를 통해 Java로 진행됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또 하나 생각해야 할 것은 당신이 선택하는 클라이언트 측 기술에 관계없이, 당신의 개발팀은 HTML, 자바스크립트, CSS 및 브라우저 프로그래밍을 전반적으로 숙지해야 한다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT를 사용하면 익숙한 Java 환경에서 클라이언트 측 코드를 작성할 수 있지만 브라우저 내에서 작업한다는 사실을 숨기지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우선 GWT와 jQuery를 비교하는 것은 별로 의미가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery는 DOM과 함께 작동하는 크로스 브라우저를 훨씬 쉽게 만들기 위해 만들어졌지만, GWT는 대형 웹 애플리케이션을 만들기 위해 만들어졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 일정관리, 슬라이더 등 독립적인 위젯을 가진 정적인 면이 많이 있다면 jQuery로도 충분합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 단일 페이지 앱을 만들고 싶다면, 아마도 대규모 팀과 함께라면, GWT가 더 나은 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 후드 아래에 많은 잘 설계된 아키텍처를 가지고 있으며, 특히 MVP 패턴의 빌드, UI-Binder 템플릿 시스템, i18n 지원 등이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 자바스크립트 개발자가 대형 GWT 앱에서 1년 이상 작업을 하고 있기 때문에 jquery로만 한 페이지 앱을 만들지 않는 것을 추천합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트를 사용하고 싶다면 등뼈, 척추, 녹아웃 또는 도조를 살펴보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그건 그렇고, GWT 아키텍처가 잘 구축되어 있기 때문에 자바 오버헤드가 많이 발생할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 프로젝트가 증가하면 css와 i18n 속성을 컴파일하는 시간이 성가시게 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;코스용 말&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트에 가장 적합한 것을 고르십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고려해야 할 몇 가지 사항&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;타임스케일이 빠듯하고 서로에게 더 친숙함&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 개발자가 선택한 도구를 사용할 수 있도록 속도와 유지보수성을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 사람이 다른 사람보다 더 유행하는 것은 여기에도 영향을 미칠 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플러그인, 유틸리티 기능 등 프로젝트에서 이미 사용할 수 있는 코드를 가지고 있어야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트가 무엇에 관한 것인지, 귀하의 경험이 무엇인지, 고객이 다양한 기술/프레임워크를 사용할 수 있도록 얼마나 개방적인지에 대한 구체적인 정보가 없다면 여기에는 결정적인 답이 없을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 여기서 시작한 것처럼 서로에 대한 설득력 있는 주장의 목록을 작성한 다음 프로젝트에 대해 관련된 다른 사람들과 논의하여 결론을 내가 여기서 시작한 것처럼 말이죠.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;답은 쉽지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;답은 &quot;다름&quot;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바를 알고 좋아한다면,&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 서버 코드 또한 자바로 작성되어 있다면, 자바로 클라이언트 코드를 작성하는 것은 클라이언트와 서버에서 같은 코드를 사용하는 것을 가능하게 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;강한 유형의 언어가 제공하는 것을 좋아한다면: 컴파일 타임 유형 검사, 자동 리팩토링, 자동 코드 생성(Eclipse의 Ctrl+1), 코드 완료(Ctrl+Space)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성요소 지향 프로그래밍을 좋아하는 경우(예: MenuBar가 메뉴를 만듭니다)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT의 복잡성(jQuery와 비교)이 당신에게 문제가 되지 않는다면&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 큰 코드 생성이 당신에게 문제가 되지 않는다면.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트를 알고 좋아한다면&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클라이언트와 서버(예: 클라이언트 - JS, 서버 - Java 또는 PHP)에서 동일한 코드를 사용할 필요가 없습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일 타임 타입 검사, 자동 리팩토링 등이 필요 없는 경우&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성 요소 지향 프로그래밍이 필요하지 않다면(jQuery에서 복잡한 구성 요소를 만들려면 일련의 div를 생성하고 $($there div)를 호출해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;make XXXXControl()()&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;심플함을 좋아한다면 (jQuery는 GWT보다 심플함)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아주 작은 코드가 필요한 경우(예: 웹사이트 로딩을 더 빠르게 하기 위해)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개인적으로 대부분의 프로젝트에 GWT를 추천하고 싶지만, jQuery도 전문성이 있고 어떤 사람들은 jQuery를 선호할지도 모릅니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 러스 캠의 의견에 동의합니다. 그것은 당신의 팀이 무엇을 잘 알고 있느냐에 달려있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 개인 비즈니스 앱을 위한 작업을 할 때 GWT를 훨씬 선호합니다. jquery를 사용해도 javascript는 성가신 객체 지향 구문을 가지고 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UI 코드가 10,000줄인 앱이 있다면, jquery는 재사용성이 떨어지는 코드를 유지하기 어려운 엉망진창으로 만들 것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery에서 진행되는 대규모 프로젝트를 아는 사람이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과 파일 크기에서 마지막 바이트를 모두 짜내려고 한다면 라이브러리를 사용하지 말고 처음부터 자바스크립트를 작성하세요(즉, 구글 홈페이지 페이드 효과).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;javascript/jquery 대 gwt 관련하여 생각해 볼 것.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적인 객체 지향 원리와 디자인 패턴을 사용한다면 gwt로 더 나은 성능의 코드를 얻을 수 있을 것입니다. 왜죠?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다형성의 예를 들어보겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트에서 중다형성을 사용하는 앱을 작성하면 유지보수성과 코드 재사용의 이점을 얻을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 당신의 코드는 다형성을 사용하는 것과 같은 성능도 갖게 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 gwt를 사용했다면 이것이 제공하는 유지보수성과 코드 재사용의 이점도 얻을 수 있을 것이지만 gwt 컴파일러는 다형성을 구체적인 클래스 사용으로 최적화하여 성능을 향상시킬 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 GWT가 너무 추상적이라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트는 사실 강력한 언어입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;객체 지향 코드를 작성하고 네임스페이스를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery와 같은 라이브러리를 사용하면 대부분의 작업에서 브라우저 호환성 문제에 대해 걱정할 필요가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이어버그와 같은 모든 주요 브라우저에서 사용할 수 있는 모든 훌륭한 브라우저 개발자 도구가 있기 때문에 자바스크립트로 작업하는 것은 매우 쉽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;javascript 오류가 발생하면 코드에서 발생한 위치를 쉽게 파악할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(GWT와 달리) 제가 작성한 코드에 대해 작업하기 때문에 변수를 보고 모든 것을 자세히 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT 대 네이티브 자바스크립트 솔루션(jQuery 또는 기타)의 주요 문제는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최종 제품과 구분되는 추가 프로세스가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바에서 앱을 개발하고 자바 코드를 디버그하면 이 코드의 기계 번역 버전이 나옵니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;적당한 크기의 앱이라면 브라우저에서 실행 중인 실제 코드를 디버깅할 필요가 없을 것이라고는 상상할 수 없습니다. 코드가 아니기 때문에 골치 아플 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바로 코드를 쓰기 때문에 자바 라이브러리를 사용하는 것이 제한됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마음에 드는 JS 라이브러리를 찾는다면 GWT 프로젝트에 추가하기가 매우 어려울 것입니다. 자바 래퍼를 작성해야 할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네이티브 JS를 개발 중이라면 프로젝트에 추가하면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS는 자바와는 다른 견고한 객체 모델을 가진 그 자체로 멋진 언어입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 HP webOS용 네이티브 JS에서 몇 가지 앱을 개발했는데 언어에 대해 가지고 있던 많은 선입견이 사실이 아니라는 것을 알고 놀랐습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS에서 깨끗하고 효율적이며 유지보수 가능한 코드를 Java에서 최대한 작성할 수 있으며, JS 객체 모델을 이해하는 데 시간을 들인다면 JS 위에서 Java 및 C++와 같은 보다 일반적인 클래스/객체 모델을 모방하기 위해 지원 라이브러리를 사용할 필요도 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트의 프로토타입은 꽤 멋집니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모바일 플랫폼에 앱을 출시하는 것을 고려해 볼 수 있다면, 기본 JS 앱은 추가적인 노력 없이 전화 갭 안에 쉽게 감겨 여러 모바일 플랫폼에 액세스할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폰갭을 위한 GWT 포장지도 있지만, 첫 번째 항목으로 돌아가서 실제 작업을 선택할 수 있다면 왜 번역/에뮬레이션이 필요한 솔루션을 선택해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행운을 빌어요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JSNI에 대해 아무도 말하지 않은 좋은 팁들! 원한다면 자바스크립트를 사용할 수 있는 GWT의 기능입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery = 낮은 수준의 이해&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적인 자바스크립트와 다른 하나는 자바 설명 외에도 Jquery는 자바스크립트와 일대일 매핑이 더 가깝고 GWT는 추상화되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 낮은 수준(자바스크립트)에서 코드에 무슨 일이 일어나고 있는지 더 깊이 이해하고 싶다면 jquery가 올바른 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT = 추상화 이해 = 기능보증&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 컴파일러가 생성한 코드의 장점을 제공하므로 웹사이트가 정상적으로 작동하는 것을 더 보장할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 여느 대규모 API와 마찬가지로 이 클래스가 무엇을 하는지, 해당 클래스가 무엇을 하는지, 이 API와 호환되는지 여부를 이해하는 시간이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;낮은 수준의 이해가 더 유용할 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개인적으로 저는 낮은 수준의 코딩을 함으로써 훨씬 더 많은 만족감을 얻습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 완벽하게 작동하는 순수 자바스크립트로 작업 중인 웹 애플리케이션을 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스에서 데이터를 가져온 자바스크립트 코드를 작성하여 마이크로소프트 워드 연구 보고서를 완성했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 프로젝트의 복잡성은 자바스크립트의 낮은 수준의 파악을 요구했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바 기반 솔루션으로 쉽게 해결할 수 있었는지 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 관리자를 안심시키지만 비용이 많이 듭니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 대기업들은 java와 asp.net 을 선호합니다. 즉, Oracle과 Microsoft와 같은 더 큰 기술 지원을 선호하기 때문입니다. 또한 최첨단 관리자들은 지원 비용으로 x달러를 지불하기만 하면 A 문제를 해결할 수 있다는 것을 알고 있는 밤에 더 나은 수면을 취하는 경향이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 시스템을 채택한 후 곧 기술 지원 비용이 너무 많이 들고 더 나은 개발자에게 더 많은 비용을 지불하는 것이 더 저렴하다는 사실을 깨닫기 시작합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러므로 자바나 .net 커리어는 보통 식탁에 음식을 올려놓습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유지보수성&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 GWT와 같은 API는 유지보수가 더 쉽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트 코드를 디버그해야 할 경우 누군가가 겪게 될 공포만 상상할 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 그것은 제가 더 나은 그리고 더 깨끗한 프로그래머가 되기 전이었고 코드의 모든 측면을 알고 있었기 때문에 b/c를 디버깅할 것이 전혀 문제가 되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;낮은 수준의 코딩은 무슨 일이 일어나고 있는지 거의 100% 이해할 수 있지만, API를 사용하면 구글에서 버그 탐지 게임을 하고 StackOverflow와 같은 사이트에 질문을 게시하는 데 시간을 소비합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 관리자들은 대부분의 컴퓨터가 프로그래머가 아니라는 것을 이해하지 못합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GWT는 컴파일러(Java to JavaScript)이고 jQuery는 프레임워크입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둘 중에 하나를 선택할 필요는 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둘 중 하나를 사용해도 되고 둘 중 하나를 사용하지 않아도 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 당신이 원하거나 기존 소스 코드를 가지고 있다면 자바로 코딩을 할 수 있고, 다른 것에는 jQuery를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용 가능한 래퍼가 있지만, GWT는 자바스크립트를 호출할 수 있습니다(그리고 그 반대도 마찬가지입니다). http://svenbuschbeck.net/wordpress/2012/06/how-to-use-jquery-in-gwt/ 을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 개인적인 의견은 jQuery일 것입니다. 하지만 저는 자바를 사용하지 않고 jQuery 플러그인을 사용하는 것을 정말 좋아하기 때문입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;활발한 사용자 그룹과 최근의 인기는 jQuery가 우승자임을 분명히 나타냅니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/1205278/why-should-i-use-jquery-instead-of-gwt&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/570</guid>
      <comments>https://cafebook.tistory.com/570#entry570comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:19:19 +0900</pubDate>
    </item>
    <item>
      <title>스프링 싱글톤 콩은 실 안전한가요?</title>
      <link>https://cafebook.tistory.com/569</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 싱글톤 콩은 실 안전한가요?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 싱글톤 원두가 실 안전한지, 만약 그렇다면, 왜, 아니면 왜?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 봄이 초보라서 도움을 주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니요. 두 개념은 연관성도 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글턴은 &lt;strong&gt;창조&lt;/strong&gt;에 관한 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 설계 패턴을 사용하면 클래스의 인스턴스 하나만 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스레드 안전은 &lt;strong&gt;실행&lt;/strong&gt;에 관한 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Thread_safety&quot;&gt;위키백과&lt;/a&gt; 인용하기:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 조각은 여러 스레드에 의해 동시에 안전하게 실행되도록 보장하는 방식으로 공유 데이터 구조만 조작하는 경우 스레드 안전합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결국 스레드 안전은 코드와 코드에만 의존합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 이것이 봄콩이 실로 안전하지 않은 이유입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 다른 인식을 가지고 있습니다: 봄 싱글톤 콩은 한 번만 만들어지고 어느 시점에서나 한 번만 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비동기화 방식으로 수정된 인스턴스 변수가 있다고 가정해 보겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다중 스레드 환경에서는 모든 스레드에 동일한 클래스 인스턴스가 할당되고 2개의 동시 스레드가 인스턴스 변수를 업데이트/변경할 수 있으므로 예기치 않은 상황이 발생할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤 콩은 실 안전성을 제공하지 않으며 인스턴스 변수 사용이 예상치 못한 결과를 초래할 수 있음을 알고 있으므로 동일한 문제를 해결할 수 있는 두 가지 옵션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다중 스레드 환경에서는 인스턴스 변수를 사용하지 마십시오. 또는&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인스턴스 변수를 수정할 때마다 메서드에 동기화된 블록/키워드를 사용하여 예기치 않은 결과를 방지합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링은 싱글톤 콩의 라이프 사이클을 관리하고 개체의 단일 인스턴스를 유지합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나사산 안전은 아무 상관이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않다면 왜죠?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤과 실 안전성은 서로 다른 개념이기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동기화된 키워드로 스레드 안전을 도모할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 싱글톤 콩은 스프링이 그것들을 인스턴스화한다고 해서 실 안전하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미안하다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤 빈스는 실 안전 여부는 싱글톤의 범위가 되는 클래스가 어떻게 쓰이는지에 따라 달라집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 호출 스레드는 고유한 실행을 가지며 모든 호출 스레드가 공유하는 싱글톤 범위 클래스에 일부 코드가 있지 않는 한 다른 스레드의 실행을 방해하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;g 클래스가 메서드에 의해 액세스되는 변수를 전역적으로 선언하고 값이 수정된 경우 동시성 문제가 발생할 수 있으므로 클래스 수준이 아닌 메서드 수준에 해당 변수를 두는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 싱글톤 빈 정의 단일 인스턴스는 스프링 IOC 컨테이너에서 BeanAwareFactory에 의해 생성됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 여러 스레드에서 동일한 빈을 사용하려고 하면 동시 액세스로 인해 스레드 안전이 되지 않아 예기치 않은 동작이 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Singleton은 IOC 컨테이너에 개체 인스턴스를 만드는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 여러 스레드를 실행할 때는 런타임 동작에 대한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 동일한 객체의 값은 여러 개의 스레드에 접근할 때 제한이 없기 때문에 두 스레드 모두에서 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니요, 스프링 싱글톤 콩은 실 안전하지 않습니다. 여기 예가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class Emmloyee {

private int id;

private String name;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 여기.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;applicationContext.xml&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &amp;lt;bean id=&quot;emp&quot; class=&quot;com.manikant.Emmloyee&quot; p:id=&quot;26&quot;  p:name=&quot;Manikant Gautam&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 여기 시험수업이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   public class Test {

public static void main(String[] args) {

    ApplicationContext ctx=new ClassPathXmlApplicationContext(&quot;com/manikant/config.xml&quot;);
    Emmloyee emp=(Emmloyee)ctx.getBean(&quot;emp&quot;);
    System.out.println(&quot;User &quot;+emp.getName() + &quot; is of age &quot;+emp.getId());
    emp.setName(&quot;Changed value&quot;);

    Emmloyee emp1=(Emmloyee)ctx.getBean(&quot;emp&quot;);
    System.out.println(&quot;User &quot;+emp1.getName() + &quot; is of age &quot;+emp1.getId());


}

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;      User Manikant Gautam is of age 26

      User Changed name is of age 26
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변화를 보다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;value&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;타고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;emp.setName(&quot;Changed value&quot;);&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;딴 생각을 하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bean emp1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 견해에 따르면 싱글톤 클래스의 안전성은 전적으로 싱글톤 클래스의 설계/작성 여부에 달려있다고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤 클래스에 정의된 전역 변수가 있으면 여러 스레드가 싱글톤 개체를 공유하고 전역 변수를 업데이트할 수 있는 메서드를 실행하면 스레드가 안전하지 않기 때문에 스레드가 안전하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤 클래스 스레드를 안전하게 만들려면 해당 클래스를 상태 비저장 상태로 만드는 것이 싱글톤 클래스에서 전역 변수를 정의하는 것을 피해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;봄이 실을 안전하게 해주는 것은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그건 당신의 책임입니다. 스프링은 싱글턴을 만들겠지만, 만약 그것이 변형된다면, 그것은 안전하지 않을 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 콩 클래스가 스레드 세이프가 되어야 하는 방식으로 관리하는 것은 프로그래머의 책임입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;봄에는 싱글톤 콩에 상태가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤 빈 스코프는 BeanFactory당 단일 인스턴스를 보장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 다중 스레드 환경에서는 단일 톤 빈 스코프로도 단일 인스턴스를 보장할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 이를 해결하기 위해서는 개발자가 스레드 안전성을 확보해야 하는 책임이 있기 때문에 Bean 스코프를 &lt;strong&gt;싱글톤&lt;/strong&gt; 스코프에서 &lt;strong&gt;프로토타입&lt;/strong&gt; 스코프로 변경해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;병렬 처리를 사용하여 업스트림에서 서비스를 호출했는데 애플리케이션이 다운되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스레드 1이 bean A를 작업하는 동안 다른 요청이 들어왔고 bean A의 몇 가지 파라미터를 설정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 bean A가 데이터베이스에 저장되었을 때, 나는 그것이 완전히 엉망임을 확인했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시제품으로 고쳤습니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않다면 왜죠?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글톤에서 thread이 아닌 안전한 물체에 대한 참조를 가질 수 있기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 그렇지 않은 경우 스프링을 사용하여 인스턴스 변수를 주입하면 예, 스레드 안전합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/17342850/are-spring-singleton-beans-thread-safe&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/569</guid>
      <comments>https://cafebook.tistory.com/569#entry569comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:19:10 +0900</pubDate>
    </item>
    <item>
      <title>setFrame과 autolayout을 같은 뷰에서 사용할 수 있습니까?</title>
      <link>https://cafebook.tistory.com/568</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;setFrame과 autolayout을 같은 뷰에서 사용할 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 모든 버튼에 패딩을 추가하고 싶어서 UI버튼을 서브클래스했고, 다른 변경사항 중 setFrame 방법을 사용하여 고정패딩을 추가하고 싶었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;setFrame을 제외하고는 모두 작동했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확인해보니 해당 뷰에서 &quot;자동 레이아웃 사용&quot;을 선택 해제하면 setFrame을 사용할 수 있고, 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 해결할 방법이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 자동 레이아웃을 꼭 사용하고 싶습니다. 왜냐하면 그것은 아이폰 5와 이전의 기기에서 앱을 멋지게 보이게 하는데 도움을 주기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저는 또한 제 서브클래스에서 setFrame을 사용하여 제 삶을 좀 더 편하게 하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요약하자면, 제 질문은 자동 레이아웃을 사용하고 UIView의 프레임을 프로그래밍 방식으로 조정할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보기를 설정하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translatesAutoresizingMaskIntoConstraints = YES&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 에 전화를 걸었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setFrame:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 시 뷰의 현재 상태를 기준으로 레이아웃 제약 조건으로 자동 변환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;autoresizingMask&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이를 통해 프레임 기반 레이아웃과 제약 조건 기반 레이아웃을 혼합할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 자동 레이아웃을 사용하여 보기의 모든 하위 보기의 레이아웃을 정의할 수 있지만, 여전히 호출할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setFrame:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뷰 자체의 크기와 위치를 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러분의 관점에서, 여러분은 자동 레이아웃과 직접 프레임 조작을 혼합하여 레이아웃을 하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이 시스템은 실제로 모든 것을 처리하기 위해 제약 조건을 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 사용에 대한 한 가지 큰 주의 사항이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translatesAutoresizingMaskIntoConstraints&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;이렇게&lt;/em&gt; 하면 이러한 자동 제약 &lt;em&gt;조건이 나머지 제약&lt;/em&gt; 조건을 &lt;em&gt;만족&lt;/em&gt;할 수 &lt;em&gt;있는지 확인해야 합니다&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 뷰의 크기와 위치를 결정하는 제약 조건이 이미 있다고 가정하고, 또한 &lt;em&gt;다음&lt;/em&gt;과 같이 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translatesAutoresizingMaskIntoConstraints = YES&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하고 전화를 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setFrame:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 로의 통화.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setFrame:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 뷰에 새로운 제약 조건을 생성하여 이미 존재하는 제약 조건과 충돌할 가능성이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(실제로 이러한 오류는 자주 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상충되는 제약 조건에 대해 불평하는 로그 메시지를 본 적이 있다면, 그러한 제약 조건 중 하나는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSAutoresizingMaskLayoutConstraint&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그러면 지금 보시는 것은 자동 구속 장치와의 충돌입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 쉬운 실수입니다. 왜냐하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translatesAutoresizingMaskIntoConstraints = YES&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 기본값이므로 코드에서 제약 조건을 구성하는 경우 이러한 자동 제약 조건을 원하지 않을 경우 끌 것을 기억해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반대로 뷰의 크기와 위치를 결정하는 기존의 제약 조건이 이미 존재하지만 다음을 설정한다고 다시 가정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translatesAutoresizingMaskIntoConstraints = NO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화 드리기 전에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setFrame:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이 경우, 당신의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setFrame:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출은 새로운 제약 조건을 생성하지 않으므로 &lt;em&gt;별도의 제약&lt;/em&gt; 조건 &lt;em&gt;간&lt;/em&gt;에 충돌이 발생하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이 경우 제약 &lt;em&gt;조건과 설정한 프레임 &lt;/em&gt;값&lt;em&gt; 사이&lt;/em&gt;에는 &quot;충돌&quot;이 여전히 존재합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 번에 Auto Layout(자동 레이아웃)을 호출할 때 뷰에 이미 존재하는 제약 조건을 보고 이 제약 조건에 필요한 프레임 값을 계산한 다음 프레임 자체를 필요한 값으로 설정하여 수동으로 설정한 값을 흐리게 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 Apple의 &lt;a href=&quot;https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Introduction/Introduction.html&quot;&gt;Cocoa Auto Layout Guide&lt;/a&gt;에서 &quot;Attopting Auto Layout&quot; 섹션을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저에게 가장 쉬운 일은 이동/크기 조정을 원하는 뷰를 수퍼뷰에서 제거하고 설정하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;frame&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다시 추가합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 사용자 정의를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UILabel&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일순간에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UITableViewCell&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 클래스:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저에게 효과가 있었던 것은 단순히 하나를 추가하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IBOutlet&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뷰 컨트롤러에 대한 제약 조건에 대해 다음으로 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;constant&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘센트에 있는 재산&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 뷰의 x 원점을 변경하려면 해당 뷰의 선행 제약 조건에서 컨트롤러로 출구를 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 콘센트를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@IBOutlet var labelXOrigin: NSLayoutConstraint!&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그러면 x 위치를 조정하고 싶을 때는 그냥 다음과 같이 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;self.labelXOrigin.constant = 20.0 // Or whatever origin you want to set.
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서브뷰 프레임을 설정하는 가장 좋은 방법은 자동 레이아웃 프로젝트에서 viewWillLayoutSubviews 메서드입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;set 속성을 번역합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MaskIntoContracts = true 크기 조정 보기가 나타난 직후에 보기가 나타나거나 버튼을 눌러 설정한 후에 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱이 여러 장치 방향을 지원하지 않는 경우.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;ViewDidLoad&lt;/strong&gt;에서 크기를 조정할 뷰 프레임을 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [aView setFrame:CGRectMake(15, 15, 100, 100)];
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;보기DidLayoutSubviews&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-(void)viewDidLayoutSubviews
{
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확실하지는 않지만 이 솔루션을 사용할 경우 한 방향을 다른 방향으로 전환하면 문제가 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/13186908/can-i-use-setframe-and-autolayout-on-the-same-view&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/568</guid>
      <comments>https://cafebook.tistory.com/568#entry568comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:19:03 +0900</pubDate>
    </item>
    <item>
      <title>반지름 d서비스:컨트롤 프로세스가 종료됨, 코드= exited 상태= 1</title>
      <link>https://cafebook.tistory.com/567</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반지름 d&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨트롤 프로세스가 종료됨, 코드= exited 상태= 1&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 리눅스와 프리라디우스를 처음 접해서 제 일을 위해 이것에 대해 배우고 싶지만, 몇 가지 어려움이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 센토스 8에 프리라디우스를 설치했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치해보니 잘 작동이 되었는데 mariaDB 설치 후 서비스를 시작할 때 문제가 발생하였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[root@FPM-FreeRad01 ~]# systemctl start radiusd.service
Job for radiusd.service failed because the control process exited with error code.
See &quot;systemctl status radiusd.service&quot; and &quot;journalctl -xe&quot; for details.



[root@FPM-FreeRad01 ~]# systemctl status radiusd.service
â radiusd.service - FreeRADIUS high performance RADIUS server.
   Loaded: loaded (/usr/lib/systemd/system/radiusd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2022-06-23 09:13:53 PST; 9s ago
  Process: 2900 ExecStart=/usr/sbin/radiusd -d /etc/raddb (code=exited, status=1/FAILURE)
  Process: 2897 ExecStartPre=/usr/sbin/radiusd -C (code=exited, status=0/SUCCESS)
  Process: 2891 ExecStartPre=/bin/sh /etc/raddb/certs/bootstrap (code=exited, status=0/SUCCESS)
  Process: 2889 ExecStartPre=/bin/chown -R radiusd.radiusd /var/run/radiusd (code=exited, status=0/SUCCESS)
 Main PID: 1789 (code=exited, status=0/SUCCESS)

Jun 23 09:13:53 FPM-FreeRad01.int.ahinet.ph systemd[1]: Starting FreeRADIUS high performance RADIUS server....
Jun 23 09:13:53 FPM-FreeRad01.int.ahinet.ph systemd[1]: radiusd.service: Control process exited, code=exited status=1
Jun 23 09:13:53 FPM-FreeRad01.int.ahinet.ph systemd[1]: radiusd.service: Failed with result 'exit-code'.
Jun 23 09:13:53 FPM-FreeRad01.int.ahinet.ph systemd[1]: Failed to start FreeRADIUS high performance RADIUS server..

&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어제부터 이 문제를 해결하고 있는데 관련된 다른 문제를 찾아봤지만 답을 찾을 수가 없어서 여기에 도움을 요청하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/72723576/radiusd-service-control-process-exited-code-exited-status-1&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/567</guid>
      <comments>https://cafebook.tistory.com/567#entry567comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:57 +0900</pubDate>
    </item>
    <item>
      <title>'RTLD_NEXT' 미신고</title>
      <link>https://cafebook.tistory.com/566</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'RTLD_NEXT' 미신고&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로그램을 컴파일하려고 하는데 'RTLD_NEXT'라는 오류가 선언되지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 c 프로그램이 포함된 dlfcn.h에 정의되어야 할 것 같은데, 내가 dlfcn.h 내부를 살펴보니 RTLD_NEXT가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이거 어떻게 고쳐요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 문제가 되는 것은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RTLD_NEXT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.opengroup.org/onlinepubs/009695399/functions/dlopen.html&quot; rel=&quot;noreferrer&quot;&gt;posix 표준&lt;/a&gt;에 의해 정의되지 않습니다. 그래서 GNU 사람들은 당신이 아니면 그것을 활성화하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define _GNU_SOURCE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-D_GNU_SOURCE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;POSIX의 다른 관련 부품으로는 &lt;a href=&quot;http://www.opengroup.org/onlinepubs/009695399/basedefs/dlfcn.h.html&quot; rel=&quot;noreferrer&quot;&gt;dlfcn.h&lt;/a&gt;와 &lt;a href=&quot;http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html#tag_03_112_07&quot; rel=&quot;noreferrer&quot;&gt;dlsym.h&lt;/a&gt;가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;흥미롭게도, 나중에 언급되는 것들은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RTLD_NEXT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. GNU 사람들은 확장이 무엇이고 무엇이 아닌지에 대해 약간 혼란스러워 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 따르면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;man dlsym&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define _GNU_SOURCE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(단 하나의 선행 언더스코어만 &lt;em&gt;해당&lt;/em&gt;)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dlfcn.h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포함됩니다(RHEL6.1).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define __GNU_SOURCE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정보원의 첫번째 줄로 말입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;밑줄이 하나는 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define _GNU_SOURCE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 이것이 당신의 첫번째 프로세서 지시임에 틀림없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define _GNU_SOURCE  
#include &amp;lt;stdio.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/1777397/rtld-next-undeclared&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/566</guid>
      <comments>https://cafebook.tistory.com/566#entry566comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:50 +0900</pubDate>
    </item>
    <item>
      <title>PL/SQL 개발자 초기화 오류</title>
      <link>https://cafebook.tistory.com/565</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PL/SQL 개발자 초기화 오류&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PL/SQL 개발자를 사용하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 나의 오라클 디렉토리.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;C:\oracle\product\10.2.0\client_1\BIN&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;window10과 환경변수 설정을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;ORACLE_HOME C:\oracle\product\10.2.0\client_1&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Path C:\oracle\product\10.2.0\client_1\BIN&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 Initialization 오류를 실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Initialization error
Could not load &quot;C:\oracle\product\10.2.0\client_1\bin\oci.dll&quot;

OracleHomeKey: SOFTWARE\ORACLE\KEY_OraClient10g_home1
OracleHomeDir: C:\oracle\product\10.2.0\client_1
Found: oci.dll
Using: C:\oracle\product\10.2.0\client_1\bin\oci.dll
LoadLibrary(C:\oracle\product\10.2.0\client_1\bin\oci.dll) return 0
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;download oracle 인스턴트 클라이언트(PL/SQL 최신 버전의 경우 64비트, 이전 버전의 경우 32비트)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폴더에 압축을 풉니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c:\oracle\instantclient&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;open PL/SQL developer--&amp;gt; 구성 --&amp;gt; 기본 설정 --&amp;gt; Oracle Connection&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OCI 라이브러리 아래에서 키 입력&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OCI.DLL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 상자의 파일 경로:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c:\oracle\instantclient\oci.dll&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확인을 클릭하고 PL/SQL을 다시 시작합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 윈도우 10 컴퓨터에서도 같은 오류가 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마침내 &lt;a href=&quot;https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads#bookmark-vs2013&quot; rel=&quot;nofollow noreferrer&quot;&gt;저는 Microsoft Visual Studio 2013&lt;/a&gt; Redistributable을 놓쳤다는 사실을 알게 되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치 후 오류가 사라졌습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PL/SQL 개발자(윈도우 10 64비트)에서 데이터베이스에 연결하는 동안 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;초기화 오류 &quot;C:\app&amp;lt;username&amp;gt;\product\12.2.0\dbhome_1\bin\oci.dll&quot;을 초기화할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;32비트 Oracle Client가 설치되어 있는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;OracleHomeKey: 
OracleHomeDir: C:\app\&amp;lt;username&amp;gt;\product\12.2.0\dbhome_1
Found: oci.dll
Using: C:\app\&amp;lt;username&amp;gt;\product\12.2.0\dbhome_1\bin\oci.dll
LoadLibrary(C:\app\&amp;lt;username&amp;gt;\product\12.2.0\dbhome_1\bin\oci.dll) 
return 0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 해결하려면 Oracle Instant Client를 설치하기 위해 Oracle에서 제공하는 아래 설명서를 참조하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;윈도우가 64비트인 경우 아래 링크에서 32비트 Oracle Instant Client를 다운로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 &lt;a href=&quot;https://docs.oracle.com/en/database/oracle/r-enterprise/1.5.1/oread/installing-oracle-database-instant-client.html#GUID-8C502BDD-C1A1-4EA0-9E88-D2F8452D4AC2&quot; rel=&quot;nofollow noreferrer&quot;&gt;가이드&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://www.oracle.com/in/database/technologies/instant-client/microsoft-windows-32-downloads.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;Oracle Instant Client&lt;/a&gt; 다운로드 링크 - (BASIC 및 SDK, SQL*Plus Package 다운로드)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 세 개의 패키지를 모두 하나의 디렉토리에 가져가서 추출하고 시스템 환경 변수 PATH와 &lt;em&gt;OCI_LIB32&lt;/em&gt;에 추출된 디렉토리의 경로를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;OCI_LIB32&lt;/em&gt;가 없는 경우 동일하게 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PLSQL 개발자에서 데이터베이스에 연결을 시도해 보십시오. '&lt;em&gt;ORACLE 초기화&lt;/em&gt; 또는 &lt;em&gt;종료 진행 중'&lt;/em&gt;이라는 오류가 발생하면 아래 &lt;a href=&quot;https://www.oracletutorial.com/tips/oracle-initialization-or-shutdown-in-progress/&quot; rel=&quot;nofollow noreferrer&quot;&gt;링크&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행운을 빌어요 :)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;환경 변수 %PATH% 확인&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 비슷한 문제가 있었는데 이 단계들이 도움이 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단계:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 인스턴트 클라이언트 다운로드(PL/SQL 최신 버전의 경우 64비트, 이전 버전의 경우 32비트)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폴더에 압축을 풉니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 c:\oracle\instantclient&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PL/SQL 개발자 열기--&amp;gt; 구성--&amp;gt; 환경설정--&amp;gt; Oracle Connection&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OCI 라이브러리 아래에 OCI를 입력합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 상자의 DLL 파일 경로: c:\oracle\instantclient\oci.dll&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확인을 클릭하고 PL/SQL 재시작 완료&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 경우 이런 일이 일어납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 클라이언트가 없는 경우&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 인스턴트 클라이언트를 다운로드하여 C 드라이브에 저장한 다음 occi.dll 파일 경로의 경로를 복사하여 PL SQL Dev config 옵션의 OCI library text 필드에 저장할 수 있습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 홈이 여러 개 있는 경우&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;홈이 여러 개일 경우 PLSQL Dev config 옵션의 Oracle Home 드롭다운에서 올바른 Oracle 홈을 확인합니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쉽게 참조할 수 있도록 구성 화면의 이미지를 첨부하였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/tlfBP.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/tlfBP.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PL/SQL을 사용하여 연결한 후 오라클 클라이언트 다운로드&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/42710396/pl-sql-developer-initialization-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/565</guid>
      <comments>https://cafebook.tistory.com/565#entry565comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:45 +0900</pubDate>
    </item>
    <item>
      <title>Angular2에서 Angular의 $q에 해당하는 값은 얼마입니까?</title>
      <link>https://cafebook.tistory.com/564</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular2에서 Angular의 $q에 해당하는 값은 얼마입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular2에서 Angular의 $q에 해당하는 값은 얼마입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 제가 찾는 건&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$q.when&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그 덕분에 다음과 같은 일을 할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return $q.when(['TestResponse']);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;new Promise((resolve, reject) =&amp;gt; { 
  if(xxx) {
    resolve('ok');
  } else {
    reject('error');
  }
}).then(x =&amp;gt; doSomething())
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 또는 http://learnangular2.com/es6/promises 도 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 ES6 Promise를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로운 각도를 만드는 주요 이유 중 하나는 ES6와 곧 출시될 ES7입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/37719306/whats-the-equivalent-of-angulars-q-in-angular2&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/564</guid>
      <comments>https://cafebook.tistory.com/564#entry564comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:37 +0900</pubDate>
    </item>
    <item>
      <title>Android에서 화면 캡처를 방지하는 방법</title>
      <link>https://cafebook.tistory.com/563</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android에서 화면 캡처를 방지하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안드로이드 어플리케이션에서 화면 녹화를 방지할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안드로이드 시큐어 애플리케이션을 개발하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 내가 백그라운드에서 실행중인 화면 녹화 소프트웨어를 감지하고 그들을 죽일 필요가 있다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크린샷 방지를 위해 SECURED FLAG를 사용했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 안드로이드 화면의 비디오 캡처도 막을 수 있을지 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;화면 캡쳐(비디오/스크린샷) 방지법 알려주세요&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지원되는 수단을 통해 안드로이드 앱의 화면/동영상 캡처를 완벽하게 방지하는 &lt;strong&gt;것&lt;/strong&gt;은 불가능하다고 말씀드리겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 &lt;em&gt;정상적&lt;/em&gt;인 안드로이드 기기에 대해서만 차단하고자 한다면, SECURED FLAG는 매우 중요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;1)&lt;/strong&gt;보안 플래그는 일반 스크린샷과 비디오 캡처를 모두 차단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SECURE&quot; rel=&quot;noreferrer&quot;&gt;이 링크&lt;/a&gt;의 문서에는 다음과 같이 나와 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;창 플래그: 창 &lt;strong&gt;내용이 스크린샷에 표시되거나 보안&lt;/strong&gt;되지 않은 &lt;strong&gt;디스플레이에 표시되지 않도록&lt;/strong&gt; 창 내용을 안전한 것으로 간주합니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위 솔루션을 사용하면 애플리케이션이 앱의 비디오를 캡처하는 것을 확실히 방지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/30618030/5111155&quot;&gt;여기&lt;/a&gt; 정답을 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;2)&lt;/strong&gt;화면 내용을 캡처하는 다른 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 앱의 화면을 rooted 디바이스에 캡처하거나 SDK를 이용하여 캡처할 수도 있고,&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차단하거나 통지를 받을 가능성은 거의 없습니다&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, SDK를 통해 전화 화면을 컴퓨터에 미러링하는 소프트웨어가 있으므로 화면 캡처 소프트웨어를 사용할 수 있으며 앱에서 복구할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/6764649/5111155&quot;&gt;여기&lt;/a&gt; 정답을 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 줄만 추가하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신앞에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setContentView()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방법.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지 활동에만 적합한 모든 답변을 보았지만, 활동에 코드를 추가하지 않고 모든 활동에 대한 스크린샷을 차단하는 제 솔루션이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 Custom Application 클래스를 만들고 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;registerActivityLifecycleCallbacks&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 매니페스트에 등록하세요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;My ApplicationContext.class&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매니페스트&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;application
        android:name=&quot;.MyApplicationContext&quot;
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:label=&quot;@string/app_name&quot;
        android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
        android:supportsRtl=&quot;true&quot;
        android:theme=&quot;@style/AppTheme&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;화면 캡처를 비활성화하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 줄의 코드 추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onCreate()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방법:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                           WindowManager.LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;화면 캡처를 활성화하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;찾기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LayoutParams.FLAG_SECURE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 라인을 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Java 사용자의 경우 사용자 위에 이 줄을 씁니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setContentView(R.layout.activity_main);&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코틀린 사용자용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱을 디바이스/프로파일 소유자로 만들고 전화를 걸 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setScreenCaptureDisabled()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. &lt;a href=&quot;http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setScreenCaptureDisabled%28android.content.ComponentName,%20boolean%29&quot; rel=&quot;noreferrer&quot;&gt;문서&lt;/a&gt;에서 이 api는 다음을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;public void setScreenCapture사용 안 함(ComponentName admin, boolean disabled) API 레벨 21에 추가됨&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치/프로파일 소유자가 화면 캡처 비활성화 여부를 설정하기 위해 호출합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;화면 캡처를 비활성화하면 안전한 비디오 출력이 없는 디스플레이 장치에 콘텐츠가 표시되지 않게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보안 표면 및 보안 디스플레이에 대한 자세한 내용은 FLAG_SECURE를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출 장치 관리자는 장치 또는 프로필 소유자여야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않은 경우에는 보안 예외가 적용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수 adminWhich DeviceAdminRecever 이 요청이 연결되어 있습니다. 화면 캡처가 비활성화되었는지 여부를 비활성화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 &lt;a href=&quot;https://www.samsungknox.com/en/partners/mobile-device-managers&quot; rel=&quot;noreferrer&quot;&gt;MDM(Mobile Device Management)&lt;/a&gt; 파트너 앱이 될 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OEM은 MDM 파트너 앱에 추가 API를 제공하여 장치를 제어합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 samsung은 MDM 파트너에게 장치의 화면 녹화를 제어하는 api를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 화면 캡처 제한을 적용할 수 있는 유일한 방법입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 솔루션을 사용하여 앱에서 수동 스냅샷을 허용하는 동시에 앱이 백그라운드로 돌아갈 때 화면 캡처를 허용하지 않습니다. 도움이 되었으면 좋겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SECURE.&quot; rel=&quot;nofollow&quot;&gt;공식 가이드&lt;/a&gt;에 따르면 다음을 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WindowManager.LayoutParams.FLAG_SECURE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;창 레이아웃에 따라 스크린샷이 허용되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 활동에 대한 OnCreate 이벤트(Xamarin) 내부에 이 줄 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;public class InShotApp extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            registerActivityLifecycle();
        }
    
        private void registerActivityLifecycle() {
    
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                    activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
    
                @Override
                public void onActivityStarted(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityResumed(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityPaused(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityStopped(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
    
                }
    
                @Override
                public void onActivityDestroyed(@NonNull Activity activity) {
    
                }
            });
    
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응용프로그램에서 스크린샷을 찍을 가능성을 차단하는 것과 관련하여:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Window window = requireActivity().getWindow();
window.addFlag(WindowManager.LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 플래그(예: onDestroy)를 청소하는 것을 기억하십시오. 앱의 다른 안전한 장소에서 스크린샷을 활성화하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.clearFlags(WWindowManager.LayoutParams.FLAG_SECURE);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사진 스크린샷에 대해 FLAG_SECure가 루트 장치에서 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 스크린샷 파일을 모니터하면 원본 파일이 나오는 것을 막을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/SinsangMarket/ASS&quot; rel=&quot;nofollow noreferrer&quot;&gt;이거&lt;/a&gt; 먹어봐요.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1. Android 원격 서비스로 스크린샷(파일 모니터) 모니터링&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2. 원본 스크린샷 이미지를 삭제합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3. 수정할 수 있도록 비트맵 인스턴스를 전달합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Kotlin 사용자는 Application 클래스에 다음 코드를 추가하여 앱 스크린샷을 방지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyApplication : Application() {

override fun onCreate() {
  
    super.onCreate()
   
    registerActivityLifecycle()
   
}

private fun registerActivityLifecycle() {
    registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            activity.window.setFlags(
                WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE
            )
        }

        override fun onActivityStarted(activity: Activity) {}
        override fun onActivityResumed(activity: Activity) {}
        override fun onActivityPaused(activity: Activity) {}
        override fun onActivityStopped(activity: Activity) {}
        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        override fun onActivityDestroyed(activity: Activity) {}
    })
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크린샷을 비활성화해야 하고 Jetpack을 사용 중인 사용자에게 필요한 구성은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fun Activity.disableScreenshots() {
  window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
}

fun Activity.enableScreenshots() {
  window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}

@Composable
fun DisableScreenshots() {
  val context = LocalContext.current
  DisposableEffect(Unit) {
    context.getActivity()?.disableScreenshots()
    onDispose {
      context.getActivity()?.enableScreenshots()
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 합성 가능한 함수에서 &lt;strong&gt;DisableScreenshots&lt;/strong&gt;를 호출합니다;)&lt;/font&gt;&lt;/p&gt;&lt;h4&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쉽고 우아함:&lt;/font&gt;&lt;/h4&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;import android.view.WindowManager.LayoutParams;

// ...

@Override
public void onWindowFocusChanged(boolean isFocused) {
  if (isFocused) {
    getWindow().clearFlags(LayoutParams.FLAG_SECURE);
  } else {
    getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
  }
  super.onWindowFocusChanged(isFocused);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/28606689/how-to-prevent-screen-capture-in-android&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>android</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/563</guid>
      <comments>https://cafebook.tistory.com/563#entry563comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:31 +0900</pubDate>
    </item>
    <item>
      <title>MariaDB 10.4.10 ERROR 1146 (42S02):'mysql.user' 테이블이 없습니다.</title>
      <link>https://cafebook.tistory.com/562</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB 10.4.10 ERROR 1146 (42S02):&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'mysql.user' 테이블이 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB 10.4.1에서 mysql.user 테이블이 mysql.global_privable로 대체된 것으로 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/library/mysqluser-table/&quot; rel=&quot;nofollow noreferrer&quot;&gt;문서&lt;/a&gt;에는 &quot;mysql.user는 이제 보기입니다&quot;라고 나와 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;소켓 연결을 사용하여 루트로 새로 설치(OS x에서 홈브루 사용)에 로그인하면 이 보기가 표시되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 내 GUI(sequel pro)가 작동하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 역호환 뷰를 만드는 설정 단계가 누락된 것입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;MariaDB [(none)]&amp;gt; select * from mysql.user;
ERROR 1146 (42S02): Table 'mysql.user' doesn't exist
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 문제의 원인일 수도 있고 아닐 수도 있지만, 문제를 해결해 주었을 뿐입니다. 위아래, 앞뒤, 앞을 확인해 보았지만 여전히 권한 문제로 드러났습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 경우는, 그것 뿐만이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql.user&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실종된 것으로 알려졌지만, 또한&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql.columns_priv&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(권한을 삭제하려고 했을 때)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;할 수 있어요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;use mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;괜찮아요, 하지만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;show tables&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후 다음과 같은 오류를 범했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 1018 (HY000):&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'.mysql/'의 dir를 읽을 수 없습니다(errno: 13 &quot;권한 거부&quot;).&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 제가 즉시 이해할 수 있는 것은 아니었지만, 그것은 분명히 그가 자신의 집에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 디렉토리를 읽을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB 서버에서 사용하는 사용자.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 MariaDB를 홈브루 서비스로 실행하고 있어서 MariaDB MXCL plist 파일(홈브루 셀러 폴더에 위치)을 찾아 보았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/local/Cellar/mariadb/10.4.10_1/homebrew.mxcl.mariadb.plist&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;): 키 아래에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ProgramArguments&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--datadir&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB가 데이터를 저장하는 데 사용할 디렉토리를 지정하는 인수입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/local/var/mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 내 생각엔 그게 표준인 것 같아요&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우, 저는 이전에 MySQL 5.6을 정기적으로(즉, 비MariaDB) 설치한 적이 있었는데, 동일한 데이터 디렉토리를 사용한 것이 원인이었을 것입니다. 이 디렉토리에 대한 권한을 살펴봤을 때, 제 사용자가 소유하고 있었고,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자에게 읽기 권한만 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한번 준적은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 폴더에 대한 읽기와 쓰기 권한, 그리고 보라, 나의.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql.user&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뷰, 의 다른 모든 것들과 함께.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스가 갑자기 시야에 들어와 정상적으로 작동했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/59433666/mariadb-10-4-10-error-1146-42s02-table-mysql-user-doesnt-exist&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/562</guid>
      <comments>https://cafebook.tistory.com/562#entry562comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:21 +0900</pubDate>
    </item>
    <item>
      <title>요소 이름에 CSS 스타일을 적용할 수 있습니까?</title>
      <link>https://cafebook.tistory.com/561</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소 이름에 CSS 스타일을 적용할 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 현재 CSS 스타일을 적용하고 있는 HTML을 제어할 수 없는 프로젝트를 진행하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 HTML은 요소들을 구분하기에 충분한 id와 클래스 선언이 없다는 점에서 라벨이 잘 붙어 있지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 id나 클래스 속성이 없는 객체에 스타일을 적용할 수 있는 방법을 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폼 항목에 &quot;이름&quot; 또는 &quot;값&quot; 속성이 있는 경우가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;submit&quot; value=&quot;Go&quot; name=&quot;goButton&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;name=&quot;goButton&quot;을 바탕으로 스타일을 적용할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;가치&quot;는?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글 검색을 통해 &quot;이름&quot;이나 &quot;가치&quot;와 같은 광범위한 용어가 웹 페이지에 나타나는 모든 종류의 사례를 찾을 수 있기 때문에 이는 찾아보기 어렵습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 생각엔 '아니오'라는 대답이...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;영리한 해킹을 한 사람이 아닐까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 조언이라도 해주시면 대단히 감사하겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성 선택기를 사용할 수 있고,&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;input[name=&quot;goButton&quot;] {
  background: red;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;input name=&quot;goButton&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE6에서는 지원되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트: 2016년에는 IE6가 죽었으므로 원하는 대로 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://quirksmode.org/css/selectors/&quot; rel=&quot;noreferrer&quot;&gt;http://quirksmode.org/css/selectors/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://reference.sitepoint.com/css/attributeselector&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://reference.sitepoint.com/css/attributeselector&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 입력 예제&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;input[type=text] {
  width: 150px;
}

input[name=myname] {
  width: 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;input type=&quot;text&quot;&amp;gt;
&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;myname&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성 선택기를 사용할 수 있지만 meder가 말한 대로 IE6에서는 작동하지 않습니다. 그래도 자바스크립트를 사용할 수 있는 방법이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://selectivizr.com/&quot;&gt;선택비저&lt;/a&gt; 확인&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성 선택기에 대한 자세한 내용: http://www.css3.info/preview/attribute-selectors/&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* turns all input fields that have a name that starts with &quot;go&quot; red */
input[name^=&quot;go&quot;] { color: red }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미래의 구글러들을 위해, @meder에 의한 답변의 메소드인 FYI는 이름 속성을 가진 어떤 요소와도 사용될 수 있으므로, 다음과 같이 가정해 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라는 이름으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xyz&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 아래와 같이 규칙을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;iframe[name=xyz] {    
    display: none;
}   
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성은 다음 요소에서 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;keygen&amp;gt;&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;map&amp;gt;&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;output&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;param&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[name=elementName]{}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;태그가 없는 것도 효과가 있을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 이름을 가진 모든 요소에 영향을 미칩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;[name=test] {
  width: 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;input type=text name=test&amp;gt;
&amp;lt;div name=test&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;&gt;당신의 질문을 제대로 이해했다면,&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예, ID 또는 이름을 사용할 수 있는 경우 개별 요소의 스타일을 설정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 id를 사용할 수 있다면 당신은 요소를 통제할 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;submit&quot; value=&quot;Go&quot; name=&quot;goButton&quot;&amp;gt;

var v_obj = document.getElementsById('goButton');

v_obj.setAttribute('style','color:red;background:none');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 이름이 가능하다면 당신은 요소를 통제할 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;submit&quot; value=&quot;Go&quot; name=&quot;goButton&quot;&amp;gt;

var v_obj = document.getElementsByName('goButton');

v_obj.setAttribute('style','color:red;background:none');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;입력에서 이름을 사용하지 않고 다른 요소를 사용하는 경우, 다른 요소를 속성으로 대상화할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;    [title~=flower] {
      border: 5px solid yellow;
    }&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;    &amp;lt;img src=&quot;klematis.jpg&quot; title=&quot;klematis flower&quot; width=&quot;150&quot; height=&quot;113&quot;&amp;gt;
    &amp;lt;img src=&quot;img_flwr.gif&quot; title=&quot;flower&quot; width=&quot;224&quot; height=&quot;162&quot;&amp;gt;
    &amp;lt;img src=&quot;img_flwr.gif&quot; title=&quot;flowers&quot; width=&quot;224&quot; height=&quot;162&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되기를 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;input[type=text] {
  width: 150px;
  length: 150px;
}

input[name=myname] {
  width: 100px;
length: 150px;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot;&amp;gt;
&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;myname&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리 선택기에 완벽한 작업입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var Set1=document.querySelectorAll('input[type=button]');  // by type

var Set2=document.querySelectorAll('input[name=goButton]'); // by name

var Set3=document.querySelectorAll('input[value=Go]'); // by value
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 이러한 컬렉션을 순환시켜 찾은 요소에 대해 작동할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 jQuery의 사용가능성을 탐색해보셨습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매우 리치 셀렉터 모델(CSS와 구문이 유사)을 가지고 있으며, 요소에 ID가 없더라도 부모 --&amp;gt; 자식 --&amp;gt; 손자 관계를 사용하여 요소를 선택할 수 있어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택하면 요소에 CSS 스타일을 적용할 수 있는 매우 간단한 메서드 호출(정확한 이름은 잊어버립니다)이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용이 간단해야 하며, 이에 더해 여러 플랫폼이 호환될 가능성이 높습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/5468766/can-i-apply-a-css-style-to-an-element-name&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/561</guid>
      <comments>https://cafebook.tistory.com/561#entry561comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:15 +0900</pubDate>
    </item>
    <item>
      <title>C switch 문보다 크고 작음</title>
      <link>https://cafebook.tistory.com/560</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C switch 문보다 크고 작음&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비교가 많이 되는 코드를 작성하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;QUANT&quot;에 프로그램을 작성합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;숫자를 &quot;수치화&quot;하는 &quot;C&quot;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정수 &quot;x&quot;를 읽고 테스트하면 다음과 같은 출력이 나옵니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x 1000 인쇄 이상 &quot;hugely 양성&quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x 999부터 100까지(100 포함) &quot;매우 긍정적&quot; 인쇄&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;100에서 0 사이의 x &quot;양&quot; 인쇄&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x 정확히 0 인쇄 &quot;0&quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0 ~ -100 사이의 x &quot;음&quot; 인쇄&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x -100 ~ -999(-100 포함) 인쇄 &quot;매우 음&quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x -1000 인쇄 이하 &quot;hugely 네거티브&quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 -10은 &quot;네거티브&quot;, -100은 &quot;매우 네거티브&quot;, 458은 &quot;매우 포지티브&quot;로 출력됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 스위치 문을 사용해서 해결하려고 했지만, 작동이 되지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것을 사용해서 풀어야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;statement 또는 switch statement를 사용하여 해결하는 방법이 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    int a=0;
    printf(&quot;please enter a number : \n&quot;);

    scanf(&quot;%i&quot;,&amp;amp;a);

    switch(a)
    {
        case (a&amp;gt;1000):
            printf(&quot;hugely positive&quot;);
            break;

        case (a&amp;gt;=100 &amp;amp;&amp;amp; a&amp;lt;999):
            printf(&quot;very positive&quot;);
            break;

        case (a&amp;gt;=0 &amp;amp;&amp;amp; a&amp;lt;100):
            printf(&quot;positive&quot;);
            break;

        case 0:
            printf(&quot;zero&quot;);
            break;

        case (a&amp;gt;-100 &amp;amp;&amp;amp; a&amp;lt;0):
            printf(&quot;negative&quot;);
            break;

        case (a&amp;lt;-100 &amp;amp;&amp;amp; a&amp;gt;-999):
            printf(&quot;very negative&quot;);
            break;

        case (a&amp;lt;=-1000):
            printf(&quot;hugely negative&quot;);
            break;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;케이스가 일체형이어야 하기 때문에 스위치로 이를 해결할 수 있는 깨끗한 방법이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 사람들을 한번 보세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위치가 &lt;em&gt;없는&lt;/em&gt; if-eless 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    int a=0, i;
    struct {
        int value;
        const char *description;
    } list[] = {
        { -999, &quot;hugely negative&quot; },
        { -99, &quot;very negative&quot; },
        { 0, &quot;negative&quot; },
        { 1, &quot;zero&quot; },
        { 100, &quot;positive&quot; },
        { 1000, &quot;very positive&quot; },
        { 1001, &quot;hugely positive&quot; }
    };

    printf(&quot;please enter a number : \n&quot;);
    scanf(&quot;%i&quot;,&amp;amp;a);

    for (i=0; i&amp;lt;6 &amp;amp;&amp;amp; a&amp;gt;=list[i].value; i++) ;
    printf (&quot;%s\n&quot;, list[i].description);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;for-loop에 코드가 없습니다(빈 문만 있음).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) 그러나 여전히 값이 있는 배열 위에서 실행되고 입력된 값이 있으면 종료됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같거나 더 큽니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;value&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열의 요소.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 시점에서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 대한 인덱스 값을 보유합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;description&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인쇄합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;gcc를 사용하는 경우 언어 확장자를 사용하여 원하는 것을 정확하게 지원하므로 &quot;행운&quot;이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;limits.h&amp;gt;
...

switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
    printf(&quot;hugely positive&quot;);
   break;
case 100 ... 999:
    printf(&quot;very positive&quot;);
   break;
...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이것은 표준이 아니며 다른 컴파일러들은 당신의 코드를 이해하지 못할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;흔히 표준 기능(&quot;휴대성&quot;)을 사용하여 프로그램을 작성해야 한다고 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 &quot;스트리밍&quot;을 사용하는 것을 고려해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if-elseif-else&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (a &amp;gt;= 1000)
{
    printf(&quot;hugely positive&quot;);
}
else if (a &amp;gt;= 100)
{
    printf(&quot;very positive&quot;);
}
else if ...
...
else // might put a helpful comment here, like &quot;a &amp;lt;= -1000&quot;
{
    printf(&quot;hugely negative&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;(a&amp;gt;1000)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1 [참] 또는 0 [false]으로 평가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일하면 다음 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;test_15.c:12: error: case label does not reduce to an integer constant
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 말은, 당신은 그 다음에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;integer constant&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 가치&lt;/font&gt;&lt;/font&gt;&lt;code&gt;case&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라벨. 안&lt;/font&gt;&lt;/font&gt;&lt;code&gt;If-else if-else&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;루프는 이 경우에 잘 작동할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;switch (option(a)) {
    case (0): ...
    case (1): ...
    case (2): ...
    case (n): ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어디서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;option()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수는 단순히 다음과 같은 함수입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if else&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 통해 스위치의 깔끔한 외관을 유지할 수 있으며 논리적인 부분은 다른 곳에 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위치 사용을 선호하는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이것이 '숙제 문제'처럼 끔찍하게 들리기 때문에 물어봅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러는 (범위를 다루고 있지 않더라도) 스위치만큼 효율적으로 if/else 구성을 처리해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위치는 표시된 것처럼 범위를 처리할 수는 없지만 입력을 먼저 범주화한 다음(if/else 사용) 스위치 문을 사용하여 답을 출력함으로써 스위치를 포함하는 방법을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;type 매개변수 패턴을 when 절과 함께 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;switch(a)
    {
        case * when (a&amp;gt;1000):
            printf(&quot;hugely positive&quot;);
            break;
        case * when (a&amp;gt;=100 &amp;amp;&amp;amp; a&amp;lt;999):
            printf(&quot;very positive&quot;);
            break;
        case * when (a&amp;gt;=0 &amp;amp;&amp;amp; a&amp;lt;100):
            printf(&quot;positive&quot;);
            break; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/20972297/larger-than-and-less-than-in-c-switch-statement&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/560</guid>
      <comments>https://cafebook.tistory.com/560#entry560comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:08 +0900</pubDate>
    </item>
    <item>
      <title>Angularjs [$rootScope:inprog] 진행 중 오류 발생</title>
      <link>https://cafebook.tistory.com/559</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angularjs [$rootScope:inprog] 진행 중 오류 발생&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;angularjs [$rootScope:inprog] 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Error: [$rootScope:inprog] http://errors.angularjs.org/1.2.7/$rootScope/inprog?p0=%24digest&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 함수 호출입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; Members.get({}, function (response) { // success
   $scope.family_mem = response.data;    
  }, function (error) { // ajax loading error

    Data.errorMsg(); // display error notification
  });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘솔에서 나는 php 컨트롤러 기능으로 결과를 얻고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트 안 함&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope.family_mem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 부분으로 이동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 지시입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;myApp.directive('mySelect', function() {
  return{
    restrict: 'A',
    link: function(scope, element){
      $(element).select2();
    }
  };
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 $rootScope을 정의했다는 의미입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$apply은 이미 수명 주기가 있는 다른 각도 코드에서 수동으로 어딘가에 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적인 경우에는 라이프사이클 자체의 각도 트랙으로 이러한 일이 발생해서는 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요한 일반적인 경우는 비각형 코드(jquery 또는 구식 js 항목)에서 스코프를 업데이트해야 할 때입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 혹시 어디에 이것이 있는지 확인해 주시기 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정말 필요한 경우 안전한 적용(공통 코드 조각)을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;angular.module('main', []).service('scopeService', function() {
     return {
         safeApply: function ($scope, fn) {
             var phase = $scope.$root.$$phase;
             if (phase == '$apply' || phase == '$digest') {
                 if (fn &amp;amp;&amp;amp; typeof fn === 'function') {
                     fn();
                 }
             } else {
                 $scope.$apply(fn);
             }
         },
     };
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 이 서비스를 주입하고 다음을 통해 필요한 전화를 걸 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;scopeService.safeApply($rootScope, function() {
    // you code here to apply the changes to the scope
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[$rootScope:inprog] 진행 중인 내 경우 오류:&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;사례 1:&lt;/strong&gt; 한 번에 두 가지 행동을 실행한다는 의미입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;goView();
hidePopOver(); //Will trigger error
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;$timeout&lt;/strong&gt;을 사용하여 두 가지 작업(함수)이 동시에 실행되지 않는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;goView();
$timeout(function () {
    hidePopOver();
}, 300);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;사례 2&lt;/strong&gt;: 액션이 완전히 실행되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$timeout을 사용하여 첫 번째 작업이 실행되었는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$timeout(function () {
    $(element.target).trigger('click');
}, 300);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 같은 문제에 직면했지만,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;time delay&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 문제를 매력적으로 해결했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$timeout(function () {
    $(element.target).trigger('click');
}, 300);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트리거가 jquery/javscript 쪽에 있는 경우.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;setTimeout(function () {
    $(element.target).trigger('click');
}, 300);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/22733422/angularjs-rootscopeinprog-inprogress-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/559</guid>
      <comments>https://cafebook.tistory.com/559#entry559comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:18:00 +0900</pubDate>
    </item>
    <item>
      <title>memcmp가 루프 체크보다 훨씬 빠른 이유는 무엇입니까?</title>
      <link>https://cafebook.tistory.com/558</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;memcmp가 루프 체크보다 훨씬 빠른 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp(a, b, size)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음보다 훨씬 더 빠릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for(i = 0; i &amp;lt; nelements; i++) {
    if a[i] != b[i] return 0;
}
return 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;memcmp는 CPU 명령 같은 것입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;꽤나 깊은가봐요 왜냐면 제가 사용하는 속도가 엄청나게 빨라졌거든요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;순환으로&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어셈블리에서 구현되는 경우가 많은데, 이는 C의 단순한 루프보다 훨씬 &lt;em&gt;빠른&lt;/em&gt; 아키텍처 고유의 여러 기능을 활용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;빌트인&quot;으로서&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GCC 지원&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(또한 1톤의 다른 기능도 포함) &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;em&gt;내장&lt;/em&gt;&lt;/a&gt;된 기능입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GCC의 일부 버전/구성에서 다음에 대한 호출&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로 인정될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__builtin_memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 방출하는 대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;call&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라이브러리 함수, GCC는 최적화된 인라인 버전의 기능을 수행하기 위한 몇 가지 명령을 발표할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x86의 경우에는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmpsb&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령어는 한 메모리 위치의 바이트 문자열을 다른 메모리 위치와 비교합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 다음과 결합되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;repe&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접두사를 사용하면 문자열이 더 이상 동일하지 않거나 카운트가 소진될 때까지 문자열을 비교할 수 있습니다. (정확히 무엇인가요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;합니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주어진 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int test(const void* s1, const void* s2, int count)
{
    return memcmp(s1, s2, count) == 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;gcc version 3.4.4&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Cygwin에서 다음 어셈블리를 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;; (prologue)
mov     esi, [ebp+arg_0]    ; Move first pointer to esi
mov     edi, [ebp+arg_4]    ; Move second pointer to edi
mov     ecx, [ebp+arg_8]    ; Move length to ecx

cld                         ; Clear DF, the direction flag, so comparisons happen
                            ; at increasing addresses
cmp     ecx, ecx            ; Special case: If length parameter to memcmp is
                            ; zero, don't compare any bytes.
repe cmpsb                  ; Compare bytes at DS:ESI and ES:EDI, setting flags
                            ; Repeat this while equal ZF is set
setz    al                  ; Set al (return value) to 1 if ZF is still set
                            ; (all bytes were equal).
; (epilogue) 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://faydoc.tripod.com/cpu/cmpsb.htm&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;cmpsb&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명&lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라이브러리 기능으로서&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최적화된 버전의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 C 표준 라이브러리에 존재합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 작업은 일반적으로 아키텍처별 지침을 활용하여 많은 데이터를 병렬로 작업합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Glibc에는 다음과 같은 버전이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://sourceware.org/git/?p=glibc.git;a=tree;f=sysdeps/x86_64/multiarch&quot; rel=&quot;noreferrer&quot;&gt;x86_64의 경우&lt;/a&gt; 다음 명령어 집합 확장 기능을 이용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/SSE2&quot; rel=&quot;noreferrer&quot;&gt;SSE2&lt;/a&gt; - &lt;a href=&quot;https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/memcmp.S&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;sysdeps/x86_64/memcmp.S&lt;/code&gt;&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/SSE4&quot; rel=&quot;noreferrer&quot;&gt;SSE4&lt;/a&gt; - &lt;a href=&quot;https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/multiarch/memcmp-sse4.S&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;sysdeps/x86_64/multiarch/memcmp-sse4.S&lt;/code&gt;&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/SSSE3&quot; rel=&quot;noreferrer&quot;&gt;SSSE3&lt;/a&gt; - &lt;a href=&quot;https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/multiarch/memcmp-ssse3.S&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;sysdeps/x86_64/multiarch/memcmp-ssse3.S&lt;/code&gt;&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;멋진 점은 glibc가 CPU가 가지고 있는 최신 명령어 세트를 (런타임 시) 감지하고 이에 최적화된 버전을 실행한다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음에서 이 토막글을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENTRY(memcmp)
    .type   memcmp, @gnu_indirect_function
    LOAD_RTLD_GLOBAL_RO_RDX
    HAS_CPU_FEATURE (SSSE3)
    jnz 2f
    leaq    __memcmp_sse2(%rip), %rax
    ret 

2:  HAS_CPU_FEATURE (SSE4_1)
    jz  3f  
    leaq    __memcmp_sse4_1(%rip), %rax
    ret 

3:  leaq    __memcmp_ssse3(%rip), %rax
    ret 

END(memcmp)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스 커널에서&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스는 최적화된 버전을 가지고 있지 않은 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x86_64의 경우에는 적용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcpy&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 에서 사용할 버전을 런타임에 결정할 뿐만 아니라 부팅 시 한 번만 이 결정을 내릴 수 있도록 &lt;em&gt;패치 자체&lt;/em&gt;를 적용하는 &lt;em&gt;대체&lt;/em&gt; 인프라스트럭처()&lt;a href=&quot;https://github.com/torvalds/linux/blob/master/aarch/x86/kernel/alternative.c&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;arch/x86/kernel/alternative.c&lt;/code&gt;&lt;/a&gt;를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 컴파일러 인텐셜(intrinsic)은 메모리 블록을 비교하기 위한 전문적인 명령어와 함께 빠른 어셈블리로 변환됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/855895/intrinsic-memcmp&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고유 memcmp&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;memcmp는 CPU 명령 같은 것입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 적어도 매우 최적화된 컴파일러가 제공하는 고유 함수입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플랫폼에 따라 한 개 또는 두 개의 기계 명령이 있을 수도 있습니다. 지정하지는 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/21106801/why-is-memcmp-so-much-faster-than-a-for-loop-check&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/558</guid>
      <comments>https://cafebook.tistory.com/558#entry558comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:17:53 +0900</pubDate>
    </item>
    <item>
      <title>지원 라이브러리를 이용하여 리플 애니메이션을 달성하는 방법은?</title>
      <link>https://cafebook.tistory.com/557</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지원 라이브러리를 이용하여 리플 애니메이션을 달성하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼 클릭 시 리플 애니메이션을 추가하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래와 같이 했는데 minSdK 버전이 21까지 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ripple.xml&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ripple xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:color=&quot;?android:colorControlHighlight&quot;&amp;gt;
    &amp;lt;item&amp;gt;
        &amp;lt;shape android:shape=&quot;rectangle&quot;&amp;gt;
            &amp;lt;solid android:color=&quot;?android:colorAccent&quot; /&amp;gt;
        &amp;lt;/shape&amp;gt;
    &amp;lt;/item&amp;gt;
&amp;lt;/ripple&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단추&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;com.devspark.robototextview.widget.RobotoButton
    android:id=&quot;@+id/loginButton&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:background=&quot;@drawable/ripple&quot;
    android:text=&quot;@string/login_button&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디자인 라이브러리와 역호환이 가능하도록 하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게 할 수 있죠?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 리플 설정&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보기에 포함된 잔물결입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;android:background=&quot;?selectableItemBackground&quot;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보기 범위를 벗어나는 잔물결:&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;android:background=&quot;?selectableItemBackgroundBorderless&quot;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에서 &lt;a href=&quot;https://stackoverflow.com/a/9409391/2308514&quot;&gt;해결&lt;/a&gt; 방법을 살펴봅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;?(attr)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바 코드의 xml 참조.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지원 라이브러리&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;?attr:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(또는 더&lt;/font&gt;&lt;/font&gt;&lt;code&gt;?&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속기로 대신하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;?android:attr&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에서는 &lt;a href=&quot;http://developer.android.com/tools/support-library/features.html#v7&quot; rel=&quot;noreferrer&quot;&gt;지원 라이브러리&lt;/a&gt;를 참조하므로 API 7로 다시 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지/배경 잔물결&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지 또는 배경과 오버레이 리플을 가지는 가장 쉬운 해결책은 다음을 감싸는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;View&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일순간에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FrameLayout&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잔물결로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setForeground()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setBackground()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;솔직히 그렇지 않으면 이것을 할 수 있는 깨끗한 방법은 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이전에 이 질문을 주제 외로 종결하기로 투표했지만 안타깝게도 아직 지원 라이브러리의 일부가 아닌 시각적 효과가 꽤 좋아서 마음을 바꿨습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;향후 업데이트 시 나타날 가능성이 높지만 발표된 기간은 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다행히 이미 사용 가능한 맞춤형 구현이 거의 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/traex/RippleEffect&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/traex/RippleEffect&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/balysv/material-ripple&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/balysv/material-ripple&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/siriscac/RippleView&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/siriscac/RippleView&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ozodrukh/RippleDrawable&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/ozodrukh/RippleDrawable&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 버전의 Android와 호환되는 Material 테마 위젯 세트 포함:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/keithellis/MaterialWidget&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/keithellis/MaterialWidget&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 당신은 이것들 중 하나를 시도하거나 구글에서 다른 &quot;소재 위젯&quot;을 시도할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리플 버튼을 만드는 간단한 클래스를 만들었습니다. 결국 필요가 없었기 때문에 최고는 아니지만 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

public class RippleView extends Button
{
    private float duration = 250;

    private float speed = 1;
    private float radius = 0;
    private Paint paint = new Paint();
    private float endRadius = 0;
    private float rippleX = 0;
    private float rippleY = 0;
    private int width = 0;
    private int height = 0;
    private OnClickListener clickListener = null;
    private Handler handler;
    private int touchAction;
    private RippleView thisRippleView = this;

    public RippleView(Context context)
    {
        this(context, null, 0);
    }

    public RippleView(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public RippleView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init()
    {
        if (isInEditMode())
            return;

        handler = new Handler();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.WHITE);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
        height = h;
    }

    @Override
    protected void onDraw(@NonNull Canvas canvas)
    {
        super.onDraw(canvas);

        if(radius &amp;gt; 0 &amp;amp;&amp;amp; radius &amp;lt; endRadius)
        {
            canvas.drawCircle(rippleX, rippleY, radius, paint);
            if(touchAction == MotionEvent.ACTION_UP)
                invalidate();
        }
    }

    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event)
    {
        rippleX = event.getX();
        rippleY = event.getY();

        switch(event.getAction())
        {
            case MotionEvent.ACTION_UP:
            {
                getParent().requestDisallowInterceptTouchEvent(false);
                touchAction = MotionEvent.ACTION_UP;

                radius = 1;
                endRadius = Math.max(Math.max(Math.max(width - rippleX, rippleX), rippleY), height - rippleY);
                speed = endRadius / duration * 10;
                handler.postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        if(radius &amp;lt; endRadius)
                        {
                            radius += speed;
                            paint.setAlpha(90 - (int) (radius / endRadius * 90));
                            handler.postDelayed(this, 1);
                        }
                        else
                        {
                            clickListener.onClick(thisRippleView);
                        }
                    }
                }, 10);
                invalidate();
                break;
            }
            case MotionEvent.ACTION_CANCEL:
            {
                getParent().requestDisallowInterceptTouchEvent(false);
                touchAction = MotionEvent.ACTION_CANCEL;
                radius = 0;
                invalidate();
                break;
            }
            case MotionEvent.ACTION_DOWN:
            {
                getParent().requestDisallowInterceptTouchEvent(true);
                touchAction = MotionEvent.ACTION_UP;
                endRadius = Math.max(Math.max(Math.max(width - rippleX, rippleX), rippleY), height - rippleY);
                paint.setAlpha(90);
                radius = endRadius/4;
                invalidate();
                return true;
            }
            case MotionEvent.ACTION_MOVE:
            {
                if(rippleX &amp;lt; 0 || rippleX &amp;gt; width || rippleY &amp;lt; 0 || rippleY &amp;gt; height)
                {
                    getParent().requestDisallowInterceptTouchEvent(false);
                    touchAction = MotionEvent.ACTION_CANCEL;
                    radius = 0;
                    invalidate();
                    break;
                }
                else
                {
                    touchAction = MotionEvent.ACTION_MOVE;
                    invalidate();
                    return true;
                }
            }
        }

        return false;
    }

    @Override
    public void setOnClickListener(OnClickListener l)
    {
        clickListener = l;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 사람들이 이와 같은 것을 찾고 있기 때문에 저는 다른 뷰들이 파급효과를 갖도록 할 수 있는 수업을 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

public class RippleViewCreator extends FrameLayout
{
    private float duration = 150;
    private int frameRate = 15;

    private float speed = 1;
    private float radius = 0;
    private Paint paint = new Paint();
    private float endRadius = 0;
    private float rippleX = 0;
    private float rippleY = 0;
    private int width = 0;
    private int height = 0;
    private Handler handler = new Handler();
    private int touchAction;

    public RippleViewCreator(Context context)
    {
        this(context, null, 0);
    }

    public RippleViewCreator(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public RippleViewCreator(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init()
    {
        if (isInEditMode())
            return;

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(getResources().getColor(R.color.control_highlight_color));
        paint.setAntiAlias(true);

        setWillNotDraw(true);
        setDrawingCacheEnabled(true);
        setClickable(true);
    }

    public static void addRippleToView(View v)
    {
        ViewGroup parent = (ViewGroup)v.getParent();
        int index = -1;
        if(parent != null)
        {
            index = parent.indexOfChild(v);
            parent.removeView(v);
        }
        RippleViewCreator rippleViewCreator = new RippleViewCreator(v.getContext());
        rippleViewCreator.setLayoutParams(v.getLayoutParams());
        if(index == -1)
            parent.addView(rippleViewCreator, index);
        else
            parent.addView(rippleViewCreator);
        rippleViewCreator.addView(v);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
        height = h;
    }

    @Override
    protected void dispatchDraw(@NonNull Canvas canvas)
    {
        super.dispatchDraw(canvas);

        if(radius &amp;gt; 0 &amp;amp;&amp;amp; radius &amp;lt; endRadius)
        {
            canvas.drawCircle(rippleX, rippleY, radius, paint);
            if(touchAction == MotionEvent.ACTION_UP)
                invalidate();
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event)
    {
        return true;
    }

    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event)
    {
        rippleX = event.getX();
        rippleY = event.getY();

        touchAction = event.getAction();
        switch(event.getAction())
        {
            case MotionEvent.ACTION_UP:
            {
                getParent().requestDisallowInterceptTouchEvent(false);

                radius = 1;
                endRadius = Math.max(Math.max(Math.max(width - rippleX, rippleX), rippleY), height - rippleY);
                speed = endRadius / duration * frameRate;
                handler.postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        if(radius &amp;lt; endRadius)
                        {
                            radius += speed;
                            paint.setAlpha(90 - (int) (radius / endRadius * 90));
                            handler.postDelayed(this, frameRate);
                        }
                        else if(getChildAt(0) != null)
                        {
                            getChildAt(0).performClick();
                        }
                    }
                }, frameRate);
                break;
            }
            case MotionEvent.ACTION_CANCEL:
            {
                getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }
            case MotionEvent.ACTION_DOWN:
            {
                getParent().requestDisallowInterceptTouchEvent(true);
                endRadius = Math.max(Math.max(Math.max(width - rippleX, rippleX), rippleY), height - rippleY);
                paint.setAlpha(90);
                radius = endRadius/3;
                invalidate();
                return true;
            }
            case MotionEvent.ACTION_MOVE:
            {
                if(rippleX &amp;lt; 0 || rippleX &amp;gt; width || rippleY &amp;lt; 0 || rippleY &amp;gt; height)
                {
                    getParent().requestDisallowInterceptTouchEvent(false);
                    touchAction = MotionEvent.ACTION_CANCEL;
                    break;
                }
                else
                {
                    invalidate();
                    return true;
                }
            }
        }
        invalidate();
        return false;
    }

    @Override
    public final void addView(@NonNull View child, int index, ViewGroup.LayoutParams params)
    {
        //limit one view
        if (getChildCount() &amp;gt; 0)
        {
            throw new IllegalStateException(this.getClass().toString()+&quot; can only have one child.&quot;);
        }
        super.addView(child, index, params);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 정의 배경이 있는 경우가 있습니다. 이 경우 더 나은 솔루션을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;android:foreground=&quot;?selectableItemBackground&quot;&lt;/code&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;갱신하다&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둥근 모서리와 사용자 정의 배경으로 리플 효과를 원하는 경우 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;background_ ripple.xml&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;ripple xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; android:color=&quot;@color/ripple_color&quot;&amp;gt;
&amp;lt;item android:id=&quot;@android:id/mask&quot;&amp;gt;
    &amp;lt;shape android:shape=&quot;rectangle&quot;&amp;gt;
        &amp;lt;solid android:color=&quot;@android:color/white&quot; /&amp;gt;
        &amp;lt;corners android:radius=&quot;5dp&quot; /&amp;gt;
    &amp;lt;/shape&amp;gt;
&amp;lt;/item&amp;gt;

&amp;lt;item android:id=&quot;@android:id/background&quot;&amp;gt;
    &amp;lt;shape android:shape=&quot;rectangle&quot;&amp;gt;
        &amp;lt;solid android:color=&quot;@android:color/white&quot; /&amp;gt;
        &amp;lt;corners android:radius=&quot;5dp&quot; /&amp;gt;
    &amp;lt;/shape&amp;gt;
&amp;lt;/item&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;layout.xml&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Button
    android:id=&quot;@+id/btn_play&quot;
    android:background=&quot;@drawable/background_ripple&quot;
    app:backgroundTint=&quot;@color/colorPrimary&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:text=&quot;@string/play_now&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API &amp;gt;= 21에서 사용하였습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아주 간단해요 ;-)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 오래된 api 버전과 최신 api 버전의 api 버전의 drawable 파일을 두 개 만들어야 합니다. 물론이죠! 최신 api 버전 안드로이드 스튜디오의 drawable 파일을 생성하면 오래된 api 버전을 자동으로 생성할 것을 제안하고 마지막으로 이 drawable을 배경 뷰로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 api 버전(res/drawable-v21/ripple.xml)에 대해 그릴 수 있는 샘플:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;ripple xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:color=&quot;?android:colorControlHighlight&quot;&amp;gt;
    &amp;lt;item&amp;gt;
        &amp;lt;shape android:shape=&quot;rectangle&quot;&amp;gt;
            &amp;lt;solid android:color=&quot;@color/colorPrimary&quot; /&amp;gt;
            &amp;lt;corners android:radius=&quot;@dimen/round_corner&quot; /&amp;gt;
        &amp;lt;/shape&amp;gt;
    &amp;lt;/item&amp;gt;
&amp;lt;/ripple&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 api 버전(res/drawable/ripple.xml)에 대해 그릴 수 있는 샘플&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:shape=&quot;rectangle&quot;&amp;gt;
    &amp;lt;solid android:color=&quot;@color/colorPrimary&quot; /&amp;gt;
    &amp;lt;corners android:radius=&quot;@dimen/round_corner&quot; /&amp;gt;
&amp;lt;/shape&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리플 뽑기 가능한 것에 대한 자세한 정보는 여기를 방문하세요: https://developer.android.com/reference/android/graphics/drawable/RippleDrawable.html&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때로는 이 선을 모든 레이아웃이나 구성요소에 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; android:background=&quot;?attr/selectableItemBackground&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들면.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;RelativeLayout
                android:id=&quot;@+id/relative_ticket_checkin&quot;
                android:layout_width=&quot;match_parent&quot;
                android:layout_height=&quot;match_parent&quot;
                android:layout_weight=&quot;1&quot;
                android:background=&quot;?attr/selectableItemBackground&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/26604134/how-to-achieve-ripple-animation-using-support-library&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>android</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/557</guid>
      <comments>https://cafebook.tistory.com/557#entry557comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:17:46 +0900</pubDate>
    </item>
    <item>
      <title>Swagger / springfox 자동으로 응답 예제 생성</title>
      <link>https://cafebook.tistory.com/556</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swagger / springfox 자동으로 응답 예제 생성&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 springfox 2.9.2를 사용하여 swagger에서 만든 API를 문서화하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 이미지와 같이 문서에 예제 응답을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/0U9VG.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/0U9VG.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이와 비슷한 일을 할 수 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ApiResponses(value = {
    @ApiResponse(code = 200, message = &quot;Success&quot;, 
            examples = @io.swagger.annotations.Example(
                value = {
                    @ExampleProperty(value = &quot;{'snapshot'：{'type': 'AAA'}}&quot;, mediaType = &quot;application/json&quot;) 
                }))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드 조각을 바로 위에 배치합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GET&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우의 방법.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불행히도 위의 두 예는 항상 보여집니다: 식별자 예상 오류입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저도 할 수 있다는 것을 압니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ApiResponses(value = {
    ApiResponse(code = 200, message = &quot;Success&quot;, response = MyModel.class,
    )
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 예를 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@ApiOperation&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;레벨:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ApiOperation(value = &quot;Create a Account&quot;, nickname = &quot;createAccount&quot;, notes = &quot;Create a account&quot;, response = AccountResponse.class, tags={  })
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 질문은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스웨거 설명서에 JSON 응답 예제를 추가하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swagger/Springfox를 제 모델/bean에 포인트하여 자동으로 예제 응답을 생성하고, bean/model에 대한 각 업데이트로 자동 업데이트하는 것이 이상적입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 두 번째 코드 조각은 이렇게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;dto: 주석을 사용하여 예제를 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ApiModel(&quot;Crop&quot;)
public class CropDto {

    @ApiModelProperty(name = &quot;Unique guid&quot;, position = 1, example = &quot;7aaee0e2-6884-4fd7-ba63-21d76723dce2&quot;)
    public UUID id;
    @ApiModelProperty(name = &quot;Unique code&quot;, position = 2, example = &quot;squ&quot;)
    public String code;
    @ApiModelProperty(name = &quot;Unique name&quot;, position = 3, example = &quot;Squash&quot;)
    public String name;
    @ApiModelProperty(position = 4, example = &quot;Cucurbita pepo L.&quot;)
    public String description;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/53617466/swagger-springfox-generating-response-example-automatically&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/556</guid>
      <comments>https://cafebook.tistory.com/556#entry556comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:17:32 +0900</pubDate>
    </item>
    <item>
      <title>응용 프로그램 개발자가 저지른 데이터베이스 개발 실수</title>
      <link>https://cafebook.tistory.com/555</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;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item mr8&quot;&gt; 
     &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
      &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
     &lt;/svg&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 상태로는 이 질문은 우리의 Q&amp;amp;A 형식에 맞지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 참고 자료 또는 전문 지식에 의해 답변이 뒷받침되기를 기대하지만, 이 질문은 토론, 주장, 여론 조사 또는 토론을 요청할 가능성이 높습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 이 질문이 개선되고 다시 열릴 수 있다고 생각한다면,&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;안내&lt;/a&gt;를 받기 위해 헬프 &lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;센터를 방문&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;      &lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;닫힘&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;2-1&quot; title=&quot;2011-10-05 01:06:55Z&quot; papago-attr-id=&quot;1&quot;&gt;11년 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item mr8&quot;&gt; 
     &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLock&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
      &lt;path d=&quot;M16 9a2 2 0 0 0-2-2V6A5 5 0 0 0 4 6v1a2 2 0 0 0-2 2v6c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V9Zm-7 5a2 2 0 1 1 0-4 2 2 0 0 1 0 4Zm3.1-7H5.9V6a3.1 3.1 0 0 1 6.2 0v1Z&quot;&gt;&lt;/path&gt;
     &lt;/svg&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div papago-id=&quot;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;b papago-id=&quot;3-1&quot;&gt;잠겼습니다&lt;/b&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문과 그에 대한 답은.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문이 &lt;a href=&quot;/help/locked-posts&quot; papago-id=&quot;3-3&quot;&gt;topic&lt;/a&gt;을 벗어났지만 역사적 &lt;a href=&quot;/help/locked-posts&quot; papago-id=&quot;3-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;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션 개발자들이 흔히 저지르는 데이터베이스 개발 실수는 무엇입니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1. 적절한 지수를 사용하지 않음&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 비교적 쉬운 일이지만 여전히 항상 일어납니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외국 키에는 인덱스가 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필드를 사용하는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WHERE&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;당신은 probably에 색인을 달아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2. 참조 무결성을 적용하지 않음&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스는 여기서 다를 수 있지만 데이터베이스가 참조 무결성(모든 외부 키가 존재하는 엔티티를 가리킬 수 있음)을 지원하는 경우에는 이를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 데이터베이스에서 이러한 장애가 발생하는 것은 매우 일반적인 일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 제 ISAM이 그걸 지지한다고 생각하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;InnoDB는 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MyISAM을 사용하는 사람이나 InnoDB를 사용하지만 사용하지 않는 사람을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/382309/how-important-are-constraints-like-not-null-and-foreign-key-if-ill-always-contr&quot; papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 입력을 항상 php로 제어하려면 NOT NULL 및 FORINE KEY와 같은 제약 조건이 얼마나 중요합니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/18717/are-foreign-keys-really-necessary-in-a-database-design&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;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.diovo.com/2008/08/are-foreign-keys-really-necessary-in-a-database-design/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 설계에서 외국 키가 정말 필요합니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3. 대리(기술) 기본 키가 아닌 자연스러운 키 사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;이는 순수하게 엔티티를 식별하기 위해 개발되었으며 일반적으로 자동 증가 필드(SQL Server, MySQL 등) 또는 시퀀스(특히 Oracle)입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 생각에 당신은 &lt;strong papago-id=&quot;17-1&quot;&gt;항상&lt;/strong&gt; 대리 키를 사용해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 다음과 같은 질문에 제기됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/404040/how-do-you-like-your-primary-keys&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 키는 어떻게 하시겠어요?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/337503/whats-the-best-practice-for-primary-keys-in-tables&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블에서 기본 키를 사용하는 가장 좋은 방법은 무엇입니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/506164/which-format-of-primary-key-would-you-use-in-this-situation&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 어떤 형식의 기본 키를 사용하시겠습니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/63090/surrogate-vs-natural-business-keys&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;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/166750/should-i-have-a-dedicated-primary-key-field&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전용 기본 키 필드가 있어야 합니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;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;font class=&quot;papago-parent&quot;&gt;그것은 저에게 물어보시면 아주 작은 단점입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;심지어 &lt;a href=&quot;http://en.wikipedia.org/wiki/ISO_3166-1&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-1&quot;&gt;국가들도 존재&lt;/a&gt;하지 않을 수 있다는 것을 기억하세요 (예: 유고슬라비아).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&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;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;DISTINCT&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;/strong&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;ORM 생성 쿼리에서 종종 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Hibernate에서 로그 출력을 보면 다음으로 시작하는 모든 쿼리가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT DISTINCT ...
&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;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 중복된 행을 반환하지 않고 중복된 개체를 얻을 수 있도록 보장하는 약간의 지름길입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가끔 이런 사람들도 볼 수 있을 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;너무 많이 보면 진짜 빨간 깃발입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그거 말고요&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DISTINCT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나쁘거나 유효한 응용 프로그램이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://weblogs.sqlteam.com/markc/archive/2008/11/11/60752.aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;30-1&quot;&gt;내가 DISTINCT를 싫어하는 이유&lt;/a&gt;:&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;제 생각에 일이 잘못되기 시작한 것은 개발자가 상당한 쿼리를 만들고 테이블을 결합하고 있는데 갑자기 자신이 중복(또는 더 많은) 행을 얻고 있는 것처럼 &lt;strong papago-id=&quot;31-1&quot;&gt;보인다는&lt;/strong&gt; 것을 깨닫고 즉각적인 응답을 할 때입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &quot;문제&quot;에 대한 그의 &quot;해결책&quot;은 DISTINCT 키워드를 사용하여 모든 문제를 &lt;strong papago-id=&quot;31-3&quot;&gt;해결&lt;/strong&gt;하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;5. 조인보다 집계 선호&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 애플리케이션 개발자들이 흔히 저지르는 또 다른 실수는 얼마나 많은 비용이 드는 집계(즉,&lt;/font&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;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;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;예를 들어,&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;a href=&quot;https://stackoverflow.com/questions/477006/sql-statement-join-vs-group-by-and-having/477013#477013&quot; papago-id=&quot;36-1&quot;&gt;SQL 문에서 -&lt;/a&gt; &lt;a href=&quot;https://stackoverflow.com/questions/477006/sql-statement-join-vs-group-by-and-having/477013#477013&quot; papago-id=&quot;36-1&quot;&gt;&quot;참여&quot; vs &quot;그룹별&lt;/a&gt; 및 보유&lt;a href=&quot;https://stackoverflow.com/questions/477006/sql-statement-join-vs-group-by-and-having/477013#477013&quot; papago-id=&quot;36-1&quot;&gt;&quot;:&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;SELECT userid
FROM userrole
WHERE roleid IN (1, 2, 3)
GROUP by userid
HAVING COUNT(1) = 3
&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;쿼리 시간: 0.312초&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;pre&gt;&lt;code&gt;SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2
JOIN userrole t3 ON t2.userid = t3.userid AND t3.roleid = 3
AND t1.roleid = 1
&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;쿼리 시간: 0.016초&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;제가 제안한 join 버전은 &lt;strong papago-id=&quot;41-1&quot;&gt;aggregate 버전보다 20배 빠릅니다.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;6. 보기를 통해 복잡한 쿼리를 단순화하지 않음&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 데이터베이스 공급업체가 보기를 지원하는 것은 아니지만, 보기를 지원하는 공급업체의 경우 신중하게 사용할 경우 쿼리를 크게 단순화할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 한 프로젝트에서 일반적인 &lt;a href=&quot;http://www.tdan.com/view-articles/5014/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;43-1&quot;&gt;파티 모델&lt;/a&gt;을 CRM에 사용했습니다.&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;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;44-0&quot;&gt;파티&lt;/strong&gt;: 사람들과 조직;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;45-0&quot;&gt;당사자 역할&lt;/strong&gt;: 당사자가 수행한 작업(예: 종업원 및 고용주)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;46-0&quot;&gt;당사자 역할 관계&lt;/strong&gt;: 해당 역할들이 서로 어떻게 연관되어 있는지.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테드는 당의 하위 유형인 사람입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테드는 많은 역할을 맡았고, 그 중 하나가 직원입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인텔은 당사자의 하위 유형인 조직입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Intel에는 여러 역할이 있으며 그 중 하나가 고용주입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인텔은 테드를 고용하고 있는데, 이는 각자의 역할 사이에 관계가 있다는 것을 의미합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 테드를 고용주와 연결하기 위해 5개의 테이블이 결합되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 직원을 조직이 아닌 개인으로 가정하고 다음과 같은 도우미 보기를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE VIEW vw_employee AS
SELECT p.title, p.given_names, p.surname, p.date_of_birth, p2.party_name employer_name
FROM person p
JOIN party py ON py.id = p.id
JOIN party_role child ON p.id = child.party_id
JOIN party_role_relationship prr ON child.id = prr.child_id AND prr.type = 'EMPLOYMENT'
JOIN party_role parent ON parent.id = prr.parent_id = parent.id
JOIN party p2 ON parent.party_id = p2.id
&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;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;7. 입력을 검사하지 않음&lt;/font&gt;&lt;/strong&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;font class=&quot;papago-parent&quot;&gt;지금은 PHP를 좋아하지만 무엇을 하고 있는지 모르면 공격에 취약한 사이트를 만드는 것은 정말 쉽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://xkcd.com/327/&quot; papago-id=&quot;56-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;작은 바비&lt;/a&gt; 테이블스의 &lt;a href=&quot;http://xkcd.com/327/&quot; papago-id=&quot;56-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이야기&lt;/a&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;URL, 양식 데이터 및&lt;strong papago-id=&quot;57-1&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;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;8. 준비된 명세서 미사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;준비된 문은 쿼리를 컴파일할 때 삽입, 업데이트 및&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WHERE&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 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;SELECT * FROM users WHERE username = 'bob'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM users WHERE username = ?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM users WHERE username = :username
&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;p papago-id=&quot;64&quot; papago-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;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;또한 준비된 문은 SQL 주입 공격으로부터 보다 효과적으로 보호할 수 있습니다.&lt;/font&gt;&lt;/p&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;9. 정규화가 충분하지 않음&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;a href=&quot;http://en.wikipedia.org/wiki/Database_normalization&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;68-0&quot;&gt;데이터베이스 정규화&lt;/a&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;정규화는 해당 배열의 요소를 하위 테이블의 별도 행(즉, 일대일 관계)으로 처리하는 것입니다.&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;&lt;a href=&quot;https://stackoverflow.com/questions/620645/best-method-for-storing-a-list-of-user-ids&quot; papago-id=&quot;70-1&quot;&gt;이는 사용자&lt;/a&gt; ID &lt;a href=&quot;https://stackoverflow.com/questions/620645/best-method-for-storing-a-list-of-user-ids&quot; papago-id=&quot;70-1&quot;&gt;목록&lt;/a&gt;을 저장하는 &lt;a href=&quot;https://stackoverflow.com/questions/620645/best-method-for-storing-a-list-of-user-ids&quot; papago-id=&quot;70-1&quot;&gt;최상의 방법&lt;/a&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;다른 시스템에서는 리스트가 직렬 PHP 배열로 저장되어 있는 것을 보았습니다.&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;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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.techrepublic.com/article/normalization-how-far-is-far-enough/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;74&quot; papago-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;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.sqlmag.com/Article/ArticleID/4887/sql_server_4887.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL by Design:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 정규화가 필요한 이유&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;10. 정규화가 너무 심합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 이전의 점과 모순되는 것처럼 보일 수 있지만, 정상화는 많은 것들과 마찬가지로 도구입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 목적을 위한 수단이지 그 자체가 목적이 아닙니다.&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;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;Licensee -&amp;gt;  Dealer Group -&amp;gt; Company -&amp;gt; Practice -&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;의미 있는 데이터를 얻기 전에 약 11개의 테이블을 함께 결합해야 합니다.&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;더 중요한 것은 신중하고 고려된 비규격화는 엄청난 성능상의 이점을 가져올 수 있지만 이를 수행할 때는 정말 조심해야 합니다.&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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.selikoff.net/blog/2008/11/19/why-too-much-database-normalization-can-be-a-bad-thing/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 정규화를 너무 많이 하는 것이 좋지 않은 이유&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/496508/how-far-to-take-normalization-in-database-design&quot; papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 설계의 정규화는 어디까지 진행해야 합니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.25hoursaday.com/weblog/CommentView.aspx?guid=cc0e740c-a828-4b9d-b244-4ee96e2fad4b&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 데이터베이스를 정규화하지 않을 때&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.codinghorror.com/maybe-normalizing-isnt-normal/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정상화가 정상이 아닐 수도 있습니다.&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://highscalability.com/mother-all-database-normalization-debates-coding-horror&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코딩 공포에 관한 모든 데이터베이스 정규화 논쟁의 어머니&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;11. 배타적 호 사용&lt;/font&gt;&lt;/strong&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;배타적 호(exclusive arc)는 두 개 이상의 외래 키를 사용하여 테이블을 만드는 일반적인 실수이며, 하나만 null이 아닐 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;88-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;결국 참조 무결성이 있더라도 이들 외부 키 중 2개 이상을 설정하는 것을 방해하는 것은 없습니다(복잡한 점검 제약에도 불구하고).&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;&lt;a href=&quot;http://books.google.com.au/books?id=7ZAk0YiKQV0C&amp;amp;pg=PA110&amp;amp;lpg=PA110&amp;amp;dq=%22exclusive+arc%22+database&amp;amp;source=bl&amp;amp;ots=AyNPWsac__&amp;amp;sig=gBFIerXckQlVpRdd6ycI5JEgq3U&amp;amp;hl=en&amp;amp;ei=PzGzSZfrFcPVkAWWyZDZBA&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=1&amp;amp;ct=result&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;89-1&quot;&gt;관계형 데이터베이스 설계에 대한 실용적 가이드&lt;/a&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;/blockquote&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;12. 쿼리에 대한 성능 분석을 전혀 수행하지 않음&lt;/font&gt;&lt;/strong&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;특히 데이터베이스 세계에서는 실용주의가 압도적입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;원칙이 독단적인 것이 될 정도로 원칙을 고수하고 있다면 아마도 실수를 했을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에서 집계 쿼리의 예를 들어 보겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;애그리게이트 버전은 &quot;멋져 보일 수 있지만 성능은 형편없습니다.&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;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;13. UNION ALL, 특히 UNION 건설에 대한 과도한 의존&lt;/font&gt;&lt;/strong&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;SQL 용어의 UNION은 일치하는 데이터 집합을 연결할 뿐이며, 이는 데이터 집합의 유형과 열의 개수가 동일하다는 것을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들 사이의 차이점은 UNION ALL은 단순한 연결이고 가능한 한 선호되어야 하는 반면 UNION은 암묵적으로 중복 튜플을 제거하기 위해 DISTINCT를 할 것이라는 것입니다.&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;UNION은 DISTINCT와 마찬가지로 각자의 자리를 가지고 있습니다.&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;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UNION은 특히 조인 또는 종속 하위 쿼리에 사용될 경우 데이터베이스를 손상시킬 수 있습니다.&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;97&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;14. 쿼리에서 OR 조건 사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;98&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무해한 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 AND는 괜찮습니다.&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;기본적으로 AND 조건은 데이터 세트를 &lt;strong papago-id=&quot;98-1&quot;&gt;제한&lt;/strong&gt;하는 반면 OR 조건은 데이터 세트를 &lt;strong papago-id=&quot;98-3&quot;&gt;성장&lt;/strong&gt;시키지만 최적화에 도움이 되는 방식은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 다른 OR 조건이 교차할 수 있는 경우, 최적화기가 결과에 대해 효과적으로 DISTINCT 연산을 수행하도록 강요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;99&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나쁨:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;... WHERE a = 2 OR a = 5 OR a = 11
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 정보:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;... WHERE a IN (2, 5, 11)
&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;이제 SQL Optimizer는 첫 번째 쿼리를 두 번째 쿼리로 효과적으로 변환할 수 있습니다.&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;102&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;15. 고성능 솔루션을 제공하도록 데이터 모델을 설계하지 않음&lt;/font&gt;&lt;/strong&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;font class=&quot;papago-parent&quot;&gt;일반적으로 효과에 따라 관찰됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;비교적 간단한 작업에 대해 쿼리를 거의 작성하지 않거나 비교적 간단한 정보를 찾기 위한 쿼리가 효율적이지 않다는 것을 알게 되면 데이터 모델이 좋지 않을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 면에서는 이 점이 이전의 모든 것을 요약하지만 쿼리 최적화와 같은 작업을 수행하는 것은 종종 두 번째 작업을 수행해야 할 때 먼저 수행된다는 점에서 주의해야 할 사항에 가깝습니다.&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;105&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;strong papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;16. 데이터베이스 트랜잭션의 잘못된 사용&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 공정에 대한 모든 데이터 변경은 원자 단위여야 합니다.&lt;/font&gt;&lt;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;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이상적으로, 이를 달성하기 위한 가장 간단한 방법은 전체 시스템 설계가 단일 INSERT/UPDATE/DEELETE 문을 통해 모든 데이터 변경을 지원하기 위해 노력해야 하는 것입니다.&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;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;110&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;111&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;112&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류가 발생하면 트랜잭션을 롤백합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 아주 NB!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 후에 이어지는 모든 문장을 생략/중단하는 것을 잊지 마십시오.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;113&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;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;17. '집합 기반' 패러다임을 이해하지 못함&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;115&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 언어는 특정 유형의 문제에 적합한 특정 패러다임을 따릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다양한 벤더별 확장에도 불구하고, 이 언어는 자바, C#, 델파이 등과 같은 언어에서 사소한 문제들을 다루기가 어렵습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 이해의 부족은 몇 가지 방식으로 드러납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스에 너무 많은 절차적 또는 명령적 논리를 부과하는 것은 부적절합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;118&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;커서의 부적절하거나 과도한 사용.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 질문 하나면 충분할 때.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;119&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;120&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;121&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개발자의 주요 데이터베이스 설계 및 프로그래밍 오류&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;122&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;122-0&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;font class=&quot;papago-parent&quot;&gt;데이터베이스 설계와 데이터 무결성이 열악하기 때문에 제3자가 데이터를 처리하는 것이 어려워지고 시스템의 수명 주기 비용이 크게 증가할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;보고 및 MIS는 애플리케이션 설계에 있어서 서투른 사촌으로 간주되는 경향이 있으며, 사후적으로 수행될 뿐입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;123&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;123-0&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;font class=&quot;papago-parent&quot;&gt;쿼리에 조인을 추가하고 싶지 않다고 해서 정규화를 취소할 수는 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;124&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;124-0&quot;&gt;SQL 작성이 두렵습니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL은 로켓 과학이 아니며 실제로 업무를 잘 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;O/R 매핑 계층은 단순하고 해당 모델에 잘 맞는 쿼리의 95%를 매우 잘 수행합니다.&lt;/font&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;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;125-0&quot;&gt;독단적 '저장 프로시저 없음' 정책.&lt;/strong&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;126&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;126-0&quot;&gt;데이터베이스 설계를 이해할 수 없습니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정상화는 당신의 친구이며 &lt;a href=&quot;https://stackoverflow.com/questions/246701/what-is-normalisation-or-normalization-why-is-it-important/246775#246775&quot; papago-id=&quot;126-2&quot;&gt;로켓 과학이 아닙니다.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가입과 카디널리티는 상당히 단순한 개념입니다. 데이터베이스 애플리케이션 개발에 참여한다면 이해하지 못할 이유가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;127&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;128&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;129&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;130&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확장성 테스트 실패... 단지 3~4개 행의 테스트 데이터만으로는 실제 실시간 성능의 실제 그림을 얻을 수 없습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;131&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;132&quot; papago-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;133&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장 프로시저는 어떤 실제 기술적 요소가 성능 및 보안과 같은 용도를 필요로 한다는 것이 실제로 입증된 경우에 유용합니다. 예를 들어, 대용량 데이터 세트의 집계/필터링을 &quot;데이터에 가깝게&quot; 유지하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;134&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근 비즈니스 로직 및 규칙의 70%가 1400개의 SQL Server 저장 프로시저(나머지는 UI 이벤트 핸들러)에 구현된 대규모 델파이 데스크톱 애플리케이션을 유지 및 개선해야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 주로 TSQL에 효과적인 장치 테스트를 도입하기 어려웠으며 캡슐화 기능이 부족하고 툴(디버거, 편집기)이 열악했기 때문에 악몽과도 같았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;135&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;과거에 Java 팀과 함께 작업하면서 종종 완전히 반대의 상황이 해당 환경에 존재한다는 사실을 빠르게 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바 아키텍트는 &quot;데이터베이스는 데이터를 위한 것이지 코드를 위한 것이 아니다&quot;라고 말한 적이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;136&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요즘 저는 저장된 proc를 전혀 고려하지 않는 것이 실수라고 생각하지만, 유용한 이점을 제공하는 상황에서는 기본적으로 사용하지 않아야 합니다(다른 답변 참조).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;137&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1번 문제?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 장난감 데이터베이스에서만 시험을 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 데이터베이스가 커지면 SQL이 크롤링되어 나중에 누군가가 와서 수정해야 한다는 사실을 전혀 알지 못합니다(이 소리는 제 이를 가는 소리입니다).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;138&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스를 사용하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;139&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;140&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상관된 하위 쿼리를 피하기 위해 대부분의 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하위 쿼리 내에 외부 쿼리의 열에 대한 참조가 있는 경우 하위 쿼리는 상관 관계에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 반환되는 각 행에 대해 최소 한 번 이상 서브쿼리가 실행되며 상관된 서브쿼리를 포함하는 조건이 적용된 후 다른 조건이 적용되면 더 많이 실행될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;141&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 작위적인 예와 Oracle 구문은 용서하십시오. 하지만 마지막으로 해당 매장에서 하루에 1만 달러 미만의 매출을 올린 이후로 모든 직원을 고용하고 싶었다고 가정해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select e.first_name, e.last_name
from employee e
where e.start_date &amp;gt; 
        (select max(ds.transaction_date)
         from daily_sales ds
         where ds.store_id = e.store_id and
               ds.total &amp;lt; 10000)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;142&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예제의 하위 쿼리는 store_id에 의해 외부 쿼리와 연관되며 시스템의 모든 직원에 대해 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 쿼리를 최적화할 수 있는 한 가지 방법은 하위 쿼리를 인라인 뷰로 이동하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select e.first_name, e.last_name
from employee e,
     (select ds.store_id,
             max(s.transaction_date) transaction_date
      from daily_sales ds
      where ds.total &amp;lt; 10000
      group by s.store_id) dsx
where e.store_id = dsx.store_id and
      e.start_date &amp;gt; dsx.transaction_date
&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;이 예제에서 from 절의 쿼리는 이제 인라인 뷰(일부 Oracle 특정 구문도 있음)가 되어 한 번만 실행됩니다.&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;직원이 거의 없고 많은 상점(그리고 아마도 많은 상점에 직원이 없을 수도 있음)이 있고 daily_sales 테이블이 store_id에 색인화되어 있다면 첫 번째 쿼리는 실제로 더 나은 성능을 발휘할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 가능성이 높은 시나리오는 아니지만 상관된 쿼리가 대안보다 더 나은 성능을 발휘할 수 있는 방법을 보여줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;144&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 후배 개발자들이 서브쿼리를 상관시키는 것을 여러 번 보아왔고, 그것은 대개 성능에 심각한 영향을 미쳤습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 상관 관계가 있는 하위 쿼리를 제거할 때는 성능이 저하되지 않도록 설명 &lt;a href=&quot;http://en.wikipedia.org/wiki/Query_plan&quot; rel=&quot;nofollow&quot; papago-id=&quot;144-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;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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;숙련된 DBA와 소통하지 않음.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt;&lt;p papago-id=&quot;147&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;a href=&quot;http://www.microsoft.com/express/sql/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;147-1&quot;&gt;SQL Express&lt;/a&gt;, &lt;a href=&quot;http://www.mysql.org&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;147-3&quot;&gt;MySQL&lt;/a&gt; 및 &lt;a href=&quot;http://www.sqlite.org/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;147-5&quot;&gt;SQLite&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;148&quot; papago-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;149&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Excel을 사용하여 데이터를 저장(대량)합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;150&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수천 개의 행을 보유하고 여러 워크시트를 사용하는 회사를 본 적이 있습니다(이전 버전의 Excel에서 행 제한이 65535이기 때문에).&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;151&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Excel은 보고서, 데이터 프레젠테이션 및 기타 작업에 적합하지만 데이터베이스로 취급해서는 안 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;152&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 papago-id=&quot;153&quot; papago-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;성능은 데이터베이스 설계의 50%(데이터 무결성 40%, 보안 10%)라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;수행하기 위해 처음부터 구성되지 않은 데이터베이스는 실제 사용자와 실제 트래픽이 데이터베이스에 배치되면 성능이 저하됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;섣부른 최적화라고 해서 최적화가 불가능한 것은 아닙니다!&lt;/font&gt;&lt;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;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;a href=&quot;http://en.wikipedia.org/wiki/SQL_injection&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;154-1&quot;&gt;SQL 주입&lt;/a&gt;을 막는데 아주 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;155&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;156&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 개발자가 중첩 선택 문을 사용하거나 심지어 함수를 사용하여 쿼리의 &quot;SELECT&quot; 부분 안에 있는 선택 문의 결과를 반환하는 것을 싫어합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;157&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@adam과 비슷한 문제가 있음에도 불구하고 여기 다른 곳에서는 이것을 볼 수 없다는 것이 사실 놀랍습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;158&quot; papago-translate=&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
    (SELECT TOP 1 SomeValue FROM SomeTable WHERE SomeDate = c.Date ORDER BY SomeValue desc) As FirstVal
    ,(SELECT OtherValue FROM SomeOtherTable WHERE SomeOtherCriteria = c.Criteria) As SecondVal
FROM
    MyTable c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;159&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 시나리오에서 MyTable이 10000 행을 반환하면 각 결과 행에 대해 초기 쿼리와 다른 테이블 각각에 대해 한 번씩 쿼리를 실행해야 했기 때문에 쿼리가 방금 20001 쿼리를 실행한 것과 같습니다.&lt;/font&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;(꼭 완벽하지는 않지만) 더 좋은 예는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT
     s.SomeValue As FirstVal
    ,o.OtherValue As SecondVal
FROM
    MyTable c
    LEFT JOIN (
        SELECT SomeDate, MAX(SomeValue) as SomeValue
        FROM SomeTable 
        GROUP BY SomeDate
     ) s ON c.Date = s.SomeDate
    LEFT JOIN SomeOtherTable o ON c.Criteria = o.SomeOtherCriteria
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;162&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 데이터베이스 최적화자가 메인 테이블의 각 레코드에 있는 쿼리가 아니라 데이터를 함께 섞을 수 있게 해주며, 보통 이 문제가 발생한 코드를 수정해야 할 때 보통 쿼리 속도를 100% 이상 높이는 동시에 CPU와 메모리 사용량을 줄일 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;163&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 기반 데이터베이스의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;164&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;165&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상위/하위 테이블 관계에서 외부 키(INT)에 가입하기 위해 일련 번호(자동 번호) 데이터 유형을 기본 키로 사용하지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;166&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;167&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;168&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;트랜잭션 비율이 높은 대형 테이블에서 FRAMGATION ON EXPRANGETION(지원되는 경우)의 이점을 활용하지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;169&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;170&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;171&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;172&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;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능한 값이 거의 없는 열에 인덱스를 만들고 불필요한 인덱스를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 추가될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;ul&gt; 
 &lt;li&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;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;176&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장 프로시저에서 저장된 객체(예: 테이블, 뷰)에 DDL 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;177&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장된 프로시저를 사용하는 것에 대한 두려움 또는 ORM 쿼리를 사용하는 것이 더 효율적이거나 적절한 장소에 사용하는 것에 대한 두려움.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;178&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 프로파일러의 사용을 무시합니다. 데이터베이스 프로파일러는 ORM 쿼리가 최종적으로 무엇으로 변환되는지를 정확하게 알려주기 때문에 ORM을 사용하지 않을 때 로직을 확인하거나 디버깅을 위해 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&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://en.wikipedia.org/wiki/Database_normalization&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;179-1&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;em papago-id=&quot;179-3&quot;&gt;너무&lt;/em&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;데이터베이스를 단순한 저장 메커니즘(예: 미화된 컬렉션 라이브러리)으로 취급하여 애플리케이션에 종속(데이터를 공유하는 다른 애플리케이션 무시)&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li papago-id=&quot;181&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;너무 마법적이다&quot; 또는 &quot;내 &lt;strong papago-id=&quot;181-1&quot;&gt;데이터베이스&lt;/strong&gt;에 없다&quot;와 같은 이유로 Hibernate와 같은 ORM을 손에서 놓지 않는 것.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;182&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Hibernate와 같은 ORM에 너무 많이 의존하고 적절하지 않은 곳에서 신발을 신으려고 노력하는 것.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;183&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;183-0&quot;&gt;1 &lt;/strong&gt;- where 절의 값에 해당 인덱스를 사용하지 않는 결과 값에 함수를 불필요하게 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;184&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;where to_char(someDate,'YYYYMMDD') between :fromDate and :toDate
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;185&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;where someDate &amp;gt;= to_date(:fromDate,'YYYYMMDD') and someDate &amp;lt; to_date(:toDate,'YYYYMMDD')+1
&lt;/code&gt;&lt;/pre&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;함수 인덱스가 필요한 값에 함수 인덱스를 추가하지 않는 중...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;187&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;187-0&quot;&gt;2 &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;188&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;188-0&quot;&gt;3 &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;189&quot; papago-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;190&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;190-0&quot;&gt;4 &lt;/strong&gt;- 데이터베이스 자체에 대한 것은 아니지만 정말 짜증납니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL의 코드 품질은 신경쓰지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL이 텍스트로 표현된다는 사실만으로 문자열 조작 알고리즘에 논리를 숨겨도 되는 것은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동료 프로그래머가 실제로 읽을 수 있는 방식으로 텍스트로 SQL을 작성하는 것은 완벽하게 가능합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;191&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 이전에도 말했지만, &lt;strong papago-id=&quot;191-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;이를 위해서는 SQL이 지식을 작성하는 방식으로도 많은 것이 필요하지 않으며, 그 대가는 엄청납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;192&quot; papago-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;스키마가 너무 추상적이어서 DBA도 상황을 모를 때까지 스키마를 써드 노멀 폼으로 고문해야 한다는 말이 아닙니다.&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;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 마지막으로, 명확하고 일관되고 직관적인 명명 규칙을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 작성된 코드 조각을 읽어야 하는 것과 마찬가지로, 좋은 SQL 스키마 또는 쿼리를 읽을 수 있어야 하며 주석 없이도 실제로 수행 중인 작업을 &lt;em papago-id=&quot;14-1&quot;&gt;알려주어야&lt;/em&gt; 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;6개월 안에 테이블을 정비해야 할 때 스스로에게 감사하게 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;SELECT account_number, billing_date FROM national_accounts&quot;&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;SELECT ACCNTNBR, BILLDAT FROM NTNLACTS&quot;보다 훨씬 쉽게 작업할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;195&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DELETE 쿼리를 실행하기 전에(특히 프로덕션 데이터베이스에서) 해당 SELECT 쿼리를 실행하지 않음!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;196&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;20년 동안 내가 본 가장 흔한 실수는 미리 계획하지 않는 것입니다.&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;a) 쿼리 값을 문자열로 하드코딩&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;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;b) Windows Forms 응용프로그램의 &quot;OnButtonPress&quot; 수행에 데이터베이스 쿼리 코드 넣기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;199&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;200&quot; papago-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;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;201&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DBA 및 데이터 모델/디자이너라고 생각할 때, 해당 분야에 대한 공식적인 가르침이 전혀 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;202&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트가 단순하기 때문에 DBA가 필요 없다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;203&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스에서 수행해야 할 작업과 앱에서 수행해야 할 작업을 적절히 구분하지 못함&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;204&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;백업의 유효성을 검사하지 않거나 백업하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;205&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;/ol&gt;&lt;p papago-id=&quot;206&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Scott Walz의 '&lt;a href=&quot;http://www.slideshare.net/findling67/database-development-mistakes&quot; papago-id=&quot;206-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;고전 데이터베이스 개발&lt;/a&gt; 실수와 &lt;a href=&quot;http://www.slideshare.net/findling67/database-development-mistakes&quot; papago-id=&quot;206-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이&lt;/a&gt;를 극복하는 &lt;a href=&quot;http://www.slideshare.net/findling67/database-development-mistakes&quot; papago-id=&quot;206-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;5가지 방법&lt;/a&gt;'이라는 동영상 링크를 소개합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;207&quot; papago-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;strong papago-id=&quot;208&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DBMS가 후드 아래에서 어떻게 작동하는지 이해하지 못합니다.&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;209&quot; papago-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;210&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;211&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Clustered Index란 무엇인지 알고 계십니까?&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;212&quot; papago-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;커버링 인덱스(Covering Index)가 무엇인지 아나요?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;213&quot; papago-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;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;214&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL에서 EXPLAINE을 사용해 본 적이 있습니까?&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;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;215&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리 캐시를 이해하십니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무엇이 쿼리를 연결할 수 없게 만드는지 아나요?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;216&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마이 아이샘을 사용하고 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전문적인 검색이 필요하다면, 어쨌든 내 ISAM은 엉망진창입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스핑크스를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 Inno로 바꿉니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;217&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ORM을 사용하여 대량 업데이트 수행&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;218&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요 이상의 데이터를 선택합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 말하지만, 일반적으로 ORM을 사용할 때 수행됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;219&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sqls를 고리로 발사합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;220&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;221&quot; papago-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/621884/database-development-mistakes-made-by-application-developers&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Database</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/555</guid>
      <comments>https://cafebook.tistory.com/555#entry555comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:51 +0900</pubDate>
    </item>
    <item>
      <title>angular2 특정 요소에서 수동으로 발사 클릭 이벤트</title>
      <link>https://cafebook.tistory.com/554</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angular2 특정 요소에서 수동으로 발사 클릭 이벤트&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;클릭 이벤트(또는 다른 이벤트)를 프로그래밍 방식으로 요소에서 실행하려고 합니다. 즉 angular2의 jQuery .trigger() 메서드에서 제공하는 유사한 기능을 알고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&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;/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;&amp;lt;form [ngFormModel]=&quot;imgUploadFrm&quot;
          (ngSubmit)=&quot;onSubmit(imgUploadFrm)&quot;&amp;gt;
        &amp;lt;br&amp;gt;
        &amp;lt;div class=&quot;input-field&quot;&amp;gt;
            &amp;lt;input type=&quot;file&quot; id=&quot;imgFile&quot; (click)=&quot;onChange($event)&quot; &amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;button id=&quot;btnAdd&quot; type=&quot;submit&quot; (click)=&quot;showImageBrowseDlg()&quot; )&amp;gt;Add Picture&amp;lt;/button&amp;gt;
 &amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 사용자가 &lt;strong papago-id=&quot;4-1&quot;&gt;btnAdd&lt;/strong&gt;를 클릭하면 &lt;strong papago-id=&quot;4-3&quot;&gt;imgFile&lt;/strong&gt;에서 클릭 이벤트가 발생합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각4&lt;/font&gt;&lt;/strong&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-ts prettyprint-override&quot;&gt;&lt;code&gt;    this.renderer.invokeElementMethod(
        this.fileInput.nativeElement, 'dispatchEvent', [event]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하다&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-ts prettyprint-override&quot;&gt;&lt;code&gt;    this.fileInput.nativeElement.dispatchEvent(event);
&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;invokeElementMethod&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&gt;&lt;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각2&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿 변수와 함께 &lt;a href=&quot;https://angular.io/docs/ts/latest/api/core/ViewChild-var.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;ViewChild&lt;/a&gt;를 사용하여 파일 입력에 대한 참조를 가져온 다음 &lt;a href=&quot;https://angular.io/docs/ts/latest/api/core/Renderer-class.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-3&quot;&gt;렌더러&lt;/a&gt;를 사용하여 호출&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dispatchEvent&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 class=&quot;lang-ts prettyprint-override&quot;&gt;&lt;code&gt;import { Component, Renderer, ElementRef, ViewChild } from '@angular/core';
@Component({
  ...
  template: `
...
&amp;lt;input #fileInput type=&quot;file&quot; id=&quot;imgFile&quot; (click)=&quot;onChange($event)&quot; &amp;gt;
...`
})
class MyComponent {
  @ViewChild('fileInput') fileInput:ElementRef;

  constructor(private renderer:Renderer) {}

  showImageBrowseDlg() {
    // from http://stackoverflow.com/a/32010791/217408
    let event = new MouseEvent('click', {bubbles: true});
    this.renderer.invokeElementMethod(
        this.fileInput.nativeElement, 'dispatchEvent', [event]);
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갱신하다&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular team에 의해 직접적인 DOM 접근이 더 이상 방해받지 않기 때문에 이 간단한 코드도 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-ts prettyprint-override&quot;&gt;&lt;code&gt;this.fileInput.nativeElement.click()
&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;https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent 도 참조&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;strong papago-id=&quot;6-1&quot;&gt;파일 입력 컨트롤&lt;/strong&gt;이 있는 경우에도 비슷한 기능을 원했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display:none&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-3&quot;&gt;제어&lt;/em&gt;의 클릭 &lt;em papago-id=&quot;7-3&quot;&gt;이벤트&lt;/em&gt;를 트리거하고 싶었던 &lt;strong papago-id=&quot;7-1&quot;&gt;버튼 컨트롤&lt;/strong&gt;, 아래는 그렇게 하기 위한 코드입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;button&quot; (click)=&quot;fileInput.click()&quot; class=&quot;btn btn-primary&quot; value=&quot;Add From File&quot;&amp;gt;
&amp;lt;input type=&quot;file&quot; style=&quot;display:none;&quot; #fileInput/&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 정도로 간단하지만 완벽하게 작동하고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;button #loginButton ...
&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;@ViewChild('loginButton') loginButton;
...
this.loginButton.getNativeElement().click();
&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;ion-input&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 이걸 이용해서 ry.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ViewChild('fileInput', { read: ElementRef }) fileInput: ElementRef;
&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;this.fileInput.nativeElement.querySelector('input').click()
&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;showImageBrowseDlg() {
    // from http://stackoverflow.com/a/32010791/217408
    let event = new MouseEvent('click', {bubbles: true});
    event.stopPropagation();
    this.renderer.invokeElementMethod(
        this.fileInput.nativeElement, 'dispatchEvent', [event]);
  }
&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;제 경우에는 &quot;RangeError: Maximum Call Stack Size exceed&quot; 오류가 발생합니다. (클릭 시 div 카드가 발사되고 입력 파일이 내부에 있습니다.)&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;모방하려면 다음과 같이 DOM 요소를 클릭합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a (click)=&quot;showLogin($event)&quot;&amp;gt;login&amp;lt;/a&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;pre&gt;&lt;code&gt;&amp;lt;li ngbDropdown&amp;gt;
    &amp;lt;a ngbDropdownToggle id=&quot;login-menu&quot;&amp;gt;
        ...
    &amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
&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;component.ts&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&gt;&lt;code&gt;showLogin(event) {
   event.stopPropagation();
   document.getElementById('login-menu').click();
}
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36639486/angular2-manually-firing-click-event-on-particular-element&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Angular</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/554</guid>
      <comments>https://cafebook.tistory.com/554#entry554comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:38 +0900</pubDate>
    </item>
    <item>
      <title>hibernate 및 SQL에서 문자열 쿼리의 밑줄을 탈출하는 방법?</title>
      <link>https://cafebook.tistory.com/553</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;hibernate 및 SQL에서 문자열 쿼리의 밑줄을 탈출하는 방법?&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;_&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;SQL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리가 명예롭지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM employee WHERE NAME LIKE '%k_p%';
&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;k_p&lt;/code&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;SQL&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;Hibernate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;? 감사합니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;탈출을 시도해 보셨습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM employee WHERE NAME LIKE '%k\_p%';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;\_&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만이 아니라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;꽤 늦었지만 다른 프로그래머들에게는 해결책이 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해봐도 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM employee WHERE NAME LIKE '%k[_]p%';
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17102043/how-to-escape-underscore-in-the-string-query-in-hibernate-and-sql&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/553</guid>
      <comments>https://cafebook.tistory.com/553#entry553comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:31 +0900</pubDate>
    </item>
    <item>
      <title>WP_Query() - meta_query OR tax_query</title>
      <link>https://cafebook.tistory.com/552</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WP_Query() - meta_query OR tax_query&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;WP_Query&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;meta_query&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;tax_query&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키커는 두 조건이 모두 충족되는 결과(AND 조항)를 찾고 싶지 않다는 것입니다. 둘 중 하나 또는 다른 하나가 충족되는 조건(OR 조항)을 찾고 싶습니다.&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;$args = array(
    'meta_query' =&amp;gt; array(
        array(
            'key' =&amp;gt; 'some-meta',
            'value' =&amp;gt; 'some-value',
        )
    ),

    'tax_query' =&amp;gt; array(
        array(
            'taxonomy' =&amp;gt; 'some-taxonomy',
            'field' =&amp;gt; 'slug',
            'terms' =&amp;gt; array('some-term')
        )
    )
);
&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;WP_Query&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;pre&gt;&lt;code&gt;WHERE ( wp_term_relationships.term_taxonomy_id IN (336) ) 
    AND ( 
        (wp_postmeta.meta_key = 'some-meta' 
        AND CAST(wp_postmeta.meta_value AS CHAR) = 'some-value') 
    ) 
&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;WP_Query&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 AND를 OR로 바꿀 대상?&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;WHERE ( wp_term_relationships.term_taxonomy_id IN (336) ) 
    OR ( 
        (wp_postmeta.meta_key = 'some-meta' 
        AND CAST(wp_postmeta.meta_value AS CHAR) = 'some-value') 
    ) 
&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;WP_Query로는 이를 달성할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 쿼리를 수행해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/24743202/wp-query-meta-query-or-tax-query&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/552</guid>
      <comments>https://cafebook.tistory.com/552#entry552comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:25 +0900</pubDate>
    </item>
    <item>
      <title>16진수로 된 요소의 배경색 코드를 얻는 방법은?</title>
      <link>https://cafebook.tistory.com/551</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;16진수로 된 요소의 배경색 코드를 얻는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소의 배경색 코드를 얻으려면 어떻게 해야 합니까?&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;console.log($(&quot;.div&quot;).css(&quot;background-color&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/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div class=&quot;div&quot; style=&quot;background-color: #f5b405&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;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;pre&gt;&lt;code&gt;#f5b405
&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;아래 예제 링크를 확인하고 div를 클릭하면 색상 값이 16진수로 표시됩니다.&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 color = '';
$('div').click(function() {
  var x = $(this).css('backgroundColor');
  hexc(x);
  console.log(color);
})

function hexc(colorval) {
  var parts = colorval.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
  delete(parts[0]);
  for (var i = 1; i &amp;lt;= 3; ++i) {
    parts[i] = parseInt(parts[i]).toString(16);
    if (parts[i].length == 1) parts[i] = '0' + parts[i];
  }
  color = '#' + parts.join('');
}&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;div class='div' style='background-color: #f5b405'&amp;gt;Click me!&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;strong papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://jsfiddle.net/DCaQb/ 에서 작동 사례를 확인합니다.&lt;/font&gt;&lt;/strong&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;HTML5 캔버스는 특정 속성이 다음과 같을 때 색상 값을 구문 분석하는 데 필요하기 때문에 약간의 해킹이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strokeStyle&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;fillStyle&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;pre&gt;&lt;code&gt;var ctx = document.createElement('canvas').getContext('2d');
ctx.strokeStyle = 'rgb(64, 128, 192)';
var hexColor = ctx.strokeStyle;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;function getBackgroundColor($dom) {
    var bgColor = &quot;&quot;;
    while ($dom[0].tagName.toLowerCase() != &quot;html&quot;) {
      bgColor = $dom.css(&quot;background-color&quot;);
      if (bgColor != &quot;rgba(0, 0, 0, 0)&quot; &amp;amp;&amp;amp; bgColor != &quot;transparent&quot;) {
        break;
      }
      $dom = $dom.parent();
    }
    return bgColor;
  }
&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;Chrome과 Firefox에서 제대로 작동하기&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 형식으로 변환하기만 하면 되는 색상이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 효과를 볼 수 있는 스크립트입니다. http://www.phpied.com/rgb-color-parser-in-javascript/&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;background-color&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;background-color&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;rgba(0, 0, 0, 0)&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;transparent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 아름다운 non-standard 솔루션&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;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&quot;background-color:#f5b405&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(this).attr(&quot;style&quot;).replace(&quot;background-color:&quot;, &quot;&quot;);
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;#f5b405
&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;@Newred 솔루션 추가.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신의 스타일이 단지 그 이상의 것을 가지고 있다면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;background-color&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(this).attr('style').split(';').filter(item =&amp;gt; item.startsWith('background-color'))[0].split(&quot;:&quot;)[1]
&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;이 솔루션은 @Newred 및 @Radu Di ță에서 언급한 내용의 일부를 활용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 덜 표준적인 경우에는 효과가 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $(this).attr('style').split(';').filter(item =&amp;gt; item.startsWith('background-color'))[0].split(&quot;:&quot;)[1].replace(/\s/g, '');
&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; background-color: #ffffff
 background-color:      #fffff;
 background-color:#fffff;
&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/5999209/how-to-get-the-background-color-code-of-an-element-in-hex&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/551</guid>
      <comments>https://cafebook.tistory.com/551#entry551comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:18 +0900</pubDate>
    </item>
    <item>
      <title>관리 대시보드 언어를 변경하지 않고 워드프레스 사이트 언어 변경</title>
      <link>https://cafebook.tistory.com/550</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;Wordpress 4.1을 사용하는 경우 설정 -&amp;gt; 일반으로 이동한 다음 콤보박스 사이트 언어에서 WordPress 사이트의 언어를 성공적으로 변경하는 언어를 선택합니다(완전하진 않지만 이유는 모르겠습니다).&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;관리 대시보드 언어를 변경하지 않고 WordPress 사이트 언어를 변경하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도와주셔서 감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Settings &amp;gt; General(설정)에서 글로벌 사이트 언어를 변경할 수 있지만 사용자 계정을 편집하여 사용자 계정에 대한 관리 언어를 원하는 대로 설정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 정보는 https://wptavern.com/wordpress-4-7-to-introduce-user-specific-language-setting-for-the-admin 을 참조하십시오.&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;a href=&quot;http://wpml.org/&quot; rel=&quot;nofollow&quot; papago-id=&quot;4-1&quot;&gt;WPML(Wordpress Multilanguage) 플러그인&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;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 플러그인을 몇 번 사용해본 적이 있습니다: https://wordpress.org/plugins/xili-language/ 꽤 완벽하고 사용하기 쉽습니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29157239/change-wordpress-site-language-without-changing-the-admin-dashboard-language&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/550</guid>
      <comments>https://cafebook.tistory.com/550#entry550comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:11 +0900</pubDate>
    </item>
    <item>
      <title>1103515245가 란드에서 사용되는 이유는 무엇입니까?</title>
      <link>https://cafebook.tistory.com/549</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1103515245가 란드에서 사용되는 이유는 무엇입니까?&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;a href=&quot;http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html&quot; papago-id=&quot;1-1&quot;&gt;이&lt;/a&gt; 놀랍도록 간단한 구현을 말씀드리는 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rand()&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; C준:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;static unsigned long int next = 1;

int rand(void)  /* RAND_MAX assumed to be 32767. */
{
    next = next * 1103515245 + 12345;
    return (unsigned)(next/65536) % 32768;
}
&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;a href=&quot;http://en.wikipedia.org/wiki/Linear_congruential_generator&quot; papago-id=&quot;3-1&quot;&gt;이 위키피디아 기사&lt;/a&gt;를 통해 우리는 승수가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a&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;a = 1103515245&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;ol&gt; 
 &lt;li&gt;&lt;code&gt;a - 1&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;m&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;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;(저희의 경우는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m = 2^32&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; int 의, .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&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;/li&gt; 
 &lt;li&gt;&lt;code&gt;a - 1&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;만약에 4의 배수입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4의 배수입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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; (32768은 4이며, 1103515244당)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 그들은 1103515245 같은 이상하고 기억하기 어려운 숫자를 선택했을까요?&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쩌면 이 숫자가 다른 숫자보다 낫다는 현명한 이유가 있을지도 모릅니다.&lt;/font&gt;&lt;/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;a = 20000000001&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크고,, 하기 쉽죠&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 더 크고, 멋있어 보이고, 기억하기 쉽죠.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;LCG를 사용하여 d차원 공간에 점을 그리면 최대 d!m의 &lt;sup papago-id=&quot;18-1&quot;&gt;&lt;sup papago-id=&quot;18-1-0&quot;&gt;1&lt;/sup&gt;/&lt;sub papago-id=&quot;18-1-2&quot;&gt;d&lt;/sub&gt;&lt;/sup&gt;초평면에 놓이게 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 알려진 LCG의 결함입니다.&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;(완전한 주기 조건을 벗어난) a와 m을 신중하게 선택하지 않으면 그보다 훨씬 적은 수의 평면에 놓여 있을 수 있습니다.&lt;/font&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;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스펙트럼 테스트(spectral test)는 d차원 관절 분포가 놓이는 연속 초평면 사이의 최대 거리입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;검정할 수 있는 d개에 대해 가능한 한 작기를 원하는 것입니다.&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;a href=&quot;https://www.researchgate.net/publication/2683298_A_Collection_of_Selected_Pseudorandom_Number_Generators_With_Linear_Structures&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;21-1&quot;&gt;문서&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인용한 발전기는 (ANSIC로) 문서에 언급되어 있으며, 그다지 좋지 않은 것으로 판단되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 높은 차수의 16비트는 허용할 수 있지만 많은 응용 프로그램들은 32768개 이상의 별개의 값이 필요할 것입니다. (댓글에서 지적한 바와 같이, 주기는 실제로 2^31입니다. 위키백과 링크의 완전한 주기성의 조건은 아마도 필요한 것일 뿐입니다.)&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 class=&quot;papago-parent&quot;&gt;ANSI 문서의 원본 소스 코드는 높은 순서의 16비트를 취하지 않아 오용하기 쉬운 매우 불량한 생성기를 생성했습니다(&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rand() % n&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;0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n&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;, 이 경우 매우 random하지 않은 결과를 얻을 수 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수치 레시피의 LCG에 대한 논의도 참조하십시오.&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;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나쁜 것은, 많은 초기 개발자들이 m과 a에 대해 특히 나쁜 선택을 했다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;= 65539 및 m = 231과 같은 악명 높은 루틴 중 하나인 RANDU는 수년 동안 IBM 메인프레임 컴퓨터에서 널리 사용되었으며 다른 시스템에도 널리 복사되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리 중 한 명은 한 대학원생이 단지 11대의 비행기로 &quot;난수&quot; 플롯을 만들다가 컴퓨터 센터의 프로그래밍 컨설턴트로부터 &quot;난수 생성기를 잘못 사용했다&quot;는 말을 들었던 것을 떠올립니다. &quot;우리는 각 숫자가 개별적으로 난수라는 것은 보장하지만, 그 중 하나 이상이 난수라는 것은 보장하지 않습니다.&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 우리의 대학원 교육을 최소한 1년 뒤로 미뤘습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 것을 기억하라.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rand()&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;a href=&quot;http://en.wikipedia.org/wiki/Uniform_distribution_%28discrete%29&quot; papago-id=&quot;29-1&quot; rel=&quot;nofollow&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;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;font class=&quot;papago-parent&quot;&gt;코드가 있으면 &lt;a href=&quot;http://en.wikipedia.org/wiki/Linear_congruential_generator&quot; rel=&quot;nofollow&quot; papago-id=&quot;30-1&quot;&gt;LCG&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;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;31-0&quot;&gt;편집&lt;/strong&gt; 실제 응용 프로그램에서 사용할 의사 난수 생성기 개발에 관심이 있다면 해당 주제에 대한 상당한 문헌을 읽어보는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에 제시된 &quot;조언&quot;은 임의의 &quot;더 크고, 멋져 보이고, 기억하기 쉬운&quot; LCG 매개변수를 선택하는 것이 매우 좋지 않은 분포를 제공한다는 것을 보여주는 데 도움이 될 뿐입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;31-2&quot;&gt;/편집&lt;/strong&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 class=&quot;papago-parent&quot;&gt;게다가 그것은 라이브러리 기능이고 나는 표준 라이브러리 버전을 사용하는 프로그램을 본 적이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rand()&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;LCG의 파라미터를 기억해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;초기 계산은 비트와 바이트에 관심을 가지는 경향이 있었고 코드의 바이트를 최소화하기 위해 레지스터를 가지고 장난을 쳤습니다(줄이 바이트가 있기 전에).&lt;/font&gt;&lt;/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;font class=&quot;papago-parent&quot;&gt;위에 나열된 샘플 생성기를 사용하면 16개 키 바이트의 시퀀스가 매우 비랜덤하게 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, rand()의 각 연속적인 출력의 낮은 비트가 교대로(예를 들어, 0,1,0,1,0,1,1,...) 된다는 것이 밝혀졌습니다. 그 이유를 알 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;x * 1103515245의 로우 비트는 x의 로우 비트와 동일한 다음 12345를 더하면 로우 비트가 뒤집힙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 로우 비트가 교대로 바뀝니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 가능한 키의 집합을 원하는 값인 2128보다 훨씬 적은 2113개의 가능성으로만 좁힙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://inst.eecs.berkeley.edu/~cs161/fa08/Notes/random.pdf&quot; rel=&quot;nofollow&quot; papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://inst.eecs.berkeley.edu/ ~cs161/fa08/Notes/random.pdf&lt;/font&gt;&lt;/a&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 papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Bays, Durham Bays, Carter, SD Durham에 의한 불량 난수 발생기 개선(1976)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/TRNG&quot; rel=&quot;nofollow&quot; papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://en.wikipedia.org/wiki/TRNG&lt;/font&gt;&lt;/a&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;그 숫자는 특별한 것 같아요, 두 소수 사이에요: P.&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;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;또한 예측 가능성을 얼마나 기대하는지 고려해 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 구현은 끔찍합니다. &lt;a href=&quot;http://www.isthe.com/chongo/tech/comp/fnv/index.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;43-1&quot;&gt;FNV-1a&lt;/a&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/8569113/why-1103515245-is-used-in-rand&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/549</guid>
      <comments>https://cafebook.tistory.com/549#entry549comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:16:05 +0900</pubDate>
    </item>
    <item>
      <title>lodash를 사용하여 들쭉날쭉한 배열 비교(주문 없이 품목 존재)</title>
      <link>https://cafebook.tistory.com/548</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;lodash를 사용하여 들쭉날쭉한 배열 비교(주문 없이 품목 존재)&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프를 사용해서 할 수 있다는 것을 알고 있지만, 이를 위한 우아한 방법을 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개의 들쭉날쭉한 어레이(어레이)가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
&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;lodash&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;array1&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;array2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 들쭉날쭉한 배열의 항목은 실제로 배열입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 내부 배열을 비교해 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;['a', 'b'] == ['b', 'a'] 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;['a', 'b'] == ['a', 'b'] 
&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;hr&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;10-0&quot;&gt;업데이트&lt;/strong&gt;: 원래 질문은 &quot;어레이&quot;에 대해 이야기하는 것이었고, 몇 년 동안 많은 사람들이 간단한 1차원 어레이를 비교하는 것에 대해 토론(답변 추가)했습니다(질문에 제시된 예가 예상했던 단순한 1차원 어레이와 실제로 유사하지 않다는 것을 깨닫지 못한 채).).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 배열을 정렬하는 경우 내부 배열이 이미 정렬되어 있으므로 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true
&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;.sort()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배열을 변형시킬 겁니다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 있는 경우 먼저 다음을 사용하여 복사본을 만듭니다(예:).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.slice()&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;...&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 아래 댓글에서 Daniel Budick이 추천하는 대로 하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;_.isEqual(_.sortBy(array1), _.sortBy(array2))
&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;sortBy()&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&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;xor&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;doArraysContainSameElements = _.xor(arr1, arr2).length === 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;배열 [1, 1]을 배열 [1]과 다른 것으로 간주하면 다음과 같이 성능을 약간 향상시킬 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;doArraysContainSameElements = arr1.length === arr2.length &amp;amp;&amp;amp; _.xor(arr1, arr2).length === 0
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 이미 답이 있지만, 이것이 저의 순수한 JS 구현입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최적인지는 잘 모르겠지만, 투명하고 읽기 쉽고 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Does array a contain elements of array b?
const union = new Set([...a, ...b]);
const contains = (a, b) =&amp;gt; union.size === a.length &amp;amp;&amp;amp; union.size === b.length;
// Since order is not important, just data validity.
const isEqualSet = (a, b) =&amp;gt; union.contains(a, b) || union.contains(b, a)
&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;contains()&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;a&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;b&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그러면 같은 세트에 넣어도 크기가 변하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;const a = [1,2,3,4]&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;const b = [1,2]&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;new Set([...a, ...b]) === {1,2,3,4}&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;a&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 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;const isEqualSet = (a: string[], b: sting[]): boolean =&amp;gt; {
  const union = new Set([...a, ...b])
  return union.size === a.length &amp;amp;&amp;amp; union.size === b.length;
}
&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;편집: obj[{a:true}, true, 3]에서는 작동하지 않지만 원시 요소인 경우 배열 내용을 비교합니다.&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;_.isEqual(a. b);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아주 환상적인 로다시 도서관에서 말입니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일하다는 뜻은 array1에 array2에 포함되지 않은 아이템이 없다는 뜻입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;평면()과 차분()을 사용할 수 있는데, 이는 물건이 있어도 상관없이 잘 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;array2&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;array1&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;em papago-id=&quot;38-1&quot;&gt;array1이 array2의 서브셋인지 묻는&lt;/em&gt; 것처럼 들립니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

function isSubset(source, target) {
    return !_.difference(_.flatten(source), _.flatten(target)).length;
}

isSubset(array1, array2); // → true
array1.push('d');
isSubset(array1, array2); // → false
isSubset(array2, array1); // → true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PURE JS(배열과 하위배열이 임의의 순서로 2개 이상의 요소를 가질 때도 작동함).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 포함된 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;,&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;join('-')&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;문자열에 사용되지 않는 parametr 문자(utf 가능)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;array1.map(x=&amp;gt;x.sort()).sort().join() === array2.map(x=&amp;gt;x.sort()).sort().join()
&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;var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['b', 'a']];

var r = array1.map(x=&amp;gt;x.sort()).sort().join() === array2.map(x=&amp;gt;x.sort()).sort().join();

console.log(r);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 해결책을 게시한 것에 대해 매우 부정한 느낌이 들지만:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isMatch([array1], [array2]) &amp;amp;&amp;amp; _.isMatch([array2], [array1]) // true

array1 = [['b', 'a'], ['c', 'b']];
array2 = [['b', 'c'], ['a', 'b']];
_.isMatch([array1], [array2]) &amp;amp;&amp;amp; _.isMatch([array2], [array1]) // also true
&lt;/code&gt;&lt;/pre&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;em papago-id=&quot;43-1&quot;&gt;참고&lt;/em&gt;로 포장을 해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;array1&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;array2&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;이것이 작동하기 위해서 컨테이너(배열, 물체)에? 왜?&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;import { differenceBy } from 'lodash'

export default function (arr1, arr2) {
    return !differenceBy(arr1, arr2).length &amp;amp;&amp;amp; arr1.length === arr2.length
}
&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&gt;&lt;strong papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: 이 질문의 다차원적인 면을 놓쳤기 때문에, 사람들이 1차원 배열을 비교하는 데 도움이 될까 봐 여기에 둡니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&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;.sort()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sortBy()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그래서 대신 이걸 사용했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;function arraysContainSameStrings(array1: string[], array2: string[]): boolean {
  return (
    array1.length === array2.length &amp;amp;&amp;amp;
    array1.every((str) =&amp;gt; array2.includes(str)) &amp;amp;&amp;amp;
    array2.every((str) =&amp;gt; array1.includes(str))
  )
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 빨리 실패하는 것을 의도했고, 나의 목적을 위해서는 잘 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;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;_.difference&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function isSame(arrayOne, arrayTwo) {
   var a = _.uniq(arrayOne),
   b = _.uniq(arrayTwo);
   return a.length === b.length &amp;amp;&amp;amp; 
          _.isEmpty(_.difference(b.sort(), a.sort()));
}

// examples
console.log(isSame([1, 2, 3], [1, 2, 3])); // true
console.log(isSame([1, 2, 4], [1, 2, 3])); // false
console.log(isSame([1, 2], [2, 3, 1])); // false
console.log(isSame([2, 3, 1], [1, 2])); // false

// Test cases pointed by Mariano Desanze, Thanks.
console.log(isSame([1, 2, 3], [1, 2, 2])); // false
console.log(isSame([1, 2, 2], [1, 2, 2])); // true
console.log(isSame([1, 2, 2], [1, 2, 3])); // false
&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;/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;a href=&quot;https://stackblitz.com/edit/using-lodash-to-compare-arrays-items-existence-without-order?file=index.js&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;55-1&quot;&gt;StackBlitz&lt;/a&gt;에서 예제 링크 추가&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29951293/using-lodash-to-compare-jagged-arrays-items-existence-without-order&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/548</guid>
      <comments>https://cafebook.tistory.com/548#entry548comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:58 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 종속성 없이 Java에서 Oracle Refurser</title>
      <link>https://cafebook.tistory.com/547</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle 종속성 없이 Java에서 Oracle Refurser&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;구글과 일부 다른 출처(예: http://www.enterprisedt.com/publications/oracle/result_set.html), )에 따르면, Refurser를 반환하는 저장 함수를 호출하려면 ResultSet에 액세스하려면 다음과 같은 내용을 작성해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;String query = &quot;begin ? := sp_get_stocks(?); end;&quot;;
CallableStatement stmt = conn.prepareCall(query);
// register the type of the out param - an Oracle specific type
stmt.registerOutParameter(1, OracleTypes.CURSOR);
// set the in param
stmt.setFloat(2, price);
// execute and retrieve the result set
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(1);
&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;Oracle에 대한 컴파일 시간 의존성을 도입하지 않고 수행할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OracleTypes의 일반적인 대안이 있습니까?&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;/font&gt;&lt;/font&gt;&lt;code&gt;OracleTypes.CURSOR&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-10 입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아주 보기 흉한 해결책이지만 그냥 -10이라고 적거나 -10이라는 값을 자신만의 상수로 만들 수 있습니다.&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;java.sql.Types.OTHER&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 class=&quot;papago-parent&quot;&gt;API에는 데이터베이스 특정 유형을 위한 것이라고 나와 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/445455/using-oracle-ref-cursor-in-java-without-oracle-dependency&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/547</guid>
      <comments>https://cafebook.tistory.com/547#entry547comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:50 +0900</pubDate>
    </item>
    <item>
      <title>x86_64의 명령어가 syscall입니까?</title>
      <link>https://cafebook.tistory.com/546</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;x86_64의 명령어가 syscall입니까?&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;glibc에서 시스템 호출을 수행하는 코드를 확인하고 싶었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 걸 찾았어요&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENTRY (syscall)
    movq %rdi, %rax     /* Syscall number -&amp;gt; rax.  */
    movq %rsi, %rdi     /* shift arg1 - arg5.  */
    movq %rdx, %rsi
    movq %rcx, %rdx
    movq %r8, %r10
    movq %r9, %r8
    movq 8(%rsp),%r9    /* arg6 is on the stack.  */
    syscall         /* Do the system call.  */
    cmpq $-4095, %rax   /* Check %rax for error.  */
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error.  */
L(pseudo_end):
    ret         /* Return to caller.  */
&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이스&lt;/font&gt;&lt;/font&gt;&lt;code&gt;syscall&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;cmpq&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지시) 지시?&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그것이 지시라면, 무엇의 의미가 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ENTRY (syscall)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;? ENTERT(ENTRY가 무엇인지 모르겠습니다)와 명령의 이름이 같습니까?&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;L(pseudo_end)&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;/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;&lt;a href=&quot;http://felixcloutier.com/x86/SYSCALL.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-0&quot;&gt;&lt;code papago-id=&quot;7-0-0&quot;&gt;syscall&lt;/code&gt;&lt;/a&gt; 는 x86-64 의 명령어이며, &lt;a href=&quot;https://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64&quot; papago-id=&quot;7-2&quot;&gt;시스템 호출을 위한 ABI&lt;/a&gt; 의 일부로 사용됩니다. (32비트 ABI 는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int 80h&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;sysenter&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 64비트 모드에서도 사용할 수 있지만, 64비트 코드의 32비트 ABI를 사용하는 것은 특히 포인터 인수가 있는 호출의 경우 좋지 않은 생각입니다.)&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;그러나 시스템 호출 ABI의 일반 &lt;a href=&quot;http://man7.org/linux/man-pages/man2/syscall.2.html&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;래퍼&lt;/a&gt;인 C &lt;a href=&quot;http://man7.org/linux/man-pages/man2/syscall.2.html&quot; papago-id=&quot;10-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;errno&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;ENTRY(syscall)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수가 거기서 시작된다는 뜻입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;L()&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;ENTRY()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CPP 매크로입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;L(pseudo_end)&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 class=&quot;papago-parent&quot;&gt;아마도 코드는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SYSCALL_ERROR_LABEL&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;ret&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;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;syscall&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 x86-64의 명령어입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;비슷한 지침이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sysenter&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;i686에.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;ENTRY(syscall)&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 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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/10583891/is-syscall-an-instruction-on-x86-64&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/546</guid>
      <comments>https://cafebook.tistory.com/546#entry546comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:44 +0900</pubDate>
    </item>
    <item>
      <title>Oracle SQL 개발자:피봇 함수를 사용하여 행을 열로 변환하는 방법</title>
      <link>https://cafebook.tistory.com/545</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle SQL 개발자:&lt;/font&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;contact&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;   PARTYID CONTACTTEXT  CONTACTTYPECD
---------- ------------ -------------
       100 0354441010               1
       100 0355551010               2
       100 0428105789               3
       100 abc@home.com             4
&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;   PARTYID PHONE        FAX          MOBILE       EMAIL      
---------- ------------ ------------ ------------ ------------
       100 0354441010   0355551010   0428105789   abc@home.com
&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 * FROM 
  ( 
    SELECT partyId, contacttext, contacttypecd 
    FROM CONTACT 
    WHERE partyId = 100; 
  ) 
  PIVOT ( 
    MAX(contacttext) 
  FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email)); 
&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;Error starting at line 9 in command: 
FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email)) 
Error report: 
Unknown Command 
&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;문제가 발생한 이유는 오라클 데이터베이스 버전(Oracle9i)이 피봇(PIOT) 기능을 지원하지 않기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 다른 방법으로 수행하는 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT PartyCD
  ,MAX(DECODE(t.contacttypecd, 1, t.contacttext)) Phone
  ,MAX(DECODE(t.contacttypecd, 2, t.contacttext)) Fax
  ,MAX(DECODE(t.contacttypecd, 3, t.contacttext)) Mobile
  ,MAX(DECODE(t.contacttypecd, 4, t.contacttext)) Email
FROM 
  (
    SELECT partyid, contacttext, contacttypecd
    FROM CONTACT
    WHERE partyid = 100
  ) t
 GROUP BY PartyID
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설명문에 다음과 같은 길 잃은 세미콜론이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    WHERE partyId = 100; 
&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;SELECT * FROM 
  ( 
    SELECT partyId, contacttext, contacttypecd 
    FROM CONTACT 
    WHERE partyId = 100
  ) 
  PIVOT ( 
    MAX(contacttext) 
  FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email));

   PARTYID PHONE        FAX          MOBILE       EMAIL      
---------- ------------ ------------ ------------ ------------
       100 0354441010   0355551010   0428105789   abc@home.com
&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;여러 문장으로 간주되고 있습니다. 첫 번째 문장은 종결 괄호가 누락되어 불완전합니다(그래서 ORA-00907을 가져옵니다). 두 번째 문장은 해당 괄호로 시작하여 보고한 오류를 얻으며, 이후 각 행은 동일한 오류를 얻습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 보고된 오류만 보고 있는 것 같습니다. 일반적으로 첫 번째 오류로 시작하여 해당 오류를 지우고 계속 있는 경우 다음 오류로 이동하는 것이 훨씬 더 도움이 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29945504/oracle-sql-developer-how-to-transpose-rows-to-columns-using-pivot-function&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/545</guid>
      <comments>https://cafebook.tistory.com/545#entry545comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:37 +0900</pubDate>
    </item>
    <item>
      <title>ALTER TABLE 제약 조건</title>
      <link>https://cafebook.tistory.com/544</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ALTER TABLE 제약 조건&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;User(사용자) 및 Properties(속성) 테이블이 제대로 작성되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE Properties
(
    ID int AUTO_INCREMENT,
    language int,
    stonecolor int,
    gamefield int,
    UserID int,
    PRIMARY KEY(ID),
    FOREIGN KEY(language) REFERENCES Language(ID),
    FOREIGN KEY(stonecolor) REFERENCES StoneColor(ID),
    FOREIGN KEY(gamefield) REFERENCES GameField(ID)
) ENGINE = INNODB;

CREATE TABLE User
(
    ID int AUTO_INCREMENT,
    vorname varchar(30) NOT NULL,
    name varchar(30) NOT NULL,
    email varchar(40) NOT NULL,
    password varchar(40) NOT NULL,
    nickname varchar(15) NOT NULL,
    score int,
    isadmin int DEFAULT 0,
    gamesPlayed int,
    properties int NOT NULL,
    PRIMARY KEY(ID),
    UNIQUE (email),
    UNIQUE (nickname)

) ENGINE = INNODB;
&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;ALTER TABLE User&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;ALTER TABLE User 
(
    ADD CONSTRAINT userPropertie
    FOREIGN KEY(properties)
    REFERENCES Properties(ID)
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 그런지 모르겠어요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것을 http://www.w3schools.com/sql/sql_foreignkey.asp 의 참고 자료로 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 1064 - SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 2행에서 '( ADD CONSTRETT userProperty FOREN KEY(properties) REFERINS Properties(') REFERINS Properties(') REFERINS Properties() Properties) Properties(' 근처에 사용할 올바른 구문을 확인하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;괄호를 생략합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ALTER TABLE User 
    ADD CONSTRAINT userProperties
    FOREIGN KEY(properties)
    REFERENCES Properties(ID)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;ALTER TABLE `User`
ADD CONSTRAINT `user_properties_foreign`
FOREIGN KEY (`properties`)
REFERENCES `Properties` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;alter table User 
    add constraint userProperties
    foreign key (properties)
    references Properties(ID)
&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/10193153/alter-table-add-constraint&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/544</guid>
      <comments>https://cafebook.tistory.com/544#entry544comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:30 +0900</pubDate>
    </item>
    <item>
      <title>MariaDB Galera 클러스터에서 데이터 캡처 변경</title>
      <link>https://cafebook.tistory.com/543</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB Galera 클러스터에서 데이터 캡처 변경&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;로드 밸런서가 앞에 있는 MariaDB Galera 클러스터(v10.3.10)에서 CDC binlog 클라이언트를 사용하여 변경 사항을 캡처해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/OOQXL.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/OOQXL.png&quot; alt=&quot;MariaDB Galera HA&quot;&gt;&lt;/a&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;로드 밸런서가 있는 MariaDB Galera Cluster는 내결함성을 제공합니다.&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;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CDC 클라이언트는 클러스터 노드에 직접 연결되면 완벽하게 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 CDC 클라이언트가 HAProxy 로드 밸런서를 통해 MariaDB Galera 클러스터에 연결하면 실패합니다.&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;이진 로그 인덱스 파일에서 첫 번째 로그 파일 이름을 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 노드들 중 하나에 접속해서 파일명, 위치 등을 얻는 것으로 추정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 후속 요청은 다른 binlog 속성을 가진 다른 노드로 라우팅됩니다.&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;단일 노드에 의존하지 않는 가용성이 높은 MariaDB Galera 클러스터에서 CDC로 가는 방법이 있습니까?&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/53076471/change-data-capture-from-a-mariadb-galera-cluster&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/543</guid>
      <comments>https://cafebook.tistory.com/543#entry543comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:23 +0900</pubDate>
    </item>
    <item>
      <title>jdbc 템플릿을 사용한 스프링 부팅 자동 구성데이터 자동배선 문제</title>
      <link>https://cafebook.tistory.com/542</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jdbc 템플릿을 사용한 스프링 부팅 자동 구성데이터 자동배선 문제&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;저는 봄이 처음이고 J2EE도 처음입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Boot 자동 구성으로 JDBC 템플릿을 사용하는 데 문제가 있습니다.&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;a href=&quot;http://spring.io/guides/gs/rest-service/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-1&quot;&gt;제공&lt;/a&gt;하는 RESTful 웹 서비스의 예를 들어 JDBC 템플릿 관계형 데이터베이스 액세스를 사용하도록 확장하기로 결정했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유감스럽게도 xml beans 파일에서 dataSource를 제공하는 것이 유일한 어려움이기 때문에 제공된 &lt;a href=&quot;http://spring.io/guides/gs/relational-data-access/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-3&quot;&gt;다른&lt;/a&gt; 예는 유용할 수 없습니다.&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;ol&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DAO Imple 클래스를 Spring과 다른 구현의 확장으로 사용합니다.&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;다양한 DataSource 클래스(예: DriverManagerDataSource)를 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 클래스의 단순한 속성(데이터 소스보다 덜 복잡한 것)만 자동 배선하려고 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음에는 DAO 클래스를 작성했지만, 인터페이스를 구현해야만 데이터 소스 자동 배선이 가능할 수 있다고 생각하고 시도해 보았지만 도움이 되지 않았습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스택이나 구글에서 찾은 모든 것을 시도해 보았습니다.&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;Property 'dataSource' is required&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;error, 마침내 링크에 성공할 수 있었다면 고군분투한 후&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;application-config.xml&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;콩으로 파일을 작성하지만 JDBC의 데이터 소스를 자동 배선할 수 없습니다.&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;저는 이 작업을 끝내려고 필사적으로 노력하고 있으며 아이디어가 부족하여 누군가가 Spring Boot Autoconfiguration(스프링 부트 자동 구성)과 함께 작동하는 최신 예를 제공해 줄 수 있다면 좋을 것입니다. XML로 된 빈 검색, JDBC의 자동 배선 데이터 소스를 찾을 수 있습니다.&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;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/Qt2WZ.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Application 클래스.&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;package ws;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan
@ImportResource(&quot;classpath:spring/application-config.xml&quot;)
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;17&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;package ws;

import dao.UserDAOImpl;
import model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestWS {
    @RequestMapping(&quot;/greeting&quot;)
    public User greeting(@RequestParam(value=&quot;name&quot;, defaultValue=&quot;World&quot;) String name) {
    return new User(&quot;ubububu&quot;, &quot;661331555&quot;, 0);
    }
    @RequestMapping(&quot;/create&quot;)
    public String initialize() {
        UserDAOImpl users = new UserDAOImpl();
        users.init();
        return &quot;seems ok&quot;;
    }
}
&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;DAO 인터페이스&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;package dao;

import model.User;

public interface UserDAO {
    public void insert(User usr);
    public void init();
    public User select(int id);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DAO 구현&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;package dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Repository;

import model.User;
import dao.UserDAO;

@Repository
public class UserDAOImpl implements UserDAO {
    private JdbcTemplate jdbcTemplate;
    private DriverManagerDataSource dataSource;
    @Autowired
    public void setDataSource(DriverManagerDataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void insert(User usr) {
        String sql = &quot;INSERT INTO USER &quot; +
                &quot;(USR_ID, EMAIL, PHONE) VALUES (?, ?, ?)&quot;;

        this.jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.execute(sql);
    }

    public void init() {
        String sql = &quot;CREATE TABLE USER (USR_ID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,EMAIL VARCHAR(30) NOT NULL,PHONE VARCHAR(15) NOT NULL)&quot;;
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.execute(sql);
    }
}
&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;자료모형&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;package model;

public class User {
    private String email;
    private String phone;
    private int id;
    public User(String email, String phone, int id) {
        this.email = email;
        this.phone = phone;
        this.id = id;
    }
    public int getUsrId(){
        return this.id;
    }
    public String getUsrEmail() {
        return this.email;
    }
    public String getUsrPhone() {
        return this.phone;
    }
}
&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;구성 bean 파일&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;

&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd&quot;&amp;gt;
    &amp;lt;import resource=&quot;Spring-User.xml&quot; /&amp;gt;--&amp;gt;
    &amp;lt;context:component-scan base-package=&quot;ws&quot;/&amp;gt;
    &amp;lt;bean id=&quot;ds&quot; 
         class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&amp;gt;

        &amp;lt;property name=&quot;driverClassName&quot; value=&quot;org.springframework.jdbc.core.JdbcTemplate&quot; /&amp;gt;
        &amp;lt;property name=&quot;url&quot; value=&quot;jdbc:mysql://localhost/:3306/databasename&quot; /&amp;gt;
        &amp;lt;property name=&quot;username&quot; value=&quot;root&quot; /&amp;gt;
        &amp;lt;property name=&quot;password&quot; value=&quot;password&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;bean id=&quot;UserDAOprovider&quot; class=&quot;dao.UserDAOImpl&quot;&amp;gt;
        &amp;lt;property name=&quot;dataSource&quot; ref=&quot;ds&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt; 

&amp;lt;/beans&amp;gt;
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;ERROR [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Property 'dataSource' is required] with root cause
java.lang.IllegalArgumentException: Property 'dataSource' is required
    at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(JdbcAccessor.java:135) ~[spring-jdbc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.&amp;lt;init&amp;gt;(JdbcTemplate.java:169) ~[spring-jdbc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at dao.UserDAOImpl.init(UserDAOImpl.java:66) ~[demo3-0.0.1-SNAPSHOT.jar!/:na]
    at ws.TestWS.initialize(TestWS.java:30) ~[demo3-0.0.1-SNAPSHOT.jar!/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_33]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.6.0_33]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.6.0_33]
    at java.lang.reflect.Method.invoke(Method.java:622) ~[na:1.6.0_33]
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) ~[na:1.6.0_33]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.6.0_33]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-7.0.57.jar!/:7.0.57]
    at java.lang.Thread.run(Thread.java:701) ~[na:1.6.0_33]
&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;Spring Boot에서 DataSource를 구성하는 가장 간단한 방법은 src/main/resource에서 application.properties 파일을 다음 내용으로 만드는 것입니다(정확한 URL, 사용자 이름 및 암호로 업데이트해야 할 수도 있음).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.datasource.url=jdbc:mysql://localhost/:3306/databasename
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
&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;Spring Boot는 자동으로 DataSource 클래스를 생성하여 다른 원두에 주입합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이로 인해 xml config 파일이 더 이상 필요 없어지며 Application 클래스에서 다음 줄을 제거할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@ImportResource(&quot;classpath:spring/application-config.xml&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;또한 User DAOempl Spring은 DataSource bean(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-using-jdbc-template) 을 사용하여 JdbcTemplate 개체를 자동으로 배선할 수 있으므로 삽입 () 메서드를 호출할 때마다 개체를 생성할 필요가 없습니다.&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;UserDAOmple의 init () 메서드는 src/main/resources 아래에 schema.sql 파일을 만들고 CREATE TABLE 문을 이동할 수 있습니다(자세한 내용은 http://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle/ #how to &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle/#howto-intialize-a-database-using-spring-jdbc&quot; papago-id=&quot;26-1&quot;&gt;intitize-a-&lt;/a&gt;database&lt;a href=&quot;http://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle/#howto-intialize-a-database-using-spring-jdbc&quot; papago-id=&quot;26-1&quot;&gt;-using-spring-&lt;/a&gt;jd&lt;a href=&quot;http://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle/#howto-intialize-a-database-using-spring-jdbc&quot; papago-id=&quot;26-1&quot;&gt;bc&lt;/a&gt; 참조).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 이 예를 참조하십시오. http://xantorohara.blogspot.ca/2013/11/spring-boot-jdbc-sample.html&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/27697190/spring-boot-autoconfiguration-with-jdbc-template-autowiring-datasource-issue&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/542</guid>
      <comments>https://cafebook.tistory.com/542#entry542comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:17 +0900</pubDate>
    </item>
    <item>
      <title>jQuery Button.click() 이벤트가 두 번 트리거됨</title>
      <link>https://cafebook.tistory.com/541</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery Button.click() 이벤트가 두 번 트리거됨&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;button id=&quot;delete&quot;&amp;gt;Remove items&amp;lt;/button&amp;gt;

$(&quot;#delete&quot;).button({
     icons: {
             primary: 'ui-icon-trash'
     }
}).click(function() {
     alert(&quot;Clicked&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;font class=&quot;papago-parent&quot;&gt;이 특정한 버튼뿐만 아니라 제가 만드는 모든 버튼이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 뭘 잘못하고 있는 거지?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 경우 우리는 다음과 같이 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('selected').unbind('click').bind('click', function (e) {
  do_something();
});
&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;많은 시간이 지난 후에야 구글 검색으로 알게 되었습니다.&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;JQuery UI 아코디언 위젯을 사용하기 시작하기 전까지는 코드가 처음에는 작동하고 있었다고 말해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 코드가 작동합니다. 여기서 시도해 보십시오: http://jsfiddle.net/s4UyH/&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;em papago-id=&quot;8-3&quot;&gt;트리거하는&lt;/em&gt; 다른 핸들러가 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;click&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;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;그래서 저는 &quot;거짓으로 돌려주세요&quot;가 속임수를 썼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;$( '#selector' ).on( 'click', function() {
    //code
    return false;
});
&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;$( document ).ready({ })
&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;$(function() { });
&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;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;    $('#id').off().on('click', function() {
        // function body
    });
    $('.class').off().on('click', function() {
        // function body
    });
&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;input&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;label&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;strong papago-id=&quot;17-0&quot;&gt;내부&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;label&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;strong papago-id=&quot;19-1&quot;&gt;물론&lt;/strong&gt; 에 또 다른 클릭 이벤트를 트리거합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;input&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;label&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;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;화려한 CSS 전용 토글의 펜 보기: https://codepen.io/stepanh/pen/WaYzzO&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;참고: 이는 jQuery에 특정된 것이 &lt;strong papago-id=&quot;23-1&quot;&gt;아니며&lt;/strong&gt;, native listener는 펜에서와 마찬가지로 2배 트리거됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 다음과 같은 이유로 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;25-1&quot;&gt;&lt;strong papago-id=&quot;25-1-0&quot;&gt;스크립트&lt;/strong&gt;&lt;/em&gt;를 동일한 html 파일에 두 번 &lt;em papago-id=&quot;25-1&quot;&gt;&lt;strong papago-id=&quot;25-1-0&quot;&gt;이상&lt;/strong&gt;&lt;/em&gt; &lt;em papago-id=&quot;25-1&quot;&gt;&lt;strong papago-id=&quot;25-1-0&quot;&gt;포함&lt;/strong&gt;&lt;/em&gt;했습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;26-1&quot;&gt;&lt;strong papago-id=&quot;26-1-0&quot;&gt;이벤트 수신기를 두&lt;/strong&gt;&lt;/em&gt; 번 &lt;em papago-id=&quot;26-1&quot;&gt;&lt;strong papago-id=&quot;26-1-0&quot;&gt;추가&lt;/strong&gt;&lt;/em&gt;했습니다(예: 사용).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onclick&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;요소에 속성을 부여하고 jquery도 사용합니다.&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;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;28-1&quot;&gt;&lt;strong papago-id=&quot;28-1-0&quot;&gt;이벤트&lt;/strong&gt;&lt;/em&gt;는 어떤 상위 요소에 의해 &lt;em papago-id=&quot;28-1&quot;&gt;&lt;strong papago-id=&quot;28-1-0&quot;&gt;거품&lt;/strong&gt;&lt;/em&gt;이 일게 &lt;em papago-id=&quot;28-1&quot;&gt;&lt;strong papago-id=&quot;28-1-0&quot;&gt;됩니다&lt;/strong&gt;&lt;/em&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(사용을 고려할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;event.stopPropagation&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;template inheritance&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;Django&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;em papago-id=&quot;32-1&quot;&gt;&lt;strong papago-id=&quot;32-1-0&quot;&gt;스크립트&lt;/strong&gt;&lt;/em&gt;를 둘 &lt;em papago-id=&quot;32-1&quot;&gt;&lt;strong papago-id=&quot;32-1-0&quot;&gt;이상의 파일&lt;/strong&gt;&lt;/em&gt;에 &lt;em papago-id=&quot;32-1&quot;&gt;&lt;strong papago-id=&quot;32-1-0&quot;&gt;포함&lt;/strong&gt;&lt;/em&gt;시켰을 것입니다. 둘 이상의 파일은 함께 결합되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;include&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;extend&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿 태그&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하시는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Django&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;em papago-id=&quot;36-1&quot;&gt;&lt;strong papago-id=&quot;36-1-0&quot;&gt;내부&lt;/strong&gt;&lt;/em&gt;에 &lt;em papago-id=&quot;36-1&quot;&gt;&lt;strong papago-id=&quot;36-1-0&quot;&gt;잘못 배치&lt;/strong&gt;&lt;/em&gt;했습니다.&lt;/font&gt;&lt;/font&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;그래서 당신은 그것들을 찾아서 중복 수입을 제거해야 합니다.&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;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;click&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 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;$(&quot;#myId&quot;).off().on(&quot;click&quot;, function(event) {
event.stopPropagation();
});
&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;건너뛸 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;event.stopPropagation();&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;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 같은 문제가 있어서 다 시도해봤지만 소용이 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 다음과 같은 속임수를 썼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function do_stuff(e)
{
    if(e){ alert(e); }
}
$(&quot;#delete&quot;).click(function() {
    do_stuff(&quot;Clicked&quot;);
});
&lt;/code&gt;&lt;/pre&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;해당 매개 변수가 코드보다 null이 아닌지 확인합니다.&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;$(&quot;#id&quot;).off().on(&quot;click&quot;, function() {

});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나를 위해 일했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#id&quot;).off().on(&quot;click&quot;, function() {

});
&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;이를 해결하려면 event.stopPropagation()을 사용하여 상위 요소가 버블링하지 않도록 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('button').click(function(event) {
    event.stopPropagation();
});
&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;저 같은 경우는 변경 명령을 이렇게 사용하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;$(document).on('change', '.select-brand', function () {...my codes...});&lt;/code&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;/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;$(.'select-brand'). ('change', 함수() {...my code...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;});&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;내 문제를 해결해 줬습니다&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;@Stephan's Answer 관련.&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;input&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;label&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;.click()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;듣는 사람&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;label&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;div&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;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번 이상 발생하는 함수에서 element.click을 바인딩하면 queue가 되므로 다음에 클릭하면 바인딩 함수가 실행된 횟수만큼 트리거됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로 온 실수는 아마 제 쪽에 있겠지만 도움이 되었으면 좋겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;TL,DR: 한 번만 실행되는 설정 기능에 대한 모든 클릭을 바인딩해야 합니다.&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;/p&gt;&lt;h2 papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular를 사용하는 경우&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS:&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular를 사용하는 경우&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS와 당신의 jQuery 클릭 이벤트는 &lt;strong papago-id=&quot;62-1&quot;&gt;INSIDE THE CONTROLER&lt;/strong&gt;로, Angular의 프레임워크 자체에 방해를 받아 두 번 발사됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하려면 &lt;strong papago-id=&quot;62-3&quot;&gt;컨트롤러 밖&lt;/strong&gt;으로 옮기고 다음 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Make sure you're using $(document), or else it won't fire.
$(document).on(&quot;click&quot;, &quot;#myTemplateId #myButtonId&quot;, function () {
   console.log(&quot;#myButtonId is fired!&quot;);
   // Do something else.
});

angular.module(&quot;myModuleName&quot;)
   .controller(&quot;myController&quot;, bla bla bla)
&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;strong papago-id=&quot;63-1&quot;&gt;&quot;isTrusted&quot; 값에서 &lt;/strong&gt;두&lt;strong papago-id=&quot;63-1&quot;&gt; 이벤트가 다르다는&lt;/strong&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버그를 조금 해본 결과, 두 이벤트가 &quot;isTrusted&quot; 값이 다르다는 것을 알게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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&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;element.click()&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;다른 InputBox의 &quot;keydown&quot; 이벤트 핸들러에서.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;후,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;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 class=&quot;papago-parent&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;isTrusted:true&quot;이고 다른 하나는 &quot;isTrusted:false&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;69&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MDN(https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted), 에 의하면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isTrusted&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트가 사용자 triggered(참)인지 또는 프로그램으로 실행(false)되는지 확인하는 데 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;a. 이중 화재를 더 잘 처리하고 사용 사례에서 주별로 두 번째 이벤트를 차단합니다.&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;b. 사용자 트리거를 사용할지, 프로그램을 실행할지 선택합니다.&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;c. 클릭()을 사용하지 않습니다.&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#button_id').click($.debounce(250, function(e) {
     e.preventDefault();
     var cur = $(this);
     if ($(cur).hasClass('btn-primary')) {
          //do something
     } else {
          // do something else 
     }
 }));
&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;strong papago-id=&quot;76-0&quot;&gt;때&lt;/strong&gt;의 &lt;em papago-id=&quot;76-2&quot;&gt;myIssue&lt;/em&gt;는 Class가 true로 즉시 표시되고 다른 부분은 &lt;strong papago-id=&quot;76-4&quot;&gt;debounce&lt;/strong&gt;를 사용하여 수정되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오래된 프로젝트를 진행중입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 요소에 라디오 입력이 있을 때 그리고 클릭이 라디오 입력을 선택할 때 jQuery 클릭이 두 번 트리거 되어 Js.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지의 어느 지점을 클릭하면 두 번 클릭 이벤트가 발생하기 때문에 이 문제가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스코드를 확인해보니 jQuery 라이브러리가 최종 페이지에 대해 두번 정의된 원인을 찾았습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASP의 마스터 페이지에 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET웹폼프로젝트&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ScriptManager&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;Application_Start&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Global.asax&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;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3070400/jquery-button-click-event-is-triggered-twice&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/541</guid>
      <comments>https://cafebook.tistory.com/541#entry541comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:15:07 +0900</pubDate>
    </item>
    <item>
      <title>0x636f7d89(코드=1)의 안드로이드 치명 신호 11(SIGSEGV).어떻게 추적할 수 있습니까?</title>
      <link>https://cafebook.tistory.com/540</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;0x636f7d89(코드=1)의 안드로이드 치명 신호 11(SIGSEGV).&lt;/font&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;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;SIGSEGV&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;Android 앱에서.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캔버스 사용과 관련하여 가능한 NullPoint를 찾기 위해 앱을 탐색할 계획이지만,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SIGSEGV&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;code=1&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;code=2&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;0x00000000&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;, 나는 그것이 Null Pointer라는 것을 알고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 마지막으로 얻은 것은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;code=2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A/libc(4969): Fatal signal 11 (SIGSEGV) at 0x42a637d9 (code=2)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이걸 어떻게 추적할 지 제안해 주실 수 있나요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용의자가 있긴 한데 아직 실험은 하고 싶지 않아요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 앱은 OSMDroid API를 오프라인 매핑에 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OverlayItem 클래스는 맵의 마커/노드를 나타냅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네트워크를 통해 데이터를 수집하여 지도에 표시되는 OverlayItem을 채우는 서비스가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설계를 단순화하기 위해 OverlayItem을 UI Activity 및 서비스에서 사용하는 일부 추가 특성을 포함하는 NodeOverlayItem 클래스로 확장했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 UI 및 서비스에 대한 단일 항목 정보를 얻을 수 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무언가 바뀌었을 때 UI 맵을 새로 고치기 위해 Activity로 브로드캐스트하는 Intents를 사용했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Activity가 Service에 바인딩되고 NodeOverlay 목록을 가져오는 Service 메서드가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이템.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OSDroid API가 OverlayItem을 사용하는 것과 동시에 my Service가 노드 정보를 업데이트하는 것이 아닐까 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(동시성 문제)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 이 글을 쓰면서 정말 그게 문제인 것 같아요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;골칫거리는 NodeOverlayItem에서 Node와 OverlayItem을 분리하는 것이 아니라, Activity가 Node로부터 데이터를 받아야 하고, 서비스가 보유하고 있다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 Activity가 생성되면(Resume 등에서), Activity가 부재중인 동안 서비스가 유지하고 있던 Node 데이터에서 OverlayItem 개체를 다시 생성해야 합니다. 예를 들어 앱을 시작하면 서비스가 데이터를 수집하고 UI가 표시한 후 Home으로 이동한 후 앱으로 다시 이동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;활동에서 Overlay(오버레이)를 당겨서 다시 만들어야 합니다.&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;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 훌륭하거나 명확한 질문이 아니라는 것을 압니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 SO 질문은 모두 틈새 질문이거나 모호합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 누군가 그것들을 어떻게 해석할지에 대한 제안이 있다면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SIGSEGV&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;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-0&quot;&gt;업데이트&lt;/strong&gt; 디버그 세션 중에 포착된 가장 최근의 충돌입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 장치들 중 3개를 테스트에 사용하고 있는데 제가 개발하고 테스트할 때 모두 안정적으로 충돌하지는 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GC logging이 주목받을 수 있도록 조금 더 추가했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제가 메모리 소진과 관련이 없다는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;03-03 02:02:38.328: I/CommService(7477): Received packet from: 192.168.1.102
03-03 02:02:38.328: I/CommService(7477): Already processed this packet. It's a re-broadcast from another node, or from myself. It's not a repeat broadcast though.
03-03 02:02:38.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:38.460: D/CommService(7477): Monitoring nodes...
03-03 02:02:38.515: D/dalvikvm(7477): GC_CONCURRENT freed 2050K, 16% free 17151K/20359K, paused 3ms+6ms
03-03 02:02:38.515: I/CommService(7477): Received packet from: 192.168.1.102
03-03 02:02:38.515: D/CommService(7477): Forwarding packet (4f68802cf10684a83ac4936ebb3c934d) along to other nodes.
03-03 02:02:38.609: I/CommService(7477): Received packet from: 192.168.1.100
03-03 02:02:38.609: D/CommService(7477): Forwarding packet (e4bc81e91ec92d06f83e03068f52ab4) along to other nodes.
03-03 02:02:38.609: D/CommService(7477): Already processed this packet: 4204a5b27745ffe5e4f8458e227044bf
03-03 02:02:38.609: A/libc(7477): Fatal signal 11 (SIGSEGV) at 0x68f52abc (code=1)
03-03 02:02:38.914: I/DEBUG(4008): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-03 02:02:38.914: I/DEBUG(4008): Build fingerprint: 'Lenovo/IdeaTab_A1107/A1107:4.0.4/MR1/eng.user.20120719.150703:user/release-keys'
03-03 02:02:38.914: I/DEBUG(4008): pid: 7477, tid: 7712  &amp;gt;&amp;gt;&amp;gt; com.test.testm &amp;lt;&amp;lt;&amp;lt;
03-03 02:02:38.914: I/DEBUG(4008): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 68f52abc
03-03 02:02:38.914: I/DEBUG(4008):  r0 68f52ab4  r1 412ef268  r2 4d9c3bf4  r3 412ef268
03-03 02:02:38.914: I/DEBUG(4008):  r4 001ad8f8  r5 4d9c3bf4  r6 412ef268  r7 4c479df8
03-03 02:02:38.914: I/DEBUG(4008):  r8 4d9c3c0c  r9 4c479dec  10 46cf260a  fp 4d9c3c24
03-03 02:02:38.914: I/DEBUG(4008):  ip 40262a04  sp 4d9c3bc8  lr 402d01dd  pc 402d0182  cpsr 00000030
03-03 02:02:38.914: I/DEBUG(4008):  d0  00000001000c0102  d1  3a22364574614c7d
03-03 02:02:38.914: I/DEBUG(4008):  d2  403fc0000000007d  d3  363737343433350a
03-03 02:02:38.914: I/DEBUG(4008):  d4  49544341223a2273  d5  6f6567222c224556
03-03 02:02:38.914: I/DEBUG(4008):  d6  3a223645676e6f4c  d7  000000013835372d
03-03 02:02:38.914: I/DEBUG(4008):  d8  0000000000000000  d9  4040000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d10 0000000000000000  d11 4040000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d12 4040000000000000  d13 0000000000000021
03-03 02:02:38.914: I/DEBUG(4008):  d14 0000000000000000  d15 0000000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d16 3fe62e42fefa39ef  d17 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d18 3fe62e42fee00000  d19 0000000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d20 0000000000000000  d21 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d22 4028000000000000  d23 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d24 0000000000000000  d25 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d26 0000000000000000  d27 c028000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d28 0000000000000000  d29 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d30 3ff0000000000000  d31 3fecccccb5c28f6e
03-03 02:02:38.914: I/DEBUG(4008):  scr 60000013
03-03 02:02:39.046: I/DEBUG(4008):          #00  pc 0006b182  /system/lib/libcrypto.so (EVP_DigestFinal_ex)
03-03 02:02:39.046: I/DEBUG(4008):          #01  pc 0006b1d8  /system/lib/libcrypto.so (EVP_DigestFinal)
03-03 02:02:39.054: I/DEBUG(4008):          #02  pc 0001f814  /system/lib/libnativehelper.so
03-03 02:02:39.054: I/DEBUG(4008):          #03  pc 0001ec30  /system/lib/libdvm.so (dvmPlatformInvoke)
03-03 02:02:39.054: I/DEBUG(4008):          #04  pc 00058c70  /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
03-03 02:02:39.054: I/DEBUG(4008): code around pc:
03-03 02:02:39.054: I/DEBUG(4008): 402d0160 0003151e 4604b570 f7ff460d 4620ff81  ....p..F.F.... F
03-03 02:02:39.054: I/DEBUG(4008): 402d0170 f7ff4629 bd70ff93 4604b570 460e6800  )F....p.p..F.h.F
03-03 02:02:39.054: I/DEBUG(4008): 402d0180 68834615 dd062b40 21fa4810 44784a10  .F.h@+...H.!.JxD
03-03 02:02:39.054: I/DEBUG(4008): 402d0190 f7c8447a 6821f80f 698a4620 47904631  zD....!h F.i1F.G
03-03 02:02:39.054: I/DEBUG(4008): 402d01a0 b1154606 68836820 6822602b b12b6a13  .F.. h.h+`&quot;h.j+.
03-03 02:02:39.054: I/DEBUG(4008): code around lr:
03-03 02:02:39.054: I/DEBUG(4008): 402d01bc 68e06821 21006c4a ea0af7c4 bd704630  !h.hJl.!....0Fp.
03-03 02:02:39.054: I/DEBUG(4008): 402d01cc 00031492 000314b5 4604b570 ffcef7ff  ........p..F....
03-03 02:02:39.054: I/DEBUG(4008): 402d01dc 46204605 ff12f7ff bd704628 4604b573  .F F....(Fp.s..F
03-03 02:02:39.054: I/DEBUG(4008): 402d01ec 2102460d fb36f002 42ab6823 b123d020  .F.!..6.#h.B .#.
03-03 02:02:39.054: I/DEBUG(4008): 402d01fc b1136c5b f7c868e0 68a0fccf 05c26025  [l...h.....h%`..
03-03 02:02:39.054: I/DEBUG(4008): memory map around addr 68f52abc:
03-03 02:02:39.054: I/DEBUG(4008): 4d8c5000-4d9c4000 
03-03 02:02:39.054: I/DEBUG(4008): (no map for address)
03-03 02:02:39.054: I/DEBUG(4008): b0001000-b0009000 /system/bin/linker
03-03 02:02:39.054: I/DEBUG(4008): stack:
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3b88  408d1f90  /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3b8c  412ef258  /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3b90  00000001  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3b94  408d6c58  /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3b98  408d6fa8  /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3b9c  4c479dec  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3ba0  46cf260a  /system/framework/core.odex
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3ba4  408735e7  /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3ba8  412ef258  /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bac  002bf070  [heap]
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bb0  412ef258  /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bb4  00000000  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bb8  412ef268  /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bbc  00000000  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bc0  df0027ad  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bc4  00000000  
03-03 02:02:39.054: I/DEBUG(4008): #00 4d9c3bc8  001ad8f8  [heap]
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bcc  002ae0b8  [heap]
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bd0  00000004  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bd4  402d01dd  /system/lib/libcrypto.so
03-03 02:02:39.054: I/DEBUG(4008): #01 4d9c3bd8  001ad8f8  [heap]
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3bdc  002ae0b8  [heap]
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3be0  00000004  
03-03 02:02:39.054: I/DEBUG(4008):     4d9c3be4  4024e817  /system/lib/libnativehelper.so
03-03 02:02:39.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:39.500: D/CommService(7477): Monitoring nodes...
03-03 02:02:39.500: D/dalvikvm(7477): GC_FOR_ALLOC freed 2073K, 16% free 17118K/20359K, paused 51ms
03-03 02:02:39.632: D/dalvikvm(7477): GC_CONCURRENT freed 1998K, 16% free 17162K/20359K, paused 2ms+4ms
03-03 02:02:40.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:40.445: D/CommService(7477): Monitoring nodes...
03-03 02:02:40.562: D/dalvikvm(7477): GC_CONCURRENT freed 2045K, 16% free 17158K/20359K, paused 3ms+4ms
03-03 02:02:41.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:41.445: D/CommService(7477): Monitoring nodes...
03-03 02:02:41.531: D/dalvikvm(7477): GC_CONCURRENT freed 2045K, 16% free 17154K/20359K, paused 3ms+12ms
03-03 02:02:42.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:42.445: D/CommService(7477): Monitoring nodes...
03-03 02:02:42.507: D/dalvikvm(7477): GC_CONCURRENT freed 2068K, 16% free 17128K/20359K, paused 3ms+4ms
03-03 02:02:42.679: D/dalvikvm(7477): GC_CONCURRENT freed 2006K, 16% free 17161K/20359K, paused 2ms+12ms
03-03 02:02:43.140: I/BootReceiver(1236): Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
03-03 02:02:43.210: D/dalvikvm(1236): GC_FOR_ALLOC freed 912K, 17% free 10207K/12295K, paused 62ms
03-03 02:02:43.265: D/dalvikvm(1236): GC_FOR_ALLOC freed 243K, 16% free 10374K/12295K, paused 49ms
03-03 02:02:43.265: I/dalvikvm-heap(1236): Grow heap (frag case) to 10.507MB for 196628-byte allocation
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선, 당신의 묘비 스택 트레이스를 가져오세요, 그것은 당신의 앱이 충돌할 때마다 인쇄될 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이와 같은 것:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'XXXXXXXXX'
pid: 1658, tid: 13086  &amp;gt;&amp;gt;&amp;gt; system_server &amp;lt;&amp;lt;&amp;lt;
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 64696f7e
 r0 00000000  r1 00000001  r2 ad12d1e8  r3 7373654d
 r4 64696f72  r5 00000406  r6 00974130  r7 40d14008
 r8 4b857b88  r9 4685adb4  10 00974130  fp 4b857ed8
 ip 00000000  sp 4b857b50  lr afd11108  pc ad115ebc  cpsr 20000030
 d0  4040000040000000  d1  0000004200000003
 d2  4e72cd924285e370  d3  00e81fe04b1b64d8
 d4  3fbc71c7009b64d8  d5  3fe999999999999a
 d6  4010000000000000  d7  4000000000000000
 d8  4000000000000000  d9  0000000000000000
 d10 0000000000000000  d11 0000000000000000
 d12 0000000000000000  d13 0000000000000000
 d14 0000000000000000  d15 0000000000000000
 scr 80000012

         #00  pc 000108d8  /system/lib/libc.so
         #01  pc 0003724c  /system/lib/libxvi020.so
         #02  pc 0000ce02  /system/lib/libxvi020.so
         #03  pc 0000d672  /system/lib/libxvi020.so
         #04  pc 00010cce  /system/lib/libxvi020.so
         #05  pc 00004432  /system/lib/libwimax_jni.so
         #06  pc 00011e74  /system/lib/libdvm.so
         #07  pc 0004354a  /system/lib/libdvm.so
         #08  pc 00017088  /system/lib/libdvm.so
         #09  pc 0001c210  /system/lib/libdvm.so
         #10  pc 0001b0f8  /system/lib/libdvm.so
         #11  pc 00059c24  /system/lib/libdvm.so
         #12  pc 00059e3c  /system/lib/libdvm.so
         #13  pc 0004e19e  /system/lib/libdvm.so
         #14  pc 00011b94  /system/lib/libc.so
         #15  pc 0001173c  /system/lib/libc.so

code around pc:
ad115e9c 4620eddc bf00bd70 0001736e 0001734e 
ad115eac 4605b570 447c4c0a f7f44620 e006edc8 
ad115ebc 42ab68e3 68a0d103 f7f42122 6864edd2 
ad115ecc d1f52c00 44784803 edbef7f4 bf00bd70 
ad115edc 00017332 00017312 2100b51f 46682210 

code around lr:
afd110e8 e2166903 1a000018 e5945000 e1a02004 
afd110f8 e2055a02 e1a00005 e3851001 ebffed92 
afd11108 e3500000 13856002 1a000001 ea000009 
afd11118 ebfffe50 e1a01004 e1a00006 ebffed92 
afd11128 e1a01005 e1550000 e1a02006 e3a03000 

stack:
    4b857b10  40e43be8  
    4b857b14  00857280  
    4b857b18  00000000  
    4b857b1c  034e8968  
    4b857b20  ad118ce9  /system/lib/libnativehelper.so
    4b857b24  00000002  
    4b857b28  00000406
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;addr2line&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;utility(NDK 툴 체인에서 해당 기능을 찾으십시오)를 사용하여 충돌이 발생하는 함수를 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;addr2line -e -f libc.so 0001173c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디서 문제가 발생했는지 알게 될 겁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 이것은 libc에 있기 때문에 당신에게 도움이 되지 않을 것입니다.&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;그래서 당신은 그들이 사용하는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;arm-eabi-objdump&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최종 목표물을 찾는 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정말 힘든 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;hr&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트를 위해서입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전 소스 트리에서 안드로이드 네이티브 빌드를 꽤 오랫동안 하고 있었다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 오늘까지 NDK 문서를 주의 깊게 읽었습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NDK-r6가 출시된 이후로, 그것은 다음과 같은 유틸리티를 제공해 왔습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndk-stack&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 NDK-r9 타르볼이 포함된 NDK 공식 문서의 내용입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개요:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;ndk-stack&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;는 'adb logcat'의 출력에 나타나는 스택 트레이스를 필터링하고 공유 라이브러리 내의 주소를 해당하는 : 값으로 대체할 수 있는 간단한 도구입니다.&lt;/font&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;  I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
  I/DEBUG   (   31): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
  I/DEBUG   (   31): pid: 351, tid: 351  %gt;%gt;%gt; /data/local/ndk-tests/crasher &amp;lt;&amp;lt;&amp;lt;
  I/DEBUG   (   31): signal 11 (SIGSEGV), fault addr 0d9f00d8
  I/DEBUG   (   31):  r0 0000af88  r1 0000a008  r2 baadf00d  r3 0d9f00d8
  I/DEBUG   (   31):  r4 00000004  r5 0000a008  r6 0000af88  r7 00013c44
  I/DEBUG   (   31):  r8 00000000  r9 00000000  10 00000000  fp 00000000
  I/DEBUG   (   31):  ip 0000959c  sp be956cc8  lr 00008403  pc 0000841e  cpsr 60000030
  I/DEBUG   (   31):          #00  pc 0000841e  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #01  pc 000083fe  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #02  pc 000083f6  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #03  pc 000191ac  /system/lib/libc.so
  I/DEBUG   (   31):          #04  pc 000083ea  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #05  pc 00008458  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #06  pc 0000d362  /system/lib/libc.so
  I/DEBUG   (   31):
&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;  ********** Crash dump: **********
  Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
  pid: 351, tid: 351  &amp;gt;&amp;gt;&amp;gt; /data/local/ndk-tests/crasher &amp;lt;&amp;lt;&amp;lt;
  signal 11 (SIGSEGV), fault addr 0d9f00d8
  Stack frame #00  pc 0000841e  /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:13
  Stack frame #01  pc 000083fe  /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:5
  Stack frame #02  pc 000083f6  /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:9
  Stack frame #03  pc 000191ac  /system/lib/libc.so
  Stack frame #04  pc 000083ea  /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:14
  Stack frame #05  pc 00008458  /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:19
  Stack frame #06  pc 0000d362  /system/lib/libc.so
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;NDK 빌드 시스템(즉, NDK 빌드 시스템)을 사용하는 경우.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndk-build&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; 그런 하며,  $PROJECT_PATH/obj/local/합니다를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 여기서 장치의 ABI(즉, 장치의 ABI)를 나타냅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;armeabi&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;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;logcat&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 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;adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
&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;또는 -dump 옵션을 사용하여 로그캣을 입력 파일로 지정할 수 있습니다. 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;adb logcat &amp;gt; /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt
&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&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;logcat&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&gt;&lt;code&gt; *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;트레이스를 복사/붙여넣을 때 트레이스의 이 줄을 잊지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndk-stack&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제대로 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 항목:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 미래 버전&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndk-stack&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;adb logcat&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;지금은 이러한 단계를 수동으로 수행해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금으로 봐서는.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndk-stack&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;지정된 PC 주소에 가장 가까운 기능 진입점을 탐지하는 것이 유용할 수 있습니다(예: 위의 libc.so 예).&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;font class=&quot;papago-parent&quot;&gt;개인 SIGSEGV를 추적하려는 많은 사람들에게 도움이 되지 않을 것이라고 생각합니다만, 저의 (그리고 그것은 매우 어려웠습니다) 이와 전적으로 관련이 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://code.google.com/p/android/issues/detail?id=8709&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://code.google.com/p/android/issues/detail?id=8709&lt;/font&gt;&lt;/a&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;내 쓰레기장에 있는 libcrypto.so 은 나를 좀 속였습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패킷을 이미 봤는지 확인하려고 할 때 패킷 데이터의 MD5 해시를 수행하고, 봤다면 건너뜁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 한때 이 문제가 해시를 추적하는 것과 관련된 추한 쓰레드 문제라고 생각했지만, 알고 보니 java.security였습니다.&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;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 장치 UUID와 타임스탬프를 기반으로 모든 패킷에 채워 넣던 UID와 교체했습니다.&lt;/font&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;제가 제 상황에 있었던 분들에게 드릴 수 있는 교훈은 100% 자바 애플리케이션이라도 크래시 덤프에 기록된 네이티브 라이브러리와 심볼에 주목하여 단서를 찾으라는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SIGSEGV + lib.so name은 쓸모없는 코드=1 등보다 훨씬 더 멀리 갈 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 자바 앱이 네이티브 코드를 터치할 수 있는 위치에 대해 생각해 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 캔버스가 null인 것을 그리고 있는 서비스 + UI 쓰레드 문제라고 가정하는 실수를 저질렀습니다(SIGSEGV에서 구글링한 가장 일반적인 경우). 그리고 크래시 덤프에서 lib.so와 관련된 제가 작성한 코드와 완전히 관련이 있을 수 있다는 가능성을 무시했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자연스럽게 java.security는 속도를 위해 libcrypto.so 의 네이티브 구성 요소를 사용하게 되므로, 일단 내가 접속하면 구글에서 Android + SIGSEGV + libcrypto.so 를 검색하여 문서화된 문제를 발견했습니다.&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;공유 환경설정에 객체를 gson 변환 문자열로 저장하여 이 오류가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;gson String이 좋지 않아 개체를 검색하고 역직렬화하는 작업이 제대로 수행되지 않았습니다.&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;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 이 오류를 여러 번 받아서 해결했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네이티브 측에서 메모리를 관리할 경우 이 오류가 발생합니다.&lt;/font&gt;&lt;/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;잘못된 포인터 액세스일 가능성이 높습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SIGSEGV = 네이티브 코드에서 분할 오류.&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;대상 프로세스에 대한 gdb 네이티브 연결을 설정하고 디버거에서 잡을 수도 있습니다.&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;저는 안드로이드 스튜디오 4.1에서 good ole &lt;strong papago-id=&quot;55-1&quot;&gt;파일&lt;/strong&gt; &amp;gt; &lt;strong papago-id=&quot;55-3&quot;&gt;캐시 무효화 &lt;/strong&gt;&amp;amp; &lt;strong papago-id=&quot;55-3&quot;&gt;재시작&lt;/strong&gt;이 잘 된 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 이후로 더 이상 치명적인 신호는 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일러와 관련이 있는 건 확실하지만 확실할 순 없어요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AS를 다시 시작하면 내 에뮬레이터에서 충돌이 중지되었다는 것만 알고 있습니다.&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;Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하기 위해 반나절을 고생하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시를 지우고 .gradle 파일을 삭제하는 등 여러 가지 시도를 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;드디어 나&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;disable Instant Run&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 인스턴트 실행도 활성화한 후에 제 애플리케이션이 작동하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인스턴트 실행 문제일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;a href=&quot;https://stackoverflow.com/a/46999705/3117650&quot; papago-id=&quot;62-1&quot;&gt;다음&lt;/a&gt; 답변에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Studio Settings or Preferences (MAC용) -&amp;gt; Build, Execution, Deployment -&amp;gt; Instant Run으로 이동합니다.&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;그런 다음 맨 위에 있는 &quot;인스턴트 실행 사용&quot; 확인란의 선택을 취소합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매니페스트에서 Android 하드웨어 가속을 비활성화해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android:hardwareAccelerated=&quot;false&quot;
&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;onDraw()&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    private Canvas canvas;

    @Override
    protected void onDraw(Canvas canvas) {
        this.canvas = canvas;
        ....... }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) { 
            canvas.save(); // here
&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;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;pre&gt;&lt;code&gt;bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.myBitMap);
&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;문제를 해결한 것은 비트맵의 크기(&amp;gt;1000px 높이에서 700px로)를 줄이는 것이었습니다.&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;안드로이드 4.4.4 (Nexus, Samsungs)에서 SIGSEGV를 접한 적이 있는데 파싱에 치명적인 오류가 있음이 밝혀졌습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt; &lt;code&gt;String&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;DecimalFormat&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; static DecimalFormat decimalFormat = new DecimalFormat(&quot;###,###.###&quot;);
 void someMethod(String value) {
...
    Number number = decimalFormat.parse(value);//value is null, SIGSEGV will happen`
...
}
&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;Android &amp;gt; 21에서 Try/Catch로 성공적으로 처리되었습니다.&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;android.support&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;androidx&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;는 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;renderscript&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;/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;&lt;/font&gt;&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;build.gradle&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;renderscriptTargetApi 21
renderscriptSupportModeEnabled true
&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;import androidx.renderscript.Allocation;
import androidx.renderscript.Element;
import androidx.renderscript.RenderScript;
import androidx.renderscript.ScriptIntrinsicBlur;
&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;import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
&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;/p&gt;&lt;p papago-id=&quot;83&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 papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우 (Xamarin Forms를 사용하고 있습니다) 이 오류는 바인딩 오류로 인해 발생했습니다. 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;Label Grid.Column=&quot;4&quot; Grid.Row=&quot;1&quot; VerticalTextAlignment=&quot;Start&quot; HorizontalTextAlignment=&quot;Center&quot;  VerticalOptions=&quot;Start&quot; HorizontalOptions=&quot;Start&quot; FontSize=&quot;10&quot; TextColor=&quot;Pink&quot; Text=&quot;{Binding }&quot;&amp;gt;&amp;lt;/Label&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 뷰 모델 속성을 실수로 삭제했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Xamarin 개발자의 경우, 동일한 문제가 있으면 바인딩을 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 몇 시간 동안 이 문제를 해결하지 못했고 마침내 디버깅 중인 앱의 스토리지 세부 정보에 들어가 &quot;데이터 지우기&quot; 작업을 수행했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 뒤로는 잘 나갔습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저 같은 경우는 이상한 구글 서비스 gms 버그였습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트에 네이티브 C 코드를 추가했다면 이 답변이 도움이 될 것입니다.&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;안드로이드 프로젝트에서 네이티브 C 코드를 추가했습니다.&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;기본값을 nullptr로 설정한 문자열을 처리하기 전에 네이티브 문자열을 반환하는 코드에 액세스하려고 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 자바 코드로 가치를 검색하자 이 문제가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;90&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;그래서 나는 당신이 당신의 .cpp 파일을 확인하고 거기서 단서를 찾길 제안합니다.&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;vitamio library를 사용하는 경우 이 치명적인 오류가 발생합니다.&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;그런 다음 프로젝트에서 gradle targetSdkVersion이 23보다 작아야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 경우 안드로이드 프로파일러로 인해 문제가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Studio에서 &quot;Android Profiler&quot;와 &quot;End session&quot;을 클릭합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이러니하게도, 애플리케이션의 성능 문제도 크게 야기하고 있었습니다.&lt;/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;strong papago-id=&quot;95-1&quot;&gt;Flutter 2.8.1&lt;/strong&gt;을 사용하여 이 문제에 직면했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많이 검색했지만 아무 도움이 되지 않았습니다(사용하던 외부 패키지 비활성화, 디버깅, 캐시 무효화, 플러터 클린, 에뮬레이터 재시작 등).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 그 곳에서 한 일과 관련이 있는 것으로 밝혀졌습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CustomPainter&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;p papago-id=&quot;99&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;베타 채널(&lt;strong papago-id=&quot;99-1&quot;&gt;Flutter 2.9.0-0.1.pre&lt;/strong&gt;)로 전환하여 문제가 완전히 사라졌습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/schwabe/ics-openvpn&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;100-1&quot;&gt;ics-openvpn&lt;/a&gt;을 사용할 때 이 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdead0000 in tid 3548
&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;아래와 같이 &quot;&lt;strong papago-id=&quot;101-3&quot;&gt;abiFilters&lt;/strong&gt;&quot;에 &quot;&lt;strong papago-id=&quot;101-1&quot;&gt;x86&lt;/strong&gt;&quot;을 추가하여 간단히 수정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ndk {
   abiFilters &quot;armeabi-v7a&quot;, &quot;arm64-v8a&quot;, &quot;x86&quot;, &quot;x86_64&quot;
}
&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;JNI/네이티브 코드를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 언급한 내용 중 하나는 무효였지만, 간헐적이어서 그다지 명확하지는 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;103&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 기능이 제대로 반환되는지 여부를 확인하십시오. 반환되지 않을 경우 반환 명세서를 추가하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저에게 그 문제는 두 활동 사이의 좋지 않은 캐스팅 때문이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근에 이 방법을 액티비티 1에서 다른 2로 옮겼습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 해서 리팩터는 이 노골적인 출연진을 그대로 남겨두었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 대신에&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;((Activity1) mainActivity).hideDialog();
&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;((Activity2) mainActivity).hideDialog();
&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;참고: 하지만 안드로이드 8.0에서는 이 오류가 발생하지 않았습니다. 그 이유는 아직 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;107&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;*** 도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;108&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;108-1&quot;&gt;메모리 문제&lt;/strong&gt;로 인해 세그먼트 오류가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;108-3&quot;&gt;저&lt;/strong&gt;의 구조는 많은 변수와 배열을 가지고 있으며, 크기가 1024인 배열을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사이즈를 512로 줄이면서 에러가 사라졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;110&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신: &lt;em papago-id=&quot;110-1&quot;&gt;이것은 해결책이지 해결책이 아닙니다.&lt;/em&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;110-1&quot;&gt; 구조 크기를 찾아야 &lt;strong papago-id=&quot;110-1-1&quot;&gt;하며 동적&lt;/strong&gt; 메모리 할당이 더 나은 옵션입니다.&lt;/em&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;내부에서 ViewTreeOver를 사용할 때 이 오류가 발생했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onDraw()&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    ViewTreeObserver vto = mTextView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // some animation        
        }
    });
 }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;113&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱에 추가된 패키지(FancyShowCaseView)에서 이 문제가 발생하여 사전 막대사탕에서 이 문제가 발생했습니다.&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;114&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android의 PDF API를 사용하여 PDF를 생성할 때 문제가 발생하여 pdf 페이지를 닫은 후 canvas.save() 및 canvas.restore()를 실수로 사용했습니다.&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;나의 경우 안드로이드의 PdfDocument API를 사용할 때 라인이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;your_pdf_doc_object.finishPage(your_page)&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;/p&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;Android Studio의 코드 Java&lt;/strong&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;저는 이 페이지의 모든 사전답변을 포함하여 수백만 페이지를 공부했습니다.&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;최종적으로 모든 잠재적 위치가 오류를 일으킬 수 있는지 확인했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수정 전 제 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;surfaceView.draw(r1, r2, r3, r4, r5, r8);
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;synchronized (this) {
surfaceView.draw(r1, r2, r3, r4, r5, r8);
&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;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;123&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공유 환경설정으로 인해 이 문제가 발생했습니다. 데이터를 저장하는 두 가지 방법이 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나는 editor.apply()를 사용하고 다른 하나는 editor.commit()를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 editor.commit()로 바꿨는데 다 잘 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법1&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    private void saveId(int id) {
    SharedPreferences preferences = getSharedPreferences(&quot;saved_id&quot;, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putInt(&quot;bId&quot;, id);
    editor.commit();
}    
&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;방법2&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private void saveUserData(String saveName, String data){
    SharedPreferences preferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(saveName,data);
    editor.commit();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;125&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Xamarin 프로젝트에서 이러한 오류가 발생하는 사람은 문제를 발생시키는 데 필요한 상호 작용을 정확히 파악하고(단추 탭 등), 관리 예외를 적용하기 위해 시도해 볼 가치가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 경우 안드로이드 치명 신호 11(SIGSEGV) 오류는 원래 쉽게 고칠 수 있는 관리형 C# 예외로 인해 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Xamarin이 디버그 출력에 관리 예외를 보고하지 않는 이유를 이해할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;126&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17840521/android-fatal-signal-11-sigsegv-at-0x636f7d89-code-1-how-can-it-be-tracked&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>android</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/540</guid>
      <comments>https://cafebook.tistory.com/540#entry540comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:45:21 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio Nuget Package 관리자 콘솔에서 &amp;quot;닫히지 않은&amp;quot; powershell 명령 중단</title>
      <link>https://cafebook.tistory.com/539</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio Nuget Package 관리자 콘솔에서 &quot;닫히지 않은&quot; powershell 명령 중단&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;NuGet Package Manager 콘솔에서 잘못된 PowerShell 명령을 실행하고 콘솔을 잠갔습니다.&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;PM&amp;gt; Get-Project -all | Where { $_.ProjectName -imatch &quot;GPEC.Personne }
&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;strong papago-id=&quot;3-1&quot;&gt;&amp;gt;&amp;gt;&lt;/strong&gt;가 프롬프트로 표시되어 이 모드를 종료할 수 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;콘솔을 닫고 다시 여는 것이 도움이 되지 않았습니다(VS를 다시 시작해야 함).&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;이 경우 잘못된 명령어를 정상적으로 취소하고 표준 PM&amp;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&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;&amp;gt;&amp;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&gt;&lt;font class=&quot;papago-parent&quot;&gt;중복 따옴표로 묶은 문자열을 열었지만 완료하지 못했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Clear Console(콘솔 지우기) 도구 모음 버튼을 눌러 이 모드를 벗어납니다.&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;VS 콘솔 창에는 &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;em papago-id=&quot;8-1&quot;&gt;이&lt;/em&gt; 버튼은 &lt;em papago-id=&quot;8-1&quot;&gt;명령이 실제로&lt;/em&gt; 실행 &lt;em papago-id=&quot;8-1&quot;&gt;중인 경우에만 활성화&lt;/em&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;승인된 답변에 따르면 OP는 실제로 실행 명령을 중단할 필요가 없었던 것으로 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이 대답은 정말로 명령을 중단해야 하는 &lt;em papago-id=&quot;9-1&quot;&gt;사람들&lt;/em&gt;에게 유용할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;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;Nuget Console&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;blockquote&gt; 
 &lt;p papago-id=&quot;14&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;15&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;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Add-Migraion &quot;'직원' 모델 추가&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;&amp;gt;&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&gt;&lt;/font&gt;&lt;code&gt;&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&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&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;때로는 일반 Windows 작업 관리자를 찾아 작업을 종료할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&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;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;Debuggable Package Manager&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Visual Studio와 함께 설치된 프로그램(이 프로그램이 어느 버전에서 시작되었는지는 확실하지 않음).&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;프로젝트에 적합한 폴더에 수동으로 CD를 작성해야 하지만 특정 작업에 대해서는 보다 안정적일 수 있으며 여러 창을 열 수 있으므로 좋을 수 있습니다.&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;그리고 yes - &lt;kbd papago-id=&quot;26-3&quot;&gt;C&lt;/kbd&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/20142702/aborting-an-unclosed-powershell-command-in-visual-studio-nuget-package-manager&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/539</guid>
      <comments>https://cafebook.tistory.com/539#entry539comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:45:08 +0900</pubDate>
    </item>
    <item>
      <title>ASP 간의 차이.NET 웹 후크 및 신호-R</title>
      <link>https://cafebook.tistory.com/538</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASP 간의 차이.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET 웹 후크 및 신호-R&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://blogs.msdn.com/b/webdev/archive/2015/09/15/sending-webhooks-with-asp-net-webhooks-preview.aspx&quot; papago-id=&quot;1-1&quot;&gt;ASP&lt;/a&gt;의 차이점은 무엇입니까&lt;a href=&quot;http://blogs.msdn.com/b/webdev/archive/2015/09/15/sending-webhooks-with-asp-net-webhooks-preview.aspx&quot; papago-id=&quot;1-1&quot;&gt;?&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/b/webdev/archive/2015/09/15/sending-webhooks-with-asp-net-webhooks-preview.aspx&quot; papago-id=&quot;1-1&quot;&gt;NET&lt;/a&gt; 웹 &lt;a href=&quot;http://blogs.msdn.com/b/webdev/archive/2015/09/15/sending-webhooks-with-asp-net-webhooks-preview.aspx&quot; papago-id=&quot;1-1&quot;&gt;후크&lt;/a&gt;와 시그널-R?&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;신호 R은 ASP 내에서 알림을 위한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-1&quot;&gt;웹소켓&lt;/strong&gt;을 이용한 NET 앱.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WebSockets를 통해 이벤트 알림을 교환할 수 있지만, 일정한 네트워크 연결이 필요합니다.&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;strong papago-id=&quot;3-0&quot;&gt;후크&lt;/strong&gt;는 다른 웹 응용 프로그램 및 기타 외부 서비스에 대한 이벤트 알림을 위한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(B2B 커뮤니케이션을 생각해 보십시오.)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 누군가가 당신의 페이팔 계정으로 당신에게 돈을 보낼 때 당신은 웹훅을 받을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PayPal은 미리 정의된 URL 핸들러에게 POST 요청을 실행한 다음 앱에서 해당 알림을 사용하여 작업을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 먼저 페이팔 쪽에 모든 것을 미리 구성해놓으세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 수신 POST 요청을 처리할 응용 프로그램을 설정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트 알림이 실시간으로 사용자에게 &quot;푸시(push)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트를 기다리는 동안 네트워크 연결을 열 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 둘은 상호보완적일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 PayPal에서 WebHook을 받을 때 웹 앱에서 로그인한 사용자(SignalR/WebSockets 사용)에게 성공적으로 돈이 수신되었음을 알릴 수 있습니다.&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;TLDR: 서로 다른 웹 애플리케이션 간의 이벤트 알림&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;WebHooks는 다양한 SaaS 서비스 간에 이벤트 알림을 통합하기 위한 간단한 패턴입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;통합하려는 서비스가 WebHooks를 지원하는 경우 이를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 시그널R을 지원한다면 당신은 그것을 사용할 수 있습니다.&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;a href=&quot;https://social.msdn.microsoft.com/profile/henrik%20f%20nielsen/&quot; papago-id=&quot;7-1&quot; rel=&quot;nofollow&quot;&gt;Henrik &lt;/a&gt;F&lt;a href=&quot;https://social.msdn.microsoft.com/profile/henrik%20f%20nielsen/&quot; papago-id=&quot;7-1&quot; rel=&quot;nofollow&quot;&gt; Nielsen&lt;/a&gt; 게시물 확인하기 http://blogs.msdn.com/b/webdev/archive/2015/09/04/introducing-microsoft-asp-net-webhooks-preview.aspx&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;URL : https://stackoverflow.com/questions/32602644/difference-between-asp-net-webhooks-and-signal-r&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ASP.NET</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/538</guid>
      <comments>https://cafebook.tistory.com/538#entry538comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:45:02 +0900</pubDate>
    </item>
    <item>
      <title>larravel 5.3 로그아웃 리디렉션 경로를 설정하는 방법은 무엇입니까?</title>
      <link>https://cafebook.tistory.com/537</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;larravel 5.3 로그아웃 리디렉션 경로를 설정하는 방법은 무엇입니까?&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;Laravel 5.3에서 로그아웃한 후 특정 페이지로 리디렉션할 수 있는 우아한 솔루션은 없습니까?&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;호출되는 기능은 Authentication &lt;strong papago-id=&quot;2-1&quot;&gt;Users&lt;/strong&gt;: 특성에서 가져온 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function logout(Request $request)
{
    $this-&amp;gt;guard()-&amp;gt;logout();

    $request-&amp;gt;session()-&amp;gt;flush();

    $request-&amp;gt;session()-&amp;gt;regenerate();

    return redirect('/');
}
&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;기사에서 답을 찾아냈습니다: https://codeneverlied.com/how-to-set-logout-redirect-path-in-laravel-5-8-and-before/&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;Auth\LoginController에는 다음이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;use AuthenticatesUsers;
&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;use AuthenticatesUsers {
    logout as performLogout;
}
&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;logout()&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;LoginController의 메서드:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function logout(Request $request)
{
    $this-&amp;gt;performLogout($request);
    return redirect()-&amp;gt;route('your_route');
}
&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;logout()&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;해당 특성의 메소드에는 3개의 라인만 있으므로(사용자를 시스템에서 로그아웃하는 데 사용됨) 메소드에 복사할 수 있지만 항상 DRY 원칙(반복하지 않음)을 따르고 코드를 가능한 한 많이 다시 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h1 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라라벨 &amp;gt; 5.7&lt;/font&gt;&lt;/h1&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;loggedOut&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 상속할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LoginController&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;logout&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;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;17-0&quot;&gt;LoginController.php&lt;/strong&gt; -&amp;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;strong papago-id=&quot;18-0&quot;&gt;내 로그인 컨트롤러.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;18-0&quot;&gt;php&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyLoginController extends LoginController {

protected $redirectAfterLogout = '/goodbye';

    public function logout(Request $request)
    {
        $this-&amp;gt;guard()-&amp;gt;logout();
        $request-&amp;gt;session()-&amp;gt;flush();
        $request-&amp;gt;session()-&amp;gt;regenerate();
        return redirect($this-&amp;gt;redirectAfterLogout);
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 인증 경로를 그에 맞게 업데이트해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;20-1&quot;&gt;Laravel-5.2&lt;/strong&gt;를 사용하고 있는데, 제가 사용한 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function logout()
{
    Auth::logout();
    Session::flush();
    return redirect('/');
}
&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;use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조종기에.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가가 그것을 매일 보고 있고 그들이 사용하고 있는 라벨의 버전이 5.7이라고 가정합니다.&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;LoginController.php에 이 행 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-php prettyprint-override&quot;&gt;&lt;code&gt;public function logout()
{
    Auth::logout();
    return redirect()-&amp;gt;to('/your-route');
}
&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;이는 Larravel이 제공하는 Out of Box 인증 모듈을 사용하고 있다고 가정합니다.&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;laravel 5.3의 Auth::routes 메서드는 GET 경로 대신 /logout에 대한 POST 경로를 등록합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 다른 웹 응용프로그램이 사용자의 응용프로그램에서 로그아웃할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업그레이드하려면 POST 동사를 사용하도록 로그아웃 요청을 변환하거나 Routes/web.php:- 파일에 이 경로를 추가하여 /logout URI에 대한 고유 GET 경로를 등록해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Route::get('/logout', 'Auth\LoginController@logout');
&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;그리고 LoginController.php에 정의된 대로 '/' 디렉토리로 리디렉션할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인용:-&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://laravel.com/docs/5.3/upgrade&quot; rel=&quot;noreferrer&quot; papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://laravel.com/docs/5.3/upgrade&lt;/font&gt;&lt;/a&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;LoginController&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;App\Http\Controllers\Auth\LoginController&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function logout(Request $request){
    $this-&amp;gt;guard()-&amp;gt;logout();
    $request-&amp;gt;session()-&amp;gt;flush();
    $request-&amp;gt;session()-&amp;gt;regenerate();

    return redirect()-&amp;gt;route('you_route_name');
}
&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;routes/web.php에서 사용하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
&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;Events\Logout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이 이벤트를 수신하는 수신기를 만들고 거기에 논리를 추가할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;청취자에 대한 자세한 내용은 여기 https://laravel.com/docs/5.3/events 에서 확인할 수 있습니다.&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;AuthController의 기본 설정을 사용하는 경우 이 변수를 맨 위에 추가한 다음 문자열을 변경하여 원하는 곳으로 리디렉션합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protected $redirectAfterLogout = '/';
&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;AuthenticationsUsers 클래스에는 이 변수를 확인하는 로그아웃 기능이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function logout()
{
        Auth::guard($this-&amp;gt;getGuard())-&amp;gt;logout();

    return redirect(property_exists($this, 'redirectAfterLogout') ? $this-&amp;gt;redirectAfterLogout : '/');
}
&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;로그아웃 코드를 반복하지 않고 DRY를 따르려면 다음을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;39-1&quot;&gt;Auth/LoginController&lt;/em&gt;에서 사용자 지정 로그아웃 경로 추가, 호출&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Auth::logout()&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;/li&gt; 
 &lt;li papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애프터 미들웨어(&lt;em papago-id=&quot;41-3&quot;&gt;RedirectAfterLogout&lt;/em&gt;이라고 함)를 추가하여 로그아웃 경로에 추가합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;승인된 답변은 괜찮지만, 로그아웃 논리를 완전히 우회하여 로그아웃된 내용을 덮어쓸 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아웃 메소드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}
&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;strong papago-id=&quot;43-1&quot;&gt;Laravel 5.8&lt;/strong&gt;에서 다음 경로를 찾습니다.&lt;/font&gt;&lt;/p&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;앱\Http\Controller\&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Auth\LoginController.php&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;use Illuminate\Http\Request;*
&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&gt;&lt;code&gt;public function logout(Request $request){
    $this-&amp;gt;guard()-&amp;gt;logout();

    $request-&amp;gt;session()-&amp;gt;invalidate();

    return $this-&amp;gt;loggedOut($request) ?: redirect('/Where/You/want/to/redirect');;
}
&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;Illuminate Support package: LoginController.php의 로그아웃 메서드를 재정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; use Illuminate\Support\Facades\Auth;

 public function logout()
     {
         Auth::logout();

     return redirect('/wherever/you/want');
 }
&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;Authenticated Users 특성(laravel 7의 벤더/laravel/ui/auth-backend/Authenticated Users)에서 Laravel의 기본 로그아웃 기능 코드를 검토하면 리디렉션을 위한 하드 코딩된 경로가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;원본에서 URL을 변경해야 한다는 뜻이지만 공급업체를 통해 파일을 편집하는 것은 잘못된 방법입니다. 그러나 특성을 통해 코드를 재정의하는 더 나은 방법을 얻을 수 있습니다. 따라서 모든 로그아웃 기능의 코드를 LoginController 페이지에 붙여넣고 redirect('/') 기능의 매개 변수를 원하는 URL로 변경하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 내 코드는 LoginController에 입력하는 코드와 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * Log the user out of the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function logout(Request $request)
{
    $this-&amp;gt;guard()-&amp;gt;logout();

    $request-&amp;gt;session()-&amp;gt;invalidate();

    $request-&amp;gt;session()-&amp;gt;regenerateToken();

    if ($response = $this-&amp;gt;loggedOut($request)) {
        return $response;
    }

    return $request-&amp;gt;wantsJson()
        ? new Response('', 204)
        : redirect('/login');
}
&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;'/home'&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;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;HomeController&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 선을 제거해야 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$this-&amp;gt;middleware('auth');&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;__construct&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;/p&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Laravel 5.3으로 오래된 웹사이트를 업데이트했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에는 &lt;a href=&quot;https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;55-3&quot;&gt;업그레이드 가이드&lt;/a&gt;에서 조언한 대로 &lt;a href=&quot;https://github.com/laravel/laravel/tree/5.3/app/Http/Controllers/Auth&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;55-1&quot;&gt;Laravel Github&lt;/a&gt;에서 4개의 Auth 컨트롤러를 새로 추가하는 작업이 포함되었습니다.&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;신규 컨트롤러 3개: RegisterController.php, LoginController.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php 및 ResetPassword Controller.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php 모두 코드 블록을 포함합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * Where to redirect users after resetting their password.
 *
 * @var string
 */
protected $redirectTo = '/home';
&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;font class=&quot;papago-parent&quot;&gt;적어도 Laravel 5.3에서는 효과가 있었습니다(2021년 4월 자료).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;58-0&quot;&gt;라라벨 9에서는 100% 작동합니다.&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;이 클래스를 Login &lt;strong papago-id=&quot;58-2&quot;&gt;Controller&lt;/strong&gt; 상단으로 가져옵니다&lt;strong papago-id=&quot;58-2&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;

 protected function logout(Request $request)
    {
        $this-&amp;gt;guard()-&amp;gt;logout();
        Auth::logout();
        Session::flush();
        Session::regenerate();
        return redirect('/login');
    }
&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;Laravel 8+에서 /vendor/laravel/ui/auth-backend/AuthenticateUsers.php &lt;a href=&quot;https://i.stack.imgur.com/bcjlT.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;59-1&quot;&gt;Laravel-AuthenticateUsers.php&lt;/a&gt;에서 로그아웃 방법으로 리디렉션 메서드를 편집해 보십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 갈 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php&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;logout&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;return redirect('/');&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 경로 주소로.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;64&quot; papago-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/39327970/how-to-set-laravel-5-3-logout-redirect-path&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>php</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/537</guid>
      <comments>https://cafebook.tistory.com/537#entry537comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:56 +0900</pubDate>
    </item>
    <item>
      <title>jetty 업데이트 9.4가 jndi lookup으로 시작되지 않음</title>
      <link>https://cafebook.tistory.com/536</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jetty 업데이트 9.4가 jndi lookup으로 시작되지 않음&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;저는 v9.3.13에서 jetty의 최신 버전 9.4.9로 앱을 업데이트했고 모든 것이 좋아 보이지만 다음 오류로 jetty 서버를 시작할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ExportStep': Cannot resolve reference to bean 'jobRepository' while setting bean property 'jobRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobRepository' defined in class path resource [applicationContext-ui.xml]: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext-dao.xml]: Cannot resolve reference to bean 'rmUiDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rmUiDataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/amsDs_NonXA'
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1419)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:618)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:938)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:890)
    at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:558)
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:853)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:370)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:785)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:287)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:46)
    at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:192)
    at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:505)
    at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:151)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
    at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:447)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
    at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610)
    at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529)
    at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392)
    at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:313)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:150)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:579)
    at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:240)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138)
    at org.eclipse.jetty.server.Server.start(Server.java:419)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
    at org.eclipse.jetty.server.Server.doStart(Server.java:386)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1588)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1512)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1511)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:220)
    at org.eclipse.jetty.start.Main.start(Main.java:486)
    at org.eclipse.jetty.start.Main.main(Main.java:77)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobRepository' defined in class path resource [applicationContext-ui.xml]: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext-dao.xml]: Cannot resolve reference to bean 'rmUiDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rmUiDataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/amsDs_NonXA'
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1419)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    ... 59 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext-dao.xml]: Cannot resolve reference to bean 'rmUiDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rmUiDataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/amsDs_NonXA'
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1419)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    ... 69 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rmUiDataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/amsDs_NonXA'
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    ... 79 more
Caused by: javax.naming.NameNotFoundException; remaining name 'jdbc/amsDs_NonXA'
    at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:499)
    at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:546)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:104)
    at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
    at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:231)
    at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:217)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1573)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511)
    ... 86 more
&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;JNDI 리소스를 별도의 파일로 구성하여 jetty v6.1.11부터 작업 중인 jetty start에서 사용할 수 있도록 합니다.&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;명령을 실행하여 아래와 같이 jetty 서버를 시작했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jetty/bin/jetty.sh start jetty/etc/jetty.xml jetty/etc/jetty-ams.xml jetty/etc/jetty-ssl.xml jetty/etc/mariadb.xml
&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;mariadb.xml&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;!DOCTYPE Configure PUBLIC &quot;-//Jetty//Configure//EN&quot; &quot;http://www.eclipse.org/jetty/configure_9_3.dtd&quot;&amp;gt;

&amp;lt;Configure id=&quot;Server&quot; class=&quot;org.eclipse.jetty.server.Server&quot;&amp;gt;

    &amp;lt;New id=&quot;DS1&quot; class=&quot;org.eclipse.jetty.plus.jndi.Resource&quot;&amp;gt;
        &amp;lt;Arg&amp;gt;jdbc/amsDs&amp;lt;/Arg&amp;gt;
        &amp;lt;Arg&amp;gt;
            &amp;lt;New class=&quot;com.atomikos.jdbc.AtomikosDataSourceBean&quot;&amp;gt;
                &amp;lt;Set name=&quot;minPoolSize&quot;&amp;gt;20&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;maxPoolSize&quot;&amp;gt;200&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;xaDataSourceClassName&quot;&amp;gt;org.mariadb.jdbc.MySQLDataSource&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;UniqueResourceName&quot;&amp;gt;MySqlXA&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;testQuery&quot;&amp;gt;SELECT 1&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;reapTimeout&quot;&amp;gt;0&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;borrowConnectionTimeout&quot;&amp;gt;60&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;maxIdleTime&quot;&amp;gt;10800&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;maintenanceInterval&quot;&amp;gt;60&amp;lt;/Set&amp;gt;

                &amp;lt;Get name=&quot;xaProperties&quot;&amp;gt;
                    &amp;lt;Call name=&quot;setProperty&quot;&amp;gt;
                        &amp;lt;Arg&amp;gt;url&amp;lt;/Arg&amp;gt;
                        &amp;lt;Arg&amp;gt;jdbc:mariadb://&amp;lt;SystemProperty name=&quot;DB_MySQL_HOST&quot; default=&quot;localhost&quot; /&amp;gt;:&amp;lt;SystemProperty name=&quot;DB_MySQL_PORT&quot; default=&quot;3306&quot; /&amp;gt;/&amp;lt;SystemProperty name=&quot;DB_SERVICE_NAME&quot; default=&quot;sac&quot; /&amp;gt;?pinGlobalTxToPhysicalConnection=true&amp;lt;/Arg&amp;gt;
                    &amp;lt;/Call&amp;gt;
                    &amp;lt;Call name=&quot;setProperty&quot;&amp;gt;
                         &amp;lt;Arg&amp;gt;user&amp;lt;/Arg&amp;gt;
                         &amp;lt;Arg&amp;gt;&amp;lt;SystemProperty name=&quot;DB_USER&quot; default=&quot;&quot;/&amp;gt;&amp;lt;/Arg&amp;gt;
                    &amp;lt;/Call&amp;gt;
                    &amp;lt;Call name=&quot;setProperty&quot;&amp;gt;
                        &amp;lt;Arg&amp;gt;password&amp;lt;/Arg&amp;gt;
                        &amp;lt;Arg&amp;gt;&amp;lt;SystemProperty name=&quot;DB_USER_PASSWORD&quot; default=&quot;&quot;/&amp;gt;&amp;lt;/Arg&amp;gt;
                    &amp;lt;/Call&amp;gt;
                &amp;lt;/Get&amp;gt;
            &amp;lt;/New&amp;gt;
        &amp;lt;/Arg&amp;gt;
    &amp;lt;/New&amp;gt;
    &amp;lt;New id=&quot;DS2&quot; class=&quot;org.eclipse.jetty.plus.jndi.Resource&quot;&amp;gt;     
        &amp;lt;Arg&amp;gt;jdbc/amsDs_NonXA&amp;lt;/Arg&amp;gt;
        &amp;lt;Arg&amp;gt;
            &amp;lt;New class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;&amp;gt;
                &amp;lt;Set name=&quot;driverClass&quot;&amp;gt;org.mariadb.jdbc.Driver&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;jdbcUrl&quot;&amp;gt;jdbc:mariadb://&amp;lt;SystemProperty name=&quot;DB_MySQL_HOST&quot; default=&quot;localhost&quot;/&amp;gt;:&amp;lt;SystemProperty name=&quot;DB_MySQL_PORT&quot; default=&quot;3306&quot;/&amp;gt;/&amp;lt;SystemProperty name=&quot;DB_SERVICE_NAME&quot; default=&quot;sac&quot;/&amp;gt;?useUnicode=true&amp;amp;amp;characterEncoding=utf8&amp;amp;amp;failOverReadOnly=false&amp;amp;amp;connectTimeout=&amp;lt;SystemProperty name=&quot;DB_MySQL_CONNECT_TIMEOUT&quot; default=&quot;30000&quot;/&amp;gt;&amp;amp;amp;socketTimeout=&amp;lt;SystemProperty name=&quot;DB_MySQL_TIMEOUT&quot; default=&quot;30000&quot;/&amp;gt;&amp;amp;amp;autoReconnect=true&amp;amp;amp;maxReconnects=1000&amp;amp;amp;secondsBeforeRetryMaster=120&amp;amp;amp;rewriteBatchedStatements=&amp;lt;SystemProperty name=&quot;DB_REWRITE_BATCH_STATEMENTS&quot; default=&quot;false&quot;/&amp;gt;&amp;amp;amp;useCompression=&amp;lt;SystemProperty name=&quot;DB_MYSQL_USE_COMPRESSION&quot; default=&quot;false&quot;/&amp;gt;&amp;amp;amp;useServerPrepStmts=&amp;lt;SystemProperty name=&quot;DB_MYSQL_USE_SERVER_PRE_STMTS&quot; default=&quot;false&quot;/&amp;gt;&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;user&quot;&amp;gt;&amp;lt;SystemProperty name=&quot;DB_USER&quot; default=&quot;&quot;/&amp;gt;&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;password&quot;&amp;gt;&amp;lt;SystemProperty name=&quot;DB_USER_PASSWORD&quot; default=&quot;&quot;/&amp;gt;&amp;lt;/Set&amp;gt;  
                &amp;lt;Set name=&quot;minPoolSize&quot;&amp;gt;5&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;maxPoolSize&quot;&amp;gt;50&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;initialPoolSize&quot;&amp;gt;5&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;acquireIncrement&quot;&amp;gt;3&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;numHelperThreads&quot;&amp;gt;6&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;maxIdleTime&quot;&amp;gt;10800&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;idleConnectionTestPeriod&quot;&amp;gt;3600&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;maxConnectionAge&quot;&amp;gt;14400&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;preferredTestQuery&quot;&amp;gt;SELECT 1;&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;testConnectionOnCheckin&quot;&amp;gt;false&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&quot;acquireRetryAttempts&quot;&amp;gt;100&amp;lt;/Set&amp;gt;
            &amp;lt;/New&amp;gt;
        &amp;lt;/Arg&amp;gt;
   &amp;lt;/New&amp;gt;
   &amp;lt;New id=&quot;DS3&quot; class=&quot;org.eclipse.jetty.plus.jndi.Resource&quot;&amp;gt;
       &amp;lt;Arg&amp;gt;jdbc/amsReportingDs&amp;lt;/Arg&amp;gt;
           &amp;lt;Arg&amp;gt;
               &amp;lt;New class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;&amp;gt;

                   &amp;lt;Set name=&quot;driverClass&quot;&amp;gt;org.mariadb.jdbc.MariaDbPooledConnection&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;jdbcUrl&quot;&amp;gt;jdbc:mariadb://&amp;lt;SystemProperty name=&quot;REPORTING_DB_MYSQL_HOST&quot; default=&quot;localhost&quot;/&amp;gt;:&amp;lt;SystemProperty name=&quot;REPORTING_DB_MYSQL_PORT&quot; default=&quot;3306&quot;/&amp;gt;/&amp;lt;SystemProperty name=&quot;REPORTING_DB_MYSQL_SERVICE&quot; default=&quot;analytics_data&quot;/&amp;gt;?useUnicode=true&amp;amp;amp;characterEncoding=utf8&amp;amp;amp;failOverReadOnly=false&amp;amp;amp;connectTimeout=30000&amp;amp;amp;socketTimeout=30000&amp;amp;amp;autoReconnect=true&amp;amp;amp;maxReconnects=1000&amp;amp;amp;secondsBeforeRetryMaster=120&amp;amp;amp;rewriteBatchedStatements=false&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;user&quot;&amp;gt;&amp;lt;SystemProperty name=&quot;REPORTING_DBUSER&quot; default=&quot;&quot;/&amp;gt;&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;password&quot;&amp;gt;&amp;lt;SystemProperty name=&quot;REPORTING_DB_PASSWORD&quot; default=&quot;&quot;/&amp;gt;&amp;lt;/Set&amp;gt;  
                   &amp;lt;Set name=&quot;minPoolSize&quot;&amp;gt;5&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;maxPoolSize&quot;&amp;gt;50&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;initialPoolSize&quot;&amp;gt;5&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;acquireIncrement&quot;&amp;gt;3&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;numHelperThreads&quot;&amp;gt;6&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;maxIdleTime&quot;&amp;gt;10800&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;idleConnectionTestPeriod&quot;&amp;gt;360&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;maxConnectionAge&quot;&amp;gt;14400&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;preferredTestQuery&quot;&amp;gt;SELECT 1;&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;testConnectionOnCheckin&quot;&amp;gt;false&amp;lt;/Set&amp;gt;
                   &amp;lt;Set name=&quot;acquireRetryAttempts&quot;&amp;gt;3&amp;lt;/Set&amp;gt;
         &amp;lt;/New&amp;gt; 
      &amp;lt;/Arg&amp;gt;
  &amp;lt;/New&amp;gt;
&amp;lt;/Configure&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 applicationContext 파일의 데이터 소스를 다음과 같이 구성합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;jee:jndi-lookup id=&quot;rmUiDataSource&quot; jndi-name=&quot;jdbc/amsDs_NonXA&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;위 오류가 발생하는 이유를 모르겠습니다. 도와줄 수 있는 사람이 있습니까?&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;데이터 소스 파일 경로를 start.ini 파일로 업데이트하여 해결하였습니다.&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;URL : https://stackoverflow.com/questions/50234054/jetty-update-9-4-not-starting-with-jndi-lookup&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/536</guid>
      <comments>https://cafebook.tistory.com/536#entry536comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:47 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트의 'descript' 키워드</title>
      <link>https://cafebook.tistory.com/535</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트의 'descript' 키워드&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;describe('deviceready', function() {
    it('should report that it fired', function() {
        spyOn(app, 'report');
        app.deviceready();
        expect(app.report).toHaveBeenCalledWith('deviceready');
    });
});
&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;describe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키워드 do?&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&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- &lt;strong papago-id=&quot;5-1&quot;&gt;폰갭&lt;/strong&gt; 어플입니다.&lt;/font&gt;&lt;/font&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;em papago-id=&quot;6-1&quot;&gt;spine.js&lt;/em&gt;와 &lt;em papago-id=&quot;6-3&quot;&gt;jQuery&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;a href=&quot;http://jasmine.github.io/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;재스민&lt;/a&gt; 테스트 프레임워크의 함수입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순히 &quot;it&quot; 함수에 의해 열거된 테스트 케이스 모음을 설명합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://mochajs.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;mochajs&lt;/a&gt; 프레임워크에서도 사용됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Describe&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;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://jasmine.github.io/tutorials/your_first_suite&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;10-1&quot;&gt;재스민 문서&lt;/a&gt;에 의하면&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;describe&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;jest&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;describe&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&gt;&lt;a href=&quot;https://jestjs.io/docs/api#describename-fn&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://jestjs.io/docs/api#describename-fn&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;&quot;description&quot; 블럭은 농담으로 테스트를 함께 그룹화하는 데 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 링크를 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scoping&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;code&gt;https://jestjs.io/docs/setup-teardown&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Describe()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 Jest 테스트 프레임워크의 함수입니다.&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;&lt;a href=&quot;https://jestjs.io/docs/api#describename-fn&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-1&quot;&gt;우스갯소리&lt;/a&gt; 문서에 의하면&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;describe(name, fn)&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;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;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12209582/the-describe-keyword-in-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/535</guid>
      <comments>https://cafebook.tistory.com/535#entry535comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:37 +0900</pubDate>
    </item>
    <item>
      <title>SpringBoot @SqsListener - 작동하지 않음 - 예외 - 작업 거부예외.</title>
      <link>https://cafebook.tistory.com/534</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SpringBoot @SqsListener - 작동하지 않음 - 예외 - 작업 거부&lt;/font&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;이미 큐에 5000개의 메시지가 있는 AWS SQS가 있습니다(Sample Message는 'Hello @ 1'과 같습니다). SpringBoot Application을 만들었고 Component Class 중 하나에서 SQS에서 메시지를 읽을 수 있는 메서드를 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;package com.example.aws.sqs.service;

import org.springframework.cloud.aws.messaging.listener.SqsMessageDeletionPolicy;
import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class MessageReceiverService {   

@SqsListener(value = { &quot;${cloud.aws.sqs.url}&quot; }, deletionPolicy = SqsMessageDeletionPolicy.ALWAYS)
public void readMessage(String message){
    log.info(&quot;Reading Message... {}&quot;, message);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;}&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;@SpringBootApplication 
public class AwsSqsApplicationConsumer {
public static void main(String[] args) {
    SpringApplication.run(AwsSqsApplicationConsumer.class, args);
}
}
&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;s.c.a.m.l.SimpleMessageListenerContainer : An Exception occurred while polling queue '&amp;lt;my sqs name&amp;gt;'. The failing operation will be retried in 10000 milliseconds
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@7c1594a5[Running, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 20]] did not accept task: org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$SignalExecutingRunnable@1cbd9ef2
at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:309) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$AsynchronousMessageListener.run(SimpleMessageListenerContainer.java:286) ~[spring-cloud-aws-messaging-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_65]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_65]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65]
Caused by: java.util.concurrent.RejectedExecutionException: Task org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$SignalExecutingRunnable@1cbd9ef2 rejected from java.util.concurrent.ThreadPoolExecutor@7c1594a5[Running, pool size = 3, active threads = 2, queued tasks = 0, completed tasks = 20]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047) ~[na:1.8.0_65]
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823) [na:1.8.0_65]
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369) [na:1.8.0_65]
at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:306) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE]
... 6 common frames omitted
&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;사용자 지정 Executor 서비스를 구성하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전 구성된 Spring Beans.springBootVersion = '2.0.3을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;RELEASE' 스프링 클라우드 버전 = '핀칠리'.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;릴리스'&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최대 메시지 수를 설정하면 문제가 해결되는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSQS){
    SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
    factory.setAmazonSqs(amazonSQS);
    factory.setMaxNumberOfMessages(10);
    return factory;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그것이 봄의 버그나 감독이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 다음의 기본값에서 비롯됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class SimpleMessageListenerContainer extends AbstractMessageListenerContainer {

    private static final int DEFAULT_WORKER_THREADS = 2;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;abstract class AbstractMessageListenerContainer implements InitializingBean, DisposableBean, SmartLifecycle, BeanNameAware {
    private static final int DEFAULT_MAX_NUMBER_OF_MESSAGES = 10;
&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;maxNumberOfMessages가 설정되어 있지 않으면 10을 SQS에서 꺼낼 메시지 수로 사용하고 2를 작업 실행기의 작업자 수로 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 메시지를 한 번에 3개 이상 끌면 해당 예외가 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;maxNumberOfMessages를 값(임의 값)으로 수동으로 설정하면 예상되는 대로 값을 동기화하는 두 위치가 모두 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    @Bean
    public SimpleMessageListenerContainer simpleMessageListenerContainer(
            SimpleMessageListenerContainerFactory factory, QueueMessageHandler messageHandler)
    {
        SimpleMessageListenerContainer container = factory.createSimpleMessageListenerContainer();
        container.setMaxNumberOfMessages(5);
        container.setMessageHandler(messageHandler);
        return container;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수신기 스레드 구성에 문제가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 참조&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...
ThreadPoolExecutor@7c1594a5[Running, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 20]]
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 스레드 풀 크기가 원하는 크기보다 작습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 애플리케이션에 다음 구성 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
public class TasksConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(5); // TODO: Load this from configuration
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }
}
&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;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;P.S. 이전에 어떤 업무가 거부되었든 일정 기간이 지나면 나중에 처리될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: 줄 서 있는 숫자에 사람들이 겁먹고 있는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.setPoolSize(5000)&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;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 답변에 설명을 추가하여 문제가 발생하는 이유 및 MaxNumberOfMessages 메시지의 솔루션 설정이 작동하는 이유를 자세히 설명할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 내용이 모든 것을 명확히 하는 데 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;SimpleMessageListenerContainer&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;ThreadPoolTaskExecutor&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 코어 풀 크기가 2 스레드, 최대 풀 크기가 3 스레드, 대기열 용량이 0이 되도록 구성됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 Amazon SQS에 대한 여론조사에서 반환할 메시지의 기본 최대 수는 10으로 설정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 한 번의 여론조사에서 10개의 메시지를 사용할 수 있어야 하며 이를 처리하기에는 스레드가 충분하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RejectedExecutionException&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;구성하기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setMaxNumberOfMessages&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;10시까지&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SimpleMessageListenerContainerFactory&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;는 최대 스레드 풀 크기를 11로 설정합니다. 이 경우 충분한 스레드를 사용할 수 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대기열 용량을 설정하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대기열 용량을 설정하기 위해 별도의 TaskExecutor를 초기화하고 설정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SimpleMessageListenerContainerFactory&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;@Bean(name = &quot;sqsAsyncTaskExecutor&quot;)
public AsyncTaskExecutor asyncTaskExecutor(@Value(&quot;${external.aws.sqs.core-thread-count}&quot;) int coreThreadCount,
                                           @Value(&quot;${external.aws.sqs.max-thread-count}&quot;) int maxThreadCount,
                                           @Value(&quot;${external.aws.sqs.queue-capacity}&quot;) int queueCapacity) {
    ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor();
    asyncTaskExecutor.setCorePoolSize(coreThreadCount);
    asyncTaskExecutor.setMaxPoolSize(maxThreadCount);
    asyncTaskExecutor.setQueueCapacity(queueCapacity);
    asyncTaskExecutor.setThreadNamePrefix(&quot;threadPoolExecutor-SimpleMessageListenerContainer-&quot;);
    asyncTaskExecutor.initialize();
    return asyncTaskExecutor;
}

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSQS, @Qualifier(&quot;sqsAsyncTaskExecutor&quot;) AsyncTaskExecutor asyncTaskExecutor) {
    SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory = new SimpleMessageListenerContainerFactory();
    simpleMessageListenerContainerFactory.setTaskExecutor(asyncTaskExecutor);
    return simpleMessageListenerContainerFactory;
}
&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;ThreadCount = 5, maxThreadCount = 20, queueCapacity = 10입니다.&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;이미 말했듯이 SimpleMessageListenerContainerFactory에서 setMaxNumberOfMessages를 10으로 설정하면 단일 요청에서 가져온 일괄 처리된 메시지를 모두 처리할 수 있을 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 Task Executor에 대한 보다 정확한 제어가 필요하다고 생각되면 이 구성도 작동합니다.&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;MessageReceiver 서비스에 @EnableSqs 주석 추가&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안녕하세요 저는 스프링 리스너를 이용해서 이 문제를 해결했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 코드입니다. 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p 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;@Component
public class PostBeansConstructionListener{

    @EventListener
    public void handleContextRefreshedEvent(ContextRefreshedEvent event){
        final ApplicationContext applicationContext = event.getApplicationContext();
        final SimpleMessageListenerContainer simpleMessageListenerContainer = applicationContext.getBean(SimpleMessageListenerContainer.class);
        setAsyncTaskExecutor(simpleMessageListenerContainer);
    }

    private void setAsyncTaskExecutor(SimpleMessageListenerContainer simpleMessageListenerContainer) {
        try{
            simpleMessageListenerContainer.setTaskExecutor(getAsyncExecutor());
        }catch(Exception ex){
            throw new RuntimeException(&quot;Not able to create Async Task Executor for SimpleMessageListenerContainer.&quot;, ex);
        }
    }

    public AsyncTaskExecutor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(7);
        executor.setMaxPoolSize(42);
        executor.setQueueCapacity(11);
        executor.setThreadNamePrefix(&quot;threadPoolExecutor-SimpleMessageListenerContainer-&quot;);
        executor.initialize();
        return executor;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/51373082/springboot-sqslistener-not-working-with-exception-taskrejectedexception&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/534</guid>
      <comments>https://cafebook.tistory.com/534#entry534comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:31 +0900</pubDate>
    </item>
    <item>
      <title>스프링 부트 스타터 의존성이 메이븐의 과도 의존성 메커니즘의 명시된 의도와 다르게 사용되도록 설계된 이유는 무엇입니까?</title>
      <link>https://cafebook.tistory.com/533</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 부트 스타터 의존성이 메이븐의 과도 의존성 메커니즘의 명시된 의도와 다르게 사용되도록 설계된 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;메이븐 종속성 문서&lt;/a&gt;에 따르면 모든 컴파일 종속성은 컴파일 시에 일시적으로 사용되는 것이 아니라 명시적으로 나열되는 것이 목적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 [transient complete dependency](과도적 컴파일 종속성)이 런타임 범위가 되어야 모든 컴파일 종속성이 명시적으로 나열되어야 합니다. 그러나 의존하는 라이브러리가 다른 라이브러리에서 클래스를 확장하여 컴파일 시간에 사용할 수 있도록 하는 경우가 있습니다.&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;3&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;Spring Boot 자체 문서(Spring Boot 자체 예 및 다른 곳에서 본 많은 사용 예)를 보면, 이러한 문서들은 런타임과 컴파일 시 모두에 사용될 수많은 다른 의존성을 일시적으로 도입하기 위한 것임이 분명합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/htmlsingle/#using-boot-starter&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;Spring Boot의 설명서&lt;/a&gt;에 따라:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작 프로그램은 응용 프로그램에 포함할 수 있는 편리한 종속성 설명자 집합입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;샘플 코드를 탐색하고 의존성 설명자를 복사하지 않고도 필요한 모든 Spring 및 관련 기술을 원스톱으로 이용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 데이터베이스 액세스를 위해 Spring 및 JPA 사용을 시작하려면 프로젝트에 spring-boot-starter-data-jpa 종속성을 포함시키기만 하면 됩니다.&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;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 메커니즘을 사용하여 컴파일 범위 종속성을 일시적으로 가져오는 것은 메이븐이 공식적으로 사용하고자 하는 의도와 상충되는 것으로 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 매우 명확하게 하는 한 가지는 메이븐 스타터 의존성을 직접 사용할 때 경고를 표시하는 메이븐 &lt;a href=&quot;https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;의존성: Analyze&lt;/a&gt; plugin 목표입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 실행 중&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mvn dependency:analyze&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Boot 자체의 &quot;&lt;a href=&quot;https://spring.io/guides/gs/spring-boot/&quot; papago-id=&quot;7-1&quot; rel=&quot;noreferrer&quot;&gt;Getting Starting&lt;/a&gt;&quot; 예제에서는 다음과 같은 출력을 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-web:jar:4.3.6.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-test:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework:spring-test:jar:4.3.6.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile
[WARNING]    org.hamcrest:hamcrest-library:jar:1.3:test
[WARNING]    org.springframework:spring-context:jar:4.3.6.RELEASE:compile
[WARNING]    junit:junit:jar:4.12:test
[WARNING]    org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile
[WARNING]    org.springframework:spring-beans:jar:4.3.6.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING]    org.springframework.boot:spring-boot-starter-web:jar:1.5.1.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-starter-actuator:jar:1.5.1.RELEASE:compile
&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;Spring Boot 스타터 패턴이 왜 기본 빌드 시스템의 명시된 의도와 직접적으로 반대되는 방식으로 설계되었는지 의문입니다.&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;a href=&quot;https://github.com/spring-projects/spring-boot/issues/8341&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;9-1&quot;&gt;spring-boot#8341&lt;/a&gt;로 문제가 제기되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇몇 Spring Boot 개발자들은 이 문제에 대해 이것이 실제로 메이븐 의존성 메커니즘의 오용이 아니라는 의견을 표명하기 위해 이 문제에 대응했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/8341#issuecomment-281178884&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;10-0&quot;&gt;코멘트&lt;/a&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;/blockquote&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IMO, 메이븐의 문서에서 한 문장을 너무 많이 읽으셨습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고를 받기 위해서는 선택을 해야 한다는 말인 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 오용이 &quot;괜찮다&quot;고 느낀 이유가 있습니까?&lt;/font&gt;&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오용은 다소 주관적입니다.&lt;/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;15&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;16&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;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/8341#issuecomment-281300623&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17-0&quot;&gt;코멘트&lt;/a&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;당신은 이것을 너무 많이 읽고 있고 당신의 관점은 실행가능성이 부족합니다 IMO.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;의존성:분석 목표는 컴파일 클래스 경로에 실제로 필요한 것만 포함되어 있음을 사용자에게 감지할 수 있는 방법을 제공하기 위한 수단이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서의 이 문장은 컴파일 범위가 왜 자동적인지를 설명하기 위한 것일 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[...]&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;돌이켜보면, Spring Boot을 사용하지 않는 수많은 프로젝트가 자체 컴파일 종속성을 모두 나열하지 않기 때문에 Spring Boot 질문이 아닌 Maven 질문을 받고 있는 것입니다.&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;이 피드백을 기반으로 Maven Dependency Plugin이 이러한 과도적 종속성 사용에 대해 경고하지 않도록 티켓 &lt;a href=&quot;https://issues.apache.org/jira/browse/MDEP-557&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;21-1&quot;&gt;MDEP-557&lt;/a&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;따라서 Spring Boot 팀은 이 문제에 대한 답을 얻기 위해 이것이 과도적 의존성을 적절하게 사용하는 것이며, 이것이 Maven의 의도에 반하지 않는다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의 시 종속성 플러그인이 실패하도록 구성한 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 생각에는 의존성 플러그인이 명시적으로 과도 의존성을 선언하지 않았다면 경고를 내뱉는 것 같습니다.&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;&amp;lt;failOnWarning&amp;gt;true&amp;lt;/failOnWarning&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;failOnWarning&amp;gt;false&amp;lt;/failOnWarning&amp;gt;&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/27994153/why-were-spring-boot-starter-dependencies-designed-to-be-used-contrary-to-the-st&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/533</guid>
      <comments>https://cafebook.tistory.com/533#entry533comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:22 +0900</pubDate>
    </item>
    <item>
      <title>jQuery 값이 = x인 요소 찾기</title>
      <link>https://cafebook.tistory.com/532</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 값이 = x인 요소 찾기&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;value=&quot;123&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&gt;&lt;/font&gt;&lt;code&gt;#attached_docs&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;value=&quot;123&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#attached_docs').find ... .remove();
&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;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;value&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;pre&gt;&lt;code&gt;$('#attached_docs :input[value=&quot;123&quot;]').remove();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#attached_docs :input').filter(function(){return this.value=='123'}).remove();
&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;데모 http://jsfiddle.net/gaby/RcwXh/2/&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;123과 정확히 일치하는 값:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery(&quot;#attached_docs[value='123']&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;전체 참조: http://api.jquery.com/category/selectors/&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&gt;&lt;code&gt;$('#attached_docs [value=123]').remove();
&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;$(&quot;[id=attached_docs][value=123]&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$('#attached_docs [value=&quot;123&quot;]').find ... .remove();
&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;당신의 필요를 충족시킬 수 있을 것입니다. 하지만 당신은 id를 복제할 수 없습니다! 기억하세요.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$(selector).filter(function(){return this.value==yourval}).remove();
&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/6732364/jquery-find-elements-with-value-x&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/532</guid>
      <comments>https://cafebook.tistory.com/532#entry532comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:16 +0900</pubDate>
    </item>
    <item>
      <title>Node.js + Express.js 응용 프로그램에 대한 오류 처리 원칙?</title>
      <link>https://cafebook.tistory.com/531</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Node.js + Express.js 응용 프로그램에 대한 오류 처리 원칙?&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;Node.js+&lt;a href=&quot;https://en.wikipedia.org/wiki/Express.js&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;Express.js&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;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-0&quot;&gt;A)&lt;/strong&gt;콜백 함수에 대한 매개 변수로 오류를 수신하여 오류를 &lt;em papago-id=&quot;2-2&quot;&gt;탐지&lt;/em&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;doSomethingAndRunCallback(function(err) { 
    if(err) { … }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-0&quot;&gt;B)&lt;/strong&gt;다음(err)을 호출하여 미들웨어의 오류를 &lt;em papago-id=&quot;3-2&quot;&gt;보고&lt;/em&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;4-0&quot;&gt;C)&lt;/strong&gt;오류를 던져 ROOTES의 오류를 &lt;em papago-id=&quot;4-2&quot;&gt;보고&lt;/em&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});
&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;strong papago-id=&quot;5-0&quot;&gt;D)&lt;/strong&gt;app.error()를 통해 오류 처리기를 구성하여 오류를 &lt;em papago-id=&quot;5-2&quot;&gt;처리&lt;/em&gt;하거나 일반 Connect 오류 처리기를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.error(function(err, req, res, next) {
    console.error(err);
    res.send('Fail Whale, yo.');
});
&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;Node.js+Express.js 응용 프로그램의 모든 오류 처리/보고의 기본이 되는 네 가지 원칙입니까?&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;Node.js의 오류 처리는 일반적으로 A) 형식입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;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&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;Express.js는 미들웨어를 사용하고 미들웨어 구문은 B)와 E)를 사용합니다.&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;C) 저한테 물어보시면 나쁜 연습입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});
&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;app.get('/home', function(req, res, next) {
    // An error occurs
    next(err);
});
&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;미들웨어 구문은 a에서 유효합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;get&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 papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;D)의 경우&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;(07:26:37 PM) tjholowaychuk: app.error는 3.x에서 제거됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TJ는 방금 확인했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;app.error&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;E에게 유리하게 감가상각됩니다.&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;E)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.use(function(err, req, res, next) {
  // Only handle `next(err)` calls
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;길이가 4(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;next(err)&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;connect goes 및 호출 오류 기반 미들웨어.&lt;/font&gt;&lt;/font&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;Joyent의 사람들은 이에 대해 &lt;a href=&quot;https://www.joyent.com/node-js/production/design/errors&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;정말 통찰력&lt;/a&gt; 있는 &lt;a href=&quot;https://www.joyent.com/node-js/production/design/errors&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;모범&lt;/a&gt; 사례 &lt;a href=&quot;https://www.joyent.com/node-js/production/design/errors&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;문서&lt;/a&gt;를 발표했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Node.js 개발자라면 반드시 읽어야 할 문서입니다.&lt;/font&gt;&lt;/p&gt;&lt;h3 papago-id=&quot;22&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;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Node.js의 비동기적 특성 때문에, 첫 번째 &lt;em papago-id=&quot;23-1&quot;&gt;매개변수-as-err&lt;/em&gt; 패턴은 &lt;a href=&quot;https://docs.nodejitsu.com/articles/errors/what-are-the-error-conventions&quot; rel=&quot;nofollow&quot; papago-id=&quot;23-3&quot;&gt;userland Node.js 오류 처리&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;try {
    setTimeout(function() {
        throw 'something broke' //Some random error
    }, 5)
}
catch(e) {
   //Will never get caught
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 콜백의 첫 번째 인수를 수행하는 것이 단순히 오류를 던지는 것 외에 비동기적으로 오류를 전달할 수 있는 거의 유일한 합리적인 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;unhandled exception&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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 papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 사실상 Node.js의 모든 부분이 이벤트 에미터이고 예외를 던지는 것은 모든 이벤트처럼 처리될 수 있는 낮은 수준의 이벤트입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//This won't immediately crash if connection fails
var socket = require(&quot;net&quot;).createConnection(5000);
socket.on(&quot;error&quot;, function(err) {
    console.error(&quot;calm down...&quot;, err)
});
&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;strong papago-id=&quot;29-1&quot;&gt;모든&lt;/strong&gt; &lt;a href=&quot;https://nodejs.org/api/domain.html#domain_warning_don_t_ignore_errors&quot; rel=&quot;nofollow&quot; papago-id=&quot;29-3&quot;&gt;오류를 파악&lt;/a&gt;하기 위해 극단적으로 사용해서는&lt;strong papago-id=&quot;29-1&quot;&gt; 안&lt;/strong&gt; 되며 절대 충돌하지 않도록 매우 노력하는 애플리케이션을 만들 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 거의 모든 사용 사례에서 끔찍한 아이디어입니다. 애플리케이션 상태에서 무슨 일이 일어나고 있는지 전혀 알지 못한 채 개발자에게 남겨질 것이고, 메인을 트라이캐치로 래핑하는 것과 유사하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;30&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;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://nodejs.org/api/domain.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;31-1&quot;&gt;도메인&lt;/a&gt;은 응용 프로그램을 실패하게 만드는 예외 문제를 해결하기 위해 개발자가 Express.js 응용 프로그램을 사용하고 치명적인 장애가 발생할 경우 현명하게 연결을 종료할 수 있도록 허용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES6&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES6에서 생성기 패턴이 시도/캐치 블록에서 여전히 포착 가능한 비동기 이벤트를 생성할 수 있도록 허용함에 따라 이는 다시 변경될 것임을 언급하고 있습니다.&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;코아(TJ 홀로웨이척 지음, Express.js의 동일한 원작자)는 눈에 띄게 이렇게 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES6를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yield&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;syncronous처럼 보이지만 일반적인 노드 비동기 방식으로 처리되는 블록을 만드는 statement:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.use(function *(next) {
    try {
        yield next;
    } 
    catch (err) {
        this.status = err.status || 500;
        this.body = err.message;
        this.app.emit('error', err, this);
    }
});

app.use(function *(next) {
    throw new Error('some error');
})
&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;a href=&quot;https://github.com/koajs/koa/wiki/Error-Handling&quot; rel=&quot;nofollow&quot; papago-id=&quot;36-1&quot;&gt;여기&lt;/a&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;URL : https://stackoverflow.com/questions/7151487/error-handling-principles-for-node-js-express-js-applications&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>node.js</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/531</guid>
      <comments>https://cafebook.tistory.com/531#entry531comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:10 +0900</pubDate>
    </item>
    <item>
      <title>3d 가속도계가 방향을 계산합니다.</title>
      <link>https://cafebook.tistory.com/530</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3d 가속도계가 방향을 계산합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3축에 대한 가속도계 값이 있습니다(보통 중력만 -1.0에서 1.0 사이의 데이터를 포함하는 경우).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  float Rx;
  float Ry;
  float Rz;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 계산을 해보고 각 축에 대한 각도를 알아봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  float R =  sqrt(pow(Rx,2)+pow(Ry,2)+pow(Rz,2));
  float Arx = acos(Rx/R)*180/M_PI;
  float Ary = acos(Ry/R)*180/M_PI;
  float Arz = acos(Rz/R)*180/M_PI;
&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;그런 다음 박스 각도 값을 opengl로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rquad = Arx;
yquad = Ary;
&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;glRotatef(yquad,1.0f,0.0f,0.0f);
glRotatef(rquad,0.0f,1.0f,0.0f);
&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;풀스피어를 사용하고 싶고 Arz값을 사용해야 작동이 된다는 것을 알고 있지만 이번 회전에는 어떻게 사용할 수 있는지 모르겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;좀 도와 주시겠습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트: 최종 답변은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  rquad = -atan2(Rx/R, Rz/R)*180/M_PI;
  yquad = -atan2(Ry/R, Rz/R)*180/M_PI;
&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;Roll = atan2(Y, Z) * 180/M_PI;
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI;
&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;출처 : https://www.nxp.com/docs/en/application-note/AN3461.pdf (10페이지, 25&amp;amp;26)&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;피치와 롤이 모두 45도 이상이 될 때까지 허용 가능한 근사치처럼 보입니다.&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;저는 다른 방향 규칙을 가정하고 있을 수 있지만, 축을 교환하고 값을 일정한 방식으로 반전시키더라도 uesp의 계산은 결코 동등하지 않을 것입니다.&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;mateo의 답변은 정확하지만 완전하고 완벽한 해결책을 제공하지는 못합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공식이 정확합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Roll = atan2(Y, Z) * 180/M_PI;
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI;
&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;그러나 피치가 +90/-90도이고 X축이 수직으로 위/아래를 가리키면 이상적인 가속도계 정규화 출력은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;accX = -1  / accX = 1 
accY = 0
accZ = 0
&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;그 말은 a.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;roll angle of 0 degrees&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;accX = -1  / accX = 1 
accY = 0.003
accZ = 0.004
&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;이것은 작게 보일 수 있지만 롤 각도가 ~30degrea가 되어 정확하지 않습니다.&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;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조 앱 노트에서 매우 잘 설명되는 절충점은 롤 공식에 가속도계 X축 판독값의 매우 적은 비율을 포함하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Roll  = atan2( Y,   sign* sqrt(Z*Z+ miu*X*X));
sign  = 1 if accZ&amp;gt;0, -1 otherwise 
miu = 0.001
&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;위에서 설명한 것과 같은 조건에서 롤을 측정할 때의 오차는 이전의 경우보다 2~3도 정도 줄어듭니다.&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;권장 솔루션(matteo's)을 사용해 보았는데 처음에는 잘 작동하는 것 같았지만 피치가 90도에 가까워지면(약 70도에서 시작하지만 반드시 다른 전화기에서 일관되지는 않음) 갑자기 롤이 급증하는 것을 발견했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;피치가 90에 있을 때 0 정도여야 하는 롤은 이제 100을 넘어 계속해서 180으로 증가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;수학적으로 이를 방지할 수 있는 방법을 생각하려고 합니다. 롤을 +90/-90으로 제한하면 정상적으로 작동하지만 원하는 범위(+180/-180)를 얻지 못합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Math.atan2(y, Math.sqrt(xx&lt;em papago-id=&quot;19-1&quot;&gt;) &lt;/em&gt;+ &lt;em papago-id=&quot;19-1&quot;&gt;(z&lt;/em&gt;)) * (180/Math)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PI))&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;roll&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;arctan(y/sqrt(X*X)+(z*z))&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;-90/90&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;피치 문제를 주지 않고 항공 표준입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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;Roll = atan2( sqrt(Y*Y + X*X), Z) * 180/M_PI;
Pitch = atan2( sqrt(X*X + Z*Z), Y) * 180/M_PI;
&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;가속도계를 정의하는 방법에 따라 X/Y/Z 값을 바꾸거나 롤/피치를 변환해야 할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;디스플레이에 사용하는 것은 다음과 같은 간단한 문제는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;glRotatef (Pitch, 0.0f, 0.0f, 1.0f);
glRotatef (Roll,  1.0f, 0.0f, 0.0f);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3755059/3d-accelerometer-calculate-the-orientation&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/530</guid>
      <comments>https://cafebook.tistory.com/530#entry530comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:44:02 +0900</pubDate>
    </item>
    <item>
      <title>함수에 출력이 있는지 확인하는 가장 좋은 방법은?</title>
      <link>https://cafebook.tistory.com/529</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수에 출력이 있는지 확인하는 가장 좋은 방법은?&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;저는 컨텐츠를 어떤 post_id에서 가져와 사이트의 프론트엔드에 출력할지 결정하기 위해 상당히 깊은 루틴을 실행하는 함수 목록을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수가 내용물을 반환할 때 html 포장지로 포장하기를 원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 html 포장지는 함수가 반환할 출력이 있는 경우에만 로드되기를 원합니다.&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;public static function output_*() {
  //  my routines that check for content to output precede here
  //  if there IS content to output the output will end in echo $output;
  //  if there is NO content to output the output will end in return;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;충분히 설명하자면 다음과 같은 것이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 이 함수들 중 &lt;strong papago-id=&quot;5-1&quot;&gt;하나&lt;/strong&gt;가 출력을 반환한다면 나는 그것을 html 래퍼로 감싸기를 원합니다. 그래서 이론적으로 이와 같은 것이 내가 이루고자 하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public static function begin_header_wrapper() {
  // This only returns true if an output function below returns content, 
  // which for me is other than an empty return;
  include(self::$begin_header_wrapper);
}

public static function output_above_header() {
  //  my routines that check for content to output precede here
  //  if there is content to return it will end in the following statement
  //  otherwise it will end in return;
  include($begin_markup); // This is the BEGIN html wrapper for this specifc output
  // It is, so let's get this option's post id number, extract its content,
  //  run any needed filters and output our user's selected content
  $selected_content = get_post($this_option);
  $extracted_content = kc_raw_content($selected_content);
  $content = kc_do_shortcode($extracted_content);
  echo $content;
  include($end_markup); // This is the END html wrapper for this specifc output
}
public static function output_header() {
  //  the same routine as above but for the header output
}
public static function output_below_header() {
  //  the same routine as above but for the below header output
}

public static function end_header_wrapper() {
  // This only returns true if an output function above returns content, 
  // which for me is other than an empty return;
  include(self::$end_header_wrapper);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 미리 알고 있습니다. 출력 함수 중 하나에 출력이 있는지 여부를 두 번(시작할 때 한 번, 끝할 때 한 번) 확인하고 싶지 않지만 이 토끼 구멍에서 시작하여 함수가 무언가를 반환하는지 여부를 결정하는 가장 좋은 방법을 찾고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 이것에 접근할 수 있는 완전히 더 나은 방법이 있다면 전력을 다해주세요, ㅋㅋㅋ 그리고 저에게 알려주세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 온라인에서 이 기사와 다른 사람들을 보았다 @ &lt;a href=&quot;https://stackoverflow.com/questions/2639291/find-out-if-function-has-any-output-with-php&quot; title=&quot;제목&quot; papago-id=&quot;8-1&quot; papago-attr-id=&quot;2&quot;&gt;기능이 php로 출력이 되는지 확인하세요&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 결국, 나는 단지 이것에 접근하는 더 나은 방법이 있는지 그리고 그 조건들을 기반으로 내 HTML 래퍼를 실행할 수 있도록 내 함수가 반환할 출력을 가지고 있는지 확인하는 가장 좋은 방법이 무엇인지 알고 싶었습니다.&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;a href=&quot;http://php.net/manual/en/function.ob-get-length.php&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;0-1&quot;&gt;ob_get_length&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&gt;&lt;code&gt;$content&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;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;if(!empty(($output = yourFunctionToTest(param1, paramN)))) {
   // do something with $output (in this case there is some output
   // which isn't considered &quot;empty&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수를 실행하고 출력을 변수(이 경우 출력)에 저장하고 빈()을 실행하여 변수 내용을 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이후에 $output의 내용을 사용할 수 있습니다.&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;empty()는 빈 문자열 또는 0을 &quot;empty&quot;로 간주하므로 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대안으로, 변수가 다음과 같이 set()과 같은 함수를 사용하여 변수가 다음과 같이 결정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://php.net/isset&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://php.net/isset&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://php.net/empty&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://php.net/empty&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39110662/best-way-to-determine-if-a-function-has-an-output&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/529</guid>
      <comments>https://cafebook.tistory.com/529#entry529comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:43:55 +0900</pubDate>
    </item>
    <item>
      <title>C를 호출하는 기능은 x86 어셈블리 언어에서 나옵니다.</title>
      <link>https://cafebook.tistory.com/528</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C를 호출하는 기능은 x86 어셈블리 언어에서 나옵니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조립 언어 프로그램에서 호출할 수 있도록 GCC를 사용하여 C 기능에서 조립 언어 기능을 생성할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 gcc가 C를 기계 코드(어셈블리 언어로 쉽게 분해할 수 있는)로 컴파일한다는 것을 알고 있고, &lt;a href=&quot;https://stackoverflow.com/questions/5131568/using-inline-assembly-in-c-c&quot; papago-id=&quot;1-1&quot;&gt;C에서 인라인 어셈블리 언어 기능&lt;/a&gt;이 가능하다는 것은 이미 알고 있지만, 어셈블리 언어 프로그램에서 C 기능을 호출하는 방법은 아직 찾지 못했는데, 이는 기본적으로 이와 반대입니다.&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;여기서는 x86 조립 프로그램에서 C 함수를 인라인화하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인라인이 불가능하다면 어셈블리어 프로그램에서 C 함수를 호출할 수 있는 다른 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.686p
.model flat,stdcall
.stack 2048

.data

.code
start:

invoke  ExitProcess, 0

printSomething PROC ;now I'm attempting to inline a C function here
    void printSomething(thingToPrint){
        printf(&quot;This is a C function that I want to invoke from an assembly language program.&quot;);
        printf(&quot;There must be some way to do this - is it possible somehow?&quot;);
    }
printSomething ENDP

end start
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 여기서 기억을 더듬는 것이기 때문에 세부적인 부분이 한두 개 정도는 살짝 어긋날 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 당신이 올바른 방향으로 나아가게 하기에 충분할 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일상적인 &lt;strong papago-id=&quot;4-1&quot;&gt;프린트&lt;/strong&gt;인 Something&lt;strong papago-id=&quot;4-1&quot;&gt;()&lt;/strong&gt;이 어셈블리 파일에 정의되어 있지 않음을 GCC 어셈블리에 알려야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C'에서는 &lt;strong papago-id=&quot;4-3&quot;&gt;extern&lt;/strong&gt; 키워드를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조립의 경우 &lt;strong papago-id=&quot;4-5&quot;&gt;.glob&lt;/strong&gt;을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.globl printSomething
&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;GCC와 다른 어셈블러를 사용하는 경우 키워드가 다를 수 있습니다.&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;이는 프로세서와 OS에 따라 크게 달라집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문의 제목이 x86을 나타내므로, 16비트 또는 32비트 모드와 표준 x86 ABI를 사용한다고 가정하겠습니다(Windows와 Linux가 다른 x86-64와는 반대).&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;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;printSomething (arg1, arg2, arg3, arg4);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;…로 번역됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pushl arg4
pushl arg3
pushl arg2
pushl arg1
call  printSomething
addl  $0x10, %esp
&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;addl $0x10, %esp
&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;? 32비트 인수 4개를 루틴(스택에) 전달했습니다.&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;따라서 루틴에서 돌아온 후 스택 포인터를 조정하여 이전에 스택에 적용했던 4개의 32비트 인수를 폐기합니다.&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;위의 예에서는 우리가 32비트 모드로 동작하고 있다고 가정하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;16비트 모드라면...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pushw arg4
pushw arg3
pushw arg2
pushw arg1
call  printSomething
addw  $0x8, %sp
&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;strong papago-id=&quot;12-1&quot;&gt;printSomething()&lt;/strong&gt;은 하나의 인수만 사용하고 예제에서는 4개의 인수를 사용했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요에 따라 제 예를 조정해 주십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 단계에서는 C 파일과 어셈블리 파일을 모두 개체 파일로 컴파일하고 개체 파일을 연결한 다음 실행해야 합니다.&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;x86_64의 경우 몇 가지 추가 사항을 주의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 호출을 하기 전에 스택을 16비트 정렬해야 합니다.&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;만약 당신이 당신의 함수를 어셈블리에 정의한다면, 당신의 함수를 호출한 함수는 반환 값을 스택에 두고, 잘못 정렬하여, 당신은 어떻게든 8바이트를 더 빼야 합니다, 보통.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;push %rbp&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;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;a href=&quot;https://stackoverflow.com/questions/56324948/why-does-calling-the-c-abort-function-from-an-x86-64-assembly-function-lead-to&quot; papago-id=&quot;19-1&quot;&gt;x86_64 어셈블리 함수에서 C abort() 함수를 호출하면 중단 신호 대신 segmentation fault(SIGSEGV)가 발생하는 이유는 무엇입니까?&lt;/a&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;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;call&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;어떤 이유에서인지 (TODO가 왜 그렇게 하고 싶으십니까?)&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;ul&gt; 
   &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출되지 않은 모든 저장 레지스터를 클로버로 표시&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 주장의 레드 존&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확장 &lt;a href=&quot;https://stackoverflow.com/questions/37502841/calling-printf-in-extended-inline-asm/37503773#37503773&quot; papago-id=&quot;24-1&quot;&gt;인라인 ASM에서 printf 호출&lt;/a&gt;의 예는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&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/16255608/calling-c-functions-from-x86-assembly-language&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/528</guid>
      <comments>https://cafebook.tistory.com/528#entry528comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:43:49 +0900</pubDate>
    </item>
    <item>
      <title>도커 - compose, 컨테이너가 시작된 후에 스크립트 실행?</title>
      <link>https://cafebook.tistory.com/527</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 - compose, 컨테이너가 시작된 후에 스크립트 실행?&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;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그 비밀을 도커 파일을 통해 가져올 방법이 없다고 생각합니다. 왜냐하면 저는 그 비밀이 도커 파일에 포함되는 것을 원하지 않기 때문입니다. 그래서 저는 도커 작곡을 통해 그것을 수행하는 것을 고려하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 가능한지 아는 사람?&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;예를 들어, 로컬 몽고DB의 복제 세트를 초기화하는 데 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;services:
  mongo:
    image: mongo:4.2.8
    hostname: mongo
    container_name: mongodb
    entrypoint: [&quot;/usr/bin/mongod&quot;,&quot;--bind_ip_all&quot;,&quot;--replSet&quot;,&quot;rs0&quot;]
    ports:
      - 27017:27017
  mongosetup:
    image: mongo:4.2.8
    depends_on:
      - mongo
    restart: &quot;no&quot;
    entrypoint: [ &quot;bash&quot;, &quot;-c&quot;, &quot;sleep 10 &amp;amp;&amp;amp; mongo --host mongo:27017 --eval 'rs.initiate()'&quot;]      
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1부는 간단하게 서비스를 시작합니다(몽고)&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;두 번째 서비스는 &quot;bash&quot; 진입 지점과&lt;/font&gt;&lt;/font&gt;&lt;code&gt;restart: no&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&amp;lt;=&lt;strong papago-id=&quot;9-1&quot;&gt;중요&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 a를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;depends_on&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;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법은 원래 명령을 호출하기 전에 필요한 모든 초기화 작업을 수행하기 위해 compose COMMAND를 덮어쓰는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&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;설정된 암호, 내부 구성 파일 변경 등 원하는 init 작업을 수행할 스크립트를 이미지에 추가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 이만.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;init.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이미지에 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
ENTRYPOINT []
&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;위의 내용은 ENTERPOINT가 정의된 내용을 재정의합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sourceimage&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;INTERPOINT가 도커 파일에서 수행하는 작업을 이해했는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sourceimage&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;command:&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커- compose.yml 파일의.&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;도커- compose.yml:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;services:
  myservice:
    image: something:tag
    ...
    command: sh -c &quot;/usr/local/bin/init.sh &amp;amp;&amp;amp; exec myexecutable&quot;
&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;exec&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;그러면 STOP, KILL(키보드의 Ctrl-C) 또는 HUP와 같은 신호를 수신할 수 있는 첫 번째 프로세스(PID1)로 명령이 설치됩니다.&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 class=&quot;lang-yaml prettyprint-override&quot;&gt;&lt;code&gt;services:
  example:
    image: &amp;lt;whatever&amp;gt;
    volume: ./init.sh:/init.sh
    entrypoint: sh -c &quot;/init.sh&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;init.sh&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;em papago-id=&quot;25-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;init.sh&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;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 - compose는 실행 중인 기존 컨테이너를 수정하는 방법이 아니라 컨테이너를 시작하는 방법을 지정합니다.&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;a href=&quot;http://rancher.com/docs/rancher/latest/en/cattle/secrets/#adding-secrets-using-rancher-cli&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;Rancher 문서&lt;/a&gt;는 비밀의 기본적인 사용을 위해, 당신은 비밀 배열의 이름으로 비밀을 참조할 수 있다고 언급합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-compose.yml&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;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 class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;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;기본적으로 대상 파일 이름은 사용자 ID 및 그룹 ID 0, 파일 모드 0444로 생성됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비밀 부분에서 외부를 true로 설정하면 비밀이 이미 생성되었음을 알 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본의 예시&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-compose.yml&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;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;version: '2'
services:
  web:
    image: sdelements/lets-chat
    stdin_open: true
    secrets:
    - name-of-secret
    labels:
      io.rancher.container.pull_image: always
secrets:
  name-of-secret:
    external: true
&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;&quot;&lt;a href=&quot;https://staxmanade.com/2016/09/how-to-update-a-single-running-docker-compose-container/&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;How&lt;/a&gt; to &lt;a href=&quot;https://staxmanade.com/2016/09/how-to-update-a-single-running-docker-compose-container/&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Update &lt;/a&gt;a&lt;a href=&quot;https://staxmanade.com/2016/09/how-to-update-a-single-running-docker-compose-container/&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt; Single Running Docker-compose Container&lt;/a&gt;&quot;에 나와 있듯이, 컨테이너를 업데이트하려면 &quot;build, kill, up&quot; 시퀀스가 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker-compose up -d --no-deps --build &amp;lt;service_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/47615751/docker-compose-run-a-script-after-container-has-started&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>docker</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/527</guid>
      <comments>https://cafebook.tistory.com/527#entry527comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:43:42 +0900</pubDate>
    </item>
    <item>
      <title>문자열에서 파일의 메서드를 동적으로 가져옵니다.</title>
      <link>https://cafebook.tistory.com/526</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에서 파일의 메서드를 동적으로 가져옵니다.&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;abc.def.ghi.jkl.myfile.mymethod&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;mymethod&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;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;def get_method_from_file(full_path):
    if len(full_path) == 1:
        return map(__import__,[full_path[0]])[0]
    return getattr(get_method_from_file(full_path[:-1]),full_path[-1])


if __name__=='__main__':
    print get_method_from_file('abc.def.ghi.jkl.myfile.mymethod'.split('.'))
&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;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: Python 버전 2.6.5를 사용하고 있습니다.&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;Python 2.7부터는 &lt;a href=&quot;http://docs.python.org/library/importlib.html#importlib.import_module&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;importlib.import_module()&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;from importlib import import_module

p, m = name.rsplit('.', 1)

mod = import_module(p)
met = getattr(mod, m)

met()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개별 모듈을 가져올 필요는 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름을 가져올 모듈을 가져와 제공하는 것으로 충분합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fromlist&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;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;def import_from(module, name):
    module = __import__(module, fromlist=[name])
    return getattr(module, name)
&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;abc.def.ghi.jkl.myfile.mymethod&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 class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import_from(&quot;abc.def.ghi.jkl.myfile&quot;, &quot;mymethod&quot;)
&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;(Module-level 함수는 메서드가 아닌 Python에서 함수라고 합니다.)&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;importlib&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;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python &amp;lt; 2.7의 경우 &lt;a href=&quot;http://docs.python.org/library/functions.html#__import__&quot; papago-id=&quot;15-1&quot;&gt;__ import__&lt;/a&gt; 내장 메서드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;__import__('abc.def.ghi.jkl.myfile.mymethod', fromlist=[''])
&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;Python &amp;gt;= 2.7 또는 3.1의 경우 편리한 메서드 &lt;a href=&quot;http://docs.python.org/py3k/library/importlib.html#importlib.import_module&quot; papago-id=&quot;16-1&quot;&gt;importlib.import_&lt;/a&gt;module가 추가되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈을 다음과 같이 가져오기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;importlib.import_module('abc.def.ghi.jkl.myfile.mymethod')
&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;strong papago-id=&quot;17-0&quot;&gt;업데이트&lt;/strong&gt;: 의견에 따라 업데이트된 버전&lt;em papago-id=&quot;17-2&quot;&gt;(마지막까지 가져올 문자열을 읽지 않았고&lt;/em&gt; 모듈 &lt;em papago-id=&quot;17-2&quot;&gt;자체가 아닌&lt;/em&gt; 모듈의 &lt;em papago-id=&quot;17-2&quot;&gt;메서드를 가져와야 한다는 사실을 놓쳤다는&lt;/em&gt; 것을 &lt;em papago-id=&quot;17-2&quot;&gt;인정해야 합니다&lt;/em&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;Python &amp;lt; 2.7 :&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mymethod = getattr(__import__(&quot;abc.def.ghi.jkl.myfile&quot;, fromlist=[&quot;mymethod&quot;]))
&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;Python &amp;gt;= 2.7:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mymethod = getattr(importlib.import_module(&quot;abc.def.ghi.jkl.myfile&quot;), &quot;mymethod&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;from importlib import import_module

name = &quot;file.py&quot;.strip('.py')
# if Path like : &quot;path/python/file.py&quot; 
# use name.replaces(&quot;/&quot;,&quot;.&quot;)

imp = import_module(name)

# get Class From File.py
model = getattr(imp, &quot;classNameImportFromFile&quot;)

NClass = model() # Class From file 
&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 네임스페이스에 대해 수행하려는 작업이 불분명합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 원하는 건 그저&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;my_method&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;output = my_method()&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;# This is equivalent to &quot;from a.b.myfile import my_method&quot;
the_module = importlib.import_module(&quot;a.b.myfile&quot;)
same_module = __import__(&quot;a.b.myfile&quot;)
# import_module() and __input__() only return modules
my_method = getattr(the_module, &quot;my_method&quot;)

# or, more concisely,
my_method = getattr(__import__(&quot;a.b.myfile&quot;), &quot;my_method&quot;)
output = my_method()
&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;my_method&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;code&gt;sys.modules&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 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;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;# This is equivalent to &quot;import a.b.myfile&quot;
a = __import__(&quot;a.b.myfile&quot;)
also_a = importlib.import_module(&quot;a.b.myfile&quot;)
output = a.b.myfile.my_method()

# This is equivalent to &quot;from a.b import myfile&quot;
myfile = __import__(&quot;a.b.myfile&quot;, fromlist=&quot;a.b&quot;)
also_myfile = importlib.import_module(&quot;a.b.myfile&quot;, &quot;a.b&quot;)
output = myfile.my_method()
&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;__import__()&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;code&gt;__import__(normal args, globals=globals(), locals=locals())&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;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 웹사이트에는 &lt;a href=&quot;https://thomassileo.name/blog/2012/12/21/dynamically-load-python-modules-or-classes/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;30-1&quot;&gt;load_class&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;foo = load_class(package.subpackage.FooClass)()
type(foo) # returns FooClass
&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;import importlib

def load_class(full_class_string):
    &quot;&quot;&quot;
    dynamically load a class from a string
    &quot;&quot;&quot;

    class_data = full_class_string.split(&quot;.&quot;)
    module_path = &quot;.&quot;.join(class_data[:-1])
    class_str = class_data[-1]

    module = importlib.import_module(module_path)
    # Finally, we retrieve the Class
    return getattr(module, class_str)
&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;(2.7+만)을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일론 및 붙여넣기와 같은 여러 다른 라이브러리(메모리가 올바르게 작동하는 경우)와 모듈 이름을 함수/속성 이름에서 ':'로 구분하는 것이 제가 이 작업을 수행하는 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 예를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;'abc.def.ghi.jkl.myfile:mymethod'&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;import_from(path)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능이 좀 더 쉽게 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def import_from(path):
    &quot;&quot;&quot;
    Import an attribute, function or class from a module.
    :attr path: A path descriptor in the form of 'pkg.module.submodule:attribute'
    :type path: str
    &quot;&quot;&quot;
    path_parts = path.split(':')
    if len(path_parts) &amp;lt; 2:
        raise ImportError(&quot;path must be in the form of pkg.module.submodule:attribute&quot;)
    module = __import__(path_parts[0], fromlist=path_parts[1])
    return getattr(module, path_parts[1])


if __name__=='__main__':
    func = import_from('a.b.c.d.myfile:mymethod')
    func()
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 어때:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def import_module(name):

    mod = __import__(name)
    for s in name.split('.')[1:]:
        mod = getattr(mod, s)
    return mod
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8790003/dynamically-import-a-method-in-a-file-from-a-string&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/526</guid>
      <comments>https://cafebook.tistory.com/526#entry526comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:43:35 +0900</pubDate>
    </item>
    <item>
      <title>오라클에서 sql server GO와 동등함</title>
      <link>https://cafebook.tistory.com/525</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오라클에서 sql server GO와 동등함&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle 마이그레이션 스크립트 작업 중인데 테이블 구조를 변경한 후 데이터로 채워야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구조 변경을 먼저 하고 데이터를 하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL Server에서 사용할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GO&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배치를 분리할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL Server가 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GO&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle에 해당하는 명령어가 있습니까?&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;4&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;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from user_tables;
/
&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;URL : https://stackoverflow.com/questions/29961595/sql-server-go-equivalent-in-oracle&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/525</guid>
      <comments>https://cafebook.tistory.com/525#entry525comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:22:02 +0900</pubDate>
    </item>
    <item>
      <title>jquery는 첫번째 요소를 제외한 모든 요소를 제거합니다.</title>
      <link>https://cafebook.tistory.com/524</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;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;jquery remove를 사용하여 처음의 스팬 태그를 제외한 모든 스팬 태그를 제거하는 방법은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;EDIT&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; var html = var htm = $(&quot;#addin&quot;).find(&quot;.engagement_data:last-child&quot;).find(&quot;.keys_values&quot;).html();
    html='
       &amp;lt;span style=&quot;display:block;&quot; class=&quot;k_v&quot;&amp;gt;
         &amp;lt;innput type=&quot;text&quot; class=&quot;e_keys&quot; style=&quot;width:65px;&quot; placeholder=&quot;key&quot;/&amp;gt;
         &amp;lt;input type=&quot;text&quot; class=&quot;e_values&quot; style=&quot;width:65px;&quot; placeholder=&quot;value&quot;/&amp;gt;
       &amp;lt;/span&amp;gt;
       &amp;lt;span style=&quot;display:block;&quot; class=&quot;k_v&quot;&amp;gt;
         &amp;lt;input type=&quot;text&quot; class=&quot;e_keys&quot; style=&quot;width:65px;&quot; placeholder=&quot;key&quot;/&amp;gt;
         &amp;lt;input type=&quot;text&quot; class=&quot;e_values&quot; style=&quot;width:65px;&quot; placeholder=&quot;value&quot;/&amp;gt;
       &amp;lt;/span&amp;gt;
';
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(html).not(':first').remove();
&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;$(html).not('span:first').remove();
&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;대신 DOM에서 제거하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;html&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수 선택기를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#addin .engagement_data:last-child .keys_values').not('span:first').remove();
&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;$('span').slice(1).remove();
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;썰다&lt;/font&gt;&lt;/strong&gt;&lt;/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;DOM 요소 집합을 나타내는 jQuery 개체가 주어지면 .slice() 메서드는 시작 및 선택적으로 종료 인수에 의해 지정된 요소의 하위 집합을 포함하는 새 jQuery 개체를 구성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작하는&lt;/font&gt;&lt;/strong&gt;&lt;/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&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소가 선택되기 시작하는 0 기반 위치를 나타내는 정수입니다.&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 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출처 : https://api.jquery.com/slice&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러므로,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$('span').slice(1).remove()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 첫 번째 인스턴스 이후의 모든 요소를 선택하고 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드가 저에게 적합합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(html).children().not(':first').remove();
&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;$('span:not(first-child)')
&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;$('span:not(first-child)').remove();
&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;$('html').not(':first').remove();
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 내용은 사용자가 찾고자 하는 유형의 하위 요소를 제외한 다른 내용이 없을 때 특정 예제에 적용될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 보다 복잡한 마크업으로 인해 문제가 발생하게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ul id=&quot;ul-id&quot; class=&quot;f-dropdown tiny&quot; data-dropdown-content=&quot;&quot;&amp;gt;
    &amp;lt;li&amp;gt;
    &amp;lt;div id=&quot;warningGradientOuterBarG&quot; class=&quot;barberpole&quot;&amp;gt;
    &amp;lt;div id=&quot;warningGradientFrontBarG&quot; class=&quot;warningGradientAnimationG&quot;&amp;gt;
        &amp;lt;div class=&quot;warningGradientBarLineG&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;foo&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;bar&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;pre&gt;&lt;code&gt;var $ul = $('#ul-id')
$ul.not(':first')  //returns nothing
$ul.find(':first') // returns first &amp;lt;li&amp;gt;
$ul.find(':not(:first)') //returns the inner divs as well as the last two li's
$('#ul-id li:not(first-child)')  // this returns all li's
$('#ul-id li:not(:first)')  // this works: returns last two li's
$ul.find('li').slice(1) // this also works and returns the last two li's
$ul.find('li').slice(1).remove()   // and this will remove them
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/18874298/jquery-remove-all-elements-except-for-first-one&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/524</guid>
      <comments>https://cafebook.tistory.com/524#entry524comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:21:56 +0900</pubDate>
    </item>
    <item>
      <title>패키지에서 node_modules에 대한 경로를 지정합니다.json</title>
      <link>https://cafebook.tistory.com/523</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지에서 node_modules에 대한 경로를 지정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;json&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션에서 node_modules 디렉토리를 bowerrc 파일과 같이 /vendor/node_modules라고 이동할 수 있는 방법이 있습니까?&lt;/font&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;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능합니다. NODE_PATH env 변수를 설정하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export NODE_PATH='yourdir'/node_modules
&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;blockquote&gt; 
 &lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NODE_PATH 환경 변수가 절대 경로의 콜론으로 구분된 목록으로 설정된 경우 다른 곳에서 찾을 수 없는 모듈을 검색합니다. (참고: 윈도우즈의 경우 NODE_PATH는 콜론 대신 세미콜론으로 구분됩니다.)&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;1: $HOME/.node_modules&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;2: $HOME/.node_libraries&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;3: $PREFIX/lib/node&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;여기서 $HOME은 사용자의 홈 디렉토리이고 $PREFIX는 노드의 구성된 node_prefix입니다.&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;strong papago-id=&quot;10-1&quot;&gt;종속성을 node_modules 폴더에 로컬로 배치하는 것이 좋습니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 더 빠르고 안정적으로 적재될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders&quot; papago-id=&quot;11&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;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;불가능하며, 지원되지 않을 것으로 보이기 때문입니다(여기 https://github.com/npm/npm/issues/775) 참조).&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;CLI 또는 ENV-Variables(현재 선택한 답변 참조), .npmrc-Config-Files 또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm link&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;global&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 프로젝트에 참여하는 사람들이 항상 특별한 구성을 만들거나 특별한 지식을 가져야 하기 때문에 이러한 솔루션 중 어느 것도 실제로는 완벽하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm install&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;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;json은 node_modules를 설치할 디렉토리와 동일한 디렉토리에 있거나 프로젝트의 루트 dir에 항상 있을 것이라는 사실을 알고 있습니다.&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;# .yarnrc file in project root
--modules-folder /node_modules
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 어떤 패키지를 사용하느냐에 따라 경험이 달라질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저 토끼굴에 들어가고 싶으실지 모르겠네요.&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;node_modules&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;symlinks(VM &quot;공유&quot; 폴더)를 지원하지 않는 파일 시스템에 마운트된 프로젝트 dir 내부에 있습니다.&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;ol&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 class=&quot;papago-parent&quot;&gt;복사합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;package.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&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 class=&quot;papago-parent&quot;&gt; 실행.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm install&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과 복사&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node_modules&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;디렉토리를 다시 프로젝트 dir에, 사용&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cp -r --dereference&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;symlink를 복사본으로 확장합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;node_modules&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;h3 papago-id=&quot;33&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/npm/npm/issues/775#issuecomment-50301534&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-1&quot;&gt;@Charminbear가 링크한 github 문제에서 발견&lt;/a&gt;한 다른 해결 방법이 있지만, 이것은 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;grunt&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;NODE_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;https://github.com/browserify/resolve/issues/136 에 따르면 다음과 같습니다.&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;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;/media/sf_shared&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;심볼 링크를 설치할 수 없습니다. 즉, 실제로 npm 설치가 불가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/media/sf_shared/myproject&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 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;code&gt;$ mkdir /home/dan/myproject &amp;amp;&amp;amp; cd /home/dan/myproject&lt;/code&gt; &lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;$ ln -s /media/sf_shared/myproject/package.json&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;(이 방향으로 symlink를 할 수 있지만 /media/sf_shared의 내부를 만들 수 없습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;$ npm install&lt;/code&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;$ cd /media/sf_shared/myproject&lt;/code&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;$ NODE_PATH=/home/dan/myproject/node_modules node index.js&lt;/code&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 내가 도커 안에 있고 내가 지속적으로 그것을 유지하고 싶다면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node_modules&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 class=&quot;papago-parent&quot;&gt;그다음에.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node_modules&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 앱 경로 내부는 내게 선택 사항이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로운 코드를 컨테이너에 전개할 때 tar를 넣고 임시 폴더에 추출한 후 app 디렉토리에 rsync합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--delete&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;rsync에 대해 설정된 플래그이므로 tar에 없는 모든 것이 앱 폴더에서 제거됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 또한 다음과 적용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node_modules&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;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱 디렉터리에 다음을 포함하는 디렉터리에 대한 심볼릭 링크를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node_modules&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;/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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/26293049/specify-path-to-node-modules-in-package-json&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>node.js</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/523</guid>
      <comments>https://cafebook.tistory.com/523#entry523comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:21:49 +0900</pubDate>
    </item>
    <item>
      <title>pandas 데이터프레임 열 유형을 문자열 또는 범주형으로 변환</title>
      <link>https://cafebook.tistory.com/522</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;pandas 데이터프레임 열 유형을 문자열 또는 범주형으로 변환&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;아래 주택 데이터의 df에서는 선형 회귀를 실행할 때 zipcode가 숫자가 아닌 범주형으로 처리되도록 zipcode를 문자열로 변환해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사합니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df = pd.DataFrame({'zipcode': {17384: 98125, 2680: 98107, 722: 98005, 18754: 98109, 14554: 98155}, 'bathrooms': {17384: 1.5, 2680: 0.75, 722: 3.25, 18754: 1.0, 14554: 2.5}, 'sqft_lot': {17384: 1650, 2680: 3700, 722: 51836, 18754: 2640, 14554: 9603}, 'bedrooms': {17384: 2, 2680: 2, 722: 4, 18754: 2, 14554: 4}, 'sqft_living': {17384: 1430, 2680: 1440, 722: 4670, 18754: 1130, 14554: 3180}, 'floors': {17384: 3.0, 2680: 1.0, 722: 2.0, 18754: 1.0, 14554: 2.0}})
print (df)
       bathrooms  bedrooms  floors  sqft_living  sqft_lot  zipcode
722         3.25         4     2.0         4670     51836    98005
2680        0.75         2     1.0         1440      3700    98107
14554       2.50         4     2.0         3180      9603    98155
17384       1.50         2     3.0         1430      1650    98125
18754       1.00         2     1.0         1130      2640    98109
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 항목:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df['zipcode'] = df.zipcode.astype(str)
#df.zipcode = df.zipcode.astype(str)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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;categorical&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df['zipcode'] = df.zipcode.astype('category')
#df.zipcode = df.zipcode.astype('category')
&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;df['zipcode'] = pd.Categorical(df.zipcode)
&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;import pandas as pd

df = pd.DataFrame({'zipcode': {17384: 98125, 2680: 98107, 722: 98005, 18754: 98109, 14554: 98155}, 'bathrooms': {17384: 1.5, 2680: 0.75, 722: 3.25, 18754: 1.0, 14554: 2.5}, 'sqft_lot': {17384: 1650, 2680: 3700, 722: 51836, 18754: 2640, 14554: 9603}, 'bedrooms': {17384: 2, 2680: 2, 722: 4, 18754: 2, 14554: 4}, 'sqft_living': {17384: 1430, 2680: 1440, 722: 4670, 18754: 1130, 14554: 3180}, 'floors': {17384: 3.0, 2680: 1.0, 722: 2.0, 18754: 1.0, 14554: 2.0}})
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;print (df)
       bathrooms  bedrooms  floors  sqft_living  sqft_lot  zipcode
722         3.25         4     2.0         4670     51836    98005
2680        0.75         2     1.0         1440      3700    98107
14554       2.50         4     2.0         3180      9603    98155
17384       1.50         2     3.0         1430      1650    98125
18754       1.00         2     1.0         1130      2640    98109

print (df.dtypes)
bathrooms      float64
bedrooms         int64
floors         float64
sqft_living      int64
sqft_lot         int64
zipcode          int64
dtype: object

df['zipcode'] = df.zipcode.astype('category')

print (df)
       bathrooms  bedrooms  floors  sqft_living  sqft_lot zipcode
722         3.25         4     2.0         4670     51836   98005
2680        0.75         2     1.0         1440      3700   98107
14554       2.50         4     2.0         3180      9603   98155
17384       1.50         2     3.0         1430      1650   98125
18754       1.00         2     1.0         1130      2640   98109

print (df.dtypes)
bathrooms       float64
bedrooms          int64
floors          float64
sqft_living       int64
sqft_lot          int64
zipcode        category
dtype: object
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;panda &amp;gt;= 1.0에서는 이제 전용 문자열 데이터 유형이 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;1)&lt;/strong&gt;&lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-4&quot;&gt;.astype('string')&lt;/a&gt;을 사용하여 열을 이 팬더 &lt;strong papago-id=&quot;8-2&quot;&gt;문자열 데이터&lt;/strong&gt; 유형으로 변환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df['zipcode'] = df['zipcode'].astype('string')
&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;strong papago-id=&quot;2-0&quot;&gt;2)&lt;/strong&gt;이것은 사용하는 것과 다릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;str&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Pandas &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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df['zipcode'] = df['zipcode'].astype(str)
&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;strong papago-id=&quot;11-0&quot;&gt;3)&lt;/strong&gt;&lt;strong papago-id=&quot;11-2&quot;&gt;범주형 데이터&lt;/strong&gt; 유형으로 변경하려면 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df['zipcode'] = df['zipcode'].astype('category')
&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;df = pd.DataFrame({
    'zipcode_str': [90210, 90211] ,
    'zipcode_string': [90210, 90211],
    'zipcode_category': [90210, 90211],
})

df['zipcode_str'] = df['zipcode_str'].astype(str)
df['zipcode_string'] = df['zipcode_str'].astype('string')
df['zipcode_category'] = df['zipcode_category'].astype('category')

df.info()

# you can see that the first column has dtype object
# while the second column has the new dtype string
# the third column has dtype category
 #   Column            Non-Null Count  Dtype   
---  ------            --------------  -----   
 0   zipcode_str       2 non-null      object  
 1   zipcode_string    2 non-null      string  
 2   zipcode_category  2 non-null      category
dtypes: category(1), object(1), string(1)
&lt;/code&gt;&lt;/pre&gt; 
&lt;br&gt; From the docs: 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'string' 확장자 유형은 object-dtype NumPy 배열과 관련된 몇 가지 문제를 해결합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&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;StringArray는 문자열만 저장할 수 있습니다.&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;objecttype은 DataFrame과 같은 분산된 유형별 작업입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;select_dtype&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트가 아닌 개체-dtype 열을 제외하고 텍스트만 선택할 수 있는 명확한 방법은 없습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 읽을 때 개체 dtype 배열의 내용이 문자열보다 덜 명확합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;/ol&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;새 문자열 데이터 유형 작업에 대한 자세한 내용은 https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html 에서 확인할 수 있습니다.&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Transform to category
df['zipcode_category'] = df['zipcode_category'].astype('category')

# Add ordered category
df['zipcode_ordered'] = df['zipcode_category']

# Setup the ordering
df.zipcode_ordered.cat.set_categories(
    new_categories = [90211, 90210], ordered = True, inplace = True
)

# Output IDs
df['zipcode_ordered_id'] = df.zipcode_ordered.cat.codes
print(df)
#  zipcode_category zipcode_ordered  zipcode_ordered_id
#            90210           90210                   1
#            90211           90211                   0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순서 범주 설정에 대한 자세한 내용은 &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/user_guide/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;19-1&quot;&gt;판다&lt;/a&gt; 웹사이트에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html#sorting-and-order&quot; rel=&quot;noreferrer&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html#sorting-and-order&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;em papago-id=&quot;5-1&quot;&gt;개체&lt;/em&gt; 열이 됨) 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;astype&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;df.zipcode = zipcode.astype(str)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 원하는 것은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Categorical&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;'category'&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;df.zipcode = zipcode.astype('category')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39092067/pandas-dataframe-convert-column-type-to-string-or-categorical&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>dataframe</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/522</guid>
      <comments>https://cafebook.tistory.com/522#entry522comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:21:42 +0900</pubDate>
    </item>
    <item>
      <title>삼성 갤럭시S2에 반응 없는 웹사이트</title>
      <link>https://cafebook.tistory.com/521</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;삼성 갤럭시S2에 반응 없는 웹사이트&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;워드프레스 웹사이트 (제네시스 프레임워크 사용) 아이폰과 HTC에서는 제대로 반응하는 디스플레이를 설계했지만 삼성 갤럭시 폰에서는 그렇지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Samsung Galaxy S2 및 Samsung Ace에서 테스트됨) 저는 현재 FitVids 플러그인을 사용하여 비디오 내장물이 반응하도록 만들고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이상하게도 삼성폰에서 동영상 내장자가 없는 페이지는 정상적으로 표시되지만 동영상 내장자가 있는 페이지에서는 화면이 표시되는 페이지 레이아웃은 태블릿 화면이고 전화 화면은 표시되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 가지 다른 플러그인을 시도해 보았지만 어느 플러그인도 이 문제를 해결하지 못하는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가가 이것에 대해 조언을 해준다면 좋을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 내 &lt;a href=&quot;http://testsite101.com/jooja&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;사이트&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;여기 CSS &lt;a href=&quot;http://testsite101.com/jooja/wp-content/themes/jooja_theme/style.css?ver=1.9.1&quot; rel=&quot;noreferrer&quot; papago-id=&quot;6-1&quot;&gt;스타일시트&lt;/a&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;삼성 스크린이 480*800px인 것을 발견하였습니다.&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;아래 CSS를 사용해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@media only screen 
and (min-device-width : 480px) 
and (max-device-width : 800px) 
and (orientation : landscape) {

}

@media only screen 
and (min-device-width : 480px) 
and (max-device-width : 800px) 
and (orientation : portrait) {

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 써보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;meta content=&quot;width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;&quot; name=&quot;viewport&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@media 규칙을 사용하는 것은 권장되지 않습니다. 모바일 장치와 데스크톱의 픽셀 크기가 다를 수 있기 때문입니다.&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&gt;&lt;code&gt;@media only screen 
and (min-device-width : 480px) 
and (max-device-width : 800px) 
and (orientation : landscape) {

}

@media only screen 
and (min-device-width : 480px) 
and (max-device-width : 800px) 
and (orientation : portrait) {

}
&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;왼쪽 여백이 5%이고 오른쪽 여백이 5%인 용기를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
# Your body goes here
&amp;lt;/div&amp;gt;
&amp;lt;/body&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;저는 이것이 표준 @media 규칙보다 훨씬 더 사용자 친화적이고 반응형 디자인에 대한 유지된 접근 방식임을 알게 되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17517930/website-not-responsive-on-samsung-galaxy-s2&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>cafebook</author>
      <guid isPermaLink="true">https://cafebook.tistory.com/521</guid>
      <comments>https://cafebook.tistory.com/521#entry521comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:21:34 +0900</pubDate>
    </item>
  </channel>
</rss>