백엔드 데브코스 TIL 11일차

Inchang Choi·2022년 4월 3일
0
post-thumbnail

학습목표

강의를 들으며 내가 알고 있는 내용을 점검하고,

새로 배운 내용을 정리하며,

궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다.

스프링 프로젝트 생성 및 환경 설정

Build Tool

  • Maven
  • Gradle

빌드 툴은 프로젝트를 실행 하는 과정을 자동화 해줍니다.

Build Tool 동작 순서

  1. 필요한 라이브러리를 다운 받고 classpath에 추가합니다.
  2. 소스코드를 컴파일 하고 그 후 테스트를 실행합니다.
  3. 컴파일된 코드를 packaing 합니다. (jar , war)
  4. packing 된 파일을 주로 artifacts라 부르고 서버나 repo에 배포합니다.

Maven

자바 기반 프로젝트에서 많이 사용되는 빌드 툴입니다.

XML 기반의 빌드 스크립트로 설정 모델을 제공하고 pom.xml 파일로 작성할 수 있습니다.

Maven의 특징

  • 프로젝트 템플릿을 제공하여 매번 같은 설정을 반복하지 않게 해주며
  • 프로젝트에 사용하는 외부 라이브러리인 의존성을 관리 해줍니다.
  • 플러그인과 외부 라이브러리를 분리하여 관리합니다.
  • 의존성을 다운받는 Repository는 로컬이 될 수도 있고, 공개된 Repository 일 수도 있습니다.
  • 여러개의 서브모듈(Multiple module)로 다수의 프로젝트를 구성할 수 있습니다.
  • Maven의 Lifecycle에서 Maven이 default로 가지고 있는 여러 명령어를 사용 할 수 있습니다.

pom.xml

pom에 의해서 프로젝트에 대한 description을 정의하면 Maven이 build 해줍니다.

Maven coordinates는 특정 프로젝트를 식별하는 역할을 합니다.

  • : 회사나 단체
  • : 프로젝트 이름
  • : 프로젝트의 버전

Dependency Scope

  • compile : 기본값이며, 프로젝트의 컴파일 테스트, 실행에 라이브러리가 필요할 때 사용됩니다.
  • provided : 일반적으로 JDK 또는 컨테이너가 해당 라이브러리를 제공 할 때 설정합니다. 웹 어플리케이션의 경우 JSP와 Servlet API등이 이에 해당됩니다.
  • runtime : 실행과 테스트 시 필요할 때 사용됩니다. JDBC 드라이버가 이에 해당됩니다.
  • test : 실행에는 사용하지 않으나, 테스트 컴파일 및 실행 시 필요할 때 설정합니다. 대표적인 예로 easymock, junit등이 있습니다.
  • system : provided 의존성과 비슷하지만 사용자가 jar 파일의 위치를 지정한다는 점이 다른 점입니다. system 의존성을 사용하기 위해서는 엘리먼트를 이용하여 jar 파일의 위치를 지정해야합니다. 그러나 사용자 마다 개발 환경이 다를 수 있으므로 프로퍼티를 이용하여 jar 파일의 위치를 지정하는 것이 좋습니다.

Transitive Dependencies

Transitive Dependencies란 의존성의 의존성을 말합니다.

만약 a가 b를 참조하고, b가 c를 참조하면, a는 c를 transitive 의존성으로 간주합니다.

이러한 경우 maven은 의존성 트리를 구성하여 동일한 groupId와 artifactId에서는 가장 최신의 version 정보를 사용하게 됩니다.

이러한 기능은 버전 간 충돌이나 라이브러리간 충돌의 문제를 야기할 수 있습니다.

Gradle

Gradle은 Groovy, Kotlin 기반으로 빌드 스크립트를 작성하여 사용하는 빌드 툴입니다.

Project & task

Gradle build도 하나 이상의 프로젝트를 구성할 수 있습니다.

하나의 프로젝트는 하나 이상의 task로 구성 됩니다.

Task는 클래스를 컴파일하거나 jar를 생성하거나 하는 빌드를 위한 작업입니다.

이러한 태스크는 직접 만들 수도 있지만 일반적으로는 플러그인에 의해 제공됩니다.

Plugin

Gradle에 실제 Task와 주요한 기능을 추가하게 해줍니다.

플러그인을 추가하면 새로운 Task가 추가 되고, 도메인 객체나 특정 컨벤션들이 추가됩니다.

Spring

Spring Fremework의 역사

2002년 Rod Johnson이 발행한 Expert One-to-One :J2EE Design and Development에서 Spring의 역사를 찾아 볼 수 있습니다.

책에서는 EJB의 어려움을 어떻게 극복하는지에 대해서 설명하였습니다.

그 후 Juergen Hoeller가 이러한 기술을 오픈소스화 시키자고 하며 기나긴 “J2EE“의 겨울을 끝내고 “Spring” 이라는 이름의 봄이 온다는 의미를 담아 이름 지었습니다.

Spring projets

Spring은 여러 프로젝트로 구성되어 있는 자바 기반의 프로그래밍에 있어 방대한 기능을 제공하는 Framework입니다.

스프링에는 스프링 프레임워크를 비롯한 다양한 프로젝트들이 있으며, 실제로 웹 어플리케이션 등을 개발할 때에는 스프링 프레임워크 단독으로 사용하기 보다는 여러 스프링 관련 프로젝트와 함께 개발합니다.

자주 사용되는 프로젝트는 아래와 같습니다.

  • Spring Boot
  • Spring Data
  • Spring Security
  • Spring Cloud

이런 여러 프로젝트들은 Spring Framework와 의존 관계를 가집니다.

Spring Boot

이 중 스프링 부트는 컴퓨터를 부팅한다는 의미처럼 스프링을 사용할 있도록 사용 가능한 상태로 만들어 줍니다.

스프링 부트의 대표적인 기능은 아래와 같습니다.

  • SpringApplication을 통한 쉬운 실행
  • Auto Configuration
  • 쉬운 외부 환경 설정 (Properties, YAML, Command Line 설정 등)
  • 프로파일을 통한 실행 환경 관리
  • Packaging Executable jar
  • Developer Tools

스프링 프레임워크 핵심 기술

이러한 기술들에 대해 이해 해야합니다.

  • Spring IoC 컨테이너와 Beans
  • 리소스 핸들링 (Resource와 ResourceLoader)
  • Validation과 DataBinding, Type Casting
  • 스프링 expression 언어
  • AOP
  • Null-safety
  • 데이터 버퍼와 코덱
  • 로깅

의존성 관리

스프링의 IoC 컨테이너, DI를 다루기에 앞서 의존성에 대해서 살펴 보겠습니다.

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

  • compile time dependency : 코드를 작성하는 시점에 발생하는 클래스 사이의 의존성
  • runtime dependency : 애플리케이션이 실행 되는 시점에 만들어지는 객체 사이의 의존성

Domain Driven Design

Entity

엔티티는 다른 엔티티와 구별할 수 있는 식별자를 가지고 있고,

시간에 흐름에 따라 지속적으로 변경이 되는 객체입니다.

  • Value Object 값 객체는 각 속성이 개별적으로 변화하지 않고 값 그 자체로 고유한 불변 객체입니다.
profile
always positive

0개의 댓글