Backend
home
🖖🏻

스프링부트 시작하기

생성 일시
2025/01/22 06:16
태그
SpringBoot
게시일
2025/01/22
최종 편집 일시
2025/02/09 13:26

스프링 부트의 주요 특징과 스프링과의 차이점

SpringBoot
톰캣, 제티, 언더토우 같은 웹 애플리케이션 서버(web application server, WAS)가 내장되어 있어서 따로 설치를 하지 않아도 독립적으로 실행할 수 있음
빌드 구성을 단순화하는 스프링 부트 스타터를 제공
XML 설정을 하지 않고 자바 코드로 모두 작성할 수 있음
JAR를 이용해서 자바 옵션만으로도 배포가 가능
애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터(spring actuator)를 제공
스프링 부트는 스프링에 속한 도구
Spring과의 차이점
구성의 차이
스프링은 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야 함
하지만 스프링 부트는 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드하므로 수동으로 개발 환경을 구성할 필요가 없음
내장 WAS의 유무
스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에서 배포됨 (WAS란 간단히 웹 어플리케이션을 실행하기 위한 장치)
스프링 부트는 WAS를 자체적으로 가지고 있음. 그래서 jar 파일만 만들면 별도로 WAS를 설정하지 않아도 애플리케이션을 실행할 수 있음
스프링 부트의 내장 WAS에는 톰캣, 제티, 언더토우가 있어서 상황에 필요한 WAS를 선택할 수 있음
스프링
스프링 부트
목적
엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기
스프링의 개발을 더 빠르고 쉽게 하기
설정 파일
개발자가 수동으로 구성
자동 구성
XML
일부 파일은 XML로 직접 생성하고 관리
사용하지 않음
인메모리 데이터베이스 지원
지원하지 않음
인메모리 데이터베이스 자동 설정 지원(H2 Database)
서버
프로젝트를 띄우는 서버(ex: 톰캣, 제티)를 별도로 수동 설정
내장형 서버를 제공해 별도의 설정이 필요 없음

스프링 개념

IoC란? - Inversion of Control을 줄인 표현
직역하면 제어의 역전
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아닌 외부에서 관리하는 객체를 가져와 사용하는 것을 의미함
이전과는 다르게 클래스 B 객체를 직접 생성하는 것이 아니므로, 어딘가에서 받아와 사용하고 있다고 추측할 수 있음
예시
클래스 A 에서 클래스 B 객체 생성
public class A { b = new B(); }
Java
복사
스프링 컨테이너가 객체를 관리하는 방식 - 코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당
public class A { private B b; }
Java
복사
DI란?
스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용
제어의 역전을 구현하기 위해 사용하는 방법이 DI(Dependency Injection) 임 ⇒ 의존성 주입
DI는 어떤 클래스가 다른 클래스에 의존한다는 의미
예시
// 객체를 주입받는 모습 public class A { // A에서 B를 주입받음 @AutoWired B b; }
Java
복사
여기서 @AutoWired라는 애너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 함. 빈은 쉽게 말해 스프링 컨테이너에서 관리하는 객체를 뜻함 이전 코드에서는 개발자가 직접 B 객체를 생성했지만 위 코드에서는 어딘가에서 B b; 라고 선언했을 뿐 직접 객체를 생성하지 않고 있음. 다시 말해 객체를 주입받고 있음
기존의 자바 코드는 클래스 A에서 B 객체를 쓰고 싶은 경우 직접 생성했지만, 스프링의 경우 클래스 A에서 B 객체를 쓰고 싶은 경우 객체를 직접 생성하는 것이 아니라 스프링 컨테이너에서 객체를 주입받아 사용함. 이 IoC/DI 개념은 스프링의 핵심 개념이기에 반드시 이해하고 넘어가야 함
스프링 컨테이너란?
빈을 생성하고 관리
빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리
빈(Bean)이란?
빈은 스프링 컨테이너가 생성하고 관리하는 객체
B b; ⇒ 여기서 B가 바로 빈
스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공함 (빈을 등록하는 방법은 여러가지가 있음)
예시
예를 들어 MyBean이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록되는데 이후 스프링 컨테이너에서 이 클래스를 관리함 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔 관리함. 따라서 MyBean 클래스의 빈 이름은 myBean 임
@Component // 클래스 MyBean 빈으로 등록 public class MyBean { }
Java
복사
관점 지향 프로그래밍
AOP(Aspect Oriented Programming)
프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의미
예시
예를 들어 계좌 이체, 고객 관리하는 프로그램이 있을 때 각 프로그램에는 로깅 로직, 즉, 지금까지 벌어진 일을 기록하기 위한 로직과 여러 데이터를 관리하기 위한 데이터베이스 연결 로직이 포함됨. 이때 핵심 관점은 계좌 이체, 고객 관리 로직이고, 부가 관점은 로깅, 데이터베이스 연결 로직임
부가 관점 코드를 핵심 관점 코드에서 분리하여 핵심 관점 코드에만 집중할 수 있게 될 뿐만 아니라 프로그램의 변경과 확장에도 유연하게 대응할 수 있음
이식 가능한 추상화
PSA(Portable Service Abstraction)
스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 의미함
PSA의 예시
클라이언트의 매핑과 클래스
메서드의 매핑을 위한 애너테이션
스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 같은 것들이 있는데, 여기에서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원함
또 다른 예시로는 WAS가 있음. 코드는 그대로 두고 WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있음
정리
스프링 프레임워크는 IoC/DI 를 통해 객체 간의 의존 관계를 설정하고, AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며, PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 함
IoC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것 DI : 외부에서 객체를 주입받아 사용하는 것 AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것 PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것
Java
복사