몇년 전, 새로운 환경으로 오게되면서 코드리뷰도 처음 받게되고 오래된 히스토리를 분석하는 일도 많았다.
그런 과정에서 느낀 몇가지 규칙들을, 나중에 잊지 않기위해서 혹은 누군가에게는 도움이 될 수 있을것 같아서 남긴다.
참고로 클린코드랑은 조금 다르고 하위하위호환이 맞지않을까 싶다.
규칙
deps는 되도록 낮춘다
가끔 이런 코드를 볼 수 있다.
if(obj != null) {
if(obj2 != null) {
if(obj3 != null) {
...
}
}
}
개인적으로 이렇게 if 중첩이 있으면, 조건안의 조건 식으로 생각을 하게되는 편이다.
아래와 같이 하나씩 먼저 예외적인것들을 걷어내주는게 좀 더 눈에 잘 들어온다.
if(obj == null) {
return;
}
if(obj2 == null) {
return;
}
if(obj3 == null) {
return;
}
...
조건을 쓸때는 상수를 먼저 사용하자
if문안에 조건이나, boolean 값을 만들때 사용하는 조건식에는 상수를 먼저 써줘야한다.
NPE(NullPointException)를 조금이라도 줄이는 방법이다.
아래와 같은 메소드가 있다고 가정한다.
public String appendText(String text) {
// "no" 인 경우 예외처리
if(text.equals("no")) {
return;
}
...
}
text 매개변수가 null이라면 npe가 발생할 것이다.
하지만 아래와 같이 고친다면?
public String appendText(String text) {
// "no" 인 경우 예외처리
if("no".equals(text)) {
return;
}
...
}
"no"를 먼저 사용하는것으로 조건식을 변경해주면 exception이 발생하지도 않고, 조건 의도와 맞아 떨어진다.
장애가 발생할 수 있는 리스크를 줄이자.
트랜잭션 처리는 최소 범위로 해주자
트랜잭션은 성능이나 Lock과 직결되는 부분이기 때문에 필요 없는 부분은 덜어내주는게 좋다.
Util을 잘 활용하자.
StringUtils, CollectionUtils 등 null체크와 공백체크를 동시해 하지 않아도 유틸을 사용하면
하나의 메소드로 처리할 수 있고, 가독성이 올라간다.
ex)
1. CollectionUtils
list == null || list.isEmpty()
=> CollectionUtils.isEmpty(list)
2. StringUtils
str == null || str.trim().equals("")
=> StringUtils.isBlank(str);
고정된 String 필드를 받아야 한다면 Enum을 활용
쉬운 부분이지만, 내가 신입땐 몰랐던 것처럼 모르는 사람이 많을 수 있다고 생각한다.
예를들어 api를 위한 DTO를 생성할때 "N"이나 "Y"값으로 받는 필드가 있다면,
class RequestDTO {
...
private String useYn;
...
}
useYn이라는 Y혹은 N만 받는 필드가 있다고 가정한다.
만약에 위처럼 String으로 선언해버리면 "y"라던가 "no"라던가 의도치 않은 값까지 받을 수 있고,
이를 계속 예외처리 해줘야한다.
하지만 아래처럼 바꿔준다면
class RequestDTO {
...
private CodeYn useYn;
...
enum CodeYn {
Y, N
}
}
useYn 필드는 Y나 N이 아닌경우 에러를 응답한다.
추가적으로 예외처리 할 필요가없다.
변수 선언을 미리 하지 말자
for문 안이나, 당상 쓰지 않는 변수를 미리 선언한다면 가비지 객체가 될 수 있다.
한번에 많은양의 select는 DB에 부담을준다
환경마다 다르겠지만 select할때 인덱싱과 리미트는 항상 꼭 고려해주자.
난 1000건을 기준으로 잡는다.
적을게 너무 많아서 계속 작성 중...
'Java' 카테고리의 다른 글
String은 왜 불변 객체로 만들었을까? (0) | 2022.05.06 |
---|---|
StringBuilder 살짝 까보기 (생성자, append) (0) | 2022.05.06 |
Java String CompareTo 메서드 (0) | 2021.10.14 |
Java 데이터 타입 Primitive type(기본형) Reference Type(참조형) (0) | 2021.10.13 |
Java String, StringBuilder, StringBuffer (0) | 2021.10.12 |