๐Ÿ“Œ Spring Boot JPA ๊ธฐ์ดˆ

My Pale Blue Dotยท2025๋…„ 5์›” 7์ผ
0

SPRING BOOT

๋ชฉ๋ก ๋ณด๊ธฐ
4/40
post-thumbnail

๐Ÿ“Œ [Spring Boot JPA ๊ธฐ์ดˆ ์ •๋ฆฌ + ์‹ค์Šต ์˜ˆ์ œ]

๐Ÿ“… ๋‚ ์งœ

2025๋…„ 5์›” 7์ผ

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ JPA๋ž€?

  • JPA(Java Persistence API)๋Š” ์ž๋ฐ” ORM(Object-Relational Mapping) ๊ธฐ์ˆ  ํ‘œ์ค€์ด๋‹ค.
  • ์ž๋ฐ” ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ/์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
  • ๊ตฌํ˜„์ฒด๋กœ๋Š” Hibernate, EclipseLink ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, Spring Boot์—์„œ๋Š” Hibernate๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

2๏ธโƒฃ Spring Boot JPA ์˜์กด์„ฑ

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • ๋‚ด๋ถ€์ ์œผ๋กœ Hibernate๊ฐ€ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋กœ ์ ์šฉ๋จ
  • Spring Data JPA ๊ธฐ๋Šฅ๋„ ํฌํ•จ๋˜์–ด ์žˆ์–ด Repository ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ •์˜ํ•ด๋„ CRUD ์ž๋™ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

3๏ธโƒฃ application.properties ์„ค์ •

spring.application.name=demo

# Server
server.port=8090

# Encoding ์„ค์ •
spring.servlet.filter.encoding.filter-name=encodingFilter
spring.servlet.filter.encoding.filter-class=org.springframework.web.filter.CharacterEncodingFilter
spring.servlet.filter.encoding.init-param.encoding=UTF-8
spring.servlet.filter.encoding.init-param.forceEncoding=true
spring.servlet.filter.encoding.url-pattern=/*

# JSP ์„ค์ •
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.servlet.jsp.init-parameters.development=true

# (์˜ˆ์‹œ) ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • - MySQL
#spring.datasource.url=jdbc:mysql://localhost:3306/testdb
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.username=root
#spring.datasource.password=1234

# Hibernate ์„ค์ •
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.jdbc.batch_size=1000
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.sql.init.mode=always
spring.jpa.defer-datasource-initialization=true

4๏ธโƒฃ Book ์—”ํ‹ฐํ‹ฐ

package com.example.demo.domain.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name="book")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Book {
    @Id
//    @GeneratedValue(strategy = GenerationType.IDENTITY)
    // ๐Ÿ‘‰ ๊ธฐ๋ณธ ํ‚ค๋ฅผ DB์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ (MySQL์˜ auto_increment ์—ญํ• )
    @Column(name="bookcode")
    private Long bookCode; // ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ• โ†’ DB์—์„œ๋Š” book_code๋กœ ๋ณ€ํ™˜๋จ

    @Column(name="bookname")
    private String bookName;

    private String publisher;
    private String isbn;
}

5๏ธโƒฃ User ์—”ํ‹ฐํ‹ฐ

package com.example.demo.domain.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    @Id
    @Column(length = 100) // varchar(100)
    private String username;

    @Column(length = 255, nullable = false)
    private String password;

    @Column(length = 255)
    private String role; // ์˜ˆ: "USER", "ADMIN"
}

6๏ธโƒฃ BookRepositoryTest ํด๋ž˜์Šค (CRUD ํ…Œ์ŠคํŠธ)

package com.example.demo.domain.repository;

import com.example.demo.domain.entity.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class BookRepositoryTest {

    @Autowired
    private BookRepository bookRepository;

    @Test
    public void t1() throws Exception {
        // INSERT ์˜ˆ์ œ
//        Book book = Book.builder()
//                .bookCode(1111L)
//                .bookName("์ด๊ฒƒ์ด ๋ฆฌ๋ˆ…์Šค๋‹ค")
//                .publisher("ํ•œ๋น›๋ฏธ๋””์–ด")
//                .isbn("1111-1111")
//                .build();
//        bookRepository.save(book); // ์ €์žฅ

        // UPDATE ์˜ˆ์ œ
//        book.setBookName("JAVA์˜ ์ •์„");
//        book.setPublisher("์ด์ง€ํผ๋ธ”๋ฆฌ์‹ฑ");
//        book.setIsbn("1111-22-3333");
//        bookRepository.save(book); // ๋™์ผํ•œ ID๋ฉด update ์ฒ˜๋ฆฌ๋จ

        // DELETE ์˜ˆ์ œ
        bookRepository.deleteById(1111L); // ํ•ด๋‹น bookCode๋กœ ์‚ญ์ œ
    }
}

๐Ÿ”ฅ ์ •๋ฆฌ

  • JPA๋Š” ์ž๋ฐ” ORM ๊ธฐ์ˆ ์˜ ํ‘œ์ค€์œผ๋กœ, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • Hibernate ์„ค์ •์„ ํ†ตํ•ด ์ž๋™ ์Šคํ‚ค๋งˆ ์ƒ์„ฑ, SQL ์ถœ๋ ฅ, ๋ฐฐ์น˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋“ฑ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Spring Boot์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์ •๊ณผ ์‚ฌ์šฉ์ด ๋งค์šฐ ๊ฐ„ํŽธํ•˜๋‹ค.
  • Entity ํด๋ž˜์Šค๋Š” @Entity, @Id, @Column, @Builder ๋“ฑ์œผ๋กœ ์ •์˜๋˜๋ฉฐ, JPA๊ฐ€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ SQL์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” .save(), .deleteById() ๋“ฑ์„ ์‚ฌ์šฉํ•ด CRUD ๋™์ž‘์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€