logback 로그 레벨별로 로그파일 분리하기

levelFilter를 활용.
[code xml]<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>${LOGS_FOLDER}/info.log</File>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
  </filter>
  <encoder>
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  </encoder>
</appender>
<appender name="debugFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>${LOGS_FOLDER}/debug.log</File>
  <encoder>
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  </encoder>
</appender>
<root level="INFO">
  <appender-ref ref="infoFile" />
</root> <root level="DEBUG">
  <appender-ref ref="debugFile" />
</root>[/code]
2015/02/18 10:13 2015/02/18 10:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

ConcurrentHashMap , Collections.synchronizedMap(Map) 어떤걸 써야 하는거?

멀티쓰레드 환경하에서 적절히 사용할 수 있는 Map계열 자료형으로 ConcurrentHashMap , Collections.synchronizedMap(Map) 이 있는데 어떤걸 사용하는게 더 효과적인지 확인해 봤다.

https://ria101.wordpress.com/2011/12/12/concurrenthashmap-avoid-a-common-misuse/ 과 http://stackoverflow.com/questions/1291836/concurrenthashmap-vs-synchronized-hashmap 의 글을 통해 Collections.synchronizedMap(Map) 과 ConcurrentHashMap은 lock 메카니즘이 다름을 알 수 있었다.

다음은 대표적인 map 계열 클래스의 차이점을 표로 정리.
속성 HahsMap Hashtable ConcurrentHashMap
Null value/key 허용 허용 비허용
thread safe 아님 안전
lock 메카니즘 없음 전체 lock portion of map
iterator fail-fast fail-safe
2015/02/04 17:41 2015/02/04 17:41
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Java 자동화, 매크로 도구들

Java Robot : JDK에 기본으로 포함되어있는 API.

Tasklist - http://technet.microsoft.com/en-us/library/bb491010.aspx
프로세스 정보를 출력하는 콘솔 명령어

NirCmd - http://www.nirsoft.net/utils/nircmd.html
콘솔명령도구

Open CV for JAVA - http://opencv.org/
Imgproc.matchTemplate(img1, img2, img3, Imgproc.TM_CCOEFF_NORMED); 와 같은 방식으로 이미지 비교 및 위치 검색 수행.
특정버튼을 미리 캡쳐해 놨다가 자동으로 클릭하는 기능같은 기능 개발시 유용.

JNativeHook - https://github.com/kwhat/jnativehook
자바 글로벌 후커

2015/01/16 11:14 2015/01/16 11:14
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

모질라, 크롬의 NPAPI 지원 중단(사용불가) 계획 진행 상태.

모질라, 크롬에서 NPAPI 지원 중단(사용불가) 얘기는 갑자기 나온건 아니고 일년전부터 꾸준히 준비해오던 것이고 그 계획에 따라 내년 9월이면 크롬브라우저에서는 NPAPI가 완전 퇴출(동작하지 않음)된다. 현재는 많이 쓰이는 몇몇 NPAPI 사용 플러그인에 대해 화이트리스트 형식으로 허용하고 있는 상황이고 새로 추가되지는 못함.

그전에 잠깐, NPAPI가 뭐냐면 Nescape Plugin Application Programming Interface의 약자로 브라우저 등장 초창기에 브라우저의 기능을 확장할 수 있는 표준 메커니즘을 제공하기위해 소개되어 오디오/비디오 재생 등의 현대적인 웹 플랫폼 기능들이 이 NPAPI를 활용해서 제공되었다.

웹과 브라우저 자체가 향상되면서 이 NPAPI는 이제는 너무 낡은 방식인데다 꼬리표 처럼 달고 다니는 보안 문제를 해결하기 위해 이 NPAPI 퇴출 프로그램이 진행되고 있는것이다.
NPAPI가 제거되면 실버라이트, Java(애플릿 / 웹스타트), 오픈뱅킹, 유니티(멀티플랫폼게임엔진) 등을 사용할 수 없게된다.
특이하게 크롬에서 내장 플래시, PDF뷰어는 NPAPI를 사용지 않기(PPAPI를 사용)때문에 영향은 없다고 하네요.(다른 브라우저는 사정이 다를 수도 있지만..)

