인프런 커뮤니티 질문&답변

kwj3591님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

애노테이션 @PostConstruct, @PreDestroy

Request 중 Bean 활용에 대한 질문

작성

·

221

1

안녕하세요 강사님! 다름이 아니라 강의 내용을 토대로 앱 빌딩에 활용해보고 있던 중에 질문이 있어서 질문을 남기게 되었습니다.

기존 외부 Library 는 다음과 같았습니다.

public class SSOAuth {

    private HttpServletRequest request;
    private HttpServletResponse response;
    
    private Map<String, Object> attributes = new HashMap<String, Object>();
    private Properties properties;

    // 생성자
    public SSOAuth (HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        this.request = request;
        this.response = response;
        this.properties = new Properties();

        // 초기화로 보임
        // File 에 있는 properties 정보로 통신 준비
        InputStream is = null;
        File file = new File("C:/spring/processdesign/processdesign/src/ssoconfig.properties");
        if(!file.exists()) {
            System.out.println("File Not Found :( = " + file.getAbsolutePath());
            throw new IOException("파일을 찾을 수 없습니다");
        }
        is = new FileInputStream(file);
        this.properties.load(is);
        is.close();
    }

    public void ssoLogin() throws IOException
    {
        return "login정보로 형성한 url";
    }

    ...
}

 

다음과 같이 SsoAuth 객체에 Bean 주입을 통해서 Spring Container 에 등록될 수 있게 해보았습니다.

@Component
public class SSOAuth {
    private final HttpServletRequest request;
    private final HttpServletResponse response;
   
    private Map<String, Object> attributes = new HashMap<String, Object>();
    private Properties properties;

    @PostConstruct
    private void initBean() throws IOException {
        this.properties = new Properties();

        InputStream is = null;

        File file = new File("C:/spring/~/~/src/ssoconfig.properties");
        if (!file.exists()) {
            System.out.println("File Not Found :( = " + file.getAbsolutePath());
            throw new IOException("파일을 찾을 수 없습니다");
        }

        is = new FileInputStream(file);
        this.properties.load(is);
        is.close();
    }
    
    // @Autowired
    public SSOAuth(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.request = request;
        this.response = response;
        
        System.out.println("request = " + request);
        System.out.println("response = " + response);
    }
...
}

 

  1. 다만 하다보니 SSOAuth 의 생성자로 사용되는 HttpServletRequest 와 HttpServletResponse 들은 매 통신마다 일회용으로 쓰이는 정보들로 알고 있는데 (즉, 스프링 컨테이너의 관리 대상인 싱글톤 객체가 아닌걸로 알고 있는데) 이와 같은 경우는 그냥 Bean 등록 대상이 아닌걸까요??

등록 대상이 아니면 생성시 어떻게 받는지 궁금해서 생성자에 프린트를 찍어본 후 앱을 실행시켰는데, Spring Container 가 Bean 생성을 할 때 다음과 같이 프린트를 찍어주는 것 같습니다. 여기서 이게 무슨 의미인지 알 수 있을까요?

request = Current HttpServletRequest
response = Current HttpServletResponse

(정리하자면 의존성 주입 대상이 아닌(?) 변수들을 Params 로 가지고 있을 경우 Bean 등록이 어떻게 이루어지는지 궁금한 것 같습니다)

 

@RestController
@RequestMapping("/sso")
@RequiredArgsConstructor
public class SSORequestController {

    public final SSOAuth auth;

    @GetMapping("/requestAuth")
    public String requestSsoAuth(HttpServletRequest request, HttpServletResponse response) throws IOException {

        auth.ssoLogin();

        System.out.println("Hello");

        return "Hello";
    }
  1. 이어서 위와 같이 컨트롤러를 생성하였을 때 잘 동작을 하게 됩니다. 어떻게 자동으로 해당 컨트롤러 메소드가 호출되지도 않았는데, SSORequestController 가 의존성 주입을 받을 때 사용되는 컨트롤러의 HttpServletRequest, httpServletResponse 객체를 주입시켜 SSOAuth 객체를 생성하는지 궁금합니다!

 

감사합니다!

답변 1

3

https://circlee7.medium.com/spring-how-httpservletrequest-inject-d3cd26a3a307

스프링부트 실행하면 HttpServletRequest 와 HttpServletResponse 빈 생성하는 거 같아요.

김영한님의 프로필 이미지
김영한
지식공유자

jeoningu님 답글 감사합니다.

쉽게 이야기해서 스프링이 해당 기능을 사용할 수 있도록 특별한 기능을 제공해준다고 이해하시면 됩니다. 이 부분을 더 깊이있게 이해하려면 스프링 핵심원리 고급편에 나오는 ThreadLocal 같은 개념을 학습하시면 됩니다^^

감사합니다.

kwj3591님의 프로필 이미지
kwj3591
질문자

감사합니다!

kwj3591님의 프로필 이미지

작성한 질문수

질문하기