[DEV] study&learn
article thumbnail

 

MVC 패턴이란?

MVC 패턴은 Model-View-Controller의 약자로서 개발을 할 때 3가지 형태로 역할을 나누어 개발하는 방법론을 의미한다.

  • Model : 애플리케이션이 무엇을 할 것인지를 정의하는 부분이다.
  • View : 사용자에게 시각적으로 보여주는 부분이다.(UI)
  • Controller : Model이 데이터를 어떻게 처리할지 알려주는 역할을 한다.

 

MVC 패턴을 사용하는 이유는 하나의 애플리케이션이 서로 분리되어 각자의 역할에만 집중할 수 있게끔하여

유지보수, 애플리케이션의 확장성, 유연성, 중복 코딩 문제점 해결이라는 효과를 가질 수 있기 때문이다.

 

 

 

위 사진은 웹서버가 클라이언트와 소통할 때 어떤 로직을 거쳐서 정보가 전달되는지에 대한 그림이다.

 

가장 위인 front-end에서 들어오는 클라이언트 측의 요청이 가장 먼저 서버 측과 맞닿는 부분이 바로 Controller이다.

서버에서 기능별 URL이라는 API를 개설해 놓고, 클라이언트는 필요한 정보를 얻기 위해 적절한 API에 요청하는 것이다.

즉, Controller는 이러한 창구 역할을 하는 API를 모아놓은 클래스이다.

 Controller 란?

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

즉, 사용자의 요청이 진입하는 지점이며 요청에 따라 어떤 처리를 할지에 대한 결정을 Service에 넘겨준다.

그 후, Service에서 실질적으로 처리한 내용을 View에 넘겨준다.

 

Service 란?

 서비스를 이해하기에 앞서, 큰 틀을 살펴보자.

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

Service가 알맞는 정보를 가공하는 과정을 '비즈니스 로직을 수행한다.'라고 한다.

Service가 비즈니스 로직을 수행하고 데이터베이스에 접근하는 DAO를 이용해서 결과값을 받아온다.

 

Service는 위에서 언급했듯,

Controller의 요청에 따라 Repository에서 얻어온 정보를 바탕으로 자바 문법을 이용하여

가공 후 다시 Controller에게 보내는 역할을 한다.

 

그럼 Repository에서 얻어온 정보를 바로 가공하여 Controller에게 보내주면 되지 않나?

라는 의문이 든다.

 

결론부터 말하면 Controller 쪽에서 바로 데이터베이스에 접근하여 정보를 얻고 가공해 가져 가는 것은 위험하다고 한다.

정보를 직접 CRUD하고 가공하는 과정에서 테이블에 저장된 원본의 정보가 손상될 우려가 크기 때문이다.

따라서 정보의 변동의 위험이 큰 로직은 Service에서 진행하는 것이다.

추가로 이때도 원본의 데이터를 사용하는 것이 아니라 데이터베이스에서 추출한 정보의 복사본인 DTO를 만들어서 로직을 조작한다.

 

Repository란?

1.

Repository는 저장소로 데이터베이스와 깊은 연관이 있다.

데이터단에 직접 매칭되는 Entity가 있는데, 이 Entity를 통해 데이터 테이블이 생성되면,

받아온 정보를 데이터베이스(MySQL, mariaDB 등)에 저장하고 조회하는 기능을 수행한다.

즉, Repository에서 주어진 JPA 인터페이스 메소드를 활용하여 기본적인 CRUD를 할 수 있게 도와준다.


2.

Entity에 생성된 DB에 접근하는 메소드들을 사용하기 위한 인터페이스이다.

@Entity라는 어노테이션으로 데이터베이스 구조를 만들었다면 CRUD를 해야 한다.

이것을 어떻게 할 것인지 정의해주는 계층이라고 생각하면 된다.

public interface ProductRepository extends JpaRepository<Product, Long> { }

위와 같이 ProductRepository라는 인터페이스에 JpaRepository를 상속하여 사용할 수 있다.

Product는 Entity 클래스 명이고, Long은 그 Entity 클래스의 PK의 자료형을 넣어주면 된다.

이렇게 코드를 작성하면, ProductRepository에 JPA가 기본적으로 제공되는 메서드를 사용할 수 있게 된다.

 

DAO와 JPA

일단 DAO는 SQL 서버에 접근하여 SQL문을 실행할 수 있는 객체를 의미한다.

Spring Data JPA는 매우 적은 코드로 DAO를 구현할 수 있도록 해준다.

즉, 인터페이스를 만드는 것만으로도 Entity(@Entity)클래스에 대한 CRUD 작업을 실 행할 수 있게 해 준다.

 

하지만 JPA가 모든 것을 해결해주는 것은 아니다.

JPA는 기본적으로 라이트 한 쿼리를 대체하는 것이기 때문에,  쿼리의 복잡도가 높아지면 사용이 어려워진다고 한다.

 

<참고자료>

 

Controller, Service, Repository 가 무엇일까?

찾아본 결과 Controller가 무엇인지 알기 전에 MVC 패턴에 대하여 먼저 아는 것이 중요합니다!MVC패턴은 Model-View-Controller의 약자로서 개발을 할 때 3가지 형태로 역학을 나누어 개발하는 방법론입니

velog.io

 

 

[Spring Boot]Controller, Service, Repository에 대하여

스프링 또는 스프링 부트로 웹개발을 공부하다보면 다른 프레임워크와 다르게 굉장히 개념들이 세분화 되었다는 것을 느낄 수 있을 것 입니다. 이번에 알아볼 부분이 바로 그러한 것과 연관이

velog.io

 

 

@Repository, @Service 어노테이션

- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6.3 - ORM : Mybatis 3.2.8 두 어노테이션을 알기 위

codevang.tistory.com

 

profile

[DEV] study&learn

@devjuni

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!