전체 글 (166)

09
14

Function

 

함수의 모양

 

ex)

//1. Function declaration
//function name(param1, para2) { body... return; }
//one function === one thing
//naming: doSomething, command, verb
//e.g. createCardAndPoint -> createCard, createPoint
//funcion is object in JS
function printHello(){
    console.log('Hello');
}

printHello();

function log(message){
    console.log(message);
}

log('Hello@');
log(123);

 

예제 실행 화면

 

ex)

//2.Parameters
//premitive parameters: passed by value
//object parameters: passed by reference
function changeName(obj){
    obj.name = 'coder';
}

const ellie = {name: 'ellie'};
changeName(ellie);
console.log(ellie);

 

예제 실행 화면

 

ex)

//3. Defalut parameters(added in ES6)
function showMessage(message, from){
    console.log(`${message} by ${from}`);
    if(from === undefined){
        from = 'unknown';
    }
    console.log(`${message} by ${from}`);
}
showMessage('Hi!');

function showMessage2(message, from = 'unknown'){
    console.log(`${message} by ${from}`);
}
showMessage2('Hi!');

 

예제 실행 화면

 

ex)

//4. Rest parameters(added in ES6)
function printAll(...args){
    for(let i = 0; i <args.length; i++){
        console.log(args[i]);
    }
    
    for(const arg of args){
        console.log(arg);
    }

    args.forEach((arg) => console.log(arg));
}
printAll('dream','coding','han');

 

예제 실행 화면

 

ex)

//5.Local scope
//밖에서는 안을 볼 수 없고 안에서는 밖을 볼 수 있다.
let globalMessage = 'global'//global variable
function printMessage(){
    let message = 'hello';
    console.log(message); // local variable
    console.log(globalMessage);
    function printAnother(){
        console.log(message);
        let childMessage = 'hello';
    }
    //console.log(childMessage);//에러
}
//console.log(message);//에러
printMessage();

 

예제 실행 화면

 

ex)

//6. Return a value
function sum(a,b){
    return a+b;
}
const result = sum(1,2);//3
console.log(`sum: ${sum(1,2)}`);

//7. Early return, early exit
//bad
function upgradeUser(user){
    if(user.point > 10){
        //long upgrade logic...
    }
}

//good
function upgradeUser2(user){
    if(user.point <= 10){
        return;
    }
    //long upgrade logic...
}

 

예제 실행 화면

 

ex)

//First-class function
//functions are treated like any other variable
//can be assigned as a value to variable
//can be passed as an argument to other functions.
//can be returned by another function

//1.Function expression
//a function declaration can be called earlier than it is defined.(hoisted)
//a function expression is created when the execution reaches it.
const print = function(){
    //anonymous function
    console.log('print');
};
print();
const printAgain = print;
printAgain();

 

예제 실행 화면

 

ex)

//2. Callback function using function expression
function randomQuiz(answer, printYes, printNo){
    if(answer === 'love you'){
        printYes();
    }else{
        printNo();
    }
}
const printYes = function(){
    console.log('yes!');
}

//named function
//better debugging in debugger's stack traces
//recursions
const printNo = function print(){
    console.log('no!');
    //print();
}
randomQuiz('wrong',printYes,printNo);
randomQuiz('love you',printYes,printNo);

 

예제 실행 화면

 

ex)

//Arrow function
//always anonymous
const simplePrint = function(){
    console.log('simplePrint!');
}

const simplePrint2 = () => console.log('simplePirnt!');
const add = (a,b) => a+b;
const simpleMultiply = (a,b) =>{
    //do something more
    return a*b;
};

//IIFE: Immediately Invoked Function Expression
(function hello(){
    console.log('IIFE');
});
COMMENT
 
09
11

ex)

//1. String concatenation
console.log('my' + 'cat');
console.log('1' + 2);
console.log(`string literals:

''''
1+1`);

console.log("han's \n\tbook");

 

예제 실행 화면

 

ex)

//2.Numeric operators
console.log(1+1); //add
console.log(1-1); //substract
console.log(1/1); //divide
console.log(1*1); //multiply
console.log(5%2); //remainder
console.log(2**3); // exponentiation

//3.Increment and decrement operators
let counter = 2;
const preIncrement = ++counter;
//counter = counter + 1;
//preIncrement = counter;
console.log(`preIncrement: ${preIncrement}, counter: ${counter}`);

 

