<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hi_nahyun.log</title>
        <link>https://velog.io/</link>
        <description>관심O 댓글O 감놔라배놔라O 가르쳐주는거O 한가할때올립니다</description>
        <lastBuildDate>Wed, 21 Feb 2024 09:13:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hi_nahyun.log</title>
            <url>https://velog.velcdn.com/images/hi_nahyun/profile/688481af-dfc1-44b3-b87d-f459261e9652/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hi_nahyun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hi_nahyun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[OOP] 객체지향 설계]]></title>
            <link>https://velog.io/@hi_nahyun/OOP-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84</link>
            <guid>https://velog.io/@hi_nahyun/OOP-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84</guid>
            <pubDate>Wed, 21 Feb 2024 09:13:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ul>
<li>객체지향 언어란 ?</li>
<li>사물이나 개념처럼 독립되고 구분되는 각각의 객체</li>
</ul>
</blockquote>
<ul>
<li><p>클래스</p>
</li>
<li><p>객체의 특성에 대한 정의를 한 것으로 캡슐화를 통해 기능을 포함한 개념,
사물이나 개념의 공통 요소를 추상화(abstraction)하여 정의함.</p>
</li>
<li><p>추상화</p>
</li>
<li><p>유연성을 확보하기 위해 구체적인 것은 제거한다는 의미.
프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정</p>
</li>
<li><p>캡슐화</p>
</li>
<li><p>추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법을 말한다.
클래스의 가장 중요한 목적인 데이터의 접근제한을 원칙으로 하여 클래스 외부에서 데이터의 직접 접근을 막고, 대신 데이터를 처리하는 함수들을 클래스 내부에 작성하는 방법을 캡슐화라고 한다.</p>
</li>
<li><p>상속</p>
</li>
<li><p>자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말한다. 기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 &#39;오버라이딩(overriding)&#39;이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해 준다.</p>
</li>
<li><p>다형성</p>
</li>
<li><p>하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다.</p>
</li>
</ul>
<blockquote>
<p>다형성의 실세계 비유
역할과 구현으로 세상을 구분하는게 좋다.
<strong>( 역할 : 인터페이스 / 구현 : 인터페이스를 구현한 클래스, 구현 객체)</strong></p>
</blockquote>
<p>예제) 
운전자의 역할과 자동차의 역할이 있다.
자동차는 K3, 아반떼, 테슬라모델3도 될 수 있다.
구현만 바뀌었기때문이다.
자동차가 바뀌어도 운전자에게 영향을 주지 않는다!
자동차를 새로 바꾼다고 면허를 새로 따야 되는건 아니기 때문이다.
유연하고 변경이 용이하다는 말은 이 말이다.
클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 있다.</p>
<p>예제) 
로미오와 줄리엣 공연, 로미오와 줄리엣 역할이 있다.
로미오 역할엔 장동건, 원빈이여도 상관이없고 
줄리엣 역할엔 김태희, 송혜교가 해도 상관이 없다.
로미오는 줄리엣역할이 누구인지 상관이 없다.
줄리엣도 로미오가 누구인지 상관이 없다.
유연하고 변경이 용이하다는 말이 이 말이다.</p>
<blockquote>
<p><strong>역할과 구현으로 구분하면 세상이 단순해지고 유연해지며 변경이 편리해진다.</strong></p>
</blockquote>
<ul>
<li>클라이언트는 대상의 역할(인터페이스)만 알면 된다.</li>
<li>클라이언트는 구현 대상의 내부구조를 물라도 된다.</li>
<li>클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.</li>
<li>클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.</li>
</ul>
<p>**다형성의 본질</p>
<blockquote>
<p>클라이언트를 변경하지않고 서버의 구현기능을 유연하게 변경할 수 있다.**</p>
</blockquote>
<hr>
<blockquote>
<p>SOLID
클린코드로 유명한 로버트 마틴이 좋은 객체지향의 설계 5가지를 정리</p>
</blockquote>
<ul>
<li><p>단일 책임 원칙(Single Responsiblity Principle; SRP)</p>
</li>
<li><p>소프트웨어의 컴포넌트는 단 하나의 책임만을 가져야 한다.</p>
</li>
<li><p>중요한 기준은 변경이다. 변경이 있을 때 파급효과가 적으면 단일 책임 원칙을 잘 따른것이다.</p>
</li>
<li><p>개방 폐쇄 원칙(Open Close Principles; OCP)</p>
</li>
<li><p>확장에 대해선 열려 있어야 하고 수정에 대해선 닫혀 있어야 한다.</p>
</li>
<li><p>기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 해야 한다.</p>
</li>
<li><p>리츠코프 치환 원칙(Liskov Substitution Principle; LSP))</p>
</li>
<li><p>자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.</p>
</li>
</ul>
<ul>
<li><p>인터페이스 분리의 원칙(Interface Segregation Principle; ISP)</p>
</li>
<li><p>자신이 사용하지 않는 메서드는 구현하지 않도록 해야 한다.
이런 경우 인터페이스는 쪼개져야 한다.</p>
</li>
<li><p>하나의 일반적인 인터페이스 보단 여러 개의 구체적인 인터페이스가 낫다.</p>
</li>
<li><p>의존관계 역전 원칙(Dependency Inversion Principle; DIP)</p>
</li>
<li><p>의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다.</p>
</li>
<li><p>고차원의 모듈은 저차원의 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존 해야 한다.</p>
</li>
<li><p>DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTTP] Cache, Cookie]]></title>
            <link>https://velog.io/@hi_nahyun/HTTP-Cache-Cookie</link>
            <guid>https://velog.io/@hi_nahyun/HTTP-Cache-Cookie</guid>
            <pubDate>Wed, 21 Feb 2024 08:55:37 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>Cache란?
자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 아래와 같은 저장공간 계층 구조에서 확인할 수 있듯이, 캐시는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다. </p>
</li>
<li><p>Cookie란?
웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송합니다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTTP] GET, POST]]></title>
            <link>https://velog.io/@hi_nahyun/HTTP-GET-POST</link>
            <guid>https://velog.io/@hi_nahyun/HTTP-GET-POST</guid>
            <pubDate>Wed, 21 Feb 2024 08:48:10 GMT</pubDate>
            <description><![CDATA[<p>클라이언트가 서버로 요청을 보내는 방법엔 크게 두가지가있는데, GET방식과 POST방식이 있다.</p>
<ol>
<li>GET</li>
</ol>
<p>-어떠한 정보를 가져와서 조회하기위해 사용.</p>
<p>-특징</p>
<ul>
<li>URL에 변수를 포함시켜 요청한다.</li>
<li>데이터를 헤더에 포함하여 전송한다.</li>
<li>URL에 데이터가 노출되어 보안에 취약하다.</li>
<li>길이 제한이 있다.</li>
<li>캐싱이 가능.</li>
</ul>
<ol start="2">
<li>POST</li>
</ol>
<p>-추가 또는 수정 하기 위해서 사용하는 방식.</p>
<p>-특징</p>
<ul>
<li>URL에 변수를 노출하지 않고 요청한다.</li>
<li>데이터를 Body에 포함한다.</li>
<li>URL에 데이터가 노출되지 않아 기본 보안이 되어있다.</li>
<li>길이에 제한이 없다.</li>
<li>캐싱 할 수 없다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] git이란?]]></title>
            <link>https://velog.io/@hi_nahyun/git-git%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@hi_nahyun/git-git%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Wed, 21 Feb 2024 08:22:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Git - 버전 관리 시스템의 일종으로 형상관리 도구이다.</p>
</blockquote>
<p>중앙서버에서 소스코드와 히스토리를 모두 관리하는 SVN과는 달리 여러 개발 PC와 저장소에서 분산해서 저장한다. 그렇기 때문에 훨씬 빠르고 병렬 개발이 가능하다.
인터넷이 없는 상태에서도 개발을 진행 할 수 있고, 중앙장소가 날라가 버려도 원상복구 할 수 있다.</p>
<ul>
<li>깃 관련 용어
 - Repository : 저장소를 의미하며, 저장소는 히스토리, 태그, 소스의 가지치기 혹은 branch에 따라 버전을 저장한다. 저장소를 통해 작업자가 변경한 모든 히스토리를 확인 할 수 있다. </li>
<li> Working Tree : 저장소를 어느 한 시점을 바라보는 작업자의 현재 시점.</li>
<li> Staging Area : 저장소에 커밋하기 전에 커밋을 준비하는 위치.</li>
<li> Commit : 현재 변경된 작업 상태를 점검을 마치면 확정하고 저장소에 저장하는 작업.</li>
<li> Head : 현재 작업중인 Branch를 가리킨다.</li>
<li> Branch : 가지 또는 분기점을 의미하며, 작업을 할때에 현재 상태를 복사하여 Branch에서 작업을 한 후에 완전하다 싶을때 Merge를 하여 작업을 한다.</li>
<li> Merge : 다른 Branch의 내용을 현재 Branch로 가져와 합치는 작업을 의미한다.</li>
</ul>
<p>Github - 깃(Git)을 사용하는 프로젝트를 지원하는 웹 호스팅 서비스</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] Static의 의미와 장단점]]></title>
            <link>https://velog.io/@hi_nahyun/JAVA-Static%EC%9D%98-%EC%9D%98%EB%AF%B8%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90</link>
            <guid>https://velog.io/@hi_nahyun/JAVA-Static%EC%9D%98-%EC%9D%98%EB%AF%B8%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90</guid>
            <pubDate>Thu, 15 Feb 2024 05:45:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>자바 static이란?</li>
</ol>
</blockquote>
<p>-&gt;자바에서 static은 &#39;고정된&#39; 뜻으로, 정적이라고도 부른다. <strong>클래스 레벨</strong>에서 사용되며 해당 멤버 또는 메서드가 인스턴스에 <strong>종속되지 않고 클래스 자체에 속하도록 지정</strong>하는 역할을 한다.</p>
<ul>
<li><p><strong>정적 변수 (Static Variables)</strong>:
_static 키워드로 선언된 변수는 클래스의 모든 인스턴스에 공유_됩니다. 즉, 모든 인스턴스가 동일한 변수 값을 공유하게 됩니다.
정적 변수는 클래스 이름으로 직접 접근하며, 객체의 생성 없이 사용할 수 있습니다.</p>
</li>
<li><p><strong>정적 메서드 (Static Methods)</strong>:
static 키워드로 선언된 메서드는 클래스 수준에서 동작하며, 특정 인스턴스에 종속되지 않습니다.
정적 메서드는 클래스 이름으로 직접 호출할 수 있으며, 객체의 생성 없이 사용할 수 있습니다.
주로 유틸리티 메서드나 프로그램의 전역적인 동작을 구현하는 데 사용됩니다.</p>
</li>
<li><p><strong>정적 블록 (Static Blocks)</strong>:
static 블록은 클래스가 로딩될 때 실행되는 블록으로, 클래스 초기화에 사용됩니다.
정적 블록은 클래스의 정적 변수를 초기화하거나, 초기화된 값을 가지고 다양한 설정 작업을 수행하는 데 활용됩니다.</p>
</li>
</ul>
<blockquote>
<ol start="2">
<li>static의 장/단점</li>
</ol>
</blockquote>
<ul>
<li><strong>static 사용의 장점</strong>
  1. 메모리를 <em>효율적_으로 사용이 가능하다.
 -&gt; 생성할 때 마다 인스턴스가 힙에 올라가는 것이 아닌 고정 메모리 이므로 보다 효율적이다.
  2. _속도가 빠르다</em>.
 -&gt; 객체를 생성하지 않고 사용하기 때문에 속도가 빠르다는 이점이 있다.
 </li>
<li><strong>static 사용의 단점</strong>
  1. 무분별한 static의 사용은 <em>메모리 유수(Leak)_의 원인이 된다.
 -&gt; 프로그램 종료 시점에 메모리를 반환하는 속성이 있어
    GC(Garbage collection) 대상이 아니기 때문이다.
  2. _재 사용성이 떨어진다.</em>
 -&gt; 정적인 값이기때문에 interface를 구현하는데 사용될 수 없다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 자바의 컴파일 과정]]></title>
            <link>https://velog.io/@hi_nahyun/JAVA-%EC%9E%90%EB%B0%94%EC%9D%98-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EA%B3%BC%EC%A0%95</link>
            <guid>https://velog.io/@hi_nahyun/JAVA-%EC%9E%90%EB%B0%94%EC%9D%98-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EA%B3%BC%EC%A0%95</guid>
            <pubDate>Thu, 15 Feb 2024 05:30:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/cdb53b4b-c78a-4353-9190-e0a0d09c2246/image.png" alt=""></p>
<ol>
<li>개발자가 자바코드를 작성한다.<pre><code>     ↓</code></pre></li>
<li>자바 컴파일러(Java Complier)가 자바 소스파일을 컴파일 한다.
이때 나오는 파일은 자바 바이트 코드(.class)파일이다.<pre><code>     ↓</code></pre></li>
<li>컴파일 된 바이트코드를 JVM의 클래스로더(Class Loader)에 전달한다.<pre><code>     ↓</code></pre></li>
<li>클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터영역(Runtime Data area), 즉 JVM 메모리에 올린다.<pre><code>     ↓</code></pre></li>
<li>실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다.</li>
</ol>
<p>출처 : <a href="https://steady-snail.tistory.com/67">https://steady-snail.tistory.com/67</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[면접준비] 내가 필요해서 쓰는 초보개발자의 면접시 필요한 질문 준비.]]></title>
            <link>https://velog.io/@hi_nahyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%84-%EB%82%B4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%B4%EC%84%9C-%EC%93%B0%EB%8A%94-%EC%B4%88%EB%B3%B4%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%A9%B4%EC%A0%91%EC%8B%9C-%ED%95%84%EC%9A%94%ED%95%9C-%EC%A7%88%EB%AC%B8-%EC%A4%80%EB%B9%84</link>
            <guid>https://velog.io/@hi_nahyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%84-%EB%82%B4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%B4%EC%84%9C-%EC%93%B0%EB%8A%94-%EC%B4%88%EB%B3%B4%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%A9%B4%EC%A0%91%EC%8B%9C-%ED%95%84%EC%9A%94%ED%95%9C-%EC%A7%88%EB%AC%B8-%EC%A4%80%EB%B9%84</guid>
            <pubDate>Thu, 15 Feb 2024 05:21:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/4ebf232f-f61f-45b4-8976-8e7f15e9d15d/image.png" alt=""></p>
