<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sleeee-dev.log</title>
        <link>https://velog.io/</link>
        <description>개인 공부 기록 👩‍💻</description>
        <lastBuildDate>Mon, 04 Sep 2023 12:48:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sleeee-dev.log</title>
            <url>https://velog.velcdn.com/images/sleeee-dev/profile/6feff7a6-2ae2-4953-a85f-725f78646a15/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sleeee-dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sleeee-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[mariaDB] socket fail to connect to host, access denied for user 'root'@'localhost' 해결방법]]></title>
            <link>https://velog.io/@sleeee-dev/mariaDB-socket-fail-to-connect-to-host-access-denied-for-user-rootlocalhost-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@sleeee-dev/mariaDB-socket-fail-to-connect-to-host-access-denied-for-user-rootlocalhost-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 04 Sep 2023 12:48:40 GMT</pubDate>
            <description><![CDATA[<p>DBeaver에서 mariaDB를 연결하려고 했는데 다음과 같은 오류가 떴음</p>
<ol>
<li>socket fail to connect to host</li>
<li>access denied for user &#39;root&#39;@&#39;localhost&#39;</li>
</ol>
<p>해결방법 &gt;&gt; </p>
<ol>
<li>mariaDB가 설치되어있는지 확인</li>
</ol>
<ul>
<li>Terminal 실행<pre><code>brew install mariadb
mysql.server start
brew services start mariadb # 서버 자동 실행 명령어</code></pre></li>
</ul>
<ol start="2">
<li>root 계정 비밀번호 설정</li>
</ol>
<ul>
<li>Terminal 실행<pre><code>sudo mysql -u root;
password &gt;&gt; 맥북 비밀번호입력
USE mysql
SELECT User, Host, plugin FROM mysql.user;
</code></pre></li>
</ul>
<h1 id="root의-plugin이-auth_socket일-경우">root의 plugin이 auth_socket일 경우</h1>
<p>update user set plugin=&#39;mysql_native_password&#39; where user=&#39;root&#39;;
flush privileges;</p>
<h1 id="select로-변경된것-확인-후-root-계정-비밀번호-설정">select로 변경된것 확인 후 root 계정 비밀번호 설정</h1>
<p>ALTER user &#39;root&#39;@&#39;localhost&#39; identified by &#39;비밀번호&#39;;</p>
<pre><code>
해결하고나니 DBeaver로 연결 잘됨
Springboot 에서 yml datasource DB 연결도 잘됨
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[IntelliJ] Could not resolve org.springframework.boot:spring-boot-gradle-plugin: 에러 해결]]></title>
            <link>https://velog.io/@sleeee-dev/IntelliJ-Could-not-resolve-org.springframework.bootspring-boot-gradle-plugin-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@sleeee-dev/IntelliJ-Could-not-resolve-org.springframework.bootspring-boot-gradle-plugin-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Wed, 23 Aug 2023 12:48:49 GMT</pubDate>
            <description><![CDATA[<pre><code>&gt; Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.1.2.
     Required by:
         project : &gt; org.springframework.boot:org.springframework.boot.gradle.plugin:3.1.2</code></pre><p>사전 미션이 수행할게 있어서 프로젝트 클론해서 실행시키니 웬 오류가 우수수....
검색하니 자바 버전 설정의 오류 확률이 높다며..
그래서 build.gradle에서 확인해보니 내가 받은 프로젝트는 자바 17버전이고 내가 인텔리제이에 적용한건 자바 11버전이었다.
Settings에서 jdk 17로 다운받고 설정하고 gradle 다시 빌드하고 실행시키니 잘 됨!!</p>
<p><img src="https://velog.velcdn.com/images/sleeee-dev/post/54b02c38-4cff-4691-9657-bfac551c7bbd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git hub 403 error 해결방법]]></title>
            <link>https://velog.io/@sleeee-dev/git-hub-403-error-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@sleeee-dev/git-hub-403-error-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 31 Jul 2023 09:27:56 GMT</pubDate>
            <description><![CDATA[<h3 id="git-hub-403-error--git-hub-계정의-권한-문제">git hub 403 error : git hub 계정의 권한 문제</h3>
<ol>
<li>git hub 계정을 변경했을때 나타나는 오류</li>
</ol>
<pre><code>제어판 -&gt; 사용자 계정 -&gt; 자격 증명 관리자 -&gt; Windows 자격 증명 관리
github와 관련된 부분 삭제 후 git bash에서 재설정</code></pre><ol start="2">
<li>fork 하지 않고 clone해온 경우<pre><code>내 github로 fork한 repo를 clone해서 push하고 pull req 올리면 된다.</code></pre></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] SQL 코테 이론 정리]]></title>
            <link>https://velog.io/@sleeee-dev/SQL-SQL-%EC%BD%94%ED%85%8C-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@sleeee-dev/SQL-SQL-%EC%BD%94%ED%85%8C-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 07 Jun 2023 08:40:22 GMT</pubDate>
            <description><![CDATA[<p>프로그래머스 SQL 코딩테스트 문제를 풀면서 알게된 부분 정리</p>
<h3 id="1-날짜-포맷-변경하기">1. 날짜 포맷 변경하기</h3>
<p>DATETIME 형식은 시,분,초까지 나오는데 종종 문제에서 연-월-일 까지만 출력하도록 조건을 걸었을때 사용</p>
<p><strong>DATE_FORMAT(날짜컬럼,&#39;날짜형식&#39;)</strong></p>
<ul>
<li>&#39;날짜형식&#39;에는 보통 다음과 같이 <strong>2023-06-07</strong> 형태의 날짜 형식으로 요구하는 문제들이 많아서 이와 같이 나타내려면 </li>
<li><em>&#39;%Y-%m-%d&#39;*</em> 이라고 쓰면 된다.</li>
</ul>
<h3 id="2-가장-최근-날짜-구하기">2. 가장 최근 날짜 구하기</h3>
<p><strong>MAX(날짜컬럼)</strong> : 가장 최근 날짜
<strong>MIN(날짜컬럼)</strong> : 가장 오래된 날짜</p>
<h3 id="3-날짜-계산하기">3. 날짜 계산하기</h3>
<p><strong>DATEDIFF(날짜1, 날짜2)</strong> : 날짜1-날짜2
날짜 계산할 때는 +1 해야함 (첫날을 포함해야하므로)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] MYSQL 함수들]]></title>
            <link>https://velog.io/@sleeee-dev/SQL-MYSQL-%ED%95%A8%EC%88%98%EB%93%A4</link>
            <guid>https://velog.io/@sleeee-dev/SQL-MYSQL-%ED%95%A8%EC%88%98%EB%93%A4</guid>
            <pubDate>Wed, 07 Jun 2023 08:30:03 GMT</pubDate>
            <description><![CDATA[<p>프로그래머스 SQL 코딩테스트 문제를 풀면서 오라클과 Mysql 함수가 조금씩 다른 부분이 있어 발견할때마다 정리하기</p>
<h3 id="1-ifnull">1. IFNULL</h3>
<ul>
<li>오라클의 NVL과 같음</li>
<li>Null일때 어떻게 표기하는지 정하는 함수</li>
<li>사용예시<pre><code class="language-sql">SELECT WAREHOUSE_ID,WAREHOUSE_NAME,ADDRESS,IFNULL(FREEZER_YN,&#39;N&#39;) AS FREEZER_YN 
FROM FOOD_WAREHOUSE 
WHERE ADDRESS LIKE&#39;경기도%&#39; 
ORDER BY WAREHOUSE_ID;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[IntelliJ] Java file outside of source root 에러 해결]]></title>
            <link>https://velog.io/@sleeee-dev/IntelliJ-Java-file-outside-of-source-root-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@sleeee-dev/IntelliJ-Java-file-outside-of-source-root-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Mon, 22 May 2023 13:04:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sleeee-dev/post/d6d9aa8b-9f44-4811-8afd-68f7eea70daf/image.png" alt="">
이런식으로 나오고 
Java file outside of source root 에러가 뜰 때 해결방법</p>
<blockquote>
<p>✅ 상위 프로젝트(study)를 열어서 일어나는 현상으로 보여서 내가 사용하려는 해당 폴더(java-std)만 따로 열어주면 해결</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/sleeee-dev/post/a515a29a-1d79-4174-a6c1-59c807487a7c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JUnit을 이용한 단위 테스트]]></title>
            <link>https://velog.io/@sleeee-dev/JUnit%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@sleeee-dev/JUnit%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Mon, 08 May 2023 11:56:03 GMT</pubDate>
            <description><![CDATA[<h2 id="🧩junit을-이용한-단위-테스트">🧩JUnit을 이용한 단위 테스트</h2>
<ul>
<li>어라운드 허브 스튜디오 강의(<a href="https://youtu.be/SFVWo0Z5Ppo">https://youtu.be/SFVWo0Z5Ppo</a>) 정리</li>
<li>수업 내용 추가 예정</li>
<li>JUnit5를 기준으로 작성</li>
</ul>
<h3 id="tdd">TDD</h3>
<p>: 테스트 주도 개발<br>최초 목표에 맞춘 테스트 코드를 작성 후 개발</p>
<ul>
<li>테스트 코드의 작성 목적<ul>
<li>코드의 안정성 ⬆</li>
<li>기능 추가, 변경시 발생되는 side-effect ⬇</li>
<li>목적을 분명히 함으로써 불필요한 코드 작성 ⬇</li>
</ul>
</li>
</ul>
<h3 id="junit">JUnit</h3>
<ol>
<li>JUnit?<ul>
<li>Java Test Framework</li>
<li>단위 테스트를 위한 도구 제공</li>
<li>어노테이션 기반</li>
<li>Assertion으로 테스트를 통과하면 어떤 결과가 나오는지 알 수 있음</li>
</ul>
</li>
<li>JUnit 모듈<ol>
<li>Jupiter<ul>
<li>JUnit5 구현</li>
<li>테스트의 실제 구현체는 별도 모듈 역할을 수행</li>
<li>개발자가 테스트 코드를 작성할 때 사용</li>
</ul>
</li>
<li>Platform<ul>
<li>테스트를 실행하기 위한 뼈대</li>
<li>테스트를 발견하고 계획을 생성하는 TestEngine 인터페이스 보유</li>
<li>수행결과 보고</li>
<li>IDE 연동 보조, 콘솔 출력</li>
</ul>
</li>
<li>Vintage<ul>
<li>JUnit3,4 구현하여 이전 버전의 테스트 코드 실행시 사용</li>
</ul>
</li>
</ol>
</li>
<li>JUnit LifeCycle Annotation</li>
</ol>
<table>
<thead>
<tr>
<th align="center">Annotation</th>
<th align="center">Description</th>
</tr>
</thead>
<tbody><tr>
<td align="center">@Test</td>
<td align="center">테스트용 메소드임을 표현</td>
</tr>
<tr>
<td align="center">@BeforeEach</td>
<td align="center">각 테스트 메소드가 시작되기 전에 실행되는 메소드</td>
</tr>
<tr>
<td align="center">@AfterEach</td>
<td align="center">각 테스트 메소드가 시작된 후 실행되는 메소드</td>
</tr>
<tr>
<td align="center">@BeforeAll</td>
<td align="center">전체 테스트 시작 전에 실행되는 메소드(static)</td>
</tr>
<tr>
<td align="center">@AfterAll</td>
<td align="center">전체 테스트 종료 후에 실행 되는 메소드(static)</td>
</tr>
</tbody></table>
<ol start="4">
<li>JUnit Main Annotation</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[REST API]]></title>
            <link>https://velog.io/@sleeee-dev/REST-API</link>
            <guid>https://velog.io/@sleeee-dev/REST-API</guid>
            <pubDate>Mon, 08 May 2023 11:53:57 GMT</pubDate>
            <description><![CDATA[<ul>
<li>230125~230127</li>
<li>학원수업, 네이버 부스트코스(웹 프로그래밍 풀스택) 강의 정리</li>
</ul>
<h2 id="rest-api">REST API</h2>
<p>: Representational State Transfer</p>
<p>SW엔지니어가 따라야하는 표준
APP 데이터 연결</p>
<p>HTTP 요청(GET,POST,DELETE)을 사용하여 URL파라미터에서 데이터를 추론할 수 있도록 코드를 정리할 수 있음
=&gt; 크로스 언어 통신 용이</p>
<p>URL은 JSON 문자열로 데이터를 반환</p>
<p><strong>HTTP Method 종류(CRUD)</strong><br>POST 생성,수정<br>GET 조회<br>PUT 수정, 생성<br>DELETE 삭제</p>
<h3 id="restful">RESTful</h3>
<p>: REST방식으로 서비스를 제공하는것을 의미</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring MVC에서의 쿠키&세션]]></title>
            <link>https://velog.io/@sleeee-dev/Spring-MVC%EC%97%90%EC%84%9C%EC%9D%98-%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98</link>
            <guid>https://velog.io/@sleeee-dev/Spring-MVC%EC%97%90%EC%84%9C%EC%9D%98-%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98</guid>
            <pubDate>Mon, 08 May 2023 11:52:29 GMT</pubDate>
            <description><![CDATA[<ul>
<li>230125~230127</li>
<li>학원수업, 네이버 부스트코스(웹 프로그래밍 풀스택) 강의 정리</li>
</ul>
<h2 id="spring-mvc에서의-cookie와-session의-사용">Spring MVC에서의 Cookie와 Session의 사용</h2>
<p>참고 : <a href="https://velog.io/@sleeee-dev/%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98">Servlet&amp;JSP&gt;&gt; 쿠키&amp;세션</a></p>
<h3 id="1쿠키">1.쿠키</h3>
<ul>
<li>HttpServletRequest는 특정 이름의 쿠키를 구하는 메소드를 가지고 있지 않음</li>
<li>그래서 기존에는 특정 이름의 쿠키를 구하기 위해 반복문을 사용하여 원하는 이름의 쿠키가 있는지 찾았음</li>
<li>But! Spring MVC에서 CookieValue애노테이션을 이용하면 쉽게 특정 이름의 쿠키 값을 구할 수 있음</li>
</ul>
<blockquote>
<h4 id="1-spring-mvc에서의-cookie-사용">1. Spring MVC에서의 Cookie 사용</h4>
</blockquote>
<ul>
<li>@CookieValue 애노테이션 사용<ul>
<li>컨트롤러 메소드의 파라미터에서 CookieValue애노테이션을 사용함으로써 원하는 쿠키정보를 파라미터 변수에 담아 사용할 수 있다<pre><code class="language-java">controllerMethod(@CookieValue(value=&quot;쿠키이름&quot;, required=false, defaultValue=&quot;기본값&quot;) String 변수명)</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="2세션">2.세션</h3>
<blockquote>
<h4 id="1-spring-mvc에서의-session-사용">1. Spring MVC에서의 Session 사용</h4>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Framework]]></title>
            <link>https://velog.io/@sleeee-dev/Spring-Framework</link>
            <guid>https://velog.io/@sleeee-dev/Spring-Framework</guid>
            <pubDate>Mon, 08 May 2023 11:50:28 GMT</pubDate>
            <description><![CDATA[<ul>
<li>230125~230127</li>
<li>학원수업, 네이버 부스트코스(웹 프로그래밍 풀스택) 강의 정리</li>
</ul>
<h2 id="1-spring-framework">1. Spring Framework</h2>
<ul>
<li>개발을 쉽고 편리하게 할 수 있도록 지원해주는 오픈소스 프레임워크 (= 경량급 애플리케이션 프레임워크)</li>
<li>여러개의 모듈로 구성</li>
<li>필요한 모듈만 선택해서 사용 가능 =&gt; 편리 (기본적인 core기능만 알아두고, 필요할때마다 공부하면 됨)</li>
</ul>
<h3 id="1-spring-bean">(1) Spring Bean</h3>
<ul>
<li>Spring이 관리하는 객체</li>
</ul>
<h3 id="2-spring-iocdi-컨테이너">(2) Spring IoC/DI 컨테이너</h3>
<ul>
<li>Spring에서 빈의 생성과 관계 설정, 사용, 제거 등의 기능을 담당하는 컨테이너</li>
<li>BeanFactory, ApplicationContext</li>
</ul>
<h4 id="컨테이너">컨테이너</h4>
<ul>
<li>인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공</li>
<li>서블릿과 웹 사이의 연결의 대신해주는 WAS의 역할?같은거</li>
</ul>
<h4 id="ioc--inversion-of-control-제어의-역전">IoC : Inversion of Control (제어의 역전)</h4>
<ul>
<li>개발자의 코드가 제어를 받는 상태</li>
<li>개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것</li>
</ul>
<h4 id="di--dependency-injection-의존성-주입">DI : Dependency Injection (의존성 주입)</h4>
<ul>
<li>클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것</li>
<li>즉 객체 생성 없이 객체를 호출할 수 있게 해줌</li>
<li>생성자 주입 <code>&lt;constructor-arg /&gt;</code></li>
<li>속성 접근자를 통한 주입 <code>&lt;property /&gt;</code></li>
<li>Spring의 DI 방법<ul>
<li>Constructor Injection : 생성자를 이용한 의존 관계 설정 방식</li>
<li>Setter Injection : setter 메소드를 이용한 의존 관계 설정 방식</li>
</ul>
</li>
</ul>
<h4 id="실습">실습</h4>
<pre><code class="language-java">    Engine e = new Engine();
    Car c = new Car();
    c.setEngine(e);</code></pre>
<ul>
<li>클래스에서 이렇게 생성해서 호출하던것을 spring의 .xml 파일에 다음과 같이 설정하여 자동으로 생성하도록!</li>
</ul>
<pre><code class="language-xml">    &lt;bean id=&quot;e&quot; class=&quot;kr.or.connect.diexam01.Engine&quot; /&gt;
    &lt;bean id=&quot;c&quot; class=&quot;kr.or.connect.diexam01.Car&quot;&gt;
        &lt;property name=&quot;engine&quot; ref=&quot;e&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;</code></pre>
<h3 id="3-aop">(3) AOP</h3>
<ul>
<li>예외처리, 중복코드 제거</li>
<li></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[VSC에서 Git 사용하기]]></title>
            <link>https://velog.io/@sleeee-dev/VSC%EC%97%90%EC%84%9C-Git-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sleeee-dev/VSC%EC%97%90%EC%84%9C-Git-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 08 May 2023 11:48:07 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-vsc에서-git-사용하기">✨ VSC에서 Git 사용하기</h2>
<h3 id="1-vs-code에서-git-연동시키기">1. VS Code에서 git 연동시키기</h3>
<ol>
<li>VSC에서 F1 &gt; git clone 검색</li>
<li>내 github 계정과 연동시키기</li>
<li>사용하려는 레포지터리와 연동시키기</li>
<li>내 local PC에서 저장 위치 지정하기</li>
<li>clone이 완료된 repo 열어서 수정하기</li>
</ol>
<h3 id="2-내장-terminal-사용해서-git-commit-하기">2. 내장 Terminal 사용해서 git commit 하기</h3>
<p>: 로컬에서 작성한 파일들을 원격 repo로 commit하기</p>
<ol>
<li>터미널 열기(Terminal-New Terminal)</li>
<li>git add .</li>
<li>git commit -m &quot;커밋 메시지&quot;</li>
<li>git push 원격저장소명 브랜치명<br>git clone으로 local에 복제 했을때 원격 저장소명은 origin<br>정확하게 확인하기 위해 git remote 혹은 git remote -v 사용<br>따로 브랜치를 만들지 않았다면 git push origin 입력하면 push 완료!</li>
<li>github에 제대로 반영되었는지 확인</li>
</ol>
<h3 id="3-vs-code-gui-사용해서-git-commit하기">3. VS code GUI 사용해서 git commit하기</h3>
<p>: Git GUI - git 명령어를 그래픽으로 구현하여 마우스 클릭으로 편리하게 사용 ex)소스트리</p>
<ol>
<li>사이드바에서 Source Control 아이콘 선택<br>: Changes에서 그동안 수정된 파일들을 확인할 수 있다.</li>
<li>Changes에서 commit할 파일들만 +(Stage Changes) 누르기<br>: 전부 다 commit 할거면 Changes 옆에 + 누르기</li>
<li>맨 위에 Commit 버튼 누르기<br>: 커밋 메시지 입력창이 뜨면 입력후 엔터</li>
<li>마우스 우클릭 -&gt; Push<br>: push 완료!</li>
<li>github에 제대로 반영되었는지 확인</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Github로 협업하기]]></title>
            <link>https://velog.io/@sleeee-dev/Github%EB%A1%9C-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sleeee-dev/Github%EB%A1%9C-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 08 May 2023 11:47:28 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-github로-협업하기">✨ Github로 협업하기</h2>
