스프링 부트(Spring Boot)
스프링 프레임워크를 기반으로 하여 복잡한 설정과 보일러플레이트 코드를 최소화하고, 자동 설정을 통해 개발자가 더 빠르고 쉽게 웹 애플리케이션 및 마이크로 서비스를 개발할 수 있도록 돕는 자바 프레임워크. 별도의 외부 WAS 설치 없이 내장 서버를 통해 바로 실행 가능한 애플리케이션을 만들 수 있는 것이 가장 큰 특징.
스프링 부트의 주요 특징
- 자동 설정: 기본적인 설정을 자동으로 처리하여 개발 시간을 단축시킵니다.
- 내장 서버: 톰캣(Tomcat)과 같은 내장 서버를 포함하고 있어, 별도의 WAS(Web Application Server) 설치 없이 자바 애플리케이션을 실행할 수 있습니다.
- 간편한 배포: 내장 서버 덕분에 JAR 파일 형태로 패키징하여 간단하게 배포하고 실행할 수 있습니다.
- 스타터 의존성: 필요한 라이브러리들을 자동으로 포함시켜 주는 스타터 의존성을 통해 의존성 관리를 용이하게 합니다.
- 컨테이너 환경에 적합:내장 서버와 경량화된 배포 패키지로 Docker와 같은 컨테이너 환경에 적합하며, 마이크로 서비스 아키텍처에 유리합니다.
스프링 부트와 스프링(Spring)의 차이
- 스프링: 애플리케이션 개발을 위한 포괄적인 프레임워크입니다. 하지만 웹 애플리케이션을 개발하려면 톰캣 설치, XML 설정 등 복잡한 설정 과정이 필요.
스프링 부트: 스프링 프레임워크를 더 쉽고 빠르게 사용할 수 있도록 돕는 도구(sub-project)입니다. 스프링 프레임워크의 복잡한 설정을 자동화하고, 개발자가 애플리케이션 개발에 더 집중할 수 있게 해줌.
| 스프링 | 스프링 부트 | |
| 목적 | 엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기 | 스프링의 개발을 더 빠르고 쉽게 하기 |
| 설정 파일 | 개발자가 수동으로 구성 | 자동 구성 |
| XML | 일부 파일은 XML로 직접 생성하고 관리 | 사용하지 않음 |
| 인메모리 데이터베이스 지원 | 지원하지 않음 | 인메모리 데이터베이스 자동 설정 지원 |
| 서버 | 프로젝트를 띄우는 서버(예: 톰캣, 제티)를 별도로 수동 설정 | 내장형 서버를 제공해 별도의 설정이 필요 없음 |
스프링 콘셉트
- 제어의 역전과 의존성 주입: 스프링은 모든 기능의 기반을 제어의 역전(IoC)과 의존성(DI)에 두고 있음.
- Inversion of Control(IoC)
public class A{
b = new B(); // 클래스 A에서 new 키워드로 클래스 B의 객체 생성
}
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말함.
public class A{
private B b; // 코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당
}
- Dependency Injection(DI)
public class A{
// A에서 B를 주입 받음
@Autowired
B b;
}
어떤 클래스가 다른 클래스에 의존한다는 뜻.
@Autowired라는 애너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 하는데, 빈은 스프링 컨테이너에서 관리하는 객체를 말함.
스프링 컨테이너
스프링 컨테이너는 빈을 생성하고 관리함. 빈이 생성되고 소멸되기까지의 생명 주기를 이 스프링 컨테이너가 관리하는 것임/
빈
빈은 스프링 컨테이너가 생성하고 관리하는 객체로, 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공함.
예를 들어 MyBean이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록되고, 이후 스프링 컨테이너에서 이 클래스를 관리함. 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔 관리함. MyBean클래스의 빈 이름은 myBean.
@Component // 클래스 MyBean 빈으로 등록
public class MyBean {
}
Aspect Oriented Programming(AOP)
관점 지향 프로그래밍은 프로그래밍에 대한 관점을 핵심 관점, 부가 관점으로 나누어서 관심 기준을 모듈화하는 것.
Portable Service Abstraction(PSA)
이식 가능한 서비스 추상화는 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말함.
대표적인 PSA의 예로는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션이 있음.
스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC같은 것들이 있는데, 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원함. 또 다른 예시로는 WAS도 PSA의 예시 중 하나라고 볼 수 있는데 코드는 그래도 두고 WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있음.
- IoC: 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것
- DI: 외부에서 객체를 주입받아 사용하는 것
- AOP: 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것
- PSA: 어느 기술을 사용하던 일괄된 방식으로 처리하는 것
클라이언트(client)는 서버로 요청하는 프로그램을 모두 일컬어 말하며, 웹 브라우저가 대표적인 클라이언트 중 하나이며,
서버(server)는 클라이언트의 요청을 받아 처리하는 주체. 클라이언트가 데이터를 요청했다면 데이터를 주고, 단지 서버 내에서 처리만 해달라는 요청을 했다면 해당 요청만 처리할 수도 있음.
데이터베이스(database)
여러 사람이 데이터를 한 군데에 모아놓고 여러 사람이 사용할 목적으로 관리하는 데이터 저장소이며,MySQL, 오라클, 포스트그레SQL등의 데이터베이스 관리시스템을 사용.
클라이언트에서 SQL, 데이터베이스를 조작하기 위한 언어로 데이터베이스 관리 시스템에 데이터를 요청하면 데이터베이스 관리 시스템은 데이터베이스에서 데이터를 꺼내 응답함.
Relational Database(RDB)
관계형 데이터베이스라는 뜻이며 RDB가 아닌 데이터베이스를 NoSQL 또는 NewSQL로 구분함.
관계형 데이터베이스는 데이터를 행과 열로 이루어진 테이블로 관리하며, 기본키(PK)를 사용해 각 행을 식별하고, 각 테이블 간에 관계를 지을 수 있음.
Structured Query Language(SQL)
쿼리, 즉 데이터를 검색하는 언어.
NoSQL
SQL을 안 쓴다는 의미로 사용되기도 하지만, Not Only SQL의 의미로 많이 사용함.
RDB는 데이터 저장, 질의, 수정, 삭제가 용이하지만 반면에 성능을 올리는게 쉽지 않음. 데이터베이스의 성능을 높이려면 머신의 성능을 좋게 하는 스케일 업 또는 머신을 여러 대로 분리하는 스케일 아웃이라는 것이 필요한데, 스케일 업은 장비를 업그레이드하면 되지만 스케일 아웃은 데이터베이스의 분산이 필요한데 이때 트랜잭션을 사용하면 성능이 떨어지게 됨. 이러한 문제를 해결하기 위해 NoSQL이 등장했고 NoSQL에는 데이터 모델링을 어떻게 사느냐에 따라서 다이나모디비, 카우치베이스, 몽고디비와 같은 다양한 NoSQL 데이터베이스들이 있음.
웹 브라우저의 주소에는 아이피와 포트가 들어있는데 서버를 이용하려면 아이피와 포트를 알아야함.
IP(아이피)는 인터넷에서 컴퓨터 또는 기기들이 서로를 식별하고 통신하기 위한 주소.
https://www.naver.com에서 https:// 라는 것이 서버의 443번 포트를 사용하기 위한 입력이고,www.naver.com과 같은 주소는 아이피를 쉽게 알아보기 위해 이름표를 붙인 것.
라이브러리(library)
애플리케이션 개발에 필요한 기능인 클래스, 함수 등을 모아놓은 코드의 모음을 말함.
개발자가 소프트웨어를 만들 때 필요에 따라 원하는 기능을 구형하기 위해 코드의 모음을 가져다 쓸 수 있는 일종의 도구 역할.
예를 들어 로그 생성 기능, 로그 포매팅을 다양하게 지원하는 기능, 로그 레벨을 설정할 수 있는 기능들이 구현되어 있는 로그 라이브러리가 있으면 개발자는 이런 기능이 묶여 있는 로그 라이브러리를 의존성에 추가하기만 하면 됨. 그러면 라이브러리에서 제공하는 기능들을 직접 구현하지 않고도 프로젝트에서 사용할 수 있음.
프레임워크(framework)
소프트웨어 개발을 수월하게 하기 위한 소프트웨어 개발 환경이며, frame(틀)과 work(일하다)의 합성어로 일하기 위한 틀을 제공하는 것.
정해진 틀에서 개발해야 한다는 단점이 있지만 개발 효율은 굉장히 높다는 장점이 있음.
* 프레임워크는 애플리케이션을 개발할 때 전체적인 구조를 잡기 위해 사용하는 것이고, 라이브러리는 개발을 하는 과정에서 필요한 기능을 구현하기 위해 사용하는 것.