반응형
1장: Spring Boot와 제어의 역전(IoC) / 의존성 주입(DI)
Spring의 가장 핵심적인 사상인 IoC와 DI를 다시 한번 확실히 이해하는 챕터입니다. 왜 우리가 new 키워드로 객체를 직접 생성하지 않고, 스프링에게 객체 관리를 맡기는지에 대한 '철학'을 다집니다. 이것이 바로 클래스 간의 결합도를 낮추고 유연하고 확장 가능한 설계를 만드는 첫걸음입니다.
1. 핵심 개념
- Bean: Spring IoC 컨테이너가 관리하는 자바 객체입니다.
@Component,@Service,@Repository,@Controller등의 어노테이션이 붙은 클래스들이 스캔되어 Bean으로 등록됩니다. - IoC (Inversion of Control, 제어의 역전): 객체의 생성, 생명주기 관리 등을 개발자가 아닌 프레임워크(스프링 컨테이너)가 대신 해주는 것을 의미합니다. 제어권이 개발자에서 프레임워크로 넘어갔기 때문에 '제어의 역전'이라고 부릅니다.
- DI (Dependency Injection, 의존성 주입): 어떤 객체가 사용하는 다른 객체(의존성)를 외부(스프링 컨테이너)에서 직접 주입해주는 방식입니다.
new키워드를 사용하지 않고 필요한 객체를 얻을 수 있어 클래스 간의 결합도(coupling)를 낮춥니다.
2. 예제를 통한 복습
dongjinWeb1/src/main/java/example/day08/_2MVC/ 프로젝트에서 MVC 각 계층이 서로를 필요로 할 때 어떻게 DI를 사용했는지 다시 살펴봅시다.
Controller → Service 의존성 주입
// MvcController.java
@RestController
public class MvcController {
@Autowired // [2] Service 빈 주입
private MvcService mvcService;
@GetMapping("/day08/mvc")
public void method(){
mvcService.method(); // 직접 new MvcService() 하지 않고, 주입받은 객체를 사용
}
}
Service → Repository(DAO) 의존성 주입
// MvcService.java
@Service
public class MvcService {
@Autowired // [2] Repository(DAO) 빈 주입
private MvcDao mvcDao;
public void method(){
mvcDao.method(); // 직접 new MvcDao() 하지 않고, 주입받은 객체를 사용
}
}
이처럼 @Autowired를 통해 스프링 컨테이너에 미리 등록된 Bean을 '주입'받아 사용함으로써, 각 클래스는 자신이 어떤 구체적인 구현체에 의존하는지 신경 쓸 필요가 없어집니다.
3. 직접 풀 문제
@Autowired를 사용한 필드 주입 방식 대신, 생성자 주입 방식을 사용하도록MvcController와MvcService코드를 수정해보세요. (힌트:final키워드와 클래스 생성자를 사용합니다.)간단한
MessageService클래스를 만들고@Component어노테이션을 붙여 Bean으로 등록한 뒤,MvcController에서 주입받아 "Hello, Spring!"을 출력하는 메소드를 호출해보세요.
문제 1 정답 예시
// MvcController.java 수정 예시
@RestController
@RequiredArgsConstructor // final 필드에 대한 생성자를 자동으로 만들어주는 Lombok 어노테이션
public class MvcController {
private final MvcService mvcService;
@GetMapping("/day08/mvc")
public void method(){
mvcService.method();
}
}
반응형
'백엔드 > 스프링' 카테고리의 다른 글
| [Spring] 5장: Spring Security를 이용한 인증과 인가 (0) | 2025.09.18 |
|---|---|
| [Spring] 4장: JPA와 Spring Data JPA로의 도약 (0) | 2025.09.18 |
| [Spring] 3장: MyBatis를 이용한 데이터베이스 연동 (0) | 2025.09.18 |
| [Spring] 2장: Spring MVC와 웹 요청 처리 (0) | 2025.09.18 |
| [Spring] Spring Boot 로드맵: 실무 역량을 갖춘 백엔드 개발자로 거듭나기 (0) | 2025.09.18 |
| [Spring] 자바 스프링 프레임워크 개론 (0) | 2025.09.16 |
| [Spring] WebSocket 요약 정리 (0) | 2025.09.15 |
| [Spring] MyBatis 어노테이션 기반 문법 (0) | 2025.09.15 |