<h1 id="1">1.</h1>
<p>Java 컴파일 과정
Static의 의미, 장단점
OOP (객체지향 프로그래밍)의 개념
OOP의 4가지 특징 (추상화/캡슐화/상속/다형성) 
-&gt;오버로딩, 오버라이딩 질문이 가장 많았음
OOD (객체지향 설계)의 5원칙 SOLID
Java 8버전의 특징
접근 제어자 4가지 종류
GC(가비지 컬랙션) 설명
SPRING</p>
<h1 id="2">2.</h1>
<p>Spring의 특징
Spring의 구동원리
DispatcherServlet의 역할
IOC(제어의 역전) 설명, 장단점
DI(의존성 주입) 설명, 장단점
AOP(관점지향 프로그래밍) 설명, 장단점
Spring과 Spring boot의 차이점
Spring에서 사용해 본 어노테이션은?
Spring Cloud 설명
Spring Security 설명
Spring MVC 패턴 설명
DATABASE</p>
<h1 id="3">3.</h1>
<p>트랜잭션의 의미
트랜잭션의 4가지 특성 ACID
Index 설명
NoSql과 RDB의 차이점
NETWORK
브라우저에 URL을 입력했을 때 서버로 전달되는 과정
HTTP와 HTTPS 프로토콜 차이점</p>
<h1 id="4">4.</h1>
<p>REST API Method의 특징
API 설계 해보세요. (손코딩)
쿠키와 세션의 차이점
웹서버와 WAS의 차이점
Git과 SVN의 차이점
프레임워크와 라이브러리의 차이점
Java 외에 써 본 언어가 있나요?</p>
<h1 id="5">5.</h1>
<p>Git, Sourcestree에 대해서 설명
유지보수를 하게 되면서 어떤 것 들을 알게 되었나요?
Java 기초 라고 했는데 무엇을 알게 되었나요?
DB 기초 라고 했는데 무엇을 알게 되었나요?
GET과 POST의 차이
캐시 / 헤더
객체지향 설계가 무엇일까요 ?
group by having~
어노테이션에 대해서 설명
MVC 에 대해설명
JDBC 에 대해서 설명
JPA에 대해서 설명</p>
<h1 id="6">6.</h1>
<ul>
<li>만약 당장 혼자서 하는 프로젝트가 주어진다면 어떤식으로 진행할꺼에요 ?</li>
<li>사수도 없는 상황에서 파악되지 않는 에러가 발생되면 어떻게 접근할꺼에요 ?</li>
<li>주도적으로 프로젝트한거에대해 설명, 그리고 어떤 </li>
<li>얕게 많이 개발하는게 좋은지 집중해서 하나만 개발하는거를 원하는지</li>
<li>5년뒤 나의 개발모습 또는 희망하는 모습</li>
<li>전직장을 그만두고 개발자를 선택한 이유</li>
<li>다른회사 면접 봤을때랑 지금이랑 비교했을때 다른부분</li>
<li>어느정도 개발을 할 수 있을때 만들어보고 싶은 서비스나 사이트</li>
<li>연봉 얼마정도 생각하는지</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 기초 DAY02]]></title>
            <link>https://velog.io/@hi_nahyun/SQL-%EA%B8%B0%EC%B4%88-DAY02</link>
            <guid>https://velog.io/@hi_nahyun/SQL-%EA%B8%B0%EC%B4%88-DAY02</guid>
            <pubDate>Tue, 10 Oct 2023 08:25:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ul>
<li>select : 조회용 sql
데이터베이스에서 실행하고자 하는 명령의 종류.</li>
</ul>
</blockquote>
<blockquote>
<p>@ CRUD : 데이터 기본사항 처리 로직</p>
</blockquote>
<ol>
<li>CREATE : 데이터 추가 / INSERT - DML</li>
<li>READ   : 데이터 조회 / SELECT</li>
<li>UPDATE : 데이터 수정 / UPDATE</li>
<li>DELETE : 데이터 삭제 / DELETE</li>
</ol>
<blockquote>
</blockquote>
<ul>
<li>연산자
비교 연산자
&lt;, &gt;, &lt;=, &gt;= : 크기를 비교하는 부등호
= : 같다
!=, &lt;&gt; : 같지않다</li>
</ul>
<ul>
<li><p>EMPLOYEE 테이블에서 부서코드가 &#39;D9&#39;이 아닌 직원들의 모든 정보 조회
SELECT *
from EMPLOYEE
where DEPT_CODE &lt;&gt; &#39;D9&#39;;</p>
<ul>
<li>EMPLOYEE 테이블에서 급여가 350이상 550이하인 직원의 사번, 사원명,부서코드, 직급코드, 급여</li>
</ul>
</li>
</ul>
<p>SELECT 
     EMP_ID as 사번
    ,EMP_NAME as 사원명
    ,DEPT_CODE as 부서코드
    ,JOB_CODE as 직급코드
    ,SALARY as 급여
from EMPLOYEE
where SALARY &gt;=3500000 and SALARY &lt;=5500000;</p>
<p>-- BETWEEN A AND B 사용
SELECT 
     EMP_ID as 사번
    ,EMP_NAME as 사원명
    ,DEPT_CODE as 부서코드
    ,JOB_CODE as 직급코드
    ,SALARY as 급여
from EMPLOYEE
where SALARY BETWEEN 3500000 and 5500000;
where SALARY NOT BETWEEN 3500000 and 5500000; -- 두 조건을 제외한 경우</p>
<blockquote>
<p>LIKE : 입력한 숫자, 문자가 포함된 정보를 조회할 때 사용하는 연산자.
&#39;_&#39; : 임의의 한 문자
&#39;%&#39; : 몇자리 문자든 관계없이</p>
</blockquote>
<ul>
<li>EMPLOYEE테이블에서 사원이름 가운데 &#39;중&#39;이 들어가는 사원정보 조회</li>
</ul>
<p>SELECT *
from EMPLOYEE
where EMP_NAME LIKE &#39;<em>중</em>&#39;;</p>
<ul>
<li>EMPLOYEE테이블에서 주민번호를 기준으로 여성인 사원의 정보 조회(주민번호에 2)</li>
</ul>
<p>SELECT *
from EMPLOYEE
where EMP_NO LIKE &#39;%-2%&#39;;</p>
<ul>
<li>실습1
사원 중 이메일 아이디가 5글자 초과하는 사원의 사원명,사번,이메일 정보 조회</li>
</ul>
<p>SELECT 
     EMP_NAME as 사원명
    ,EMP_ID as 사번
    ,EMAIL as 이메일
