본문 바로가기

Lecture32

자바 코드 리팩토링: 객체의 협력 관계를 디자인해보자. 문제점 다음과 같은 주문 객체가 있다고 해보자. public class OrderLegacy { private long id; // KAKAO, SMS, EMAIL 등 메세지 플랫폼등이 있음 private String messageTypes; public OrderLegacy(String messageTypes) { this.messageTypes = messageTypes; } public String[] getMessageTypes() { return messageTypes.split(","); } } 이 코드의 문제점은 무엇일까? messageType에 다양한 플랫폼들이 적용되어야 하며 여러 케이스에 대한 검증이 필요하다. 다음과 같은 경우이다. @Test public void KAKAO를_KAOK.. 2023. 7. 9.
자바 코드 리팩토링: @Builder 애노테이션을 클래스 상단에서 사용하는 것을 지양하자 @Builder 애노테이션을 클래스 상단에서 사용하는 것을 지양하자 문제점 - @Builder를 클래스 상단에서 사용하면 해당 클래스의 모든 필드에 대해 빌더 패턴이 적용된다. -> 일부 필드에는 불필요한 빌더 메서드가 생성될 수 있다. 다음과 같은 코드를 보자. @Builder public class Person { private int id; private String name; private int age; private String address; private LocalDateTime createdAt; // ... (생략) } 이때 Person이 entity라면 Jpa를 사용하는 프로젝트에서 다음과 같은 애노테이션을 사용할 것이다.  @Builder public class Person { @.. 2023. 7. 7.
자바 코드 리팩토링: 생성자 대신 팩토리 메서드, 전략 패턴/상태 패턴 적용, 상속 대신 위임, 에러 예외 처리 1. 생성자를 팩터리 메서드로 바꾸기 문제점 - new 키워드로 객체 생성시 클래스 이름이 노출됨 - 생성되는 클래스 이름을 숨기거나 상황에 맞게 인스턴스 생성이 가능하고자 할 때 - 컴파일 시간이 아닌 실행 시간에 생성되는 인스턴스가 결정되어야 할 때 리팩토링 방법 - 객체의 생성자를 private로 변경한다. - 외부로 열려 있는 static 메서드를 만들고 해당 메서드에서 객체를 생성하도록 한다. - 외부 호출시 new 키워드 사용을 막을 수 있다. Before 다음과 같은 Customer 클래스와 main 함수에서 이를 호출하는 케이스를 리팩토링 해보자. public class Customer { private int customerType; private String customerName; p.. 2023. 7. 7.
자바 코드 리팩토링: 매직넘버, 제어 플래그, 널 문제, 분류 코드 문제, 분기문 문제 1. 매직넘버를 상수로 바꾸기 문제점 - 의미를 알기 어렵다. - 100이라는 숫자를 쓴다고 해보자. 바뀌는 경우 어떻게 해야할까? 하나하나를 바꿔줘야 한다. -> 수정하기 어렵다. public void doSomething(int command){ if (command==0){ System.out.println("walk"); } else if (command == 1) { System.out.println("stop"); } else if (command ==2) { System.out.println("jump"); } } Robot robot = new Robot("K"); robot.doSomething(0); 로봇 객체가 doSomething 메서드를 수행하나고 할 때 명령어를 입력을 하는데 0.. 2023. 7. 6.
자바 디자인 패턴: 플라이웨이트, 프록시, 명령, 해석 패턴 1.  플라이웨이트 패턴 Flyweight Pattern 반복자 패턴이란? - 공유해서 쓰는 패턴 - 인스턴스가 구별되는 이유는 멤버 변수 값이 다르기 때문이다. - 규모가 작고 인스턴스마다 특성이 따로 없는 경우 공유해서 사용한다. 의도와 동기 - 매번 new를 하는 것이 아니라 효율성을 위해 낭비를 절감한다. - 예를 들어, 각 단어를 각각 표현하기보다는 문자를 공유하여 표현하면 비용이 훨씬적게 소요됨 - 각 객체가 부가적인 상태 (글꼴등...)이 있다면 따로 관리해야 하는 경우가 있음 - 작은 여러개의 객체를 관리해야 할때 주로 사용 -> 따로 관리해야 하는 것들이 많다면 이 패턴은 좋지 않다. 클래스 다이어그램 - Flyweight 각 객체가 사용할 인터페이스를 정의한다. - CocreteFl.. 2023. 7. 6.