예제 실행 화면

 

ex)

//4.Assignment operators
let x = 3;
let y = 6;
x += y; // x = x + y;
x -= y;
x *= y;
x /= y;

//5.Comparison operators
console.log(10 < 6); // less than
console.log(10 <= 6); // less than or equal
console.log(10 > 6); // greater than
console.log(10 >= 6); //greater than or equal

 

예제 실행 화면

 

ex)

//6. Logical operators: ||(or), &&(and), !(not)
const value1 = false;
const value2 = 4 < 2;

// ||(or)
console.log(`or: ${value1 || value2 || check()}`);

function check(){
    for(let i = 0; i < 10; i++){
        //wasting time
        console.log('1');
    }
    return true;
}

 

예제 실행 화면

 

value1이 true면 check()는 호출되지 않는다. 그러므로 무거운 연산자, 함수일수록 뒤에 두는 것이 좋다.

 

ex)

//7. Equality
const stringFive = '5';
const numberFive = 5;

//== loose equality, with type conversion
console.log(stringFive == numberFive);
console.log(stringFive != numberFive);

//===strict equality, no type conversion
console.log(stringFive === numberFive);
console.log(stringFive !== numberFive);

//object equality by reference
const han1 = {name: 'han'};
const han2 = {name: 'han'};
const han3 = han1;
console.log(han1 == han2);
console.log(han1 === han2);
console.log(han1 === han3);

 

예제 실행 화면

 

ex)

console.log(0 == false); // true
console.log(0 === false); // false
console.log('' == false); // true
console.log('' === false); //false
console.log(null == undefined); // true
console.log(null === undefined); // false

 

예제 실행 화면

 

ex)

//8. Conditional operators: if
//if, else if, else
const name = 'han';
if(name === 'jin'){
    console.log('Welcome, jin!');
} else if(name === 'han'){
    console.log('You are amazing coder');
} else{
    console.log('unkwnon');
}

//9. Ternary operator: ?
//condition ? value1 : value2;
console.log(name === 'han' ? 'han' : 'jin');

 

예제 실행 화면

 

ex)

//10. Switch statement
//use for multiple if checks
//use for enum-like value check
//use for multiple type checks in Ts
const browser = 'IE';
switch(browser){
    case 'IE':
        console.log('go away!');
        break;
    case 'Chrome':
        console.log('love you!');
        break;
    case 'Firefox':
        console.log('love you!');
        break;
    default:
        console.log('same all!');
        break;
}

 

예제 실행 화면

 

ex)

//11. Loops
//while loop, while the condition is truthy,
//body code is executed.
let i = 3;
while(i > 0){
    console.log(`while: ${i}`);
    i--;
}

//do while loop, body code is executed first,
//then check the condition.
do{
    console.log(`do while: ${i}`);
    i--;
}while(i > 0);

//for loop, for(begin; condition; step)
for(i=3; i>0; i--){
    console.log(`for: ${i}`);
}

for(let i=3; i>0;i=i-2){
    console.log(`inline variable for: ${i}`);
}

 

예제 실행 화면

 

ex)

//nested loops
for(let i = 0; i < 10; i++){
    for(let j = 0; j < 10; j++){
        console.log(`i: ${i},j: ${j}`);
    }
}

//break, continue

 

예제 실행 화면

COMMENT
 
09
11

변수 선언

자바스크립트에서 변수를 선언할 수 있는 것은 let하나이다. let은 ES6에 추가되었다.

 

ex)

//1. Use strict
// added in ES 5
//use this for Valina Javascript.
'use strict';

//2. Variable
//let(added in ES6)
let name = 'han';
console.log(name);
name = 'hello';
console.log(name);

 

예제 실행 화면

 

{} 안에 변수를 선언하면 그 범위 내에서 사용이 가능하다. 전역으로 사용되는 변수는 웹이 실행될 때부터 끝날 때까지 메모리를 사용하기 때문에 최소한으로 사용하는 것이 좋다.

 

ex)

//2. Variable
//let(added in ES6)
let globalName = 'global name';
{
    let name = 'han';
    console.log(name);
    name = 'hello';
    console.log(name);
    console.log(globalName);
}
console.log(name);
console.log(globalName);

 

예제 실행 화면

 

그 전에는 var를 사용했지만 지금은 사용하지 않는다. var는 선언 전에 값을 할당할 수도, 출력할 수도 있다.

