출처 : https://12bme.tistory.com/247

   http://kikook.tistory.com/499


일단 pro-c 를 사용하는 이유에 대해 알아봅시다.


현업자들의 Comment


Comment (1) : DB처리가 가장 빠른 건 PL/SQL입니다. 그다음이 pro*c고요
속도만이 문제였다면 아마 PL/SQL을 쓰겠죠. 
pro*c를 쓰는 이유는 PL/SQL이 단점을 가지고 있기 때문입니다. 부하분산이 어렵다는..
보통 pro*c를 쓸땐 TP-모니터를 같이 씁니다. 턱시도같은...
AP서버 여러대를 써서 부하분산을 합니다. 일반적인 쓰리티어 구조죠.

Comment (2) : 사실 자바시스템도 마찬가지긴 합니다. WAS가 트랜잭션처리와 UI처리를 같이 해주는 거 뿐이죠. DB처리 속도도 JDBC가 꾸준히 업그레이드되면서 많이 좋아졌습니다. 다만 미션크리티컬한 사이트에서는 자바의 트랜잭션 처리에 의구심이 강합니다. 은행같은 금융이 그렇죠. 자바초기에 사건이 많았었기 때문에.. ^^ WAS는 UI구성만 맡기고 졸트로 TP-모니터에 연결해 트랜잭션 처리는 pro*c에 맡깁니다. 비용은 많이 들겠지만 더 신뢰할 수 있는 시스템을 원한다면 그렇게 해야겠죠.


Comment (3) : pro*c를 쓰는 가장 큰 이유는 가장 안정적이기 때문입니다. 또한 배치 프로그램도 java 처럼 힙메모리 제한이 없어 대용량 데이터 처리에 안정적이고 알맞기 때문에 pro*c로 개발합니다. pro*c로 개발했다고 해서 java보다 DB처리 속도에 대한 이득은 없습니다.



pro-c 개요



Pro-c란 Oracle rdbms에 준비된 pro-c 툴은, sql문을 포함한 c 프로그램을 oracle 데이터베이스내에 있는 데이터에 접근과 조작을 할 수 있는 c 프로그램으로 변환하기 위한 것이다.

pro-c는 프리컴파일러이기 때문에 입력 파일 내에 있는 exec sql 문을 적당한 oracle 콜로 변환해서 출력 파일을 작성한다. 그 다음 이 출력 파일을 c프로그램에 대한 통상의 방법으로 컴파일하고 링크해서 실행모듈을 작성한다. 


SQL 문은 절차형 언어가 아닙니다. 그래서 오라클을 포함한 많은 데이터베이스는 PL/SQL이라는 절차형 언어를 제공합니다. PL/SQL은 오라클 내부에서 실행되는 프로그램으로서 오라클 내부라는 한정된 공간에서 실행되는 도구입니다.


DBMS의 버전이 높아지면서 이전관 다르게 PL/SQL에도 다양한 기능이 추가 되었습니다. 예를 들면, TCP/IP, HTTP, FILE I/O 등과 같은 기능이 추가되어 다양한 방식의 프로그래밍이 가능해졌습니다. 하지만 오라클 외부 프로그램과의 연동 등에 있어서는 많은 제약이 있습니다. 예를 들어, TCP/IP 통신을 하는 PL/SQL 문장을 작성하여 수행하는 중에 메모리 할당 등 예기치 않은 오류로 프로그램이 종료되는 상황이 발생할 수 있습니다. 프로그램이 오류로 인해 종료되는 부분은 프로그램을 수정하여 해결이 가능합니다. 하지만 이로 인해 오라클 엔진에 부하가 가해진다면 이는 돌이킬 수 없는 장애로 이어질 수 있습니다. 이렇듯 내부 PL/SQL을 통한 프로그램의 경우 오라클이라는 내부 울타리에서만 수행되는 특징이 큰 제약으로 작용합니다.


이런 고민을 해결하기 위해서 대부분의 DBMS 벤더는 외부 C 프로그램과 결합할 수 있는 선행 컴파일러를 제공하고 있으며 오라클에서는 이를 Pro*C라고 합니다. Pro*C는 PL/SQL과 같이 절차적 프로그래밍이 가능한 프로그램 도구로서 PL/SQL처럼 오라클 내부에서 수행되는 프로그램이 아니라 실행 가능한 외부 프로그램으로 작성이 되어 관련 작업을 수행할 수 있게 해 주는 도구입니다.


다만 일반 프로그램 언어들과 다른 점이 있다면, Pro*C만으로는 실행 파일을 만들어 낼 수 없다는 것입니다. 그래서 Pro*C를 Pre Compiler(설행 컴파일러)라고 합니다. Pro*C는 선행 컴파일러이기 때문에 선행 컴파일을 통해서 실행 파일이 아닌 C 컴파일러가 인식할 수 있는 출력 파일(xxx.c)을 생성합니다. 선행 컴파일러를 통해 생성된 C 프로그램은 C 프로그램의 통상적인 방법으로 컴파일되고, 오라클 라이브러리와 결합(링크)되어 실행 모듈이 만들어집니다.


Pro*C 프로그래밍을 위해서는 Pro*C 고유의 문법을 숙지하고 있어야 하지만 C 프로그래밍에 대한 기본 지식도 있어야 합니다. 특히 메모리와 관련된 부분이나 포인터 등과 같은 C의 고급 기능을 사용하기 위해서는 C 프로그래밍에 대한 지식을 갖추고 있어야 합니다. 그리고 C 프로그램은 기본적으로 OS의 특성에도 많은 영향을 받으므로 OS의 고유한 특성도 공부해야 합니다.


Pro*C를 처음 접하는 처음 접하는 분들에게 너무 많은 부담감을 드린 듯하지만 대부분의 개발자가 작성하는 일반적인 배치 프로그램이나 미들웨어 연동 프로그램의 경우에는 C에 대해 많이 알고 있지 않아도 정상적인 개발과 운영이 가능합니다. 물론 조금 더 심도 있는 프로그래밍을 위해서는 C의 고급 기능이나 OS의 고유한 특성을 자세히 알고 있어야 합니다.


