1. 스프링과 스프링 부트
- 스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구
스프링 부트의 주요 특징
- 톰캣,제티,언더토우 같은 웹 애플리케이션 서버(web application server, WAS)에 내장되어 있어서 따로 설치를 하지 않아도 독립적으로 실행할 수 있다.
- 빌드 구성을 단순화하는 스프링 부트 스타터를 제공한다.
- XML 설정을 하지 않고 자바 코드로 모두 작성할 수 있다.
- JAR를 이용해서 자바 옵션만으로도 배포가 가능하다.
- 애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터(spring actuator)를 제공한다.
2. 스프링 콘셉트 공부하기
1) 제어의 역전과 의존성 주입
- 스프링의 모든 기능의 기반을 제어의 역전(IoC)와 의존성 주입(DI)에 두고 있다.
제어의 역전(IoC)
- Inversion of Control
- 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것
ex) 클래스 A에서 클래스 B 객체 생성
public class A {
b = new B(); //클래스 A에서 new 키워드로 클래스 B의 객체 생성
}
ex) 스프링 컨테이너가 객체를 관리하는 방식
- 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 함
public class A {
private B b; //코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당
}
의존성 주입(DI)
- Dependency Injection
- 어떤 클래스가 다른 클래스에 의존한다는 뜻
ex) 객체를 주입받는 모습
- 스프링 컨테이너가 B 객체를 만들어서 클래스 A에게 준 것
public class A {
//A에서 B를 주입받음
@Autowired
B b;
}
- @Autowired 애너테이션은 스프링 컨테이너에 있는 빈을 주입하는 역할
- 빈은 스프링 컨테이너에서 관리하는 객체
2) 빈과 스프링 컨테이너
스프링 컨테이너
- 스프링은 스프링 컨테이너를 제공
- 스프링 컨테이너는 빈을 생성하고 관리
- 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리
- 개발자가 @Autowired같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원
빈
- 스프링 컨테이너가 생성하고 관리하는 객체
- 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공한다.
ex) 클래스를 빈으로 등록하는 방법
@Component //클래스 MyBean 빈으로 등록
public class MyBean {
}
- MyBean 이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록된다. 이후 스프링 컨테이너에서 이 클래스를 관리한다.
- 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔서 관리한다. 따라서 MyBean 클래스의 빈 이름은 myBean이다.
관점 지향 프로그래밍(AOP)
- Aspect Oriented Programming
- 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심의 기준으로 모듈화하는 것
이식 가능한 서비스 추상화(PSA)
- Portable Service Abstraction
- ex) 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션
- 예를 들어 스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 같은 것들이 있다. 여기에서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원한다.
3. 스프링 부트 3 둘러보기
1) 첫 번째 스프링 부트 3 예제 만들기
TestController.java
- 사용자가 /test GET 요청을 하면 "Hello, world" 문자열을 반환
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "Hello, world";
}
}
- http://localhost:8080/test에서 localhost는 아이피로는 127.0.0.1이다. 이는 컴퓨터 네트워크에서 사용하는 루프백 호스트명이라는 것이다. 쉽게 말해 현재 사용중인 컴퓨터를 의미한다.
- 8080은 스프링 부트의 포트 번호
- /test는 @GetMapping 이라는 애너테이션으로 메서드와 매핑할 떄 스프링 부트에서 설정한 경로이다.
2) 스프링 부트 스타터 살펴보기
- 스프링 부트 스타터는 의존성이 모여 있는 그룹이다. 스타터를 사용하면 필요한 기능을 간편하게 설정할 수 있다.
- 스타터는 spring-boot-starter-{작업유형}이라는 명명규칙이 있다.
자주 사용하는 스타터
스타터 | 설명 |
spring-boot-starter-web | Spring MVC를 사용해서 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음 |
spring-boot-starter-test | 스프링 애플리케이션을 테스트하기 위해 필요한 의존성 모음 |
spring-boot-starter-validation | 유효성 검사를 위해 필요한 의존성 모음 |
spring-boot-starter-actuator | 모니터링을 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음 |
spring-boot-starter-data-jpa | ORM을 사용하기 위한 인터페이스의 모음인 JPA를 더 쉽게 사용하기 위한 의존성 모음 |
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' // 웹 관련 기능 제공
testImplementation 'org.springframework.boot:spring-boot-starter-test' //테스트 기능 제공
}
3) 자동 구성
- 스프링 부트는 서버를 시작할 때 구성 파일을 읽어와서 설정한다.
- 자동 설정은 META-INF에 있는 spring.factories 파일에 담겨 있다.
- 스프링 부트를 시작할 때 이 파일에 설정되어 있는 클래스를 모두 불러오고, 이후에는 프로젝트에서 사용될 것들만 자동으로 구성해 등록하는 것이다.
4. 스프링 부트 3 코드 이해하기
1) @SpringBootApplication 이해하기
SpringBootDeveloperApplication.java
@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
}
- 이 클래스는 자바의 main() 메서드와 같은 역할을 한다.
- @SpringBootApplication 애너테이션을 추가하면 스프링 부트 사용에 필요한 기본 설정을 해준다.
- SpringApplication.run() 메서드는 애플리케이션을 실행한다. 첫 번째 인수는 스프링 부트 3 애플리케이션의 메인 클래스로 사용할 클래스, 두 번째 인수는 커맨드 라인의 인수들을 전달한다.
@SpringBootApplication 애너테이션의 구성
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration //스프링 부트 관련 설정
@EnableAutoConfiguration //자동으로 등록된 빈을 읽고 등록
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
//사용자가 등록한 빈을 읽고 등록
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootConfiguration
- 스프링 부트 관련 설정을 하는 애너테이션
@ComponentScan
- 사용자가 등록한 빈을 읽고 등록하는 애너테이션
- 이 애너테이션은 @Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록하는 역할을 한다.
- @Component를 감싸는 애너테이션이 있는데 실제 개발을 하면 @Component 애너테이션보다는 용도에 따라 다른 애너테이션을 사용
애너테이션명 | 설명 |
@Configuration | 설정 파일 등록 |
@Repository | ORM 매핑 |
@Controller, @RestController | 라우터 |
@Service | 비즈니스 로직 |
@EnableAutoConfiguration
- 스프링 부트에서 자동 구성을 활성화 하는 애너테이션
- 이 애너테이션은 스프링 부트 서버가 실행될 떄 스프링 부트의 메타파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행한다.
- spring.factories 파일에 클래스들이 모두 @EnableAutoConfiguration을 사용할 때 자동 설정된다.
2) 테스트 컨트롤러 살펴보기
TestController.java
@RestController
public class TestController {
@GetMapping("/test") // /test GET 요청이 오면 test() 메서드 실행
public String test() {
return "Hello, world";
}
}
- @RestController는 라우터 역할을 하는 애너테이션이다.
- 라우터란 HTTP 요청과 메서드를 연결하는 장치를 말한다.
- 이 애너테이션이 있어야 클라이언트의 요청에 맞는 메서드를 실행할 수 있다.
- TestController를 라우터로 지정해 /test라는 GET 요청이 왔을 때 test() 메서드를 실행하도록 구성한 것이다.
- @Controller 애너테이션에 @ReponseBody 애너테이션이 합쳐진 결과물이 @RestController 애너테이션이다.
- @Controller 애너테이션에서 @Component 애너테이션을 가지고 있기 때문에 @Controller 애너테이션이 @ComponentScan을 통해 빈으로 등록되는 것이다.
'SpringBoot' 카테고리의 다른 글
[스프링 부트 3 백엔드 개발자 되기] ch 4. 스프링 부트 3과 테스트 (0) | 2024.07.11 |
---|---|
[스프링 부트 3 백엔드 개발자 되기] ch 3. 스프링 부트 3 구조 이해하기 (0) | 2024.07.11 |
[스프링 부트 3 백엔드 개발자 되기] ch 1. 자바 백엔드 개발자가 알아두면 좋은 지식 (0) | 2024.07.10 |
[스프링부트 3 백엔드 개발자 되기] ch 0. 개발환경 구축하기 (0) | 2024.07.10 |
[Do it] 3장 스프링 부트 고급 기능 익히기(6) (0) | 2024.01.25 |