Lombok cannot find symbol 에러
RDB 데이터베이스의 정보를 객체지향으로 손쉽게 활용할 수 있도록 도와주는 도구
Object(자바 객체)와 Relation(관계형 데이터베이스) 간의 맵핑을 통해서 보다 손쉽게 적용할 수 있는 기술을 제공
Java 변수를 선언할 때 CamelCase로 선언 ex) phoneNumber, createdAt
DB 컬럼에 SnakeCase 사용 ex) phone_number, created_at
JPA에서는 테이블을 자동으로 생성해주는 기능 존재
@Entity : 해당 클래스가 Entity임을 명시
@Table : 실제 DB테이블의 이름을 명시
@Id : Index primary key를 명시
@Column : 실제 DB Column의 이름을 명시
@GeneratedValue : Primary key 식별키의 전략 설정
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity // == table
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@AllArgsConstructor : 모든 필드에 대한 생성자를 자동으로 생성
@NoArgsConstructor : 파라미터가 없는 생성자를 생성
Jpa의 Entity 및 column은 자동으로 camel case -> DB의 snake_case에 매칭
따로 쿼리문을 작성하지 않아도 기본적인 CRUD
Entity를 통해 데이터를 DB에 저장
public class UserRepositoryTest extends StudyApplicationTests {
// DI = Dependency Injection 의존성 주입
@Autowired
private UserRepository userRepository;
@Test
public void create(){
// String sql = insert into user (%s, %s, %d) value (account, email, age);
User user = new User();
user.setAccount("TestUser03");
user.setEmail("TestUser03@gmail.com");
user.setPhoneNumber("010-1111-3333");
user.setCreatedAt(LocalDateTime.now());
user.setCreatedBy("admin3");
User newUser = userRepository.save(user);
System.out.println("newUser : " + newUser);
}
@Test
@Transactional
public void read(){
Optional<User> user = userRepository.findByAccount("TestUser03");
user.ifPresent(selectUser -> {
selectUser.getOrderDetailList().stream().forEach(detail -> {
Item item = detail.getItem();
System.out.println(item);
});
});
}
@Test
public void update(){
Optional<User> user = userRepository.findById(2L);
user.ifPresent(selectUser -> {
selectUser.setAccount("PPPP");
selectUser.setUpdatedAt(LocalDateTime.now());
selectUser.setUpdatedBy("update method()");
userRepository.save(selectUser);
});
}
@Test
@Transactional // Rollback
public void delete(){
Optional<User> user = userRepository.findById(1L);
Assertions.assertTrue(user.isPresent()); // true
user.ifPresent(selectUser -> {
userRepository.delete(selectUser);
});
Optional<User> deleteUser = userRepository.findById(1L);
Assertions.assertFalse(deleteUser.isPresent()); // false
}
}
@Autowired : 의존성 주입
@Transactional : 실행된 후 다시 Rollback
ifPresent()
: 값이 존재하면 실행
@OneToOne - 일대일
@OneToMany - 일대다
@ManyToOne - 다대일
@ManyToMany - 다대다
OneToMany 사용
@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
private List<OrderDetail> orderDetailList;
ManyToOne 사용
// N : 1
@ManyToOne
private Item item; // item_id
양방향 연관관계시 순환 참조 문제 -> ToString의 exclude를 통해 해결
@ToString(exclude = {"user", "item"})
일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 함
대상과 관계없이 동일한 연산을 수행