Spring Boot에서 SQL을 직접 사용하는 것은 단점이 존재한다.
- SQL을 작성하기 때문에 실수할 수 있고, 실수 인지 시점이 느리다.
- 컴파일 에러가 안나고, 런타임 오류가 나기 때문이다.
- 즉, 서버 동작에는 SQL문의 오타는 아무런 지장이 없기 떄문이다.
- 특정 데이터베이스에 종속적이게 된다.
- 반복작업이 많아진다.
- 데이터베이스의 테이블과 객체는 패러다임이 다르다 ( 상속, 연관관계 등)
=> 이를 해결하기 위해 만든것이 JPA다.
JPA?
Java Persistence API의 약자로 자바 진영의 ORM이다.
Persistence : 영속성, 서버가 재시작되어도 데이터는 영구적으로 저장되는 속성 (데이터베이스 등)
ORM?
Object-Relational Mapping, 즉 자바 클래스(객체)와 테이블을 매핑하는 것을 의미한다.
객체와 DB의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있는 것을 JPA라고 한다.
JPA는 interface와 같은 규칙 이기 떄문에, 구현체가 필요하다.
이 구현체를 작성한 코드중 가장 유명한 프레임워크가 Hibernate이다.
Hibernate는 내부적으로 JDBC를 사용하고 있다.
한 번 코드로 작성해보자.
아래 클래스 Man 과
public class Man {
private String name;
private Integer age;
}
테이블 Man
CREATE TABLE MAN(
id bigint auto_increment,
name varchar(10),
age int,
primary key(id)
)
이 있다. 이를 JPA로 작성하기 위해서는 다음과 같은 순서를 따른다.
1. 클래스에 @Entity 어노테이션을 붙여준다.
Entity는 저장, 관리되어야 하는 데이터를 의미한다.
따라서 해당 어노테이션을 붙이면, 스프링은 Man객체와 Man 테이블을 같은 걸로 간주해준다.
@Entity
public class Man {
private String name;
private Integer age;
}
2. 테이블과 객체를 일치시켜준다.
@Entity
public class Man {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
private String name;
private Integer age;
}
- @Id : 이 필드(Long id)를 PK로 만든다.
- @GeneratedValue : auto_increment와 매칭된다.
3. 기본 생성자를 추가해준다.
JPA에 의해 테이블과 매핑된 객체는 파라미터를 가지지 않은 기본 생성자가 꼭 필요하다.
@Entity
public class Man {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
private String name;
private Integer age;
public Man(){ }
}
다음과 같이 추가해준다.
4. 기본 칼럼을 매핑해준다.
@Entity
public class Man {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
@Column(nullable = false, length = 20, name = "name")
private String name;
private Integer age;
public Man(){ }
}
@Column 어노테이션으로 매핑해주면 된다. 허나 자료형과 이름이 테이블과 완전히 매칭되면 생략해도 상관이 없다.
그러므로 다를경우에만 해주면 된다.
5. application.yml을 수정해준다.
대충 이런식으로 해주자.
JPA 메소드 정리
save() : 주어지는 객체를 저장하거나 업데이트 시켜준다.
findAll() : 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.
findById() : id를 기준으로 특정한 1개의 데이터를 가져온다.
Spring Data JPA?
JPA와 조금 다르다. 복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리.
save(), findAll(), findById()등은 Spring Data JPA가 지원해 주는 것이다.
'개발 공부 기록 > 02. Spring Boot' 카테고리의 다른 글
Mybatis 기본적인 사용법 정리 (0) | 2024.01.25 |
---|---|
SpringBoot와 MongoDB 연동하기 (1) | 2024.01.24 |
스프링 컨테이너를 다루는 방법 (0) | 2023.12.10 |
스프링 빈과 스프링 컨테이너란? (0) | 2023.12.10 |
Spring Boot에서 Database 접근해서 사용하기 (2) | 2023.12.07 |