(var hoisting : 어디에서 선언했는지 상관없이 가장 위로 올려준다.)

또한 블록을 무시하기 때문에 어디에서든 값을 불러올 수 있다.

 

ex)

//2. Variable
//let(added in ES6)
let globalName = 'global name';
{
    let name = 'han';
    console.log(name);
    name = 'hello';
    console.log(name);
    console.log(globalName);
}
console.log(name);
console.log(globalName);

//var (don't ever use this!)
//var hoisting (move declaration from bottom to top)
//has no block scope
{
    age = 4;
    var age;
}
console.log(age);

 

예제 실행 화면

 

Constants

값을 선언함과 동시에 값을 바꿀 수 없는 데이터 타입을 의미한다.(보안상의 이유, 스레드가 동시에 값을 변경함을 방지, 실수를 방지)

 

//3.constants
//favor immutable data type always for a few reason:
//  -security
//  -thread safety
//  -reduce human mistakes
const dayInWeek = 7;
const maxNumber = 5;

 

데이터 타입

  • Primitive, single item : number(숫자), string, boolean, null, undefined, symbol
  • object, box container
  • function, first-class function(함수의 파라미터에 함수를 넣을 수 있음)

자바스크립트에서는 let으로 선언할 때 다이나믹하게 타입이 결정됨.

 

ex)

const count = 17; // integer
const size = 17.1; // decimal number
console.log(`value: ${count}, type: ${typeof count}`);
console.log(`value: ${size}, type: ${typeof size}`);

//number - speical numberic values : infinity, -infinity, Nan
const infinity = 1/0;
const negativeInfinity = -1/0;
const nAn = 'not a number' / 2;
console.log(infinity);
console.log(negativeInfinity);
console.log(nAn);

 

예제 실행 화면

 

ex)

//bigInt(fairly new, don't use it yet)
const bigInt = 1234567890123456789012345678901234567890n; // over(-2**53 ~ 2**53)
console.log(`value: ${bigInt}, type: ${typeof bigInt}`);
Number.MAX_SAFE_INTEGER;

 

예제 실행 화면

 

ex)

//string
const char = 'c';
const brendan = 'brendan';
const greeting = 'hello ' + brendan;
console.log(`value: ${greeting}, type: ${typeof greeting}`);
const helloBob = `hi ${brendan}!`; // template literals(string)
console.log(`value: ${helloBob}, type: ${typeof helloBob}`); 

 

예제 실행 화면

 

ex)

//boolean
//false: 0, null, undefined, NaN, ''
//true: any other value
const canRead = true;
const test = 3 < 1; // false
console.log(`value: ${canRead}, type: ${typeof canRead}`);
console.log(`value: ${test}, type: ${typeof test}`);

 

예제 실행 화면

 

ex)

//null
let nothing = null;
console.log(`value: ${nothing}, type: ${typeof nothing}`);

//undefined
let x;
console.log(`value: ${x}, type: ${typeof x}`);

 

예제 실행 화면

 

ex)

// symbol, create unique identifiers for objects
const symbol1 = Symbol('id');
const symbol2 = Symbol('id');
console.log(symbol1 === symbol2);
const gSymbol1 = Symbol.for('id');
const gSymbol2 = Symbol.for('id');
console.log(gSymbol1 === gSymbol2);

 

예제 실행 화면

 

심볼은 바로 출력하면 에러가 나며 symbol.description과 같이 데이터 타입을 변환시켜 출력해야 한다.

 

ex)

//5. Dynamic typing: dynamically typed language
let text = 'hello';
console.log(`value: ${text}, type: ${typeof text}`);
text = 1;
console.log(`value: ${text}, type: ${typeof text}`);
text = '7' + 5;
console.log(`value: ${text}, type: ${typeof text}`);
text = '8' / '2';
console.log(`value: ${text}, type: ${typeof text}`);

text = 'hello'
console.log(text.charAt(0));
text = 4;
console.log(text.charAt(0)); // 에러 --> 타입스크립트가 나옴

 

예제 실행 화면

 

ex)

// object, real-lift object, data structure
const han = {name: 'han', age: 27};
han.age = 26;

 

han이라는 object는 잠겨서 값을 변경할 수 없지만 name과 age는 변경이 가능하다.

COMMENT
 
09
10

계정과 스키마

