inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

애노테이션 @PostConstruct, @PreDestroy

Request 중 Bean 활용에 대한 질문

295

kwj3591

작성한 질문수 12

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 객체를 생성하는지 궁금합니다!

 

감사합니다!

spring oop

답변 1

3

jeoningu

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

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

0

김영한

jeoningu님 답글 감사합니다.

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

감사합니다.

0

kwj3591

감사합니다!

코드 자료

0

50

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

56

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

76

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

92

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

81

1

테스트 속도가 나중에 영향이 있을까요?

0

77

1

gradle 설정 안떠서 질문 남깁니다!

0

122

2

build.gradle로 프로젝트를 여는 이유

0

87

1

provider 사용하는 이유

0

90

1

다음 강의 뭘 들어야 할까요

0

126

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

66

1

beanB

0

82

2

퀴즈다시풀기

0

69

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

92

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

67

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

106

2

도메인의 정의?

0

59

1

ApplicationContext 질문입니다.

0

63

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

90

2

ai api 선정하기 관련 질문

0

118

2

생성자 자동주입 관련해서

0

66

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

97

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

66

1

12:25

0

79

2