
저번 글을 쓰게 된 이유...! Spring boot에서 여러 액션을 처리하기 전에 Rq 객체를 더 확실하게 처리하게 하기 위해서 BeforeActionInterceptor 클래스를 생성하였다.
이걸 처리해주는 과정에서 클래스에 @Component 어노테이션을 작성해주지 않아서 Bean으로 등록되지 않았다. 오류는 어노테이션을 지정해주어서 간단하게 처리할 수 있었지만 그렇다면 @Component 어노테이션은 어떤 역할을 하며, Bean은 또 어떤 역할을 하는 지 알아보자..!
Bean, Spring IoC(제어의 역전, Inversion Of Control) 컨테이너에 의해 생성되고 관리되는 자바 객체를 빈(Bean)이라고 한다. 기존의 자바 프로그래밍에서는 클래스를 생성하고, 원하는 객체를 직접 new를 사용하여 생성한 후 사용했다. 하지만 Spring 에서는 직접 생성해낸 객체가 아니라 Spring에 의하여 관리당하는 자바 객체를 사용한다. 이 때 사용하는 자바 객체를 Bean 이라고 한다.
IoC는 스프링의 특징 중 하나로, 객체의 생성과 관리를 개발자가 직접하는 것이 아닌! 외부에서 대신 해주는 것을 말한다. IoC는 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 한다.
@Component 어노테이션은 개발자가 생성한 클래스를 Bean으로, 즉 IoC가 관리하는 자바 객체로 등록하고 싶을 때 사용하는 어노테이션이다.
아래는 BeforeActionInterceptor 클래스의 코드이다. 클래스를 생성해주는 과정에서 @Component 어노테이션을 지정하주지 않아서 생성한 rq 객체가 다른 클래스에서 사용하려고 할 때에 제대로 적용되지 않았다.
package com.example.demo.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import com.example.demo.vo.Rq;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class BeforeActionInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Rq rq = new Rq(request, response);
request.setAttribute("rq", rq);
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}

🌐 참고 사이트
➡️ 스프링(Spring)에서 자주 사용하는 Annotation 개념 및 예제 정리
➡️ [Spring DI/IoC] IoC? DI? 그게 뭔데?