99클럽 12일차 TIL: MVC
2024. 4. 15. 17:35ㆍ개발 공부
728x90
반응형
#1. 오늘의 학습 키워드
자바 스프링에서 MVC 의 개념
- 노드에서 자바 스프링부트로 리팩토링하는 과정에서, 개인적으로 언어 자체의 친숙도 문제 이외에는 크게 어려운 작업이 아니었던 이유는 코드 패턴이 흡사하였기 때문이다.
- Node
- Router (controller) → Service → DAO 패턴
- Spring
- Controller → Service → Repository 패턴
- Node
- 여지껏 위 패턴으로 백엔드 개발을 진행해왔다 보니, 스프링을 사용하여 개발을 할 때는 MyBatis 를 사용하였기에 SQL 쿼리를 직접 구현하는 부분 제외하고는 처음엔 크게 익숙치 않은 구석은 없었다.
- 그럼 이쯤에서 질문을 할 수 있겠다.
- 이러한 패턴은 뭐라고 부르는 것일까?
- 이러한 패턴은 직접 사용해보니 직관적이고 구현하기 편리한 것을 느끼긴 했지만, 정확히 어떤 이점덕에 도입이 되었고, 프로그래밍 언어에 의존하지 않고 광범위하게 쓰일 수 있는 것일까?
#2. 공부한 내용
- MVC
- Model, View, Controller
- UI, 데이터, 논리를 구현하는 데 사용되는 SW 디자인 패턴
- Model
- 서비스에 필요한 모든 데이터를 정의한다.
- 그렇기에 DB 와 연동하는 부분을 담당한다.
- 서비스에 필요한 모든 데이터를 정의한다.
- View
- 프론트엔드 개발자가 담당하는 부분
- 즉 화면 UI 구현과 클라이언트 사이드 로직도 포함
- 프론트엔드 개발자가 담당하는 부분
- Controller
- Model 과 View 사이의 연결 역할
- Model로 들어가고 나오는 데이터를 가공하는 역할도 도맡는다.
- MVC 패턴을 사용하는 이유
- 역할은 분리함으로써 (모듈화) 협업에 용이한 코드 구조를 만드는 것.
- 즉 유지보수하기 좋고, 가독성이 높고, 확장성이 좋고, 재사용성이 좋고, 테스트하기 좋은 코드를 만들기 위함이다.
- 역할은 분리함으로써 (모듈화) 협업에 용이한 코드 구조를 만드는 것.
- Model, View, Controller
- 그렇다면 백엔드 코드 내부에서 위에서 언급했던 MVC 패턴의 Controller, Service, Repository 는 각각 뭘 담당하는 지 알아보자.
- Controller
- MVC에서의 Controller 와 이름이 같은 것처럼 같은 역할을 한다.
- 사용자의 요청이 백엔드 서버에 도달하면 Controller에 먼저 진입하게 되고, Node에서의 Router라는 명칭처럼, Uri 를 보고 어떤 Service 로 요청을 전달할지 결정한다.
- @Controller / @RestController
- 스프링에서 Controller 컴포넌트로 빈으로 등록시켜주기 위한 어노테이션
- @Controller
- 전통적인 Spring의 MVC 컨트롤러의 역할 부여
- View 반환
- 전통적인 Spring의 MVC 컨트롤러의 역할 부여
- @RestController
- @Controller + @ResponseBody
- JSON/XML 형태의 데이터 반환을 목적으로 함
- MVC에서의 Controller 와 이름이 같은 것처럼 같은 역할을 한다.
- Service
- 백엔드 서버의 서비스가 구현되는 곳
- 즉 해당 서버가 DB의 데이터들로 제공할 서비스: 비즈니스 로직 이 구현되는 곳
- DB의 데이터들은 DAO를 통해서 서비스로 가져온다.
- DAO:
- Data Access Object
- 데이터베이스 서버에 접근하여 SQL 문을 실행할 수 있는 객체
- DAO 는 디비에 접근하는 쿼리 로직을 담고 있고, 서비스의 비즈니스 로직과 분리 되어야한다.
- 그러나 간단한 서비스 로직에서는 DAO의 로직과 비즈니스 로직은 크게 다르지 않다. (단순조회)
- DAO:
- 백엔드 서버의 서비스가 구현되는 곳
- Repository
- 서비스와 데이터베이스를 연결 시켜주는 중간 다리 역할
- MyBatis 를 사용할 때와 JPA 를 사용할 때 Repository 의 구성이 살짝 달라진다.
- MyBatis
- @Mapper 어노테이션 사용
- xml에 작성된 호출할 쿼리와 같은 id로 Repository 메서드와 매핑.
- xml 파일에서 어떤 Repository 인터페이스인지 명시 필요
- JPA
- @Repository 어노테이션 사용
- @Entity에 의해 생성된 DB에 접근하는 메서드들을 Repository 에서 상응하는 인터페이스를 구현
- 순서는 대략 다음과 같다
- @Entity로 DB 구조 정의
- JpaRepository 를 상속하는 위에서 만든 DB로 접근할 Repository 인터페이스 선언
- MyBatis
- 참조:
#3. 오늘의 회고
- 백엔드 개발의 기초라고 할 수 있는 Controller → Service → Repository 의 패턴을 다시 한 번 공부하여 각각의 역할을 상기시켰다.
- 해당 패턴이 백엔드 개발을 얼마나 간단하고 직관적이게 만들어주는 지는, 처음 Node로 Monorepo 구조에서 개발하면서 많이 느꼈다.
- 모노레포 구조는 방대한 코드 양을 담고 있지만, 위와 같이 MVC 패턴으로 이뤄져 있기에 각 코드가 어떤 역할을 하고 있는 지 디렉토리와 파일명에서부터 유추가 가능했다.
- 따라서 디테일한 로직보다 우선 해당 모노레포 구조 내의 있는 코드는 어떤 서비스를 하고 있는 지 바로 대략적으로 알 수 있었다.
- 또한 개발을 할 때도, 각 패턴에 맞는 코드의 틀을 가져와서 안에 로직과 Entity 및 DTO 에 대한 정의만 수정해주면 새로운 API가 생성되는 것이다.
- 굉장히 효율적으로 개발을 할 수 있었다.
728x90
반응형
'개발 공부' 카테고리의 다른 글
99클럽 14일차 TIL: Transaction (0) | 2024.04.17 |
---|---|
99클럽 13일차 TIL: Hikari CP (0) | 2024.04.16 |
99클럽 11일차 TIL: AOP (0) | 2024.04.14 |
99클럽 10일차 TIL: POJO 클래스 (2) | 2024.04.13 |
99클럽 9일차 TIL: Bean 관련 에러 (0) | 2024.04.12 |