U E D R , A S I H C RSS

Spring/�험스터디/wiki만들기

SimpleWiki

Spring Framework

Spring Security

  • 스프ë§� 시í��리티 사용 준비
  • UserDetail - 스프ë§� 시í��리티가 사용할 수 있는 User ê°�ì²´ 만들기
  • 현재 로그ì�¸ 한 사용ìž� ì •ë³´ 가져오기
    1. SecurityContextHolder를 �용하는 법
      Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
      
                      String name;
                      if (principal instanceof UserDetails) {
                        name = ((UserDetails)principal).getUsername();
                      } else {
                        name = principal.toString();
                      }
      
    2. Spring dependency injection� �용하는 법
      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ì—�서 쓸 수 있다.

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
...
        <sec:authorize ifAllGranted="ROLE_USER">
                <input id="contents_edit" type="textarea" class="page_edit" value="${page.contents}" />
                <a href="#" class="page_edit" id="save">save</a>
        </sec:authorize>
...
        <sec:authorize url="/login">
                <a href="logout">Logout</a>
        </sec:authorize>

  • Spring Securityì�˜ Role Voter는 "ROLE_" ì ‘ë‘�어를 사용한 ì ‘ê·¼ ì†�성만 처리한다. 단 ì ‘ë‘�어는 커스터마ì�´ì§•ì�´ 가능하다.

Hibernate

  • ORM(Object Relation Mapping) 프레임워í�¬. Java persistence, EJB3.0ì�„ ê°™ì�´ 알면 좋다.
  • Lisence : LGPL

JSP

Markdown

  • 위키 문법ì�„ 별ë�„로 ì •ì�˜í•˜ê³  파서를 구현하는 대신 Markdownì�„ 사용하기로 결정했다.
    • Markdownì�´ëž€ : wiki:Markdown
    • 위키피디아를 참고하여 Java로 구현ë�œ Markdown implementation 중 Pegdownì�„ ì„ íƒ�했다.
      • MarkdownJ, MarkdownPapers는 문서가 부실하고 남ì�€ ë‘� 구현체 중 Pegdownì�´ 위키 제목ì�„ 통한 페ì�´ì§€ ë§�í�¬ë¥¼ ë�” 간편하게 ì§€ì›�해서.
      • 아주 간단한 Pegdown 사용 예
        1. pom.xml� dependency 추가하기
          <dependency>
                  <groupId>org.pegdown</groupId>
                  <artifactId>pegdown</artifactId>
                  <version>1.1.0</version>
          </dependency>
          
        2. markdown text를 html 문�열로 변환
          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�

  • 김수경
  • 서지혜
    • Pageë˜�는 User 계정 ì‚­ì œì—� 대한 고민. Page는 ì‚­ì œë�„ History로 남는다. 삭제했다가 ê°™ì�€ ì�´ë¦„으로 다시 만들면 history는 남아있ì�Œ. 그러나 User는 삭제해ë�„ id는 남아서 historyì—� 존재해야하고 ê°™ì�€ id로 다시 만들면 기존 ì •ë³´ 삭제가 í•„ìš”. 그래서 Userì�˜ ì†�성중 id와 다른 ì •ë³´(password, e-mail등..)를 분리하였다.

11월 01�

  • 김수경
  • 서지혜
    • Userê°€ 탈퇴시ì—�ë�„ userId는 남아 있어야 하며 탈퇴한 id로 가입할 수 있어야 하는 ì�´ìŠˆ í•´ê²°ì�„ 위해 Userì—�서 userId(String type)와 password,..(UserInfo.class)를 분리하였다.
      • User는 UserInfo를 가진다.( Composite)
      • User안ì—�서 UserInfo는 Nullable Columnì�´ì§€ë§Œ ì�´ë¯¸ 존재하는 UserInfo를 삭제할 때는 ForeignKey Contraint로 ì�¸í•´ ì—�러가 ë°œìƒ�ë�œë‹¤..
      • User와 UserInfoì�˜ í�¬í•¨ 관계를 변경하려 했으나 논리ì �으로 ë§žì§€ 않아 버림.
      • 회ì›�탈퇴시 UserInfo를 삭제하는 것ì�´ 아니ë�¼ 안ì�˜ field들ì�„ null등으로 초기화 하기로 í–ˆì�Œ... + 탈퇴한 회ì›�ì�¸ì§€ flag
      • ë�” 좋ì�€ 방법ì�´ 있ì�„ì§€ 고민.
    • 간단한 문제ì�¸ë�° (내게) 우아한 해결방법ì�´ 없다. 좌절.
    • 본스치킨 ì–‘ì �ì�€ë�° 너무 비싸. 18000ì›�ì�¸ë�° 치킨ì�€ ë‘� ì†�바닥 ë§Œí�¼ ì™”ì�Œ.

