클래스 명에 상위 패키지 명이 들어가야 할까? 에 대한 얘기를 해보려고 한다.
- com.hojak.test
- service
- recommend
- RecommendBookService.class
내가 진행하고 있는 프로젝트에 패키지 구조가 이렇게 돼 있다고 해보자.
recommend 패키지 내에 `RecommendBookService` 클래스가 존재한다.
회사 시니어 개발자분께서 굳이 `RecommendBookService` 클래스 이름에 `Recommend` 라는 단어를 붙일 필요가 있는가? 라는 이야기를 해 주셨다.
이미 패키지에서 `recommend` 라고 표현하고 있는데 굳이 클래스에서 또 `recommend` 라는 단어를 사용할 필요가 있냐는 이야기신 것 같다.
그래서 생각해보니 굳이,,? 라는 생각이 들었다.
왜 내가 이런 클래스명을 짓게 된건지 생각해보니
클래스들을 사용할 때 import 문을 보지 않고 단순히 클래스명만 보고 판단하는 습관 때문에 이러한 일이 생긴 것 같았다.
우선 이 얘기를 하기 전에 다른 오픈소스 프로젝트들을 살펴보도록 하쟈
음,, 우선 패키지에서 ansi 라고 표현을 하고 있는데 패키지 내 클래스에서 ansi 라는 용어를 표현하고 있다.
endpoint 라는 패키지 내에 클래스들에도 endpoint 라는 단어가 포함 돼 있다.
`EndpointFilter`, `EndpointId`, `EndpointsSupplier`등과 같은 클래스들은 endpoint 라는 단어를 사용하지 않았을 때 Filter, Supplier, Id 로 표현 돼야 하는데 다른 곳에서도 사용하는 범용적인? 클래스이기 때문에 endpoint 를 넣어서 사용한 듯하다.
jdbc 패키지 내에 클래스들이다. 여기선 jdbc 라는 단어를 사용하지 않는다.
JdbcDataSourceBuilder, JdbcAbstractDataSourceInitializer, JdbcDatabaseDriver 이렇게 표현하지 않고 모두 jdbc 라는 단어를 제거했다.
여기서 잠깐 드는 생각은 spring 은 기본으로 jdbc 만을 사용하기 때문에 이렇게 패키지로만 표현하고 클래스에선 사용하지 않는게 아닐까 싶다. 다른 곳에서 DataSourceBuilder 이런 식으로 겹치는 부분이 없으니까??
위에서 살펴본 jdbc 패키지 내에 metadata 패키지를 보았다.
여기선 또 metadata 라는 단어를 클래스 이름에 포함시켰다.
왜 여기선 포함시켰는지 모르겠다. 따로 겹치는 클래스는 검색했을 때 없어보이는데 ㅜㅜ
어쨌든,, 상황에 따라서 쓰는 것 같다...개발자 마음대로
구글링 했을 때 맘에 드는 글이 없어서 이런 부분은 어떻게 해야 할 지 모르겠는데 우선 정리하면
1. 패키지 이름은 클래스 이름에 웬만하면 포함시키지 않도록 한다. 최대한 중복되는 단어 없애서 길어지지 않도록
2. 다른 곳에서도 사용되는 클래스 명이라면 패키지 이름은 넣도록 하자. 그래야 구분이 가진다. 다른 도메인을 위한 클래스라 정의된 메소드들도 다른데 패키지 이름 넣지 않아 겹친다면 무척 헷갈릴 듯 하기 때문에.