๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring Boot์™€ JPA๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ํ•˜๊ธฐ: ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฐ€์ด๋“œ

mrmount 2024. 10. 21.

 

Spring Boot ์™€ JPA(Java Persistence API) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ์ด ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค. JPA๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(Java)์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDB)๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ORM(Object Relational Mapping) ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Spring Data JPA ๊ธฐ๋ณธ ์„ค์ • , Entity์™€ Repository ์„ค๊ณ„ , ๊ทธ๋ฆฌ๊ณ  Query Method์™€ JPQL ํ™œ์šฉ๋ฒ• ์„ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

 


 

 

๋ชฉ์ฐจ

  1. Spring Data JPA๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  2. Spring Boot์™€ JPA ์—ฐ๋™ ์„ค์ •ํ•˜๊ธฐ
  3. Entity์™€ Repository ์„ค๊ณ„ ๋ฐฉ๋ฒ•
  4. Query Method์™€ JPQL ํ™œ์šฉํ•˜๊ธฐ
  5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์— ๋Œ€ํ•œ ํŠธ๋ Œ๋“œ์™€ ์ค‘์š”์„ฑ

 


 

1. Spring Data JPA๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Spring Data JPA ๋Š” JPA๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ž…๋‹ˆ๋‹ค. JPA๋Š” SQL ๋Œ€์‹  ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, Spring Data JPA๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๋” ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋™ํ™”๋œ Repository ์ƒ์„ฑ ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Spring Data JPA์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ž๋™ Repository ์ƒ์„ฑ : ๊ธฐ๋ณธ์ ์ธ CRUD(Create, Read, Update, Delete) ๊ธฐ๋Šฅ ์ œ๊ณต
  • Query Method : ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋งŒ์œผ๋กœ SQL ์ฟผ๋ฆฌ ์ƒ์„ฑ
  • JPQL(Java Persistence Query Language) : ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑ

์ด์ œ JPA์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

2. Spring Boot์™€ JPA ์—ฐ๋™ ์„ค์ •ํ•˜๊ธฐ

 

์˜์กด์„ฑ ์ถ”๊ฐ€ (pom.xml)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
  • spring-boot-starter-data-jpa : JPA ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต
  • H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ๊ฐ€๋ฒผ์šด ์ธ๋ฉ”๋ชจ๋ฆฌ DB ์‚ฌ์šฉ

์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ (application.properties)

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

์ด ์„ค์ •์€ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ ์„ ์„ค์ •ํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ SQL ๋กœ๊ทธ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค.

 


 

3. Entity์™€ Repository ์„ค๊ณ„ ๋ฐฉ๋ฒ•

 

Entity ํด๋ž˜์Šค ์ž‘์„ฑ: User.java

package com.example.demo.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}
  • @Entity : ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • @Id : ๊ธฐ๋ณธ ํ‚ค ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • @GeneratedValue : ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ ์ „๋žต์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Repository ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ: UserRepository.java

package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}
  • JpaRepository : ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ด Repository๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 

4. Query Method์™€ JPQL ํ™œ์šฉํ•˜๊ธฐ

 

Query Method ์‚ฌ์šฉ ์˜ˆ์ œ

List<User> findByName(String name);
  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋งŒ์œผ๋กœ SQL ์ฟผ๋ฆฌ ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • findByName : SELECT * FROM user WHERE name = ? ์ฟผ๋ฆฌ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

JPQL ์‚ฌ์šฉ ์˜ˆ์ œ: UserService.java

package com.example.demo.service;

import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    public User saveUser(String name, String email) {
        User user = new User(name, email);
        return userRepository.save(user);
    }
}
  • findAll() : ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • save() : ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 


 

5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์— ๋Œ€ํ•œ ํŠธ๋ Œ๋“œ์™€ ์ค‘์š”์„ฑ

  • Spring Data JPA ๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ์™€ ๊ฐ™์€ ์ตœ์‹  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
  • Statista ์˜ ์กฐ์‚ฌ์— ๋”ฐ๋ฅด๋ฉด, ์ „ ์„ธ๊ณ„ ๊ธฐ์—…์˜ 60% ์ด์ƒ ์ด ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— JPA์™€ ORM์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—์„œ๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ์ž๋™ํ™”๋œ Repository ์‚ฌ์šฉ์ด ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ ์‹œํ‚ต๋‹ˆ๋‹ค.

 


 

๊ด€๋ จ ๋งํฌ


Spring ๊ณต์‹ ๋ฌธ์„œ๐Ÿ‘†

Spring Data JPA ๋ ˆํผ๋Ÿฐ์Šค๐Ÿ‘†

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต์‹ ์‚ฌ์ดํŠธ๐Ÿ‘†

Java Persistence API(JPA) ๊ฐ€์ด๋“œ๐Ÿ‘†

Spring Initializr๐Ÿ‘†

JPQL ๋ฌธ๋ฒ• ์ •๋ฆฌ๐Ÿ‘†




FAQ

 

1. JPA์™€ MyBatis์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • JPA๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ORM ๋ฐฉ์‹์ด๊ณ , MyBatis๋Š” SQL ๋งคํผ๋กœ SQL ๋ฌธ์„ ์ง์ ‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

2. @Entity ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

  • @Entity ๋Š” ์ž๋ฐ” ํด๋ž˜์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ํ•„๋“œ๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

3. JPA์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋˜๋‚˜์š”?

  • spring.jpa.hibernate.ddl-auto=update ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ์Šคํ‚ค๋งˆ๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

4. JPQL๊ณผ SQL์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • JPQL์€ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐ˜๋ฉด, SQL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

5. JPA ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • Lazy Loading ๊ณผ ์บ์‹œ(Cache) ํ™œ์šฉ ์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 


 

๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Spring Boot์™€ JPA๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. JPA๋Š” ์ž๋ฐ” ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉฐ, Spring Data JPA๋Š” ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŒ…์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง ๋„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด์„ธ์š”.

๊พธ์ค€ํ•œ ์‹ค์Šต์„ ํ†ตํ•ด JPA์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์— ์ž์‹ ๊ฐ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋Œ“๊ธ€