[JSCODE] 백엔드 개발자로 협업하기

노을·2023년 4월 2일
0

JSCODE

목록 보기
6/7

공부 자료

✅ 상점 테이블 설계하기

아래 값들을 모두 포함하는 Store 엔티티, 테이블을 생성하세요.

  • id
  • 상점이름
  • 주소
  • 전화번호
@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;
    
    }
       



  • 하나의 상점은 여러개의 상품을 갖을 수 있습니다.

    나는 productstore 관계를 다대일 양방향으로 구현했다.
    PK는 다에 해당하는 product에 있으며, 연관관계의 주인은 product이다.

    public class Store {
        ...
        @OneToMany(mappedBy = "store")
        private List<ProductEntity> products = new ArrayList<>();
    }

    먼저 storeproduct 리스트를 참조하게 한다.


    public class ProductEntity {
        ...
        @ManyToOne
        @JoinColumn(name = "store_id")
        private Store store;
    }

    productstore를 참조한다. 여기 store가 연관관계의 주인이다.



    public class ProductEntity {
        ...
    
        /** 
         * 연관관계 편의 메서드
         */
        public void assignStore(Store store) {
            this.store = store;
            store.getProducts().add(this);
        }
    }

    productstore는 양방향 관계이므로, 연관관계 편의 메서드를 작성해주어야 한다.
    나는 product의 로직이 store 로직보다 중요할 거 같다는 생각이 들어 Product에 연관관계 메서드를 작성했다.



✅ 상점 관련 기본 api 구현하기

아래 요구사항을 만족하는 기본 api를 구현하세요.

  • 상점 등록 api
  • 전체 상점 조회 api
  • 상세 상점 조회 (id별) api
  • 하나의 상점에 속하는 모든 상품 조회 api

Product 도메인과 거의 동일하게 구현하였기 때문에 고민했던 부분만 적어보겠다!

하나의 상점에 속하는 모든 상품 조회 api를 구현하면서,
1. StoreRepository에 해당 메서드 구현함 (근데 상품을 찾아오는게 Store의 역할인가? 싶었다.)
2. 그래서 ProductJpaRepository에 구현하고, StoreService에서 ProductJpaRepository를 쓰자!고 생각했다. (근데 Store가 Product에 의존하게 되지 않나?)
3. 결국 ProductJpaRepository에 구현하고, ProductJpaService에서 사용 (product를 조회하는 건 Product가 담당)

이런 생각의 변화가 있었다.
그냥 기록하기 위해 적는다...



✅ (심화) 지금까지 개발한 api들에 대한 swagger 생성하기

springfox-swagger, springdoc-openapi-ui 중 하나를 선택해서 swagger 문서를 생성해보세요.

API문서는 아직(!) 만들지 않았습니다...



✅ 블로그 글 쓰기

  • 배운 내용, 깨달은 점
    • jpa 연관관계를 다시 공부했다. 복습을 오랜만에 하게 되어 좋았다!
    • 나는 협업을 단 한 번도 해본 적이 없다. sopt에 떨어진 가장 큰 이유도 현업 능력이 없어서가 아닌가 싶어서.. 협업(!)에 대해 정말 궁금했다.
      이번 스터디 회차에서는 잘 만들어진 api 문서를 보고, 프론트 개발자랑 소통했던 일화가 담긴 블로그글을 보면서 소통의 갈피를 잡은 느낌이다.
    • store 기능을 추가하면서 처음에는 남들 코드를 최대한 보지 않으려고 노력했다. (나의 Product 코드도 안보려고 했다..!)
      개발 속도를 높이는 데에는 베끼기가 최고긴 한데, 스프링 기본기를 다지는 근육을 키우고 싶었달까? 이런 간단한 api를 안보고는 구현할 줄 알아야 하지 않나 싶어 호석님 깃허브 보는 걸 참았다. (물론 코드 다 짜고는 열심히 봤다ㅎㅎ)
  • 어려웠던 점, 반성하고 싶은 점 / 개선할 방법
    • 그리고 이번 회차 스터디를 하면서 day4 과제를 보완했는데 branch merge의 개념이 어려워서 day4를 day7에 병합을 잘 한 건지 모르겠다..
    • swagger로 api 문서 만들기(를 빠른 시일 내에 하자!)
  • 궁금한 점
    - 나는 궁금한 점을 pr로 남겼다! day7 pr 링크
    1. storeId로 products를 찾기는 누구의 역할인가?
    2. 연관관계 편의 메서드 위치
    3. monetaryUnit Enum의 위치
profile
진짜를 알면 곁가지를 몰라도 된다

0개의 댓글

관련 채용 정보