구글 측에서 제시하는 대안 기술로는 NaCL , APPS , Native Messaging API, 구형브라우저지원이 있다.
2014/11/28 14:18 2014/11/28 14:18
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

일반 메소드를 AOP를 통하여 멀티 쓰레드로 동작시키기

2014/10/23 09:13

서비 Tip&Tech

reference : http://springinpractice.com/2008/11/15/aop-101-speeding-up-springs-javamailsenderimpl-with-aop


Advice 작성
[code java] package app.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;

public class ForkAdvice {
private static final Logger log = Logger.getLogger(ForkAdvice.class);

public void fork(final ProceedingJoinPoint pjp) {
new Thread(new Runnable() {
public void run() {
log.info("Forking method execution: " + pjp);
try {
pjp.proceed();
} catch (Throwable t) {
// All we can do is log the error.
log.error(t);
}
}
}).start();
}
} [/code]

applicationContext 를 통해 bean 설정. ( 혹은 annotation 기반으로 위 adice 에 pointcut 지정 )
[code xml]<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd>
         <jee:jndi-lookup id="mailSession" jndi-name="mail/Session" resource-ref="true"/>
         <bean id="mailSender"
        class="org.springframework.mail.javamail.JavaMailSenderImpl"
        p:session-ref="mailSession"/>
         <bean id="mailingListService"
        class="app.service.MailingListServiceImpl"
        p:mailSender-ref="mailSender"/>
             <bean id="forkAdvice" class="app.aop.ForkAdvice"/>
         <aop:config>
        <aop:aspect ref="forkAdvice">
            <aop:around method="fork" pointcut="execution(* org.springframework.mail.javamail.JavaMailSenderImpl.send(..))"/>
        </aop:aspect>
    </aop:config>
         ...
     </beans> [/code]
2014/10/23 09:13 2014/10/23 09:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

뭐..? 러시아가 시간대를 바꾼다고?

윈도우 업데이트는 대게 어떤 항목이 업데이트 되는지 자세히 확인하지 않고 업데이트를 진행하는게 평소 패턴이었는데 오늘은 어째서인지 (정말 아무런 이유도 없이..) 업데이트 상세정보를 확인해 봤다.
사용자 삽입 이미지
그래서 열린 페이지가...
http://support.microsoft.com/kb/2970228 야 랑
http://support.microsoft.com/kb/2998527 야 인데...

사용자 삽입 이미지

응!? 뭐? 러시아 시간대가 바뀐다고라고? 
러시아 관련된 일을 하지 않으니까 별 상관이 없을수도 있지만... 지구상에 러시아와 관련있거나 글로벌 시스템으로 구성된 수많은 컴퓨팅 자원들의 시간 계산이 적절하게 대응해야 한다는 걸 생각하면 쉬운일이 아닌뎅?

그래서 "러시아 시간대 변경" 으로 관련 기사를 뒤져봤더니...
헐.. 2009년부터 논의되고 있었넹.. http://www.ohmynews.com/nws_web/view/at_pg.aspx?CNTN_CD=A0001276772
그리고 러시아 시간대 변경 역사에 대한 간략한 기사도 찾을 수 있었다. http://russiafocus.co.kr/society/2014/04/15/44319.html

그래 대강의 상황은 파악했음.
윈도우즈는 업데이트로 대응했고... 그럼 유닉스, 리눅스 계열이나 내 밥벌이 언어인 Java쪽 대응은 어떻게 되는지 궁금해 질 수 밖에...
Java는 오라클에서 Timezone Update Tool이 배포되고 있고... http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html
Novell NetWare 계열의 대응도 확인 했다. https://www.novell.com/communities/coolsolutions/how-implement-lastest-time-zone-changes-russia-netware/
Linux 계열은 timezone 데이타 파일을 업데이트 방법을 제시하고 있다. http://unix.stackexchange.com/questions/25139/russian-timezone-is-not-up-to-date


