본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] 리모팅과 EJB

by 김코더 김주역 2022. 10. 25.
반응형

1. 리모팅이란?

- 원격 시스템과 Spring 애플리케이션이 연동해서 동작하게 해주는 기술

- Spring 애플리케이션이 클라이언트 시스템에게 원격 서비스를 제공해주거나 다른 원격 시스템의 서비스를 이용할 수 있다.

 

 

 

2. 익스포터와 프록시

- 원격 서비스를 제공할 때나 사용할 때나 모두 인터페이스를 이용해야 한다. 클라이언트에게 제공되는 기능을 담은 서비스 bean도 서비스 내용이 정의된 인터페이스를 구현하고 있어야 하고, 원격 서비스를 사용할 때도 원격 서비스의 내용이 담긴 인터페이스를 이용해야 한다.

- Spring이 제공하는 모든 리모팅 지원 기능은 익스포터와 프록시 방식을 사용한다.

 

1) 익스포터

- 클라이언트와 서비스 bean의 사이에서 클라이언트로부터 원격 요청을 받아서 서비스 bean을 호출해주는 bean이다.

- 익스포터 bean을 만들 때 반드시 서비스 인터페이스도 같이 지정해줘야 한다. 아래 예시는 Spring이 지원하는 리모팅 기술들 중 하나인 HTTP Invoker을 사용하여 익스포터 bean을 만든 예시다.

<bean name="/remoting/userservice" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
    <property name="serviceInterface" value="com.example.demo.service.UserService"/>
    <property name="service" ref="userService"/>
</bean>

- Spring MVC 방식을 사용하지 않는다면 익스포터 bean을 루트 컨텍스트에 등록하고 리모팅 전용 서블릿을 별도로 등록해서 사용하면 된다.

 

 

2) 프록시

- 서비스 bean에 대한 프록시 역할을 하는 bean이다.

- 프록시는 원격 서비스 내용이 정의된 인터페이스를 구현하고 있어야 한다. 프록시를 bean으로 만들 때도 serviceInterface 프로퍼티에 서비스 인터페이스를 지정해야 하며, 이 프록시 bean의 타입은 이 서비스 인터페이스 타입이 된다.

 

 

 

3. RESTful 서비스 템플릿

- RestTemplate은 원격 RESTful 서비스 사이트로부터 결과를 가져올 수 있도록 해주는 오브젝트다.

- RESTful 서비스로부터 가져온 결과는 문자열로 그대로 받을 수도 있고 메시지 컨버터를 통해 오브젝트로 받을 수도 있다. 사용할 메시지 컨버터는 RestTemplate의 messageConverters 프로퍼티에 등록해서 사용하면 된다.

- 원격 요청 형식은 RESTful 사이트에서 안내된 HTTP 메소드, URL 패턴, 포맷 등을 따르도록 한다.

- RestTemplate의 사용 방법은 매우 다양하다. 동일한 요청 형식이라도 사용할 수 있는 메소드가 여러 개라는 의미다. 그래서 RestTemplate에 대한 모든 내용을 이 포스팅에서 다룰 수는 없고, 대신에 RestTemplate 공식 문서와 필자가 진행했던 프로젝트에서 사용했던 코드를 예시로 첨부하도록 하겠다.

 

RestTemplate 공식 문서

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

 

예시

Google Calendar 서비스로부터 access_token이 포함된 JSON 데이터를 문자열(String)로 받아오는 코드

// https://kimcoder.tistory.com/338 참고
public class RestJsonService {
    private final String CLIENT_ID = "499264841555-1kqekv3g1khc8jn5848cn1i8pcp12t29.apps.googleusercontent.com";
    private final String CLIENT_SECRET= "415QTI...생략";
    private final String REDIRECT_URI= "http://localhost:8080/receiveAC";
    private final String GRANT_TYPE= "authorization_code";
    private final String TOKEN_URL = "https://oauth2.googleapis.com/token";

    public String getAccessTokenJsonData(String code){
        RestTemplate restTemplate = new RestTemplate();

        Map<String, Object> params = new HashMap<>();
        params.put("code", code);
        params.put("client_id", CLIENT_ID);
        params.put("client_secret", CLIENT_SECRET);
        params.put("redirect_uri", REDIRECT_URI);
        params.put("grant_type", GRANT_TYPE);

        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(TOKEN_URL, params, String.class); // POST 방식으로 전송

        if (responseEntity.getStatusCode() == HttpStatus.OK) {
            return responseEntity.getBody(); // JSON 데이터 반환
        }
        return "error";
    }
}

예시에서는 POST 요청을 위해 RestTemplate의 postForEntity() 메소드를 사용했는데,  exchange() 메소드를 사용하는 방법도 있다. 이렇게 RestTemplate을 이용한 요청 방법은 다양하다.

 

 

 

4. EJB 서비스 이용

- Spring은 EJB용 프록시 bean을 만들어주는 jee 전용 태그를 제공한다.

- 로컬 세션 bean의 경우 <jee:local-slsb> 태그를 사용하면 되고, 리모트 세션 bean의 경우 <jee:remote-slsb> 태그를 사용하면 된다. EJB에 접근하는 데 필요한 JNDI 설정은 미리 해놓고 EJB 서비스를 띄워야 한다.

<jee:local-slsb id="userService" jndi-name="ejb/userService" business-interface="com.example.demo.service.UserService"/>

- 특별한 상황을 위해서 Spring bean을 EJB로 노출하는 방법과 EJB에서 Spring 컨테이너에 접근하는 방법도 제공된다는 사실도 알아두면 좋을 것 같다.

 

 

● 참고 자료 : 토비의 스프링 3.1 Vol.2

 

반응형

댓글