JPA Domain 을 디비에 자동으로 생성되게 해놓았는데


AWS RDS 에 DB 를 새로 세팅하고 MySQL 에서 Foreign key 걸때 아래와 같이 에러가 났다.


Error Code: 1215. Cannot add foreign key constraint


이것저것 보다보니 Dump 떠서 생성했던 기존 Table.Column 의 Collation 과 JPA 가 생성한 Collation 이 다르네


하나는 utf8_general_ci, 다른 하나는 utf8_bin 


두개가 서로 맞지않으면서 foreign key 생성이 안되던 문제


해결책은 아래



http://confluence.goldpitcher.co.kr/pages/viewpage.action?pageId=138838813

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



AWS RDS


기존 개발 환경은 로컬과 STG - US.EAST Region EC2 의 WAS 에서


Toyko Region MySQL 을 바라보고 있었는데


Seoul Region 이 생겨서 로컬에서 더 빠르게 응답받고자 RDS.MySQL 을 생성했다.



로컬 앱과 WorkBench 에서는 별 문제 없이 잘 동작되는데


US.EAST 의 EC2 WAS 에서 DB Connection error 가 발생했다.


Security Group 은 Default 를 사용했는데 Inbound Rules 은


All Traffic 으로 되어 설정 돼있었는데, 


아래와 같이 TCP 를 따로 추가하니 DB 연결이 정상적으로 되더라.


US.EAST RDS 는 저 rule 을 추가하지 않아도 문제없었는데, 왜 Seoul Region 만 이런지는 잘모르겠다.







'AWS > RDS' 카테고리의 다른 글

[RDS] Seoul Region 에서 RDS 생성 후 TCP 접근 안되는 문제  (0) 2016.03.24
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



Node JS 에서 MySql 을 이용해서 작업하는데


DateTime 타입인 컬럼에 값이 '2010-10-10 20:20:00'  라고 입력이 되어 있는데


이 값을 꺼내서 쓸라고 보니까 'Wed, 04 Jul 2012 02:06:00 GMT'  요딴 식으로 튀어 나오네...젠장


분명히 시간이 틀려졌다...20시 20분인데 꺼내서 보니까 02:06 이다.


저거를 한국 시간으로 바꾸자



코드

var _date = new Date(new Date(resultList[i].meetTime).toLocaleString();)


이제 이 값을 아래 메소드로 빼 쓰면 된다.


getFullYear()


d.getMonth() + 1 // 달은 +1 을 해줘야 된다.


d.getDate()


d.getHours()


d.getMinutes()


d.getSeconds()


더 쉬운 방법을 아시는 분은 좀 가르쳐주세요 ㅎㅎ

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



노드에서 EventEmitter 를 이용하여 이벤트 방식으로 


웹 서버에서 라우트하는 코드에서


디비작업을 하는 코드를 분리하여, 의존성을 제거하고 비동기 처리 방법.


express 를 사용하였습니다.



1. 서버 js

var express = require('express')

  , routes = require('./routes') // 기본 index.js

  , pp = require('./public/properties').properties

  , clog = require('clog');


var app = module.exports = express.createServer();


.............. 설정들



app.post('/searchArea.margo', routes.searchArea);



2. Route - index.js

var dao = require('./db'); // routes/db.js 

exports.searchArea = function(req, res){

var cb = dao.getArea(req.body);

cb.on('end', function(err, result){

if(err) throw err;

res.send(result);

});

};



3. DB - db.js
(MySql을 사용하였습니다.)

var db = require('mysql');


var DATABASE = '데이타베이스 명';

var MYSQL_USER = "root";

var MYSQL_PASS = "apmsetup"; 


var mysql = db.createClient({

host: '127.0.0.1'

, database : DATABASE

, user: MYSQL_USER

    , password: MYSQL_PASS

});


var EventEmitter = require('events').EventEmitter;


var dao = module.exports = {


getArea: function(param){

var evt = new EventEmitter();

mysql.query("SELECT * FROM address WHERE area3 like concat(?, '%')"

, [param.searchText]

, function(err, result, fields){


evt.emit('end', err, result);

});

return evt;

}

};