그러나 이 책을 공부함에 있어서 C에 대해 많이 알고 있지 않아도 무방합니다. 기초 단계를 넘어 고급 단계로 가기 위해서 무엇이 필요한지 미리 알아본 것이므로 크게 부담감을 갖지 않아도 됩니다.


 프로그램 작성 방식


4GL 프로그램으로 DB 핸들링 프로그램을 작성하기 위해서 가장 먼저 할 일은 DB 접속 방식을 선택하는 것입니다. ODBC 방식으로 할 것인지, OLE-DB 방식으로 진행할 것인지를 선택한 후에 그에 맞는 프로그램 방식을 결정해야 합니다.


Pro*C 역시 다르지 않습니다. GUI 방식의 4GL 프로그램처럼 마우스 클릭을 통해 설정할 수 있는 것이 아니라 코딩 시점에 Header 파일 선정, 프로그램 방식의 선정, 컴파일 옵션의 변경을 통해 작성 방식을 선택하여 사용할 수 있습니다. Pro*C에서 프로그램 작성 방식은 두 가지로 나누어지며, 하나는 내장 SQL 방식이고, 다른 하나는 OCI(Oracle Call Interface) 방식입니다.



(1) 내장 SQL 방식

내장 SQL 방식이란 C 프로그램 내부에서 'EXEC SQL'이라는 접두사 뒤에 SQL 문장을 직접 기술하는 방식입니다. 내장 SQL 방식은 통상적으로 가장 많이 사용됩니다. 우리에게 익숙한 윈도우 환경의 개발툴과 비교해 본다면, OLE나 ODBC를 통해 데이터베이스와 연결하여 작업하는 방식의 프로그램과 비슷하다고 할 수 있습니다. 


이 책에서도 가장 대중적인 방식인 내장 SQL 방식을 기준으로 실습 예제를 만들고 설명할 것입니다. 내장 SQL 문장에는 일반 SQL 문장뿐만 아니라 오라클을 이용한 다양한 형식의 내부 문장을 사용할 수 있으며, 미리 생성되어 있는 Stored Procedure, Package 또는 개발자가 임의로 작성한 PL/SQL도 사용할 수 있습니다. 즉, 오라클 데이터베이스에서 사용하는 모든 문장, 즉 DML, DDL, DCL, PL/SQL, 일반 SQL 문장을 내장 SQL 문장에 사용할 수 있습니다.


내장 SQL 문장에 사용할 수 있는 명려어는 아래 표(내장 SQL 문장 구문 방식의 프로그램 구문)와 같습니다.


 명령어

 설명

 ARRAYLEN

 PL/SQL에서 호스트 array를 사용한다.

 BEGIN DECLARE SECTION

 END DECLARE SECTION

 ANSI 모드에서 호스트 변수를 사용한다.

 DECLARE

 내부 오브젝트를 선언한다.

 INCLUDE

 외부 *.h를 참조한다.

 TYPE

 임의 데이터 타입을 설정한다.

 VAR

 변수의 동일화

 WHENEVER

 runtime 에러 핸들링 문장

 ALLOCATE

 CURSOR 변수에 영역을 할당한다

 ALTER

 오라클의 정의

 ANALYZE
 AUDIT
 COMMENT
 CONNECT
 CREATE
 DROP
 GRANT
 NOAUDIT
 RENAMERE
 VOKE
 TRUNCATE
 CLOSE

 오라클에 접속 제어 오브젝트 변경 문장

 DELETE
 FETCH
 INSERT
 LOCK TABLE
 OPEN
 SELECT
 UPDATE
 EXPLAIN PLAN

 데이터 조작 및 데이터 추출문

 COMMIT
 ROLLBACK
 SAVEPOINT
 SET TRANSACTION

 트랜잭션 제어 문

 DESCRIBE
 EXECUTEPREPARE

 Dynamic SQL 사용을 위한 문

 ALTER SESSION
 SET ROLE

 세션 제어 문



(2) OCI 방식

OCI(Oracle Call Interface) 방식이란 OCI 라이브러리를 통해서 오라클 SQL 문장을 직접 호출하여 사용하는 방식입니다. 내장 SQL 방식에 비해서 조금 더 하위 레벨에 해당하는 프로그래밍 방식으로서 OCI를 통해서 DB 핸들링 작업을 실행하기 때문에 데이터베이스 서버의 자원을 효율적으로 관리하고 SQL 문장 수행의 각 단계를 직접 제어할 수 있다는 장점이 있습니다.


그러나 프로그래밍 방법에 있어 내장 SQL 프로그램에 비해 복잡하기 때문에 개발자의 숙련도가 요구된다는 단점이 있습니다. Unix 환경의 C 프로그램을 대부분의 개발자들은 쉽게 생각하기보다는 어렵게 생각하고 있습니다. 이는 대부분의 제어를 개발자가 직접 기술해야 하기 때문입니다. 반면에 GUI 프로그램은 마우스 클릭 몇번만으로 대부분의 설정이 가능해집니다. 이렇듯 OCI 프로그램에서는 모든 부분의 직접 제어나 기술이 내장 SQL 프로그램에 비해서 어렵게 여겨지는 것입니다. 물론 대부분의 프로그램에는 특정한 패턴이 있으므로 그 패턴을 익히기만 하면 어떤 프로그램 방식이 더 쉽다, 혹은 더 어렵다고 단정지을 수는 없습니다.


대부분의 경우라고 할 수는 없지만 적지 않은 개발자들이 내장 SQL 문장 방식을 사용하고 있습니다. 이 책에서도 내장 SQL 문장 방식을 사용하며, OCI 방식 프로그램에 대해서는 다루지 않습니다. OCI 방식의 프로그램 방법을 더 자세히 알고 싶으면 오라클 사이트에 관련 예제를 어렵지 않게 구할 수 있으므로 이를 참고하면 됩니다.


 내장 SQL 방식

