레이블이 DB인 게시물을 표시합니다. 모든 게시물 표시
레이블이 DB인 게시물을 표시합니다. 모든 게시물 표시

2018년 10월 9일 화요일

JDBC , DBCP, JNDI (수정필요)

JDBC(Java Database Connectivity)
: 데이터베이스에 접근하여 SQL문을 실행하기 위한 자바 라이브러리

>>  자바프로그래밍의 일반적인 데이터 엑세스 제공 
>> 데이터베이스 풀 방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 디비 연결을 열고 닫음
>> 효율이 떨어짐 
>> 그렇기 때문에 보통 pool 방식을 사용함. (ex DBCP)

==========================================================

DBCP(Database Connection Pool) 
: 데이터베이스와 연결된 커넥션을 미리 만들어서 저장해두고 있다가 필요할 때 저장된 공간(Pool)에서 가져다 쓰고 반환하는 기법

>> DB커넥션을 어플리케이션 소스 내에서 제어하면서 DB 풀을 가짐
>> 사용자가 요청할 경우 드라이버를 로드하고, 커넥션 객체를 생성해 연결하고 종료하는 비효율적인 작업을 하지 않아도 됨
>> 데이터베이스의 부하를 줄이고 자원을 효율적으로 관리

==========================================================

JNDI(Java Naming and Directory Interface)
: 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바API
(외부에 있는 객체를 가져오기 위한 기술)

>> DB커넥션을 WAS단(외부)에서 제어하면서 서버에서 하나의 커넥션 풀을 가짐
>> DBCP처럼 어플리케이션 소스단에 설정하느 방식이 아닌 WAS단에 데이터베이스 커넥션 객체를 미리 네이밍함
>> 소스단에 정보를 설정해놓으면 소스 개발자 외에는 정보를 찾기가 힘들다. 하지만 JNDI를 사용하면  WAS단에 저장하기 때문에 파악하기 쉬움..????
>> 서버단에서 어플리케이션 컨테이너는 하나이더라도 내부 어플리케이션 소스는 홈페이지 하나 이상이 될 수있는데(디렉토리 서비스, 서브도메인을 사용하여 서비스하는 경우) 이 경우, DBCP를 사용하면 각 어플리케이션마다 DB Pool이 각자 생성되어 풀이 많아져 효율이 떨어질 수 있음. 
JNDI는 WAS단에서 DB Pool를 하나로 관리하기 때문에 효율이 좋아진다고 함..
(WAS에 스태틱 객체를 생성 후에 쉽게 가져다 쓸 수 있기 때문??)


참고

http://eongeuni.tistory.com/43
http://all-record.tistory.com/104

todo

http://nastyle.tistory.com/15
https://d2.naver.com/helloworld/5102792

2018년 8월 19일 일요일

MySQL 테이블 데이터 추출하기(.csv)

머하웃의 간단한 아이템 기반 추천알고리즘을 적용해보는 과정에서,
알고리즘이 .csv 파일을 읽어 특정 개수의 아이템을 추천해주는 방식이었기 때문에, DB의 테이블을 .csv 파일로 뽑아내는 작업이 필요하였다. 


여기를 참고하여 데이터를 뽑았는데, 나는 첫번째 SQL을 사용하였다.

1
2
3
4
5
6
SELECT * FROM recommend_coursedata
INTO OUTFILE 'C:/MySqlOutputData/test.csv'
CHARACTER SET euckr
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n';
cs
이를 실행하면 
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

에러가 발생하는데, 파일이 생성되는 경로와 mysql서버의 secure-file-priv 경로와 달라서 발생하는 에러 같다. 

INTO OUTFILE 의 경로는 
mysql 서버의 secure_file_priv 에 명시에되어있다. 


여기서 나오는 데이터를 기준으로 추천을 해주기 때문에 관리자 계정이 버튼으로 추천 데이터를 업데이트해주자는 생각으로 진행하였다. 그렇기 때문에 버튼을 누를 때 마다 
저 경로의 파일을 지우고, 새로 파일을 생성하는 방식으로 진행하려고 하였다. 

하지만, 경로가 ProgramData 속에 있기 때문에 수정/삭제에 대해 관리자 권한이 필요하였고, 경로를 바꾸기로 하였다. 

나의 경우에는 
my.ini 
secure-file-priv 의 경로를 직접 바꾼 후 mysql을 재시작하여 진행하였다. 


2018년 6월 23일 토요일

오라클 SQL문법

group by 
특정 컬럼을 기준으로 그룹화하는 것
ex)
1
2
3
  SELECT department_id, SUM(salary)
      FROM employees
     GROUP BY department_id
cs
>>department_id을 기준으로 empolyees 테이블에서의 부서id 별 급여 합계 구하기

**select 와 group by에 기준으로 삼고자하는 컬럼넣으면 됨 


having
having절은 group by 절에 다음에 위치하여 group by한  결과를 대상으로 다시 필터를 거는 역할 
ex)
1
2
3
4
5
SELECT dept.deptname, COUNT(emp.empno) "사원수"
  FROM employees emp, department dept
 WHERE emp.deptno = dept.deptno
 GROUP BY dept.deptname
HAVING COUNT(emp.empno) > 5;
cs
>>부서테이블의 부서 이름을 기준으로하여 사원테이블의 사원번호를 카운트하여 
사원수가 5명이 넘는 부서별 사원수 보여주기 


case when ~ then ~ (else ~) 
조건에 따라 여러 경우 중 하나를 선택
case 컬럼 when 조건1 then 값1 when 조건2 then 값2 .... end) 
1
2
3
4
5
6
7
8
SELECT deptno, 
       CASE deptno
         WHEN 10 THEN 'ACCOUNTING'
         WHEN 20 THEN 'RESEARCH'
         WHEN 30 THEN 'SALES'
         ELSE 'OPERATIONS'
       END as "Dept Name"
  FROM dept;
cs
>>dept테이블에서 deptno가 10이면 'ACCOUNTING' , 20이면 'RESEARCH' ,30이면 'SALES' 나머지는 'OPERATIONS' 출력 

**when 뒤에 sal > 100 와 같이 비교하는 연산 넣어도 됨 



decode
값 비교 연산 (오라클에서만 지원하는듯?)
DECODE(비교 값 , 조건1, 조건1일때 값, 조건2, 조건2일때 값, ...)
1
2
3
4
SELECT deptno, DECODE(deptno, 10 , 'ACCOUNTING' ,
                              20 , 'RESEARCH' ,
                              30 , 'SALES''OPERATIONS') name
  FROM dept;
cs
>>dept테이블에서 deptno가 10이면 'ACCOUNTING' , 20이면 'RESEARCH' ,30이면 'SALES' 나머지는 'OPERATIONS' 출력 

**GREATEST, LEAST 함수를 사용해서 비교처리도 가능한듯(제한적??)


바인드 변수      
bind 변수란?
Bind변수는 실행계획이 세워진 후 그 값이 결정되는 변수이며 값이 바뀌더라도 실행계획에는 영향을 주지 않는다. 콜론 :  을 사용

1
SELECT * FROM emp WHERE empno = :var ;
cs
>>쿼리가 실행될 때 마다 원하는 사원번호를 입력해서 emp에서 사원 검색

**효율문제 좀 더 찾아보기 


concat
두 문자열을 결합 할 때 사용하는 함수
|| 연산자와 같은 역할
1
SELECT CONCAT('December 25, ''2008');
cs
>>두 문자열 합치기

 두 문자열의 타입이 동일할 경우에는 문제가 없지만, 두 문자열의 타입이 다를경우에는 데이터 손실이 생길 수 있기때문에 두 문자열 타입 중 문자 결합 후 손실이 없는 쪽으로 리턴됩니다.


substr
원하는 길이 만큰 문자(String)를 자를 때 사용하는 함수
1
SELECT SUBSTR('abcdefg' , 15) res FROM DUAL; 
cs

>>'' 문자를 1번부터 5번까지출력 ==> abcde
>> 숫자가 하나만 있으면 => 숫자 부터 끝까지
>> -숫자 => 뒤에서부터 


WITH 구문
with 구문이란?
서브쿼리 블럭에 이름을 지정할 수있게 해주고, with구문내의 쿼리의 결과가(서브쿼리)가 여러번 사용될 때 유용하다. 오라클 9이상에서 지원한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WITH AA AS
 (SELECT ROWNUM AS SEQ, 'TEST1' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST2' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST3' AS NAME, SYSDATE FROM DUAL),
 
 BB AS
 (SELECT ROWNUM AS SEQ, 'TEST1' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST2' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST3' AS NAME, SYSDATE FROM DUAL)
  
SELECT * FROM AA, BB WHERE AA.NAME=BB.NAME
 
 
cs
출처:


NVL 함수
NVL(컬럼, 치환할 값) 으로 쓰며 
컬럼값이 null 이면 치환할 값으로 바꾸어주는 함수이다. 

NVL2(컬럼, e1, e2) 
컬럼값이 null 이 아니면 e1 값,  null 이면  e2 값으로 바꿔주는 함수이다. 
1
2
SELECT empno, NVL2(deptid, 10) dept
  FROM emp;
cs
>>테이블에서 deptid가 null값이아니면 1, null이면 0으로 변환




TRUNC 함수
trunc함수는 원하는 소숫점 자리수 만큼만 자를 수 있다.
1
select trunc( 1.234562 ) from dual;
cs
>> 1.23 만 나옴

이를 날짜에도 사용할 수 있다.

2018년 5월 22일 화요일

MySQL Error Code 1175 관련

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
update safe모드로 설정되있어서 업데이트시 키 컬럼을 사용하지 않으면 업데이트 할수 없다... 라는 것 같다



방법

SET SQL_SAFE_UPDATES =0;
라는 쿼리문을 입력한다.

or 

워크벤치의 Edit - Preferences 에서 빨간 원을 체크 해제 하면 된다.



2018년 5월 17일 목요일

mongodb 설치

예전에 설치했던 mongodb가 접속이 안되서 새로 설치하였다

환경변수를 등록하고

C:\data\db
이 경로에 폴더를 설치해줘야한다 


cmd로 mongod를 입력하고

이때 이 창은 그대로 두고 새 cmd창을 열어 mongo 입력하면 접속완료



참고
http://solarisailab.com/archives/1605

2017년 10월 24일 화요일

MySQL JOIN 정리

JOIN

다른 테이블 간의 데이터를 연결시켜 사용하는 것 

INNER 조인

일반적인 용도에 사용되며, 조건에 맞는 데이터를 두 테이블에서 모두 추출해낸다.

예) 
1
2
3
4
select board.bnum, board.title, reply.rnum
from free_board as board join
free_reply as reply 
on board.bnum = reply.bnum
cs
결과를 보면 게시물의 bnum과 댓글의 bnum이 같은 결과만 가져오는걸 알 수 있다. 

LEFT/RIGHT 조인

기준 테이블을 설정해 준다. 
FROM A LEFT/RIGHT JOIN B ON ~ 형태이며 레프트 조인은 A가 기준 라이트 조인은 B가 기준이 된다.  

예)
1
2
3
4
select board.bnum, board.title, reply.rnum
from free_board as board left join
free_reply as reply 
on board.bnum = reply.bnum
cs
결과를 보면 board가 기준의 되었기 때문에 조건에 맞지 않아 rnum이 없더라도 board의 bnum은 모두 불러오고 rnum이 없더라도 null 값으로 표기함을 알 수 있다.

INNER JOIN = JOIN
LEFT OUTER JOIN = LEFT JOIN
RIGHT OUTER JOIN = RIGHT JOIN 


CROSS JOIN 조인

집합에서의 곱 개념이며, A={a, b, c} B={1,2,3,4} 이면
A CROSS JOIN은 (a,1)(a,2)(a,3)(a,4)(b,1)(b,2).....(c,3)(c,4)가 된다. 


참고

2017년 10월 7일 토요일

DB모델링

데이터 모델링(data modeling)이란 주어진 개념으로부터 논리적인 데이터 모델을 구성하는 작업을 말하며, 일반적으로 이를 물리적인 데이터베이스 모델로 환원하여 고객의 요구에 따라 특정 정보 시스템의 데이터베이스에 반영하는 작업을 포함한다. 후자의 의미로 흔히 데이터베이스 모델링으로 불리기도 한다.[1]





데이터모델링 관련 참조
http://vnthf.logdown.com/posts/2016/03/18/650365
데이터 관계 참조
http://tech.devgear.co.kr/db_kb/331

2017년 10월 5일 목요일

Mybatis 자동 생성키 사용

mysql의 경우에 auto_increment 를 통해 자동 생성키를 쓸 수 있는데, insert시 이 자동생성된 값을 가져오고 싶을때는

useGeneratedKeys를 true로 설정, KeyProperty에 가져오고싶은 값을 넣는다. 

나의 경우엔 답변or댓글의댓글을 만드는 과정에서 그룹을 설정하기위해 자동증가값을 그룹에 같은값으로 업데이트하려고 했었다. 

(...게시물을 만들면서 group을 같이 설정하고싶었는데, 실패해서 게시물만든후 group값을 bnum으로 업데이트하였다...비효율적인 것 같으므로 다른 방법을 찾아야할 것 같다.)

아무튼 자동증가되는 primarykey를 가져오고 싶었는데 계속 0을 가져왔었다. 

그래서 

매퍼에 위의 방법과 같이 bnum을 키프로퍼티에 넣고 

1
2
3
    <insert id="insert" parameterType="net.cot_pr1.domain.QnA" useGeneratedKeys="true" keyProperty="bnum">
        INSERT INTO qna (bnum, title, content, writer, answer, qgroup) VALUES (0,#{title},#{content},#{writer},#{answer},#{qgroup})
    </insert>
cs

컨트롤러에서 

1
2
3
4
5
6
qnaService.create(vo);
        
int bnum = vo.getBnum();
vo.setBnum(bnum);
qnaService.setgroup(vo);
        
cs
이런식으로 bum을 다시 가져와서 group에 넣었다..

2017년 6월 26일 월요일

MySQL user 비밀번호 교체 오류

예제 실행 중 jspexam 사용자로 접속하려 했으나 비밀번호가 틀렸다고 접속이 안된다.

update를 통해 비밀번호를 바꾸려했지만 뜨는 오류..


ERROR 1054 (42S22): Unknown column 'Password' in 'field list'


password 칼럼이 없어서 authentication_string으로 해줘야했다.


완료!