SpringBoot

[SpringBoot] Spring Boot

wwxs 2024. 10. 14. 09:08

빌드 도구

  • 소스 코드에서 애플리케이션 생성을 자동화 하기 위한 프로그램
  • 코드를 사용 | 실행 가능한 형태로 컴파일, 코드 패키징, 테스트 실행 등을 포함

 

빌드 도구의 종류

  • Maven VS Gradle
  • 1) Maven : 고정적이고 선형적인 단계의 모델을 기반
  • 2) Gradle : 작업 의존성 그래프를 기반

차이점

  • Gradle이 Maven에 비해 가독성이 높고 설정이 간단
  • Gradle이 빌드와 테스트 속도가 더 빠르다

Spring Boot

bulid.gradle 수정

더보기
plugins {
    id 'java'
    // 프로젝트에 사용할 스프링부트 플러그인 | 스프링의 의존성을 자동 관리하는 플러그인
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'org.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '17'  // 자바 소스 컴파일 버전

repositories {
    // 의존성을 받을 저장소 지정
    mavenCentral()
}

dependencies {
    // 프로젝트 개발에 필요한 기능인 의존성을 입력
    // : 스프링부트 웹 관련 기능 제공 | 테스트 기능을 제공
    implementation('org.springframework.boot:spring-boot-starter-web')
    testImplementation('org.springframework.boot:spring-boot-starter-test')

    // 스프링 데이터 JPA
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')

    // 데이터베이스 h2 사용
    runtimeOnly('com.h2database:h2')

    // 반복 메서드 작성 작업을 줄여주는 라이브러리
    compileOnly('org.projectlombok:lombok')
    annotationProcessor('org.projectlombok:lombok')
}

test {
    useJUnitPlatform()
}

 

기본 실행 환경

더보기
package org.example.springbootdeveloper;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootDeveloperApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDeveloperApplication.class, args);
    }
}

 

Postman

더보기

API란?

  • 사용자와 서버가 통신을 하기 위한 인터페이스
  • open API: 누구나 사용할 수 있도록 공개된 API
  • REST API: 주로 HTTP를 사용해 서버-클라이언트 간에 데이터를 주고 받을수 있는 API

 

스프링 (프레임워크) VS 스프링부트

 

1. 스프링(프레임워크)

  • 대규모의 복잡한 데이터 관리를 대비하기 위한 서버 성능, 안정성, 보안을 제공하는 도구

2. 스프링부트

  • 빌드 구성을 단순화하는 스프링 부트 스타터를 제공
  • XML 설정을 하지 않고도 자바 코드로 작성이 가능
  • JAR를 이용하여 자바 옵션만으로 배포 가능

스프링과 스프링부트의 차이

  • 1) 구성의 차이
    • 스프링 코어 | 스프링 MVC에 있는 기능을 자동 로드 (수동 환경 구성 X)
  • 2) 내장 WAS의 유무
    • 스프링부트는 WAS를 자체적으로 가진다
    • jar 파일만 생성하면 별도로 WAS를 설정하지 않아도 애플리케이션 실행이 가능

 

IoC_ DI (중요!!)

 

1. 제어의 역전 (IoC; Inversion of Control)

  • 프로그램의 제어 흐름을 개발자가 아닌 외부 컨테이너에 위임하는 방식
  • 제어의 권한이 컨테이너에게 넘어가 객체의 생명 주기를 컨테이너가 관리
더보기

cf) 전통적인 프로그래밍

  • 개발자가 객체의 생성부터 소멸까지 직접 제어
class Book {
    private String title;

    public Book(String title){
        this.title = title;
    }

    public String getTitle(){
        return this.title;
    }
}

// 전통적인 자바 코드 방식: 객체의 생성과 관리를 개발자가 직접 정의
class BookStore1 {
    private Book book;

    public BookStore1 () {
        // 개발자가 직접 Book 객체를 생성
        this.book = new Book("Java 기초");
    }

    public void displayBook() {
        System.out.println("Book: " + book.getTitle());
    }
}

public class e_IoC_DI {
    public static void main(String[] args) {
        BookStore1 store1 = new BookStore1();
        store1.displayBook();
    }

 

 

제어의 역전 (IoC)

@Component
class Book2 {
    private String title;

    public Book2() {
        // 스프링 컨테이너가 객체를 생성하고 설정을 관리
        this.title = "스프링 기초";
    }
    public String getTitle() {
        return this.title;
    }

}

@Component
class BookStore2 {
    private Book2 book;

