본문 바로가기
반응형

SW LAB122

Effective Java : (7) 정적유틸클래스, 싱글턴 대신 의존객체주입 활용 자원을 직접 명시하지말고 의존객체주입을 사용하라 많은 클래스가 하나의 자원에 의존하는 경우가 많습니다. 가령 맞춤법 검사기는 사전 역할의 Dictionary에 의존합니다. 정적 유틸리티 클래스 구현 방식 public class SpellChecker { private static final Lexicon dictionary = ... ; private SpellChecker() { } public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글턴 구현 방식 public class SpellChecker { private final Lexcion dictionary = ..... 2020. 4. 24.
Effective Java : (6) Private 생성자를 사용하는 이유 인스턴스화를 막으려거든 private 생성자를 사용하라 개발을 할 때 정적 메서드와 정적 필드만 담은 클래스를 만들고 싶을 때가 있습니다. 객체지향적 사고는 아니지만 나름대로 쓰임새가 있습니다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있습니다. java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수도 있습니다. final 클래스와 관련한 메서드들을 모아놓을 때도 사용합니다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문입니다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아닙니다. 그러나 생성자를 명시하지 않으면 .. 2020. 4. 24.
Effective Java : (5) Singleton 생성 방식 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어렵습니다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜 구현으로 대체할 수 없기 때문입니다. [1] public static final 필드 방식의 싱글턴의 예 입니다. public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } 위 방식은 INSTANCE를 초기화할 때 딱 한번만 호출됩니다. public, protected 생성자가.. 2020. 4. 24.
MongoDB : Too Many Open File 현상 현재 프로젝트에서 두 대의 서버로 MongoDB의 ReplicaSet를 구성하였습니다. 그런데, 운영 중 서버B에서 동작중인 RS1 Secondary가 죽기도 하고 .. 서버A에서 동작중인 RS1 Primary가 죽기도 하는 현상이 간헐적으로 발생하였습니다. MongoDB 로그를 분석 중, 여러 에러 코드가 있었지만 Too many file opens와 함께 Prefix로 [Error] 를 발견하였습니다. 우선 1차적인 조치로 이 것을 해결하기 위해 살펴보던 중 Linux에서 허용하는 open files가 4096으로 되어 있는 것을 보았습니다. 우선 이 값을 최대치로 높여주기 위핸 조치를 취했습니다. ulimit -a 로 현재 시스템에서의 수치 확인 ... open files 4096 max user .. 2020. 4. 24.
Effective Java : (4) Builder Pattern 정적 팩터리와 생성자에는 똑같은 제약이 있습니다. 선택적 매개변수가 많을 때 적절하게 대응하기가 어렵다는 점입니다. 첫 번째 대안으로, 점층적 생성자 패턴(telescoping constructior pattern)을 주로 사용하게 됩니다. 그러나 매개변수가 많고, 인자로 전달하기 원치 않는 변수가 있을 때 혼란을 초래합니다. 다음과 같이 어떤 한 생성자를 선택하여 객체를 생성했다고 봅시다. NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27); 네 번째 인자는 지방을 의미하는 인자를 전달해야하는데, 굳이 전달 할 필요가 없지만 0을 전달하였습니다. 또한, 각 매개변수가 어떤 것을 뜻하는지 한 눈에 파악하기 어렵습니다. 두 번째 대안으.. 2020. 4. 24.
Effective Java : (3) Construction Injection 의존성을 주입할 때, Field Injection을 권장하고 있지 않습니다. 대신 Construction Injection을 권장합니다. 또한, IntelliJ에서 Field Injection은 Warnning으로 감지합니다. public class Testclass { @Autowired // -> Warnning 발생 private ClassName claseVariable; public Testclass() { } } 단일 책임의 원칙 Field Injection은 의존성을 주입하기 쉽습니다. @Autowired Annotation만 선언하면 여러 개의 변수를 쉽게 나열할 수 있습니다. Constrction Injection을 사용하면 생성자에 파라미터가 많다는 것을 느끼고, 리팩토링을 자연스럽게 .. 2020. 4. 24.
반응형