본문 바로가기
Back-end

[Spring Boot] MySQL과 JPA를 이용한 REST API CRUD 구현 및 테스트

by 셀킴 2024. 11. 8.
728x90
반응형

환경: MacOS, Spring Tool Suite 4.21.1, Spring Boot 3.3.5, Maven

 

 

프로젝트를 하다가 필요한 기능들을 찾아보면 MyBatis로는 구현이 상당히 복잡한데 JPA에선 간단하게 구현할 수 있는 경우가 많았습니다

특히 페이지네이션!

그래서 개인 프로젝트는 JPA로 진행해 보기로 했습니다

 

구글링을 통해 찾은

Spring Boot + MySQL + Spring Data JPA: A beginner's guide to REST API CRUD operations


이 글을 따라해 보았습니다

 


익히기 위해 기록용

 

우선 STS(이클립스)에서 Spring Starter Project를 생성

의존성은 Spring Web, Spring Data JPA, MySQL Driver 등이 필요

 

내가 추가한 의존성들

pom.xml

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>8.0.33</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

 

그 다음은 MySQL에 Users 테이블을 생성

 

 

그다음은 application.properties

# Database Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/스키마이름
spring.datasource.username=your_database_username
spring.datasource.password=your_database_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Hibernate Configuration
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

spring.jpa.hibernate.ddl-auto=update 설정이 Spring Boot 애플리케이션이 시작될 때 데이터베이스와 엔티티 클래스 간의 매핑을 관리하는 역할. Hibernate가 자동으로 엔티티 클래스와 데이터베이스 간의 동기화를 관리해 줌

운영 환경에서는 validate나 none을 사용하여 데이터베이스 스키마의 무단 변경을 방지


그다음은 본격적으로 JPA 구현이다

 

User 엔티티 클래스를 만든다

User.java

import jakarta.persistence.*;
import lombok.Data; //lombok을 사용하면 Data 어노테이션으로 Getter&Setter를 자동 생성 가능

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

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

 private String name;

 private String email;
}

 

 

그다음은 레포지토리를 생성

Repository 인터페이스가 Entity를 위한 CRUD(Create, Read, Update, Delete) 동작을 제공한다고 함

 

UserRepository.java

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

public interface UserRepository extends JpaRepository<User, Long> {

}

유저 엔티티 임포트 해야 함

 

그다음은 서비스 클래스를 생성

UserService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User createUser(User user) {
        return userRepository.save(user);
    }

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

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public User updateUser(Long id, User user) {
        user.setId(id);
        return userRepository.save(user);
    }

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

마찬가지로 임포트 해주고

 

마지막으로 RestController인 UserController를 만든다

UserController.java

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

import com.sel.echaek.User;
import com.sel.echaek.service.UserService;

import java.util.List;

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

	@Autowired
    private UserService userService;

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }

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

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}

 

이제 서버 run

 

대충 잘 실행됐다는 소리

 


 

그 다음은 API 엔드포인트 동작 테스트

엔드포인트란? API 엔드포인트는 클라이언트가 서버에 특정한 요청을 보낼 때 사용하는 URL 경로

 

이 테스트를 위해 Postman을 사용해 보자

강의 들으면서 짧게 배우고 지나간 툴인데 드디어 쓸 기회가 왔다

Postman은 API 개발 및 테스트를 위해 사용되는 도구로 개발, 테스트, 배포 단계에서 널리 사용됨

 

 

먼저 POST(createUser)

Body에서 raw JSON 포맷의 데이터를 넣고 요청을 보내면 

이렇게 데이터베이스에 실제로 추가가 되었다

 

그다음은 GET(getAllUsers)

1,2번은 망한 시도의 결과

조회도 잘 된다

 

그 다음은 GET(getUserById)

파라미터로 id 값만 입력해 주면

원하는 데이티가 나온다

이쯤 되니 신기하다 직접 쿼리를 쓰지도 않았는데 이게 되다니

 

 

PUT(updateUser)도 잘된다

 

마지막으로 DELETE(deleteUser)

망한 1번과 2번을 지웠다

 


엔드포인트 테스트를 성공적으로 마쳤습니다

 

JPA 흥미롭네

728x90
반응형