NullPointerException을 예방하는 방법

Posted by
2018. 2. 22. 11:00 Java

NullPointerException은 null 때문에 발생하는 Runtime Exception입니다.

null인 객체에 접근하여 의도치 않게 NPE가 발생할 수 있지만 더 중요한 문제는 null 자체의 의미가 모호해 다양한 버그를 만들어냅니다. 예를 들어 메소드의 호출 결과로 null이 반환 되었을 경우 데이터가 없음을 의미할 수도 있지만 실패를 의미할 수도 있습니다. 심지어 성공을 의미하는 경우도 있을 수 있죠.

1
2
3
4
Map<String, String> map = new HashMap<String, String>();
map.put("hello", null);
map.get("hello");   // "hello" key의 value인 null을 return
map.get("nice");    // "nice" key가 없으므로 null을 return

위의 경우도 key에 대한 value가 null인지, key가 없어서 null을 return 한건지 return 받은 null 값을 가지고는 그 의미가 모호합니다. 누가 null을 만들었는지 참 얄밉지만 어쨋든 null 체크를 제대로 안했던지, 설계상의 결함이던지 null로 인한 버그는 결국 개발자 책임입니다.

똥이 무서워서 피하기보단 더러워서 피한다고… NPE를 예방하는 방법에 대해 정리해봤습니다.
들어가기에 앞서 null에 대한 프로그래머 대가들의 한마디…

“Null Sucks!”
– Doug Lea : Concurrent Programming In Java 저자 & JDK의 concurrency utilities 개발자

“I call it my billion-dollar mistake.”
– C.A.R. Hoare 2009년 어느 컨퍼런스에서.
1965년 Algol W 언어에서 처음으로 null reference를 만든 장본인 (Quick Sort도 발명)

코딩 습관 들이기

객체가 언제든 null일 수 있다는 판단하에 접근하면 도움이 될 것 같습니다.

1. equals 메소드 사용시
문자열 비교시 non-null String 기준으로 비교합니다. equals 메소드는 symmetric하므로 a.equals(b)와 b.equals(a)가 동일합니다. 그렇다면 null 일 수 있는 객체에서 equals 메소드 호출은 피하는게 낫겠죠?

1
2
3
4
5
6
public void doSomething() {
   // name이 null일 경우, NPE 발생!
   if (name.equals("BAD")) {
      // do something
   }
}
1
2
3
4
5
6
public void doSomething() {
   // name이 null이어도 NPE 발생 안함
   if ("BAD".equals(name)) {
      // do something
   }
}

다만 equals를 통과한 null 객체가 if문 안에서 메소드 호출 등의 이유로 다시 사용된다면 동일한 NPE가 발생할 수 있습니다. 이럴 경우엔 미리 null 체크를 하는게 좋겠죠?

2. toString()보다는 valueOf()를 사용할 것
1번 처럼 null 일 수 있는 객체에서 메소드 호출은 NPE 발생 위험이 있겠죠? static으로 제공되는 valueOf()를 사용하면 null을 Parameter로 넘겨도 null을 return할 뿐 NPE는 발생하지 않습니다. (valueOf()는 String, Boxed Primitives 클래스(Integer, Double 등)에서 static 메소드로 제공 됨)

1
2
3
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); // NPE 발생안함
System.out.println(bd.toString()); // NPE 발생

3. 메소드에서 null return하지 않기
가장 간단한 방법은 메소드 구현시 의미없는 null을 return하지 않도록 처리합니다. null이 아닌 빈 문자열 또는 빈 콜렉션을 return 하도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
public List<User> getUsers() {
   // ...
 
   Result result = executeNamedQuery(GET_ALL_USERS);
 
   if (!result.isEmpty()) {
      return result;
   }
 
   return Collections.EMPTY_LIST; // or EMPTY_SET or EMPTY_MAP, etc. Depending on your return type
}

4. null을 Parameter로 넘기지 말 것
null을 Parameter로 넘길 경우 받는 쪽에서도 어찌보면 불필요한 null 체크가 필요하겠죠? null 자체에 어떤 특별한 의미가 없다면 주지도 받지도 맙시다.

5. 불필요한 autoboxing, unautoboxing 피하기 & Object 보다는 기본형 사용하기
Boxed Primitives 클래스와 기본형(primitive) 타입간에 자동으로 autoboxing, unboxing을 해주는데요. 자동으로 기본형 변환을 해주기 때문에 헷갈리기 싶습니다. (그냥 기본값이 들어가겠거니…) 가능하면 null reference를 가질 수 있는 객체가 아닌 자바 기본형(Primitive)을 이용하는 것도 방법입니다.

1
2
3
Person ram = new Person("ram");
// getPhone()에서 return된 결과가 null일 경우 NPE 발생
int phone = ram.getPhone();
1
2
3
4
5
6
private static Integer count;
 
// NPE 발생
if( count <= 0) {
  System.out.println("Count is not started yet");
}

6. Chaining 메소드 호출 자제하기

1
String city = getPerson(id).getAddress().getCity();

중간에 return 받은 값이 null일 경우 NPE가 발생하며 Stack Trace에서도 해당 line 위치만 출력되기 때문에 어디서 에러가 발생했는지 디버깅하기도 어렵습니다.

Library 이용하기

Apache Commons lang, Google Guava(예전 Goolge Collections) 등 null safe한 method를 이용하는 방법입니다. 자세한 사용은 Library의 JavaDoc을 읽어보길 권합니다.

1. Apache Commons의 StringUtils
String의 null 체크를 간단히 할 때 많이 사용하는 클래스입니다. StringUtils.isNotEmpty(), isBlank(), isNumeric(), isWhiteSpace() 등이 있죠.

1
2
3
4
5
6
7
8
9
10
11
// StringUtils methods are null safe, they don't throw NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
 
Output:
true
true
false
false

2. Guava의 Optional 클래스 이용하기
Optional는 nullable한 T를 non-null 값으로 대체시키기 위한 방법인데요. (말이 어렵죠?)
Optional 객체는 non-null인 T reference를 포함하거나 아무것도 포함하고 있지 않습니다.

한마디로 Optional 객체는 명시적으로 null 값을 갖지 않는다는거죠.
NullObject Pattern을 일반화시켰다고나 할까요? 바로 이 점을 이용해서 NPE를 예방합니다.

– absent : 아무 것도 포함하고 있지 않은 상태
– present : non-null 값을 갖은 상태

1) Optional 객체의 생성 (static 메소드)

Optional.of(T)
– T로 받은 non-null 값을 포함하는 Optional 객체 반환, T가 null 일 경우 NPE 발생
Optional.absent()
– 아무것도 포함하고 있지 않는 absent Optional 객체 반환
Optional.fromNullable(T)
– T로 받은 값이 non-null일 경우 present로, null일 경우 absent로 처리한 Optional 객체 반환

2) Optional 객체를 다루기 위한 메소드

boolean isPresent()
– Optional 객체가 non-null 인스턴스를 포함할 경우 true 반환
T get()
– Optional 객체가 present 일 경우 포함하고 있는 인스턴스를 반환, absent일 경우 IllegalStateException 발생
T or(T)
– Optional 객체의 present 값을 반환. 만일 값이 없을 경우 명시한 T를 반환 (기본값)
T orNull()
– Optional 객체의 present 값을 반환, 만일 값이 없을 경우 null을 반환. fromNullable의 역임
Set asSet()
– Optional 객체에서 포함하고 있는 인스턴스의 변경 불가능한 싱글톤 Set을 반환. 만일 인스턴스가 없다면 변경불가능한 Empty set을 반환

3) 간단 예제

1
2
3
4
5
6
7
Optional<Integer> possible = Optional.of(5);
System.out.println(possible.isPresent());
System.out.println(possible.get());
 
Output:
true
5

4) 응용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Integer a = 10;
Integer b = null;
 
Optional present = Optional.fromNullable(a);
Optional absent = Optional.fromNullable(b);
 
System.out.println("a is present : " + present.isPresent());
System.out.println("b is present : " + absent.isPresent());
System.out.println("a value : " + present.or(0));
System.out.println("b value : " + absent.or(0));
 
Output:
a is present : true
b is present : false
a value : 10
b value : 0

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Optional.html
https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional

요건 Wrapper 메소드 형식으로 Optional 객체를 반환하게끔 사용하면 좋을 것 같네요.

3. Guava의 Preconditions 또는 NullPointerTester 클래스 이용하기
http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/base/Preconditions.html#checkNotNull(T)
http://guava-libraries.googlecode.com/svn-history/r144/trunk/javadoc/com/google/common/testing/NullPointerTester.html

Nullness Annotation 활용하기

메소드의 return값 또는 파라미터의 null 허용여부를 Annotation을 이용하여 지정합니다. 코딩 습관 들이기 3, 4번 항목을 제약하기 위해 사용하는데요.

IDE에서 지원하는 @Nullable, @NotNull 등의 Annotation을 사용하면 코드에서 NPE 발생 가능여부를 미리 경고해줍니다. 또 해당 Annotation 제약사항을 위반했을 경우 컴파일시 NPE가 아닌 IllegalArgumentException 또는 IllegalStateException이 발생됩니다. Argument로 NotNull이어야 한다고 정했는데 Null이 들어왔다면 의미상 NPE보다는 잘못된 Argument가 맞겠죠?

현재 ItelliJ, Eclipse IDE 및 Find Bugs에서는 서로 다른 Annotation 라이브러리를 사용하는데요. JCP에 Software Defect Detection하기 위한 Annotation이 JSR-305로 요청 중이나 현재 dormant(중단) 상태네요. 언제 JDK에 포함될런지는 모르겠네요 :'(

상세 사용법은 아래를 참고하세요.

1. Eclipse (Juno 이상)
http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-using_null_annotations.htm

2. IntelliJ
http://www.jetbrains.com/idea/documentation/howto.html

3. FindBugs
http://findbugs.sourceforge.net/manual/annotations.html

4. IntelliJ 예제
– 프로젝트에 /REDIST/annotations.jar 추가
– Project Settings > Inspections > Probable bugs 체크 > Constant conditions & exception 체크 > Sueggest @Nullable annotation …. 체크

1
2
3
4
5
6
7
8
9
10
11
12
@Nullable
private String getDefinition() {
   // ...
}
 
public void doSomething() {
   if (getDefinition().equals("DEFINITION")) {
      // ...
   }
 
   // ...
}

@Nullable인 getDefinition()는 NPE가 발생할 수 있다.’고 IntelliJ에서 경고합니다.

1
2
3
4
5
6
7
8
9
10
private User findUser(@NotNull final String id) {
   // ...
}
 
public void doSomething() {
   // try invoking with null parameter
   User user = findUser(null);
 
   // ...
}

@NotNull 사용한 곳에서 null 값을 전달하고 있다고 IntelliJ에서 경고합니다.

기타

1. DB 테이블 컬럼 생성시 default값 설정하기
사용자로부터 입력 받은 값 중 null을 허용하더라도 default값을 설정했다면,
추후 해당 테이블에서 값을 불러와 사용할 경우 null을 예방할 수 있겠죠.

2. Null Object Pattern, Factory Pattern 사용하기

3. Spring MVC에서 지원되는 Bean Validation에서 @NotNull 사용하기 (JSR-303)

결론

1. 개발자가 코딩시 주의하여 NPE를 발생시키는 코딩 습관은 자제한다.
2. 간단한 Apache Commons나 Guava Library의 null safe 관련 클래스를 학습한 후 적용한다.
3. IDE에서 지원하는 Annotation 등을 이용해서 NPE 발생 부분은 미리 캐치하여 예방한다.

# 참고 사이트
– http://javarevisited.blogspot.kr/2013/05/ava-tips-and-best-practices-to-avoid-nullpointerexception-program-application.html
– http://howtodoinjava.com/2013/04/05/how-to-effectively-handle-nullpointerexception-in-java/
– http://isagoksu.com/2009/development/java/how-to-avoid-nullpointerexceptions-npe/
– https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained
– http://www.scottlogic.com/blog/2013/09/09/nullable-in-kepler.html

'Java' 카테고리의 다른 글

JAVA 강좌  (0) 2015.10.16

꼭 필요한 리눅스 명령어

Posted by
2017. 5. 9. 09:52 DB

여러 프로젝트를 진행하다보면, 리눅스 또는 유닉스를 다룰수 밖에 없는 상황이 오게 마련입니다. 그러한 상황에 직면했을때 매번 웹 검색을 하거나 그나마 몇가지 알고 있는 명령어만 가지고 반복작업을 통해 해결하곤 합니다. 그 간의 경험을 바탕으로 알고나면 단순한 반복 작업을 간단하게 해결 할 수 있는 몇가지 팁을 소개합니다.

이 글은 현재 프로젝트에서 사용중인 CentOS Linux 기준으로 작성이 되었지만, 대부분의 리눅스에서 사용되어지는 bash셸(Bourne Again Shell) 및 공통 유틸리티에 대해서 다루므로 특정 리눅스 배포판에 관계없이 대부분 사용할 수 있습니다.

대부분의 리눅스관련 서적과 같이 명령어를 정리하자면, 글이 장황해지고 포스팅으로써 분량이 맞지 않기 때문에 커맨드라인을 효과적으로 사용 할 수 있는 유틸리티를 중심으로 소개합니다.

1. 명령어: cd

cd -

위와 같이 'cd -' 를 사용하여 이전 디렉토리로 전환을 쉽게 할수 있다.

하지만 이것의 문제점은 바로 이전의 위치만 가능하다는데 있다. 만약에 현재 위치를 기억해두고, 다른 여러디렉토리를 이동후 기억된 위치로 되돌아가고자 할때 유용하게 사용할수 있는 것이 있다.

pushd, popd

위와 같이 'pushd' 명령어를 사용하여 현재 디렉토리 위치를 저장하고 다른디렉토리로 이동하게 된다. 그 이후 여러다른 디렉토리로 이동후에 언제라도 'popd'를 사용하여 이전에 기억해둔 곳으로 전환할 수 있다.

2. 명령어: history

!!

쌍느낌표(Double exclamation) '!!' 는 바로 직전 명령어를 실행한다. 다음 예제를 보자.

!! | grep Linux

이 기능을 다음과 같이 쉽게 응용 할 수 있다. 이전 명령어에 쉽게 추가하기

sudo !!

다음과 같이 root 권한 명령어인데 'sudo' 없이 사용한 명령어를 쉽게 불러와 사용할수 있다. 이는 방향키를 올려서 이전 명령어를 불러 오고 다시 앞쪽으로 이동하여 에디트하는 번거로움을 피할수 있다.

echo !! > script.sh

가끔 출력 결과를 파일이나 스크립트로 저장할 필요가 있을때가 있다. 이런 경우 '!!'를 사용하여 반복을 피할 수 있다.

지금까지 '!!'에 대해서 알아보았다. 하지만 '!'의 기능은 조금 다른데, 이는 명령어 이력번호를 호출하는데 사용된다. 다음 예제를 보자.

!이력번호

history

이 명령어를 치면 아래와 같이 이전 명령어들이 각각 고유 식별번호가 존재하는데, 그 식별번호를 사용하여 재 사용이 가능하다. 다음 예제를 보자.

!1093

이 명령어는 1093번 명령어를 재실행한다.

!-이력상대순번

마지막 명령어로 부터 뒤로 두번째 명령어를 재호출할때 !-2 이렇게 사용하면 된다.

이전 명령어의 argument로 명령어 실행

사실 이건 알아도 자주 안써서 기억 할 수 없기 때문에 거 의 사용 하지 못한다..

Linux1_10

그 외 다음과 같다.

  • !^ 이전 명령어의 첫번째 argument이다.
  • !$ 이전 명령어의 마지막 argument이다.
  • !* 이전 명령어의 전체 argument가 있다.

다음과 같이 응용도 가능하다, 바로 이전의 인수가 아닌 특정 명령어의 인수를 사용할 수 있다.

$ ls !ls:2

'![keyword]' 이전 명령어의 keyword로 명령어 실행

Linux1_11

!ls ls로 시작되는 명령어중 가장 최근 명령어를 찾아서 재 실행한다. (IBM AIX 등의 korn셸에서는 r ls )

vi 모드

커맨드 라인 인터페이스에서 입력 모드를 vi 모드를 사용하면, 이전 명령어를 검색하여 좀 더 효율적인 히스토리 기능을 사용할 수 있다.

다음처럼 설정하여, 커맨드라인 에디트를 vi로 사용한다. 기본적으로 emacs로 설정되어 있다. ($HOME/.bash_profile 에 설정하면, 다음 로그인시에 기본으로 설정이 된다.)

$ set -o vi 
$set -o 를 입력하면 전체 커맨드 라인 옵션이 나오는데 vi 모드가 on 되어 있는지 확인하자.

