본문 바로가기

ALL

(128)
9-10) 네이티브 메소드는 신중히 사용하라 자바 네이티브 인터페이스(JNI) 자바 네이티브 인터페이스는 자바 프로그램이 C/C++ 같은 네이티브 언어로 작성된 프로그램을 호출하는 기술이다. JNI는 플랫폼 특화 기술을 활용 하거나, 네이티브 언어로 작성된 기존 라이브러리를 사용하거나, 성능 개선을 하고 싶을때 사용한다. 하지만 자바가 성숙해가면서 플랫폼의 기능들을 점차 흡수하고 있고, 자바로 작성된 라이브러리의 수도 상당히 늘어났다. 또 JVM이 발전하면서 자바의 성능도 상당부분 개선이 되었기 때문에 네이티브 메소드를 사용해야하는 상황은 흔치않다. JNI 실습 // JNI.java public class JNI { static { System.loadLibrary("JNI"); } private native void printHelloWorld(..
9-9) 리플렉션보다는 인터페이스를 사용하라 자바 리플렉션 // effectivejava 패키지에 선언된 Person 클래스 package effectivejava; public class Person { private int age; private String name; public Person(int age, String name) { super(); this.age = age; this.name = name; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } } // 다른 .java 파일의 main 코드 Class personClass = Class.forName("effectivejava.Person"); for(Field..
15. 도커 배포 프로세스: AWS ECS 활용1 EC2를 활용한 배포의 단점 앞서 해본 EC2를 활용한 도커 배포는 여러가지 단점이 있다. 먼저 서비스에 수정사항이 있다고 생각해보자. 먼저 로컬에서 소스를 수정하고 새로 이미지를 빌드한다. 그리고 새로운 이미지를 도커 허브에 업로드 한다. 이제 EC2 인스턴스로 이동하여 업로드된 이미지를 다시 가져오고, 컨테이너를 재시작 하면 서비스 수정이 완료된다. 이처럼 로컬과 EC2 인스턴스를 이동하며 작업을 진행해야하는 번거로움이 있다. 그리고 컨테이너가 EC2 인스턴스에서 실행되기 때문에, 해당 EC2 인스턴스를 생성하고 설정 및 관리하는 역할까지 수행해야한다. AWS ECS AWS ECS란 AWS에서 제공하는 완전관리형 컨테이너 배포 및 관리 서비스이다. EC2를 사용할 때는 컨테이너 및 서버를 관리하는 것..
14. 도커 배포 프로세스: AWS EC2 활용 NodeJS App 배포해보기 위와같이 단순한 화면을 출력하는 NodeJS 앱을 도커로 배포해보려고한다. 먼저 개발환경(로컬)에서 소스를 바탕으로 도커 이미지를 빌드하고 그 이미지를 도커 이미지 레지스트리(도커 허브)에 업로드 할 것이다. 그리고 배포환경(EC2)에서 해당 이미지를 가져오고 컨테이너를 실행하여 사용자에게 서비스를 제공하는 것을 목표로 한다. 이미지 생성 및 업로드 도커 배포를 위해서는 도커 이미지 레지스트리에 이미지를 업로드 해야 한다. 이를 위해서 도커 허브에 my-nodejs-app 이름의 이미지 레포지토리를 생성하였다. // .dockerignore 파일 node_modules Dockerfile > docker build -t my-nodejs-app . > docker tag m..
13. 유틸리티 컨테이너 어플리케이션 컨테이너 VS 유틸리티 컨테이너 우리가 지금까지 만들어온 컨테이너는 일반적인 어플리케이션 컨테이너이다. 어플리케이션 컨테이너는 실행환경와 어플리케이션을 모두 포함하고 있고 그 어플리케이션을 실행하기 위해 존재한다. 그에 반해 유틸리티 컨테이너는 실행환경만 포함하고 있다. 즉 nodejs, jdk 등 실행환경은 있으나 실제 동작시킬 앱은 없다는 말이다. 그렇다면 유틸리티 컨테이너는 왜 필요한 걸까? 여러 어플리케이션을 개발하다보면 여러 개발환경을 세팅하느라 번거로운 경우가 많다. 심지어 같은 nodejs라도 다른 버젼으로 다시 설치해야 하는 경우도 있다. 이때 유틸리티 컨테이너를 사용하면, 로컬에 환경을 세팅할 필요 없이 유틸리티 컨테이너를 통해 해당 환경이 세팅된것처럼 명령어를 사용할 수 있..
8-4) 메소드 오버로딩은 신중히 사용하라 Collection 분류기 public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List lst) { return "List"; } public static String classify(Collection c) { return "Unknown Collection"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Collection c : collecti..
8-3) 메소드 시그니처를 신중히 설계하라 메소드 시그니처 private String myFunc(Integer num) { ... } // 메소드 시그니처가 다르기때문에 컴파일 에러가 발생하지 않는다. public final Integer myFunc(String str) { ... } private String myFunc(Integer num) { ... } // 공개범위, final 키워드, 반환 타입이 다르지만 중복된 메소드로 컴파일 에러가 발생한다. public final Integer myFunc(Integer num) { ... } 메소드 시그니처란 메소드의 고유성을 나타내는 요소들을 말한다. 메소드 시그니쳐가 동일한 메소드는 중복된 메소드를 만드는 것이기 때문에 컴파일 에러가 발생한다. 언어마다 다르지만 자바에서는 메소드 명과 파..
8-2) 방어적 복사본을 만들라 자바는 안전한 언어다 int nums1[4] = {1,2,3,4}; int nums2[4] = {5,6,7,8}; // 5 출력 std::cout 0) throw new IllegalArgumentException( this.start + " after " + this.end); } public Date start() { return new Date(start.getTime()); } public Date end() { return new Date(end.getTime()); } } // 이제 Period에 사용된 Date 객체의 값이 바뀌어도 영향이 없다. Date start = new Date(); Date end = new Date(); Period p = new Period(start, end);..