Java Spring - Spring 시작하기.

김재현·2022년 7월 18일
0

Programmers

목록 보기
1/28

Build Tool

Build

  • 필요한 라이브러리를 다운받고 classpath에 추가함.
  • 소스코드를 compile한다.
  • 테스트를 실행한다.
  • 컴파일된 코드를 packing해서 jar / war / zip 등으로 만든다.
    packing된 파일은 artifacts라고 부름.
  • 서버나 레파지토리에 배포한다.

종류

  • Maven
  • Gradle

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을 사용하는 방법

  1. Maven / Gradle으로 프로젝트를 만들고 pom.xml이나 build.gradle을 직접 수정함.
  2. Spring Boot 사용
  • Spring Boot CLI를 이용.
  • Spring Initializer

Spring Boot CLI

  • 설치.
  1. Manual Installation
    참고 블로그

  2. 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
  1. Java Spring Boot 다운로드 끝
    아, Windows Scoop Installation 란에 Scoop관련 내용도 있다.
  • 설치가 끝났다면 실행을 해보자
  1. PowerShell을 관리자 권한으로 실행한다.
  2. spring이라는 명령어를 넣는다.
    spring에서 사용할 수 있는 명령어들이 출력된다.
  3. shell 사용 후 init을 사용하면

    압축파일이 생성된다.
  4. 조건을 넣어서 만들수도 있다.

    spring init --build maven -j 17 -g org.prgms -a kdt-spring-demo -n kdt-spring-demo

  • 생성하면, kdt-spring-demo.zip가 생성된다.
  1. -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를 속성으로 갖는 경우가 많음.
  • 스프링은 자바기반 어플리케이션을 만들기때문에 여러 객체들을 만들게되고 그 객체들의 관계를 갖고 어플리케이션을 구성하게 됨.
    객체들이 서로 협력할 때마다 객체들끼리 필요할 때가 있음.
  • 의존성이 형성되는 것.

의존성 관리

의존성이란?

어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이의 의존성이 존재하게 됨. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다.

  • 컴파일타임 의존성 : 코드를 작성하는 시점에서 발생하는 의존성. 클래스 사이의 의존성.
  • 런타임 의존성 : 애플리케이션이 실행되는 시점의 의존성. 객체 사이의 의존성.

결합도

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

  • 어떤 두 요소 사이에 존재하는 의존성이 바람직할 때 두 요소가 느슨한 결합도 또는 약한 결합도를 가진다고 말함. 반대로 두 요소의 의존성이 바람직하지 못할 때 단단한 결합도 또는 강한 결합도를 가진다고 함.

  • 인터페이스를 사용해서 의존성을 줄여줄 수 있다.

0개의 댓글