목차
개요
(공식문서에는) 스프링 프레임워크는 강력한 기능을 제공하며, 각 구성 요소는 특정 역할을 수행하여 애플리케이션을 구축한다.
이 글에서는 스프링 프레임워크의 주요 구성 요소인 Controller, Config, DTO, Entity, Repository, Service의 역할에 대해 간단하게 알아본다. 또한 정석적인 설명은 타 블로그나 인터넷 확실하게는 공식문서에 전부 게시되어있기에 내가 느낀 방향대로 설명을 해보겠다.
구성요소들
- Controller
클라이언트의 요청을 처리하고 응답을 반환하는 역할을 담당한다. 이를 통해 웹 요청을 받고 적절한 서비스를 호출하여 결과를 반환하며, HTTP 응답을 생성한다.
요즘 통용되는 RESTful한 설계 방식에 있어서 @RestController 이라는 어노테이션을 이용하여 CRUD에 대한 맵핑을 통해서 Response, Request하는 클라이언트(프론트단)과 가장 가까운 기능 구현체 인것 같다.
- Config
스프링 애플리케이션의 구성을 정의하는 데 사용된다. 이 클래스에서는 Bean 정의, 데이터베이스 연결 설정, 보안 설정, 뷰 리졸버 등을 정의할 수 있다.
특히나 대부분은 잘 사용하는 SpringSecurity에 대한 Filter 속성등을 하는 SecurityConfig를 해당 폴더에 설정을 저장해놓는다.
- DTO(Data Transfer Object)
서로 다른 계층 간에 데이터를 전달하는 데 사용되는 객체로, 주로 컨트롤러와 서비스 계층, 서비스 계층과 리포지토리 계층 간에 데이터를 전달할 때 사용된다.
굳이 사용하지 않고 엔티티를 그대로 써도 되지만 기능적으로는 User 객체를 구현할 때에는 회원가입 당시 받아야하는 데이터와 클라이언트에 회원 정보를 보내줄때 필요한 데이터가 다른 경우가 많기에 이를 사용해서 보안에 민감하지 않거나 필요한 정보들만 DTO에 설정하여 보내게된다.
본질적으로는 이렇게 하는 경우에는 DTO가 읽기 전용이기 때문에 객체간 안정성과 무결성이 생겨서 정보의 변질에 대한 걱정을 하지 않아도된다.
- Entity
데이터베이스의 테이블과 매핑되는 객체로, 자바의 ORM인 JPA를 사용하여 데이터베이스와 자바 객체 간의 매핑을 처리하게 되면 편하다. SQL 구문을 써서 할 수도 있지만 일단 내 수준에서는 SQL구문을 통해 구현하는 방식이 더 효과적인 상황은 찾지 못했다.
- Repository
데이터베이스와의 상호 작용을 처리하는 인터페이스로, CRUD 작업과 같은 데이터베이스 작업을 캡슐화한다. 스프링 데이터 JPA를 사용하면, 인터페이스를 통해 기본적인 CRUD 작업을 자동으로 처리할 수 있다.
- Service
비즈니스 로직을 수행하는 계층으로, 일반적으로 컨트롤러에서 호출되어 실행된다. 서비스 계층은 비즈니스 로직을 처리하고, 필요한 경우 리포지토리를 사용하여 데이터베이스와 상호작용한다.
단어 그대로 위에서 구현된 여러 계층의 메소드 들을 사용해서 컨트롤러에서 프론트단에게 제공해줄, 제공받은 정보들을 전후처리 한다고 생각하면 좋을 것이다.
이처럼 각 구성 요소는 스프링 프레임워크에서 특정 역할을 담당하며, 서로 상호작용하며 전체 애플리케이션을 구성한다. 이러한 구성 요소들의 분리와 구성은 애플리케이션의 유지 관리, 확장성 및 테스트 용이성에 크게 기여한다.
스프링 프레임워크에서는 이러한 구성 요소들이 의존성 주입(Dependency Injection)DI 패턴을 사용하여 유연하게 연결되고 관리된다. 타 언어(Python 에는 PySyringe 등)에도 존재하지만 장고 프로젝트에서는 자바에서만큼 계층을 나누어 관리하지는 않았다.
이를 통해 코드의 결합도를 낮추고, 모듈 간의 독립성을 높여 개발 및 유지 보수가 용이하게 된다.
마무리
스프링 프레임워크를 사용하여 애플리케이션을 구축할 때, 각 구성 요소의 역할을 이해하고 적절한 책임을 할당함으로써 효율적이고 확장 가능한 구조를 설계할 수 있다.
나의 경우에는 장고를 해봤던 경험을 가지고 개념에 대한 이해없이 다른 사람의 코드를 보고 분석하는 방식을 가졌는데 나중에 돌아보니 이 방법도 장점이 있었겠지만 개념을 다 숙지한채로 들어갔다면 좀 더 수월했을것 같다.
그렇다고 실습이 중요하지 않다는건 아니다. 항상 느끼는 거지만 개념에 대한 이해는 프로젝트나 작업을 하면서 이해도가 상승하는 것 같다.
이 글을 통해 스프링 프레임워크의 구성 요소와 그 역할에 대한 이해가 도움이 되기를 바란다.
'Spring' 카테고리의 다른 글
SpringBoot+MySQL(JPA) 회원가입,JWT 로그 구현하기 - (2) (1) | 2023.06.23 |
---|---|
스프링 JPA: 엔티티 필드의 기본값에 대한 고찰 (0) | 2023.06.21 |
@Transient 어노테이션과 DTO를 사용한 레이어 분리 (0) | 2023.04.22 |
SpringBoot+MySQL(JPA) 회원가입,JWT 로그인 구현하기 - (1) (0) | 2023.04.10 |
SpringBoot+MySQL(JPA) 회원가입,JWT 로그인 구현하기 - (0) (2) | 2023.04.10 |