@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Builder
@RequiredArgsConstructor
@Table(name = "user", indexes = {@Index(columnList = "name")},uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NonNull
private String name;
@NonNull
private String email;
@Enumerated(value = EnumType.STRING)
private Gender gender;
@Column(updatable = false)
private LocalDateTime createdAt;
@Column(insertable = false)
private LocalDateTime updatedAt;
@Transient
private String testData;
}
public interface UserRepository extends JpaReposiotry<User,Long>{}
// JpaRepository <엔티티 이름, 컬럼의 ID 자료형>
JPA에서는 많은 메소드를 지원한다.
User findByEmail(String email);
User getByEmail(String email);
User readByEmail(String email);
User queryByEmail(String email);
User searchByEmail(String email);
User streamByEmail(String email);
User findUserByEmail(String email);
User findSomethingByEmail(String email);
User FindByEmail(String Email)을 비롯하여 모두 같은 결과가 도출되는 메소드이다.
여기서 생성 또한 가능하다.
User findTop1ByEmail(String email)
다음과 같은 메소드를 생성하고, Junit 테스트에서나 실제 Service에서 사용이 가능하다.
여기서 특히한점은
>Optional<T> findById(ID id);
>>findById 의 경우에는 Optional 객체를 가지고 있다.
그래서 Test 구문이나 실제 메소드 적용시에
@DisplayName("1. CRUD ")
@Test
@Transactional
void crud() {
userRepository.save(new User("david","david@fastcampus.com"));
User user = userRepository.findById(1L).orElseThrow(RuntimeException::new);
user.setEmail("martin-update@fastcampus.com");
userRepository.save(user);
}
>>위와 같이 User user = userRepository.findById(1L)을 사용할 경우 오류가 발생한다.
RuntimeException을 던져줘야만 메소드의 실행이 가능하다.