<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>minthug94_.log</title>
        <link>https://velog.io/</link>
        <description>Minthug'life</description>
        <lastBuildDate>Mon, 09 Sep 2024 06:30:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>minthug94_.log</title>
            <url>https://images.velog.io/images/minthug94_/profile/7492a281-a98e-4b55-944b-7d09d3987950/pngegg.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. minthug94_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minthug94_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[StringUtils 라이브러리]]></title>
            <link>https://velog.io/@minthug94_/StringUtils-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</link>
            <guid>https://velog.io/@minthug94_/StringUtils-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</guid>
            <pubDate>Mon, 09 Sep 2024 06:30:18 GMT</pubDate>
            <description><![CDATA[<p>프로젝트를 하면서 StringUtils 라이브러리를 골라해야했는데 
이전에 프로젝트를 하면서는 lang3를 사용했지만
이번엔 대체 해보고싶어서 Sprignframwork.util을 사용했다</p>
<p>org.springframework.util.StringUtils;
org.apache.commons.lang3.StringUtils;</p>
<p>.isEmpty() 메서드를 써야했는데 
둘이 기능은 비슷하게 하고 있었다.
물론 lang3가 조금 더 많은 메서드를 제공해준다</p>
<pre><code> org.springframework.util.StringUtils:

null이거나 길이가 0인 문자열일 경우 true를 반환합니다.
공백 문자만 있는 문자열(예: &quot; &quot;)은 비어있지 않은 것으로 간주합니다.

b) Apache Commons Lang의 org.apache.commons.lang3.StringUtils:

null이거나 길이가 0인 문자열일 경우 true를 반환합니다.
Spring Framework의 구현과 유사하게 동작합니다.</code></pre><blockquote>
<p>💡개인적으로 궁금했던 isEmpty() vs isBlank               </p>
</blockquote>
<ul>
<li>isEmpty():
문자열이 null이거나 길이가 0일 때 true를 반환합니다.
공백 문자만 있는 문자열은 비어있지 않은 것으로 간주합니다.</li>
<li>isBlank() (Apache Commons Lang에서 제공):
문자열이 null이거나, 길이가 0이거나, 오직 공백 문자로만 이루어져 있을 때 true를 반환합니다.
즉, isEmpty()보다 더 엄격한 검사를 수행합니다.</li>
</ul>
<p>이런 메서드 차이가 있으니 참고하도록 하자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규화]]></title>
            <link>https://velog.io/@minthug94_/%EC%A0%95%EA%B7%9C%ED%99%94</link>
            <guid>https://velog.io/@minthug94_/%EC%A0%95%EA%B7%9C%ED%99%94</guid>
            <pubDate>Thu, 29 Aug 2024 08:43:02 GMT</pubDate>
            <description><![CDATA[<h1 id="정규화란-">정규화란 ?</h1>
<p>정규화는 데이터베이스 설계에서 중복을 최소화하고 데이터 무결성을 보장하기 위한 과정입니다.</p>
<ol>
<li>제 1 정규형(1NF)</li>
</ol>
<ul>
<li>모든 속성의 값은 원자값이어야 한다.</li>
<li>반복되는 그룹은 없어야 한다.</li>
</ul>
<ol start="2">
<li>제 2 정규형(2NF)</li>
</ol>
<ul>
<li>1NF를 만족해야 한다.</li>
<li>부분 함수성 종속성을 제거한다.</li>
</ul>
<ol start="3">
<li>제 3 정규형(3NF)</li>
</ol>
<ul>
<li>2NF를 만족해야 한다.</li>
<li>이행적 함수 종속성을 제거한다.</li>
</ul>
<ol start="4">
<li>BCNF(Boyce-Codd Normal Form)</li>
</ol>
<ul>
<li>3NF를 만족해야 한다.</li>
<li>모든 결정자가 후보키여야 한다.</li>
</ul>
<ol start="5">
<li>제 4 정규형(4NF)</li>
</ol>
<ul>
<li>BCNF를 만족해야 한다</li>
<li>다치 종속성을 제거한다.</li>
</ul>
<ol start="6">
<li>제 5 정규형(5NF)</li>
</ol>
<ul>
<li>4NF를 만족해야 한다.</li>
<li>조인 종속성을 제거한다.</li>
</ul>
<p>위 내용은 정규화에 대한 내용이지만 너무 어렵다.
대게 3 정규형까지만 진행하는 부분인거 같다.</p>
<p>정규화는 데이터베이스 설계를 개선하는 과정입니다.
주 목적은 데이터 중복을 줄이고, 데이터의 일관성과 효율성을 높이는데 목적이 있습니다.</p>
<p>예시)</p>
<h2 id="제-1-정규형-모든-속성의-값은-원자값">제 1 정규형: 모든 속성의 값은 원자값</h2>
<pre><code>정규화 이전

주문(주문번호, 고객이름, 책목록)
1, 홍길동, &quot;자바의 정석, 파이썬 기초&quot;</code></pre><pre><code>제1 정규화
주문(주문번호, 고객이름, 책제목)
1, 홍길동, 자바의 정석
1, 홍길동, 파이썬 기초</code></pre><h2 id="제-2-정규형-부분-종속성을-제거한다-모든-비주요-속성이-주요-키에-완전-종속-되어야-한다">제 2 정규형: 부분 종속성을 제거한다, 모든 비주요 속성이 주요 키에 완전 종속 되어야 한다.</h2>
<pre><code>주문(주문번호, 고객이름)
주문상세(주문번호, 책제목, 가격)</code></pre><h2 id="제-3-정규형-이행적-종속성을-제거한다-비주요-속성들-간의-종속성을-없앤다">제 3 정규형: 이행적 종속성을 제거한다, 비주요 속성들 간의 종속성을 없앤다</h2>
<pre><code>주문(주문번호, 고객이름)
주문상세(주문번호, ISBN, 수량)
책(ISBN, 제목, 가격, 저자)</code></pre><p>이 과정에서 얻은 이점</p>
<ol>
<li>데이터 중복 감소 : 같은 정보를 여러 번 저장하지 않아 저장 공간 절약</li>
<li>데이터 일관성 향상 : 한 곳에서만 데이터 수정을 하면 되어서 오류 가능성 줄이기</li>
<li>유연성 증가 : 새로운 데이터 유형을 쉽게 추가할 수 있다.</li>
</ol>
<p>요약하자면
1 정규형은 한칸에 한 가지 정보만 넣기 예를 들면 전화번호를 여러개 적지않고 각각 따로 저장
2 정규형은 관련 있는 정보끼리 모아두기 예로는 주문 정보와 고객 정보를 따로 저장
3 정규형은 다른 정보를 통해 알 수 있는 정보는 따로 저장 예로는 직원 정보에서 부서명 빼고, 부서 정보를 따로 저장</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git action ssh:핸드쉐이크 에러]]></title>
            <link>https://velog.io/@minthug94_/Git-action-ssh%ED%95%B8%EB%93%9C%EC%89%90%EC%9D%B4%ED%81%AC-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@minthug94_/Git-action-ssh%ED%95%B8%EB%93%9C%EC%89%90%EC%9D%B4%ED%81%AC-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Fri, 16 Aug 2024 10:12:56 GMT</pubDate>
            <description><![CDATA[<p>2024/08/16 09:39:02 ssh: handshake failed: ssh: overflow reading version string</p>
<p>jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Auto Deploy
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_PRIVATE_KEY }}
          port: ${{ secrets.SERVER_PORT }}</p>
