전체 글50 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 의존 객체 주입이란 인스턴스를 생성할 때 필요한 자원을 넘겨주는 방식이다. 이 방식의 변형으로 생성자에 자원 팩터리를 넘겨줄 수 있다. 의존 객체 주입을 사용하면 클래스의 유연성, 재사용성, 테스트 용이성을 개선할 수 있다. 완벽 공략 팩터리 메소드 패턴 구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정한다. 2022.01.04 - [GoF의 디자인 패턴] - 팩토리 메소드(Factory method) 패턴 스프링 IoC Inversion of Control 자기 코드에 대한 제어권을 자기 자신이 가지고 있지 않고 위부에서 제어하는 경우 제어권: 인스턴스를 만들거나, 어떤 메소드를 실행하거나, 필요로하.. 2022. 7. 17. 4장. 실용주의 편집증 오늘 읽은 범위 4장. 실용주의 편집증 기억하고 싶은 내용 여러분은 완벽한 소프트웨어를 만들 수 없다. Topic 23. 계약에 의한 설계 DBC(Degign By Contract) 선행 조건: 루틴이 호출되기 위해 참이어야 하는 것 후행 조건: 루틴이 자기가 할 것이라고 보장하는 것 클래스 불변식: 호출자의 입장에서 볼 때는 이 조건이 언제나 참인 것을 클래스가 보장하는 것 계약으로 설계하라. DBC 구현 코드를 작성하기 전에 유효한 입력 범위가 무엇인지, 경계 조건이 무엇인지, 루틴이 뭘 전달한다고 약속하는지, 혹은 더 중요하게는 무엇을 약속하지 않는지 등을 나열하는 것만으로도 더 나은 소프트웨어를 작성하는 데에 엄청난 도움이 된다. DBC와 일찍 멈추기 DBC 방식을 하용하여 선행 조건과 후행 조건.. 2022. 5. 19. 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. 생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다. 상속을 방지할 때도 같은 방법을 사용할 수 있다. public class UtilityClass { // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용) private UtilityClass() { throw new AssertionError(); } } 2022. 5. 17. 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(ingleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. private 생성자 + public static final 필드 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } } 장점 간결하고 싱글턴임을 API에 드러낼 수 있다. 단점 싱글턴을 사용하는 클라이언트가 테스트하기 어려워진다. 리플렉션으로 private 생성자를 호출할 수 있다. 역직렬화 할 때 새로운 인스턴스가 생길 수 있다. private 생성자 + 정적 팩터리 메서드 public class Elvis { private static final Elvis INSTANCE = new Elvis(); pri.. 2022. 5. 16. 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안 점층적 생성자 패턴(생성자 체이닝) 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수를 1개에서 전부 다 받는 생성자까지 늘려가는 방식이다. 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. public class NutritionFacts { private int servingSize; private int servings; private int calories; private int fat; private int sodium; private int carbohydrate; public NutritionFacts(int servingSize, int servings) {.. 2022. 4. 21. 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자이지만, 정적 팩터리 매서드(static factory method)를 제공하는 방법도 있다 정적 팩터리 메서드는 디자인 패턴에서의 팩터리 메서드(Factory Method)와 다르다. 디자인 패턴 중에는 이와 일치하는 패턴은 없다. 장점 1: 이름을 가질 수 있다 정적 팩터리 메서드는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 시그니처가 같은 생성자는 여러 개 만들 수 없으므로, 필요하다면 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자. // 생성자: 반환될 객체의 특성 불분명 BigInteger bigInteger1 = new BigInteger(3, 1, new Random()); /.. 2022. 4. 5. OSIV와 성능 최적화 OSIV란 하이버네이트: Open Session In View JPA: Open EntityManager In View OSIV ON spring.jpa.open-in-view : true (기본값) 동작 원리 클라이언트의 요청이 들어오면 영속성 컨텍스트를 생성한다. 이때 트랜잭션은 시작하지 않는다. 서비스 계증에서 트랜잭션을 시작하면 생성해둔 영속성 컨텍스트에 트랜잭션을 시작한다. 비즈니스 로직을 실행하고 서비스 계층이 끝나면 트랜잭션을 커밋하면서 영속성 컨텍스트를 플러시한다. 이때 트랜잭션만 종료하고 영속성 컨텍스트는 살려둔다. 클라이언트의 요청이 끝날 때 영속성 컨텍스트를 종료한다. 장점 영속성 컨텍스트가 유지되지 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능하다. 단점 .. 2022. 3. 25. 3장. 기본 도구 오늘 읽은 범위 3장. 기본 도구 기억하고 싶은 내용 Topic 16. 일반 텍스트의 힘 우리는 지식을 설계와 구현, 테스트, 문서로 표현하며, 지식을 저장하는 최고의 포맷이 일반 텍스트(plain text)라고 믿는다. 지식을 일반 텍스트로 저장하라. 지원 중단에 대한 보험 사람이 읽을 수 있는 형태의 데이터와 그 자체만으로 의미가 드러나는 데이터는 다른 어떤 형태의 데이터보다 더 오래 살아남을 것이다. 기존 도구의 활용 버전 관리 시스템에서 일반 텍스트를 보존해 줄 것이다. Topic 17. 셸 가지고 놀자 텍스트 파일을 다루는 프로그래머에겐 명령어 셸이 작업대이다. 명령어 셸의 힘을 사용하라 자신만의 셸 색깔 조함 설정 프롬프트 설정 별칭(alias)과 셸 함수 명령어 자동 완성 Topic 18. .. 2022. 3. 23. 2장. 실용주의 접근법 오늘 읽은 범위 2장. 실용주의 접근법 기억하고 싶은 내용 좋은 설계는 나쁜 설계보다 바꾸기 쉽다. 결합도를 줄이는 이유: 관심사를 분리함으로써 각각이 더 바꾸기 쉬워지기 때문이다. 단일 책임 원칙: 요구 사항이 바뀌더라도 모듈 하나만 바꿔서 반영할 수 있기 때문이다. 이름 짓기의 중요성: 이름이 좋으면 코드가 읽기 쉬워지고, 코드를 바꾸려면 코드를 읽어야 하기 때문이다. ETC는 규칙이 아니라 가치이다. DRY: 반복하지 말라. DRY를 따르지 않으면 똑같은 것이 두 군데 이상에 표현될 것이다. 하나를 바꾸면 나머지도 바꿔야 함을 기억해야 한다. DRY는 지식의 중복, 의도의 중복에 대한 것이다. 문서화 중복: 주석 대신 코드로 의도를 나타내자. 데이터의 DRY 위반: 가능하다면 중복되는 필드 대신 메.. 2022. 3. 21. 커맨드 패턴 요청을 캡슐화 하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴 요청을 처리하는 방법이 바뀌더라도, 호출자의 코드는 변경되지 않는다. 구현 방법 장단점 장점 기존 코드를 변경하지 않고 새로운 커맨드를 만들 수 있다. 수신자의 코드가 변경되어도 호출자의 코드는 변경되지 않는다. 커맨드 객체를 로깅, DB에 저장, 네트워크로 전송 하는 등 다양한 방법으로 활용할 수도 있다. 단점 코드가 복잡하고 클래스가 많아진다 실무 적용 사례 자바 Runnable 람다 메소드 레퍼런스 스프링 SimpleJdbcInsert SimpleJdbcCall 예제 코드 https://github.com/jsyang-dev/study-designpattern/tree/master/src/main/java/me/s.. 2022. 3. 20. 이전 1 2 3 4 5 다음