-
JPA (Java Presistence API)
-
1. JPA Dependency 등록
-
2. application.properties JPA 설정
-
3. Entity 생성 및 어노테이션들
-
- Entity 클래스 생성 및 설정
-
Why?
-
JPA에서는 Setter를 쓰지 않는다는 것 !!!
-
@Builder는 전체 필드에 대한 값을 필요로 하기에 생성자가 필요하게 됩니다.
-
자 그러면 @AllArgsConstructor만 써버리면 다 되겠네요 !!!
-
4. Repository 생성 및 상속
-
5. CRUD 메소드 생성 및 실행 !
-
1. Save()
-
2. find, findById, findAll.........개 많네..... ()
-
3. delete()
-
4. update() ????.......
JPA (Java Presistence API)
자바 진영에서 ORM 기술 표준으로 사용되는 인터페이스 모음이다.
대표적으로 Hibernate, Spring JPA 가 있다.
쉽게 말하면 JPA는 객체와 테이블을 자동으로 매핑시켜서, 쿼리문 작성 없이도 DB에 접근을 할 수 있다.
만약 해당 내용이 생소하시다면 다음 글을 먼저 보고 와주세요 !....https://wooj-coding-fordeveloper.tistory.com/74
1. JPA Dependency 등록
gradle 기준으로 다음 코드를 build.gradle에 추가해주셔야 JPA을 사용하실 수 있습니다 :)
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2. application.properties JPA 설정
# MySQL 드라이브 설정 -------------------------------------------------
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB 정보 설정 / 만약 DB설치가 안되있다면 h2database를 사용하셔도 됩니다
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/study_jpa?serverTimezone=Asia/Seoul
spring.datasource.username=test
spring.datasource.password=Jin245812!
# JPA 관련 설정 ------------------------------------------------------
# 실행 쿼리문을 보여준다.
spring.jpa.show-sql=true
# 실행시 ddl구문과 관련된 설정입니다. ex) create = 실행 시 테이블을 모두 제거하고 다시 생성합니다
spring.jpa.hibernate.ddl-auto=create
# 쿼리문 출력시 포맷 정렬이 되도록 설정합니다
spring.jpa.properties.hibernate.format_sql=true
필요한 설정이 있다면 .properties/yml 파일에 설정을 할 수 있습니다. (프로젝트에 따라서 설정이 변할 수 있습니다)
ddl-auto 에 옵션들만 몇가지 알아보겠습니다 ! 꼭 필요한 설정들은 아니며 개발자 자유 입니다.
create | 애플리케이션 실행 시 모든 테이블을 제거하고 다시 생성합니다. |
create-drop | 애플리케이션 실행 시 모든 테이블을 제거하고 다시 생성합니다. 애플리케이션 종료시 모든 테이플을 제거합니다. |
update | 애플리케이션 실행 시 변경된 사항만 적용합니다. |
validate | 현재 테이블 정보가 entity에 정의된 내용과 동일한지 체크합니다. 다르다면 경고를 하며 애플리케이션을 실행 하지 않습니다. |
none | 자동생성을 사용하지 않습니다. |
3. Entity 생성 및 어노테이션들
일단 Lombok을 사용하여 생성자와 Getter를 만들어 보도록 하겠습니다!
//lombok dependency
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
build.gradle 파일에 의존성을 추가 해줍니다.
- Entity 클래스 생성 및 설정
package com.jpasample.entity;
import lombok.*;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder // 선언한 클래스의 빌더 패턴을 가지는 클래스를 생성합니다.
@Entity // User라는 객체와 DB 테이블을 매핑합니다. JPA가 관리합니다.
@Table(name = "user") // 테이블 이름을 지정합니다. 만약에 선언을 안 할 경우 클래스이름으로 설정합니다.
public class User {
@Id // 해당 변수가 PK가 됩니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // 값이 없어도 자동으로 할당 합니다.
private Long id;
@Column(nullable = true) // 테이블의 컬럼 설정 값을 명시할 수 있다.
private String name;
}
기본적으로 @Getter, NoArgsConstructor, AllArgsConstructor은 JPA에서 제공하는 어노테이션은 아니란걸 알 수 있다.
그러면 왜 사용했을까? 순서대로 알아보자 !
Why?
- @Getter
- Entity의 필드를 조회해야할 경우 Getter는 무조건 필요하다....
- @NoArgsConstructor
- 기본 생성자를 만들어 줍니다.
- JPA가 기본적으로 기본 생성자를 요구 합니다.
- TMI. @Entity가 기본 생성자를 만들어줘서 사실 안써도 됩니다....알려드리기 위해서 써봤어요 ^^...
- BUT 영속성을 지키기 위해서는 혹시 모를 개발자의 실수를 막기 위해 접근 제한자를 설정하는게 좋은데, 이때 @NoArgsConstructor를 사용하여 Protected로 설정할 수 있다. 아래 코드와 같이 작성하면 된다 !
- 왜 private이 아니냐고요? JPA가 접근할 수 있는 최고가 Protected 라서요... JPA만든 사람한테 따지죠!
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "user")
public class User {
- @AllArgsContructor
- 전체 필드에 대한 생성자를 만들어줍니다.
- 자...여기서 부터 이걸 왜쓰지? 라는 궁금증이 생기실텐데, 사실 복잡하면서 간단한 문제가 존재합니다.
JPA에서는 Setter를 쓰지 않는다는 것 !!!
Setter를 쓰게 되면 개발자의 실수로 인해 영속성을 잃어버릴 수 있습니다. 매우 큰 문제이죠......
그래서 빌더 패턴이라는걸 사용하는데, @Builder 어노테이션을 사용합니다.
그래서 뭐 어쩌라는거냐고요? 저도 알아요 그 심정......바로 빌더 패턴을 사용하는 지금 이 순간! 문제가 발생합니다.
@Builder는 전체 필드에 대한 값을 필요로 하기에 생성자가 필요하게 됩니다.
그러면 @NoArgsContructor 썼으니까 된거 아니에요?
아뇨. Protected ㅠㅠ........접근 제한자로 인해 문제가 에러가 발생합니다. 사실 @Builder가 기본생성자가 없으면 지가 알아서 만들어 쓰고 지지고 볶고 하는데....@NoArgsConstructor로 만들어진 생성자가 있기에 기존껄 사용하면서 문제가 발생하죠.
자 그러면 @AllArgsConstructor만 써버리면 다 되겠네요 !!!
근데요...@Entity 요 녀석도 생성자가 존재하면 기본 생성자를 생성을 안해버립니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 썅.

그래서 결론은......
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
- @NoArgsContructor을 사용하여 기본 생성자를 생성하며, 영속성을 지키기 위해 Protected 설정을 한다.
- @AllArgsConstructor을 사용하여 전체 필드에 대한 생성자를 생성하여 @Builder를 사용할 수 있게 한다.
- @Entity 선언. 준비 끝.
- 참 가지가지 하네 xxxx..........
자 !! 다시 코드를 봐보면서 JPA 어노테이션을 알아 봅시다.
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = true)
private String name;
}
- @Entity
- 객체(클래스)와 테이블을 매핑하겠다 !!
- @Table의 name을 설정하지 않으면 클래스 이름을 기준으로 매핑합니다.
- @Table
- 객체와 매핑할 테이블을 직접 지정합니다.
- 속성들
- Name : 매핑할 테이블 이름 (Default -> @Entity 이름 사용)
- Catalog : catalog 기능이 있는 DB에서 catalog를 매핑 합니다.
- Schema : schema 기능이 있는 DB에서 schema를 매핑 //
- uniqueConstraints : DDL 생성 시 유니크 제약조건을 만들어줍니다. 스키마 자동 생성 기능을 사용해서 DDL 구문을 만들 때만 사용합니다 !
- @Id
- 해당 필드를 기본키(PK) 로 지정합니다.
- @GeneratedValue
- 기본키 생성 설정을 할 수 있습니다. 자동 생성 기능이 있습니다 !
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
5. @Column
- 객체 필드를 테이블 컬럼에 매핑합니다.
- 속성 중 대표적으로 name, nullable을 사용하고 나머지는 잘;;....안...ㅆ...ㄴ.ㄷ..
- name : 필드와 매핑할 테이블 컬럼 이름 설정
- nullalbe : 에이 이건 아시겠죠? 죄송합니다. null값 허용 여부를 설정합니다 (true / false - Default = true)
@Column(nullable = true)
private String name;
뭐가 많죠?...자 드디어 이제 자동으로 완성되는 쿼리문을 만들어 봅시다 !
4. Repository 생성 및 상속
package com.jpasample.repository;
import com.jpasample.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// Entity정보, PK값 자료형
}
DB접근을 위한 Repository를 생성하여 JpaRepository를 상속 받아줍니다. 해당 클래스는 기본적인 CRUD 메소드를 제공합니다 :)
Entity가 될 클래스와 PK값을 가질 필드를 명시해줘야 합니다.
5. CRUD 메소드 생성 및 실행 !
package com.jpasample;
import com.jpasample.entity.User;
import com.jpasample.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Optional;
@SpringBootTest
class JpasampleApplicationTests {
@Autowired
UserRepository userRepository;
@Test // 정보가 담긴 객체값을 넘겨줌으로써 INSERT
void jpaSave() {
for(long i = 0L; i<10; i++){
User user = User.builder().name("Hi"+i).build();
userRepository.save(user);
}
}
@Test // PK값을 기준으로 SELECT
void jpaFind(){
Optional<User> user = userRepository.findById(3L);
System.out.println(user.isPresent() ? user.get().toString() : "Nothing");
}
@Test // 필드값을 가지고 해당하는 데이터를 찾아 DELETE
void jpaDelete(){
userRepository.delete(User.builder().name("Hi4").id(5L).build());
}
}
1. Save()
@Autowired
UserRepository userRepository;
@Test // 정보가 담긴 객체값을 넘겨줌으로써 INSERT
void jpaSave() {
for(long i = 0L; i<10; i++){
User user = User.builder().name("Hi"+i).build();
userRepository.save(user);
}
}
Builder를 선언해줬던거 기억나시죠?....이제 빌더 패턴을 사용하여 객체를 생성해주고 의존성 주입으로 생성된 userRepository를 사용하여 부모클래스인 JpaRepository의 메소드 중 하나인 Save() 안에 객체를 넣어주면 자동으로 INSERT문을 실행 해 줍니다.
2. find, findById, findAll.........개 많네..... ()

