728x90
300x250

[Spring-Framework] 40. Connection Pool - xml 정리(Oracle, MySQL, HikariCP, Apache DBCP)


root-context.xml과 같은 context.xml 파일에 빈스(Beans)로 등록해서 사용할 때 매우 요긴하게 사용될 수 있는 DataSource에 대해서 정리하였다.

의외로 정리된 자료를 찾기가 귀찮아서 정리하였으니 참고하여 잘 사용하면 된다.


연관 글은 38, 39번 Spring-Framework에도 적용해볼 수 있다.



1. 정리


많이 필요한 경우가 생긴다. 이거 찾는데 시간 허비하지 말라고 작성한다.


[추가]
     <!-- MySQL - DataSource 셋팅 -->
    <bean id="dataSource2" class="com.mysql.cj.jdbc.MysqlDataSource">
        <property name="URL" value="${ORACLE_DB_URL}" />
        <property name="user" value="${ORACLE_DB_USERNAME}"/>
        <property name="password" value="${ORACLE_DB_PASSWORD}"/>
    </bean>


    <!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> -->
 
     <!-- 2. Oracle - DataSource 셋팅 -->
    <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
        <property name="URL" value="${ORACLE_DB_URL}" />
        <property name="user" value="${ORACLE_DB_USERNAME}"/>
        <property name="password" value="${ORACLE_DB_PASSWORD}"/>
        <property name="connectionCachingEnabled" value="true"/>
    </bean>

    <!-- 3. Apache DBCP -->

   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
         <property name="driverClassName" value="${jdbc.driverClassName}" />
         <property name="url" value="${jdbc.url}" />
         <property name="username" value="${jdbc.username}" />
         <property name="password" value="${jdbc.password}" />
   </bean>


    <!-- 4. HikariCP -->
    <!--
    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
         <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
         <property name="username" value="username" />
         <property name="password" value="password" />
    </bean>
 
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
          <constructor-arg ref="hikariConfig"/>
    </bean>
     -->



    <!-- 5. MariaDB -->
    <!--
    <bean id="dataSource4" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="org.mariadb.jdbc.Driver"/>
        <property name="url" value="jdbc:mariadb://localhost:3306/test"></property>
        <property name="username" value="root"/>
        <property name="password" value="test"/>
    </bean>
     -->
    
    <!-- 6. MyBatis // 트랜젝션 적용 버전 -->
    <!--
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource4"/>
        <property name="configLocation" value="classpath:mybatis/config.xml"/>
        <property name="mapperLocations" value="classpath:mybatis/sql/*.xml"></property>
    </bean>
   
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
   
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource4"/>
    </bean>
   
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
     -->





2. 공식 사이트


http://commons.apache.org/proper/commons-dbcp/

https://github.com/brettwooldridge/HikariCP

-> 메뉴얼이 다소 부족하다. 깔끔하게 잘 정리는 되어 있는데 그런 점이 없는 건 아니다. 


https://www.oracle.com/kr/

https://www.mysql.com/

https://mariadb.org/

반응형
728x90
300x250

[PHP] Oracle, MySQL - PDO 사용방법

 

간결하게 요약해서 작성해보았다.

 


1. Oracle, MySQL 데이터베이스 설계하기

 

데이터베이스를 하나 생성한다.

Member를 생성한다.

 

 

그림 1) Oracle SQL Developer에서 Member 테이블 생성하기(Oracle 18c Express Edition)

 

 

