초기 셋팅할 때 팁!
Command + Shift + T → 테스트 클래스 자동 생성
테스트코드에 @Transactional 안붙일경우? 아래와 같은 에러
💡 org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
기본적으로 JPA는 Transactional을 기반으로 작동,
transaction 단위에 따라 1차캐시영역에 있는 객체들이 db에 flush되어 영속화되기 때문이다.
하지만 그러한 영속작업을 하는 persist() 메소드에 객체가 들어갔으나 가능한 transaction이 존재하지 않았기에 저런 에러를 낸것이다. (참고 - https://sas-study.tistory.com/348)
@OneToMany(mappedBy = "member")
privateList<Order> orders =newArrayList<>(); //Member 테이블의 orders
orders테이블에서 member를 변경하면 같이 변경되겠다는 뜻
@ManyToOne
@JoinColumn(name = "parent_id")
privateCategory parent;
@OneToMany(mappedBy = "parent")
privateList<Category> child =newArrayList<>();
티나 임베디드 타입( @Embeddable )은 자바 기본 생성자(default constructor)를 public 또는
protected 로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전
하다.
JPA가 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 리플랙션 같은 기술을 사용할 수
있도록 지원해야 하기 때문이다.
//==연관관계 메서드==//
public void setMember(Member member){
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery){
this.delivery = delivery;
delivery.setOrder(this);
}
//==비즈니스 로직==// setter로 가지고 변경하는게 아니라 메소드로 이렇게해야 가장 객체지향 적인것
/*
stock 증가
*/
public void addStock(int quantity){
this.stockQuantity = quantity;
}
public void removeStock(int quantity){
int restStock = this.stockQuantity-quantity;
if(restStock<0){
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = restStock;
}
@NoargsConstructor(AccessLevel.PROTECTED)를 왜 사용하는가?
Entity나 DTO를 사용할때 @NoargsConstructor(AccessLevel.PROTECTED) 어노테이션을 많이 사용한다. 이는 기본 생성자의 접근 제어를 PROTECTED로 설정해놓게 되면 무분별한 객체 생성에 대해 한번 더 체크할 수 있는 수단이 되기 때문입니다.
javax.validation 예외 처리 할 수 있는 어노테이션 많음, BindingResult를 통해 에러메세지 뱉게하는 것도 좋음
API를 만들 때는 절대로 엔티티를 반환하면 안된다.
Form 객체 vs DTO 차이점은?(궁금해서 찾아본 결과)
변경감지와 병합