설명

3번 에서 EventEmitter 를 생성하여 디비쿼리를 실행시킨후에 evt 를 리턴한다. (쿼리는 아직 끝나지않았다. 쿼리를 실행만 시켜놓고 바로 evt를 리턴해버린다.)


2번 에서 cb 는 3번에서 리턴해준 evt 에 on 리스너를 달아서 아까 발생시킨 'end' 이벤트를 기다린다.


디비 쿼리 작업이 다끝나고 디비결과가 콜백메소드로 들어오면 'end'이벤트를 발생시킨다. res.send(result);


그러면 2번에서 'end'이벤트에 달았던 리스너가 동작하면서 리스너 콜백이 실행된다.


끝. 즐거운 NodeJS~~~~ 


참고 : 변정훈님이 지으신 NODE.JS 프로그래밍 - 에이콘 출판사

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 로즈 2012.07.11 14:14 신고  댓글주소  수정/삭제  댓글쓰기

    와 감사합니다.. 도움이 많이 됬어요...

    코멘트 잘 안 다는데.. 너무 재밌게 잘보고 가게되서 몇자 적었네요.. ^^





nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appProcess' defined in ServletContext resource
[/WEB-INF/Appdi-servlet.xml]: Cannot resolve reference to bean 'SimpleJdbcTemplate' while setting bean property 'template';

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SimpleJdbcTemplate' defined in ServletContext resource

[/WEB-INF/Appdi-servlet.xml]: Cannot resolve reference to bean 'DataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'DataSource' defined in ServletContext resource

