Monthly Archives: September 2012

DBMS 간단한 선택 기준, Oracle, Mysql, postgresql, cubrid, MSSql…Mongo, Cassandra

DBMS를 뭘로 쓸지 선택하기가 정말 어렵다.

요즘에는 nosql db까지 추가되서 선택의 폭이 더 넓어지고 고민의 시간은 더 길어진다.

nosql을 써야지 왠지 간지가 날 것 같고…

신기술을 좋아하는 상사나 정부관련 사업 제안에는 MongoDB, Cassandra같은 nosql DB를 들이밀어야 할 것만 같다.(실제로 그러는게 좋다)

아무리 그래도 용도에 맞는 DB를 골라야 하겠지..

첫번째 선택 : nosql이냐 rdbms냐!!

간단히 두 선택지에 대한 정의를 내려본다 : nosql은 쉽게 말해 객체지향 DB라고 생각하면 쉽다. 구조도 그런 구조고… RDBMS는 엑셀의 표를 sql쿼리언어로 조회가 가능하게 해놓고 속도도 좀 잘 나오게 만들어놓은 놈들?

이 두 가지 중 한가지를 선택하는 것은 어렵지 않다.

1. 데이터가 들어오는 속도가 매우 빠른 경우

데스크탑 환경에서 테스트한거라 비싼서버에서는 더 빠를수도 있겠지만 열배 더 빠르다고 해도 딜레이가 걸리는건 마찬가지일 것 같다. 증권 가격데이터를 DB에 밀어넣어봤는데 9시~3시까지 초당 1000개이상의 데이터가 나오는데 이 데이터가 병목에 걸려서 밤새도록 입력하다가 다음날 9시가 되도 전날 데이터를 입력하고 있는 상황이 발생했다.

이런경우는 그냥 FileSystem에 디렉토리로 나눠서 저장하면 된다. 가장 간단한 구조는 2012/12/12/ 연월일로 디렉토리 계층만들기

2. 도메인 설계후 각 도메인간 연결고리가 많아서 조인이 많아진다~

nosql에 저장할 때 적합해보이는건…… 게시판? 쇼핑몰? 이정도인것같다

nosql 한 document의 사이즈 한계가 2메가랬나 어쨌나 그러니까… 한 document(row)밑에 자꾸 내용이 추가된다면 곤란하다. 이런경우 collention을 한개 분리시켜야되는데 그러면 join을 해야된다. nosql db에서 join은 지원되지 않는다.

이런경우에는 rdbms를 사용하면 된다.

써놓고보니 이거 읽고 딱 이거다 하는 결론을 내지는 못할 것 같다.

그냥 한마디로 말해서 도메인 구조 짜놓고보면 대충 감이 온다.

3. 잦은 읽고쓰기가 발생한다.

이런경우는 그냥 RDBMS를 쓴다. RDBMS가 감당하지 못할 정도의 규모라서 꼭 nosql을 써야겠다면 설계를 변경하는게 좋겠다. 데이터를 삭제하지 않고 로그처럼 쌓아가는 방향으로…

4. 관리인력문제

회사 내부에 이 DB를 관리할 인력이 있는가도 문제가 될 것 같다. nosql 클러스터 구성하고 레플리카셋 샤딩 마음것 주무를 수 있는 인력이 잘 잇을 것 같지는 않다. 개발자가 지가 다 할줄안다고 막 적용했다가는… 나중에 고생할거다.

 

어떤DB?

머 알아서…

약간 특성이 다릅니다.

Network 감시 프로그램

소프트웨어를 직접 해킹하는것보다 네트워크의 패킷을 해킹하는게 더 쉬워보여서

찾아봤다.

SmartSniff

http://www.nirsoft.net/utils/smsniff.html

http://blog.nirsoft.net/2010/11/08/how-to-capture-data-and-passwords-of-unsecured-wireless-networks-with-sniffpass-and-smartsniff/

Microsoft Network Monitor

http://www.microsoft.com/en-us/download/details.aspx?id=4865

Fiddler2 http프로토콜 감시

http://www.fiddler2.com/fiddler2/

TCPviewer

http://technet.microsoft.com/ko-kr/sysinternals/bb897437.aspx

tcpview

SpringSecurity 에서 사용자 정보 (받아오기)뽑아서 쓰기

스프링 시큐리티를 사용하다가 사용자 정보를 뽑아서 써야되는데 참 갑갑할때가 있다.

내가 만든 것도 아니라서 어디서 뽑아다가 써야될지도 잘 모르겠고

스프링 시큐리티 너무 복잡해서 어떻게 찾을지도 잘 모르겠고 그럴때가 많다.

google search keyword : spring security get current user details

http://stackoverflow.com/questions/248562/when-using-spring-security-what-is-the-proper-way-to-obtain-current-username-i

스택오버플로우가 글이 날라가지는 않을 것 같지만 혹시나 해서 그냥 퍼놔야겠다.

1. SpringSecurityContextHolder를 사용하는 방법

2. 뭔지 잘 모르겠는데 좋아보이는 방법 – 토큰을 집어오는것같다.

3. User는 아니지만 UserPrincipal을 가져오는 방법

 

 

게시판 댓글개수 보이는 쿼리 짜는 과정 연습장

밑에서부터시작…

작업툴 pgadmin, 작업대상db : postgresql, 만들어야할 것 : 게시판 목록에서 댓글 개수 보이게 하는 쿼리

오랜만에 만지니 쿼리를 어떻게 만들어야할지 도무지 생각이 나지 않아서 검색시작…

레프트 조인문마저 생각이 안남..;;;

실행순서 정하기

