10장 애플리케이션 만들기(데이터베이스 조작)

Peter·2023년 7월 9일
0
post-thumbnail

10-1-1 작성할 내용 확인

10-1-2 application.properties 설정

application.properties는 스프링 부트 프로젝트에서 환경 설정을 담당하는 파일이다. 여기서는 quizdb 데이터베이스에 접속하는 설정을 추가한다.

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/quizdb
spring.datasource.username=postgres
spring.datasource.password=postgres

10-2-1 도메인 객체 생성

도메인 객체: 비즈니스 로직을 처리한는 데 필요한 객체. 여기서는 엔티티(Entity)와 같은 의미를 가진다.

package com.example.quiz.entity;

import org.springframework.data.annotation.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/** quiz 테이블용: Entity */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Quiz {
    /** 식별 ID */
    @Id
    private Integer id;

    /** 퀴즈 내용 */
    private String question;

    /** 퀴즈 답 */
    private Boolean answer;

    /** 작성자 */
    private String author;
}

클래스에 @Data 어노테이션을 부여하면 모든 필드를 getter/setter로 액세스할 수 있게 된다.
@NoArgsConstructor 어노테이션은 기본 생성자를 자동으로 생성해 준다.
@AllArgsConstructor 어노테이션은 모든 필드에 대해 초깃값을 인수로 받는 생성자를 생성한다.
@Id 어노테이션은 테이블의 PK(기본키)인 id와 매핑된다.

10-2-2 Repository 생성

Repository 는 인터페이스다. 데이터베이스의 데이터 정의만 작성한다.
인터페이스명으로 'QuizRepository'를 입력하고 엔터 키를 친다.

10-2-3 RepositoryImpl 생성

앞에서 만든 QuizRepository 인터페이스에 스프링 데이터에서 제공하는 CrudRepository를 상속해 RepositoryImpl을 만든다. CrudRepository의 타입 파라미터는 엔티티 타입인 Quiz와 @Id 어노테이션을 부여한 필드의 타입인 Integer 순으로 지정한다.

package com.example.quiz.repository;

import org.springframework.data.repository.CrudRepository;

import com.example.quiz.entity.Quiz;

/** Quiz 테이블: RepositoryImpl */
public interface QuizRepository extends CrudRepository<Quiz, Integer> {
  
}

10-3-1 등록 처리

QuizApplication 클래스 생성

package com.example.quiz;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.quiz.entity.Quiz;
import com.example.quiz.repository.QuizRepository;

@SpringBootApplication
public class QuizApplication {
    /** 구동 메서드 */
    public static void main(String[] args) {
        SpringApplication.run(QuizApplication.class, args)
            .getBean(QuizApplication.class).execute();
    }

    /** 주입(인젝션) */
    @Autowired
    QuizRepository repository;

    /** 실행 메서드 */
    private void execute() {
        // 등록 처리
        setup();
    }

    /** === 퀴즈 2건을 등록합니다 === */
    private void setup() {
        // 엔티티 생성
        Quiz quiz1 = new Quiz(null, "Spring은 프레임워크입니까?", true, "홍길동");
        // 등록 실행
        quiz1 = repository.save(quiz1);
        // 등록 확인
        System.out.println("등록한 퀴즈는," + quiz1 + " 입니다.");

        // 엔티티 생성
        Quiz quiz2 = new Quiz(null, "스프링 MVC는 배치 처리를 제공합니까?", false, "홍길동");
        // 등록 실행
        quiz2 = repository.save(quiz2);
        // 등록 확인
        System.out.println("등록한 퀴즈는," + quiz2 + " 입니다.");
    }
}

save 메서드는 @Id 어노테이션이 부여한 필드가 null인 경우에는 INSERT 문을 실행하고 null이 아닌 경우에는 UPDATE문을 실행한다.

실행하면 DB에 퀴즈 정보가 2건 등록된다.

10-3-2 모든 데이터 취득

QuizApplication 클래스에 showList메서드 추가

/** === 모든 데이터 취득 === */
private void showList() {
    System.out.println("--- 모든 데이터 취득 개시 ---");
    // 리포지토리를 이용해 모든 데이터를 취득해서 결과를 반환
    Iterable<Quiz> quizzes= repository.findAll();
    for (Quiz quiz : quizzes) {
        System.out.println(quiz);
    }
    System.out.println("--- 모든 데이터 취득 완료 ---");
}

