1. 스프링과 스프링 부트
1-1. 스프링이란?
- 엔터프라이즈 애플리케이션(대규모의 복잡한 데이터를 관리하는 애플리케이션)은 서버 성능과 안정성, 보안이 매우 중요
- 스프링 프레임워크는 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구(엔터프라이즈 애플리케이션을 위한 개발 환경 제공)
- 이렇게 함으로써 개발자들은 기능 개발에 집중할 수 있게 됨.
1-2. 스프링 부트란?
- 스프링은 장점이 많은 개발 도구지만 설정이 매우 복잡하다는 단점이 있는데, 이 단점을 보완하고자 출시
- 스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구
- 즉, 스프링 부트는 스프링에 속한 도구
- WAS(web application server) 내장 ex) 톰캣, 제티, 언더토우
1-3. 스프링과 스프링 부트의 차이점
스프링 | 스프링 부트 | |
목적 | 엔터프라이즈 애플리케이션 개발 쉽게 | 스프링 개발을 더 빠르고 쉽게 |
설정 파일 | 개발자가 수동으로 | 자동 구성 |
서버 | 프로젝트를 띄우는 서버(ex 톰캣, 제티)별도로 수동 설정 | 내장형 서버를 제공해 별도 설정 필요 없음(jar 파일만 만들면 실행) |
2. 스프링 개념
2.1 제어의 역전(IoC)
- 스프링은 모든 기능의 기반을 제어의 역전(IoC)와 의존성 주입(DI)에 두고 있음
- IoC = Inversion of Control, 제어의 역전
- 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것
- 클래스 B 객체를 직접 생성하는 것이 아니므로, 어딘가에서 받아와 사용하고 있다
- 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할
public class A {
private B b; // 코드에서 객체를 생성X, 어디선가 받아온 객체를 b에 할당
}
2.2 의존성 주입(DI)
- DI = Dependency Injection, 의존성 주입
- 어떤 클래스가 다른 클래스에 의존한다는 뜻
- @Autowired => 스프링 컨테이너에 있는 빈(스프링 컨테이너에서 관리하는 객체) 주입
public class A {
// A에서 B를 주입받음
@Autowired
B b;
}
- 스프링 컨테이너라는 곳에서 객체를 주입했기 때문에 코드 잘 돌아감
- 쉽게 말해 스프링 컨테이너가 B 객체를 만들어서 클래스 A에 준 것
- 기존 자바 코드는 클래스 A에서 B 객체를 쓰고 싶은 경우 직접 생성
- But 스프링은 클래스 A에서 B 객체를 쓰고 싶은 경우 스프링 컨테이너에서 객체를 주입 받아 사용
2.3 스프링 컨테이너
- 빈이 생성되고 소멸되기까지의 생명 주기를 관리
- 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원하기도 함
2.4 빈
- 스프링 컨테이너가 생성하고 관리하는 객체
- 위 코드에서 B가 바로 빈
- ex) MyBean 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록
- 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔서 관리
- 이 경우, myBean
@Component // 클래스 MyBean을 빈으로 등록
public class MyBean{
}
2.5 관점 지향 프로그래밍(AOP)
- AOP = Aspect Oriented Programming
- 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미
2.6 이식 가능한 서비스 추상화(PSA)
- PSA = Portable Service Abstraction
- 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스
- ex) 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션
스프링에서 데이터베이스에 접근하기 위한 기술인 JPA, MyBatis, JDBC
WAS(why? 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있으므로)
지금까지 스프링의 콘셉트인 IoC, DI, AOP, PSA 개념을 정리했는데 이 기술들을 기반으로 스프링이 만들어짐
스프링 프레임워크는 IoC/DI를 통해 객체 간의 의존 관계를 설정하고, AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며, PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 함.
한 줄로 정리
1) IoC : 객체의 생성과 관리를 개발자가 아니라 프레임 워크가 대신 하는 것
2) DI : 외부에서 객체를 주입 받아 사용하는 것
3) AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것
4) PSA : 어느 기술을 사용하든 일관된 방식으로 처리하도록 하는 것
3 스프링 부트 3 코드 이해
3.1 @SpringBootApplication
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) // 스프링 부트 사용에 필요한 기본 설정 해줌
public class BookSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(BookSpringBootApplication.class, args);
// 애플리케이션 실행하는 메서드
// 첫 번째 인수 : 스프링 부트 3 애플리케이션의 메인 클래스로 사용할 클래스
// 두 번째 인수 : 커맨드 라인의 인수들 전달
}
}
- 자바의 main() 메서드와 같은 역할 즉, 여기서 스프링 부트가 시작
더 자세히)))
애너테이션을 Ctrl을 누른 상태로 클릭하면 애너테이션의 구성이 나타난다
@SpringBootConfiguration
- 스프링 부트 관련 설정을 나타내는 애너테이션
- @Configuration을 상속해서 만든 것
@ComponentScan
- 사용자가 등록한 빈을 읽고 등록하는 애너테이션
- @Component을 가진 클래스들을 찾아 빈으로 등록하는 역할
- +) 그렇다고 모든 빈에 @Component만 사용하는 게 아니라 감싸는 애너테이션이 있음
@Configuration | 설정 파일 등록 |
@Repository | ORM 매핑 |
@Controller, @RestController | 라우터 |
@Service | 비즈니스 로직 |
@EnableAutoConfiguration
- 자동 구성을 활성화하는 애너테이션
- 스프링 부트 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할 수행
3.2 Test Conroller
@RestController // 라우터(HTTP 요청과 메서드 연결 장치) 역할 하는 애너테이션
// 이게 있어야 클라이언트의 요청에 맞는 메서드를 실행할 수 있음
public class TestController {
@GetMapping("/test")
public String test() {
return "Hello, world!";
}
}
- 위 코드는 TestController를 라우터로 지정해 /test라는 GET 요청이 왔을 때 test() 메서드를 실행하도록 구성
- @Controller 애너테이션에서 @Component 애너테이션을 가지고 있기 때문에 @Component처럼 취급
- @Configuration, @Repository, @Service도 모두 @Component 애너테이션 가짐
- WHY? 빈이 무슨 역할을 하는지 명확하게 구분하기 위해
Reference
<스프링 부트 3 백엔드 개발자 되기: 자바 편> 저자 : 신선영
'Server > Spring Boot' 카테고리의 다른 글
데이터베이스 조작이 편해지는 ORM (0) | 2023.11.07 |
---|---|
스프링 부트3 테스트 (1) | 2023.10.31 |
스프링 부트3 구조 이해하기 (0) | 2023.10.25 |
[Trouble Shooting] 스프링 부트 DB 없이 실행시키기 (0) | 2023.10.03 |
[Spring Boot] Google의 Geocoding API 연결 (0) | 2023.08.24 |