Introduction to Spring Boot - 1

SangYeon Min·2024년 3월 6일

STUDY-SPRING-BOOT

목록 보기
1/8
post-thumbnail

Introduction to Spring

Provides core support for dependency injection, transaction management, web app, data access, messaging and more.

Java Standard Edition 일반적인 로컬 응용 프로그램 개발을 위한 API
Java Enterprise Edition 분산형, 기업형 응용 프로그램 개발을 위한 API
Spring Java EE의 위치를 대신하게 되었음, Spring으로 Java EE를 개발

MVC Model-View-Controller, Transaction, Auth를 공부하기 위해
DI, AOP, Servlet Filter를 이해하여야 한다

느슨한 결합력과 인터페이스

UI <> Service <> DAO <> DB

Service에서 사용하는 자료형은 Interface로 처리하고, 객체 생성과 조립을 위한 외부 설정을 따로 설정하고 DI를 통해서 느슨하게 결합

Dependency Injection

Spring Framework 코어 기능 : 종속 객체를 생성 조립해주는 도구

// Composition has A
class A
{
	private B b;
    
    public A(){
    	// Dependency
    	b = new B();
    }
}

// Association has A
class A
{
	private B b;
    
    // public A(){
    //	 b = new B();
    // }
    
    public void setB(B b){
    	// Association
    	this.b = b;
    }
}

프로그램을 만들 때 조립형 프로그램이 더 사용하기 수월하다

// Composition has A
// 완성형으로 사용할 수 있도록 해주는 것
A a = new A();
// Association has A
// Dependency
B b = new B();
A a = new A();

// Injection
// 조립형으로 사용할 수 있도록 해주는 것
a.setB(b);

DI를 위한 방법에는 Setter Injection, Constuction Injection 두 가지 방법이 있다.

// Setter Injection
B b = new B();
A a = new A();

a.setB(b);

// Constuction Injection
B b = new B();
A a = new A(b);

조립형의 조립을 해주어야 한다는 단점을 해결한 것이 바로 Spring
Spring의 가장 기본적인 기능 중에 하나가 DI

Inversion of Container Container

Spring의 DI 능력을 활용하기 위해서는 부품들을 주문서에 입력해서 Spring에 제공해야 한다
Container Spring 또한 주문서에 있는 객체들을 생성해서 담을 공간

  1. 주문서에 부품을 생성해달라고 요청하면 부품을 생성한다
    1-1. 작은 부품 생성
    1-2. 큰 부품 생성
    1-3. 부품 조립
  2. 부품 여러개를 조립해서 담아두고, 생성하고, 더 큰 단위로 합친다

결합되어야 하는 부품들은 크기가 작은 순서대로 역순으로 만들어진다
즉, Inversion of Control

IoC Container 단순히 부품을 담고 있는 공간이 아닌 결합까지 이루어지는 공간

Dependency 수동 Injection

// Exam.java
package spring.di.entitiy;

public interface Exam{
	int total();
    float avg();
}

// newLecExam.java
package spring.di.entitiy;

public class newLecExam implements Exam{

	private int kor;
    private int eng;
    private int math;
    private int com;
    
	@Override
	public int total(){
    	return kor + eng + math + com;
    }
    
    @Override
    public float avg(){
    	return total() / 4.0f;
    }
}
// ExamConsole.java
package spring.di.ui;

public interface ExamConsole{
	void print();
}

// inlineExamConsole.java
package spring.di.ui;
import spring.di.entity.Exam;

public class inlineExamConsole implements ExamConsole{
	private Exam exam;
    
    public inlineExamConsole(Exam exam){
        this.exam = exam;
    }
    
    @Override
    public void print(){
    	System.out.printf("Total is %d, AVG is %f \n", exam.total(), exam.avg());
    }
}

// gridExamConsole.java
package spring.di.ui;
import spring.di.entity.Exam;

public class gridExamConsole implements ExamConsole{
	private Exam exam;
    
    public gridExamConsole(Exam exam){
        this.exam = exam;
    }
    
    @Override
    public void print(){
    	System.out.println("┌─────────┬─────────┐");
		System.out.println("│  total  │   avg │");
		System.out.println("├─────────┼─────────┤");
 		System.out.printf( "│   %3d   │  %3.2f │\n",exam.total(),exam.avg());
		System.out.println("└─────────┴─────────┘");
    }
}
// Program.java
package spring.di;

public class Program {
	public static void main(String[] args) {
    	Exam exam = new newLecExam();
        
        // inlineExamConsole 객체가 exam을 조립하고 있다
        // Dependency Injection
        ExamConsole console = new inlineExamConsole(exam);
        
        // 만약 gridExamConsole이 추가되었다면 코드 수정없이 변경이 불가하다
        // 가능하려면 코드가 아닌 외부 설정으로 빼야한다
        ExamConsole console = new gridExamConsole(exam);
        
        // 코드를 빼고, Spring이 대신 결합하게 만들어줄 것이다
        ExamConsole console = ?;
        
        console.print()
    }
}

AOP

Aspect Oriented Programming, OOP를 보완하는 수단으로 여러 곳에 쓰이는 공통 기능을 모듈화하여 필요한 곳에 연결하여 유지보수, 재사용성을 높이는 것
기존 프로젝트에 다양한 기능을 로직 수정 없이 추가할 수 있음

Proxy 디자인 패턴, 핵심 및 부가적인 관점, Croisscutting Concerns (흩어진 관심사) 등과 연관이 있음

Spring Modules

Spring 프레임워크에는 다양한 기능 존재, 약 20개의 모듈로 구성됨
JDBC, MVC, AOP, ORM, Test, Spring Expression Language(SpEL)

