Base

메서드에서 쓸 값을 파라미터에서 제거하고 Autowired로 주입.

Dr.Mlem 2024. 10. 23. 10:50

Q1.
(08-08 WebHelper)
public String getClientIp(HttpServletRequest request) 여기에 이렇게 파라미터를 넣어서 쓰고 있었는데, 저 파라미터로 들어오는 객체를 이 클래스에서 아예 Autowired로 주입해버리면, 해당 메소드에서 request 파라미터를 안넣어도 되는거야?



A1.
네, HttpServletRequest 객체를 클래스에 @Autowired로 주입하면 메소드에서 파라미터로 받을 필요가 없습니다. 다음은 그 예시입니다:

Pseudocode

1. 클래스에 HttpServletRequest를 @Autowired로 주입.
2. getClientIp 메소드에서 파라미터 제거.
3. 주입된 HttpServletRequest를 메소드 내에서 사용.


Code

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class WebHelper {

    @Autowired
    private HttpServletRequest request;

    public String getClientIp() {
        String clientIp = request.getRemoteAddr();
        // 추가 로직
        return clientIp;
    }
}

이렇게 하면 getClientIp 메소드에서 HttpServletRequest 파라미터를 제거하고, 클래스에 주입된 request 객체를 사용할 수 있습니다.



Q2.
그런데 저 메소드를 쓰는 다른 클래스에선 메서드에서 request 객체를 넣어서 써도 되는거야?



A2.
네, HttpServletRequest 객체를 메소드 파라미터로 받는 방식과 클래스에 @Autowired로 주입하는 방식은 서로 호환 가능합니다. 즉, 다른 클래스에서 여전히 request 객체를 파라미터로 전달하여 사용할 수 있습니다.

다음은 두 가지 방식을 모두 사용하는 예시입니다:

Pseudocode
1. WebHelper 클래스에 HttpServletRequest를 @Autowired로 주입.
2. getClientIp 메소드를 오버로딩하여 파라미터로 HttpServletRequest를 받는 버전과 받지 않는 버전을 모두 제공.
3. 다른 클래스에서 WebHelper를 사용하여 두 가지 방식으로 getClientIp 메소드를 호출.

Code

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class WebHelper {

    @Autowired
    private HttpServletRequest request;

    // 파라미터 없이 사용하는 메소드
    public String getClientIp() {
        return getClientIp(request);
    }

    // 파라미터로 HttpServletRequest를 받는 메소드
    public String getClientIp(HttpServletRequest request) {
        String clientIp = request.getRemoteAddr();
        // 추가 로직
        return clientIp;
    }
}

다른 클래스에서 WebHelper를 사용하는 예시:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;

@Service
public class SomeService {

    @Autowired
    private WebHelper webHelper;

    @Autowired
    private HttpServletRequest request;

    public void someMethod() {
        // 파라미터 없이 호출
        String clientIp1 = webHelper.getClientIp();

        // 파라미터로 HttpServletRequest를 전달하여 호출
        String clientIp2 = webHelper.getClientIp(request);
    }
}

이렇게 하면 WebHelper 클래스에서 HttpServletRequest를 주입받아 사용할 수도 있고, 다른 클래스에서 HttpServletRequest 객체를 파라미터로 전달하여 사용할 수도 있습니다.



Q3.
즉, 메서드들은 쓸 파라미터를 메서드가 있는 클래스한테서 받든지, 메서드를 호출하는 위치에서 주입받든지 상관 없는거야?



A3.
네, 맞습니다. 메서드가 있는 클래스에서 파라미터를 주입받든지, 메서드를 호출하는 위치에서 파라미터를 주입받든지 상관없이 사용할 수 있습니다. 두 가지 방식 모두 유효하며, 상황에 따라 적절한 방식을 선택하면 됩니다.

요약

1. 클래스에서 주입받기: 클래스에 @Autowired로 주입받아 메서드에서 사용.
2. 메서드 호출 시 주입받기: 메서드를 호출할 때 파라미터로 전달.

예시

클래스에서 주입받기

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class WebHelper {

    @Autowired
    private HttpServletRequest request;

    public String getClientIp() {
        return request.getRemoteAddr();
    }
}

메서드 호출 시 주입받기

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;

@Service
public class SomeService {

    @Autowired
    private WebHelper webHelper;

    @Autowired
    private HttpServletRequest request;

    public void someMethod() {
        // 메서드 호출 시 파라미터로 전달
        String clientIp = webHelper.getClientIp(request);
    }
}



Q4.
지금 이렇게 수정한 상태에서, MyInterceptor 에서, String ipAddr = webHelper.getClientIp(); 이 부분에서, 파라미터를 넣어서 String ipAddr = webHelper.getClientIp(request); 라고 하면 왜 문제가 되는거지?



A4.
MyInterceptor 클래스에서 webHelper.getClientIp(request)를 호출할 때 문제가 발생하는 이유는 WebHelper 클래스에 getClientIp(HttpServletRequest request) 메소드가 정의되어 있지 않기 때문일 가능성이 큽니다.

현재 WebHelper 클래스는 getClientIp() 메소드만 정의되어 있습니다. 따라서 HttpServletRequest 파라미터를 받는 메소드를 추가해야 합니다.

Pseudocode

1. WebHelper 클래스에 getClientIp(HttpServletRequest request) 메소드를 추가.
2. MyInterceptor 클래스에서 webHelper.getClientIp(request)를 호출.


Code

WebHelper.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class WebHelper {

    @Autowired
    private HttpServletRequest request;

    // 파라미터 없이 사용하는 메소드
    public String getClientIp() {
        return getClientIp(request);
    }

    // 파라미터로 HttpServletRequest를 받는 메소드
    public String getClientIp(HttpServletRequest request) {
        String clientIp = request.getRemoteAddr();
        // 추가 로직
        return clientIp;
    }
}


MyInterceptor.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;

@Component
public class MyInterceptor {

    @Autowired
    private WebHelper webHelper;

    @Autowired
    private HttpServletRequest request;

    public void someMethod() {
        // 파라미터로 HttpServletRequest를 전달하여 호출
        String ipAddr = webHelper.getClientIp(request);
    }
}

이렇게 하면 MyInterceptor 클래스에서 webHelper.getClientIp(request)를 호출할 때 문제가 발생하지 않습니다. WebHelper 클래스에 HttpServletRequest 파라미터를 받는 getClientIp 메소드를 추가하여 해결할 수 있습니다.