아래 값들을 모두 포함하는 Store 엔티티, 테이블을 생성하세요.
@DynamicInsert
@Entity
@Table
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Store {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Embedded
private Address address;
@Embedded
private Phone phone;
}
나는 주소와 전화번호는 임베디드 타입으로 구현했다.
(심화) 아래 요구사항을 만족하게 구현하세요.
주소에는 도로명 주소와 상세 주소가 포함됩니다.
@Embeddable
@Getter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Address {
@Column(name = "address_roadcode")
private String roadCode;
@Column(name = "address_detail")
private String detail;
}
하나의 상점은 여러개의 상품을 갖을 수 있습니다.
나는 product와 store 관계를 다대일 양방향으로 구현했다.
PK는 다에 해당하는 product에 있으며, 연관관계의 주인은 product이다.
public class Store {
...
@OneToMany(mappedBy = "store")
private List<ProductEntity> products = new ArrayList<>();
}
먼저 store는 product 리스트를 참조하게 한다.
public class ProductEntity {
...
@ManyToOne
@JoinColumn(name = "store_id")
private Store store;
}
product는 store를 참조한다. 여기 store가 연관관계의 주인이다.
public class ProductEntity {
...
/**
* 연관관계 편의 메서드
*/
public void assignStore(Store store) {
this.store = store;
store.getProducts().add(this);
}
}
product와 store는 양방향 관계이므로, 연관관계 편의 메서드를 작성해주어야 한다.
나는 product의 로직이 store 로직보다 중요할 거 같다는 생각이 들어 Product에 연관관계 메서드를 작성했다.
아래 요구사항을 만족하는 기본 api를 구현하세요.
Product 도메인과 거의 동일하게 구현하였기 때문에 고민했던 부분만 적어보겠다!
하나의 상점에 속하는 모든 상품 조회 api를 구현하면서,
1. StoreRepository에 해당 메서드 구현함 (근데 상품을 찾아오는게 Store의 역할인가? 싶었다.)
2. 그래서 ProductJpaRepository에 구현하고, StoreService에서 ProductJpaRepository를 쓰자!고 생각했다. (근데 Store가 Product에 의존하게 되지 않나?)
3. 결국 ProductJpaRepository에 구현하고, ProductJpaService에서 사용 (product를 조회하는 건 Product가 담당)
이런 생각의 변화가 있었다.
그냥 기록하기 위해 적는다...
springfox-swagger, springdoc-openapi-ui 중 하나를 선택해서 swagger 문서를 생성해보세요.
API문서는 아직(!) 만들지 않았습니다...
store 기능을 추가하면서 처음에는 남들 코드를 최대한 보지 않으려고 노력했다. (나의 Product 코드도 안보려고 했다..!)branch merge의 개념이 어려워서 day4를 day7에 병합을 잘 한 건지 모르겠다.. swagger로 api 문서 만들기(를 빠른 시일 내에 하자!)
storeId로 products를 찾기는 누구의 역할인가?연관관계 편의 메서드위치monetaryUnitEnum의 위치