<p> yml 파일은 이렇게 구성되어있었고
 actions 세팅을 통해
 퍼블릭IP
 ec2 사용자명
 ec2를 사용하고있어 .pem 파일을 설정
 포트를 8081로 설정했었다</p>
<p> 구글링을 하면서 server_port 라는 이름이 그냥 내가 사용하는 포트인줄알고 8081을 자연스럽게 설정했었는데 알고보니 server_ssh_port를 의미하는 것이였다.</p>
<p>ssh 포트인 22로 다시 설정하니 무사히 git action CI/CD가 연결되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git Action Master branch 에러 ]]></title>
            <link>https://velog.io/@minthug94_/Git-Action-Master-branch-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@minthug94_/Git-Action-Master-branch-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Fri, 16 Aug 2024 09:19:42 GMT</pubDate>
            <description><![CDATA[<p>appleboy/ssh-action@master</p>
<pre><code>Run appleboy/ssh-action@master
Run echo &quot;$GITHUB_ACTION_PATH&quot; &gt;&gt; $GITHUB_PATH
Run entrypoint.sh
Will download drone-ssh-1.7.7-linux-amd64 from https://github.com/appleboy/drone-ssh/releases/download/v1.7.7
======= CLI Version =======
Drone SSH version 1.7.7
===========================
2024/08/16 08:03:35 ssh.ParsePrivateKey: ssh: no key found
2024/08/16 08:03:35 ssh: handshake failed: ssh: overflow reading version string
Error: Process completed with exit code 1.</code></pre><p>steps:
      - name: Auto Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}</p>
<p>yml 파일에 이렇게 설정을 했는데
구글링 한 결과 
현재 ssh-action@master에 문제가 있다는걸 알게되었다.</p>
<p>이후 <a href="mailto:ssh-action@v1.0.3">ssh-action@v1.0.3</a>
버전을 기입하니 해당 에러 발생하지않았다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dokcer PostgreSQL 실행 오류]]></title>
            <link>https://velog.io/@minthug94_/Dokcer-PostgreSQL-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@minthug94_/Dokcer-PostgreSQL-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Fri, 26 Apr 2024 08:16:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Docker Images</p>
</blockquote>
<p>REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
backend      latest    aa743c2294b7   2 hours ago    1.04GB
postgres     latest    cb65f77993aa   2 months ago   453MB</p>
<blockquote>
<p>docker network ls</p>
</blockquote>
<p>NETWORK ID     NAME         DRIVER    SCOPE
e9f492b29d80   bridge       bridge    local
59d8bed54ca2   host         host      local
20ff8ae63c98   none         null      local
1d86eb583a13   sniff-step   bridge    local &lt; 이걸 사용중</p>
<p>docker run -it --rm --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres</p>
<p>docker run -d --restart=always --name backend --network sniff-step backend</p>
<blockquote>
<p>docker ps -a</p>
</blockquote>
<p>CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS                          PORTS                    NAMES
name   backend    &quot;java -jar Sniff-Ste…&quot;   About an hour ago   Restarting (1) 21 seconds ago                            backend
name   postgres   &quot;docker-entrypoint.s…&quot;   About an hour ago   Up About an hour                0.0.0.0:5432-&gt;5432/tcp   postgres</p>
<blockquote>
<p>docker logs -f backend </p>
</blockquote>
<p>아래의 해당 오류가 발생했다</p>
<pre><code>org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;entityManagerFactory&#39; defined in class path resource 

Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is 

org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution [Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.] [n/a]


Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.


Caused by: java.net.ConnectException: Connection refused
~중략~
    ... 64 common frames omitted</code></pre><p>해당 에러 메시지에 대한 챗GPT의 의견은</p>
