2016년 5월 25일 수요일

Cross Domain 문제 해결법 (jsonp, cors )

  • 문제상황: Cross Domain
    • Cross Domain문제란?
    • ajax호출을 통해 다른 도메인에 있는 자원에 접근할 때
      다른 도메인에 존재하는 데이터를 가져오는 경우, 자바스크립트가 있는 서버가 아닌 다른 서버와 통신하면 보안이슈에 의해서 통신할 수 없음. ( mash up application개발시에 주로 발생) 
  • 해결방법
    1. Server Proxy
      • 웹 브라우저에서 보여지고 있는 문서와 동일한 origin에 proxy를 두고, 다른 origin의 데이터를 가져옴. 
    2. Cross Document Messaging
      • 페이지간 커뮤니케이션 지원하는 API
    3. JSONP
      • html에 script src를 추가하여, 필요한 자원을 로드하듯이, 필요한 페이지 주소를 cript사이에 넣음
      • 예)
        <script> function test(data) {
                     console.log(data); //log로 데이터 출력됨
        }
        </script>

        <script src="http://google.co.kr/example/api/getSearchPages/news.json?callback=test"></script>
      • 한계점: HTTP METHOD:GET만 가능
    4. CORS
      • cors.js를 이용하여 요청
      • response.setHeader("Access-Control-Allow-Origin","*");
  • 참고
    • https://www.w3.org/TR/cors/
    • https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

2016년 5월 12일 목요일

IntelliJ 한글 인코딩 깨짐 해결 (properties file, utf-8 encoding): "Transparent natvie-to-ascii conversion"

  • [문제상황]: 프로젝트 Import후 모든 한글 파일들이 깨짐
    • project > preferences > 에서 인코딩 UTF-8선택하였지만 --> 한글깨짐
  • [해결방법]: 다음과 같이
                 
    • Project> preferences > editor> file encodings에서 Properties File에 Transparent native-to-ascii conversion체크
    • Transparent native-to-ascii conversion:
      JetsBrains의 설명에 따르면, Standard JAVA API는 ISO 8859-1을 이용하여 Properties파일을 인코딩함. 
      하지만 위에서 properties파일을 UTF-8로 세팅함
    • 만약 위의 설정을 체크하면 다른인코딩을 사용한다면, properties파일은 \0A 과 같은 escape들의 연속으로 저장되더라도, 보여지기는 한글이나 ASCII아스키로 보일 수 있도록 지정해주는 옵션이다. //해결!
      https://www.jetbrains.com/help/idea/2016.1/configuring-encoding-for-properties-files.html?origin=old_help
       

2016년 5월 9일 월요일

[spring] difference between @ModelAttribute method and parameter @modelattribute 차이점

@Controller@RequestMapping("/admin/survey")
public class SurveyManageController {

    @Autowired    private SurveyService surveyService;
    @Autowired    private StoreService storeService;
    @ModelAttribute("hello")
     public SurveyOpen testShowModelAttribute() {

        SurveyOpen surveyOpen = new SurveyOpen();        surveyOpen.setStoreNum(100);        surveyOpen.setMenuNum(200);        surveyOpen.setName("테스트");
        return surveyOpen;
    }

    @RequestMapping(method = RequestMethod.GET)
    public String showSurveyList(Model model) {

        List<SurveyListVo> surveyList = surveyService.getOpenSurveyList();        model.addAttribute("surveyList", surveyList);        return "/admin/survey_list";    }

