본문 바로가기

개발

Effective Java ( 이펙티브 자바 ) - 아이템 10 ( equals는 일반 규약을 지켜 재정의하라 ) equals는 일반 규약을 지켜 재정의하라 equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어서 자칫하면 끔찍한 결과를 초래한다. 문제를 회피하는 가장 쉬운 길은 아예 재정의하지 않는 것이다. 그냥 두면 그 클래스의 인스턴스는 오직 자기 자신과만 같게 된다. 그러니 다음에서 열거한 상황 중 하나에 해당한다면 재정의하지 않는 것이 최선이다. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스가 여기 해당한다. Thread가 좋은 예로, Object의 equals 메서드는 이러한 클래스에 딱 맞게 구현되었다. 인스턴스의 '논리적 동치성(logical equality)을 검사할 일이 없다. 예컨대 java.util.regex.Pattern은 equ.. 더보기
Effective Java (이펙티브 자바)2장 - 객체 생성과 파괴 이 장은 객체의 생성과 파괴를 다룬다. 객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법, 올바른 객체 생성 방법과 불필요한 생성을 피하는 방법, 제때 파괴됨을 보장하고 파괴 전에 수행해야 할 정리 작업을 관리하는 요령을 알아본다. 아이템 1 - 생성자 대신 정적 팩터리 메서드를 고려하라 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 하지만 모든 프로그래머가 꼭 알아둬야 할 기법이 하나 더 있다. 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. 이 방식에는 장점과 단점이 모두 존재한다. 먼저 장점 다섯 가지를 알아보자. 첫 번째, 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다. 하.. 더보기
클린 코드 - 부록 A 동시성 2 본 챕터에서는 동시성을 좀 더 자세히 설명하고 보완한다. 클라이언트/서버 예제 서버와 클라이언트의 단순한 소켓 프로그래밍 코드를 책에서는 보여주고 있다. 또한, 해당 테스트가 10초 내에 처리가 되는지를 확인하는 테스트코드를 구현하였다. 만약 테스트가 실패한다면? 이벤트 폴링 루프를 구현하면 모를까, 단일 스레드 환경에서 속도를 끌어올릴 방법은 거의 없다. 다중 스레드를 사용하면 성능이 높아질까? 그럴지도 모르지만, 먼저 애플리케이션이 어디서 시간을 보내는지 알아야 한다. 가능성은 크게 아래의 2가지다. I/O - 소켓 사용, 데이터베이스 연결, 가상 메모리 스와핑 기다리기 등에 시간을 보낸다. 프로세서 - 수치 계산, 정규 표현식 처리, 가비지 컬렉션 등에 시간을 보낸다. 대게 시스템은 둘 다 하느라 .. 더보기
docker volume ( 도커 볼륨 ) 도커 볼륨 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장합니다. mysql의 경우 데이터베이스 등의 정보는 컨테이너가 갖고 있는 것입니다. 그렇기때문에, mysql 컨테이너를 삭제하면 컨테이너 계층에 저장돼있던 데이터베이스의 정보도 삭제된다는 점입니다. 이를 방지 하기 위해 컨테이너의 데이터를 영속적(persistent) 데이터로 활용할 수 있는 방법이 몇 가지 있습니다. 그중 가장 활용하기 쉬운 방법이 바로 볼륨을 활용하는 것입니다. 호스트와 볼륨을 공유할 수도 있고, 볼륨 컨테이너를 활용할 수도 있으며, 도커가 관리하는 볼륨을 생성할 수도 있습니다. 호스트 볼륨 공유 우선 mysql , 워드프레스 웹서버 컨테이너를 생성합니다. docker run -d.. 더보기
기본적인 도커 정리 (2) - 외부와의 연결, 네트워크, 웹서버 실습 컨테이너를 외부에 노출 컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받습니다. 기본적으로 172.17.0.x 의 IP를 순차적으로 할당합니다. docker run -i -t --name network_test ubuntu:14.04 ifconfig 명령어를 통하여 컨테이너의 네트워크 인터페이스를 확인할 수 있습니다. 위에서 확인할 수 있듯이, 172.17.0.2 를 할당받았습니다. 아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없고, 호스트에서만 접근할 수 있습니다. 외부에 컨테이너의 어플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 합니다. docker run -i -t --name mywebserver -p 80:80 ubuntu:1.. 더보기
기본적인 docker 명령어 (1) - 실행과 종료 컨테이너 생성 docker run 명령어는 컨테이너를 생성하고 실행하는 역할을 합니다. docker run -i -t ubuntu:14.04 -i, -t 옵션은 컨테이너와 상호 입출력을 가능하게 합니다. -i 옵션으로 상호 입출력을, -t 옵션으로 bash 쉘을 사용하도록 컨테이너를 설정합니다. ubuntu:14.04 이미지가 로컬 도커 엔진에 존재하지 않으면, 도커 허브에서 자동으로 이미지를 내려받습니다. 컨테이너 내부에서 빠져나오는 방법은 컨테이너 쉘에서 exit를 입력하거나, Ctrl + D ( MacOS control + D ) 를 동시에 입력하는 방법이 있습니다. 하지만 이 방법은 컨테이너 내부에서 빠져나오면서 동시에 컨테이너를 정지시킵니다. 하지만, Ctrl + P, Q를 입력하면 단순히 컨테.. 더보기
Mac OS brew를 통하여 docker 설치하기 brew install --cask docker 를 통해서 docker를 받는다. 그 후, application에 들어가면 docker가 생성되어 있을 것이다. 이렇게 생성된 docker를 실행하면 터미널에서 docker를 사용할 수 있게 된다. ( /usb/local/bin/docker 가 생성된다 ) 더보기
클린코드 14장 - 점진적인 개선 이 장은 점진적인 개선을 보여주는 사례 연구다. 우선, 출발은 좋았으나 확장성이 부족했던 모듈을 소개한다. 그런 다음, 모듈을 개선하고 정리하는 단계를 살펴본다. 이 책 14장에서의 예제는, 여기에서 설명하기에 어려운 부분이 있어서, 책을 직접 참고하고 따라가며 학습하는 것이 좋을 것 같다. 이 곳에서는 간략하게만 정리하도록 하겠다. 목록 14-2 ~ 14-7 까지는 완성된 코드를 보여준다. 어떻게 짰느냐고? 깨끗한 코드를 짜려면 먼저 지저분한 코드를 짠 뒤에 정리해야 한다는 의미다. 처음 듣는 이야기가 아니라고 생각한다. 초등학교 시절 선생님들도 작문할 때 초안부터 쓰라고 하셨다. 깔끔한 작품을 내놓으려면 단계적으로 개선해야 한다고 가르치려 애쓰셨다. ( 내 대학원시절 논문들도 그렇게 다듬어졌다 ) 대.. 더보기