<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyunmoo0_0.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요~</description>
        <lastBuildDate>Tue, 18 Jan 2022 08:15:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyunmoo0_0.log</title>
            <url>https://images.velog.io/images/hyunmoo0_0/profile/04c9aa8d-eb3e-433f-ab82-75a2ec79ff50/smile.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyunmoo0_0.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyunmoo0_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Web과 WAS의 차이]]></title>
            <link>https://velog.io/@hyunmoo0_0/Web%EA%B3%BC-WAS%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@hyunmoo0_0/Web%EA%B3%BC-WAS%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Tue, 18 Jan 2022 08:15:06 GMT</pubDate>
            <description><![CDATA[<h3 id="웹서버web란">웹서버(WEB)란?</h3>
<p>웹 브라우저 클라이언트로부터 HTTP요청을 받아들이고, HTML 문서와 같은 웹페이지에서 흔히 찾아 볼 수 있는 자료 콘텐츠에 따라 HTTP에 반응하는 컴퓨터 프로그램</p>
<h3 id="웹-애플리케이션-서버was-web-application-server란">웹 애플리케이션 서버(WAS, Web Application Server)란?</h3>
<h4 id="웹-서버--웹-컨테이너">웹 서버 + 웹 컨테이너</h4>
<p>인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어이다.
웹 애플리케이션 서버는 동적 서버 콘텐츠를 수행하는 것으로 일반적인 웹 서버와 구별이 되며, 주로 데이터베이스 서버와 같이 수행이 된다.</p>
<h4 id="웹-컨테이너web-contaioner">웹 컨테이너(Web Contaioner)</h4>
<p>JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 웹 컨테이너 혹은 서블릿 컨테이너라고 한다.
웹 서버에서 JSP를 요청하면 톰켓에서는 JSP파일을 서블릿으로 변환하여 컴파일을 수행하고, 서블릿 수행결과를 웹서버에게 전달하게된다.
JSP컨테이너가 탑재 되어 있는 WAS는 JSP 페이지를 컴파일 해 동적인 페이지를 생성한다.</p>
<h3 id="web-과-was의-비교">WEB 과 WAS의 비교</h3>
<p>Web Container의 유무로 WEB과 WAS를 나눌수 있으며 WEB서버는 HTML 문서같은 정적 컨텐츠를 처리하는 것이고
WAS 서버는 asp, php , jsp 등 개발 언어를 읽고 처리하여 동적 컨텐츠, 웹 응용프로그램 서비스를 처리한다.</p>
<h4 id="web-server와-was의-구성에-따른-분류">Web Server와 WAS의 구성에 따른 분류</h4>
<ul>
<li><p><strong>WAS와 WebServer를 분리하지 않는 경우</strong>
모든 컨텐츠를 한곳에 집중시켜 웹서버와 WAS의 역할을 동시에 수행.
스위치를 통한 로드 밸런싱, 사용자가 적을 경우 효율적</p>
</li>
<li><p><strong>WAS와 WebServer를 분리한 경우</strong>
웹서버와 WAS의 기능적 분류를 토애 효과적인 분산을 유도.
정적인 데이터는 웹서버에서 처리,동적인 데이터는 WAS가 처리</p>
</li>
<li><p><strong>WAS 여러개와 WebServer를 분리한 경우</strong>
WAS단을 프리젠테이션 로직과 비즈니스 로직으로 구분하여 구성.
특정 logic의 부하에 따라 적절한 대응할 수 있지만 설계단계 유지보수 단계가 복잡해 질 수가 있따.</p>
</li>
<li><p><strong>WAS와 WebServer를 분리하는 이유</strong>
1) 기능을 분리하여 서버의 부하방지
2) 물리적으로 분리하여 보안 강화
3) 여러대의 WAS를 연결가능
4) 여러 웹어플리케이션을 서비스 가능</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[스레드풀(Thread pool)]]></title>
            <link>https://velog.io/@hyunmoo0_0/%EC%8A%A4%EB%A0%88%EB%93%9C%ED%92%80Thread-pool</link>
            <guid>https://velog.io/@hyunmoo0_0/%EC%8A%A4%EB%A0%88%EB%93%9C%ED%92%80Thread-pool</guid>
            <pubDate>Fri, 31 Dec 2021 07:35:23 GMT</pubDate>
            <description><![CDATA[<h2 id="thread-pool">Thread pool..</h2>
<p>컴퓨터 프로그래밍에서 스레드 풀은 컴퓨터 프로그램에서 실행의 동시성을 달성하기위한 소프트웨어 디자인 패턴입니다. 종종 복제 된 작업자 또는 작업자 승무원 모델이라고도하는 스레드 풀은 감독 프로그램이 작업을 동시에 실행할 수 있도록 여러 스레드를 유지 관리합니다.</p>
<p>Process: 운영체제에서 하나의 어플리케이션
Thread: Process에서 하나의 작업</p>
<p>여러 Thread를 동시에 만들어 실행(병렬처리)할 수 있다. Java에 경우, Thread, Runnable를 이용해야 한다.</p>
<p>그렇다고 해서 Thread를 계속 늘려가는 건 좋은 것 일까? 당연히 아니다. 하드웨어의 제한적인 사항(CPU, Memory 등)이 있기 때문에 관리할 필요가 있다. 그래서 Thread Pool이라는 개념을 이용한다.</p>
<p>Thread Pool은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 것을 말한다. Java에 경우, 기본적으로 Executors, ExecutorService를 이용하여 Thread Pool를 만들 수 있습니다.</p>
<h3 id="thread-pool을-사용하는-이유">Thread pool을 사용하는 이유</h3>
<ol>
<li><p>프로그램 성능 저하를 방지하기 위해
매번 발생하는 작업을 병렬처리하기 위해 쓰레드를 생성/수거하는 데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시킨다. 따라서 쓰레드풀을 만들어 놓고 사용한다.</p>
<p>쓰레드 또한 프로세스(JVM)가 할당한 메모리를 사용한다. 즉, 쓰레드를 생성하면 JVM 메모리를 소비하게 되는 것이다. Java8과 Java11에서는 쓰레드에게 최소 16KB에서 스택의 깊이가 최대로 늘어났을 때는 1MB의 메모리를 예약할당하게 된다. 쓰레드 자체도 레지스터와 스택을 가지고, 쓰레드도 컨텍스트 스위칭이 일어나기 때문에 쓰레드 생성에 따른 메모리 할당을 무시할 수 없다.</p>
</li>
<li><p>다수의 사용자 요청을 처리하기 위해
대규모 프로젝트에서 특히 중요하다. 다수의 사용자의 요청을 수용하고, 빠르게 처리하고 대응하기 위해 쓰레드풀을 사용한다.</p>
<p>특히 Bottle Neck 현상이 발생하는 I/O 작업과 데이터베이스 작업에서 주로 사용된다. 쓰레드가 아무리 빠르게 생성되더라도 시스템 스케줄러에서 쓰레드의 우선순위를 매번 할당해야 하는데, 쓰레드풀을 이용하면 일정 쓰레드가 이미 생성되기 때문에 쓰레드풀에 의해 라이프 사이클이 관리되고, 쓰레드 풀에 의해 작업이 큐를 이용하게 되어 우선순위가 배분되고 처리된다.</p>
</li>
</ol>
<h3 id="threadpool의-장단점">Threadpool의 장단점</h3>
<h4 id="thread-pool의-장점">Thread pool의 장점</h4>
<p>쓰레드를 생성/수거하는데 비용이 들지 않는다.
쓰레드가 생성될 때 OS가 메모리 공간을 확보해주고 메모리를 쓰레드에게 할당해준다.
쓰레드 풀을 미리 만들어 두기 때문에 처음에 생성하는 비용은 들지만 이전의 쓰레드를 재사용할 수 있으므로 시스템 자원을 줄일 수 있고, 작업을 요청 시 이미 쓰레드가 대기 중인 상태이기 때문에 작업을 실행하는 데 딜레이가 발생하지 않는다.</p>
<h4 id="thread-pool의-단점">Thread pool의 단점</h4>
<p>thread pool에 thread를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생한다.</p>
<p>Thread pool의 단점 개선 : Fork Join Thread Pool</p>
<p> <img src="https://images.velog.io/images/hyunmoo0_0/post/1eb01630-d7eb-4519-9393-a790ae4f5c8a/image.png" alt="">
기존 쓰레드 풀을 개선하기 위한 방법으로 Java 7 이상의 쓰레드 풀에서 사용되고 있다. 기본적으로 큰 업무를 작은 업무로 나누어 배분해서, 일을 한 후에 일을 취합한 형태이다.</p>
<p>동작은 다음과 같다.</p>
<ol>
<li>작업을 하나의 큰 작업들로써 제공해준다.</li>
<li>첫 쓰레드가 작업을 가져와 자신의 로컬 큐에 할당, 분할한다.</li>
<li>두번째 쓰레드가 가져올 작업이 없다면, 첫 쓰레드의 큐에 있는 분할된 작업을 훔쳐간다.</li>
<li>나머지 쓰레드도 반복</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[오라클 Index]]></title>
            <link>https://velog.io/@hyunmoo0_0/%EC%98%A4%EB%9D%BC%ED%81%B4-Index</link>
            <guid>https://velog.io/@hyunmoo0_0/%EC%98%A4%EB%9D%BC%ED%81%B4-Index</guid>
            <pubDate>Thu, 30 Dec 2021 00:58:09 GMT</pubDate>
            <description><![CDATA[<h2 id="인덱스index란">인덱스(Index)란?</h2>
<p>인덱스는 데이터베이스 테이블에 있는 데이터를 빨리 찾기 위한 용도의 데이터베이스 객체이며 일종의 색인기술입니다. 테이블에 index를 생성하게 되면 index Table을 생성해 관리합니다. 인덱스는 테이블에 있는 하나이상의 컬럼으로 만들 수 있습니다. 가장 일반적인 B-tree 인덱스는 인덱스 키(인덱스로 만들 테이블의 컬럼 값)와 이 키에 해당하는 컬럼 값을 가진 테이블의 로우가 저장된 주소 값으로 구성됩니다.</p>
<p><strong>인덱스 생성</strong></p>
<pre><code>CREATE INDEX [인덱스명] ON [테이블명](컬럼1, 컬럼2, 컬럼3.......)</code></pre><pre><code>CREATE INDEX EX_INDEX ON CUSTOMERS(NAME,ADDRESS); </code></pre><p><strong>인덱스 조회</strong></p>
<pre><code>SELECT * FROM USER_INDEXES WHERE TABLE_NAME = &#39;CUSTOMERS&#39;;</code></pre><p><strong>인덱스 삭제</strong></p>
<pre><code>DROP INDEX [인덱스 명]</code></pre><pre><code>DROP INDEX EX_INDEX;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[오라클 내장함수]]></title>
            <link>https://velog.io/@hyunmoo0_0/%EC%98%A4%EB%9D%BC%ED%81%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hyunmoo0_0/%EC%98%A4%EB%9D%BC%ED%81%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 29 Dec 2021 08:28:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/hyunmoo0_0/post/47ae1cc7-7237-471f-adc6-5b761b7da2ee/image.png" alt="">    </p>
<p><img src="https://images.velog.io/images/hyunmoo0_0/post/d03783fb-5ddd-4397-9cff-d76690849eed/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hyunmoo0_0/post/7a234337-bb40-4686-b3e5-a1b5cac6dd77/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hyunmoo0_0/post/cd9cf2fe-3897-49e1-9607-7a9afd36c9c6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[오라클 패키지]]></title>
            <link>https://velog.io/@hyunmoo0_0/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%8C%A8%ED%82%A4%EC%A7%80</link>
            <guid>https://velog.io/@hyunmoo0_0/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%8C%A8%ED%82%A4%EC%A7%80</guid>
            <pubDate>Tue, 28 Dec 2021 08:53:47 GMT</pubDate>
            <description><![CDATA[<h4 id="패키지package">패키지(PACKAGE)</h4>
<p>논리적 연관성이 있는 pl/sql타입, 변수, 상수, 서브 프로그램, 커서, 예외 등의 항목을 묶어 놓은 객체이다.
패키지는 컴파일 과정을 거쳐 DB에 저장되며, 다른 프로그램에서 패키지의 항목을 참조, 공유, 실행할 수 있다.</p>
<blockquote>
<p>패키지의 장점</p>
</blockquote>
<p><strong>1.모듈화 기능</strong>
업무적으로 연관성이 있거나 비슷한 기능을 수행하는 서브 프로그램이나 변수, 상수, 커서, 사용자 정의 타입들을 하나의 패키지에 담아두면 이해하기도, 관리하기도 쉽다.</p>
<p><strong>2.프로그램 설계의 용이성</strong>
패키지는 선언부(스펙)과 본문(바디)로 구성되는데, 선언부만 있어도 컴파일한 뒤 저장이 가능하다.</p>
<p><strong>3.캡슐화</strong>
패키지 선언부는 외부에 공개되지만, 패키지에 속한 커서, 함수, 프로시저의 세부 구현내용이 담겨있는 본문은 외부에서 볼 수 없다.
즉, 정보 은닉 기능이 지원되는 것이며, 외부 모듈에 영향을 주지 않고도 패키지 본문 내용은 언제든지 수정할 수 있다.</p>
<p><strong>4.보다 나은 성능</strong>
패키지에 있는 서브 프로그램을 호출하면 일단 해당 패키지 전체를 메모리에 올려놓는데, 이후 계속 호출하더라도 메모리에 올라가 잇는 상태이므로 더 나은 성능을 보인다.</p>
<blockquote>
<p>패키지 구조</p>
</blockquote>
<p><strong>선언부</strong></p>
<pre><code>CREATE OR REPLACE PACKAGE 패키지명
IS
TYPE구문;
상수명 CONSTANT 상수타입;
예외명 EXCEPTION;
변수명 변수타입;
커서구문;

FUNCTION 함수명 (매개변수1 IN 매개변수1타입, 매개변수2 IN 매개변수2타입, ...)
RETURN 반환타입;

PROCEDURE 프로시저명 (매개변수1 [IN,OUT,INOUT]매개변수1타입, ...);

END 패키지명;
</code></pre><p><strong>본문</strong></p>
<pre><code>CREATE OR REPLACE PACKAGE BODY 패키지명
IS 
상수명 CONSTANT 상수타입;
변수명 변수타입;
커서 정의 구문;
FUNCTION 함수명 (매개변수1 IN 매개변수1타입, 매개변수2 IN 매개변수2타입, ...)RETURN 반한타입
IS
...
BEGIN
...
END 함수명;

PROCEDUER 프로시저명 (매개변수1 [IN,OUT,INOUT]매개변수1타입, ...)
IS
...
BEGIN
...
END 프로시저명;

...
END 패키지명;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[오라클 프로시저]]></title>
            <link>https://velog.io/@hyunmoo0_0/%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80</link>
            <guid>https://velog.io/@hyunmoo0_0/%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80</guid>
            <pubDate>Fri, 24 Dec 2021 05:02:50 GMT</pubDate>
            <description><![CDATA[<h1 id="프로시저">프로시저</h1>
<p>오라클에서의 프로시저는 PL/SQL을 통해 만들어집니다. 자주 사용하는 SQL을 프로시저로 만든 뒤 필요 할때마다 호출,사용하여 작업 효율을 늘릴 수 있습니다. 함수는 특정 연산을 수행한 뒤 결과 값을 반환하지만 프로시저는 특정한 로직을 처리하기만 하고 결과 값은 반환하지 않는 서브 프로그램입니다.</p>
<ul>
<li><p>생성
CREATE [OR REPLACE] PROCEDURE pro_name( </p>
<pre><code>매개변수, 
매개변수... 
  1) 스칼라 변수, 2) %TYPE </code></pre><p>) 
IS (AS)  </p>
<pre><code>지역변수 설정 </code></pre><p>BEGIN 
  제어 → 제어문, 연산자, SQL 
END; 
/ </p>
<ul>
<li><p>삭제 
DROP PROCEDURE pro_name; </p>
</li>
<li><p>호출 
SELECT → EXECUTE 
INSERT, UPDATE, DELETE → CALL </p>
</li>
<li><p>매개변수 
IN : 내부에서만 사용하는 변수 
OUT : Call By Reference → 결과 값을 받는 변수 
INOUT : 내부사용, 값을 받는 변수 </p>
</li>
</ul>
</li>
</ul>
<h3 id="인수의-타입-선언부분정리">※인수의 타입 선언부분정리</h3>
<p><strong>1. IN =&gt; 내부 프로그램에 제공</strong></p>
<p>변수이름 IN VARCHAR2;  --인수선언할때 byte수 지정안함 (인수는 크기를 주지 않습니다.)</p>
<p>변수이름 IN 테이블이름.컬럼명%TYPE;</p>
<p>변수이름 IN 테이블이름.컴럼명%TYPE := 값;</p>
<p>변수이름 IN 테이블이름.컬럼명%TYPE DEFAULT 값;</p>
<p><strong>2. OUT =&gt; 호출자에게 제공</strong></p>
<p>(프로시저 실행 시점에 OUT 매개변수를 변수 형태로 전달하고, 프로시저 실행부에서 이 매개변수에 특정 값을 할당, )</p>
<p>변수이름 IN VARCHAR2;</p>
<p>변수이름 IN 테이블이름.컬럼명%TYPE;</p>
<p><strong>3. IN OUT =&gt; 입력과 동시에 출력용으로 사용할 수 있다.</strong></p>
<p>변수이름 IN VARCHAR2;</p>
<p>변수이름 IN 테이블이름.컬럼명%TYPE;</p>
<blockquote>
<p>프로시저의 장단점</p>
</blockquote>
<h3 id="저장-프로시저의-장점">저장 프로시저의 장점</h3>
<p>저장 프로시저를 사용하게되면 여러 가지 장점들이 있습니다.</p>
<ol>
<li><p>하나의 요청으로 여러 SQL문을 실행 할 수 있습니다.</p>
</li>
<li><p>네트워크 소요 시간을 줄일 수 있습니다.
만약 동일한 쿼리를 1000번 2000번 호출하는 것보다 SP를 이용해서 구현한다면 SP를 호출할 때 한 번만 네트워크를 경유하기 때문에 네트워크 소요시간을 줄이고 성능을 개선할 수 있습니다.</p>
</li>
<li><p>개발 업무를 구분해 개발 할 수 있습니다.
순수한 애플리케이션만 개발하는 조직과 DBMS 관련 코드를 개발하는 조직이 따로 있다면, DBMS 개발하는 조직에서는 데이터베이스 관련 처리하는 SP를 만들어 API처럼 제공하고 애플리케이션 개발자는 SP를 호출해서 사용하는 형식으로 역할을 구분하여 개발이 가능합니다.</p>
</li>
</ol>
<h3 id="저장-프로시저의-단점">저장 프로시저의 단점</h3>
<ol>
<li><p>처리 성능이 낮습니다.
문자나 숫자 연산에 저장 프로시저를 사용한다면 오히려 C나 JAVA보다 느린 성능을 보여줍니다.</p>
</li>
<li><p>디버깅이 어렵습니다.</p>
</li>
<li><p>DB 확장이 매우 힘듭니다.
서비스 사용자가 많아져 서버수를 늘려야할 때, DB 수를 늘리는 것이 더 어렵습니다.
서비스 확장을 위해 서버수를 늘릴경우 DB 수를 늘리는 것보다 WAS의 수를 늘리는 것이 더 효율적이기 때문에 대부분의 개발에서 DB에는 최소의 부담만 주고 대부분의 로직은 WAS에서 처리할 수 있게 합니다.</p>
</li>
</ol>
<blockquote>
<p>사용자함수, 트리거, 프로시저 링크 : <a href="https://hijjang2.tistory.com/392">https://hijjang2.tistory.com/392</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[오라클 트리거(TRIGGER)]]></title>
            <link>https://velog.io/@hyunmoo0_0/%ED%8A%B8%EB%A6%AC%EA%B1%B0TRIGGER</link>
            <guid>https://velog.io/@hyunmoo0_0/%ED%8A%B8%EB%A6%AC%EA%B1%B0TRIGGER</guid>
            <pubDate>Fri, 24 Dec 2021 04:55:50 GMT</pubDate>
            <description><![CDATA[<p>트리거(TRIGGER)란 무엇인가?</p>
<pre><code>트리거는 데이터베이스 이벤트에 반응하여 실행되는 프로그램 단위입니다. 
트리거의 주요 사용 목적은 테이블 데이터의 무결성 보장, 데이터베이스 관리의 
자동화 등이라고 할 수 있습니다.</code></pre><p>DML 트리거(TRIGGER)란?</p>
<pre><code>DML 트리거는 DML 문(INSERT, UPDATE, DELETE)이 테이블의 하나 이상의 데이터에 
영향을 미칠 때에 자동으로 실행되는 트리거 입니다. 
프로시저나 함수는 사용자가 직접 호출해야만 하지만, 트리거는 오라클에서 
사용자에게 알려주지 않고 자동으로 호출하여 처리합니다.</code></pre><p>DML 트리거(TRIGGER)의 특징</p>
<ul>
<li><p>자동으로 실행되며 수동으로는 실행할 수 없습니다.</p>
</li>
<li><p>어떤 동작에서 실행되는지 지정해야 합니다.</p>
</li>
<li><p>작동이 일어난 트리거 대상 테이블에 대해서는 트리거 내용이 존재할 수 없습니다.</p>
</li>
<li><p>BEFORE, AFTER 두 가지 트리거가 있습니다.</p>
</li>
<li><p>트랜잭션 일부로 처리됩니다. (COMMIT, ROLLBACK, SAVEPOINT 문장 포함 못함)</p>
</li>
</ul>
<p>그럼 이제 DML 트리거 생성을 하는 방법에 대해서 알아 보도록 하겠습니다.</p>
<blockquote>
<p>트리거 관리</p>
</blockquote>
<ul>
<li><p>활성화/ 비활성화
ALTER TRIGGER 트리거_이름 {DISABLE | ENABLE}</p>
</li>
<li><p>테이블에 속한 트리거 활성화/ 비활성화
ALTER TABLE 테이블_이름{DISABLE | ENABLE} ALL TRIGGER;</p>
</li>
<li><p>트리거 수정 후 재컴파일
ALTER TRIGGER 트리거_이름 COMPILE;</p>
</li>
<li><p>트리거 삭제
DROP TRIGGER 트리거_이름;</p>
</li>
<li><p>트리거 조회
SELECT * FROM USER_TRIGGERS;</p>
</li>
</ul>
<blockquote>
<p>트리거 장단점</p>
</blockquote>
<h3 id="장점">장점</h3>
<ol>
<li>데이터 무결성 강화 (참조 무결성)</li>
</ol>
<p>: 물류를 예로 들면 견적등록하고,수주까지 등록하고 난뒤 견적테이블의 수주여부(Y/N) 칼럼을 변경해야 될 경우, 견적테이블의 수주여부를 변경해주는 쿼리를 다시 요청하는것보다, 수주를 INSERT할 떄 트리거를 이용하여 바로 견적을 수정하는게 더 빠르고 안전하다고 한다.</p>
<ol start="2">
<li>업무 규칙의 설정</li>
</ol>
<p>: 트리거에서 사용자 정의예외를 직접 설정할 수 있으므로 복잡한 업무 규칙 제약조건을 좀 더 편하고 효율적으로 표현 할 수 있다고 한다. </p>
<ol start="3">
<li>감사기능의 확장</li>
</ol>
<p>: 상세한 변경 내역을 트리거를 이용해서 쉽고 편하게 관리 할 수 있다(다만,이경우는 큰 프로젝트의 경우 오라클 성능에 부담을 많이 준다)</p>
<h3 id="단점"><strong>단점</strong></h3>
<h4 id="유지보수의-어려움">유지보수의 어려움</h4>
<p>:트리거는 고질적인 유지 보수 문제를 야기한다. 트리거는 직접 실행되지 않는 작은 코드다. 그저 다른 작업의 부산물로“발생”할뿐이다. 작업이 부산물로 이루어지기 때문에 사람들은 트리거가있다는 사실을 종종 잊곤 한다(그리고 모든 부산물에 대한 코드 검토가 불가능한 것은 아니지만 어렵다).</p>
<p>또 담당자가 바뀌거나 업무를 인수인계할때 제대로 전달이 안되면 트리거 오류를 찾아내기도 어렵다.(트리거 유무자체도 모르고 있었다면 다른곳에서 계속 오류를 찾겠지) 그리고 덕지덕지 붙어있는 트리거들은 업무를 분석하는대도 더 복잡하고 어렵게 만든다.</p>
<p>만약 완벽한 인수인계와 적절한 문서화작업으로 프로젝트의 모든 트리거를 다알아서 유지보수문제를 어느정도 해결한다고 해도 트리거 자체가 문제를 발생시킬 수 있다.개발자가 트리거를 생성할때는 생각하지못한 오류가 추후에 생기면 그 트리거 오류들을 또 해결해야하므로 2차적인 오류가 생긴다. </p>
<h2 id="결론">결론</h2>
<p>따라서, 트리거를 사용해서 얻을 수 있는 장점(좀더 빠르고 안전)보다 단점(유지보수의어려움,예상치못한오류들이생길가능성)이 더 타격이 크므로 현업에서는 트리거를 많이 쓰지는 않는다고 한다고 한다고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[사용자함수(Function)]]></title>
            <link>https://velog.io/@hyunmoo0_0/%EC%82%AC%EC%9A%A9%EC%9E%90%ED%95%A8%EC%88%98Function</link>
            <guid>https://velog.io/@hyunmoo0_0/%EC%82%AC%EC%9A%A9%EC%9E%90%ED%95%A8%EC%88%98Function</guid>
            <pubDate>Fri, 24 Dec 2021 04:39:50 GMT</pubDate>
            <description><![CDATA[<p>기본 함수 생성 방법</p>
<p>기본 함수는 하나의 값만 반환이 가능하다.</p>
<p>CREATE [OR REPLACE] FUNCTION function_name [(</p>
<pre><code>argument...</code></pre><p>)]
RETURN datatype -- 반환되는 값의 datatype
    IS [AS]
        [선언부]
    BEGIN
        [실행부 - PL/SQL Block]
    [EXCEPTION]
        [EXCEPTION 처리]
    RETURN 변수; -- 리턴문 필수
END;</p>
<ul>
<li><p>[　] : 대괄호 안의 구문은 생략 가능함을 의미 한다.</p>
</li>
<li><p>OR_REPLACE : 함수생성 DDL 명령어 / 이미 존재하는 펑션이라면 기존 내용을 지우고 재생성 한다. 생략 가능하다.</p>
</li>
<li><p>function_name : 사용자 지정 함수명.</p>
</li>
<li><p>argument : 매개변수1, 매개변수2, 매개변수3... 매개변수 선언.</p>
</li>
<li><p>datatype : VARCHAR2, NUMBER, DATE 등 반환할 데이터 타입을 지정한다. </p>
</li>
</ul>
<p>CREATE OR REPLACE FUNCTION 함수명 ( 
    변수명 IN VARCHAR2 
)
 RETURN VARCHAR2 -- 반환되는 값의 datatype 
    IS 
        변수 VARCHAR2(10); 
    BEGIN 
        SELECT 리턴할값 
        INTO 변수 
        FROM DUAL 
        WHERE 1 = 변수; 
    RETURN 변수; -- 리턴문 필수 
END;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(veiw)테이블]]></title>
            <link>https://velog.io/@hyunmoo0_0/veiw%ED%85%8C%EC%9D%B4%EB%B8%94</link>
            <guid>https://velog.io/@hyunmoo0_0/veiw%ED%85%8C%EC%9D%B4%EB%B8%94</guid>
            <pubDate>Fri, 24 Dec 2021 04:21:05 GMT</pubDate>
            <description><![CDATA[<p> 뷰(View)란 무엇인가? </p>
<ol>
<li><p>뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다.</p>
</li>
<li><p>뷰는 저장장치 내에 물리적으로 존재하지 않지만 사용자에게 있는 것처럼 간주된다.</p>
</li>
<li><p>뷰는 데이터 보정작업, 처리과정 시험 등 임시적인 작업을 위한 용도로 활용된다.</p>
</li>
<li><p>뷰는 조인문의 사용 최소화로 사용상의 편의성을 최대화 한다.</p>
</li>
</ol>
<p>뷰(View)의 특징</p>
<ol>
<li><p>뷰는 기본테이블로부터 유도된 테이블이기 때문에 기본 테이블과 같은 형태의 구조를 사용하며, 조작도 기본 테이블과 거의 같다.</p>
</li>
<li><p>뷰는 가상 테이블이기 때문에 물리적으로 구현되어 있지 않다.</p>
</li>
<li><p>데이터의 논리적 독립성을 제공할 수 있다.</p>
</li>
<li><p>필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해진다.</p>
</li>
<li><p>뷰를 통해서만 데이터에 접근하게 하면 뷰에 나타나지 않는 데이터를 안전하게 보호하는 효율적인 기법으로 사용할 수 있다.</p>
</li>
<li><p>기본 테이블의 기본키를 포함한 속성(열) 집합으로 뷰를 구성해야지만 삽입, 삭제, 갱신, 연산이 가능하다.</p>
</li>
<li><p>일단 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있다.</p>
</li>
<li><p>뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제된다.</p>
</li>
</ol>
<p>view의 장점</p>
<ol>
<li><p>논리적 독립성을 제공합니다.</p>
</li>
<li><p>데이터 접근 제어로 보안 가능합니다.</p>
</li>
</ol>
<p>-- 뷰를 통해 접근하기 때문에 뷰에 나타나지 않는 데이터를 보호 할수 있습니다.</p>
<ol start="3">
<li><p>사용자의 데이터 관리를 간단하게 합니다.</p>
</li>
<li><p>하나의 테이블로 여러개의 상이한 뷰를 정의할 수 있습니다.</p>
</li>
</ol>
<p>view의 단점</p>
<ol>
<li><p>독자적인 인덱스를 가질 수 없습니다.</p>
</li>
<li><p>정의를 변경할 수 없습니다.</p>
</li>
<li><p>삽입, 삭제, 갱신 연산에 많은 제약이 따릅니다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[ROWNUM 활용(몇번째 행만출력)]]></title>
            <link>https://velog.io/@hyunmoo0_0/ROWNUM-%ED%99%9C%EC%9A%A9%EB%AA%87%EB%B2%88%EC%A7%B8-%ED%96%89%EB%A7%8C%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@hyunmoo0_0/ROWNUM-%ED%99%9C%EC%9A%A9%EB%AA%87%EB%B2%88%EC%A7%B8-%ED%96%89%EB%A7%8C%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Wed, 22 Dec 2021 08:21:41 GMT</pubDate>
            <description><![CDATA[<p><strong>select * from table where rownum &lt;= 3;</strong>
=&gt; 3번째줄까지 출력이 됨</p>
<p><strong>select * from (select ROWNUM as RW, culumn from table) A where A.RW = 3;</strong>
=&gt; 3번째줄만 출력이됨</p>
<p><strong>select * from table where rownum = 3;</strong>
=&gt; 이 쿼리문은 출력이 안됨!(X)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL) JOIN 정리]]></title>
            <link>https://velog.io/@hyunmoo0_0/SQL-JOIN-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@hyunmoo0_0/SQL-JOIN-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 22 Dec 2021 04:54:53 GMT</pubDate>
            <description><![CDATA[<p><a href="https://pearlluck.tistory.com/46">JOIN 정리한곳</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SSH와 SFTP]]></title>
            <link>https://velog.io/@hyunmoo0_0/SSH%EC%99%80-SFTP</link>
            <guid>https://velog.io/@hyunmoo0_0/SSH%EC%99%80-SFTP</guid>
            <pubDate>Tue, 21 Dec 2021 05:02:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>SSH (Secure Shell)</p>
</blockquote>
<p>네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 수행하기 위한 프로토콜입니다.
기존의 rsh, rlogin, TELNET 등을 대체하기 위해 설계되었으며,
강력한 인증 방법 및 안전한 통신을 가능하게 하는 보안 기능을 제공합니다.</p>
<blockquote>
<p>SFTP (SSH File Transfer Protocol, Secure File Transfter Protocol)</p>
</blockquote>
<p>신뢰 가능한 데이터 스트림을 통해 파일 접근, 전송, 관리를 제공하는 네트워크 프로토콜입니다.
SSH의 파일 전송 버전으로 이해하면 되겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 알면유용한것들(EXISTS,UNION,TRIM,CASE,LEVEL)]]></title>
            <link>https://velog.io/@hyunmoo0_0/SQL-%EC%95%8C%EB%A9%B4%EC%9C%A0%EC%9A%A9%ED%95%9C%EA%B2%83%EB%93%A4EXISTSUNIONTRIMCASELEVEL</link>
            <guid>https://velog.io/@hyunmoo0_0/SQL-%EC%95%8C%EB%A9%B4%EC%9C%A0%EC%9A%A9%ED%95%9C%EA%B2%83%EB%93%A4EXISTSUNIONTRIMCASELEVEL</guid>
            <pubDate>Tue, 21 Dec 2021 01:34:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>EXISTS</li>
</ol>
</blockquote>
<p>EXISTS
SELECT * FROM TABLE
    WHERE EXISTS (SELECT * FROM TEMPTABLE WHERE USERNAME = &#39;홍길동&#39;;</p>
<p>== EXISTS 안의 조건이 &quot;존재&quot; 하면 결과출력</p>
<p>SELECT * FROM TABLE 
    WHERE NOT EXISTS ( SELECT * FROM HAMBURGER LIKE TOO YOU;</p>
<p>== NOT EXISTS 안의 조건이 &quot;존재 하지않을때&quot; 전체결과를 출력!    </p>
<blockquote>
<ol start="2">
<li>UNION</li>
</ol>
</blockquote>
<p>UNION : 중복된 열이 제거된다.
UNION ALL : 중복된 열까지 모두 출력</p>
<blockquote>
<ol start="3">
<li>TRIM</li>
</ol>
</blockquote>
<p>TRIM : 공백을 제거한다.
LTRIM: 오른쪽공백제거
RTRIM:오른쪽공백제거</p>
<blockquote>
<ol start="4">
<li>CASE WHEN ~ THEN ~ELSE END</li>
</ol>
</blockquote>
<p>SELECT a, CASE
             WHEN b = &#39;*&#39; THEN &#39;star&#39;
             WHEN b = &#39;+&#39; THEN &#39;plus&#39;
             WHEN b = &#39;-&#39; THEN &#39;minus&#39;
             ELSE &#39;????&#39;
          END AS B
  FROM TABLE;</p>
<blockquote>
<ol start="5">
<li>CONNECT BY LEVEL</li>
</ol>
</blockquote>
<p>1~10까지 연속된 숫자 조회</p>
<p>SELECT LEVEL AS NO
FROM DUAL
CONNECT BY LEVEL &lt;= 10</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[배치와 크론탭]]></title>
            <link>https://velog.io/@hyunmoo0_0/%EB%B0%B0%EC%B9%98%EC%99%80-%ED%81%AC%EB%A1%A0%ED%83%AD</link>
            <guid>https://velog.io/@hyunmoo0_0/%EB%B0%B0%EC%B9%98%EC%99%80-%ED%81%AC%EB%A1%A0%ED%83%AD</guid>
            <pubDate>Mon, 20 Dec 2021 05:33:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>crontab 옵션 명령어</p>
</blockquote>
<p>$ crontab -e  #  명령을 등록, 편집  - 맨 처음에 사용 시 편집기를 선택할 수 있다.
$ crontab -d  # 등록된 명령을 삭제
$ crontab -l  # 현재 등록된 리스트 출력
$ crontab -l -u otheruser  # otheruser 사용자가 등록한 crontab 리스트 출력
$ crontab -r  # 현재 사용자가 등록한 crontab 전체 삭제</p>
<blockquote>
<p>검토사항</p>
</blockquote>
<p><strong>변경 후 반드시 cron 다시 실행시키기</strong></p>
<p>service cron start  # 가동
또는 
service cron restart # 재가동</p>
<p><strong>실행 파일은 일반 경로에 위치, path 설정 – not found</strong></p>
<p>cron은 보안때문에 사용자 개인 설정 파일을 참조하지 않습니다. 
즉 사용자의 쉘 초기화 파일(.bashrc, .bash_profile)을 읽지 않습니다.
그러므로 실행 프로그램(예를 들어 *.sh)들은 /usr/bin이나 /bin과 같은 
일반 경로에 있어야 cron이 제대로 찾아서 실행시킬 수 있습니다. 이런 경로에 
없다면 /bin/sh: 1: /bin/dbbackup.sh: not found 같은 메세지가 메일로 보내집니다.</p>
<p><strong>실행 파일 권한 문제 – Permission denied</strong>
가끔 실행 파일에 제대로 권한이 성정되지 않았다면 아래와 같은 메세지가 메일로 보내집니다.
그렇기 때문에 충분한 권한을 줍니다.
chmod +x dbbackup.sh</p>
<p><strong>실행파일 sh는 복사하지 말것</strong>
crontab 설정 시 실행파일 sh 파일을 기존에 만들어놓은 것을 FTP로부터 
복사해 오는 경우가 있습니다 왜 그런지는 모르지만 이렇게 복사해오는 경우 
제대로 작동하지 않습니다. 멀쩡히 해당 디렉토리에 존재하고 파일 권한도 
충분한데 Permission denied, not found같은 메세지를 내 보냅니다.</p>
<p>이럴경우 조금 귀찮지만 sh 파일을 편집기를 사용해 다시 만들면 제대로 작동합니다.</p>
<p><strong>crontab 작동 확인</strong>
그리고 crontab이 제대로 작동하는지 확인하기 위해서 service cron status 명령을 사용합니다.</p>
<p>1,6,11,16,21,26,31,36,41,46,51,56 * * * * / Batch/daemon.sh &gt; dev/null 2&gt;&amp;1</p>
<p>1,6~분마다 배치 실행</p>
<p>dev/null 2&gt;&amp;1     2: 표준에러 , &gt;: 리다이렉트 , &amp;1: 표준출력</p>
<p>dev/null 에 에러를 출력해라
=에러가 나오면 dev/null 에출력!!</p>
<p>&#39;&gt;&#39; 명령의 결과를 파일에 저장</p>
<p>&#39;&lt;&#39; 파일의 데이터를 명령에 입력</p>
<p>특정분마다 Batch-daemon.sh를 실행 에러뜨면 dev/null에
저장하고 다시 시작</p>
<p>크론탭 추후 수정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[db링크 알아보기]]></title>
            <link>https://velog.io/@hyunmoo0_0/db%EB%A7%81%ED%81%AC-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@hyunmoo0_0/db%EB%A7%81%ED%81%AC-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 20 Dec 2021 05:29:50 GMT</pubDate>
            <description><![CDATA[<p>--공용 데이터베이스 링크생성 권한부여
GRANT CREATE PUBLIC DATEBASE LINK TO [사용자계정];
--공용 데이터베이스 링크삭제 권한부여
GRANT DROP PUBLIC DATABASE LINK TO [사용자계정];
--데이터베이스 링크생성 권한부여
GRANT CREATE DATABASE LINK TO [사용자 계정]</p>
<p>--디비링크 생성
CREATE DATABASE LINK [링크로 사용할 명칭] CONNECT TO [원격지 로그인 유저명] 
IDENTIFIED BY &quot;[원격지 유저 패스워드]&quot; USING [로컬서버의 TNSNAMES.ORA에 설정된 접속할 매칭이름];
--디비링크 조회
SELECT * FROM [원격지 테이블]@[설정한 디비링크 명칭];</p>
<p>--현재 접속한 USER가 생성한 DB Link 조회
SELECT * FROM USER_DB_LINKS;</p>
<p>--현재 DB 환경의 모든 DB Link 조회
SELECT * FROM DBA_DB_LINKS;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue 는 무엇일까?]]></title>
            <link>https://velog.io/@hyunmoo0_0/Vue-%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</link>
            <guid>https://velog.io/@hyunmoo0_0/Vue-%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</guid>
            <pubDate>Mon, 09 Aug 2021 06:47:33 GMT</pubDate>
            <description><![CDATA[<p><strong>Vue를 공부하기 앞서 한번더 Vue가 무엇인지 왜 사용되는지부터 알아보려고 한다.</strong></p>
<p>Vue.js 는 웹페이지 화면개발을 위한 Front-End-Framework 이다. 
React와 Angular 가 javascript framework로 자리잡고 있지만 Vue가 나오면서 새로운 프로젝트에 Vue가 많이 사용되는 추세라고 한다. 또한 기존의 프레임워크에 비해 간단하게 코딩을 할 수있다.</p>
<p>Vue.js 공식사이트
<a href="kr.vuejs.org">Vue.js 공식사이트</a>
한국어 공식사이트에는 vue.js 의 모든 정보가 담겨져있다고 하니 참고하면 좋을것 같다.
설치방법부터 응용법까지 가장먼저 이곳에서 알아보면 좋을것같다 ㅎㅎ</p>
<p>잠시 공부중 쉬는시간이기 때문에 간단하게 알아보았고 설치및 환경설정후 간단한 코딩도 시도해보면서 익혀봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue 를 사용하는 이유??]]></title>
            <link>https://velog.io/@hyunmoo0_0/Vue-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@hyunmoo0_0/Vue-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Sun, 08 Aug 2021 07:28:47 GMT</pubDate>
            <description><![CDATA[<p>React , Angular , Vue 세가지중에 Vue를 먼저 알아보려고 합니다.</p>
<h2 id="첫번째-공부-vue-를-왜-사용할까">첫번째 공부. Vue 를 왜 사용할까??</h2>
<blockquote>
<h4 id="1-vuejs-는-가장-쉽다고-합니다">1. Vue.js 는 가장 쉽다고 합니다.</h4>
</blockquote>
<h3 id="react의-if문">React의 if문</h3>
<pre><code>function App(){
    const conditional - () =&gt; {
        if(true){
            return &lt;p&gt;이거보여주셈&lt;/p&gt;
           }else{
            return &lt;p&gt;이거말고&lt;/p&gt;
        }
    }
    return(
        &lt;div&gt;{conditional()}&lt;/div&gt;
    );
}</code></pre><h3 id="vue의-if문">Vue의 if문</h3>
<pre><code>&lt;template&gt;
    &lt;div&gt;
        &lt;p v-if=&quot;show&quot;&gt;이거보여주셈&lt;/p&gt;
        &lt;p v-else&gt;이거말고&lt;/p&gt;
&lt;/template&gt;</code></pre><blockquote>
<h4 id="2vue-는-코드를-짤떄-방법이-정해져있다">2.Vue 는 코드를 짤떄 방법이 정해져있다.</h4>
</blockquote>
<p><strong>Q.HTML 을 여러개만들고 싶을때</strong>
  React:
  {map}
  forEach
  for for in for if
  컨포넌트 render() 바깥에서 할지 안에서 쓸지</p>
<p>  Vue:<br>  v-for
  (Vue는 방법이 하나입니다.)</p>
<blockquote>
<h4 id="3-vue는-html-렌더링이-빠르다">3. Vue는 HTML 렌더링이 빠르다.</h4>
</blockquote>
<blockquote>
<h4 id="4-장기적으로-지원이-잘되는-라이브러리업데이트가-잘됨">4. 장기적으로 지원이 잘되는 라이브러리(업데이트가 잘됨)</h4>
</blockquote>
<h5 id="간단하게-vue에-대해-알아보았는데-java를-공부하다-python을-배웠을때의-느낌이랑-비슷할꺼같네요코딩자체가-간결하다는-장점이-있다보니-난이도는-처음공부하기엔-적당한-난이도라고-생각이-듭니다">간단하게 Vue에 대해 알아보았는데 java를 공부하다 python을 배웠을때의 느낌이랑 비슷할꺼같네요.코딩자체가 간결하다는 장점이 있다보니 난이도는 처음공부하기엔 적당한 난이도라고 생각이 듭니다.</h5>
]]></description>
        </item>
    </channel>
</rss>