코드 품질
- 좋은 코드를 위해 지켜야 할 것 중 가장 인상 깊었던 점들은 아래와 같다.
- 다른 개발자, 또는 미래의 나 자신이 사용할 것을 고려해 예측 가능한 코드를 작성해야 한다.
- 추상화 계층을 잘 만들면 각 계층의 코드를 이해, 사용, 테스트하기 쉬워진다.
단위 테스트와 TDD
- 단위 테스트를 작성하는 이유
- 테스트 작성 이유: 내가 구현한 기능이 의도대로 작동함을 보장하는 상태로 개발을 진행하기 위해서
- “단위” 테스트여야 하는 이유: 보다 큰 범위에 대해 테스트 코드를 작성하면, 정확히 어느 부분에서 잘못 동작하는 것인지 파악하기 어려우므로 단위 테스트를 작성한다.
- TDD
실패 테스트 작성 → 테스트 성공 → 리팩터링
을 빠른 주기로 반복하며 도메인 로직 구현에 집중할 수 있다.
MVC 패턴
- UI와 비즈니스 로직을 분리함으로써, 서로 영향을 받지 않고 쉽게 유지보수할 수 있게 하는 디자인 패턴이다.
원시값 포장
- 원시 데이터 유형으로는 도메인에서 의미하는 값을 정확히 표현하기 어려울 수 있다.
- 이를 위해 원시값 포장으로 도메인을 표현하고 검증할 수 있다.
예외 처리
- Checked Exception, Unchecked Exception 사용에 대한 나만의 기준
- 예외가 전파되는 다음 클래스에게 예외 처리를 강제해야 할 때는
Checked Exception
을 사용하는 게 좋다.
- 예외가 전파되는 다음 클래스가 해당 예외에 대해 알 필요가 없을 때는
Unchecked Exception
을 사용한다.
방어적 복사 / 변경 방지
- 방어적 복사: 인자값 또는 반환값으로 객체를 전달했을 때 내외부에서 같은 주소를 참조하는 것을 방지하기 위해,
new ArrayList<>()
로 주소값의 참조를 끊어내고 새로운 객체로 복사한다.
- 변경 방지:
Unmodifiable Collection
는 원본 주소를 가지고 있지만 외부에서 변경을 위한 메서드를 호출 시 예외를 발생시키는 방식으로 변경을 방지한다.
Enum
- 열거 타입(Enumeration Type)은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 컴파일 시점 이후에는 다른 상수 값이 추가될 위험이 없다.
- 일반 클래스 타입의 값은
데이터 타입 -> 값
과 같은 관계를 가지지만 Enum 클래스의 값은 데이터 타입 -> 이름 -> 값
으로 이루어지기 때문에, 집합 요소에 대한 이름을 명명할 수있다.
Generic
- 제네릭은 데이터 타입을 일반화한다.
- 클래스, 메소드에서 사용하는 내부 데이터 타입을 컴파일 시 지정하기 때문에,
Object
타입으로 일반화하는 것과 달리 미리 타입에 대해 검사할 수 있다.