Visual Studio Code로 Java 프로그래밍을 할 때, 주석이나 JavaDoc 처리 주석 내에 TODO List를 작성하는 경우에는 하단에 Problem에 문제가 발생했다는 표시가 뜹니다.

이에 대한 해결책으로는 [TODO Parser] Extension을 설치하면 해결할 수 있습니다.

그리고 TODO, FIXME, ANCHOR, REVIEW 등의 키워드를 Highlight해주는 Extension으로는
여러 가지 중에 Comment Anchors Extension이 그래도 가장 마음에 드네요.

Visual Studio Code를 사용하여 프로그래밍하면서 하나하나 알아가며 정리하는 것도 나중을 위해서는 많은 도움이 될 듯 합니다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/841

Windows 10 환경에서 vscode를 설치하고, OpenJDK 1.8을 설치했습니다.
그리고 JAVA_HOME 설정을 한 후, Maven을 설치하고 Path를 추가했습니다.

vscode에서 maven 프로젝트를 archetype-quickstart로 생성하고 프로그램을 작성한 후, 테스트를 해보고 싶었습니다.
그런데 한가지 오류와 2가지 경고(!) 메세지가 떴습니다.
정확하지는 않지만, 다음과 같았던 것 같습니다.

<오류>
새로 추가된 Java Class에 package 명을 적을 때, package root가 다르다.
<경고>
1. Build Path에 설정된 것은 JavaSE 1.7이다. 올바르게 설정해라.
2. Compiler가 1.7을 사용하도록 설정되어 있는데, 실제로는 jre 1.8을 사용했다.
다음과 같이 해결했습니다.

<오류>
vscode의 메뉴에서 File > Add Folder to Workspace 에서 프로젝트 Root Folder를 선택.
(workspaces 폴더 아래에 myProject 폴더가 있는 경우, myProject 폴더를 Root Folder로 선택)

<경고>
1. Build Path 관련
.classpath 파일에서 JavaSE 버전 변경
사용자 삽입 이미지

2. Compiler 버전 관련
org.eclipse.jdt.core.prefs 파일 내 컴파일러 버전 변경
사용자 삽입 이미지



받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/840

일반적으로 Java 개발할 때, eclipse나 IntelliJ를 사용했는데, 이번에 Visual Studio Code를 사용해 보기로 했습니다.

항상 새로운 도구를 사용하게 되면, 그 도구의 사용법을 습득하는데 많은 노력을 기울이게 됩니다.
이번에 윈도우 10 기반, OpenJDK를 사용하여 Maven Project를 생성하는 과정을 정리해 보았습니다.

Visual Studio Code를 통해 Maven Project 실행하기

01. JDK 설치
Oracle에서 제공하는 JDK SE가 유료화됨에 따라 OpenJDK를 이용
Windows 버전은 https://github.com/ojdkbuild/ojdkbuild 에서 설치 파일 다운로드
설치 후, JAVA_HOME, Path 설정 및 확인
02. Maven 설치
https://maven.apache.org/download.cgi 에서 최신 버전 다운로드 (2019.03.13 기준 apache-maven-3.6.0)
압축 해제 후 Maven Home, Path 설정
03. Visual Studio Code 설정
1) Visual Studio Code에 Java 개발 환경 설정을 위한 Extension 선택
사용자 삽입 이미지
2) 'java extension pack' 검색 후 설치
사용자 삽입 이미지

3) vscode의 Settings 선택
사용자 삽입 이미지

4) Json 설정 파일 Open 선택
사용자 삽입 이미지

5) Java Home과 Maven Path 설정
사용자 삽입 이미지

04. Maven Project 생성
1) 프로젝트를 생성하고자 하는 위치에 workspaces 폴더 생성
사용자 삽입 이미지

2) VS Code의 File -> Open Folder에서 workspaces 폴더 선택
사용자 삽입 이미지

3) WORKSPACES 창에서 마우스 오른쪽 클릭 후, Maven Project 생성
사용자 삽입 이미지

4) 검색 창에서 maven-archetype-archetype 선택
사용자 삽입 이미지

5) Default Project Destination Folder Setting
사용자 삽입 이미지
사용자 삽입 이미지

6) 하단의 command 창에서 groupId, artifactId, version, package 등 프로젝트 정보 입력
사용자 삽입 이미지

7) 입력한 정보로 Maven Project 생성 완료
사용자 삽입 이미지
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/838

Windows에서 OpenJDK 사용

Articles 2019/03/13 13:39 용비
오라클에서 Sun을 인수한 이후, JDK 유료화 정책으로 인해 Java 프로그래밍을 하는 세상에 지각 변동이 일어났습니다.

리눅스에서는 이전부터 OpenJDK를 사용하였는데, Windows에서도 사용할 수 있도록 오픈되었네요.

https://github.com/ojdkbuild/ojdkbuild

앞으로는 OpenJDK를 사용해야 할 듯...
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/837

Java Singleton Class

