Search

코드 리뷰 모음

Created
2024/11/06 00:58
태그
코딩 스타일
Status
Done

직접 받은 코드 리뷰

DB 설계는 신중하게

테이블 이름이 불편하게 느껴져 기존의 이름을 수정하고 싶은 마음은 이해하고 공감하지만, 그로 인해 수정 되어야하는 수많은 코드들과 그 과정에서의 실수로 인한 운영 장애 발생 비용을 고려하면 불편해도 그냥 쓰는 것이 나을 수 있다.

제약조건을 걸 때

특정 행동을 막기 위한 제약조건을 걸 때 좋은 방법의 순서로는 DB 제약조건 < nullable 명시 < 인스턴스 생성 시점에 검증이다. DB 제약조건 뿐만 아니라 JPA 컬럼 옵션과 팩토리 메서드를 잘 사용하자.

테스트 코드 작성 시 검증은 가급적 리터럴로

검증을 리터럴로 하는 것은 가독성과 검증 실수 방지 측면에서 좋다. 가급적 리터럴로 검증하자.
객체 검증이더라도 해당 객체가 equals가 정의되어있다면 새 인스턴스를 만들어 비교하고, equals가 정의 되어있지 않다면 필드를 하나씩 꺼내 리터럴로 비교하자.
추가적으로 우아한 코스 코드 리뷰에서도 이와 비슷한 내용이 있다.

Early 리턴 활용하기

if (a == null || aClass.isNone()) { return false; } return true;
Java
복사
위 방식보다
if (a == null) { return false; } return !aClass.isNone();
Java
복사
이 방식이 더 직관적이고 가독성이 좋을 수 있다. 잘 고민해보자.

테스트에서는 가급적 독립적인 환경에서

예를들어 DB를 연결해 통합 테스트를 진행한다고 하면, 사용자가 직접 정의한 FetchJoin 을 사용하기보다 Spring Data JPA의 findById를 두 번 호출하는 것이 더 좋다. 사용자가 정의한 메서드는 바뀔 수도 있기 때문에 테스트 환경을 독립적으로 만들기 어렵다. 가급적 격리되도록 테스트를 작성하자.

우아한 코스 리뷰 모음

다형성을 활용하는게 아니라면 상속(Inheritance)보다 조합(Composition)을 고려하기

다형성을 활용한다면 추상 클래스를 이용한 확장(extends)보다 인터페이스를 통한 구현(implement)을 사용하고,
상속과 조합을 선택할 수 있는 상황이라면 조합으로 풀어내는 것이 좋다.
추상 클래스를 이용한 상속은 장점은 명확하지만, 상속으로 인해 자식 클래스가 불필요하더라도 부모의 필드와 메서드를 가져야하고 그로 인해 구조가 굳어버릴 가능성이 높고 코드의 유연성이 낮아진다.
상속 : PersonStudent extends Person
조합 : PersonStudent { private Person person }

코드가 난잡하다고 느껴지면 객체 분리를 고민하기

코드가 난잡하다고 느껴지는 점은 너무 많은 필드나 메서드를 포함하고 있기 때문일 확률이 높다. 그럴 때는 해당 객체가 너무 많은 역할을 담당하고 있는게 아닌지 고민해보고 객체의 분리를 고려해보자.

for문과 Stream을 고민할 때는 가독성을 생각해보기

데이터가 50만 개가 넘어가지 않는 이상 성능의 차이는 거의 없다. for문으로 작성했을 때와 stream으로 작성했을 때를 비교해보고 더 나은 가독성을 선택하자.

static 메서드와 static 클래스는 안티 패턴

static을 사용하면 메모리의 static 영역에 할당이 되고, 모든 객체가 공유하는 메모리와 객체를 생성하지 않아도 static 자원에 접근이 가능하다는 장점이 있다. 하지만 Java는 객체지향언어로 static 메서드와 클래스는 객체지향 패러다임의 장점을 활용할 수 없는 방식이다. Util 클래스나 팩터리 메서드가 아닌 이상 static 메서드는 지양하고 static 클래스는 inner 클래스에서만 사용하자.

VO는 equals & hashCode 재정의를 고려하자

VO는 값 비교를 할 가능성이 높기 때문에 equals & hashCode를 재정의를 고려해보는 것이 좋다. 더 나아가 java 15부터 도입된 record를 사용하는 것을 고려하는 것도 좋다.

HashMap 보다는 EnumMap, List나 Set보다는 EnumSet 사용을 고려하자

Enum만을 key로 받아 해싱이 필요없고 내부적으로 배열을 사용하기 때문에, HashMap이나 List보다 성능이 우수하다. 하지만 thread-safe하지 않기 때문에 목적이 캐싱 용도라면 ConcurrentHashMap을 사용하거나 Collections.synchronizedMap(new EnumMap<…>…)을 사용하자.

타입 캐스팅과 타입 체크는 객체지향스럽지 않다

참고