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 |
29 | 30 | 31 |
Tags
- springdatajpa
- transaction
- jpa
- spring
- JPQL
- Proxy
- 자바
- 인프런
- Android
- 백준
- 스프링 핵심 원리
- java
- pointcut
- SpringBoot
- 알고리즘
- 스프링
- Thymeleaf
- kotlin
- 김영한
- 스프링 핵심 기능
- JDBC
- Greedy
- AOP
- QueryDSL
- Exception
- db
- Servlet
- http
- 그리디
- Spring Boot
Archives
- Today
- Total
개발자되기 프로젝트
상품 domain, repository, service개발 본문
1. 구현 기능
- 상품 등록
- 상품 목록 조회
- 상품 수정
2. 개발 순서
- 상품 엔티티 개발, 비느지느 로직 추가
- 상품 repository
- 상품 service
- 상품 기능 test
3. Item class 개발
- 객체 지향 관점으로는 데이터를 가지고 있는 곳 에서 business method가 있는 것이 좋다.
- 따라서 도메인 주도 설계 시 엔티티 자체가 해결할 수 있는 것은엔티티 안에 메서드를 만듦.
- 이 때 Setter로 변경하는 것이 아니라 특정 메서드(로직)을 통해 값을 변경해야 한다.
- 예제의 경우 주문에 따라 재고 수량(stockQuantity)가 변경이된다.
- stockQuantity는 Item에서 가지고 있다.
- 따라서 stockQuantity가 변경되는 로직은 Item에 추가하자.
- Item class
- 현재 예제를 위해서 @Setter가 열려있다.
- 하지만 실제 운영에서는 @Setter를 열어두지 말고
- 특정 비즈니스 로직을 통해 데이터를 변경해야 한다.
@Entity
@Setter
@Getter
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
/**
* stock 수량 증가
*/
public void addStock(int quantity){
this.stockQuantity += quantity;
}
/**
* stock 수량 감소
*/
public void removeStock(int quantity){
int restStock = this.stockQuantity - quantity;\
if(restStock < 0){
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = restStock;
}
}
4. ItemRepository
- PK(id)는 persist 전 까지 없다.
- persist시점에 PK(id)생성된다.
- id가 존재하면 merge()를 통해 managed상태로 전환
- merge() : Merge the state of the given entity into the current persistence context.
- 해당 entity를 managed상태로 바꿈
@Repository
@RequiredArgsConstructor
public class ItemRepository {
//엔티티메니저 주입
private final EntityManager em;
/**
* 상품 저장
*/
public void save(Item item){
if(item.getId() == null){
em.persist(item); //persist 전 까지 id 없음.
}else {
em.merge(item); //merge : update 비슷,
}
}
/**
* 상품 한 개 조회
*/
public Item findOne(Long id){
return em.find(Item.class, id);
}
/**
* 상품 리스트 조회, JPQL사용
*/
public List<Item> findAll(){
return em.createQuery("select i from Item i", Item.class).getResultList();
}
}
5. ItemService 개발
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {
/**
* ItemService는 단순히 ItemRepository에 위임하는 로직
* 단순히 위임만 하는 로직이 필요할까..?
*/
//repository 주입
private final ItemRepository itemRepository;
/**
* Item 저장, @Transactional 별도 지정.
*/
@Transactional
public void saveItem(Item item){
itemRepository.save(item);
}
public List<Item> findItems(){
return itemRepository.findAll();
}
public Item findOne(Long id){
return itemRepository.findOne(id);
}
}
6. GitHub : 210806 Item domain,repository, service
'인프런 > [인프런] Springboot와 JPA활용 1' 카테고리의 다른 글
주문 repository, Service (0) | 2021.08.06 |
---|---|
주문 도메인 개발 (0) | 2021.08.06 |
회원 기능 테스트 (0) | 2021.08.06 |
MemberService 개발 (0) | 2021.08.06 |
회원 도메인 개발 (0) | 2021.08.06 |
Comments