목차
1 Spring03 실습 흐름
2 Spring에서 객체를 관리하는 방식
3 IoC
4 Bean
5 ApplicationContext
6 DI
7 생성자 주입
8 Setter 주입
9 value와 ref 차이
10 applicationContext.xml의 역할
11 getBean의 의미
12 오늘 복습 핵심 정리
1 Spring03 실습 흐름
1) 오늘 복습한 내용
(1) Spring03 실습
Spring03에서는 Spring이 객체를 직접 생성하고 관리하는 흐름을 실습했다.
Java 코드에서 직접 new를 사용해 객체를 만드는 방식이 아니라, XML 설정 파일에 Bean을 등록하고 Spring 컨테이너에서 객체를 꺼내 사용하는 방식을 배웠다.
(2) test01부터 test05까지의 공통 흐름
test01부터 test05까지 코드가 조금씩 다르지만, 전체적으로는 Spring의 IoC와 DI를 이해하기 위한 실습이다.
단순 값 주입, 생성자 주입, Setter 주입, Bean 참조 주입을 단계적으로 확인하는 흐름이라고 볼 수 있다.
(3) 핵심 목표
이번 실습의 핵심은 “객체를 누가 만들고, 필요한 값은 어떻게 넣고, 객체끼리는 어떻게 연결하는가”이다.
Spring에서는 이 역할을 개발자가 직접 하기보다 Spring 컨테이너가 대신 처리한다.
2 Spring에서 객체를 관리하는 방식
1) 기존 Java 방식
(1) 직접 객체 생성
기존 Java 방식에서는 객체가 필요할 때 개발자가 직접 new를 사용했다.
예를 들어 Score 객체가 필요하면 main 메소드 안에서 new Score()를 작성해야 했다.
(2) 직접 값 설정
객체를 만든 뒤에는 생성자나 setter를 이용해 개발자가 직접 값을 넣어야 했다.
즉, 객체 생성과 값 설정의 책임이 개발자 코드에 있었다.
(3) 문제점
객체가 많아질수록 new 코드가 많아지고, 객체끼리 연결하는 코드도 복잡해진다.
한 객체의 생성 방식이 바뀌면 그 객체를 사용하는 코드도 함께 수정해야 할 수 있다.
2) Spring 방식
(1) Spring 컨테이너가 객체 생성
Spring에서는 객체 정보를 XML 파일에 등록해두면 Spring 컨테이너가 객체를 생성한다.
개발자는 직접 new를 작성하지 않고, 컨테이너에서 필요한 객체를 꺼내 사용한다.
(2) 설정 파일 기반 관리
어떤 클래스를 객체로 만들지, 어떤 값을 넣을지, 어떤 객체와 연결할지는 applicationContext.xml 같은 설정 파일에 작성한다.
(3) 장점
객체 생성 코드와 사용 코드가 분리된다.
그래서 객체 생성 방식이나 주입 값이 바뀌어도 Java 코드를 크게 수정하지 않고 설정 파일만 바꿔서 처리할 수 있다.
3 IoC
1) IoC의 개념
(1) IoC
IoC는 Inversion of Control의 줄임말로 제어의 역전을 의미한다.
객체 생성과 관리의 제어권이 개발자에게 있는 것이 아니라 Spring 컨테이너에게 넘어가는 구조이다.
(2) 제어권
여기서 제어권은 객체를 언제 만들고, 어떻게 초기화하고, 언제 소멸시킬지 결정하는 권한을 말한다.
기존 Java에서는 개발자가 직접 제어했지만, Spring에서는 컨테이너가 이 역할을 담당한다.
(3) 쉽게 말하면
기존 방식은 개발자가 “내가 객체 만들고 내가 연결할게”라는 방식이다.
Spring 방식은 “객체 생성과 연결은 Spring이 해줄 테니, 개발자는 필요한 객체를 가져다 쓰자”라는 방식이다.
2) IoC를 사용하는 이유
(1) 코드가 단순해진다
객체 생성 코드가 줄어든다.
main 메소드나 비즈니스 코드에서 new를 반복해서 작성하지 않아도 된다.
(2) 객체 관리가 쉬워진다
객체 생성 정보가 XML 설정 파일에 모여 있기 때문에 어떤 객체가 어떻게 만들어지는지 한 곳에서 확인할 수 있다.
(3) 유지보수가 좋아진다
객체 생성 방식이나 연결 관계를 바꿀 때 Java 코드 전체를 수정하지 않아도 된다.
설정 파일만 바꿔도 흐름을 변경할 수 있다.
4 Bean
1) Bean의 개념
(1) Bean
Bean은 Spring 컨테이너가 관리하는 객체이다.
일반 Java 객체라도 Spring 설정 파일에 등록되어 Spring이 생성하고 관리하면 Bean이라고 부른다.
(2) 일반 객체와 Bean의 차이
일반 객체는 개발자가 new로 직접 만든 객체이다.
Bean은 Spring 컨테이너가 생성하고 관리하는 객체이다.
(3) 예시
Score 클래스 자체는 그냥 Java 클래스이다.
하지만 applicationContext.xml에 bean 태그로 등록하면 Spring이 관리하는 Bean이 된다.
2) bean 태그
(1) bean 태그의 역할
bean 태그는 Spring 컨테이너가 생성할 객체를 등록하는 태그이다.
id와 class 속성을 주로 사용한다.
(2) id 속성
id는 Bean을 구분하기 위한 이름이다.
나중에 getBean으로 객체를 꺼낼 때 이 id를 사용한다.
(3) class 속성
class는 실제로 객체를 생성할 클래스의 전체 경로이다.
패키지명까지 포함해서 작성해야 한다.
(4) 정리
bean 태그는 “Spring아, 이 클래스로 객체 하나 만들어서 이 이름으로 관리해줘”라는 뜻이다.
5 ApplicationContext
1) ApplicationContext의 개념
(1) ApplicationContext
ApplicationContext는 Spring의 IoC 컨테이너이다.
XML 설정 파일을 읽고, 그 안에 등록된 Bean들을 생성하고 관리한다.
(2) BeanFactory와의 관계
BeanFactory도 Spring IoC 컨테이너의 핵심 기능을 담당한다.
ApplicationContext는 BeanFactory를 확장한 컨테이너로, Bean 관리 기능에 추가 기능을 더 제공한다.
(3) 실습에서의 사용
실습에서는 ClassPathXmlApplicationContext를 사용해 applicationContext.xml 파일을 읽었다.
이때 Spring 컨테이너가 생성되고, XML에 작성된 Bean들이 준비된다.
2) ClassPathXmlApplicationContext
(1) 의미
ClassPathXmlApplicationContext는 classpath에 있는 XML 설정 파일을 읽어오는 클래스이다.
XML 파일에 등록된 Bean 정보를 읽고 객체를 생성한다.
(2) 사용 예
new ClassPathXmlApplicationContext("com/test01/prac/applicationContext.xml")처럼 작성하면 해당 경로의 XML 파일을 읽는다.
(3) 결과
XML 파일을 읽은 뒤에는 getBean을 사용해 등록된 Bean 객체를 가져올 수 있다.
6 DI
1) DI의 개념
(1) DI
DI는 Dependency Injection의 줄임말로 의존성 주입을 의미한다.
객체가 사용할 값이나 다른 객체를 직접 만들지 않고, 외부에서 넣어주는 방식이다.
(2) 의존성
의존성은 어떤 객체가 동작하기 위해 필요한 값이나 다른 객체를 의미한다.
예를 들어 Board 객체가 writer로 Member 객체를 필요로 한다면 Board는 Member에 의존한다고 볼 수 있다.
(3) 주입
주입은 필요한 값을 밖에서 넣어준다는 뜻이다.
Spring에서는 XML 설정 파일을 통해 생성자나 setter로 값을 넣어줄 수 있다.
2) DI를 사용하는 이유
(1) 객체 간 결합도를 낮춘다
한 클래스가 다른 클래스를 직접 new로 만들면 두 클래스가 강하게 연결된다.
DI를 사용하면 객체 연결을 설정 파일에서 관리할 수 있어 결합도가 낮아진다.
(2) 코드 수정이 줄어든다
의존하는 객체가 바뀌어도 Java 코드보다 설정 파일을 수정하는 방식으로 처리할 수 있다.
(3) 테스트와 유지보수가 쉬워진다
필요한 객체를 외부에서 바꿔 넣을 수 있기 때문에 테스트용 객체로 교체하기 쉽다.
7 생성자 주입
1) 생성자 주입의 개념
(1) 생성자 주입
생성자 주입은 객체를 만들 때 생성자를 통해 값을 넣는 방식이다.
XML에서는 constructor-arg 태그를 사용한다.
(2) 사용 상황
객체가 생성될 때 반드시 필요한 값이 있다면 생성자 주입을 사용하기 좋다.
예를 들어 Score 객체가 name, kor, eng, math 값을 반드시 가져야 한다면 생성자로 한 번에 넣을 수 있다.
(3) 실습 예시
Score 클래스에 name, kor, eng, math를 받는 생성자가 있고, XML에서 constructor-arg로 값을 넣었다.
Spring은 이 값을 이용해 Score 객체를 생성한다.
2) constructor-arg
(1) constructor-arg의 역할
constructor-arg는 생성자의 매개변수에 들어갈 값을 지정하는 태그이다.
(2) value 속성
value는 문자열, 숫자 같은 단순 값을 넣을 때 사용한다.
예를 들어 이름, 점수, 전화번호 같은 값은 value로 넣을 수 있다.
(3) ref 속성
ref는 다른 Bean 객체를 넣을 때 사용한다.
단순 값이 아니라 Spring이 관리하는 다른 객체를 연결할 때 사용한다.
(4) index 속성
index는 생성자 매개변수의 순서를 지정할 때 사용한다.
index="0"은 첫 번째 매개변수, index="1"은 두 번째 매개변수를 의미한다.
8 Setter 주입
1) Setter 주입의 개념
(1) Setter 주입
Setter 주입은 객체를 먼저 생성한 뒤 setter 메소드를 통해 값을 넣는 방식이다.
XML에서는 property 태그를 사용한다.
(2) 사용 조건
Setter 주입을 하려면 클래스 안에 setter 메소드가 있어야 한다.
예를 들어 name 값을 주입하려면 setName 메소드가 필요하다.
(3) 사용 상황
객체 생성 후에 선택적으로 값을 바꾸거나 넣을 수 있는 경우 setter 주입을 사용할 수 있다.
2) property 태그
(1) property의 역할
property 태그는 setter 메소드를 통해 값을 주입할 때 사용한다.
(2) name 속성
name은 클래스의 필드명 또는 setter 기준의 이름이다.
예를 들어 name="title"이면 setTitle 메소드를 찾아 값을 넣는다.
(3) value 속성
value는 단순 값을 넣을 때 사용한다.
문자열, 숫자 같은 값을 넣을 때 사용한다.
(4) ref 속성
ref는 다른 Bean을 참조해서 넣을 때 사용한다.
객체 안에 또 다른 객체가 필요한 경우 ref로 연결한다.
9 value와 ref 차이
1) value
(1) value의 의미
value는 단순 값을 넣을 때 사용한다.
문자열, 숫자, 전화번호, 제목 같은 값은 value로 주입한다.
(2) 예시
name에 "홍길동"을 넣거나 kor에 90을 넣는 경우 value를 사용한다.
(3) 쉽게 말하면
value는 “그냥 값”을 넣는 것이다.
2) ref
(1) ref의 의미
ref는 다른 Bean 객체를 연결할 때 사용한다.
이미 Spring 컨테이너에 등록된 Bean의 id를 적어서 해당 객체를 주입한다.
(2) 예시
Board 객체의 writer 필드에 Member 객체를 넣고 싶다면 Member를 먼저 bean으로 등록하고, Board에서 ref로 연결한다.
(3) 쉽게 말하면
ref는 “다른 bean 객체”를 넣는 것이다.
3) value와 ref 구분법
(1) 단순 데이터면 value
이름, 제목, 내용, 점수, 전화번호처럼 단순 값이면 value를 사용한다.
(2) 객체면 ref
Member, Board, Wallet처럼 다른 클래스의 객체를 넣어야 하면 ref를 사용한다.
(3) 중요한 차이
value는 값을 새로 넣는 것이고, ref는 이미 등록된 Bean을 찾아서 연결하는 것이다.
10 applicationContext.xml의 역할
1) XML 설정 파일
(1) 설정 메타 정보
applicationContext.xml은 Spring 컨테이너가 객체를 만들고 연결하기 위해 읽는 설정 파일이다.
Spring에서는 이런 설정 정보를 configuration metadata라고 볼 수 있다.
(2) Bean 등록
어떤 클래스를 Bean으로 만들지 bean 태그로 작성한다.
id와 class를 지정하면 Spring이 해당 클래스로 객체를 생성한다.
(3) 값 주입
constructor-arg나 property 태그를 이용해 객체에 필요한 값을 넣는다.
이 과정이 DI이다.
2) XML을 쓰는 이유
(1) 객체 생성 코드 분리
Java 코드에서 new를 직접 작성하지 않아도 된다.
객체 생성 정보가 XML에 모이기 때문에 관리하기 쉽다.
(2) 의존 관계 확인
어떤 객체가 어떤 값을 가지고, 어떤 객체를 참조하는지 XML에서 확인할 수 있다.
(3) 수정이 쉬움
Java 코드를 수정하지 않고 XML 설정만 바꿔 객체 생성 값이나 연결 관계를 바꿀 수 있다.
11 getBean의 의미
1) getBean
(1) getBean의 역할
getBean은 Spring 컨테이너에 등록된 Bean 객체를 꺼내오는 메소드이다.
XML에서 설정한 id 값을 이용해 원하는 객체를 가져온다.
(2) 사용 흐름
먼저 ApplicationContext가 XML 파일을 읽는다.
그 다음 getBean("beanId")를 호출하면 해당 id를 가진 Bean 객체를 반환한다.
(3) 형변환
getBean은 기본적으로 Object 타입으로 반환된다.
그래서 필요한 클래스 타입으로 형변환해서 사용한다.
2) 중요한 의미
(1) 직접 new 하지 않는다
getBean을 사용한다는 것은 개발자가 직접 객체를 생성하지 않는다는 뜻이다.
객체는 이미 Spring 컨테이너가 생성해서 관리하고 있다.
(2) 컨테이너에서 꺼내 쓴다
개발자는 필요한 Bean을 컨테이너에서 꺼내서 사용한다.
이것이 Spring의 IoC 흐름이다.
12 오늘 복습 핵심 정리
1) Spring의 핵심은 객체 관리이다
(1) 기존 방식
기존 Java에서는 개발자가 직접 new로 객체를 만들고 값을 넣었다.
(2) Spring 방식
Spring에서는 객체를 Bean으로 등록하고, Spring 컨테이너가 객체를 생성하고 관리한다.
(3) 핵심 차이
객체 생성과 관리의 주체가 개발자에서 Spring 컨테이너로 바뀐다.
이것이 IoC이다.
2) Bean은 Spring이 관리하는 객체이다
(1) Bean 등록
applicationContext.xml에서 bean 태그로 객체를 등록한다.
(2) Bean 사용
ApplicationContext가 XML을 읽고 Bean을 생성한다.
이후 getBean으로 필요한 Bean을 꺼내 사용한다.
(3) Bean 이름
id는 Bean을 구분하는 이름이다.
getBean을 사용할 때 이 id가 필요하다.
3) DI는 필요한 값을 외부에서 넣는 것이다
(1) 생성자 주입
constructor-arg를 사용한다.
객체 생성 시점에 필요한 값을 한 번에 넣는다.
(2) Setter 주입
property를 사용한다.
객체 생성 후 setter 메소드를 통해 값을 넣는다.
(3) value와 ref
value는 단순 값을 넣을 때 사용한다.
ref는 다른 Bean 객체를 넣을 때 사용한다.
4) test01부터 test05까지의 큰 흐름
(1) test01
Spring 컨테이너가 객체를 생성하고 getBean으로 가져오는 기본 흐름을 확인하는 실습으로 볼 수 있다.
(2) test02
Emp 같은 객체를 Bean으로 등록하고 값을 주입하는 방식으로, 일반 Java 객체를 Spring Bean으로 관리하는 흐름을 연습하는 실습으로 볼 수 있다.
(3) test03과 test04
생성자 주입과 Setter 주입처럼 Bean에 값을 넣는 여러 방식을 비교하며 확인하는 흐름으로 볼 수 있다.
(4) test05
단순 값뿐만 아니라 Bean과 Bean을 연결하는 ref 개념까지 확장해서 보는 실습으로 볼 수 있다.
예를 들어 Board 객체 안에 writer로 Member 객체를 연결하는 구조가 여기에 해당한다.
5) 한 문장 정리
(1) IoC
객체 생성과 관리의 제어권을 Spring 컨테이너가 가지는 것이다.
(2) DI
객체에 필요한 값이나 다른 객체를 외부 설정을 통해 넣어주는 것이다.
(3) Bean
Spring 컨테이너가 생성하고 관리하는 객체이다.
(4) ApplicationContext
Bean 설정 파일을 읽고 Bean을 생성, 관리, 제공하는 Spring 컨테이너이다.
(5) constructor-arg
생성자를 통해 값을 주입할 때 사용한다.
(6) property
setter를 통해 값을 주입할 때 사용한다.
(7) value
문자열, 숫자 같은 단순 값을 주입할 때 사용한다.
(8) ref
다른 Bean 객체를 참조해서 주입할 때 사용한다.
6) 오늘 배운 점
(1) Spring은 단순히 웹 개발만 위한 도구가 아니다
Spring의 시작은 객체를 어떻게 만들고 연결하고 관리할 것인지에 대한 구조를 이해하는 것이다.
(2) XML 설정 파일은 객체 생성 설명서이다
applicationContext.xml은 Spring에게 어떤 객체를 만들고 어떤 값을 넣고 어떤 객체끼리 연결할지 알려주는 파일이다.
(3) new 대신 getBean을 사용한다
객체를 직접 생성하지 않고 Spring 컨테이너에서 꺼내 쓰는 방식이 Spring의 기본 흐름이다.
(4) value와 ref를 구분하는 것이 중요하다
단순 값이면 value를 사용하고, 다른 Bean 객체를 연결할 때는 ref를 사용한다.
이 차이를 이해하면 Spring XML 설정을 읽는 것이 훨씬 쉬워진다.
(5) 앞으로의 흐름
지금은 XML로 Bean을 등록하고 주입하는 방식을 배웠다.
이후에는 어노테이션을 이용해 Bean을 등록하고, Spring MVC에서 Controller, Service, DAO 객체를 자동으로 연결하는 방식으로 확장될 수 있다.
'멀티캠퍼스' 카테고리의 다른 글
| [2026.06.18] - TIL 54일차 Spring Annotation 기반 DI와 AOP 개념 정리 (0) | 2026.06.18 |
|---|---|
| [2026.06.17] - TIL 53일차 Spring Bean 설정 심화 복습 정리 (0) | 2026.06.18 |
| [2026.06.15] - TIL 51일차 Spring 기초, STS3 설치, IoC/DI, Bean 설정 정리 (1) | 2026.06.15 |
| [2026.06.12] - TIL 50일차 시큐어코딩 정리 (0) | 2026.06.15 |
| [2026.06.11] - TIL 49일차 MyBatis MYBOARD 게시판 CRUD 정리 (0) | 2026.06.15 |