백엔드 개발자의 주된 업무는 서버 측 애플리케이션을 개발하는 일이다.
과제분석: 과제분석에서 "친구 초대 이벤트를 만들어주세요"라고 했을때 다음과 같은 사항을 결정해야한다.
1) 친구는 무엇인지
2) 초대는 무엇을 의미하는지
3) 이벤트는 어떤 조건이 필요하고 초대를 한 친구와 초대된 친구에게 보상을 어떻게 줄지
4) 이벤트를 위해서 어떤 데이터를 저장해야 하는지
개발: 개발하며 깃허브등을 통해 동료의 리뷰를 받고 리뷰내용을 반영하여 코드의 완성도를 높인다.
테스트: 로직상 문제가 없는지, 성능 한계는 어느정도인지, 만든 코드가 읽기 편한지, 내가만든 메소드를 다른사람이 편하게 사용할 수 있는지 등을 검토한다. (테스트 주도 개발을 통해 테스트를 먼저 작성하기도 함)
스프링은 설정이 매우 복잡하다는 단점이 있다. 이런 단점을 보완하고자 스프링 부트를 출시하였다.(2013년 4월)
스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구이다.
빠르게 스프링 프로젝트를 설정할 수 있고 의존성 세트라고 불리는 스타터를 사용해 간편하게 의존성을 사용하거나 관리할 수 있다.
즉 스프링부트를 사용하여 개발자는 비즈니스로직에 더 집중할 수 있다.
스프링은 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야한다.
반면 스프링 부트는 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드하므로 수동으로 개발 환경을 구성할 필요가 없다.
ex> springboot-starter
spring-boot-starter는 스프링 부트의 기본 스타터 패키지로, 다음과 같은 주요 기능을 포함한다.
1) 스프링 코어 기능: IoC, DI, AOP 등을 포함한 스프링 코어의 모든 기능을 자동으로 로드합니다.
2) 스프링 MVC: 웹 애플리케이션 개발을 위한 스프링 MVC의 기능을 포함합니다.
3) 기본 설정: 스프링 부트의 자동 설정 기능을 통해 많은 기본 설정을 자동으로 구성합니다.
4) 기본 의존성: 다양한 공통 의존성을 포함하여 애플리케이션 개발에 필요한 라이브러리를 쉽게 추가할 수 있습니다.
스프링 애플리케이션은 톰캣과 같은 외부 WAS에 배포하는 것이 특징이다.
하지만 스프링 부트는 WAS를 자체적으로 가지고 있다.
따라서 jar 파일만 만들면 별도로 WAS를 설정하지 않아도 애플리케이션을 실행할 수 있다. 스프링 부트의 내장 WAS에는 톰캣, 제티, 언더토우가 있어서 상황에 필요한 WAS를 선택할 수 있다.
| 스프링 | 스프링 부트 | |
|---|---|---|
| 목적 | 엔터프라이즈 애플리케이션 개발을 쉽게 | 스프링의 개발을 더 빠르고 쉽게 |
| 설정파일 | 개발자가 수동으로 구성 | 자동 구성 |
| XML | 일부 파일은 XML로 직접 생성하고 관리 | 사용하지 않음 |
| 인메모리 데이터베이스 지원 | 지원하지 않음 | 인메모리 데이터베이스를 자동 설정 지원 |
| 서버 | 프로젝트를 띄우는 서버(톰캣, 제티)를 별도로 수동 설정 | 내장형 서버를 제공해 별도의 설정이 필요 없음 |
인메모리 데이터베이스(In-Memory Database, IMDB)는 데이터를 디스크가 아닌 주로 시스템의 주 메모리(RAM)에 저장하여 데이터 액세스 속도를 크게 향상시키는 데이터베이스 관리 시스템(DBMS)이다. 이로 인해 디스크 I/O 성능의 제약을 받지 않아 매우 빠른 읽기 및 쓰기 성능을 제공한다.
ex> SAP HANA, Redis, VoltDB, Memcached
지금까지 우리는 객체를 생성할 때 객체가 필요한 곳에서 직접 생성하였다.
public class A{ b = new B(); }제어의 역전은 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다.
public class A{ private B b; }즉 어딘가에서 받아오기 위한 준비를 한다. 어디서 받아올까?
그것은 바로 스프링 컨테이너이다. 스프링 컨테이너는 객체를 관리, 제공하는 역할을 한다.
DI란 IoC를 구현하기 위해 사용하는 방법이다.
쉽게 말해서 어떤 클래스가 다른 클래스에 의존한다는 뜻이다.
밑의 코드를 보면 A는 B에 의존하고 있다. (A -> B)public class A{ // A에서 B를 주입받음 @Autowired B b; }개발자는 B b라고 선언했을 뿐 직접 객체를 생성하지 않고 있다.
이는 객체를 주입받고 있다는 뜻이다.
여기서 말하는 @Autowired 어노테이션은 스프링 빈을 주입하는 역할을 한다.
스프링 컨테이너는 빈을 생성하고 관리한다.
즉 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리하는 것이다.
스프링 빈은 스프링 컨테이너가 생성하고 관리하는 객체이다.
앞에서 본 B 클래스의 인스턴스가 스프링 빈이 된다.
스프링은 빈을 컨테이너에 등록하기 위해 1) XML 파일설정, 2) 어노테이션 추가 등의 방법을 제공한다.
밑의 예제는 @Component 어노테이션을 통해 빈으로 등록하는 코드이다.@Component // 클래스 MyBean을 빈으로 등록 public class MyBean{ }
- 컨테이너에 올라갈때 빈의 이름은 첫글자를 소문자로 바꾼다.
ex> MyBean -> myBean
프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의미한다.
1) 핵심 관점: 계좌이체, 고객관리
2) 부가 관점: 로깅, 데이터베이스 연결
-> 여기서 로깅, 데이터베이스 연결은 모두 계좌이체와 고객관리에 필요하다.
따라서 AOP관점을 적용하면 부가 관점에 해당하는 로직을 모듈화해 가져다가 쓸 수 있는 것이다.
부가 관점 코드와 핵심 관점 코드를 분리 할 수 있다. 이러면 개발자는 핵심 관점 코드에만 집중할 수 있고 프로그램의 변경이나 확장에도 유연하게 대처할 수 있다.
PSA는 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말한다.
예를 들어 데이터 베이스에 접근하기 위한 기술은 다양하다.
이 중 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원한다.