OCI 방식

 SQL 연산을 쉽고 명료하게 처리하기 위해 3GL 어플리케이션 개발

 데이터베이스를 최대한 제어하면서 3GL 어플리케이션 개발

 간결한 코드 작성

 길고 복잡한 코드 작성

 컴파일 전에 소스 코드 선행 컴파일

 선행 컴파일 단계 없이 코드 컴파일

 선행 컴파일러를 별도로 구매

 오라클 데이터베이스와 함께 OCI 라이브러리 획득

 ANSI 표준 준수(X3.168-1992)

 독점 비 표준 절차적 호출 인터페이스 사용

 다중 행 질의만을 위해 명시적 커서 선언

 모든 데이터베이스 연산을 처리하기 위한 명시적 커서 선언

 선행 컴파일 시에 SQL 구문 확인 

 실행 시간에 SQL 구문 확인




1-4. Pro*C의 데이터 형


Pro*C에서 사용하는 데이터 형은 C 프로그램에서 사용하는 일반적인 데이터 형과 Pro*C에서만 사용할 수 있는 고유한 형태의 데이터 형으로 구성되어 있습니다. 아래의 내용은 Pro*C 프로그램에서 사용하는 데이터 형을 설명한 것입니다.


  • 기본적인 데이터 형의 일차원 배열
  • CHAR 데이터 형과 VARCHAR 데이터 형의 이차원 배열
  • 출력 호스트 변수로 VARCHAR 변수를 사용할 때 오라클은 구조체의 멤버 길이를 설정하지만 배열을 NULL-terminate(\0)시키지는 않습니다. 그러므로 출력하기 전에 출력 호스트 변수를 NULL-terminate 시키십시오. CHAR은 자동 NULL-terminate입니다.
  • 기본적인 데이터 형에 대한 포인터
  • 사용자 정의의 typedef
  • 구조체
  • 배열의 구조체
  • 구조체에 대한 포인터
  • 구조체 배열


아래의 [표 1-3]에서는 C 프로그램에서 일반적으로 사용할 수 있는 데이터 형의 종류와 각 데이터 형의 세부 내용을 설명하였습니다. Pro*C 역시 C 프로그램이기 때문에 C의 일반적인 데이터 형을 사용할 수 있습니다.


 C의 데이터 형

 설명

 char

 단일 문자

 char[n]

 n 바이트의 문자 배열

 int

 정수

 short
 short int

 작은 정수 (지시자 변수에 대한 데이터 형)

 long
 long int

 긴 정수

 floatlong
 float

 부동 소수점, 단정도

 double

 부동 소수점, 배정도

 VARCHAR

 가변 길이 문자



오라클 데이터베이스의 데이터 형과 C 프로그램의 데이터 형은 호환됩니다. 그 내용을 아래 표와 같이 정리할 수 있습니다.


 오라클 DB의 데이터 형

 C의 데이터 형

 설명

 VARCHAR2(Y)
 (Y: 1~2000)

 char

 단일 문자

 CHAR(X)(X:1~255)

 char[n]

 VARCHAR[n]

 int

 short

 float

 n 바이트의 문자 배열
 n 바이트의 가변 문자 배열
 정수

 작은 정수

 부동 소수점

 NUMBER

 NUMBER(P, S)

 int

 short

 long

 float

 double
 char

 char[n]

 VARCHAR[n]

 정수

 작은 정수

 긴 정수

 부동 소수점

 배정도 부동 소수점

 단일 문자

 n 바이트의 문자 배열

 n 바이트의 가변 문자 배열

 DATE

 char[n]

 VARCHAR[n]

 n 바이트의 문자 배열
 n 바이트의 가변 문자 배열

 LONG

 char[n]

 VARCHAR[n]

 n 바이트의 문자 배열
 n 바이트의 가변 문자 배열

 RAW(X)

 unsigned char[n]
 VARCHAR[n]

 n 바이트의 문자 배열

 n 바이트의 가변 문자 배열

 LONG LAW

 unsigned char[n]
 VARCHAR[n]

 n 바이트의 문자 배열
 n 바이트의 가변 문자 배열

 ROWID

 unsigned char[n]
 VARCHAR[n]

 n 바이트의 문자 배열
 n 바이트의 가변 문자 배열

 MLSLABEL

 unsigned char[n]

 VARCHAR[n]

 n 바이트의 문자 배열
 n 바이트의 가변 문자 배열

 주의:  X : 1~255 사이의 값, 디폴트는 1

         Y : 1~2000 사이의 값

         P : 2~38, S: -84~127 사이의 값


오라클의 char을 C 프로그램의 char로 치환하고, number을 in, long, short로 치환해서 사용할 수 있습니다. 그러므로 오라클 데이터베이스와 연결해서 프로그래밍을 함에 있어서 큰 제약이 없습니다.


VARCHAR 형의 경우에는 데이터 형의 특성상 C 프로그램의 char 데이터 형과는 다른 특이한 형태를 가지고 있습니다. Pro*C 프로그램에서 VARCHAR uid[20];로 선언하면 실제로는 아래와 같은 형태로 생성됩니다.


1
2
3
4
struct {
  unsigned short int len;
  unsigned char arr[20];
} uid;


오라클 데이터베이스에서 VARCHAR2 데이터 형의 선언은 가변 길이 문자열로, 데이터형 선언시 정의된 데이터 길이 내에서 다양한 길이의 데이터를 가질 수 있다는 것입니다. 좀더 쉽게 설명하자면 'VARCHAR2 CODE[40]'로 선언하고 '1'이라는 데이터를 할당하면 전체 40바이트의 길이 중 1바이트만 사용이 되고 나머지 39바이트는 빈 공간으로 남게되어 공간의 효율적 활용이 가능해지며 이러한 것을 가변 길이 문자열이라고 하는 것입니다. 


이와 같이 Pro*C의 VARCHAR 형도 오라클 데이터베이스의 VARCHAR2와 동일하게 가변 길이로 할당이 되어 사용된다는 것입니다. 다만 Pro*C만의 특징이 있다면, Pro*C에서 VARCHAR로 선언하는 것은, 내부적으로는 가변적 데이터 할당이 가능한 문자형 구조체로 선언하는 것과 같습니다.