<h3 id="0-준비--git-bash-실행--git-clone">0. 준비 : git bash 실행 &amp; git clone</h3>
<pre><code>git bash 실행
cd 경로입력 #협업할 프로젝트 파일 경로복붙 (shift + insert or 탐색기에서 주소 드래그앤드롭)

또는, 협업중인 프로젝트 폴더에서 git bash 실행 : cd 경로입력 할 필요없이 자동으로 그 경로에서 git bash 실행
git init #git 초기화
git clone 프로젝트url</code></pre><h3 id="1-로컬-저장소에서-sub-브랜치-만들기">1. 로컬 저장소에서 sub 브랜치 만들기</h3>
<pre><code>탐색기 -&gt; 작업하려는 프로젝트 폴더에서 마우스 우클릭 -&gt; git bash 실행 (cd 경로 입력 없이 바로 실행)

git branch -m main #초기에 master로 설정된 브랜치 이름을 main으로 변경
git branch 브랜치명 #sub브랜치 생성
git checkout branch이름   # 내 로컬 저장소에서 main브랜치 -&gt; sub 브랜치로 이동(전환)하기

이렇게 만든 sub브랜치에서 작업하기!</code></pre><h3 id="2-로컬-저장소와-원격-저장소-연결하기">2. 로컬 저장소와 원격 저장소 연결하기</h3>
<pre><code>탐색기 -&gt; 작업하려는 프로젝트 폴더에서 마우스 우클릭 -&gt; git bash 실행 (cd 경로 입력 없이 바로 실행)

