Springboot + JPA

킹콩(King Kong)·2024년 12월 30일

JPA란

Springboot 에서 JPA 사용하기

  • dependency add
<dependencies>
    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- H2 Database (테스트용, 필요시 MySQL/MariaDB 등으로 변경) -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- MySQL Connector (MySQL 사용 시) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
  • application.properties config
# JPA
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

#H2 사용 시 기본 설정
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
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Model & Reposiroty sample

Model 정의

  
import jakarta.persistence.*;

@Entity
@Table(name = "users") // 테이블 이름 지정
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 증가 ID
    private Long id;

    @Column(nullable = false, unique = true) // Not Null, Unique
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String email;

    // 기본 생성자 (JPA에서 필수)
    public User() {}

    // 생성자, getter, setter
    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public Long getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Repository 정의

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

// JpaRepository<Entity 클래스, ID 타입>
public interface UserRepository extends JpaRepository<User, Long> {
    // 필요시 커스텀 쿼리 메서드 정의
    User findByUsername(String username);
}

Controller & Service sample

Service 정의


import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;

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

    @Autowired
    private UserRepository userRepository;
    
    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    public User createUser(String username, String password, String email) {
        User user = new User(username, password, email);
        return userRepository.save(user);
    }
}
Controller 정의
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;
    }

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

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.createUser(user.getUsername(), user.getPassword(), user.getEmail());
    }
}

이슈

  • sampleRepository.save() 를 호출하여 한 건을 INSERT시킬때, 아래 오류가 발생할 수 있다.
# SQL Error: 1364 에러
# 오류내용 : Field 'id doen't have a default value
# SQLState: HY000
# sample table의 키값인 id가 자동으로 증가하지 못함

# 조치 : 테이블의 설정을 변경한다.

ALTER TABLE sample
MODIFY id INT NOT NULL AUTO_INCREMENT;
profile
IT를 쉽게 이해해 보아요~😄

0개의 댓글