일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 조건판단문
- web-vitals
- 리액트오류해결
- git사용자등록
- 데이터베이스
- Polylang
- 구글
- PostView
- 중첩라우팅
- 구글애널리틱스
- wp_post
- sql연결
- firebase
- 워드프레스
- useEffect
- SEO
- 플러그인
- GA4
- router
- Thymeleaf
- URLSearchParams
- 구글바드
- mysql-select
- useNavigate
- ChatGPT
- 구글알고리즘
- path variable
- White HAT
- 리액트오류
- useLocation
- Today
- Total
개발천재
[Spring Boot] Bean 개념과 이해, @Autowired 본문
Bean은 Spring이 객체(Object)를 대신 만들어주고 관리해주는 기능
Bean 이해하기
Spring Boot에서 Bean(빈)은 Spring이 관리하는 객체를 말한다. 쉽게 말하면, Spring이 알아서 만들어서 개발자가 필요할 때 가져다 쓸 수 있게 준비해 놓는 자바 객체라고 생각하면 된다.
예를 들면 커피 자판기가 있다고 가정해보자. Bean은 자판기 안에 준비된 커피를 말한다. 커피는 객체라고 할 수 있다. 그리고 Spring은 커피 자판기를 말하는 것이다. 우리가 버튼을 누르면(요청을 하면) 커피 자판기가 커피를 만들어주는 것처럼 Spring은 Bean을 만들어서 개발자가 가져다 쓸 수 있게 해주는 것이다.
✔ Bean = 자판기 안에 준비된 커피(객체)
✔ Spring = 커피 자판기(객체를 대신 만들어주는 시스템)
✔ 개발자(우리) = 버튼만 누르면 커피(Bean)를 가져다 씀
Spring Boot를 쓰지 않고 순수 Java를 사용하면 객체를 직접 new로 생성하고, 의존성 주입도 직접 코드로 관리해야 한다. Spring Boot는 이런 과정을 자동으로 처리해주는 Bean 관리 시스템을 제공하는 것이다. 그래서 Spring Boot를 사용하면 객체 관리 부담이 줄어들고 개발에만 집중할 수 있는 환경이 만들어진다.
구분 | Spring Boot | 순수 Java |
객체 생성 | @Service, @Bean 등으로 자동 관리 | new 키워드로 수동 생성 |
의존성 주입 | @Autowired, 생성자 주입으로 자동 | 생성자 주입을 직접 구현 |
라이프사이클 관리 | Spring이 자동 관리 | 개발자가 수동 관리 |
유지보수 | 편리하고 확장성 좋음 | 코드가 길어지고 복잡해짐 |
Bean 만드는 방법
자동 생성 (Auto Configuration)
Spring이 개발자를 대신해서 자동으로 Bean을 생성해주는 방식이다. Spring Boot에선 @Component, @Service, @Repository, @Controller 같은 어노테이션을 클래스 위에 붙이면 Bean이 자동으로 생성된다.
단, 너무 많은 Bean이 자동 생성되면 어떤 Bean이 어디서 생성됐는지 헷갈릴 수 있고, 이름이 같은 Bean이 여러 개 있으면 충돌할 가능성이 있다.
- @Component: 모든 일반 객체
- @Service: 비즈니스 로직을 담는 객체
- @Repository: 데이터를 다루는 객체
- @Controller: 웹 요청을 처리하는 객체
import org.springframework.stereotype.Service;
@Service // 이 클래스는 Bean으로 등록돼요!
public class CoffeeService {
public String getCoffee() {
return "아메리카노 한 잔!";
}
}
수동 생성 (Manual Configuration)
개발자가 직접 어떤 객체를 Bean으로 등록할지 지정하는 방법이다. Configuration 클래스 안에 @Bean을 메서드에 붙이면 되면 생성할 수 있다.
단 수동생성은 하나하나 등록해야 하므로 코드가 길어질 수 있고, 자동 생성보다 설정 작업이 많을 수 있다.
// Spring이 userService() 메서드를 호출해서 UserService 객체를 Bean으로 등록한다.
@Configuration // 설정 클래스
public class AppConfig {
@Bean // 이 메서드가 반환하는 객체를 Bean으로 등록
public UserService userService() {
return new UserService();
}
}
@Autowired, Bean 가져다 쓰기 (주입받기)
Spring이 만든 Bean을 가져다 쓸 땐 @Autowired를 사용한다.
@Autowired는 Spring Framework에서 의존성 주입(Dependency Injection)을 하기 위해 사용하는 어노테이션이다. 이 어노테이션은 Spring IoC (Inversion of Control) 컨테이너에 등록된 빈(Bean)을 자동으로 주입해 준다. 의존성 주입은 객체 간의 결합도를 낮추고, 테스트 및 유지보수를 용이하게 만든다.
*의존성 주입(Dependency Injection, DI)
클래스가 자신이 사용할 객체를 직접 생성하는 것이 아니라, 외부에서 생성해서 주입해주는 방식이다. Spring에서 DI를 활용하면, 클래스 간의 의존 관계를 자동으로 관리해줄 수 있다.
@Autowired로 의존성 주입을 받는 방식은 필드 주입, 생성자 주입, 세터 주입 이렇게 3가지가 있으며, 각 방식의 특징을 이해하고 상황에 맞게 선택해서 사용해야 한다. 가장 권장되는 방식은 생성자 주입인데, 이는 객체의 불변성을 보장하고, 테스트를 용이하게 한다.
생성자 주입 방식(Constructor Injection)
생성자를 통해 의존성을 주입받는 방식이다. 객체 생성 시점에 의존성을 주입받기 때문에 불변성을 보장할 수 있고, 주입되지 않은 의존성은 컴파일 시점에서 확인할 수 있다.
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired // Spring 4.3 이후에는 @Autowired를 생략해도 생성자가 하나만 있으면 자동으로 주입됨
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
필드 주입(Field Injection)
필드에 @Autowired를 붙여서 자동으로 의존성을 주입받는 방식이다. 간편하고 코드가 짧아 가장 간단한 방법이지만, 테스트하기 어렵, 객체가 불변(immutable)이 아니게 되어 문제가 생길 가능성이 있다.
@Component
public class UserService {
@Autowired
private UserRepository userRepository; // 자동으로 UserRepository가 주입됨
public void saveUser(User user) {
userRepository.save(user);
}
}
세터 주입(Setter Injection)
세터 메서드를 사용해서 의존성을 주입받는 방식이다. 옵셔널한 의존성에 대해 유용할 수 있지만, 필드나 생성자 주입처럼 객체를 불변으로 만들 수는 없다.
@Component
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
'개발 준비 > Spring Boot' 카테고리의 다른 글
[Spring Boot] MVC 패턴 이해하기 (3) | 2025.02.14 |
---|---|
[Spring Boot] @RequestParam 사용법 (5) | 2025.02.12 |
[Spring Boot] Thymeleaf 개념 이해하기, 사용방법 (10) | 2025.02.11 |
[Spring Boot] Lombok 추가하기 (0) | 2025.02.10 |
[Spring Boot] Git에 Push 하기(인텔리제이) (0) | 2025.02.10 |