git checkout branch이름   # 내 로컬 저장소에서 main브랜치 -&gt; sub 브랜치로 이동(전환)하기
git remote -v #원격 저장소에서 가져온 파일 있는지 확인 -&gt; 연결한게 없으면 안나옴
git remote add origin 깃repo주소 #현재 협업중인 git repository 가져오기
git remote -v #가져온 repo 확인
git pull origin main #내 로컬저장소의 지정한 폴더로 git hub repository 파일 가져오기

프로젝트 파일이 제대로 다 들어왔는지 확인하기</code></pre><h3 id="3-내-작업물을-원격-저장소에-옮겨서-pull-requests">3. 내 작업물을 원격 저장소에 옮겨서 Pull Requests</h3>
<pre><code>탐색기 -&gt; 가져오려는 프로젝트 폴더에서 마우스 우클릭 -&gt; git bash 실행 (cd 경로 입력 없이 바로 실행)

git checkout branch이름   # 내 로컬 저장소에서 main브랜치 -&gt; sub 브랜치로 이동(전환)하기 (이미 해당 브랜치 위치면 안해도 됨)
git remote -v #원격저장소 연결 확인(안되어있으면 2번으로 가서 연결)
git add . #로컬저장소에서 작업한 전체 파일 올리기
git commit -m &quot;커밋 내용&quot; #커밋 내용에는 깃허브에 올라갈때 어떤 부분 수정했는지 참고사항들 적어두면 구분하기 편함

#push하는 방법 여러가지..
git push origin 브랜치명 #생성한 브랜치 이름으로 push
git push -u 로컬브랜치명 원격브랜치명 #내 로컬 브랜치 -&gt; 원격브랜치로 push
git push -u 로컬저장소명 +원격브랜치명
#위에서 git rejected non-fast-forward 오류 발생시 브랜치명 앞에 +붙여서 하면 잘됨 (gitignore 파일이나 readme 파일 오류라고 함..)



Pull requests에 Compare &amp; pull request 뜬거 확인
Pull req 내용 작성 후 Cretae pull request 버튼 클릭(잘못 올린 pull req는 close request 누르면 취소된다.)</code></pre><h3 id="4-팀장의-merge-후-협업중인-github-repository-원격저장소와-내-로컬-저장소-동기화-하기">4. 팀장의 merge 후 협업중인 github repository 원격저장소와 내 로컬 저장소 동기화 하기</h3>
<p>일단 내 로컬 저장소의 작업물들이 모두 commit 되어야하므로 3번으로 커밋까지 실행시키고 온다.</p>
<pre><code>탐색기 -&gt; 가져오려는 프로젝트 폴더에서 마우스 우클릭 -&gt; git bash 실행 (cd 경로 입력 없이 바로 실행)

git checkout branch이름   #내 로컬 저장소에서 main브랜치 -&gt; sub 브랜치로 이동(전환)하기
git pull father  merge가 끝난 원본 코드와 동기화

** 고민중인 부분
* git branch -d develop # 작업이 끝난 브랜치 삭제 : pullreq할때마다 만들기? 그냥 삭제 안하고 놔두기? -&gt; 일단은 삭제 안하고 계속 작업</code></pre><h3 id="4-2-동기화가-잘-안될때-원격-저장소-repo-그냥-덮어쓰기">4-2. 동기화가 잘 안될때 원격 저장소 repo 그냥 덮어쓰기</h3>
<p>깃허브로 원격 저장소에 있는 main 브랜치 작업물을 가져올때<br>내 서브 브랜치에서 커밋을 하지 않아서 메인 브랜치로 이동이 안된다거나.. 뭐 그런이유로 잘 안될때<br>이경우에 함부로 건들기가 힘들다면..<br>일단 내 작업물 복사해서 다른곳에 백업하고 다음과 같이 실행한다.</p>
<pre><code>탐색기 -&gt; 가져오려는 프로젝트 폴더에서 마우스 우클릭 -&gt; git bash 실행 (cd 경로 입력 없이 바로 실행)

git checkout branch이름   #내 로컬 저장소에서 main브랜치 -&gt; sub 브랜치로 이동(전환)하기
git remote -v   #현재 연결되어있는 원격 저장소 확인하기
git fetch origin   #연결되어있는 원격 저장소의 최신 업데이트 내용 가져오기
git reset --hard origin/main   #연결되어있는 원격 저장소의 main 브랜치의 가장 최신 업데이트 내용으로 내 sub branch에 덮어쓰기</code></pre><h3 id="알아두면-편한-그외-명령어">알아두면 편한 그외 명령어</h3>
<pre><code>git checkout -b 브랜치명 #git branch + git checkout 한번에 하는 명령어
git add 파일명 #지정한 파일만 올리기
git branch #내 브랜치 목록보기</code></pre><h3 id="git-hub-복구하기">git hub 복구하기</h3>
<p>pull push등의 실수로 작업물이 날아간 경우 복구하기</p>
<pre><code>git reflog #명령어로 삭제된 commit id 확인하기
git reset --hard 커밋해시id #3fe4da 등 삭제된 커밋 복구하기

