1. 스프링과 객체 생성
일반적으로 Java에서는 객체를 생성하려면 new 키워드를 사용해야 합니다.
직접적 객체 생성 (수동 생성)
MyClass obj = new MyClass();
- 위의 코드처럼 개발자가 직접 객체를 생성하는 방식입니다.
- 이 방식은 객체가 다른 클래스에 강하게 결합되므로 유지보수와 테스트가 어렵습니다.
간접적 객체 생성 (Spring이 관리)
스프링은 객체를 직접 생성하지 않고, 대신 Spring 컨테이너에게 객체 생성을 위임합니다.
- 스프링 컨테이너
- 스프링은 ApplicationContext나 BeanFactory라는 컨테이너를 통해 객체를 관리합니다.
- 이때 생성되고 관리되는 객체를 Bean이라고 합니다.
- 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. 정리
스프링에서는 객체를 생성하고 관리하는 작업을 스프링 컨테이너에게 위임합니다. 이를 통해 유연하고 재사용 가능한 코드를 작성할 수 있습니다.
- 직접적 객체 생성: new 키워드를 사용해 개발자가 직접 객체를 생성합니다.
- 간접적 객체 생성: 스프링이 객체 생성을 관리하고 Bean으로 등록합니다.
- Bean 등록 방법:
- XML 설정: <bean> 태그를 사용
- 어노테이션: @Component, @Bean 등을 사용
- 의존성 주입 (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 을 해보고 나서 확인을 해보면,