블로그

인프런 워밍업 스터디 클럽 2기 -백앤드 클린코드,테스트코드 3주차 발자국

https://inflearn.com/course/lecture?courseSlug=practical-testing-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C&unitId=144805&subtitleLanguage=ko호덜덜 3주차..배우고 싶었던 테스트코드 강의를 들어보았다!   4LS-회고법을 사용해보장!Liked (좋았던 점) 드디어 배우고 싶었던 테스트 코드! tdd의 중요성과 이미 기능을 구현한 후 테스트코드를 작성할 경우 발생할수있는 문제점을 숙제였던 이미 리더블 코드에서 사용했던 코드에 테스트코드를 만들며 실전으로 느꼈다 :(Lacked (아쉬웠던 점)저번 리더블코드 지뢰찾기 코드 따라하다가 뭘 잘못따라했는지 제대로 작동안되서 오류가 있는거에 테스트코드를 짜려니 찜찜했다..Learned (배운 점)1- 단위 테스트-클래스나 메서드같은 작은 단위의 테스트Junit은 단위테스트를 위한 테스트 프레임워크Assertj는 Junit위에 얹는 테스트코드의 작성을 돕는 test library- 체이닝 메서드로 조금더 가독성을 높힌다! -암묵적인 요구사항이 있는지 생각해보기해피케이스와 예외케이스들을 작성해야한다.+ 경계값 테스트 -테스트하기 어려운 영역 분리관측할때마다 달라지는 테스트 케이스 - 시간이나 사용자가 입력하는거에 따라 달라질때.이럴경우 테스트코드 friendly 코드로 기능을 구현을 해놓으면 한결 편안해진당! 2-TDD -test driven development기능 구현후 테스트케이스를 작성할때 테스트케이스를 짤때 제약을 받을수있다.해피케이스만 짜고 예외케이스는 자유롭게 못짜볼수있다. 이미 구현된 기능을 건드려야하니 귀찮아서..처음부터 테스트코드를 짜면 익숙하지않아 번거롭겠지만 테스트케이스를 만들어놓으면 오히려 과감하게 리펙토링을 하고 테스트케이스를 돌려 작동되는지 바로 확인할수있어서 좋다.기능과 기능을 검증하는 테스트수단의 상호작용. 3-테스트 코드는 문서다개발자가 아닌 사람이 봐도 이 기능은 무엇을 위한것인지 어떻게 작동해야하는지 이해할수있는걸 권장한다.테스트코드는 나의 고민의 결과를 문서화한 팀의 자산이 된다. 그만큼 중요하다.@DisplayName("음료 한개 추가하면 주문 목록에 담긴다.") 문장으로 적어야 더 이해하기 쉽다.성공 실패 같이 테스트 중심의 설명보다주문 실패 X아이탬의 갯수가 0일떄는 주문을 생성할수없다. O 4-BDD 스타일로 작성하기Behavior Driven Development TDD에서 파생된 개발방법론함수단위테스트보단 시나리오 기반의 테스트케이스 자체에 집중한다.Given - 시나리오 진행에 필요한 모든 과정 준비When - 시나리오 행동 진행Then - 시나리오 진행에 대한 결과 명시, 검증어떤 환경에서 (given) 어떤 행동을 진행했을때(when) 어떤 상태 변화가 일어난다 (then) Longed for (앞으로 바라는 점)다음주 화요일까지 5시간 넘는 강의 있는데 어서 호다닥 들어봐야겠당... 이번 스터디 후에는 테스트코드 만들기 고수가 되곱! 

인프런온보딩테스트코드

인프런 워밍업 스터디 클럽 2기 -백앤드 클린코드,테스트코드 2주차 발자국