Articles 2019/03/11 21:45 용비
일반적으로, 메모리에 하나의 Instance만 로딩되도록 해야 하는 경우 Singleton Pattern을 적용한 Singleton Class를 사용한다.

하지만, 대용량의 트래픽이 발생하는 Concurrent Request 환경에서는 하나의 Request가 곧 하나의 Thread를 실행하게 된다. 그런 경우, Singleton Class는 Thread-Safe하지 않게 될 수 있다.

원치 않게 각 요청에 따른 올바른 Response를 주지 못하고, 데이터가 꼬여 다른 결과를 리턴하게 되는 치명적인 결과가 초래될 수 있다.

모든 경우와 같이, Singleton Class를 제공하는 경우에도 다음과 같은 고려가 필요하다.

- 동시에 여러 개의 요청이 오더라도 순서대로 처리할 수 있어야 한다.
- 최대한의 성능을 고려해야 한다.
- 여러 요청으로 인해 병목이 발생하더라도 다른 작업을 처리하고 있는 Thread에 영향을 최소화해야 하고, 프로그램이 종료되지 않아야 한다.

Singleton Class 구현 방법은 다음과 같은 방법으로 생각해 볼 수 있다.

<1> Eager Initialization
package com.dev.sample

public class EagerInitSingleton {

private static final EagerInitSingleton = new EagerInitSingleton();
private EagerInitSingleton () {}

public static EagerInitSingleton getInstance() {
return instance;
}
}
Class Loading 시점에 Singleton Class Instance가 생성된다. 가장 쉽게 Signleton Class를 생성하는 방법이지만, Client에서 요청이 없을 때에도 항상 생성되므로 불필요한 리소스를 사용하게 된다. 또한 대부분 파일 시스템이나 데이터베이스에 접속하는 경우 Singleton Class를 사용하는데 Exception을 처리할 수 없다.

<2> Static Block Initialization
package com.dev.sample

public class StaticBlockSingleton {

private static StaticBlockSingleton instance;

private StaticBlockSingleton () {}

static {
try {
instance = new StaticBlockSingleton();
}
catch (Exception e) {
throw new RuntimeException(e.printStackTrace());
}
}

public static StaticBlockSingleton getInstance() {
return instance;
}
}
Static Block은 Eager Initialization Singleton과 비슷하게 Class Loading 시점에 Static Block 안에서 Singleton 객체가 생성되지만, Exception을 처리할 수 있다. 하지만, 동일한 단점을 가지고 있다.

<3> Lazy Initialization
package com.dev.sample

public class LazyInitSingleton {

private static LazyInitSingleton instance;

private LazyInitSingleton() {}

public static LazyInitSingleton getInstance() {

if (instance == null) {
instance = new LazyInitSingleton();
}

return instance;
}
}
Single Thread 환경에서 잘 동작한다. 하지만, 동시에 여러 개의 Thread가 접근할 경우 여러 개의 Instance가 생성될 수 있다. 그런 경우 Singleton Pattern이 깨지고, 서로 다른 Singleton Instance를 사용하게 될 수 있다.

<4> Thread-Safe Singleton
package com.dev.sample

public class ThreadSafeSingleton {

private static ThreadSafeSingleton instance;

private ThreadSafeSingleton() {}

public static synchronized ThreadSafeSinfleton getInstance() {

if (instance == null) {
instance = new ThreadSafeSingleton();
}

return instance;
}
}
synchronized 키워드를 사용하여 한번에 하나의 Thread만 호출할 수 있도록 만들 수 있다. 하지만 모든 Thread의 요청에 대해 synchronized를 실행하므로 성능상 오버헤드가 발생한다.

<5> Double Checked Thread-Safe Singleton
package com.dev.sample

public class DoubleCheckThreadSafeSingleton {

private static DoubleCheckThreadSafeSingleton instance;

private DoubleCheckThreadSafeSingleton() {}

public static DoubleCheckThreadSafeSingleton getInstance() {

if(instance == null) {
synchronized (DoubleCheckThreadSafeSingleton.class) {
if (instance == null) {
instance = new DoubleCheckThreadSafeSingleton();
}
}
}

return instance;
}
}
위와 같은 Double Checked Locking 원리를 이용하면, 조건을 만족시키는 경우 (instance == null) 한 번만 synchronized block이 실행되므로 하나의 Singleton Class Instance만 생성된다. synchronized로 인한 성능 이슈를 해소할 수 있다.

<6> On-demand Holder Idiom에 따른 Inner Class(holder or helper class)를 이용한 Singleton
package com.dev.sample

public class HelperSingleton {

private HelperSingleton() {}

private static class SingletonHelper {
private static final HelperSingleton instance = new HelperSingleton();
}

public static HelperSingleton getInstance() {
return SingletonHelper.instance;
}
}
getInstance() method를 호출 할 때, SingletonHelper 클래스가 생성되고 Singleton intance는 static final 키워드로 인해 한번만 생성된다. 대부분 <6>번의 경우를 많이 사용한다.







받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/836