---
# System prepended metadata

title: 2021/10/28

---

                                                                                                                                                                                                                                                                                                                # 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장