그림 2) HeidiSQL에서 Member 테이블 생성하기(MySQL)

 

 
  CREATE TABLE "C##RABBITSUN2"."MEMBER"
   ( "ID" VARCHAR2(20 BYTE) NOT NULL ENABLE,
 "SUBJECT" VARCHAR2(20 BYTE),
  CONSTRAINT "MEMBER_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

  CREATE OR REPLACE EDITIONABLE TRIGGER "C##RABBITSUN2"."MEMBER_TRG"
BEFORE INSERT ON MEMBER
FOR EACH ROW
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
       IF INSERTING AND :NEW.ID IS NULL THEN
           SELECT MEMBER_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
           END IF;
  END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "C##RABBITSUN2"."MEMBER_TRG" ENABLE;

 Oracle SQL

 CREATE TABLE `member` (
     `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
     `subject` VARCHAR(50) NULL DEFAULT NULL,
      PRIMARY KEY (`id`)
 )
 COLLATE='utf8_general_ci'
 ENGINE=InnoDB
 AUTO_INCREMENT=1;

 MySQL SQL

 

 

 


2. Oracle, MySQL - PDO 사용방법(소스코드)

 

<?php

/*
 * Subject: PDO
 * Created Date: 2019-12-10
 * Author by: 도도(Dodo) / rabbitsun2@gmail.com
 * Description:
 *
 * Reference:
 * 
 */

include 'MySQLDB.php';
include 'OracleDB.php';

$orcl = new OracleDB('127.0.0.1', 'c##rabbitsun2', '1234');
$orcl->connect();

// SELECT 문(OracleDB)
$query = "SELECT * FROM MEMBER";
$list = $orcl->select($query);

/*
foreach($list as $row){
   
    echo $row["ID"] . "/";
    echo $row["SUBJECT"] . "<br>";
   
}
*/

// INSERT 문(OracleDB)
//$subject = '연습';
//$result = $orcl->insert($subject);

$mysqlDB = new MySQLDB('127.0.0.1', 'rabbit2me', '1234', 'rabbit2me');
$mysqlDB->connect();

$list = $mysqlDB->select($query);

foreach($list as $row){
   echo $row["id"] . "/";
   echo $row["subject"] . "<br>";
}
 
$subject = '연습';
$result = $mysqlDB->insert($subject);

?>


[소스코드: index.php]

 

?>

class MySQLDB{
   
    private $hostName;
    private $userName;
    private $passwd;
    private $tns;
    private $dbh;
   
    public function __construct($hostName, $userName, $passwd, $dbname){
       
        $this->tns = "mysql:host=$hostName;dbname=$dbname";
       
        $this->hostName = $hostName;
        $this->userName = $userName;
        $this->passwd = $passwd;
       
       
    }
   
    public function __destruct(){
        unset($this->dbh);
    }
   
    public function connect(){
       
        $tns = $this->tns;
        $db_username = $this->userName;
        $db_password = $this->passwd;
       
        try{
            $this->dbh = new PDO($this->tns, $db_username, $db_password,
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            //echo "참";
        }catch(PDOException $e){
            echo ($e->getMessage());
        }
       
    }
   
    public function select($query){
       
        $stmt = NULL;
        $dbh = $this->dbh;
       
        if ( $dbh != NULL ){
            $stmt = $dbh->prepare($query);
            $stmt->execute();
            $list = $stmt->fetchAll();
           
            return $list;
        }
       
        return NULL;
       
    }
   
    public function insert($subject){
       
        $stmt = NULL;
        $dbh = $this->dbh;
        $query = "INSERT INTO member(subject) VALUES(:subject)";
       
        if ( $dbh != NULL ){
            $stmt = $dbh->prepare($query);
            $stmt->bindParam(':subject', $subject);
            $stmt->execute();
           
            return true;
        }
       
        return false;
       
    }
   
}

?>


[소스코드: MySQLDB.php]

 

?>
class OracleDB{
   
    private $hostName;
    private $userName;
    private $passwd;
    private $tns;
    private $dbh;
   
    public function __construct($hostName, $userName, $passwd){
       
        $this->tns = "(DESCRIPTION =
            (ADDRESS_LIST =
              (ADDRESS = (PROTOCOL = TCP)(HOST = $hostName)(PORT = 1521))
            )
            (CONNECT_DATA =
              (SERVICE_NAME = xe)
            )
        )";
       
        $this->hostName = $hostName;
        $this->userName = $userName;
        $this->passwd = $passwd;
        $this->dbh = NULL;
       
    }
   
    public function __destruct(){
        unset($this->dbh);
    }
   
    public function connect(){
       
        $tns = $this->tns;
        $db_username = $this->userName;
        $db_password = $this->passwd;
       
        try{
            $this->dbh = new PDO("oci:dbname=". $tns . ";charset=UTF8", $db_username, $db_password);
            //echo "참";
        }catch(PDOException $e){
            echo ($e->getMessage());
        }
       
    }
   
    public function select($query){
       
        $stmt = NULL;
        $dbh = $this->dbh;
       
        if ( $dbh != NULL ){
            $stmt = $dbh->prepare($query);
            $stmt->execute();
            $list = $stmt->fetchAll();
           
            return $list;
        }
       
        return NULL;
       
    }
   
    public function insert($subject){
        $stmt = NULL;
        $dbh = $this->dbh;
        $query = "INSERT INTO MEMBER(SUBJECT) VALUES(:subject)";
       
        if ( $dbh != NULL ){
            $stmt = $dbh->prepare($query);
            $stmt->bindParam(':subject', $subject);
            $stmt->execute();
           
            return true;
        }
       
        return false;
       
    }
   
}

?>


[소스코드: OracleDB.php]

반응형
728x90
300x250
[MySQL(또는 MariaDB)] Debian 10에서 외부 접속 허용하기

 

1. 외부 접속 허용해주기

 

$ sudo vi /etc/mysql/my.cnf을 열어보면 bind-address = 127.0.0.1 라는 부분이 있다.
이 부분을 주석 처리 하고 아래처럼 해준다.

 

#bind-address            = 127.0.0.1
bind-address            = *

 

2. Maria DB(또는 MySQL)에서 네트워크 대역 허용해주기

 

모든 IP 대역 네트워크

INSERT INTO mysql.user (host,user,password) VALUES ('%','root',password('패스워드'));
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES; 


특정 IP 대역 네트워크

INSERT INTO mysql.user (host,user,password) VALUES ('192.168.0.%','root',password('패스워드'));
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.%';
FLUSH PRIVILEGES;


3. 복구

 

모든 IP 대역 네트워크 복구하기

 

DELETE FROM mysql.user WHERE Host='%' AND User='root';
FLUSH PRIVILEGES;


특정 IP 대역 네트워크 복구하기

 

DELETE FROM mysql.user WHERE Host='192.168.0.%' AND User='root';
FLUSH PRIVILEGES;

 

 


[자주 나오는 오류]

 

ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
Mysql 버전이 높아지면서 보안관련 인한 오류입니다.

User 생성시 Host, User ,Password, ssl_cipher, x509_issuer, x509_subject 를 입력 해 주셔야 합니다.
ssl_cipher, x509_issuer, x509_subject 값은 '' 빈값을 입력하세요.

ex)
 insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject )
values('localhost','사용자명',password('비밀번호'),'','','');

 

ERROR 1364 (HY000): Field 'authentication_string' doesn't have a default value

* mysql 5.5 에서 user 생성시 authentication_string 필드 추가. '' 값으로 넣어 주세요.


ex)
insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string)

values('localhost','사용자명', password('비밀번호'),'','','','');

반응형
728x90
300x250
[GNU(리눅스[Linux])] Lubuntu 18.02에서 Apache2.4, MySQL(Community) 5.7, PHP 7.2, Vim 설치하기, Vi 소개

 

루분투 18.02에서 아파치 2, MySQL 5.7, PHP 7.2, Vim을 설치하는 방법에 대해서 소개하겠다.

 


1. 프로젝트 소개

 

사용되는 프로젝트는 다음과 같다.

 


1-1. Apache 2.4 프로젝트

 

아래의 사이트는 아파치 HTTP Server Project 재단의 홈페이지이다.

https://httpd.apache.org/

 

 

 


1-2. PHP 프로젝트

 

아래의 사이트는 PHP사이트이다.

http://www.php.net

 

그림 1-2-1. PHP.net

 


1-3. MySQL Community

 

아래의 링크를 클릭하면 아래의 사이트에 접속할 수 있다.

https://www.oracle.com/kr/mysql/community.html

 

 

그림 1-3-1. MySQL Community - Oracle

 

https://dev.mysql.com/downloads/mysql

 

 

그림 1-3-2. MySQL Community - Oracle

 

아래의 그림은 개발자를 위한 MySQL 사이트이다.

https://dev.mysql.com/

 

 

그림 1-3-3. MySQL Developer Web - Oracle

 


1-4. Lubuntu 패키지 - 아파치, MySQL, PHP(Apache, MySQL, PHP)

 

아래의 사이트는 우분투에서 배포하는 패키지에 관한 사이트이다.

 

https://packages.ubuntu.com/search?keywords=apache2

https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=mysql&searchon=names
https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=php&searchon=names

 

 

그림 1-4-1. 우분투 Package 사이트 - 도도(Dodo)

 

 

그림 1-4-2. MySQL Package Site - 도도(Dodo)

 


1-5. Vim 프로젝트

 

vim 프로젝트에 관한 것이다.

https://www.vim.org

https://www.vim.org/about.php

 

 

그림 1-5-1. Vim 프로젝트 - 도도(Dodo)

 


1-6. GNU Vi Project

 

아래의 사이트는 GNU 재단에서 소개하고 있는 vi이다.

emac과 Vi의 차이에 대해서 소개하고 있다.

 

https://www.gnu.org/software/bash/manual/html_node/Readline-vi-Mode.html

 

 

그림 1-6-1. Vi 에디터 사용방법 - GNU

 

https://www.gnu.org/fun/jokes/vi.song.html

 

 

그림 1-6-2. GNU Vi 소개 - GNU

 

 


2. 설치하기

 

설치하는 방법은 크게 간단한 명령어로 설치할 수 있다.

 

번호

명령어(Command)

설명(Explaination)

비고(Remarks) 

1

sudo apt-get install apache2 php mysql*

아파치, PHP, MySQL 패키지 형태로 설치하기

 

2

 

 

 

 

 

 

그림 2-1. Apache2, PHP, MySQL 설치하기 - 도도(Dodo)

 

 

그림 2-2. Apache2, PHP, MySQL 설치하기 - 도도(Dodo)

 

Y를 입력하고 엔터키를 누른다.

 

 

그림 2-3. Apache2, PHP, MySQL 설치하기 - 도도(Dodo)

 

 

그림 2-4. Apache2, PHP, MySQL 설치하기 - 도도(Dodo)

 

 

그림 2-5. Apache2, PHP, MySQL 설치하기 - 도도(Dodo)

 

 

그림 2-6. Apache2, PHP, MySQL 설치하기 - 도도(Dodo)

 


3. 실행하기


루분투 18.02에서 아파치 웹서버 동작 유무를 확인하는 방법에 대해서 소개하겠다.

 

"시작 메뉴"를 클릭한다.

"인터넷" 탭을 클릭한 후, "Firefox 웹 브라우저"를 클릭한다.

 

 

그림 3-1. Firefox 웹 브라우저 실행하기 - 도도(Dodo)

 

아래의 웹 페이지가 열리면, "localhost" 또는 "127.0.0.1"을 입력한다.

 

 

그림 3-2. Firefox 웹 브라우저 실행하기 - 도도(Dodo)

 


4. 폴더 확인해보기

 

아래의 그림은 처음 설치된 아파치 서버의 웹 페이지가 저장되어 있는 폴더의 위치이다.

 

/var/www/html

 

 

그림 4-1. 폴더 내용 확인하기 - 도도(Dodo)

 

아래의 그림은 LX Terminal을 실행하는 모습이다.

LXTerminal을 실행시키 위해서 선택 및 클릭을 하는 과정이다.

 

 

그림 4-2. LXTerminal 클릭하기 / 시작메뉴에서 시스템 도구 LX Terminal - 도도(Dodo)

 

번호

명령어

설명(Explaination || Description)

비고(Remarks)

1

sudo -i

관리자 권한으로 변경하기

 

 

 

 

그림 4-2. LxTerminal에서 PHP 파일 생성해보기 - 도도(Dodo)

 

번호 

명령어(Command)

설명(
Explaination ||
Description)

 

1

cd /

루트 경로로 이동

 

2

ls

파일,폴더 등 내용 출력

 

3

cd /var/www/html

/var/www/html으로 이동하기

 

 

 

 

그림 4-3. LxTerminal에서 PHP 파일 생성해보기 - 도도(Dodo)

 


5. Vim 설치하기

 

# sudo apt install vim

 

 

그림 5-1. LxTerminal에서 vim 설치하기 - 도도(Dodo)

 

 

그림 5-2. LxTerminal에서 vim 설치하기 - 도도(Dodo)

 

번호

명령어(Command)

설명(Explaination || Description) 

1

vim phpinfo.php

 vi phpinfo.php 도 사용이 가능하다.

2

vi phpinfo.php

vi 에디터에 익숙한 경우에는 vi 에디터를 사용해도 무방하다.

vim과 큰 차이가 없다고 본다. 명령어 등의 체계 오래된 에디터는 vi이다.

 

 

그림 5-2-1. vi 에디터 사용하기 - 도도(Dodo)

 

 

 

 

그림 5-3. LxTerminal에서 vim 설치하기 - 도도(Dodo)

 

입력으로 전환하려면, i키를 누른다.

그림처럼 타이핑을 한다.

esc키를 누른다.

:키를 누른다.

wq를 입력한다.

 


6. 웹 브라우저 실행하기

 

아래의 그림은 PHP를 웹 브라우저에서 실행시킨 모습이다.

 

 

그림 6-1. Apache 2 (루분투 18.02)에서 localhost 실행하기 - 도도(Dodo)

 

 

 

 

그림 6-2. Apache 2 (루분투 18.02)에서 localhost 실행하기 - 도도(Dodo)

 


7. 맺음글(Conclusion)

 

루분투 18.02에서 아파치2, MySQL Community 5.7, PHP 7.2, Vim을 설치하는 방법에 대해서 소개하였다.

Vi도 소개하였다.

 


8. 참고 자료(Reference)

 

1. PHP.net, Last Modified, Accessed by 2018-08-30, http://www.php.net

2. Welcome! - The Apache Homepage, Last Modified, Accessed by 2018-08-30, https://httpd.apache.org/

3. MySQL :: Developer Zone, Last Modified, Accessed by 2018-08-30, https://dev.mysql.com/

4. MySQL Community Edition | MySQL | 오라클 | Oracle 대한민국, Last Modified, Accessed by 2018-08-30, https://www.oracle.com/kr/mysql/community.html

5. MySQL :: Download MySQL Community Server, Last Modified, Accessed by 2018-08-30, https://dev.mysql.com/downloads/mysql/

6. Ubuntu – Package Search Results -- apache2, Last Modified, Accessed by 2018-08-30, https://packages.ubuntu.com/search?keywords=apache2

7. Ubuntu – Package Search Results -- mysql, Last Modified, Accessed b 2018-08-30, https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=mysql&searchon=names

8. Ubuntu – Package Search Results -- php, Last Modified, Accessed by 2018-08-30, https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=php&searchon=names

9. about Vim : vim online, Last Modified, Accessed by 2018-08-30, https://www.vim.org

10. Bash Reference Manual: Readline vi Mode, Last Modified, Accessed by 2018-08-30, https://www.gnu.org/software/bash/manual/html_node/Readline-vi-Mode.html

11. Addicted to vi - GNU Project - Free Software Foundation (FSF), Last Modified 2015/09/13 15:54:59, Accessed by 2018-08-30, https://www.gnu.org/fun/jokes/vi.song.html

반응형
728x90
300x250
[PC활용] APMSetup 6 - 설치

 

이번에 소개할 것은 윈도우 환경에서 Apache + PHP + MySQL을 사용할 수 있는 프로그램이다.

비록 오래되긴 했지만 유용하다.

APMSetup 프로젝트에 대해서 내가 알고 있는 것은 꽤 오래된 프로젝트로 알고 있다.

 

한참 전성기에는 홈페이지도 구축했던 프로젝트로 기억한다.

몇 년전에는 웹서버를 운영한다는 것은 정말 어려운 일이었다. 지금은 조금만 하면 가벼운 웹사이트는 오픈소스 등을 활용하여 쉽게 구축할 수 있다.

 

웹 사이트를 구축하기 위해서는 제일 중요한 것으로 웹 서버가 존재해야 한다.

 

사용 프로그램(Using Program): 윈도우 10, APMSetup 6

 


1. APMSetup 6

 

http://kldp.net/apmsetup 사이트에 접속한다.

Release를 누른다.

 

 

 

그림 1-1. APMSetup 설치, 도도(Dodo)

 

2907-APMSETUP6_2009041200을 기준으로 소개하겠다.

 

그림 1-2. APMSETUP 6 다운로드 받기, Kldp

 

지금 보는 이러한 사이트를 미러링 사이트 또는 파일 사이트라고 한다.

anonymous(익명의 계정)으로 ftp 사이트 등을 열어놓는 곳들이 있다.

물론 이건 FTP 사이트는 아니고, 웹 사이트이다.

 

 

그림 1-3. APMSETUP 6 다운로드 받기, Kldp

 

 

 

그림 1-4. APMSETUP 6 언어팩 설정

 

 

 

그림 1-5. APMSETUP 6 설치, 도도(Dodo)

 

설치 마법사가 뜨면 "다음 >" 버튼을 누른다.

 

 

그림 1-6. APMSETUP 6 설치, 도도(Dodo)

 

실제 프로그램은 APMSETUP6이 아니고, Apache, MySQL, PHP 따로 존재한다.

 

 

그림 1-7. APMSETUP 6 설치, 도도(Dodo)

 

광고 등의 메시지가 나온다.

선택사항이다. 다음을 누른다.

 

 

 

그림 1-8. APMSETUP 6 설치, 도도(Dodo)

 

APM_Setup 6 for Win 32(required)는 필수적으로 체크되어있다.

CUBRID 2008은 CURRID라는 오픈소스 데이터베이스가 있다.

이의 사항을 확인하고 다음을 누른다.

 

 

 

 

그림 1-7. APMSETUP 6 설치, 도도(Dodo)

 

설치 경로를 선택하고 설치를 누른다.

 

 

그림 1-8. APMSETUP 6 설치마법사, 도도(Dodo)

 

APMSetup의 설치 진행 마법사가 진행된다.

지금 장면은 PhpMyAdmin(오픈소스: PHP기반)도 함께 설치되는 모습이다.

 

 

그림 1-9. 방화벽 동의, 도도(Dodo)

 

웹 서버를 사용하면, 포트 등으로 인해 방화벽 해제를 요구한다.

확인을 누른다.

localhost에서 사용할 경우에도 방화벽 해제는 중요하다.

 

 

그림 1-10. 설치 완료, 도도(Dodo)

 

설치가 완료되었다.

아래의 하단에 보면 APMSetup의 아이콘이 뜬다.

녹색으로 된 아이콘에 마우스를 오른쪽 버튼을 누르면 아래와 같이 메뉴가 뜨는 것을 확인할 수 있다.

 

 

그림 1-11. 하단 아이콘 (APMSetup), 도도(Dodo)

 

그림 1-12. APMSetup 6 프로그램

 

그림 1-12는 APMSetup 6이라는 프로그램을 말한다.

Apache Foundation의 Apache 2.2, Oracle의 MySQL Community Edition, PHP.net의 php 5.2가 담겨져 있다.

 

이 프로그램들을 관리하고 실행하는데 도와주는 프로그램이 APMSetup이다.

물론 APMSetup 6이 없어도 Apache 2.2, MySQL, PHP 5.2는 각각 독립적으로 실행이 가능하다.

 

 

 

그림 1-13. Localhost 웹 사이트, 도도(Dodo)

 


2. 참고자료(Reference)

 

1. "/apmsetup/release", kldp, https://kldp.net/apmsetup/release/, Accessed by 2018-08-05

반응형
728x90
300x250
[MySQL] 날짜(Date) 그리고 날짜 연산(Operation)

 

MySQL 5.7에서 날짜 및 날짜 연산을 수행하는 방법에 대해서 소개한다.

 


1. 사용방법

 

1-1. Between

 

SELECT id, type, subject, money, taxRate, count, regidate FROM {게시판명} WHERE strDate BETWEEN '{시작일자}' AND '{종료일자}'

 

이 명령어를 사용하면, 시작일자부터 종료일자까지의 데이터를 출력할 수 있다.

 


1-2. 일자 연산(DATE_ADD() Function)


이 명령어를 사용하면, 일자의 증가, 감소 등을 구현할 수 있다.

 


1-2-1. 일자 증가

 

SELECT DATE_ADD( "2018-08-01", INTERVAL 31 DAY )

 

 

그림 1-2-1-1. 출력결과, 도도(Dodo)

 


1-2-2. 일자 감소

 

SELECT DATE_ADD( "2018-08-01", INTERVAL -31 DAY )

 

 

그림 1-2-2-1. 출력결과, 도도(Dodo)

 


1-2-3. 일자 (DATE_ADD 연산자)의 종류

 

unit

Value

Expected expr Format

MICROSECOND MICROSECONDS
SECOND SECONDS
MINUTE MINUTES
HOUR HOURS
DAY DAYS
WEEK WEEKS
MONTH MONTHS
QUARTER QUARTERS
YEAR YEARS
SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND 'MINUTES:SECONDS.MICROSECONDS'
MINUTE_SECOND 'MINUTES:SECONDS'
HOUR_MICROSECOND 'HOURS:MINUTES:SECONDS.MICROSECONDS'
HOUR_SECOND 'HOURS:MINUTES:SECONDS'
HOUR_MINUTE 'HOURS:MINUTES'
DAY_MICROSECOND 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS'
DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE 'DAYS HOURS:MINUTES'
DAY_HOUR 'DAYS HOURS'
YEAR_MONTH 'YEARS-MONTHS'

 


2. 참고자료(Reference)

 

1. 12.7 Date and Time Functions, MySQL, https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add, Accessed by 2018-08-01

반응형
728x90
300x250

[PHP] PHP 5.6 - 시큐어 코딩하기(SQL Injection)

 

실제 작성한 코드를 통해서 소개한다.

외부의 사용자가 스크립트 언어를 삽입하여 SQL 문장으로 공격하는 문제 등이 존재할 수 있다.

 

이를 막는 방법에 대해서 소개한다.

 

대상: PHP Version 5.6.36

         (선택) mysqlnd 5.0.11-dev - 20120503 

 


1. SQL 문장 변형이 일어나기 쉬운 코드

 

          /*
          $query = 'SELECT password FROM board_' . $boardName . '_comment ' .
                    'where id = \'' . $comment->getID() . '\' ' .
                    'and password = \'' . $password . '\'';
         */ // SQL Injection 미점검  

 

그림 1-1. 문자열로 생성하는 SQL 문장

 

이런 코드로 프로그래밍을 작성하면 다음과 같은 일들이 생길 수 있다.

 

 SELECT password FROM board_{임의의 질의값}_comment where id = {랜덤아이디, 스크립트} and password = {랜덤비밀번호 대칭};

 

그림 1-2. SQL 문장으로 공격하기

 

예를 들어서 화면을 아래처럼 꾸몄다고 가정하자.

 

번호

{id}

 

글 제목

{subject}

 

조회수

{count}

 

 

 

 

 

 

 

 

그림 1-3. UI - View.php

 

예를 들면, 그림 1-3에서 {id}의 내용에 불법적인 스크립트 등을 삽입하여 공격할 수가 있다.

이러한 것을 예방하려면, 아래의 코드처럼 개선하면 좋을 것으로 보인다.

 


  public function isPasswordComment($boardName, $comment){
  
          $link = mysql_connect($this->conn->getHost(),
                                          $this->conn->getUser(),
                                          $this->conn->getPw()) or
                                          die('Could not connect' . mysql_error());
                       
          mysql_set_charset('utf8', $link);
  
          mysql_select_db($this->conn->getDBName()) or die('Could not select database');

          mysql_query("set session character_set_connection=utf8;");
          mysql_query("set session character_set_results=utf8;");
          mysql_query("set session character_set_client=utf8;");
   
          $password = $this->crypt->decrypt( $comment->getPassword() );

         

          /*
          $query = 'SELECT password FROM board_' . $boardName . '_comment ' .
                    'where id = \'' . $comment->getID() . '\' ' .
                    'and password = \'' . $password . '\'';
         */ // SQL Injection 미점검  
  
          $query = sprintf("SELECT password FROM board_%s_comment WHERE `id` = '%s' AND " .
                     "`password` = '%s'",
                    mysql_real_escape_string($boardName),
                    mysql_real_escape_string($comment->getID()),
                    mysql_real_escape_string($password));       // SQL Injection 점검

  
           $result = mysql_query($query, $link) or die('Query failed: ' . mysql_error());

 

           // DB Article
           $password = "";
           while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                  $password = $row['password'];
           }
  
           // Free resultset
           mysql_free_result($result);
  
           // Closing connection
           mysql_close($link);
  
           if ( empty($password) )
               return false;
           else
               return $password;
  
 } 

 그림 1-4. 개선된 코드(SQL Injection)

 


2. 참고자료(Reference)

 

1. SQL Injection, PHP.NET, http://php.net/manual/en/security.database.sql-injection.php, Accessed by 2018-07-31

반응형
728x90
300x250

[MySQL] SQL을 활용한 "열 - 단위 환산 출력하기"

이번에 소개할 내용은 열에 정량적 측정에 대해서 컴퓨터 프로그래밍으로 해결하는 방법에 대해서 소개하겠다.
순수한 실험을 위한 화학은 아니고, 컴퓨터 프로그래밍 측면에서 비열의 측정 데이터를 처리하는 방법에 대한 것이다.

 소프트웨어

 스프레드시트(데이터베이스를 모를 경우 파일처리로 데이터베이스로 활용가능),
 프로그래밍 언어 1개(자바, C언어, C++ 프로그래밍, VBA 등의 언어),
 데이터베이스(1개: MySQL, Cubrid, MSSQL, Oracle)



1. 컴퓨터 프로그램으로 해석

크게 어려운 건 아니다. 몇 가지 식을 소개하겠다.

소개

 1cal/g℃ = 4.184J/g℃.

(cal에서 J로 환산)

 1cal/g℃ = 4.184J/g℃ x 1000g / 1kg = 4184J/kg℃

(g에서 kg으로 환산)

 

그림 1-1. 물질 관련 표, 도도(Dodo)

공기, 건조를 한글로 소리나는 데로 읽는다면, "에어, 드라이(시어 레벨)" 이렇게 읽어진다.
아무튼 이러한 물질에 관한 데이터 표가 있다.

그림 1-2. 단위 변환 - 스프레드시트에 적용해보기, 도도(Dodo)

그림 1-2는 실제 실험이 완료된 수치를 단위변환한 것이다.
문제점이 하나 발생한다.

수치를 범위로 표현한 것이다.

그림 1-3. 수치를 범위로 표현한 경우, 도도(Dodo)

이런 경우에는 수치 데이터표를 보완할 필요가 있다.
컴퓨터 프로그래밍으로 자료를 처리하기 좋은 쪽으로 작성하는 게 편리하다.

그림 1-4. Min, Max로 데이터의 범주를 규격화 시킨 경우, 도도(Dodo)

그림 1-4는 Min, Max의 형태로 데이터를 규격화 시켰다.
J/kg℃는 제거해도 무방하다.

논리적인 데이터로 데이터만 뽑아내면 되기 때문이다.

그림 1-5. Water에 관한 세부 속성, 도도(Dodo)

이러한 경우도 있을 수 있다.
물인데 수증기에 관한 것이 있고, 순수한 물이 있다.

[첨부(Attachment)]
Material_Substance.7z



2. MySQL로 구현하기

이번에 소개할 것은 컴퓨터 프로그래밍을 최대한 제거하였다.
APMSetup이라는 프로그램 또는 Apache 2, PHP 5.2, MySQL 5.077를 활용한 Joule 계산 실습을 진행하였다.

SQL 언어 정도만 이해하고 있으면 간단하게 해결할 수 있는 주제로 작성하였다.

 

 

번호

항목명

설명(Description)

1

Apache 2.2

오픈소스 - 웹서버

2

PHP 5.2

오픈소스 - 프로그래밍 언어

3

MySQL 5.077

오픈소스 - MySQL 5.077 Community Edition

4

phpMyAdmin

SQL 언어 실습 프로그램 (오픈소스)

참고할 점: APMSetup 6 Version으로 진행하였음. / 설치를 안 할 경우에는 localhost에 접속할 수 없다.

그림 2-1. APMSetup의 localhost 웹 사이트

"
myadmin"을 클릭한다.

그림 2-2. phpMyAdmin, 도도(Dodo)

계정에 아이디는 root, 비밀번호는 apmsetup이다.
입력한다.

그림 2-3. 사용권한에서 계정 생성하기, 도도(Dodo)

그림 2-3은 사용권한을 클릭하여 신규 계정을 생성한 것이다.
예로 편한 계정명을 입력하도록 하자.

그림 2-4. 데이터베이스 생성하기, 도도(Dodo)

그림 2-4는 데이터베이스를 생성하는 것이다.
dodo라는 데이터베이스를 생성할 것이다.

그림 2-5. 데이터베이스에 사용자 권한 주기, 도도(Dodo)

데이터베이스에 간단한 사용자 권한을 주었다.

그림 2-6. Material_substance.xlsx 파일 -> DB에 넣기, 도도(Dodo)

Material_substance에서 설계한 DB구조를 phpMyAdmin으로 생성하는 장면이다.

그림 2-7. Material_substance DB 구조 설계, 도도(Dodo)

항목명

특징(Specific)

비고(Remarks)

id

Primary Key, Auto Increment(자동 증분)

 

substance

 

// 물질명 

kor-substance

 

 // 한글명

min

 

 최소값

max

 

최대값

 

그림 2-8. Material_substance DB 구조 설계, 도도(Dodo)

CREATE TABLE `substance` {
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY_KEY ,
    `substance` VARCHAR ( 40 ) NOT NULL ,
    `kor-substance` VARCHAR ( 40 ) NOT NULL ,
    `min` DOUBLE NOT NULL ,
    `max` DOUBLE NOT NULL
} ENGINE = MYISAM ;

[첨부(Attachment)]
substance.7z

그림 2-9. 데이터 가져오기, 도도(Dodo)

insert into `dodo`.`substance` (`id`, `substance`, `kor-substance`, `min`, `max`) values(NULL, 'Acetals', '아세탈', '0.35','0.35');

이런 형태로 데이터를 가져왔다.

[첨부(Attachment)]
sample_insert.7z


그림 2-10. SQL 명령어를 활용한 J(Joule) 구하기, 도도(Dodo)

SQL 명령어를 활용하여 J(주울)을 구했다.

SELECT `id`, `substance`, `kor-substance`, `min`, `max`, `min` * 4.184 AS `Joul/g`, `min` * 4.184 * 1000 AS `Joul/kg` FROM substance

간단한 명령어를 통해서 J/g, J/kg의 형태를 구할 수 있었다.

그림 2-11. SQL 명령어를 활용한 J(Joule) 삭제하기, 도도(Dodo)

간단한 명령어로 줄(J)을 삭제할 수 있다.
그림 2-12는 삭제한 결과가 성공적으로 수행되었음을 알려주는 모습이다.

DELETE FROM `dodo`.`substance` WHERE `substance`.`id` =3 LIMIT 1 ;

그림 2-12. id 3번의 줄 삭제 모습, 도도(Dodo)

다음은 입력한 Joule 데이터를 수정하는 방법에 대해서 소개하겠다.
그림 2-12에서 수정할 대상에 대해서 "연필" 그림을 클릭한다.

그림 2-13. id 4번의 줄 수정 모습, 도도(Dodo)

수정할 데이터를 입력한다.
실행을 누르면 아래의 그림처럼 된다.

그림 2-14. id 4번의 줄 수정 완료, 도도(Dodo)

실제로는 그림을 눌러서 처리되는 것은 아니며, SQL이라는 명령어로 처리된다.

UPDATE `dodo`.`substance` SET `kor-substance` = '공기, 건조 (해수면) 수정' WHERE `substance`.`id` =4 LIMIT 1 ;

테이블을 삭제하는 방법에 대해서 소개하겠다.
구조를 클릭한다.
substance을 선택하고, 삭제를 누른다.

그림 2-15. SQL DROP 명령어 실행하기, 도도(Dodo)

아래의 그림이 출력되면, 삭제 관련 사항을 확인하고 예를 누른다.
참고로 테이블을 삭제하면, 복원이 되지 않는다.

그림 2-16. SQL DROP 명령어 실행하기, 도도(Dodo)

그림 2-17. SQL 질의 성공 (DROP), 도도(Dodo)

Drop 사용 방법은 아래와 같다.

DROP TABLE {테이블명};


3. 참고자료(Reference)

[1] Specific Heat of common Substances, https://www.engineeringtoolbox.com/specific-heat-capacity-d_391.html, Accessed by 2018-07-29
[2] Water Vapor - Specific Heat, https://www.engineeringtoolbox.com/water-vapor-d_979.html, Accessed by 2018-07-29
[3] How to convert calories to joules[J], https://www.rapidtables.com/convert/energy/how-cal-to-joule.html, Accessed by 2018-07-29
[4] Files, https://kldp.net/apmsetup/release/, Accessed by 2018-07-29
[5] Developing MySQL Applications with Eclipse CDT, MySQL, http://download.nust.na/pub6/mysql/tech-resources/articles/mysql-capi-tutorial.html, Accessed by 2018-07-29

반응형

+ Recent posts