https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard 2주는 너무 정신없이 호다닥 가버렸다 내 1주차 발자국때 미리 열심히 하자는 나의 다짐은... 흙그래도.. 또 나는 다음주는 열심히 하자는 꿈을 꾸지...적용하기에는 아직 버거웠다.. 숙제로 cafe machine 리팩토링해야했는데.. 일급클래스 나도 적용하고 싶었는데 할줄몰라서 슬펐다.. 그래도 같이 온보딩 스터디하시는 분이 리펙토링 숙제 코드 리뷰해주시면서 알려주셔서 이해가 가서 감사했당.. 강의는 허겁지겁 코드 따라쳐도 몬가 막상 내가 적용하기에는 너무 어렵더쿤...   4LS-회고법을 사용해보장!Liked (좋았던 점) 강의하면서 배우고 배웠던 것들을 적용할수있도록 리팩토링 숙제를 주셔서 유익했다.. 혼자서 해보는 실습 중요하지! 내가 잘 적용을 못했던것 뿐..Lacked (아쉬웠던 점)시간을 더 많이 투자해서 더 노력했어야하는데 아쉽다 ㅠ.ㅠ 다음주는 조금이라도 더 노력하는 내가 되었으면.. 햐그리고 까먹으니 계속 메모하면서 강의 듣기 ㅠㅠㅠㅠㅠLearned (배운 점)일급컬랙션 이름이 멋져보여서 다음에 내 프로젝트에 꼭 적용해보고 싶다 1- 상속과 조합상속 보다는 조합을 사용하자. 상속은 틀을 만들어 버려서 부모를 수정하면 자식들도 다 영향을 받는다. 부모와 자식과의 결합도가 높다. 2- Value Object, Entityvalue object 가 가져야하는 3가지- 불변성, 동등성,유효성 검증 entity는 식별자가 있고 valueObject는 식별자가 없지만 hashcode&equal을 사용해서 모든 필드들이 식별자 역할을 한다. Entitypublic class Member { private Long id; // 고유 식별자 private String name; }Value objectpublic class Address { private String city; private String street; private String zipcode; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Address address = (Address) o; return city.equals(address.city) && street.equals(address.street) && zipcode.equals(address.zipcode); } @Override public int hashCode() { return Objects.hash(city, street, zipcode); } } 3- 일급 컬랙션일급컬랙션은 list, set, map 이런 타입들의 추상화 도구로 사용한다 new로 2차 가공해서 해서 일급 컬랙션을 변경해도 이전의 컬래션에겐 영향이 없다.이번 리팩토링에선 실패했지만 다음에 리팩토링할때 꼭 적용해봐야지...Student 클래스public class Student { private final String name; private final int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Student{name='" + name + "', age=" + age + "}"; } }  StudentGroup 일급컬랙션 클래스import java.util.ArrayList; import java.util.Collections; import java.util.List; public class StudentGroup { private final List<Student> students; public StudentGroup(List<Student> students) { this.students = new ArrayList<>(students); // 불변성 유지 } public void addStudent(Student student) { this.students.add(student); // 학생 추가 } public List<Student> getStudents() { return Collections.unmodifiableList(students); // 불변 리스트 반환 } public double getAverageAge() { return students.stream() .mapToInt(Student::getAge) .average() .orElse(0.0); // 학생 나이의 평균 계산 } @Override public String toString() { return "StudentGroup{students=" + students + "}"; } } 4- Enum열거형 타입 상수의 직합- 상수에 대한 로직도 담을수있다. 여기에 설명도 넣을수 있다public enum Month { JANUARY("1월", 1), FEBRUARY("2월", 2), MARCH("3월", 3), APRIL("4월", 4), MAY("5월", 5), JUNE("6월", 6), JULY("7월", 7), AUGUST("8월", 8), SEPTEMBER("9월", 9), OCTOBER("10월", 10), NOVEMBER("11월", 11), DECEMBER("12월", 12); private final String description; // 월에 대한 설명 private final int order; // 월의 순서 Month(String description, int order) { this.description = description; this.order = order; } public String getDescription() { return description; } public int getOrder() { return order; // 월의 순서 반환 } // 주어진 숫자에 해당하는 월을 반환하는 메서드 public static Month valueOf(int order) { for (Month month : Month.values()) { if (month.getOrder() == order) { return month; } } throw new IllegalArgumentException("유효하지 않은 월 순서: " + order); } }이렇게 사용할수있다.. 신기한 코딩의 세계... io에서 1이 들어오면 if (input==1)이면 January 리턴하는게 아니라 이런식으로 하는게 아니라 return Month.valueOf(input)하면 January를 리턴한다!  5- 세션 6좋은 주석은 주석없이 설명이 가능한게 좋지만 어떤 이유로 방식을 결정하거나 그런 코드로는 알수없었던 필요한 디테일들은 주석으로 잘설명해두고 필요없는 주석은.. 지우기 (뜨끔)메서드 순서 -상태변경, 판별, 조회 순으로 메서드를 배치하고 public 은 위에 private은 밑에 배치한다.Longed for (앞으로 바라는 점)다음주 테스트코드 스터디가 아주 기대됩니당!! 

인프런온보딩리더블코드

채널톡 아이콘