구조체로 선언하지 않더라도 구조체의 특성을 가지므로 변수에 값을 할당하는 방법도 일반 char 변수와 다르게 이루어집니다. 뿐만 아니라 명시적으로 포인터로 선언하지 않더라도 VARCHAR 형은 데이터를 포인터로만 전달할 수 있기 때문에 데이터 할당과 출력에 있어 일반 데이터 형과 같은 형태가 아닌 포인터의 처리 프로세스를 따릅니다. 


char 형으로 선언하고 할당하려면 아래와 같이 진행하면 됩니다. 이 형식은 C 프로그램과 동일하며, 사용법에 있어서도 전혀 차이가 없음을 알 수 있습니다.


1
2
char uid[20];
strcpy(uid, "userid");


char 형과 달리 VARCHAR형의 경우에는 다음과 같이 선언하고 할당 합니다.

1
2
3
VARCHAR uid[20];
strcpy((char*)uid.arr, "userid");
uid.len = (short)strlen((char *)uid.arr);

VARCHAR 형은 선언과 동시에 len과 arr이라는 멤버를 갖는 구조체로 선언됩니다. 구조체이지기 때문에 앞서 확인한 char 형의 변수 데이터 할당 방법과 동일하게 사용할 수 ㅇ벗습니다.


구조체 변수에 대한 데이터 할당을 위해서는 구조체를 이루고 있는 각 멤버에 데이터를 할당해야 합니다. 물론 경우에 따라서는 구조체에 대한 할당만으로도 각 멤버에 대한 데이터 할당이 가능하기도 합니다. 이는 내부적으로 볼 때 자동적으로 각 멤버에 대한 할당이 이루어지는 것입니다. 대표적으로 Pro*C에서 데이터 추출 시 사용하는 FETCH 구문이 이에 해당됩니다.


VARCHAR 형도 구조체입니다. 그렇기 때문에 데이터를 할당하기 위해서는 구조체를 이루고 있는 각 멤버에 데이터를 할당해야만 합니다. 뿐만 아니라 데이터 전달이 포인터로만 가능하기 때문에 데이터 형에 대한 포인터로의 형 변환(Type Cast)도 필요합니다.


Pro*C의 VARCHAR형과 char 형은 사용 방법에서만 차이가 있는 것이 아닙니다. 저장 공간에 있어서도 차이가 있습니다. char 형은 Fixed Data Type으로 데이터 형의 길이만큼 저장 공간을 차지하고, VARCHAR 형은 데이터의 길이와 상관없이 할당받은 데이터 길이만큼의 저장 공간을 갖습니다. 사용의 편이성만 놓고 보자면 구조체로의 형변환도 안되고, 포인터로의 형번화도 필요없는 char형이 더 좋아보이지만 저장 공간, 즉 메모리 공간의 효율적 사용이라는 측면에서 본다면 VARCHAR 형은 char 형과 견주어 절대 뒤지지 않는 훌륭한 데이터형입니다.


이러한 장점이 작은 규모의 프로그래멩서는 큰 차이를 갖지 않지만, 사용자의 요청이 많은 프로그램이나 핸들링 해야 할 데이터가 많은 프로그램의 경우에는 성능 차이가 점점 크게 벌어지므로 각자 처한 상황에 맞게 충분히 고려한 후에 적절한 데이터 형을 사용해야 합니다.


Pro*C 프로그램에서 저장 공간과 처리 방법에 있어서 차이를 보이는 데이터 형은 char 형과 VARCHAR 형 두 개 밖에 없습니다. 다른 데이터 형은 C 프로그램에서 사용되는 일반 데이터 형과 동일합니다. 그러므로 두 데이터 형을 사용할 때는 주의하기 바랍니다.



CURL 이란?


서버와 통신할 수 있는 커맨드 명령어 툴이다. 웹개발에 매우 많이 사용되고 있는 무료 오픈소스이다 curl의 특징으로는 다음과 같은 수 많은 프로토콜을 지원한다는 장점이 있다.

다양한 지원 프로토콜들
DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet, TFTP

또한 SSL 인증 방식 역시 가능하다.


여기서 내가 가장 잘 알고 있는 프로토콜은 역시나 HTTP와 HTTPS이다. 

HTTP 통신은 프로젝트에서도 많이 사용해 봤기 때문에 익숙하다.


가장 많이 사용하는 프로토콜들 몇 가지를 알아보겠다.




첫 번째, HTTP 프로토콜이다.


HTTP: HTTP(Hypertext Transfer Protocol)는 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜 이다. 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다.

가장 성공적인 인터넷 프로토콜이다. HTTP가 없었다면 인터넷은 지금과는 전혀 다른 모습이였을거다.

HTTP는 어떤 종류의 데이터든지 전송할 수 있도록 설계돼 있다. 인터넷상에서 흔히 볼수 있는 HTML로 작성된 문서는 HTTP로 보낼 수 있는 데이터의 한 종류일 뿐이다. 이미지, 동영상, 오디오, 텍스트 문서들 아무튼 종류를 가리지 않는다.

Transfer라는 해석 그대로 데이터를 전송하겠다라는 의미로 앞에 Hypertext 가 붙은 이유는 하이퍼텍스트 기반으로 데이터를 전송하겠다는. 간단히 말해서 링크기반으로 데이터에 접속하겠다는 의미가 되겠다.


HTTP는 서버/클라이언트 모델을 따른다. 클라이언트에서 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)한다.

  1. 클라이언트 : 서버에 요청하는 클라이언트 소프트웨어가 설치된 컴퓨터. chrom, firefox, ie등의 클라이언트 소프트웨어를 이용한다. 클라이언트는 URI를 이용해서 서버에 접속하고, 데이터를 요청할 수 있다.
  2. 서버 : 클라이언트의 요청을 받아서, 요청을 해석하고 응답을 하는 소프트웨어가 설치된 컴퓨터. Apache, nginx, IIS, lighttpd 등이 서버 소프트웨어다.

웹서버는 보통 표준포트인 80번 포트로 서비스한다.




두 번째, FTP 프로토콜이다.