git reflog 또는 git reflog |grep #브랜치명으로 log확인
git checkout -b &lt;삭제한 브랜치명&gt; &lt;커밋해시id&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[쿠키&세션]]></title>
            <link>https://velog.io/@sleeee-dev/%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98</link>
            <guid>https://velog.io/@sleeee-dev/%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98</guid>
            <pubDate>Mon, 08 May 2023 11:45:16 GMT</pubDate>
            <description><![CDATA[<ul>
<li>네이버 부스트 코스 강의(웹 프로그래밍 풀스택) 정리</li>
</ul>
<h2 id="상태-유지-기술-cookie--session">상태 유지 기술 (Cookie &amp; Session)</h2>
<p>Http프로토콜은 상태유지가 되지 않음<br>상태 유지를 위해 Cookie와 Session 기술을 사용   </p>
<h3 id="1쿠키cookie">1.쿠키(Cookie)</h3>
<ul>
<li><p>클라이언트 단에 저장되는 작은 정보의 단위</p>
</li>
<li><p>사용자 컴퓨터에 저장</p>
</li>
<li><p>유출 위험 O</p>
</li>
<li><p>유효 시간이 지나면 사라짐</p>
</li>
<li><p>클라이언트에서 생성하고 저장될 수 있고, 서버단에서 전송한 쿠키가 클라이언트에 저장될 수 O   </p>
</li>
<li><p>서버에서 쿠키 생성, Response의 addCookie 메소드를 이용해 클라이언트에게 전송</p>
<pre><code class="language-java">Cookie cookie = new Cookie(name, value);
response.addCookie(cookie); </code></pre>
</li>
<li><p>클라이언트가 보낸 쿠키 정보 읽기   </p>
<pre><code class="language-java">Cookie [] cookies = request.getCookies();</code></pre>
</li>
<li><p>쿠키 값이 없으면 null 반환(이걸 생각하고 코드 짜야함!)   </p>
</li>
<li><p>Cookie가 가지고 있는 getName()과 getValue() 메소드를 이용해서 원하는 쿠키 정보를 찾아 사용   </p>
</li>
<li><p>알파벳과 숫자로만 구성   </p>
</li>
<li><p>쿠키의 유효기간 설정</p>
<ul>
<li>메소드 setMaxAge()   <ul>
<li>초 단위</li>
<li>0은 쿠키 삭제</li>
<li>음수는 브라우저 종료   </li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<h4 id="쿠키-동작-순서">쿠키 동작 순서</h4>
<p>(1) 웹 클라이언트 -&gt; WAS에 유지할 정보를 요청<br>(2) WAS 에서 유지할 정보를 갖고 쿠키 생성 (이름, 값)<br>(3) WAS -&gt; 웹 클라이언트에 응답결과 전송 (쿠키 포함)<br>(4) 웹 클라이언트 -&gt; WAS 쿠키 포함 정보 요청<br>(5) WAS에서 쿠키를 받아 검사(갖고 있는 쿠키라면 유지해야하는 정보, 이전에 접속했던 정보 판별)   </p>
</blockquote>
<h3 id="2세션session">2.세션(Session)</h3>
<ul>
<li>클라이언트 별로 서버에 저장되는 정보(ex. 로그인 정보, 장바구니 정보 등)</li>
<li>서버 종료 or 유효 시간이 지나면 사라짐</li>
<li>session id 생성하고 이를 이용해서 key와 value를 이용한 저장소인 Http</li>
<li>세션은 서버에서 알아서 만들기 때문에 new로 생성 X</li>
<li>HttpSession에 요청해서 얻어옴<pre><code class="language-java">//둘 다 같은 의미
HttpSession = request.getSession(); 
HttpSession session = request.getSession(true); </code></pre>
<ul>
<li>클라이언트로부터 받아온 req에서 쿠키가 있는지 없는지 확인   </li>
<li>생성된 세션이 있다면 세션 반환, 없다면 새로 생성해서 반환<pre><code class="language-java">HttpSession session = request.getSession(false); </code></pre>
</li>
<li>생성된 세션이 있다면 세션 반환, 없다면 null을 반환   </li>
</ul>
</li>
</ul>
<blockquote>
<h4 id="세션의-값-저장">세션의 값 저장</h4>
<p> <code>setAttribute(String name, Object value);</code><br>     - name과 value의 쌍으로 객체 Object를 저장하는 메소드<br>     - 세션이 유지되는 동안 저장할 자료를 저장<br>     <code>session.setAttribute(이름, 값);</code>   </p>
</blockquote>
<p><code>getAttribute(String name)</code> 메소드   </p>
<ul>
<li>세션에 저장된 자료는 다시 getAttribute(String name) 메소드를 이용해 조회      </li>
<li>주의) 반환 값은 Object 유형이므로 저장된 객체로 자료유형 변환이 필요   </li>
<li>메소드 setAttribute()에 이용한 name인 “id”를 알고 있다면 바로 다음과 같이 바로 조회<br><code>String value = (String) session.getAttribute(&quot;id&quot;);</code>   </li>
</ul>
<blockquote>
<h4 id="세션의-값-삭제">세션의 값 삭제</h4>
</blockquote>
<p>removeAttribute(String name) 메소드</p>
<ul>
<li>name값에 해당하는 세션 정보를 삭제합니다.
invalidate() 메소드</li>
<li>모든 세션 정보를 삭제</li>
</ul>
<blockquote>
<h4 id="세션-동작-순서">세션 동작 순서</h4>
<p>(1) 웹 클라이언트 -&gt; WAS에 유지할 정보를 요청<br>(2) WAS : 클라이언트를 식별하는 세션키(session id) 생성<br>(3) WAS : 세션키를 이용해서 key와 value를 이용한 저장소인 HttpSession 생성<br>(4) WAS : 세션키를 저장하고 있는 쿠키 생성<br>(5) WAS -&gt; 웹 클라이언트에 응답결과 전송 (쿠키 포함)<br>(6) 웹 클라이언트 -&gt; WAS에 정보 요청. 이때, session id를 가지고 있는 쿠키도 함께 전송<br>(7) WAS : 쿠키의 세션키를 이용해 이전에 생성한 저장소를 찾아서 활용(정보 저장, 정보 찾기 등)<br>이때, 세션의 정보 담기 위해 생성되는 객체 : Http객체   </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP]]></title>
            <link>https://velog.io/@sleeee-dev/3.JSP</link>
            <guid>https://velog.io/@sleeee-dev/3.JSP</guid>
            <pubDate>Mon, 08 May 2023 11:43:56 GMT</pubDate>
            <description><![CDATA[<ul>
<li>네이버 부스트 코스 강의(웹 프로그래밍 풀스택) 정리</li>
</ul>
<blockquote>
<h2 id="jsp">JSP</h2>
</blockquote>
<ul>
<li>html안에 java 프로그래밍을 넣을 수 있는것</li>
<li>JSP가 실행되면 html이 아니라 Servlet으로 바뀌어서 실행되는 것.</li>
<li>그래서 Servlet Lifecycle과 같은 방식으로 실행됨</li>
</ul>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;</code></pre><p>: 페이지 지시자. JSP의 WAS</p>
<p>&lt;% %&gt; : 스크립트릿. 자바 코드를 넣어서 실행할 수 있는 부분</p>
<p>&lt;%= %&gt; : 표현식. JSP페이지에서 웹브라우저에 출력할 부분 표현.
스크립트릿내에서 응답 결과에 넣고 싶은 자바코드가 들어가는 부분. 서블릿에서 out.print(); 에 해당
service 메서드 안에서 실행.</p>
<p>cf. System.out.print(); : 콘솔에 출력</p>
<p>&lt;%! %&gt; : 선언문. service 메서드 바깥에 만들어짐</p>
<p>&lt;%-- --&gt; : jsp 주석
&lt;!-- --&gt; : html 주석
//, /* */ : java 주석</p>
<p>jsp 실행시켰을 때 html, java 주석은 서블릿에 포함되지만 jsp 주석은 포함 X</p>
<blockquote>
<h3 id="jsp-lifecycle">JSP Lifecycle</h3>
</blockquote>
<blockquote>
<h4 id="jsp의-실행순서">JSP의 실행순서</h4>
</blockquote>
<ol>
<li>브라우저가 웹서버에 JSP에 대한 요청 정보를 전달한다.</li>
<li>브라우저가 요청한 JSP가 최초로 요청했을 경우만 JSP로 작성된 코드가 서블릿으로 코드로 변환한다. (java 파일 생성)</li>
<li>서블릿 코드를 컴파일해서 실행가능한 bytecode로 변환한다. (class 파일 생성)</li>
<li>서블릿 클래스를 로딩하고 인스턴스를 생성한다.<ul>
<li>jspInit() 호출, 초기화</li>
</ul>
</li>
<li>서블릿이 실행되어 요청을 처리하고 응답 정보를 생성한다.<ul>
<li>_jspService() 호출, 요청 처리</li>
</ul>
</li>
<li>jspDestroy() 호출, 서블릿 클래스 인스턴스 파괴</li>
</ol>
<p>=&gt; 서블릿의 lifecycle과 같음</p>
<blockquote>
<h3 id="jsp-내장객체">JSP 내장객체</h3>
<img src="https://cphinf.pstatic.net/mooc/20180130_74/1517275973733EL11k_PNG/2_3_4_jsp_.PNG">
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Servlet]]></title>
            <link>https://velog.io/@sleeee-dev/2.Servlet</link>
            <guid>https://velog.io/@sleeee-dev/2.Servlet</guid>
            <pubDate>Mon, 08 May 2023 11:42:50 GMT</pubDate>
            <description><![CDATA[<ul>
<li>네이버 부스트 코스 강의(웹 프로그래밍 풀스택) 정리</li>
</ul>
<blockquote>
<h2 id="servlet">Servlet</h2>
</blockquote>
<p>: 자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할</p>
<ul>
<li>정의<ul>
<li>WAS에서 동작하는 java 클래스</li>
<li>HttpServlet 클래스를 상속 받아야함</li>
<li>JSP와 조화로운 사용 필요</li>
</ul>
</li>
</ul>
<blockquote>
<h4 id="java-ee-vs-java-perspective">Java EE vs Java Perspective</h4>
</blockquote>
<p>Java EE : 웹 어플리케이션을 만들때 조금 더 편한 환경 제공<br>Java : 자바 어플리케이션을 만들때 조금 더 편한 환경 제공</p>
<blockquote>
<h3 id="자바-웹-어플리케이션">자바 웹 어플리케이션</h3>
</blockquote>
<p>웹 어플리케이션 생성<br>WAS 설정 (Target - 톰캣 경로 설정)</p>
<p>서블릿 생성<br>서블릿 : URL 요청을 처리하는 프로그램<br>URL Mapping : 클래스가 WAS에 배포될 때 사용할 이름 지정</p>
<p><a href="http://localhost:8080/%7B%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%B4%EB%A6%84%7D/%7BURLMapping%EA%B0%92%7D">http://localhost:8080/{프로젝트이름}/{URLMapping값}</a></p>
<p>웹 브라우저가 GET Method방식으로 요청할 때, 서블릿의 doGet Method가 호출된다.<br>GET Method : 웹 브라우저가 서버에게 문서를 요청할 때 사용하는 방식</p>
<pre><code class="language-java">package examples;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet(&quot;/HelloServlet&quot;)
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(&quot;text/html;charset=UTF-8&quot;); //응답 결과 타입 설정
        PrintWriter out = response.getWriter();
        out.println(&quot;&lt;h1&gt;Hello World&lt;/h1&gt;&quot;); //출력할 내용
    }

}
</code></pre>
<blockquote>
<h4 id="자바-웹-어플리케이션-폴더-구조">자바 웹 어플리케이션 폴더 구조</h4>
</blockquote>
<img src="https://cphinf.pstatic.net/mooc/20180124_133/15167752967943AqfC_PNG/1_5_1_____.PNG">