<blockquote>
</blockquote>
<p>원인</p>
<ul>
<li>데이터베이스 서버 접속 거부: 애플리케이션이 localhost:5432 주소의 PostgreSQL 데이터베이스에 연결하려고 시도했지만, 접속이 거부되었습니다. 이는 일반적으로 데이터베이스 서버가 실행되지 않거나, 네트워크 설정이 올바르지 않을 때 발생합니다.</li>
<li>TCP/IP 연결 설정 문제: PostgreSQL 서버 설정에서 TCP/IP 연결을 허용하지 않거나 잘못 구성되어 있을 수 있습니다.</li>
</ul>
<p>현재 문제는 두 컨테이너 사이에서 데이터베이스 서버로 접속이 거부
그때문인지 계속 backend 컨테이너가 꺼져버리는 현상이 생긴다.</p>
<p>처음엔 네트워크를 연결시켜서 로컬에서 서버를 올리듯이 DB 컨테이너와 Backend 컨테이너가 연결되어 실행이 될거라고 생각했다.</p>
<p>챗GPT에게 질문</p>
<blockquote>
</blockquote>
<p>도커 컨테이너가 네트워크끼리 연결되어있으면 localhost:3000에서 curl로 localhost:4000에 리퀘스트를 보낼 수 있지않아?</p>
<blockquote>
<p>답변
ChatGPT
Docker 컨테이너들이 같은 네트워크 내에 있을 때, 컨테이너간 통신을 하기 위해 각각의 localhost 주소를 사용하는 것은 작동하지 않습니다. localhost는 각 컨테이너의 내부 네트워크 환경을 가리키기 때문에, 컨테이너 A의 localhost는 그 컨테이너 자체를 의미하고, 컨테이너 B의 localhost도 마찬가지로 그 컨테이너 자체를 가리킵니다.
따라서, 컨테이너 A에서 컨테이너 B로 요청을 보내려면 다음과 같은 방법을 사용해야 합니다:
Docker 네트워크 사용: Docker 네트워크를 사용하면 컨테이너들이 서로의 이름으로 통신할 수 있습니다. 예를 들어, 컨테이너의 이름이 containerB라면, 컨테이너 A에서 curl <a href="http://containerB:4000%EA%B3%BC">http://containerB:4000과</a> 같은 명령으로 컨테이너 B에 접근할 수 있습니다.
포트 포워딩 설정: Docker에서는 컨테이너의 포트를 호스트의 포트에 매핑할 수 있습니다. 만약 컨테이너 B의 4000 포트를 호스트의 4000 포트에 연결했다면, 컨테이너 A에서는 호스트의 IP 주소를 사용하여 curl <a href="http://host-ip:4000">http://host-ip:4000</a> 형태로 컨테이너 B에 접근할 수 있습니다.
호스트 네트워크 사용: Docker 컨테이너를 호스트 네트워크 모드로 설정하면, 컨테이너가 호스트의 네트워크 환경을 직접 사용하게 됩니다. 이 설정을 사용하면, 컨테이너 내부에서 localhost를 사용하여 호스트 시스템의 서비스에 접근할 수 있지만, 보통은 컨테이너간 격리를 위해 사용하지 않는 것이 일반적입니다.
따라서, 여러분의 Docker 설정에 따라 적절한 방법을 선택하여 컨테이너 간에 통신할 수 있습니다.</p>
</blockquote>
<p>아직 정확하게는 모르겠지만
backend 컨테이너의 포트는 localhost:8081
postgresql 컨테이너의 포트는 postgres:5432
로 구성되어있다는 대답을 한거같다</p>
<p>그래서 docker network를 사용하면
컨테이너들의 서로의 이름:port로 통신을 할수있다는것이다</p>
<pre><code>Container Backend 
curl http://postgres:5432</code></pre><p>와 같은 명령어로 컨테이너 postgres에 접근이 가능하다는 점</p>
<p>그래서</p>
<pre><code class="language-java">application.properties 파일에