Fileile Transfer Protocol의 줄임말이다. 하나의 호스트에서 다른 호스트로 파일을 옮기기 위한 TCP기반 프로토콜이다. 보통 FTP는 웹상에 파일을 올리기 위한 목적으로 널리 사용되고 있다. FTP는 서버&클라이언트 모델을 따른다. 클라이언트는 서버에 연결해서 파일 업로드 및 다운로드 요청을 하고, 요청을 받은 서버가 응답 데이터로 파일을 전송하거나 수신한다. 




세 번째, STMP 프로토콜이다.


간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol, SMTP)은 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 사용하는 TCP 포트번호는 25번이다. 상대 서버를 지시하기 위해서 DNS의 MX레코드가 사용된다. RFC2821에 따라 규정되어 있다. 메일 서버간의 송수신뿐만 아니라, 메일 클라이언트에서 메일 서버로 메일을 보낼 때에도 사용되는 경우가 많다.

SMTP는 텍스트 기반의 프로토콜로서 요구/응답 메시지뿐 아니라 모든 문자가 7bit ASCII로 되어있어야 한다고 규정되어 있다. 이 때문에 문자 표현에 8비트 이상의 코드를 사용하는 언어나 첨부파일과 자주 사용되는 각종 바이너리는 마임(MIME)이라고 불리는 방식으로 7비트로 변환되어 전달된다.

SMTP는 메시지를 생성하는 방법을 규정하지 않는다. 메시지 생성을 위하여 로컬 편집이나 단순한 전자 우편 응용이 사용된다. 메시지가 생성되면 호출된 SMTP가 메시지를 받고 TCP를 이용하여 다른 호스트의 SMTP에게 전달한다.



네 번째, TELNET이다.


텔넷.tele network의 준말. 멀리 떨어진 컴퓨터에 연결해 이쪽 컴퓨터를 그쪽에 연결된 터미널로 만들어 주는 인터넷 표준 프로토콜이다. 흔히 컴퓨터 통신을 할 때 쓰는 이야기 등과 같은 터미널 에뮬레이터를 생각하면 된다. 다만 텔넷은 인터넷을 통해서 연결된다는 점만이 다르다. 실제로 하이텔이나 천리안 등 PC통신도 인터넷에 연결하면 텔넷으로 들어갈 수 있다. 텔넷 접속을 하기 위해서는 일반 통신프로그램이나 텔넷 전용 프로그램이 필요하다.



'서버 > 기술' 카테고리의 다른 글

Http 통신 vs Socket 통신  (0) 2019.01.06
restful api  (0) 2018.12.03

 REST의 정의

UTTP URI로 잘 표현된 리소스에 대한 행위를 HTTP Method로 정의한다. 리소스의 내용은 json, xml, yaml

등의 다양한 표현 언어로 정의된다.


REST의 특징

 1)Uniform (유니폼 인터페이스)

Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처

스타이를 말한다.


 2)Stateless (무상태성)

REST는 무상태성 성격을 갖는다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않는다. 세션

정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단수히 처리하면

된다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해진다.


 3)Cacheable (캐시 가능)

REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그래도 사용하기 때문에, 웹에서 사용하는 기존 인프라

를 그대로 활용이 가능하다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능하다. HTTP 프로토콜 표준에서

사용하는 Last-Modified 태그나 E-Tag를 이용하면 캐싱 구현이 가능하다.


 4) Self-descriptiveness(자체 표현 구조)

REST의 또 다른 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수있는 자체 표현 구조로 되어

있다는 것이다.


 5)Client - Server 구조

REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각

각의 역할이 확실히 구분되기 떄문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이

줄어들게 된다.


 6)계층형 구조

REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘

수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.




 RESTFUL API의 장점

 1) rest api 메시지 자체를 읽기만 하는 것으로도 메시지의 본래 의도를 파악할 수 있을 정도로 쉽게 이해가 된다. HTTP 인프라를 그대로

이용하기 때문에 REST를 사용하기 위해 별도의 인프라를 요구할 필요가 없다.

 2)리눅스 서버에 있는 웹서버에 윈도우에서 동작하는 웹 브라우저가 붙어서 동작할 수 있다.


RESTFUL API의 단점

 1)HTTP 메소드의 한계에 묶인다.

간단한 수준의 메소드만 지원할 수 있다.

 2)표준이 없어서 관리하기 어렵다.

어떤 가이드는 특정한 REST API에는 맞지만 또 다른 곳에는 맞지 않을 수 있다.

 3)RDBMS와 어색한 관계

REST API를 RDBMS에 적극적으로 사용하기 위해서는 RESTful한 테이블 구조가 필요하게 되는데, 이것보

다는 NoSQL쪽이 더 잘맞는 추세다.


참고 : https://meetup.toast.com/posts/92

'서버 > 기술' 카테고리의 다른 글

Http 통신 vs Socket 통신  (0) 2019.01.06
CURL 이란?  (0) 2018.12.22

public static void main(String[] args)에서 각각의 의미


main 함수는 프로그램의 시작부터 끝까지 있는 함수이다.


1. public을 사용하는 이유?

다른 클래스들의 메소드들을 호출해서 사용하는데, main 자체가 다른곳에서 접근을 허용하지 않으면 문제가 발생하기

때문에 public 사용


2. static을 사용하는 이유?

static의 특징으로는 따로 인스턴스화 하지 않아도 되고, 시작과 동시에 메모리에 호출되어진다는 점이다.

즉, 프로그램이 종료될 때까지 계속 유지가 되는데, static이 있기 때문에 계속 참조할 수 있고, GC(garbage collector)에

의해서 사라질 염려가 없기에, static을 사용해야한다.


3. void를 사용하는 이유?

main 함수 자체가 시작과 끝을 의미하는 것인데, 종료되는 시점에서 무슨 값을 반환한다 해서 의미가 있다고 생각하지

않는다. 그렇기 때문에 void로 설정해야한다.


4. args[]를 사용하는 이유?

처음 프로그램을 실행하는 순간 외부 값을 가져와서 프로그램 안에 사용하고자 할 때, 메모리에 저장할 공간을 미리 선언