11월 21�

  • 김수경
  • 서지혜
    • Pageì�˜ History 보기 기능 설정
      • url "/"ì—� Pageë‚´ìš© 보기와 Page historyì�˜ ë‚´ìš© 보기 ë‘�가지 기능ì�„ 매핑하려 했다.
        • 다른 행위(page content view, page history view)를 하지만 ë�” í�° 행위(page view)ì�˜ subsetì�´ë¯€ë¡œ Request주소는 같게 하고 parameter를 달리해 ë‘� 행위를 구분하려 했다.
      • 컨트롤러 함수ì—� ì�¸ìž�를 다르게 해서 OverLoading하려 했으나 ResuestMappingì�´ 같아서 Springì�´ Ambiguous Mapping Exceptionì�„ ë°œìƒ�시켰다.
        • RequestMappingHandlerMappingì�˜ 매핑 í…Œì�´ë¸”ì�„ 보니 { URL , methods= Method 타입 , params=[],headers=[],consumes=[],produces=[],custom=[]}등으로 Request를 구분하고 있었다.
      • @RequestMapping 어노테ì�´ì…˜ì�˜ 설정값들 중ì—� params를 ì�´ìš©í•´ 파ë�¼ë©”í„° 등ë¡�ì�„ í•  수 있다. ì�´ë ‡ê²Œ 하면 특정 파ë�¼ë©”í„°ê°€ 넘어올 때ì—�ë§Œ RequestMappingì�„ í•  수 있다.
        • ì�´ë¥¼ ì�´ìš©í•´ RequestMappingì�˜ valueê°’, Method 타입ì�´ 같아ë�„ 특정 파ë�¼ë©”í„°ì�˜ 유무로 리퀘스트 핸들ë§�ì�„ 달리할 수 있다.
        • 예를들어 @RequestMapping(value = "/helloworld", method = RequestMethod.GET)와 @RequestMapping(value = "/helloworld", method = RequestMethod.GET, params="param=param")ì�€ 다르다. ê°�ê°� 다른 함수ì—� mappingë�  수 있다.

    • Login하지 않고 Page를 ìƒ�성할 수 있는 문제
      • FrontPageê°€ ì—†ì�„ 때ì—�는 Loginì�„ 하지 않아ë�„ Page create를 í•  수 있었다.
        • spring securityì—�서 "/create" urlì—� authenticationì�„ 설정
        • uiì—�서 Signup하는 부분ì�„ 다른 페ì�´ì§€ë¡œ ì¶”ìœ
        • RequestMappingì�˜ method 타입ì�„ ì�´ìš©í•´ signup 페ì�´ì§€ 호ìœê³¼ 실제 signupì�„ 구분하여 핸들ë§�
          • ì�´ê±´... ì�Œ.. "signup í�¼ì�„ ë‹´ì�€ 페ì�´ì§€ë¥¼ 호ìœ" í•  때와 "사용ìž�ì�˜ ID와 PASSWORD를 전달해 로그ì�¸ 처리를 하는" 경우가 ê°™ì�€ Request Nameì�„ 가지게 ë�˜ì„œ..
      • ì�´ì œ 로그ì�¸ë�˜ì§€ 않ì�€ 사용ìž�ê°€ 페ì�´ì§€ ìƒ�성ì�„ 요청하면 Spring Securityì—� ì�˜í•´ Signup 페ì�´ì§€ë¡œ ì�´ë�™ë�œë‹¤. ë�—

11월 29�

  • 김수경
  • 서지혜
    • ìž…ì�„ 함부로 놀린 죄로 ë°±ë§�í�¬ì—� 대해 고민중. ìƒ�ê°�보다 까다로운 주제여서 당황, 위키페ì�´ì§€ì�˜ backlink 설명ì�€ 너무 부족하구만..
    • linkbackì�€ ë­�ì§€?
      • backlink는 ìž�ì‹ ì�„ 참조하는 ë§�í�¬ë“¤ì—� 대한 참조(역참조)ì�´ê³ , linkbackì�€ backlink하는 방법들ì�´êµ°.

12월 6�

  • 김수경
    • Javaì—�서 Matcher를 사용할 때 matches()는 ì „ì²´ê°€ 완전히 ì�¼ì¹˜í•˜ëŠ” 것만 찾아주고 find()는 substringì�¼ 때ë�„ 찾아준다. 예를들어 'abcde'ì—�서 'bcd'를 ì°¾ì�„ 때 matches를 사용하면 못 찾고 find를 사용하면 ì°¾ì�Œ.
  • 서지혜
    • backlink 처리 프로토타ì�´í•‘ 중
    • Javaì�˜ Matcher 중 find()와 matches()ê°€ 패턴매칭과 관련ì�´ 있는걸로 알고있는ë�° 찾아서 다시 쓰겠다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:05
Processing time 0.0129 sec