# 2021/10/21 ### 스터디 진행방식, 일정 - **범위** - 1-2장씩 - 부담스럽지 않게 - **일정** - 주 1회 (목요일 오후 9시 30분 ~ 11시) - **진행 방식** - 경험이나 생각 공유 - 2주에 한 번 정도 클린코드를 적용한 코드를 소개하거나 함께 고치는 방향도 있다 - 스터디 끝나고 스터디 시간에 이야기한 내용 함께 정리 (hackmd.io - github) --- # 2021/10/28 ### 1차 스터디 - 범위 : 1장 <img src="https://i.imgur.com/A3oiQIe.png" width=200/> ### 요구사항을 코드로 표현한다. #### 경준님 - 감명이 깊었다. 그래서 저번주 작업할때 잠깐 생각이 나서 내가 잘하고 있나 돌아봤었다. - 저는 입사한지 얼마 안 돼서 프로젝트에 있는 코드를 다 파악하지 못하고 있을 때가 많은데, 내가 이 말을 지키면서 코딩하면, 나중에 다른 사람이 시간을 허비하는 일이 없지 않을까? 자신이 될 수 있다. - TODO 주석 외에는 저도 자바독 써요 - #### 효건님 - 손권남님 : 히스토리를 위키에다 남기지말고 코드(주석)에다 남겨라. - 자바독 주석 강조하심 /** ~ **/ - 코드로 표현하라는 말에서 코드에 주석이 포함되는 말인줄 알았는데 #### 예빈님 - 그래서 저는 요즘 커밋메시지를 자세히 적으려고 노력하고 있어요. - 가게팀 암호문이었음. 코드에 주석이 있으면 반갑다. 코드에 남기는 것도 좋고 그게 힘들면 주석을 쓰는게 좋지 않을까.. <br/><br/> ### 여러 기능을 하는 메서드는 기능을 명확히 기술하는 메서드, 실제로 수행하는 여러개 메서드로 나눠라 #### 경준님 - 왜 우리는 좋은 코드를 사수하지 못하나? - 일정을 길게 뽑으면 못해보인다 (잘해보이고 싶어서 그럴까?) - 연장근무 하면서 실험삼아 리팩토링 해보곤 해요. #### 효건님 - 주로 고민하던 부분인데, 명확하게 문장으로 나와서 고민이 해결되는 느낌이었다.(오늘 코드 짜면서도 해당하는 케이스가 있었다) - 비슷한 동작을 하는데 분기를 해서 조금씩 차이가 있을 때 - 메소드 1개가 1개의 일을 하도록 해야 한다 - 명확히 기술하는 메서드 : 분기만 처리하는 메서드 - 실제로 수행하는 여러개 메서드 : 각각의 분기마다 필요한 기능을 수행하는 메서드 - 리팩토링 할거니까 주말에 연장근무 할게요! 라고 당당히 말할 수 있었으면 좋겠어요. - 인정받는 스타개발자? 특정 기술을 잘한다. 클린코드를 잘해서 인정받을 수 있는 개발자가 될 수 있을까? #### 예빈님 - 나중은 없다 (p4) - 좋은 코드를 사수하는 일은 좋은 프로그래머의 책임이다 (p7) - 캠프장은 처음 왔을 때보다 더 깨끗하게 하고 떠나라 (p19) enum 이 조건 타입 A(Predicate, Function() -> ~), B(,() -> ~), if A -> 고구마 if B -> 감자 if (A) { if (B) } return; } if (A면서 C면) CService ㄴ A, B api ( 사용하는곳 주문팀 channel) 주문팀 request 가게도메인 Dto enum A (() -> AService) B (() -> BService) of().execute(); public () { if (isA면서B인상황이면) { 이렇게_행동한다() } if (status == A && status != C) { String a = "asd"; a.concat("asdasde"); } } <br/><br/> --- # 2021/11/4 ### 2차 스터디 - 범위 : 2,3장 - 베스트 3 뽑아오기 #### 경준님 - 검색하기 쉬운 이름(p. 28) 3위 - 추상화 단계 (p. 45) - 내려가기 규칙 (p. 46) #### 효건님 - p40 추상화 단계 - p50 함수 인수 - 테스트 관점 (인수를 모아서 추상화하는 건 테스트에 큰 차이가 있을까?) - p51 많이 쓰는 형식 (이벤트.. 내가 생각하는 그런 이벤트가 아니네) #### 예빈님 - p32 기발한 이름을 피해라 - 욕설 enum값 YOKSUL - p28 검색하기 쉬운 이름을 사용해라 <br/> ### 1. 검색하기 쉬운 이름을 사용해라 - 주문팀 컨벤션 중 하나가 해당된다 - "/v1/shop/{shopNumber}" - RequestMapping 쓰지 않기 - 가게팀은 이상해 - admin - AdminShopRepository - internal - ShopInternalRepository log.info("[class이름][메서드이름] 어쩌구저쩌구") spring: jpa: - @JsonProperty("region3Code") - 가급적 피하자 - 몽고db 쓰면서 누구는 template, 누구는 querydsl... - 하나로 통합하고 있음 - 가게팀 ApiRes - 의미 없는 것 같다 - fail() - auth만 씀 - timestamp - 의미있을 수도 (API 쓰는 팀에서) - yml 검색이 어렵다. - http://mageddo.com/tools/yaml-converter 결론 - 컨벤션을 정할 때 검색하기 쉽게 정하자 - 어떻게 컨벤션을 유지할 것인가 <br/> ### 2. 함수 인수 - 테스트 관점 (인수를 모아서 추상화하는 건 테스트에 큰 차이가 있을까?) 책에서는 인수 3개이상? 복잡하다 ```java= // 인자가 3개인 함수 (인자 간 조합이 다양함 -> 테스트하기 어려움) 를 foo(String a, List<String> b, boolean c) { } // 아래처럼 쪼갤 수 있다 -> 각 메소드를 테스트할 수 있음 foo1(String a) { } foo2(List<String> b) { } foo3(boolean c) { } FooParameter fooParameter foo4(fooParameter) { } Point a; int x, int y; prefix가 같으면 VO 냄새가 난다 class User { private String userName; private String userPhone; private String userAddr; private String userAge; } class Bar { private String a; private String b; public boolean isEmpty() { return a == null && b == null } } foo (Bar bar, boolean c, int d, boolean e) { void validate() { if (c && d < 5) { throw new Illegal(); } } } ``` ### 3. 추상화 단계 (p. 45), 내려가기 규칙 (p. 46) 추상화 단계? 경준님 정리해주세요 <br/><br/> --- # 2021/11/18 ### 3차 스터디 - 범위 : 4,5,6,7장 - 베스트 3 뽑아오기 <img src="https://i.imgur.com/K2lvA1d.png" width=150/> #### 효건님 - 있으나 마나한 주석(주석에 무감각해짐), 다른 코드의 내용까지 달아버리면 수정 누락 - 자료/객체 비대칭 (자료 추상화) - 세로 위치 (특히 종속함수) #### 경준님 - 자료구조 / 객체지향 - Unchecked Exception - v잡종구조 #### 예빈님 - p90 공개하지 않을 코드라면 javadocs는 쓸모가 없다. - 가게팀 코드는 ???????권남님의 영향으로 거의 항상 javadocs 쓰고 있음 - 주석이 너무 없어도 문제이지 않을까? - baemin-review 쪽의 형태소분석기 코드 - p107 함수 순서 - public public private private private VS - public private public private private ```java= publicA a asd(T t) { a map() this::toRequest(List<a) return a.stream toList(); doOnNext(err -> logOnError(log.err("asdasd ", err )) } // 예측할 수 있는 코드가 좋은 코드이고, 그래서 경준님은 함수형(java 8 - stream)을 좋아한다~ new A add Collectors.toMap() toList() 바퀴 재구현 하지마 있는 라이브러리 써라 == null != null (권남매직) if Objects.isNull() Objects.nonNull() ``` 도넛이란 🍩 ??대 철학과 천재 ts 우함마 유삼님의 습관 list에 Optional.ofNullable(list) stream ??????????????? <br/><br/> --- # 2021/11/25 ### 4차 스터디 - 범위 : 8,9장 #### 효건 - FIRST - 빠른게 ????????????? 요약해주세요효건님 - 학습 테스트 - 테스트 당 assert 하나 - 배보다 배꼽이 더 커지기 #### 예빈 - 외부 코드 사용하기 (p144) - 라이브러리 입장에서 숨기고 싶은 클래스 - 테스트는 어느 환경에서도 실행될 수 있어야 한다. (p168) - feign같은 외부 환경 테스트 #### 경준 - 문제는 실제 코드가 진화하면 테스트 코드도 변해야 한다는 데 있다. - DSL - 깨끗한 테스트 코드, 가독성 가독성 가독성 - Spring Context ```java= @F'I interface ApplicationPublisher void publish(Event e); class Service { private final ApplicationPublisher ap private final Repository repo public void save(A a) { repo.save(a); ap.pulish(aIsCreated()) } } class ServiceTest { private Service service = new Service(it -> it++, mockRepo()); sevice.save(Aa) verify() EventLister.handle(a); a } request {shopNo} controller = new Controller(new Facade(new Service(new Repository()))).doSomething() response=controller.asdasd(); {shopAddress} when(repo.getAddress).thenReturn("송파구 어쩌고"); assertThat(response).isEqualTo("송파구 어쩌고"); assertThat(a).isTrue(); ``` 통합테스트, 우테코 시절 까지 -> 객체 하나만 하면 단위, 통합은 여러개 섞인거 통합테스트 (환경이 뜬다) -> 스프링쓰는거, 단위테스트는 자바만 쓰는거 Repository Redis Em Aws Local <br/><br/> --- # 2021/12/09 ### 5차 스터디 - 범위 : 10, 11, 12장 #### 예빈 - 클래스는 작아야 한다. - 이미 커다란 클래스 - 결론: QA를 안타는 리팩토링부터 하자. ex.메소드 분리 - 결론: 깨진 유리창? 새로 만드는게 빠르다 - 템플릿 메소드 패턴 #### 효건 - 단일 책임 원칙 - 책임이 하나여야 한다. - 변경할 이유가 하나여야 한다. - ㄹㅇ? - ㄹㅇ? - 설정 논리는 일반 실행 논리와 분리해야 모듈성 높아진다. - 순수 자바 AOP 프레임워크 - #### 경준 - 강조하는 차원에서 한 번 더 말하겠다. - ㄹㅇ? - 시스템 제작과 시스템 사용을 분리하라 - DSL - https://www.infoq.com/presentations/domain-specific-languages/ <br/><br/> --- # 2021/12/16 ### 6차 스터디 - 범위 : 13, 14장 #### 예빈 - 동시성 - jiggle - 짠적이 없다 - 주문팀) DB 관련 동시성은 패턴화 되어있어요. (SimpleLockRunner) - 점진적인 개선 - 나쁜 팀 역학은 복구하면 된다. 하지만 나쁜 코드는 썩어 문드러진다. #### 경준 - 동시성 고민 언제 해봤나. (Web App 개발자) - ConcurrentHashMap - 동시성 테스트 - 분할만 잘해도 크게 개선된다 - 어떻게 분할하는게 옳은가.. - 코드 중심이냐 vs 개념 중심이냐 - 효율성이냐 vs 강한 규칙 - 최대한 깔끔하게 정리하자 - 어떻게? (몰기 vs 나누기) #### 효건 - 동시성 필요한 이유 - 결합을 없애는 전략 - Mashaller - interface 의 적합한 예시가 아닌가 - Exception - Exception에도 적절한 역할을 부여하자 <br/><br/> --- # 2021/12/16 ### 7차 스터디 - 범위 : 15, 16장