해 두기 위해서 사용

'프로그래밍 > JAVA' 카테고리의 다른 글

싱글턴 패턴 사용하는 이유  (0) 2019.01.06
abstract와 Interface  (0) 2019.01.04
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31
JAVA 파일입출력  (0) 2018.08.30

프레임워크

소프트웨어 어플리케이션이나 솔루션의 개발을 수월하게 하기 위해 소프트웨어의 구체적 기능들에 해당하는 부분의 설계와 구현을 재사용 가능하도록

협업화된 형태로 제공하는 소프트웨어 환경을 말한다.

 간략하게 설명하면 프로그램 기본 구조(뼈대)라고 생각하면된다.

예시) JAVA 개발자 -> Spring , Python 개발자 -> Django, JavaScript 개발자 -> Angularjs


플랫폼

특정 장치나 시스템 등에서 이를 구성하는 기초가 되는 틀 또는 골격을 지칭하는 용어

오프라인의 가게가 될 수 도 있고 매장일 수도 있고, 온라인의 판매 시스템인 쇼핑몰, 카페, 블로그 다양한 SNS, 소셜미디어, 라이브 쇼핑몰 등 무엇인가(

컨텐츠 상품 등)를 알리고 팔고, 살 수 있는 툴(시스템)을 통틀어 플랫폼이라고 한다.

 프로그램이 실행되는 환경이며 플랫폼은 플랫폼 위에 다른 플랫폼이 존재할 수 있다. 가령, Windows에서 java로 개발하고 있으며

앱스토어에서 어플을 내려받는 과정에서 이미 3개의 플랫폼을 사용하고 있는 것이다.

플랫폼은 같은 영역에도 다양한 목적과 가치로 많이 만들어지고 있으며 모든 플랫폼에서 실행되도록 개발하기는 어렵다.

프로그램의 목적에 맞도록 플랫폼을 선택하는 것이 중요하다.

예시) Windows, Linux, macOS 등 O/S는 모두 플랫폼이다.

어플을 다운받는 앱스토어, 구글플레이, 원스토어도 플랫폼이다.


프레임워크와 플랫폼의 차이

프레임워크 : 소프트웨어 뼈대 구조

플랫폼 : 소프트웨어 실행 환경



참고 

https://blog.naver.com/kitepc/221314674197

left, right, inner, outer join에 대해서 알아보자.


위의 join 들을 검색했을 때 가장 많이 나오는 사진은 다음과 같다.


결과 부터 말하자면 INNER JOIN은 JOIN과 같은 말이고

LETF JOIN과 LETF OUTER JOIN도 같은 말이다.

쉽게 말해 INNER JOIN은 교집합 OUTER JOIN (LETF JOIN, RIGHT JOIN)은 여집합의 개념, FULL JOIN은 합집합이 되겠다.

NATURAL JOIN은 JOIN 조건이 '=' 일 때 동일한 속성이 두번 나타나게 되는데, 이 중 중복된 속성을 제거하여 같은 속성을 한번 만 표기하는 방법이다.


다음과 같은 예시를 통해 살펴보자.


학생 테이블


학과 테이블


성적 테이블


학생 테이블과 학과 테이블을 조인시켜서 LEFT JOIN, RIGHT JOIN, INNER JOIN에 대해서 알아보도록 하겠다.


1. LEFT JOIN

밑에 예시는 ms-sql 쿼리문에서 따온것이다.

oracle의 경우에는 (+)를 통해 outer조인이 형성된다.

oralce의 경우를 적어보겠다.

(oralce) select *from 학생,학과 where 학생.학과코드 = 학과.학과코드(+);

(mssql) select * from 학생 LEFT (OUTER) JOIN 학과 ON 학생.학과코드 = 학과.학과코드;