# Spring Datasource and JPA settings
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.default_batch_fetch_size=100
spring.jpa.hibernate.ddl-auto=create-drop
</code></pre>
<pre><code class="language-java">spring.datasource.url=jdbc:postgresql://postgres:5432/postgres</code></pre>
<p>으로 바꾸어주면 내가 도커에서 jsp와 db를 연결시킬수있다</p>
<p>또한 build run 컨테이너 이미지를 만드는 순서도 
postgres를 우선으로 만드는게 중요하다</p>
<p>docker run <br>  --name postgres <br>  --network sniff-step <br>  -e POSTGRES_USER=username <br>  -e POSTGRES_DB=postgres <br>  -e POSTGRES_PASSWORD=password <br>  -d postgres</p>
<p>조금 어려우니 네트워크 관련된 지식과 도커 네트워크에 대한 이론을 조금 더 찾아보고
해당 글에 보충글을 작성해야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EC2 error (2)]]></title>
            <link>https://velog.io/@minthug94_/EC2-error-2</link>
            <guid>https://velog.io/@minthug94_/EC2-error-2</guid>
            <pubDate>Fri, 19 Apr 2024 06:47:47 GMT</pubDate>
            <description><![CDATA[<p>EC2 git clone 이후 ./gradlew clean build 시
무한 로딩에 걸려 정상적으로 작동하지 않은 이유는</p>
<p>메모리 부족 문제가 발생한것을 알 수 있었다.
프리티어로 너무 낮은 메모리를 사용하기에 
돈으로 해결 되는 문제이지만
소규모일때 해결하는 방법을</p>
<p>SWAP memory 사용이라는 방법으로 통해 해결했다</p>
<blockquote>
<p>RAM memory 부족을 리눅스의 HDD 공간을 RAM 처럼 사용</p>
</blockquote>
<p>아래 링크를 통해 해결했으니 같은 문제를 겪는다면 참고!
<a href="https://sundries-in-myidea.tistory.com/102">https://sundries-in-myidea.tistory.com/102</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker error /bin/sh: apt-get: command not found]]></title>
            <link>https://velog.io/@minthug94_/docker-error-binsh-apt-get-command-not-found</link>
            <guid>https://velog.io/@minthug94_/docker-error-binsh-apt-get-command-not-found</guid>
            <pubDate>Wed, 17 Apr 2024 08:24:16 GMT</pubDate>
            <description><![CDATA[<p>minthug@gimmigseoui-MacBookAir backend % docker build -t test .
[+] Building 15.6s (8/9)<br> =&gt; [internal] load build definition from Dockerfile                                                                                                                0.0s
 =&gt; =&gt; transferring dockerfile: 292B                                                                                                                                0.0s
 =&gt; [internal] load .dockerignore                                                                                                                                   0.0s
 =&gt; =&gt; transferring context: 2B                                                                                                                                     0.0s
 =&gt; [internal] load metadata for docker.io/library/openjdk:17-jdk                                                                                                   2.8s
 =&gt; [internal] load build context                                                                                                                                   0.1s
 =&gt; =&gt; transferring context: 2.49MB                                                                                                                                 0.1s
 =&gt; [1/5] FROM docker.io/library/openjdk:17-jdk@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8                                            12.2s
 =&gt; =&gt; resolve docker.io/library/openjdk:17-jdk@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8                                             0.0s
 =&gt; =&gt; sha256:416105dc84fc8cf66df5d2c9f81570a2cc36a6cae58aedd4d58792f041f7a2f5 42.02MB / 42.02MB                                                                    4.2s
 =&gt; =&gt; sha256:fe66142579ff5bb0bb5cf989222e2bc77a97dcbd0283887dec04d5b9dfd48cfa 14.29MB / 14.29MB                                                                    1.1s
 =&gt; =&gt; sha256:1250d2aa493e8744c8f6cb528c8a882c14b6d7ff0af6862bbbfe676f60ea979e 186.36MB / 186.36MB                                                                 10.7s
 =&gt; =&gt; sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8 1.04kB / 1.04kB                                                                      0.0s
 =&gt; =&gt; sha256:2fd12c42c12bf707f7ac0f5fa630ff9c59868dfc4428daaf34df9d82a0c5b101 954B / 954B                                                                          0.0s
 =&gt; =&gt; sha256:4717374ea615130b05563033606c237efe452e58018595092592ed35a1fb8d5e 4.46kB / 4.46kB                                                                      0.0s
 =&gt; =&gt; extracting sha256:416105dc84fc8cf66df5d2c9f81570a2cc36a6cae58aedd4d58792f041f7a2f5                                                                           0.7s
 =&gt; =&gt; extracting sha256:fe66142579ff5bb0bb5cf989222e2bc77a97dcbd0283887dec04d5b9dfd48cfa                                                                           0.2s
 =&gt; =&gt; extracting sha256:1250d2aa493e8744c8f6cb528c8a882c14b6d7ff0af6862bbbfe676f60ea979e                                                                           1.4s
 =&gt; [2/5] WORKDIR /app                                                                                                                                              0.2s
 =&gt; [3/5] COPY . .                                                                                                                                                  0.1s
 =&gt; ERROR [4/5] RUN apt-get update &amp;&amp;     apt-get install -y findutils                                                                                              0.2s</p>
<p> =&gt; [4/5] RUN apt-get update &amp;&amp;     apt-get install -y findutils:
#8 0.160 /bin/sh: apt-get: command not found</p>
<p>executor failed running [/bin/sh -c apt-get update &amp;&amp;     apt-get install -y findutils]: exit code: 127</p>
<h2 id="해당-오류-원인">해당 오류 원인</h2>
<pre><code>FROM openjdk:17-jdk
WORKDIR /app
COPY . .

# 필요한 유틸리티 설치
RUN apt-get update &amp;&amp; \
    apt-get install -y findutils

RUN ./gradlew clean build

EXPOSE 8081
ENTRYPOINT [&quot;java&quot;, &quot;-jar&quot;, &quot;app.jar&quot;]
</code></pre><p>도커 파일에 이미지가 맞지않아 발생하던 상황이다
로컬에서 사용하는 이미지와 맞게 설정하니 간단히 해결되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EC2 관련 에러 (1)]]></title>
            <link>https://velog.io/@minthug94_/EC2-%EA%B4%80%EB%A0%A8-%EC%97%90%EB%9F%AC-1</link>
            <guid>https://velog.io/@minthug94_/EC2-%EA%B4%80%EB%A0%A8-%EC%97%90%EB%9F%AC-1</guid>
            <pubDate>Tue, 16 Apr 2024 09:42:54 GMT</pubDate>
            <description><![CDATA[<p>EC2 ubuntu 환경에서
Docker 설치 후 
프로젝트 배포를 한 이후
./gradlew build 시 </p>
<pre><code>FAILURE: Build failed with an exception.

* What went wrong:
Could not create an instance of type org.gradle.api.internal.initialization.DefaultScriptHandler.
&gt; Could not create service of type ChecksumService using BuildSessionScopeServices.createChecksumService().
   &gt; java.io.FileNotFoundException: /home/min/Sniff-Step/backend/.gradle/8.4/checksums/checksums.lock (Permission denied)

* Try:
&gt; Run with --stacktrace option to get the stack trace.
&gt; Run with --info or --debug option to get more log output.
&gt; Run with --scan to get full insights.
&gt; Get more help at https://help.gradle.org.

BUILD FAILED in 1s

FAILURE: Build failed with an exception.

* What went wrong:
Could not update /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin
&gt; /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin (Permission denied)

* Try:
&gt; Run with --stacktrace option to get the stack trace.
&gt; Run with --info or --debug option to get more log output.
&gt; Run with --scan to get full insights.
&gt; Get more help at https://help.gradle.org.

BUILD FAILED in 1s</code></pre><p>이러한 오류를 만나게 되었다.
해당 오류는 권한 문제로 인해 발생 한 것으로 </p>
<pre><code>권한 수정
sudo chown -R $(whoami) /home/min/Sniff-Step/backend/.gradle
sudo chmod -R 755 /home/min/Sniff-Step/backend/.gradle</code></pre><pre><code>Gradle Wrapper 실행 권한 
chmod +x ./gradlew</code></pre><pre><code>* What went wrong:
Could not update /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin
&gt; /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin (Permission denied)
</code></pre><p>이 후 발생한 오류 메시지</p>
<p>챗지피티에 문의한 결과</p>
<pre><code>Could not update /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin &gt; /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin (Permission denied) 이 오류 메시지는 Gradle 빌드 도중 파일을 수정하거나 업데이트하려 할 때 해당 파일에 대한 쓰기 권한이 없음을 나타냅니다.

문제 원인
Gradle 빌드 과정에서는 여러 종류의 임시 파일과 캐시 파일을 생성하고 업데이트하는데, 이 과정에서 .gradle 디렉토리 내의 last-build.bin 파일을 업데이트하려고 했으나, 파일에 접근할 수 있는 권한이 부족하여 발생한 오류입니다.</code></pre><h3 id="해결-방안">해결 방안</h3>
<pre><code>ls -l /home/min/Sniff-Step/backend/.gradle/8.4/fileChanges/last-build.bin
</code></pre><pre><code>쓰기 권한 부여
sudo chown $(whoami) /home/min/Sniff-Step/backend/.gradle -R
sudo chmod 755 /home/min/Sniff-Step/backend/.gradle -R</code></pre><p>하지만 해당 오류메시지 발생</p>
<pre><code> What went wrong:
Execution failed for task &#39;:clean&#39;.
&gt; java.io.IOException: Unable to delete directory &#39;/home/min/Sniff-Step/backend/build&#39;</code></pre><pre><code>Execution failed for task &#39;:clean&#39;. &gt; java.io.IOException: Unable to delete directory &#39;/home/min/Sniff-Step/backend/build&#39; 오류는 Gradle이 빌드 중 clean 태스크를 수행하려 할 때, /home/min/Sniff-Step/backend/build 디렉토리를 삭제하는 데 실패했음을 나타냅니다. 이는 다음과 같은 몇 가지 이유로 발생할 수 있습니다:

디렉토리에 열린 파일이 있을 때: 다른 프로그램이나 프로세스가 해당 디렉토리 내 파일을 사용 중일 경우, 운영체제가 그 파일이나 디렉토리의 삭제를 허용하지 않을 수 있습니다.
권한 문제: 사용자가 해당 디렉토리를 삭제할 충분한 권한이 없는 경우 삭제가 불가능할 수 있습니다.
해결 방법
1. 사용 중인 파일 확인 및 프로세스 종료
사용 중인 파일을 확인하고, 해당 파일을 사용 중인 프로세스를 종료할 수 있습니다. 리눅스에서는 lsof 명령어를 사용하여 해당 디렉토리를 사용 중인 프로세스를 찾을 수 있습니다:

bash</code></pre><p>챗 지피티 답변</p>
<pre><code>lsof +D /home/min/Sniff-Step/backend/build
</code></pre><pre><code>sudo chown -R $(whoami):$(whoami) /home/min/Sniff-Step/backend/build
sudo chmod -R 775 /home/min/Sniff-Step/backend/build
</code></pre><p>이렇게 해결했지만</p>
<p>현재 프리티어 메모리로 인한 무한 로딩으로 인해 
해결 후 2번째 글을 작성할 예정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker 사용법 ]]></title>
            <link>https://velog.io/@minthug94_/docker-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@minthug94_/docker-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Tue, 16 Apr 2024 09:27:21 GMT</pubDate>
            <description><![CDATA[<p>도커는 쓸때마다 까먹어서 미리 정리해서 써야겠다.</p>
<p>/app 경로에
Dockerfile 을 생성했다.</p>
<pre><code>FROM jdk version
WORKDIR /app 
COPY build/libs/*.jar .
EXPOSE PORT
CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;**-SNAPSHOT.jar&quot;]</code></pre><p>위와 같이 세팅을 진행 한 후</p>
<pre><code class="language-docker">docker build -t [이미지 이름] .</code></pre>
<pre><code>docker images
도커 이미지 확인</code></pre><pre><code>docker run -d --restart=always --name [컨테이너이름] --network [네트워크이름] [이미지이름]</code></pre><p>-d 백그라운드로 도커 실행하기
--restart=always 재부팅 될시 다시 켜진다? </p>
<p>주의할 점은 
기본적으로 네트워크는 bridge 디폴트이기때문에 에러 메시지가 나올 수 있다.
그럴땐 네트워크를 이름을 설정해 생성해준 뒤 연결하도록 한다</p>
<pre><code>docker rmi [이미지 이름]</code></pre><pre><code>docker rm [컨테이너 이름]</code></pre><pre><code>docker ps
현재 사용중인 컨테이너 확인하기</code></pre><pre><code>docker ps -a
사용/중지된 모든 컨테이너 확인하기</code></pre><pre><code>docker network create [네트워크 이름]</code></pre><pre><code>docker network ls
네트워크 목록 확인</code></pre><pre><code>네트워크 ls 시 이런식으로 보인다
NETWORK ID     NAME         DRIVER    SCOPE
e9f492b29d80   bridge       bridge    local
59d8bed54ca2   host         host      local
20ff8ae63c98   none         null      local
b8fe387d09b7   []           bridge    local</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[BeanCreationException error]]></title>
            <link>https://velog.io/@minthug94_/BeanCreationException-error</link>
            <guid>https://velog.io/@minthug94_/BeanCreationException-error</guid>
            <pubDate>Wed, 03 Apr 2024 07:09:21 GMT</pubDate>
            <description><![CDATA[<p>org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;entityManagerFactory&#39; defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set &#39;jakarta.persistence.jdbc.url&#39; for common cases or &#39;hibernate.dialect&#39; when a custom Dialect implementation must be provided)</p>
<p>application.yml 설정에 대한 문제로 BeanCreationException이 발생하는 경우, 주로 스프링 부트가 데이터베이스 연결을 올바르게 구성하지 못했거나 하이버네이트 설정에 문제가 있는 경우에 발생
제시한 오류 메시지를 바탕으로, 하이버네이트가 JDBC 메타데이터를 통해 데이터베이스 방언(Dialect)을 자동으로 식별하지 못하는 상황에선
hibernate.dialect 속성을 명시적으로 설정해야한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ java.lang.NoSuchFieldError: UUID]]></title>
            <link>https://velog.io/@minthug94_/java.lang.NoSuchFieldError-UUID</link>
            <guid>https://velog.io/@minthug94_/java.lang.NoSuchFieldError-UUID</guid>
            <pubDate>Sat, 23 Mar 2024 11:35:25 GMT</pubDate>
            <description><![CDATA[<p>NoSuchFieldError 이 문제로 몇날 몇일을 고생했는데
아주 간단하게 버전을 3.0.0 에서 3.1.0 으로 업데이트하니 해결되었다.
너무나도 슬프다</p>
<pre><code class="language-java">implementation &#39;jakarta.persistence:jakarta.persistence-api:3.1.0&#39;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열 만들기/ 짝수 처리 출력]]></title>
            <link>https://velog.io/@minthug94_/%EB%B0%B0%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%A7%9D%EC%88%98-%EC%B2%98%EB%A6%AC-%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@minthug94_/%EB%B0%B0%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%A7%9D%EC%88%98-%EC%B2%98%EB%A6%AC-%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Sun, 10 Dec 2023 06:47:56 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];

        int even = 0;

        for(int i = 0; i &lt; n; i++) {
            arr[i] = sc.nextInt();
        }

        for(int i = 0; i &lt; n; i++) {
            if(arr[i] % 2 == 0) 
        System.out.print(arr[i] + &quot; &quot;);
        }
    }
}
</code></pre>
<pre><code>4
10 4 3 6 입력값
------------
10 4 6  출력값</code></pre><p>다른풀이</p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 변수 선언
        int n = sc.nextInt();

        // 배열 선언
        int[] arr = new int[100];
        int[] newArr = new int[100];
        int cnt = 0;

        // n개의 정수를 입력받아 배열에 저장
        for(int i = 0; i &lt; n; i++) {
            arr[i] = sc.nextInt();
        }

        // n개의 정수 중 짝수만 새로운 배열에 저장
        for(int i = 0; i &lt; n; i++)
            if(arr[i] % 2 == 0)
                newArr[cnt++] = arr[i];

        // n개의 정수 중 짝수만 출력
        for(int i = 0; i &lt; cnt; i++)
            System.out.print(newArr[i] + &quot; &quot;);
    }
}</code></pre>
<p>추후 복잡해질시 처리부/출력부를 나누면 코드의 가독성이 올라가기 때문</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구구단 짝수 구하기]]></title>
            <link>https://velog.io/@minthug94_/%EA%B5%AC%EA%B5%AC%EB%8B%A8-%EC%A7%9D%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@minthug94_/%EA%B5%AC%EA%B5%AC%EB%8B%A8-%EC%A7%9D%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 06 Dec 2023 06:21:57 GMT</pubDate>
            <description><![CDATA[<p>정수 a, b를 입력받은 후, a이상 b이하에 해당하는 숫자의 구구단을 예제와 같은 형식으로 출력하는 프로그램을 작성해보세요.</p>
<p>매 줄마다 b에서 a로 1씩 감소하며 출력합니다. 곱해지는 값은 첫 번째 줄에서는 2, 두 번째 줄에서는 4, 세 번째 줄에서는 6, 그리고 네 번째 줄에서는 8임에 유의합니다.</p>
<p>그 예로 a = 2, b = 4 일 때의 출력은 다음과 같습니다.</p>
<pre><code>4 * 2 = 8 / 3 * 2 = 6 / 2 * 2 = 4
4 * 4 = 16 / 3 * 4 = 12 / 2 * 4 = 8
4 * 6 = 24 / 3 * 6 = 18 / 2 * 6 = 12
4 * 8 = 32 / 3 * 8 = 24 / 2 * 8 = 16
</code></pre><pre><code>import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        for (int i = 2; i &lt;= 9; i++) {
            if (i % 2 == 0) {
                for (int j = b; j &gt;= a; j--) {
                    System.out.print(j + &quot; * &quot; + i + &quot; = &quot; + (i * j));
                    if (j != a) {
                        System.out.print(&quot; / &quot;);
                    }
                }
                System.out.println();
            }
        }
    }
}
</code></pre><pre><code>import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        for (int i = 2; i &lt;= 8; i += 2) {
            for (int j = b; j &gt;= a; j--) {
                System.out.print(j + &quot; * &quot; + i + &quot; = &quot; + (i * j));
                if (j != a) {
                    System.out.print(&quot; / &quot;);
                }
            }
            System.out.println();
        }
    }
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[직각삼각형 별표 출력]]></title>
            <link>https://velog.io/@minthug94_/%EC%A7%81%EA%B0%81%EC%82%BC%EA%B0%81%ED%98%95-%EB%B3%84%ED%91%9C-%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@minthug94_/%EC%A7%81%EA%B0%81%EC%82%BC%EA%B0%81%ED%98%95-%EB%B3%84%ED%91%9C-%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Mon, 04 Dec 2023 08:25:21 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 변수 선언 및 입력
        int n = sc.nextInt();

        // n * n 크기의 별을 출력합니다.
        for(int i = 0; i &lt; n; i++) {
            for(int j = 0; j &lt; n - i; j++) {
                System.out.print(&quot;* &quot;);
            }
            System.out.println();
        }
    }
}</code></pre>
<pre><code class="language-java">import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        for(int i = 1; i &lt;= n; i++) {
            for(int j = n ; j &gt;= i; j--) {
                System.out.print(&quot;* &quot;);
            }
            System.out.println();
        }
    }
}</code></pre>
<pre><code class="language-java">import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        for(int i = 1; i &lt;= n; i++) {
            for(int j = n ; j &gt;= i; j--) {
                System.out.print(&quot;* &quot;);
            }
            System.out.println();
        }
         for(int i = 2; i &lt;= n; i++) {
            for(int j = 0; j &lt; i ;j++) {
                System.out.print(&quot;* &quot;);
            }
            System.out.println();
    }
}

}</code></pre>
<p>출력</p>
<pre><code>* * * * * 
* * * * 
* * * 
* * 
* 
* * 
* * * 
* * * * 
* * * * * 
</code></pre><pre><code class="language-java">import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        for(int i =0; i &lt; n; i++){
            for(int j = 0; j &lt;i; j++) {
                System.out.print(&quot;  &quot;);
            }
            for(int j = 0; j &lt; (2 * n) - (2 * i) -1; j++) {
                System.out.print(&quot;* &quot;);
            }
            System.out.println();
        }
    }
}</code></pre>
<p>출력</p>
<pre><code>* * * * * * * * * 
  * * * * * * * 
    * * * * * 
      * * * 
        * 
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[메서드의 특징]]></title>
            <link>https://velog.io/@minthug94_/%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@minthug94_/%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Sun, 26 Nov 2023 08:37:14 GMT</pubDate>
            <description><![CDATA[<h1 id="method">Method</h1>
<p>메서드는 클래스의 내부에 존재하는 영역으로 특정 기능을 하는 코드를 묶어서 나타내는 것이다.
즉, 특정 기능을 수행하기 위한 코드들의 집합체이며 특정 기능을 수행한다는 것은 데이터를 입력받아 해당 데이터를 일련의 처리 과정을 통해 만들어진 결과값을 반환하는 것을 의미한다.</p>
<pre><code class="language-java">// Class
public class Main {
    // Method
    public static void main(String[] args) {
    }
}</code></pre>
<h2 id="함수와-메서드">함수와 메서드</h2>
<p>메서드는 다른 언어의(C, C++)의 함수 개념과 매우 비슷한데 이 둘의 차이점은 함수는 특정 기능을 수행하는 코드들을 묶은 것이고, 메서드는 클래스 내에 포함되어 있는 함수라고 이해할 수 있다.</p>
<p>종종 자바 언어를 개발하면서 함수라고도 많이 하는데 자바는 객체지향 언어이며 모든 코드를 클래스 내에 작성하기 때문에 메서드라는 용어를 사용해 구분 짓는 것이 좋다.</p>
<h2 id="메서드-정의">메서드 정의</h2>
<pre><code>/*
반환타입 메서드이름(매개변수타입 매개변수이름) {
        메서드 바디
}
*/

void mian(String[] args) {
        // 내용
}
</code></pre><h3 id="반환-타입">반환 타입</h3>
<ul>
<li>메서드는 처리 결과값을 반환한다, 처리 결과는 값의 형태로 된 데이터를 뜻하며, 이 데이터가 반환값이다.</li>
<li>값은 여러 종류로 나뉜 데이터로 정수, 문자, boolean, ... 등 다양하다</li>
<li>이러한 값의 종류를 데이터 타입이라 하며, 자료형이라 한다.</li>
<li>따라서 반환 타입은 메서드가 반환할 값의 종류를 의미하며, 메서드를 정의할 때 반환할 값의 타입을 명시해야한다.</li>
<li>void의 경우 없음을 뜻하면 반환 값이 없다는 것을 의미</li>
</ul>
<h3 id="매개변수-타입과-매개변수-이름">매개변수 타입과 매개변수 이름</h3>
<ul>
<li>메서드는 데이터를 입력받아 해당 데이터를 일련의 처리 과정을 통해 결과값을 반환</li>
<li>즉, 메서드 외부에서 메서드 내부로 전달하는 입력값이 존재 -&gt; 이를 매개변수라 한다.</li>
<li>값(데이터)는 변수를 통해 저장할 수 있다, 이를 메서드의 매개변수로 지정함으로 메서드 내부에서 사용할 수 있게 해준다.</li>
<li>매개변수는 메서드 외부와 내부를 매개해주는 변수라는 의미</li>
<li>메서드 이름 옆에 소괄호<code>()</code>를 통해 매개변수 타입과 이름을 공백으로 구분하여 지정</li>
<li>매개변수의 타입은 어떤 데이터 타입을 메서드가 입력받아 사용할 것인지 지정하는 곳이다</li>
<li>매개변수 이름은 입력받은 값에 이름을 붙여 메서드 내부에서 이름을 통해 사용</li>
</ul>
<h3 id="메서드-바디">메서드 바디</h3>
<ul>
<li>메서드가 구체적으로 어떤 기능을 수행할지에 대한 코드를 작성하는 부분</li>
<li>return 키워드를 사용해 처리 결과를 반환할 수 있다.</li>
</ul>
<p>메서드 예시(두 정수의 합)</p>
<pre><code>int add(int num1, int num2) {
    return num1 + num2;
}

/*
반환타입 메서드이름(매개변수타입 매개변수이름) {
    메서드 바디
}
*/</code></pre><p>메서드 반환 타입 int: 메서드 바디에서 return시 반환되는 값의 타입이 정수형이다.</p>
<p>메서드 이름 add: 메서드 이름을 정의한 것으로, 더한다는 의미의 add로 지정
메서드이름은 뜻이 있는 단어로 지정하는것이 좋다.</p>
<p>매개변수 타입 int: 매개변수의 타입은 정수형으로 정수로 된 숫자를 입력받는다.</p>
<p>매개변수 이름 num1, num2: 매개변수의 이름을 정의한 것으로 숫자의 의미를 갖는 num 지정한다.</p>
<h3 id="메서드-호출">메서드 호출</h3>
<p>메서드는 정의하는 것만으로 실행되지 않는다
메서드를 정의하는 것은 단순히 동작에 대한 처리 과정을 기술한 것이다.</p>
<pre><code>/*
메서드이름(값1, 값2, ...)
*/

method(value1, value2, ...)
</code></pre><pre><code>add(5,10);</code></pre><p>메서드 add의 매개변수는 2개로 지정해 작성했기에 호출할 때에도 2개의 값을 지정해주어야 한다.
5와 10을 넣음으로써 num1=5, num2=10이라는 정수 값이 임시적으로 저장된 후 5+10 연산이 수행되 반환 값 15인 데이터를 리턴한다.</p>
<h2 id="메인-메서드">메인 메서드</h2>
<p>처음 메서드를 소개할 때 나타내는 코드를 메인 메서드라 한다</p>
<pre><code>public static void main(String[] args) {
}</code></pre><ul>
<li>void: 반환 타입으로 메인 메서드는 반환을 하지 않는다</li>
<li>main: 메서드의 이름이 main이다</li>
<li>String[]: 매개변수의 타입이 String[] 타입이다</li>
<li>args: args 이름의 매개변수이다.</li>
</ul>
<p>메인 메서드는 자바로 작성한 소스 코드 파일을 실행하면 가장 먼저 실행되는 메서드이며
자바로 만들어진 애플리케이션이나 프로그램을 실행하면 main 메서드의 코드부터 호출되어 기능을 동작하는 것이다
이를 진입점 함수라하고
자바의 메인 메서드는 진입점 함수로 자바로 프로그래밍할 때 반드시 메인 메서드가 필요하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코테 - 가운데 글자 가져오기]]></title>
            <link>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EA%B0%80%EC%9A%B4%EB%8D%B0-%EA%B8%80%EC%9E%90-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EA%B0%80%EC%9A%B4%EB%8D%B0-%EA%B8%80%EC%9E%90-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Sat, 25 Nov 2023 10:11:51 GMT</pubDate>
            <description><![CDATA[<p>문제 설명
단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.</p>
<p>재한사항
s는 길이가 1 이상, 100이하인 스트링입니다.</p>
<p><img src="https://velog.velcdn.com/images/minthug94_/post/ccdb9ec3-3d81-49fa-ae60-f45d1af9b32b/image.png" alt=""></p>
<p>풀이</p>
<pre><code class="language-java">class Solution {
    public String solution(String s) {
        String answer = &quot;&quot;;
        int num = s.length() / 2;

        if(s.length() % 2 == 0) {
            answer += s.chatAt(num);
            answer += s.chatAt(num -1);
        } else if(s.length() % 2 != 0) {
            answer += s.charAt(num);
        }
        return answer;
    }
}</code></pre>
<pre><code class="language-java">class Solution {
    public String solution(String s) {
        String answer = &quot;&quot;;
        int length = s.length();

        if(length % 2 == 0) { // 짝수일때 qwer -&gt; 시작 인덱스 e -1, 마지막 인덱스 r
            answer = s.substring((length/2)-1, (length/2)+1);
        } else {
            answer = s.substring((length/2), (length/2)+1);
        }
        return answer;
    }
}</code></pre>
<p>substring() 활용</p>
<pre><code>String.substring(시작 인덱스);
String.substring(시작인덱스, 마지막 인덱스);

//ex
String str = &quot;0123456&quot;;

str.substring(3);
//3456

str.substring(3,5);
//34</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[코테 - 제일 작은 수 제거하기]]></title>
            <link>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EC%A0%9C%EC%9D%BC-%EC%9E%91%EC%9D%80-%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EC%A0%9C%EC%9D%BC-%EC%9E%91%EC%9D%80-%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 25 Nov 2023 09:31:05 GMT</pubDate>
            <description><![CDATA[<p>문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.</p>
<p>제한 조건
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.</p>
<p><img src="https://velog.velcdn.com/images/minthug94_/post/ab20f4d6-3dfe-416a-a779-4ae1a7c0550f/image.png" alt=""></p>
<pre><code class="language-java">class Solution {
    public int[] solution(int[] arr) {
        int[] answer = {};

     if(arr.length == 1) {
            int[] answer = {-1};
            return answer;   // 길이가 1일 경우 answer -1 저장
        }

        int[] anwer = new int[arr.length -1]; //b

        int min = arr[0];  // c

        for(int i = 0; i &lt; arr.length; i++) {
            min = Math.min(min, arr[i]);
        }

        int index = 0;

        for(int i = 0; i &lt; arr.length; i++) {
            if(arr[i] == min) {
                continue;
            }
            answer[index++] = arr[i];
        }

        return answer;
    }
}</code></pre>
<p>동작하지 않는다.
알고보니 int[] answer = {}; 때문에 선언이 두번되기 때문에 에러 발생
그치만 솔직히 이해가 너무 어려운 코드라고 생각이 든다.</p>
<p>다른 사람 풀이</p>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
class Solution {
  public int[] solution(int[] arr) {
      if (arr.length &lt;= 1) {
            arr[0] = -1;
            return arr;
        } else {
            ArrayList&lt;Integer&gt; arrayList = new ArrayList&lt;Integer&gt;();
            for (int a : arr) {
                arrayList.add(a);
            }
            Integer minimum = Collections.min(arrayList);
            arrayList.remove(minimum);
            int[] resultArray = new int[arr.length - 1];
            for (int i = 0; i &lt; arrayList.size(); ++i) {
                resultArray[i] = arrayList.get(i);
            }
            return resultArray;
        }
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[코테 - 나누어 떨어지는 숫자 배열]]></title>
            <link>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Sat, 25 Nov 2023 08:50:44 GMT</pubDate>
            <description><![CDATA[<p>문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.</p>
<p>[제한사항]
arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.</p>
<p><img src="https://velog.velcdn.com/images/minthug94_/post/455121ee-0bb6-4015-b7d6-0b4472e6be30/image.png" alt=""></p>
<p>입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.</p>
<p>입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.</p>
<p>입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.</p>
<p>풀이</p>
<pre><code class="language-java">import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = {};
        ArrayList&lt;Integer&gt; a1 = new ArrayList&lt;Integer&gt;();

        for(int i = 0; i &lt; arr.length; i++) {
            if(arr[i] % divisor == 0) {
                a1.add(arr[i]);
            } else {
                a1.add(-1);
            }
        }
            answer = new int[a1.size()];

        for(int i = 0; i &lt; a1.size(); i++) {
            answer[i] = a1.get(i);
        }

        Arrays.sort(answer);
        return answer;
    }
}</code></pre>
<p>두개가 계속 실패하는데 배열의 수만큼 답이 실행되고있다 3번 예제에서 그렇듯 나누어 떨어지지 않으면 -1만 도출해야하는데 그 문제와 나누어 떨어지지 않는 수를 배제하고 떨어지는 수만 결과값에 나와야하는데 전부 나오는 코드가 되었다.</p>
<pre><code class="language-java">import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = {};
        ArrayList&lt;Integer&gt; a1 = new ArrayList&lt;Integer&gt;();

        for(int i = 0; i &lt; arr.length; i++) {
            if(arr[i] % divisor == 0) {
                a1.add(arr[i]);
            }
        }
        if(a1.size() == 0) {
            a1.add(-1);
        }

        answer = new int[a1.size()];

        for(int i = 0; i &lt; a1.size(); i++) {
            answer[i] = a1.get(i);
        }

        Arrays.sort(answer);

        return answer;
    }
}</code></pre>
<p>중간엘 else문에서 문제가 생겨서 예상치 못한 값이 나온거같다 
이렇게 수정해서 하면 원하는 결과값이 나온다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코테 - 핸드폰 번호 가리기]]></title>
            <link>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%ED%95%B8%EB%93%9C%ED%8F%B0-%EB%B2%88%ED%98%B8-%EA%B0%80%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%ED%95%B8%EB%93%9C%ED%8F%B0-%EB%B2%88%ED%98%B8-%EA%B0%80%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Fri, 24 Nov 2023 11:36:07 GMT</pubDate>
            <description><![CDATA[<p>문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.</p>
<p>[제한 조건]
phone_number는 길이 4 이상, 20이하인 문자열입니다.</p>
<p><img src="https://velog.velcdn.com/images/minthug94_/post/4db5b7e0-07b4-4b0a-b150-8ee7a2a57461/image.png" alt=""></p>
<p>풀이</p>
<pre><code>class Solution {
    public String solution(String phone_number) {
        String answer = &quot;&quot;;

        for(int i = 0; i &lt; phone_number.length(); i++) {
            if(i &lt; phone_number.length() - 4 ) {
                answer += &quot;*&quot;;
            } else
                answer += phone_number.charAt(i);

        }
        return answer;
    }
}</code></pre><p>for 문을 이용해 phone_number의 길이만큼 반복한 후
if문을 이용해 i가 phone_number의 길이에서 -4를 뺀 수보다 작을때까지 한 후
answer변수에 * 를 넣어준다
위 조건(phone_number 11자리)이 아니면 .chatAt() 메서드를 통해 문자를 하나씩 순서대로 넣어준다.</p>
<p>chatAt() 메서드는
String 타입으로 받은 문자열을 char 타입으로 한글자만 받는 함수이다
주로 Scanner와 같이 응용해 사용 된다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코테 - 없는 숫자 더하기]]></title>
            <link>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EC%97%86%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@minthug94_/%EC%BD%94%ED%85%8C-%EC%97%86%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 24 Nov 2023 11:26:12 GMT</pubDate>
            <description><![CDATA[<p>문제 설명
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.</p>
<p>[제한사항]
1 ≤ numbers의 길이 ≤ 9
0 ≤ numbers의 모든 원소 ≤ 9
numbers의 모든 원소는 서로 다릅니다.</p>
<p><img src="https://velog.velcdn.com/images/minthug94_/post/e6809379-5722-4546-af60-29c53770c744/image.png" alt=""></p>
<p>입출력 예 #1</p>
<p>5, 9가 numbers에 없으므로, 5 + 9 = 14를 return 해야 합니다.
입출력 예 #2</p>
<p>1, 2, 3이 numbers에 없으므로, 1 + 2 + 3 = 6을 return 해야 합니다.</p>
<p>풀이</p>
<pre><code class="language-java">class Solution {
    public int solution(int[] numbers) {
        int answer = 45;

        for(int n : numbers) {
            answer -= n;
        }

        return answer;
    }
}</code></pre>
<p>다른 사람 풀이</p>
<pre><code>class Solution {
    public int solution(int[] numbers) {
        int answer = 45;

        for(int n : numbers) {
            answer -= n;
        }

        return answer;
    }
}</code></pre><pre><code>import java.util.Arrays;
import java.util.stream.IntStream;

class Solution {
    public int solution(int[] numbers) {
            return IntStream.range(0, 10).filter(i -&gt; Arrays.stream(numbers).noneMatch(num -&gt; i == num)).sum();
        }
}
</code></pre>]]></description>
        </item>
    </channel>
</rss>