<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이마닷의 블로그</title>
    <link>https://eveningminusdot.tistory.com/</link>
    <description>eveningminusdot == jhp2060</description>
    <language>ko</language>
    <pubDate>Sun, 26 Jul 2026 07:43:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>움나나움</managingEditor>
    <item>
      <title>블로그 이사갑니다</title>
      <link>https://eveningminusdot.tistory.com/entry/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%9D%B4%EC%82%AC%EA%B0%91%EB%8B%88%EB%8B%A4</link>
      <description>&lt;p&gt;티스토리 마크다운 쓰기 너무 불편해서 &lt;a href=&quot;https://velog.io/@evemindot/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%9D%B4%EC%82%AC%EC%99%94%EC%8A%B5%EB%8B%88%EB%8B%A4&quot;&gt;벨로그&lt;/a&gt;로 이사갑니다.&lt;/p&gt;
&lt;p&gt;안녕히계세요.&lt;/p&gt;</description>
      <category>etc.</category>
      <author>움나나움</author>
      <guid isPermaLink="true">https://eveningminusdot.tistory.com/54</guid>
      <comments>https://eveningminusdot.tistory.com/entry/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%9D%B4%EC%82%AC%EA%B0%91%EB%8B%88%EB%8B%A4#entry54comment</comments>
      <pubDate>Sat, 10 Aug 2024 17:42:26 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 240701</title>
      <link>https://eveningminusdot.tistory.com/entry/TIL-240701</link>
      <description>&lt;h2&gt;JPA transaction&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Spring app에서 전체 configuration 상에 기본 transaction manager를 명시 후, 이후 app 내에서 별도의 transaction manager를 설정하지 않은 채 기본 transaction manager와 다른 연결 정보를 가진 entity에 접근할 때,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 엔티티에 대한 JPA 메서드는 트랜잭션 속성 기본값으로 &lt;code&gt;PROPAGATION_REQUIRED&lt;/code&gt;(새로운 transaction 생성), &lt;code&gt;ISOLATION_DEFAULT&lt;/code&gt;를 가지고 실행된다.&lt;/li&gt;
