일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Service 테스트
- 스네이크 케이스
- 파스칼 케이스
- 낙관락
- 비링크
- 자료구조
- 비즈니스 로직
- jvm
- 마이크로서비스 아키텍처
- Controller 테스트
- 디자인 패턴
- 배열
- @Query
- do...while
- DTO
- Java
- 원시 자료형
- Repository 테스트
- 공유락
- Entity
- 테스트 코드
- @Version
- 배타락
- springDataJpa
- OOP
- 스터디
- Array
- 스프링 부트
- 자바
- 트랜잭션 락
- Today
- Total
menuhwang
[Spring Boot] 스프링 프레임워크 != 스프링 부트 본문
스프링 프레임워크란?
IoC (Inversion of Control) : 제어 역전
주객전도
일반적으로 객체를 사용하기 위해 사용자가 직접 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에 제공함.
IoC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임함.
IoC를 통해 DI (Dependency Injection) : 의존성 주입, AOP (Aspect-Oriented Programming) : 관점 지향 프로그래밍이 가능해지고 개발자는 비즈니스 로직에 집중할 수 있음.
외부란, 스프링 컨테이너 또는 IoC 컨테이너.
DI (Dependency Injection) : 의존성 주입
DI는 IoC의 방법 중 하나로, 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식.
@Autowired 라는 어노테이션을 통해 의존성을 주입할 수 있음.
@RestController
public class MyController {
MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
...
}
이 외 필드 또는 setter에 @Autowired 를 붙여 주입할 수 있음.
스프링 공식 문서에서는 생성자를 통해 의존성을 주입받는 방식을 권장.
다른 방식들과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계되기 때문.
스프링 4.3 이후 버전에서는 @Autowired 어노테이션을 생략 가능.
AOP (Aspect-Oriented Programming) : 관점 지향 프로그래밍
AOP에서 관점이란 어떤 기능을 구현할 때 그 기능을 핵심 기능과 부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미.
핵심 기능?
핵심 기능은 비즈니스 로직이 처리하려는 목적을 말한다. 예를 들면 정보를 데이터베이스에 저장하는것, 데이터를 보여주는 것이 핵심 기능이다.
부가 기능?
핵심 기능들 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 기능들.
AOP는 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식.
스프링은 디자인 패턴 중 하나인 프록시 패턴을 통해 AOP 기능을 제공한다.
스프링 프레임워크의 다양한 모듈
스프링 프레임워크는 여러개의 모듈을 제공한다.
JDBC, ORM, Transactions, Web, Servlet, Beans, Core 등등...
스프링 프레임워크를 사용한다고 모든 모듈을 사용할 필요 없이 개발에 필요한 모듈만 선택해서 사용할 수 있다.
스프링 부트
스프링 부트는 스프링 프레임워크와 다르게 복잡한 설정이 필요없음. 따라서 개발이 쉬워짐.
의존성 관리
스프링 프레임워크나 라이브러리의 버전을 변경하려면 관련된 다른 라이브러리의 호환성까지 확인해야함.
스프링 부트에서는 spring-boot-start-xxx 들로 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공.
spring-boot-start 라이브러리 종류
- spring-boot-starter-web : 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성. 톰캣 내장, jar 형식으로 실행 가능
- spring-boot-starter-test : JUnit, Jupiter, Mockito 등의 테스트용 라이브러리
- spring-boot-starter-jdbc : HikariCP 커넥션 풀을 활용한 JDBC (Java Database Connectivity API) 기능을 제공
- spring-boot-starter-security : 스프링 시큐리티(인증, 권한, 인가 등) 기능 제공
- spring-boot-starter-data-jpa : 하이버네이트를 활용한 JPA (Java Persistence API) 기능을 제공
자동 설정
애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아줌.
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
@SpringBootApplication 어노테이션에는 여러 어노테이션을 합쳐놓은 구조.
그 중 @ComponentScan 과 @EnableAutoConfiguration 어노테이션을 살펴보자.
@ComponentScan 어노테이션을 통해 @Component 시리즈 어노테이션이 붙은 클래스를 발견해 빈(Bean)을 등록함.
@EnableAutoConfiguration 어노테이션을 통해 다양한 자동 설정이 일부 조건을 거쳐 적용.
< @Component 시리즈의 예 >
1. @Controller
2. @RestController
3. @Service
4. @Repository
5. @Configuration
내장 WAS (Web Application Server)
스프링 부트는 내장 WAS가 존재. spring-boot-starter-web의 경우 톰캣을 내장. 스프링 부트의 자동 설정 기능이 톰캣에도 적용되어 특별한 설정 없이도 톰캣을 실행할 수 있다.
모니터링
서비스를 운영하게되면 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들의 모니터링필요.
스프링 부트에는 스프링 부트 액추에이터라는 모니터링 도구 제공.
요약
- 스프링 프레임워크와 스프링 부트는 다르다!
- 스프링 부트는 스프링 프레임워크에 비해 의존성 관리, 자동 설정, 내장 WAS, 모니터링 등의 기능이 기본으로 포함되어있어 개발이 쉽고, 편하다.
- IoC : 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 컨테이너에 위임
- DI : 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입
- AOP : 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식
동작 흐름
// MySpringBootApplication.java
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
// MyController.java
@Controller
public class MyController {
MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
}
// MyService.java
@Service
public class MyService {
...
}
MySpringBootApplication.java
MyController.java
'스터디 > Spring' 카테고리의 다른 글
[Spring Boot] 로그 남기기 : Logback (0) | 2022.08.24 |
---|---|
[Spring Boot] Swagger : API 명세 (0) | 2022.08.23 |
[Spring Boot] Controller 설계 (0) | 2022.08.22 |
[Spring Boot] 스프링 MVC 모델 레이어드 아키텍처 (0) | 2022.08.19 |
[Spring Boot] 스프링 부트 동작 방식 (0) | 2022.08.19 |