Spring vs Spring Boot

Spring과 Spring Boot는 모두 스프링 프레임워크를 기반으로 한 자바 웹 개발 프레임워크
Spring은 스프링 프레임워크의 핵심 모듈을 모아서 만든 프레임워크
Spring에서는 개발자가 직접 설정 파일을 작성하여 스프링 컨테이너를 구성하고, 필요한 Bean 객체를 등록하고, Bean 객체 간의 의존성을 설정
Spring Boot는 스프링 프레임워크를 보다 쉽게 사용할 수 있도록 만든 프레임워크
Spring Boot에서는 개발자가 설정 파일을 작성할 필요 없이, 프로젝트의 설정과 라이브러리 의존성을 자동으로 처리해주는 기능을 제공
https://www.inflearn.com/blogs/3315

Spring은 스프링 프레임워크를 보다 세밀하게 제어하고자 하는 경우에, Spring Boot는 빠르고 간단하게 스프링 애플리케이션을 개발하고자 하는 경우에 사용

SpringBoot

AutoConfiguration 기능을 지원, Starter 프로젝트를 제공
자동으로 호한되는 Dependency 버전을 관리
모니터링 관리를 위한 Spring Actuator 제공


Maven, Gradle

빌드 관리 도구 : 프로젝트에 필요한 파일들을 자동으로 인식하여 빌드

Maven

Java의 대표적인 관리 도구였던 Ant를 대체하기 위해 개발
프로젝트 외부 라이브러리를 쉽게 참조할 수 있게 pom.xml 파일로 관리

기존 Ant는 빌드의 기능만을 가지고 있음
자동으로 라이브러리를 관리해주는 기능이 추가된 Maven을 사용
다운받아 사용하던 라이브러리에 변동 사항이 있으면 자동 업데이트, 적용

pom.xml 프로젝트 정보 관리, 외부 라이브러리, 빌드관련 설정

Gradle

Groovy 스크립트를 활용한 빌드 관리 도구
안드로이드 프로젝트 표준 빌드 시스템, 멀티 프로젝트 빌드 최적화
Maven에 비해 더 빠른 처리속도, 더 간결한 구성
Gradle은 설치 없이 사용할 수 있다 (Gradle Wrapper)

Maven에 비해 Gradle이 대규모 프로젝트에서의 성능이 좋음
하지만 기존의 프로젝트들이 Maven으로 작성되어 현재까지 실무에서 변환은 어렵다


Design Patterns

특정 문맥에서 공통적으로 발생하는 문제에 대한 재사용 가능 해결책
Gang of Four에서 제시한 23개의 패턴이 있음
목적에 따른 분류로 생성, 구조, 행동 3가지로 구분됨
각 패턴이 어떤 작업을 위해 생성되는 것인지에 따른 구분

생성 패턴

Abstract Factory 구체적인 클래스 지정x, 인터페이스를 통해 연관되는 객체 묶어줌
Builder 객체의 생성과 표현을 분리하여 객체 생성
Factory Method 객체 생성을 서브 클래스로 분리하여 위임 (Encapsulate)
Prototype 원본 객체를 복사하여 객체 생성 (Clone)
Singleton 한 클래스마다 인스턴스를 하나만 생성하여 어디서든 참조

구조 패턴

Adapter 클래스의 인터페이스를 어떤 클래스에서든 이용할 수 있도록 변환
Bridge 구현부에서 추상층을 분리하여 각자 독립적으로 변형, 확장
Composite 객체들의 관계를 트리 구조로 구성하여 표현, 복합 혹은 단일 객체 구분x
Decorator 주어진 상황에 따라 객체에 다른 객체 덧붙임
Facade 서브 시스템에 있는 인터페이스 집합에 대해 통합된 인터페이스 제공
Flyweight 크기가 작은 여러 객체를 매번 생성x, 최대한 공유하여 메모리 절약
Proxy 실제 기능을 수행하는 객체 대신 가상 객체 사용해 로직 흐름 제어

행동 패턴

반복적으로 사용되는 객체들의 커뮤니케이션 패턴화
객체 사이에 알고리즘 또는 책임을 분배하는 방법에 대해 정의
결합도를 최소화하는 것이 주 목적

Interpreter 특정 언어의 문법 표현을 정리
Strategy 동일 계열의 알고리즘군을 정의하고 캡슐화하여 상호 교환 가능


REST API

REST 아키텍처의 조건을 준수하는 API, HTTP 표준을 따르고 있어 여러 Lang으로 구현 가능

API

Application Programming Interface 응용 프로그램에서 사용할 수 있도록 다른 응용 프로그램을 제어할 수 있게 만든 인터페이스
Interface 어떤 장치간 정보를 교환하기 위한 수단이나 방법

REST

REpresentational State Transfer 자원의 이름으로 구분하여 자원의 상태 교환
HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 자원을 교환하는 것

Server-Client 구조, Stateless, Cacheable
Layered System 클라이언트는 서버의 구성과 상관없이 REST API 요청
Code on Demand 요청을 받으면 서버에서 클라이언트로 코드를 전달, CLI 기능 확장
Unifor Interface HTTP Protocol을 따르는 모든 플랫폼에서 사용 가능하게끔 설계

Rules

웹 기반의 REST API를 설계할 경우에는 URI를 통해 자원을 표현해야 함
자원에 대한 조작은 HTTP Method (CRUD)를 통해 표현해야 함
메세지를 통한 리소스 조작, URI는 소문자 사용, -을 통해 가독성 높임, 확장자 표현x


자료 출처
https://www.youtube.com/@around.hub.studio
https://www.youtube.com/@newlec1

0개의 댓글