앞으로 쭉 함께 가야할 녀석이니까 기본이 가장 중요할 것 같다
그래서 오늘은 MVC에 대한 정리를 해볼까 한다
우선 이번주차에 과제는 알아할 내용들을 최대한 빠르게 습득하는데 목적을 두었다. 그러다보니 Back에서 이해됐던 부분들이 Front에서 이해하지 못하는 부분들과 겹쳐서 많은 혼란이 있어서 연습했던 프로젝트는 대 실패..
다음엔 Front에 많은 투자를 하지 않으면서 기능구현에 최대한 목표를 두어야겠다.
MVC 패턴
MVC 패턴이란 사용자의 요청을 처리하고 다시 사용자에게 반환하는 과정을 3가지 역할 Model, View, Controller 로 구분해서 처리하는 개발 방법을 의미한다.
즉, 사용자가 웹 브라우저를 통해서 URL을 호출하면 Controller에서 요청들을 받고 그안에서 로직이나 데이터가 필요하다면 Model에서 호출해서 모델에 구성된 로직이나 데이터베이스에 접근해서 데이터를 가져온다.
가져온 데이터를 다시 Controller가 받게되고 그 데이터를 VIEW에게 보내주고 VIEW는 최종적으로 사용자에게 데이터와 로직이 적용된 화면을 제공한다.
MVC 패키지 구성
스프링 프레임워크의 패키지 구조는 대부분 위와 동일하다. Repository 는 DAO 라는 명칭으로 쓰기도하며, Domain Class 는 VO, DTO 를 나타낸다. View 는 JSP 같은 사용자에게 직접 보여지는 화면단을 의미한다.
MVC 역할과 기능
Model
Model은 데이터베이스와 연동하여 사용자의 입출력 데이터를 내부 로직으로 처리하는 역할을 한다.
자세히는 데이터를 추출하고, 저장하고, 삭제하고, 업데이트하는 역할을 수행한다.
다시말해서, 모델은 컨트롤러가 호출을 하면 DB와 연동하여 사용자의 입출력 데이터를 다루는 일과 같은 데이터와 연관된 비즈니스 로직을 처리하는 역할을 한다.
View
View는 클라이언트 측 기술은 HTML/CSS/Javascript들을 모와둔 컨테이너이며, 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어온다.
View는 사용자에게 보여주는 화면(UI)이 해당되고, 사용자와 상호작용을 하며 컨트롤러로부터 받은 모델의 결과값을 사용자에게 화면으로 출력하는 일을 한다.
Controller
Controller는 Model과 View 사이를 이어주는 인터페이스 역할을 한다.
쉽게 말해 사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model을 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려주는 역할을 하는것이다.
DAO, VO, DTO?
DAO, VO, DTO
DAO
- DAO(Data Access Object) 는 데이터베이스의 data에 접근하기 위한 객체이며 DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용한다.
VO
- VO(Value Object) 값 오브젝트로써 값을 위해 쓰인다. read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가진다.
- DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다.
DTO
- DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)입니다.
- 유저가 입력한 데이터를 DB에 넣는 과정을 보겠습니다.
- 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송합니다.
- 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣습니다.
즉, 위 패키지 구성 방식은 보통 웹 개발을 할때 주로 사용하는 방식과 유사하다. 회사마다 개인 스타일마다 조금씩 구성하는 방법이 다르지만 가장 핵심은 모듈 개발을 할 때 Repository, Service, Controller, Domain class 로 이루어 진다는 것이다.
스프링의 동작원리
1~3. DispatcherServlet이 제일 앞단에서 사용자의 요청을 받아 Handler mapping을 통해 API를 처리해줄 적절한 Controller를 찾아서 그 요청을 전달한다.
4. Controller가 받은 API요청을 처리한 후 요청하는 Request의 정보(Model)와 View 정보를 다시 DispathcerServlet에게 전달한다.
5. 그럼 ViewResolver를 통해 받은 View에 Model을 적용시켜준다. (사실상 template engine)
6~7. 마지막 결과 View를 client에게 전달해준다.
각각의 역할을 다시 한 번 파악해보자
Model
- 데이터베이스에서 값을 가져와 도메인 오브젝트에 리턴시켜주거나 반대로 도메인의 값을 가져와 데이터베이스에 리턴시켜주는 역할 = DAO(Data Aeccess Object)
- 데이터베이스와 유저가 보는 화면(View)를 이어주는 역할
- Model에 갑과 값의 타입을 입력해주면 거기에 맞추어 값을 가져오고 전달해줌
Controller
- 사용자의 요청을 처리한 후 지정된 뷰에 모델객체를 넘겨주는 역할
- 애플리케이션 로직 및 사용자의 입력 데이터를 서비스에 전달하고 처리하는 역할
- 뷰를 연결하여 웹상에 띄우고 웹에서 가져오는 데이터들을 어떻게 처리하는지 지정해 놓으면 그역할에 맞춰 사용자의 요청을 처리
Service
- 컨트롤러와 리포지토리 사이의 미들웨어
- Model이 테이터페이스에서 받아온 데이터를 전달받아 가공하는 역할
- Controller에서 전달받은 사용자의 요청사항에 알맞게 데이터를 가공해서 데이터베이스로 전달하거나, 데이터베이스에서 데이터를 전달받아 가공하여 유저에게 전달하는 역할
- DB 정보가 필요할 때는 Repository에게 요청
Repository
- DB 관리(연결, 해제, 자원 관리)
- DB에 CRUD의 명령을 실행하게 만드는 인터페이스
- '저장소'라는 뜻을 가진 단어로 JPA에서 Repository 인터페이스를 생성 후, JpaRepository<Entity, 기본키 타입>을 상속받으면(extends하면) 기본적인 Create, Read, Update, Delete가 자동으로 생성됨
식당으로 가정해본다면?
손님(클라) 가 웨이터(Controller) 에게 김치찌개를 요청(request) 했고,
주문을 받은 웨이터(Controller) 는 요리사(Service) 에게 김치찌개 만드는걸 요청한다.
요리사(Service) 는 심부름꾼(Repository) 에게 김치를 갖다달라고 했고
심부름꾼(Repository) 은 냉장고(DB) 에서 김치를 찾아서 갖다준다.
요리사(Service) 가 요리를 끝내고 웨이터(Controller) 에게 반환하면
웨이터(Controller) 가 감치찌개를 손님(클라) 에게 갖다준다(response).
References
'프로그래밍 > Spring' 카테고리의 다른 글
AOP & Logging (slf4j) (0) | 2022.08.05 |
---|---|
[SPRING BOOT]JWT, Thymeleaf, form (2/2) (0) | 2022.08.04 |
[SPRING BOOT]JWT, Thymleaf, form (1/2) (2) | 2022.08.04 |
[DI, IoC, Bean] 개념 박살내기 (0) | 2022.08.01 |
게시판 만들기 (Usecase Diagram & API) (0) | 2022.07.26 |