IT Developer/Spring

Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현>

TEMA_ 2025. 3. 30. 13:29
반응형

스프링 Spring

13. Spring Boot에서 JPA를 활용한 CRUD 구현

 

안녕하세요! 태마입니다.

Spring 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

스프링 Spring

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. JPA(Java Persistence API)란?

JPA는 Java 애플리케이션에서 관계형 데이터베이스를 객체 지향적으로 다룰 수 있도록 하는 ORM(Object-Relational Mapping) 기술
Spring Data JPA는 JPA를 쉽게 사용할 수 있도록 도와주는 라이브러리

📌 JPA의 주요 개념

개념설명
Entity 데이터베이스 테이블과 매핑되는 클래스
Repository CRUD 기능을 제공하는 데이터 접근 계층
Persistence Context 엔티티의 상태를 관리하는 영속성 컨텍스트
JPQL (Java Persistence Query Language) SQL이 아닌 객체 지향 쿼리 사용 가능

📌 JPA를 사용하면 "객체를 통해 데이터베이스를 다룰 수 있으며, 유지보수가 쉬워짐"


2. 프로젝트 설정 – JPA & MySQL 연동

Spring Boot 프로젝트에 JPA와 MySQL을 설정하는 과정

📌 1️⃣ build.gradle 설정

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'mysql:mysql-connector-java'
}

JPA와 MySQL 드라이버 추가

📌 2️⃣ application.properties 설정

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

MySQL 연결 설정 및 Hibernate 설정 추가

📌 Spring Boot는 "자동으로 데이터베이스와 연결되며, 기본적인 CRUD 기능을 제공"


3. JPA를 활용한 CRUD 구현을 위한 Entity 클래스 작성

JPA에서는 @Entity를 사용하여 테이블과 매핑되는 클래스를 생성

📌 User 엔티티 생성

import jakarta.persistence.*;

@Entity
@Table(name = "users")
public class User {

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

    private String name;
    private String email;

    protected User() {}

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getter & Setter
}

@Entity를 사용하여 데이터베이스 테이블과 연결
@Id, @GeneratedValue를 사용하여 기본 키 설정

📌 JPA를 사용하면 "테이블을 직접 다루지 않고도 객체를 통해 데이터를 저장 및 조회 가능"


✅ 여기까지 JPA의 개념과 기본적인 프로젝트 설정을 배웠습니다!
👉 "그렇다면, JPA를 활용하여 CRUD 기능을 구현하는 방법은?"
✅ 2부에서 JPA를 활용한 CRUD 기능을 구현하고 API로 제공하는 방법을 배워봅시다!

반응형

 

2. 상세 주제 정리

 

1. Repository를 활용한 CRUD 기능 구현

Spring Data JPA에서는 JpaRepository 인터페이스를 상속하면 자동으로 CRUD 기능을 제공

📌 UserRepository 생성

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

기본적인 CRUD 메서드(save, findById, findAll, delete)를 자동으로 지원

📌 JPA를 사용하면 "별도의 SQL 작성 없이도 기본적인 데이터 조작이 가능"


2. Service 계층을 활용하여 비즈니스 로직 구현

Service 계층에서 Repository를 사용하여 CRUD 기능을 수행

📌 UserService 구현

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 User createUser(String name, String email) {
        return userRepository.save(new User(name, email));
    }

    public User getUser(Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("User not found"));
    }

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

    public User updateUser(Long id, String name, String email) {
        User user = getUser(id);
        user.setName(name);
        user.setEmail(email);
        return userRepository.save(user);
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

서비스 계층을 분리하여 유지보수를 쉽게 함

📌 Service 계층을 사용하면 "비즈니스 로직과 데이터 접근 로직을 분리하여 관리 가능"


3. REST API 컨트롤러 구현

Controller에서 Service 계층을 사용하여 CRUD API 제공

📌 UserController 생성

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        return ResponseEntity.ok(userService.createUser(user.getName(), user.getEmail()));
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.getUser(id));
    }

    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        return ResponseEntity.ok(userService.getAllUsers());
    }

    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
        return ResponseEntity.ok(userService.updateUser(id, user.getName(), user.getEmail()));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return ResponseEntity.noContent().build();
    }
}

RESTful API를 통해 CRUD 기능을 클라이언트에서 사용할 수 있도록 제공

📌 Spring Boot의 REST API를 활용하면 "쉽고 빠르게 CRUD 기능을 제공 가능"


4. JPA를 활용한 CRUD 테스트

Postman 또는 cURL을 사용하여 API 요청 테스트 가능

📌 사용자 생성 요청 (POST 요청)

POST /users
Content-Type: application/json

{
    "name": "John Doe",
    "email": "john@example.com"
}

📌 사용자 조회 요청 (GET 요청)

GET /users/1

📌 사용자 목록 조회 (GET 요청)

GET /users

📌 사용자 정보 수정 (PUT 요청)

PUT /users/1
Content-Type: application/json

{
    "name": "Updated Name",
    "email": "updated@example.com"
}

📌 사용자 삭제 요청 (DELETE 요청)

DELETE /users/1

📌 JPA를 활용한 CRUD API를 사용하면 "데이터를 쉽게 저장, 조회, 수정, 삭제 가능"


✅ 여기까지 JPA를 활용한 CRUD 구현 방법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 Redis를 활용한 캐싱(Cache) 전략은 어떻게 할까?"
✅ 다음 회차에서 Spring Boot에서 Redis를 활용한 캐싱(Cache) 전략을 배워봅시다!

반응형