상세 컨텐츠

본문 제목

Spring MVC 아키텍처 개요

소프트웨어공학

by amanda.hyon 2024. 9. 19. 02:35

본문

Spring MVC는 애플리케이션을 효율적으로 관리하고 유지보수하기 위해 "Controller-Service-Repository"라는 세 가지 주요 계층으로 나눕니다. 이 아키텍처는 각 계층이 특정 역할을 수행하도록 설계되어 있으며, 각 계층 간의 관계는 명확하게 정의되어 있습니다.

MVC아키텍처 핵심 요소

1. Controller (컨트롤러)

  • 사용자 요청(예: HTTP 요청)을 처리하고, 그 요청에 적합한 서비스 호출, 데이터 변환, 그리고 응답을 생성하는 역할을 합니다.
    • CommentController와 같은 클래스는 웹 요청을 처리합니다.
    • 예를 들어, 사용자가 댓글을 달 때(POST 요청), 해당 요청을 처리하는 책임을 갖습니다.
    • 컨트롤러는 주로 사용자의 입력을 받고, 데이터를 처리하며, 서비스를 호출하여 필요한 작업을 수행하게 하고, 그 결과를 다시 사용자에게 반환합니다.
  • 레스토랑서비스에 비유하자면,
    • 컨트롤러는 레스토랑에서 주문을 받는 웨이터와 비슷합니다.
    • 웨이터는 고객의 요청을 주방에 전달하고,
    • 주방에서 음식을 준비하면 그 음식을 고객에게 가져다 줍니다.

2. Service (서비스)

  • 비즈니스 로직을 처리하는 계층입니다. 서비스 계층은 컨트롤러와 리포지토리 사이에서 중개 역할을 하며, 데이터를 처리하고 조작하는 논리를 담당합니다.
    • CommentService는 댓글과 관련된 비즈니스 로직을 처리합니다.
    • 예를 들어, 새로운 댓글을 저장하거나, 특정 게시물에 달린 모든 댓글을 불러오는 등의 작업을 수행합니다.
    • 서비스는 데이터베이스와의 상호작용을 위해 리포지토리를 사용합니다.
  • 레스토랑 서비스에 비유하지면,,
    • 레스토랑의 주방장과 같습니다.
    • 주방장은 웨이터가 가져온 주문을 받아 음식을 준비하고,
    • 준비된 음식을 다시 웨이터에게 전달합니다.

3. Repository (리포지토리)

  • 데이터베이스와의 상호작용을 담당합니다. 주로 데이터베이스에서 데이터를 조회, 저장, 수정, 삭제하는 작업을 처리합니다.
    • CommentRepository는 댓글 데이터를 데이터베이스에서 읽고 쓰는 작업을 담당합니다.
    • 리포지토리는 실제 SQL 쿼리를 실행하지 않고, JPA와 같은 ORM 도구를 사용하여 데이터베이스와 상호작용합니다.
  • 레스토랑 서비스에 비유하지면,,
    • 리포지토리는 레스토랑의 창고 관리인과 비슷합니다.
    • 창고 관리인은 주방에서 필요한 재료를 제공하고, 사용된 재료를 기록합니다.

4. Model (모델)

  • 모델은 애플리케이션에서 사용되는 데이터를 표현하는 클래스입니다. 예를 들어, 댓글, 게시물, 사용자 등의 데이터 구조를 정의하고, 이 데이터가 애플리케이션 내에서 어떻게 사용되고 저장될지를 나타냅니다.
    • Comment, Post, Reply 등의 클래스가 여기에 해당합니다.
    • 이 클래스들은 데이터베이스에서 사용되는 테이블과 직접적으로 매핑되며, 데이터베이스에서 가져온 데이터나 애플리케이션에서 사용하는 데이터를 담는 그릇 역할을 합니다.
  • 레스토랑 서비스에 비유하지면,,
    • 모델은 레스토랑에서 사용하는 재료나 요리에 비유할 수 있습니다.
    • 즉, 요리사가 요리를 준비할 때 사용하는 재료들(모델)이 무엇인지 정의하고,
    • 그 재료들이 어떻게 구성되어 있는지 설명합니다.

비유를 확장해서 설명

Model

  • 레스토랑의 재료나 요리입니다. 예를 들어, Comment 모델은 '댓글'이라는 특정한 데이터를 표현하는 하나의 재료입니다. 이 재료가 어떻게 구성되고, 어떤 속성을 가지는지를 정의합니다. 만약 레스토랑에서 특정 요리를 만들기 위해 고기, 채소, 소스 등이 필요하다면, Comment 모델은 댓글을 표현하기 위해 작성자, 내용, 생성일 등의 속성을 정의하는 역할을 합니다.

Repository

  • 창고 관리자입니다. 이 창고 관리자는 필요한 재료(모델)를 가져오거나, 새로운 재료를 창고에 저장합니다. 다시 말해, CommentRepository는 댓글 데이터를 데이터베이스(창고)에서 가져오고, 새로 생성된 댓글 데이터를 저장합니다.

Service

  • 주방장입니다. 주방장은 레시피에 따라 재료들을 결합해 요리를 만듭니다.
  • CommentService는 비즈니스 로직에 따라 모델 데이터를 결합하고 처리하여, 댓글을 생성하거나, 수정하는 등의 작업을 수행합니다.

Controller

  • 웨이터입니다. 웨이터는 고객의 주문을 받아 주방에 전달하고, 주방에서 완성된 요리를 다시 고객에게 가져다줍니다.
  • CommentController는 사용자의 요청을 받아 CommentService에 전달하고, 서비스에서 처리된 결과를 사용자에게 전달합니다.

즉.. 종합하자면 다음과 같습니다.

  • Model: 데이터 자체를 표현하는 객체로, 레스토랑의 재료에 해당합니다.
  • Repository: 데이터를 저장하고 불러오는 창고 관리자의 역할입니다.
  • Service: 데이터를 가공하고 처리하는 주방장에 해당합니다.
  • Controller: 사용자와 상호작용하며 요청과 응답을 처리하는 웨이터에 해당합니다.

처리 프로세스 예시

1. 사용자 요청

  • 사용자가 "새 댓글 달기" 버튼을 클릭합니다.
  • 이 요청은 CommentController에 도착합니다.

2. 컨트롤러 처리

  • CommentController는 이 요청을 받아 댓글 내용을 서비스 계층에 전달합니다. 이때 CommentController는 사용자로부터 받은 데이터를 검증하고, CommentService에 전달할 준비를 합니다.
     

3. 서비스 처리

  • CommentService는 댓글이 유효한지 추가 검사를 수행한 후, 이 댓글을 데이터베이스에 저장하기 위해 CommentRepository를 호출합니다.
     

4. 리포지토리 처리

  • CommentRepository는 데이터베이스에 새로운 댓글을 저장하는 작업을 수행합니다.
  • 저장이 완료되면, CommentRepository는 그 결과를 서비스 계층으로 반환합니다.
     

5. 결과 반환

  • CommentService는 댓글이 성공적으로 저장되었다는 결과를 CommentController로 반환합니다.
  • CommentController는 이 결과를 사용자에게 반환하여, 새 댓글이 성공적으로 저장되었음을 알립니다.

이러한 각 계층이 조화를 이루어 애플리케이션이 원활하게 작동하게 됩니다. 모델은 데이터를 표현하고, 그 데이터를 조작하고 저장하는 역할을 수행하는 계층들과 협력하여 시스템의 전반적인 기능을 구성합니다.

관련글 더보기

댓글 영역