JPA란
Springboot 에서 JPA 사용하기
<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>
<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)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
public User() {}
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;