패캠 JAVA 7일차
자바 웹프로그래밍 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 으로
- 테스트 코드를 쓰면 디버깅을 쓸일이 없어진다.
-