본문 바로가기
FrameWork & Runtime/Spring

Spring 서비스 계층

by jaeaemin 2022. 2. 28.

 

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- RepositoryMyBatis - 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 )

  1. DB Layer의 역할을 분리한다. 
  2. 아래 그림에서 보면 테이블과 매핑되는 Entity 클래스 변경 시 여러 클래스에 영향을 끼친다. 하지만 DTO 클래스는 변경이 되도 영향도가 줄어들기 때문에 표현,서비스 계층의 유지보수성 향상에 도움을 줄 수 있다.
  3. 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에 엑세스하는 클래스에 사용됨

 

각 어노테이션으로 생성된 에플리케이션의 세부 영역은 클래스로서 관리한다.

    = 중요한 영역을 클래스로 나눠서 구현함 ! 

 

 

 

 

 

 

반응형