자바 웹프로그래밍 2기 강의 7일차 내용을 정리한 포스팅입니다.

용어 정리 습관

  • 모르는 용어를 나만의 방식으로 풀어서 정리하는 습관을 들이자

  • 하나의 프로젝트를 시작할 때, 큰 그림을 먼저 그리고 시작하자

    • 웹 flow, 배포 flow, DB flow 등…
  • 수업내용을 기획해서 배운 내용과 같은 step으로 따라 해보는 경험 (장난감 프로젝트 - Toy Project)

거꾸로 가보자

서블릿을 알아야지 스프링의 내부 동작 원리를 알 수 있다.

  • HTTP -> Servlet + JSP -> MVC Framework (MVC FW) -> Spring MVC + Spring DI

  • HTTP : Client와 Server와 의 약속

  • Sevlet : HTTP 를 추상화 한 API

    • Sevlet Filter
  • MVC Framework

  • Spring MVC + Spring DI

프레임웤 사용법 보다는 자바 를 진짜 잘해야 한다.

자바를 잘한다는 의미가 객체지향적으로 자바를 잘 쓰는걸 말씀하시는듯 하다.

배포 자동화 도구

  • fabric

TEST 및 Refactoring

  • 금방 실력이 늘지 않으니 꾸준히 노력해야 한다.

  • main 메서드에서 테스트를 하면 로직이 복잡해지는 단점이 있다.

  • jUnit Test Framework

    • production

    • test code

  • TDD : 테스트 코드 먼저 말들고 프로덕션 코드를 만든다

  • 단위 테스트부터 하는 연습하자

    • 핵심로직 (비지니스 로직) 부터 테스트 코드를 작성한다.

    • 상태 데이터를 가지는 단위 부터 테스트 코드를 작성한다.

    
    public void update(User user) {
          if(!matchPassword(user.password)) {
              throw new IllegalArgumentException("비밀번호가 다릅니다.");
          }
    
          this.name = user.name;
          this.email = user.email;
      }
    
    
    • JUNIT 테스트 메소드를 나누는게 더 중요하다.

      • 이 과정에서 요구사항 분석도 된다.
      
      import org.junit.Before;
      import org.junit.Test;
      
      import static org.junit.Assert.*;
      
      /**
       * Created by 강홍구 on 2016-12-12.
       */
      public class CalculatorTest {
          private StringCaclulator cal;
      
          @Before
          public void setUp() {
              cal = new StringCaclulator();
          }
      
      
          @Test
          public void add_null_또는_빈문자열 () {
              assertEquals(0, cal.add(null));
              assertEquals(0, cal.add(""));
          }
      
          @Test
          public void add_하나의_문자열 () {
              assertEquals(1, cal.add("1"));
          }
      
          @Test
          public void add_콤마_구분자 () {
              assertEquals(3, cal.add("1,2"));
          }
      
          @Test
          public void add_콜론_구분자 () {
              assertEquals(3, cal.add("1:2"));
          }
      
          @Test
          public void add_콤마_콜론_구분자 () {
              assertEquals(10, cal.add("1:2,3:4"));
          }
      
          @Test
          public void add_콤마_커스텀_구분자 () {
              assertEquals(6, cal.add("//;\n1;2;3"));
          }
      
          @Test(expected = RuntimeException.class)
          public void add_RunTimeException () throws Exception {
              assertEquals(0, cal.add("//;\n1;2;-3"));
          }
      }
      
      
  • 좀 더 객체지향적이려면 (객체에게 자꾸 일을 줘라!)


// 요런 습관 버리자
string.equals("")

// 요런 습관 취하자
string.isEmpty();

  • 메서드는 하나의 일만!

    • 연습하려면 indent를 최소화 하는 연습을 해보자

    • toy project 에서는 극단적으로 indent를 최대 1 depth 까지만 하는 연습을!


import com.sun.deploy.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by 강홍구 on 2016-12-12.
 */
public class StringCaclulator {

    private static void minusCheck(int num) throws RuntimeException {
        if (num < 0 ) {
            throw new RuntimeException("음수!");
        }
    }

    private static boolean nullEmptyCheck (String text) {
        // 빈문자열
        return text == null || text.isEmpty();
    }

    private static int sum(String[] text) {
        int result = 0;
        for (String number : text) {
            int num = Integer.parseInt(number);

            minusCheck(num);

            result += num;
        }

        return result;
    }

    private static String[] sumText (String text) {
        Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text);

        if(m.find()) {
            String customDelimeter = m.group(1);

            return m.group(2).split(customDelimeter);
        }


        return text.split(",|:");

    }

    public int add(String text) {
        if (nullEmptyCheck(text)) {
            return 0;
        }

        return sum(sumText(text));
    }
}

코드 리펙토링시 고려사항

  • 성능 고려?

    • 일단 리펙토링 하고 성능이 저한된다 싶으면 합하면 된다.
  • 너무 메서드를 분리하면 디버깅 힘들지 않나?

    • 패러다임의 변화 : 디버깅 -> jUnit 으로

      • 테스트 코드를 쓰면 디버깅을 쓸일이 없어진다.

메서드는 무조건 하나의 일만 하도록 계속 연습하자.