일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 자바
- ava백엔드
- 코틀린
- 스프링 부트
- devpi
- kotlin
- 객체지향
- Spring
- map
- 토큰
- Spring Boot
- SpringFramework
- Stream
- BEAN
- Token
- OOP
- JPA
- springboot
- Component
- JWT
- 소프트웨어설계
- 스프링
- javamailsender
- JPQL
- 오블완
- Configuration
- 클래스
- entity
- java
- 티스토리챌린지
- Today
- Total
DeveloPiano
Spring @Component, @Configuration, 커스텀 리졸버 이해하기 본문
Spring을 처음 접하면 다양한 어노테이션들과 빈(bean), 의존성 주입, 그리고 리졸버 등 익숙하지 않은 개념들이 한꺼번에 등장해 혼란스럽기 쉽습니다. 이번 포스팅에서는 @Component, @Configuration 그리고 HandlerMethodArgumentResolver(커스텀 리졸버) 같은 핵심 개념들을 정리해 보겠습니다.
1. 스프링 빈(Bean)과 @Component의 의미
스프링 빈이란?
스프링 컨테이너가 생성하고 관리하는 객체를 빈(Bean) 이라고 부릅니다. 이 객체들은 기본적으로 싱글톤(하나만 생성)으로 관리되며, 필요한 곳에 자동으로 주입됩니다.
@Component
@Component는 "이 클래스를 스프링 빈으로 등록해 주세요"라는 의미의 어노테이션입니다. 스프링은 컴포넌트 스캔(Component Scan) 기능을 통해 특정 패키지 이하에 있는 @Component가 붙은 클래스를 자동으로 빈으로 등록합니다.
역할 기반 어노테이션
다음 어노테이션들도 결국 @Component의 기능을 포함하고 있지만, 역할에 따라 분류한 것입니다:
- @Service: 비즈니스 로직 담당 클래스
- @Repository: 데이터베이스 접근 클래스 (예외 변환 처리 포함)
- @Controller: 웹 요청을 처리하는 클래스 (Spring MVC용)
이들은 내부적으로 @Component를 포함하고 있어 빈으로 등록됩니다.
2. @Configuration과 @Bean을 이용한 설정
@Configuration
@Configuration은 빈 설정 전용 클래스임을 나타냅니다. 내부에 @Bean 메서드를 정의해 필요한 객체를 수동으로 빈으로 등록할 수 있습니다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService(dependency());
}
@Bean
public SomeDependency dependency() {
return new SomeDependency();
}
}
이렇게 등록된 메서드는 내부적으로 CGLIB 프록시를 통해 호출되며, 싱글톤이 보장됩니다.
3. 의존성 주입 (Dependency Injection)
스프링에서는 객체 간의 의존 관계를 직접 new 하지 않고, 자동으로 주입해주는 방식으로 관리합니다. 대표적인 주입 방식은 세 가지입니다:
- 필드 주입 (권장되지 않음)
- 세터 주입
- 생성자 주입 (가장 권장됨)
@Component
public class MyComponent {
private final MyService service;
public MyComponent(MyService service) {
this.service = service; // 생성자 주입
}
}
생성자 주입은 불변성(immutable)을 지킬 수 있고, 테스트하기도 쉬운 구조입니다.
4. 커스텀 리졸버(HandlerMethodArgumentResolver)
Spring MVC에서 컨트롤러 메서드의 파라미터를 어떻게 채워줄지는 다양한 리졸버에 의해 결정됩니다. 예를 들어:
- @RequestParam: 쿼리 파라미터 처리
- @RequestBody: JSON 바디 처리
이 외에 사용자 정의 리졸버를 만들 수도 있습니다. 예를 들어 사용자 정보를 커스텀 애노테이션 @User를 통해 주입하고 싶다면 다음과 같은 방식이 필요합니다.
커스텀 리졸버 구현 예시
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(User.class)
&& parameter.getParameterType().equals(UserInfo.class);
}
@Override
public Object resolveArgument(...) {
// 예: HTTP 헤더에서 userId 추출 후 DB에서 UserInfo 조회
}
}
리졸버 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new UserArgumentResolver());
}
}
이 과정을 통해 컨트롤러에서 다음과 같은 코드가 가능해집니다:
@GetMapping("/profile")
public String getProfile(@User UserInfo user) {
return user.getName();
}
요약
- @Component: 클래스를 자동으로 빈으로 등록
- @Service, @Repository, @Controller: 역할별로 구분된 컴포넌트
- @Configuration: 빈 설정을 위한 클래스
- @Bean: 개발자가 명시적으로 등록하는 빈
- 생성자 주입: 가장 권장되는 의존성 주입 방식
- HandlerMethodArgumentResolver: 커스텀 애노테이션을 통해 파라미터 주입을 구현할 때 사용
이 개념들을 이해하고 나면, 스프링 프레임워크가 어떻게 컴포넌트를 구성하고 의존성을 연결하며, 컨트롤러의 파라미터를 자동으로 처리해주는지 명확하게 보이기 시작할 것입니다.
'Develop > Spring' 카테고리의 다른 글
Spring Boot 프로젝트에서 SSR과 클라이언트 스크립트의 혼합 사용 (2) | 2025.07.11 |
---|---|
JPA 엔티티 - new 사용 지양 & Static 메서드 활용 (1) | 2025.07.08 |
Spring의 Bean, Container, Component, Configuration 개념 정리 (1) | 2025.04.18 |
[Spring] 인스턴스화에 대해서 클래스, 객체와 비교해보기 (0) | 2025.04.17 |
Web server failed to start: Port 8080 was already in use 에러 해결 방법 (0) | 2025.03.31 |