728x90
반응형

Tibero Jdbc 를 이용해 Clob 을 조회 하는 샘플소스를 예제를 기록 합니다. 

 

Clob 컬럼을  포함한 샘플 테이블 생성 

try {
	tbstmt.executeQuery("drop table TEST_CLOB_TBL");
} catch (SQLException e) {
	e.printStackTrace();
}

try {
	tbstmt.executeQuery("create table TEST_CLOB_TBL (c1 varchar2(10000))");
} catch (SQLException e) {
	e.printStackTrace();
}

try {
	tbstmt.executeQuery("insert into TEST_CLOB_TBL select level from dual connect by level <= 10");
} catch (SQLException e) {
	e.printStackTrace();
}

 

Clob 컬럼 조회

try {

	ResultSet rs = tbstmt.executeQuery("select xmlagg(xmlelement(c1, c1)) as col_clob from TEST_CLOB_TBL");

	if (rs.next()) {

		TbClob clob = (TbClob) rs.getClob("col_clob");
		Reader instream = clob.getCharacterStream();
		char[] buffer = new char[10];
		int length = 0;

		while ((length = instream.read(buffer)) != -1) {

			for (int i = 0; i < length; i++)
				System.out.print(buffer[i]);
		}

		instream.close();
	}
	rs.close();
} catch (SQLException e) {
	e.printStackTrace();
}

ClobTest.java 


import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.tmax.tibero.jdbc.TbClob;

public class ClobTest {

	static String IP = "localhost";
	static String PORT = "40060";
	static String TB_SID = "tibero";
	static String userid = "tibero";
	static String pwd = "tmax";

