Windwowss
http://blog.daum.net/blankcheck/31
cmd열기
set path=c:\python27 (설치된 파이썬 경로)
cd c:\downloads\mechanize-0.2.5(mechanize 다운경로)
python setup.py install 입력
c:\python27\Lib\site-packages에 mechanize-0.2.5-py2.7.egg파일이 생성되있으면 성공
Windwowss
http://blog.daum.net/blankcheck/31
cmd열기
set path=c:\python27 (설치된 파이썬 경로)
cd c:\downloads\mechanize-0.2.5(mechanize 다운경로)
python setup.py install 입력
c:\python27\Lib\site-packages에 mechanize-0.2.5-py2.7.egg파일이 생성되있으면 성공
아파치 접속사용자 트래픽 제한걸기
apache의 jkmodule사용해서 loadbalance 이용
http://zosel.net/entry/Tomcat-%EB%B6%80%ED%95%98%EB%B6%84%EC%82%B0-%EA%B5%AC%EC%A1%B0?category=0
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?
머 알아서…
약간 특성이 다릅니다.
소프트웨어를 직접 해킹하는것보다 네트워크의 패킷을 해킹하는게 더 쉬워보여서
찾아봤다.
SmartSniff
http://www.nirsoft.net/utils/smsniff.html
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
스프링 시큐리티를 사용하다가 사용자 정보를 뽑아서 써야되는데 참 갑갑할때가 있다.
내가 만든 것도 아니라서 어디서 뽑아다가 써야될지도 잘 모르겠고
스프링 시큐리티 너무 복잡해서 어떻게 찾을지도 잘 모르겠고 그럴때가 많다.
google search keyword : spring security get current user details
스택오버플로우가 글이 날라가지는 않을 것 같지만 혹시나 해서 그냥 퍼놔야겠다.
1. SpringSecurityContextHolder를 사용하는 방법
1 2 3 4 5 6 7 8 9 10 |
public static User getCurrentUser() { Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal() if (principal instanceof MyUserDetails) return ((MyUserDetails) principal).getUser(); // principal object is either null or represents anonymous user - // neither of which our domain User object can represent - so return null return null; } |
2. 뭔지 잘 모르겠는데 좋아보이는 방법 – 토큰을 집어오는것같다.
1 2 3 4 5 6 7 8 9 |
@Controller public class KnoteController { @RequestMapping(method = RequestMethod.GET) public java.lang.String list(Model uiModel, UsernamePasswordAuthenticationToken authToken) { if (authToken instanceof UsernamePasswordAuthenticationToken) { user = (User) authToken.getPrincipal(); } ... } |
3. User는 아니지만 UserPrincipal을 가져오는 방법
1 2 3 4 5 |
private String principal; @Principal public setPrincipal(String principal){ this.principal=principal; } |
밑에서부터시작…
작업툴 pgadmin, 작업대상db : postgresql, 만들어야할 것 : 게시판 목록에서 댓글 개수 보이게 하는 쿼리
오랜만에 만지니 쿼리를 어떻게 만들어야할지 도무지 생각이 나지 않아서 검색시작…
레프트 조인문마저 생각이 안남..;;;
실행순서 정하기
페이징을 할 때 인덱스를 타고 스캔해서 코스트를 최소화하기 위해 나름대로 생각했는데 잘 되는건지 모르겠다. 데이터 누적되도 앞쪽부터 조회하게 돼 있으니까 별 문제는 없을것같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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, c.n_cmt AS nCmt FROM board b LEFT OUTER JOIN (SELECT c.board_seq, count(c.board_seq) AS n_cmt FROM board_comments c WHERE c.board_seq BETWEEN 0 AND 10 GROUP BY c.board_seq) AS c ON (c.board_seq = b.board_seq) WHERE b.board_seq BETWEEN 0 AND 10 |
(
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
1 2 3 4 5 6 7 8 9 |
<!-- HTTP Method Filter --> <filter> <filter-name>httpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>httpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
바로 이거….
현재의 웹브라우저는 Http protocol의 post, get 두 가지 방식밖에 인식을 하지 못한다. 그래서 프로그래밍적으로 처리를 해 주는 경우가 대부분이다. 보통 jquery의 ajax 함수를 이용한 방법을 많이 쓰는것으로 알고 있다.
<form method=”post” action=”/join”>
<input type=”hidden” name=”_method” value=”put”/>
</form>
이런식으로 전송을 한다.
그러면 위의 필터가 이를 편집해준다.
못믿겠으면 직접 소스를 보시라능..
이것만 딱 써놓으면 한글이 깨진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!-- Filters --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> <!-- HTTP Method Filter --> <filter> <filter-name>httpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>httpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
이렇게 두개를 같이 써주면 한글이 안깨진다고 한다.
한글이 깨져서 이 필터 빼버린적은 있는데… 이렇게 하면 안깨지는지 아직 확인은 안해봤다.
둘다 단순한 기능을 하는 필터다. 캐릭터 인코딩 필터는 그냥 post로 전송된 내용을 인코딩해주는 필터고 rest filter는 http헤더의 메서드를 인식해서 변경해주거나
name=”_method” value=”post|get|put|delete…등”을 확인하고 http 헤더의 메서드를 변경해주는 역할을 한다.
사용자별로 권한을 부여하고 그 권한을 바탕으로 접속 허용 여부를 결정하는 것을 말한다.
값은 보통 String을 사용한다.
guest, member, admin 세개의 권한이 있다.
사용자들은 위 권한중의 몇 가지(중복가능)의 권한을 가지고 있다.
권한은 사용자가 가진 최상위 권한을 우선 적용한다. 구현하기 나름이지만… member {student, teacher} 이런식으로 포함관계를 갖게 만들수도 있고 {minsu, dongsu}와 같이 수평 개념으로 만들수도 있다.
예1)
연습장에다가 다음의 사용자 이름을 적어본다
이건희, 이재용, {내이름}, 박정희
다음의 사용자가 있다고 가정하고 {guest, admin, member} 세개의 권한을 적당히 줘 본다.
예2)
그럼 다음 기능에 권한을 줘 보자
{사용자목록보기, 공지사항읽기, 공지사항댓글쓰기, 자유게시판 읽기}
(역시 구현하기 나름이지만 기능에 권한을 줄 수도 잇고 페이지에 줄 수도 있다. 도쿠위키의 경우는 페이지에 준다.)
이거 대충 보고 dokuwiki를 설치하고 ACL설정을 해 보면 곧 이해가 갈 것이다.
굳이 dokuwiki를 찝어서 말한것은…. 이게 설치하기 쉬우니까
이클립스 플러그인으로 설치 후 다운로드 받아서 사용하면된다.
이클립스 마켓플레이스에서 objectaid라고 검색하면 바로 나온다.
eclipse 메뉴 -> help -> marketplace -> objectaid로 검색
설치 끗
사용방법은… 보면안다.