개념부터 차근차근.
스프링 : 자바로 애플리케이션을 개발하는 데 필요한 기능을 제공하고 쉽게 사용하도록 돕는 도구
일반적인 자바에서는 사용하려는 객체를 선언, 객체의 의존성을 생성한 뒤 객체에서 제공하는 기능
즉, 일반적인 자바에서는 개발자가 직접 제어하는 구조.
private MyService service = new MyServiceImpl();
반면, 스프링에서는
IoC(제어 역전) :객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것
제어 역전을 통해 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 등이 가능해진다.
사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
내 기억에 setter 를 쓰지 않는 것을 권장한다고 알고 있는데 그 이유에 대해서는 다음에 꼭 다뤄보겠다.
스프링부터는 @Autowired 라는 어노테이션으로 의존성 주입 가능.
(아래 예제는 주석마다 각각 따로)
public class DIController {
// 생성자를 통한 의존성 주입
MyService myService;
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
// 필드 객체 선언을 통한 의존성 주입
@Autowired
private MyService myService;
// setter 메서드를 통한 의존성 주입
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식
주의할 점 : AOP와 OOP를 구분하자
OOP : 각 기능을 재사용 가능한 개별 객체로 구성해 프로그래밍하는 것
1. 추상화 (abstraction)
2. 캡슐화 (encapsulation)
3. 상속 (inheritance)
4. 다형성 (polymorphism)
간단하게 이렇게만 하고 AOP를 알아보자.
AOP : 관점을 기준으로 묶어 개발하는 방식
관점 : 어떤 기능을 구현할 때 '핵심 기능', '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것
핵심 기능 : 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능
ex) 상품 정보 등록에 대한 클라이언트의 요청이 있고,
요청 -> DB에 저장 -> 요청과 관련된 정보 조회
이런 구조의 비즈니스 로직 구현을 한다면
(1) 상품 정보를 DB에 저장
(2) 저장된 상품 정보 데이터를 보여주는 코드
2가지가 핵심 기능
이 때, 개발하다보면 생기는 기능들이 부가 기능인 것이다.
ex) 비즈니스 로직 사이에 로깅 처리, 트랜잭션 처리하는 코드
AOP의 관점에서는 부가 기능은 핵심 기능이 어떤 기능인지에 무관하게 비즈니스 로직 수행 전후로 수행 되기만 하면 된다.

간단하게 스프링은 필요한 모듈들을 추가하다 보면 설정이 복잡해지는데,
그 문제를 해결하기 위해 만들어진 것이 스프링 부트다.
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run."
스프링 부트를 이ㅣ용하면 단독으로 실행 가능한 상용 수준의 스프링 기반 애플리케이션을 손쉽게 만들 수 있다는 문구
스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성을 직접 설정
스프링 부트는 'spring-boot-start'라는 의존성을 제공해 불편함 해소
spring-boot-starter-web : 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성
spring-boot-starter-test : JUnit Jupiter, Mockito 등의 테스트용 라이브러리
spring-boot-starter-jdbc : HikariCP 커넥션 풀을 활용한 JDBC 기능 제공
spring-boot-starter-security : 스프링 시큐리티(인증, 권한, 인가 등) 기능 제공
spring-boot-starter-data-jpa : 하이버네이트를 활용한 JPA 기능 제공
spring-boot-starter-cache : 스프링 프레임워크의 캐시 기능 제공
Auto Configuration : 자동 설정
자동 설정을 지원한다. 필요한 의존성을 추가하면 자동으로 프레임워크가 관리해준다.
ex) 프로젝트 생성 시, 메인 애플리케이션 코드 확인 가능.
@SpringBootApplication 어노테이션이 메인 애플리케이션 코드 생성 시 되어 있는데
아래와 같은 어노테이션을 합쳐놓은 구성이다.
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan@Controller@RestController@Service@Repository@Configuration스프링 부트의 각 웹 애플리케이션은 내장 WAS가 존재한다.
가장 기본이 되는 spring-boot-starter-web 또한 톰캣을 내장하고 있다.
개발이 끝나고 운영하는 시기에는 해당 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링 해야 한다.
스프링 부트에는 스프링 부트 액추에이터 라는 자체 모니터링 도구가 있다.