	public static void main(String args[]) {
		try {
			Class.forName("com.tmax.tibero.jdbc.TbDriver");

			Connection tbconn;
			Statement tbstmt;
			tbconn = DriverManager.getConnection("jdbc:tibero:thin:@" + IP + ":" + PORT + ":" + TB_SID, userid, pwd);

			tbstmt = tbconn.createStatement();

			try {
				tbstmt.executeQuery("drop table TEST_CLOB_TBL");
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {
				tbstmt.executeQuery("create table TEST_CLOB_TBL (c1 varchar2(10000))");
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {
				tbstmt.executeQuery("insert into TEST_CLOB_TBL select level from dual connect by level <= 10");
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {

				ResultSet rs = tbstmt.executeQuery("select xmlagg(xmlelement(c1, c1)) as col_clob from TEST_CLOB_TBL");

				if (rs.next()) {

					TbClob clob = (TbClob) rs.getClob("col_clob");
					Reader instream = clob.getCharacterStream();
					char[] buffer = new char[10];
					int length = 0;

					while ((length = instream.read(buffer)) != -1) {

						for (int i = 0; i < length; i++)
							System.out.print(buffer[i]);
					}

					instream.close();
				}
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

			tbstmt.close();
			tbconn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

728x90
반응형
728x90
반응형

IT 업무를 하면서 REST ,RESTful 이란 용어를 많이 접하게 됩니다.

어느정도 웹서비스에 대한 이해를 가지고 있었기 때문에 자세히는 몰라도 대충은 이해 하였으나 

주위 사람이 물어 봤을때 자신있게 설명할 자신이 없어 글로 작성하면서 REST에 대한 개념을 정리해보겠습니다. 

REST란? 

※REST(Representational State Transfer)는 월드와이드웹( WWW) 과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 종류 입니다.  2000년  로이 필딩(Roy Fielding)의 논문에서 발표된 내용으로 로이 필딩은 HTTP의 주요 저자 중 한 사람 이라고 합니다. 간단히 말하자면  REST는 네트워크 아키텍처 라고 생각하면 됩니다.

 

REST 아키텍처 특정

REST 아키텍처는 다음의 6가지 제한 조건을 준수해야 합니다. 

  1. Uniform Interface(인터페이스 일관성)
    • 일관적인 인터페이스로 수행해야 합니다. 
    • URI 로 지정한 Resource 에 대한 조작을 통일되고 한정적으로 수행 해야합니다. 
  2. Stateless(무상태)
    • 각 요청 간 클라이언트의 콘텍스트(context)가 서버에 저장되어서는 안 된다.
    • 세션이나 쿠키등을 별도로 관리하지 않으므로 서버는 클라이언트 요청 메시지 만으로 처리되어 질수 있도록 구현해야 한다.
  3. Cacheable(캐시 처리 가능)
    • 월드와이드웹( WWW)에서와 같이 클라이언트는 응답을 캐싱할 수 있어야 한다.
  4. Layered System(계층화)
    • 클라이언트는 보통 대상 서버에 직접 연결되었는지, 또는 중간 서버 혹은 미들웨어를  통해 연결되었는지를 알 필요가 없어야 합니다.  
  5. Code on demand (optional)
    • 자바 애플릿이나 자바스크립트의 제공을 통해 서버가 클라이언트가 실행시킬 수 있는 로직을 전송하여 기능을 확장시킬 수 있다.
  6. Server-Client 구조
    • 아키텍처를 단순화시키고 작은 단위로 분리(decouple)함으로써 클라이언트 와 서버간 의존성을 분리 해야 한다. 서버는 API 를 제공 하고 클라이언트는 사용자 인증이나 컨텍스트 등을 직접 관리 한다.

REST 구성 요소

1.자원(Resource) - URI(통합 자원 식별자-Uniform Resource Identifier)

  • 모든 자원에는 고유한 id 가 있으며 해당 자원은 서버에 존재 합니다. 
  • ex) question/detail/123

2.자원에 대한 행위(Verb) - HTTP Method (GET, PUT, POST, DELETE등)

  • 클라이언트는 URI 를 통해 자원을 지정해서 조작 하기 위해서 HTTP Method 를 사용 한다.
  • CRUD Operation , HTTP Method
    • Create : POST (자원 생성)
    • Read : GET (자원의 정보 조회)
    • Update : PUT (자원의 정보 업데이트)
    • Delete : DELETE (자원 삭제)
    •  

3.표현(Representations)

  • 클라이언트가 서버로 요청을 보냈을때 서버가 응답으로 보내주는 자원의 상태를 의미하며 
  • JSON,XML,TEXT, RSS 등의 형태로 표현될수 있다. 

REST API 이란? 

REST 원리를 따르는 API 를 말합니다. 
REST API 올바르게 설계하기 위해서는 몇가지 주의할 사항이  있습니다. 

REST API 설계 주의 사항 

  1. URI 는 정보의 자원을 표현해야 한다.(리소스 명은 동사보다는 명사를 사용)
  2. 자원에 대한 행위는 HTTP Method (GET, PUT, POST, DELETE) 로 표현 한다. 

URI 설계 시 주의 사항

  1.  슬래시 구분자(/)는 계층 관계를 나타내는 데 사용 한다. 
  2. URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
  3. 하이픈(-)은 URI 가독성을 높이는데 사용 한다.
  4. 밑줄(_)은 URI에 사용하지 않는다.
  5. URI 경로에는 소문자를 사용 한다..
  6. 파일 확장자는 URI에 포함시키지 않는다.

RESTful 이란? 

REST 아키텍처를 구현하는 웹서비스를 표현하기 위해 사용되는 용어로 사용되며 REST 원리를 따르는 시스템을 
RESTful 이라는 용어로 사용되며, REST 의 비공식 구현 가이드 입니다.                                                                                

 

728x90
반응형

'IT지식' 카테고리의 다른 글

[IT 지식]스케일 아웃 vs 스케일 업  (0) 2022.04.18
728x90
반응형

Mysql 사용자 생성 및 권한을 부여하는 방법에 대해 간단하게 정리합니다. 

Mysql8 기준으로 작성되어  있습니다. 

Mysql 기본 정보 확인

유저를 생성하기에 앞서 우선 Mysql 기본 정보를 확인 합니다. 

제가 테스트하는 Mysql 은 도커로 설치되었습니다. 

설치 방법은 Mysql 도커 설치 글을 참고 하세요 

root 접속 (mysql -u root  -p --host 127.0.0.1)

root@24a15adb0cb3:/# mysql -u root  -p --host 127.0.0.1        
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1938
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Database 생성 삭제 및 변경 

#database 생성 
create database book_db;

#utf8 로 database 생성 
create database book_db character set utf8mb4 collate utf8mb4_general_ci;

#database 삭제
drop database book_db ;


SET character_set_client = utf8mb4 ;
SET character_set_results = utf8mb4 ;
SET character_set_connection = utf8mb4 ;
ALTER DATABASE [DB명] DEFAULT CHARACTER SET utf8mb4 ;

 

mysql> drop database book_db ;
Query OK, 0 rows affected (0.05 sec)

mysql> create database book_db;
Query OK, 1 row affected (0.00 sec)

mysql>  drop database book_db ;
Query OK, 0 rows affected (0.00 sec)

mysql>  create database book_db character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| book_db            |
| information_schema |
| mysql              |
| mysql8             |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

mysql database 선택(use mysql)

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

유저정보 확인 (select user, host from user;)

  • 현재 생성되어 있는 유저 정보를 확인합니다. 
mysql> select user, host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| bookadmin        | %         |
| devuser1         | %         |
| root             | %         |
| testuser         | %         |
| devuser1         | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
9 rows in set (0.00 sec)

데이터베이스 정보 확인(show databases;)

  • Mysql에 생성된 database 정보를 확인합니다. 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mysql8             |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

 

반응형

 

유저 생성 및 권한 추가 삭제

  • 유저를 생성하기 위한 기본 정보가 확인 되었으므로 이제 유저를 생성해 보겠습니다. 

유저 생성 및 권한 부여 

  • 'localhost' 대신 '%' 을 사용할 경우 외부에서도 접속 가능합니다.
# create user '[유저명]'@'[접속허용IP]' identified by '[비밀번호]';
create user 'manager'@'localhost' identified by 'test123';

grant all privileges on [권한 허용 database].* to manager@'[접속허용IP]';
grant all privileges on mysql8.* to manager@'localhost';

 

mysql> create user 'manager'@'localhost' identified by 'test123';
Query OK, 0 rows affected (0.20 sec)

mysql> grant all privileges on mysql8.* to manager@'localhost';
Query OK, 0 rows affected, 1 warning (0.04 sec)

 

유저 정보 변경 

mysql> alter user  manager@'%' identified with mysql_native_password by 'test123';
Query OK, 0 rows affected (0.01 sec)

 

부여된 권한 정보 확인( SHOW GRANTS FOR manager@localhost;)

mysql> SHOW GRANTS FOR manager@localhost;
+-------------------------------------------------------------+
| Grants for manager@localhost                                |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `manager`@`localhost`                 |
| GRANT ALL PRIVILEGES ON `mysql8`.* TO `manager`@`localhost` |
+-------------------------------------------------------------+
2 rows in set (0.00 sec)

생성된 계정에 접속 

mysql -u manager  -p                 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1943
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

테이블 생성

databasee 와 유저 생성에 대해 알아보았습니다. 

이제 해당 databse 에 table 생성해 보겠습니다. 

 

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| book_db            |
| information_schema |
| mysql              |
| mysql8             |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
mysql> show tables;
+-------------------+
| Tables_in_book_db |
+-------------------+
| book              |
+-------------------+
1 row in set (0.00 sec)
  • book_db database 에 book 테이블 을 만들고 bookadmin 유저에 권한을 부여하는 명령입니다. 
CREATE TABLE `book` (
 `book_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
 `title` VARCHAR(200) NOT NULL,
 `category` VARCHAR(200) NOT NULL DEFAULT '',
 `price` INT NULL,
 `insert_date` DATETIME NOT NULL DEFAULT NOW(),
 PRIMARY KEY (`book_id`)
);

GRANT EXECUTE, SELECT, SHOW VIEW, ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, LOCK TABLES  ON `book_db`.* TO 'bookadmin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
mysql> CREATE TABLE `book` (
    ->  `book_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    ->  `title` VARCHAR(200) NOT NULL,
    ->  `category` VARCHAR(200) NOT NULL DEFAULT '',
    ->  `price` INT NULL,
    ->  `insert_date` DATETIME NOT NULL DEFAULT NOW(),
    ->  PRIMARY KEY (`book_id`)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> 
mysql> GRANT EXECUTE, SELECT, SHOW VIEW, ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, LOCK TABLES  ON `book_db`.* TO 'bookadmin'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
728x90
반응형

'05.DB > Mysql' 카테고리의 다른 글

Mysql 실행 SQL 확인 방법  (0) 2023.03.07
[Mysql] DBeaver Mysql 접속  (0) 2022.04.19
728x90
반응형

이미지 사이즈 줄이는 방법 

블로그 운영시 이미지 등록은 최소화 해야 합니다. 

왜냐 하면 이미지는 페이지 로딩 시간에 많은 영향을 주어 구글 SEO (Search Engine Optimization, SEO) 지수에 영향을 주기 때문입니다. 

https://pagespeed.web.de 에서 제 블로그 성능 측정을 해보았습니다. 

최근에 등록한 이미지 페이지 로딩에 상당한 영향을 끼치고 있네요.. 

최대한 빠른 조치를 취해야 하겠습니다. 

 

 

블로그 이미지 로딩 성능 측정

 

 

이미지 사이즈 줄이는 방법1(tinypng)

https://tinypng.com

에서 저장된 이미지를 드래그앤 드롭으로 이미지 용량을 줄일 수 있습니다. 

절반으로 이미지 사이즈가 확 줄 었습니다. 

번거롭지만 블로그를 잘 운영하려면 필수 일 것 같네요 ~ 

 

이미지 사이즈 줄이는 방법2(그림판)

  • 단축키 : window +R =>  mspaint 그림판 실행 
  • 크기 조정을 통해 사이즈 조정 

결론​

블로그 글 작성 시 최소한 크기로  이미지를 첨부하세요!

글의 가독성을 높이기 위한 꼭 필요한 이미지라면 이미지 사이즈를 줄여서 첨부하는 습관을 길러야겠습니다. 

 

728x90
반응형
728x90
반응형

파이참에서 프로젝트 여러 개 실행 방법

파이참 사용시 여러개 프로젝트를 동시에 띄워놓고 다른 프로젝트 코드를 보면서 작업하고 싶을때가 있습니다. 

파이참의 아래 설정을 변경해서 여러개의 프로젝트를 동시에 띄워보세요 

간단하지만 막상 찾아서 사용할때는 또 잘 안보여서 정리 차원에서 기록 합니다. 

파이참 설정 

File -> settings -> SystemSettings -> Reopen Projects on Startup -> New window 라디오 버튼 클릭 

 

 

 

 

파이참 프로 젝트 오픈 

File->open File or Project -> 실행 할 프로젝트 선택 

 

728x90
반응형
728x90
반응형

구글 광고 개시되지 않을 때 해결 방법? 

구글 광고 승인을 받고 나서 티스토리에 구글 광고가 게시가 되지 않을 때 해당 방법을 사용하시기 바랍니다. 

카테고리를 통해 작성된 글에 들어갈 경우 구글은 다른 글로 인식을 하여 해당 글에 광고를 게시하지 않습니다. 

아래처럼 카테고리 접속을 통한  작성된 글에 젒속 할 때 작성된 글에 광고가 게재되지 않습니다. 

 

카테고리 글 접속 URL

 

구글 광고 미 적용 모습

해결 방법

해결하는 방법은 의외로 간단합니다. URL 링크 정보 에서 카테고리 정보를 삭제하는 방법입니다. 

아래 javascripts 를 HTML 편집기에서 <head> </head>  사이에  추가하시면 됩니다. 

 

<!-- URL 링크에서 카테고리 정보 제거 -->
<script type="text/javascript">
     if (typeof(history.pushState) == 'function')
      { var CatagoryURL = location.href;
      CatagoryURL = CatagoryURL.replace(/\?category=([0-9]+)/ig, '');
      history.pushState(null, null, CatagoryURL); }
</script>
<!-- URL 링크에서 카테고리 정보 제거 끝 -->

 

티스토리 html 스킨편집

 

 

적용 결과 

해당 내용을 HTML 에 추가 후 카테고리에서 글을 선택하면 카테고리 링크가 삭제되어 정상적으로 광고가 게시됩니다. 

 

728x90
반응형
728x90
반응형

Django-debug-toolbar 란? 

장고를 사용해서 프로그램을 개발하다 보면 웹페이지에서 디버깅하는데 많은 어려움이 있습니다. 

개발 시 디버깅을 도와주는 좋은 라이브러리가 있어 설치 및 사용 방법에 대해 간단히 소개합니다. 

해당 라이브러리는 sql,정적 파일 , cache 같은 내용을 디버깅하는데 많은 도움이 될 것 같습니다. 

장고로 웹페이지를 개발한다면 필수로 봐야 겠네요.. 

 

Django-debug-toolbar 설치

pip install django-debug-toolbar

 

> pip install django-debug-toolbar
Collecting django-debug-toolbar
  Downloading django_debug_toolbar-3.4.0-py3-none-any.whl (218 kB)
     ---------------------------------------- 218.4/218.4 KB 6.7 MB/s eta 0:00:00
Requirement already satisfied: Django>=3.2 in d:\000.program\python\venv\pmsenv\lib\site-packages (from django-debug-toolbar) (4.0.4)
Requirement already satisfied: sqlparse>=0.2.0 in d:\000.program\python\venv\pmsenv\lib\site-packages (from django-debug-toolbar) (0.4.2)
Requirement already satisfied: asgiref<4,>=3.4.1 in d:\000.program\python\venv\pmsenv\lib\site-packages (from Django>=3.2->django-debug-toolbar) (3.5.1)
Requirement already satisfied: tzdata in d:\000.program\python\venv\pmsenv\lib\site-packages (from Django>=3.2->django-debug-toolbar) (2022.1)
Requirement already satisfied: backports.zoneinfo in d:\000.program\python\venv\pmsenv\lib\site-packages (from Django>=3.2->django-debug-toolbar) (0.2.1)
Installing collected packages: django-debug-toolbar
Successfully installed django-debug-toolbar-3.4.0

settings.py 파일 수정

  • INSTALLED_APPS 설정에 debug_toolbar 를 작성합니다.
INSTALLED_APPS = [
     'debug_toolbar',
    ]

 

  • MIDDLEWARE 추가 
MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]
  • INTERNAL_IPS 추가
INTERNAL_IPS = [
    '127.0.0.1',
]

urls.py 파일 수정

  • 장고 앱이 urls.py 가 아나리 , urls.py 는 프로젝트의 url 입니다. 
  • chrome 에서 debug_toolbar 가 보이지 않아 이곳 저곳 검색해 보던 중 해결책을 찾았습니다. 

  • urls.py 에 아래 두 줄을 추가 해주세요 
import mimetypes
mimetypes.add_type("application/javascript", ".js", True)

최종 수정 

from django.contrib import admin
from django.urls import include, path
import mimetypes
import config.settings.base
from config import settings

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
if config.settings.base.DEBUG:
    mimetypes.add_type("application/javascript", ".js", True)
    if "debug_toolbar" in settings.base.INSTALLED_APPS:
        import debug_toolbar
        urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns

 

Django debug_toolbar 적용 확인 

  • debug_toolbar 가 적용된 django 웹 페이지 

django debug_toolbar

  • 이제 로컬에서 개발 할때 디버그를 편하게 할 수 있게 되었습니다. 

728x90
반응형
728x90
반응형

리눅스 하드 디스크 추가 방법

리눅스에 새로운 하드디스크 추가시 마운트 하는 방법에 대해 알아 보겠습니다. 

 

umount 

umount /dev/sda1

 

하드디스크 마운트 정보 확인 (fdisk -l )

[root@centos7:/root]$ fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14       60801   488279610   8e  Linux LVM

Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      121601   976760001   83  Linux

파티션 분리

[root@centos7:/]$ fdisk /dev/sdb

The number of cylinders for this disk is set to 121601.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): h
h: unknown command
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): d
Partition number (1-4): 1

Command (m for help): d
Selected partition 2

Command (m for help): d
No partition is defined yet!

Command (m for help): d
No partition is defined yet!

Command (m for help): p

Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n 
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1 <-- 첫번째 파티션
First cylinder (1-121601, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-121601, default 121601): +500g <-- 첫번째 파티션 500g

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2 <-- 두번째 파티션
First cylinder (60790-121601, default 60790):
Using default value 60790
Last cylinder or +size or +sizeM or +sizeK (60790-121601, default 121601): <-- 나머지 파티션
Using default value 121601

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Mount 디렉토리 생성 및 포멧

#마운트할 디렉 토리 생성
mkdir data1
mkdir data2

#ext3 포멧으로 하드디스크 포멧
mkfs.ext3 /dev/sda1

생성 디렉토리에 하드 디스크 마운트

mount -t ext3 /dev/sdb1 /data1
mount -t ext3 /dev/sdb2 /data2

Mount 디렉토리 부팅 설정

  • /etc/fstab 파일 수정
/dev/sdb1               /data1                  ext3    defaults        0 0
/dev/sdb2               /data2                  ext3    defaults        0 0

 

[root@centos7:/]$ vi /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
/dev/sdb1               /data1                  ext3    defaults        0 0
/dev/sdb2               /data2                  ext3    defaults        0 0

추가된 하드디스크 마운트 확인 (df -h)

[root@centos7:/root]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      448G  343G   82G  81% /
/dev/sda1              99M   26M   68M  28% /boot
tmpfs                 2.9G     0  2.9G   0% /dev/shm
/dev/sdb1             917G  200M  871G   1% /data
728x90
반응형
728x90
반응형

리눅스 ftp 로 put 명령 실행시 에러 발생시 해결 방법

  • 에러 발생 현상 
ftp>  put test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (192,168,37,122,216,217).
553 Could not create file.
  • 해결방법
setsebool -P allow_ftpd_full_access on
setsebool -P ftp_home_dir on

 

728x90
반응형
728x90
반응형
반응형

Tibero 에서 제공하는 TDP.net 테스트 방법에 대해 소개 하겠습니다. 

TDP.net 드라이버는 Tibero 에서 제공하는 .NET Data Provider로서 사용자의 .NET 애플리케이션 프로그램과 Tibero간의 SQL 인터페이스 역할을 수행합니다. 

Oracle 에서 제공하는 ODP.net 과 동일한 역할을 수행 합니다. 

 

Visual Studio .Net 환경 C# 테스트 가이드

  • 본 예제는 Visual Studio 환경에서 TDP.net 드라이버를 이용한 Tibero 연동 테스트에 대해 설명 합니다. 

 

Visual Sutudio TDP.net 프로젝트 기본 환경 설정

  • 새프로젝트 -> 템플릿 -> Visual C# -> 콘솔 응용프로그램 선택

 

Visual Sutudio C# Test 파일 생성 

  • 솔루션 탐색기 에서 마우스 우클릭 후 추가 버튼 클릭 합니다. 
  • 새항목 선택 -> C# 클래스 파일을 선택 합니다. 
  • SampleTDP.cs  파일로 생성 하겠습니다. 
  • SampleTDP.cs 파일에 메인 함수를 추가 합니다. 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tibero_tdpnet_samples
{
    class SampleTDP
    {

        static void Main(string[] args)
        {
            try
            {
                SampleTDP sample = new SampleTDP();
                Console.WriteLine("=== TEST START ===");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.ToString());

            }
            Console.WriteLine(" == Success == ");
            Console.ReadLine();
        }
    }
}

 

 

 

 

TDP.net 라이브러리 추가 

  • 프로젝트 우측 솔루션 탐색기 선택 -> 참조 버튼 우클릭 -> 찾아 보기 에서 Tibero.DataAccess.dll 라이브러리 추가 
  • 이클립스에서 jar 파일 라이브러리를 추가하는 작업이라고 보시면 됩니다. 

 

 

 

테스트 코드 실행 

  • Visual Studio 상단 실행 버튼을 클릭합니다. 
  • 아래 처럼 에러가 발생합니다. 
오류 1 'd:\000.program\dotnet\tibero-tdpnet-samples\tibero-tdpnet-samples\obj\Debug\tibero-tdpnet-samples.exe' 프로그램에 진입점이 두 개 이상 정의되어 있습니다.

 

  • 메뉴 -> 프로젝트 -> 프로젝트 속성을 클릭 해서 실행할 클래스 파일을 선택합니다. 

  • 프로젝트 속성 변경 후 실행을 하면 콘솔창이 출력 되고 메인 함수 에서 Print 한 출력 내용이 콘솔에 뿌려 집니다. 

 

  • 실행 후 콘솔창이 종료 되지 않는 이유는 메인함수  Console.ReadLine(); 함수로 콘솔 입력을 기다리기 때문입니다. 

 

TDP.net Tibero 연동 테스트 

기본 적인 테스트 환경 설정이 끝났습니다. 

티베로와 연동하는 테스트 코드를 작성해 보겠습니다. 

티베로  테스트 table 및 프로시져 생성 

SQL> desc sampleTable;

COLUMN_NAME                              TYPE               CONSTRAINT          
---------------------------------------- ------------------ --------------------
COL1_NUMBER                              NUMBER             
COL2_VARCHAR                             VARCHAR(4000)      
create table sampleTable ( col1_number number , col2_varchar varchar(4000)); 

create or replace procedure PROC_INSERT(in_col_num in number , in_col_vchar in varchar )
is
begin
insert into sampleTable (col1_number ,col2_varchar) values (in_col_num, in_col_vchar) ;
end;
/

티베로 TDP.net 팩키지 추가

using 절에 연동에 필요한 팩키지를 추가 합니다. 

using Tibero.DataAccess.Client; // 참조 팩키지
namespace tibero_tdpnet_samples

 

티베로 연동 소스 코드

아래는 티베로와 연동하는  ExecuteSample() 함수 를 추가 하겠습니다. 

아래 함수를 샘플 클래스 소스에 추가 합니다. 

        public void ExecuteSample()
        {
            try
            {
                Console.WriteLine(" == ExecuteSample 함수 시작  == ");
                //Connect String 설정 
                string tbconnstr = "User Id=" + "tibero" + " ; Password=" + "tmax" + ";Data Source = (INSTANCE =(HOST=" + "127.0.0.1" + ")(PORT=" + 17000 + ")(DB_NAME=" + "tibero" + ")";

                //Connect 연결
                using (TiberoConnection conn = new TiberoConnection(tbconnstr))
                {
                    conn.Open();

                    TiberoCommand cmd = new TiberoCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "PROC_INSERT";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.BindByName = true;

                    //parameter Set Case1 
                    Console.WriteLine("========= data Bind Case1 ==============");
                    TiberoParameter in_col_num = new TiberoParameter();
                    in_col_num.Direction = ParameterDirection.Input;
                    in_col_num.TiberoDbType = TiberoDbType.Decimal;
                    in_col_num.ParameterName = "in_col_num";
                    in_col_num.Value = "1";
                    cmd.Parameters.Add(in_col_num);

                    TiberoParameter in_col_varchar = new TiberoParameter();
                    in_col_varchar.Direction = ParameterDirection.Input;
                    in_col_varchar.TiberoDbType = TiberoDbType.Varchar2;
                    in_col_varchar.Size = 4000;
                    in_col_varchar.ParameterName = "in_col_vchar";
                    in_col_varchar.Value = "test bind varchar case1 ";
                    cmd.Parameters.Add(in_col_varchar);


                    //Query 실행
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();

                    cmd.CommandText = "SELECT COL1_NUMBER , COL2_VARCHAR FROM SAMPLETABLE";
                    cmd.CommandType = CommandType.Text;


                    TiberoDataReader dr = null;
                    dr = cmd.ExecuteReader();
                    //Tibero DataReader
                    while (dr.Read())
                    {
                        Console.Write("COL1_NUMBER  : [" + dr.GetDecimal(0) + "]");
                        Console.Write(" - ");
                        Console.WriteLine("COL2_VARCHAR : [" + dr.GetValue(1) + "]");

                    }

                    //parameter set Case2
                    Console.WriteLine("========= data Bind Case2 ==============");
                    cmd.Parameters.Add("in_col_num", TiberoDbType.Decimal).Value = 2;
                    cmd.Parameters.Add("in_col_vchar", TiberoDbType.Varchar2, 4000).Value = "test bind varchar case2";


                    cmd.CommandText = "SELECT COL1_NUMBER , COL2_VARCHAR FROM SAMPLETABLE";
                    cmd.CommandType = CommandType.Text;

                    dr = cmd.ExecuteReader();
                   
                    while (dr.Read())
                    {
                        Console.Write("COL1_NUMBER  : [" + dr.GetDecimal(0) + "]");
                        Console.Write(" - ");
                        Console.WriteLine("COL2_VARCHAR : [" + dr.GetValue(1) + "]");

                    }

                    cmd.CommandText = "delete from SAMPLETABLE";
                    cmd.CommandType = CommandType.Text;
                    cmd.ExecuteNonQuery();

                    //자원 해제
                    in_col_num.Dispose();
                    dr.Dispose();
                    conn.Close();

                    Console.WriteLine(" == ExecuteSample 함수 종료  == ");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.ToString());
                Console.ReadLine();
            }

        }

 

Main 함수 ExecuteSample 호출 

티베로와 연동하기 위해 메인함수에 sample.ExecuteSample(); 함수를 추가 합니다. 

                SampleTDP sample = new SampleTDP();
                sample.ExecuteSample();

 

테스트 실행 결과 

  • 매뉴 실행 버튼을 누르면 콘솔에 Tibero 에 입력된 데이터를 출력 합니다. 

예제 설명 

  • Tibero Conntion String 을 설정 합니다. 
string tbconnstr = "User Id=" + "tibero" + " ; Password=" + "tmax" + ";Data Source = (INSTANCE =(HOST=" + "127.0.0.1" + ")(PORT=" + 17000 + ")(DB_NAME=" + "tibero" + ")";
  • 티베로에 생성한 프로시져(PROC_INSERT)를 호출해서 데이터를 입력 할수 있도록 Connection 과 바인드 파라미터 맵핑을 설정 합니다. 
                                //Connect 연결
                using (TiberoConnection conn = new TiberoConnection(tbconnstr))
                {
                    conn.Open();

                    TiberoCommand cmd = new TiberoCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "PROC_INSERT";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.BindByName = true;

                    //parameter Set Case1 
                    Console.WriteLine("========= data Bind Case1 ==============");
                    TiberoParameter in_col_num = new TiberoParameter();
                    in_col_num.Direction = ParameterDirection.Input;
                    in_col_num.TiberoDbType = TiberoDbType.Decimal;
                    in_col_num.ParameterName = "in_col_num";
                    in_col_num.Value = "1";
                    cmd.Parameters.Add(in_col_num);

                    TiberoParameter in_col_varchar = new TiberoParameter();
                    in_col_varchar.Direction = ParameterDirection.Input;
                    in_col_varchar.TiberoDbType = TiberoDbType.Varchar2;
                    in_col_varchar.Size = 4000;
                    in_col_varchar.ParameterName = "in_col_vchar";
                    in_col_varchar.Value = "test bind varchar case1 ";
                    cmd.Parameters.Add(in_col_varchar);
  • 티베로 프로시져를 호출합니다. 
                    //Query 실행
                    cmd.ExecuteNonQuery();
  • 프로시져를 통해 입력한 데이터를 조회 합니다. 
  • JDBC 에서는 ResutlSet 으로 데이터 를 받는다면 Tdp.net 에서는 TiberoDataReader 클래스에서 데이터 출력을 처리합니다. 
                    cmd.CommandText = "SELECT COL1_NUMBER , COL2_VARCHAR FROM SAMPLETABLE";
                    cmd.CommandType = CommandType.Text;


                    TiberoDataReader dr = null;
                    dr = cmd.ExecuteReader();
                    //Tibero DataReader
                    while (dr.Read())
                    {
                        Console.Write("COL1_NUMBER  : [" + dr.GetDecimal(0) + "]");
                        Console.Write(" - ");
                        Console.WriteLine("COL2_VARCHAR : [" + dr.GetValue(1) + "]");

                    }

 

SampleTDP.cs
0.00MB

728x90
반응형

'05.DB > Tibero' 카테고리의 다른 글

Tibero TAC 설치  (0) 2023.03.13
Tibero RODBC 연동 방법  (1) 2023.03.02
Tibero JDBC Clob 조회 예제  (0) 2022.07.18
[Tibero]Tibero ODBC 연동  (0) 2022.04.11
[Tibero-Utility] UTL_SMTP 팩키지를 이용한 메일전송 프로시져  (0) 2022.04.09

+ Recent posts