<blockquote>
<h4 id="서블릿-작성-방법">서블릿 작성 방법</h4>
</blockquote>
<ol>
<li>3.0 이상<br>@WebServlet(&quot;/URL Mapping&quot;) 어노테이션 사용</li>
<li>3.0 미만<br>web.xml 파일에 직접 등록</li>
</ol>
<blockquote>
<h4 id="servlet-lifecycle서블릿-생명주기">Servlet Lifecycle(서블릿 생명주기)</h4>
</blockquote>
<p>System.out.println(); : 콘솔에 출력</p>
<p>response 객체로 부터 얻어 온 PrintWriter 객체 out : 응답 결과를 보내줌</p>
<ol>
<li>서블릿 요청 -&gt; 해당 클래스가 메모리에 있는지 확인</li>
<li>없을시 새로운 객체 생성</li>
</ol>
<ul>
<li>init() 호출</li>
<li>service() 호출</li>
</ul>
<ol start="3">
<li>새로고침시 서블릿 요청 새로 -&gt; 서블릿이 메모리에 있으므로 서블릿이 다시 생성 X service만 호출</li>
<li>서블릿 수정(어플리케이션 갱신/WAS 종료) 시 메모리에 올라가있는 서블릿 객체는 사용 불가 -&gt; 객체 소멸</li>
<li>새로운 객체 생성</li>
</ol>
<ul>
<li>init() 호출</li>
<li>service() 호출</li>
</ul>
<img src ="https://cphinf.pstatic.net/mooc/20180124_22/1516782982944xjogH_PNG/1_5_3_ServletLifcycle.PNG">

<img src ="https://cphinf.pstatic.net/mooc/20180124_79/15167843899250uB2H_PNG/1_5_4_request_response.PNG">

<p>service
doGet
doPost</p>
<p>request, reponse</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP]]></title>
            <link>https://velog.io/@sleeee-dev/1.-HTTP</link>
            <guid>https://velog.io/@sleeee-dev/1.-HTTP</guid>
            <pubDate>Mon, 08 May 2023 11:40:12 GMT</pubDate>
            <description><![CDATA[<ul>
<li>네이버 부스트 코스 강의(웹 프로그래밍 풀스택) 정리</li>
</ul>
<blockquote>
<h2 id="http-웹-프로토콜의-이해">HTTP 웹 프로토콜의 이해</h2>
</blockquote>
<ul>
<li>인터넷<br>이름 : WWW<br>프로토콜 : HTTP<br>포트 : 80<br>기능 : 웹 서비스</li>
</ul>
<blockquote>
<h3 id="http-hypertext-transfer-protocol">HTTP (Hypertext transfer Protocol)</h3>
</blockquote>
<ul>
<li>서버와 클라이언트가 인터넷상에서 데이터를 주고받기 위한 프로토콜</li>
<li>어떤 종류의 데이터도 전송할 수 있음 (오디오, 비디오, 텍스트, 이미지 등)</li>
</ul>
<blockquote>
<h3 id="http-작동-방식">HTTP 작동 방식</h3>
</blockquote>
<ul>
<li>서버/클라이언트 모델을 따름<br>클라이언트가 서버에 요청<br>요청을 받은 서버가 클라이언트에 응답을 보냄</li>
<li>무상태 프로토콜<br>응답후에 서버가 클라이언트와의 연결을 끊어버리기 때문에 이전 상황을 알 수가 없음<br>이는 이전의 클라이언트와 지금의 클라이언트가 같은지 다른지 구분을 할 수 없다는 것을 의미<br>그러므로 불특정 다수를 대상으로 하는 서비스에는 적합(ex.공유폴더)</li>
</ul>
<blockquote>
<h3 id="url-uniform-resource-locator">URL (Uniform Resource Locator)</h3>
</blockquote>
<ul>
<li>인터넷 상의 자원의 위치</li>
<li>특정 웹 서버의 특정 파일에 접근하기 위한 경로 혹은 주소</li>
<li>접근프로토콜://ip주소or도메인이름/문서의경로/문서이름<br><a href="http://www.domain.co.kr/docs/index.html">http://www.domain.co.kr/docs/index.html</a></li>
<li>하나의 물리적 컴퓨터에는 여러개의 소프트웨어 서버가 동작할 수 있는데 이 서버의 포트값은 모두 다르게 동작해야 한다.<br>http서버의 기본 포트값은 80</li>
</ul>
<blockquote>
<h3 id="http-작동-순서">HTTP 작동 순서</h3>
</blockquote>
<ol>
<li><p>connect : 클라이언트가 원하는 서버에 접속한다.</p>
</li>
<li><p>request : 클라이언트가 서버에 정보를 요청한다.<br>요청 데이터 포맷<br>1.요청 헤더 : GET/servlet/query?id=id&amp;pw=10<br>요청 메소드(GET/POST/PUT/PUSH/DELETE/...)
요청uri :요청하는 자원의 위치 명시<br>HTTP프로토콜의 버전 명시<br>2.요청 바디<br>요청메소드의 방식에 따라 다름<br>GET방식은 요청 바디가 없음<br>POST/PUT일때 들어옴</p>
</li>
<li><p>response : 서버는 클라이언트 요청에 따른 응답 결과를 클라이언트에 전달한다.<br>1.응답 헤더<br>2.응답 바디</p>
</li>
<li><p>close : 서버와의 연결이 종료된다.</p>
</li>
</ol>
<blockquote>
<h3 id="요청-메소드">요청 메소드</h3>
</blockquote>
<table>
<thead>
<tr>
<th align="center">요청메소드</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td align="center">GET</td>
<td>정보를 요청(SELECT)</td>
</tr>
<tr>
<td align="center">POST</td>
<td>정보를 저장(INSERT)</td>
</tr>
<tr>
<td align="center">PUT</td>
<td>정보를 업데이트(UPDATE)</td>
</tr>
<tr>
<td align="center">DELETE</td>
<td>정보를 삭제(DELETE)</td>
</tr>
<tr>
<td align="center">HEAD</td>
<td>HTTP헤더 정보만 요청</td>
</tr>
<tr>
<td align="center">OPTIONS</td>
<td>웹 서버가 지원하는 메소드 종류 요청</td>
</tr>
<tr>
<td align="center">TRACE</td>
<td>클라이언트의 요청을 그대로 반환</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PL/SQL] 커서(Cursor)]]></title>
            <link>https://velog.io/@sleeee-dev/PLSQL-%EC%BB%A4%EC%84%9CCursor</link>
            <guid>https://velog.io/@sleeee-dev/PLSQL-%EC%BB%A4%EC%84%9CCursor</guid>
            <pubDate>Sun, 07 May 2023 07:07:24 GMT</pubDate>
            <description><![CDATA[<h2 id="커서cursor">커서(Cursor)</h2>
<ul>
<li><p>sql문을 실행할때마다 sql문 처리를 위한 메모리공간을 사용하는데 이를 접근하기 위해 커서를 사용한다.</p>
</li>
<li><p>커서의 단계
1) 커서 선언하기
2) 커서 오픈하기
3) 커서에서 추출한 결과 저장하기
4) 커서닫기
예1) </p>
<pre><code class="language-sql">SET SERVEROUTPUT ON
DECLARE
  ENO NUMBER(4);
  DNAME VARCHAR2(10);
  ESAL NUMBER(7);
  CURSOR C1 --커서 선언
  IS
      SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO=10;