Linux1_33

다음은 vi 모드에서 커맨드 라인 사용 방법이다. (vi에 익숙한 사용자는 바로 알겠지만, vi 에디터를 모르더라도 다음 부분만 익히면 된다.)

ESC 키를 쳐서 명령어 모드(ex mode)로 진입한다. (vi 에디터와 동일) 
$ /uname <엔터>

이후부터, n 키를 치면서 다음 명령어를 순차적으로 검색할 수 있다.

원하는 명령어를 찾고 나서 수정을 원하는 단어까지 w 키를치고 커서를 빠르게 이동하자

단어까지 이동하였으면 cw 입력하여 단어 편집 상태로 진입하여 타이핑하면 빠르게 커맨드 라인 입력을 할 수 있다.

(사실 저는 거의 vi모드로 대부분 커맨드 명령어를 처리합니다. )

Control-R

컨트롤키와 r 키를 동시에 입력하면, 검색어 문자 입력 대기 상태로 진입한다.

(reverse-i-search)'':

키워드를 입력할때마다 점진적으로 히스토리에서 검색한다. 다시 한번더 컨트롤 + r 키를 입력하면 순차적으로 그 이전의 명령어를 검색하여 보여준다. 원하는 명령어를 찾으면 바로 엔터를 입력 또는 명령어를 수정할때는 왼쪽 또는 오른쪽 방향기로 이동 후 수정한다.

Linux1_34

이상 히스토리 기능에 대해서 살펴 보았습니다. 이것 외에도 이전명령어 치환하는 기능 등이 있으나 개인적으로도 이정도 기능외는 잘 사용하지 않을뿐더러 사용하지 않으면 잊어버리기 때문에 무용지물이 되버리곤 합니다. 이상의 기능만 잘 활용하면 커맨드 라인에서 키보드 타이핑을 하는 고통을 일부나마 줄일수 있을것이라 생각합니다.

3. 특수문자 { }

커맨드 라인 인터페이스에서 콤마는 파일명을 나열하고 명령에게 인수로 전달한다.

touch 유틸리티는 파일의 접근, 수정 시간을 현재 시간이나 사용자가 명시한 시간으로 바꾼다. 파일이 존재하지 않을 경우에는 빈 파일을 생성한다.

Linux1_12

mkdir 유틸리티는 디렉토리 생성한다.

Linux1_13

다음과 같이 파일명 인수가 콤마 갯수 만큼 확장하고 명령어에게 전달하고 있음을 확인 할 수 있다.

echo 유틸리티는 셸이 전달하는 인수를 출력한다.

Linux1_14

4. 특수문자 ?

물음표 기호(?)는 셸에게 파일명을 생성케 하는 특수 문자다. 이 문자는 기존의 파일명에 있는 문자를 하나에 해당된다.

Linux1_15

5. 특수문자 *

별표(*)는 물음표와 비슷한 기능을 수행하지만, 어떤 개수의 문자열에라도 대응될 수 있다는 점이 다르다.

Linux1_16

6. 특수문자 [ ]

문자 주위를 둘러싼 괄호 기호 [ ]는 셸이 각각의 문자를 포함하는 파일명을 검색하게한다.

Linux1_17

7. 백그라운드에서의 프로그램 실행

지금까지의 예제에서 명령은 모두 포그라운드에서 실행됐다. 포그라운드에서 명령을 실행하면 셸은 명령의 실행이 끝날 때까지 기다렸다가 사용자에게 프롬프트를 내보낸다. 반면 백그라운드에서 명령을 실행하면 사용자는 이명령의 실행이 끝날 때까지 기다릴 필요 없이 바로 다른 명령을 실행할 수 있다.

작업(job)은 파이프로 연결 가능한 여러 개의 명령을 가리킨다. 포그라운드 작업의 경우에는 한 윈도우나 한 화면에서 하나의 작업만 실행할 수 있다. 그러나 백그라운드 작업의 경우에는 여러 개를 실행하는 것이 가능하다. 사용자는 한번에 하나 이상의 작업을 실행함으로써 리눅스의 중요한 기능 중 하나인 멀티태스킹(multitasking) 기능을 사용할 수 있다. 실행 시간이 길면서 작업 진행에 대한 별도의 감시가 필요치 않은 명령을 실행할 때는 백그라운드 실행 기능이 매우 유용하다.

백그라운드에서 명령을 실행하려면 커맨드 라인의 마지막에서 RETURN 키를 입력하기 전에 & 기호를 입력한다. 그러면 셸은 작업에 번호를 매기고 이 작업 번호를 괄호로 둘러싸서 출력한다. 작업번호 뒤에는 PID(Process Identification) 번호가 나온다. 명령 뒤에 나오는 [1]이라는 숫자는 셸이 이 작업에 대한 작업 번호를 1을 할당했다는 것을 의미한다.

백그라운드 작업의 실행이 끝나면 다음과 같은 메시지를 볼 수 있다.

[1]+ Done program

Linux1_19

포그라운드에서 백그라운드로의 작업 이동

포그라운드 작업의 실행은 작업 보류 키, 일반적으로 CONTROL-Z 키를 입력함으로써 일시 중지할 수 있다. 셸은 프로세스를 멈추고 키보드로부터의 표준 입력을 중지시킨다. 이때 사용자가 bg 명령과 작업 번호를 입력하면 중지된 작업은 백그라운드로 옮겨서 다시 시작된다. 중지된 작업이 하나밖에 없다면 작업 번호를 입력할 필요가 없이 fg만 입력한다. 만약 백그라운드 작업이 하나 이상이라면 fg 인수로써 %번호를 입력해야한다.

Linux1_18

kill : 백그라운드 작업의 중단

인터럽트 키(보통은 CONTROL-C)로는 백그라운드에서 실행되는 프로세스를 중단할 수 없다. 이러한 경우에는 kill 명령어를 사용해야 한다. 커맨드 라인에 kill과 중단하려는 프로세스의 PID를 입력하거나 퍼센트 기호(%)와 작업 번호를 입력한다.

Linux1_20

여기서 잠깐!

kill 명령어 대해서 시그널에 대해서만 잠깐 언급을 하자면, 가끔 습관적으로 무조건 강제 종료 시그널(-9)를 날리는 분을 계신데.. Java 데몬이나 기타 서버를 종료 시킬때 무조건 강제 종료시키기 보다 서버에게 종료시 자원 정리 시간을 주어 안전하게 종료하게 하자.

  1. SIGTERM(15) 시그널 
    : 프로세스에게 보내어 DB 접속 및 각종 아직 커밋이 되지 않은 정보를 안전하게 저장할 수 있도록 기회를 준다. 프로세스가 이 시그널에도 무 반응시에만 강제 시그널를 보낸다. 
    kill 13377 ( kill -15 13377 또는 kill -TERM 13377)

  2. SIGHUP(1) 시그널 
    : 재 시작 시그널이다. ( kill -1 13377 또는 kill -HUP 13377 )

  3. SIGKILL (9) 
    : 묻지도 따지지도 않고(?) 무조건 강제 종료한다. (kill -9 13377)

8. 검색 명령

리눅스에서 명령을 입력하면 셸은 프로그램에서 사용하는 디렉토리를 검색해 처음 이름이 일치하는 프로그램을 실행한다. 이때 검색하는 디렉토리 목록을 검색 경로(search path)라고 한다. 검색 경로를 변경하는 방법은 PATH 환경변수를 변경하는 것이다. 사용자가 검색 경로를 변경하지 않으면 셸은 표준 디렉토리만 검색해 보고 검색 작업을 멈추게 된다. 물론 표준 디렉토리 외의 다른 디렉토리에도 유용한 유틸리티가 존재할 수 있다.

which / whereis: 유틸리티의 위치 검색

which 유틸리티는 유틸리티 파일의 전체 경로를 보여줌으로써 유틸리티(명령어)의 위치를 알려준다. 셸은 검색 경로를 탐색해서 처음 나오는 명령을 실행한다. which 는 이런 경우 셸이 어떤 프로그램을 실행할지를 알려준다.

which유틸리티는 명령어가 예상 외의 동작을 수행할 경우 유용하다. which를 실행 해 보면 표준이 아닌 버전의 툴을 실행하고 있는지, 혹은 자신이 원하는 툴과는 전혀 다른 툴을 실행하고 있는지를 알 수 있게 될 것이다.

다음과 같이 which ls 명령어로 확인 해 보면 alias가 먼저 실행한다는것을 알 수 있다.

참고) 역슬래쉬()를 명령어 앞에 사용하면 alias 가 아닌 실제 명령어를 실행한다. ex) \ls

Linux1_28

프로그램의 이름이 주어지면 which는 검색 경로에 있는 디렉토리를 차례대로 검색, 프로그램의 위치를 찾는다. 검색 경로에 해당 프로그램이 하나 이상 존재하는 경우에 which는 처음 나오는 명령에 대한 정보만 보여준다.

whereis 유틸리티는 표준 디렉토리(standard directory) 목록을 통해 파일을 검색하며, 검색 경로와는 독립적으로 작동한다. whereis는 사용자가 지정한 바이너리(실행)파일, 매뉴얼 페이지 및 프로그램 소스 코드의 위치 검색에 사용할 수 있는 데, 이 유틸리티는 which와 달리 모든 해당 파일에 대한 정보를 보여준다.

Linux1_29

apropos: 키워드 검색

특정 작업을 수행하는 데 필요한 명령을 알지 못한다면 apropos 유틸리티로 키워드를 검색하면 된다. (apropos를 제대로 실행하려면 makewhatis로 whatis 데이터베이스를 설정하고 주기적으로 관리해야 한다. 이 작업은 보통 cron으로 처리한다.) 이 유틸리티는 man 페이지의 맨 위에 나오는 짧은 설명줄(description line)에서 키워드를 검색해 일치하는 항목이 있는 명령만 보여준다. man 유틸리티를 -k(keyword) 옵션과 함께 사용하면 apropos를 실행한 것과 동일한 결과를 볼 수 있다.

다음 예제는 apropos를 who 키워드와 함계 호출한 결과를 보여준다. 이 키워드와 관련된 다른 유용한 유틸리도 찾아서 보여준다.

Linux1_30

locate: 파일 검색

locate유틸리티는 로컬 시스템에서 파일을 검색하는 작업을 수행한다. locate는 updatedb 유틸리티로 생성/업데이트한 locate 데이터베이스가 있어야만 정확하게 검색할 수 있따. 일반적으로 이 데이터베이스는 cron 스크립트로 하루에 한 번씩 업데이트된다.

Linux1_31

grep: 파일명 검색 또는 파일내 문자열 검색

which / whereis / apropos / locate 등은 유틸리티 검색 하는데 사용되지만, grep 유틸리티는 하나 이상의 파일에서 행 단위로 간단한 문자열이나 정규 표현식으로 표현된 pattern을 찾는다.

-r 옵션은 하위디렉토까지 모두 검색한다.

-l 옵션은 파일내의 텍스트와 패턴이 매치되는 텍스트를 출력하지 말고 매칭된 파일 목록만 출력한다.

-L 옵션은 -l 옵션과 반대로 비 매칭된 파일 목록을 출력한다.

Linux1_32

9. 접근 권한

접근 권한

파일에 접근할 수 있는 사용자 유형은 다음 3가지로 구분할 수 있다.

  • 파일의 소유자(owner)
  • 파일 소유자가 속해 있는 그룹 멤버(group)
  • 그 밖의 모든 사람(other)

각 사용자별 읽기, 쓰기, 실행 의 파일 접근 권한을 설정 할 수 있으므로 모두 9가지 방법이 있다는 것을 의미한다.

Linux1_21

ls -l 권한 보기

첫 번째 문자 하이픈(-)으로 표기되어 있다. 이 파일은 일반 파일이기 때문이다. (디렉토리는 d가 표시된다.)

그 다음에 오는 문자 9개는 각 사용자별 owner, group, other 에 읽기(r), 쓰기(w), 실행(x) 권한이 부여된다. (- 문자는 권한이 없음을 나타낸다.)

Linux1_23

접근 권한 변경은 두가지 심볼릭과 절대값으로 변경이 가능하다.

접근권한 변경: 심볼릭

심볼릭 모드: 사용자 종류

Linux1_24

심볼릭 모드: 연산자

Linux1_25

심볼릭 모드: 퍼미션

Linux1_26

파일 소유자는 어떤 사용자에게 파일 접근 권한을 줄지, 그리고 어떤 접근 권한을 줄지를 결정해서 설정할 수 있다. 파일 소유자는 chmod(change mode) 유틸리티를 사용해서 파일의 접근 권한을 변경할 수 있다.

심볼릭 접근 권한 변경 예) chmod a+rw letter

의미: 모든(a) 사용자에게 읽고 쓰는 권한(rw)을 부여(+)하라.

다음은 접근 권한의 변경 유틸리티 chmod 로 심볼릭 모드 사용 예이다.

Linux1_22

접근권한 변경: 절대값

8진수를 사용하여 접근 모드를 설정할 수 있다.

절대값 접근 권한 변경 예) chmod 755 letter

의미: 소유자는 모든 권한을 그외 그룹과 다른 사용자는 읽기와 실행 권한을 부여하라

다음은 접근 권한의 변경 유틸리티 chmod 로 절대값 모드 사용 예이다.

참고1) 셸 스크립트의 경우, 읽기와 실행 퍼미션이 있어야 실행할 수 있지만 바이너리 파일은 실행 퍼미션만 있어도 실행할 수 있다.

참고2) 디렉토리 경우 실행 퍼미션이란? 디렉토리 안으로 진입 가능 여부를 뜻한다.

Linux1_27

10. yum : 시스템을 최신 버전으로 유지하기

패키지 갱신과 설치

리눅스 초기 릴리즈에는 갱신을 관리하는 툴이 없었다. RPM 툴로 개별 소프트웨어 패키지를 설치하거나 갱신할 수 있었지만, 패키지와 그 패키지와 종속 관계를 갖는 패키지를 찾는 일은 전적으로 사용자의 몫이었다.

Terra Soft, 이 회사는 자동으로 패키지를 찾고 종속 관계를 검사하는 Yellow Dog Updater를 만들었다. 이 후 다른 배포판에 포팅되었다. Yellow dog Updater, Modified ( Yum ) 는 RedHat 또는 CentOS 리눅스의 기본 패키지 관리자 이다.

패키지 저장소 환경파일

환경파일 : /etc/yum.conf

업데이트

시스템 유틸리티이므로 루트 사용자에서 실행을 해야한다. update 옵션은 설치된 모든 패키지를 갱신한다. 설치된 패키지의 패키지 헤더를 내려받은 후 계속 진행할 것인지 묻고, 갱신된 패키지를 내려받아 설치한다.

$ yum update

패키지 설치

새로운 패키지와 그것과 종속 관계를 가지는 패키지를 설치하려면, yum install 명령어 다음에 패키지 이름을 붙인다.

$ yum install telnet

패키지 삭제

비숫한 구문을 사용하여 yum으로 패키지를 삭제 할 수 있다.

$ yum remove telnet

11. 설치하고 싶은 유틸리티 찾기

자신이 설치하고 싶은 어플리케이션에 대해서 패키지명을 모르면 설치를 할 수 없다. 또한 자신이 원하는 유틸리티가 어느 패키지에 속해 있는지 알 수 없을때, 다음과 같이 검색하여 찾아 볼 수 있다.

1. 먼저 패키지 목록 조회를 하라. 
# yum list vimtutor 
- Error: No matching Packages to list

2. 유틸리티 이름으로 검색을 하라. 
# yum search vimtutor 
- No Matches found

3. 패키지 내에 서 제공하는 파일명을 검색 하라. 
# yum provides vimtutor 
- You can use “/vimtutor” and/or “bin/vimtutor” to get that behaviour 
- No Matches found

4. 위에서 제시한 방법대로, 패키지 서브 디렉토리 까지 검색하라 
# yum provide */vimtutor 
- vim-enhanced-7.2.xxxxxxx

위와같이, 출력이 되었다면 찾기에 성공한것이다. 그럼 이것을 설치해야 하는데, 다음처럼 패키지명(버전 문자 이전까지)만 입력하면 대부분 설치가 가능하다.

$ yum install vim-enhanced

설치가 성공적으로 끝나면 vimtutor 를 실행하여 제대로 설치되었는지 확인 해보자.

5. 위 4가지 방법으로 못 찾으면, 인터넷 검색을 적극 활용하여 해결의 실마리를 찾도록 한다.

