코드 냄새 301 - 데이터베이스를 파라미터로 전달하는 문제
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 소프트웨어 개발자 및 아키텍트
- 난이도: 중급 이상 (코드 품질 개선 및 설계 원칙 이해 필요)
핵심 요약
- 데이터베이스를 파라미터로 전달하는 것은 코드 냄새로, 단일 책임 원칙을 위반하며 테스트 및 유지보수에 어려움을 유발
- 의존성 주입(Dependency Injection) 또는 환경 변수를 사용해 데이터베이스 연결을 분리하는 것이 권장됨
- 테스트 코드와 실제 구현의 분리를 위해 팩토리 패턴 또는 컨피그 파일을 활용해야 함
섹션별 세부 요약
1. 코드 냄새 정의
- 데이터베이스를 파라미터로 전달하는 행위는 코드의 유연성과 확장성을 저해
- 예시:
function getUser(db) { ... }
에서db
가 실제 데이터베이스 연결 대상이 될 경우 - 문제점: 단위 테스트 시 모의 데이터베이스를 생성해야 하며, 실무에서 데이터베이스 연결이 복잡해짐
2. 설계 원칙 위반
- 단일 책임 원칙(SRP) 위반: 함수가 데이터베이스 연결을 처리하는 역할과 비즈니스 로직을 동시에 수행
- 의존성 역전 원칙(DIP) 위반: 구체적인 데이터베이스 구현에 의존하게 되어 추상화 불가
- 결과: 코드 재사용성 감소 및 결합도 증가
3. 해결 방안
- 의존성 주입(DI): 데이터베이스 연결 객체를 외부에서 주입해 함수의 내부 구현과 분리
```javascript
function getUser(repository) { repository.findUser(...) }
```
- 환경 변수 활용:
.env
파일 또는 설정 파일에서 데이터베이스 연결 정보 관리 - 팩토리 패턴: 데이터베이스 연결을 생성하는 책임을 별도의 팩토리 클래스로 분리
4. 테스트 및 유지보수 고려사항
- 모의 객체(Mock Object) 사용: 테스트 시 실제 데이터베이스 대신 가상 객체로 대체
- 구성 파일 분리: 프로덕션/테스트 환경별 설정을
config/production.js
,config/test.js
등으로 구분 - DI 컨테이너 사용: Spring, Dagger 등 의존성 주입 프레임워크 활용하여 관리 용이
결론
- 데이터베이스 연결은 파라미터로 전달하지 말고, 의존성 주입 또는 환경 설정 파일을 통해 분리해야 한다.
- 팩토리 패턴과 DI 컨테이너를 활용해 코드의 유연성과 테스트 가능성을 극대화하고, 단일 책임 원칙을 준수하는 것이 실무에서 권장됨.