26/07/16 IL(I Learned) - Step 4

JDBC CRUD 실습을 통한 데이터 관리 과정과 최종 회고

앞에서 학습한 Driver Loading, Connection 생성, SQL 실행, Repository 패턴을 하나로 연결하여 CRUD(Create, Read, Update, Delete) 기능을 직접 수행하였다. 단순히 SQL을 실행하는 것이 아니라 사용자의 입력을 받아 데이터를 저장하고, 조회한 데이터를 수정한 뒤 삭제하는 일련의 과정을 경험하면서 JDBC가 실제 애플리케이션에서 어떻게 사용되는지 이해할 수 있었다.

데이터베이스와 객체를 연결하는 전체 흐름을 처음부터 끝까지 직접 구현해 보면서 Spring Boot와 JPA가 내부적으로 수행하는 역할을 더욱 명확하게 이해할 수 있었다.


1) MyCRUD

학습 내용상세 내용
CRUD 실습Create, Read, Update, Delete를 하나의 프로그램에서 모두 수행하였다.
Repository 활용SQL을 직접 작성하지 않고 Repository를 호출하여 데이터를 관리하였다.
Scanner사용자 입력을 받아 데이터베이스에 저장하였다.
Record 활용조회한 데이터를 객체로 저장하여 수정 작업에 활용하였다.
전체 JDBC 흐름JDBC가 실제 서비스에서 어떻게 동작하는지 하나의 프로그램으로 확인하였다.
public class CrudExample {

    public static void main(String[] args) {

        BanchanRepository repository = new BanchanRepository();

        Scanner inputScanner = new Scanner(System.in);

        System.out.print("추가할 반찬 이름 : ");

        String menuName = inputScanner.nextLine();

        repository.save(new SideDish(0, menuName));

        List<SideDish> dishes = repository.findAll();

        System.out.println(dishes);

    }

}

이번 프로그램은 CRUD를 하나의 흐름으로 연결하였다.

가장 먼저 Repository 객체를 생성하였다.

BanchanRepository repository =
        new BanchanRepository();

Repository는

  • INSERT
  • SELECT
  • UPDATE
  • DELETE

모든 SQL을 담당한다.

따라서 Main에서는 SQL을 작성하지 않는다.

객체지향적으로 역할을 분리한 것이다.


다음으로 Scanner를 이용하여

사용자의 입력을 받았다.

Scanner inputScanner =
        new Scanner(System.in);

입력받은 문자열은

repository.save(...)

를 호출하면서 데이터베이스에 저장된다.

Main 클래스는

저장 방법을 모른다.

단지 Repository에게

"저장해줘"

라고 요청만 한다.

이것이 Repository 패턴의 가장 큰 장점이라는 것을 이해하였다.


CRUD 실행 과정

사용자 입력

↓

Scanner

↓

Repository.save()

↓

PreparedStatement

↓

INSERT SQL 실행

↓

Database 저장

프로그램은 이 순서대로 동작한다.


조회(Read)

데이터 저장 후

List<SideDish> dishes =
        repository.findAll();

을 호출하였다.

Repository는

SELECT 문을 실행하고

ResultSet을 읽은 뒤

Record 객체를 생성하여

List로 반환한다.

Main에서는

SQL이 어떻게 실행되는지 전혀 알 필요가 없다.


수정(Update)

수정 과정에서는

먼저

repository.findById(...)

를 호출하였다.

조회한 데이터를 이용하여

새로운 Record를 생성하였다.

SideDish updatedDish =
        new SideDish(

                oldDish.id(),

                oldDish.name() + "(수정)"

        );

그 이후

repository.update(updatedDish);

를 호출하여

데이터를 수정하였다.


삭제(Delete)

삭제는

repository.deleteById(id);

한 줄로 수행하였다.

Repository 내부에서는

DELETE SQL이 실행된다.

삭제가 성공하면

executeUpdate()

반환값이

1이 된다.

실패하면

0이 된다.

이를 이용하여

삭제 성공 여부를 확인할 수 있다는 점을 배웠다.


CRUD 전체 흐름

사용자 입력

↓

Main

↓

Repository

↓

DBUtil

↓

Connection

↓

PreparedStatement

↓

Database

↓

ResultSet

↓

Repository

↓

Main

↓

사용자 출력

이번 실습을 통해

JDBC는 단순히 SQL을 실행하는 기술이 아니라

각 객체들이 서로 역할을 분담하며 하나의 흐름으로 동작한다는 점을 이해하였다.


객체지향 관점에서 본 구조

클래스역할
Main사용자 요청 처리
Repository데이터 접근 담당
DBUtilDB 연결 담당
Record(Banchan)데이터 저장
PostgreSQL실제 데이터 저장

객체마다 역할을 분리하였기 때문에

유지보수가 쉬워지는 구조라는 것을 느꼈다.


느낀 점

느낀 점내용
CRUD 전체 흐름저장, 조회, 수정, 삭제가 하나의 흐름으로 연결된다는 점을 이해하였다.
객체지향각 클래스가 자신의 역할만 수행하도록 설계하는 이유를 알게 되었다.
Repository 패턴SQL을 분리하는 이유를 직접 경험하였다.
Spring 준비앞으로 Spring Data JPA를 배우더라도 내부 동작을 이해하는 데 큰 도움이 될 것 같다.

여러 실습을 반복하면서 JDBC의 전체 흐름을 하나의 그림으로 정리하니 각 객체의 역할이 명확하게 구분되었다.

Driver Loading

↓

Connection 생성

↓

PreparedStatement 생성

↓

SQL 실행

↓

ResultSet 반환

↓

객체 생성

↓

Repository 반환

↓

Main 출력

이 흐름을 기준으로 코드를 다시 읽어보니, 이전에는 각각 독립적으로 보였던 클래스들이 하나의 과정 안에서 서로 협력하고 있다는 점을 이해할 수 있었다.

또한 PreparedStatement는 SQL과 데이터를 분리하여 SQL Injection을 방지하고, Repository는 데이터 접근을 담당하며, DBUtil은 연결을 생성하는 역할만 수행하는 등 각 클래스가 하나의 책임만 가지도록 설계되어 있다는 사실도 배울 수 있었다.

📌 최종 정리

이번 JDBC 학습은 단순히 SQL을 실행하는 방법을 배우는 것이 아니라, 자바 애플리케이션이 데이터베이스와 어떻게 통신하는지에 대한 전체 흐름을 이해하는 과정이었다. Driver를 로딩하여 연결을 준비하고, DBUtil을 통해 Connection을 생성하며, PreparedStatement로 안전하게 SQL을 실행하고, ResultSet을 객체로 변환하여 Repository를 통해 반환하는 일련의 과정을 직접 구현하면서 데이터 접근 계층의 역할을 명확하게 이해할 수 있었다.

또한 CRUD 기능을 하나씩 구현하며 객체지향 설계와 Repository 패턴의 장점을 체감하였고, 이러한 구조가 이후 학습할 Spring Boot, MyBatis, Spring Data JPA에서도 동일한 개념으로 확장된다는 점을 알게 되었다.

profile
예 마 함 가보입시더

0개의 댓글