== SimpleWiki == === Spring Framework === === Spring Security === * 스프링 시큐리티 사용 준비 * UserDetail - 스프링 시큐리티가 사용할 수 있는 User 객체 만들기 * 현재 로그인 한 사용자 정보 가져오기 1. SecurityContextHolder를 이용하는 법 {{{#!vim java Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); String name; if (principal instanceof UserDetails) { name = ((UserDetails)principal).getUsername(); } else { name = principal.toString(); } }}} 1. Spring dependency injection을 이용하는 법 {{{#!vim java public String write(@RequestParam("title") String title, @RequestParam("contents") String contents, Model model, Principal principal) { ... page.edit(contents, userRepository.get(principal.getName())); ... } }}} * spring security tab library * spring security에 관련된 기능들을 html/js에서 쓸 수 있다. {{{#!vim javascript <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %> ... save ... Logout }}} * Spring Security의 Role Voter는 "ROLE_" 접두어를 사용한 접근 속성만 처리한다. 단 접두어는 커스터마이징이 가능하다. === Hibernate === * ORM(Object Relation Mapping) 프레임워크. Java persistence, EJB3.0을 같이 알면 좋다. * Lisence : LGPL === JSP === === Markdown === * 위키 문법을 별도로 정의하고 파서를 구현하는 대신 Markdown을 사용하기로 결정했다. * Markdown이란 : [http://en.wikipedia.org/wiki/Markdown wiki:Markdown] * [http://en.wikipedia.org/wiki/List_of_Markdown_implementations 위키피디아]를 참고하여 Java로 구현된 Markdown implementation 중 Pegdown을 선택했다. * MarkdownJ, MarkdownPapers는 문서가 부실하고 남은 두 구현체 중 [https://github.com/sirthias/pegdown Pegdown]이 위키 제목을 통한 페이지 링크를 더 간편하게 지원해서. * 아주 간단한 Pegdown 사용 예 1. pom.xml에 dependency 추가하기 {{{#!vim xml org.pegdown pegdown 1.1.0 }}} 1. markdown text를 html 문자열로 변환 {{{#!vim java String html = new PegDownProcessor().markdownToHtml("markdown text"); }}} === CGLIB === * ''CGLIB는 코드 생성 라이브러리로서(Code Generator Library) 런타임에 동적으로 자바 클래스의 프록시를 생성해주는 기능을 제공(펌)'' 이라고 한다. == 후기 == === 8월 30일 === * [김수경] * 2주? 까지는 아니지만 1.5주만에 스터디를 재개했더니 이전 소스 코드가 잘 기억이 나지 않아 난감했다. 틈틈이 소스 코드를 봤다면 이렇게까지 기억이 안 나지는 않았을텐데 그동안 손을 놓고 있었더니... 다음엔 이러지 말아야지. * 처음에 소스 코드 짜면서 일단 돌아가게 만들자!! 는 마음으로 코딩을 했더니 바꿔야 할 부분이 아주 많아졌다. 아무렇게나 짜려는 건 아니고 개발이 너무 지연되다가 흐지부지 되는 게 싫어서 그렇게 한 건데 지속적으로 개발하다가 특정 부분을 고쳐야할 시기에 기민하게 고치지 않으면 답이 없는 코드가 되는 것 같다. * 그래서 오늘 느낀 게 이 코드는 데미 무어 코드라고… * TODO : write/delete 등 함수 단위로 security 설정 필요함 * [서지혜] * 오늘은 위키 문법을 구현하기로 하였다. * 위키의 문법을 구현하기로 하였는데 직접 파서를 구현하기보다 Markdown의 파서를 사용하면(Markdown 문법을 사용해야 하지만) 편리할 것 같아(명백해서 증명할 필요가 없다!) Markdown 파서중 pegdown을 쓰기로 경정. Java 언어 기반의 파서중 그나마 문서화(GitHub의 소개페이지)가 잘되어있어서.... * 아무튼 pegdown은 무지무지 쉬웠는데(new Pegdown().markdownToHTML(/* String 콘텐츠 */) 적용하는데까지 시간이 오래걸렸다. 하나 고치면 다른 에러가 나고 에러랑 스무고개했음ㅋㅋ * 당시엔 적절한 결정이라 생각했었을 텐데 이제보니 경악?스러운 부분이 있었다. '''결정에 대한 이유를 기록해두자'''. * 스무고개 * 이전에 돌아가던 것이 안돌아가 코드를 보니 테스트를 위한 Mock 객체를 참조하고 있었다. 실제 객체는 구현이 덜 되어있었음. 테스트를 하기 위한 구현을 했었다는 것을 알게되었다. 테스트용 코드가 Mock 객체를 벗어나 실제 객체에도 묻어있었음. 당시엔 확장과 변화를 위해 정한걸 텐데 ''지금보니 왜 이럴까?'' * '''그건 우리가 이 프로젝트(그리고 코드)에 대해 더 잘 알게 되었다는 뜻. 과거의 결점을 발견하는 것은 좋은 신호다'''. * 사소한 결정이라도 결정을 할 때에는 이유를 적어야겠다. * 공부할게 많다. * 좀 오래한 Spring, Hibernate도 어려움. CGLib, Spring Security, JSP, Session 찾아봐야겠다. * 쓰는건 쉽지만 작동을 모른다. * 바퀴 다시만들기 * 오픈소스인 pegdown과 문법 Markdown을 쓰니까 완전 편함 * 시간도 얼마 안걸렸다. 구현시간이 많이 단축되어서 위키쓰기질 하게됐음. === 9월 13일 === * [김수경] * [서지혜] * 오늘 가장 성공적이었던 일은 톰캣 서버를 구동시킨 일이다. * 감격, 서버가 돌아감! === 9월 19일 === * [김수경] * [서지혜] * 되서 화나는 일이 많다. 흐음..... * 이전 (리비전 9)에서는 jsp 에서 pageContext.getAttribute("page")로 Response의 page를 불러올 수 있었는데 리비전 10부터 pageContext.getRequst().getAttribute()(또는 request.getAttribute)를 해야 page를 불러올 수 있다. 왜지? 모르겠음. 한참헤멤 * Scope와 관계가 있을 것 같다. * Jasper는 JSP를 java로 변환해 실행시키는 엔진인 것 같다. * home.jsp는 home_jsp.java로 변환되는 식 === 9월 20일 === * [김수경] * login.jsp 를 만들어서 커스터마이징 한 로그인 페이지를 사용할 수 있게 수정했다. * 그런데 Remember me가 제대로 동작 안 함. * save를 누르면 저장된 내용이 바로 반영되어야하는데 새로고침 해야 반영된다. * [서지혜] * 로그인을 하면 login, signup등이 안보이게 하고 싶다 * spring security의 tag library의 ifAllGranted, ifNotGranted등을 사용할 수 있다. * 로그인이 되어있는지 view단에서 확인하는 기능이 필요하다 * 페이지를 타이틀로 검색 할 경우 어떻게 페이지 타이틀을 받아서 검색을 한 뒤 결과를 돌려주고, 없는 페이지는 새로 만들 수 있게 할까? * 보통 페이지 타이틀은 GET으로 받는듯. * url mapping 어떻게 하지? * pagdown의 page 링크는 localhost:8080/simplewiki/를 localhost:8080/''타이틀''로 바꿔버린다. * 원래 localhost:8080/로 나오는거 아닌가? * ViewResolver? Intercept Handler? * 개인 신상 털기하고 놀았음. 다들 덕이라 별로 재미없었다. * mac eclipse에서 tomcat 올리고싶은데 caltalina를 못찾는다 === 9월 27일 === * [김수경] * [서지혜] * PageTitle 받아서 검색하는 거 까지되었다!! 알고보니 어렵지 않은 문제였음, PathVariable로 url의 path 요소를 받을 수 있다. * 비슷한 기능으로는 getServletPath() === 10월 4일 === * [김수경] * [서지혜] * 위키쓰려다 날아가서 놀람 === 10월 11일 === * [김수경] * [서지혜] ---- * 엉엉 돌아왔다 - [서지혜] ---- [[Spring/탐험스터디]]