- 문제상황: Cross Domain
- Cross Domain문제란?
- ajax호출을 통해 다른 도메인에 있는 자원에 접근할 때
다른 도메인에 존재하는 데이터를 가져오는 경우, 자바스크립트가 있는 서버가 아닌 다른 서버와 통신하면 보안이슈에 의해서 통신할 수 없음. ( mash up application개발시에 주로 발생) - 해결방법
- Server Proxy
- 웹 브라우저에서 보여지고 있는 문서와 동일한 origin에 proxy를 두고, 다른 origin의 데이터를 가져옴.
- Cross Document Messaging
- 페이지간 커뮤니케이션 지원하는 API
- 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만 가능
- 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월 25일 수요일
Cross Domain 문제 해결법 (jsonp, cors )
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>
|
</property> </bean> |
|
reference: 최범균 - 웹개발자를 위한 Spring3.0 프로그래밍
[spring] 뷰에 전달되는 모델 데이터
- 커맨드 객체
- 종류: @ModelAttribute로 설정된 파라미터
- @ModelAttribute어노테이션이 적용된 메서드가 리턴한 객체
- 메서드의 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> |
[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 (한글날라감)
- 해결방법
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가 장려되는 이유
- 퍼포먼스가 좋다
Logger4J등 요새 나온 로거들은 비동기식 로그 지원(Asynchronous logging)은 I/O 연산 지원시 별도의 thread로 동작하므로 성능ㅑㅇ상이 됨 - 여러가지 모드 설정가능
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
[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)도 함께 가로챈다는 것을 의미
요청(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 셔츠를 입고, 이 길을 걸어간 수 많은 개발자들이 흘린 땀과 지혜의 총화를 만나게 될 것입니다. |
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.
여느때와 같이 Web Page개발을 위하여 로컬로 서버를 기동하고 크롬을 키니
아래와 같은 메세지가 발생.
서버에 쉽게 삭제되는 Diffie-Hellman 공개 키가 있습니다. ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY
- [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 키
라벨:
디피헬맨,
크롬브라우저,
ChromeBrowser,
DH
피드 구독하기:
글 (Atom)