러시아가 지금까지 11개의 서로 다른 시간대를 가지고 있었다는것도 놀라웠고 그걸 4개의 표준시로 통합해버린 패기도 놀랍다.
오후 2시에 밤을 맞이하는 시간대 사람들에게 묵념...
2014/09/24 18:59 2014/09/24 18:59
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Netbeans Dark Metal Theme

넷빈즈 룩앤필을 다크 테마로 변경했습니다. 테마명은 Dark Metal Theme 입니다.
2013년 2월경에 릴리즈가 되었는데 지금껏 그 존재를 모르고 있었네요..
기존에 있었던 어두운 계열의 룩앤필은 어딘가 한두개씩 이상했거든요..
Java에서 자랑하는 Nimbus 룩엔필도 올록볼록한게 제눈에는 영 마음에 안들구요...
다크 메탈의 경우엔 사용하는데 무리가 없는 수준으로 룩앤필이 완성되서 한동안은 이 테마를 사용할듯 합니다.

딱 한 가지만 부족한 부분을 꼽자면 에디터 영역이 아닌 기본 메뉴나 프로젝트 영역의 폰크가 백색인건데.. 메뉴 쪽 폰트만 조금 톤다운하면 좀 더 미려할텐데.. 이 부분은 룩앤필 소스를 수정해야하는것 같은데 이 룩앤필 소스 레파지토리 정보를 찾을 수가 없네요.

테마적용 후 메뉴의 font 크기가 작아졌다면 [netbena설치디렉토리]/etc/netbenas.conf 파일에서 --fontsize 12 옵션 설정.
[code xml]netbeans_default_options="-J-client -J-Xss16m -J-Xms64m -J-XX:PermSize=64m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true --fontsize 12 --locale UTF-8 -J-Dfile.encoding=UTF-8"[/code]

사용자 삽입 이미지

2014/09/24 16:31 2014/09/24 16:31
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

반박할 수가 없다...

가다듬어지지 않은 문장일 뿐.. 반박을 할 수가 없네...

막말로 이야기해서 지금 대한민국 20대 30대는 필요없는세대에요


윗대가리 그리고 대한민국의 조금이라도 권력을 지닌 자들에게는 우리 20대 30대는 필요없는 정도가 아니라 눈에 가시같은 존재죠

왜 시급올려달라 인터넷이고 뭔일있으면 모이잖아요

근대 그들눈에는 우리가 사람이 아니에요 그저 스타크래프트에 나오는 scv가 필요한고 우리도 그걸로 보이는거에요

내가 그냥 말하는게 아니에요

저번에 국회의원들끼리 인사하는데 보니까 요새 애 안낳는다면서요 ㅋㅋㅋㅋ 거리는게 방송에서 대놓고 애기하더라고요 자기들끼리 인사말로

ㅋㄷㅋㄷㅋㄷ

근대 그게 맞아요 왜 대체 인력넘치니까 산업연수생 확대해서 외국인들 데려다 쓰면되는거고 국방도 안되면 30만정도로 겨우 유지하고 주한미군 계속주둔해서 미국이 지켜주면되고

왜 인구가 늘어야되죠 왜 세금을 내야되죠 그들 입장에서 전혀 신경쓸일도 아니라는거에요 20대30대가 애낳아서 기르면 그냥 scv가 자연증가하는거고 군대 모자르면 외국인들한테 영주권 주는댓가로 군대 모집하면 되는거고

왜 한국인 그것도 서민들 20대 30대를 챙길 이유가 없다는거에요 애시당초 가만히 있으니까 불을 질러요 사회에서 불만폭발해서 터져요

결혼못하는 남자들 중 상당수는 일베가 되어서 오히려 자기들 전위대가 되어서 앞장서서 싸워주는 판인데 뭐하러 자기들이 세금 더 들여서 20대30대 지원해야되는거에요

시위 하면 평화시위다하면서 가만히 행진만하는데 누가 겁내요 웃기는 소리하고 있죠

세월호 참사 김부선 아줌마 아파트에서 벌어지는일 우리네 전체 이야기인데 보면 가만히 있어요 가만히 

애 못낳겠다고 비명질러봐야 50대 60대들이 우리보고하는소리가 빨갱이라고 하잖아요 지들이 당장 피해보는데도 나라님이 하는 일이라고 ㅋㄷㅋㄷ

