Spring의 MVC 계층
M [ 데이터처리 ] , V [ 화면 처리 ] , C [ 뷰와 모델을 연결 ]
Spring MVC 역할 | |
Spring MVC가 작업 지원 | > URI를 분석해 알맞는 Controller를 찾아준다. > Controller에 필요한 메서드를 호출해준다. > Controller의 결과 데이터를 VIEW로 전달해준다. > 적절한 VIEW 페이지를 찾아서 연결해준다. |
개발자의 역할 | > 특정 URL에 동작하도록 Controller를 설계한다. > 서비스 객체를 생성한다 ( 약한 결합 ) > DAO 객체를 생성한다. ( 약한 결합 ) > Controller 내부 동작을 설계한다. > View에서 전달받은 데이터를 출력한다. |
spring의 계층은 크게 3 분류로 나눌 수 있다.
그 분류 체계는 Presentation Layer , Business Layer , Data Access Layer이다.
Presentation [ View.Controller ] |
> 브라우저 상의 웹 클라이언트의 요청 및 응답을 처리한다. > 서비스 계층, 데이터 엑세스 계층에서 발생하는 Exception을 처리한다. > @Controller 어노테이션을 사용하여 작성된 Controller 클래스가 이 계층에 속한다. |
Service [ Business Services ] |
> 애플리케이션 비지니스 로직과 비지니스와 관련된 도메인 모델의 적합성을 검증한다. > 트랜잭션을 관리하고, 양 단의 계층을 연결하는 역할로 양 단의 계층은 서로 직접 통신하지 않는다. > Service Interface 와 @service 어노테이션을 사용하여 작성된 service 구현 클래스 |
Data Aceess [ Repositories or DAO's ] |
> ORM (Mybatis, Hibernate)를 주로 사용하는 계층이다. > DAO 인터페이스와 @Repository 어노테이션을 사용하여 작성된 DAO 구현 클래스의 계층 > DB에 대해서 CRUD를 하는 계층이다. > DAO 객체 처리 |
Domain Model | > DB의 테이블과 매칭될 클래스로 Entity 클래스라고 부른다. |
Spring Class의 DATA 처리
1. DTO ( Data Transfer Object)
각 계층간 테이터 교환을 위한 객체를 DTO라고 하고 Domain, VO라고도 한다. (=데이터를 주고 받을 포멧)
데이터 베이스에서 데이터를 얻어 Service, Controller단에 보낼 때 사용되고 로직을 갖지않고 순수하게 getter/setter 메소드를 가진다.
이 객체를 통해 데이터베이스 레코드의 데이터를 매핑하고, 아래 코드에서도 DAO가 DB로부터 Data를 얻은 뒤 List에 담아 리턴한다.
public class User {
private String id
private String password;
public String getName();
public void setName(String name);
...
public String toString() {
return "id :"+id +"password"+ password)
}
}
2. DAO ( Data Access Object)
데이터 베이스에 접근하는 객체로, 데이터 베이스를 사용해 데이터를 조작하는 기능을 가진 객체이다.
Repository라고도 부르고 JPA- Repository , MyBatis - DAO or Mapper를 사용한다 .
Service단과 DB를 연결하는 고리역할을 수행한다.
Spring에서 DAO는 Singleton 패턴을 권장하기 떄문에 Bean으로써 사용된다.
@Reoisitory 어노테이션으로 정의하고, 클래스로 선언 도 가능하지만 메소드 헤더만 정의한 interface를 정의하는 것이 일반적이다.
왜냐하면 interface로 구현함으로써 확장성과 유연성이 높아지기 때문이다.
public interface UserDao {
...
public List<User> getUsers();
}
2-1. Mapper
Mapper인터페이스는 MyBatis 매핑 XML에 기재된 SQL문을 호출하기 위한 인터페이스이다.
Mapper을 사용하지 않는 경우 Sql Session, DAO 클래스 생성 , SQL ID 지정 등 번거로운 작업이 추가로 요구되지만
Mapper인터페이스를 사용한다면 이 같은 작업을 줄여줄 수 있다.
3. Entitiy 클래스 (Domain)
실제 데이터베이스 테이블과 매칭될 클래스이다.
Entity 클래스 또는 가장 Core한 클래스로 Domain로직만을 가지고 있어야 한다.
4. DTO 클래스 VS Entity 클래스 ( Domain )
- DB Layer의 역할을 분리한다.
- 아래 그림에서 보면 테이블과 매핑되는 Entity 클래스 변경 시 여러 클래스에 영향을 끼친다. 하지만 DTO 클래스는 변경이 되도 영향도가 줄어들기 때문에 표현,서비스 계층의 유지보수성 향상에 도움을 줄 수 있다.
- DTO는 Entity 클래스를 통해서 만들어진다. 즉 Domain Model Object는 영구적이나, 다른 계층에서의 DTO는 로직을 추가&변경 할 수 있다.
5. Service & DAO & DTO
Service는 비지니스 로직이 들어가는 부분으로 Controller가 Request를 받으면 적절한 Service를 전달한다.
전달받은 Service는 비지니스 로직을 처리하는데, DAO로 Database에 접근하고, DTO로 데이터를 상호 전달한다.
그 후 적절한 처리를 한 뒤 반환하면, View 단에서 처리된 결과를 Client에게 반환하게 된다.
계층별 주요 어노테이션
VIEW
[1] @Controller
- 스프링 MVC 컨트롤러 객체 의미 (클래스) => View를 응답함
[2] @RestController
- 스프링 MVC 컨트롤러 객체 의미 (클래스) => DATA를 응답함
[3] @RequestMapping
- 특정 URI에 매칭되는 클래스, 메서드를 처리하도록 하는 지정자 ( 파라미터 )
CONTROLLER
[1] @Service
- 서비스 객체 (클래스) , 비지니스 로직 담당 클래스에 사용된다.
- 이 계층은 View의 종류와 Database의 종류에 영향을 받지 않는 독립적인 계층으로 설계해야 한다.
- Repositroy 계층을 활용해서 DB에 접근한다.
- 애플리케이션의 세부 영역 (User, Post, .. )별로 클래스를 생성하여 구현해야 함
- 인터페이스 사용이 권장
MODEL
[1] @Repository
- DAO 객체 (클래스)
- DB에 엑세스하는 클래스에 사용됨
각 어노테이션으로 생성된 에플리케이션의 세부 영역은 클래스로서 관리한다.
= 중요한 영역을 클래스로 나눠서 구현함 !
'FrameWork & Runtime > Spring' 카테고리의 다른 글
Spring Bean & Dependency Injection(DI) (0) | 2022.03.01 |
---|---|
Spring의 Request & Response (0) | 2022.03.01 |
<코드 프레소 웹 개발 트랙> Spring Boot 웹 개발 초급 [1] (0) | 2022.02.22 |
Spring Framework와 DI&IOC (1) | 2022.02.21 |
<코드 프레소 웹 개발 트랙> Spring Boot 웹 개발 입문 [2] (0) | 2022.02.07 |