1 of 72

괴물 메서드�리팩터링 ⋅ 성능 개선하기

20222191 임채성

메가콘 2024

1

2024. 9. 26.

2 of 72

자기소개

  • 임채성(a.k.a. puleugo)
  • 푸르고 개발 블로그 운영중
  • 메가브레인 24년도 팀장
  • 왁타버스 게임즈 팀 백엔드 개발자
    • QR 못찍으셨다면 ’푸르고 괴물메서드’로 검색

메가콘 2024

2

2024. 9. 26.

블로그 원고

3 of 72

Waktaverse Games?

메가콘 2024

3

2024. 9. 26.

4 of 72

Waktaverse Games?

메가콘 2024

4

2024. 9. 26.

5K

DAU

20.3K

WAU

53.7k

MAU

  1. 2024.09.18, CloudFlare 기준
  2. DAU, WAU, MAU는 각각 일일 유저 수, 주간 유저 수, 월간 유저 수

5 of 72

MAU 5만

메가콘 2024

5

2024. 9. 26.

5만3천

MAU

6 of 72

리팩터링이란?

메가콘 2024

6

2024. 9. 26.

코드의 기능적 동작을 변경하지 않고 �코드의 구조를 개선하는 작업

7 of 72

리팩터링이란?

메가콘 2024

7

2024. 9. 26.

어렵다.

8 of 72

리팩터링이란?

메가콘 2024

8

2024. 9. 26.

9 of 72

리팩터링이란?

메가콘 2024

9

2024. 9. 26.

😵‍💫

10 of 72

리팩터링이란?

메가콘 2024

10

2024. 9. 26.

열심히 작업 → 민폐?

11 of 72

리팩터링이란?

메가콘 2024

11

2024. 9. 26.

그런 상황에서..

12 of 72

리팩터링 대상

  • "스프레트시트 데이터 동기화 메서드"

메가콘 2024

12

2024. 9. 26.

데이터 동기화

13 of 72

문제점

  • 코드 길이가 600줄을 넘음.
  • 테스트 코드가 없고, 수정 시 큰 부담을 줌.
  • 코드의 동작 범위를 완벽하게 이해하는 사람이 없음.
  • 복잡한 조건이 계속 추가되며 유지 보수가 어려워짐.

메가콘 2024

13

2024. 9. 26.

14 of 72

문제점

메가콘 2024

14

2024. 9. 26.

긴 코드

복잡함

실수 →

서비스 다운, 데이터 유실

15 of 72

괴물 메서드란?

  • 괴물 메서드는 너무 길고 복잡해서 손대고 싶지 않은 메서드를 의미한다.
  • 이후 괴물메서드라는 명칭으로 부름.

메가콘 2024

15

2024. 9. 26.

16 of 72

한번의 실패 경험을 가지고..�어떻게 하면 안전하게 리팩터링할 수 있을까?

메가콘 2024

16

2024. 9. 26.

17 of 72

안전한 리팩터링을 위한 3단계

메가콘 2024

17

2024. 9. 26.

18 of 72

안전한 리팩터링을 위한 3단계

  1. 분석하기
  2. 테스트 코드 작성하기
  3. 리팩터링하기

메가콘 2024

18

2024. 9. 26.

19 of 72

하나. 분석하기

메가콘 2024

19

2024. 9. 26.

20 of 72

분석하기

메가콘 2024

20

2024. 9. 26.

불을 끈다

불이 꺼진다

조명 기능

21 of 72

분석하기

메가콘 2024

21

2024. 9. 26.

불을 끈다

불이 꺼진다

조명 기능

사전 조건

22 of 72

분석하기

메가콘 2024

22

2024. 9. 26.

불을 끈다

불이 꺼진다

조명 기능

사전 조건

행위 ⋅ 입력

23 of 72

분석하기

메가콘 2024

23

2024. 9. 26.

불을 끈다

불이 꺼진다

조명 기능

사전 조건

행위 ⋅ 입력

기대 결과

24 of 72

둘. 테스트코드 작성하기

메가콘 2024

24

2024. 9. 26.

25 of 72

조명기능의 테스트코드

메가콘 2024

25

2024. 9. 26.

조명 기능

불을 끈다

불이 꺼진다

26 of 72

조명기능의 테스트코드

메가콘 2024

26

2024. 9. 26.

조명 기능

불을 끈다

불이 꺼진다

사전 조건

27 of 72

조명기능의 테스트코드

메가콘 2024

27

2024. 9. 26.

조명 기능

불을 끈다

불이 꺼진다

사전 조건

