군만두의 IT 공부 일지

[1주차] 내일배움캠프 Spring Java 심화 부트캠프 3기 - JDBC와 JPA 본문

개발일지/스파르타코딩클럽

[1주차] 내일배움캠프 Spring Java 심화 부트캠프 3기 - JDBC와 JPA

mandus 2025. 2. 3. 16:47

 

오늘부터 내일배움캠프 온라인 강의를 수강하면서 JDBC와 JPA에 대해서 학습한 내용을 간단히 블로그에 정리하려고 한다.

1. 데이터베이스와 SQL

Database는 한 마디로 '데이터의 집합'이다. 데이터베이스 관리 시스템(DBMS)을 통해 데이터를 생성, 검색, 업데이트 및 관리할 수 있다.

  • 관계형 데이터베이스(RDBMS)는 테이블 형태로 데이터를 저장하며, SQL을 사용하여 데이터를 관리한다. 대표적으로 MySQL, PostgreSQL 등이 있다.
  • SQL(Structured Query Language)은 데이터베이스에서 데이터를 관리하기 위해 설계된 프로그래밍 언어이다. 데이터 검색, 저장, 수정, 삭제 등을 수행할 수 있다.

기본 SQL 명령어

  • CREATE: 데이터베이스에 새로운 테이블을 생성한다.
  • ALTER: 이미 존재하는 테이블의 구조를 수정한다.
  • INSERT: 테이블에 새로운 데이터 레코드를 추가한다.
  • UPDATE: 테이블의 기존 데이터를 수정한다.
  • DELETE: 테이블에서 데이터를 삭제한다.
  • SELECT: 데이터베이스에서 데이터를 조회한다.
  • JOIN: 두 개 이상의 테이블을 연결하여 데이터를 조회한다.

2. JDBC와 스프링 연결

JDBC(Java Database Connectivity)는 자바 애플리케이션과 데이터베이스 사이의 통신을 가능하게 하는 API이다. 스프링 프레임워크에서는 JdbcTemplate을 사용하여 데이터베이스 연결과 SQL 실행을 간소화한다.

2.1 설정 파일과 의존성 추가

스프링 프로젝트 설정 파일 application.properties에 데이터베이스 접근 정보를 설정하고, build.gradle에 필요한 JDBC 라이브러리를 추가한다. JDBC 드라이버만 교체함으로써 다른 데이터베이스로 변경할 수 있다. 

// application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db_name
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
// build.gradle
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'

2.2 JdbcTemplate 사용

JdbcTemplate을 활용하여 데이터베이스 작업을 수행한다. INSERT, UPDATE, DELETE, SELECT 작업을 통해 데이터를 쉽게 관리할 수 있다. Java 개발자들을 위해 DB와 객체를 매핑하여 소통할 수 있는 ORM이라는 기술이 등장했으므로, JdbcTemplate는 가볍게 훑어볼 것이다.

// INSERT
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");

// UPDATE
sql = "UPDATE memo SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "Robbert", 1);

// DELETE
sql = "DELETE FROM memo WHERE id = ?";
jdbcTemplate.update(sql, 1);

// SELECT
sql = "SELECT * FROM memo";
return jdbcTemplate.query(sql, new RowMapper<MemoResponseDto>() {
    public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
        return new MemoResponseDto(rs.getLong("id"), rs.getString("username"), rs.getString("contents"));
    }
});

3. JPA

JPA(Java Persistence API)는 Java ORM 기술에 대한 표준 명세로, 개발자는 SQL을 직접 작성하는 대신 객체를 통해 데이터베이스를 관리할 수 있다. JPA는 엔티티(Entity)를 통해 데이터베이스와 객체를 매핑하며, 이를 통해 CRUD 작업을 간소화한다. 스프링 부트에서는 기본적으로 '하이버네이트(Hibernate)' 구현체를 사용한다.

@Entity
@Table(name = "memo")
public class Memo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username", nullable = false, unique = true)
    private String username;

    @Column(name = "contents", nullable = false, length = 500)
    private String contents;
}

위의 엔티티 클래스는 memo 테이블에 매핑되며, JPA는 이 엔티티를 통해 데이터베이스의 CRUD 작업을 수행할 수 있다. JPA의 EntityManager는 영속성 컨텍스트를 사용하여 엔티티의 생명주기를 관리하고, 데이터베이스와의 동기화를 처리한다.

  • 하이버네이트: JPA를 실제 구현한 프레임워크 중 사실상 표준
  • 영속성 컨텍스트: Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간

JPA 프로젝트 설정

  • persistence.xml 설정: 데이터베이스 접속 정보 및 설정을 포함한다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="memo">
        <class>com.sparta.entity.Memo</class>
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jakarta.persistence.jdbc.user" value="root"/>
            <property name="jakarta.persistence.jdbc.password" value="{비밀번호}"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/memo"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
  • build.gradle 설정: JPA 구현체인 Hibernate와 데이터베이스 드라이버를 포함한다.
plugins {
    id 'java'
}

group 'com.sparta'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    // JPA 구현체인 Hibernate
    implementation 'org.hibernate:hibernate-core:5.4.27.Final'
    // MySQL JDBC Driver
    implementation 'mysql:mysql-connector-java:8.0.22'

    // 테스트를 위한 의존성
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

test {
    useJUnitPlatform()
}
Comments