Step01 - 프로젝트 설계 및 프로젝트 생성
이장에서는 아래의 내용을 중점으로 살펴볼 것 입니다
- 어떤 서비스를 만들것인가.
- 도메인구조, 테이블구조
- 프로젝트구조
- Spring boot 프로젝트 생성
1. 어떤 서비스를 만들것인가.
온라인 서점에서 한번에 여러개의 책을 주문할 수 있는 주문 시스템 API 서비스 구축
간단히 말하면 위 소제목과 같은 간단한 API 서버를 만들 것입니다. 좀 더 상세히 말하면 아래와 같을 수 있습니다.
- 책을 주문하기 위해서는 Spring boot 온라인 서점 회원이어야 합니다.
- 회원은 여러 개의 주문 신청을 할 수 있습니다.
- 주문을 할 때 한 번에 여러 개의 책을 주문할 수 있습니다.
- 책은 여러 주문의 의해 주문될 수 있습니다.
- 주문이 완료된 이후에 배송이 시작됩니다.
- 배송을 하기 위해서는 반드시 한 명의 수취인이 필요합니다.
- 이러한 주문 상태는 추적이 되어야 합니다
위 요구 사항들 기반으로 어떠한 도메인들이 나올 수 있는지 확인해볼 것입니다. 좀 더 상세한 요구 조건은 실제 구현을 하면서 정의하겠습니다.
2. 도메인구조, 테이블구조
위 내용을 토대로 크게 아래와 같은 도메인들이 나올 수 있을것입니다.
위 도메인을 기반으로 아래와 같은 테이블 구조가 나올 수 있을것입니다. 물론 추가 요구사항등이 있으면 테이블 구조, 도메인구조는 변경되어질 수 있습니다.(온라인 글 연재에 장점이라고생각합니다. 물론 너무많은 변화는 없도록 노력할것입니다.)
위 그림들을 보면 테이블 구조와 객체 도메인 구조가 다르다는것을 보실 수 있습니다. 이러한 이유는 도메인 하나가 테이블 엔터티를 의미하는것이 아니기 때문입니다. JPA 에서 여러개의 도메인은 하나의 테이블에 쉽게 저장할 수 있게 해줍니다. 예를들어 위의 그림처럼 배송, 수취인, 주소의 다른 도메인이 있지만 이것들을 함께 주문테이블에 쉽게 저장할 수 있게 해줍니다.
JPA에서 도메인은 크게 엔터티와 벨류타입으로 나누어질 수 있습니다. JPA에서 엔터티와 벨류타입을 잘 분류해야만 응집력있는 코드를 작성할 수 있습니다. 도메인을 엔터티와 벨류 타입으로 나누는 기준의 큰 차이는 엔터티는 식별자를 가집니다. 반면 벨류타입은 식별자를 가지지않습니다. 이부분은 실제 엔터티와 벨류타입으로 데이터를 생성할 때 좀 더 자세히 알아보겠습니다.
3. 프로젝트 구조
프로젝트 구조는 다음과 같이 이루어질것입니다.
계층 | 설명 |
---|---|
표현영역 | 클라이언트에 요청을받아 그것을 응용 영역에 전달하고 응용영역에서 처리한값을 클라이언트에게 전달하는 역할을 합니다. 클라이언트로부터 HTTP요청을 받아 처리후 JSON형태로 클라이언트에 전달하는 역할을 합니다. |
응용영역 | 표현 계층으로부터 전달받은 데이터를 기반으로 비지니스 로직을 수행하기보다는 도메인들한테 시키는 역할을합니다. |
도메인영역 | 도메인들에 핵심 로직을 구현하는 역할입니다.(객체지향 관점에 맞게 객체한테 시키시킨다고 보시면됩니다.) |
인프라스트럭쳐영역 | 이 영역은 DB, 외부 api 등에 대한 처리를 하는 영역입니다. 그렇게해야 응용 영역에서 통일된 데이터를 사용할 수 있습니다. |
각 계층은 자신의 계층의 책임에만 집중해야합니다. 자신의 영역을 넘어서는 코드를 짜게되면 코드가 복잡해지고 코드의 응집력이 떨어지게됩니다. 결국엔 변화에대한 유연성이 떨어지고 이해하기 힘든코드가되어 유지보수가 힘들어집니다. 그러기때문에 항상 이것을 염두하고 코딩을 해야한다고 생각합니다.
4.Spring boot 프로젝트 생성
프로젝트 생성은 intellij 기준으로 설명하겠습니다!
먼저 NewProject 를 생성한후 아래와 같은 플로우로 프로젝트를 생성하실 수 있습니다.
기본적으로 프로젝트를 진행하기위해 아래와같은 의존성 라이브러리들을 선택해줘야합니다.
여기에서 버전을 2.0.3으로되어있는데요. 이프로젝트에서는 1.5.9를 사용합니다. 프로젝트가 만들어진 이후 pom.xml에서 변경하실 수 있습니다.
최종적으로 Finish를 누르면 프로젝트 생성이됩니다.
마치며
다음장부터 본격적으로 API서버를 만들어보는 시간을 가져보겠습니다!