Written by
Poogle
on
on
2021.08.16 TIL
새롭게 배운 것 Done
운동
- 저녁 러닝 - 3km
독서
- 오브젝트 - Ch.8 의존성 관리하기
알고리즘
코딩
Maven
- Multiple Module 지원
- 하나의 프로젝트에 여러 프로젝트 관리할 수 있음
<modules> <module>service-a</module> <module>service-b</module> </modules>
- 마이크로 서비스 환경에서 컴파일 타임의 의존관계를 편리하게 가져가기 위해서 자주 사용
- Build Lifecycle
mvn compile
mvn clean package
- Transitive Dependencies
- 의존성의 의존성
- 의존성 트리를 구성하여 동일한 groupId artifactId에 대해서는 가장 최신의 version 정보를 사용
- 때로는 버젼 간 충돌, 라이브러리 간 충돌 등의 문제를 야기할 수 있음
- 의존 범위(Dependency Scope)
- compile:
.. 을 지정하지 않는 경우, 기본값으로 설정- 컴파일 의존성은 프로젝트의 컴파일, 테스트, 실행에 라이브러리가 필요할 때 사용
- provided: 일반적으로 JDK 또는 컨테이너가 해당 라이브러리를 제공할 때 설정 즉, 웹 애플리케이션의 경우 JSP와 Servlet API 등은 provided 의존성으로 설정
- runtime: 컴파일 시에는 사용되지 않으나, 실행과 테스트 시에는 필요할 때 설정
- ex. JDBC 드라이버
- test: 애플리케이션의 실행에는 사용하지 않으나, 테스트 컴파일 및 실행 시에 필요할 때 설정
- ex.easymock, junit 등
- system: provided 의존성과 비슷하지만, 사용자가 jar 파일의 위치를 지정
<systemPath> .. </systemPath>
엘리먼트를 이용하여 jar 파일의 위치를 지정- 그러나 사용자마다 개발 환경이 다를 수 있으므로 프로퍼티를 이용하여 jar 파일의 위치를 지정하는 것이 좋음
- compile:
Gradle
plugins {
java
application // application 플러그인 추가.
}
group = ///
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
google()
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
}
tasks.getByName<Test>("test") {
useJUnitPlatform()
}
tasks.compileJava {
options.isFork = true
}
application {
mainClass.set("///.App")
}
- 하나 이상의 프로젝트 지원
- 하나의 프로젝트는 하나 이상의 Task(클래스 컴파일, Jar 생성, build 작업)로 구성
- Plugin
- 실제 Task와 주요한 기능들을 추가하게 하는 것
- 하나의 플젝에 여러 플러그인 추가 가능
Spring, Spring Framework, Spring Boot
- 과거: Spring 프레임워크 하나에서 시작했던 프로젝트
Spring Boot
- Spring 프레임워크를 사용하는 프로젝트를 아주 간편하게 셋업할 수 있는 스프링 프레임워크의 서브 프로젝트
- 독립 컨테이너에서 동작할 수 있음 ⇒ Java만 설치되어 있으면 OK
- Packaging Executable Jar: 빌드 후에 jar 파일이 생성, 별도의 서버 설치 없이 embeded tomcat이 자동으로 실행됨
- 프로젝트 생성 시 통합된 설정파일 application.yml로 사용 가능
- SpringApplication을 통한 손쉬운 실행
- Auto Configuration
- 쉬운 외부 환경 설정 - Properties, YAML, Command line 설정 등
- 프로파일을 통한 실행환경 관리
- Developer Tools
Spring Framework 핵심 개념
- 공식문서
- Spring IoC 컨테이너 그리고 Beans
- 리소스 핸들링 (Resource와 ResourceLoader)
- 벨리데이션과 데이터 바인딩 그리고 타입 변환
- 스프링 expression 언어
- AOP
- Null-safety
- 데이터 버퍼와 코덱
- 로깅
Entity
- 다른 엔티티와 구별할 수 있는 식별자를 가지고 있음
- 시간에 흐름에 따라 지속적으로 변경이 되는 객체
VO
- 값 객체는 각 속성이 개별적으로 변화하지 않고 값 그 자체로 고유한 객체
- 한 번 만들어지면 그 내용이 변하지 않기 때문에 불변
의존성
- 어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이의 의존성이 존재
- 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가짐
- 컴파일 타임 의존성: 코드를 작성하는 시점에서 발생하는 의존성, 클래스 사이의 의존성
- 컴파일 타임: 작성된 코드를 컴파일하는 시점이라기 보다는 코드 그 자체, 작성하는 시점을 의미하기도 함
- 런타임 의존성: 애플리케이션이 실행되는 시점의 의존성, 객체 사이의 의존성
- 컴파일 타임 의존성: 코드를 작성하는 시점에서 발생하는 의존성, 클래스 사이의 의존성
- 컴파일 의존성 => 런타임 의존성으로 대체
- 코드 작성 시점에 어떤 두 클래스에 의존성을 갖고 있던 부분을 그 두 클래스의 존재를 모르게끔 두 클래스 모두를 포괄하는 추상 클래스에 의존하도록 만들고 이 컴파일 타임 의존성을 실행 시에 런타임 의존성으로 대체하기
Java - 몇 가지 새롭게 알게 된 것들
record
- jdk 14에서 preview로 나왔고 16에서 정식 스펙
- 자동으로 불변 객체로 만들어줌
- 프로퍼티명으로 getter 사용
import java.util.UUID;
public record OrderItem(UUID productId,
long productPrice,
long quantity) {
}
var beforeDiscount = orderItems.stream().map(v -> v.productPrice() * v.quantity())
.reduce(0L, Long::sum);
var
- java 10부터, 11부터는 람다 타입 지원도 된다
- 타입 추론: 변수 타입 명시적으로 적어주지 않고도 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론
- var는 초기값이 있는 지역변수로만 선언 가능
- 런타임 오버헤드가 없음 -> 컴파일 시점에 초기화된 값을 보고 명시적으로 결정, 중간에 타입 변경 안 됨
- 람다 인자에도
var
넣게 해줌- 일반 람다의 경우 파라미터 어노테이션을 못 넣었는데 java 11 부터는 타입 추론의 유연성을 추가
public static void main(String[] args) { Flux.just(1, 2, 3, 4) .map((@Nonnull var i) -> i * 2) .subscribe(System.out::println); }
- 일반 람다의 경우 파라미터 어노테이션을 못 넣었는데 java 11 부터는 타입 추론의 유연성을 추가
Spring Asserts
- 스프링 유틸에서 제공하는 Assertion
<!-- https://mvnrepository.com/artifact/org.springframework/spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
import org.springframework.util.Assert;
Assert.isTrue(order.totalAmount() == 90L, MessageFormat.format("totalAmount {0} is not 90L", order.totalAmount()));
- 스프링에서 제공하는 Assert 클래스 상속받아서 신규로 정의 가능
참고 - ArrayList의 add
var orderItems = new ArrayList<OrderItem>() {{ add(new OrderItem(UUID.randomUUID(), 100L, 1)); }};
깨달은 점 FEELING
- 스프링이 몰아친다. Java 8만 꾸준히 써와서 새로운 문법? 기능들이 나올 때마다 당황스럽다. 그래도 하다보면 조금씩 익숙해지는 것도 같다. 개인적으로 컴파일 의존성과 런타임 의존성 나오는 부분이 제일 재밌었다. 특히 그 내용을 오브젝트 책으로 보충해서 강의를 듣고 실습하니 이해가 가장 잘 된 것 같다.