1. 싱글톤 패턴 (Singleton Pattern)
✅ 정의
- 하나의 객체를 공유해서 사용하는 패턴
- 클래스 내부에 단 한 번만 객체를 생성하고, 계속 그 객체만 반환
✅ 핵심 개념
- 하나의 클래스 변수에 단 한 번 객체가 할당되고, 이후에는 바뀌지 않음
- 모든 코드에서 동일한 인스턴스를 공유함
🤝 의존성 주입(DI)과 결합도 완화
- 의존성 주입: 클래스의 멤버변수를 생성자를 통해 외부에서 주입하는 방식
🔹 장점
- 다양한 구현체(
MemberRepo, SalesRepo 등)를 유연하게 주입 가능
- 테스트 코드에서
MockRepo 등으로 교체 쉬움
🔹 단점 (DI를 사용하지 않을 때)
- 클래스 내부에서
new로 직접 생성하면,
- 특정 구현체로 고정됨
- 테스트 및 확장이 어려움
- 결합도 상승
❗ 오해 주의
싱글톤은 하나의 테스트에서 한 객체를 공유하는 구조이지,
모든 테스트나 전역 코드가 무조건 같은 객체를 강제 공유하는 구조는 아님.
2. 팩토리 패턴 (Factory Pattern)
✅ 정의
- 객체 생성 로직을 팩토리(공장)에 위임해
객체의 생성과 사용을 분리하는 패턴
❌ 직접 생성 시 문제점 (결합도 높음)
Animal animal = new Dog(); // 강한 결합
Dog 클래스가 바뀌면 이 코드도 함께 수정해야 함
- 클래스 이름, 생성자 변경 시 영향 받음
✅ 팩토리 패턴 적용 (결합도 낮음)
Animal animal = AnimalFactory.getAnimal("Dog");
- 객체 생성 책임을
AnimalFactory에 위임
main() 등 사용하는 코드 변경 없이 새 동물 추가/변경 가능
✅ 핵심 효과
- 결합도 감소: 객체 생성 로직을 감춤
- 유지보수 용이: 팩토리만 수정하면 됨
- 확장성 증가: 다양한 구현체 대응 가능
interface Animal {
void speak();
}
class Dog implements Animal{
public void speak(){
System.out.println("멍멍");
}
}
class Cat implements Animal{
public void speak(){
System.out.println("야옹");
}
}
public class Factory {
public static Animal getAnimal(String type){
if(type.equals("Dog")){
return new Dog();
}
return new Cat();
}
public static void main(String[] args){
Animal dog = getAnimal("Dog");
dog.speak();
Animal cat = getAnimal("Cat");
cat.speak();
}
}
💡 요약
| 항목 |
직접 생성 (new) |
팩토리 패턴 사용 |
| 결합도 |
높음 |
낮음 |
| 유연성 |
낮음 |
높음 |
| 변경 시 영향 |
코드 여러 곳 수정 필요 |
팩토리만 수정하면 됨 |
| 테스트 용이 |
낮음 |
높음 |