엔터티의 구조를 바꿨다.
- 일단 user의 타입을 따로 인가테이블에서 관리할 수 있도록 만들었다. 로그인 시 타입에 따라서 다른 테이블에 있는 데이터에 접근할 수 있다.
- 학생과 학부모의 관계가 n:m 관계이므로, 중간에 연결할 수 있는 학생-학부모 테이블을 생성하였다.
- 관리자 테이블의 속성을 많이 줄였다.
이제부터는 이 Entity들을 코드로 변환하기 위한 spring project 구조에 대해서 알아보자.
MVC 패턴
MVC 패턴은 Spring 프로젝트를 구성할 때, 역할에 따라서 Model, Controller, View로 로직을 분리하여 사용하는 패턴이다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있으며, 좀 더 나은 관리를 하기 위해 사용한다.
일단 각각을 알아보기 전에 소프트웨어가 이 패턴대로 어떻게 작동하는지 써보자
1. 사용자의 Request를 Controller가 받는다.
2. Controller는 Service를 통해 비즈니스 로직을 처리한 후 결과를 Model에 담는다.
3. Model에 저장된 결과를 바탕으로 시각적 요소 출력을 담당하는 View를 제어하여 사용자에게 전달한다.
웹에서 동작하는 것으로 대입해보면,
1. 사용자가 웹사이트에 접속한다.
2. Controller는 사용자가 요청한 웹 페이지를 보여주기 위해 Mode을 호출한다.
3. Model은 비즈니스 로직을 통해 DB 및 파일과 같은 데이터를 제어한 후 결과를 반환한다. 이후 Controller는 Model에게 반환받은 결과를 View에 반영한다.
4. 데이터를 받아온 View가 사용자에게 웹페이지를 출력해서 보여준다.
이와 같이 Model, View, Controller 가 각각 역할을 분담하여 작동되는 것을 보여준다. 이제, 각각의 역할과 이들이 역할을 수행하기 위해 또 다른 구조들이 있는지 알아보자.
MODEL
Model은 소프트웨어에서 정보 및 데이터 부분을 담당한다. Controller에서 받은 데이터를 가공하여 View에 보내거나 가져온다.
VIEW
View는 사용자가 직접 보는 UI 부분을 담당한다. 즉, Model에서 받아온 데이터를 시각적으로 표현하고, 사용자에게 정보를 제공하는 역할을 한다.
CONTROLLER
Controller는 사용자의 요청을 받아서 적절한 처리를 하고, 그 결과를 View에 전달하는 역할을 한다. Spring Boot에서는 @RestController, @Controller 어노테이션을 사용하여 Controller를 만든다.
DTO (Data Transfer Object)
DTO는 데이터를 전송할 때 사용하는 객체(클래스)로, Entity를 직접 반환하는 것을 방지하기 위해 사용된다. DTO를 사용하면 Entity와 View 간의 데이터 의존성을 줄이고, 필요한 데이터만 전송할 수 있다.
SERVICE
Service 계층은 비즈니스 로직을 처리하는 핵심 역할을 한다. Controller는 요청을 받아 Service를 호출하며, Service는 Repository와 연결되어 필요한 데이터를 처리한다.
EduClass 디렉토리 구분
EduClass 프로젝트에서는 기능별 모듈을 독립적으로 관리하는 도메인 중심 설계(Domain-Driven Design, DDD) 원칙을 따르고 있다. 이를 통해 유지보수성과 확장성을 높이고, 각 기능을 분리하여 개발할 수 있도록 구성하였다.
디렉토리별 역할 설명
1. Config : Config 폴더에는 프로젝트 전반에 영향을 미치는 설정 파일들이 위치합니다.
- 예시: CORS 설정, Security 설정, Global Exception Handling 등
2. Exam, Lecture, Member (기능별 모듈화)
각각의 폴더는 특정 도메인 기능을 담당하며, 내부적으로 MVC 패턴을 적용하여 역할을 분리합니다.
- Controller(컨트롤러 - API 요청 처리) : HTTP 요청을 받아서 적절한 서비스를 호출하고, 응답을 반환하는 역할을 합니다.
- Domain(도메인 - Entity, 핵심 Model) : 데이터베이스 테이블과 매핑되는 Entity 클래스들이 위치합니다.
- DTO(데이터전송객체 - Request/Response 객체) : 클라이언트와의 데이터 통신을 위한 요청 및 응답 객체를 정의합니다. 또한, Entity 클래스를 직접 노출하지 않도록 보호하는 역할을 합니다.
- Repository(데이터 접근 - JPA Repository) : Spring Data JPA를 활용하여 데이터베이스와의 연결을 관리합니다.
- Service(서비스 - 비즈니스 로직 처리) : 실제로 데이터를 조작하고 처리하는 주요 비즈니스 로직이 위치합니다.
디렉토리별 구조의 장점
1. 기능별 모듈화로 유지보수성 증가
exam, lecture, member 등의 기능이 분리되어 있어 특정 기능을 변경하더라도 다른 기능에 영향을 주지 않음.
2. 확장성이 뛰어남
exam, lecture, member 등의 기능이 분리되어 있어 특정 기능을 변경하더라도 다른 기능에 영향을 주지 않음.
3. 비즈니스 로직과 데이터 접근을 명확하게 분리
controller, service, repository의 역할이 분명하므로 코드가 더욱 읽기 쉬워지고 유지보수가 용이
4. DTO를 활용하여 보안 강화
Entity를 직접 반환하지 않고 DTO를 사용하여 데이터 보호 및 유효성 검증을 강화할 수 있음
'EduClass Project' 카테고리의 다른 글
[Project] N:M 매핑에서 복합 키(Composite Key)를 사용할 때 주의할 점 (0) | 2025.03.05 |
---|---|
[Project] 불필요한 Entity 제거를 통한 데이터베이스 설계 최적화 – Test Entity를 없앤 이유 (0) | 2025.03.05 |
[Project] (4) API 구현(@RequestParam vs @PathVariable) (0) | 2025.02.07 |
[Project] (2) 프로젝트 시작(Entity 설계, 변수명) (1) | 2025.01.24 |
[Project] (1) 프로젝트 시작(플로우차트, Entity 설계) (1) | 2025.01.23 |