&lt;li&gt;새로 생성된 트랜잭션은 해당 JPA 메서드가 실행된 맥락과 상관없이 메서드 실행 즉시 commit 되지만, 실행된 맥락(?) 상의 로직이 실패하는 경우(ex. exception 발생, 메서드 중도 실행 중단 등) 당연히 rollback 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;@Transactional&lt;/code&gt; 어노테이션의 &lt;code&gt;readOnly&lt;/code&gt; 옵션을 &lt;code&gt;true&lt;/code&gt;로 세팅하면&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JPA session flush 모드가 &lt;code&gt;MANUAL&lt;/code&gt;로 설정되고, 이 경우 flush를 수동 수행하지 않는 한 수정 내역이 DB에 반영되지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// HibernateJpaDialect.prepareFlushMode
@Nullable
protected FlushMode prepareFlushMode(Session session, boolean readOnly) throws PersistenceException {
    FlushMode flushMode = (FlushMode)ReflectionUtils.invokeMethod(getFlushMode, session);
    Assert.state(flushMode != null, &amp;quot;No FlushMode from Session&amp;quot;);
    if (readOnly) {
        if (!flushMode.equals(FlushMode.MANUAL)) {
            session.setFlushMode(FlushMode.MANUAL);
            return flushMode;
        }
    } else if (flushMode.lessThan(FlushMode.COMMIT)) {
        session.setFlushMode(FlushMode.AUTO);
        return flushMode;
    }

    return null;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JPA 내부적으로 dirty checking을 하기 위한 snapshot을 따로 보관하지 않으므로 메모리가 절약된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;참고 &lt;a href=&quot;https://studyandwrite.tistory.com/573&quot;&gt;https://studyandwrite.tistory.com/573&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL</category>
      <author>움나나움</author>
      <guid isPermaLink="true">https://eveningminusdot.tistory.com/52</guid>
      <comments>https://eveningminusdot.tistory.com/entry/TIL-240701#entry52comment</comments>
      <pubDate>Mon, 1 Jul 2024 15:12:12 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 240611</title>
      <link>https://eveningminusdot.tistory.com/entry/TIL-240611</link>
      <description>&lt;h2&gt;Dockerfile 명령어&lt;/h2&gt;
&lt;h3&gt;FROM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FROM {imageName}:{image tag}&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;현재 만들고자 하는 도커 이미지의 base image를 가져오는 명령어&lt;/li&gt;
&lt;li&gt;remote 이미지일 경우, 해당 registry의 주소도 같이 적어주어야 함&lt;/li&gt;
&lt;li&gt;local 이미지일 경우, &lt;code&gt;--platform={image platform} {image name}:{image tag}&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;image platform은 &lt;code&gt;docker inspect --format=&amp;#39;{{.Os}}/{{.Architecture}}&amp;#39; {image name}&lt;/code&gt;을 통해서 알 수 있음&lt;/li&gt;
&lt;li&gt;ex) --platform=linux/amd64&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://stackoverflow.com/questions/20481225/how-can-i-use-a-local-image-as-the-base-image-with-a-dockerfile%5D&quot;&gt;https://stackoverflow.com/questions/20481225/how-can-i-use-a-local-image-as-the-base-image-with-a-dockerfile]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WORKDIR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt;는 쉘 명령어이므로, 원하는 위치로 이동, 즉 워킹 디렉토리를 지정하려면 해당 명령어를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;RUN&lt;/h3&gt;
&lt;h3&gt;COPY&lt;/h3&gt;
&lt;h3&gt;ENV&lt;/h3&gt;
&lt;h3&gt;USER&lt;/h3&gt;
&lt;h2&gt;docker 명령어&lt;/h2&gt;
&lt;h3&gt;docker 이미지 빌드&lt;/h3&gt;
&lt;h4&gt;docker build {options} {dir}&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Dockerfile로 이미지 빌드&lt;/li&gt;
&lt;li&gt;options&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t {imageName}:{imageTag}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; : build 시 사용할 Dockerfile 이름&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--progress=plain&lt;/code&gt; : 전체 빌드 프로세스의 로그를 볼 수 있음. &lt;code&gt;echo&lt;/code&gt; 등의 명령어 사용으로 콘솔에 찍히는 값도 확인 가능&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-cache&lt;/code&gt; : 캐시없이 처음부터 빌드. 기본 값은 캐시를 사용하는 것이므로, 해당 옵션을 쓰면 빌드 속도가 느려질 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dir&lt;ul&gt;
&lt;li&gt;빌드를 실행할, Dockerfile이 위치한 디렉토리. 현재 위치일 경우 &lt;code&gt;.&lt;/code&gt;을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;docker tag {image name}:{image tag} {new image name}:{new image tag}&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;기존에 가지고 있는 이미지의 이름과 태그를 바꿀 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;docker registry&lt;/h3&gt;
&lt;h4&gt;docker login {registry url} --username={username}&lt;/h4&gt;
&lt;h4&gt;docker push {registry base url}/{project name}/{image name}:{image tag}&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;레지스트리에 이미지 푸시. 이미지 이름이 하나의 레포지토리가 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;docker image로 컨테이너 빌드&lt;/h3&gt;
&lt;h4&gt;docker run -dit {image name}:{image tag}&lt;/h4&gt;
&lt;h2&gt;linux commands&lt;/h2&gt;
&lt;h3&gt;symbolic link&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ln -s {source} {dist}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;dnf&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;linux redhat 계열 OS에서 기존 &lt;code&gt;yum&lt;/code&gt; 명령어의 개선판으로 등장한 명령어&lt;/li&gt;
&lt;li&gt;기본적인 사용법은 &lt;code&gt;yum&lt;/code&gt;과 동일&lt;h4&gt;dnf -y install {package}&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;설치 전 파일 크기를 보여주고 설치 여부를 묻는데, 이 때 -y 옵션을 걸면 물어보지 않고 무조건 실행&lt;/li&gt;
&lt;li&gt;ex) &lt;code&gt;dnf install -y python&lt;/code&gt; : python 패키지를 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;tar -xvf {filename}&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;압축 파일 해제 시에 사용&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL</category>
      <author>움나나움</author>
      <guid isPermaLink="true">https://eveningminusdot.tistory.com/51</guid>
      <comments>https://eveningminusdot.tistory.com/entry/TIL-240611#entry51comment</comments>
      <pubDate>Wed, 12 Jun 2024 19:59:13 +0900</pubDate>
    </item>
    <item>
      <title>[React] React.js에서 사용하는 기본 개념</title>
      <link>https://eveningminusdot.tistory.com/entry/React-React-js%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4zZEa/btrwpuQU8tj/3LZOSj7rtTKQj1RAVZESc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4zZEa/btrwpuQU8tj/3LZOSj7rtTKQj1RAVZESc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4zZEa/btrwpuQU8tj/3LZOSj7rtTKQj1RAVZESc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4zZEa%2FbtrwpuQU8tj%2F3LZOSj7rtTKQj1RAVZESc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;247&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. JSX&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX란 React에서 사용하는, 확장된 javascript 문법이다. JS + XML이라고 생각하면 적당할 정도로, 마크업 언어와 같이 태그를 주로 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1646478224990&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const element = &amp;lt;h1&amp;gt;Hello, world!&amp;lt;/h1&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[React 공식 홈페이지 - JSX 소개]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.reactjs.org/docs/introducing-jsx.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646478132968&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JSX 소개 &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;ko.reactjs.org&quot; data-og-source-url=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; data-og-url=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cWKopu/hyNB1qh79f/kKkVO8oLyDUbZb15IYdkZK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cWKopu/hyNB1qh79f/kKkVO8oLyDUbZb15IYdkZK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JSX 소개 &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 익명 함수와 화살표 함수 / 즉시 실행 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 함수 모두 javascript에서 사용되는 형태의 함수로, 즉시 실행이 필요할 때 많이 쓴다. python이나 java의 lambda 함수와 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;익명함수&lt;/b&gt;는 말 그대로 이름이 없는 함수로,&amp;nbsp; &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;function&lt;/b&gt;&lt;/span&gt;이라는 js의 예약어를 사용해 선언한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화살표 함수&lt;/b&gt;는 주로 콜백 함수를 쓸 때 많이 쓰는데, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'() =&amp;gt;'&lt;/b&gt; &lt;/span&gt;형태를 통해 선언한다. 화살표 함수 내에 사용되는 파라미터가 1개인 경우, 괄호를 쓰지 않고 해당 파라미터 하나만 쓸 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 함수 모두 특정 변수에 대입해 쓸 수도 있고, &lt;b&gt;즉시 실행 함수&lt;/b&gt;, 즉 별도의 변수 대입 없이 해당 코드 라인 내에서 즉각적으로 실행되고 이후엔 사라지는 형태로 쓰일 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1646479809469&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export default function App() {
    return (
        &amp;lt;View&amp;gt;
            &amp;lt;Text&amp;gt;
                // JSX의 태그 사용 시 js 문법을 사용하려면 {}를 쓴다
                {function() { // 익명 함수 선언
                    // ... 
                    return 'Hello World!\n';
                }()} // 익명함수를 즉시 실행하기 위해 함수 뒤에 ()를 사용
            &amp;lt;/Text&amp;gt;
            &amp;lt;Text&amp;gt;
                {(() =&amp;gt; { // 화살표 함수 선언
                    // ...
                    return 'Hello World!\n';
                })()} // 화살표 함수를 ()로 한번 더 감싼 후 ()를 붙여 함수 즉시 실행            	
            &amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.&amp;nbsp; JSX의 style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX에서 태그 안에 사용하는 인라인 스타일링은, 기존 HTML에서 태그 내 문자열을 사용해 적용했던 것과는 달리, 객체 형태로 입력해야 하고 또 style 속성 이름은 하이픈('-')을 사용하지 않는 Camel Case로 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1646480453417&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const default function App() {
	return (
    	&amp;lt;View 
        	style = {{
            	backgroundColor: '#ffffff',
                alignItems: 'center',
        	}}
        &amp;gt;
        &amp;lt;/View&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1646480553676&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const default function App() {
	return (
    	&amp;lt;View style={styles.mainView}&amp;gt;&amp;lt;/View&amp;gt;
    );
}

const styles = StyleSheet.create({
  mainView: {
    backgroundColor: '#ffffff',
    alignItems: 'center',
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 예시처럼, style에 직접 js 객체를 바로 선언해 넣을 수도 있고, 두번째 예시처럼 다른 변수로 선언한 StyleSheet 객체에서 style 값을 불러올 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. props vs. state&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;props&lt;/b&gt;&lt;/span&gt;는 properties라는 뜻의 약자로, 부모 컴포넌트에서 자식 컴포넌트로 어떤 속성 값을 넘겨줄 때 사용하는 값들을 뜻한다. 즉, 외부에서 값을 들여와서 컴포넌트 내부에서 그 값을 사용하기 위해 props를 받는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1647744617346&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// title과 content가 props에 해당
const Parent = () =&amp;gt; {
    const title = &quot;jemok&quot;;
    const content = &quot;neyong&quot;;
    return (&amp;lt;Child title={title} content={content}/&amp;gt;);
};

const Child = ({title, content}) =&amp;gt; {
    return (&amp;lt;div&amp;gt; {title} &amp;lt;br/&amp;gt; {content} &amp;lt;/div&amp;gt;);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;반면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;state&lt;/b&gt;&lt;/span&gt;는 말 그대로 '상태'라는 뜻으로, 컴포넌트 내부에서만 사용할 특정한 상태를 나타내는 값을 뜻하며, 외부에서는 확인할 수 없는 값이다. 클래스형 컴포넌트에서는 constructor를 작성해 사용해야 했지만, 함수형 컴포넌트로 오면서 react의 Hook 중 'useState'라는 함수만 사용하면 간단하게 state를 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647745055385&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from 'react';

const Compo = () =&amp;gt; {
    // 기본값을 0로 설정해 state에 반환해주고, setState라는 함수를 반환해 state 값 설정에 사용
    const [state, setState] = useState(0);
    setState(11);
    return ( &amp;lt;div&amp;gt;{state}&amp;lt;/div&amp;gt; );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 내부에서 쓰는 용도라면, 일반 변수를 선언(let, var)해서 사용해도 될 것 같은데, 굳이 state를 사용하는 이유는 &lt;b&gt;state 값이 변경될 때마다 HTML이 자동으로 다시 렌더링 되기 때문&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>javascript</category>
      <category>JS</category>
      <category>JSX</category>
      <category>props</category>
      <category>react</category>
      <category>react-native</category>
      <category>State</category>
      <category>익명함수</category>
      <category>즉시실행함수</category>
      <category>화살표함수</category>
      <author>움나나움</author>
      <guid isPermaLink="true">https://eveningminusdot.tistory.com/47</guid>
      <comments>https://eveningminusdot.tistory.com/entry/React-React-js%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90#entry47comment</comments>
      <pubDate>Sat, 5 Mar 2022 20:45:31 +0900</pubDate>
    </item>
    <item>
      <title>[android-Java] View의 OnTouchListener</title>
      <link>https://eveningminusdot.tistory.com/entry/android-Java-View%EC%9D%98-OnTouchListener</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltQdB/btrsi8Yfa61/ZkoJCK6ebw21UDsUcyGDAk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltQdB/btrsi8Yfa61/ZkoJCK6ebw21UDsUcyGDAk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltQdB/btrsi8Yfa61/ZkoJCK6ebw21UDsUcyGDAk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltQdB%2Fbtrsi8Yfa61%2FZkoJCK6ebw21UDsUcyGDAk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;269&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View 클래스의 메소드 중, 해당 View 영역의 터치 동작을 감지할 수 있는 OnTouchListener에 대한 내용을 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 touch 동작을 인지하기 위해서는 기본적으로 다음과 같은 코드의 작성이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 우선 MainActivity의 onCreate 메소드 내에서 사용할 view 객체를 id로 불러온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 불러온 view 객체의 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;setOnTouchListener&lt;/b&gt;&lt;/span&gt; &lt;b&gt;메소드&lt;/b&gt;를 작성하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 그 안에 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;View &lt;span style=&quot;color: #000000;&quot;&gt;클래스의&lt;/span&gt; OnTouchListener &lt;span style=&quot;color: #000000;&quot;&gt;인터페이스&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;를 새로 선언해 인자로 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. OnTouchListener 안에서 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;@Override&lt;/b&gt;&lt;/span&gt; 어노테이션을 사용해 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;onTouch&lt;/span&gt; 메소드를 새롭게 정의&lt;/b&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1643849230762&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MainActiviy extends AppCompatActivity {
    
    View v;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        v = findViewById(R.id.v);
        
        v.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                float curX = event.getX();
                float curY = event.getY();
                
                if (action == event.ACTION_DOWN) {
                	...
                } else if (action == event.ACTION_MOVE) {
                	...
                } else if (action == event.ACTION_UP) {
                	...
                }
                ...
                return true;
            }
        });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 onTouch의 인자로 들어오는 MotionEvent는 getAction() 메소드를 통해서 얻을 수 있는 action이라는 값을 갖는데, 이는 일종의 enum 타입처럼 쓰이는 int 타입의 final 변수이다. &lt;b&gt;event.ACTION_DOWN&lt;/b&gt;(터치하기), &lt;b&gt;event.ACTION_MOVE&lt;/b&gt;(터치한 상태로 움직이기), &lt;b&gt;event.ACTION_UP&lt;/b&gt;(터치 후 화면에서 손 떼기) 등의 값이 존재하고, 화면 상의 터치 움직임에 따라 값을 반환한다.&lt;/p&gt;</description>
      <category>javascript</category>
      <category>Android</category>
      <category>onTouch</category>
      <category>onTouchListner</category>
      <category>Touch</category>
      <author>움나나움</author>
      <guid isPermaLink="true">https://eveningminusdot.tistory.com/46</guid>
      <comments>https://eveningminusdot.tistory.com/entry/android-Java-View%EC%9D%98-OnTouchListener#entry46comment</comments>
      <pubDate>Thu, 3 Feb 2022 10:32:22 +0900</pubDate>
    </item>
  </channel>
</rss>