결혼해서 오손도손 가정꾸리고 사는게 그렇게 큰 소원인가요 무려 2000년전 로마에서도 가능했고 인류의 역사에서도 어떤 상황에서도 사람들은 아이를 낳아 길러어요 근대 지금은 우리손으로 스스로 멸절하는 정도까지 가고있는데도 위에분들이나 지원이 엉망진창인 이유는 

우리 특히 20대30대는 사람으로 안보이는 정도가 아니라 노비도 아니고 노예도 아니에요 그저 소모품 물건 공장에서 쓰는 부품이에요 대체할게 외국에서 얼마든지 있으니까 노비나 노얘도 주인이 챙겨요 왜 부서지면 자기손해니까 근대 우리나라는 그걸 다 법으로 바꿔잖아요 부품은 쓰다 버리게 다 만들고 필요하면 수입해서 대체할수있게 이런 상황인데도 가만히 ~~~ 다들 가만히~~~ 그냥 멸절해가는거에요

불체자들 이런소리하죠 하루 12시간 주야2교대 80만원 준다 와 많이준다 ~~` 딱 이걸 원하는거에요 지금 그나마 여태까지 싸워왔으니까 아직까지 최저시급이라도 공장에서 일하면 나오는거죠 그것도 언제 무너질지 몰라요

이미 법으로 다 박살낸지가 오래니까요 ㅋㄷㅋㄷㅋㄷ

여튼 우리를 대체할 인력은 외국에 넘쳐요 한해 20만의 산업연수생이 들어오고요 그리고 국내에서도 강력사건 넘치는데 이제는 불체자까지 가세해서 같이 사고치고있어도 결국 그피해는 서민인 우리만 본다고요 갸들은 피해안보니까 전혀 신경안쓰요 돈만벌면되는거고 자기들 앞에 돈이 쌓이기만 하면되는거고 우리는 부품이고 갈아치우면되고 민족 애국 이런거 갸들은 빈말이고 진짜는 돈과 권력뿐이라고요

서민은 점점 애를 안낳아서 사라지고 그자리를 외국인이나 혼혈아이들이 대체하고 결국은 인종적으로 계급을 나눌 작정인거죠 프랑스 유럽에서는 실패한 이유가 뭐냐하면 복지지원하니까 자국민들이 너무 많아서 문제였고 우리나라는 자국민을 소멸시키고 자기들 10%에서 15% 후손만 남기면 되는거에요 아예 인종적으로 귀족계급으로 만들작정인거에요 앞으로 그게 가속화 될거에요

이게 거짓말같죠 님들 대다수는 애낳거나 결혼하고싶어도 못하잖아요 시골가서 분교 한번가보세요 거기가면 한국애들은 반도 없고 대부분이 다문화 혼혈애들이 대부분이에요 가난한 계층은 이미 형성되고있어요 게다가 다문화 지원은 차상위계층이나 그 아래 계층보다 배 이상으로 지원해주고 있어요

혼혈아이들을 대량으로 육성할 작정인거에요 가난한 아이들 많이낳아서 인종적으로 아래계층으로 고착시키려는거죠 그리고는 한국인 젊은 도시인에게 독신을 권장하는거죠 모든 미디어가 여론까지 총동원해서 바꾸어갈것에요 우리는 애를 낳을 필요가 없다고 세뇌시키고 그나마 있는 지원도 끊어버리겠죠

이미 망가져다는게 초혼 남자 35세 여자 33세에요 이게 정상이에요 한마디로 말해서 결혼하지말라는 소리에요 점점 지원이 줄어들거에요

여튼 님들이나 전부 가만히 있는동안 우리는 멸절될 운명앞에 탁 도착해있어요 10년 지나면 진짜 끝이에요

누구도 아무도 정부도 인구증가에 대해서 진지하게 고민안하고있어요 외국에서 수입하면 되니까

제일 놀라운게 인구수가 급감하면 당연히 인적자원이 고갈될거고 이거에 대해 준비해야될 첫번쨰가 바로 국방부인데 국방부 아무런 대책없어요 그리고 지금 시행되고있는게 뭔지 아세요 외국인들 데려다 한국군사훈련 시키고있어요 그거 시작했어요 한마디로 우리는 끝났어요

열심히 가만히있으세요 저항안하는 순간 우리가 평화시위를 외치는 그 순간부터 끝났어요 유럽 귀족들이 왜 저렇게 복지정책 쓰는지 아세요 오블리스 노블리제 왜하는지 아세요 흑사병으로 농노 다죽으니까 사람귀하니까 그때부터 대접이 달라지고 그리고 프랑스 혁명으로 왕모가지 따이는거보면서 귀족들 막 죽어나가고 나폴레옹 전쟁거치면서 전유럽에 프랑스혁명사상 퍼지고 나서 피바다 되고나서 무서워서 저러는거에요

우리는 그런거 없잖아요 그러니 겁낼필요없는 부품들이에요

더 쉽게 말해서 사랑하는 사람이랑 애낳고 오손도손 살고싶어요 살게 해주세요 이소리가 빨갱이라는게 대한민국이에요 ㅋㄷㅋㄷ

출처 : http://m.todayhumor.co.kr/view.php?table=bestofbest&no=179131
2014/09/23 08:32 2014/09/23 08:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon

    정말 그렇네요...

X-Frame-Options 와 ClickJacking

ClickJacking 과 같은 공격을 무력화 하기위해 X-Frame-Options 같은 확장 해더를 이용할 수 있다.
X-Frame-Options 을 통해 브라우저가 <frame>, <iframe> 혹은 <object> 태그를 렌더링 해야하는지 막아야하는지를 알려준다.
X-Frame-Options 은 다음 세가지 값 중 하나를 사용할 수 있다.

 DENY  해당 페이지는 frame 내에서 표시할 수 없다. 
 SAMEORIGIN  해당 페이지와 동일한 orgin에 해당하는 frame 내에서 표시를 허용한다.
 ALLOW-FROM uri  해당 페이지는 지정된 orgin에 해당하는 frame 내에서 표시할 수 있다.

각 웹서버 별 X-Frame-Options 해더를 response에 추가하기 위한 방법은 다음과 같다.
Header always append X-Frame-Options SAMEORIGIN

add_header X-Frame-Options SAMEORIGIN;

<system.webServer>
  ...
  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>
  ...
</system.webServer>

X-Frame-Options 는 그 명칭에서도 알 수 있듯이 확장 해더이기때문에 모든 브라우저가 해당 옵션에 대해 동작하는것은 아니다.
크롬 4.1 , IE 8 , 오페라 10.5 , 사파리 4.0 , 파이어폭스 3.6.9 이상에서는 DENY , SAMEORIGIN 이 적용되며, ALLOW-FROM 은 각 브라우저 마다 지원 현황이 다르다.
2014/09/18 11:21 2014/09/18 11:21
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

개발자 면접 시 회사에 꼭 확인 할 5가지 질문.

원문 http://www.itworld.co.kr/slideshow/89446
그렉 디아만트는 벤틀리 대학(Bentley University)에서 CIS 학사 학위를 받고 5월에 졸업하기에 앞서서 30곳의 회사에 면접을 봤다. 디아만트는 각각의 회사들의 차이점을 파악하기 위해 핵심 질문들의 목록을 작성했는데, 이를 통해 어느 직위가 자신에게 가장 잘 맞는지를 알아낼 수 있었다....
"평소 일과는 어떻게 되나요?"
본인의 개인적인 작업 선호사항이 그 직위와 잘 부합하는지 확인할 수 있다.
"제가 맡을 프로젝트는 무엇이며, 또 누구와 함께 일하게 되나요?"
하고자 하는 일이 미래 계획과 부합하는지 확인해 보라.
"어떤 특정 기술을 사용하나요? 제가 사용해야 할 것은 무엇인가요?"
만일 이 질문에 정확히 대답하지 않는다면 본 기술의 미래가 그렇게 밝지 않다는 것을 증명하는 것일 수도 있다.
"이 직위의 궁극적인 미션은?"
본 기업이 IT 부서를 어떻게 생각하는지 그리고 자신이 지원한 그 특정 직위에 대해 어떻게 생각하는지를 이해할 수 있을 것이다.
"회사 내에서 IT부서의 입지는?"
IT부서에 대한 회사의 태도는 자신이 어떤 유형의 조직에서 일하게 될지를 알 수 있다.
2014/09/17 12:48 2014/09/17 12:48
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

신의 자비

신의 자비는 한계가 없으며 신앙이 없으면 양심에 따라 행동하면 된다.
- 교황 프란치스코 ( Pope Francis )

"신을 믿지않거나 믿음을 추구하지 않는 사람들을 신이 용서하겠는가"
라는 무신론자 유제니오 스칼파리의 질문에
2014/08/04 13:02 2014/08/04 13:02
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

REST API 디자인 규칙

한빛 미디어의 e-book "일관성 있는 웹 서비스 인터페이스 설계를 위한 REST API 디자인 규칙" 의 목차에서 추려낸 REST API 디자인 규칙.
지켜오던것도 있고 원칙은 알고있었지만 이런저런 이유로 현실에는 적용하기 어려운 부분도 있지만 이런 원칙을 상기하면서 개발하면 좀 더 일관성있는 API를 구성할 수 있을듯 하다.

목차만으로도 많은 의미가 전달되기에 여기 발췌해둔다.

02장. URI 식별자 설계
  02 URI 형태
    규칙: 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용한다.
    규칙: URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
    규칙: 하이픈(-)은 URI 가독성을 높이는 데 사용한다.
    규칙: 밑줄( _ )은 URI에 사용하지 않는다.
    규칙: URI 경로에는 소문자가 적합하다.
    규칙: 파일 확장자는 URI에 포함시키지 않는다.
  03 URI 권한 설계
    규칙: API에 있어서 서브 도메인은 일관성 있게 사용해야 한다.
    규칙: 클라이언트 개발자 포탈 서브 도메인 이름은 일관성 있게 만들어야 한다.
  04 리소스 모델링
  05 리소스 원형
    도큐먼트.
    컬렉션.
    스토어.
    컨트롤러.
  06 URI 경로 디자인
    규칙: 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
    규칙: 컬렉션 이름으로는 복수 명사를 사용해야 한다.
    규칙: 스토어 이름으로는 복수 명사를 사용해야 한다.
    규칙: 컨트롤러 이름으로는 동사나 동사구를 사용해야 한다.
    규칙: 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.
    규칙: CRUD 기능을 나타내는 것은 URI에 사용하지 않는다.
  07 URI Query 디자인
    규칙: URI 쿼리 부분으로 컬렉션이나 스토어를 필터링할 수 있다.
    규칙: URI 쿼리는 컬렉션이나 스토어의 결과를 페이지로 구분하여 나타내는 데 사용해야 한다.


3장. HTTP를 이용한 인터랙션 설계
  02 요청 메서드
    규칙: GET 메서드나 POST 메서드를 사용하여 다른 요청 메서드를 처리해서는 안 된다.
    규칙: GET 메서드는 리소스의 상태 표현을 얻는 데 사용해야 한다.
    규칙: 응답 헤더를 가져올 때는 반드시 HEAD 메서드를 사용해야 한다.
    규칙: PUT 메서드는 리소스를 삽입하거나 저장된 리소스를 갱신하는 데 사용해야 한다.
    규칙: PUT 메서드는 변경 가능한 리소스를 갱신하는 데 사용해야 한다.
    규칙: POST 메서드는 컬렉션에 새로운 리소스를 만드는 데 사용해야 한다.
    규칙: POST 메서드는 컨트롤러를 실행하는 데 사용해야 한다.
    규칙: DELETE 메서드는 그 부모에서 리소스를 삭제하는 데 사용해야 한다.
    규칙: OPTIONS 메서드는 리소스의 사용 가능한 인터랙션을 기술한 메타데이터를 가져오는 데 사용해야 한다.
  03 응답 상태 코드
    규칙: 200("OK")는 일반적인 요청 성공을 나타내는 데 사용해야 한다.
    규칙: 200("OK")는 응답 바디에 에러를 전송하는 데 사용해서는 안 된다.
    규칙: 201("Created")는 성공적으로 리소스를 생성했을 때 사용해야 한다.
    규칙: 202("Accepted")는 비동기 처리가 성공적으로 시작되었음을 알릴 때 사용해야 한다.
    규칙: 204("No Content")는 응답 바디에 의도적으로 아무것도 포함하지 않을 때 사용한다.
    규칙: 301("Moved Permanently")는 리소스를 이동시켰을 때 사용한다.
    규칙: 302("Found")는 사용하지 않는다.
    규칙: 303("See Other")은 다른 URI를 참조하라고 알려줄 때 사용한다.
    규칙: 304("Not Modified")는 대역폭을 절약할 때 사용한다.
    규칙: 307("Temporary Redirect")은 클라이언트가 다른 URI로 요청을 다시 보내게 할 때 사용해야 한다.
    규칙: 400("Bad Request")은 일반적인 요청 실패에 사용해야 한다.
    규칙: 401("Unauthorized")은 클라이언트 인증에 문제가 있을 때 사용해야 한다.
    규칙: 403("Forbidden")은 인증 상태에 상관없이 액세스를 금지할 때 사용해야 한다.
    규칙: 404("Not Found")는 요청 URI에 해당하는 리소스가 없을 때 사용해야 한다.
    규칙: 405("Method Not Allowed")는 HTTP 메서드가 지원되지 않을 때 사용해야 한다.
    규칙: 406("Not Acceptable")은 요청된 리소스 미디어 타입을 제공하지 못할 때 사용해야 한다.
    규칙: 409("Conflict")는 리소스 상태에 위반되는 행위를 했을 때 사용해야 한다.
    규칙: 412("Precondition Failed")는 조건부 연산을 지원할 때 사용한다.
    규칙: 415("Unsupported Media Type")은 요청의 페이로드에 있는 미디어 타입이 처리되지 못했을 때 사용해야 한다.
    규칙: 500("Internal Server Error")는 API가 잘못 작동할 때 사용해야 한다.


4장. 메타데이터 디자인
  01 HTTP 헤더
    규칙: Content-Type을 사용해야 한다.
    규칙: Content-Length를 사용해야 한다.
    규칙: Last-Modified는 응답에 사용해야 한다.
    규칙: ETag는 응답에 사용해야 한다.
    규칙: 스토어는 조건부 PUT 요청을 지원해야 한다.
    규칙: Location은 새로 생성된 리소스의 URI를 나타내는 데 사용해야 한다.
    규칙: Cache-Control, Expires, Date 응답 헤더는 캐시 사용을 권장하는 데 사용해야 한다.
    규칙: Cache-Control, Expires, Pragma 응답 헤더는 캐시 사용을 중지하는 데 사용해야 한다.
    규칙: 캐시 기능은 사용해야 한다.
    규칙: 만기 캐싱 헤더는 200("OK") 응답에 사용해야 한다.
    규칙: 만기 캐싱 헤더는 '3xx' 와 '4xx' 응답에 선택적으로 사용될 수 있다.
    규칙: 커스텀 HTTP 헤더는 HTTP 메서드의 행동을 바꾸는 데 사용해서는 안 된다.
  02 미디어 타입
    미디어 타입 문법
    등록된 미디어 타입
    벤더 고유 미디어 타입
  03 미디어 타입 설계
    규칙: 애플리케이션 고유 미디어 타입을 사용해야 한다.
    규칙: 리소스의 표현이 여러 가지 가능할 경우 미디어 타입 협상을 지원해야 한다.
    규칙: query 변수를 사용한 미디어 타입 선택을 지원할 수 있다.


5장. 표현 디자인
  01 메시지 바디 포맷
    규칙: JSON 리소스 표현을 지원해야 한다.
    규칙: JSON은 문법에 잘 맞아야 한다.
    규칙: XML과 다른 표현 형식은 선택적으로 지원할 수 있다.
    규칙: 추가 봉투는 없어야 한다.
  02 하이퍼미디어 표현
    규칙: 링크는 일관된 형태로 나타내야 한다.
    규칙: 링크 관계를 표현할 때에는 일관된 형태를 사용해야 한다.
    규칙: 링크를 표현할 때는 일관된 형태를 사용해야 한다.
    규칙: 응답 메시지 바디 표현에 셀프 링크를 포함해야 한다.
    규칙: 진입 API URI 수를 최소화하라.
    규칙: 리소스의 상태에 따라 가능한 액션을 표현하기 위해서 링크를 사용해야 한다.
  03 미디어 타입 표현
    규칙: 미디어 타입 format은 일관성 있는 폼을 사용해야 한다.
    규칙: 미디어 타입 스키마를 표현할 때는 일관성 있는 형식을 사용해야 한다.
  04 오류 표현
    규칙: 오류는 일관성 있게 표현한다.
    규칙: 오류 응답은 일관성 있게 표현한다.
    규칙: 일반적인 오류 상황에서는 일관성 있는 오류 타입을 사용해야 한다.


6장. 클라이언트 영역
  02 버전을 정의하는 방법
    규칙: 새로운 개념을 도입하려면 새로운 URI를 사용해야 한다.
    규칙: 표현 형태의 버전을 관리하기 위해서는 스키마를 사용해야 한다.
    규칙: 엔티티 태그는 표현 상태 버전을 관리하기 위해 사용한다.
  03 보안
    규칙: 리소스 보호를 위해 OAuth를 사용할 수 있다.
    규칙: 리소스 보호를 위해 API 관리 솔루션을 사용할 수 있다.
  04 응답 표현 조합
    규칙: URI의 쿼리 부분은 부분 응답을 지원할 때 사용해야 한다.
    규칙: URI 쿼리 부분은 연결된 리소스를 포함할 때 사용해야 한다.
  05 하이퍼미디어 처리
  06 자바스크립트 클라이언트
    규칙: 자바스크립트에서 여러 웹 사이트에 읽기 접근이 가능하도록 JSONP를 지원해야 한다.
    규칙: 자바스크립트에서 여러 웹 사이트에 읽기/쓰기 접근이 가능하도록 CORS를 지원해야 한다.

2014/07/31 10:10 2014/07/31 10:10
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

회사 옥상에서 맛난 치맥 파티~

회사에서 마련한 치맥 파티, 연구동 옥상에서.
맛있게 잘 먹었습니다.~
사용자 삽입 이미지

사용자 삽입 이미지
2014/07/17 23:17 2014/07/17 23:17
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

프론트엔드 개발자는 왜 구하기 어려운가

[번역] 프론트엔드 개발자는 왜 구하기 어려운가
http://mygony.com/archives/4810
2014/07/16 14:15 2014/07/16 14:15
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

StampedLock example from java api

http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/StampedLock.html

[code java] class Point {
   private double x, y;
   private final StampedLock sl = new StampedLock();
   void move(double deltaX, double deltaY) { // an exclusively locked method
     long stamp = sl.writeLock();
     try {
       x += deltaX;
       y += deltaY;
     } finally {
       sl.unlockWrite(stamp);
     }
   }

   double distanceFromOrigin() { // A read-only method
     long stamp = sl.tryOptimisticRead();
     double currentX = x, currentY = y;
     if (!sl.validate(stamp)) {
        stamp = sl.readLock();
        try {
          currentX = x;
          currentY = y;
        } finally {
           sl.unlockRead(stamp);
        }
     }
     return Math.sqrt(currentX * currentX + currentY * currentY);
   }

   void moveIfAtOrigin(double newX, double newY) { // upgrade
     // Could instead start with optimistic, not read mode
     long stamp = sl.readLock();
     try {
       while (x == 0.0 && y == 0.0) {
         long ws = sl.tryConvertToWriteLock(stamp);
         if (ws != 0L) {
           stamp = ws;
           x = newX;
           y = newY;
           break;
         }
         else {
           sl.unlockRead(stamp);
           stamp = sl.writeLock();
         }
       }
     } finally {
       sl.unlock(stamp);
     }
   }
 }[/code]
2014/07/03 22:51 2014/07/03 22:51
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다