행위 ⋅ 입력

28 of 72

조명기능의 테스트코드

메가콘 2024

28

2024. 9. 26.

조명 기능

불을 끈다

불이 꺼진다

사전 조건

행위 ⋅ 입력

기대 결과

29 of 72

테스트코드 실행 결과

메가콘 2024

29

2024. 9. 26.

조명 기능

불을 끈다

불이 꺼진다

사전 조건

행위 ⋅ 입력

기대 결과

30 of 72

테스트코드 실행 결과

메가콘 2024

30

2024. 9. 26.

조명 기능

불을 끈다

불이 꺼진다

사전 조건

행위 ⋅ 입력

기대 결과

31 of 72

셋. 리팩터링하기

메가콘 2024

31

2024. 9. 26.

32 of 72

리팩터링이란?

메가콘 2024

32

2024. 9. 26.

불 끄기 함수

불을 끈다

불이 꺼진다

실제 전구

불 끄기 요청

입력

응답

목적

코드의 입력 ⋅ 응답 ⋅ 목적을 변경하지 않고 코드 구조를 개선하는 행위

33 of 72

리팩터링의 필요성

메가콘 2024

33

2024. 9. 26.

불 끄기 함수..�리팩터링이 필요할까?

아니요..

34 of 72

리팩터링의 필요성

메가콘 2024

34

2024. 9. 26.

요구사항 변경 가능성 * 코드의 복잡도

∴ 복잡하고 변경이 필요한 코드

35 of 72

어떻게 분리할까?

메가콘 2024

35

2024. 9. 26.

36 of 72

어떻게 분리할까?

메가콘 2024

36

2024. 9. 26.

37 of 72

도메인 모델이란?

  • 도메인: 코드로 해결하고자 하는 문제
  • 비즈니스 레이어에 도메인에 대한 내용만 있으면 좋다.
    • 코드만 읽어도 뭐하는 코드인지 이해하기 쉬우니까.
  • 하지만, 이는 어려움.
    • 도메인 규칙의 적용되야하기 때문.
    • E.g. 대출 신청자의 신용 점수는 600점 이상이어야 한다.
  • 이러한 내용을 도메인 모델에게 할당하자.

메가콘 2024

37

2024. 9. 26.

38 of 72

도메인 모델로 분리하기

메가콘 2024

38

2024. 9. 26.

상태

  • 점등 여부
  • 색상
  • 고장 여부

39 of 72

도메인 모델로 분리하기

메가콘 2024

39

2024. 9. 26.

행위

  • 켜기
  • 끄기
  • 색상 조회

40 of 72

도메인 모델로 분리하기

메가콘 2024

40

2024. 9. 26.

코드의 가치

테스트 난이도

41 of 72

도메인 모델로 분리하기

메가콘 2024

41

2024. 9. 26.

코드의 가치

테스트 난이도

의존: 불 끄기

42 of 72

리팩터링 적용

메가콘 2024

42

2024. 9. 26.

43 of 72

리팩터링 대상 설명

메가콘 2024

43

2024. 9. 26.

데이터 동기화

44 of 72

도메인 모델 분리하기

메가콘 2024

44

2024. 9. 26.

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

3차원 어레이

45 of 72

도메인 모델 분리하기

메가콘 2024

45

2024. 9. 26.

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

Row

Row

Row

Rows

Spread Sheet

46 of 72

도메인 모델 분리하기

메가콘 2024

46

2024. 9. 26.

요청

47 of 72

도메인 모델 분리하기

메가콘 2024

47

2024. 9. 26.

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

응답

원시값

48 of 72

도메인 모델 분리하기

메가콘 2024

48

2024. 9. 26.

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

SpreadSheet

Service

GameRow

AppRow

GuideRow

Rows<ROW>

Rows<ROW>

Rows<ROW>

SpreadSheet

원시값 전달

49 of 72

도메인 모델 분리하기

메가콘 2024

49

2024. 9. 26.

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

SpreadSheet

Service

GameRow

AppRow

GuideRow

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

Rows<ROW>

Rows<ROW>

Rows<ROW>

분류

Rows<ROW>

Rows<ROW>

Rows<ROW>

50 of 72

도메인 모델 분리하기

메가콘 2024

50

2024. 9. 26.

SpreadSheet

Service

GameRow

AppRow

GuideRow

111

112

113

114

121

122

123

124

131

132

133

134

211

212

213

214

221

222

223

224

231

232

233

234

311

312

313

314

321

322

323

324

331

332

333

334

Rows<ROW>

Rows<ROW>

Rows<ROW>

