💻 개발/Springboot

[Springboot] 스프링 부트란?

개발새발. 2024. 3. 29. 16:22

🌱 스프링부트란?

 

1. 스프링(Spring) 정의

엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크

 

엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는
  • 스프링이 등장하기 이전에는 비즈니스 로직을 구현하는 기술 자체가 복잡하고 어려웠기 때문에 기술 자체에 대한 공부를 추가적으로 해야했다.
  • 그러나, 스프링은 이전 기술에 비해 사용 방법이 상대적으로 덜 복잡하다. 따라서, 개발 초기에 기본적인 설정과 적용시킬 기술들만 잘 선택을 해준다면, 기술보다는 애플리케이션의 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있다.

 

오픈소스

  • 스프링은 모든 사용자에게 무료로 열려 있다. 즉, 어떤 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발을 할 수 있으며, 필요하다면 스프링의 코드를 일부 수정하여 사용하여도 무관하다.
    이처럼 오픈소스로 프로젝트를 공개해 놓으면 여러 사람이 프로젝트의 코드를 사용해봄으로써 다양한 검증 과정을 거칠 수 있다는 장점이 있다.

 

경량급

  • 기존에 스프링 대신 사용하던 기술들과 비교하여, 스프링을 사용했을 때에 개발자가 작성해야 할 코드가 상대적으로 단순하다는 것을 뜻한다. 즉, 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야만 했던 불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있음을 의미한다.

 

애플리케이션 프레임워크

  • 웹 개발에 있어 프레임워크란, 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것을 의미한다. 애플리케이션 프레임워크는 애플리케이션을 개발하는 데에 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공한다.

 

2. 스프링과 스프링부트

  • 스프링을 더 쉽게 만들어주는 스프링부트

차이점 1. 구성의 차이

스프링은 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야 한다. 하지만 스프링 부트는 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드하므로 수동으로 개발 환경을 구성할 필요가 없다.

차이점 2. 내장 WAS의 유무

스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에서 배포된다. 하지만 스프링 부트는 WAS를 자체적으로 가지고 있기 때문에 jar 파일만 만들면 별도의 WAS 설정을 하지 않아도 애플리케이션을 실행할 수 있다.

  스프링 스프링부트
목적 엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기 스프링의 개발을 더 빠르고 쉽게 하기
설정 파일 개발자가 수동으로 구성 자동 구성
XML 일부 파일은 XML로 직접 생성하고 관리 사용하지 않음
인메모리 데이터베이스 지원 지원하지 않음 인메모리 데이터베이스 자동 설정 지원
서버 프로젝트를 띄우는 서버 (예: 톰캣, 제티)를 별도로 수동 설정 내장형 서버를 제공해 별도의 설정이 필요 없음

 

 

3. 스프링의 특징

3-1. IoC (Inversion of Control, 제어의 역전)

  • Java는 객체지향 언어이므로, 객체들 간의 관계를 적절히 맺어주는 것이 중요하다. A 인스턴스가 B 인스턴스의 메서드를 호출하고 있다면 A는 B와 의존 관계를 맺은 것이 되며, 이 둘의 관계를 “A가 B에 의존하는 관계”라고 표현할 수 있다.
public class A {
    public void methodOfA() {
        B b = new B(); //클래스 A에서 new 키워드로 클래스 B의 객체 생성
        b.example();
    }
}

public class B {
    public void example() {
        ...
    }
}
  • 제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다.
    위 예제에 제어의 역전을 적용하면 다음과 같이 코드의 형태가 바뀐다.
  • 이전과는 다르게 클래스 B 객체를 직접 생성하는 것이 아니므로 어딘가에서 받아와 사용하고 있다고 추측이 가능하다. 실제로 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 한다.
public class A { 
	private B b; //코드에서 객체를 생성하지 않음. 어디선가 받아온 객체를 b에 할당 
    