이상으로 간단하게 정리하고 마무리를 하고자 합니다. 실무에서 가장 빈번하게 쓰이는 커맨드 유틸리티를 중점적으로 알아보았고, 백그라운드 프로세스 관리와 파일 접근 권한 관리에 대해서 알아 보았습니다. 또한 명령어 검색 및 소스파일내 문자열 검색 까지 살펴 보았고요, 마지막으로 패키지 유지 관리까지 정리해 보았습니다.

제가 프로젝트에서도 이 정도 사용있으며 그렇게 큰 불편없이 잘 사용하고 있습니다. 그외 간단한 셸 스크립트 정도만 익혀두시면, 정기적인 백업 스크립트를 만들어 스케줄에 등록하여 사용 할 수도 있어 활용범위가 넓어 질것입니다. 끝까지 읽어 주셔셔 감사합니다.

참조 도서 및 사이트

Practical Guide to Linux Commands, Editors, and Shell Programming by Mark G. Sobell, Published July 1st 2005 by Prentice Hall 
20 interesting and extremely helpful Linux command line tricks


출처: Nextree

정규표현식의 규칙

Posted by
2017. 5. 3. 23:31 eclipse

문자열 패턴을 표현하기 위해 정규 표현식 함수와 함께 사용되는 특수 문자들이 있다. 정규 표현식에 사용되는 이 특수 문자들의 사용법을 먼저 알아보도록 하자

패턴 표현에 사용되는 특수 문자

정규 표현식에서 패턴을 표현하기 위해 사용하는 특수 문자와 규칙은 다음과 같다.

  1. '.' 특수문자

    '.'은 어떤 문자이건 간에 임의의 한 글자를 나타낸다. 예를 들면, 패턴 a.c는 어느 한 문자의 앞 문자가 a이고 뒷 문자는 c인 모든 문자열을 포함한다. 따라서 aac나 abc, acc는 이 패턴에 일치되는 문자열이다. 그러나 .은 반드시 임의의 한 글자만을 대신하기 때문에 a로 시작해 c로 끝나는 문자열 중 두 글자뿐인 ac나 abbc는 이 패턴에 포함되지 않는다.

    사용예내용해당 문자열
    s.es와 e사이에 임의의 한 글자를 갖는 문자열과 일치한다.sae, sbe, sce, sde, …
    .cece 앞에 임의의 한 글자를 갖는 문자열과 일치한다.ace, kce, fce, …

     

  2. '*' 특수문자

    '*'는 바로 앞의 문자를 의미하며 그 문자가 없거나 하나 이상임을 나타낸다. 위의 '.'이 그 자체로 임의의 한 글자만을 의미하는 데 반해 '*'는 바로 복수 개의 문자를 나타낼 수 있다. 대신 '*' 앞에는 반드시 문자가 하나 이상 있어야 한다. 만일 "*e"와 같이 '*' 앞에 문자가 없으면 잘못된 패턴으로 인식해 에러가 발생한다.

    사용예내용해당 문자열
    s*ee 앞에 s가 없거나 하나 이상 존재하는 모든 문자열을 나타낸다.e, se, sse, ssse, …
    abc*ab 다음에 c가 없거나 하나 이상 존재하는 모든 문자열을 나타낸다.ab, abc, abcc, abccc, …
    h*imim 앞에 h가 없거나 하나 이상 존재하는 모든 문자열을 나타낸다.im, him, hhim, hhhim, …

     

  3. '+' 특수문자

    '+'는 바로 앞의 문자를 의미하여 그 문자가 하나 이상임을 나타낸다. '*'와 마찬가지로 앞에 한 문자가 있어야 하며 이 문자가 최소 하나 이상 존재하는 모든 문자열을 포함한다.

    사용예내용해당 문자열
    s+e문자 e앞에 s가 최소한 하나 이상 존재하는 모든 문자열을 나타낸다.se, sse, ssse, sssse, settle, …

     

  4. '?' 특수문자

    '?'는 바로 앞의 문자가 없거나 혹은 있음을 나타낸다. 예를 들면, s?e는 '?' 앞의 문자 s가 없거나 하나 존재하는 문자열 e나 se를 포함한다.

    사용예내용해당 문자열
    th?et와 e사이에 h가 하나 있거나 혹은 없는 문자열과 일치한다.te, the, their, lotte, …

     

  5. '^' 특수문자

    '^'는 바로 뒤의 문자열을 기준으로 이것과 동일한 문자열로 시작되는 것을 가리킨다.

    사용예내용해당 문자열
    ^TheThe로 시작하는 모든 문자열을 나타낸다.The girl is beautiful!, Theater, …
    ^a?bcbc나 abc로 시작하는 모든 문자열을 나타낸다.bc++ 3.0, abcdef), …
    ^.ee 앞에 한 글자가 존재하는 문자열로 시작하는 모든 문자열을 나타낸다.he, me, request, settle, …
    ^s.e?s와 임의의 한 문자로 시작하고 그 뒤에 문자 e가 하나 있거나 혹은 없는 문자열을 나타낸다.sa, sae, sb, sbe, …

     

  6. '$' 특수문자

    '$'는 문자열의 맨 마지막을 가리킨다.

    사용예내용해당 문자열
    a?bc$bc로 끝나는 문자열 앞에 문자 a가 없거나 하나 존재하는 문자열과 일치한다.eeabc, seebc, bc, …
    t.e$t와 임의의 한 글자, 그리고 그 다음에 e로 연결되어 끝나는 문자열과 일치한다.onthetoe, bctae, appetitte, …
    s?e+$첫 글자는 s나 e로 시작하고 하나 이상의 e로 끝나는 문자열과 일치한다.e, se, ee, eee, see, seee, …
    ^the$the로 시작해서 the로 끝나는 문자열과 일치한다. 즉, 이 경우는 문자열 자체가 the뿐인 경우에만 일치한다.the

     

  7. '[]' 특수문자

    각괄호 []는 [] 안에 있는 문자열 중에서 하나의 문자만을 의미한다. [] 안에서 범위를 지정할 때는 '-' 문자를 사용한다. 즉, [a-d]는 [abcd]와 동일하며 [0-9]는 [0123456789]와 같은 의미이다.

    사용예내용해당 문자열
    [ab]cdacd 또는 bcd를 포함하는 문자열과 일치한다.acd, tacde, "bcd", "tbcde", …
    ^[ab]cdacd 또는 bcd로 시작하는 문자열과 일치한다.acds, bcdt, acdsee32, …
    [a-z]영문 소문자 한 글자를 포함하는 문자열과 일치한다.a0c2ds, ta123cde, Student, …
    [a-zA-Z]영문 소문자나 대문자 한 글자를 포함하는 문자열과 일치한다.LINUX, 386AT, …
    [0-9]십진수 한 자를 포함하는 문자열과 일치한다.a0c2ds, ta123cde, 386, …
    ga[a-z]하나의 영문 소문자 앞에 ge를 갖는 문자열과 일치한다.LINgazUX, gazzett, …
    ^ab[ce]efabcef 또는 abdef로 시작하는 문자열과 일치한다.abcef0z, abdef386, …
    ^[a-zA-Z]영문자로 시작하는 모든 문자열과 일치한다.LINgazUX, abcef0z, …
    [a-z]+영문소문자 한 자 이상을 갖는 문자열과 일치한다.tgabcabcef, MySQL, …
    [aA][bB]ab, aB, Ab, AB를 포함하는 문자열과 일치한다.386ABIT, abcef0z, tgabcabcef, …
    ,[a-zA-Z0-9]$콤마와 하나의 영문자 또는 숫자로 끝나는 문자열과 일치한다.abdef38,6, 199,2, …

     

    만일 원하지 않는 문자를 제외한 나머지 문자를 가리킬 때에는 []안의 첫 문자로 '^'를 사용한다.

    사용예내용해당 문자열
    [^ab]cdacd와 bcd를 제외하고는 패턴 .cd와 같다. 즉, cd앞에 a나 b를 제외한 하나의 문자를 포함하는 문자열과 일치한다.ccd, scd, 018cd, tgcdcdabcef, gazcd18, …
    s[^ab]tsat와 sbt를 제외하고는 패턴 s.t와 같다. 즉, t 앞에 a나 b를 제외한 임의의 한 문자와 그 앞에 s가 있는 문자열과 일치한다.sct, sdt, tgcdsctda28, settle, …
    [^a-z]영문 소문자를 제외한 한 글자를 포함한 문자열과 일치한다.MySQL, 386sAB,IT, abcef0z, 199,2, …
    [^a-zA-Z]영문자를 제외한 한 글자를 포함하는 문자열과 일치한다.286sAB,IT, gazscd18, abcef0z, 199,2, …
    [^0-9]숫자를 제외한 한 글자를 포함하는 문자열과 일치한다.settle, gazscd18, LINUX, …

     

  8. '{}' 특수문자

    중괄호 {}는 {} 앞에 있는 문자나 문자열의 개수를 결정한다.

    사용예내용해당 문자열
    a{2}baab를 가진 문자열과 일치한다. 즉, {2}는 {}앞에 있는 문자 a의 개수가 2개임을 의미한다.aab, …
    a{2,}ba의 개수가 최소한 2개 이상인 문자열을 포함하는 문자열과 일치한다.aab, aaab, aaaab, …
    a{1,3}bb앞에 1개부터 3개까지의 a를 갖는 문자열을 포함하는 문자열과 일치한다.ab, aab, aaab, …

     

  9. '()' 특수문자

    둥근괄호 ()는 () 앞에 있는 글자들을 그룹화 한다.

    사용예내용해당 문자열
    a(bc){2}a뒤에 bc의 개수가 두 개인 문자열 abcbc를 포함하는 모든 문자열과 일치한다. [bc]가 b 또는 c중 하나를 의미하는 것에 비해 (bc)는 bc를 하나의 그룹으로 처리한다.docabcbctor, tabcbc++, …
    a(bc)*a뒤에 bc가 없거나 하나 이상인 문자열과 일치한다.sea, abcd, abcbcbcbc, …

     

  10. '|' 특수문자

    '|'는 OR 연산자이다.

    사용예내용해당 문자열
    he|shehe나 she를 포함하는 문자열과 일치한다.he is handsome, she's gone, …
    (he|she)isis 앞에 he나 she를 포함하는 문자열, 즉 heis나 sheis를 포함하는 모든 문자열과 일치한다. 
    (le|li)*ftft 앞에 le나 li가 없거나 하나 이상인 문자열과 일치한다.mlefto, lft, lelift, fclelelilefte, …
    mo(no)+mo뒤에 no가 하나 이상인 문자열과 일치한다.mono, monono, mononono, acmonoe, …

     

문자 클래스(character class)

패턴을 [a-z]나 [A-Z], [0-9]로 표현하는 대신 다음과 같이 문자 클래스(character class)로 간단하게 표현할 수도 있다.

  • [[:alpha:]] : 알파벳 문자 중 하나를 의미하며 [a-zA-Z], 또는 [a-Z]와 동일한 표현이다.
  • [[:digit:]] : 숫자 한 자를 의미하며 [0-9]와 동일한 표현이다.
  • [[:alnum:]] : 알파벳 문자나 숫자 중 하나를 의미하며 [a-zA-Z0-9]와 동일한 표현이다.
  • [[:space:]] : 공백 문자 ( )를 의미한다.

정규 표현식에서 특수 문자의 표현

지금까지 정규 표현식에서 사용한 여러 특수 문자를 특수 문자가 아닌 그 문자 자체의 의미로 사용하려면 특수 문자 앞에 역슬래시('\') 문자를 붙여 escape시켜야 한다. 정규 표현식에서 escape시켜야 하는 특수 문자로는 다음과 같은 것들이 있다.

^ . [ ] $ ( ) | * + ? { } \

 

  • \*+ : 문자 '*'이 하나 이상 포함된 모든 문자열과 일치한다. 이것은 정규 표현식에서 사용하는 특수문자 '*'를 '\*'와 같이 escape시킴으로써 문자열에서 '*'가 포함된 문자열을 찾는다.
    예) *notice***, dictsh*eionary
  • \[RE:[1-9][0-9]*\] : "["와 "RE:", 그리고 0을 제외한 하나의 숫자와 0 또는 하나 이상의 0을 포함한 숫자, 그리고 "]"를 순서대로 포함하는 모든 문자열과 일치한다. 즉, 이는 게시판에 답장 글을 올릴 때의 "[RE:12]"와 같은 패턴을 의미한다.
    예) [RE:9], [RE:21]*eionary
  • [*\/+?{}.] : "*"나 "\", "/", "+", "?", "{", "}", "."중 하나를 포함하는 모든 문자열과 일치한다. 특수문자 []안에서는 위의 경우와 달리 예외가 적용된다. 즉, []안에서는 특수 문자를 문자 자체로 표현하기 위해 해당 문자를 별도로 escape시키지 않아도 된다.
    예) [RE:21]*eionary, turboc++, ce{le}brity, hello?, ac/monoe

출처 : 오픈코드스

'eclipse' 카테고리의 다른 글

이클립스 워크스페이스 변경  (0) 2013.07.05

object type JSON 변환

Posted by
2017. 4. 9. 22:14 JavaScript

reference 타입의 데이터는 서버 간의 전송시에 직렬화를 해주어야 한다.


ex)

var man = {'firstname' : '홍', 'lastname' : '길동'};  // object type


직렬화 


var str_man = JSON.stringify(man);    //string type

JSON Castring

var obj_man = JSON.parse(str_man);    //object type






1
var obj_man = JSON.parse(str_man);    //object typ


'JavaScript' 카테고리의 다른 글

Airbnb JavaScript 스타일 가이드  (0) 2015.10.16

ATOM 단축키

Posted by
2015. 10. 29. 11:16 Etc

CTRL + \    TOGGLE TREE VIEW


CTRL-/        TOGGLE-LINE-COMMENTS             주식 처리

CTRL-G        GO-TO-LINE:TOGGLE                특정 라인으로 이동

CTRL-J        JOIN-LINES                       라인 삽입

CTRL-L        SELECT-LINE                      라인 선택

CTRL-DOWN      MOVE-LINE-DOWN                   라인 아래로 바꾸기

CTRL-UP        MOVE-LINE-UP                     라인 위로 바꾸기

ALT-D          DELETE-TO-END-OF-WORD            커서 뒷단어 삭제

ALT-H          DELETE-TO-BEGINNING-OF-WORD      커서 앞단어 삭제


CTRL-SHIFT-D  DUPLICATE-LINES                  라인 복사

CTRL-SHIFT-K  DELETE-LINE                      라인 삭제

CTRL-SHIFT-M  EMMET:MERGE-LINES                라인 합치기

CTRL-K CTRL-U  UPPER-CASE                       대문자

CTRL-K CTRL-L  LOWER-CASE                       소문자


CTRL-ALT-[    FOLD-CURRENT-ROW                 현재 열 접기

CTRL-ALT-]    UNFOLD-CURRENT-ROW               현재 열 펴기

CTRL-ALT-{    FOLD-ALL                         전체 접기

CTRL-ALT-}    UNFOLD-ALL                       전체 펴기

CTRL-ALT-F    FOLD-SELECTION                   선택 된 열 접기

CTRL-ALT-UP    ADD-SELECTION-ABOVE              블럭선택

CTRL-ALT-DOWN  ADD-SELECTION-BELOW              블럭선택

CTRL-ALT-M    SELECT-INSIDE-BRACKETS           선택된 BRACKETS 영역선택

CTRL-M        :GO-TO-MATCHING-BRACKET          매치 되는 브래킷으로 이동


F11            TOGGLE-FULL-SCREEN               전체화면

ALT-\          TREE-VIEW:TOGGLE-FOCUS           



Airbnb JavaScript 스타일 가이드

Posted by
2015. 10. 16. 15:35 JavaScript

원문:https://github.com/airbnb/javascript

