본문 바로가기

전체 글45

[Item5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 많은 클래스가 하나 이상의 자원에 의존한다. 예를 들어 맞춤법 검사기는 사전에 의존하는데, 이 클래스는 정적 유틸리티 클래스(아이템4)나 싱글턴(아이템3)으로 구현하는 경우가 있다. public interface Lexicon { ... } // Lexicon의 구현체 public class EnglishDictionary implements Lexicon { ... } // 정적 유틸리티 클래스 public class SpellChecker { private static final Lexicon dictionary = new EnglishDictionary(); private SpellChecker() { ... } public static boolean inValid(String word) { ..... 2020. 8. 25.
[Item4] 인스턴스화를 막으려거든 private 생성자를 사용하라. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. 이를 본 사용자는 상속해서 쓰라는 뜻으로 오해 할 수 있으니 더 큰 문제다(아이템 19) private 생성자를 추가하면 클래스의 인스턴스 화를 막을 수 있다. public class UtilityClass{ // 기본 생성자가 만들어 지는 것을 막는다.(인스턴스 방지용) private UtilityClass(){ throw new AssertionError(); } } 꼭 AssertionError을 던질 필요는 없지만, 클래스 안에서 실수로라도 생성자를 호출하지 않도록 해준다. 생성자가.. 2020. 8. 25.
[Item3] private 생성자나 열거 타입으로 싱글턴임을 보장해라 싱글턴 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 예로는 함수(아이템24)와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 싱글턴의 문제점 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 mock 구현으로 대체할 수 없기 때문이다. 싱글턴 생성 방식 싱글턴을 생성하는 방식은 두가지이다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다. 1. public static 멤버가 final인 필드 public class Elv.. 2020. 8. 24.
[Item2] 생성자에 매개변수가 많다면 빌더를 고려하라. 문제점 정적 팩토리 메서드와 생성자에는 선택적 매개변수가 많을 때 적절하게 대응하기 어렵다는 점이있다. 예를 들어 식품 포장의 영양정보를 표현하는 클래스를 생각해보면 1회 내용량, 총 n회 제공량, 1회 제공당 칼로리 등몇개의 필수 항목과 총 지방, 트랜스 지방, 포화지방 등 20가지 넘는 선택 항목으로 이뤄진다. 그런데 대부분 이 선택 항목은 0 이다. 해결책 1. 점층적 생성자 패턴 필수 매개변수만 받는 생성자, 필수 매개 변수와 선택 매개변수 1개를 받는 생성자, 필수 매개 변수와 선택 매개변수 2개까지 받는 생성자 이렇게 점층적으로 늘려가는 방식이다. 그래서 이중에서 필요한 가장 짧은 생성자를 사용하면 된다. NutritionFacts cocaCola = new NutritionFactor(240.. 2020. 8. 17.
[Item1] 생성자 대신 정적 팩토리 메서드를 고려하라 정적 팩토리 메소드 정적 팩토리 메소드란 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드이다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 클래스는 클라이언트에 public 생성자 대신 (혹은 생성자와 함께) 정적 팩토리 메서드를 제공할 수 있다. 이 방식에는 장점과 단점이 있다. 장점 1. 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다. 반면, 정적 팩토리 메서드는 아름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 예를 들어, BigInteger(int, int, Random) 과 BigInteger.prabab.. 2020. 8. 16.
SpringBoot 내장 웹서버 아래의 내용은 inflearn 강좌인 스프링 부트 개념과 활용을 보고 정리한 글입니다. Backgrounds SpringBoot는 Spring과 달리 웹서버에 대한 설정을 따로 해줄 필요가 없다. 그 이유는 바로 스프링부트에서 전에 말한 EnableAutoconfigure을 통해서 미리 내장 웹서버를 설정하기 때문이다. 이번 포스트는 SpringBoot의 내장웹서버에 대해 정리해본다. SpringBoot 내장 웹서버 spring-boot-starter-web dependency에는 자동으로 spring-boot-starter-tomcat을 포함하는데 springboot web은 자동으로 tomcat을 Servlet Container로 사용하고 있다. 이 역시 EnableAutoConfiguration에 .. 2020. 6. 4.