Build
- 필요한 라이브러리를 다운 받고 classpath에 추가한다.
- 소스 코드를 컴파일한다.
- 테스트 코드를 실행하여 작성한 코드에 대한 검증을 수행한다.
- 컴파일된 코드를 패키징한다. -> .jar / .war
- 패키징된 파일을 서버나 리포지토리에 배포한다.
Build Tool
- 빌드 툴은 이러한 task 들을 자동화한다.
- 어떠한 일들을 하겠다는 task에 대해 기술할 수 있으며 해당 파일을 빌드 스크립트라고 부른다.
- 스크리트 언어로 Maven은 XML, Gradle은 Groovy 또는 Kotlin을 사용한다.
Maven
- 자바 기반의 프로젝트 빌드 툴이다.
- XML 기반으로 설정 모델을 제공하고 pom.xml에 의해서 정의된다.
- archetype이라는 프로젝트 템플릿을 제공하여 반복된 설정 작업을 줄여준다.
- 프로젝트에서 사용하는 외부 라이브러리인 dependency를 관리해준다.
- 하나의 폴더 안에서 하나의 모듈로 구성할 수 있고 멀티 모듈로 구성할 수도 있다.
Transitive Dependency
- 어떤 아티팩트에 다른 아티팩트를 의존성으로 추가하면 해당 아티팩트의 의존성이 함께 딸려온다.
- 이러한 딸려온 의존성을 Transitive Dependency라고 한다.
- 메이븐은 이러한 딸려온 의존성을 알아서 처리해준다.
- 만일 동일한 아티팩트의 여러 버전이 존재한다면 의존관계 트리에서 제일 가까운 버전을 선택하게 된다.
Dependency Scope
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
- dependency에 특정 스코프를 지정할 수 있다.
- 만일 스코프를 명시하지 않으면 기본적으로 compile 스코프를 가진다.
- compile
- 모든 빌드 작업에서 프로젝트의 classpath에서 사용할 수 있다.
- provided
- 컴파일 시와 프로젝트의 테스트 classpath에서만 사용할 수 있다.
- runtime
- 런타임 및 테스트 classpath에서 사용할 수 있다.
- test
- 테스트 및 실행 classpath에서 사용할 수 있다.
- system
- provided와 유사하다.
- 특정 .jar 파일을 직접 가리킨다.
- 더 이상 사용되지 않는다.
Gradle
- Groovy 기반으로 빌드 스크립트를 작성하게 도와준다.
- XML 보다 간결하다.
- 단, 해당 스크립트 언어를 알아야 한다.
- Gradle은 하나 이상의 프로젝트를 지원하며 하위에 다수의 프로젝트를 구성할 수 있다.
- 하나의 프로젝트는 하나 이상의 task로 구성된다.
- 일반적으로 task를 plugin의 형태로 제공한다.
Spring
- 스프링은 여러 프로젝트로 구성된 거대 프로젝트이다.
- 스프링 프레임워크는 여러 모듈로 구성되어 있다.
- IoC
- AOP
- Testing
- Spring MVC
- Data Access
Spring Boot
- Spring Application의 손쉬운 실행을 지원한다.
- Auto Configuration
- properties, 옵션 인수 등을 통한 외부 환경 설정
- profile을 통한 실행환경 관리
- 실행 가능 .jar 파일로 패키징
Domain
- 사용자가 애플리케이션에서 사용하는 관심 영역이 해당 애플리케이션의 도메인이 된다. 즉, 비즈니스 영역 그 자체가 도메인이 된다.
- 비즈니스의 복잡성을 해소하기 위해 모델을 만들고 이 모든 것들은 class로 작성되고 객체로 만들어진다.
Entity
- 엔터티는 다른 엔터티와 구별할 수 있는 고유한 식별자를 가진다.
- 시간의 흐름에 따라 지속적으로 변경 되는 객체이다.
- 비즈니스 로직을 가질 수 있다.
VO
- 값 속성이 개별적으로 변하지 않고 값 자체로 고유하다.
- 한 번 만들어지면 내용이 변하지 않는 불변이다.
- 대체로 Entity 들이 VO들을 속성으로 가지고 있다.
의존성
- 어떤 객체가 다른 객체가 협력할 때 두 객체 사이에 의존성이 생기게 된다.
- 컴파일타임 의존성
- 코드를 작성하는 시점에서 발생하는 의존성이다.
- 클래스 사이의 의존성
- 런타임 의존성
- 애플리케이션이 실행되는 시점의 의존성이다.
- 객체 사이의 의존성
결합도
- 하나의 객체가 변경이 일어날 때, 관계를 맺고 있는 다른 객체에게 변화를 요구하는 정도이다.
- 의존성이 바람직할 때 두 요소는 느슨한 결합도를 가진다.
- 바람직한 의존성이란 설계를 개선하기 쉽게 만드는 의존성을 뜻한다.