    @RequestMapping(value="/open", method=RequestMethod.GET)
    public String showRegisterForm(Model model) {

        List<Store> storeList = storeService.getStoreList();        model.addAttribute("storeList", storeList);        model.addAttribute("surveyForm", new SurveyOpen());        return"/admin/survey_submit_form";    }
  @RequestMapping(value="/open", method=RequestMethod.POST)
    public String registerSurvey(@ModelAttribute("surveyForm") SurveyOpen survey){
        surveyService.registerSurvey(survey);        return"/admin/survey_submit_form";//        return "redirect:/admin/survey";    }


@ModelAttribute("model")
public ObjectToSendViewPage methodName() {
             return new ObjectToSEndViewPage();

}


  • @ModelAttribute at Method: whenever controller is called, this method will be populated to deliver the object to view page. 
    • upper code, hello object (
      @ModelAttribute("hello")
      will be delivered to view all the time when showRegisterForm function or showSurveyList function is called. 
    •  access in view (jsp page)
      ${model.attributeName}
  • @ModelAttribute at Parameter: it only populated when the function containing this parameter is called.
     public SurveyOpen testShowModelAttribute()
    • On the other hand, surveyForm object will be delivered only when registerSurvey method is called
-------------------------------------------------------------------------------------------
  • 컨트롤러 안에 @ModelAttribute메서드
     public SurveyOpen testShowModelAttribute()는, 위 메서드를 포함하는 컨트롤러중 어느것이라도 호출되면 뷰에 전달
  • 파라미터로 전달된 @ModelAttribute,
    @ModelAttribute("surveyForm") SurveyOpen surveyOpen

    public String registerSurvey
    호출시에만 view에 전달됨

[spring] handlerInterceptor calls in order

Spring interceptor works before or after a controller called.
  • Usage : Login check, common validation check, set up uri parameter
  • todo: implement prehandle(), postHandle(), or AfterCompletion() method
 <handler calls in order>
  • before controller called : preHandle() works
  • after controller called: postHandle()  works
  • After view made : afterCompletion() works

  • xml file
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <propery name="interceptors">
               <list>
                      <ref bean="interceptor1"/>
                      <ref bean="interceptor2"/>
                  </list>
              </property>
        </bean>

    • Specific handler Calls in order
      • preHandler() works
      • interceptor1.preHandle()
        interceptor2.preHandle()
    • handleRequest() at Controller
    • postHandler() works
      • interceptor2.postHandle()
      • interceptor1.postHandle()
    • render() at View Object called and makes the result for response
    • afterCompletion() works
      • interceptor2.afterCompletion()
      • interceptor1.afterCompletion()
    reference: 최범균 - 웹개발자를 위한 Spring3.0 프로그래밍

    [spring] 뷰에 전달되는 모델 데이터

    1. 커맨드 객체 
      • 종류: @ModelAttribute로 설정된 파라미터
    2. @ModelAttribute어노테이션이 적용된 메서드가 리턴한 객체
    3. 메서드의 Map, Model, ModelMap 타입의 파라미터를 통해 설정된 모델

     @Controller
    public class GameSearchController {
    
        private SearchService searchService;        @ModelAttribute("searchTypeList")
        public List<SearchType> referenceSearchTypeList() {
            ArrayList<SearchType> options = new ArrayList<SearchType>();        options.add(new SearchType(1,"all"));        options.add(new SearchType(2,"item"));
            return options;    }
        @RequestMapping("/search/game.do")
        public ModelAndView search(@ModelAttribute("command")SearchCommand command, ModelMap model) {
            String[] queryList = new String[]{"one","two"};        model.addAttribute("queryList", queryList);                ModelAndView mav = new ModelAndView("search/game");        mav.addObject("searchResult",searchResult);    }
    }



     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html><head>    <title></title></head><body>  Popular Keyword: 
      <c:forEach var="popularQuery" items="${popularQueryList}">
        ${popularQuery}
      </c:forEach>
      검색 list
      <c:forEach var="searchType" items="${searchTypeList}">
        <c:if test="${command.type == searchType.code}">selected</c:if>
      </c:forEach>
    
      <input type="text" name="query" value="${command.query}"/>
      검색결과 : ${searchResult}
    </body></html>
    참조: 스프링3.0 프로그래밍 - 최범균

    [spring] 컨트롤러 메서드의 리턴타입

    컨트롤러 메서드는 ModelAndView를 비롯한 몇 가지 리턴 타입을 가질 수 있으며, 아래와 같다

    @RequestMapping 메서드의 리턴타입
     리턴타입
    설명 
     ModelAndView
    뷰 정보 및 모델 정보를 담고 있는 ModelAndView객체 
    Model
    뷰에 전달할 객체 정보를 담고 있는 Model을 리턴한다. 이때 뷰 이름은 요청URL로 부터 결정된다. (RequestToViewNameTranslator를 통해 뷰 결정)
     Map
     뷰에 전달할 객체 정보를 담고 있는 Map을 리턴한다. 이때 뷰 이름은 요청URL로 부터 결정된다. (RequestToViewNameTranslator를 통해 뷰 결정)
    String
    뷰 이름을 리턴한다 
    View 객체
    View객체를 직접 리턴. 해당 view 객체를 이용해서 뷰를 생성한다 
     void
    메서드가 ServletResponse나 HttpServletResponse타입의 파라미터를 갖는 경우 메서드가 직접 응답을 처리한다고 가정한다. 그렇지 않을 경우 요청 URL로 부터 결정된 뷰를 보여준다.(RequestToViewNameTranslatro를 통해 뷰 결정) 
    @ResponseBody어노테이션 적용 
    메서드에서 @ResponseBody 어노테이션이 적용된 경우, 리턴 객체를 HTTP응답으로 전송한다. HttpMessageConverter를 이용해서 응답 스트림으로 변환한다. 

    //todo
    • contentNegotiation 을 통한 다양한 view제공 (REST서비스에서 XML VIew, JSON View, jsp view , etc..)
    • Message converter이용가능에 대하여 학습하고 정리하기 ( client츨의 accept-header를 근거로 적절한 MessageConverter에 해당하는 view 매핑하여 변환)


    reference:  웹개발자를 위한 Spring 3.0 프로그래밍 - 최범균 지음- 가메출판사

    [Spring] Command 객체 vs Model 객체


    • Command Object - 폼 형식에서 instance화되어 만들어진 된 자바객체 : 주로 사용자의 정보를 담는다
      • HTTP요청 파라미터를 저장한 객체, 기본적으로 클래스 이름을 모델명으로 사용. @ModelAttribute 어노테이션을 사용하여 모델명을 설정할 수 있음
    • Model Object :사용자에게 보여줄 뷰를 만들기 위하여 필요한 것으로서, 주로 response생성시에 사용됨 
      • reference : http://www.coderanch.com/t/547052/Spring/Difference-Command-object-Model-object
      • reference: http://stackoverflow.com/questions/7583577/what-is-the-command-object-in-spring-framework
      • reference: 웹개발자를 위한 Spring 3.0 프로그래밍 - 최범균 지음- 가메출판사

    Linux (UTF-8) Window 엑셀에서 CSV파일 한글 깨짐 (인코딩)


    • 문제상황
      • Linux에서 CSV파일 생성(인코딩: UTF-8)
      • Window로 복사해서 open할경우 인코딩 깨짐
    • 상황
      • Linux, MAC : CSV작성시 -->  ( 한글 인코딩 : UTF-8 )
      • Window: EXCEL에서 CSV파일 생성 --> CP949
      • Window에서 EUC-KR파일을 그냥 저장하면 --> ASCII (한글날라감)
    • 해결방법
      • (파일을 윈도우에서 수정하지 않고, 열어서 보기만 할경우)
        (1)sublime text > Set file encoding to > UTF-8 선택
        (2) 직접 linucx서버에서 파일 생성시 UTF-8 BOM생성해서 입력 해줌 (Hexa: EF BB BF)
    public static final byte[] BOM = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
      •  (파일을 윈도우에서 수정할 경우) --> 내용을 수정시 Window Excel에서 그냥 저장 누르면 ASCII로 인코딩되어 한글 깨짐, 다른이름으로 저장을 눌러 원래파일이름에 덮어쓰기 저장하면 EUC-KR로 저장됨 
      • (파일을 서버에서 읽어야 할 경우) --> JAVA에서 fileInputStream 맨앞3Byte (BOM) 을 확인하여 fileread시에 파일의 인코딩에 맞게 read(4byte씩: utf-8은 가변길이로 1byte~4byte이므로 max길이인 4byte씩읽어야함)

    • 참고: 한글인코딩에 관하여
      http://d2.naver.com/helloworld/19187
    • 참고: 한글인코딩 CP949 <> EUC-KR <>UTF-8에 관하여
      http://studyforus.tistory.com/167

    2016년 5월 8일 일요일

    System.out.println 보다 Logger를 사용해야 하는 이유

    Logger가 장려되는 이유

    1. 퍼포먼스가 좋다
      Logger4J등 요새 나온 로거들은 비동기식 로그 지원(Asynchronous logging)은 I/O 연산 지원시 별도의 thread로 동작하므로 성능ㅑㅇ상이 됨
    2. 여러가지 모드 설정가능
      debug, warning, error, info등 여러가지 모드가 지원되어 개발환경에서 모드별로 보이는 방식 설정할 수 있고
      info모드는 local모드에서 개발시에는 보이지만, 배포시에는 log기록이 되지 않는등 여러가지 설정이 가능함 

    [mac] port forwarding: pfctl


    • MAC HTTPS 연결
      • [문제점] : MAC의 경우 1000이하의 port ( 80, 443 ) 막아둠
      • [해결방법] port tunneling (pfctl 사용: control the packet a filter):
        • 실행
          $sudo pfctl -ef "filename.conf"
          • [ filename.conf]
            rdr-anchor "forwarding"
            load anchor "forwarding" from "/etc/pf.anchors/eclipse.tomcat.forwarding"
          • [eclipse.tomcat.forwarding]
            rdr pass on lo0 inet proto tcp from any to ip port {443, 8443} -> targetip port target-port //case your local ip
            rdr pass on vmnet8 inet proto tcp from any to ip port {443, 8443} -> targetip port target-port //case when window vm ware network
        • port forwarding 중지
          $sudo pfctl -d

    hybrid app view rendering 빠르게 하는 방법 (수정중)


    • 먼저 view페이지를 보여주고, <body>시작이후 script를 추가하여 ajax로 필요한 데이터를 호출
    • CDN 서버를 이용해 이미지 빠르게 사용자에게 제공해줄 수 있도록
    • 이미지와 loading되는 소스 등을 cache하여 보여줄 수 있도록 
    • 뷰 페이지 (jsp)에서 이미지를 base64인코딩 이미지를 이용하여 바로 작은사이즈 이미지파일을 보여준 이후에, ajax호출을 통하여 실제 이미지로 교환

    [java] vm options: system property ,시스템 프로퍼티, java -D옵션


    • (사용) tomcat run 실행시에 vm options에 -Dfile.encoding=utf8 와 같은 옵션 설정
    • tomcat이 JVM하에서 로드되는건데, system properties 를 통해 JVM통해 TOMCAT까지 전달한다고 생각하면 편함
    • vm options이란? 
      • java file run이란, compile 된 프로그램을 실행하는 것과 같은데
        실행시에 $ ./실행파일 -옵션[VM options] 과 같음
      • 사용 이유: runtime시 (실행시점) 에 결정되는 변수들 설정에 용이
      • [ 사용예시1 ] 지금 어디 인스턴스에서 띄우는지, log configurationfile을 위치 설정할 수 있음
        지금 개발환경/상용환경/QA환경인지 표시해 줄수 있고, 이에 따라 각각 맞는 properties를 띄울 수 있음
      • [ 사용예시2]
        Tomcat Run시에 VM Options --> -Dservice.type =local 설정
        java코드에서 System.getProperty("Dservice.type").equals("local") ? 이에 맞게 각각 설정 가능
    • cf) local,dev,stg등등 개발환경 설정시에
      스프링에서 제공하는 VM option에
      -Dspring.profiles.active=dev 과 같이하면 테스트에 조금 더 유용하긴 함
      우리팀은 maven에서 classpath별로 위치를 잡음

    [shellscript] source 명령어 (source ~/.bash_profile)

    • 문제: bash_profile에 설정사항들이 바로 터미널에 반영되지 않는다
    • 이유: 같은 세션내에서는 아직 새로 만든 bash_profile 파일이 적용되지 않았기 때문
    • 해결방법: source ~/.bash_profile
    • source명령어의 역할?
      • 그 해당위치의 파일을 지금 다시 읽어서 재실행 
      • 현재 다시 파일을 다시 load하는 기능
        • [source command] 에 대한 원문
        • The source command can be used to load any functions file into the current shell script or a command prompt.
        • It read and execute commands from given FILENAME and return.
        • The pathnames in $PATH are used to find the directory containing FILENAME. If any ARGUMENTS are supplied, they become the positional parameters when FILENAME is executed.
          • reference : https://bash.cyberciti.biz/guide/Source_command

    MAC IntelliJ shorcuts 신박한 단축키 (introduce local variable) (세로줄 편집) (수정중)


    • 기본
      • Project Structure (프로젝트 세팅) :  ;
      • Call hierarchy (호출한 것) :⌥ H
      • introduce local variable(자동 변수생성)  : command + alt(option) + V
        • new String --> introduce local variable --> String aa = new String();
      • 자동생성 : command + N
      • 한줄 지우기 : command + X
      • 세로 편집: Shift + command + 8 
      • import 최적화 : Ctrl  + Alt + O 

    [스프링배치 / Springbatch] transaction commit dao모드 선택


    • 문제사항:  
      • SQLException발생할 부분에 try catch가 안먹고exception도 propagation되지않는 기이한 현상
      • Transaction commit이 TaskletTemplate.java에서 동작하는 이상한 일이 발생하였었다.
      • 그곳 <T> execute()내의 transaction.commit();후 query가 동작하게 되었었다.

    • 원인
      commonDAOSpsacSpbatBatchMode 라는 addbatch mode( query모아 놓았다가 commit)하는 빈을 사용하였기 떄문이다

      일반 common을사용하였다. 

      문제 해결


      //SQLException이 아닌
      DuplicateKeyException발생

    [JAVA] String.equals == 비교, DB필드로부터 String은 runtime생성


    • == , reference check
      • reference값이 같고, reference에있는 value값이 같은지 체크
        • DB로부터 값 주입시에는 literal이 아닌 instance생성이므로 
        • DB값과 String비교시는 == 가 아닌 equals로 비교해야함
        • String strFromDB = DB에 있는 "Y"값 주입
          String comp = "Y"
        • strFromDB=="Y" --> false 
    • str1.equals(str2) 
      • 내부구현코드 보면, 하나하나씩 for문을 돌며 str1[i] 와 str2[i]의 값 비교
        같은 값을 가졌는지 비교
        • String str1="aaa"
          String str2="aaa"
        • str1==str2 --> false
          str1.equals(str2) -->true

    HTML 자바스크립트 script import되지 않을경우 : script src=""




    • 문제점 <script src="aaa"/>  src가 인클루드 되지 않음. 
    • 해결법: <script 파일 <script> </script>로 닫아줘야 제대로 include된다.
    • 설명: 
      • XHTML에서는 <script></script>닫는태그를 생략하고 <script src="URI_PATH" /> 사용해도 되지만
        HTML에서는 <script src="URI_PATH" />이 문법을 허용하지 않음. 특히IE는 허용하지 않으므로 반드시
        <script src="URI_PATH"></script>로 사용해야함

    • 출처 : 프론트엔드 개발자를 위한 자바스크립트 프로그래밍

    Head First Servlets & JSP(3) 기초개념 - 필터와 랩퍼


    13. 필터와 랩퍼
    : 필터는 요청을 중간에서 가로챕니다
        요청(Request)을 중간에서 가로 챌 수 있다는 것은 응답(Response)도 함께 가로챈다는 것을 의미
    • [장점]은 서블릿이 눈치채지 못한다는 것 
      --> 클라이언트의 요청과 컨테이너가 서블릿의 service()메소드를 호출하는 중간에 끼어 들기 때문
      --> 서블릿 수정하면서 보냈던거 필요없음. 필터하나만 수정하면 모든 서블릿에 적용됨
    • 학습목표
      • 웹 컨테이너가 요청을 어덯게 처리하는지 설명가능해야함
        필터를 DD에 설정, 작성가능해야함
        요청, 응답 랩퍼(Wrapper)를 만들 수 있어야함
      • 문제 해결할 수 있는 패턴 선택가능해야함
        • 인터셉팅 필터 패턴
        • 모델-뷰-컨트롤러
        • 프론트 컨트롤러
        • 서비스 로게이터
        • 비지니스 델리게이트
        • 트랜스퍼 오브젝트 

     필터란?
    자바 컴포넌트(서블릿과 비슷)
    필터를 사용해서 서블릿으로 요청이 넘어가기전, 요청을 가로채 어떤 처리 할 수 있으며 서블릿 작업 완료 후 응답에 어떤 작업 가능

    DD에 필터를 선언해둔 정보에 기초해서, 컨테이너는 언제 필터를 실행할지 인지하고 있음
    배포자(Deployer)가 URL패턴에 따라 호출할 필터가 무엇인지 매핑함
    --> 프로그래머가 아닌 배포자가 어떤 서블릿이 어떤 필터에 의해 처리되는지 결정함




    14.패턴과 스트럿츠(엔터프라이즈 디자인 패턴)
    reference : Head First Servlet & JSP

    Head First Servlets & JSP(1) 기초개념 - 컨테이너

     웹 클라이언트와 웹 서버가 어떻게 서로 커뮤니케이션하는가
     웹서버는 어떤 일을 하나요? 웹 서버는 클라이언트로부터 요청을 받아, 요청한 것을 넘겨주는일
     클라이언트는 무엇을 하나? 사용자가 서버에 요청을 보낼 수 잇는 기능 제공. 요청 보내고 난 다음, 서버가 보내온 요청의 결과를 화면에 출력
    HTML코드를 읽어서(파싱) 화면에 보임
     (클라이언트)와 (서버)는 HTML과 HTTP를 어떻게 다룰지 압니다
    HTML
    (클라이언트) 요청 수신후; 서버는 브라우저에게 컨텐츠 타입이 무엇인지 알려줌.
    (브라우저)는 이 내용에 기초하여 어떻게 화면에 출력할지 준비
     HTML이라는 명령어로; 브라우저가 화면에 컨텐츠를 출력할지에 대한 명령문(instruction)


     컨테이너가 주는 혜택
     서블릿 실행하고 관리
     1. 통신(커뮤니케이션)지원
     서블릿과 웹 서버가 서로 통신할 수 있는 손쉬운 방법 제공. 
    개발자가 서버와 대화하기 위해 ServerSocket을 만들고, 특정 포트에 리스닝 하고, 연결요청이 들어오면 스트림 생성 // 할필요 없음
    컨테이너는 어떻게 웹 서버와 통신해야하는지 잘 알 고 있으며, 이런 통신기능을 API로 제공함 
     2. 생명주기(라이프사이클)관리
    컨테이너는 서블릿의 탄생과 죽음을 관리
     컨테이너는 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메소드를 호출하고, 요청이 들어오면 적절한 서블릿 메소드를 호출하고, 서블릿이 생명을 다하면 GC진행
    // 서블릿 자원을 효율적으로 관리해줌
    3. 멀티스레딩 지원
    //다중요청에 대한 스레드 생성 및 운영에 대해서 처리해줌(스레드안전성보장)
    컨테이너는 요청마다 스레드 만듬
    클라이언트 요청에 따라 적절한 HTTP서비스 메소드를 실행하면, 스레딩 작업끝남(스레드 죽음) 
    4.선언적인 보안관리
    보안관련된 내용을 서블릿 또는 자바 클래스 코드안에 하드코딩 할 필요없고
    XML 배포서술자(Deploy Descriptor)에 기록하면됨.
    -->보안 수정사항시 javacode수정하고 다시 컴파일하지 않아도 보안관리 가능 
     5. JSP지원
    JSP코드를 실제 자바코드로 변환 
    • 개발자가 비지니스 로직에 충실하게 해주며, 스레딩이나 보완 네트워크 통신에 관련된 문제를 컨테이너에 위임.
    • 서블릿은 서비스 클라이언트;클라이언트 요청 수신 및 응답; 컨테이너는 서블릿을 관리해주고 생성, 소멸하는 사후까지 관리가 컨테이너 

     1. 서블릿과 JSP는 어디에쓰는 물건인고?
    웹 애플리케이션은 이제 막 달아오른 시장. 
    2. 웹 애플리케이션 아키텍쳐
    서블릿은 도움이 필요합니다. 요청이 들어오면, 누군가 서블릿을 초기화해서, 요청을 처리할 새로운 스레드를 만들어야 합니다. 그러면 그 누군가는 서블릿의 doPost()또는 doGet()메서드를 호출.
    여기에 또 하나, 이 두 메소드의 매개변수로 들어가는 HTTPRequest 와  HTTPResponse객체를 누군가가 생성해서 서블릿으로 넘겨주어야 겠지요. 또한 누군가는 서블릿이 생성, 소멸하는 시점에서 리소스 관리도 해야합니다. 그 누군가가 누구냐 하는 것인데, 바로 컨테이너입니다.

    3. 초간단 미니 MVC 튜토리얼 
     4.서블릿이 되어보자
    서블릿은 평생을 서비스 클라이언트로 삶니다.
    서블릿이 하는 일은 클라이언트로부터 요청을 받아 이에 응답하는 일입니다.
    요청은 "환영페이지 보여주세요(GET)"에서부터 "결제해주세요"라는 것까지 다양. Request객체에는 사용자의 중요한 데이터들이 들어있기 때문에, 서블릿은 어떻게 이 정보를 읽어오고, 사용할 것인지 알아야 합니다. Response객체는 브라우저가 화면에 정보를 출력하거나, 바이트 정보를 내려받는것과 같은 정보 전송역할을 하기에, 서블릿은 데이터를 어떻게 전송하는가도 미리 알고 있어야 합니다.
     5. 웹애플리케이션이 되어보자
     6. 대화 상태 유지하기
    웹 서버에는 메모리가 없습니다.
    웹 서버는 응답을 보낸 다음에는 당신이 누구였는지 조차 잊어버립니다. 다음 번에 다시 요청을 해도, 그가 이전의 당신이었다는 것을 모르죠. 
     7. JSP가 되어보자
    JSP, 서블릿이 되다.
    개발자가 서블릿을 만들지는 않았지만, 컨테이너는 알아서 JSP를 서블릿 소스코드로 변환한 다음, 컴파일하여 완전한 서블릿 클래스로 탈바꿈시킵니다. 
     8. 스크립트가 없는 페이지
     9. 막강한 커스텀 태그
     10. JSTL만으로 만족스럽지 않을때
    11. 웹 애플리케이션을 배포해보자
    이제 개발한 웹 애플리케이션을 배포할 때가 되었군요.  
     12. 비밀스럽게, 안전하게
    지금 당신의 웹 애플리케이션이 위험에 처해 있다. 
     13. 막강 필터
    필터는 요청을 중간에서 가로 챕니다.
    요청(Request)을 중간에서 가로챌 수 있다는 것은 응답(Response)도 함께 가로챈다는 것을 의미합니다. 이 방식의 장점은 무엇보다도 서블릿이 눈치채지 못한다는 것이죠. 즉 클라이언트의 요청과 컨테이너가 서블릿의 service()메소도를 호출하는 중간에 끼어 들기 때문에 무슨 일이 있었는지 모른다는 말이죠. 그런데 뭐하려고 이러냐고요? 
     14. 엔터프라이즈 디자인 패턴
    누군가는 이 문제를 겪었습니다.
    자바로 웹 애플리케이션 개발이 처음이라면, 운이 좋군요. 이제 J2EE 셔츠를 입고, 이 길을 걸어간 수 많은 개발자들이 흘린 땀과 지혜의 총화를 만나게 될 것입니다.
    reference : Head First Servlet & JSP

    Head First Servlets & JSP - servlet 요약 - 0 개괄


     1. 서블릿과 JSP는 어디에쓰는 물건인고?
    웹 애플리케이션은 이제 막 달아오른 시장. 
    2. 웹 애플리케이션 아키텍쳐
    서블릿은 도움이 필요합니다. 요청이 들어오면, 누군가 서블릿을 초기화해서, 요청을 처리할 새로운 스레드를 만들어야 합니다. 그러면 그 누군가는 서블릿의 doPost()또는 doGet()메서드를 호출.
    여기에 또 하나, 이 두 메소드의 매개변수로 들어가는 HTTPRequest 와  HTTPResponse객체를 누군가가 생성해서 서블릿으로 넘겨주어야 겠지요. 또한 누군가는 서블릿이 생성, 소멸하는 시점에서 리소스 관리도 해야합니다. 그 누군가가 누구냐 하는 것인데, 바로 컨테이너입니다.

    3. 초간단 미니 MVC 튜토리얼 
     4.서블릿이 되어보자
    서블릿은 평생을 서비스 클라이언트로 삶니다.
    서블릿이 하는 일은 클라이언트로부터 요청을 받아 이에 응답하는 일입니다.
    요청은 "환영페이지 보여주세요(GET)"에서부터 "결제해주세요"라는 것까지 다양. Request객체에는 사용자의 중요한 데이터들이 들어있기 때문에, 서블릿은 어떻게 이 정보를 읽어오고, 사용할 것인지 알아야 합니다. Response객체는 브라우저가 화면에 정보를 출력하거나, 바이트 정보를 내려받는것과 같은 정보 전송역할을 하기에, 서블릿은 데이터를 어떻게 전송하는가도 미리 알고 있어야 합니다.
     5. 웹애플리케이션이 되어보자
     6. 대화 상태 유지하기
    웹 서버에는 메모리가 없습니다.
    웹 서버는 응답을 보낸 다음에는 당신이 누구였는지 조차 잊어버립니다. 다음 버넹 다시 요청을 해도, 그가 이전의 당신이었다는 것을 모르죠. 
     7. JSP가 되어보자
    JSP, 서블릿이 되다.
    개발자가 서블릿을 만들지는 않았지만, 컨테이너는 알아서 JSP를 서블릿 소스코드로 변환한 다음, 컴파일하여 완전한 서블릿 클래스로 탈바꿈시킵니다. 
     8. 스크립트가 없는 페이지
     9. 막강한 커스텀 태그
     10. JSTL만으로 만족스럽지 않을때
    11. 웹 애플리케이션을 배포해보자
    이제 개발한 웹 애플리케이션을 배포할 때가 되었군요.  
     12. 비밀스럽게, 안전하게
    지금 당신의 웹 애플리케이션이 위험에 처해 있다. 
     13. 막강 필터
    필터는 요청을 중간에서 가로 챕니다.
    요청(Request)을 중간에서 가로챌 수 있다는 것은 응답(Response)도 함께 가로챈다는 것을 의미합니다. 이 방식의 장점은 무엇보다도 서블릿이 눈치채지 못한다는 것이죠. 즉 클라이언트의 요청과 컨테이너가 서블릿의 service()메소도를 호출하는 중간에 끼어 들기 때문에 무슨 일이 있었는지 모른다는 말이죠. 그런데 뭐하려고 이러냐고요? 
     14. 엔터프라이즈 디자인 패턴
    누군가는 이 문제를 겪었습니다.
    자바로 웹 애플리케이션 개발이 처음이라면, 운이 좋군요. 이제 J2EE 셔츠를 입고, 이 길을 걸어간 수 많은 개발자들이 흘린 땀과 지혜의 총화를 만나게 될 것입니다.
    reference : Head First Servlet & JSP

    2016년 5월 3일 화요일

    difference between classpath: and classpath*:

    During setting up spring configuration, you can see classpath and classpath*:
    • classpath : return the first thing at given location (주어진 classpath경로에서 첫번째 항목)
    • classpath*: return all thing at given location (주어진 classpath에 해당하는 모든 항목들)

    2016년 5월 1일 일요일

    서버에 쉽게 삭제되는 Diffie-Hellman 공개 키가 있습니다. ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY

    Chrome browser on local development environment shows the Diffie-Hellman Error after launching the local tomcat server.


    • [Reason why this happened] : After Chrome browser updated, the policy on certificate at server is strengthen .
      Our company has the 512 bit certification, which are not allowed to use in the latter chrome browser.
    • [solution]
      • Install certification on server which are adequate on Chrome policy (At least 1024bit certificate
      • (temporal solution) develop on another browser (e.g. MSIE(Microsoft Internet Explorer, Safari browser)
    • [c.f] What is Diffie - Hellman Key exchange 
      • public key exchange 
        • issues about exchaging public key
          • Verification for public key
            • Validate the given public key
            • Authenticate the public key
            • MITM (Man-in-the-middle) attack  is possible 
          • Performance issues
            • the performance of Symmetric-key cryptosystem is  higher hundred times on average
      • Same key can be generated by exchanging specific information between sender and receiver
      • Eavesdropper can not generate the same key
      • Cannot provide authentication so that Man-in-the-middle attack is possible by active attacker.    
    --------------------------------------------------------------------------------------------------------
    여느때와 같이 Web Page개발을 위하여 로컬로 서버를 기동하고 크롬을 키니

    아래와 같은 메세지가 발생. 


    서버에 쉽게 삭제되는 Diffie-Hellman 공개 키가 있습니다. ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY 

    • [문제 원인] 크롬 브라우저가 업데이트 하면서 인증서 강화정책을 하며 발생하는 문제
    • [해결책] 
      • 서버에 다시 크롬 브라우저 정책에 맞는 인증서를 설치. 1024bit이상 사용해야함
      • (임시방법) 브라우저별로 정책이 다르므로 MSIE (MicroSoft Internet Explorer), Safari 브라우져 사용
    • [참고] Diffie Hellman 키 교환 방식 이란?
      • 공개키 교환 방식 
        • 공개키 암호의 문제
          • 공개키에 대한 검증(Verification) 
            • 전달받은 공개키에 대한 판단 필요
            • 공개키에 대한 인증 문제
            • MITM 공격 유효함
          • 성능이슈
            • 대칭암호와 비교하여 처리 속도가 몇 백배 이상 차이남 
      • 송수신자(Alice, Bob)가 특정 정보를 교환하여, 서로 동일한 키를 생성할 수 있음
      • 도청자(Eve)는 동일한 키를 생성할 수 없음
      • 인증을 제공하지 못함으로 적극적인 공격자(Mallory)는 Man-in-the-middle 키