본문 바로가기

STUDY

(102)
2. Docker 이미지와 컨테이너: 이미지 빌드하기, 도커 이미지 주의사항, 도커 이미지 레이어 Dockerfile과 이미지, 컨테이너 앞에서 도커 컨테이너란 어플리케이션 실행파일과 실행에 필요한 시스템 설정, 도구, 패키지를 모두 포함하고 있는 소프트웨어 유닛이라고 말했었다. 이러한 도커 컨테이너를 만들기 위해서는 여러 과정을 거쳐야 한다. 먼저 Dockerfile을 만들어야 한다. Dockerfile은 필요한 리눅스 환경을 만들기 위해 필요한 파일이나 명령어가 정의되어있는 설계서이다. 설계서인 Dockerfile을 빌드하면 도커 이미지가 만들어진다. 도커 이미지는 리눅스 환경에서 동작할 어플리케이션 실행파일과 실행에 필요한 시스템 설정, 도구, 패키지의 묶음 파일이다. 마지막으로 파일 상태인 도커 이미지를 자원을 할당하여 실행시킨것이 컨테이너이다. NodeJS 앱을 도커로 띄워보자 도커로 Nod..
1. 시작하기: Docker란, 환경 세팅, Docker 띄워보기 컨테이너와 도커 구글에 도커를 검색해보면 "리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트"라고 나온다. 여기서 컨테이너란 어플리케이션 실행파일과 실행에 필요한 시스템 설정, 도구, 패키지를 모두 포함하고 있는 소프트웨어 유닛을 말한다. Spring Boot 웹서버를 컨테이너로 실행한다고 하면 여기에는 Spring Boot 실행파일과 Java 실행환경, Nginx 패키지와 설정파일이 모두 포함되어 있을 것이다. 실습 환경 세팅 Docker Desktop을 사용하면 윈도우에서 더욱 쉽고 간편하게 도커를 사용해볼 수 있다. Docker Desktop은 공식 홈페이지(https://docs.docker.com/desktop/install/windows-..
4-6) 추상 클래스보다는 인터페이스를 우선하라 추상 클래스와 인터페이스 자바에서는 코드의 재사용성을 높이기 위해 공통으로 쓰일 수 있는 내용들을 상속해서 사용하도록 추상 클래스나 인터페이스로 정의할 수 있다. 추상 클래와 인터페이스 모두 상속을 위해 만들어진 것으로 그 자체로 인스턴스를 만들 수 없다. 그리고 추상 클래스나 인터페이스에 존재하는 추상 메소드는 상속/구현하는 하위 클래스에서 구현해야 한다. 이 둘은 비슷한 역할을 하고 있지만 차이점도 존재한다. 먼저 추상 클래스는 일반 메소드도 가질 수 있고 멤버 변수도 가질 수 있다. 하지만 단일 추상클래스만을 상속 시킬 수 있다. 인터페이스는 추상 메소드만을 가져야하고 멤버변수를 가질 수 없지만 다중상속을 시킬 수 있다. 인터페이스와 믹스인 정의 // 비교 기능(Comparable)과 반복 기능(I..
4-5) 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 상속을 고려한 문서화 public abstract class AbstractCollection implements Collection { ... /** * {@inheritDoc} * * @implSpec * This implementation iterates over the collection looking for the * specified element. If it finds the element, it removes the element * from the collection using the iterator's remove method. * * Note that this implementation throws an * {@code UnsupportedOperationException} if th..
4-4) 상속보다는 컴포지션을 사용하라 상속 상속은 코드의 재사용성을 올려주고 유연한 개발을 가능하게 해주는 강력한 수단이다. 하지만 상속은 캡슐화를 깨뜨린다는 문제가 있다. 캡슐화는 클래스의 필드와 메소드의 동작방식을 외부에 숨기는 것을 말한다. 이를 통해 클래스와 외부 사용자는 서로에 대한 독립성을 가지고 서로에 대한 영향을 최소화할 수 있다. 하지만 상위 클래스를 상속받은 하위클래스는 상위클래스의 구현방식이 바뀌면 그에 따라 영향을 받는다. public class InstrumentedHashSet extends HashSet { private int addCount = 0; public InstrumentedHashSet() { } public InstrumentedHashSet(int initCap, float loadFactor) ..
4-3) 변경 가능성을 최소화하라 불변 클래스 불변 클래스란 인스턴스 내부 값을 수정할 수 없는 클래스를 말한다. Java에서는 String, BigInteger, BigDecimal 등 여러 클래스가 불변 클래스로 설계되었다. 불변 클래스 방식은 설계 및 구현이 쉽고 사용하기에도 쉽다. 또 오류가 생길 여지도 적어서 훨씬 안전하다. 이러한 장점을 가진 불변 클래스를 만들기 위해서는 다음 다섯가지 규칙을 따르면 된다. 1. 객체의 상태를 변경하는 메소드를 제공하지 않는다. 2. 클래스를 확장할 수 없도록 한다. 3. 모든 필드를 final로 선언한다. 4. 모든 필드를 private로 선언한다. 5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 불변 복소수 클래스 public final class Complex { pri..
4-2) public 클래스에서는 public 필드가 아닌 접근자 메소드를 사용하라 접근자 메소드 // Point 클래스의 x, y 값은 아무곳에서나 접근 가능하고 // 그 결과 x, y에 대한 관리 책임은 Point가 가지고있지 않는다. class Point { public double x; public double y; } 위 Point 클래스는 x, y 좌표를 나타내는 실수형 필드를 가지고 있다. 정말 그뿐이다. 연관된 정보를 모아둔 것 이외의 역할을 하지않는 C언어 시절의 클래스이다. OOP의 철학을 따르는 Java의 개발자라면 이런 퇴보한 클래스는 만들면 안된다. Point 클래스를 만들었다면 x, y 값에 대한 책임도 함께 가지고 있는 클래스를 만들어야 한다. // x, y의 값은 Point 클래스 내부에서만 수정하기때문에 // x, y에 대한 관리책임은 Point 클래스에 ..
4-1) 클래스와 멤버의 접근 권한을 최소화하라 캡슐화(정보 은닉) 잘 만들어진 컴포넌트의 특징 중 하나는 내부 구현 내용을 외부에 잘 숨긴다는 것이다. 외부의 사용자는 내부의 구현에 신경쓰지 않고 컴포넌트를 사용한다. 이는 OOP와 소프트웨어 설계의 기본이 캡슐화(정보 은닉)와 같은 뜻이다. 캡슐화는 내부의 상태나 정보를 외부에서 접근할수 없도록 하여 감추는 것인데, 이렇게 하면 여러 장점을 얻을 수 있다. 1. 시스템 개발 속도를 높인다 > 여러 컴포넌트를 병렬로 개발 할 수 있다. 2. 시스템 관리 비용을 낮춘다 > 디버깅 하기 쉽고, 컴포넌트 교체 부담도 적다. 3. 성능 최적화에 좋다 > 내부 컴포넌트의 코드 수정이 외부 컴포넌트에 주는 영향이 적기 때문에 성능최적화 하기에 좋다. 4. 소프트웨어 재사용성을 높인다 > 캡슐화(정보은닉)을 지킨..