BEGIN
  OPEN C1 --커서 오픈
  LOOP
      FETCH C1 INTO ENO,ENAME,ESAL; --커서에서 추출한 결과 변수에 저장하기
      EXIT WHEN C1%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(ENO||&#39; &#39;||ENAME||&#39; &#39;||ESAL);
  END LOOP;
  CLOSE C1; --커서 닫기
END;
/</code></pre>
<p>결과</p>
<pre><code class="language-sql">7782 CLARK 2450
7839 KING 5000
7934 MILLER 1300
2000 이씨 1000</code></pre>
<p>예2) 모든 사원번호,사원이름,급여,급여가3000이상이면 높음,2000이상이면 보통, 2000미만이면 낮음을 출력하세요.</p>
<pre><code class="language-sql"></code></pre>
</li>
</ul>
<pre><code>
Q1) 커서를 사용해서 모든 사원의 이름,급여,전체사원의 급여합을 구해서 출력해 보세요.
```sql

</code></pre><p>예3) 각 부서의 급여합 구하기</p>
<pre><code class="language-sql">DECLARE</code></pre>
<p>Q2) 커서를 사용해서 모든 사원번호,이름,부서명,급여,보너스,부서번호를 출력하는 프로시져를 만들고 사용해 보세요. 보너스는 부서번호가 10번이면 급여의 10%, 부서번호가 20번이면 급여의 20%, 부서번호가 30번이면 급여의 30%</p>
<pre><code class="language-sql"></code></pre>
<ul>
<li>기타)
1) DECODE(대상컬럼,
조건1,결과값1,
조건2,결과값2,
..,
기본값) 별칭       </li>
</ul>
<p>예) 직업이 &#39;ANALIST&#39;이면 급여의 10%, 직업이 &#39;CLERK&#39;이면 급여의 20%, 직업이 &#39;SALESMAN&#39;이면 급여의 30% 가 보너스로 지급된다. 사원번호,직업,급여,보너스를 구해서 출력해 보세요.</p>
<pre><code class="language-sql">SQL&gt; SELECT EMPNO
            ,JOB
            ,SAL
            ,DECODE(JOB,
                       &#39;ANALIST&#39;,SAL*0.1,
                       &#39;CLERK&#39;,SAL*0.2,
                       &#39;SALESMAN&#39;,SAL*0.3,
                        SAL) AS BONUS
         FROM EMP;

         EMPNO JOB                       SAL      BONUS
    ---------- ------------------ ---------- ----------
          7369 CLERK                     800        160
          7499 SALESMAN                 1600        480
          7521 SALESMAN                 1250        375
          7566 MANAGER                  2975       2975
          7654 SALESMAN                 1250        375
          7698 MANAGER                  2850       2850</code></pre>
<p>2) CASE WHEN 조건1 THEN 결과값1
        WHEN 조건2 THEN 결과값2
        WHEN 조건3 THEN 결과값3
        ..
        ELSE 기본값
   END 별칭;</p>
<p>예) 각 부서별 평균급여를 구하고 평균급여가 3000이상이면 높음, 2000이상이면 보통,1000이하이면 낮음을 출력하시오.</p>
<pre><code class="language-sql">SELECT DEPTNO,AVG(SAL),
    CASE WHEN AVG(SAL)&gt;=3000 THEN &#39;높음&#39;
         WHEN AVG(SAL)&gt;=2000 THEN &#39;보통&#39;
         WHEN AVG(SAL)&gt;=1000 THEN &#39;낮음&#39;
         ELSE &#39;판단불가&#39; 
    END &quot;평가&quot;
    FROM EMP
    GROUP BY DEPTNO;

       DEPTNO   AVG(SAL) 평가
    --------- ---------- ------------
           30 1566.66667 낮음
           20 2258.33333 보통
           10 2916.66667 보통</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PL/SQL] 사용자정의 함수(Stored Function)]]></title>
            <link>https://velog.io/@sleeee-dev/PLSQL-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%A0%95%EC%9D%98-%ED%95%A8%EC%88%98Stored-Function</link>
            <guid>https://velog.io/@sleeee-dev/PLSQL-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%A0%95%EC%9D%98-%ED%95%A8%EC%88%98Stored-Function</guid>
            <pubDate>Sun, 07 May 2023 07:06:58 GMT</pubDate>
            <description><![CDATA[<h2 id="사용자정의-함수stored-function">사용자정의 함수(Stored Function)</h2>
<ul>
<li>사용자가 만든 함수이며 어떤 연산을 수행한 뒤 결과값을 반환한다.</li>
<li>형식)<pre><code class="language-sql">CREATE OR REPLACE FUNCTION 함수명(파라미터,..)
RETURN 리턴형
IS
  변수선언;
BEGIN
  실행문장;
  ..
  RETURN 값;
END;
/</code></pre>
</li>
<li>예1) 입력받은 값으로부터 10%의 세율을 구하는 함수<pre><code class="language-sql">CREATE OR REPLACE FUNCTION TAX(N NUMBER)
RETURN NUMBER
IS
  VAL NUMBER(10,3);
BEGIN
  VAL := N*0.1;
  RETURN VAL;
END;
/
</code></pre>
</li>
</ul>
<p>SELECT TAX(1000) FROM DUAL;</p>
<pre><code>결과)
```sql
 TAX(1000)
----------
       100</code></pre><ul>
<li>Q1) 파라미터로 정수를 전달받아 그 수만큼 1부터 더해진 값을 리턴하는 함수를 만들고 사용해 보세요.<pre><code class="language-sql">
</code></pre>
</li>
</ul>
<pre><code>