FROM EMPLOYEE 
where email like &#39;<strong>__</strong>%@%&#39;;</p>
<ul>
<li>사원 중 이메일4번째자리가 <em>인 사원정보조회
ESCAPE문자를 선언하여 그 뒤에 오는 문자를 특수문자가 아닌 일반문자로 선언하여 사용.
SELECT *
FROM EMPLOYEE
where email like &#39;____#</em>%@%&#39; ESCAPE &#39;#&#39;; -- !, #등 다른문자도 상관없음.</li>
</ul>
<blockquote>
<p>in( 연산자)
in(값1, 값2, 값3....)
안에 있는 값 중 하나라도 일치하는 경우 해당하는 값을 조회한다.</p>
</blockquote>
<ul>
<li>부서코드가 D1이거나 D6인 직원정보조회 DEPT_CODE = &#39;D1&#39; or DEPT_CODE = &#39;D6&#39;</li>
</ul>
<p>SELECT *
FROM EMPLOYEE
where DEPT_CODE in (&#39;D1&#39;, &#39;D6&#39;);</p>
<ul>
<li>부서코드가 D1이거나 D6이 아닌 직원정보조회</li>
</ul>
<p>SELECT *
FROM EMPLOYEE
where DEPT_CODE not in (&#39;D1&#39;, &#39;D6&#39;);</p>
<blockquote>
<p>[함수(funtion)]</p>
</blockquote>
<blockquote>
<p>문자관련 함수
LENGTH / CHAR_LENGTH : 문자열의 길이를 계산하는 함수
LENGTH : BYTE의 길이(영어1, 한글3)
CHAR_LENGTH : 글자 수</p>
</blockquote>
<p>SELECT LENGTH (&#39;Hello&#39;), CHAR_LENGTH(&#39;hello&#39;) ;
-- from절 생략. 테이블에서 가져오는 값이 아닌 직접 입력해주는 값이기 떄문에</p>
<blockquote>
<p>INSTR() : 주어진 값에서 원하는 문자가 몇번쨰 인지 찾아 반환</p>
</blockquote>
<p>select instr(&#39;ABCDE&#39;, &#39;A&#39;);
SELECT instr(&#39;ABCDE&#39;, &#39;F&#39;);</p>
<blockquote>
<p>SUBSTR(컬럼명|값, 시작순번[,가져올개수]) : 주어진 문자열에서 특정 부분만 꺼내오는 함수</p>
</blockquote>
<ul>
<li>실습2. EMPLOYEE 테이블에서 사원들의 이름, 이메일을 조회하되 이메일은 아이디부분 </li>
</ul>
<p>SELECT EMP_NAME, SUBSTR(EMAIL ,1, INSTR(EMAIL, &#39;@&#39;)-1) 
from EMPLOYEE;</p>
<blockquote>
<p>LPAD / RPAD - 빈칸을 지정한 문자로 채우는 함수</p>
</blockquote>
<p>SELECT
    LPAD(EMAIL, 20, &quot;#&quot;),
    RPAD(EMAIL, 20, &quot;-&quot;)<br>from EMPLOYEE;</p>
<blockquote>
<p>LTRIM : 좌측 공백만 지워줌. / RTRIM : 우측 공백만 지워줌.
현재 부여된 컬럼이나, 값으로 부터 공백만 찾아 지워주는 함수</p>
</blockquote>
<p>SELECT LTRIM(&#39;      He llo   &#39;); -- 우측 공백은 지워지지않음. / 가운데 공백은 제외 
select RTRIM(&#39;   Hel lo      &#39;); -- 좌측 공백은 지워지지않음. / 가운데 공백은 제외</p>
<blockquote>
<p>TRIM : 주어진 칼럼이나 값을 양끝 기준으로 특정문자를 지워주는 함수</p>
</blockquote>
<p>SELECT TRIM(&#39;    Hello    &#39;); -- 좌우 공백이 지워짐.</p>
<p>-- 양 끝의 특정 값을 지우고자 할 떄 
SELECT TRIM(&#39;0&#39; FROM &#39;000Hello00000&#39;); -- 양쪽 0이 모두 사라짐</p>
<blockquote>
<p>LOWER / UPPER 주어진 문자를 소문자, 대문자 형식으로 변경</p>
</blockquote>
<p>SELECT LOWER(&#39;AbcD&#39;), UPPER(&#39;AbcD&#39;); </p>
<blockquote>
<p>CONCAT : 여러 문자열을 하나의 문자열로 합치는 함수</p>
</blockquote>
<p>SELECT CONCAT (&quot;mysql&quot;, &quot;재밋어요&quot;);</p>
<p>SELECT CONCAT(RPAD(SUBSTR(EMP_NAME,1,1),3,&#39;*&#39;),&#39;님&#39;)
from EMPLOYEE;</p>
<blockquote>
<p>REPLACE() : 주어진 문자열에서 특정 문자를 변경할 때 사용하는 함수
SELECT REPLACE (&#39;HELLO WORLD&#39;, &#39;HELLO&#39;, &#39;BYE&#39;);</p>
</blockquote>
<ul>
<li>실습3
EMPLOYEE 테이블에서 사원의 주민번호를 확인하여 생년, 생월, 생일을 각각 조회
예시 : 이름 | 생년 | 생월 | 생일 / 홍길동 00년 00월 00일</li>
</ul>
<p>SELECT<br>     EMP_NAME as 이름
    ,CONCAT(SUBSTR(EMP_NO,1,2),&quot;년&quot;) as 생년
    ,CONCAT(SUBSTR(EMP_NO,3,2),&quot;월&quot;) as 생월
    ,CONCAT(SUBSTR(EMP_NO,5,2),&quot;일&quot;) as 생일
from EMPLOYEE </p>
<p>SELECT *
from EMPLOYEE e </p>
<ul>
<li>실습4 
EMPOYEE 테이블에서 사원의 사번, 사원명, 이메일, 주민번호를 조회
이 때, 이메일은 &#39;@&#39;전까지, 주민번호는 7짜리 이후는 &#39;*&#39; 처리</li>
</ul>
<p>SELECT 
     EMP_ID as 사번
    ,EMP_NAME as 사원명
    ,SUBSTR(EMAIL ,1, INSTR(EMAIL, &#39;@&#39;)-1) as 이메일
    ,CONCAT(SUBSTR(EMP_NO, 1, 7),&#39;<strong>***</strong>&#39;) as 주민번호
from EMPLOYEE;</p>
<ul>
<li>실습5
EMPLOYEE 테이블에서 현재 근무하는 여성의 사번,사원명,직급코드 조회.</li>
<li>*ENT_YN : 현재 근무여부 / where에 함수 사용 가능.</li>
</ul>
<p>SELECT 
     EMP_ID as 사번
    ,EMP_NAME as 사원명
    ,DEPT_CODE as 직급코드
from EMPLOYEE
where SUBSTR(EMP_NO,8,1) = &#39;2&#39;
and ENT_YN = &#39;Y&#39;;</p>
<blockquote>
<p> 다중 행 함수(Multiple Row Function)
조건절에 만족하는 모든 행을 다 찾고나서 모든 로우를 한번에 연산.
그룹 함수(Group Function)
SUM(), AVG(), MAX(), MIN(), COUNT()</p>
</blockquote>
<blockquote>
<p>날짜 처리 함수
SYSDATE(), NOW() : 현재 컴퓨터의 날짜 반환</p>
</blockquote>
<blockquote>
<p>SELECT SYSDATE(); -- 실제동작시점
SELECT NOW(); -- 쿼리실행시점</p>
</blockquote>
<blockquote>
<p>두 날짜 사이의 차
DATEDIFF : 단순 일 차이
TIMESTAMPDIFF : 연, 분기, 월 주, 일 시, 분 초를 지정하여 차이</p>
</blockquote>
<p>SELECT 
     HIRE_DATE AS &quot;입사일&quot;
    ,DATEDIFF(NOW(),HIRE_DATE) &quot;입사 후 일 수&quot;
FROM EMPLOYEE;</p>
<p>SELECT 
     HIRE_DATE &quot;입사일&quot;
    ,TIMESTAMPDIFF(MONTH,HIRE_DATE,NOW())&quot;입사 후 일 수(년도)&quot;
FROM EMPLOYEE;</p>
<blockquote>
<p>YEAR : 연
QUARTER : 분기
MONTH : 월
WEEK : 주
DAY : 일
HOUR : 시
MINUTE : 분
SECOND : 초</p>
</blockquote>
<p>EXTRACT(YEAR|MONTH|DAY FROM 날짜데이터)</p>
<blockquote>
<p>원하는 년, 월, 일 데이터를 추출한다.</p>
</blockquote>
<p>SELECT 
     EXTRACT(YEAR FROM HIRE_DATE)
    ,EXTRACT(MONTH FROM HIRE_DATE)
    ,EXTRACT(DAY FROM HIRE_DATE)
FROM EMPLOYEE;</p>
<blockquote>
<p>DATE FORMAT() : 날짜 포맷 변경</p>
</blockquote>
<p>SELECT 
     HIRE_DATE
    ,DATE_FORMAT(HIRE_DATE,&#39;%Y%m%d%h%i%s&#39;)
    ,DATE_FORMAT(HIRE_DATE,&#39;%Y/%m/%d %H:%i:%s&#39;)
    ,DATE_FORMAT(NOW(),&#39;%y/%m/%d %H:%i:%s&#39;)
FROM EMPLOYEE;</p>
<blockquote>
<p>STR_TO_DATE() -- STRING 형식의 데이터만 날짜로 변환해줌.</p>
</blockquote>
<p>SELECT 
     STR_TO_DATE(&#39;20231010&#39;, &#39;%Y%m%d&#39;)
    ,STR_TO_DATE(&#39;231010&#39;, &#39;%y%m%d&#39;);</p>
<p>IF(조건, 참, 거짓)
조건에 AND, OR등을 통해 여러 조건식을 만들 수 있음</p>
<blockquote>
</blockquote>
<ul>
<li>현재 근무하는 직원들의 성별을 남,여로 구분지어 출력하기</li>
</ul>
<p>SELECT 
     EMP_NAME
    ,EMP_NO
    ,SUBSTR(EMP_NO,8,1)
    ,IF(SUBSTR(EMP_NO,8,1) = &#39;1&#39;,&quot;남&quot;,&quot;여&quot;) 성별
FROM EMPLOYEE
ORDER BY 성별;</p>
<ul>
<li>실습6
EMPOLOYEE 테이블에서 모든 직원의 
사번,사원명,부서코드,직급코드,근무여부,관리자 여부를 조회
이 때, 근무여부 : ENT_YN이 &#39;Y&#39;면 퇴사자 / &#39;N&#39;이면 근무자
관리자여부 : MANAGER_ID가 있으면 사원 / 없으면 관리자</li>
</ul>
<p>SELECT 
     EMP_ID 사번
    ,EMP_NAME 사원명
    ,DEPT_CODE 부서코드
    ,JOB_CODE 직급코드
    ,IF(ENT_YN = &#39;N&#39;,&#39;근무자&#39;,&#39;퇴사자&#39;) 근무여부
    ,IF(IFNULL(MANAGER_ID,0) = 0, &quot;관리자&quot;,&quot;사원&quot;) 관리자여부
FROM EMPLOYEE;</p>
<blockquote>
<p>CASE 문
자바의 IF, SWITCH처럼 사용 가능한 함수 표현식
사용법 
CASE WHEN(조건식1)THEN 결과값1
     WHEN(조건식2)THEN 결과값2
     ELSE 결과값3
END</p>
</blockquote>
<ul>
<li>실습6 / CASE를 이용하여 문제 해결</li>
</ul>
<p>SELECT 
    EMP_ID 사번,
    EMP_NAME 사원명,
    DEPT_CODE 부서코드,
    JOB_CODE 직급코드,
    CASE
        WHEN ENT_YN = &#39;Y&#39; THEN &#39;퇴사자&#39;
        WHEN ENT_YN = &#39;N&#39; THEN &#39;근무자&#39;
    END &quot;근무여부&quot;,
    CASE
        WHEN MANAGER_ID IS NULL THEN &#39;관리자&#39; ELSE &#39;사원&#39;
    END &quot;관리자 여부&quot;
FROM EMPLOYEE;</p>
<blockquote>
<p>MOD() : 주어진 칼럼이나 값을 나눈 나머지를 반환하는 함수</p>
</blockquote>
<p>SELECT MOD(10,3), MOD(10,2), MOD(10,7);</p>
<blockquote>
<p>ROUND() : 지정한 숫자를 반올림 할 때 사용하는 함수</p>
</blockquote>
<p>SELECT 
     ROUND(123.456,0)
    ,ROUND(123.456,1) -- 소수점 둘째자리 반올림
    ,ROUND(123.456,2) -- 소수점 셋째자리 반올림
    ,ROUND(123.456,-2); -- 양의자리로 와서 반올림</p>
<blockquote>
<p>CEIL() : 소수점 첫째 자리에서 올림하는 함수
FLOOR() : 소수점 이하 자리의 숫자를 버리는 함수</p>
</blockquote>
<p>SELECT CEIL (123.456), FLOOR(123.456);</p>
<blockquote>
<p>TRUNCATE() : 지정한 위치까지 숫자를 버리는 함수</p>
</blockquote>
<p>SELECT TRUNCATE(123.456,0), TRUNCATE(123.456,1), TRUNCATE(123.456,-2);</p>
<blockquote>
<p>CEILING() : 소수점 반올림</p>
</blockquote>
<p>SELECT CEILING(4.0), CEILING(4.1), CEILING(3.9);
SELECT CEILING(-4.0), CEILING(-4.1), CEILING(-3.9);</p>
<ul>
<li>실습 7
EMPLOYEE테이블에서 입사한 달의 숫자가 홀수 달인 직원의 사번,사원명, 입사일 정보를 조회(HIRE_DATE에 SUBSTR활용)</li>
</ul>
<p>SELECT 
     EMP_ID 사번
    ,EMP_NAME 사원명
    ,HIRE_DATE 입사일
FROM EMPLOYEE
WHERE MOD(SUBSTR(HIRE_DATE,7,1),2) = 1;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 기초 DAY01]]></title>
            <link>https://velog.io/@hi_nahyun/SQL-%EA%B8%B0%EC%B4%88-DAY01</link>
            <guid>https://velog.io/@hi_nahyun/SQL-%EA%B8%B0%EC%B4%88-DAY01</guid>
            <pubDate>Tue, 10 Oct 2023 08:17:58 GMT</pubDate>
            <description><![CDATA[<p>-- 실행 : 실행하려는 명령어로 커서를 이동 시킨 뒤 
-- CTRL+ENTER or alt+X키
SHOW TABLES;</p>
<ul>
<li>테이블 생성
   CREATE TABLE STUDENTS(
  ID INT,
  NAME  VARCHAR(100),
  PHONE CHAR(13),
  ADDRESS VARCHAR(1000)
  ); </li>
</ul>
<p>-- 한줄주석
/* 여러줄 주석 */
-- &#39;;&#39; 문장의 끝 마다 세미콜론은 꼭 붙힐것.</p>
<blockquote>
<ul>
<li>SELECT 문
SELECT : 조회.
[사용법]
SELECT 컬럼, 컬럼, ..    : 조회하고자 하는 내용(*은 모든 컬럼을 의미)
FROM 테이블 명              : 조회하고자 하는 테이블 명
[WHERE 조건]            : 특정 조건
[ORDER BY 컬럼]        : 정렬</li>
</ul>
</blockquote>
<p> EMPLOYEE 테이블의 모든 행과 모든 컬럼 조회
 select * or select 모든컬럼명 다적기
 from employee</p>
<p>select *
from EMPLOYEE;</p>
<ul>
<li>모든 사원의 아이디(EMP_ID)와 사원명(EMP_NAME), 연락처(PHONE)만 조회
SELECT EMP_ID, EMP_NAME, PHONE
from EMPLOYEE;</li>
</ul>
<blockquote>
<p>-- WHERE 구문(절)
-- 테이블에서 조건을 만족하는 값을 가진 행을 따로 선택하여 조회함.
-- 여러 조건을 선택하고자 할 경우 and,or등 명령어를 함께 사용함.</p>
</blockquote>
<ul>
<li><p>부서코드가 &#39;D6&#39;인 사원들의 정보를 모두 조회
SELECT *
from  EMPLOYEE 
where DEPT_CODE = &#39;D6&#39;;</p>
</li>
<li><p>실습1/ 직급이 &#39;J1&#39;인 사원의 사번(ID), 사원명(NAME), 직급코드(JOB_CODE), 부서코드(DEPT_CODE) 출력</p>
</li>
</ul>
<p>SELECT EMP_ID, EMP_NAME, JOB_CODE, DEPT_CODE
from   EMPLOYEE
where  JOB_CODE = &#39;J1&#39;;</p>
<ul>
<li>실습2 / 급여(SALARY)가 300만원 이상인 사원의 아이디,사원명,직급코드,급여정보들을 조회</li>
</ul>
<p>SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM   EMPLOYEE
where  SALARY &gt;=3000000;</p>
<ul>
<li>부서코드가 &#39;D6&#39; 이면서, 이름이 &#39;유재식&#39;인 사원의 정보</li>
</ul>
<p>SELECT *
  FROM EMPLOYEE
 where DEPT_CODE = &#39;D6&#39;
   and EMP_NAME = &#39;유재식&#39;;</p>
<blockquote>
<ol>
<li>as(alias)표현
SELECT <pre><code>   EMP_ID as &quot;사원번호&quot;
  ,EMP_NAME as 사원명</code></pre>from EMPLOYEE;
별칭을 정해줄때 )나, 띄어쓰기 같은 문자가 들어갈 경우 &quot;&quot;반드시 사용.</li>
</ol>
</blockquote>
<ul>
<li>실습3/부서가 D2이거나 D1인 사원들의 사원명,입사일,연락처 조회 (단, 컬럼명 부여)
SELECT 
   EMP_NAME as &quot;사원명&quot;
  ,HIRE_DATE as &quot;입사일&quot;
  ,PHONE as &quot;연락처&quot;
FROM     EMPLOYEE 
WHERE     DEPT_CODE = &#39;D1&#39; 
   OR  DEPT_CODE = &#39;D2&#39;;</li>
</ul>
<ul>
<li><p>사원들의 연봉 조회
SELECT EMP_NAME as &quot;사원명&quot; , SALARY as &quot;급여&quot;, (SALARY<em>12) as &quot;연봉&quot;, BONUS as &quot;보너스&quot; , (SALARY + (SALARY</em>BONUS) * 12) as &quot;연봉종합&quot;
from EMPLOYEE ;</p>
</li>
<li><p>컬럼값이 만약 NULL이라면 어떠한 연산을 처리해도 결과는 NULL이다.</p>
</li>
</ul>
<blockquote>
<p> IFNULL() : 만약에 현재 조회한 값이 NULL일 경우 별도로 설정한 값으로 변경한다.
IFNULL(컬럼, 기본값)</p>
</blockquote>
<p> SELECT BONUS,
         IFNULL(BONUS,0) 
 FROM EMPLOYEE;</p>
<p> SELECT 
     EMP_NAME as &quot;사원명&quot; 
     ,SALARY as &quot;급여&quot;
     ,(SALARY<em>12) as &quot;연봉&quot;
     ,BONUS as &quot;보너스&quot;
     ,(SALARY + (SALARY</em>IFNULL(BONUS,0))) * 12 as &quot;연봉종합&quot;
 from EMPLOYEE ;</p>
<blockquote>
<p>DISTINCT
해당하는 값이 컬럼에 여러 개 존재할 경우 중복을 제거하고 한개만 조회(NULL도 포함하여 중복제거)</p>
</blockquote>
<p>SELECT DEPT_CODE
from EMPLOYEE;</p>
<p>SELECT DISTINCT DEPT_CODE 
from EMPLOYEE;</p>
<ul>
<li>실습 4
DEPARTMENT 테이블을 참조하여, 
부서가 &#39;해외영업2부&#39;인 부서의 부서코드를 찾고,
EMPLOYEE 테이블에서 해당 부서의
사원들 중 급여를 200만원보다 많이 받는 직원의
사번, 사원명, 급여를 조회하시오.</li>
</ul>
<ul>
<li>1) &#39;해외영업2부&#39; 부서의 부서코드 찾기</li>
</ul>
<p>SELECT *
from DEPARTMENT 
where DEPT_TITLE = &#39;해외영업2부&#39;;-- D6</p>
<ul>
<li>2) 조회한 부서 코드를 사용하여 
사원들 중 급여를 200만원보다 많이 받는 직원 조회하기</li>
</ul>
<p>SELECT EMP_ID as 사번, EMP_NAME as 이름, SALARY as 월급
FROM EMPLOYEE
WHERE DEPT_CODE = &#39;D6&#39;
and SALARY &gt; 2000000;</p>
<ul>
<li>실습 5
실습 3을 참고하여
부서가 &#39;해외영업2부&#39;(D6)이거나 급여를 200만원보다 많이 받는 직원의 사번, 사원명, 급여를 조회 하시오.</li>
</ul>
<p>SELECT EMP_ID as 사번, EMP_NAME as 이름, SALARY as 월급
FROM EMPLOYEE
WHERE DEPT_CODE = &#39;D6&#39;
OR SALARY &gt;2000000;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[연산자 관련 문제풀이]]></title>
            <link>https://velog.io/@hi_nahyun/%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B4%80%EB%A0%A8-%EC%8B%A4%EC%8A%B5%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@hi_nahyun/%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B4%80%EB%A0%A8-%EC%8B%A4%EC%8A%B5%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 17 Sep 2023 05:21:33 GMT</pubDate>
            <description><![CDATA[<h3 id="연산자-실습문제"><strong>[연산자 실습문제]</strong></h3>
<ul>
<li>프로젝트명 : Java03_Operator</li>
<li>패키지명 : com.practice</li>
<li>실행용 클래스명 : Test.java
  main() 포함</li>
<li>기능제공용 클래스명 : Example.java</li>
</ul>
<h3 id="문제-1"><strong>[문제 1]</strong></h3>
<ul>
<li>메소드명 : public void sample1(){}</li>
<li>구현 내용 : 
 국어(정수), 영어(정수), 수학(정수), 총점(정수), 평균(실수) 변수 선언하고,
 각 점수를 키보드로 입력받고,
 합계(국어+영어+수학)와 평균(합계/3.0)을 계산하고,
 세 과목의 점수와 평균을 가지고 합격 여부 처리함
 합격의 조건 : 세 과목의 점수가 각각 40점이상이면서,<pre><code>         평균이 60점 이상이면 합격, 
         아니면 불합격 처리함</code></pre></li>
</ul>
<pre><code class="language-java">
package com.practice;

import java.util.Scanner;

public class Example {
     public void sample1(){
         Scanner sc = new Scanner(System.in);

         System.out.println(&quot;국어 점수 입력 : &quot;);
         int kor = sc.nextInt(); //국어

         System.out.println(&quot;영어 점수 입력 : &quot;);
         int eng = sc.nextInt();; //영어

         System.out.println(&quot;수학 점수 입력 : &quot;);
         int suhak = sc.nextInt(); //수학

         int csum = kor + eng + suhak; // 총점
         System.out.println(&quot;세 과목의 총 점수는 : &quot; + csum + &quot; 입니다.&quot;) ;

         float cavg = (float)(csum / 3.0); //평균
         System.out.println(&quot;세 과목의 평균는 : &quot; + cavg + &quot; 입니다.&quot;) ;


         if (kor &gt; 40 &amp;&amp; eng &gt; 40 &amp;&amp;  suhak &gt; 40 &amp;&amp; cavg &gt; 60) {
             System.out.println(&quot;합격&quot;);
         }else {
             System.out.println(&quot;불합격&quot;);
         }
     }

//실행문 (다른파일)

package com.practice;

public class Test {

    public static void main(String[] args) {
        new Example().sample1();
    }
}
</code></pre>
<h3 id="문제-2"><strong>[문제 2]</strong></h3>
<ul>
<li><p>메소드명 : public void sample2(){}</p>
</li>
<li><p>구현 내용 : 
 변수 선언하고, 키보드로 입력받은 값들을 변수에 기록하고
 변수값을 화면에 출력 확인함
 성별이 &#39;M&#39;이면 남학생, &#39;M&#39;이 아니면 여학생으로 출력처리함</p>
<p>변수 선언후 입력받음 
   학생이름 (문자열)
   학년 (정수)
   반 (정수)
   번호 (정수)
   성별(M/F) (문자)    //문자열로 입력받은 후, 문자하나 분리해야 함
 성적 (실수) //소숫점 아래 둘째자리까지 입력받음</p>
</li>
<li><p>출력 예
 3학년 2반 24번 남학생 홍길동은 성적이 95.55이다.</p>
</li>
</ul>
<pre><code class="language-java">package com.practice;

import java.util.Scanner;

public class Example {
    public void sample2() {
         Scanner sc = new Scanner(System.in);

         System.out.println(&quot;학생 이름 : &quot;);
         String name = sc.next(); //이름

         System.out.println(&quot;학년 : &quot;);
         int hakyear = sc.nextInt(); //학년

         System.out.println(&quot;반 : &quot;);
         int ban = sc.nextInt(); //반

         System.out.println(&quot;번호 : &quot;);
         int numb = sc.nextInt(); //번호

         System.out.println(&quot;성별 : &quot;);
         char mf = sc.next().charAt(0); //학년
             if (mf == &#39;M&#39;) {
                 mf = &#39;남&#39;;
             }else {
                 mf = &#39;여&#39;;
             }

         System.out.println(&quot;성적 : &quot;);
         float sungjuk = sc.nextFloat(); //학년

         System.out.println(hakyear + &quot;학년 &quot; + ban + &quot; 반 &quot; + numb + &quot;번호 &quot; + mf + &quot;학생 &quot; + name + &quot;은 성적이 &quot;+ sungjuk + &quot;이다.&quot;);
     }
}

//실행문 (다른파일)

package com.practice;

public class Test {

    public static void main(String[] args) {
        new Example().sample2();
    }
}
</code></pre>
<h3 id="문제-3"><strong>[문제 3]</strong></h3>
<ul>
<li>메소드명 : public void sample3(){}</li>
<li>구현 내용 : <ol>
<li>정수 변수 선언</li>
<li>키보드로 부터 정수 하나 입력받음</li>
<li>입력받은 정수가 양수이면 &quot;양수다.&quot; 출력
양수가 아니면 &quot;양수가 아니다.&quot; 출력</li>
</ol>
</li>
</ul>
<pre><code class="language-java">package com.practice;

import java.util.Scanner;

public class Example {
     public void sample3() {
         Scanner sc = new Scanner(System.in);

         System.out.println(&quot;값을 입력해주세요.&quot;);
         int num = sc.nextInt();

         if(num &gt; 0) {
             System.out.println(&quot;양수.&quot;);
         }else {
             System.out.println(&quot;양수가 아니다.&quot;);
         } 
     }
}


//실행문 (다른파일)

package com.practice;

public class Test {

    public static void main(String[] args) {
        new Example().sample3();
    }
}
</code></pre>
<h3 id="문제-4"><strong>[문제 4]</strong></h3>
<ul>
<li>메소드명 : public void sample4(){}</li>
<li>구현 내용 :<ol>
<li>정수 변수 선언</li>
<li>문자열 변수 선언</li>
<li>키보드로 부터 정수를 하나 입력 받음    </li>
<li>입력받은 정수가 짝수이면 &quot;짝수다&quot; 를 문자열변수에 기록하고,
짝수가 아니면 &quot;홀수다&quot;를 문자열변수에 기록하고 
문자열변수 값 출력함
&lt;짝수의 조건&gt;
어떤 수를 2로 나눈 나머지가 0과 같으면 짝수임.</li>
</ol>
</li>
</ul>
<pre><code class="language-java">package com.practice;

import java.util.Scanner;

public class Example {
     public void sample4() {
         Scanner sc = new Scanner(System.in);

           System.out.println(&quot;-04)값을 입력해주세요.&quot;);
           int num2 = sc.nextInt();
           String str2;

           if(num2 % 2 == 0) {
               str2 = &quot;짝수다&quot;;
           }else {
               str2 = &quot;홀수다&quot;;
           }
         System.out.println(str2); 
     }
}

//실행문 (다른파일)

package com.practice;

public class Test {

    public static void main(String[] args) {
        new Example().sample4();
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 변수 관련 문제풀이]]></title>
            <link>https://velog.io/@hi_nahyun/%EB%B3%80%EC%88%98-%EA%B4%80%EB%A0%A8-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-1</link>
            <guid>https://velog.io/@hi_nahyun/%EB%B3%80%EC%88%98-%EA%B4%80%EB%A0%A8-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-1</guid>
            <pubDate>Sun, 17 Sep 2023 05:13:50 GMT</pubDate>
            <description><![CDATA[<h3 id="변수-연습문제"><strong>[변수 연습문제]</strong></h3>
<p> =&gt; 패키지 생성 : com.example
 =&gt; 실행용 클래스 생성 : TestMain.java
 main() 메소드 포함 : 각 문제별 메서드 실행 테스트함
 =&gt; 기능제공용 클래스 생성 : Example.java</p>
<h3 id="연습-1"><strong>[연습 1]</strong></h3>
<p> =&gt; 메소드명 : public void example1(){}
 =&gt; 실행내용 : 키보드로 정수 두 개를 입력받아, 
                   두 수의 합, 차, 곱, 나누기한 몫과 나머지 출력
 =&gt; 입력예
    첫번째 정수 : 23
    두번째 정수 : 7
 =&gt; 출력예          계산식
    더하기 결과 : 30  --&gt; (값1 + 값2)
    빼기 결과 : 16   --&gt; (값1 - 값2)
    곱하기 결과 : 161 --&gt; (값1 * 값2)
    나누기한 몫 : 3   --&gt; (값1 / 값2)
    나누기한 나머지 : 2  --&gt; (값1 % 값2)</p>
<pre><code class="language-java">package com.example;

import java.util.Scanner;

public class Example {
    public void example1() {
        Scanner sc = new Scanner(System.in);
        System.out.println(&quot;정수 입력 1 : &quot;);
        System.out.println(&quot;정수 입력 2 : &quot;);
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();

        System.out.println(&quot;더하기 결과 : &quot; + (num1 + num2));
        System.out.println(&quot;빼기 결과 : &quot; + (num1 - num2));
        System.out.println(&quot;곱하기 결과 : &quot; + (num1 * num2));
        System.out.println(&quot;나누기 한 몫 : &quot; + (num1 / num2));
        System.out.println(&quot;나누기한 나머지 : &quot; + (num1 % num2));

    }


//실행문 (파일 따로)

package com.example;

public class TestMain {

    public static void main(String[] args) {
        Example tm = new Example();
        tm.example1();
    }
}
</code></pre>
<h3 id="연습-2"><strong>[연습 2]</strong></h3>
<p> =&gt; 메소드명 : public void example2(){}
 =&gt; 실행내용 : 키보드로 가로, 세로 값을 실수형으로 입력받아
    사각형의 면적과 둘레를 계산하여 출력
    계산공식 - 면적 : 가로 * 세로
           둘레 : (가로 + 세로) * 2
 =&gt; 입력예
    가로 : 13.5
    세로 : 41.7
 =&gt; 출력예
    면적 : 562.95
    둘레 : 110.4</p>
<pre><code class="language-java">
package com.example;

import java.util.Scanner;

public class Example {
    public void example2() {
        Scanner sc2 = new Scanner(System.in);
        System.out.println(&quot;가로 : &quot;);
        System.out.println(&quot;세로 : &quot;);
        double num3 = sc2.nextDouble();
        double num4 = sc2.nextDouble();

        System.out.println(&quot;면적 : &quot; + (num3 * num4));
        System.out.println(&quot;둘레 : &quot; + (num3 + num4)*2);
    }
}

//실행문 (파일 따로)

package com.example;

public class TestMain {

    public static void main(String[] args) {
        Example tm = new Example();
        tm.example2();
    }
}
</code></pre>
<h3 id="연습-3">[연습 3]</h3>
<p> =&gt; 메소드명 : public void example3(){}
 =&gt; 실행내용 : 영어 문자열 값을 키보드로 입력받아(공백X)
    각 자리의 문자를 출력
 =&gt; 입력예
    문자열을 입력하시오 : apple
 =&gt; 출력예 (3개만 출력해 봄)
    첫번째 문자 : a
    두번째 문자 : p
    세번째 문자 : p
    입력된 글자 갯수 : 5</p>
<pre><code class="language-java">
package com.example;

import java.util.Scanner;

public class Example {
    public void example3() {
        Scanner sc3 = new Scanner(System.in);
        System.out.println(&quot;문자열을 입력하시오 : &quot;);
        String num5 = sc3.next();
        System.out.println(&quot;첫번째 문자 : &quot; + num5.charAt(0));
        System.out.println(&quot;두번째 문자 : &quot; + num5.charAt(1));
        System.out.println(&quot;세번째 문자 : &quot; + num5.charAt(2));
        System.out.println(&quot;입력된 글자 갯수 : &quot; + num5.length());
    }
}

package com.example;

public class TestMain {

    public static void main(String[] args) {
        Example tm = new Example();
        tm.example3();
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[수업 1일차 - 09/12]]></title>
            <link>https://velog.io/@hi_nahyun/%EC%88%98%EC%97%85-1%EC%9D%BC%EC%B0%A8-0911</link>
            <guid>https://velog.io/@hi_nahyun/%EC%88%98%EC%97%85-1%EC%9D%BC%EC%B0%A8-0911</guid>
            <pubDate>Sun, 17 Sep 2023 04:54:46 GMT</pubDate>
            <description><![CDATA[<h3 id="⌨️-프로그래밍">⌨️ 프로그래밍</h3>
<ul>
<li><p>프로그램(Program)</p>
</li>
<li><p>컴퓨터가 인식할 수 있는 명령어의 나열(집합)</p>
</li>
<li><p>프로그래밍(Programming)</p>
</li>
<li><p>프로그램을 작성하는 과정 = 코딩</p>
</li>
<li><p>프로그래머(Programmer)</p>
</li>
<li><p>프로그램을 작성하는 사람</p>
</li>
</ul>
<h3 id="⌨️자바-언어의-특징">⌨️자바 언어의 특징</h3>
<ol>
<li>운영체제에 독립적</li>
<li>사용하기 쉬운 언어<ul>
<li>다른 언어의 단점 보완(포인터, 메모리 관리)</li>
<li>객체 지향 언어</li>
<li>능률적이고 명확한 코드 작성 가능</li>
</ul>
</li>
<li>자동 메모리 관리(Garbage Collection)</li>
<li>네트워크와 분산환경 지원</li>
<li>멀티쓰래드 지원</li>
</ol>
<h3 id="⌨️-class">⌨️ Class</h3>
<ul>
<li>자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며
서로 관련된 코드들을 그룹으로 나누어 별도의 클래스 구성
클래스들이 모여 하나의 Java 애플리케이션 구성</li>
</ul>
<pre><code class="language-java">public class 클래스이름{
    /*
     * 주석을 제외한 모든 코드는 블록 { } 내에 작성
     */
}</code></pre>
<h3 id="⌨️-main">⌨️ main</h3>
<ul>
<li>‘public static void main(String[] args)’는 main메서드의 고정된 선언부로
프로그램 실행 시 java.exe에 의해 호출됨
모든 클래스가 main메서드를 가지고 있어야 하는 것은 아니지만 하나의 Java애플리케이션에는 main메서
드를 포함한 클래스가 반드시 하나는 있어야 함<pre><code class="language-java">public class 클래스이름{
  public static void main(String[] args) {//메인 메서드의 선언부
  // 실행될 문장들을 적는다
}</code></pre>
</li>
</ul>
<h3 id="⌨️-주석">⌨️ 주석</h3>
<ul>
<li><p>코드에 대한 설명이나 그 외 다른 정보를 넣을 때 사용하는 것으로
컴파일 시 컴파일러가 주석 부분은 건너 뜀</p>
</li>
<li><p>/* <em>/ : 범위 주석, /</em>와 */ 사이 내용은 주석으로 간주</p>
</li>
<li><p>// : 한 줄 주석, // 뒤의 내용은 주석으로 간주</p>
</li>
</ul>
<h3 id="⌨️-데이터-저장단위">⌨️ 데이터 저장단위</h3>
<ul>
<li><p>비트(bit) : 컴퓨터가 나타내는 데이터의 저장 최소 단위로서 2진수 값 하나를 저장할 수 있는 메모리공간을 의미</p>
</li>
<li><p>바이트(byte) : 데이터 처리 또는 문자의 최소 단위로서 8개의 비트가 모여 하나의 바이트가 구성됨</p>
</li>
</ul>
<h3 id="⌨️-변수">⌨️ 변수</h3>
<ul>
<li>메모리 공간(RAM)에 한 개의 값을 기록하기 위한 장소(공간)</li>
</ul>
<h3 id="⌨️-변수의-자료형">⌨️ 변수의 자료형</h3>
<h4 id="-기본형primitive-type">* 기본형(Primitive Type)</h4>
<p>  실제 데이터(값)을 저장
  논리형, 문자형, 정수형, 실수형으로 나눠지고 8개의 자료형이 있음
  각 자료형 별 데이터 저장크기가 다름</p>
<h4 id="-참조형reference-type">* 참조형(Reference Type)</h4>
<p>  데이터가 저장되어 있는 주소를 저장(객체의 주소)
  기본형을 제외한 나머지(String 등), 사용자 정의 자료형
   4byte의 공간을 저장공간으로 할당</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/fae632f3-dfe7-4799-9b85-4d0149685833/image.png" alt=""></p>
<h3 id="⌨️-변수의-선언">⌨️ 변수의 선언</h3>
<ul>
<li>메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것</li>
</ul>
<p><em><strong>자료형 변수명 ;</strong></em></p>
<h3 id="⌨️-변수명-명명-규칙">⌨️ 변수명 명명 규칙</h3>
<ol>
<li><strong>대소문자가 구분</strong>되며 길이 제한이 없다.</li>
<li><strong>예약어</strong>를 사용하면 안 된다.</li>
<li><strong>숫자로 시작하면 안 된다.</strong>
ex) age1은 가능하지만 1age는 불가능</li>
<li>특수문자는** ‘_’와 ‘$’만을 허용**한다.
ex) sh@rp는 불가능하지만 $harp는 가능</li>
<li>여러 단어 이름은 단어의 <strong>첫 글자를 대문자</strong>로 한다.
ex) ageOfVampire, userName</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[인프런/김영한]모든 개발자를 위한 HTTP 웹 기본지식 - 4. HTTP 메서드]]></title>
            <link>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-4.-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-4.-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Mon, 04 Sep 2023 03:56:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>HTTP API</li>
<li>HTTP 메서드 - GET, POST</li>
<li>HTTP 메서드 - PUT, PATCH, DELETE</li>
<li>HTTP 메서드의 속성</li>
</ol>
</blockquote>
<h3 id="🌐-http-api">🌐 HTTP API</h3>
<h4 id="🗃️어떤것이-좋은-api설계일까">🗃️어떤것이 좋은 api설계일까?</h4>
<p>만약 위와같은 요구사항이 있다고 가정하자.</p>
<h4 id="요구사항">요구사항</h4>
<p>회원 정보 관리 API를 만들어라.
• 회원 목록 조회
• 회원 조회
• 회원 등록
• 회원 수정
• 회원 삭제</p>
<p>URI를 이름에 맞춰서 설계한다.</p>
<p>API URI 설계</p>
<p>• 회원 목록 조회 /read-member-list
• 회원 조회 /read-member-by-id
• 회원 등록 /create-member
• 회원 수정 /update-member
• 회원 삭제 /delete-member</p>
<h4 id="🗃️-가장-중요한것은-리소스-식별이-잘-되야-좋은설계이다">🗃️ 가장 중요한것은 <em><strong>리소스 식별이 잘 되야 좋은설계이다.</strong></em></h4>
<p>API URI고민
<strong>&quot;리소스의 의미&quot;</strong></p>
<p><strong><em>회원을 조회하다 -&gt; 리소스가 아님
&quot;회원&quot; -&gt; 자체가 리소스임.</em></strong></p>
<p>• <strong>회원</strong> 목록 조회
• <strong>회원</strong> 조회
• <strong>회원</strong> 등록
• <strong>회원</strong> 수정
• <strong>회원</strong> 삭제</p>
<pre><code> ↓</code></pre><p>리소스 식별, URI 계층 구조 활용
• <strong>회원</strong> 목록 조회 /members
• <strong>회원</strong> 조회 /members/{id}
• <strong>회원</strong> 등록 /members/{id}
• <strong>회원</strong> 수정 /members/{id}
• <strong>회원</strong> 삭제 /members/{id}
• 참고: 계층 구조상 상위를 컬렉션으로 보고 복수단어 사용 권장(member -&gt; members)</p>
<pre><code>    ↓</code></pre><p>• <strong>회원</strong> 목록 조회 /members
• <strong>회원</strong> 조회 /members/{id} -&gt; 어떻게 구분하지?
• <strong>회원</strong> 등록 /members/{id} -&gt; 어떻게 구분하지?
• <strong>회원</strong> 수정 /members/{id} -&gt; 어떻게 구분하지?
• <strong>회원</strong> 삭제 /members/{id} -&gt; 어떻게 구분하지?</p>
<h4 id="🗃️-리소스를-어떻게-식별하는게-좋을까">🗃️ 리소스를 어떻게 식별하는게 좋을까?</h4>
<p>회원을 등록,조회,수정하는것은 모두 배제
<strong>회원이라는 리소스만 식별</strong>하면된다.</p>
<p>리소스와 행위를 분리한다.
리소스는 명사, 행위는 동사가 된다.
행위(메서드)는 어떻게 구분하지?</p>
<hr>
<h3 id="🌐-http-메서드---get-post">🌐 HTTP 메서드 - GET, POST</h3>
<p>클라이언트가 서버에 요청을할때 기대하는 행동.</p>
<ul>
<li>GET - 리소스 조회</li>
<li>POST - 데이터를줄테니 처리해달라는것.</li>
<li>PUT - 리소스를 대체, 리소스가 없으면 생성</li>
<li>PATCH - 리소스를 부분적으로 변경</li>
<li>DELETE - 리소스 삭제</li>
</ul>
<p>요새는 리소스말고 리프레젠테이션이라는 표현을 쓴다.</p>
<ul>
<li>HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환</li>
<li>OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)</li>
</ul>
<p>//이 둘은 거의 안씀.</p>
<ul>
<li>CONNECT: 대상 리소스로 식별되는 서버에 대한 터널을 설정</li>
<li>TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행</li>
</ul>
<h3 id="🌐-get">🌐 GET</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/820d3f59-49fd-43bb-89a3-bae27cbf8fa0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/ac46fb1f-13f6-4eff-a28e-9ebcb94b44db/image.png" alt=""></p>
<p>/100번의 유저 정보를 주세요!</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/3ab5ec1e-3bd1-40c4-b6de-0066feb620cf/image.png" alt=""></p>
<p>서버에서 답을 보냅니다.
HTTP/1.1버전, 200 OK(오류없이 ok라는뜻)
타입은 application/json
length 길이는 34</p>
<h3 id="🌐-post">🌐 POST</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/b65788e0-82bb-490c-9250-a62e2d63810a/image.png" alt=""></p>
<p>신규 등록, 변경에 쓰인다.</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/a893287c-9ade-4620-849f-e316ae0e45b9/image.png" alt=""></p>
<p>username &quot;young&quot;이고 age&quot;20&quot;인 메세지를 /members에 전달한다.</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/65efbdf2-812e-4aad-952f-9bc339e77e64/image.png" alt=""></p>
<p>전달받은 메세지는 /100 (신규리소스)가 생성된다.</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/192c18ea-465f-4238-ad16-a341a91dd1a9/image.png" alt=""></p>
<p>등록이 완료 된 경우엔 201 Created를 보낸다. (200도 가능)
201번을 보내는 경우는 Location(등록된 신규 리소스)를 적어준다.</p>
<h3 id="🗃️-요청-데이터를-어떻게-처리한다는-뜻일까">🗃️ 요청 데이터를 어떻게 처리한다는 뜻일까?</h3>
<ul>
<li><p>스펙: POST 메서드는 <strong>대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청</strong>합니다. (구글 번역)</p>
</li>
<li><p>HTML 양식에 입력 된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공
  예) HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용</p>
</li>
<li><p>게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
  예) 게시판 글쓰기, 댓글 달기</p>
</li>
<li><p>서버가 아직 식별하지 않은 새 리소스 생성
  예) 신규 주문 생성</p>
</li>
<li><p>기존 자원에 데이터 추가
   예) 한 문서 끝에 내용 추가하기</p>
</li>
<li><p><em><strong>정리: 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -&gt; 정해진 것이 없음</strong></em></p>
</li>
</ul>
<h3 id="🗃️-post-정리">🗃️ POST 정리</h3>
<ul>
<li><ol>
<li>새 리소스 생성(등록) 
서버가 아직 식별하지 않은 새 리소스 생성</li>
</ol>
</li>
<li><ol start="2">
<li>요청 데이터 처리**
단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
예) 주문에서 결제완료 -&gt; 배달시작 -&gt; 배달완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우</li>
</ol>
</li>
<li>POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음</li>
<li>예) POST /orders/{orderId}/start-delivery (컨트롤 URI)</li>
<li><ol start="3">
<li>다른 메서드로 처리하기 애매한 경우
예) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
<em><strong>애매하면 POST!</strong></em></li>
</ol>
</li>
</ul>
<h3 id="🌐-put">🌐 PUT</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/41e717b8-7981-49bc-af7f-2694a0288ce2/image.png" alt=""></p>
<p>post와 put의 차이점은 클라이언트가 리소스의 위치를 알고, uri를 지정한다는 뜻이다.
리소스를 대체할때, 완전히 대체함으로 기존 리소스를 없애버리고 완전히 날려버림. &quot;완전히 대체함.&quot;</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/517625a5-4196-4257-ad0f-4b3ef659f8bb/image.png" alt=""></p>
<p>username 필드가 없는데 age만 &quot;50&quot;으로 바꾸면 어떻게 될까?</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/0a3fd9f7-9690-4ceb-9430-bc1c9cc62182/image.png" alt=""></p>
<p>username필드가 완전히 삭제되며, put으로 보낸 리소스를 담은 age &quot;50&quot; 으로 덮어씌워지게된다.
리소스를 완전히 대체하게된다.</p>
<p><em><strong>* 부분만 변경하려면 PATCH를 사용한다.</strong></em></p>
<h3 id="🌐-patch">🌐 PATCH</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/25ad689c-1b64-43b7-bfb4-1554e578e843/image.png" alt=""></p>
<p>username 필드가 없는 경우에 age만 변경하려고한다.</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/e277b665-5eb4-443a-a6c5-75be229c821c/image.png" alt=""></p>
<p>PATCH를 이용하면 기존리소스에 추가로 age만 변경된다.</p>
<h3 id="🌐-delete">🌐 DELETE</h3>
<ul>
<li>리소스 제거.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/e147720b-361d-41df-87de-9bd01856c1c9/image.png" alt=""></p>
<p>members/100을 삭제한다.</p>
<h3 id="🌐-http-메서드의-속성">🌐 HTTP 메서드의 속성</h3>
<p>• 안전(Safe Methods)
• 멱등(Idempotent Methods)
• 캐시가능(Cacheable Methods)</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/b7e00fbe-10b6-4dd0-b363-4e748361bd31/image.png" alt=""></p>
<h4 id="🗃️-안전safe">🗃️ 안전(Safe)</h4>
<p>변경해도 변경이 일어나지않는걸 안전하다고 한다.
GET, HEAD 외에는 모두 안전하지 않음.</p>
<ul>
<li>Q: 그래도 계속 호출해서, 로그 같은게 쌓여서 장애가 발생하면요?
-&gt;&gt; A: 안전은 해당 리소스만 고려한다. 그런 부분까지 고려하지 않는다.</li>
</ul>
<h4 id="🗃️-멱등idempotent">🗃️ 멱등(Idempotent)</h4>
<ul>
<li><em><strong>한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같다</strong></em></li>
</ul>
<h4 id="-멱등-메서드">*** 멱등 메서드</h4>
<p>• GET: 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
• PUT: 결과를 대체한다. 따라서 같은 요청을 여러번 해도 최종 결과는 같다.
• DELETE: 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
<em><strong>• POST: 멱등이 아니다! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다.</strong></em></p>
<h4 id="-멱등의-활용">*** 멱등의 활용</h4>
<p>• 자동 복구 메커니즘
  (여러번 요청해서 복구)
• 서버가 TIMEOUT 등으로 정상 응답을 못주었을 때, 클라이언트가 같은 요청을 다시 해도 되는가?의 판단, 근거</p>
<h4 id="q-재요청-중간에-다른-곳에서-리소스를-변경해버리면">Q: 재요청 중간에 다른 곳에서 리소스를 변경해버리면?</h4>
<p>  • 사용자1: GET -&gt; username:A, age:20
  • 사용자2: PUT -&gt; username:A, age:30
  • 사용자1: GET -&gt; username:A, age:30 -&gt; 사용자2의 영향으로 바뀐 데이터 조회
• <em><strong>A: 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지는 않는다.</strong></em></p>
<h4 id="🗃️-캐시가능-cacheable">🗃️ 캐시가능 Cacheable</h4>
<ul>
<li>응답 결과 리소스를 캐시해서 사용해도 되는가?</li>
<li>GET, HEAD, POST, PATCH 캐시가능</li>
<li>실제로는 GET, HEAD 정도만 캐시로 사용
  (실무에서는 GET만 캐시로 사용)</li>
<li>POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[인프런/김영한]모든 개발자를 위한 HTTP 웹 기본지식 - 3. HTTP 기본
]]></title>
            <link>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-3.-HTTP-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-3.-HTTP-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Tue, 29 Aug 2023 05:58:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>모든 것이 HTTP</li>
<li>클라이언트 서버 구조</li>
<li>Stateful, Stateless</li>
<li>비 연결성(connectionless)</li>
<li>HTTP 메시지</li>
</ol>
</blockquote>
<h3 id="🌐-모든-것이-httphypertext-transfer-protocol">🌐 모든 것이 HTTP(HyperText Transfer Protocol)</h3>
<h4 id="🗃️-http-메시지에-모든-것을-전송">🗃️ HTTP 메시지에 모든 것을 전송</h4>
<p>• HTML, TEXT
• IMAGE, 음성, 영상, 파일
• JSON, XML (API)
• 거의 모든 형태의 데이터 전송 가능
• 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용
• <em><strong>지금은 HTTP 시대!</strong></em></p>
<h4 id="🗃️-http-역사">🗃️ HTTP 역사</h4>
<p>• HTTP/0.9 1991년: GET 메서드만 지원, HTTP 헤더X
• HTTP/1.0 1996년: 메서드, 헤더 추가
• <strong>HTTP/1.1 1997년: 가장 많이 사용, 우리에게 가장 중요한 버전</strong>
• RFC2068 (1997) -&gt; RFC2616 (1999) -&gt; <strong>RFC7230~7235 (2014)</strong>
• HTTP/2 2015년: 성능 개선
• HTTP/3 진행중: TCP 대신에 UDP 사용, 성능 개선</p>
<h4 id="🗃️-기반-프로토콜">🗃️ 기반 프로토콜</h4>
<p>• <strong>TCP</strong> : HTTP/1.1, HTTP/2
• <strong>UDP</strong>: HTTP/3
• 현재 HTTP/1.1 주로 사용
• HTTP/2, HTTP/3 도 점점 증가</p>
<p>1.1 의 성능개선버전이 2, 3이다.
1.1 버전을 잘 알아두면 된다.</p>
<ul>
<li>검색엔진에서 아무거나 검색 -&gt; F12 -&gt; 네트워크 -&gt; 오른쪽버튼 -&gt; protocol -&gt; http:/1.1, h2, h3 사용하는거 볼 수 있음.</li>
</ul>
<h4 id="🗃️-http-특징">🗃️ HTTP 특징</h4>
<p>• 클라이언트 서버 구조
• 무상태 프로토콜(스테이스리스), 비연결성
• HTTP 메시지
• 단순함, 확장 가능</p>
<h3 id="🌐-클라이언트-서버-구조">🌐 클라이언트 서버 구조</h3>
<p>클라이언트 요청 -&gt; 서버 응답 구조.</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/fb533420-7bcf-4d2a-9bbb-c9a6fe189588/image.png" alt=""></p>
<p>클라이언트와 서버를 개념적으로 분리하여
비지니스로직이랑 데이타를 서버에 다 밀어넣고
클라이언트는 UI와 사용성에 집중한다.
서로 각각 독립적으로 진화 할 수 있다.</p>
<h3 id="🌐-stateful-stateless">🌐 Stateful, Stateless</h3>
<h4 id="🗃️-무상태-프로토콜---스테이스리스stateless">🗃️ 무상태 프로토콜 - 스테이스리스(Stateless)</h4>
<p>• <strong>서버가 클라이언트의 상태를 보존X</strong>
• 장점: 서버 확장성 높음(스케일 아웃)
• 단점: 클라이언트가 추가 데이터 전송</p>
<h4 id="🗃️-stateful-stateless-차이">🗃️ Stateful, Stateless 차이</h4>
<h4 id="-상태-유지---stateful-정리">* 상태 유지 - Stateful, 정리</h4>
<p>• 고객: 이 노트북 얼마인가요?
• 점원: 100만원 입니다. <strong>(노트북 상태 유지) **
• 고객: 2개 구매하겠습니다.
• 점원: 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?
*<em>(노트북, 2개 상태 유지) *</em>
• 고객: 신용카드로 구매하겠습니다.
• 점원: 200만원 결제 완료되었습니다. **(노트북, 2개, 신용카드 상태 유지)</strong></p>
<p>점원(서버)는 고객(클라이언트)의 상태를 알 고 있다. 유지하고있기 때문에</p>
<h4 id="-상태-유지---stateful-점원이-중간에-바뀌면">* 상태 유지 - Stateful, 점원이 중간에 바뀌면?</h4>
<p>• 고객: 이 노트북 얼마인가요?
• <strong>점원A</strong>: 100만원 입니다.
• 고객: 2개 구매하겠습니다.
• <strong>점원B</strong>: ? 무엇을 2개 구매하시겠어요?
• 고객: 신용카드로 구매하겠습니다.
• <strong>점원C</strong>: ? 무슨 제품을 몇 개 신용카드로 구매하시겠어요?</p>
<p>점원B(서버)는 고객(클라이언트)의 노트북을 구매하려는지 모름.
점원C(서버)는 고객(클라이언트)가 노트북2개를 신용카드로 구매하려는지 모름.
상태유지가 되고있으면 에러가난다는 뜻임.</p>
<h4 id="-무상태---stateless">* 무상태 - Stateless</h4>
<p>• 고객: 이 노트북 얼마인가요?
• 점원: 100만원 입니다.
• 고객: 노트북 2개 구매하겠습니다.
• 점원: 노트북 2개는 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?
• 고객: 노트북 2개를 신용카드로 구매하겠습니다.
• 점원: 200만원 결제 완료되었습니다</p>
<h4 id="-무상태---stateless-점원이-중간에-바뀌면">* 무상태 - Stateless, 점원이 중간에 바뀌면?</h4>
<p>• 고객: 이 노트북 얼마인가요?
• <strong>점원A</strong>: 100만원 입니다.
• 고객: 노트북 2개 구매하겠습니다.
• <strong>점원B</strong>: 노트북 2개는 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?
• 고객: 노트북 2개를 신용카드로 구매하겠습니다.
• <strong>점원C</strong>: 200만원 결제 완료되었습니다</p>
<p>고객이 필요한 정보를 그때그떄 넘겨주기때문에 아무 문제가 없다.</p>
<h4 id="🗃️-정리">🗃️ 정리</h4>
<p>• <strong>상태 유지</strong>: 중간에 다른 점원으로 <strong>바뀌면 안된다</strong>.
(중간에 다른 점원으로 바뀔 때 <strong>상태 정보를 다른 점원에게 미리 알려줘야 한다.</strong>)
• <strong>무상태</strong>: 중간에 <strong>다른 점원으로 바뀌어도 된다.</strong>
• <strong>갑자기 고객이 증가해도 점원을 대거 투입할 수 있다.</strong>
• <strong>갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.</strong>
• 무상태는 응답 서버를 쉽게 바꿀 수 있다. -&gt; <em><strong>무한한 서버 증설 가능</strong></em></p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/59324732-7509-4cf2-ab8e-f3e837559abf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/46a4aa71-f3cc-4535-8997-a068b5751719/image.png" alt=""></p>
<h4 id="🗃️-실무-한계">🗃️ 실무 한계</h4>
<p>• 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.
• 무상태
    예) 로그인이 필요 없는 단순한 서비스 소개 화면
• 상태 유지
    예) 로그인
    로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지
• <strong>일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지</strong>
• <em><strong>상태 유지는 최소한만 사용</strong></em>***</p>
<ul>
<li>최대한 무상태로 설계한다.</li>
<li>정말 어쩔수 없을때만 상태유지를한다.</li>
</ul>
<h4 id="🌐-비-연결성connectionless">🌐 비 연결성(connectionless)</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/fe25c2dc-3199-4911-8f55-db6f58d89b9e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/e6618066-e3f2-4fc2-9762-be3cb5c30bf7/image.png" alt=""></p>
<h4 id="🗃️-비-연결성">🗃️ 비 연결성</h4>
<p>• <em><strong>HTTP는 기본이 연결을 유지하지 않는 모델</strong></em>
• 일반적으로 <strong>초 단위의 이하의 빠른 속도</strong>로 응답
• 1시간 동안 수천명이 서비스를 사용해도 <strong>실제 서버에서 동시에 처리하는 요청은 수십개 이
하로 매우 작음</strong>
    예) 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않는다.
• 서버 자원을 매우 효율적으로 사용할 수 있음</p>
<h4 id="🗃️-비-연결성의-한계와-극복">🗃️ 비 연결성의 한계와 극복</h4>
<p>• <em><strong>TCP/IP 연결을 새로 맺어야 함</strong></em> - 3 way handshake <em>시간 추가</em>
• 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등
등 수 <strong>많은 자원이 함께 다운로드</strong>
• 지금은_** HTTP 지속 연결(Persistent Connections)**_로 문제 해결
• HTTP/2, HTTP/3에서 더 많은 최적화</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/6c230069-4a44-4fc3-87eb-9125353cb4e6/image.png" alt=""></p>
<p>HTTP의 초기에는 연결,종료가 비효율적으로 이루어짐</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/fb2b7d13-c61c-4d25-b2e6-ffd3e81f5239/image.png" alt=""></p>
<p>지속연결을 할 경우 시간이 줄어듬</p>
<h4 id="🗃️-_스테이스리스_를-기억하자">🗃️ _<strong>스테이스리스</strong>_를 기억하자!</h4>
<p>서버 개발자들이 어려워하는 업무
• 정말 같은 시간에 딱 맞추어 발생하는 대용량 트래픽
    예) 선착순 이벤트, 명절 KTX 예약, 학과 수업 등록
    예) 저녁 6:00 선착순 1000명 치킨 할인 이벤트 -&gt; 수만명 동시 요청</p>
<h3 id="🌐-http-메시지">🌐 HTTP 메시지</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/efd0db95-29f8-4fb1-8920-86d6727989a7/image.png" alt=""></p>
<p>응답메세지 -
HTTP/1.1 (버전) 메세지
내용
공백 무조건 들어옴
내용</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/37026aea-aa1f-49df-8abb-9ec6a9636a7d/image.png" alt=""></p>
<p>CRLF - 공백</p>
<h4 id="🗃️-시작라인">🗃️ 시작라인<img src="https://velog.velcdn.com/images/hi_nahyun/post/aea4cb9c-130c-4ca0-aff7-c62fc29642b7/image.png" alt=""></h4>
<p>• start-line = request-line / status-line
• request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
• HTTP 메서드 (GET: 조회)
• 요청 대상 (/search?q=hello&amp;hl=ko)
• HTTP Version</p>
<h4 id="🗃️-요청-메시지---http-메서드">🗃️ 요청 메시지 - HTTP 메서드</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/6915c9fd-58c1-496f-9440-0c8e7c55b7ce/image.png" alt=""></p>
<p>• 종류: GET, POST, PUT, DELETE...
• 서버가 수행해야 할 동작 지정
• GET: 리소스 조회
• POST: 요청 내역 처리</p>
<h4 id="🗃️-요청-메시지---요청-대상">🗃️ 요청 메시지 - 요청 대상</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/587c2b27-2e07-466e-92e7-47d1e2b1346c/image.png" alt=""></p>
<p>• absolute-path[?query] (절대경로[?쿼리])
• 절대경로= &quot;/&quot; 로 시작하는 경로
• 참고: *, http://...?x=y 와 같이 다른 유형의 경로지정 방법도 있다</p>
<h4 id="🗃️-요청-메시지---http-버전">🗃️ 요청 메시지 - HTTP 버전</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/8b2f4104-e8cc-4249-88a7-130eebf14a18/image.png" alt=""></p>
<p>• HTTP Version</p>
<h4 id="🗃️-시작라인---응답메세지">🗃️ 시작라인 - 응답메세지</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/442a4e2b-bc94-48d1-9926-3a05a2190ecb/image.png" alt=""></p>
<p>• start-line = request-line / status-line
• status-line = HTTP-version SP status-code SP reason-phrase CRLF
• HTTP 버전
<em><strong>• HTTP 상태 코드: 요청 성공, 실패를 나타냄
  • 200: 성공
  • 400: 클라이언트 요청 오류
  • 500: 서버 내부 오류</strong></em>
• 이유 문구: 사람이 이해할 수 있는 짧은 상태 코드 설명 글</p>
<h4 id="🗃️-http-헤더">🗃️ HTTP 헤더</h4>
<p>• header-field = field-name &quot;:&quot; OWS field-value OWS (<strong>OWS:띄어쓰기 허용</strong>)
• field-name은 대소문자 구문 없음</p>
<ul>
<li>value는 대소문자 구문함.
<img src="https://velog.velcdn.com/images/hi_nahyun/post/1b1b0459-1188-4637-bbd7-003bfcaf5e1b/image.png" alt=""></li>
</ul>
<h4 id="🗃️-http-헤더---용도">🗃️ HTTP 헤더 - 용도</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/2f1f846b-8d72-4028-b992-8e62917698c2/image.png" alt=""></p>
<p>• HTTP 전송에 필요한 <strong>모든 부가정보</strong>
• 예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 
서버 애플리케이션 정보, 캐시 관리 정보...
• 표준 헤더가 너무 많음
<a href="https://en.wikipedia.org/wiki/List_of_HTTP_header_fields">https://en.wikipedia.org/wiki/List_of_HTTP_header_fields</a>
• 필요시 임의의 헤더 추가 가능
• helloworld: hihi</p>
<h4 id="http-메시지-바디---용도">HTTP 메시지 바디 - 용도</h4>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/9000d4a0-44a7-4176-a98d-bbabe271d347/image.png" alt=""></p>
<p>• 실제 전송할 데이터
• HTML 문서, 이미지, 영상, JSON 등등 <em><strong>byte로 표현할 수 있는 모든 데이터 전송 가능</strong></em></p>
<p>HTTP는 단순하다. 메세지도 매우 단순하다.
크게 성공하는 표준기술은 단순하지만 확장가능한 기술이 성공한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[인프런/김영한]모든 개발자를 위한 HTTP 웹 기본지식 - 2. URI와 웹 브라우저 요청 흐름]]></title>
            <link>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-2.-URI%EC%99%80-%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9A%94%EC%B2%AD-%ED%9D%90%EB%A6%84</link>
            <guid>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-2.-URI%EC%99%80-%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9A%94%EC%B2%AD-%ED%9D%90%EB%A6%84</guid>
            <pubDate>Fri, 25 Aug 2023 03:45:25 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>[URI와 웹브라우저 요청 흐름]</p>
</blockquote>
<ul>
<li>URI</li>
<li>웹 브라우저 요청 흐름</li>
</ul>
<h3 id="🌐-uri">🌐 URI</h3>
<p><strong>URI(Uniform Resource Identifier)</strong>
<img src="https://velog.velcdn.com/images/hi_nahyun/post/d00c43ba-d4a7-465f-9bfb-28bcf251ef4c/image.png" alt=""></p>
<p>-&gt; <em>URI는 Locator와 Name으로 식별된다.</em>
    <em>URI 안에는 URL과 URN이 포함된다.</em></p>
<p>Resource <strong>Locator</strong> - 예)김영한의 사는위치
Resoure <strong>Name</strong> - 예) 김영한 그 존재 / 이름을 부여해버리는 경우.</p>
<hr>
<ul>
<li><p>Uniform : 리소스 식별하는 통일된 방식</p>
</li>
<li><p>Resource : 자원, URI로 식별할 수 있는 모든것(제한없음) / 실시간 교통정보 등</p>
</li>
<li><p>Identifier : 다른 항목과 구분하는데 필요한 정보 / 사람을 구분하는 주민등록번호 등</p>
</li>
<li><p>URL - Locator : 리소스가 있는 위치를 지정</p>
</li>
<li><p>URN - Name : 리소스에 이름을 부여</p>
<pre><code>          위치는 변할 수 있지만 ,이름은 변하지 않는다.
          urn:isbn:8960777331 (어떤 책의 isbn URN)</code></pre></li>
</ul>
<p>URN 이름만으로는 실제 리소스를 찾는 방법이 보편화 되지 않아서, URI = URL과 같은 의미로 이야기 하겠음.</p>
<hr>
<ul>
<li>URL 분석</li>
</ul>
<p><a href="https://www.google.com/search?q=hello&amp;hl=ko">https://www.google.com/search?q=hello&amp;hl=ko</a></p>
<h4 id="🌐-url-전체-문법">🌐 URL 전체 문법</h4>
<p><strong>• scheme://[userinfo@]host[:port][/path][?query][#fragment]</strong>
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• 프로토콜(https)
• 호스트명(<a href="http://www.google.com">www.google.com</a>)
• 포트 번호(443)
• 패스(/search)
• 쿼리 파라미터(q=hello&amp;hl=ko)</p>
<hr>
<h4 id="🌐-scheme">🌐 scheme</h4>
<p>• <strong>scheme</strong>://[userinfo@]host[:port][/path][?query][#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• <strong>주로 프로토콜 사용</strong>
• 프로토콜: 어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙
• <strong>예) http, https, ftp 등등</strong>
• <strong>http는 80 포트, https는 443 포트를 주로 사용, 포트는 생략 가능
• https는 http에 보안 추가 (HTTP Secure)</strong></p>
<hr>
<h4 id="🌐-userinfo">🌐 userinfo</h4>
<p>• scheme://<strong>[userinfo@]</strong>host[:port][/path][?query][#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• URL에 사용자정보를 포함해서 인증
• <strong>거의 사용하지 않음</strong></p>
<hr>
<h4 id="🌐-host">🌐 host</h4>
<p>• scheme://[userinfo@]<strong>host</strong>[:port][/path][?query][#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• 호스트명
• 도메인명 또는 IP 주소를 직접 사용가능</p>
<hr>
<h4 id="🌐-port">🌐 PORT</h4>
<p>• scheme://[userinfo@]host<strong>[:port]</strong>[/path][?query][#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• 포트(PORT)
• <strong>접속 포트
• 일반적으로 생략, 생략시 http는 80, https는 443</strong></p>
<hr>
<h4 id="🌐-path">🌐 path</h4>
<p>• scheme://[userinfo@]host[:port]<strong>[/path]</strong>[?query][#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• <strong>리소스 경로(path), 계층적 구조</strong>
• 예)
• /home/file1.jpg
• /members
• /members/100, /items/iphone12</p>
<hr>
<h4 id="🌐-query">🌐 query</h4>
<p>• scheme://[userinfo@]host[:port][/path]<strong>[?query]</strong>[#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
• <strong>key=value 형태</strong>
• <strong>?로 시작, &amp;로 추가 가능</strong> ?keyA=valueA&amp;keyB=valueB
• <strong>query parameter, query string 등으로 불림</strong>, 웹서버에 제공하는 파라미터, 문자 형태</p>
<hr>
<h4 id="🌐-fragment">🌐 fragment</h4>
<p>• scheme://[userinfo@]host[:port][/path][?query][#fragment]
• <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/getting%02started.html#getting-started-introducing-spring-boot">https://docs.spring.io/spring-boot/docs/current/reference/html/gettingstarted.html#getting-started-introducing-spring-boot</a>
• fragment
• <strong>html 내부 북마크 등에 사용</strong>
• <strong>서버에 전송하는 정보 아님</strong></p>
<h3 id="🌐-웹-브라우저-요청-흐름">🌐 웹 브라우저 요청 흐름</h3>
<p><a href="https://www.google.com/search?q=hello&amp;hl=ko">https://www.google.com/search?q=hello&amp;hl=ko</a></p>
<ol>
<li>DNS를 조회한다.</li>
<li>HTTP 요청 메세지 생성
<img src="https://velog.velcdn.com/images/hi_nahyun/post/4b1cb348-53d5-4a50-a7d6-282fb9124725/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/10ef1d2b-fbfe-4f7f-af0e-ee1ba9953f91/image.png" alt=""></p>
<p>GET/search?q=hello&amp;hl=ko HTTP/1.1 Host: <a href="http://www.google.com">www.google.com</a> 생성.</p>
<ol start="3">
<li>HTTP 메세지 전송!</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/1aade3ab-97d5-4b28-a435-cedea6b122fe/image.png" alt=""></p>
<ol start="4">
<li><p>패킷 생성
<img src="https://velog.velcdn.com/images/hi_nahyun/post/aec736cd-eaa4-496c-86c9-584da9c948b5/image.png" alt=""></p>
</li>
<li><p>요청 패킷 전달
<img src="https://velog.velcdn.com/images/hi_nahyun/post/f5b8292d-9e22-4e22-8dce-bd6d9ab4becc/image.png" alt=""></p>
</li>
<li><p>요청 패킷 도착
<img src="https://velog.velcdn.com/images/hi_nahyun/post/0a5a5cbd-d0f7-4d39-b010-7c07e2141e58/image.png" alt=""></p>
</li>
<li><p>HTTP의 응답메세지 생성
<img src="https://velog.velcdn.com/images/hi_nahyun/post/becbe0ae-1766-4214-9ee1-1a164f1b5431/image.png" alt=""></p>
</li>
<li><p>응답 패킷 전달
<img src="https://velog.velcdn.com/images/hi_nahyun/post/f63cc01e-a599-438d-8ebf-7276d0cc7605/image.png" alt=""></p>
</li>
<li><p>응답 패킷 도착!
<img src="https://velog.velcdn.com/images/hi_nahyun/post/0036f79c-7270-4b2c-85b3-606e63121d80/image.png" alt=""></p>
</li>
<li><p>렌더링 후 결과 확인.
<img src="https://velog.velcdn.com/images/hi_nahyun/post/0e2dc496-04a9-4164-8192-7e481e7e968a/image.png" alt=""></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[인프런/김영한]모든 개발자를 위한 HTTP 웹 기본지식 - 1. 인터넷 네트워크]]></title>
            <link>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-1.-%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@hi_nahyun/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B9%80%EC%98%81%ED%95%9C%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D-1.-%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Thu, 24 Aug 2023 02:28:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>[인터넷 네트워크]</p>
</blockquote>
<ul>
<li>인터넷 통신</li>
<li>IP(Internet Protocol)</li>
<li>TCP, UDP</li>
<li>PORT</li>
<li>DNS</li>
</ul>
<h3 id="🌐-인터넷-통신">🌐 인터넷 통신</h3>
<p>클라이언트 ↔ 인터넷 ↔ 서버
<img src="https://velog.velcdn.com/images/hi_nahyun/post/1fbcdc23-1efc-475c-81f4-ae6db9f48e6f/image.png" alt=""></p>
<h3 id="🌐-ipinternet-protocol">🌐 IP(Internet Protocol)</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/15b87622-9282-4a93-baae-ade80556bcdc/image.png" alt=""></p>
<p>예)
클라이언트 : IP : 100.100.100.1
서버 : IP : 200.200.200.2</p>
<p>  IP 패킷 정보 - 출발지IP, 목적지IP, 내용을 넣고,
  패킷단위로 통신을 전달한다.
  노드끼리 서로 던지다가 최종 서버에 도착한다.
  서버에서 클라이언트를 보낼때도, 패킷단위로 보낸다.
  똑같이 노드끼리 서로 던지다가 클라이언트에 도착한다.</p>
<h3 id="🌐-ip-프로토콜의-한계">🌐 IP 프로토콜의 한계</h3>
<ul>
<li>비 연결성
  <em>패킷을 받을 대상이 없거나 서비스 불능상태여도 패킷을 전송</em></li>
<li>비 신뢰성
  <em>중간에 패킷이 사라지면?
  패킷이 순서대로 안오면?(대략 1500byte가 넘으면 끊어서 보낸다)</em></li>
<li>프로그램 구분
_    같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?
  패킷이 소실된다면?_</li>
</ul>
<h3 id="🌐-tcp-udp">🌐 TCP, UDP</h3>
<blockquote>
<ul>
<li>인터넷 프로토콜 스텍의 4계층
  애플레이션계층 - HTTP, FTP
  전송계층 - TCP, UDP
  인터넷 계층 - IP
  네트워크 인터페이스 계층</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/63d4aeb7-f9ed-4255-8a82-713d3e84084c/image.png" alt=""></p>
<h3 id="🌐-tcpip-패킷-정보">🌐 TCP/IP 패킷 정보</h3>
<ul>
<li>IP 패킷 정보 - 출발지IP, 목적지 IP, 기타..</li>
<li><ul>
<li>출발지PORT, 목적지PORT, 전송제어, 순서, 검증정보..
<img src="https://velog.velcdn.com/images/hi_nahyun/post/517b2342-0c0e-4906-80dd-eaca21615015/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="🌐-tcp-특징">🌐 TCP 특징</h3>
<p>전송 제어 프로토콜(Transmission Control Protocol)</p>
<ul>
<li><p>연결지향 - TCP 3 way handshake <strong>(가상 연결)</strong>
<img src="https://velog.velcdn.com/images/hi_nahyun/post/6d4b2933-e133-4c49-a0c4-7a96ccfa7a53/image.png" alt=""></p>
</li>
<li><p>데이터 전달 보증</p>
</li>
<li><p>순서 보장</p>
</li>
<li><p>신뢰할 수 있는 프로토콜</p>
</li>
<li><p>현재는 대부분 TCP 사용</p>
</li>
</ul>
<h3 id="🌐-udp-특징">🌐 UDP 특징</h3>
<p>사용자 데이터그램 프로토콜(User Datagram Protocol)</p>
<p>• 하얀 도화지에 비유<strong>(기능이 거의 없음)</strong>
• 연결지향 X - TCP 3 way handshake X
• 데이터 전달 보증 X
• 순서 보장 X
• 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름</p>
<p><em>정리</em>
• <strong>IP와 거의 같다. +PORT +체크섬 정도만 추가</strong>
• 애플리케이션에서 추가 작업 필요</p>
<h3 id="🌐-port">🌐 PORT</h3>
<p>한번에 둘 이상 연결해야한다면 ?</p>
<p>게임, 화상통화, 웹브라우저 요청 등..</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/9c440b85-2008-4d41-9d9c-f42b47f0935f/image.png" alt=""></p>
<p>PORT를 나누어서 여러곳으로 연결하여 사용한다.
예) 아파트(PORT)라면 VIEW(몇동 몇호) 이다.</p>
<p>• 0 ~ 65535 할당 가능
• 0 ~ 1023: 잘 알려진 포트, 사용하지 않는 것이 좋음
• FTP - 20, 21
• TELNET - 23
• HTTP - 80
• HTTPS - 443</p>
<h3 id="🌐-dns">🌐 DNS</h3>
<p>DNS : 도메인 네임 시스템(Domain Name System)
• 전화번호부
• 도메인 명을 IP 주소로 변환</p>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/cc190c94-a6fd-4230-be75-9f01550babce/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] 게시판 만들기 - 1]]></title>
            <link>https://velog.io/@hi_nahyun/Spring-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</link>
            <guid>https://velog.io/@hi_nahyun/Spring-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</guid>
            <pubDate>Mon, 14 Aug 2023 02:47:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/f333bbda-53f8-48d7-918d-6ce5e4a1895f/image.png" alt=""></p>
