728x90
오늘 학습한 내용
리팩토링 배경
기존 코드에서는 매니저 클래스가 과도한 역할을 담당하며, 여러 매니저 클래스 간의 의존성이 높아 유지보수가 어려운 문제가 있었습니다.
특히 매니저 클래스가 직접 데이터를 관리하고 참조값을 들고 있었기 때문에 씬 전환 시 객체가 사라지면서 NullReferenceException 오류가 발생하는 문제가 발생했습니다.
또한, Player 객체가 각 씬마다 수동으로 배치되어 공통된 데이터 공유가 어렵고 씬 전환 시 상태 유지가 어려운 문제도 있었습니다.
이를 해결하기 위해 리포지토리 패턴을 적용하여 데이터를 체계적으로 관리하고, 각 클래스의 역할을 명확히 분리했습니다.
문제 및 해결 과정
문제
1) GameManager의 역할 과다
- GameManager가 데이터 관리까지 담당하며 하나의 클래스에 과도한 책임이 집중됨.
- 여러 매니저 클래스가 서로 직접 참조하며 결합도가 높아 유지보수가 어려움.
2) 씬 전환 시 객체 참조 문제
- DontDestroyOnLoad를 사용하여 매니저 클래스는 유지되지만 씬 전환 시 참조하는 객체들이 삭제되면서 NullReferenceException이 발생함.
- 예를 들어, GameManager가 Player의 정보를 참조하지만, 씬이 바뀌면 Player 객체가 사라지면서 문제가 발생함.
3) Player 상태 유지 문제
- Player가 각 씬마다 개별적으로 배치되어 일관된 정보 공유가 어렵고 씬 전환 후 동일한 상태를 유지할 수 없음.
- 씬이 변경될 때마다 Player를 수동으로 배치해야 하며, 데이터 동기화가 어려움.
시도한 해결 방법
1) 리포지토리 패턴 도입
각 매니저마다 필요한 데이터를 관리하는 리포지토리 클래스를 생성하고, 매니저가 데이터를 직접 관리하는 대신 리포지토리를 통해 데이터에 접근하도록 변경함.
리포지토리 예시
- GameRepository → Player 프리팹, 스폰 위치 관리
- SkillRepository → 스킬 데이터 및 SkillUI 관리
2) Player 생성 방식 개선
- 기존에는 씬에 Player를 배치했으나 씬 시작 시 저장된 정보로 동적으로 생성하도록 변경.
- GameRepository에서 프리팹과 위치 정보를 가져와 생성하도록 수정.
- 씬 전환 후에도 이전 상태를 유지할 수 있도록 데이터 저장 방식을 개선.
3) 스킬 시스템 개선
- SkillRepository를 생성하여 스킬 데이터(SkillDataSO)와 UI관련을 관리하고 필요할 때 조회할 수 있도록 수정함.
- SkillController는 플레이어 입력을 받아 스킬을 실행하는 역할로 범위를 줄이고 개별 스킬 객체를 직접 다루도록 변경함.
- SkillManager가 직접 스킬을 생성하는 방식에서 SkillRepository를 통해 생성하는 방식으로 변경하여 스킬 로직과 데이터 관리를 분리함.
- SkillBase에서 MonoBehaviour를 제거하여 스킬 데이터와 게임 오브젝트 간의 불필요한 의존성을 해소하고 확장에 유리하도록 개선함.
결과
1) 책임 분리
- 데이터와 로직이 각 리포지토리와 매니저에서 관리되면서 Manager들의 역할 최소화.
- 매니저 클래스 간 의존성이 감소하여 유지보수가 쉬워짐.
2) 유지보수성 향상
- 매니저 클래스가 더 이상 개별 데이터를 관리하지 않으므로 클래스 간 결합도가 낮아짐.
3) 확장성 증가
- 새로운 데이터를 추가할 때 기존 코드를 수정할 필요 없이 리포지토리만 수정하면 되는 구조로 변경됨.
4) 버그 감소
- 데이터 참조 방식이 명확해져서 씬 변경 시 NullReferenceException 발생 가능성이 줄어듦.
- DontDestroyOnLoad를 사용하면서도 씬 전환 후 데이터가 안정적으로 유지됨.
새롭게 알게 된 점
- 리포지토리 패턴을 활용하면 데이터 접근과 관리를 분리할 수 있어 유지보수가 유리합니다.
- DontDestroyOnLoad를 사용할 때는 씬 전환 후에도 올바르게 데이터를 반영할 수 있도록 주의해야 합니다.
- 씬 전환 시 공통된 객체를 동적으로 생성하면 오브젝트 관리에 유리합니다.
728x90
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 Unity - TIL : 25.02.24 (0) | 2025.02.24 |
---|---|
내일배움캠프 Unity - TIL : 25.02.21 (0) | 2025.02.21 |
내일배움캠프 Unity - TIL : 25.02.18 (2) | 2025.02.18 |
내일배움캠프 Unity - TIL : 25.02.17 (4) | 2025.02.17 |
내일배움캠프 Unity - TIL : 25.02.14 (0) | 2025.02.14 |