코딩 이래요래
Spring Framework 핵심 개념 본문
1. IoC (Inversion of Control)
- 제어의 역전 즉, 객체의 생성, 초기화 등 개발자가 직접 제어하는 것이 아닌, 컨테이너가 대신 관리하는 개념
1-1. IoC 구조
☑️ 기존의 의존성 주입
// controller
public class UserController {
UserService userService = new JCFUserService(); // 객체를 직접 생성
}
// service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// repository
public class UserRepository {
public void findUserById(Long id){
//
}
}
- controller에서 service 객체를 직접 초기화 하고있음
- 객체를 직접 생성하여 코드는 명확하지만, 객체간의 결합도가 높아지고 코드의 유연성이 떨어짐 (확장성 ↓)
✅ IoC 컨테이너에게 객체 제어권 위임
// controller
@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
}
// service
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// repository
@Repository
public class UserRepository {
public void findUserById(Long id){
//
}
}
- 개발자가 객체의 생성을 직접 하지 않고, 인터페이스(Service, Repository)만 정의함
- Spring의 IoC를 통해 객체의 생성, 초기화를 대신 처리하므로 테스트나 확장에 유리함
2. IoC Container
- IoC를 구현한 프레임워크로 객체의 생성, 초기화 등을 자동으로 수행할 수 있음
Spring IoC Container
- 다양한 IoC 컨테이너를 제공하지만 가장 많이 사용되는 것은 ApplicationContext 임
- 주 역할은 Bean객체들을 생성, 관리 등 LifeCycle을 책임짐
Configuration Metadata
- IoC 컨테이너가 어떤 객체를 어떻게 생성 및 의존성을 주입해야 하는지에 대한 정보 (작업 명세서)
- 컨테이너에 POJO, Configuration Metadata를 제공하면 Bean 객체를 내부적으로 생성하여 관리
- Spring의 Configuration Metadata 구성 방법
구분 | 권장 | 설명 |
XML 방식 | X | 명시적이지만 타입 안정성 부족 |
Java Config | O | 명시적이고 타입 안정성 확보, Spring boot 기본 |
Annotation 기반 | O | 보통 Java Config와 함께 사용함 |
- 실무에서는 Java Config를 기준으로 Annotation 기반을 하이브리드 형태로 많이 사용함
3. Bean
- Spring IoC Container에 의해 관리되는 객체를 말함
- Spring이 생성, 초기화 등 생명주기를 관리당하는 특별한 대상
3-1 Bean == POJO ??
- POJO (Plain Old Java Object) ?
- 어떤 프레임워크나 라이브러리에 의존하지 않는 순수 Java 객체를 말함 (Member, Channel ..)
- POJO는 Spring이 관리하게 되는 순간 Bean이라고 부르기 때문에 Bean은 기본적으로 POJO일 수 있지만, 모든 POJO가 Bean은 아님
4. DI (Dependency Injection)
public class UserController {
// UserController는 JCFUserService를 의존하고 있음
UserService userService = new JCFUserService();
}
- 위 코드처럼 클래스 내에서 객체를 직접 생성하는 구조는 강한 결합을 가지는 구조이므로, 인터페이스 교체나 테스트에 불리함
@Controller
public class UserController {
private final UserService userService;
@Autowired // Spring IoC 컨테이너에 관리되는 Bean을 통해 자동으로 의존성을 주입해줌
public UserController(UserService userService) {
this.userService = userService;
}
}
- 위 코드처럼 객체를 직접 생성하지 않고, 생성자 주입 방식을 사용하여 외부에서 주입 받는 방식임
- IoC 컨테이너가 객체의 생성과 초기화를 자동으로 처리해 주기 때문에, 개발자는 비즈니스 로직 구현에만 집중할 수 있음
- 이로 인해 결합도는 낮아지고 유연한 구조를 가질 수 있음
💡 DI(Dependency Injection)는 IoC(Inversion of Control)를 구현하는 대표적인 방법으로, 두 개념은 매우 밀접한 관계를 가짐
5. AOP (Aspect Oriented Programming) - 관점 지향 프로그래밍
- OOP는 역할에 따라 책임을 분리하는 방법으로 실제 시스템을 설계하다 보면 모든 모듈에서 반복적으로 중복되는 코드들이 있음
- 이러한 핵심 비즈니스 로직을 제외한 공통 기능을 하나의 모듈로 분리하여 관리하는 방법
해당 게시글은 학습한 내용을 정리하고 복습하며 정리한 글이므로 틀린 부분이 있을 수 있음.
'JAVA' 카테고리의 다른 글
Spring Boot + Prometheus + Grafana 대시보드 만들기 (3) | 2025.06.17 |
---|---|
Spring Data JPA (1) | 2025.05.30 |
자료구조 - Tree, Binary Tree (0) | 2025.04.16 |
자료구조 - Stack, Queue, Deque (0) | 2025.04.13 |
자료구조 - List (0) | 2025.04.13 |