본문 바로가기
뒤끝 (Back-End)

[Spring boot] 스프링 부트 기본 어노테이션

728x90

 

더보기

 

스프링 부트의 개념에 대해 자세히 알고 싶어서 

나는 <스프링 붙크와 AWS로 혼자 구현하는 웹 서비스> 와 < 스프링 부트 3 백엔드 개발자 되기: 자바 편 > 

이 두 개의 책을 참고 했지만 아무리 책에서 자세히 설명해줘도 잘 이해가 안되는 빡대가리 때문에

챗GPT 의 힘을 빌려 설명을 덧붙였다. 챗 GPT 설명은 빨간 글씨로 구분했다

 

의존성 주입 (DI) : Dependency Injection, 어떤 클래스가 다른 클래스에 의존

@Autowired : 스프링 컨테이너세 있는 빈을 주입하는 역할

빈 : 스프링 컨테이너에서 관리하는 객체

 

@Autowired는 스프링 프레임워크에서 사용되는 주요한 어노테이션 중 하나입니다. 이 어노테이션은 의존성 주입(Dependency Injection)을 자동화하기 위해 사용됩니다.

스프링은 의존성 주입을 통해 객체 간의 의존성을 관리하고, 객체 생성 및 관리를 담당하는 컨테이너를 제공합니다. 이 때, @Autowired 어노테이션을 사용하면 스프링은 해당 필드나 생성자, 메서드 등에 자동으로 의존성을 주입합니다.

@Autowired는 주로 다음 세 가지 위치에서 사용됩니다.

1. 필드(Field): 필드에 @Autowired 어노테이션을 추가하여 스프링이 해당 필드에 자동으로 의존성을 주입합니다.
2. 생성자(Constructor): 생성자에 @Autowired 어노테이션을 추가하여 스프링이 해당 생성자를 통해 객체를 생성하고 의존성을 주입합니다.
3. 메서드(Method): Setter 메서드나 일반 메서드에 @Autowired 어노테이션을 추가하여 스프링이 해당 메서드를 호출하고 의존성을 주입합니다.

@Component
public class MyService {
    private final MyRepository myRepository;

    // 생성자 주입(Constructor Injection)
    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 메서드 주입(Method Injection)
    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 필드 주입(Field Injection)
    @Autowired
    private AnotherService anotherService;
}

 

위 코드에서 MyService 클래스는 MyRepository와 AnotherService에 의존하고 있습니다. 이를 @Autowired 어노테이션을 이용하여 필드, 생성자, 메서드에 각각 주입하고 있습니다. 스프링은 이러한 설정을 통해 필요한 의존성을 자동으로 관리하고 주입합니다.


 

스프링 컨테이너 : 스프링은 스프링 컨테이너 제공, 빈을 생성하고 관리

빈 : 스프링 컨테이너에 빈을 등록하기 위해 XML 파일 설정, 에너테이션 추가 등 방법 다양

ex ) My Bean 클래스 + @Component = My Bean 클래스가 빈으로 등록, 스프링 컨테이너에서 관리

@Component : 빈으로 등록

 

스프링 컨테이너(Spring Container)는 객체(빈)의 생성과 관리를 담당하는 실행 환경입니다. 스프링 컨테이너는 애플리케이션의 객체들을 생성하고, 의존성 주입을 통해 서로 연결하며, 객체의 라이프사이클을 관리합니다. 

 

빈(Bean)은 스프링 컨테이너에서 관리되는 객체를 의미합니다. 일반적으로 스프링 애플리케이션에서는 여러 개의 빈이 생성되고, 서로 의존 관계를 가질 수 있습니다. 빈은 @Component 어노테이션 또는 그와 유사한 어노테이션(@Service, @Repository, @Controller 등)을 사용하여 정의됩니다. 이러한 어노테이션을 통해 스프링에게 해당 클래스를 빈으로 등록하도록 지시합니다.

 

@Component // 스프링에게 해당 클래스를 빈으로 등록
public class MyService {
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

 

스프링부트 스타터 : 의존성이 모여 있는 그룹, 필요한 기능을 간편하게 설정 가능

spring-boot-starter-{작업유형}

web - spring MVC를 사용해서 RESTful 웹서비스를 개발할 때 필요한 의존성 모음

test - 스프링 애플리케이션을 테스트하기 위해 필요한 의존성 모음

validation - 유효성 검사를 위해 필요한 의존성 모음

actuator - 모니터링을 위해 app에서 제공하는 다양한 정보를 제공하기 쉽게하는 의존성 모음

jpa - ORM을 사용하기 위한 인터페이스 모임인 JPA를 더 쉽게 사용하기 위한 의존성 모음

 


 

@SpringBootApplication : 스프링 부트에 필요한 기본 설정

@SpringBootApplication은 스프링 부트 애플리케이션의 주요 구성 요소 중 하나로, 애플리케이션을 실행할 때 필요한 여러 설정을 자동으로 구성해주는 어노테이션입니다. 이 어노테이션은 보통 스프링 부트 애플리케이션의 메인 클래스에 적용됩니다.

 

SpringApplication.run() : 애플리케이션 실행

 

@SpringBootConfiguration : 스프링 부트 관련 설정을 나타냄

@Configuration: 이 어노테이션은 해당 클래스가 스프링 컨테이너의 설정을 포함하는 클래스임을 나타냅니다. 스프링 부트 애플리케이션은 여러 개의 설정 클래스를 가질 수 있고, @Configuration 어노테이션이 적용된 클래스의 설정은 스프링에 의해 관리되고 로드됩니다.

 

@ComponentScan : 사용자가 등록한 빈을 읽고 등록

@ComponentScan: 이 어노테이션은 스프링이 빈으로 등록된 클래스를 검색할 패키지를 지정합니다. 기본적으로 이 어노테이션은 @SpringBootApplication이 적용된 클래스의 패키지와 하위 패키지를 스캔합니다. 이를 통해 스프링은 애플리케이션에서 사용되는 컴포넌트들을 자동으로 찾아서 빈으로 등록합니다.

 

@EnableAutoConfiguration : 자동 구성을 활성화, 스프링 부트 서버가 실행될 때 스프링 부트의 메타 파일을 일고 정의된 설정들을 자동으로 구성

@EnableAutoConfiguration: 이 어노테이션은 스프링 부트의 자동 구성 기능을 활성화합니다. 자동 구성은 클래스 패스와 빈 설정에 기반하여 애플리케이션의 구성 요소들을 자동으로 설정합니다. 예를 들어, 클래스 패스에 Hibernate가 있고 스프링 부트 애플리케이션에 DataSource 빈이 필요하다면, 스프링 부트는 Hibernate를 사용하여 DataSource를 자동으로 구성합니다.

 

@RestController : 라우터 역할, 클라이언트의 요청에 맞는 메서드 실행

@RestController 어노테이션이 적용된 클래스는 HTTP 요청에 대한 응답으로 JSON, XML 등의 데이터를 반환할 수 있습니다. 내부적으로 @RestController는 @Controller와 @ResponseBody 어노테이션을 조합한 것과 같은 역할을 합니다.

@Controller 어노테이션은 스프링 MVC의 컨트롤러임을 나타내며, HTTP 요청을 처리하고 응답을 반환하는 역할을 합니다. @ResponseBody 어노테이션은 해당 메서드가 HTTP 응답의 본문(body)으로 데이터를 반환하는 역할을 합니다.

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, world!";
    }
}

위의 예제에서 /hello 경로에 대한 GET 요청이 들어오면 "Hello, world!" 문자열을 JSON 형식으로 반환하는 RESTful 컨트롤러가 정의되어 있습니다.




 

 

728x90