[/WEB-INF/Appdi-servlet.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory

 
Spring 에서 mysql 로 JDBC 구현할 때, 저딴 에러가 나면 그냥 파일하나 lib 에 넣어주면된다...ㅠㅠ;

ㅅㅂ...내 2시간......

 

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. Cheap Moncler vests for women 2015.01.01 16:07  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  2. New Era 59FIFTY Hats Wholesale Free shipping 2015.01.09 16:46  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  3. Wholesale New Era Caps,Cheap Snapback Hats/Caps 2015.01.09 16:49  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  4. louboutin homme 2015.01.17 10:48  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  5. louboutin pas cher 2015.01.20 04:23  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  6. giubbotti peuterey 2015 2015.01.20 06:35  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  7. hogan scarpe 2015.01.20 08:42  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  8. anello tiffany 2015.01.21 07:19  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.




DB에 저장되어있는 컬럼 중에 DATE 타입에 대한 연산이 필요할 때가 있다.

예를 들어 지금시간으로부터 12시간안의 모든 레코드를 필요로 한다던지,

지금시간으로부터 12시간 이전의 자료를 모두 삭제한다던지 할때 DATE 형이 시간이 기록되어 있다면

시간까지 연산가능하고, 만약 시간이 기록되지 않은 DATE 타입이면 날짜연산만 가능하다. 




UPDATE sample SET state = 'done' WHERE date < DATE_ADD(now(), INTERVAL -6 hour)

 ↑ 해석 : sample 테이블의 date 컬럼의 시간이

             현재(now()) 시간으로부터 6시간전의 시간을 기준으로 그 이전시간 레코드의
             state 컬럼을 'done'으로 다 입력한다. 




DATE_ADD(now(), INTERVAL -6 hour)

↑ 이 문장에서 hour 대신에 year, day, minute, second 로 바꿀 수 있다.

맨위 코드에서 '<' 를 '>' 로 바꾸게되면

6시간전을 기준으로 이전레코드가 아니라, 현재시간으로부터 6시간내의 자료만 가져올 것이다.


헷갈린다면 한번 해보면 확실할 것.

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



제목 그대로다

 PreparedStatement 에서 LIKE 를 쓰고 싶을때, '?' 와 '%' 합치는 법

출처 :  http://mainia.tistory.com/557 녹두장군님



웹 어플리케이션 작업시 sql 쿼리를 보통 properties xml 로 문자열을 만들어 빼놓는다.

예전처럼 무식하게 쿼리를 문자열 합치기로 소스상에서 사용하지는 않는다여러가지 문제가

많기 때문이다.

 

쿼리에서 동적으로 변하는 데이타는 ? 를 써서 문자열을 만들고 PreparedStatement 사용해

파라미터 값을 맵핑시킨다아래는 스프링의 예이다스프링은 framework 내부에 PreparedStatement

사용해서 맵핑을 구현해 놓았고 우리가 사용하는 부분은 아래와 같이 함수에 파라미터로

갯수에 맞게 Objec 배열로 넘기면 된다.

 

쿼리문자열

test.srch.select = \n\

           select * from board where id = ? \n\

 

String sql = message.getMessage("test.srch.select");

getJdbcTemplate().queryForList(sql, new String[]{srchText});

 

일반적인 쿼리문자열은 이렇게 적용을 하면 되는데 문제는 like 를 사용할때 이다.

보통 사용하는 것처럼 like %?% 로 하면 안된다. % 문자와 ? 맵핑할 문자를 합쳐야 된다.

RDBMS 프로그램에 따라 차이가 있다. Oracle 일때에는  like '%' || ? || '%' 사용하면 된다.

중간에 ORM framework 인 iBatis 를 사용할 경우에는 like '%' || #?# || '%' 이다.

 

 

하지만 MySql 일 경우에는 이것이 통하지 않는다그래서 문자열을 합치는 함수를 사용해

해결하였다일반적인 경우는 like concat ('%', ?, '%') 이며 

iBatis 
라고 한다면

like concat ('%', #?#, '%') 사용해서 처리 하면된다.



 
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


mysql-인덱스를 생성하는 방법]

 

인덱스 만들기

1. 추가하여 만들기

    CREATE INDEX <인덱스명> ON <테이블명> ( 칼럼명1, 칼럼명2, ... );

 

2. 테이블 생성시 만들기

    끝에....

    INDEX <인덱스명> ( 칼럼명1, 칼럼명2 )

    UNIQUE INDEX <인덱스명> ( 칼럼명 )  --> 항상 유일해야 함.

 

3. 이렇게도 생성한다

    ALTER TABLE <테이블명> ADD INDEX <인덱스명> ( 칼럼명1, 칼럼명2, ... );

 

4. 인덱스 보기

    SHOW INDEX FROM <테이블명>;

 

5. 인덱스 삭제

    ALTER TABLE <테이블명> DROP INDEX <인덱스명>;

 

///////////////////////////////////////////////////////////////////

 

인덱스 파일은 "테이블명.MYI"파일로 DB 디렉토리 아래 저장..

 

mysql> create table test1( 
    -> var1 int not null auto_increment primary key,
    -> var2 int not null,
    -> var3 char(30) not null,
    -> index idx1(var1) <-- 인덱스지정
    -> );
Query OK, 0 rows affected (0.06 sec)

 

mysql> desc test1 <-- index는 MUL로 표시된다.

mysql> show keys from test1; <-- key 볼 수 있다.
====================================================

 

mysql> CREATE INDEX idx1 ON test1(var1);
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

 

제거는..DROP INDEX or Alter table

 

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


많은 분들이 mysql 테이블을 생성할 때 index를 주는데, 실제로 보니까 index를 잘못주는 경우가 많더군요. 

1. 인덱스를 검사하는 법. 
explain select * from Table_Name where A='a' and B='b' order by C,D,E ; 
해당 쿼리문이 인덱스를 타는지 안타는지 알기 위해서는 쿼리문 앞에 explain을 붙여주면 인덱스를 타는지 안타는지 알 수 있습니다. 
type의 결과값이 ALL일 경우 인덱스를 타지 않고 있습니다. range,index등일 때 인덱스를 타고 있습니다.(system,const,eq_ref,range,index,ALL,fulltext) 
key의 값이 해당 쿼리문이 타고 있는 인덱스입니다. 

2. 경우의 수가 작은 것은 인덱스를 타지 않습니다. 
가령 특정 테이블에서 성별을 구분하는 테이블이 있고, 이 테이블에서 성별로 구분해서 보여주는 경우가 많다고 해서 성별을 나타내는 필드에 인덱스를 걸어주어도 인덱스를 타지 않습니다. 
인덱스는 결과값이 1/3미만일 경우에만 인덱스를 탑니다. 그러므로 성별같은 경우에는 인덱스를 걸어주는 것이 테이블의 용량만 키우는 결과이기 때문에 인덱스를 걸어주지 않는 것이 좋습니다. 
이것은 PRIMARY KEY에도 적용이 됩니다. 
Table_Name 테이블에서 No 필드가 Primary Key, A 필드에 Index가 걸려있고, 데이타수가 30000개일 경우. 
select * from Table_Name where No>0 and A>0; // 인덱스 안탐. 
select * from Table_Name where No>20000 and A>0; // Primary 인덱스를 탐. 
select * from Table_Name where No>0 and A>20000; // A 인덱스를 탐. 

3. 인덱스는 하나만 탑니다. 
오라클등에서는 인덱스를 여러개 걸어주면 그것을 다 타지만 mysql에서는 인덱스를 하나밖에 타지 않습니다. 
가령 Table_Name 에서 A필드와 B필드, C필드에 인덱스를 걸어주고, 아래와 같은 쿼리문을 날립니다. 
select * from Table_Name where A='a' and B='b' and C='c'; 
이럴경우 세개의 인덱스중 하나의 인덱스만 탑니다. 

4. 결합인덱스 사용법. 
특정 테이블에서 동일한 쿼리문을 주로 사용하고 그 쿼리문이 아래와 같을 경우... 
select * from Table_Name where A='a' and B='b' and C='c'; 
이경우 이 세개의 인덱스를 전부 타기 위해서는 결합인덱스를 걸어줘야 됩니다. 
ALTER TABLE Table_Name ADD INDEX (A,B,C); 
이렇게 인덱스를 줄 경우에 세개의 필드를 정렬해서 하나의 인덱스를 생성하기 때문에 해당인덱스를 탈 수 있습니다. 

5. order by 에서 사용하는 인덱스. 
select * from Table_Name order by A; -> 이경우에 A인덱스를 탑니다. 
select * from Table_Name where B='b' order by A; -> 이경우 B인덱스만 탑니다. 
이경우에 두개의 인덱스를 다 타게 하려면 결합인덱스로 (A,B)를 생성시키고, A의 조건을 where 문에 지정을 해줍니다.(이부분은 사실 저도 조금 헷갈리는 부분입니다. 어쨌든 며칠동안 인덱스를 살펴본 결과 이렇게 해줘야 될거 같아서 일단 적습니다. ㅠ.ㅠ) 

6. 검색에서 사용하는 인덱스. 
보통 본문검색을 할 때 [where A like '%a%' ]와 같은 방식으로 조건을 주는데, 이경우 인덱스를 타지 않습니다. 가끔보면 검색에 주로 사용되는 필드에 인덱스를 거는 경우를 볼 수 있는데, 쓸데없는 짓입니다. 
단, [where A like 'a%']와 같이 검색을 하는 경우에는 인덱스를 탑니다. 

7. join문에서의 인덱스. 
개인적으로 join문을 잘 사용하지 않는데, 그 이유가 join문을 사용할 경우 속도문제 때문이었습니다. 지금은 join문에서 인덱스를 타는 경우에 대해서 테스트해보고, 이것은 나중에 결과를 보고 글을 올려보도록 하겠습니다.

 

www.nuno21.net


YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


1. 테이블 이름 바꾸기

ALTER TABLE `원래 테이블 이름` RENAME `수정할 테이블 이름`


2. 구조만 복사

CREATE TABLE `생성될 테이블명` LIKE `구조를 복사할 테이블`;

 

3. 구조와 내용복사

CREATE TABLE `생성될 테이블명` AS SELECT * FROM `구조를 복사할 테이블`;

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST