오늘은 리팩토팅 작업을 수행하면서 적용했던 디자인 패턴 하나를 소개하려고 한다. 아래는 리팩토링 이전에 데이터를 화면에 노출하기 위한 간단한 방식을 설명하고 있다.1. 서버에서 화면 노출에 필요한 데이터를 프론트에 전달2. 프론트에서는 전달받은 데이터를 가지고 Handlebar를 통해 데이터를 노출 그러나, 특정 데이터에 대해서는 Handlebar에서 Helper를 통해서 조건문과 특정 로직을 통해 데이터를 노출하는 것을 제어3. 또는, JSP이기 때문에 JSTL 이용해서 여러 조건과 로직을 통해 데이터 노출하는 것을 제어 위에 설명만 듣고서는 이해가 되지 않을 수 있다. 간단한 예를들자면, 화면에서 쿠폰의 아이콘을 표시하기 위해서 프론트에서 아래와 같이 2단계를 거친다. 서버에서 전달받은 쿠폰 데이터를..
Class Should be Small! SRP(단일책임원칙)는 한번쯤 들어봤을 것이다. 클래스는 수행해야할 하나의 책임만을 가져야 한다. 책임이라는 것은 유사한 목적을 가진 기능들의 집합이라고 할 수 있다.내가 생성한 클래스가 여러 책임을 가진 마구니가 낀 클래스인지? 하나의 책임만을 가진 클래스인지 확인하는 방법은 클래스의 이름을 보면 알 수 있다.클래스의 이름이 간결하고, 클래스의 인스턴스 멤버와 메소드들이 클래스의 이름과 관련이 있는지 보면 알 수 있다.클래스의 이름은 클래스의 크기와 책임, 그리고 향후 클래스의 운명을 결정짓는 중요한 역할을 수행한다.클래스의 이름이 모호할 수록 클래스가 많은 책임을 갖게 된다. 그리고 향후 유지보수를 하는 과정에서 이름이 모호한 클래스에 많은 메소드들과 책임들이..
Clean Code Function에 대해 더 알아보려고 한다. Use Descriptive Names 메소드의 이름을 선택하는데 많은 시간을 소요하는 것을 두려워하지 마라! 가장 적합한 이름을 선택해라!지금 개발하는 나의 시간이 조금 더 소요될 수는 있겠지만, 훗날 누군가 코드를 이해하는 시간을 많이 감소시킬 수 있을 것이다! Function Arguments 이상적인 메소드의 파라미터수는 몇개일까?! 적을 수록 좋고, 없으면 더욱 좋다. 그리고 3개 이상부터는 권장하지 않으니 피해라!메소드의 파라미터수가 많다는테스트 하기 어렵고, 결국은 사용하기도 어렵다는 것이다. 테스트 코드를 작성 할 때, 해당 메소드가 정상적으로수행하는지 확인하기 위해 거의 모든 경우의 수를 테스트 할 것이다. 그런데 파라미터수..
Clean Code 2번째 이야기! 함수에 대해 정리해보려고 한다. 함수는 2차례 정리를 진행하려고 한다. 오늘은 간단한 코드를 리팩토링하면서 진행해보겠다. 아래 코드를 쉽게 읽을 수 있는가? 바로 이해가 되는가? public static String testableHtml(PageData pageData, boolean includeSuiteSetup) throws Exception { WikiPage wikiPage = pageData.getWikiPage(); StringBuffer buffer = new StringBuffer (); if (pageData.hasAttribute("Test")) { if (includeSuiteSetup) { WikiPage suiteSetup = PageCraw..
Clean Code 관련된 내용을 매주 하나씩 정리를 해보려고 한다. Clean Code 관련된 내용은 책에서는 많이 봤고, 머릿속으로는 알고 있지만 잘 지켜지지 않는다.항상 타협하게 된다. 책과 현실은 다르다고! 2020년부터는 좀더 우아한 프로그래밍을 하기 위해 ... 글을 작성하면서 정리도 하고, 실천도 해볼려고 한다. 의미있는 변수 사용 변수, 메소드 이름이 길더라도 명확하게 의도가 추측될 수 있도록 명명하는 것이 중요하다! 당연하고, 간단한 내용이지만 실제 개발을 할 때, 대부분의 개발자들이 네이밍에 많은 시간을 투자하고 어려워한다. 이름은 굉장히 중요하다! 아래의 예를 보면, 첫번째 코딩도 의도를 충분히 추측할 수 있지만, 객체에 메세지를 전달하는 두번째 방식이 가독성, 메소드를 이용한 재사용..
ATDD 기반으로 개발을 하면서 테스트를 위한 생성자가 게속 발생했다. 물론 규모가 큰 서비스가 아니기 때문에 생성자가 굉장히 많지는 않았지만 이후 더 큰 서비스를 개발할 경우를 대비해서 생성자의 개수를 제한하는 방법을 공부했다. 1. 점층적 생성자 패턴 점층적 생성자 패턴은 각 필드의 따른 생성자를 모두 만든다는 것이다. 결국은 객체 생성에 필요한 필드의 수만큼 생성자가 존재하는 것이다.점층적 생성자 패턴은 잘 동작하지만, 필드의 수가 많아지면 가독성이 떨어지고, 코드 작성에 어려움이 있다는 단점을 가지고 있다.여기서 말하는 코드 단점은, 필드가 10개인 생성자를 호출할 때, 각각의 위치에 어떤 필드를 넣어야할지 어렵다는 것이다. 2. 자비빈 패턴 자바빈 패턴은 기본 생성자를 통해 객체를 생성한 후, ..
Lotto 프로그램을 개발하는 과정에서 수정된 내용을 간단하게 정리해보려고 한다.피드백1) Lotto 번호에 대한 유효성 검증을 Lotto를 생성하는 Factory 클래스가 아닌, Lotto 생성자에서 진행하도록 수정하자! [LottoFactory.java] public static Lotto createLotto(String lottoString) { if(!isValidFormat(lottoString)) { try { throw new LottoException("유효하지않는 형식의 당첨번호를 입력하셨습니다."); } catch (LottoException lottoException) { return InputView.getWinningNum(); } } return new Lotto(createW..
1. Enum 열거타입 변수 서로 연관된 상수들의 집합으로 정의 가능. Enum 열거타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다. 예) Week today = Week.MONDAY; == ( Enum 열거타입 변수 = Enum 상수 ) 위에 코드는 Week Enum 열거타입을 가지는 today라는 변수를 생성하여 Enum 상수를 대입한 코드이다. Enum 상수는 Enum 열거 타입의 객체라고 생각하면 된다. 그렇기 때문에 today는 Stack 영역에서 Enum 상수의 주소값을 가지고 있으며, Enum 상수는 Heap 영역에서 Enum 열거타입의 객체를 가지고 있다. 2. Enum의 장점 - 입력에 대한 유효성 체크가 가능 - 코드 유지보수 시, (개발 내용 추가) 변경하는 범위가 최소..
프로그램을 구현하면서 입력값 조건에 맞는 객체가 반환이 되도록 구현해야 하는 코드가 있었다.아래 코드는 입력된 점의 개수에 따라 도형의 모양을 출력하는 코드이다. 점이 2개면 직선, 3개면 삼각형, 4개면 사각형을 반환하도록 되어있다.현재는 조건문이 3개이지만, 만약 십이각형, 십삼각형 등의 다각형이 계속 추가된다고 한다면, 조건문은 계속 늘어날 것이다.그렇다면 추후 유지보수가 굉장히 어려울 것이라고 생각된다. 그래서 이부분을 수정해보았다. public static Figure create(String[] inputPoint) throws PointException { if(inputPoint.length == 2) { return new Line(init(inputPoint)); } else if(in..
MVC MVC란 Model View Controller의 약자로 애플리케이션을 세 가지의 역할로 구분한 디자인패턴 세 영역을 구분함으로써 결합도를 최소화한 패턴 * 디자인패턴 : 소프트웨어의 개발 방법을 공식화 한 것. 개발자들 간의 커뮤니케이션의 효율성을 높이는 기법 예) 싱글톤 패턴, 팩토리 패턴, 옵저버 패턴 등... - Model : 백그라운드에서 동작하는 로직을 처리 데이터를 담거나(dto) 데이터베이스로 데이터를 보내는 작업(dao)을 수행 * DTO (Data Transfer Object), VO (Value Object) : 데이터 전달을 위한 목적으로 생성된 객체로서, View에서 출력할 수 있는 최종 데이터를 전달 예) Car Class(Mode)에서 속도를 계산하고(로직을 통해 데이터..