1. 배경 (Background)
학원에서 순수 자바(Servlet/JSP)에서 Spring Boot와 MyBatis로 넘어가면서 파일이 많아지고 구조가 복잡해졌다. REST API를 짜면서도 "도대체 MVC 패턴이 뭐고, 왜 이렇게 쪼개는 거지?"라는 의문이 들어 개념을 확실히 정리하게 되었다.
2. MVC 패턴과 Model의 진화
MVC는 Model, View, Controller의 약자로 애플리케이션의 역할을 나누는 것이다. Spring Boot로 넘어오면서 'Model'의 역할이 세분화되었다.
📌 구조의 변화
- Controller: 여전히 교통정리(요청/응답) 담당.
- Model (세분화됨):
- Service: 핵심 비즈니스 로직 (What).
- Mapper: DB 접근 및 SQL 실행 (How).
- DTO/VO: 데이터 운반체 (그릇).
- View: 화면 출력 (React, JSP 등).
💡 왜 나눌까? 단순히 코드를 길게 쓰려는 게 아니라 **유지보수, 협업, 보안(DTO 분리), 가독성(Mapper 분리)**을 위해서다.
3. Service 인터페이스: 꼭 만들어야 할까? (Deep Dive)
학원에서는 Controller → Service(인터페이스) → ServiceImpl(구현체) 구조가 정석이라고 배웠다. 하지만 실무에서는 "인터페이스 없이 클래스만 쓰는 방식"도 많이 쓴다는 사실을 알게 되었다.
🆚 두 방식 비교
- Interface + Impl (정석): 유연함. 구현체가 바뀔 때 유리함. (SI, 대규모 프로젝트 선호)
- Class Only (요즘 트렌드): 빠르고 단순함. 파일 관리가 편함. (스타트업, 자체 서비스 선호)
🧐 왜 예전엔 "무조건 인터페이스"였을까? (역사적 배경)
과거에는 기술적인 한계 때문에 인터페이스가 필수였다.
① Spring AOP (프록시 기술의 제약)
- 비유: 스프링의 기능(트랜잭션 등)은 '스턴트맨(Proxy)'이 대신 수행한다.
- 과거 (JDK Dynamic Proxy): 스턴트맨이 연기를 하려면 반드시 **'대본(Interface)'이 있어야 했다. 대본이 없으면 에러가 났다.
- 현재 (CGLIB): 기술이 발전해서 스턴트맨이 '배우(Class)' 자체를 똑같이 변장(상속)해서 연기할 수 있다. 대본(Interface)이 없어도 된다!
② Mock 테스트 (가짜 객체)
- 비유: 테스트를 위해 '마네킹(Mock)'을 만들어야 한다.
- 과거: 설계도(Interface)가 없으면 마네킹을 못 만들었다.
- 현재 (Mockito): 3D 스캔하듯이 실물(Class)만 있어도 바로 마네킹을 만들 수 있다.
4. 요즘 트렌드: YAGNI 원칙
"You Aren't Gonna Need It (너 그거 나중에 필요 없어)"
- 과거: "나중에 구현체가 2개 될 수도 있으니까 미리 인터페이스 만들자." (마치 여름에 스키 장비 챙기는 격)
- 현재: "90%는 구현체 하나만 쓴다. 필요해지면 그때 리팩토링하자. 지금은 가볍게 가자." (필요한 수영복만 챙기기)
5. 결론 및 회고 (Retrospect)
오늘 공부를 통해 단순히 코드를 따라 치는 것을 넘어 MVC 패턴의 진짜 의미를 알게 되었다. 특히 "왜 인터페이스를 쓰는가?"에 대해 막연했는데, 과거의 기술적 제약과 현재의 트렌드 변화(YAGNI)까지 알게 되어 시야가 넓어진 기분이다.
- 배운 점: MVC는 역할 분담을 위한 것이며, Spring 환경에서 Model은 Service, Mapper, DTO로 구체화된다.
- 느낀 점: 지금은 학원 커리큘럼에 맞춰 '정석(Interface+Impl)'대로 연습하겠지만, 실무에서는 상황에 따라 유연하게 '클래스 방식'을 선택할 수도 있다는 기술적 유연성을 알게 되어 뿌듯하다. 무조건 외우는 게 아니라 "왜?"를 아는 개발자가 되어야겠다.
👉 Next Step
- 이번 프로젝트는 정석대로 구현해보고, 개인 토이 프로젝트 때는 인터페이스 없이 빠르게 개발해 보며 속도 차이를 체감해 보기!
'Engineering > Backend Core' 카테고리의 다른 글
| [Spring Boot] 백엔드 핵심 흐름: JPA와 DDD, 그리고 AWS S3 (0) | 2025.12.09 |
|---|---|
| [Backend] DB 성능 최적화: 커넥션 풀(Connection Pool)과 HikariCP의 등장 (0) | 2025.12.09 |
| 코딩테스트 연습 - 홀짝 구분하기 (0) | 2025.09.30 |
| 코딩테스트 연습 - 문자열 돌리기 (0) | 2025.09.30 |
| 코딩테스트 연습 - 문자열 붙여서 출력하기 (0) | 2025.09.30 |