오라클은 계정의 '인증번호'와 '권한 정보'를 독자적으로 관리한다. 오라클은 이용할 수 있는 계정명과 패스워드 목록을 '데이터 딕셔너리'에 저장한다.

 

데이터 사전

  • 오라클의 사용자 정보
  • 오라클 권한과 롤 정보

오브젝트 : 테이블, 뷰, 인덱스 등 모든 논리적인 저장구조

모든 오브젝트에는 소유자가 있고, 오브젝트가 해당 계정의 스키마에 위치한다.

 

스키마

스키마란, 계정이 소유하는 테이블이나 인덱스 등 오브젝트를 포함하는 논리적인 컨테이너다.

다른 스키마 안에 있는 오브젝트는 이름이 같아도 다른 오브젝트로 취급한다.

 

ex)

SCOTT 계정 ↔ SCOTT 스키마(EMP 테이블/ JOBS 테이블)

HR 계정  HR 스키마(EMP 테이블/ JOBS 테이블)

 

SCOTT 스키마의 EMP 테이블과 JOBS 테이블은 HR 스키마의 EMP 테이블과 JOBS 테이블이 같지 않다. 다른 계정이 갖고 있는 오브젝트를 사용하기 위해서는 'SCOTT.EMP', 또는 'HR.EMP'처럼 스키마명을 지정해야 한다. 스미카는 오라클에 접속할 때 지정한 계정명과 같다.

 

계정

계정 정보는 데이터 딕셔너리에 저장되므로 일반 데이터를 백업하는 것처럼 백업할 수 없다. 계정을 생성할 때 사용했던 DDL문을 백업해두거나 DDL문을 추출해야 한다.

 

오라클 계정 속성

  • DEFAULT 테이블 스페이스 : 오브젝트를 생성할 때 저장할 테이블 스페이스를 지정하지 않았을 때 저장되는 테이블 스페이스이다. 계정 생성 시, DEFAULT TABLESPACE 절로 지정한다.
  • DEFAULT 임시 테이블 스페이스 : SQL 실행 시 임시 세그먼트가 필요할 때 임시 세그먼트를 확보하기 위한 테이블스페이스다. 계정 생성 시, TEMPORARY TABLESPACE 절로 지정한다.

계정을 생성할 때 위 2개의 테이블 스페이스를 지정하지 않으면 데이터베이스에 설정된 기본 테이블스페이스가 지정된다.(SYSTEM 테이블 스페이스) 하지만 SYSTEM 테이블스페이스는 데이터베이스가 동작하는데 필수 관리 정보가 저장되는 특수한 테이블 스페이스이므로 계정의 오브젝트나 임시 세그먼트를 저장하는 것은 바람직하지 않다.

 

cf. 임시 세그먼트 : 처리에 필요한 일시적인 작업 영역을 메모리 상에 확보할 수 없을 때 할당되는 작업용 디스크 공간

 

따라서 계정을 생성할 때는 각각의 테이블 스페이스에 SYSTEM 테이블 스페이스 이외의 테이블 스페이스를 명시적으로 지정해야 한다.

 

  • 계정에 지정된 DEFAULT 테이블 스페이스 확인 : DBA_USER 뷰 > DEFAULT_TABLESPACE 칼럼
  • 계정에 지정된 DEFAULT 임시 테이블 스페이스 확인 : DBA_USER 뷰 > TEMPORARY_TABLESPACE 칼럼

개념 정리

권한 특정한 조작을 수행할 수 있는 권리
QUOTA 테이블 스페이스의 할당 제한
DBA_TS_QUOTAS 뷰에서 확인할 수 있음
계정 프로파일 계정이 사용할 수 잇는 자원을 제한하거나 패스워드의 관리 정책을 규정
자원 프로파일 계정이 사용할 수 있는 '각종 자원에 제한을 거는 방식'과 '패스워드 관리 정책을 규정' 할 수 있는 두가지로 구분된다. 자원을 제한하기 위해서는 초기화 파라미터 RESOURCE_LIMIT='TURE'여야 한다.

 

계정 확인

계정명, 상태, 기본 테이블 스페이스와 같은 오라클 계정에 관련된 정보는 DBA_USERS 뷰에서 확인할 수 있다.

SELECT USERNAME, --계정명
       ACCOUNT_STATUS ACCOUNT, --계정상태
       DEFAULT_TABLESPACE DEFAULT_TS, --계정의 DEFAULT 테이블 스페이스명
       TEMPORARY_TABLESPACE TMPE_TS, --계정의 DEFAULT 임시 테이블 스페이스명
       PROFILE -- 계정에 설정된 계정 프로파일명
  FROM DBA_USERS;

