Spring Boot 내부 동작 원리 & 어노테이션

최민길(Gale)·2023년 1월 9일
2

Spring Boot 적용기

목록 보기
5/46

안녕하세요 오늘은 Spring Boot의 내부 동작 원리와 사용하는 어노테이션들에 대해서 정리해보려고 합니다.

Spring Boot는 POJO 프로그래밍을 지향합니다. POJO(Plain Old Java Object)란 쉽게 말하면 다른 기술 없이 순수 Java만을 사용한 객체로, 외부 기술 등에 얽매이지 않아 유연하고 객체 지향 설계를 더 효과적으로 적용할 수 있습니다. 이를 위해 Spring Boot에선 다음의 4가지 기술을 지원합니다.

  1. 제어의 역전(IoC)
    : 객체의 생성 및 제어권을 사용자가 아닌 Spring이 가지고 있음. new를 이용해 객체를 직접 생성하는 것이 아닌 Spring Container에 의해 관리받는 객체를 사용

  2. 의존성 주입(DI)
    : 어플리케이션 실행 시점에 생성된 객체 인스턴스의 참조가 연결되는 것. 생성자를 통해 참조할 객체의 정보를 알 수 있음

  3. 관심 지향 프로그래밍(AOP)
    : 어플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것

  4. 일관된 서비스 추상화(PSA)
    : 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 함. JDBC의 경우 각 DB의 드라이버에 맞게 다르게 구현하여 사용자 입장에서 로직 변경 없이 그대로 사용 가능.


출처 : https://chobopark.tistory.com/200

Spring Boot에서는 Spring Container를 통해 Bean이라는 객체를 관리합니다. Spring Container란 의존 관계 주입을 사용자가 객체를 생성하는 대신 자체적으로 Bean을 생성하고 관리하면서 의존 관계를 연결해주는 것입니다. 비어 있는 Spring Container가 생성되면 Spring 설정 파일(appConfig.xml 등)을 기반으로 Spring Container에 Bean이 등록된 후 Bean의 의존 관계를 주입합니다.


출처 : https://chobopark.tistory.com/200

Spring Container는 BeanFactory와 ApplicationContext가 있습니다. BeanFactory는 객체를 생성하고 객체 사이의 런타임 의존관계를 맺어주는 역할을 하며 Spring Container의 최상위 인터페이스입니다. ApplicationContext는 BeanFactory를 포함한 여러 인터페이스들을 상속받은 인터페이스로, BeanFactory 외의 부기기능을 제공합니다. 실제 사용 시 BeanFactory는 거의 직접 사용하지 않고 ApplicationContext를 사용합니다.


출처 : https://velog.io/@zezeg2/Spring-Boot-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC

https://velog.io/@gale4739/Spring-Boot-vs-Node-js-vs-PHP
이전 시간에 포스팅했던 Spring Boot 내용(상단 링크 참고)을 참고하시면 클라이언트 요청은 DispatcherServlet을 통해 전달받습니다. 이 때 DispatcherServlet이 생성되기 전 어플리케이션의 클래스, 리소스 구성 및 웹 서버가 이를 사용해서 요청을 처리하는 방법이 적혀 있는 웹 에플리케이션 배포설명자(web.xml)에서 ContextLoaderListener를 실행시킵니다. 그 후 ContextLoaderListener에서 모든 요청 및 스레드에서 공통적으로 사용하는 요소를 스캔한 후 ApplicationContext에 정의됩니다. 이후 DispatcherServlet이 생성된 후 스캔을 통해 Bean들이 ApplicationContext를 통해 Spring Container에 등록됩니다.

어노테이션이란, 소스 코드에 추가해서 사용할 수 있는 메타 데이터, 즉 컴파일 및 실행 과정에서 코드를 어떻게 처리해야 하는지를 알려주기 위한 추가 정보입니다. Spring Boot에서는 어노테이션을 통하여 클래스에 다향한 기능을 부여합니다. 다음은 Spring Boot의 대표적인 어노테이션입니다. (추후 조금씩 추가 수정 진행 예정입니다.)

<기본적인 어노테이션>

  • @Autowired
    : Bean 객체를 주입받기 위해(의존성 주입) 사용. 타입에 따라 자동적으로 Bean을 주입해주며 Spring이 자동적으로 값을 할당

  • @Bean
    : 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들 때 사용

  • @Configuration
    : 구성 정보를 담당하는 것을 설정할 때 사용. 클래스에 적용 후 @Bean을 해당 클래스의 메소드에 적용하면 @Autowired로 Bean을 부를 수 있음

  • @Component
    : 개발자가 생성한 클래스를 Bean으로 등록할 때 사용

  • @Controller
    : 해당 클래스가 컨트롤러의 역할(들어오는 요청을 처리)을 한다고 명시하기 위해 사용

  • @Service
    : 비즈니스 로직을 수행한다고 명시하기 위해 사용

  • @Repository
    : 데이터베이스에 접근하는 method를 가지고 있다고 명시하기 위해 사용

  • @ComponentScan
    : @Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 Bean을 등록

  • @EnableAutoConfiguration
    : Spring Application Context를 만들 때 자동으로 설정하는 기능을 킴

  • @SpringBootApplication
    : @Configuration, @EnableAutoConfiguration, @ComponentScan 들을 하나로 합친 것

<Request & Response 관련 어노테이션>

  • @RequestHeader
    : Request의 헤더값을 가져올 때 사용

  • @RequestMapping
    : URI의 요청과 어노테이션의 value값이 일치하면 실행

  • @RequestParam
    : URI에 전달되는 파라미터를 받아서 처리할 때 사용

  • @RequestBody
    : Body에 전달되는 데이터를 받아서 처리할 때 사용

  • @ResponseBody
    : 리턴되는 값이 View로 출력되지 않고 HTTP Response Body에 직접 전달할 때 사용

<Test 관련 어노테이션>

  • @SpringBootTest
    : Spring Boot 테스트에 필요한 의존성 제공

  • @Test
    : JUnit에서 테스트할 대상을 표시

<Lombok(가독성 높혀주는 라이브러리) 관련 어노테이션>

  • @Setter
    : 클래스의 모든 필드의 Setter method 생성

  • @Getter
    : 클래스의 모든 필드의 Getter method 생성

  • @AllArgsConstructor
    : 클래스 내 모든 필드 값을 파라미터로 받는 생성자 추가

  • @NoArgsConstructor
    : 클래스 기본 생성자를 자동으로 추가

  • @ToString
    : 클래스 내 모든 필드의 toString method 생성

출처
https://velog.io/@falling_star3/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88bean%EA%B3%BC-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84
https://sddev.tistory.com/225
https://melonicedlatte.com/2021/07/18/182600.html
https://velog.io/@zezeg2/Spring-Boot-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC
https://chobopark.tistory.com/200

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글