Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- kh정보교육원 후기
- ORA-91917
- 코딩테스트
- 비전공 개발자
- 비전공 국비학원
- spring mvc 기초
- 파이썬
- 소수점출력
- 국비학원 후기
- 국비학원 추천
- SQLD교재추천
- 비전공개발자취업
- java문법
- ClassNotFoundException
- 스택
- Jpa기초
- containsKey
- 비전공개발자
- it국비학원 후기
- oracle error
- 큐
- 최신java
- ip란
- java17
- 그리디알고리즘
- 개발자면접질문
- 예제
- sql developer logon denied
- 국비학원
- containsValue
Archives
- Today
- Total
Developer J
JPA Entity Repository 설명 본문
반응형
Repository
@Repository를 사용해서 따로 쿼리문을 작성하지 않아도 기본적인 CRUD 기능 구현이 가능하다.
@Repository //JpaRepository< User repository, 키의 타입>
public interface UserRepository extends JpaRepository<User, Long > {
}
Entity
@Entity는 JPA에서 테이블을 자동으로 생성해주는 기능을 가지고 있다.
@Data //getter, setter, 기본 생성자를 만들어 줌
@AllArgsConstructor //모든 변수를 매개변수로 하는 생성자를 만들어 줌
@NoArgsConstructor // 파라미터가 없는 기본 생성자를 만들어 줌
@Entity // == table을 나타낸다. class 이름이 테이블 명과 다를때는 @Table(name = "user")
public class User {
//java에는 캐멀케이스로 작성, db는 스네이크 케이스로 작성
@Id //식별자를 뜻함
@GeneratedValue(strategy = GenerationType.IDENTITY) //키의 전략을 선택
private Long id;
private String account;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
private String createdBy;
private LocalDateTime updatedAt;
private String updatedBy;
// User와 OrderDetail의 관계 1 : N
// mappedBy: 어떤 변수에 맵핑하는지, OrderDetail의 user라는 변수에 맵핑
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<OrderDetail> orderDetailList;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = {"user","item"}) //OrderDetail에서 user와 item을 상화 참조하고 있어서 자동으로 만들어지는 toString이 계속 돌게된다.제외시키기
public class OrderDetail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String status;
private LocalDateTime arrivalDate;
private Integer quantity;
private BigDecimal totalPrice;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
private LocalDateTime createdAt;
private String createdBy;
private LocalDateTime updatedAt;
private String updatedBy;
private LocalDateTime orderAt;
// orderdetail입장에서 User는 N:1관계
@ManyToOne
private User user;
@ManyToOne
private Item item;
}
item의 entity는 관계에 대한 부분만 보여주겠다.
//LAZY = 지연로딩 , EAGER = 즉시로딩
// LAZY = SELECT * FROM item WHERE id = ?
// EAGER = 관련 테이블들을 모두 조인함. 1:1 관계에 이용
// item_id = order_detail.item_id
// user_id = order_detail.user_id
// where item.id = ?
//1 : N
@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
private List<OrderDetail> orderDetailList;
Test case 만들기
test 폴더 아래 java class를 생성하고, 기존에 자동으로 만들어지는 ApplicationTests를 상속받는다.
public class UserRepositoryTest extends StudyApplicationTests {
// Dependency Injection (DI)
@Autowired
private UserRepository userRepository;
@Test
public void create(){
User user = new User();
user.setAccount("TestUser01");
user.setEmail("TestUser@gmail.com");
user.setPhoneNumber("010-1111-1111");
user.setCreatedAt(LocalDateTime.now());
user.setCreatedBy("admin");
User newUser = userRepository.save(user);
System.out.println("newUser : "+ newUser);
}
@Test
@Transactional
public void read(){
// User user = userRepository.findById(3L); 하면 에러남 아래와 같이 optional형태로 받아야함.
Optional<User> user = userRepository.findByAccount("TestUser03");
// optional은 있을 수 도 없을 수 도 있기 때문에 아래와 같이 조건을 넣어 준다
user.ifPresent(selectUser -> {
selectUser.getOrderDetailList().stream().forEach(detail ->{
System.out.println(detail.getItem());
});
});
}
@Test
@Transactional
public void update(){
Optional<User> user = userRepository.findById(2L);
user.ifPresent(selectUser -> {
selectUser.setAccount("updateUser01");
selectUser.setUpdatedAt(LocalDateTime.now());
selectUser.setUpdatedBy("update method()");
userRepository.save(selectUser);
});
}
@Test
@Transactional //테스트 종료 후 롤백을 해준다
public void delete(){
Optional<User> user = userRepository.findById(2L);
user.ifPresent(selectUser -> {
userRepository.delete(selectUser);
});
Optional<User> deleteUser = userRepository.findById(2L);
if(deleteUser.isPresent()) {
System.out.println("데이터 존재 : " + deleteUser.get());
}else{
System.out.println("데이터 삭제 데이터 없음");
}
}
}
반응형
'개발자 되기 part1 > Spring Boot' 카테고리의 다른 글
Lombok이란? 설치 방법 (0) | 2021.03.09 |
---|---|
Rest api 란? 예제 포함 (0) | 2021.03.07 |
Spring Boot 기초 환경 설정 (0) | 2020.12.15 |