Controller, Service, Repository 가 무엇일까?!

Today Jeeho Learned·2022년 8월 31일
0

Spring

목록 보기
29/31
post-thumbnail

controller가 무엇인지 알기전에 MVC 패턴에 대해서 알고 넘어가야 한다!

MVC 패턴이란?

MVC 패턴은 model-view-controller의 약자로 개발을 하는데 있어서 3가지 형태로 역할을 나누어 개발하는 방법론이다.

  • Model
    어플리케이션이 무엇을 할 것인지를 정의하는 부분이다. DB와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다룬다.
  • View
    사용자에게 시각적으로 보여주는 부분이다. (UI)
  • Controller
    Model이 데이터를 어떻게 처리할지 알려주는 역할이다. 사용자에 의해 클라이언트가 보낸 데이터가 있으면 모델을 호출하기전에 적절히 가공한 후에 모델을 호출한다. 그런다음 모델이 업무 수행을 완료하면 그 결과를 가지고 View에게 전달하는 역할을 한다.

MVC 패턴을 사용하는 이유

사용자가 보는 페이지, 데이터 처리 그리고 이러한 2가지를 중간에서 제어하는 컨트롤러, 이 3가지로 구성되는 하나의 애플리케이션을 만들면 각각 맡은 부분에만 집중을 할 수 있게 된다.

즉 서로 분리되어 각자의 역할에 집중하여 개발을 할 수 있고, 그렇게 애플리케이션을 만들어 낸다면 유지보수성과 확장성 그리고 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지는 효과를 가질 수 있기 때문에 MVC 패턴을 사용한다.

그럼 이제 controller service repository를 알아보자

Controller란?

앞에서 말한 MVC 패턴에서의 설명과 같이 사용자의 요청을 처리 한 후 지정된 뷰에 모댈 객체를 넘겨주는 역할을 한다.

즉 사용자의 요청이 진입하는 지점이고, 요청에 따라 어떤 처리를 할지 결정을 Service에 넘겨준다. 그 후에 Service에서 실질적으로 처리한 내용을 View에 넘겨준다.

Controller를 왜 사용할까?

대규모의 서비스가 있는 경우에, 한 클래스 안에 모든 서비스를 채워서 넣는 것이 아니라,
Controller라는 중간 제어자를 두고, 각각 분류하여 처리하는 역할로 사용하는 것이다. 이렇게 했을때 역할에 따라 설계를 하고 개발을 진행하면, 개발비용과 유지보수비용이 대폭 줄어들기 때문에 사용한다.

Spring에서 Controller 사용법

스프링에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다.

  1. @Controller(Spring MVC Controller)
    전통적으로 Spring mvc의 컨트롤러인 @controller는 주로 view를 반환하기 위해 사용한다.
    그렇지만 @ResponseBody 어노테이션과 같이 사용하면 RestController와 같은 기능을 수행 할 수 있다.
@Controller
public class Controllerprac {
    @GetMapping("/home") //home으로 Get요청이들어오면
    public String homepage(){
        return "home.html"; //home.html생성
    }
}
  1. @RestController(Spring Restful Controller)
    RestController에서 Controller는 @ResponseBody 어노테이션이 붙은 효과를 지니게 된다.
    즉 주용도는 JSON/XML 형태로 객체 데이터를 반환하는 목적이다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductRestController {

    private final ProductService productService;
    private final ProductRepository productRepository;

    // 등록된 전체 상품 목록 조회
    @GetMapping("/api/products")
    public List<Product> getProducts() {
        return productRepository.findAll();
    }
}

일전에 프로젝트에서 타임리프를 사용했었는데, @RestController 사용한 클래스에서 view 반환이 안되어서 controller를 2개로 나눠서 사용했던 경험이 있다.

Service란?

Service를 이해하기 위해서 정리를 해보겠다
1. Client가 Requset를 보낸다.(ajax, axios, fetch등)
2. Request URL에 알맞는 Controller가 수신을 받는다.(@Controller, @RestController)
3. Controller는 넘어온 요청을 처리하기 위해 Serivce를 호출한다.
4. Service는 알맞는 정보를 가공하여 Controller에게 데이터를 넘겨준다.
5. Controller는 Service의 결과물을 Client에게 전달해준다.

즉 Serivce가 알맞는 정보를 가공하는 과정을 '비지니스 로직을 수행한다'고 라고 한다.
Service가 비지니스 로직을 수행하고, 데이터베이스에 접근하는 DAO를 이용해서 결과값을 받아온다.

DAO와 JPA

Spring data JPA는 매우 적은 코드로 DAO를 구현할 수 있도록 해준다. 즉 인터페이스를 만드는 것 만으로도 Entity클래스에 대한 CRUD를 실행할 수 있게 해준다. 뿐만아니라 인터페이스에 메소드를 선언하는 것만으로 가벼운 쿼리를 수행하는 코드를 만드는것과 동등한 작업을 수행한다.

그렇지만! 모든 쿼리를 대체하는것은 아니므로, 복잡한 쿼리인 경우 직접 작성해줘야한다.

그렇다면 Repository란 ?

Entity에 의해 생성된 DB에 접근하는 메서드들을 사용하기 위한 인터페이스이다.
@Entity라는 어노테이션으로 데이터베이스 구조를 만들었으면 여기에 CRUD를 해야한다.
이것을 어떻게 할 것인지 정의해주는 계층이라고 생각한면 된다.

JPA로 Repository를 만들어보자

이와같이 ProductRepository라는 인터페이스에 JpaRepository를 상속해주면된다.
Product는 Entity 클래스 명이고, Long은 Entity 클래스의 PK의 자료형을 넣어주면 된다.
이렇게 하면 ProductRepository에서 jpa가 기본적으로 제공하는 메서드를 사용할 수 있게된다.

그래서


이런 구조에서부터

이런 구조가 가능하다!

profile
기록해야 (살아)남는다 !

0개의 댓글