페이징을 할 때 인덱스를 타고 스캔해서 코스트를 최소화하기 위해 나름대로 생각했는데 잘 되는건지 모르겠다. 데이터 누적되도 앞쪽부터 조회하게 돼 있으니까 별 문제는 없을것같다.

(
SELECT
b.board_seq AS boardSeq,
b.username,
b.title,
b.content,
b.ip,
b.reg_date AS regDate,
b.read_count AS readCount,
b.recommend_count AS recommendCount,
b.last_modified_date AS lastModifiedDate,
b.parent_seq AS parentSeq,
b.depth,
COUNT(board_comments.comment_seq) over () AS comment__count
FROM
board b
LEFT OUTER JOIN board_comments ON (b.board_seq = board_comments.board_seq)
GROUP BY b.board_seq, board_comments.comment_seq
ORDER BY b.board_seq
)

SELECT
b.board_seq AS boardSeq,
b.username,
b.title,
b.content,
b.ip,
b.reg_date AS regDate,
b.read_count AS readCount,
b.recommend_count AS recommendCount,
b.last_modified_date AS lastModifiedDate,
b.parent_seq AS parentSeq,
b.depth
FROM
board b
LEFT OUTER JOIN board_comments ON (b.board_seq = board_comments.board_seq)
GROUP BY b.board_seq
ORDER BY b.board_seq
(SELECT
b.board_seq AS boardSeq,
b.username,
b.title,
b.content,
b.ip,
b.reg_date AS regDate,
b.read_count AS readCount,
b.recommend_count AS recommendCount,
b.last_modified_date AS lastModifiedDate,
b.parent_seq AS parentSeq,
b.depth
–COUNT(cmt.comment_seq) over () AS comment__count
FROM
board b,
(SELECT * FROM board_comments WHERE board_seq BETWEEN 0 AND 10) cmt
WHERE
b.board_seq = cmt.board_seq

LIMIT 10)

select * from board;
select * from board_comments

SELECT
b.board_seq AS boardSeq,
b.username,
b.title,
b.content,
b.ip,
b.reg_date AS regDate,
b.read_count AS readCount,
b.recommend_count AS recommendCount,
b.last_modified_date AS lastModifiedDate,
b.parent_seq AS parentSeq,
b.depth,
COUNT(board_comments.comment_seq) over () AS comment__count
FROM
board b
LEFT OUTER JOIN board_comments ON (b.board_seq = board_comments.board_seq)
LIMIT 10

 

(퍼온쿼리)

SELECT articles.id,
articles.datestamp,
articles.title,
articles.shorttitle,
articles.description,
articles.markdown,
articles.body,
articles.idxfti,
articles.published,
articles.type,
COUNT(comments.id) over () AS comment__count
FROM articles
LEFT OUTER JOIN comments ON (articles.id = comments.article_id)
WHERE (articles.type = ‘NEWS’)
ORDER BY articles.datestamp DESC
LIMIT 1

Java Web, Spring Restful 웹서비스를 위한 web.xml 필수 설정

바로 이거….

현재의 웹브라우저는 Http protocol의 post, get 두 가지 방식밖에 인식을 하지 못한다. 그래서 프로그래밍적으로 처리를 해 주는 경우가 대부분이다. 보통 jquery의 ajax 함수를 이용한 방법을 많이 쓰는것으로 알고 있다.

 

<form method=”post” action=”/join”>

<input type=”hidden” name=”_method” value=”put”/>

</form>

이런식으로 전송을 한다.

그러면 위의 필터가 이를 편집해준다.

 

못믿겠으면 직접 소스를 보시라능..

 

이것만 딱 써놓으면 한글이 깨진다.

이렇게 두개를 같이 써주면 한글이 안깨진다고 한다.

한글이 깨져서 이 필터 빼버린적은 있는데… 이렇게 하면 안깨지는지 아직 확인은 안해봤다.

 

둘다 단순한 기능을 하는 필터다. 캐릭터 인코딩 필터는 그냥 post로 전송된 내용을 인코딩해주는 필터고 rest filter는 http헤더의 메서드를 인식해서 변경해주거나
name=”_method” value=”post|get|put|delete…등”을 확인하고 http 헤더의 메서드를 변경해주는 역할을 한다.

ACL,Access Control List 접근 제어 목록

사용자별로 권한을 부여하고 그 권한을 바탕으로 접속 허용 여부를 결정하는 것을 말한다.

값은 보통 String을 사용한다.

 

guest, member, admin 세개의 권한이 있다.

사용자들은 위 권한중의 몇 가지(중복가능)의 권한을 가지고 있다.

권한은 사용자가 가진 최상위 권한을 우선 적용한다. 구현하기 나름이지만… member {student, teacher} 이런식으로 포함관계를 갖게 만들수도 있고 {minsu, dongsu}와 같이 수평 개념으로 만들수도 있다.

예1)

연습장에다가 다음의 사용자 이름을 적어본다

이건희, 이재용, {내이름}, 박정희

다음의 사용자가 있다고 가정하고 {guest, admin, member} 세개의 권한을 적당히 줘 본다.

예2)

그럼 다음 기능에 권한을 줘 보자

{사용자목록보기, 공지사항읽기, 공지사항댓글쓰기, 자유게시판 읽기}

(역시 구현하기 나름이지만 기능에 권한을 줄 수도 잇고 페이지에 줄 수도 있다. 도쿠위키의 경우는 페이지에 준다.)

 

이거 대충 보고 dokuwiki를 설치하고 ACL설정을 해 보면 곧 이해가 갈 것이다.

굳이 dokuwiki를 찝어서 말한것은…. 이게 설치하기 쉬우니까