Server/Spring Boot

스프링, 스프링부트 차이 & 스프링 개념 & 코드 분석

은 딩 2023. 10. 4. 00:43

 

 

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 백엔드 개발자 되기: 자바 편> 저자 : 신선영