이제부터 객체(Object) 관리를 내가(개발자) 직접 하지 않고, 스프링(Spring)에게 맡기겠다는 의미로 스프링을 쓰라고 했습니다.
가장 헷갈리는 부분은 "그냥 String name = "Ranga";라고 쓰면 되는데 왜 굳이 복잡하게 설정을 만들지?"라는 점이고, 이 과정은 스프링 프레임워크의 핵심 원리를 이해하는 첫 단추입다.
일반적인 자바 코드가 '직접 요리하기'라면, 스프링 코드는 '식당에 주문하기'입니다.
new 키워드를 써서 직접 객체를 생성하고 관리합니다.HelloWorldConfiguration.java이 파일은 "스프링이 관리해야 할 객체들이 무엇인지 적어둔 메뉴판"입니다.
@Configuration // 1. "이 클래스는 설정 정보(메뉴판)입니다"라고 알려주는 표시
public class HelloWorldConfiguration {
@Bean // 2. "이 메서드가 반환하는 결과물을 스프링이 맡아주세요"라고 등록
public String name() {
return "Ranga"; // 스프링이 관리하게 될 실제 값
}
}
@Configuration: 스프링에게 "이 파일은 설정 파일이야"라고 알려줍니다.@Bean: 스프링 컨테이너(주방)가 관리하는 객체를 '빈(Bean)'이라고 부릅니다. 이 어노테이션을 붙이면, 메서드 이름인 name이라는 이름으로 "Ranga"라는 문자열이 스프링의 관리 목록에 등록됩니다.App02HelloWorldSpring.java이 파일은 "스프링 주방(컨테이너)을 실제로 가동하고, 객체를 꺼내 쓰는 곳"입니다.
// 1. 스프링 컨텍스트(주방) 실행
var context =
new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
// 2. 스프링에게 관리 중인 객체 달라고 요청 (주문)
System.out.println(context.getBean("name"));
new AnnotationConfigApplicationContext(...): 이게 바로 스프링 컨텍스트(컨테이너)를 실행하는 코드입니다. 괄호 안에 HelloWorldConfiguration.class를 넣은 것은, "이 설정 파일(메뉴판)을 보고 주방을 세팅해라"라고 명령한 것입니다.context.getBean("name"): 이제 내가 직접 new String(...)을 하지 않습니다. 대신 이미 실행된 컨텍스트(context)에게 "아까 설정 파일에 name이라는 이름으로 등록된 빈(Bean) 좀 줘"라고 요청하는 것입니다. 그러면 스프링은 관리하고 있던 "Ranga"를 꺼내줍니다."JVM 내부에서 Spring 컨텍스트를 생성하고... Spring 프레임워크가 관리하도록 할 것입니다"라고 한 말이 바로 이 과정입니다.
@Configuration)를 만들었습니다.@Bean)을 정의해서 스프링에게 "이 객체 네가 좀 맡아줘(관리해 줘)"라고 위임했습니다.ApplicationContext)를 실행시켜서 스프링을 깨웠습니다.getBean을 사용해서 스프링이 가지고 있는 객체를 꺼내 왔습니다.이것을 전문 용어로 IoC (Inversion of Control, 제어의 역전)라고 부릅니다. 개발자가 직접 제어(생성)하던 것을 스프링 프레임워크에게 넘겨줬다는 뜻입니다.