Spring | MVC 란?

Wonhee 📘·2022년 4월 3일
0

Spring

목록 보기
1/6
post-thumbnail

애플리케이션의 역할을 모델(Model), 뷰(View), 컨트롤러(controller)로 나누어, 이들 사이 상호작용을 통제하는 아키텍처 패턴이다.

  • 모델(Model) : 비즈니스 규칙을 표현,DATA, 정보들의 가공을 책임지는 컴포넌트를 말합니다.
  • 뷰(View) : 프레젠테이션을 표현, 사용자에게 보여지는 부분, 즉 유저 인터페이스(User interface)를 의미합니다.
  • 컨트롤러(Controller) : 위 두가지를 분리하기 위하여 양측 사이에 배치된 인터페이스, 모델(Model)과 뷰(View) 사이를 이어주는 브릿지(Bridge) 역할을 의미합니다.

🟦 Controller 란?

앞에서의 MVC패턴 설명과 똑같이 Controller은 MVC에서 C에 해당 하며 주로 사용자의 요청을 처리 한 후 지정된 뷰에 모델 객체를 넘겨주는 역할을 합니다.

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

📃 controller를 사용하는 이유는?

대규모 서비스중 A서비스, B서비스 등이 있다고 하겠습니다. 그러면 이 많은 종류의 서비스를 한 클래스에서 처리할 게 아니라 Controller라는 중간 제어자를 만들어서 A서비스에 대한것은 A-Controller가 맡고 B서비스는 B-Controller 이런식으로 역할에 따라 설계를 하고 코딩을 하면 개발비용이나 유지보수비용이 대폭 줄어들기 때문에 Controller를 사용합니다.

🟦 Service 란?

Service를 이해하기 위해 큰 틀을 보겠습니다.

  • Client가 Request를 보낸다.(Ajax, Axios, fetch등..)
  • Request URL에 알맞은 Controller가 수신 받는다. (@Controller , @RestController)
  • Controller 는 넘어온 요청을 처리하기 위해 Service 를 호출한다.
  • Service는 알맞은 정보를 가공하여 Controller에게 데이터를 넘긴다.
  • Controller 는 Service 의 결과물을 Client 에게 전달해준다.

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

🟦 DAO란?

단순하게 페이지를 불러오고 DB정보를 한번에 불러오는 간단한 프로젝트의 경우 Service와 DAO는 차이가 거의 없을 수 있다고 합니다.

DAO 는 쉽게 말해서 Mysql 서버에 접근하여 SQL문을 실행할 수 있는 객체입니다.

그러면 이렇게 생각 할수 있습니다 JPA는 그러면 뭐야?

DAO 와 JPA

Spring Data JPA는 매우 적은 코드로 DAO를 구현할 수 있도록 해줍니다. 즉 인터페이스를 만드는 것 만으로도 Entity (@Entity)클래스에 대한 insert, Update, Delete, Select 를 실행할 수 있게 해줍니다. 뿐만 아니라 인터페이스에 메소드를 선언하는 것 만으로 라이트한 쿼리를 수행하는 코드를 만드는것과 동등한 작업을 수행합니다.

그러면 JPA를 사용하면 DAO는 직접 구현을 안해도되겠네요! 라는 생각을 할 수 있습니다.
하지만 JPA가 만들 수 있는 코드는 매우 가볍고 쉬운 쿼리를 대체하는 것이라서 복잡도가 높아지면 사용하기가 매우 어렵다고 합니다.

이때 JPA만으로만 사용한다면 수행능력이 SQL을 직접 사용해서 개발하는 것보다 못한 상황이 벌어 질 수도 있습니다.
그래서 JPA를 깊게 공부를 해서 JPA로 복잡도가 높은 쿼리를 짜거나 아니면 복잡도가 높은 곳은 DAO로 같이 사용한다고 합니다.

🟦 Repository 란?

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

저희는 JPA로 Repository를 만들어 볼것입니다!

public interface ContentsRepository extends JpaRepository<Contents, Long> {
    List<Contents> findAllByOrderByCreatedAtDesc();
}

자 이렇게 ContentsRepository 인터페이스에 JpaRepository를 상속해주면됩니다! 저기서의 Contents는 Entity 클래스 명이고 Long은 그 Entity클래스의 PK의 자료형을 넣어주면 됩니다.

그러면 이 ContentsRepository JPA가 기본적으로 제공되는 메서드를 사용할수 있게 됩니다.

profile
오늘 걷지 않으면 내일은 뛰어야한다 🚶‍♂️ 🏃‍♀️

0개의 댓글