    public void methodOfA() { 
    	b.example(); 
    } 
}

public class B {
	public void example() {
		...
	}
}

 

 

3-2. DI (Dependency Injection , 의존성 주입)

  • 앞서 말한 것처럼 스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용한다. 그리고 제어의 역전을 구현하기 위해 사용하는 방법이 DI이다.
// 1. A가 사용하는 메서드를 인터페이스 I의 추상메서드로 정의한다. (추상화)
interface I {
    void example();
}

public class A {
    // 3. 인터페이스 타입의 필드를 신언하고,
    private I i;

    // 4. 생성자를 통해 외부로부터 인스턴스를 받아와 i를 초기화해준다. (다형성) -> A에서 I를 주입받음
    @Autowired
    public A(I i) {
        this.i = i;
    }

    public void methodOfA() {
        // 5. 외부로부터 받아온 인스턴스의 메서드를 호출한다.
        i.example();
    }
}

// 2. A가 사용하는 메서드를 가진 객체들이 I를 구현하도록 한다.
public class B implements I {
    public void example() {
        ...
    }
}

public class C implements I {
    public void example() {
        ...
    }
}

 

주의

위 코드 실제로 돌리면 구현 클래스 2개라서 Exception 발생함 🥲

@Quailifier 나 @Resource 어노테이션으로 어떤 메서드 쓸 지 정해줘야하는데, 단순 DI 설명을 위한 예제이므로 그냥 스킵

 

 

3-3.  AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)

  • 프로그래밍에 대한 관심을 핵심 관심 사항, 공통 관심 사항으로 나누어서 관심 기준으로 모듈화하는 것을 의미한다.
  • 즉, 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)라고 한다.
  • ex) 커피 주문
    • 핵심 관심 : 메뉴 등록하기, 주문하기, 주문 변경하기 등
    • 공통 관심 : 로깅, 보안, DB 연결 등
public class OrderCoffee {
    public void 주문하기() {
        // 공통 관심 사항
        로깅 관련 코드
        보안 관련 코드

        // 핵심 관심 사항
        주문 관련 비즈니스 로직
    }
    public void 주문_변경하기() {
        // 공통 관심 사항
        로깅 관련 코드
        보안 관련 코드

        // 핵심 관심 사항
        주문 변경 관련 비즈니스 로직
    }
    public void 메뉴_등록하기() {
        // 공통 관심 사항
        로깅 관련 코드
        보안 관련 코드

        // 핵심 관심 사항
        메뉴 등록 비즈니스 로직
    }
}
  • 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  • 변경이 필요하면 공통 로직만 변경하면 된다.
  • 원하는 적용 대상을 선택할 수 있다.

 

3-4. PSA (Portable Service Abstraction, 이식 가능한 서비스 추상화)

  • 만약, MySQL을 사용하여 개발을 완료했는데, Oracle DB로 데이터베이스를 바꿔야 하는 상황을 가정해보자.
    이 때, 각 데이터베이스마다 사용 방법이 다르다면 아마 기존에 작성한 코드를 전부 지우고 새로 작성해야 하거나, 기존 데이터베이스와 새로운 데이터베이스 간에 사용 방법이 다른 코드를 모두 찾아서 일일이 수정해주어야 할 것이다.
  • 그러나, 스프링을 사용하면 동일한 사용방법을 유지한 채로 데이터베이스를 바꿀 수 있다. 이는 스프링이 데이터베이스 서비스를 추상화한 인터페이스를 제공 해주기 때문에 가능하다.
    즉, 스프링은 Java를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스를 제공하고 있으며, 이를 JDBC(Java DataBase Connectivity)라고 한다.
    이러한 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 한 것 을 PSA(Portable Service Abstraction, 일관된 서비스 추상화)라고 한다.

'💻 개발 > Springboot' 카테고리의 다른 글

[Springboot] Springboot 로 Rest API 만들기  (0) 2024.04.12