2022년 04월 04일 TIL

Build Tool

Build

  • 라이브러리 다운
  • 코드 컴파일
  • 테스트 실행
  • 컴파일된 코드 packaging(jar..)
  • artifacts(packaging된 파일)를 배포

Maven

  • POM.xml(POM: Project Object Model)

왜 사용?

  • 매번 같은 설정을 반복하지 않게 해준다.
  • dependency(외부 라이브러리) 관리
  • 플러그인과 외부 라이브러리 분리하여 관리

Maven coordinates

Maven 프로젝트 식별자

  • groupId: 회사나 단체명
  • artifactId: 프로젝트명
  • version: 프로젝트의 버전
    • SNAPSHOT: 개발 중
    • RELEASE: 배포

Multiple Module

하나의 프로젝트에서 여러 프로젝트를 관리할 수 있다.

build lifecycle

lifecycle
validate, compile, test, package, verify, install, deploy

How to use
mvn < lifecycle >
mvn < lifecycle1 > < lifecycle2 >

Transitive Dependencies

if (A -> B, B -> C) then (A -> C)

버전 또는 라이브러리간의 충돌이 일어날 수 있으므로 주의!!

의존관계 디버그
mvn dependency:tree 를 이용하여 의존관계 트리를 찍어볼 수 있다.

의존 범위

<scope></scope>를 이용하여 설정한다.

  • compile
    • default scope
    • 컴파일, 테스트, 실행에 라이브러리가 필요할 때 사용
  • provided
    • JDK나 컨테이너(container)가 제공하기를 원할 때 사용된다.
    • 🤨 이해가 잘 안간다
  • runtime
    • 실행과 테스트를 시에 필요하면 설정
  • test
    • 테스트 컴파일 및 실행에 필요하면 설정
  • system
    • provided와 비슷 but 사용자가 jar파일의 위치를 지정한다.
    • 🤨 이해가 잘 안간다

gradle

Groovy와 코틀린 기반 빌드툴

Task

build를 위해 하는 작업

plugin

  • Gradle에서 Task와 주요한 기능들을 추가하게 해주는 것
  • plugin으로 인해 새로운 task와 특정 컨벤션(ex. 디렉토리 구조)들이 추가도니다.

Spring framework 시작하기

Spring

여러 프로젝트(Spring Boot, Spring Security 등)의 묶음

Spring Framework

여러 모듈의 묶음

Spring Boot

프로젝트 set up 시간을 줄여준다.

Domain Driven Design(DDD)

Entity

  • 식별자를 가지고 있다.
  • 지속적으로 변경이 되는 객체이다.

Value Object(VO)

  • 값 그 자체로 고유한 불변 객체이다.
  • 도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체
  • equals & hash code 메서드를 재정의해야 한다
    • equals와 hashCode를 재정의하여 VO를 사용할 때 속성값이 같은 객체는 같은 객체임을 보장해야한다.
  • 수정자(setter)가 없는 불변 객체여야 한다
    • 속성값 자체가 식별 값인 VO는 값이 바뀌면 다른 값이 되어 추적이 불가능하다. 따라서 VO는 반드시 값을 변경할 수 없는 불변 객체로 만들어야 한다.

의존성 관리

컴파일타임 의존성

  • 클래스 사이 의존성
  • 강한 결합도
FixedAmountVoucher fixedAmountVoucher = new FixedAmountVoucher()
// 구상체가 완전히 정해져 있다. 변경될 여지가 없다!
var order = new Order(UUID.randomUUID(), customerId, orderItems, fixedAmountVoucher);

...

// FixedAmountVoucher의 변경에 영향을 받습니다.
public class Order {
	public Order(UUID orderId, UUID customerId, List<OrderItem> orderItems, FixedAmountVoucher fixedAmountVoucher) {
        ...
        this.fixedAmountVoucher = fixedAmountVoucher;
	}
}

런타임 의존성

  • 객체 사이 의존성
  • 느슨한 결합도
var fixedAmountVoucher = new FixedAmountVoucher(UUID.randomUUID(), 10L);
// 런타임 시점에 구상체 결정
var order = new Order(UUID.randomUUID(), customerId, orderItems, fixedAmountVoucher);

...

public class Order {
	public Order(UUID orderId, UUID customerId, List<OrderItem> orderItems, Voucher voucher) {
        ...
        this.voucher = voucher;
	}
}

결합도

변경이 일어날 때에 관계를 맺고 있는 다른 객체에게 변화를 요구하는 정도

Record

  • 자동으로 생성자와 멤버(private final)를 가지는 데이터 클래스이다.
public record SampleRecord {
	String name,
    Integer age,
    Address address
} {}
  • record에서 getter는 getXXX()형태를 가지지 않는다. name(), age(), address()와 같은 형태를 가진다.
  • Java 14 부터 사용할 수 있다.

var

  • 변수의 타입을 명시적으로 적어주지 않고도, 컴파일러가 알아서 변수의 타입을 추론한다.
  • Java 10 부터 가능하다
var str = “Hello World”; 
var list = new ArrayList<String>();

단 vars는

  • 지역 변수에서만 사용할 수 있다.
  • 반드시 초기화가 필요하다. null로는 초기화할 수 없다.
  • 배열에 사용할 수 없다.
  • Lamda에도 사용할 수 없다.

좋은 웹페이지 즐겨찾기