Clean Code

    [Design Pattern] 생성 패턴 - 싱글톤 패턴

    github 코드 https://github.com/yaini/Spring_Study/blob/spring-2-oop-design-pattern/design-pattern/src/main/java/creational 싱글톤 패턴 한 클래스에 한 인스턴스만 존재하도록 제한하는 패턴 특징 기본 생성자가 private static 팩토리 메소드인 getInstance 인스턴스를 저장할 static 필드 장점 하나의 인스턴스만 생성하므로 메모리 낭비를 방지할 수 있다. static으로 전역으로 사용되는 인스턴스이기 때문에 데이터 공유가 쉽다. 단점 여러 스레드에서 동시에 접근 할 수 있으므로 동시성 문제 유의하여 설계해야 한다. 단위 테스트는 격리된 환경에서 실행되어야 하지만, 싱글톤 패턴은 전역에서 사용하기 ..

    [Design Pattern] 생성 패턴 - 프로토 타입 패턴

    github 코드 https://github.com/yaini/Spring_Study/blob/spring-2-oop-design-pattern/design-pattern/src/main/java/creational 프로토 타입 패턴 생성할 객체들의 타입이 프로토타입 인스턴스로부터 결정되며, 새 객체를 위해 자신을 복제한다. 상태 값이 다른 객체 생성을 위해 깊은 복사를 사용하는 객체 생성 방식 기존 객체를 복제함으로써 객체를 생성한다. 단점 clone에 대한 override 요구 객체를 생성하는데 비용이 많이 들기 때문에 유사한 객체가 존재하는 경우 사용 프로토 타입 패턴이라고 하면 뭔가 대단한 원칙인 것 같지만 객체를 생성 후 복사한다는 뜻이다. 예를 들어, DB에 접근해서 가져와야 할 데이터가 이미..

    [Design Pattern] 생성 패턴 - 팩토리 메소드 패턴, 추상 팩토리 패턴

    github 코드 https://github.com/yaini/Spring_Study/blob/spring-2-oop-design-pattern/design-pattern/src/main/java/creational 팩토리 메소드 패턴 부모 클래스와 자식 클래스가 있을때, 팩토리 클래스를 이용하여 자식 클래스의 인스턴스를 생성하는 패턴 공장처럼 팩토리 클래스가 객체를 생성하게 된다 생성과 처리로직을 분리하여 결합도를 낮추기 위한 패턴 클래스의 인스턴스 생성을 서브 클래스가 결정하도록 할 때 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때 단점 팩토리 메소드 패턴으로 인해 extends를 남발하게 되면 프로그램의 엔트로피가 높아질 수 있다. 템플릿 메소드 패턴과 차이점 템플릿 메소드 패턴..

    [Design Pattern] 생성 패턴 - 빌더 패턴

    github 코드 https://github.com/yaini/Spring_Study/blob/spring-2-oop-design-pattern/design-pattern/src/main/java/creational/Builder.java 생성(construction)과 표기를 분리해 복잡한 객체를 생성한다. 별도의 Builder 클래스를 만들어 필수 값에 대해서는 생성자를, 선택적인 값에 대해서는 메소드를 통해 값을 입력 받은 후, build 메소드를 통해 하나의 인스턴스 리턴 선택적인(Optional) 멤버 변수, 파라미터나 지속성 없는 상태 값이 많을 때 팩토리 패턴에서 생성해야 하는 하위 클래스들이 복잡할 때 단점 매개변수가 적은 경우 생성자보다 코드가 장황해 진다. 구현 방법 빌더 클래스를 St..

    [Architecture] 아키텍처 개념 정리

    팀에서 아키텍처에 관한 회의가 있었다. 기존 DDD 아키텍처에서 헥사고날 아키텍처 변경에 관한 회의 였는데, 어떤 아키텍처가 적합한지 생각하기 위해선 각 아키텍처에 관한 이해가 필요하다고 생각하여 정리하게 되었다. Architecture 비즈니스 요구 사항을 만족하는 시스템을 구축하기 위해 구조를 정의한 것 소프트웨어 응용 프로그램을 설계하기 위한 모델 또는 패턴 Domain Driven Design 비즈니스 도메인별로 나누어 설계하는 방식 "Loose Coupling, High Cohesion" 모듈간의 의존성은 최소화하고, 응집성은 극대화하는 것이 궁극적인 목표이다. DDD는 Strategic Design과 Tactical Design으로 나눌 수 있다. tatical design 프로그래밍을 하기 ..