Q2) 두 수를 파라미터로 전달받아 두 수중 큰값을 리턴하는 함수를 만들고 사용해 보세요.
```sql
END;
/

SELECT MYMAX(1,2) FROM DUAL;</code></pre><p>Q3) 파라미터로 사원번호를 전달받아 근무하는 부서명을 반환하는 함수를 만들고사용해 보세요.</p>
<pre><code class="language-sql">CREATE OR REPLACE FUNCTION DEPTNAME(NUM EMP.EMPNO%TYPE)
RETURN VARCHAR2
IS
    E_DNAME VARCHAR2(20); --부서명이 저장될 변수
BEGIN
    SELECT D.DNAME INTO E_DNAME
    FROM EMP E,DEPT D
    WHERE E.DEPTNO=D.DEPTNO AND E.EMPNO=NUM;
    RETURN E_DNAME;
END;
/

SELECT DEPTNAME(7369) FROM DUAL;</code></pre>
<p>결과</p>
<pre><code class="language-sql">DEPTNAME(7369)   
---------------
RESEARCH</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PL/SQL] PL/SQL 기본구조]]></title>
            <link>https://velog.io/@sleeee-dev/PLSQL-PLSQL-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@sleeee-dev/PLSQL-PLSQL-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sun, 07 May 2023 07:06:33 GMT</pubDate>
            <description><![CDATA[<h2 id="plsql">PL/SQL</h2>
<p>구조적인 SQL언어와 달리 SQL를 절차적인 방식에 의해 사용하도록 설계한 언어.
PL/SQL의 단위는 블록이며 하나의 블록은 아래와 같은 세부분으로 나뉜다.</p>
<p>(1) 선언부 : 변수나 상수를 선언하는 부분 
(2) 실행부 : 실제 처리할 로직을 담당하는 부분
(3) 예외처리부 : 실행부에서 처리하던 중 발생하는 각종 오류에 대한 처리 부분</p>
<h3 id="1-plsql의-구조">1. PL/SQL의 구조</h3>
<pre><code class="language-sql">DECLARE            -- 선언부
변수선언
BEGIN              -- 실행부
실행구문
EXCEPTION          -- 예외처리
예외처리구문    
END;
/  -- PL/SQL실행


예1) 
SET SERVEROUTPUT ON
DECLARE
    I_MSG VARCHAR2(20);
BEGIN
    I_MSG :=&#39;HELLO&#39;;
    DBMS_OUTPUT.PUT_LINE(&#39;MSG:&#39; || I_MSG);
END;
/
결과
MSG:HELLO

예2)
DECLARE
    NUM1 NUMBER(4);
    NUM2 NUMBER(4);
    NUM3 NUMBER(4);
BEGIN
    NUM1 := &amp;NUM1; --데이터 입력받기
    NUM2 := &amp;NUM2;
    NUM3 := NUM1+NUM2;
    DBMS_OUTPUT.PUT_LINE(NUM1||&#39;+&#39;||NUM2||&#39;=&#39;||NUM3);
END;
/
결과
1+3=4</code></pre>
<h3 id="2-if--else-문">2. IF ~ ELSE 문</h3>
<pre><code class="language-sql">형식1)
IF 조건식 THEN
실행문;
ELSE
실행문;
END IF;

형식2)
IF 조건식 THEN
실행문;
ELSIF 조건식 THEN
실행문;
ELSIF 조건식 THEN
실행문;
..
END IF;

예1) 정수 입력받아 짝수인지 홀수인지 판별
DECLARE
    NUM1 NUMBER(5);
BEGIN
    NUM1 := &amp;NUM1; --데이터 입력받기
    IF NUM1 MOD 2 = 0 THEN
        DBMS_OUTPUT.PUT_LINE(NUM1||&#39;은 짝수&#39;);
    ELSE
        DBMS_OUTPUT.PUT_LINE(NUM1||&#39;은 홀수&#39;);
    END IF;
END;
/

Q1) 두 정수를 입력받아 두 수중 큰 수 구하기
DECLARE
    NUM1 NUMBER(5);
    NUM2 NUMBER(5);
BEGIN
    NUM1 := &amp;NUM1; --데이터 입력받기
    NUM2 := &amp;NUM2;
    IF NUM1&gt;NUM2 THEN
        DBMS_OUTPUT.PUT_LINE(&#39;둘 중 더 큰 수는 &#39;||NUM1);
    ELSE
        DBMS_OUTPUT.PUT_LINE(&#39;둘 중 더 큰 수는 &#39;||NUM2);
    END IF;
END;
/

Q2) 두 점수를 입력받아 평균이 80이상이면 &#39;합격&#39; 아니면 &#39;불합격&#39; 출력하기
DECLARE
    NUM1 NUMBER(5);
    NUM2 NUMBER(5);
    NUM3 NUMBER(5);
BEGIN
    NUM1 := &amp;NUM1;
    NUM2 := &amp;NUM2;
    NUM3 := (NUM1+NUM2)/2;
    --평균을 나타내는 변수이름을 AVG 라고 할수 없음
    --ORACLE이 갖고 있는 함수 이름이라서 변수로 지정 못함
    IF NUM3&gt;=80 THEN
        DBMS_OUTPUT.PUT_LINE(&#39;합격&#39;);
    ELSE
        DBMS_OUTPUT.PUT_LINE(&#39;불합격&#39;);
    END IF;
END;
/</code></pre>
<h3 id="3-for문">3. FOR문</h3>
<pre><code class="language-sql">-형식
FOR 변수 IN 초기값..마지막값 LOOP
반복수행할 문장;
END LOOP;

예1)
SET SERVEROUTPUT ON
BEGIN
    FOR I IN 1..100 LOOP
        DBMS_OUTPUT.PUT(I||&#39; &#39;);
        IF I MOD 10 = 0 THEN
            DBMS_OUTPUT.PUT_LINE(&#39; &#39;);
        END IF;
    END LOOP;
END;
/
결과)
1 2 3 4 5 6 7 8 9 10  
11 12 13 14 15 16 17 18 19 20  
21 22 23 24 25 26 27 28 29 30  
31 32 33 34 35 36 37 38 39 40  
41 42 43 44 45 46 47 48 49 50  
51 52 53 54 55 56 57 58 59 60  
61 62 63 64 65 66 67 68 69 70  
71 72 73 74 75 76 77 78 79 80  
81 82 83 84 85 86 87 88 89 90  
91 92 93 94 95 96 97 98 99 100 

예2)
BEGIN
    FOR I IN REVERSE 1..100 LOOP --REVERSE 역순으로
            DBMS_OUTPUT.PUT(I||&#39; &#39;);
        IF I MOD 10 = 1 THEN
            DBMS_OUTPUT.PUT_LINE(&#39; &#39;);
        END IF;
    END LOOP;
END;
/

결과)
100 99 98 97 96 95 94 93 92 91  
90 89 88 87 86 85 84 83 82 81  
80 79 78 77 76 75 74 73 72 71  
70 69 68 67 66 65 64 63 62 61  
60 59 58 57 56 55 54 53 52 51  
50 49 48 47 46 45 44 43 42 41  
40 39 38 37 36 35 34 33 32 31  
30 29 28 27 26 25 24 23 22 21  
20 19 18 17 16 15 14 13 12 11  
10 9 8 7 6 5 4 3 2 1  


Q1) 1부터 100까지 수 중 3의 배수출력하고 3의 배수합 구해서 출력하기
SET SERVEROUTPUT ON
DECLARE
NUM1 NUMBER(5):=0; -- 0으로 초기화시켜야함!!!!!
BEGIN
    FOR I IN 1..100 LOOP
        IF I MOD 3 = 0 THEN
            DBMS_OUTPUT.PUT(I||&#39; &#39;);
            NUM1 := NUM1+I; -- 얘가 실행안되는중 =&gt;해결. NUM초기화 안함
        END IF;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(&#39; &#39;);
    DBMS_OUTPUT.PUT_LINE(&#39;총합=&#39;||NUM1);
END;
/

결과)
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99  
총합=1683


Q2) 단 입력받아 구구단 출력하기
DECLARE
    DAN NUMBER(5);
BEGIN
    DAN := &amp;NUM1;
    DBMS_OUTPUT.PUT(DAN||&#39;단 &#39;);
        FOR I IN 1..9 LOOP
            DBMS_OUTPUT.PUT(DAN||&#39;*&#39;||I||&#39;=&#39;||DAN*I||&#39; &#39;);
        END LOOP;
        DBMS_OUTPUT.PUT_LINE(&#39; &#39;);
END;
/
3단 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27  
-- 3입력시 3단 전체가 출력됨



Q3) 구구단 출력하기(2단부터 9단까지)

2단 2*1=2 2*2=4 ........   2*9=18
3단 3*1=3 ..

..
9단 9*1=9 9*2=18 .......   9*9=81


BEGIN
    FOR DAN IN 2..9 LOOP
    DBMS_OUTPUT.PUT(DAN||&#39;단 &#39;);
        FOR I IN 1..9 LOOP
            DBMS_OUTPUT.PUT(DAN||&#39;*&#39;||I||&#39;=&#39;||DAN*I||&#39; &#39;);
        END LOOP;
        DBMS_OUTPUT.PUT_LINE(&#39; &#39;);
    END LOOP;
END;
/

- EXIT : FOR문을 강제로 빠져나가기

예2) 정수입력받아 소수 판별하기
</code></pre>
<h3 id="4-into--select로-조회된-컬럼값을-변수에-저장">4. INTO : SELECT로 조회된 컬럼값을 변수에 저장</h3>
<pre><code class="language-sql">예1) 사원번호가 7369인 사원의 보너스 구하기
부서번호가 10번이면 급여의 10%
부서번호가 20번이면 급여의 20%
부서번호가 30번이면 급여의 30%

DECLARE
    ENO NUMBER(4); --사원번호
    DNO NUMBER(4); --부서번호
    ESAL NUMBER(7,2); --사원급여
    BONUS NUMBER(7,2); --보너스
BEGIN
    SELECT EMPNO,DEPTNO,SAL INTO ENO,DNO,ESAL
    FROM EMP WHERE EMPNO=7369;
    IF DNO=10 THEN
        BONUS := ESAL*0.1;
    ELSIF DNO=20 THEN
        BONUS := ESAL*0.2;
    ELSIF DNO=30 THEN
        BONUS := ESAL*0.3;
    ELSE
        BONUS:=0;
    END IF;
    DBMS_OUTPUT.PUT_LINE(&#39;사원번호:&#39;||ENO||&#39;부서번호:&#39;||DNO||&#39;급여:&#39;||ESAL||&#39;보너스:&#39;||BONUS);
END;
/

결과
사원번호:7369부서번호:20급여:800보너스:160

Q1) 7369사원의 급여가 800이상이면 급여의 50%,2000이상이면 급여의 30%,
3000이상이면 급여의 10%를 인상하세요.
DECLARE
    CSAL NUMBER(7,2); --기존급여
    USAL NUMBER(7,2); --인상된 급여
BEGIN
    SELECT SAL INTO CSAL
    FROM EMP WHERE EMPNO=7369;
    IF CSAL&gt;=800 THEN
        USAL := CSAL*1.5;
    ELSIF CSAL&gt;=2000 THEN
        USAL := CSAL*1.3;
    ELSIF CSAL&gt;=3000 THEN
        USAL := CSAL*1.1;
    ELSE
        USAL := CSAL;
    END IF;
    DBMS_OUTPUT.PUT_LINE(&#39;사원번호 7369번의 인상된 급여:&#39;||USAL);
END;
/
결과
사원번호 7369번의 인상된 급여:1200</code></pre>
<h3 id="5-basic-loop">5. BASIC LOOP</h3>
<pre><code class="language-sql">형식1)
LOOP
반복문;
EXIT WHEN 루프를 빠져나갈 조건절;
END LOOP;

예시)
DECLARE
    TOT NUMBER(5):=0;
    I NUMBER(5):=0;
BEGIN
    LOOP
        I:=I+1;
        TOT := TOT + I;
        EXIT WHEN I&gt;=100;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(&#39;1부터 100까지 합: &#39;||TOT);
END;
/
결과
1부터 100까지 합: 5050

형식2)
WHILE 조건식 LOOP
반복실행할 구문;
..
END LOOP;

Q1) 단 입력받아 구구단 출력해 보세요.

DECLARE
    DAN NUMBER(3):=&amp;DAN;
    I NUMBER(3):=1;
BEGIN
    DBMS_OUTPUT.PUT_LINE(DAN||&#39;단&#39;);
    WHILE I&lt;=9 LOOP
        DBMS_OUTPUT.PUT_LINE(DAN||&#39;*&#39;||I||&#39;=&#39;||DAN*I);
        I := I+1;
    END LOOP; 
END;
/

결과
4단
4*1=4
4*2=8
4*3=12
4*4=16
4*5=20
4*6=24
4*7=28
4*8=32
4*9=36
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PL/SQL] 저장프로시져(Stored Procedure)]]></title>
            <link>https://velog.io/@sleeee-dev/PLSQL-%EC%A0%80%EC%9E%A5%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%B8Stored-Procedure</link>
            <guid>https://velog.io/@sleeee-dev/PLSQL-%EC%A0%80%EC%9E%A5%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%B8Stored-Procedure</guid>
            <pubDate>Sun, 07 May 2023 07:06:05 GMT</pubDate>
            <description><![CDATA[<h2 id="저장프로시져stored-procedure">저장프로시져(Stored Procedure)</h2>
<ul>
<li>특정한 처리를 수행하는 PL/SQL 서브프로그램. 파라미터를 받아서 특정 작업을 수행</li>
<li>자바의 메소드에 해당</li>
<li>자바와 차이점 : 자바는 메소드가 리턴값이 있을수도 없을수도 있지만 저장 프로시져는 리턴값이 없다. 메소드의 VOID라고 생각하면 됨</li>
</ul>
<h3 id="1-형식">1. 형식</h3>
<pre><code class="language-sql">CREATE OR REPLACE PROCEDURE 프로시져명(파라미터,...)
IS
    변수선언;
BEGIN
    실행구문;
END;
/

프로시져 호출
형식)
EXECUTE 프로시져명(매개변수값,..);
- 프로시져 삭제
형식)
DROP PROCEDURE 프로시져명;


예1) 부서번호,부서명,위치를 파라미터로 전달받아 DEPT테이블에 추가하는 프로시져
CREATE OR REPLACE PROCEDURE ADDDEPT
(
    DNO NUMBER,
    DNAME VARCHAR2,
    DLOC VARCHAR2
)
IS
BEGIN
    INSERT INTO DEPT VALUES(DNO,DNAME,DLOC);
    COMMIT;
END;
/

EXECUTE ADDDEPT(11,&#39;영업&#39;,&#39;부산&#39;);
SELECT * FROM DEPT;

결과)
    DEPTNO DNAME          LOC          
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK     
        20 RESEARCH       DALLAS       
        30 SALES          CHICAGO      
        40 OPERATIONS     BOSTON       
        50 개발부         서울         
        42 인사부         부산         
        60 기획부         인천         
        43 인사2부        서울         
        61 기획2부        인천         
        11 영업           부산 


예2) 사원번호를 파라미터로 전달받아 이름과 직업을 출력하는 프로시져
CREATE OR REPLACE PROCEDURE EMPINFO
(
    ENO NUMBER
)
IS
    EMPNAME VARCHAR2(10);
    EMPJOB VARCHAR2(20);
BEGIN
    SELECT ENAME,JOB INTO EMPNAME,EMP JOB
    FROM EMP WHERE EMPNO=ENO;

    DBMS_OUTPUT.PUT_LINE(ENO||&#39; &#39;||EMPNAME||&#39; &#39;||EMPJOB);
END;
/
EXECUTE EMPINFO(7369);

결과
7369 SMITH CLERK


Q1) 사원번호와 급여인상률을 파라미터로 전달받아 급여를 인상하는 프로시져를
      만들고 호출해 보세요.
CREATE OR REPLACE PROCEDURE INCREASE
(
    VEMPNO NUMBER,
    RATE NUMBER
)
IS
    VSAL NUMBER(7,2);
    USAL NUMBER(7,2);
BEGIN
    SELECT SAL INTO VSAL FROM EMP WHERE EMPNO=VEMPNO;
    USAL := VSAL + VSAL*(RATE/100);
    UPDATE EMP
    SET SAL=USAL
    WHERE EMPNO=VEMPNO;
    DBMS_OUTPUT.PUT_LINE(VSAL||&#39;==&gt;&#39;||USAL||&#39; 로 급여인상 완료&#39;);
END;
/
EXECUTE INCREASE(7369,10);

결과)
800==&gt;880 로 급여인상 완료


Q2) 사원번호를 파라미터로 전달받아 사원의 급여가 800이상이면 급여의 50%
급여가 2000이상이면 급여의 30%,3000이상이면 급여의 10%를 인상하세요.
화면에 XXX사원의 급여가 XXX로 인상되었습니다. 라고 출력되도록 하세요.
예) EXECUTE UPDATESAL(7369);
CREATE OR REPLACE PROCEDURE UPDATESAL
(
    VEMPNO EMP.EMPNO%TYPE --타입참조
    --VEMPNO NUMBER
)
IS
    VSAL EMP.SAL%TYPE; --타입참조
    --VSAL NUMBER(5);
    USAL NUMBER(5);
BEGIN
    SELECT SAL INTO VSAL FROM EMP WHERE EMPNO=VEMPNO;
    IF VSAL&gt;=800 THEN
        USAL:=VSAL*1.5;
    ELSIF VSAL&gt;=2000 THEN
        USAL:=VSAL*1.3;
    ELSIF VSAL&gt;=3000 THEN
        USAL:=VSAL*1.1;
    ELSE
        USAL:=VSAL;
    END IF;
    UPDATE EMP SET SAL=USAL WHERE EMPNO=VEMPNO;
    COMMIT; --인상된 월급 저장하고 커밋
    DBMS_OUTPUT.PUT_LINE(VEMPNO||&#39;사원의 급여가 &#39;||USAL||&#39; 로 인상되었습니다&#39;);
END;
/
EXECUTE UPDATESAL(7369);

결과)
7369사원의 급여가 1320 로 인상되었습니다
</code></pre>
<h3 id="2-inout-매개변수">2. IN/OUT 매개변수</h3>
<ul>
<li>IN매개변수는 프로시져 내부에서만 사용되는 매개변수이며 OUT 매개변수는 외부의 변수를 참조해서 가져온다.</li>
<li>예시 <pre><code class="language-sql">SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE ADD1
(
  N1 IN NUMBER,
  N2 IN NUMBER,
  N3 OUT NUMBER
)
IS
BEGIN
  N3 := N1 + N2;
  DBMS_OUTPUT.PUT_LINE(N1||&#39;+&#39;||N2||&#39;=&#39;||N3);
END;
/
</code></pre>
</li>
</ul>
<hr>
<p>DECLARE
    N NUMBER(4);
BEGIN
    ADD1(1,2,N);
    DBMS_OUTPUT.PUT_LINE(&#39;N===========&gt;&#39;||N);
END;
/</p>
<pre><code>- 결과
```sql
1+2=3
N===========&gt;3</code></pre><ul>
<li>예2 (sqlplus)<pre><code class="language-sql">SQL&gt; set serveroutput on
SQL&gt; var n number
SQL&gt; execute add1(10,20,:n)
10+20=30
</code></pre>
</li>
</ul>
<p>PL/SQL 처리가 정상적으로 완료되었습니다.</p>
<p>SQL&gt; print n</p>
<pre><code>     N</code></pre><hr>
<pre><code>    30</code></pre><p>```</p>
]]></description>
        </item>
    </channel>
</rss>