void jpaFind(){
Optional<User> user = userRepository.findById(3L);
System.out.println(user.isPresent() ? user.get().toString() : "Nothing");
}
Id 값을 기준으로 SELECT문을 써주는 findById() 메소드입니다. 반환 값이 좀 특이한데요....Optional을 사용하여 nullPointerException을 방지해줌을 알 수 있습니다. Optional과 isPresent() 가 뭔지 모르시겠다면?.......
다음 글을 참고해주세요 :) https://wooj-coding-fordeveloper.tistory.com/72
3. delete()
@Test
void jpaDelete(){
userRepository.delete(User.builder().name("Hi4").id(5L).build());
}
Entity객체에 들어있는 Id 값을 기준으로 찾아 삭제한다. deleteById() 메소드도 있는데, 해당 아이는 결론적으로만 보면 delete()를 사용하여 삭제하지만, 그전에 findById를 호출하여 객체값을 가지고 삭제를 하기에 null일 경우의 에러를 방지 할 수 있습니다.
4. update() ????.......
사실 Update는 Save()가 담당하고 있습니다.
새로운 객체가 오면 INSERT를 하고 기존에 있는 객체라면 Merge(병합)을 시도합니다.
다만. 특정 값만 변경시키고 싶다면 조금 까다로져요......
그래서 다음 글에서는 JPA을 쓰면서 특정 값만 UPDATE를 하는 방법을 알아 보겠습니다 !
오늘도 슬기로운 코딩생활 하시길 바라며,
궁금하시점이나 잘못 기재된 점에 대한 피드백은 언제나 환영이며 감사합니다 :)
'Spring & Spring Boot' 카테고리의 다른 글
[Spring] @Query 사용법 및 예시코드 (JPA에서 쿼리를 직접쓰는 방법 !) (0) | 2023.03.16 |
---|---|
[Spring] JPA 변경감지와, 병합을 통한 Update (0) | 2023.03.15 |
[Spring] Mybatis와 JPA의 차이점 feat. ORM이란? (0) | 2023.03.12 |
[Spring] @Autowired, @Inject, @Resource 차이점 정리 (1) | 2023.03.06 |
Spring JPA? Java Presistence API 가 뭘까요 ! (0) | 2023.02.01 |
JPA (Java Presistence API)
자바 진영에서 ORM 기술 표준으로 사용되는 인터페이스 모음이다.
대표적으로 Hibernate, Spring JPA 가 있다.
쉽게 말하면 JPA는 객체와 테이블을 자동으로 매핑시켜서, 쿼리문 작성 없이도 DB에 접근을 할 수 있다.
만약 해당 내용이 생소하시다면 다음 글을 먼저 보고 와주세요 !....https://wooj-coding-fordeveloper.tistory.com/74
1. JPA Dependency 등록
gradle 기준으로 다음 코드를 build.gradle에 추가해주셔야 JPA을 사용하실 수 있습니다 :)
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2. application.properties JPA 설정
# MySQL 드라이브 설정 -------------------------------------------------
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB 정보 설정 / 만약 DB설치가 안되있다면 h2database를 사용하셔도 됩니다
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/study_jpa?serverTimezone=Asia/Seoul
spring.datasource.username=test
spring.datasource.password=Jin245812!
# JPA 관련 설정 ------------------------------------------------------
# 실행 쿼리문을 보여준다.
spring.jpa.show-sql=true
# 실행시 ddl구문과 관련된 설정입니다. ex) create = 실행 시 테이블을 모두 제거하고 다시 생성합니다
spring.jpa.hibernate.ddl-auto=create
# 쿼리문 출력시 포맷 정렬이 되도록 설정합니다
spring.jpa.properties.hibernate.format_sql=true
필요한 설정이 있다면 .properties/yml 파일에 설정을 할 수 있습니다. (프로젝트에 따라서 설정이 변할 수 있습니다)
ddl-auto 에 옵션들만 몇가지 알아보겠습니다 ! 꼭 필요한 설정들은 아니며 개발자 자유 입니다.
create | 애플리케이션 실행 시 모든 테이블을 제거하고 다시 생성합니다. |
create-drop | 애플리케이션 실행 시 모든 테이블을 제거하고 다시 생성합니다. 애플리케이션 종료시 모든 테이플을 제거합니다. |
update | 애플리케이션 실행 시 변경된 사항만 적용합니다. |
validate | 현재 테이블 정보가 entity에 정의된 내용과 동일한지 체크합니다. 다르다면 경고를 하며 애플리케이션을 실행 하지 않습니다. |
none | 자동생성을 사용하지 않습니다. |
3. Entity 생성 및 어노테이션들
일단 Lombok을 사용하여 생성자와 Getter를 만들어 보도록 하겠습니다!
//lombok dependency
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
build.gradle 파일에 의존성을 추가 해줍니다.
- Entity 클래스 생성 및 설정
package com.jpasample.entity;
import lombok.*;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder // 선언한 클래스의 빌더 패턴을 가지는 클래스를 생성합니다.
@Entity // User라는 객체와 DB 테이블을 매핑합니다. JPA가 관리합니다.
@Table(name = "user") // 테이블 이름을 지정합니다. 만약에 선언을 안 할 경우 클래스이름으로 설정합니다.
public class User {
@Id // 해당 변수가 PK가 됩니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // 값이 없어도 자동으로 할당 합니다.
private Long id;
@Column(nullable = true) // 테이블의 컬럼 설정 값을 명시할 수 있다.
private String name;
}
기본적으로 @Getter, NoArgsConstructor, AllArgsConstructor은 JPA에서 제공하는 어노테이션은 아니란걸 알 수 있다.
그러면 왜 사용했을까? 순서대로 알아보자 !
Why?
- @Getter
- Entity의 필드를 조회해야할 경우 Getter는 무조건 필요하다....
- @NoArgsConstructor
- 기본 생성자를 만들어 줍니다.
- JPA가 기본적으로 기본 생성자를 요구 합니다.
- TMI. @Entity가 기본 생성자를 만들어줘서 사실 안써도 됩니다....알려드리기 위해서 써봤어요 ^^...
- BUT 영속성을 지키기 위해서는 혹시 모를 개발자의 실수를 막기 위해 접근 제한자를 설정하는게 좋은데, 이때 @NoArgsConstructor를 사용하여 Protected로 설정할 수 있다. 아래 코드와 같이 작성하면 된다 !
- 왜 private이 아니냐고요? JPA가 접근할 수 있는 최고가 Protected 라서요... JPA만든 사람한테 따지죠!
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "user")
public class User {
- @AllArgsContructor
- 전체 필드에 대한 생성자를 만들어줍니다.
- 자...여기서 부터 이걸 왜쓰지? 라는 궁금증이 생기실텐데, 사실 복잡하면서 간단한 문제가 존재합니다.
JPA에서는 Setter를 쓰지 않는다는 것 !!!
Setter를 쓰게 되면 개발자의 실수로 인해 영속성을 잃어버릴 수 있습니다. 매우 큰 문제이죠......
그래서 빌더 패턴이라는걸 사용하는데, @Builder 어노테이션을 사용합니다.
그래서 뭐 어쩌라는거냐고요? 저도 알아요 그 심정......바로 빌더 패턴을 사용하는 지금 이 순간! 문제가 발생합니다.
@Builder는 전체 필드에 대한 값을 필요로 하기에 생성자가 필요하게 됩니다.
그러면 @NoArgsContructor 썼으니까 된거 아니에요?
아뇨. Protected ㅠㅠ........접근 제한자로 인해 문제가 에러가 발생합니다. 사실 @Builder가 기본생성자가 없으면 지가 알아서 만들어 쓰고 지지고 볶고 하는데....@NoArgsConstructor로 만들어진 생성자가 있기에 기존껄 사용하면서 문제가 발생하죠.
자 그러면 @AllArgsConstructor만 써버리면 다 되겠네요 !!!
근데요...@Entity 요 녀석도 생성자가 존재하면 기본 생성자를 생성을 안해버립니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 썅.

그래서 결론은......
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
- @NoArgsContructor을 사용하여 기본 생성자를 생성하며, 영속성을 지키기 위해 Protected 설정을 한다.
- @AllArgsConstructor을 사용하여 전체 필드에 대한 생성자를 생성하여 @Builder를 사용할 수 있게 한다.
- @Entity 선언. 준비 끝.
- 참 가지가지 하네 xxxx..........
자 !! 다시 코드를 봐보면서 JPA 어노테이션을 알아 봅시다.
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = true)
private String name;
}
- @Entity
- 객체(클래스)와 테이블을 매핑하겠다 !!
- @Table의 name을 설정하지 않으면 클래스 이름을 기준으로 매핑합니다.
- @Table
- 객체와 매핑할 테이블을 직접 지정합니다.
- 속성들
- Name : 매핑할 테이블 이름 (Default -> @Entity 이름 사용)
- Catalog : catalog 기능이 있는 DB에서 catalog를 매핑 합니다.
- Schema : schema 기능이 있는 DB에서 schema를 매핑 //
- uniqueConstraints : DDL 생성 시 유니크 제약조건을 만들어줍니다. 스키마 자동 생성 기능을 사용해서 DDL 구문을 만들 때만 사용합니다 !
- @Id
- 해당 필드를 기본키(PK) 로 지정합니다.
- @GeneratedValue
- 기본키 생성 설정을 할 수 있습니다. 자동 생성 기능이 있습니다 !
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
5. @Column
- 객체 필드를 테이블 컬럼에 매핑합니다.
- 속성 중 대표적으로 name, nullable을 사용하고 나머지는 잘;;....안...ㅆ...ㄴ.ㄷ..
- name : 필드와 매핑할 테이블 컬럼 이름 설정
- nullalbe : 에이 이건 아시겠죠? 죄송합니다. null값 허용 여부를 설정합니다 (true / false - Default = true)
@Column(nullable = true)
private String name;
뭐가 많죠?...자 드디어 이제 자동으로 완성되는 쿼리문을 만들어 봅시다 !
4. Repository 생성 및 상속
package com.jpasample.repository;
import com.jpasample.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// Entity정보, PK값 자료형
}
DB접근을 위한 Repository를 생성하여 JpaRepository를 상속 받아줍니다. 해당 클래스는 기본적인 CRUD 메소드를 제공합니다 :)
Entity가 될 클래스와 PK값을 가질 필드를 명시해줘야 합니다.
5. CRUD 메소드 생성 및 실행 !
package com.jpasample;
import com.jpasample.entity.User;
import com.jpasample.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Optional;
@SpringBootTest
class JpasampleApplicationTests {
@Autowired
UserRepository userRepository;
@Test // 정보가 담긴 객체값을 넘겨줌으로써 INSERT
void jpaSave() {
for(long i = 0L; i<10; i++){
User user = User.builder().name("Hi"+i).build();
userRepository.save(user);
}
}
@Test // PK값을 기준으로 SELECT
void jpaFind(){
Optional<User> user = userRepository.findById(3L);
System.out.println(user.isPresent() ? user.get().toString() : "Nothing");
}
@Test // 필드값을 가지고 해당하는 데이터를 찾아 DELETE
void jpaDelete(){
userRepository.delete(User.builder().name("Hi4").id(5L).build());
}
}
1. Save()
@Autowired
UserRepository userRepository;
@Test // 정보가 담긴 객체값을 넘겨줌으로써 INSERT
void jpaSave() {
for(long i = 0L; i<10; i++){
User user = User.builder().name("Hi"+i).build();
userRepository.save(user);
}
}
Builder를 선언해줬던거 기억나시죠?....이제 빌더 패턴을 사용하여 객체를 생성해주고 의존성 주입으로 생성된 userRepository를 사용하여 부모클래스인 JpaRepository의 메소드 중 하나인 Save() 안에 객체를 넣어주면 자동으로 INSERT문을 실행 해 줍니다.
2. find, findById, findAll.........개 많네..... ()