Airbnb JavaScript 스타일 가이드() {

목차

  1. Types
  2. Objects
  3. Arrays
  4. Strings
  5. Functions
  6. Properties
  7. Variables
  8. Hoisting
  9. Conditional Expressions & Equality
  10. Blocks
  11. Comments
  12. Whitespace
  13. Commas
  14. Semicolons
  15. Type Casting & Coercion
  16. Naming Conventions
  17. Accessors
  18. Constructors
  19. Events
  20. Modules
  21. jQuery
  22. ES5 Compatibility
  23. Testing
  24. Performance
  25. Resources
  26. In the Wild
  27. Translation
  28. The JavaScript Style Guide Guide
  29. Contributors
  30. License

Types 원문

  • Primitives: primitive type은 그 값을 직접 조작합니다.

    • string
    • number
    • boolean
    • null
    • undefined
    var foo = 1,
        bar = foo;
    
    bar = 9;
    
    console.log(foo, bar); // => 1, 9
  • Complex: 참조형(Complex)은 참조를 통해 값을 조작합니다.

    • object
    • array
    • function
    var foo = [1, 2],
        bar = foo;
    
    bar[0] = 9;
    
    console.log(foo[0], bar[0]); // => 9, 9

    [↑]

Objects 원문

  • Object를 만들 때는 리터럴 구문을 사용하십시오.

    // bad
    var item = new Object();
    
    // good
    var item = {};
  • 예약어(reserved words)를 키로 사용하지 마십시오. 이것은 IE8에서 동작하지 않습니다. More info

    // bad
    var superman = {
      default: { clark: 'kent' },
      private: true
    };
    
    // good
    var superman = {
      defaults: { clark: 'kent' },
      hidden: true
    };
  • 예약어 대신 알기 쉬운 동의어(readable synonyms)를 사용하십시오.

    // bad
    var superman = {
      class: 'alien'
    };
    
    // bad
    var superman = {
      klass: 'alien'
    };
    
    // good
    var superman = {
      type: 'alien'
    };
    

    [↑]

Arrays 원문

  • 배열을 만들 때 리터럴 구문을 사용하십시오.

    // bad
    var items = new Array();
    
    // good
    var items = [];
  • 길이를 알 수없는 경우는 Array#push를 사용하십시오.

    var someStack = [];
    
    
    // bad
    someStack[someStack.length] = 'abracadabra';
    
    // good
    someStack.push('abracadabra');
  • 배열을 복사 할 필요가있는 경우 Array#slice를 사용하십시오. jsPerf

    var len = items.length,
        itemsCopy = [],
        i;
    
    // bad
    for (i = 0; i < len; i++) {
      itemsCopy[i] = items[i];
    }
    
    // good
    itemsCopy = items.slice();
  • Array와 비슷한(Array-Like)한 Object를 Array에 변환하는 경우는 Array#slice를 사용하십시오.

    function trigger() {
      var args = Array.prototype.slice.call(arguments);
      ...
    }

[↑]

Strings 원문

  • 문자열은 작은 따옴표''를 사용하십시오.

    // bad
    var name = "Bob Parr";
    
    // good
    var name = 'Bob Parr';
    
    // bad
    var fullName = "Bob " + this.lastName;
    
    // good
    var fullName = 'Bob ' + this.lastName;
  • 80 문자 이상의 문자열은 문자열 연결을 사용하여 여러 줄에 걸쳐 기술 할 필요가 있습니다.

  • Note : 문자열 연결을 많이하면 성능에 영향을 줄 수 있습니다. jsPerf & Discussion

    // bad
    var errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';
    
    // bad
    var errorMessage = 'This is a super long error that \
    was thrown because of Batman. \
    When you stop to think about \
    how Batman had anything to do \
    with this, you would get nowhere \
    fast.';
    
    
    // good
    var errorMessage = 'This is a super long error that ' +
      'was thrown because of Batman.' +
      'When you stop to think about ' +
      'how Batman had anything to do ' +
      'with this, you would get nowhere ' +
      'fast.';
  • 프로그램에서 문자열을 생성 할 필요가 있는 경우 (특히 IE는) 문자열 연결 대신 Array#join을 사용하십시오. jsPerf.

    var items,
        messages,
        length,
        i;
    
    messages = [{
        state: 'success',
        message: 'This one worked.'
    },{
        state: 'success',
        message: 'This one worked as well.'
    },{
        state: 'error',
        message: 'This one did not work.'
    }];
    
    length = messages.length;
    
    // bad
    function inbox(messages) {
      items = '<ul>';
    
      for (i = 0; i < length; i++) {
        items += '<li>' + messages[i].message + '</li>';
      }
    
      return items + '</ul>';
    }
    
    // good
    function inbox(messages) {
      items = [];
    
      for (i = 0; i < length; i++) {
        items[i] = messages[i].message;
      }
    
      return '<ul><li>' + items.join('</li><li>') + '</li></ul>';
    }

    [↑]

Functions 원문

  • 함수식(Function expressions)

    // 익명함수식(anonymous function expression)
    var anonymous = function() {
      return true;
    };
    
    // 명명된 함수식(named function expression)
    var named = function named() {
      return true;
    };
    
    // 즉시실행 함수식(immediately-invoked function expression (IIFE))
    (function() {
      console.log('Welcome to the Internet. Please follow me.');
    })();
  • (if 및 while 등) 블록 내에서 변수에 함수를 할당하는 대신 함수를 선언하지 마십시오. 브라우저는 허용하지만 (마치 'bad news bears'처럼) 모두 다른 방식으로 해석됩니다.

  • Note: ECMA-262에서는block은 statements의 목록에 정의되어 있습니다 만, 함수 선언은 statements가 없습니다. 이 문제는 ECMA-262의 설명을 참조하십시오. .

    // bad
    if (currentUser) {
      function test() {
        console.log('Nope.');
      }
    }
    
    // good
    var test;
    if (currentUser) {
      test = function test() {
        console.log('Yup.');
      };
    }
  • 매개 변수(parameter)에 arguments를 절대 지정하지 마십시오. 이것은 함수 범위로 전달 될arguments객체의 참조를 덮어 쓸 것입니다.

    // bad
    function nope(name, options, arguments) {
      // ...stuff...
    }
    
    // good
    function yup(name, options, args) {
      // ...stuff...
    }

    [↑]

Properties 원문

  • 속성에 액세스하려면 도트.를 사용하십시오.

    var luke = {
      jedi: true,
      age: 28
    };
    
    // bad
    var isJedi = luke['jedi'];
    
    // good
    var isJedi = luke.jedi;
  • 변수를 사용하여 속성에 접근하려면 대괄호[]을 사용하십시오.

    var luke = {
      jedi: true,
      age: 28
    };
    
    function getProp(prop) {
      return luke[prop];
    }
    
    var isJedi = getProp('jedi');

    [↑]

Variables 원문

  • 변수를 선언 할 때는 항상 var를 사용하십시오. 그렇지 않으면 전역 변수로 선언됩니다. 전역 네임 스페이스를 오염시키지 않도록 Captain Planet도 경고하고 있습니다.

    // bad
    superPower = new SuperPower();
    
    // good
    var superPower = new SuperPower();
  • 여러 변수를 선언하려면 하나의 var를 사용하여 변수마다 줄바꿈하여 선언하십시오.

    // bad
    var items = getItems();
    var goSportsTeam = true;
    var dragonball = 'z';
    
    // good
    var items = getItems(),
        goSportsTeam = true,
        dragonball = 'z';
  • 정의되지 않은 변수를 마지막으로 선언하십시오. 이것은 나중에 이미 할당된 변수 중 하나를 지정해야하는 경우에 유용합니다.

    // bad
    var i, len, dragonball,
        items = getItems(),
        goSportsTeam = true;
    
    // bad
    var i, items = getItems(),
        dragonball,
        goSportsTeam = true,
        len;
    
    // good
    var items = getItems(),
        goSportsTeam = true,
        dragonball,
        length,
        i;
  • 변수의 할당은 스코프의 시작 부분에서 해주십시오. 이것은 변수 선언과 Hoisting 관련 문제를 해결합니다.

    // bad
    function() {
      test();
      console.log('doing stuff..');
    
      //..other stuff..
    
      var name = getName();
    
      if (name === 'test') {
        return false;
      }
    
      return name;
    }
    
    // good
    function() {
      var name = getName();
    
      test();
      console.log('doing stuff..');
    
      //..other stuff..
    
      if (name === 'test') {
        return false;
      }
    
      return name;
    }
    
    // bad
    function() {
      var name = getName();
    
      if (!arguments.length) {
        return false;
      }
    
      return true;
    }
    
    // good
    function() {
      if (!arguments.length) {
        return false;
      }
    
      var name = getName();
    
      return true;
    }

    [↑]

Hoisting 원문

  • 해당 스코프의 시작 부분에 Hoist된 변수선언은 할당되지 않습니다.

    // (notDefined가 전역 변수에 존재하지 않는다고 가정했을 경우)
    // 이것은 동작하지 않습니다.
    function example() {
      console.log(notDefined); // => throws a ReferenceError
    }
    
    // 그 변수를 참조하는 코드 후에 그 변수를 선언 한 경우
    // 변수가 Hoist된 상태에서 작동합니다.
    // Note : `true`라는 값 자체는 Hoist되지 않습니다.
    function example() {
      console.log(declaredButNotAssigned); // => undefined
      var declaredButNotAssigned = true;
    }
    
    // 인터 프린터는 변수 선언을 스코프의 시작 부분에 Hoist합니다.
    // 위의 예는 다음과 같이 다시 작성할 수 있습니다.
    function example() {
      var declaredButNotAssigned;
      console.log(declaredButNotAssigned); // => undefined
      declaredButNotAssigned = true;
    }
  • 익명 함수의 경우 함수가 할당되기 전에 변수가 Hoist될 수 있습니다.

    function example() {
      console.log(anonymous); // => undefined
    
      anonymous(); // => TypeError anonymous is not a function
    
      var anonymous = function() {
        console.log('anonymous function expression');
      };
    }
  • 명명 된 함수의 경우도 마찬가지로 변수가 Hoist될 수 있습니다. 함수 이름과 함수 본체는 Hoist되지 않습니다.

    function example() {
      console.log(named); // => undefined
    
      named(); // => TypeError named is not a function
    
      superPower(); // => ReferenceError superPower is not defined
    
      var named = function superPower() {
        console.log('Flying');
      };
    }
    
    // 함수이름과 변수이름이 같은 경우에도 같은 일이 일어납니다.
    function example() {
      console.log(named); // => undefined
    
      named(); // => TypeError named is not a function
    
      var named = function named() {
        console.log('named');
      }
    }
  • 함수 선언은 함수이름과 함수본문이 Hoist됩니다.

    function example() {
      superPower(); // => Flying
    
      function superPower() {
        console.log('Flying');
      }
    }
  • 더 자세한 정보는 Ben Cherry의 JavaScript Scoping & Hoisting를 참조하십시오.

    [↑]

Conditional Expressions & Equality(조건식과 등가식)원문

  • == 나 != 보다는 === 와 !== 를 사용해 주십시오
  • 조건식은ToBoolean 메소드에 의해 엄밀하게 비교됩니다. 항상 이 간단한 규칙에 따라 주십시오.

    • Objects 는 true 로 평가됩니다.
    • undefined 는 false 로 평가됩니다.
    • null 는 false 로 평가됩니다.
    • Booleans 는 boolean형의 값 으로 평가됩니다.
    • Numbers 는 true 로 평가됩니다. 하지만 +0, -0, or NaN 의 경우는 false 입니다.
    • Strings 는 true 로 평가됩니다. 하지만 빈문자 '' 의 경우는 false 입니다.
    if ([0]) {
      // true
      // Array는 Object 이므로 true 로 평가됩니다.
    }
  • 짧은형식을 사용하십시오.

    // bad
    if (name !== '') {
      // ...stuff...
    }
    
    // good
    if (name) {
      // ...stuff...
    }
    
    // bad
    if (collection.length > 0) {
      // ...stuff...
    }
    
    // good
    if (collection.length) {
      // ...stuff...
    }
  • 더 자세한 정보는 Angus Croll 의 Truth Equality and JavaScript를 참고해 주십시오.

    [↑]

Blocks 원문

  • 복수행 블록은 중괄호 ({})를 사용하십시오.

    // bad
    if (test)
      return false;
    
    // good
    if (test) return false;
    
    // good
    if (test) {
      return false;
    }
    
    // bad
    function() { return false; }
    
    // good
    function() {
      return false;
    }

    [↑]

Comments 원문

  • 복수행의 코멘트는 /** ... */ 를 사용해 주십시오. 그 안에는 설명과 모든 매개 변수와 반환 값에 대한 형식과 값을 설명합니다.

    // bad
    // make() returns a new element
    // based on the passed in tag name
    //
    // @param <String> tag
    // @return <Element> element
    function make(tag) {
    
      // ...stuff...
    
      return element;
    }
    
    // good
    /**
     * make() returns a new element
     * based on the passed in tag name
     *
     * @param <String> tag
     * @return <Element> element
     */
    function make(tag) {
    
      // ...stuff...
    
      return element;
    }
  • 한 줄 주석에는//를 사용하십시오. 코멘트를 추가하고 싶은 코드의 상단에 작성하십시오. 또한 주석 앞에 빈 줄을 넣어주십시오.

    // bad
    var active = true;  // is current tab
    
    // good
    // is current tab
    var active = true;
    
    // bad
    function getType() {
      console.log('fetching type...');
      // set the default type to 'no type'
      var type = this._type || 'no type';
    
      return type;
    }
    
    // good
    function getType() {
      console.log('fetching type...');
    
      // set the default type to 'no type'
      var type = this._type || 'no type';
    
      return type;
    }
  • 문제를 지적하고 재고를 촉구하거나 문제에 대한 해결책을 제시하는 등 의견의 앞에 FIXME 나TODO를 붙이는 것으로 다른 개발자의 빠른 이해를 도울 수 있습니다. 이러한 어떤 액션을 동반한다는 의미에서 일반 코멘트와는 다릅니다. 액션은 FIXME - 해결책이 필요 또는 TODO - 구현이 필요 입니다.

  • 문제에 대한 코멘트로 // FIXME :를 사용하십시오.

    function Calculator() {
    
      // FIXME: 전역 변수를 사용해서는 안됩니다.
      total = 0;
    
      return this;
    }
  • 문제 해결책에 대한 코멘트로 // TODO :를 사용하십시오.

    function Calculator() {
    
      // TODO: total은 옵션 매개 변수로 설정되어야 함.
      this.total = 0;
      return this;
    }

    [↑]

Whitespace 원문

  • 탭에는 공백 2개를 설정하십시오.

    // bad
    function() {
    ∙∙∙∙var name;
    }
    
    // bad
    function() {
    ∙var name;
    }
    
    // good
    function() {
    ∙∙var name;
    }
  • 중괄호({})의 앞에 공백을 하나 넣어주십시오.

    // bad
    function test(){
      console.log('test');
    }
    
    // good
    function test() {
      console.log('test');
    }
    
    // bad
    dog.set('attr',{
      age: '1 year',
      breed: 'Bernese Mountain Dog'
    });
    
    // good
    dog.set('attr', {
      age: '1 year',
      breed: 'Bernese Mountain Dog'
    });
  • 파일의 마지막에는 빈 줄을 하나 넣어주십시오.

    // bad
    (function(global) {
      // ...stuff...
    })(this);
    // good
    (function(global) {
      // ...stuff...
    })(this);
    
  • 메소드 체인이 길어지는 경우 적절히 들여쓰기(indentation) 하십시오.

    // bad
    $('#items').find('.selected').highlight().end().find('.open').updateCount();
    
    // good
    $('#items')
      .find('.selected')
        .highlight()
        .end()
      .find('.open')
        .updateCount();
    
    // bad
    var leds = stage.selectAll('.led').data(data).enter().append('svg:svg').class('led', true)
        .attr('width',  (radius + margin) * 2).append('svg:g')
        .attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
        .call(tron.led);
    
    // good
    var leds = stage.selectAll('.led')
        .data(data)
      .enter().append('svg:svg')
        .class('led', true)
        .attr('width',  (radius + margin) * 2)
      .append('svg:g')
        .attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
        .call(tron.led);

    [↑]

Commas 원문

  • 선두의 comma는 하지마십시오.

    // bad
    var once
      , upon
      , aTime;
    
    // good
    var once,
        upon,
        aTime;
    
    // bad
    var hero = {
        firstName: 'Bob'
      , lastName: 'Parr'
      , heroName: 'Mr. Incredible'
      , superPower: 'strength'
    };
    
    // good
    var hero = {
      firstName: 'Bob',
      lastName: 'Parr',
      heroName: 'Mr. Incredible',
      superPower: 'strength'
    };

 - 말미의 불필요한 쉼표도 하지 마십시오. 이것은 IE6/7과 quirksmode의 IE9에서 문제를 일으킬 수 있습니다. 또한 ES3의 일부 구현에서 불필요한 쉼표가 있는 경우, 배열 길이를 추가합니다. 이것은 ES5에서 분명해졌습니다.(source):

제 5 판에서는 말미의 불필요한 쉼표가 있는 ArrayInitialiser (배열 초기화 연산자)라도 배열에 길이를 추가하지 않는다는 사실을 명확히하고 있습니다. 이것은 제 3 판에서 의미적인 변경은 아닙니다만, 일부의 구현은 이전부터 이것을 오해하고 있었을지도 모릅니다.

```javascript
// bad
var hero = {
  firstName: 'Kevin',
  lastName: 'Flynn',
};

var heroes = [
  'Batman',
  'Superman',
];

// good
var hero = {
  firstName: 'Kevin',
  lastName: 'Flynn'
};

var heroes = [
  'Batman',
  'Superman'
];
```

**[[↑]](#TOC)**

Semicolons 원문

  • 네!(Yup.)

    // bad
    (function() {
      var name = 'Skywalker'
      return name
    })()
    
    // good
    (function() {
      var name = 'Skywalker';
      return name;
    })();
    
    // good
    ;(function() {
      var name = 'Skywalker';
      return name;
    })();

    [↑]

Type Casting & Coercion(강제) 원문

  • 문의 시작 부분에서 형을 강제합니다.
  • Strings:

    //  => this.reviewScore = 9;
    
    // bad
    var totalScore = this.reviewScore + '';
    
    // good
    var totalScore = '' + this.reviewScore;
    
    // bad
    var totalScore = '' + this.reviewScore + ' total score';
    
    // good
    var totalScore = this.reviewScore + ' total score';
  • 숫자는parseInt를 사용하십시오. 항상 형변환을 위한 기수(radix)를 인수로 전달하십시오.

    var inputValue = '4';
    
    // bad
    var val = new Number(inputValue);
    
    // bad
    var val = +inputValue;
    
    // bad
    var val = inputValue >> 0;
    
    // bad
    var val = parseInt(inputValue);
    
    // good
    var val = Number(inputValue);
    
    // good
    var val = parseInt(inputValue, 10);
  • 어떤 이유에 의해 parseInt 가 병목이 되고, 성능적인 이유로 Bitshift를 사용할 필요가 있을 경우, 하려고 하는것에 대해, why(왜)와 what(무엇)의 설명을 코멘트로 남겨주십시오.

      // good
      /**
       * parseInt가 병목을 일으키므로
       * Bitshift로 문자열을 수치로 강제적으로 변환하는 방법으로
       * 성능을 개선시킵니다.
       */
      var val = inputValue >> 0;
  • Booleans:

    var age = 0;
    
    // bad
    var hasAge = new Boolean(age);
    
    // good
    var hasAge = Boolean(age);
    
    // good
    var hasAge = !!age;

    [↑]

Naming Conventions 원문

  • 한문자 이름은 피하십시오. 이름에서 의도를 읽을 수 있도록 하십시오.

    // bad
    function q() {
      // ...stuff...
    }
    
    // good
    function query() {
      // ..stuff..
    }
  • Object, 함수, 그리고 인스턴스로는 camelCase를 사용하십시오.

    // bad
    var OBJEcttsssss = {};
    var this_is_my_object = {};
    var this-is-my-object = {};
    function c() {};
    var u = new user({
      name: 'Bob Parr'
    });
    
    // good
    var thisIsMyObject = {};
    function thisIsMyFunction() {};
    var user = new User({
      name: 'Bob Parr'
    });
  • Class와 생성자에는 PascalCase를 사용하십시오.

    // bad
    function user(options) {
      this.name = options.name;
    }
    
    var bad = new user({
      name: 'nope'
    });
    
    // good
    function User(options) {
      this.name = options.name;
    }
    
    var good = new User({
      name: 'yup'
    });
  • private 속성 이름은 밑줄 _ 을 사용하십시오.

    // bad
    this.__firstName__ = 'Panda';
    this.firstName_ = 'Panda';
    
    // good
    this._firstName = 'Panda';
  • this의 참조를 저장할 때 _this 를 사용하십시오.

    // bad
    function() {
      var self = this;
      return function() {
        console.log(self);
      };
    }
    
    // bad
    function() {
      var that = this;
      return function() {
        console.log(that);
      };
    }
    
    // good
    function() {
      var _this = this;
      return function() {
        console.log(_this);
      };
    }
  • 함수에 이름을 붙여주십시오. 이것은 stack traces를 추적하기 쉽게하기 때문입니다.

    // bad
    var log = function(msg) {
      console.log(msg);
    };
    
    // good
    var log = function log(msg) {
      console.log(msg);
    };

    [↑]

Accessors 원문

  • 속성을 위한 접근자(Accessor) 함수는 필요 없습니다.
  • 접근자 함수가 필요한 경우 getVal() 이나 setVal('hello') 라고 사용합니다.

    // bad
    dragon.age();
    
    // good
    dragon.getAge();
    
    // bad
    dragon.age(25);
    
    // good
    dragon.setAge(25);
  • 속성이 boolean의 경우 isVal() 이나 hasVal() 라고 사용합니다.

    // bad
    if (!dragon.age()) {
      return false;
    }
    
    // good
    if (!dragon.hasAge()) {
      return false;
    }
  • 일관된다면 get() 이나 set() 이라는 함수를 작성해도 좋습니다.

    function Jedi(options) {
      options || (options = {});
      var lightsaber = options.lightsaber || 'blue';
      this.set('lightsaber', lightsaber);
    }
    
    Jedi.prototype.set = function(key, val) {
      this[key] = val;
    };
    
    Jedi.prototype.get = function(key) {
      return this[key];
    };

    [↑]

Constructors 원문

  • 새 Object에서 프로토타입을 재정의하는 것이 아니라, 프로토타입 객체에 메서드를 추가해 주십시오. 프로토타입을 재정의하면 상속이 불가능합니다. 프로토타입을 리셋하는것으로 베이스 클래스를 재정의 할 수 있습니다.

    function Jedi() {
      console.log('new jedi');
    }
    
    // bad
    Jedi.prototype = {
      fight: function fight() {
        console.log('fighting');
      },
    
      block: function block() {
        console.log('blocking');
      }
    };
    
    // good
    Jedi.prototype.fight = function fight() {
      console.log('fighting');
    };
    
    Jedi.prototype.block = function block() {
      console.log('blocking');
    };
  • 메소드의 반환 값으로 this를 반환함으로써 메소드 체인을 할 수 있습니다.

    // bad
    Jedi.prototype.jump = function() {
      this.jumping = true;
      return true;
    };
    
    Jedi.prototype.setHeight = function(height) {
      this.height = height;
    };
    
    var luke = new Jedi();
    luke.jump(); // => true
    luke.setHeight(20) // => undefined
    
    // good
    Jedi.prototype.jump = function() {
      this.jumping = true;
      return this;
    };
    
    Jedi.prototype.setHeight = function(height) {
      this.height = height;
      return this;
    };
    
    var luke = new Jedi();
    
    luke.jump()
      .setHeight(20);
  • 독자적인 toString()을 만들 수도 있지만 올바르게 작동하는지, 부작용이 없는 것만은 확인해 주십시오.

    function Jedi(options) {
      options || (options = {});
      this.name = options.name || 'no name';
    }
    
    Jedi.prototype.getName = function getName() {
      return this.name;
    };
    
    Jedi.prototype.toString = function toString() {
      return 'Jedi - ' + this.getName();
    };

    [↑]

Events

  • (DOM 이벤트나 Backbone events와 같은 고유의) 이벤트 탑재체(payloads)의 값을 전달하는 경우 원시 값(raw value) 대신 해시 인수(hash)를 전달합니다. 이렇게하는 것으로 나중에 개발자가 이벤트와 관련된 모든 핸들러를 찾아 업데이트 하지 않고 이벤트 탑재체(payloads)에 값을 추가 할 수 있습니다. 예를 들어, 이것 대신 :

    // bad
    $(this).trigger('listingUpdated', listing.id);
    
    ...
    
    $(this).on('listingUpdated', function(e, listingId) {
      // do something with listingId
    });

    이쪽을 선호합니다.:

    // good
    $(this).trigger('listingUpdated', { listingId : listing.id });
    
    ...
    
    $(this).on('listingUpdated', function(e, data) {
      // do something with data.listingId
    });

    [↑]

Modules 원문

  • 모듈의 시작은 ! 로 시작하십시오. 이것은 문말에 세미콜론을 넣는것을 잊은 모듈을 연결할때 런타임 오류가 발생하지 않기 때문입니다.
  • 파일 이름은 camelCase를 사용하여 같은 이름의 폴더에 저장해주십시오. 또한 단독으로 공개할 경우 이름을 일치시켜주십시오.
  • noConflict() 라는 명칭으로 (이름이 겹쳐 덮어 써지기 전의) 모듈을 반환하는 메서드를 추가해주십시오.
  • 항상 모듈의 시작 부분에서'use strict';를 선언해주십시오.

    // fancyInput/fancyInput.js
    
    !function(global) {
      'use strict';
    
      var previousFancyInput = global.FancyInput;
    
      function FancyInput(options) {
        this.options = options || {};
      }
    
      FancyInput.noConflict = function noConflict() {
        global.FancyInput = previousFancyInput;
        return FancyInput;
      };
    
      global.FancyInput = FancyInput;
    }(this);

    [↑]

jQuery 원문

  • jQuery Object의 변수 앞에는 $을 부여해 주십시오.

    // bad
    var sidebar = $('.sidebar');
    
    // good
    var $sidebar = $('.sidebar');
  • jQuery 쿼리결과를 캐시해주십시오.

    // bad
    function setSidebar() {
      $('.sidebar').hide();
    
      // ...stuff...
    
      $('.sidebar').css({
        'background-color': 'pink'
      });
    }
    
    // good
    function setSidebar() {
      var $sidebar = $('.sidebar');
      $sidebar.hide();
    
      // ...stuff...
    
      $sidebar.css({
        'background-color': 'pink'
      });
    }
  • DOM 검색은 Cascading $('.sidebar ul') 이나 parent > child $('.sidebar > ul') 를 사용해주십시오. jsPerf

  • jQuery Object 검색은 스코프가 붙은 find를 사용해주십시오.

    // bad
    $('ul', '.sidebar').hide();
    
    // bad
    $('.sidebar').find('ul').hide();
    
    // good
    $('.sidebar ul').hide();
    
    // good
    $('.sidebar > ul').hide();
    
    // good
    $sidebar.find('ul');

    [↑]

ECMAScript 5 Compatibility 원문

Testing 원문

  • 네!(Yup.)

    function() {
      return true;
    }

    [↑]

Performance 원문

Resources 원문

Read This

Other Styleguides

Other Styles

Further Reading

Books

Blogs

In the Wild

This is a list of organizations that are using this style guide. Send us a pull request or open an issue and we'll add you to the list.

Translation

This style guide is also available in other languages:

The JavaScript Style Guide Guide

Contributors

License

(The MIT License)

Copyright (c) 2012 Airbnb

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

[↑]

};


'JavaScript' 카테고리의 다른 글

object type JSON 변환  (0) 2017.04.09

JAVA 강좌

Posted by
2015. 10. 16. 15:00 Java
이곳은 50001.COM 주인장의 강좌와 주옥같은 JAVA고수님들의 강좌를 모아 놓은 곳입니다.
질문은 Q&A 게시판에 주세요.

들어가는 글 :: "시작하는 JAVA프로그래머를 위해" (특히 비 전공자분들께)
 김상욱의 awt 멀티채팅강좌 :: 
방개설, 귓말/쪽지, 방장기능, 캐릭터 및 글자색 기능, 이미지넣기, 관리자모드, 그림 및 음악 보내기 등 기술분석적 강의 (진행중)
 김상욱의 db 이용한 awt 그래프 출력강좌 :: 
db와 socket을 이용 3-Tier, 스크롤가능 그래프출력 강좌 (1차완료)
 김상욱의 LIVECONNECTION :: 애플릿과 자바스크립트와의 통신강좌 (완료)
 김상욱의 자바툴 강좌 :: Editplus, UltraEditor, Kawa, JCreator 등의 다운로드와 설정 (완료)
 김상욱의 웹스타트(webstart) 강좌 (기본 완료응용 진행중)
 김상욱의 Vector, Hashtable 클래스 성능 실험 외 (완료)
 진은영 (50001.com javaside 시삽) 강사님의 자바 기초강좌 (진행중)
 자바Side(50001.com) 온라인 자바 스터디 1기 채팅 소스 분석 스터디 정리(완료)
 Java Basic
처음 입문하신 분들은 이리로
 J2SE(Core/Desktop)
Java2 Standard Edition. 
애플릿/애플리케이션 등 일반적인 자바 
프로그램을 만들 수 있는 기본 패키지
J2EE(Enterprise/Server)
Java2 Enterprise Edition
엔터프라이즈급 프로그램을 만들 때 
사용하는 패키지.
웹프로그래밍JSP :: servlet ::taglibrary/customtag
웹서비스

웹서비스 
JAXP/JAXR/JAX-RPC

SOAP 
Component

Enterprise JavaBeans(EJB)
Java Message Service(JMS)
기타

application server
Java Data Objects(JDO) 
JavaMail
Transaction(JTA/JTS)
J2EE 기타

J2ME(Mobile/Wireless)
Java2 Micro Edition. 
휴대폰 등에 들어있는 소형 시스템에서 
사용할 프로그램을 만들 수 있는 패키지.

모바일(J2ME)

(강사님별 / 기기별 강좌)

 XMLXML
 IDEIDE
 Other Java Technologies준비중...
 ETC매뉴얼 :: 디자인패턴 :: 객체지향 UML :: 
자바스크립트 :: XP(Extreame Programming):: 기타 


자바기본 (영문튜토리얼)

 박용우님의 자바강좌 :: 자바 전반에 대한 문법 및 도움말 (강추!)
 윤경구의 자바튜토리얼 :: '지나'시리즈로 유명한 저자의 기초~고급
 최종명의 몽땅강좌 :: 기초부터 고수까지
 최희창님의 자바클래스 소개
 Java 전문 용어 이해하기 :: Sun사 문서 (오광신 님 번역)
 원돈희님의 SCJP에 맞춘 자바강좌 :: 시험 유형에 맞춰 헷갈리기 쉬운 부분을 알기쉽게 강의
 Sun의 자바기초강좌 SL275(한글문서) :: 김동학님 제공
 자바 초보자를 위한 강좌 :: javanuri
 corejava [1권] [2권] :: 번역판
 Think In Java 2nd Ed (MS WORD버전)
 자바기초에서 애플릿(바둑,채팅)까지 :: JSTORM
 자바기초(당연히 알아야함에도 불구하고 그냥 지나치기 쉬운) :: JSTORM
 JVM의기본 원리 및 클래스로더의 기초 :: JSTORM
 제네럴 프로그래밍 애플릿에서 웹 서비스까지 [첨부파일] :: 박용우
 GarbageCollection :: 오광신
 JVM의 가비지 컬렉션 (영문) :: IBM
 가비지 컬렉션과 퍼포먼스 (영문) :: IBM
 이것은 무엇의 객체인가 (영문) :: IBM
 추상클래스 :: 자바스터디
 정적 유형 (Static type) (영문) :: IBM
 final 사용 가이드라인 (영문) :: IBM
 자바 속성 [1] [2] [3] [4] :: IBM
 클래스와 클래스 로딩 (영문) :: IBM
 Java Web Start 1.0 개발자 가이드 (번역) :: JSTORM
 자바 네트워크 구동 프로토콜(JNLP)과 참조 구현, 자바 웹 스타트 :: 자바스터디
 JAVA WEBSTART문서 [소스] :: 오광신
 EMPOWER YOUR APPLICATIONS WITH JAVA™ WEB START - Sun사 문서 (오광신 님 번역)
 자바프린팅모델 [1] [2] :: JSTORM
 JDK 1_4의 프린팅 (printing), Part 1_새로운 Java Print Service API :: IBM
 JDK 1_4의 프린팅 (printing), Part 2_프린트 관련 이벤트를 듣고 그래픽을 직접 프린트 :: IBM
 표명(assertion) 기능 이용하기 :: IBM
 J2SE 1_5_Tiger의 미래와 언어 차원의 변화 :: IBM
 숫자와 currency 포맷 (영문) :: IBM
 자바 어플리케이션에서 환경에 접근하기 :: 자바스터디
 쓰레드 풀과 작업 큐(queue) (영문) :: IBM
 쓰레드 보안 (영문) :: IBM
 김세곤님의 클래스패스와 환경 변수, 그것이 알고 싶다. :: 패키지 및 클래스패스설정 총정리
 classpath에 등록안된 클래스의 dynamic reload :: javapattern.info
 Multiprocess JVM Implemetation_1 :: javapattern.info
 Multiprocess JVM Implemetation_2 :: javapattern.info
 native method 정의 및 구현 :: javapattern.info
 StringBuffer class Optimization :: javapattern.info
 Using java debugger :: javapattern.info
 Java 2 레퍼런스 클래스 사용 가이드라인 (영문) :: IBM

애플릿 (영문튜토리얼)

 Dubuilder로 Signed Applet 만들기 [소스] / [MakeRayCab.bat ] :: 오광신
 Explore에서 Signed Applet만들기 :: 오광신
 넷스케이프 브라우저에서의 사인 애플릿 작성 :: 핸디소프트 윤동빈
 네트워크 가위바위보게임(+채팅) [소스] :: 박용우

그래픽(awt,JFC/swing,SWT) (영문튜토리얼)

 AWT와 스윙 [1] [2] :: JSTROM
 스윙(SWING)의 안쪽 탐험 :: JSTORM
 Swinging audio_사용자 인터페이스 향상을 위한 소리 신호 구현하기 :: IBM
 지능형 데이터로 Swing을 간단히!_(iData 기법) :: IBM
 SWT: native 크로스플랫폼 GUI 애플리케이션 만들기 (영문) :: IBM
 Create native, cross-platform GUI applications(GCJ, 리눅스, SWT):: IBM
 Equipping SWT 애플리케이션에 content assistants 추가하기 (영문) :: IBM
 Fullscreen Exclusive Mode 와 draw directly to video RAM(영문) :: IBM
 Java Web Start로 SWT 애플리케이션 전개하기 (영문) :: IBM
 GUI의 접근성 높이기 (영문) :: IBM

자료구조(Collection) (영문튜토리얼)

 콜렉션 개요와 Collection 클래스, MAP, Iterator, Comparator, 콜렉션 알고리즘:: 자바스터디

국제화(한글화) (영문튜토리얼)

네트웍(IO/NET)
 파일과 네트웍 [01] [02] :: JSTORM
 자바 I/O 성능 향상기법 :: JSTORM
 네트웍 코드를 쉽게 테스트 하자 [소스] :: JSTORM
 비 블록 소켓으로 가는 길 (영문) :: IBM
 Merlin으로 자바 플랫폼에 nonblocking 입출력 가능_새롭게 추가된 기능들 :: IBM
 JDK1.4의 New I/O에 대하여 [1] [2] :: 한빛미디어
 스트림 완전히 바꾸기, Part 1 (영문) :: IBM
 스트림 완전히 바꾸기, Part 2 내부 Java IO 최적화 (영문) :: IBM
 자바 네트워킹 강화 (영문) :: IBM
 Java NIO (Ron Hitchens 지음) (영문) :: IBM
 Merlin의 new IO 버퍼의 모든 것 (영문) :: IBM
 NIO Channel :: javapattern.info
 NIO Reactor Pattern의 사용 :: javapattern.info
 PushbackReader의 사용방법과 예제 :: javapattern.info
 Multicast IP address를 이용한 채팅 :: javapattern.info
 Extracting zip or jar file :: javapattern.info
 Servlet과 Applet간의 HTTP 통신_1 :: javapattern.info
 Servlet과 Applet간의 HTTP 통신_2 :: javapattern.info
 Servlet과 Applet간의 HTTP 통신_3 :: javapattern.info
 Servlet과 Applet간의 HTTP 통신_4 :: javapattern.info
 SocketPool Implementation Source code Example_1 :: javapattern.info
 SocketPool Implementation Source code Example_2 :: javapattern.info
 DatagramSocket의 정의 및 샘플 :: javapattern.info
 HttpURLConnection 사용예와 개념 :: javapattern.info
 jNetServer Socket Framework :: javapattern.info
 Lightweight Web Server Implementation :: javapattern.info

분산객체(RMI) (영문튜토리얼)

 Java Distributed Computing Technology :: 자바스터디
 자바 RMI 사용하기
 차승욱님의 RMI강좌 :: 자바스터디
 문영진님의 RMI강좌 :: 자바스터디
 자바에서의 원격객체통신(RMI와 CORBA) :: 윤경구
 RMI의 기초 :: JSTORM 박준용님
 기업에서의 RMI-IIOP_IIOP상에 RMI 실행시키기 :: IBM

IDL(CORBA) (영문튜토리얼)

 JBuilder를 이용한 코바(Corba)프로그래밍 :: Javastudy
 코바와 자바 연동 (PDF) :: Javastudy
 JAVA와 CORBA연동 (PDF) :: Javastudy
 JBuilder에서 코바 프로그래밍 (MS_WORD) :: Javastudy
 코바 이것만을 알고 개발하자!!(PDF) :: Javastudy
 VisiBroker 설치 방법 (코바사랑) :: Javastudy
 비지브로커의 이모저모.. (PDF) :: Javastudy
 IDL에 대해서.. (PDF) 코바사랑 제공 :: Javastudy
 JAVA에서 IDL 매핑 (PDF) 코바사랑 제공:: Javastudy
 콜백 서비스에 대해.. (MS-WORD) 코바사랑 제공 :: Javastudy
 CORBA & Next Generation :: Javastudy

보안(Security) (Security in 1.2 영문튜토리얼)

 Globus Grid Security Infrastructure와 자바 (영문) :: IBM
 JAAS와 JSSE를 이용한 자바 보안 (영문) :: IBM
 대칭암호화알고리즘 소개 및 DES, Blowfish샘플코드 :: javapattern.info
 Java Security Model Evaluation :: javapattern.info
 MD5를 이용한 스트링 변환 :: javapattern.info

JDBC(데이터베이스)
 데이타베이스와 자바(JDBC소개) :: 자바스터디
 JDBC 팁 (영문) :: IBM
 JDBC 쿼리 로깅을 쉽게_고급 PreparedStatement를 사용하여 JCBC 코드에 로깅 추가 :: IBM
 JDBC와 ORACLE :: 자바스터디
 JDBC와 MSQL :: 자바스터디
 Database접속 Pool관리 :: 자바스터디
 JDBC API를 이용한 프로그래밍 강좌 :: http://www.aboutjsp.com
 JDBC 기초 강좌 :: http://cs.sookmyung.ac.kr
 JDBC 다국어 처리법 :: http://www.ejavaschool.com.ne.kr
 JDBC 설정 :: 자바스터디
 PostgreSQL JDBC 활용 :: http://www.junghyun.pe.kr
 자바 초보자를 위한 DB강좌 :: javanuri
 SQL2000 강의자료 :: 김하나님 자료
 Object Pool 패턴을 이용 구현한 JDBC Connection Pool :: JSTORM
 oracle8i JDBC(Oracle 8i 와 Java) :: Javastudy
 Informix 데이터베이스연결 :: javapattern.info
 MySQL JDBC Connection_1 :: javapattern.info
 MySQL JDBC Connection_2 :: javapattern.info
 MySQL JDBC Connection_3 :: javapattern.info
 Java JDBC Performance Tip(1)-Select Speed up! :: javapattern.info
 Java JDBC Performance Tip(2)-Insert, Delete Speed up!.htm :: javapattern.info
 JDBC DataConversion(Using Metadata) :: javapattern.info

JAR (영문튜토리얼)

 JAR 파일 (영문) :: IBM

Extention Mechanism (영문튜토리얼)

2D Graphics (영문튜토리얼)

 2D 애니메이션과 이미지 기반 경로 (영문) - IBM
 롤오버(rollover) 효과를 위한 Java2D 합성 (영문) - IBM

Sound (영문튜토리얼)

JavaBeans (영문튜토리얼)

 자바 빈으로 테트리스 게임의 구성 요소들을 재사용 가능한 컴포넌트로:: IBM
 JavaBeans 컴포넌트와 JSP 기술의 결합 (영문) :: IBM

JNI (영문튜토리얼)

 자바와 C/C++ 연동하기 :: 마이크로소프트웨어
 Java Native Interface(JNI) :: 윤경구
 자바 네이티브 인터페이스로 피어 클래스 사용하기 :: 자바스터디

Reflection (영문튜토리얼)

 reflection (영문) :: IBM
 리플렉션(reflection) 적용하기 (영문) :: IBM

Optional Packages(JMF/JMX/commAPI/3D/JAI/SpeechAPI/Help System etc)

 자바멀티미디어 JMF [01] [02] [03] :: JSTORM
 JavaHelp 소프트웨어로 헬프셋 만들기 :: 자바스터디
 JAVAHELP로 애플리케이션에 도움말 추가하기 :: 자바스터디
 블랙박스에서 엔터프라이즈 까지, JMX 1.1 style (영문) :: IBM
 블랙 박스에서 엔터프라이즈 까지, JMX 1.1 스타일 (영문):: IBM
 블랙박스에서 엔터프라이즈 까지, JMX 통합_JMX Agent를 네트워크 관리 시스템에 연결:: IBM
 자바 애플리케이션에서 USB 장치에 접근하기 (영문) :: IBM

J2SE 기타

 클래스 변형하기 (영문) :: IBM
 보다 나은 HashMap 구현하기 (영문) :: IBM
 변이(mutate)할 것인가 말것인가 (영문) :: IBM
 무한정 progress bars (영문) :: IBM
 다중 스레드 애플리케이션 프로그래밍을 쉽게 구현. Consumer 클래스:: IBM
 안전한 구조 기술 (영문) :: IBM
 자바 애플리케이션에서의 회귀 태스크 스케줄링 (영문) :: IBM
 자바 최적화 기술_자바 애플리케이션의 퍼포먼스 향상을 위한 실질 가이드 :: IBM
 패턴 매칭 :: 자바스터디
 정규식을 위한 추상 자바 API 구현하기_Perl5 regexp 라이브러리를 사용 :: IBM
 새로운 regex 라이브러리를 이용한 문자 시퀀스 파싱하기 (영문) :: IBM
 패키지 의존성 줄이기 (영문) :: IBM
 해시(hash) 해부 (영문) :: IBM
 캐릭터 세트(Character set) (영문) :: IBM
 내 쓰레드는 어디에_서버 애플리케이션에서 쓰레드 유출 피하기 :: IBM
 Preferences API를 사용하여 객체 저장하기 (영문) :: IBM
 SpringLayout 매니저 (gridbagLayout으로 부족할 때)(영문) :: IBM
 String 클래스의 오타(mistyping) 방지하기 (영문) :: IBM
 Shutdown hook클래스 작성방법 및 샘플 :: javapattern.info
 Comparator클래스의 객체비교를 통한 sorting :: javapattern.info
 Deep Copy, Shallow Copy에 관한 Perfomance Test 및 고려사항 :: javapattern.info
 Property Utility Examples_1 :: javapattern.info
 Property Utility Examples_2 :: javapattern.info
 Reflection을 이용한 Value Object비교 :: javapattern.info
 박용우님의 '스노우크래프트'자바강좌 :: 자바스터디

JSP

1.JSP 란? MS의 ASP처럼 java로 구현된 서버 스크립트입니다.

2.프로그램? java.sun.com/products/servlet/index.html

3.매뉴얼? java.sun.com/products/jsp/tags/tags.html

4.자세한 정보 java.sun.com/products/jsp

5.JSP FAQ www.esperanto.org.nz/jsp/jspfaq.html

6.JSP Developer's Guide java.sun.com/products/jsp/docs.html

 JSP강좌 [01] [02] [03] :: JSTORM
 JSP기초JSP이론 [01] [02] [03] [04] [05] [06] [07] :: 자바스터디강좌 by 파란공책
 http://www.jabook.org/jbjsp/jbjsp_20000_0_0.html :: jabook의 JSP강좌 링크
 JSP기초(Java Server Programming 번역일부) :: JSTORM

 INSTALL 

Tomcat4 설치하기 Windows NT/2K/XP, 98/ME :: okjsp

Tomcat4 Apache1.3.22연동 (mod_jk이용) (mod_webapp이용) :: okjsp

Tomcat 가상호스트 설정하기 :: okjsp

Apache 가상호스트 설정하기 ::okjsp

win98+apache+tomcat (win98과 winMe Tomcat 3.2.1, apache 1.3.14) :: okjsp

윈98 + 아파치 + 톰켓 설치 :: kimho.pe.kr

Tomcat 4.0 설치 (Windows 2000) :: kimho.pe.kr

apache + Tomcat설치하기 :: 자바스터디

리눅스에서 Tomcat 4.0 + 아파치 설치 :: kimho.pe.kr

Apache와 Tomcat4.0.1의연동(윈도2000) :: 김성박

Tomcat-apache 연동 :: okjsp

linux + apache + Tomcat설치하기 :: 자바스터디 

Tomcat 3.2의 루트디렉토리 (Tomcat의 기본디렉토리 변경) :: okjsp

Tomcat 4.1의 루트디렉토리 (+ Context 추가) :: okjsp

win2k server + IIS + tomcat 3.2.3 (이미지 캡쳐) :: okjsp

IIS + tomcat 3.2.3 Context추가 (conf/uriworkermap.properties 변경) :: okjsp

IIS에서 자카르타톰캣 돌리기 :: 최종명

oracle 9i + jdbc + tomcat 4.0.3 연동 :: 하이텔 김현규(pasome)

일반계정으로 JSP 돌리기 :: kimho.pe.kr

Tomcat 서비스 설치하기 (NT, Tomcat 3.2.2 ) :: okjsp

win2000+apache+tomcat :: 자바스터디 

win2000+IIS5+Resin (Resin 1.2.1) :: okjsp

resin install :: 자바스터디

Win2000에서 resin설치하기 :: 자바스터디

IIS에서 RESIN설치하기 :: 중앙정보기술 정원희

Resin 루트디렉토리 (Resin 1.2.1 기본디렉토리를 변경) :: okjsp

Apache1.X or 2.X+Resin 2.1.6 installed on Linux or Unix :: javapattern.info

자바 서비스를 위한 리눅스 보안 (영문) :: IBM

 응용

Eclipse 시작하기 :: okjsp

Form study #1 :: okjsp

Tomcat 4 Manager 사용하기 :: okjsp

jsp에서 log() 이용하기 :: okjsp

WAR (Web ARchive jsp로 만든 웹 어플리케이션을 쉽게 배포) :: okjsp

한글처리 (일반적인 한글처리) :: okjsp

한글처리 빈 (빈에서의 한글처리) :: okjsp

useBean :: okjsp

톰켓에서 useBean 사용하기 :: kimho.pe.kr

session bean :: okjsp

bean 활용[1] [2] :: okjsp

FileUpload :: okjsp

JspSmartUpload 설치 :: okjsp

JspSmartUpload F&Q :: okjsp

jsp 에러잡기 :: okjsp

include 집중분석 :: okjsp

수학 내용을 포함하는 동적 웹 사이트 구축하기(JSP 기술과 LateX) :: IBM

패킹(Packing) (영문) :: IBM

The expression language_JSP 애플리케이션용 MA 단순화하기 :: IBM

Echo 웹 프레임웍으로 작업하기 [1] [2] :: IBM

include를 이용한 동적 콘텐트 조작 (영문) :: IBM

JSP 코드로 이미지 관리하기_동적 서블릿 이미지 메이킹을 마음대로! :: IBM

JSP best practices 외부 사이트에서 콘텐트를 가져오는 JSTL 태그 :: IBM

JSTL primer 프리젠테이션 (영문) :: IBM

JSTL을 이용한 JSP 페이지 업데이트 (영문) :: IBM

JSTL 기초 핵심에 접근하기_커스텀 태그를 이용한 플로우 제어와 URL 관리 :: IBM

JSTL 기초, Part 4 SQL과 XML 콘텐트에 접근하기 (영문) :: IBM

JSP best practices 타임 스탬프의 힘_JSP 페이지에 타임 스탬프 만들기 :: IBM

JSP best practices JSP 태그용 커스텀 애트리뷰트 만들기 :: IBM

JSP include 메커니즘으로 “look and feel”을 더욱 좋게 (영문) :: IBM

Struts, Tiles, JavaServer Faces 통합하기 :: IBM

Struts와 Tiles, 컴포넌트 기반의 개발 도우미 (영문) :: IBM

JSP Model 1 vs JSP Model 2 Architecture overview :: javapattern.info

URL Rewriting을 이용한 session tracking_1 :: javapattern.info

URL Rewriting을 이용한 session tracking_2 :: javapattern.info

 [ JSP 기본 강좌 ] (http://www.ihelpers.co.kr)

“안녕하세요. 00 님!!!” 과 JSP 동작원리에 대하여

JSP Comment

JSP Directive

Scripting Elements

iimplicit object
Implicit Object - Request
Implicit Object - Response,Out 
Implicit Object - Session, Application 

공지사항 만들기 (1) (2) (3) (4) (5) 

게시판 만들기 (1) (2) (3) (4) (5)

메일 발송 (1) (2)

 진민님의 JSP 간단 강좌 ( http://myhome.shinbiro.com/~jimmy/ )

1. JSP 강좌1(jsp 기본구성) 

2. JSP 강좌2(get,post처리 및 내장 인스턴트사용) 

3. JSP 강좌3(외부 클래스 사용하는 방법) 

4. JSP 강좌4(JDBC를 사용하는 방법) 

5. JSP 강좌5(Cookie를 사용하는 방법) 

6. JSP 강좌6(session을 사용하는 방법) 

7. JSP 강좌7(session사용시 주의점) 

 김호님의 게시판 만들기 강좌 (http://www.kimho.pe.kr/)

JSP 게시판(방명록) 만들기 (글 내용보기)

JSP 게시판(방명록) 만들기 (글 삭제하기)

JSP 게시판(방명록) 만들기 (글 수정하기)

JSP 게시판(방명록) 만들기 (글 올리기)

JSP 게시판(방명록) 만들기 (리스트 출력하기)

JSP 게시판(방명록) 만들기 (페이징 기법)

JSP 게시판(방명록) 만들기 (또 다른 페이징 기법 1회)

JSP 게시판(방명록) 만들기 (또 다른 페이징 기법 2회)

JSP 게시판(방명록) 만들기 (글 삭제하기)

JSP 게시판(방명록) 만들기 (글 수정하기)

답변형 게시판 만들기 1회 - 답변형 게시판 로직

답변형 게시판 만들기 2회 - 글 올리기

답변형 게시판 만들기 3회 - 글 리스트 보기

답변형 게시판 만들기 4회 - 글 내용 보기

servlet

 http://www.jabook.org/jbjsp/jbjsp_10000_0_0.html :: jabook의 서블릿강좌 링크

 자바 서블릿 프로그래밍 :: 박용우
 자바 서블릿(Java ServletTM) 아키텍처 :: 박용우
 Java Servlets 2.4를 이용한 필터링 (영문) :: IBM
 Servlet API와 NIO 완벽한 결합 (영문) :: IBM
 쿠키에 한글이 들어갈 경우 예제 서블릿 :: javapattern.info
 Making the Http WebServer(Java로 web server를 구현하는 방법)_1:: javapattern.info
 Making the Http WebServer(Java로 web server를 구현하는 방법)_2:: javapattern.info
 Making the Http WebServer(Java로 web server를 구현하는 방법)_3:: javapattern.info
 Servlet2.3 API Filter interface Implementation :: javapattern.info
 Servlet과 Applet간의 TCP_IP 통신_1 :: javapattern.info
 Servlet과 Applet간의 TCP_IP 통신_2 :: javapattern.info
 Servlet의 각종 Listener 사용방법 및 샘플 :: javapattern.info
 Web Tier Java Techonology :: javapattern.info

 INSTALL

JSP의 INSTALL 참고

taglibrary/customtag

 JSP Tag Library 기초강좌 :: okjsp

 커스텀 태그로 JSP 페이지 제어하기_커스텀 태그 라이브러리 통신의 모든 것 :: IBM

 Custom Tag Library (1) (2) (3) (4) (5) (6) :: http://www.ihelpers.co.kr

 커스텀 태그에서의 에러 핸들링 (영문) :: IBM

 JSP 커스텀 태그를 구현하는 다섯 단계 (영문) :: IBM

 InvokeEJB Custom Tag Library implementation_1 :: javapattern.info

 InvokeEJB Custom Tag Library implementation_2 :: javapattern.info

 InvokeEJB Custom Tag Library implementation_3 :: javapattern.info

 Struts 1.1 Tiles-framework에 대한 개요 및 사용방법 :: javapattern.info

 taglib (영문) :: IBM

웹서비스

 웹 티어 클러스터링, Part 1 JavaGroups로 웹 서비스와 애플리케이션 설계 :: IBM

JAXP/JAXR/JAX-RPC

SOAP

 아파치 SOAP 유형 매핑, Part 1 아파치의 직렬화 API 검토하기 :: IBM

 아파치 SOAP 유형 매핑, Part 2 정의된 직렬자와 비직렬자를 작성 :: IBM

Enterprise JavaBeans(EJB)
 J2EE 환경 소개 :: 자바스터디
 오라이온 서버 설치 및 J2EE 애플리케이션 배치 :: 자바스터디
 J2EE 신기술의 해설 :: 자바스터디

 [ EJB 기본문서 ]

Java Enterprise edition tutorial :: SUN

썬 사의 EJB 규약

Enterprise Java Beans란 무엇인가? [01] [02] [03] [04] [05] :: JSTORM

EJB 한글자료 

EJB 실전프로그래밍 (Persistence PowerTier for EJB) :: 자바스터디

Java Enterprise [PDF] :: 김국현님 

EJB 성능향상을 위한 Best Practice [1] [2] :: JSTORM

Writing Enterprise Application [01] [02] [03] [04] [05] [06] [07] :: JSTORM

EJB 디자인 패턴 ↓

 [ EJB 응용 ]

EJB의 트랜잭션 :: JSTORM 박지훈님

J2EE 애플리케이션에서의 XML :: JSTORM 한제택님 

자바 서버상에서 서블렛의 활용 :: 핸디소프트 윤동빈님 

J2EE에서의 작업 스케쥴링 :: JSTORM 윤준호님 

J2EE 신기술 해설 :: 한국오라클(주) 안병문님 

Component Architecture(CORBA, EJB, COM) :: 김국현님 

Grady Report - EJB, Design Pattern, XP 강좌 문서 :: 박현철(hpark@kebi.com) 

이런 J2EE프로젝트는 위험하다 :: JSTORM

LDAP 소개 :: database.sarang.net 부산대학교 컴공과 박근오님 (MS WORD)

분산 관리 솔루션 (영문) :: IBM

상태보존형(stateful) 네트워크용 J2EE (영문) :: IBM

싱글사인온 솔루션 구현 (영문) :: IBM

싱글사인온 GSS-API와 Kerberos 티켓을 사용하여 SSO를 구현 :: IBM

EJB 예외 처리 실전 (영문) :: IBM

타당성검사(Validation) 헬퍼(helper) 클래스_데이터-포맷 타당성 검사에서 코드 중복 없애기 :: IBM

데이터 타당성검사(validation) (영문) :: IBM

동적 delegate_Java reflection을 이용하여 보다 일반적인 business delegate 구현하기 :: IBM

보다 나은 예외 처리 프레임웍 구현하기 (영문) :: IBM

엔터티 빈 보호_Session Facade 패턴으로 데이터를 안전하게 관리하기 :: IBM

Business Delegate 패턴_EJB 디자인에서의 추상 비지니스, 구현, 애플리케이션 로직 :: IBM

delegation의 한계_business delegate의 대안 :: IBM

JNDI의 산업용 최적화 (영문) :: IBM

JNDI 미로 통과하기 (영문) :: IBM

value 객체를 사용하여 RMI 트랜잭션 속도 높이기 (영문) :: IBM

EJB State와 SOAP 헤더 (영문) :: IBM

JavaSpaces로 적응력 있고 광범위한 솔루션 구현하기 (영문) :: IBM

J2EE 1.2에 다중 애플리케이션 전개하기 (영문) :: IBM

J2EE 내부 객체 사용 (영문) :: IBM

J2EE 영속적인 데이터 관리, Part 1 (영문) :: IBM

J2EE 영속적인 데이터 관리, Part 2 (영문) :: IBM

J2EE를 이용한 서비스 지향 아키텍쳐 프레임웍 설계 (영문) :: IBM

stateful 웹 애플리케이션의 구현과 관리 (영문) :: IBM

stateless 네트워크용 J2EE 기술 (영문) :: IBM

Java Message Service(JMS)

 벤더로부터 독립된 JMS 솔루션 구현하기 :: IBM

 메시지 큐잉이 기업 애플리케이션의 유연성과 확장성을 향상시키는 방법:: IBM

 JMS를 이용한 엔터프라이즈 메시징 (영문) :: IBM

application server

 JEUS 기반의 J2EE - from TmaxSoft 
JEUS EJB Server의 관리와 이를 이용한 EJB 개발 (PDF) 
JEUS JTS의 구조와 이를 이용한 개발 (PDF) 
JDBC의 개념과 프로그래밍하는 방법 (PDF) 
XML 소개와 XML APPLICATION 개발 (PDF) 
JEUS JMS의 구조와 이를 이용한 개발 (PDF) 
JEUS JNDI의 구조와 이를 이용한 개발 (PDF) 
WebtoB Web Server의 소개 (PDF)

 HP Netaction Application Server 기반의 J2EE - from Nicstech 
HP Netaction Application Server 설치 방법(WIN 환경) [MS-Word] 
HP Netaction Application Server 설치 방법(UNIX/LINUX 환경) [MS-Word] 
HP Netaction Application Server 에서 웹서버 세팅 방법 [MS-Word] 
HP Netaction Application Server 기반의 JSP, Servlet 개발 방법 [MS-Word] 
HP Netaction Application Server기반에서 EJB사용을 위한 Tutorial[PDF] 
RADPAK 개발툴 사용방법 [MS-Word]

 Ea Server 기반의 J2EE - from Sybase 
EA Server 소개 (PDF) 
EJB-CORBA 개발 (PDF) 
분산어플리케이션 (PDF) 
EAServer & PowerJ Installation Guide (ZIP)

 PowerJ 연재 강좌 (PDF) 
Simple Application | 웹 어플리케이션 | EJB 컴포넌트 작성 | 컴포넌트 사용하기 
완벽한 J2EE Application 구축방법 (PDF)

 javapattern.info 강좌

IBM Webshpere 5.0 의 서버시작, 중지 및 EJB Deploy ANT Build

Web Application Framework개발방법(1)-Framework의 개요

Web Application Framework개발방법(2)-LifeCycle,Controller

Web Application Framework개발방법(3)-View page Composing

Web Application Framework최종 소스 및 인스톨

Weblogic 7에서 JMS Queue Browser 활용 1

Weblogic 7에서 JMS Queue Browser 활용 2

Weblogic EJB Deploy using ANT build

Java Data Objects(JDO)

 Castor JDO 시작하기(영문) :: IBM

 Castor를 이용한 데이터 바인딩 (영문) :: IBM

JavaMail

 JavaMail 설치 :: 자바스터디

 JavaMail 기본설치 :: okjsp

 JavaMail 폼메일 :: okjsp

 JavaMail 파일첨부메일 :: okjsp

 JavaMail 메일링리스트 :: okjsp

 Apache의 James 엔터프라이즈 이메일 서버 (영문) :: IBM

 javapattern의 java WebMail 구현

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]

Transaction(JTA/JTS)

 트랜잭션에 대한 소개_트랜잭션은 신뢰성 있는 애플리케이션을 위한 구성 요소 :: IBM

 장막 뒤의 마법_J2EE 컨테이너가 트랜잭션 관리의 복잡성을 숨기는 방법:: IBM

 보안과 퍼포먼스 균형맞추기_트랜잭션 경계설정과 고립화 가이드라인 :: IBM

 WS-AtomicTransaction과 JTA를 이용한 분산 트랜잭션 (영문) :: IBM

J2EE 기타

 Authenticator클래스를 통한 서버인증 메일전송 :: javapattern.info

 Distributed Transaction Introduce :: javapattern.info

 JRMP, IIOP type의 RMI분산 객체(RMI over IIOP) :: javapattern.info

 MarshalledObject and Deserialization :: javapattern.info

 RMI Peering System Construct :: javapattern.info

 RMI programming, The Lifecycle of server :: javapattern.info

 WebLogic WLSPool Size변경 application :: javapattern.info

모바일(J2ME) :

 J2ME와 mobile device :: 김종원

 핸드폰 단말기용 자바 애플리케이션의 구현 :: 배준현

 네덜란드의 무선 기술 (영문) :: IBM

 모바일 장치 디텍션(detection) (영문) :: IBM

 P2P 네트워크 모바일 디바이스를 JXTA와 Jabber 클라이언트로 전환하기 :: IBM

 기존의 네트워크 경계를 넘어 확장되는 P2P 시스템 설계 :: IBM

 JXTA 2 고성능 P2P 네트워크 (영문) :: IBM

 무선 J2ME 보안 (영문) :: IBM

 EPOC에서 자바 애플리케이션 만들기 (영문) :: IBM

 J2ME 101, Part 3 Record Management System (영문) :: IBM

 J2ME 101, Part 4 Generic Connection Framework (영문) :: IBM

 J2ME 기록 관리 저장 (영문) :: IBM

 J2ME 애플리케이션과 Kerberos, Part 3 (영문) :: IBM

 J2ME를 무선 메시지교환으로 확장하기 (영문) :: IBM

 J2MEMIDP 애플리케이션 보안 (영문) :: IBM

 MIDlets 클래스_모든 J2ME 프로그램의 기반하에 구축하기 :: IBM

 Secrets of the wireless elite Jason Loia (영문) :: IBM

 Secrets of the wireless elite Nancy Lehrer(영문) :: IBM

 J2ME를 이용한 모바일 결제(m-payments)-모바일 장치에서 결제까지 :: IBM

 강사님별 강좌

 배준현님 마소 강의


무선단말을 위한 자바플랫폼 : CLDC/MIDP 
핸드폰에는 나만의 자바 애플리케이션을! 
OSGi로 여는 임베디드 자바 세상

 이경범님 마소 강의

알라딘 기반의 상용만화 애플리케이션 만들자

 김종원님 프세 강의

MIDP를 사용한 휴대폰 프로그래밍
J2MEWTK를 사용한 MIDlet Httpconnection 프로그래밍
SK-Aladdin VM(virtual machine)을 이용한 멀티 플렛폼 채팅 프로그램 작성
&J2ME와 embedded device

 유제정님 모바일 DB 강의

1. 모바일데이터베이스를 이용한 MIDP Sample 프로그램 구현

 김준동님 모바일 강의

소형기기를 위한 프로그래밍 전략

 정성권님 번역 자료

Introduction to Wireless Application Development

 권기경님 번역 자료

Using XML in Wireless Applications
Connected Limited Device Configuration (CLDC) (CLDC API) (KJAVA API)

 권기경님 자료

컴파일에서 사전 검증, 실행까지 
이미지 사용 예제 분석
[번역] Connection Framework


 기기별 강좌

 Mobile Information Device Profile (MIDP) (MIDP-FCS API)
권기경님 자료

컴파일에서 사전 검증, 실행까지 
웹서버에 midp 응용프로그램을 올려 놓고 실행하기 

[번역] 
MIDP Inter-Communication with CGI and Servlets 
HTTP를 사용하는 MIDP Network Programming과 Connection Framework (정창수님번역) 
MIDP GUI Programming Programming the Phone Interface (오용석님번역)
Quick Start Guide: JavaTM 2 Platform Micro Edition, Wireless Toolkit (오광신님 번역)
MIDP Database Programming using RMS: a Persistent Storage for MIDlets (번역)

 PALM Pilot PDA (Palm OS) (PALM API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

 WABA (WabaSoft) (WABA API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

 n.TOP 마법사 (SK Telecom, XCE) (n.TOP 마법사 API) (XCE Tutorial)

박재범님 강의 :: 컴파일에서 실행까지 
마소자료 :: MIDP 소개 | SKT-P 소개 | 게임작성 소개

 EZ-JAVA 핸드폰 (LG Telecom) (EZ-JAVA 영문 API) (EZ-JAVA 한글 API)

권기경님 자료
컴파일에서 사전 검증, 실행까지
실제 폼에서 ez-java 응용프로그램 실행하기

박재범님 자료 :: 이미지 사용 예제 분석

 -MODE 핸드폰 (Nttdocomo) (I-MODE API)

권기경님 자료
컴파일에서 사전 검증, 실행까지 
i모드 Java 확장 API 클래스 라이브러리가 아닌 i-jade를 사용하여 컴파일과 실행까지 

wizardee님 자료 :: iAppli 개발환경 만들기

 iDEN 핸드폰 (Motorola) (CLDC API) (MIDP API

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

 Personal Java 강좌

황제헌님 자료
Personal Java Programming 
Personal Java 한글 encoding 문제 해결

CessHan for Palm-sized PC & PocketPC 설치 방법

KVM에 대한 기본 설명
어플리케이션 사이즈를 줄여주는 Obfuscator
SUN의 Monty 프로젝트 관련 자료
MIDP NG (New Generation) 버젼에 관한 자료 [UI, Games, and Sound] [Security and Networking]
Parsing XML in J2ME MIDP
Introducing Wireless JMS (PDF)

XML
 XML의 기본개요 :: javapattern.info
 XML 정리 (pdf파일)
 XML korean spec :: http://user.chollian.net/~clevekim
 자바와 XML :: JSTROM
 Using XML in Oracle
 XML 게시판 [소스] :: 김미영 님
 XML 과 데이타베이스 :: 박용우
 XSL, XSLT, XPATH [1] [2] [3] [4]:: 전윤경(ygchon@penta.co.kr)
 DOM으로 프로그래밍하자 [1] [2] :: 전윤경(ygchon@penta.co.kr)
 About DOM & DOM Programming with Java :: javapattern.info
 DOM Level 3 Core의 핵심 기능 [1] [2] (영문) :: IBM
 About SAX & SAX programming with Java :: javapattern.info
 SAX 파서 설치하기 (영문) :: IBM
 자바 프로그래밍으로 온라인 XML 데이터 검색하기_XML 파싱 :: IBM
 자바 프로그래밍의 XML-RPC (영문) :: IBM
 자바가 본 XML :: 자바스터디
 Digester와 Lucene을 이용한 XML 파싱, 인덱싱, 검색 (영문) :: IBM
 XML 로 홈페이지 만들기 :: 전윤경(ygchon@penta.co.kr)
 IBM developerWorks XML 아티클 템플릿 (영문) :: IBM
 자바 문서 모델 사용법_상이한 자바 XML 문서 모델들이 작동하는 방식:: IBM
 Schema Infoset Model로 스키마에 대한 복잡한 쿼리를 간단히! :: IBM
 Working XML 경로 컴파일과 테스트 자동화_알고리즘과 JUnit 자세히 살펴보기 :: IBM
 XML 데이터 바인딩, 성능 (영문) :: IBM
 XML 데이터 바인딩, JiBX architecture (영문) :: IBM
 XML 데이터 바인딩, JiBX 사용하기 (영문):: IBM
 About JDOM & JDOM Programming with Java.htm :: javapattern.info
 FOP를 이용한 PDF생성시 한글변환방법 :: javapattern.info
 XML을 이용한 Database Query Manager 구현하기 :: javapattern.info
 XMLBeans를 이용한 xml binding.htm :: javapattern.info

IDE

 JBuilder 5 한글 매뉴얼 (pdf)
 JBuilder 6 한글 매뉴얼
 JBuilder 7 [인스톨] [환경설정](ppt)
 JBuilder 에서 휠마우스 사용
 제이빌더에서 라인넘버 표시
 제이빌더에서 Ant 실행
 제이빌더에서 자바코드 뷰티파이어
 한국 인프라이즈 제공 J 빌더 특강 [ZIP로 내려받기] :: javastudy.co.kr
 Eclipse Platform 시작하기 :: IBM
 Eclipse 플러그인 개발하기_플러그인 구현, 디버그, 설치 :: IBM
 Eclipse 플러그인 서비스 (영문) :: IBM
 Eclipse Workbench 밖에서 Eclipse GUI 사용하기, 간단한 파일 탐색 애플리케이션 :: IBM
 Eclipse Workbench 밖에서 Eclipse GUI 사용하기, 메뉴, 툴바 추가(영문) :: IBM
 Eclipse와 HSQLDB 관계형 데이터베이스를 Eclipse에 임베딩하기, Part 1 (영문) :: IBM
 Eclipse의 자바 개발 툴 확장하기 (영문) :: IBM
 Graphical Editing Framework을 사용하여 Eclipse 기반 애플리케이션 만들기 (영문) :: IBM

매뉴얼
 VisualAgeForJava 3.0 한글 매뉴얼 (pdf)
 WSCP 매뉴얼 (doc) :: 윤성민

디자인패턴
 디자인패턴 실전체험 [1] [2] [3] [4] :: 자바스터디
 기본패턴 Overview :: javapattern.info
 인터페이스! 다시 생각하기 :: 오광신
 Good Java Style :: JSTORM
 Command패턴의 기초 :: JSTORM
 동적으로 자바 어플리케이션 확장하기 :: JSTORM
 DesignPattern for Java [소스] :: JSTORM
 리팩토링(Refactoring)_Eclipse의 자동화 리팩토링 기능 :: IBM
 Double-checked locking과 Singleton 패턴_double-checked locking 이디엄 :: IBM
 반 패턴으로 프로그래밍을 향상시키는 방법 :: IBM

 EBJ 디자인패턴

Session Facade :: JSTORM

EJB Home Factory :: JSTORM

Business Interface :: JSTORM

Dual Persistent Entity Bean :: JSTORM

JDBC for Reading :: JSTORM

Business Delegate :: JSTORM

Data Transfer HashMap :: JSTORM

Data Transfer RowSet :: JSTORM

EJB Command Pattern :: JSTORM

Version Number :: JSTORM

"Dependent Value Object" 와 큰 단위의 BMP 엔티 :: JSTORM

EJB 전략, 팁 그리고 관례 :: JSTORM

Message Facade :: JSTORM

Value Object Factory :: JSTORM

Data Access Command Beans :: JSTORM

Blueprint(J2EE Petstore) client tier pattern overview :: javapattern.info

EJB design performance tips :: javapattern.info 

객체지향 UML
 박용우님의 객체지향형 프로그래밍 :: 자바스터디
 심원도님의 UML강좌 :: 자바스터디
 이준규님의 객체지향형 강좌 :: 자바스터디
 Rational Rose에서 UML을 이용한 모델링 [1] [2] [3] [4] :: 자바스터디
 http://www.jabook.org/jbjava2/jbjava2_10000_0_0.html :: jabook의 객체지향강좌링크

자바스크립트
 자바스크립트 레퍼런스(win help용)
 자바 초보자를 위한 JavaScript 강좌 :: javanuri
 애플릿과의 통신(LIVE CONNECTION)을 위한 netscape.jar

XP(Extreame Programming)
 Extreme Programming 돌아온 XP distilled, Part 1_XP의 진실
 Extreme Programming을 밝힌다 돌아온 XP distilled, Part 2 (영문)
 Extreme Programming을 밝힌다 돌아온 XP distilled, Part 3 (영문)
 Extreme Programming을 밝힌다 진정한 XP 고객_소프트웨어 프로젝트를 운영하는 방법 배우기
 Extreme Programming을 밝힌다 페어 프로그래밍(Pair programming) (영문)
 Extreme Programming Just-in-time 디자인 (영문)
 Extreme Programming Test-driven 프로그래밍_코드를 작성하기 전에 테스트 먼저 작성하기
 Extreme Programming 작업에 맞는 (XP) 툴
 Extreme Programming Just-in-time 디자인 (영문)

기타
 ANT 매뉴얼 [] [] :: http://www.hanbitbook.co.kr
 Apache ANT Guide :: 최지웅
 자바 마이그레이션 :: 하동욱(handan@hitel.net)
 JINI기술과 실제 :: 자바스터디
 고급 객체 직렬화 :: JSTORM
 COM과 자바의 연결 :: 핸디소프트 윤동빈
 PDF와 자바 :: JSTORM 윤준호
 JavaCC를 이용하여 당신만의 언어를 만들자 [소스]:: JSTORM 윤준호
 JavaCC, 파스 트리, XQuery 문법, Part 1 (영문) :: IBM
 JavaCC, 파스 트리, XQuery 문법, Part 2 (영문) :: IBM
 인스턴트 로깅(Instant logging) log4j 활용하기 (영문) :: IBM
 Log4j를 위한 여러가지 환경설정(xml property)_1 :: javapattern.info
 Log4j를 위한 여러가지 환경설정(xml property)_2 :: javapattern.info
 Log4j의 출력방향 전환하기 :: javapattern.info
 Extract unicode from ASCII format text :: javapattern.info
 MP3 File Footer ID3V2 Spec Navigator :: javapattern.info
 객체 보유 (object prevalence) 소개 (영문) :: IBM
 동적 이벤트 리스너 프록시 (영문) :: IBM
 리눅스에 LSID 권한 구현하기 (영문) :: IBM
 매력적인 Jython (영문) :: IBM
 소프트웨어 개발의 미래 (영문) :: IBM
 접근가능성을 위한 코딩 (영문) :: IBM
 쉬운 코드 관리를 위한 디자인 (영문) :: IBM
 영속적인 트레이스 시스템으로 디버깅을 쉽게! (영문) :: IBM
 영역 지향 프로그래밍(Aspect -oriented programming)으로 모듈화 향상시키기(AspectJ) :: IBM
 강결합의 약점을 없앤 AOP (영문) :: IBM
 자바 native 컴파일의 무게 재기_자바 소스에서 native 코드를 생성할 때의 장단점 :: IBM
 자바 프로그래밍에서의 Assertion과 temporal logic (영문) :: IBM
 버그 패턴에 Temporal logic 사용하기 (영문) :: IBM
 콘텐트를 배치하는 새로운 방법 (영문) :: IBM
 플랫폼 의존 gotchas: platform-dependent bug patterns (영문) :: IBM
 AspectJ와 mock 객체를 이용한 유연한 테스팅 :: IBM
 Concurrency made simple util.concurrent package :: IBM
 Concurrent 컬렉션 클래스 (영문) :: IBM
 ContentHandler의 애트리뷰트 (영문) :: IBM
 ContentHandler의 엘리먼트와 텍스트 (영문) :: IBM
 '스팩(specification)'이라는 줄타기를 하다_잘 정의된 스팩의 중요성 :: IBM
 깊이 우선 Visitor와 broken dispatches_Visitor 패턴 변종으로 코드 간결성 향상 :: IBM
 대화식 검사 기능을 제공하는 Repls_소프트웨어를 효과적으로 진단하는 기법 :: IBM
 Run-on Initializer 버그 패턴_인자를 가진 생성자를 피함 :: IBM
 e-business on demand 개발자의 로드맵 (영문) :: IBM
 Eye on performance 객체 레퍼런싱 (영문) :: IBM
 Eye on performance 마이크로 퍼포먼스 벤치마킹 (영문) :: IBM
 Eye on performance 스트레스의 하중 (영문) :: IBM
 Eye on performance 예외에 대한 예외 (영문) :: IBM
 Eye on performance 향상된 개발 프로세스 (영문) :: IBM
 Javassist를 이용한 클래스 변형 (영문) :: IBM
 JML 시작하기_JML 주석으로 자바 프로그램 향상시키기 :: IBM
 peer-to-peer 컴퓨팅의 실제 IP 멀티캐스트 기반의 검색 :: IBM
 1vs순차N구조의 name-value pair DataSet 정의 :: javapattern.info
 코딩지침 :: javapattern.info
 Proxy하에서의 Client IP얻기.htm :: javapattern.info


※ 자료는 서로 공유되어야 합니다. ^_^ 각 강의자료의 저작권은 저작권자에게 있습니다.


'Java' 카테고리의 다른 글

NullPointerException을 예방하는 방법  (0) 2018.02.22

스프링의 웹 요청 처리 흐름

Posted by
2015. 6. 11. 13:30 Spring

스프링은 주로 웹 개발에 사용되는데 스프링의 웹 MVC 참조 설명서나 기타 여러 학습 자료를 보면 다음과 같은 유명한 흐름도를 보게 된다.

Spring 웹 MVC의 요청 처리 흐름도

스프링 웹 MVC의 요청 처리 흐름도

이 그림은 Spring 설명서에서도 밝히고 있지만 Spring뿐 아니라 그동안 여러 웹 프레임웍에서 사용하던 방식이다. (이 그림이 실제 처리 방식이나 프레임웍들간에 꼭 들어맞지는 않는다. 개념적으로 비슷한 사상을 가지고 있다는 것이다.)

모든 사용자의 요청(즉, 웹 URL)을 “프론트 컨트롤러”라는 서블릿 하나가 받아들인 후 URL에 따라 실제 처리를 담당하는 “컨트롤러”로 요청을 넘긴다. 그러면 컨트롤러는 MVC 구조에 따라 업무 로직을 처리한 후 뷰 정보를 만들어내고 사용자에게 뷰를 보여주는 것이다.

Spring에서는 프론트 컨트롤러는 “디스패처 서블릿”이라고 하고 컨트롤러는 “핸들러”라고 한다.

그런데 그 동안 여러 프로젝트들을 진행하면서 디스패처 서블릿과 관련한 동작 항목들이 위 그림에 있는 것보다 참 다양하구나 하는 것을 알게 됐다. 주로 Spring 설명서에 의존해 Spring을 사용했는데 설명 방식으로 이해하는 것보다는 위 그림처럼 좀더 직관적이면서 기억이 쉬운 흐름도를 직접 만들어보는 게 좋을 것 같았다. 그러기 위해서는 디스패처 서블릿의 소스를 읽으면서 어떤 처리 흐름이 있는지 밟아나가야 했다.

그래서 나온 것이 아래 그림이다. 위 그림에서 디스패처 서블릿의 동작을 좀더 자세히 들여다 본 흐름도라고 볼 수 있겠다.

Spring 디스패처 서블릿 처리 흐름도

Spring 디스패처 서블릿 처리 흐름도

말로 풀어 설명하자면 다음과 같다. 사용자의 웹 요청이 URL 매핑에 의해 디스패처서블릿으로 들어오면,

  1.  디스패처서블릿은 핸들러 인터셉터의 preHandle() 메서드를 호출한다. 핸들러 인터셉터는 Spring 사용자가 등록해놓은 사용자정의(custom) 클래스다.
  2. 디스패처서블릿은 URL에 대응하는(매핑된) 핸들러(컨트롤러)의 메서드를 호출해 업무 로직을 처리하게 한다.
  3. 디스패처서블릿은 핸들러 인터셉터의 postHandle() 메서드를 호출한다.
    (1 ~ 3 과정에서 오류(예외)가 발생하면 핸들러 예외 해석기 클래스의 resolveException() 메서드를 호출한다. 핸들러 예외 해석기는 Spring 사용자가 등록해놓은 사용자정의(custom) 클래스다.)
  4. 디스패처서블릿은 뷰를 처리한다. 일반적으로 jsp include 또는 forward나 redirect가 발생하는 단계다.
  5. 디스패처서블릿은 핸들러 인터셉터의 afterCompletion() 메서드를 호출한다.
  6. 디스패처서블릿은 해당 웹 애플리케이션 컨텍스트에 서블릿 요청 처리됐음 이벤트를 발생시킨다


출처: http://start.goodtime.co.kr/

input 의 disabled & readonly

Posted by
2015. 1. 14. 10:39 카테고리 없음

많이 사용하게되는 특정 input disabled & readonly 사용법은 아래와 같이 간단~

 

1. disabled

$("#input_id").attr("disabled", false); -> 비활성화 해제

$("#input_id").attr("disabled", true); -> 비활성화 설정

 

2. readonly

$("#input_id").attr("readonly", false); -> 읽기전용 해제

$("#input_id").attr("readonly", true); -> 읽기전용 설정

 

* 호환성 보기 실행중인 경우 readonly가 제대로 작동되지 않는다. (어이없음)

 

[펌] Examples of Calendaring Expressions

Posted by
2013. 11. 4. 16:13 Oracle

Examples of Calendaring Expressions

 

The following examples illustrate simple repeat intervals. For simplicity, it is assumed that there is no contribution to the evaluation results by the start date.

 

Run every Friday. (All three examples are equivalent.)

FREQ=DAILY; BYDAY=FRI; FREQ=WEEKLY; BYDAY=FRI; FREQ=YEARLY; BYDAY=FRI; 

Run every other Friday.

FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI; 

Run on the last day of every month.

FREQ=MONTHLY; BYMONTHDAY=-1; 

Run on the next to last day of every month.

FREQ=MONTHLY; BYMONTHDAY=-2; 

Run on March 10th. (Both examples are equivalent)

FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10; FREQ=YEARLY; BYDATE=0310; 

Run every 10 days.

FREQ=DAILY; INTERVAL=10; 

Run daily at 4, 5, and 6PM.

FREQ=DAILY; BYHOUR=16,17,18; 

Run on the 15th day of every other month.

FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=15; 

Run on the 29th day of every month.

FREQ=MONTHLY; BYMONTHDAY=29; 

Run on the second Wednesday of each month.

FREQ=MONTHLY; BYDAY=2WED; 

Run on the last Friday of the year.

FREQ=YEARLY; BYDAY=-1FRI; 

Run every 50 hours.

FREQ=HOURLY; INTERVAL=50; 

Run on the last day of every other month.

FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=-1; 

Run hourly for the first three days of every month.

FREQ=HOURLY; BYMONTHDAY=1,2,3; 

Here are some more complex repeat intervals:

Run on the last workday of every month (assuming that workdays are Monday through Friday).

FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; BYSETPOS=-1 

Run on the last workday of every month, excluding company holidays. (This example references an existing named schedule called Company_Holidays.)

FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; EXCLUDE=Company_Holidays; BYSETPOS=-1 

Run at noon every Friday and on company holidays.

FREQ=YEARLY;BYDAY=FRI;BYHOUR=12;INCLUDE=Company_Holidays 

Run on these three holidays: July 4th, Memorial Day, and Labor Day. (This example references three existing named schedules—JUL4, MEM, and LAB—where each defines a single date corresponding to a holiday.)

JUL4,MEM,LAB 
출처 : 클릭