위와 같은 결과를 보면 INNER JOIN의 결과물에서 왼쪽 테이블의 조인조건에 일치하지 않는 행들도 모두 출력한다. (조인조건의 일치하지 않는 경우 오른쪽 테이블의 컬럼값은 존재하지 않으므로 null로 출력된다.


2.RIGHT JOIN

select * from 학생 RIGHT JOIN 학과 ON 학생.학과코드 = 학과.학과코드;


RIGHT JOIN은 딱히 다시 말 할 필요가 없는게 LETF JOIN과 같고 오른쪽 왼쪽만 바꾼거라 생각하면 된다.


3.INNER JOIN

select * from 학생 INNER JOIN 학과 ON 학생.학과코드 = 학과.학과코드;


INNER JOIN은 두 테이블을 JOIN 시킨 결과물이라고 생각하면 된다.

INNER JOIN과 JOIN은 같은 결과물을 볼 수 있다.


4.NATURAL JOIN

select * from 학생 NATURAL JOIN 학과;


NATURAL JOIN은 두 테이블을 JOIN 시킨 결과물에서 JOIN에 이용된 속성의 값을 빼 준 나머지값이 출력된다.


'DB' 카테고리의 다른 글

DataSet DataTable DataGridView  (0) 2019.03.25
DB 정규화  (0) 2019.01.09
statement와 preparedStatement의 차이  (0) 2019.01.05
프로시저란?  (0) 2018.12.26
DB 성능 순서  (0) 2018.09.20


'프로그래밍' 카테고리의 다른 글

포인터 사용이유  (0) 2018.12.26



DB 성능 순서

 

mysql < mssql  < oracle

 

 

mysql ,  mssql,  oracle 차이점 

 

 

필요한 정보를 저장하고 업데이트를 하고 필요 없는 정보를 삭제한다는 가장 기본적인 기능에 있어서

모두동일하지만 사용하는 데이터의 규모와 속도 사용하는 환경등에서 차이가 있습니다.

간단히 설명하자면 아래와 같습니다.

 

 

mysql

 : 현제 선마이크로시스템에서 운영하고있는 오픈소스계열의 데이터 베이스입니다.

 각기 특징은 가지고 있습니다만 기본적인 기능은 mssql과 비슷하기에 착각을 하셨음직도 합니다.

 오픈 소스진영인만큼 기본적으로는 무료로 사용하실수 있습니다.

 

 

mssql

: 마이크로 소프트에서 만든 데이터베이스로 윈도우즈에 특화되어있는 데이터베이스입니다.

기업체에서 사용을 할때에는 라이선스료를 지불을하고 사용을 하여야합니다.

 

 

oracle(sqlplus)

 : 오라클에서 만들어 판매중인 기업용 데이터베이스입니다.

 윈도우즈, 유닉스, 솔라리스 등 기업체에서 사용하는 대부분의 서버군에 설치를 할 수 있습니다.

 

 mssql, mysql보다 대량의 정보관리를 할 때에 가장 좋은 성능을 보입니다.

 sqlplus는 오라클과 연결을 해서 명령을 내릴 수 있는 프로그램입니다.

 (상당히 거리가 있는 설명이 될진 모르지만 온라인 게임에 접속을 하기위해서 실행시키는 게임프로그램을 생각해보시면 이해하시기 편할 듯 합니다. 조작은 자기 컴퓨터에서 하지만 실제의 정보처리는 게임서버에서 한다는 점)

 

msAccess

 : 소규모 데이터베이스를 활용하고자 할 경우 자주 사용되는 데이터베이스입니다.

 엑셀등와 쉽게 연계를 할 수 있기에 소규모 사무실에서 쉽고 간단히 활용을 할 수 있습니다.

 기본적으로 윈도우즈에서만 사용이가능합니다.

=

 

추가적으로 ms sql 은 사용자가 테이블이 보이는상태에서 쿼리나 직접 추가 방식으로 편리하게 사용할수있겠금하였고요 오라클은 쿼리로도 이용할수 있고요 전체적인 사용방법이 text 방식의 입력식으로 이용할수있어서 대용량 자료에 적합하다고 볼수있죠 거의 전반적으로 봤을때 사용이 편한 mssql을 요즘 기업체들에서 많이 사용하고있고요 예전에는 오라클쪽을 많이 이용하였습니다. 전반적으로 쿼리문을 작성할수있으시면은 어느 프로그램이든 쿼리문은 연동이 가능하오니...쿼리문의 작성법부터 하시는것이 좋을듯하네요.... 

 

\http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10205&docId=72525889&qb=7Jik65287YG0IG1zc3FsIG15c3Fs&enc=utf8&section=kin&rank=5&search_sort=0&spq=0&pid=RuPBL35Y7vdsscL/RZNssc--461331&sid=UCejN6dxJ1AAAHN-PaM 


'DB' 카테고리의 다른 글

DataSet DataTable DataGridView  (0) 2019.03.25
DB 정규화  (0) 2019.01.09
statement와 preparedStatement의 차이  (0) 2019.01.05
프로시저란?  (0) 2018.12.26
left, right, inner, outer, natural join  (0) 2018.11.20



DB를 설계할 때는 다음과 같이 5가지 방법으로 크게 나눌 수 있다.

1. 최종 목표 잡기

2.문서화된 요구사항

3. 프로그램의 메뉴 및 기능

4.E-R Diagram

5.데이터베이스 스키마



1. 프로젝트의 최종 목표

- 저희 프로젝트의 목표는 컴퓨터 주문 및 A/S시스템으로써 현재 상용화 되어있는 컴퓨터 판매 프로그램과 유사하게 만들어 내는 것과 자바와 오라클간의 연동 오라클 DBMS의 쿼리문 사용을 숙달 하는 것을 목표로 합니다.


2. 문서화된 요구사항

고객은 회원으로 가입하려면 회원아이디 , 비밀번호 ,이름 ,나이 ,주소, 연락처를 입력해야한다.

가입한 회원에게는 등급과 관리 직원아이디가 부여된다.

등급은 쇼핑등급 기반으로 5개 등급으로 구별된다.

회원은 회원아이디로 식별한다.

직원은 각 개인이 직원 ID를 가지고 있으며, 이름, 전화번호,연락처,직책,비밀번호를 가지고 있다.

직원은 직원아이디로 식별한다.

직원은 여러명의 회원을 관리할 수 있고, 회원 한명은 한명의 관리자에게만 관리 받는다.

상품에 대한 상품번호, 상품명, 가격, CPU, 그래픽카드, 메인보드, 메모리, 파워, SSD, HDD, 수량을 유지해야 한다.

상품은 상품번호로 식별한다.

회원은 여러 상품을 주문할 수 있고, 하나의 상품은 재고에 따라 여러 회원이 주문할 수 있다.

회원이 상품을 주문하면 주문에 대한 주문번호, 주문아이디, 주문한상품번호, 주문수량 , 배송지 , 주문일자, 판매완료정보, 연락처를 유지해야한다.

부품들을 조립하여 하나의 상품으로 만들 수 있다. 하나의 상품은 여러 개의 부품을 조립해 만들 수 있다. 부품 여러 개를 조립해 하나의 상품을 만들 수 있다.

부품이 납품회사를 통해 납품되면 부품번호, 최종공급일자, 공급량, 종류, 부품명, 가격, 납품회사명을 유지해야한다.

부품은 부품번호로 식별한다.

각 부품들은 납품회사를 통해 납품을 받는다. 하나의 납품회사는 여러 개의 부품을 납품할 수 있다.

하나의 부품은 한 납품회사만 납품할 수 있다.

납품회사에 대한 납품회사명, 전화번호, 담당자를 유지해야 한다.

납품회사는 납품회사명으로 식별한다.

회원은 수리접수 신청을 할 수 있고, 수리접수를 신청하면 수리접수에 대한 수리접수번호, 회원아이디, 수리접수일자, 주문번호, 주소, 연락처, 수리상태 정보를 유지해야 한다.

한명의 회원은 여러 개의 수리접수를 신청할 수 있다. 수리접수 신청 하나는 한명의 회원만 신청할 수 있다.

수리접수는 수리접수번호로 식별한다.

 

 

 

3. 프로그램의 메뉴 및 기능


회원가입을 제외한 모든 기능은 로그인을 하여야 사용 가능합니다. 직원아이디로 로그인 할 시 직원의 기능을 사용가능하고, 회원아이디로 로그인 할 시 회원의 기능을 사용가능합니다.

첫 번째 기능은 회원 가입입니다. 회원 가입 시 고객은 회원아이디, 나이, 주소, 연락처, 비밀번호, 이름를 입력해야 합니다. 회원가입시 자동으로 등급과 관리 직원의 아이디가 할당 됩니다. 직원은 회원관리를 할 수 있습니다. 세부적으로 회원 검색, 수정, 삭제기능이 있습니다. 고객은 회원가입과 로그인을 한 후 상품을 주문 할 수 있습니다. 회원 검색에서 이름을 검색 할 시 이름의 일부분만 적어도 검색이 됩니다.

두 번째 기능은 재고 관리입니다. 직원으로 로그인 한 뒤 직원은 재고관리를 할 수 있습니다. 납품될 부품들을 받을 납품회사들을 먼저 등록합니다. 납품회사를 등록하면 납품회사명, 전화번호, 담당자의 정보가 저장됩니다. 직원은 납품회사에서 납품된 재고들을 프로그램에 입력합니다. 그 재고들은 부품으로 구별됩니다. 부품을 받으면 부품번호, 최종공급일자, 공급량, 종류, 납품회사명, 부품명, 가격을 할당 합니다. 직원은 재고 관리를 통해 재고 정보를 수정합니다. (여기서 재고라 함은 CPU,그래픽카드 등 상품으로 합쳐지지 않은 부품이다.)

세 번째 기능은 상품 주문과 상품 관리입니다. 직원이 재고들을 합쳐 상품을 만들면 상품에 대한 상품번호, 상품명, 가격, CPU 그래픽카드, 메인보드, 메모리, 파워, SSD, HDD, 수량이 저장됩니다. 직원은 상품을 등록할 수 있습니다. 상품은 재고들을 결합하여 만들어진 PC여야 합니다. 회원은 원하는 상품을 주문 할 수 있습니다.

네 번째 기능은 주문기능입니다. 회원은 프로그램에 등록된 가격과 성능을 보고 상품을 주문합니다. 회원이 주문할 상품을 선택 후 받는 이의 주소 및 전화번호 등을 입력하고 주문을 버튼을 누르면 주문완료 됩니다. 주문 생성 시 주문에 대한 주문번호, 주문아이디, 주문한상품번호, 주문수량, 주문일자, 배송지, 판매완료정보, 연락처가 저장됩니다. 직원은 회원이 주문을 하면 해당 주문정보를 조회 가능합니다.

다섯 번째 기능은 수리접수 신청기능입니다. 고객은 자신이 이 프로그램을 통해 주문한 상품만 수리접수신청이 가능합니다. 자신의 상품구매 정보 및 주소지 연락처 등을 입력하고 수리접수신청을 누르면 수리접수신청이 완료됩니다. 수리접수 신청은 직원이 확인하여 관리 할 수 있습니다. 수리접수 신청시 수리접수번호, 회원아이디, 수리접수일자, 주문번호, 주소, 연락처, 수리상태의 정보가 남습니다.

여섯 번째 기능은 주문 신청관리와 A/S 신청관리입니다. 회원이 상품을 주문하면 직원은 이 주문 신청관리 기능으로 어떤 상품이 주문되었는지 확인 할 수 있고 상품이 배송완료 되었다는 가정하에 완료된 주문을 판매완료 상태로 변경할 수 있습니다. A/S 신청관리는 상품을 배송받은 회원이 수리접수를 신청한뒤 직원이 수리접수를 신청한 회원의 명단을 볼 수 있는 기능으로서 앞의 주문 신청관리와 마찬가지로 수리접수가 완료되었다는 가정하에 수리접수 상태를 완료상태로 바꿀 수 있습니다.

일곱 번째 기능은 판매량조회기능입니다. 이 기능으로 어느 회원이 몇 개의 상품을 샀는지 알 수 있으며 직원이 원하는 날짜를 입력하면 입력한 날짜부터 날짜까지의 그 날 해당 판매총액이 나오게 됩니다. 판매액은 테이블로 보여지며 판매량이 많은 순, 판매량이 적은 순으로 볼 수도 있습니다.


4. E-R Diagram


5. 데이터베이스 스키마

회원

회원아이디, 나이, 주소, 연락처, 등급, 직원아이디, 비밀번호, 이름

외래키: 직원아이디

 

직원

직원아이디, 이름, 연락처 ,직책, 비밀번호

 

수리접수

수리접수번호, 회원아이디, 수리접수일자, 주문번호, 주소, 연락처, 수리상태

외래키 : 회원아이디, 주문번호

 

상품

상품번호, 상품명, 가격, CPU 그래픽카드, 메인보드, 메모리, 파워, SSD, HDD, 수량

 

부품

부품번호, 최종공급일자, 공급량, 종류, 납품회사명, 부품명, 가격

외래키 : 납품회사명

 

납품회사

납품회사명, 전화번호, 담당자

 

주문

주문번호, 주문아이디, 주문한상품번호, 주문수량, 주문일자, 배송지, 판매완료정보, 연락처

외래키 : 회원아이디, 주문한상품번호

 

 

 

'DB > Oracle' 카테고리의 다른 글

DB 쿼리  (0) 2018.12.25
Statement 대신 preparedStatement 사용하는 이유  (0) 2018.12.25
SQL실습을 위한 Oracle XE 11g 설치 및 준비  (0) 2018.07.27
sqldeveloper 테스트 실패  (0) 2018.07.27
JSP oracle 연동  (0) 2018.07.26


Set을 이용


ArrayList를 이용

'백준 알고리즘 > JAVA' 카테고리의 다른 글

백준 4673번 셀프 넘버  (0) 2019.01.21
자바 백준 5585번 거스름돈  (0) 2018.09.02
자바 백준 7568번 덩치  (1) 2018.08.25
자바 백준 1065번 한수  (0) 2018.08.23
자바 백준 2231번 분해합  (0) 2018.08.23

+ Recent posts