IT 강좌(IT Lectures)/SpringBoot

7강. 데이터 접근

소울입니다 2024. 7. 18. 08:30
728x90
반응형

챕터 7: 데이터 접근

7.1 Spring Data JPA 개요

7.1.1 JPA 개념 및 ORM 소개

JPA(Java Persistence API)는 자바에서 데이터를 관계형 데이터베이스에 저장하고 관리하기 위한 표준입니다. ORM(Object-Relational Mapping)은 객체 지향 프로그래밍과 관계형 데이터베이스 간의 데이터를 자동으로 변환해 주는 기술입니다.

 

생겨난 이유:

  • 관계형 데이터베이스와 객체 지향 프로그래밍 간의 불일치를 해결하고, 데이터베이스 작업을 더 쉽게 관리하기 위해 도입되었습니다.
  • JPA는 이를 표준화하여 다양한 데이터베이스와 호환되는 코드를 작성할 수 있게 합니다.

역사적 배경:

  • 1990년대 후반, 객체지향 프로그래밍이 널리 사용되기 시작하면서 객체와 관계형 데이터베이스 간의 불일치를 해결하는 방법에 대한 필요성이 증가했습니다.
  • 2006년, 자바 커뮤니티 프로세스(JCP)를 통해 JPA가 처음 표준화되었습니다.
  • 2017년, JPA 2.2가 출시되면서 더욱 발전된 기능과 성능을 제공하게 되었습니다.

7.1.2 Spring Data JPA의 역할

Spring Data JPA는 JPA를 더욱 간편하게 사용하기 위해 스프링 프레임워크와 통합한 모듈입니다. 이를 통해 데이터 접근 계층을 더 간단하고 일관성 있게 작성할 수 있습니다.

예제 1: JPA 엔티티와 리포지토리


package com.example.demo;

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

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.List;

// 엔티티 클래스
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // Getter와 Setter
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// 리포지토리 인터페이스
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    List findByName(String name);
}
    

위의 예제에서 @Entity 어노테이션을 사용하여 User 클래스가 JPA 엔티티임을 나타냅니다. @GeneratedValue는 ID 필드가 자동으로 생성됨을 의미합니다. UserRepository 인터페이스는 JpaRepository를 확장하여 기본적인 CRUD 메서드를 제공하며, findByName 메서드는 사용자 정의 쿼리 메서드입니다.

 

예제 2: 데이터베이스 설정 - MySQL


# application.properties
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=yourpassword
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
    

위의 예제는 MySQL 데이터베이스 설정을 보여줍니다. spring.datasource.url, spring.datasource.username, spring.datasource.password를 실제 데이터베이스 설정에 맞게 변경해야 합니다.

 

예제 3: 기본 CRUD 메서드


package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

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

    @Autowired
    private UserRepository userRepository;

    // 모든 사용자 조회
    @GetMapping
    public List getAllUsers() {
        return userRepository.findAll();
    }

    // 특정 사용자 조회
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        Optional user = userRepository.findById(id);
        return user.orElse(null);
    }

    // 사용자 생성
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    // 사용자 업데이트
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User userDetails) {
        User user = userRepository.findById(id).orElse(null);
        if (user != null) {
            user.setName(userDetails.getName());
            user.setAge(userDetails.getAge());
            return userRepository.save(user);
        }
        return null;
    }

    // 사용자 삭제
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}
    

위의 예제는 기본적인 CRUD 메서드를 구현한 것입니다. @RestController 어노테이션을 사용하여 RESTful 웹 서비스를 정의하고, UserRepository를 사용하여 데이터베이스 작업을 처리합니다.

 

7.2 데이터베이스 설정

Spring Boot를 사용하여 다양한 데이터베이스(H2, MySQL, PostgreSQL 등)를 설정하는 방법을 살펴봅니다.

7.2.1 H2 데이터베이스 설정


# 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.database-platform=org.hibernate.dialect.H2Dialect
    

위의 예제는 H2 데이터베이스 설정을 보여줍니다. H2는 메모리 내장형 데이터베이스로, 테스트 환경에서 주로 사용됩니다.

7.2.2 MySQL 데이터베이스 설정


# application.properties
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=yourpassword
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
    

위의 예제는 MySQL 데이터베이스 설정을 보여줍니다. spring.datasource.url, spring.datasource.username, spring.datasource.password를 실제 데이터베이스 설정에 맞게 변경해야 합니다.

7.2.3 PostgreSQL 데이터베이스 설정


# application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=postgres
spring.datasource.password=yourpassword
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
    

위의 예제는 PostgreSQL 데이터베이스 설정을 보여줍니다. spring.datasource.url, spring.datasource.username, spring.datasource.password를 실제 데이터베이스 설정에 맞게 변경해야 합니다.

 

7.3 리포지토리와 엔티티

7.3.1 @Entity와 @Repository 어노테이션 사용법

@Entity 어노테이션은 JPA 엔티티 클래스를 정의하고, @Repository 어노테이션은 데이터 접근 계층을 정의하는 데 사용됩니다.

7.3.2 리포지토리 인터페이스 작성


package com.example.demo;

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

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.List;

// 엔티티 클래스
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // Getter와 Setter
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// 리포지토리 인터페이스
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    List findByName(String name);
}
    

위의 예제에서 @Entity 어노테이션은 User 클래스가 JPA 엔티티임을 나타내며, @GeneratedValue는 ID 필드가 자동으로 생성됨을 의미합니다. UserRepository 인터페이스는 JpaRepository를 확장하여 기본적인 CRUD 메서드를 제공하며, findByName 메서드는 사용자 정의 쿼리 메서드입니다.

 

7.4 CRUD 메서드 구현

7.4.1 기본 CRUD 메서드

Spring Data JPA는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 위한 메서드를 자동으로 제공합니다.


package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

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

    @Autowired
    private UserRepository userRepository;

    // 모든 사용자 조회
    @GetMapping
    public List getAllUsers() {
        return userRepository.findAll();
    }

    // 특정 사용자 조회
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        Optional user = userRepository.findById(id);
        return user.orElse(null);
    }

    // 사용자 생성
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    // 사용자 업데이트
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User userDetails) {
        User user = userRepository.findById(id).orElse(null);
        if (user != null) {
            user.setName(userDetails.getName());
            user.setAge(userDetails.getAge());
            return userRepository.save(user);
        }
        return null;
    }

    // 사용자 삭제
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}
    

위의 예제는 기본적인 CRUD 메서드를 구현한 것입니다. @RestController 어노테이션을 사용하여 RESTful 웹 서비스를 정의하고, UserRepository를 사용하여 데이터베이스 작업을 처리합니다.

 

예제: 사용자 정의 쿼리 메서드

Spring Data JPA는 메서드 이름을 기반으로 하는 쿼리 메서드를 자동으로 생성할 수 있습니다.


package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

    @Autowired
    private UserRepository userRepository;

    // 이름으로 사용자 검색
    @GetMapping("/search")
    public List getUsersByName(@RequestParam String name) {
        return userRepository.findByName(name);
    }
}
    

위의 예제는 사용자 정의 쿼리 메서드를 사용하여 이름으로 사용자를 검색하는 방법을 보여줍니다. @RequestParam을 사용하여 쿼리 파라미터를 추출하고 findByName 메서드를 호출합니다.

 

주요 해시태그

#SpringBoot #스프링부트 #SpringMVC #Controller #RestController #RequestMapping #GetMapping #PostMapping #PathVariable #RequestParam #RequestBody #ResponseBody #ModelAttribute #ExceptionHandler #SpringDataJPA #JPA #데이터베이스

반응형