Microservice ํ†ต์‹  [1] RestTemplate

์ตœ์ค€ํ˜ธยท2022๋…„ 3์›” 13์ผ
0

Microservice Architecture

๋ชฉ๋ก ๋ณด๊ธฐ
23/32
post-thumbnail

๐Ÿ’ญMicroservice ํ†ต์‹ ?

MSA๋ฅผ ๊ตฌ์„ฑํ•˜๋‹ค๋ณด๋ฉด service๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์ €์˜ ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” user-service์—์„œ ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ order-service์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ user-service์—์„œ ๋ฐ˜ํ™˜ํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด๋Ÿด๋•Œ Microserivce๊ฐ„ ํ†ต์‹ ์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž. ์ด๋ฒˆ์—๋Š” java์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” RestTemplate๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ”จuser-serivce์— RestTemplate ๋“ฑ๋ก

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

    ...
    
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

RestTemplate์„ ๋ฐ˜ํ™˜ํ•˜๋Š” bean์„ ๋“ฑ๋กํ•ด์ฃผ๊ณ 

@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService{
    private final UserRepository userRepository;
    private final BCryptPasswordEncoder pwdEncoder;
    private final RestTemplate restTemplate;
    private final Environment env;
    
    ...
    
    @Override
    public UserDto getUserByUserId(String userId) {
        UserEntity userEntity = userRepository.findByUserId(userId);
        if(userEntity == null) throw new UsernameNotFoundException("user name not found!");
        UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);
//        List<ResponseOrder> orderList = new ArrayList<>();    //์ด์ „์— ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋˜ ๊ฐ’

        /* Using as RestTemplate */
        String orderUrl = String.format(env.getProperty("order_service.url"), userId);	//(1)
        ResponseEntity<List<ResponseOrder>> orderListResponse =	//(2)
                restTemplate.exchange(orderUrl, HttpMethod.GET, null, new ParameterizedTypeReference<List<ResponseOrder>>() {
                });
        List<ResponseOrder> orderList = orderListResponse.getBody();	//(3)

        userDto.setOrders(orderList);

        return userDto;
    }
}

๊ธฐ์กด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋˜ ์ฝ”๋“œ๋ฅผ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

(1) url๊ฐ’์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์œผ๋กœ ์„ค์ •๊ฐ’์€ user-service.yml์— ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค.

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password: '{cipher}AQAQZKGZrGe0uaQfpDk90mzuSy8WrSHHU5S/OCTB0g9NUTSrG7x0p6qnhXb/SPHSm/dm/TjWp+BpyYzj+w7tr8uTpEkSTuvNCWPtDM813R6J7SbO2DWAccwiNp4ZoGc4KLxB2QbLTZeQxEvRPFOKUqKLkSMQQQPh+2Pxrk0QhTSbbPRIP6hmfTDQgHBjL4FkZTYaQSo6/rRDIUJdBoo248GjiBw6FYXLGQn2DgukNiuBZJlCHac7RW4Z3ZBBMV2jIn/dCjS1yJrQjKfRmK4ZRZ/39+5+If+leMwRIgAr/u3J7TeCMKofJOJc23wt+JILb30ap2f+is7Nqgmyp3yvTQM4PVO/wPlf2ewRyhbYWSB7cY7+QPGBFnMpo+D8to7Dzlg='
token:
  expiration_time: 86400000
  secret: '{cipher}AQBz0/LWzW++38OSlEhkxwNSROmThDnC8EqAXqFlQSJy0dAMBYByPuJMeYExEGKhazdH8NWNlAA1Dn1iMCTyQF2AdwUtvtAE2ieyJ/gEv/fJ89rOFAskWw8Gzpp5zLOqqh3JocnTbOwgvcsEs8AtnesUthoHJ+/5f1ii5weBYj7ymqo4PW5Q1uSXY55eVHUZIYhreb1Dn5J9wkTaBTTTSjWJNppzAPZsFSvc8n9SgewWqLRIzoS+BNIL2ctuWrfpTyu/ZNrxiuAKezGXarOhg1k/6IWE/H3lCwZdH5a9EpwTcHTOqTH5fYUUVYxP5EtiD1ZgPN1rpPLXeLtULDCNSWoUyxx5fcbqc+BGUXX6/xtW6gViV2+vqStBdSEWlyh7xu0='
order_service:
  url: http://127.0.0.1:8000/order-service/%s/orders

(2) restTemplate์˜ exchange method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ url๋กœ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
exchange(url, method, parameter, response type)์ˆœ์„œ๋กœ ๋„ฃ๋Š”๋‹ค.
(3) getBody()๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋ฐ›์€ ๋ฐ์ดํ„ฐ์—์„œ body๋ฅผ ๊บผ๋‚ด์™€์„œ orderList ๋ฐฐ์—ด์— ๋‹ด๋Š”๋‹ค.


๋กœ๊ทธ์ธํ•œ ์œ ์ € ID๋กœ ์ฃผ๋ฌธ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ณ 

์š”์ฒญํ•˜๋ฉด

order-service์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ฃผ๋ฌธ ๋‚ด์—ญ์„ ๊ฐ€์ ธ์™€์„œ user-service์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ๋ฌธ๋‚ด์—ญ์„ ์ •์ƒ์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

userid๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ ์ค‘๊ฐ„์— ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ์ˆ˜์ •ํ•˜๊ณ  ์žฌ์‹คํ–‰ ํ•˜๋Š๋ผ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

๐Ÿ‘service ์ฃผ์†Œ๋ฅผ Microservice name์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์œ„ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผํ•˜๋‹ค๋ณด๋ฉด yml์— ์„ค์ • ๋‚ด์šฉ์— url์ด ์‹ค์ œ ์„œ๋ฒ„์˜ ip๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ด ์ ์„ ์„œ๋น„์Šค ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•ด๋„ ์ •์ƒ ์ž‘๋™๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ

order_service:
  url: http://ORDER-SERVICE/order-service/%s/orders
  #url: http://127.0.0.1:8000/order-service/%s/orders

๊ธฐ์กด url ์ •๋ณด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ 

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

    //password encode๋ฅผ ์‚ฌ์šฉ์„ ์œ„ํ•ด bean์œผ๋กœ ๋“ฑ๋ก
    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ user-service์˜ RestTemplate์— @LoadBalanced๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ ํ›„์— ๋™์ผํ•˜๊ฒŒ ์ฃผ๋ฌธํ•˜๊ณ  user ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์™€๋ณด๋ฉด

order_service.url์˜ ๊ฐ’์ด ip๊ฐ’์ด ์•„๋‹Œ microservice ์ด๋ฆ„ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ณผ๋„ ๋™์ผํ•˜๊ฒŒ ์ž˜ ๋‚˜์™”๋‹ค!

profile
์ฝ”๋”ฉ์„ ๊น”๋”ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž (ํŽธํ•˜๊ฒŒ ๊ธ€์„ ์“ฐ๊ธฐ์œ„ํ•ด ๋ฐ˜๋ง์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ ค์š”!) ํ˜„์žฌ KakaoVX ๊ทผ๋ฌด์ค‘์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€