99클럽 12일차 TIL: MVC

2024. 4. 15. 17:3599클럽/TIL

728x90
반응형

#1. 오늘의 학습 키워드

자바 스프링에서 MVC 의 개념

  • 노드에서 자바 스프링부트로 리팩토링하는 과정에서, 개인적으로 언어 자체의 친숙도 문제 이외에는 크게 어려운 작업이 아니었던 이유는 코드 패턴이 흡사하였기 때문이다.
    • Node
      • Router (controller) → Service → DAO 패턴
    • Spring
      • Controller → Service → Repository 패턴
  • 여지껏 위 패턴으로 백엔드 개발을 진행해왔다 보니, 스프링을 사용하여 개발을 할 때는 MyBatis 를 사용하였기에 SQL 쿼리를 직접 구현하는 부분 제외하고는 처음엔 크게 익숙치 않은 구석은 없었다.
  • 그럼 이쯤에서 질문을 할 수 있겠다.
    • 이러한 패턴은 뭐라고 부르는 것일까?
    • 이러한 패턴은 직접 사용해보니 직관적이고 구현하기 편리한 것을 느끼긴 했지만, 정확히 어떤 이점덕에 도입이 되었고, 프로그래밍 언어에 의존하지 않고 광범위하게 쓰일 수 있는 것일까?

#2. 공부한 내용

  • MVC
    • Model, View, Controller
      • UI, 데이터, 논리를 구현하는 데 사용되는 SW 디자인 패턴
      • Model
        • 서비스에 필요한 모든 데이터를 정의한다.
          • 그렇기에 DB 와 연동하는 부분을 담당한다.
      • View
        • 프론트엔드 개발자가 담당하는 부분
          • 즉 화면 UI 구현과 클라이언트 사이드 로직도 포함
      • Controller
        • Model 과 View 사이의 연결 역할
        • Model로 들어가고 나오는 데이터를 가공하는 역할도 도맡는다.
    • MVC 패턴을 사용하는 이유
      • 역할은 분리함으로써 (모듈화) 협업에 용이한 코드 구조를 만드는 것.
        • 유지보수하기 좋고, 가독성이 높고, 확장성이 좋고, 재사용성이 좋고, 테스트하기 좋은 코드를 만들기 위함이다.

  • 그렇다면 백엔드 코드 내부에서 위에서 언급했던 MVC 패턴의 Controller, Service, Repository 는 각각 뭘 담당하는 지 알아보자.
  • Controller
    • MVC에서의 Controller 와 이름이 같은 것처럼 같은 역할을 한다.
      • 사용자의 요청이 백엔드 서버에 도달하면 Controller에 먼저 진입하게 되고, Node에서의 Router라는 명칭처럼, Uri 를 보고 어떤 Service 로 요청을 전달할지 결정한다.
    • @Controller / @RestController
      • 스프링에서 Controller 컴포넌트로 빈으로 등록시켜주기 위한 어노테이션
      • @Controller
        • 전통적인 Spring의 MVC 컨트롤러의 역할 부여
          • View 반환
      • @RestController
        • @Controller + @ResponseBody
        • JSON/XML 형태의 데이터 반환을 목적으로 함
  • Service
    • 백엔드 서버의 서비스가 구현되는 곳
      • 즉 해당 서버가 DB의 데이터들로 제공할 서비스: 비즈니스 로직 이 구현되는 곳
    • DB의 데이터들은 DAO를 통해서 서비스로 가져온다.
      • DAO:
        • Data Access Object
        • 데이터베이스 서버에 접근하여 SQL 문을 실행할 수 있는 객체
      • DAO 는 디비에 접근하는 쿼리 로직을 담고 있고, 서비스의 비즈니스 로직과 분리 되어야한다.
        • 그러나 간단한 서비스 로직에서는 DAO의 로직과 비즈니스 로직은 크게 다르지 않다. (단순조회)
  • Repository
    • 서비스와 데이터베이스를 연결 시켜주는 중간 다리 역할
    • MyBatis 를 사용할 때와 JPA 를 사용할 때 Repository 의 구성이 살짝 달라진다.
      • MyBatis
        • @Mapper 어노테이션 사용
        • xml에 작성된 호출할 쿼리와 같은 id로 Repository 메서드와 매핑.
          • xml 파일에서 어떤 Repository 인터페이스인지 명시 필요
      • JPA
        • @Repository 어노테이션 사용
        • @Entity에 의해 생성된 DB에 접근하는 메서드들을 Repository 에서 상응하는 인터페이스를 구현
        • 순서는 대략 다음과 같다
          • @Entity로 DB 구조 정의
          • JpaRepository 를 상속하는 위에서 만든 DB로 접근할 Repository 인터페이스 선언
  • 참조:

#3. 오늘의 회고

  • 백엔드 개발의 기초라고 할 수 있는 Controller → Service → Repository 의 패턴을 다시 한 번 공부하여 각각의 역할을 상기시켰다.
  • 해당 패턴이 백엔드 개발을 얼마나 간단하고 직관적이게 만들어주는 지는, 처음 Node로 Monorepo 구조에서 개발하면서 많이 느꼈다.
    • 모노레포 구조는 방대한 코드 양을 담고 있지만, 위와 같이 MVC 패턴으로 이뤄져 있기에 각 코드가 어떤 역할을 하고 있는 지 디렉토리와 파일명에서부터 유추가 가능했다.
    • 따라서 디테일한 로직보다 우선 해당 모노레포 구조 내의 있는 코드는 어떤 서비스를 하고 있는 지 바로 대략적으로 알 수 있었다.
    • 또한 개발을 할 때도, 각 패턴에 맞는 코드의 틀을 가져와서 안에 로직과 Entity 및 DTO 에 대한 정의만 수정해주면 새로운 API가 생성되는 것이다.
      • 굉장히 효율적으로 개발을 할 수 있었다.
728x90
반응형

'99클럽 > TIL' 카테고리의 다른 글

99클럽 14일차 TIL: Transaction  (0) 2024.04.17
99클럽 13일차 TIL: Hikari CP  (0) 2024.04.16
99클럽 11일차 TIL: AOP  (0) 2024.04.14
99클럽 10일차 TIL: POJO 클래스  (2) 2024.04.13
99클럽 9일차 TIL: Bean 관련 에러  (0) 2024.04.12