본문 바로가기

SpringBoot

[스프링 부트 3 백엔드 개발자 되기] ch 2. 스프링 부트 3 시작하기

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을 통해 빈으로 등록되는 것이다.