• 스프링
    • Java 기반의어플리케이션 개발을 위해 만들어진 프레임워크
      • Spring은 자바 기반의 애플리케이션을 개발하기 위한 다양한 기능과 라이브러리를 제공
    • 순수자바로의 개발과 비교하여 많은 부분을 사전에 구현 및 단순화 시켜 웹개발 편의 증대
      • 대표적 편의성
        • HTTP통신, reqeust data, response data 처리 편의증대
        • database연결 및 쿼리 실행 편의 증대
        • 보안(로그인관련security) 등의 편의 기능이 내장
  • 스프링부트
    • Springboot는 Spring기반의 어플리케이션을 쉽고 빠르게 구축할 수 있도록 도와주는 도구
    • Spring의 모든 기능을 포함하며, 추가적으로 더 쉽고 빠른 개발을 가능하게 하는 여러 도구와 기능을 제공
    • Spring 설정을 최소화하며 필요한 라이브러리 자동 구성(Auto-configuration, Starter 종속성 등)
    • SpringBoot는 환경세팅, 톰캣지원 등 개발자가 번거로운 설정 작업을 최소화하고, 애플리케이션의 구조를 간소화
    • spring에 비해 프로젝트 생성속도, 클라우드 환경에서의 유연성 등 많은 장점으로 인해 최신 프로젝트는 대부분 springboot기반의 프로젝트
  • 스프링부트 프로젝트 생성
    • https://start.spring.io에서 프로젝트 생성
      • 스프링 프레임워크와 Spring Boot 프로젝트를 생성하기 위한 공식적인 웹 서비스
    • 프로젝트 선택
      • Gradle Groovy 선택
      • Gradle
        • Gradle은 프로젝트 빌드, 의존성(종속성) 관리, 배포 등을 위한 자동화 도구
          • Java 빌드에 필요한 플러그인 설정 ex)build.gradle의 plugins코드
          • 외부라이브러리 및 모듈 등의 관리 ex)build.gradle의 dependencies
            • 이를 의존성(종속성) 관리라 함
          • jar파일과 같은 배포를 위한 압축파일 생성
      • Groovy
        • XML이나 특수한 DSL(Domain Specific Language)을 사용하는 대신, 그루비(Groovy)라는 스크립트 언어를 사용하여 빌드 스크립트를 정의
          • 예시) build.gradle 파일 작성의 문법 형식
    • Language
      • Java 17
    • Spring Boot
      • 3.5.x
      • snapshot은 실험적인 버전을 의미
    • Project 구조
      • Group
        • naver등 그룹이나 조직을 나타내는 name
        • 일반적으로 도메인 이름을 역순으로 사용. 예를 들어, com.naver
      • artifact
        • 예를 들어, first-web app 등 프로젝트의 실질적인 name으로 사용
        • 그룹 내에서 프로젝트를 고유하게 식별하는 데 사용
        • 프로젝트가 생성하는 JAR 파일의 이름에 사용
      • name
        • 프로젝트의 전체 이름. ArtifactId보다 더 설명적이고 친숙한 형태로 표현
        • main application 파일이름 결정
    • Dependecies
      • 사용할 외부 라이브러리 목록 정의
      • spring web
        • 웹 서비스를 위한 라이브러리로서 기본이 되는 라이브러리
      • Thymeleaf
        • spring에서 java코드가 더해진 html을 만들어주는 템플릿 엔진
      • 그외에는 프로젝트 작업 과정에서 지속적으로 추가할 예정
      • Dependencies 섹션
        • implementation
          • implementation 의존성은 컴파일 시점과 런타임 시점 모두에 필요한 라이브러리에 사용
          • 프로젝트 코드 내에서 직접 사용되는 라이브러리에 주로 사용
        • compileOnly
          • 컴파일 시에만 필요하고, 런타임 시에는 필요하지 않은 의존성을 선언
            • 예를 들어)컴파일 시 Lombok 어노테이션들(@Getter, @Setter 등)을 컴파일러에게 인식알리는것
          • gradle5이후로는 annotationprocessor 추가
            • annotationProcessor는 컴파일 시점에 어노테이션 프로세싱하는데 사용
        • runtimeOnly
          • 런타임 시에만 필요하고, 컴파일 시에는 필요하지 않은 의존성을 선언
          • 대표적으로 DB관련 의존성과 로그의존성
        • 컴파일 타임 의존성
          • 컴파일 타임 의존성은 소스 코드를 컴파일하는 데 필요한 라이브러리를 의미. 이러한 의존성은 소스 코드 내에서 직접 참조.
        • 런타임 의존성
          • 런타임 의존성은 애플리케이션이 실행될 때 필요한 라이브러리를 의미
            • 런타임 의존성은 소스 코드 내에서 직접적으로 참조되지 않을 수 있음.
            • 예를 들어, JDBC 드라이버는 일반적으로 소스 코드에 직접적으로 참조되지 않지만, 런타임에 데이터베이스 연결을 위해 필요
          • 컴파일의존성과 런타임의존성의 구분하는이유와 차이
            • 컴파일의존성은 소스코드를 class로 빌드할때 참조용으로 사용
            • 런타임 의존성은 일반적으로 빌드된 아티팩트에 포함
            • 성능 최적화, 배포크기 최소화를 위해 구분
    • Packaging
      • jar는 주로 springboot에서 사용
      • war는 서블릿/JSP 기반의 웹 애플리케이션에 사용되고, 기존의 legacy 스프링 프로젝트에서 많이 사용되는 구성요소를 지님
        • 사전 정의된 구조를 사용함 (WEB-INF, META-INF)
        • 별도의 웹서버(WEB) or 웹 컨테이너(WAS) 필요
    • Generate시 다운로드 폴더에 zip파일 다운로드
    • zip파일 압축 해제 후 intellij에서 build.gradle 파일 open
      • 최초 open시 build.gradle에 설정된 dependencies 관련 라이브러리 관련파일을 자동으로 download
  • 스프링부트 프로젝트 구조
    • .idea : intelliJ 툴 관련 설정 파일
    • main, test 폴더
      • main 폴더
      • test 폴더
      • 설정에서 Tree appearance -> compact Middle packages 체크해제를 통해 폴더구조 변경
    • build.gradle
    • gitignore
    • gradle관련
  • 스프링부트 프로젝트 실행