계정 상태 종류

  • OPEN : 잠겨있지 않으며 로그인이 가능한 상태
  • EXPIRED : 패스워드의 사용기한이 끝난 상태(로그인 후 변경)
  • LOCKED : 계정이 잠겨있으며, 로그인이 불가능한 상태
  • EXPIRED & LOCKED : 패스워드의 사용 기한이 끝나 잠긴 상태

QUOTA 확인

SELECT tablespace_name, --테이블스페이스명
       user_name, --QUOTA가 할당된 계정명
       max_bytes --QUOTA의 크기(무제한일때: -1)
  FROM DBA_TS_QUOTAS
 WHERE username='<계정명>';

 

계정 프로파일 확인

SELECT profile, --계정 프로파일명
       resource_name, --자원 프로파일명
       resource_type, --자원을 제한:'KERNEL'/패스워드 운용 정책: 'PASSWORD'
       limit -- 자원 프로파일의 제한 값(DEFUALT일 때 DEFAULT 프로파일의 같은 이름을 가진 자원 프로파일의 제한 값을 사용)
  FROM DBA_PROFILES;

 

오브젝트 권한

모든 오브젝트의 권한 확인

SELECT grantee, --오브젝트 권한이 부여된 계정명 또는 롤명
       owner,
       table_name, --오브젝트명
       grantor, --오브젝트 권한을 부여한 계정명
       privilege, --오브젝트 권한명
       grantable --권한이 WITH GRANT 옵션과 함계 부여되면 'YES', 아니면 'NO'
  FROM DBA_TAB_PRIVS;

 

계정의 오브젝트 권한 확인

SELECT grantee, --오브젝트 권한이 부여된 계정명 또는 롤명
       owner,
       table_name, --오브젝트명
       grantor, --오브젝트 권한을 부여한 계정명
       privilege, --오브젝트 권한명
       grantable -- 권한이 WITH GRANT 옵션과 함께 부여되면 'YES', 아니면 'NO'
  FROM USER_TAB_PRIVS;

 

시스템 권한

모든 시스템 권한 확인

SELECT grantee, --시스템 권한이 부여된 계정명
       privilege, --시스템 권한명
       admin_option --권한이 WITH GRANT 옵션과 함께 부여되면 'YES', 아니면 'NO'
  FROM DBA_SYS_PRIVS;

 

계정에 직접 할당되어있는 시스템 권한 확인

SELECT username, --계정명
       privilege, --시스템 권한명
       admin_option --권한이 WITH GRANT 옵션과 함께 부여되면 'YES', 아니면 'NO'
  FROM USER_SYS_PRIVS;

 

계정에 할당된 모든 시스템 권한 확인

SELECT privilege --시스템 권한명
  FROM SESSION_PRIVS;

 

특수한 시스템 권한

SYSDBA 권한과 SYSOPER 권한 2가지 특별한 시스템 권한이 있다.

오라클에는 기본적으로 SYSDBA 권한을 가진 SYS 계정이 존재한다.

따라서 별도의 절차 없이 SYS 계정으로 접속하여 SYSDBA 권한이 필요한 인스턴스의 기동/정지 등의 작업을 수행할 수 있다.

  SYSDBA 권한 SYSOPER 권한
STARTUP/SHUTDOWN O O
ALTER DATABASE OPEN/MOUNT/BACKUP O O
ALTER DATABASE CHARACTER SET O X
CREATE/DROP DATABASE O X
CREATE SPFILE O O
ALTER DATABASE ARCHIBELOG O O
완전 복구를 수행하기 위한 ALTER DATABASE RECOVER O O
불완전 복구를 수행하기 위한 ALTER DATABASE RECOVER O X
RESTICE 모드로 기동한 인스턴스에 접속 가능 여부(RESTRICTED SESSION 권한 포함) O O

 

'스마트팩토리 > 오라클' 카테고리의 다른 글

프로시저(PROCEDURE)  (0) 2020.09.15
오라클 테이블 스페이스(Table Space)  (0) 2020.09.05
오라클 SQL 문법  (0) 2020.08.27
오라클 데이터 타입  (0) 2020.08.27
C#과 오라클 연동해보기  (0) 2020.08.26
COMMENT