본문 바로가기

ALL

(131)
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);..
8-1) 매개변수가 유효한지 검사하라 매개변수 유효성 검사 // NullPointerException 발생 List nums = Collections.synchronizedList(null); ... 메소드나 생성자의 내부 동작은 정상적인 파라미터가 전달될 것이라는 것을 전제로 한다. 예를 인덱스 값은 음수가 아니고 객체는 null이 아니라는 것이다. 하지만 개발중 실수로 잘못된 값이 전달되지 않을거라는 보장은 없기 때문에 매개변수의 유효성 검사는 필요하다. 그리고 오류를 가능한 빨리 (근본적인 오류가 발생한 곳에서) 잡는것에도 도움이 된다. 위의 코드를 보면 Collections.synchronizedList(null); 메소드를 호출한 시점부터 파라미터 유효성 검사에 걸려서 에러가 발생한다. 하지만 만약 저 에러가 발생하지 않았다면, 멀..
12. 도커 컴포즈: 다중 컨테이너 오케스트레이션 다중 컨테이너 일반적으로 하나의 서비스는 여러 컨테이너로 구성되어있다. 가장 단순한 To-Do 앱을 생각하더라도 사용자가 접속할 화면인 Frontend를 위한 컨테이너, 기능을 수행할 Backend 컨테이너 그리고 데이터를 저장할 database 컨테이너가 필요하다. 그리고 각각의 컨테이너는 상황과 역할에 맞게 컨테이너를 실행해주어야 한다. > docker network create goals-net > docker run -d --rm --name mongo --network goals-net -v goals-mongo:/data/db -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo > docker build ..
기타: Docker commands
11. Docker로 다중 컨테이너 어플리케이션 구축 실습할 어플리케이션 여기 Goals 서비스가 있다. 유저는 목표를 추가할 수 있고, 추가된 목표들이 화면에 나타난다. 그리고 추가된 목표를 클릭하여 삭제할 수도 있다. 이 서비스에는 유저가 접속할 Frontend와 목표를 추가하고 제거하는 API가 있는 Backend, 그리고 목표 데이터를 저장한 Database가 필요하다. 이 각각의 요소들을 다중 컨테이너로 구축해보고자 한다. 컨테이너화 어플리케이션은 Database, Backend, Frontend로 구성되어있고 이를 각각 컨테이너로 구성해야한다. Database는 MongoDB로 구동되고 컨테이너가 중지되어도 저장된 데이터는 유지되어야한다. 그리고 Backend에서만 해당 데이터에 접근할 수 있도록 접근 제한이 되어야 한다. Backend는 Nod..