QuizApplication 클래스의 execute 메서드를 예제 10.6과 같이 수정한다.

/** 실행 메서드 */
private void execute() {
    // 등록 처리
    //setup(); <- 주석 처리
    // 전체 항목 취득
    showList();
}

10-3-3 한 건 데이터 취득

QuizApplication 클래스에 showOne 메서드를 추가한다.

private void showOne() {
    System.out.println("--- 1건 취득 개시 ---");
    // 리포지토리를 사용해서 1건의 데이터를 취득해서 결과를 반환(반환값은 Optional)
    Optional<Quiz> quizOpt = repository.findById(1);
    // 반환값이 있는지 확인
    if (quizOpt.isPresent()) {
        System.out.println(quizOpt.get());
    } else {
        System.out.println("해당 데이터는 존재하지 않습니다.");
    }
    System.out.println("--- 1건 취득 완료 ---");
}

showOne 메서드에서 CrudRepository를 상속해서 4번째 줄의 findById 메서드를 사용한다. 예제에서는 기본키인 id의 값으로 '1'을 지정했다.
findById 메서드의 반환값은 Optional이다. Optional(java.util.Optional)은 null의 가능성이 있는 값을 처리할 때 사용하는 클래스로서 값을 래핑해서 사용한다.
6번째 줄의 isPresent 메서드로 값이 있는지 확인하고 다음 줄의 get 메서드로 래핑한 값을 취득한다. 값이 존재하지 않는 경우에는 런타임 예외(NoSuchElementException)를 던진다.

QuizApplication 클래스의 execute 메서드를 다음과 같이 수정한다.

/** 실행 메서드 */
private void execute() {
    // 등록 처리
    //setup(); <- 주석 처리
    // 전체 항목 취득
    //showList(); <- 주석 처리
    // 1건 취득
    showOne();
}

10-3-4 변경 처리

QuizApplication 클래스에 updateQuiz 메서드를 추가한다.

/** === 변경 처리 === */
private void updateQuiz() {
    System.out.println("--- 변경 처리 개시 ---");
    // 변경할 엔티티를 생성
    Quiz quiz1 = new Quiz(1,"스프링은 프레임워크입니까?", true, "변경 담당");
    // 변경 처리
    quiz1 = repository.save(quiz1);
    // 변경 결과 확인
    System.out.println("변경된 데이터는 " + quiz1 + "입니다.");
    System.out.println("--- 변경 처리 완료 ---");
}

execute 메서드도 다음과 같이 수정한다.

/** 실행 메서드 */
private void execute() {
    // 등록 처리
    //setup(); <- 주석 처리
    // 전체 항목 취득
    //showList(); <- 주석 처리
    // 1건 취득
    //showOne();  <- 주석 처리
    // 변경 처리
    updateQuiz();
}

10-3-5 삭제 처리

QuizApplication 클래스에 deleteQuiz 메서드를 추가한다.

/** === 삭제 처리 === */
private void deleteQuiz() {
    System.out.println("--- 삭제 처리 개시 ---");
    // 삭제 실행
    repository.deleteById(2);
    System.out.println("--- 삭제 처리 완료 ---");
}

5번째 줄의 deleteById 메서드를 사용해 지정한 엔티티를 삭제한다. 예제에서는 기본키인 id에 값으로 '2'를 지정한다.

QuizApplication 클래스의 execute 메서드를 예제 10.12와 같이 수정한다.

/** 실행 메서드 */
private void execute() {
    // 등록 처리
    //setup(); <- 주석 처리
    // 전체 항목 취득
    //showList(); <- 주석 처리
    // 1건 취득
    //showOne();  <- 주석 처리
    // 변경 처리
    //updateQuiz();<- 주석 처리
    // 삭제 처리
    deleteQuiz();
}

10번째 줄의 updateQuiz 메서드를 주석 처리하고, execute 메서드에서 deleteQuiz 메서드를 호출한다.

이번 장에서는 도메인 객체, Repository, RepositoryImpl, O/R Mapper를 구현하고 quizdb 데이터베이스의 quiz 테이블을 대상으로 CRUD를 처리했다. 다음 장에서는 비즈니스 로직을 처리하는 부분을 작성해 본다.

profile
개발자 지망생. 일단 하고보자

0개의 댓글