Spring Boot (+ RESTful)

Spring Boot - 자동 구성 메커니즘 Auto Configuration / 실습 - #Project 01

wy-family 2024. 12. 15. 17:01

1. 스프링과 객체 생성

일반적으로 Java에서는 객체를 생성하려면 new 키워드를 사용해야 합니다.

직접적 객체 생성 (수동 생성)

MyClass obj = new MyClass();
  • 위의 코드처럼 개발자가 직접 객체를 생성하는 방식입니다.
  • 이 방식은 객체가 다른 클래스에 강하게 결합되므로 유지보수와 테스트가 어렵습니다.

간접적 객체 생성 (Spring이 관리)

스프링은 객체를 직접 생성하지 않고, 대신 Spring 컨테이너에게 객체 생성을 위임합니다.

  1. 스프링 컨테이너
    • 스프링은 ApplicationContextBeanFactory라는 컨테이너를 통해 객체를 관리합니다.
    • 이때 생성되고 관리되는 객체를 Bean이라고 합니다.
  2. Bean이란?
    • Bean은 스프링 컨테이너가 관리하는 객체를 의미합니다.
    • 스프링은 Bean의 생명주기(생성부터 소멸까지)를 관리합니다.

2. 객체(Bean) 등록 방법

스프링에서는 다양한 방법으로 객체를 생성하고 Bean으로 등록할 수 있습니다.

1) XML 설정 파일을 통한 Bean 등록

스프링 초기 버전에서는 XML 파일을 사용해서 Bean을 설정했습니다.

예시: applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans">
    <bean id="myBean" class="com.example.MyClass" />
</beans>
  • id: Bean의 이름입니다.
  • class: 생성할 클래스의 경로입니다.
  • 스프링 컨테이너는 이 설정을 보고 MyClass의 객체를 생성하고 Bean으로 등록합니다.

2) 어노테이션을 통한 Bean 등록

XML 설정의 번거로움을 줄이기 위해 어노테이션 기반의 설정이 등장했습니다.

@Component 어노테이션

@Component
public class MyClass {
    // 스프링이 자동으로 이 클래스를 Bean으로 등록합니다.
}
  • @Component를 붙이면 클래스가 스프링 컨테이너에 의해 자동으로 Bean으로 등록됩니다.
  • 스프링은 ComponentScan 기능을 통해 @Component가 붙은 클래스를 찾아 Bean으로 등록합니다.

@Bean 어노테이션

@Bean 어노테이션은 자바 코드에서 Bean을 등록할 때 사용됩니다.

예시:

@Configuration
public class AppConfig {

    @Bean
    public MyClass myClass() {
        return new MyClass();
    }
}
  • @Configuration: 이 클래스는 설정 파일임을 의미합니다.
  • @Bean: 이 메서드가 반환하는 객체를 스프링 컨테이너에 Bean으로 등록합니다.

3) XML과 어노테이션의 혼합 사용

XML 설정과 어노테이션을 함께 사용할 수도 있습니다.

applicationContext.xml:

<context:component-scan base-package="com.example" />
  • 이 설정은 com.example 패키지를 스캔하여 @Component, @Controller, @Service 어노테이션이 붙은 클래스를 찾아 Bean으로 등록합니다.

3. Spring 컨테이너와 의존성 주입 (DI)

스프링의 핵심 개념은 **의존성 주입(Dependency Injection, DI)**입니다.

의존성 주입이란?

  • 의존성: 클래스가 다른 객체를 필요로 하는 상황입니다.
  • 주입: 스프링 컨테이너가 필요한 객체를 자동으로 주입해주는 기능입니다.

@Autowired를 통한 의존성 주입

@Component
public class MyService {
    public void doSomething() {
        System.out.println("Service 작업 수행");
    }
}

@Component
public class MyController {
    @Autowired
    private MyService myService;

    public void execute() {
        myService.doSomething();
    }
}
  • @Autowired: 스프링 컨테이너가 MyService 객체를 찾아 MyController에 주입합니다.
  • 개발자는 객체를 생성하지 않아도 되고, 스프링이 객체 생성을 관리합니다.

4. 정리

스프링에서는 객체를 생성하고 관리하는 작업을 스프링 컨테이너에게 위임합니다. 이를 통해 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

  1. 직접적 객체 생성: new 키워드를 사용해 개발자가 직접 객체를 생성합니다.
  2. 간접적 객체 생성: 스프링이 객체 생성을 관리하고 Bean으로 등록합니다.
  3. Bean 등록 방법:
    • XML 설정: <bean> 태그를 사용
    • 어노테이션: @Component, @Bean 등을 사용
  4. 의존성 주입 (DI): @Autowired를 사용하여 객체를 자동으로 주입합니다.
Spring Boot 는 Annotation 기반 개발!

 

실습을 진행해보려고 한다. (Spring Web MVC Starter Project)

처음부터 도움 영상은 아무것도 보지 않고,

브라우저에서 애플리케이션에 localhost:8081/web/hello 로 요청하면 "Hello, World!" 메세지가 표시되도록 해보자.

home.html 이 필요할 것이고,

/hello 라는 요청을 HomeController 가 받을 것이다. 포트 번호는 8080이 아니라 8081, 그리고 context path 가 /web 이다.

 

일단, 시작은 spring initializr 로 가보자.

 

generate 를 해서 압축파일을 풀어서, 작업 디렉토리로 파일을 옮겨놓자.

그리고나서 intellJ에서 프로젝트 오픈을 하자.

 

그리고 JDK 연결을 가장 먼저 확인을 해보자. (settings, project structure)

 

일단 server.port = 8081 로 해줘야 한다.

그리고 /web 으로 요청이 왔을때 이 어플리케이션이 실행되도록 하려면 context path 를 걸어주어야 한다.

(resources/application.properties)

 

자, /hello 라는 요청이 왔을때 처리해야 될 controller를 만들어야 한다. HomeController 라고 이름을 지어보자.

그리고 @Controller 어노테이션을 붙어줘야 한다.

그리고 Get 방식으로 요청이 오는데, /hello 라는 요청을 받을 것. @GetMapping(/hello)

그리고 그 요청을 받아가지고 처리할 메서드가 하나 필요하다.

리턴 타입, 컨트롤러가 일을 처리한 다음에 어차피 결국에는 view page 에다가 그 결과값을 넘겨줘야 하기 때문에,

view 의 이름을 지정해야 하기 때문에 리턴 타입은 String 이다. 그래서 public String

메서드 이름은 임의대로. (home)

그리고, view 단으로 값을 넘길려면, Model 객체가 필요하다. home(Model model)

(* 지금은 사실상 필요가 없긴 한데, 나중에 필요할 거니까 그냥 써놓은 것. 지금은 없어도 괜찮음)

return 은 home.html 를 원하면, "home" 이라고 하면 된다.

 

* @GetMapping 을 하고 나서 괄호 안에도 " " 표시로 해줘야 한다는 점!

 

home.html 은 templates에 만들어져 있으면 된다.

만들고 나서 <body> 부분에 텍스트를 입력해보면 된다.

 

run 을 해보고 나서 확인을 해보면,