<p>게시판 부분을 들어갔을때, 보이는 페이지이다.
목록이 추출되려면 
쿼리에서 목록을 가져오고, body부분에서 forEach등을 이용해 리스트를 받아와야 한다.</p>
<p>셋팅 - 쿼리연동 등등은 생략된 글이다.</p>
<blockquote>
<ol>
<li>컨트롤러 연결</li>
</ol>
</blockquote>
<hr>
<pre><code class="language-java">@RequestMapping(value = &quot;/board/boardList&quot;, method = RequestMethod.GET)
    public String boardList(Model model) {
        List&lt;boardVo&gt; boardList = boardService.boardList();
        model.addAttribute(&quot;boardList&quot;,boardList);
        return &quot;/board/boardhome&quot;;
    }
   //boardList()의 값을 boardList에 넣어주고 boardhome(게시판화면)으로 리턴</code></pre>
<pre><code class="language-java">public interface BoardService {
    List&lt;boardVo&gt; boardList();
 }
 //Service에 List타입의 boardList를 추가해준다.</code></pre>
<hr>
<pre><code class="language-java">import java.util.List;

import javax.annotation.Resource;
import woo.edu.c.dao.BoardDao;
import woo.edu.c.vo.boardVo;

@Service
public class BoardServiceImpl implements BoardService {

