본문 바로가기

카테고리 없음

[도서] 스프링 프레임워크 첫걸음 9장

9장. 애플리케이션 만들기

9-1. 애플리케이션 설명

1장~8장까지 공부한 내용을 토대로 웹 애플리케이션을 만든다. 'OX 퀴즈' 애플리케이션은 제출된 퀴즈에 대해서 O 혹은 X로 대답하는 퀴즈이다. 이번 장에서는 애플리케이션을 만들기 위한 준비로 기능 설명과 데이터베이스 및 프로젝트를 생성한다.

 

9-1-1. 기능 목록

작성할 기능 목록

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

 

9-1-2. 예제 애플리케이션의 레이어

  • 애플리케이션 레이어
    • 클라이언트에서 받은 요청을 제어하고 도메인 레이어를 사용하여 애플리케이션을 제어한다.
  • 도메인 레이어
    • 도메인 객체에 대해 어플리케이션의 서비스 처리를 실행한다.
  • 인프라스트럭처 레이어
    • 도메인 객체에 대해 CRUD 조작을 해서 데이터의 영속화(데이터를 영구 저장하는)를 담당한다.

9-1-3. 레이어별 컴포넌트 설명

애플리케이션 레이어

  • Controller
    • 요청을 처리에 매핑하고 결과를 뷰에 넘겨주는 제어를 한다. 주요 처리를 Controller 안에서 실행하지 않고 '도메인 레이어'의 Service를 호출한다.
  • Form
    • 화면의 폼을 표현한다. 화면에서 입력한 값을 Controller에 넘겨준다. 또한 Controller에서 화면에 결과를 출력할 때도 사용한다. 도메인 레이어가 애플리케이션 레이어에 의존하지 않도록 Form에서 도메인 객체로 변환하거나 도메인 객체에서 Form으로 변환하는 것을 애플리케이션 레이어에서 수행해야 한다.
  • View
    • 화면 표시를 담당한다.

도메인 레이어

  • 도메인 객체
    • 서비스 처리를 실행할 때 필요한 자원이다.
  • Service
    • 애플리케이션의 서비스 처리를 담당한다.
  • Repository
    • Repository는 인터페이스이다. 데이터베이스의 데이터 조작 내용만 정의한다.

인프라스트럭처 레이어

  • RepositoryImpl
    • 도메인 레이어에서 정의한 Repository의 구현 클래스이다. 'O/R Mapper'가 Repository의 구현 클래스를 생성하는 경우도 있다.
  • O/R Mapper
    • O(Object: 객체)와 R(Relational: 관계형 데이터베이스) 간의 데이터를 매핑한다.

 

9-2. OX 퀴즈용 데이터베이스 생성

pgAdmin4를 이용해 데이터베이스를 생성한다.

이번 애플리케이션의 빌드이다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.7'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}