goal
Entity 생성 + JpaRepository 생성(및 개념) + CRUD 사용법 이해하기
참고자료
2. annotation의 설명, https://whitepro.tistory.com/265
- @NoArgsConstructor, @AllArgsConstructor의 의미와 사용방법, https://athena7.tistory.com/entry/Lombok-NoArgsConstructor-AllArgsConstructor-RequiredArgsConstructor
3. "코드로 배우는 스프링 부트 웹 프로젝트", 남가람북스, 구멍가게 코딩단 지음
1 ] java파일을 이용한 Entity 생성 (Hibernate 이용)
우선, JPA란?
Java Persistence API로, Java에서 ORM 기술 표준으로 사용되는 인터페이스의 모음이다.
인터페이스의 모음이라는 것은 실제적으로 구현된 것이 아니라, 구현된 클래스와 매핑을 위해 사용하는 프레임워크이다.
JPA를 구현한 대표적은 오픈소스로는 Hibernate가 존재한다.
※ ORM : Object Relational Mapping의 약자로써 애플리케이션 class와 RDB의 테이블을 매핑한다는 뜻이다. 기술적으로는 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.
Entity의 생성
- java를 이용해서 Entity를 생성할 수 있다. 아래 코드는 Hibernate JPA 프레임 워크를 사용한다.
Hibernate Jpa framework :: import javax.persistence.*;
- Entity를 관리하기 위해서 대체로 패키지를 따로 생성하여 그 안에 java파일을 생성 및 관리한다.
1. Entity생성 소스코드
- Memo.class
package org.zerock.ex2.entity
import lombok.*;
import javax.persistence.*; // @Entity, @Id, @Column -> Spring Data Jpa
@Entity
@Table(name = "tbl_memo")
@Data // @Getter, @Setter, @ToString, @NoArgsConstructor, @AllArgsConstructor를 모두 포함
@Builder //객체를 생성할 수 있도록 돕는 annotation
@AllArgsConstructor
@NoArgsConstructor
public class Memo {
@Id // mno를 pk로 설정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 일정 순서에 따라서 값이 증가하도록 설정
private long mno;
@Column(name = "memoText", length = 200, nullable = false )
private String memoText;
[1] annotation 설명
annotation 명칭 | 설 명 |
@Entity | 해당 클래스가 (Memo.class) Entity를 위한 클래스임을 나타낸다. - 즉, 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미 |
@Table | Database상에서 Entity Class를 어떤 Table로 생성할 것인지에 대한 정보를 담기 위한 annotation. - name속성을 통해 Table의 이름을 지정할 수 있다. |
@Data | @Getter, @Setter, @ToString, @NoargsConstructor, @AllArgsConstructor의 annotaion 묶음 |
@Builder | 객체를 생성할 수 있도록 돕는 annotation - @Builder를 사용하고 컴파일러 에러가 나오지 않게 하려면, - @AllArgsConstructor, @NoArgsConstructor를 명시해줘야 한다. - 참고에 괜찮은 자료, https://whitepro.tistory.com/265 |
@AllArgsConstructor | -참고링크 https://athena7.tistory.com/entry/Lombok-NoArgsConstructor-AllArgsConstructor-RequiredArgsConstructor |
@NoArgsConstructor | -참고링크 https://athena7.tistory.com/entry/Lombok-NoArgsConstructor-AllArgsConstructor-RequiredArgsConstructor |
@Id | Table의 Primary Key 지정 |
@GeneratedValue | Id가 사용자에 의해서 지정되는 값이 아니라면 자동으로 순서부여 - strategy = GenerationType.IDENTITY는 키 생성 전략이다. |
@Column | Column을 통해 Table 속성을 명시 및 다양한 속성을 지정가능 - name : Table상에서 Column의 이름을 지정 - length : 속성에 올 수 있는 값의 길이 - nullable : null값 비허용 |
2 ] JpaRepository 인터페이스
1. JpaRepository개념
- JpaRepository는 인터페이스이다.
- 때문에, 인터페이스에 미리 정의된 메소드를 호출만으로 사용이 가능하다.
- 호출을 통해서 CRUD 작업 등을 할 수 있다.
2. JpaRepository 생성 소스코드
- MemoRepository.class
package org.zerock.ex2.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.ex2.entity.Memo;
public interface MemoRepository extends JpaRepository<Memo, Long> {
}
JpaRepository<Memo, Long>의 설명
- JpaRepository의 Generic에는 순서대로 Entity(Memo해당), Entity의 Key Type (Long 해당)을 넣어준다.
3 ] CRUD연습
- JpaRepository인터페이스 (MemoRepository.class에 해당) 이용해서 Database의
CRUD 작업은 아래 표의 메소드를 사용한다.
1. CRUD와 관련된 메소드
메소드명 | 설 명 |
save(엔티티 객체) | insert 및 update 작업 - database에 엔티티 객체의 스키마에 맞는 값을 넣는다. - 만약, 객체가 없으면 insert 진행, 객체가 존재하면 update진행 |
findById(키 타입) | Key에 해당하는 값의 Table row 검색 |
deleteById(키 타입) | Key에 해당하는 값의 Table row 삭제 |
delete(엔티티) | Entity 삭제 |
2. CRUD와 관련된 소스코드
- MemberRepositoryTests.java ([1], [2], [3]의 메소드가 모두 담겨있다.)
- 0번에 전체 소스코드 작성했습니다.
[0] MemberRepositoryTests.java 전체 소스코드
package org.zerock.ex2.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.Optional;
import java.util.stream.IntStream;
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testInsert(){
System.out.println(memoRepository.getClass().getName());
}
@Test
public void testInsertDummies() {
IntStream.rangeClosed(1,100).forEach(i -> {
Memo memo = Memo.builder().memoText("Memo....." + i).build();
memoRepository.save(memo);
});
}
@Test
public void testSelect(){
// 데이터 베이스에 존재하는 mno
Long mno = 100L;
Optional<Memo> result = memoRepository.findById(mno);
System.out.println("--------------------------------------------");
if(result.isPresent()) {
Memo memo = result.get();
System.out.println(memo);
}
System.out.println("--------------------------------------------");
}
@Test
public void testUpdate() {
Memo memo = Memo.builder().mno(100L).memoText("Update Text").build();
System.out.println(memoRepository.save(memo));
}
@Test
public void testDelete(){
Long mno = 100L;
memoRepository.deleteById(mno);
}
}
[1] save() 메소드 사용 소스코드 일부 (insert 및 update 작업)
- Insert 작업
package org.zerock.ex2.repository;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.stream.IntStream;
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testInsertDummies() {
IntStream.rangeClosed(1,100).forEach(i -> {
Memo memo = Memo.builder().memoText("Memo....." + i).build();
memoRepository.save(memo);
});
}
}
- @Autowired : 상황의 타입에 맞는 Ioc컨테이너 안에 존재하는 Bean을 자동으로 주입한다.
- @SpringBootTests : 어플리케이션 테스트에 필요한 거의 모든 의존성들을 제공한다.
- @Test : 단위 테스트가 가능하게 만들어준다. (IDE를 보면 해당 부분만 실행할 수 있게 해준다.)
- class.builder() ~ build() : class의 객체를 만들 때 생성자 없이 변수명을 초기화 할 수 있도록 돕는다.
- memoRepository.save(memo); : memo객체를 Table에 저장한다.
[2] findById() 메소드 사용 소스코드 일부 (Key에 해당하는 값의 Table row 검색)
package org.zerock.ex2.repository;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.stream.IntStream;
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testSelect(){
Long mno = 100L;
// Key값이 100인 row 객체를 result에 저장한다.
Optional<Memo> result = memoRepository.findById(mno);
System.out.println("--------------------------------------------");
if(result.isPresent()) {
Memo memo = result.get();
System.out.println(memo);
}
System.out.println("--------------------------------------------");
}
}
※ Optional 클래스 "NPE(NullPointerException)"을 방지하는 역할
- Optional.isPresent() : 객체가 존재한다면 True ( != null 로 코드를 설계할 수 있지만 오류 가능성이 높은 코드라고 한다.)
- Optional result = memoRepository.findById(mno); : Key값이 100인 row 객체를 result에 저장한다.
- Memo memo = result.get(); : result변수의 객체를 Memo Type memo에 저장한다.
[3] deleteById() 메소드 사용 소스코드 일부 (Key에 해당하는 값의 Table row 삭제)
package org.zerock.ex2.repository;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.stream.IntStream;
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testDelete(){
Long mno = 100L;
memoRepository.deleteById(mno);
}
}
[4] delete() 메소드 사용 소스코드 일부 (Entity삭제)
package org.zerock.ex2.repository;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.stream.IntStream;
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testDelete(){
Long mno = 100L;
memoRepository.delete(mno);
}
}
'Spring > Spring' 카테고리의 다른 글
Spring + SIA 그룹스터디(3장) :) mybatis3 기본 CRUD를 이해한다. (0) | 2022.05.22 |
---|---|
Spring :) Java만을 이용한 JDBC (데이터베이스 연결) (0) | 2022.04.26 |
Spring :) 페이징 처리 기초를 이해한다. (0) | 2022.04.06 |
Spring :) RestController, RequestMapping, GetMapping, RequestParam (0) | 2022.03.11 |
Spring :) 20220311 Spring 공부 시작 (0) | 2022.03.11 |