9장부터는 앞서 공부한 내용을 토대로 웹 애플리케이션을 제작합니다. 12장까지에 걸쳐 데이터베이스 조작과 비즈니스 로직 처리, 레이어 생성까지 다루고 있습니다. 책에 적힌 코드를 기반으로 하되 제가 선호하는 방식으로 코드가 작성된 부분이 있습니다. 책에서는 PostgreSQL과 JDBC를 쓰지만 저는 MySQL과 JPA를 썼습니다. 두 차이로 달라지는 부분을 제외하고는 모든 코드가 동일하게 작성되었습니다.
항목 | 값 |
Project | Gradle Project |
Spring Boot | 3.1.1 |
Artifact | quiz |
Packaging | jar |
Java | 17(temurin) |
Package name | com.example.quiz |
Dependencies
- Spring Boot DevTools
- Lombok
- Spring Data JPA
- MySQL Driver
- Validation
- Thymeleaf
- Spring Web
전체 코드는 아래 깃허브 주소를 참고
(책에서 코드와 함께 작성되어 있던 코드 설명 주석은 하나도 없습니다.
이외에 QuizApplication 주석처리 된 부분은 테스트가 끝나고 삭제되었어야 할 부분입니다.)
https://github.com/Eunjeong21/Quiz.git
작성할 기능 목록
No | 기능 | 설명 |
1 | 등록 기능 | 퀴즈를 등록합니다. |
2 | 갱신 기능 | 등록된 퀴즈를 갱신합니다. |
3 | 삭제 기능 | 등록된 퀴즈를 삭제합니다. |
4 | 목록 표시 기능 | 등록된 퀴즈의 목록을 표시합니다. |
5 | 게임 기능 | 퀴즈 게임을 실시합니다. |
URL 목록
No | 역할 | HTTP 메서드 | URL |
1 | 퀴즈 목록을 표시합니다. | GET | /quiz |
2 | 등록 처리를 실행합니다. | POST | /quiz/insert |
3 | 갱신 화면을 표시합니다. | GET | /quiz/{id} |
4 | 갱신 처리를 실행합니다. | POST | /quiz/update |
5 | 삭제 처리를 실행합니다. | POST | /quiz/delete |
6 | 퀴즈 화면을 표시합니다. | GET | /quiz/play |
7 | 퀴즈 답을 체크합니다. | POST | /quiz/check |
이 애플리케이션은 애플리케이션 레이어, 도메인 레이어, 인프라스트럭처 레이어와 같이 세 개의 레이어로 나뉩니다. 애플리케이션 레이어는 클라이언트에서 받은 요청을 제어하고 도메인 레이어를 사용하여 애플리케이션을 제어합니다. 도메인 레이어는 도메인 객체에 대해 애플리케이션의 서비스 처리를 실행합니다. 인프라스트럭처 레이어는 도메인 객체에 대해 CRUD 조작을 해서 데이터의 영속화(영구 저장)를 담당합니다.
작성할 컴포넌트 목록
No | 레이어 | 컴포넌트 | 이름 | 비고 |
1 | 애플리케이션 레이어 |
View | ─ | 화면 표시 |
2 | 애플리케이션 레이어 |
Controller | QuizController | 제어 역할 담당 |
3 | 애플리케이션 레이어 |
Form | QuizForm | 화면의 게임폼을 표현 |
4 | 도메인 레이어 |
Service | QuizService | 인터페이스로 생성 |
5 | 도메인 레이어 |
ServiceImpl | QuizServiceImpl | Service를 구현 |
6 | 도메인 레이어 |
도메인 객체 | Quiz | 엔티티 역할 |
7 | 도메인 레이어 |
Repository | QuizRepository | 인터페이스로 생성 |
8 | 인프라스트럭처 레이어 |
RepositoryImpl | ─ | O/R Mapper로 자동 생성 |
9 | 인프라스트럭처 레이어 |
O/R Mapper | ─ | 스프링 데이터 JDBC를 사용 |
레이어별 컴포넌트 설명
레이어 | 컴포넌트 | 설명 |
애플리 케이션 레이어 |
Controller | 요청을 처리에 매핑하고 결과를 뷰에 넘겨주는 제어를 합니다. 주요 처리는 Controller 안에서 실행하지 않고 '도메인 레이어'의 Service를 호출합니다. |
Form | 화면의 폼을 표현합니다. 화면에서 입력한 값을 Controller에 넘겨줍니다. 또한 Controller에서 화면에 결과를 출력할 때도 사용합니다. 도메인 레이어가 애플리케이션 레이어에 의존하지 않도록 Form에서 도메인 객체로 변환하거나 도메인 객체에서 Form으로 변환하는 것을 애플리케이션 레이어에서 수행해야 합니다. | |
View | 화면 표시를 담당합니다. | |
도메인 레이어 |
도메인 객체 | 서비스 처리를 실행할 때 필요한 자원입니다. |
Service | 애플리케이션의 서비스 처리를 담당합니다. | |
Repository | 구현 내용은 작성하지 않고 데이터베이스의 데이터 조작 내용만 정의합니다. | |
인프라 스트럭처 레이어 |
RepositoryImpl | 도메인 레이어에서 정의한 Repository의 구현 클래스입니다. |
O/R Mapper | 객체와 관계형 데이터베이스 간의 데이터를 매핑합니다. |
테이블 정의
No | 칼럼 | 타입 | 제약 | 설명 |
1 | id | int(AUTO_INCREMENT) | PK |
퀴즈 정보 식별 ID |
2 | question | text | NOT NULL | 퀴즈 내용 |
3 | answer | tinyint | NOT NULL | 퀴즈 답 |
4 | author | varchar(20) | NOT NULL | 작성자 |
SQL 언어에 익숙하지 않아 DB를 다루면서 MySQL Workbench를 사용했습니다. 이는 SQL 개발과 관리, 데이터베이스 설계, 생성 및 유지를 위한 단일 개발 통합 환경을 제공하는 비주얼 데이터베이스 설계 도구입니다. 사실 툴도 잘 다루지 못하지만 없는 것보다는 훨씬 직관적이고 좋았습니다. 개발자는 코드 설계 능력도 중요하지만 툴을 잘 다루는 것도 능력인 듯합니다.
※ "스프링 프레임워크 첫걸음"이라는 책을 참고하여 쓴 게시글로, 책의 내용을 완전히 담지 않되 공부한 부분을 위주로 정리하여 작성하고자 했습니다. 따라서 글에는 책에서 다루지 않은 내용도 포함되어 있으며 문제가 되거나 부정확한 부분이 있다면 알려주시면 감사하겠습니다.
※ 책은 게시글보다 정확한 내용을 담고 있으며 코드, 그림, 예제를 이용하여 개념을 자세히 설명합니다.
'Java > Spring' 카테고리의 다른 글
[Spring] 7. 유효성 검사 (0) | 2023.06.29 |
---|---|
[Spring] 6. 요청 파라미터(request parameter) (0) | 2023.06.20 |
[Spring] 5. MVC 모델 (0) | 2023.06.15 |
[Spring] 4. 데이터베이스 작업 (0) | 2023.06.05 |
[Spring] 3. 스프링 프레임워크의 핵심 기능 알아보기 (0) | 2023.06.03 |