<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>해보고나면 별거아니다</title>
    <link>https://isntyet.tistory.com/</link>
    <description>isntyet@gmail.com</description>
    <language>ko</language>
    <pubDate>Tue, 19 May 2026 16:56:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>isntyet</managingEditor>
    <image>
      <title>해보고나면 별거아니다</title>
      <url>https://tistory1.daumcdn.net/tistory/1913923/attach/13c0e53568234e7d9fd7f791ad452c23</url>
      <link>https://isntyet.tistory.com</link>
    </image>
    <item>
      <title>(JPA) find date between 날짜 사이 찾기</title>
      <link>https://isntyet.tistory.com/144</link>
      <description>&lt;pre id=&quot;code_1581993811558&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity(name = &quot;test_jojo&quot;)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Jojo {

    @Id
    @GeneratedValue
    @Column(name = &quot;jo_id&quot;)
    private Long joId;

    @Column
    private LocalDateTime regDate;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public interface JojoRepository extends JpaRepository&amp;lt;Jojo, Long&amp;gt; {

    List&amp;lt;Jojo&amp;gt; findAllByRegDateBetween(LocalDateTime start, LocalDateTime end);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1581993447547&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void test() {
  LocalDateTime startDatetime = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.of(0,0,0));
  LocalDateTime endDatetime = LocalDateTime.of(LocalDate.now(), LocalTime.of(23,59,59));

  jojoRepository.findAllByRegDateBetween(startDatetime, endDatetime));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/JAVA</category>
      <category>Between</category>
      <category>JPA</category>
      <category>localdatetime</category>
      <category>repository</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/144</guid>
      <comments>https://isntyet.tistory.com/144#entry144comment</comments>
      <pubDate>Tue, 18 Feb 2020 11:44:15 +0900</pubDate>
    </item>
    <item>
      <title>(spring boot) org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stackResourceRegistryFactoryBean'</title>
      <link>https://isntyet.tistory.com/143</link>
      <description>&lt;p&gt;어쩌다 스프링부트로 프로젝트를 시작하게 되어 초기 설정을 하는 와중에&lt;/p&gt;
&lt;p&gt;aws client 사용을 위해, 관련 설정을 하다가 에러가 발생하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;implementation 'org.springframework.cloud:spring-cloud-starter-aws'&lt;/p&gt;
&lt;p&gt;implementation 'org.springframework.cloud:spring-cloud-starter-aws-messaging'&lt;/p&gt;
&lt;p&gt;위 dependencies를&amp;nbsp;추가하고&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;application.properties 에 분명 설정을 다한 것 같은데 run시&amp;nbsp;에러가&amp;nbsp;계속 발생하였다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;cloud.aws.credentials.access-key=엑세스키
cloud.aws.credentials.secret-key=시크릿키
cloud.aws.region.auto=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stackResourceRegistryFactoryBean' defined in class path resource [org/springframework/cloud/aws/autoconfigure/context/ContextStackAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.aws.core.env.stack.config.StackResourceRegistryFactoryBean]: Factory method 'stackResourceRegistryFactoryBean' threw exception; nested exception is java.lang.IllegalArgumentException: No valid instance id defined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;알아보니&lt;/p&gt;
&lt;p&gt;로컬에서 실행할때는 아래와 같이&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;cloud.aws.stack.auto=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해당 설정을 추가해줘야 한다고 한다.&lt;/p&gt;
&lt;p&gt;aws ec2환경에서 실행했으면 해당 설정을 하지 않아도 상관없다고 하는데, 로컬에서 실행할 때는 해당 설정을 해줘야 한다고 합니다.&lt;/p&gt;
&lt;p&gt;(ec2에서 spring cloud프로젝트를 실행시키면 cloudformation 구성을 시작하는데, 이를 로컬에선 안 하기 위해서입니다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고 :&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://jojoldu.tistory.com/300&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jojoldu.tistory.com/300&lt;/a&gt;&lt;/p&gt;</description>
      <category>공부/JAVA</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/143</guid>
      <comments>https://isntyet.tistory.com/143#entry143comment</comments>
      <pubDate>Mon, 25 Mar 2019 09:42:27 +0900</pubDate>
    </item>
    <item>
      <title>git push 되돌리기</title>
      <link>https://isntyet.tistory.com/142</link>
      <description>&lt;p&gt;git push를 했는데 잘못해서(fetch안하고 merge,push해서 개꼬였을때&amp;nbsp;)&lt;/p&gt;&lt;p&gt;되돌리기를 하고싶을때가 많았다. (히스토리조차 남기기 싫었다)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;검색해보니 방법이 있었다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 아래 명령어로 commit id를 확인해야한다. (돌아가고 싶은 commit id)&lt;/p&gt;
&lt;pre&gt; &lt;code class=&quot;bash&quot;&gt;git log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그다음 아래 명령어에 위에서 찾은 commit id를 넣어주고 싫행 후&lt;/p&gt;
&lt;pre&gt; &lt;code class=&quot;bash&quot;&gt;git reset --hard [커밋 id]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 수정한 내용을 아래 명령어로 확정하면&amp;nbsp;&lt;/p&gt;
&lt;pre&gt; &lt;code class=&quot;bash&quot;&gt;git push --force
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;되돌아 간다. (히스토리 조차 남지 않으니 쓸때 주의하자)&lt;/p&gt;</description>
      <category>공부/기타</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/142</guid>
      <comments>https://isntyet.tistory.com/142#entry142comment</comments>
      <pubDate>Sun, 20 Jan 2019 16:44:10 +0900</pubDate>
    </item>
    <item>
      <title>git command 자동완성 설정하기</title>
      <link>https://isntyet.tistory.com/141</link>
      <description>&lt;p&gt;git 명령어를 치는데 탭을 갈겨도 자동완성이 안된다..&lt;/p&gt;&lt;p&gt;명령어를 풀로 타이핑하는게 귀찮아서 자동완성 세팅을 찾아봤다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 아래 명령어를 터미널에서 쳐준다.&lt;/p&gt;&lt;p&gt;(물론 homebrew는 설치된 상태로)&lt;/p&gt;

&lt;pre&gt; &lt;code class=&quot;bash&quot;&gt;brew install git bash-completion
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그다음 mac기준으로&amp;nbsp;&lt;/p&gt;&lt;p&gt;.bash_profile 에서 아래 코드를 추가해준다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt; &lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# git autocomplete config&lt;/span&gt;&lt;/p&gt;&lt;code class=&quot;bash&quot;&gt;[ -f /usr/local/etc/bash_completion ] &amp;amp;&amp;amp; . /usr/local/etc/bash_completion
&lt;/code&gt;&lt;/pre&gt;&lt;code class=&quot;bash&quot;&gt; &lt;/code&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위 코드를 추가한 후 저장한다음에&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;source ~/.bash_profile&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;실행해주고 git 커맨드를 치는중에 기억이 안난다면 tab을 눌러보면 해당되는 명령어들을 리스팅해줄것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BACD345C44206834&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BACD345C44206834&quot; width=&quot;600&quot; height=&quot;50&quot; filename=&quot;스크린샷 2019-01-20 오후 4.15.20.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>공부/기타</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/141</guid>
      <comments>https://isntyet.tistory.com/141#entry141comment</comments>
      <pubDate>Sun, 20 Jan 2019 16:17:13 +0900</pubDate>
    </item>
    <item>
      <title>AWS SES Bounce 처리</title>
      <link>https://isntyet.tistory.com/140</link>
      <description>&lt;p&gt;SES (Simple E-mail Service) 을 사용중인데 어느날 AWS측에서 메일이 왔다.&lt;/p&gt;&lt;p&gt;이메일 반송률 (Bounce rate)이 10%를 넘어간단다...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;들어가서 확인해보니&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D94D3E5BEFD3A319&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D94D3E5BEFD3A319&quot; width=&quot;600&quot; height=&quot;194&quot; filename=&quot;스크린샷 2018-11-17 오후 5.36.55.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;bounce rate를 5%를 밑으로 유지해야하는데 10%를 왔다갔다 하고 있었다.&lt;/p&gt;&lt;p&gt;지속적으로 5%이상이면 해당 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;SES를 사용할수 없게 막혀버리던가 계정자체가 막힐수도 있단다&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보통 해결방법을 찾아보니&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;SES (반송) -&amp;gt; SNS -&amp;gt; Lambda -&amp;gt; DynamoDB&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 구성하여 다이나모DB에서 모은 반송메일주소 리스트를 가지고 발송시에 거르는 방법으로 가고있더라.&lt;/p&gt;&lt;p&gt;그래서 일단 해당 방법으로 나도 구현하기로 하여 시작하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;SNS 주제 생성&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 SNS (Simple Notification Service)로 가서 주제를 만들어야한다.&lt;/p&gt;&lt;p&gt;(SES 에서 해당 주제를 설정해놓으면 반송시에 해당 SNS로 메세지가 들어간다)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A950355BEFD6301B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A950355BEFD6301B&quot; width=&quot;600&quot; height=&quot;153&quot; filename=&quot;스크린샷 2018-11-17 오후 5.46.37.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위와 같이 SES-Bounce 라는 이름으로 주제를 만들었다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;(나같은 경우에는 [버지니아 북부] 리전에서 SES를 만들었었는데 해당 SNS주제를 설정하려면 같은리전에 있어야 설정할 수 있어서&lt;/p&gt;&lt;p&gt;SNS 주제 생성도 버지니아 북부에서 하였다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;SES 설정&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SES로 다시 가서 해당 발신 이메일을 클릭 후&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;Notifications -&amp;gt; Edit Configuration&lt;/span&gt; 으로 간뒤&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;SNS Topic Configuration -&amp;gt; Bounces&lt;/span&gt; 에서 위에서 만든 SNS 주제를 선택해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 660px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99592C495BEFD97812&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99592C495BEFD97812&quot; width=&quot;660&quot; height=&quot;453&quot; filename=&quot;스크린샷 2018-11-17 오후 5.58.11.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기 까지하면 해당 발신이메일로 이메일 발송 후 반송시 해당 SNS주제로 알림이 전달된다.&lt;/p&gt;&lt;p&gt;이제는 SNS를 이용해 람다에서 다이나모DB로 넣어주면 될듯하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;DynamoDB 테이블 생성&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Lambda 생성전에 먼저 DynamoDB 를 만들자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;AWS DynamoDB로 가서 테이블 만들기를 한 후&lt;/p&gt;&lt;p&gt;테이블 이름과 기본키를 정한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;내 경우에는 ses_bounce 라는 이름으로 테이블을 만들었고,&lt;/p&gt;&lt;p&gt;파티션 키는 단순하게 email (문자열) 이라고 넣었다. bounce처리된 이메일주소를 키로 raw들을 쌓을 것이다.&lt;/p&gt;&lt;p&gt;(이렇게 이메일을 키로 해놓으면 중복 수집 생각할 필요없을듯 하여...)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9909A7405BEFDEFC1A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9909A7405BEFDEFC1A&quot; width=&quot;600&quot; height=&quot;239&quot; filename=&quot;스크린샷 2018-11-17 오후 6.26.47.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B56E405BEFDF5C10&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B56E405BEFDF5C10&quot; width=&quot;600&quot; height=&quot;358&quot; filename=&quot;스크린샷 2018-11-17 오후 6.28.30.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;나중에 파이썬에서 boto3로 데이터를 넣을거니 boto3클라이언트에 넣을 IAM을 미리생성하여&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;access_key와 secret_key를 발급해놓자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;Lambda 생성, 설정&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 람다를 만들러가면 된다.&lt;/p&gt;&lt;p&gt;나는 파이썬으로 다이나모DB에 넣어주는 로직을 만들거기 때문에&amp;nbsp;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;python3.6&lt;/span&gt; 으로 선택하여 만들었다.&lt;/p&gt;&lt;p&gt;각자 맞는 언어로 알아서 만들면될듯. 참고로 DB도 나는 dynamoDB를 정하였지만,&amp;nbsp;&lt;/p&gt;&lt;p&gt;몽고디비, RDB등 알아서 정하면된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 660px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991AE4365BEFDCA31F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991AE4365BEFDCA31F&quot; width=&quot;660&quot; height=&quot;214&quot; filename=&quot;스크린샷 2018-11-17 오후 6.16.50.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;람다를 생성 후 앞에 위에서 만들었던 SNS를 달아주면된다.&lt;/p&gt;&lt;p&gt;(마찬가지로 내가 SEN, SNS가 전부 버지니아 북부에 만들어서 해당 람다에서 SNS를 잡기위해 람다도 버지니아 북부에 만들었다)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 660px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99318A365BEFDD101F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99318A365BEFDD101F&quot; width=&quot;660&quot; height=&quot;219&quot; filename=&quot;스크린샷 2018-11-17 오후 6.18.21.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;테스트 발송, 데이터 확인&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;나는 boto3로 bounce처리되는 이메일을 python으로 현재 시간과 함께 다이나모DB에 적재할 것인데&lt;/p&gt;&lt;p&gt;SNS에서 람다로 들어왔을때의 데이터 형태를 모르기 때문에 우선 테스트발송을 해보기로 하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SES에서 [Send a test email] 이라는 항목이 있는데 해당 테스트발송 기능을 이용하여&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;bounce@simulator.amazonses.com&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이쪽으로 메일을 보내게 되면 반송이 된다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99355F375BEFE20F23&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99355F375BEFE20F23&quot; width=&quot;600&quot; height=&quot;468&quot; filename=&quot;스크린샷 2018-11-17 오후 6.39.41.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;발송 후 람다로 들어오는 데이터를 찍어보니 아래와 같이 데이터가 들어왔다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;{
  'Records': [{
    'EventSource': 'aws:sns',
    'EventVersion': '1.0',
    'EventSubscriptionArn': 'arn:aws:sns:us-east-비밀비밀',
    'Sns': {
      'Type': 'Notification',
      'MessageId': 'd297a622-비밀비밀',
      'TopicArn': 'arn:aws:sns:us-east-1:비밀비밀:SES-Bounce',
      'Subject': None,
      'Message': '{&quot;notificationType&quot;:&quot;Bounce&quot;,&quot;bounce&quot;:{&quot;bounceType&quot;:&quot;Permanent&quot;,&quot;bounceSubType&quot;:&quot;General&quot;,&quot;bouncedRecipients&quot;:[{&quot;emailAddress&quot;:&quot;bounce@simulator.amazonses.com&quot;,&quot;action&quot;:&quot;failed&quot;,&quot;status&quot;:&quot;5.1.1&quot;,&quot;diagnosticCode&quot;:&quot;smtp; 550 5.1.1 user unknown&quot;}],&quot;timestamp&quot;:&quot;2018-11-15T02:36:34.200Z&quot;,&quot;feedbackId&quot;:&quot;비밀비밀&quot;,&quot;remoteMtaIp&quot;:&quot;비밀비밀&quot;,&quot;reportingMTA&quot;:&quot;dsn; 비밀비밀&quot;},&quot;mail&quot;:{&quot;timestamp&quot;:&quot;2018-11-17T02:36:33.000Z&quot;,&quot;source&quot;:&quot;비밀비밀@naver.com&quot;,&quot;sourceArn&quot;:&quot;arn:aws:ses:us-east-1:비밀비밀&quot;,&quot;sourceIp&quot;:&quot;비밀비밀&quot;,&quot;sendingAccountId&quot;:&quot;비밀비밀&quot;,&quot;messageId&quot;:&quot;비밀비밀&quot;,&quot;destination&quot;:[&quot;bounce@simulator.amazonses.com&quot;]}}',
      'Timestamp': '2018-11-17T02:36:34.217Z',
      'SignatureVersion': '1',
      'Signature': '비밀비밀',
      'SigningCertUrl': '비밀비밀',
      'UnsubscribeUrl': '비밀비밀',
      'MessageAttributes': {}
    }
  }]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어쩄든 여기서 필요한 데이터는 Records 안에 Sns 안에 &lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;Message&lt;/span&gt; 인데&lt;/p&gt;&lt;p&gt;해당 Message를 파싱하여 bounce 안에 bouncedRecipients의 &lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;emailAddress&lt;/span&gt;가 궁극적으로 가져오고싶은 반송 이메일 주소가 되겠다!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;Python 소스작성&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위의 데이터가 람다로 들어온다고 생각하고 이제 소스를 짜면 되겠다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;난 귀찮으니 따로 로컬에 프로젝트 만들지 않고&amp;nbsp;&lt;/p&gt;&lt;p&gt;람다 코드 인라인 편집기에서 바로 작성하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99278A435BEFE52425&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99278A435BEFE52425&quot; width=&quot;600&quot; height=&quot;266&quot; filename=&quot;스크린샷 2018-11-17 오후 6.53.13.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;
import logging
import json
import boto3
import os
import datetime

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

ACCESS_KEY = os.environ.get('ACCESS_KEY')
SECRET_KEY = os.environ.get('SECRET_KEY')

def lambda_handler(event, context):
    try:
        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        message = event['Records'][0]['Sns']['Message']
        
        bounce_list = json.loads(message)[&quot;bounce&quot;][&quot;bouncedRecipients&quot;]
        
        if len(bounce_list) &amp;gt; 0:
            for bounce in bounce_list:
                if str(bounce[&quot;emailAddress&quot;]) is not None and str(bounce[&quot;emailAddress&quot;]) != &quot;&quot;:
                    put_email(str(bounce[&quot;emailAddress&quot;]), str(now))
    
    except Exception as e:
        logger.error('error : {}'.format(str(e)))
    
    return True


def put_email(email, now):
    result = &quot;fail&quot;
    dynamo_client = boto3.client('dynamodb', region_name='ap-northeast-2',
                               aws_access_key_id=ACCESS_KEY,
                               aws_secret_access_key=SECRET_KEY)

    response = dynamo_client.put_item(
        TableName='ses_bounce',
        Item = {
            &quot;email&quot;: {
                &quot;S&quot;: email
            },
            &quot;date&quot;: {
                &quot;S&quot;: str(now)
            }
        }
    )
    
    if &quot;ResponseMetadata&quot; in response:
        if &quot;HTTPStatusCode&quot; in response[&quot;ResponseMetadata&quot;]:
            if response[&quot;ResponseMetadata&quot;][&quot;HTTPStatusCode&quot;] == 200:
                result = &quot;success&quot;
                
    logger.info('{} : {}, '.format(email, result))

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;딱히 어려움이 없는 소스이다...&lt;/p&gt;&lt;p&gt;데이터 들어오는거 파싱해서 emailAddress 추출한다음에 boto3를 이용하여 다이나모 디비에 넣어주면된다.&lt;/p&gt;&lt;p&gt;(&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;boto3는 aws lambda python에 기본으로 들어있는듯하니 따로 모듈을 추가할 필요 없는듯 하다&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(다이나모쪽에 권한이 있는 IAM의 access_key와 secret_key를&lt;/p&gt;&lt;p&gt;람다 설정쪽의&amp;nbsp;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;[환경변수]&lt;/span&gt; 항목에&amp;nbsp;ACCESS_KEY,&amp;nbsp;SECRET_KEY 라는 이름으로 각각 넣어놓으면 해당 키를 가져다가 boto3.client에서 설정한다)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DE3D335BEFE9BE27&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DE3D335BEFE9BE27&quot; width=&quot;600&quot; height=&quot;264&quot; filename=&quot;스크린샷 2018-11-17 오후 7.12.29.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;작성 후 게시하여 위에서 했던 방법대로 테스트 발송을 해보도록 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;&lt;h2&gt;결과&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;테스트 발송을 해보거나 실제로 반영 후에 다이나모디비를 확인해보면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 660px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B83C4E5BEFE72D33&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B83C4E5BEFE72D33&quot; width=&quot;660&quot; height=&quot;529&quot; filename=&quot;스크린샷 2018-11-17 오후 7.01.00.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위 사진처럼&amp;nbsp;데이터가 쌓이게 된다.&lt;/p&gt;&lt;p&gt;발송 로직에서 해당 데이터를 긁어와 예외처리 해주면 ses bounce rate가 점차 줄어들것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>공부/Aws</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/140</guid>
      <comments>https://isntyet.tistory.com/140#entry140comment</comments>
      <pubDate>Sat, 17 Nov 2018 19:15:28 +0900</pubDate>
    </item>
    <item>
      <title>pycharm module 'pip' has no attribute 'main'</title>
      <link>https://isntyet.tistory.com/139</link>
      <description>&lt;p&gt;pycharm에서 preference -&amp;gt; project:ㅇㅇㅇ -&amp;gt; Project Interpre에서 모듈을 인스톨하려고 했는데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 420px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DCCD4E5BEA9C1930&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DCCD4E5BEA9C1930&quot; width=&quot;420&quot; height=&quot;216&quot; filename=&quot;스크린샷 2018-11-13 오후 6.16.03.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;module 'pip' has no attribute 'main'&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위와 같은 문구가 뜨면서 에러가 났다&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;찾아보니 해당버전 pycharm&amp;nbsp;pip에 main이 포함안되있단다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이전에는 pip 버전을 9.0.3으로 다운그레이드 해주면 된다고 하는데&lt;/p&gt;&lt;p&gt;현재는 &lt;b&gt;&lt;span style=&quot;color: rgb(5, 0, 153);&quot;&gt;pycharm을 최신버전으로 업데이트한후&lt;/span&gt;&lt;/b&gt; 다시 시도하니 잘되었다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>공부/Python</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/139</guid>
      <comments>https://isntyet.tistory.com/139#entry139comment</comments>
      <pubDate>Tue, 13 Nov 2018 18:41:34 +0900</pubDate>
    </item>
    <item>
      <title>apt과 apt-get 차이</title>
      <link>https://isntyet.tistory.com/138</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;apt-get은 많이 쳐봐서 자주 보았는데 요즘은 apt를 더 자주보는것 같아 둘의 차이를 찾아보니&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;apt-get&amp;nbsp;설명&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;apt-get is the command-line tool for handling packages, and may be considered the user's &quot;back-end&quot; to other tools using the APT library. Several &quot;front-end&quot; interfaces exist, such as
aptitude(8), synaptic(8) and wajig(1).
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;apt 설명&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;apt provides a high-level commandline interface for the package management system. It is intended as an end user interface and enables some options better suited for interactive usage
by default compared to more specialized APT tools like apt-get(8) and apt-cache(8).
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;apt-get이 먼저 나온것이고 apt는 apt-get 과 apt-cache 명령어 둘다 사용할 수 있도록 하기위해 나온것이라 한다.&lt;/p&gt;&lt;p&gt;둘중 아무거나 써도 상관없을듯하다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>공부/Server</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/138</guid>
      <comments>https://isntyet.tistory.com/138#entry138comment</comments>
      <pubDate>Sat, 6 Oct 2018 22:29:58 +0900</pubDate>
    </item>
    <item>
      <title>autoenv 디렉토리 접근시 pyenv auto activate</title>
      <link>https://isntyet.tistory.com/137</link>
      <description>&lt;p&gt;bash에서 python 프로젝트에 접근할때마다 pyenv activate test_env 하기 귀찮아서 자동으로 해주는것을 찾다보니&lt;/p&gt;&lt;p&gt;autoenv라는 것을 발견해서 적용해보았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 아래와 같이 설치후&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
echo 'source ~/.autoenv/activate.sh' &amp;gt;&amp;gt; ~/.bash_profile
source ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 프로젝트 디렉토리에서 아래와 같이 설정을 해주면된다&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;touch .env
echo &quot;pyenv activate test-env&quot; &amp;gt; .env
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 설정 후 해당 디렉토리에 들어가면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/997220475BB8B3EC09&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F997220475BB8B3EC09&quot; width=&quot;600&quot; height=&quot;157&quot; filename=&quot;스크린샷 2018-10-06 오후 9.58.17.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 최조에 한번 물어보는데 Y를 입력하면, 다음부터 접속시 자동으로 설정해놓은 env로 activate된다&lt;/p&gt;</description>
      <category>공부/Python</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/137</guid>
      <comments>https://isntyet.tistory.com/137#entry137comment</comments>
      <pubDate>Sat, 6 Oct 2018 22:09:52 +0900</pubDate>
    </item>
    <item>
      <title>youtube video background(screen off) stop</title>
      <link>https://isntyet.tistory.com/135</link>
      <description>&lt;p&gt;안드로이드앱이 어느날 갑자기 게시 삭제가 되어 메일을 확인해보니&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;
Issue: Violation of Device and Network Abuse policy 

We don’t allow apps that interfere with, disrupt, damage, or access in an unauthorized manner the user’s device, other devices or computers, servers, networks, application programming interfaces (APIs), or services, including but not limited to other apps on the device, any Google service, or an authorized carrier’s network.

Your app shouldn’t access or use the service or API in a manner that violates its terms of service. For example, your app shouldn't download, monetize, or access YouTube videos in a way that violates the YouTube Terms of Service.

Submit your app for another review

Read through the Device and Network Abuse policy and make appropriate changes to your app.
Make sure that your app is compliant with all other Developer Program Policies. Additional enforcement could occur if there are further policy violations.
Sign in to your Play Console and submit the update to your app.
If you’ve reviewed the policy and feel our decision may have been in error, please reach out to our policy support team. One of my colleagues will get back to you within 2 business days.

Thanks for your continued support of Google Play.

Best,

The Google Play Review Team
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이런 내용의 메일이 와있었다.&lt;/p&gt;&lt;p&gt;이 내용으로만은 왜 삭제하였는지 알 수 없어 문의를 다시 하였더니 screen off(파워버튼)를 하여도 웹뷰에 있는 재생되고있는 유투브 비디오가 멈추지 않는다고&lt;/p&gt;&lt;p&gt;설명을 해주었다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;확인해보니 모든 앱에서 그런건 아니고 &lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;롤리팝 아래버전&lt;/span&gt;에서 스크린 off가 되어도 플레이되고 있던 비디오가 멈추지않고 돌아&lt;/p&gt;&lt;p&gt;화면은 꺼져있는데 비디오의 사운드가 계속 재생되는 문제가 보였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
try{
    ((AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE)).requestAudioFocus(
            new AudioManager.OnAudioFocusChangeListener() {
                @Override
                public void onAudioFocusChange(int focusChange) {}
            }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}catch (Exception e){ }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위의 소스를&amp;nbsp;onPause() 때 넣어주니&lt;/p&gt;&lt;p&gt;screen off때 비디오 사운드가 들리던 문제가 해결되었다.&lt;br /&gt;&lt;br /&gt;///////////////////////////////////////&lt;/p&gt;&lt;p&gt;추가) 2019.01.17&lt;/p&gt;&lt;p&gt;이 코드를 적용할때 문제가 발견됨.&lt;/p&gt;&lt;p&gt;시스템 오디오를 off시켜버림.&lt;/p&gt;&lt;p&gt;예를들어 멜론플레이어로 음악을 들을때, 내 앱을 사용하다가 해당 소스가 실행되면 음악이 중지됨.&lt;/p&gt;&lt;p&gt;적용시 주의필요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;///////////////////////////////////////&lt;/p&gt;&lt;p&gt;추가) 2019.02.21&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오디오를 정지시킬 필요없이 아래소스를 적용하면된다. 뻘짓했네;;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;@Override
public void onPause(){
    super.onPause();

    try {
       webView.onPause();
    } catch(Exception e) {}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;pause에 정지시켰으니 마찬가지로 resume에서는 webView.onResume(); 을 꼭 시켜주자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>공부/Android</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/135</guid>
      <comments>https://isntyet.tistory.com/135#entry135comment</comments>
      <pubDate>Sun, 26 Aug 2018 18:56:37 +0900</pubDate>
    </item>
    <item>
      <title>webview inject js or css</title>
      <link>https://isntyet.tistory.com/134</link>
      <description>&lt;p&gt;앱에서만 로드되어야 하는 js, css가 있어서&lt;/p&gt;&lt;p&gt;WebViewClient의&amp;nbsp;onPageFinished 시점에 js 를 embed 시키기 위해 코드를 작성하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
public void injectCss(WebView wv, String link){
    if(!&quot;&quot;.equalsIgnoreCase(link)){
        try{
            wv.loadUrl(
                    &quot;javascript:(function() { &quot; +
                            &quot;var css = document.createElement('link'); &quot; +
                            &quot;css.rel = 'stylesheet'; &quot; +
                            &quot;css.type = 'text/css'; &quot; +
                            &quot;css.href = '&quot; + link + &quot;'; &quot; +
                            &quot;document.getElementsByTagName('head')[0].appendChild(css)&quot; +
                            &quot;})()&quot;
            );
        }catch (Exception e){}
    }
}

public void injectJs(WebView wv, String link){
    if(!&quot;&quot;.equalsIgnoreCase(link)){
        try{
            wv.loadUrl(
                    &quot;javascript:(function() { &quot; +
                            &quot;var js = document.createElement('script'); &quot; +
                            &quot;js.type = 'text/javascript'; &quot; +
                            &quot;js.src = '&quot; + link + &quot;'; &quot; +
                            &quot;document.getElementsByTagName('body')[0].appendChild(js)&quot; +
                            &quot;})()&quot;
            );
        }catch (Exception e){}
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;onPageFinished 시점 위 함수를 호출해주면 해당 link의 js나 css를 embed 시켜주는 걸 확인 할 수 있다.&lt;/p&gt;&lt;p&gt;( 크롬 인스펙터로 확인하면된다 )&lt;/p&gt;</description>
      <category>공부/Android</category>
      <author>isntyet</author>
      <guid isPermaLink="true">https://isntyet.tistory.com/134</guid>
      <comments>https://isntyet.tistory.com/134#entry134comment</comments>
      <pubDate>Sun, 26 Aug 2018 18:39:32 +0900</pubDate>
    </item>
  </channel>
</rss>