void jpaFind(){
Optional<User> user = userRepository.findById(3L);
System.out.println(user.isPresent() ? user.get().toString() : "Nothing");
}
Id 값을 기준으로 SELECT문을 써주는 findById() 메소드입니다. 반환 값이 좀 특이한데요....Optional을 사용하여 nullPointerException을 방지해줌을 알 수 있습니다. Optional과 isPresent() 가 뭔지 모르시겠다면?.......
다음 글을 참고해주세요 :) https://wooj-coding-fordeveloper.tistory.com/72
3. delete()
@Test
void jpaDelete(){
userRepository.delete(User.builder().name("Hi4").id(5L).build());
}
Entity객체에 들어있는 Id 값을 기준으로 찾아 삭제한다. deleteById() 메소드도 있는데, 해당 아이는 결론적으로만 보면 delete()를 사용하여 삭제하지만, 그전에 findById를 호출하여 객체값을 가지고 삭제를 하기에 null일 경우의 에러를 방지 할 수 있습니다.
4. update() ????.......
사실 Update는 Save()가 담당하고 있습니다.
새로운 객체가 오면 INSERT를 하고 기존에 있는 객체라면 Merge(병합)을 시도합니다.
다만. 특정 값만 변경시키고 싶다면 조금 까다로져요......
그래서 다음 글에서는 JPA을 쓰면서 특정 값만 UPDATE를 하는 방법을 알아 보겠습니다 !
오늘도 슬기로운 코딩생활 하시길 바라며,
궁금하시점이나 잘못 기재된 점에 대한 피드백은 언제나 환영이며 감사합니다 :)
'Spring & Spring Boot' 카테고리의 다른 글
[Spring] @Query 사용법 및 예시코드 (JPA에서 쿼리를 직접쓰는 방법 !) (0) | 2023.03.16 |
---|---|
[Spring] JPA 변경감지와, 병합을 통한 Update (0) | 2023.03.15 |
[Spring] Mybatis와 JPA의 차이점 feat. ORM이란? (0) | 2023.03.12 |
[Spring] @Autowired, @Inject, @Resource 차이점 정리 (1) | 2023.03.06 |
Spring JPA? Java Presistence API 가 뭘까요 ! (0) | 2023.02.01 |