우아한테크코스

[우테코] [프리코스] 클린 코드 체크 리스트 읽기

블루베리QA 2022. 10. 29. 15:36

우테코 프리코스의 클린코드 체크리스트를 정리한 글 입니다.

 

자바 경험이 없는 사람의 입장에서 작성했습니다.

 

자바 무경험, 코틀린 3일차 입니다.  레퍼런스 자료에 포커스를 맞춰서 읽어주세요.


자바 코드 컨벤션을 지키면서 프로그래밍했는가? 

 

https://google.github.io/styleguide/javaguide.html
https://myeonguni.tistory.com/1596 참고한다.

코드 컨벤션이란?

O 원어 그대로 code(코드) + 컨벤션(규칙) 이다.

O 코드 유지보수에 들어가는 시간의 절약

O 신입 개발자, 또는 타인의 실수로 코드가 오염되는걸 막기 위한 방지책

O 코드 문화의 차이로 커뮤니케이션 오류가 발생하지 않도록 도와주는 하나의 가이드 라인

 

예시 ) " 메서드 이름과 그 메서드의 파라미터 리스트의 시작인 괄호 "(" 사이에는 빈 공간이 없어야 한다. "

 

 

IntelliJ 또는 Eclipse 통합 개발 도구에서 formatting을 한다.

IDE(통합개발도구)에 코드 컨벤션을 적용하는 것이 가능하다.

초기에 설정함으로써 많은 도움을 받을 수 있음으로, 꼭 추가하고 시작할 것을 추천합니다.

 

 

 

IntelliJ에 Google Java Style Guide 적용하기 (feat. Naver)

Google Java Style Guide는 구글에서 자바를 사용할 때 코드를 작성하는 사람, 읽는 사람의 편의성을 위해 양식을 통일해둔 것이다.https://google.github.io/styleguide/javaguide.html(구글 자바 스타일 가이드

velog.io

 

 

 

 

IntelliJ Kotlin Code Style 설정법

IntelliJ에 Kotlin 권장 Code Convention 설정하기

velog.io

 


 

한 메서드에 오직 한 단계의 들여쓰기(indent)만 허용했는가? 

O 반복문과 조건문을 사용할 때 마다 늘어나는 들여쓰기를, 메소드를 사용해서 줄여준다.

 

 

 

악취나는 코드 개선하기 시리즈 - 심하게 중첩된 코드

IntelliJ 블로그에 올라온 시리즈물을 번역 & 재정리 하였습니다. 2. Code Smells: 심하게 중첩된 코드 악취나는 코드 개선하기 시리즈를 계속 진행하며, 이번 포스트에서는 명백한 리펙토링을 거부하

jojoldu.tistory.com


else 예약어를 쓰지 않았는가?

else 예약어를 쓰지 않았을 때의 장점?

O 코드가 간결해지고 명확해진다.

O 객체지향적인 구조가 된다.

O 오류가 발생할 확률을 줄여준다. ( else를 사용했을 때 오류가 발생할 확률이 더 높다. )

Else문 제거 전
Else문 제거 후



 

 

else 예약어를 쓰지 않는다

이 글은 우아한테크코스 리뷰 페이지에 함께 게시된 글입니다. The ThoughtWorks Anthology의 더 나은 소프트웨어를 향한 9단계: 객체지향 생활 체조 중 규칙 2에 대한 내용이다.

velog.io

 


모든 원시값과 문자열을 포장했는가?

원시값이란?

: 객체가 아니면서 메서드도 가지지 않는 데이터

 

원시값의 포장이란?

: 원시값을 객체에 넣어주는 것

원시값의 포장

 

 

 

원시 타입을 포장해야 하는 이유

변수를 선언하는 방법에는 두 가지가 있다. 원시 타입의 변수를 선언하는 방법과, 원시 타입의 변수를 객체로 포장한 변수를 선언하는 방법이 있다. (Collection…

tecoble.techcourse.co.kr

 

 

+ 이해가 되지 않는 분들을 위해서

 

위 설명이 간단해 보이지만, 자바 지식이 없는 나에게는 이게 왜 필요한지 전혀 이해가 되지 않았다.

결론적으로, 아래 2가지의 지식이 더 필요했다.

 

O Object Access Operator

O Wrapper Object

 

이 두가지 지식은 이고잉 선생님의 유튜브 강의에서 발견할 수 있었다.

 

 


콜렉션에 대해 일급 콜렉션을 적용했는가?

바로 위 체크리스트에서 원시값을 객체로 변경해서 사용성을 높이고 Validation을 줄인 것과 비슷함

사실 나도 아직 완벽하게 이해가 되지 않는다, MutableMap, HashMap에 대한 개념도 부족한 상태라....

 

일급 콜렉션을 사용함으로써 생기는 장점?

O 비지니스에 종속적인 자료구조
O Collection의 불변성을 보장
O 상태와 행위를 한 곳에서 관리
O 이름이 있는 컬렉션

 

하기 블로그 설명 발췌

 

 

일급 컬렉션 (First Class Collection)의 소개와 써야할 이유

최근 클린코드 & TDD 강의의 리뷰어로 참가하면서 많은 분들이 공통적으로 어려워 하는 개념 한가지를 발견하게 되었습니다. 바로 일급 컬렉션인데요. 왜 객체지향적으로, 리팩토링하기 쉬운 코

jojoldu.tistory.com


3개 이상의 [인스턴스 변수]를 가진 클래스를 구현하지 않았는가?

O 자바의 변수에 대해 먼저 알아야 이해가 가능하다.

public class test {

	int iv; // 인스턴스 변수
	static int cv; // 클래스 변수
	
	void method() {
		int lv; // 지역 변수
	}
}


 

[JAVA] 자바의 변수 (클래스 변수, 인스턴스 변수, 지역 변수)

이 글은 PC 버전 TISTORY에 최적화 되어있습니다. 선언 위치에 따른 변수의 종류 자바에서의 변수는 클래스 변수, 인스턴스 변수, 지역 변수가 있습니다. 변수의 종류를 결정짓는 것은 '변수가 선언

itmining.tistory.com

 

쉽지 않은 연습일 수 있다. 가능하면 인스턴스 변수의 수를 줄이기 위해 노력한다.

인스턴스 변수가 많아지면 발생하는 단점

 새로운 인스턴스 변수를 가진 클래스는 응집도가 떨어진다. 많은 인스턴스 변수를 가진 클래스로 응집력있는 단일 작업을 설명할 수 있는 경우는 거의 없다. (추측) 여기서 말하는 인스턴스 변수는 기본형 또는 자료구조형 객체들인 것으로, 일급 컬렉션이나 wrapper객체는 해당되지 않는 것 같다.

 

 

 

[Java] 객체지향 생활 체조 원칙 9가지 (from 소트웍스 앤솔러지)

1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.  한 메서드에 들여쓰기가 여러 개 존재한다면, 해당 메서드는 여러가지 일을 하고 있다고 봐도 무관하다.  메서드는 맡은 일이 적을수록(잘게

jamie95.tistory.com


getter/setter 없이 구현했는가?

먼저 아래 문장에 대한 이해가 필요하다.

객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.

예시 ) 객체 외부에서 직접적으로 접근하는 방법

var speed = 10
speed = 20
speed = 30
따라서 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다.

예시 ) 메소드를 통해서 데이터를 변경하는 방법

void setSpeed(double speed) {
    this.speed = speed;
    }

 

위 설명과 같이, 객체 지향 프로그래밍에서는 메소드를 통해서 객체 값을 변경시켜야 하는데,

 

O 객체 값을 변경 시키는 메소드를  Setter  ( Set )

[ 더하기, 빼기, 곱하기, 바꾸기 ]

O 객체 값을 읽어오는 메소드를 Getter ( Get )

[ 초 > 분 > 시, km > m > cm ]

 

로 구분한다.

 

 

[Java] - Getter, Setter 메소드

일반적으로 객체 지향 프로그래밍에서는 객체의 필드를 객체외부에서 직접적으로 접근하는 것을 막는다. 그 이유는 외부에서 마음대로 변경할 경우 객체의 무결성이 깨질 수 있기 때문이다. 예

data-study-clip.tistory.com

 

이렇게 Getter와 Setter를 사용하면 필드값을 안전하게 변경/사용 할 수 있게 된다!

 

하지만 프리코스 체크리스트에는 Getter와 Setter를 사용하지 말라고 말한다.

 

핵심 로직을 구현하는 도메인 객체에 getter/setter를 쓰지 않고 구현했는가?

Getter / Setter 를 사용했을 때의 단점

O Setter 사용의 의도를 알기 어려움

O 값의 일관성 유지에 어려움

O Builder의 사용해서 대체 가능

 

 

Setter의 사용 금지

프로젝트 진행중 엔티티나 DTO에 setter를 사용하게 되는 일이 종종 발생하게 되는데, 이는 일관성 유지에 어려움 등의 여러가지 문제점으로 인해 사용이 금지된다. ① Setter 사용의 의도를 알기 어

dodop-blog.tistory.com

 

단, DTO는 허용한다.

 

DTO란? ( Data Transfer Object )

 

VO라고도 표현하며 계층 간 데이터 교환을 위한 자바 빈즈(Java Beans)이다.

데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다. DTO는 보통 로직을 가지고 있지 않고 data와 그 data에 접근을 위한 getter, setter만 가지고 있다.

정리하면 DTO는 Database에서 Data를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체를 말한다.

 

[JAVA] DAO, DTO, VO 개념, 차이

1. DAO(Data Access Object) 데이터베이스의 data에 접근하기 위한 객체이며 데이터베이스 접근을 하...

blog.naver.com



메소드의 인자 수를 제한했는가?

메소드 인자 수 증가에 따른 오류 발생률 비교 표

 

Java에서 method작성시 파라미터 개수를 5개미만으로 해야하는 이유??

17년 Google 개발자들이 참여한 논문인 Detecting Argument Selection Defects에 따르면, 5개 이상 인자(argument)을 받을때 개발시 생기는 오류가 급속도로 늘어남을 확인했다고 한다. By analyzing the defects..

blog.voidmainvoid.net

 

 


추가 레퍼런스

https://www.youtube.com/watch?v=tfUGpLp0tgM