Build
- 필요한 라이브러리를 다운받고 classpath에 추가함.
- 소스코드를 compile한다.
- 테스트를 실행한다.
- 컴파일된 코드를 packing해서 jar / war / zip 등으로 만든다.
packing된 파일은 artifacts라고 부름.
- 서버나 레파지토리에 배포한다.
종류
Maven
- 자바 기반의 프로젝트에서 많이 사용.
- xml 기반으로 설정모델을 제공하며, pom.xml 파일을 통해 작성할 수 있음.
- POM : Project, Object, Model
Maven을 사용하는 이유
- archetypes라는 프로젝트 템플릿 기능을 제공, 매번 같은 설정을 반복하지 않게 도와줌.
- 프로젝트에서 사용하는 외부 라이브러리인 dependency를 관리해줌.
- 플러그인과 외부 라이브러리를 분리하여 관리함.
- dependency를 다운받는 Repository가 로컬이 될 수도 있고, Maven Central과 같은 공개된 Repository이 될 수도 있음.
IntelliJ로 maven 만들기
- 제네레이터에서 maven 선택 > archetype을 선택할 수 있음.
pom 파일
- 메이븐 프로젝트는 pom(Project, Object, Model)이라는 것을 정해야하는데 pom.xml을 작성하면 Maven이 폼 오브젝트 모델이라는 객체를 생성, 폼에 의해서 프로젝트에 대한 dependency등 여러 설정을 해줌.
- xml로 프로젝트에 대한 설정을 정의하면, maven이 이것을 기반으로 구성(빌드)해줌.
maven cordinate
- maven project를 식별하는데 사용.
- groupId - artifactId - version으로 구성됨.
- SNAPSHOT은 개발되는 과정이라 볼 수 있음 > 여러 버전을 만드는 것과 같음.
스냅샷 앞 숫자를 바꿔 버전을 바꿔줄 수 있다.
- RELEASE를 기준으로 배포하게 됨.
RELEASE는 SNAPSHOT이 있던 자리에 들어감.
- 모듈을 생성할 수 있다.
- dependency에 외부 라이브러리가 있음.
Lifecycle
- 프로젝트에서 정의된 빌드의 단계로, Maven에서 default로 제공한다.
- clean : 이전 빌드에서 생성된 파일들을 삭제.
- validate : 프로젝트가 정확하고 필요한 모든 정보를 사용할 수 있는지 확인.
- compile : 프로젝트의 소스코드를 컴파일.
- test : 적절한 단위 테스트 프레임워크를 사용, 컴파일된 소스코드를 테스트함. 기본 설정은 단위 테스트가 실패하면 빌드 실패로 간주.
- package : 단위 테스트가 성공하면 pom.xml의 엘리먼트 값(jar, war, ear 등)에 따라 배포 가능한 형식으로 패키징.
- verify : 품질 기준이 충족되는지 확인하기 위해 통합 테스트 결과에 대한 모든 확인 실행.
- install : 다른 프로젝트에서 로컬로 사용하기 위해 패키지를 로컬 저장소에 설치.
- Site : 프로젝트 문서를 생성.
- deploy : 빌드 환경에서 완료되고 다른 개발자 및 프로젝트와 공유하기 위해 원격 저장소에 최종 패키지를 복사.
- mvn이라는 명령어를 사용해서, 각각의 라이프사이클을 실행시킬 수 있다.
여러개를 동시에 실행하는 것도 가능.
Transitive Dependencies
- 의존성의 의존성. (딸려온 의존성.)
- a가 b를 참조하고, b가 c를 참조한다면, a는 c를 Transitive Dependencies로 간주함.
- 이러한 경우, maven은 의존성 트리를 구성하여 동일한 group, artifact에 대해서 가장 최신의 정보를 사용하게 됨.
- 의존성이 충돌되지 않게, maven이 잘 처리해 줌.
Gradle
- Groovy 기반으로 빌드 스크립트를 작성할 수 있게 함.
최근에는 Kotlin도 지원한다.
- Gradle은 하나 이상의 프로젝트를 지원. 하나의 프로젝트는 하나 이상의 task로 구성.
task : 클래스를 컴파일하거나, jar 생성.
- Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있음.
- 스크립트 언어로 구성되어 있기때문에 변수선언, if, else, for등의 로직이 구현가능하여 간결하게 구성 가능.
Maven vs Gradle
- Gradle이 시기적으로 늦게 나온만큼 사용성, 성능 등 비교적 뛰어난 스펙을 가지고 있다(라고 한다..)
- Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많음.
- 설정 내용이 길어지고 가독성 떨어짐
- 의존관계가 복잡한 프로젝트 설정하기에는 부적절
- 상속구조를 이용한 멀티 모듈 구현
- 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야함 (상속의 단점 생김)
- Gradle은 그루비를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 됨.
- Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버했음.
- 설정 주입시 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있음.
- 결정적으로, Gradle이 Maven보다 최대 100배 빠름.
- 그래도 이번 교육은 maven으로 할 듯?
Gradle과 Maven 참고 링크
Spring기반 어플리케이션 프로젝트 만들기.
Spring을 사용하는 방법
- Maven / Gradle으로 프로젝트를 만들고 pom.xml이나 build.gradle을 직접 수정함.
- Spring Boot 사용
- Spring Boot CLI를 이용.
- Spring Initializer
Spring Boot CLI
-
Manual Installation
참고 블로그
-
scoop을 이용.
1) PowerShell을 켜줌. 관리자 권한으로 켜줘야한다. 버전이 5.1 이상이어야 되는데 어지간하면 그렇기 때문에 걱정 안 해도 됨.
2) SCOOP링크에 들어가서 보이는 두 개의 코드를 복사해서 PowerShell에 차례로 넣어주자.
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time
> irm get.scoop.sh | iex
- Scoop 다운로드 끝
3) 다음은 Spring Boot를 받자.
위의 Manual Installation링크에 들어가서 좀 내려가다 보면 Windows Scoop Installation 란이 있다. 거기서 코드를 복사해서 PowerShell에 넣어주자.
> scoop bucket add extras
> scoop install springboot
- Java Spring Boot 다운로드 끝
아, Windows Scoop Installation 란에 Scoop관련 내용도 있다.
- PowerShell을 관리자 권한으로 실행한다.
- spring이라는 명령어를 넣는다.
spring에서 사용할 수 있는 명령어들이 출력된다.
- shell 사용 후 init을 사용하면
압축파일이 생성된다.
- 조건을 넣어서 만들수도 있다.
spring init --build maven -j 17 -g org.prgms -a kdt-spring-demo -n kdt-spring-demo
- 생성하면, kdt-spring-demo.zip가 생성된다.
- -x 를 사용해서 바로 폴더로 만들 수 있다.
spring init --build maven -j 17 -g org.prgrms -a kdt-spring-demo -n kdt-spring-demo -x kdt-spring-demo
- C:\Users\XXX\kdt-spring-demo 가 만들어진다.
- Spring intializr을 사용해서도 만들 수 있다.
- idea 명령어를 사용하면 IntelliJ에서 바로 열 수 있다.
spring framework 핵심 개념.
- Spring Ioc컨테이너 , Beans
- 리소스 핸들링.
- 벨리데이션과 데이터 바인딩, 타입 변환.
- 스프링expression 언어.
- AOP
- Null-safety
- 데이터 버퍼와 코덱
- 로깅.
- Domain : 사용자가 어플리케이션을 사용하는 대상 영역.
Driven Design
- Entity
엔티티는 다른 엔티티와 구별할 수 있는 식별자를 가지고 있고, 시간에 흐름에 따라 지속적으로 변경되는 객체.
식별자는 개별성이 있는 값임.
- Value Object
값 객체는 각 속성이 개별적으로 변화하지 않고 그 자체로 고유한 불변 객체.
값의 조합으로 고유성을 갖음.
한 번 만들어지면 내용이 변하지 않음. 불변.
- Entity가 Value Object를 속성으로 갖는 경우가 많음.
- 스프링은 자바기반 어플리케이션을 만들기때문에 여러 객체들을 만들게되고 그 객체들의 관계를 갖고 어플리케이션을 구성하게 됨.
객체들이 서로 협력할 때마다 객체들끼리 필요할 때가 있음.
- 의존성이 형성되는 것.
의존성 관리
의존성이란?
어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이의 의존성이 존재하게 됨. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다.
- 컴파일타임 의존성 : 코드를 작성하는 시점에서 발생하는 의존성. 클래스 사이의 의존성.
- 런타임 의존성 : 애플리케이션이 실행되는 시점의 의존성. 객체 사이의 의존성.
결합도
-
하나의 객체가 변경이 일어날 때, 관계를 맺고 있는 다른 객체에게 변화를 요구하는 정도.
-
어떤 두 요소 사이에 존재하는 의존성이 바람직할 때 두 요소가 느슨한 결합도 또는 약한 결합도를 가진다고 말함. 반대로 두 요소의 의존성이 바람직하지 못할 때 단단한 결합도 또는 강한 결합도를 가진다고 함.
-
인터페이스를 사용해서 의존성을 줄여줄 수 있다.