도메인 모델 생성

51 of 72

도메인 모델 분리하기

메가콘 2024

51

2024. 9. 26.

SpreadSheet

Service

GameRow

AppRow

GuideRow

Rows<ROW>

Rows<ROW>

Rows<ROW>

1급 콜렉션 생성

52 of 72

도메인 모델 분리하기

메가콘 2024

52

2024. 9. 26.

SpreadSheet

Service

GameRow

AppRow

GuideRow

Rows<ROW>

Rows<ROW>

Rows<ROW>

1급 콜렉션 생성

53 of 72

도메인 모델 분리하기

메가콘 2024

53

2024. 9. 26.

SpreadSheet

Service

GameRow

AppRow

GuideRow

Rows<ROW>

Rows<ROW>

Rows<ROW>

1급 콜렉션 HashMap

54 of 72

결과

메가콘 2024

54

2024. 9. 26.

변환

사용

55 of 72

뭐가 문제일까요?

메가콘 2024

55

2024. 9. 26.

56 of 72

서비스 레이어에서 영속 로직 빼기

메가콘 2024

56

2024. 9. 26.

57 of 72

적절한 디자인 패턴만을 적용하자

  • 설계는 어떻게든 억까 가능
    • 트랜잭션 스크립트(안티패턴)
    • 싱크홀(안티패턴)
  • 디자인 패턴 == 선배들의 문제 해결 메모장
  • 무조건 써야지 X, 도구로 사용 O
  • (같은 이유로, 학생이 Lombok 사용 비추)

메가콘 2024

57

2024. 9. 26.

58 of 72

리팩터링 결과

  • 서비스 레이어 코드라인 감소 600 -> 200
  • 도메인 모델 구현
  • 영속 레이어 구현
  • 테스트코드 작성

메가콘 2024

58

2024. 9. 26.

59 of 72

리팩터링 결과

메가콘 2024

59

2024. 9. 26.

60 of 72

리팩터링 결과

  1. DB 데이터 불러오기
  2. Rows 동기화
  3. SpreadSheet Api
  4. DB Query

메가콘 2024

60

2024. 9. 26.

61 of 72

성능 개선 결과

메가콘 2024

61

2024. 9. 26.

62 of 72

과도한 API 호출 이슈

메가콘 2024

62

2024. 9. 26.

유튜브 API 호출

N회 호출

63 of 72

배치 처리

메가콘 2024

63

2024. 9. 26.

⌈ N/50 ⌉ 호출

64 of 72

배치 처리

메가콘 2024

64

2024. 9. 26.

이전

이후

호출 횟수

N

⌈ N/50 ⌉

비용 개선율

0%

98%

65 of 72

동기적 처리로 인한 병목 이슈

메가콘 2024

65

2024. 9. 26.

66 of 72

논 블로킹 처리

메가콘 2024

66

2024. 9. 26.

67 of 72

논 블로킹 처리

  • Node.js: 싱글 스레드 기반
  • 다른 프로그램에서 요청하고 지 할거함
    • 복수의 DB 커넥션 사용

메가콘 2024

67

2024. 9. 26.

68 of 72

논 블로킹 처리

  • Node.js: 싱글 스레드 기반
  • 다른 프로그램에서 요청하고 지 할거함
    • 복수의 DB 커넥션 사용

메가콘 2024

68

2024. 9. 26.

69 of 72

성능개선 결과

메가콘 2024

69

2024. 9. 26.

3s → 2.7s

10% 개선

70 of 72

이렇게 재미있는 리팩터링�여러분도 해보시는건 어떠신가요?�그리고..

메가콘 2024

70

2024. 9. 26.

71 of 72

마지막을 빌려 동아리 홍보..

  • 팀플레잉 개발자 >>>>>>> 솔로플레잉 개발자
  • 동아리 != 뭔가를 해주는 곳
  • 동아리: 뭔가를 하고 싶은 사람들이 서로 함께하는 곳
    • 정보 공유
    • 해커톤 개최/참여
    • 대외 컨퍼런스 개최/참여
    • 대외 교육기관 합격/경험자들 다수
      • NEXTERS, SSAFY, SW마에스트로, NAVER 부스트캠프 등
    • 취업한 선배에게 조언 구하기
      • Watcha, P2ACH.AI,한국 소니전자 등
    • (저도 동아리 선배 조언으로 팀 지원 → 합격 후 좋은 경험)

메가콘 2024

71

2024. 9. 26.

메가브레인

72 of 72

감사합니다!

메가콘 2024

72

2024. 9. 26.

QnA