이번 챕터는 스프링 없이 순수 자바로 프로젝트 예제를 만들어 본다.


프로젝트 생성

https://start.spring.io에 가서 Spring Boot 프로젝트를 생성한다.
프로젝트 선택

  • Project: Gradle Project
  • Spring Boot: 2.3.x
  • Language: Java
  • Packaging: Jar
  • Java: 11
    Project Metadata
  • groupId: hello
  • artifactId: core
    Dependencies: 선택하지 않는다.

build.gradle 파일은 아래와 같이 적용된다.

plugins {
	id 'org.springframework.boot' version '2.3.9.RELEASE'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

비즈니스 요구사항과 설계

  • 회원
    • 회원은 가입하고 조회할 수 있다.
    • 회원은 일반과 VIP 두 가지 등급이 있다.
    • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)
  • 주문과 할인 정책
    • 회원은 상품을 주문할 수 있다.
    • 회원 등급에 따라 할인 정책을 적용할 수 있다.
    • 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있 다.)
    • 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정)

미확정 된 부분은 인터페이스를 통해 역할구현을 분리 할 수 있을것이다. 다음 세션은 도메인 설계를 진행해볼 것이다.


회원 도메인 설계

  • 회원 도메인 협력 관계 : 기획자들도 볼 수 있는 그림
  • 회원 클래스 다이어그램 : 위 그림을 바탕으로 구체화 해서 만든 그림
  • 회원 객체 다이어그램 : 서버가 실제로 구동되서 클라이언트가 사용되는 것을 기준으로 인스턴스끼리의 다이어그램을 말함(어떤 구현체를 사용할 것인지는 모르기 때문에 작성 안함)

회원 도메인 개발 및 주문과 할인 도메인 개발(클론코딩)

왜 변경 가능성이 없는 Service도 인터페이스/객체를 분리화하여 작성하였을까?
강사님께서는 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩토링하여 인터페이스를 도입하는 것도 방법이다.라고 하셨다.
강의에서는 이상적으로 역할가 구현을 분리하는 것에 초점을 맞추어 service도 분리하였다. 실무에서는 교체 가능성이 없는 서비스 클래스는 구체 클래스로 만들어도 무방하다.


  • 강사님께서 추천해주시는 UML, ERD 툴 : draw.io 혹은 gliffy. 모든 필드를 다 uml이나 erd에 나열하지 않고, 설계 그림은 비즈니스 핵심 필드나 연간관계 필드, PK, FK, 성능에 주요한 역정규화 필드를 나열하고, 자세한 모든 필드는 별도의 엑셀에 나열한다.
  • 테스트코드 관련 도서 : 켄트 백의 테스트 주도 개발

앞선 내용은 김영한 강사님의 스프링 핵심 원리 기본편 강의를 들으며 정리한 내용입니다.


oksusutea's blog

꾸준히 기록하려고 만든 블로그