    @Autowired
    public BookStore2(Book2 book) {
        // 스프링 컨테이너가 Book2 객체를 주입
        this.book = book;
    }

    public void displayBook() {
        System.out.println("Book2: " + book.getTitle());
    }
}

public class e_IoC_DI {
    public static void main(String[] args) {

    }
}
 @SpringBootApplication
public class SpringBootDeveloperApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDeveloperApplication.class, args);
    }
 
 @Bean
    public CommandLineRunner run(ApplicationContext ctx) {
        return args -> {
            BookStore2 store2 = ctx.getBean(BookStore2.class);
            store2.displayBook();
        }
    }
}

 

 

2. 의존성 주입 (DI; Dependency Injection)

  • 제어의 역전을 구현하기 위해 사용하는 방법 -> 어떤 클래스가 다른 클래스에 의존한다
  • 객체 간의 결합도를 낮추고, 유연성과 재사용성을 높이며 코드의 테스트가 용이
  • 생성자 주입, 필드 주입, 세터 주입 등의 방식으로 이루어짐
더보기
 public class A {
        @Autowired  
        // 스프링 컨테이너에 있는 '빈' 이라는 것을 주입하는 역할
        // cf) 빈(Bean - 콩)
        //		: 스프링 컨테이너에서 관리하는 객체
        B b;
    }

 

 

스프링 컨테이너(Spring Container)

  • 애플리케이션 내에서 객체(빈)의 생명 주기와 설정을 관리
  • 애플리케이션을 구성하는 빈들을 생성, 조립, 관리
  • 이를 통해 제어의 역전(IoC)을 실현
  • 의존성 주입(DI)를 지원

 

빈(Bean)

  • 스프링 컨테이너가 관리하는 객체를 의미
  • 개발자에 의해 명시적으로 정의 | 스프링에 의해 자동으로 감지되어 관리
  • 주로 서비스, 리포지토리, 컨트롤러 등의 역할을 수행하는 컴포넌트로 사용
  • 선언방법 : XML 파일 사용, 애너테이션 사용(@Component, @Service, @Repository 등), 자바 설정 클래스에서 @Bean 애너테이션 사용으로 선언 가능

 

관점 지향 프로그래밍 (AOP; Aspect Oriented Programming)

  • 애플리케이션의 핵심 로직과 공통적인 관심사를 분리하여 관리하는 기법
  • 모듈화를 지향
  • 로그, 보안, 트랜잭션 관리와 같은 공통적인 관심사를 핵심 비즈니스 로직과 분리하여 유지보수성과 코드 가독성을 향상

 

이식 가능한 서비스 추상화(PSA; Portable Service Abstraction)

  • 특정 기술에 의존하지 않고 다양한 환경에서도 동일하게 동작할 수 있는 스프링의 추상화
  • 어떤 기술을 사용하든 일관된 방식으로 DB에 접근하도록 인터페이스를 지원

 

스프링부트 스타터

  • 1) spring-boot-starter-web : Spring MVC를 사용하여 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음
  • 2) spring-boot-starter-test : 스프링 애플리케이션의 테스트를 위한 의존성 모음
  • 3) validation : 유효성 검사
  • 4) actuator : 모니터링을 위한
  • 5) data-jap : ORM을 사용하기 위한 인터페이스 모음인 JPA를 쉽게하기 위함

 

스프링부트의 구조

  • 클라이언트 - Controller - Service - Repository - 데이터베이스

1) 프레젠테이션(Presentation) 계층

  • 컨트롤러(Controller)
  • HTTP 요청을 받고 해당 요청을 비즈니스 계층으로 전송하는 역할

2. 비즈니스(Business) 계층

  • 서비스(Service)
  • 모든 비즈니스 로직을 처리
  • 비즈니스 로직: 서비스를 만족하기 위한 로직, 웹 사이트에서 벌어지는 모든 작업

3. 퍼시스턴스(Persistence) 계층

  • 리포지토리(Repository)
  • 모든 데이터베이스 관련 로직을 처리
  • DB에 접근하는 DAO 객체를 사용 가능
  • DAO: 데이터베이스와 상호작용을 위한 객체

 

'SpringBoot' 카테고리의 다른 글

[SpringBoot] JpaRepository  (0) 2024.10.17
[SpringBoot] ORM, JPA  (0) 2024.10.16
[SpringBoot] 테스트 코드  (0) 2024.10.16
[SpringBoot] DispatchServlet  (0) 2024.10.14
[SpringBoot] 기본 예제 코드  (0) 2024.10.14