    @Override
    public List&lt;boardVo&gt; boardList() {
        return boardDao.boardList();
    }

//ServiceImpl에도 만들어줌.
</code></pre>
<hr>
<blockquote>
<ol start="2">
<li>부트스트랩에서 디자인 긁어오기</li>
</ol>
</blockquote>
<hr>
<p>부트스트랩 및 제이쿼리를 넣어놓은 페이지를 링크로 걸어놓고 include로 페이지마다 연동시킴.</p>
<hr>
<pre><code class="language-java">
//com.jsp

&lt;script src=&quot;//code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css&quot;&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css&quot;&gt;
&lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js&quot;&gt;&lt;/script&gt;</code></pre>
<hr>
<p>jsp파일 상단에 include를 이용해서 com.jsp를 연동시켜준다.</p>
<pre><code class="language-java">    &lt;jsp:include page=&quot;../common/com.jsp&quot;/&gt;</code></pre>
<hr>
<p>부트스트랩3에서 게시판 디자인 적용.</p>
<pre><code class="language-java">&lt;table class=&quot;table table table-striped&quot;&gt;
.....
&lt;/table&gt;


&lt;button type=&quot;button&quot; class=&quot;btn btn-success&quot;&gt;&lt;/button&gt; //글쓰기 버튼.</code></pre>
<hr>
<blockquote>
<ol start="3">
<li>게시판 리스트를 로딩하는 쿼리문 생성</li>
</ol>
</blockquote>
<hr>
<pre><code class="language-sql">        &lt;!-- 게시판 리스트 로딩 --&gt;
          &lt;select id=&quot;boardList&quot; resultType=&quot;boardVo&quot;&gt; 
            SELECT
                   BOARD_NO -- 번호
                 , BOARD_TITLE -- 제목
                 , BOARD_NAME -- 글쓴이
                 , BOARD_DATE -- 날짜
                 , BOARD_CONTENTS -- 내용
            FROM BOARD
            ORDER BY TO_NUMBER(BOARD_NO) DESC
            //order bt에 to_number를 주는 이유는 board_no가 string일 경우
            //순서가 뒤죽박죽으로 나올 수 있어 to_number를 주었다.
        &lt;/select&gt;</code></pre>
<hr>
<blockquote>
<ol start="4">
<li>게시판 모양 만들고 값 연동</li>
</ol>
</blockquote>
<hr>
<pre><code class="language-java">    &lt;body&gt;
        &lt;h1&gt;게시판&lt;/h1&gt;
            &lt;table class=&quot;table table table-striped&quot;&gt;
                  &lt;tr&gt;
                       &lt;th width=&quot;10%&quot;&gt;번호&lt;/th&gt;
                       &lt;th width=&quot;40%&quot;&gt;제목&lt;/th&gt;
                       &lt;th width=&quot;20%&quot;&gt;작성자&lt;/th&gt;
                       &lt;th width=&quot;20%&quot;&gt;날짜&lt;/th&gt;
                   &lt;/tr&gt;        
            &lt;c:forEach var=&quot;List&quot; items=&quot;${boardList}&quot;&gt;
            //forEach를 이용하여 List라는 이름에 boardList의 값을 가져옴
                  &lt;tr&gt;
                        &lt;td&gt;${List.board_no}&lt;/td&gt;
                        &lt;td&gt;&lt;a href=&quot;/board/boardListOne?board_no=${List.board_no}&quot;&gt;${List.board_title}&lt;/a&gt;&lt;/td&gt;
                        &lt;td&gt;${List.board_name}&lt;/td&gt;
                        &lt;td&gt;&lt;fmt:formatDate pattern = &quot;yyyy-MM-dd hh:mm:ss &quot; value=&quot;${List.board_date}&quot;/&gt;&lt;/td&gt;
               //날짜는 fmt를 이용하여 받아온다.
                  &lt;/tr&gt;
             &lt;/c:forEach&gt;
            &lt;/table&gt;    
    &lt;/body&gt;
        &lt;button type=&quot;button&quot; class=&quot;btn btn-success&quot; id=&quot;boardInsert&quot;&gt;글쓰기&lt;/button&gt;</code></pre>
<hr>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/fb4ae4f1-fb09-4090-b44a-5038eb8eee1a/image.png" alt=""></p>
<p>완성</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] Sourcetree(소스트리) Stash(스태시)사용법 - 실전]]></title>
            <link>https://velog.io/@hi_nahyun/git-Sourcetree%EC%86%8C%EC%8A%A4%ED%8A%B8%EB%A6%AC-Stash%EC%8A%A4%ED%83%9C%EC%8B%9C%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84</link>
            <guid>https://velog.io/@hi_nahyun/git-Sourcetree%EC%86%8C%EC%8A%A4%ED%8A%B8%EB%A6%AC-Stash%EC%8A%A4%ED%83%9C%EC%8B%9C%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84</guid>
            <pubDate>Wed, 02 Aug 2023 00:33:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/bce8c6e3-d419-4c4b-a455-d75e151f3ded/image.png" alt=""></p>
