{ "nodes":[ {"id":"0158693560fb14bc","x":-280,"y":-249,"width":740,"height":349,"type":"text","text":"### ✅ **Service & ServiceImpl 패턴을 사용하는 이유**\n\n1. **유연한 확장 가능**\n - `OrderService` 인터페이스를 사용하면 `OrderServiceImpl` 외에 다른 구현체도 쉽게 만들 수 있습니다.\n - 예를 들어, `MockOrderServiceImpl` 같은 테스트용 클래스를 만들 수도 있음.\n \n2. **기능 변경이 용이함**\n - `OrderServiceImpl`을 수정해도 **외부 코드에서는 `OrderService` 인터페이스만 사용하므로 코드 변경이 최소화**됨.\n \n3. **의존성 주입(DI) 활용**\n - `@Autowired`나 생성자 주입을 사용하면 **구현체를 쉽게 교체 가능**.\n - 예를 들어, 특정 환경에서 다른 `OrderServiceImpl`을 주입할 수도 있음."}, {"id":"b29d63ba63e5986c","x":-560,"y":200,"width":619,"height":232,"type":"file","file":"3.Resource (자료실)/객체지향/Service.md"}, {"id":"7be64dbc90507b8f","x":120,"y":200,"width":620,"height":232,"type":"file","file":"3.Resource (자료실)/객체지향/ServiceImpl.md"} ], "edges":[ {"id":"0424768d1112e00c","fromNode":"0158693560fb14bc","fromSide":"bottom","toNode":"b29d63ba63e5986c","toSide":"top"}, {"id":"677db6457657c145","fromNode":"0158693560fb14bc","fromSide":"bottom","toNode":"7be64dbc90507b8f","toSide":"top"} ] }