<ol>
<li>풀 땡겨오는 와중에 에러가 난다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/b64a29f1-45e6-474d-8278-f52702f769f0/image.png" alt=""></p>
<ol start="2">
<li>스테이지에 있는 변경사항을 유지하면서 스태시를  만들었다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/0740e283-af21-4523-9bda-0c393ce0964e/image.png" alt=""></p>
<ol start="3">
<li>pull을 땡겨온다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/92ceb98c-baa2-43b7-9031-5fe9fc22e12a/image.png" alt=""></p>
<ol start="4">
<li>만든 스태시에 들어간다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/16b9aec7-b324-4c82-9656-1231a83ec7e3/image.png" alt=""></p>
<ol start="5">
<li>스태시를 적용한다.</li>
</ol>
<p>끗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git]소스트리 실행안됨, SoureTree 실행안됨 해결법]]></title>
            <link>https://velog.io/@hi_nahyun/git%EC%86%8C%EC%8A%A4%ED%8A%B8%EB%A6%AC-%EC%8B%A4%ED%96%89%EC%95%88%EB%90%A8-SoureTree-%EC%8B%A4%ED%96%89%EC%95%88%EB%90%A8-%ED%95%B4%EA%B2%B0%EB%B2%95</link>
            <guid>https://velog.io/@hi_nahyun/git%EC%86%8C%EC%8A%A4%ED%8A%B8%EB%A6%AC-%EC%8B%A4%ED%96%89%EC%95%88%EB%90%A8-SoureTree-%EC%8B%A4%ED%96%89%EC%95%88%EB%90%A8-%ED%95%B4%EA%B2%B0%EB%B2%95</guid>
            <pubDate>Wed, 02 Aug 2023 00:21:41 GMT</pubDate>
            <description><![CDATA[<ul>
<li>아무리 실행해도 소스트리가 실행이안된다.ㅡㅡ
윈도우 업데이트 기준으로 되지가 않아서 아나 짜증나던 와중에
구글링해서 알아냈다.
여러 오류들중에서 난 캐시가 문제였다.</li>
</ul>
<blockquote>
<p>경로 : 
C:\Users\사용자\AppData\Local\Atlassian\SourceTree.exe_Url_s3o4fhuzsqppv2xyt10mlg40l0q11esv\3.4.12.0(버전마다 다름)</p>
</blockquote>
<h3 id="저-캐시파일을-삭제하고-실행하니-실행완료">저 캐시파일을 삭제하고 실행하니 실행완료!</h3>
<p><img src="https://velog.velcdn.com/images/hi_nahyun/post/e0140fd0-0ba3-4b58-b010-3c491b4c99ce/image.png" alt=""></p>
<p>출처 : <a href="https://jerryjerryjerry.tistory.com/179">https://jerryjerryjerry.tistory.com/179</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[특수문자 제거] 엑셀다운로드 클릭시 특수문자를 제거하는 콜백함수]]></title>
            <link>https://velog.io/@hi_nahyun/%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0-%EC%97%91%EC%85%80%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%81%B4%EB%A6%AD%EC%8B%9C-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hi_nahyun/%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0-%EC%97%91%EC%85%80%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%81%B4%EB%A6%AD%EC%8B%9C-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 01 Aug 2023 04:02:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>콜백(callback)</strong> 또는 <strong>콜백 함수(callback function)</strong>는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. </p>
</blockquote>
<ul>
<li>비동기 방식의 콜백함수를 사용하여 엑셀 다운로드시, 특수문자를 제거하는 로직</li>
</ul>
<p>textCallback을 받는데, replace()</p>
<pre><code class="language-java">
    postGridAjax(&quot;&lt;c:url value=&#39;${admin}/ApplyExcelDataGrid.do&#39; /&gt;&quot;, params, function (data) {
        var resultList = fncFilter(data.resultList);
        provider.setRows(resultList);
        grdExcel.exportGrid({
            type: &quot;excel&quot;,
            target: &quot;local&quot;, //local|url
            applyDynamicStyles: true,
            fileName:  excelFileName,
            textCallback: function (index, column, value) {
                   return value.replace(/[\x00-\x09|\x0B-\x0C|\x0E-\x1E]/g, &#39;&#39;);
            },
        });
    });</code></pre>
<p>출처 : <a href="https://okky.kr/questions/1233300">https://okky.kr/questions/1233300</a>
를 참고하고 글을 작성하였습니다.</p>
]]></description>
        </item>
    </channel>
</rss>