Home 실습 with spring boot Netflix OSS 공공api 1 - Hystrix fallback
Post
Cancel

실습 with spring boot Netflix OSS 공공api 1 - Hystrix fallback

풀소스는 여기 에서 확인할 수 있다. 아주 기본적으로 짜서 돌아는 가는걸 확인하려고 한다. 첫번째로는 가장 간단해보이는 특정 요청 실패시 fallback 메소드 실행이다.

정말 간단하게 해보고자 나는 컨트롤러 , 서비스 하나씩만 만들고 공공 api 사용해서 정상 응답일때/ fallback 일때를 보여주기로 했다 :)

사용한 공공 api

  • 노선정보조회 서비스
  • 요청 데이터 : 노선 번호
  • 응답 데이터 : 시/종점, 첫차 시간, 막차 시간, 노선 id 등 (xml 형식)

일단은 get 으로 요청 들어오면 공공 api 사용해서 해당 노선의 막차시간을 표기하도록 한다.
노선 번호는 입력받고 싶었는데 귀찮아서 그냥 내가 자주 타는 153번으로 고정했다.
구조는 간단하다.

기본구조

그리고 구현도 그냥 resttemplate 통해서 간단하게 만들었다.
나중에 재활용해서 확장해보려고 resttemplate 은 팩토리로 만들어서 주입해서 쓰고, DAO로 busInfo 라는 클래스 만들었다.

여기까지는 스프링 기초를 가지고 쉽게 구현할 수 있다.
이 상태에서도 만약 공공 api 응답 받아올때 에러가 난다면 try catch 로 막을 수는 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	public String askIsOver() throws Exception {
		
		String baseUrl = "http://ws.bus.go.k2r/api/rest/busRouteInfo/getBusRouteList";
		
		String serviceKey = URLDecoder.decode("api 인증키 자리", "UTF-8"); // 이거 안해주면  인증 에러 남. 한번 더 인코딩 하면서 인증키가 제대로 전달안됨.   
		   
        UriComponents uri = UriComponentsBuilder.fromHttpUrl(baseUrl+"?"+"serviceKey="+serviceKey+"&strSrch=153").build();
		
		RestTemplate restTemplate = rest.restTemplate();
		
	    try {
		String apiResult = restTemplate.getForObject(uri.toString(), String.class);
        
        //응답이 xml 로 와서 잘라서 DAO인 busInfo 에 넣는다. 
	    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	    Document doc = dBuilder.parse(new InputSource(new StringReader(apiResult)));
	    doc.getDocumentElement().normalize();
	    Node firstResult = doc.getElementsByTagName("itemList").item(0);	
	    // 일단은  막차시간 정보만 뽑아서 저장 
	    for (int temp = 0; temp < firstResult.getChildNodes().getLength(); temp++) {
	    	String nodeName =firstResult.getChildNodes().item(temp).getNodeName();
	    	if(nodeName.equals("lastBusTm")) {
	    		busInfo.setLastBusTm(firstResult.getChildNodes().item(temp).getTextContent());
	    	}
	    		
	    }        
	         
		return busInfo.getLastBusTm();  //정상이면 막차시간 리턴
		
	    }catch(Exception e) {
	    	e.printStackTrace();
	    }finally {
	    	return "트라이 캐치입니다";  // try catch finally 로 에러 막음
	    }
		
	}

하지만 여기서는 hystrix 사용해 간단하게 fallback 메소드를 실행해버리겠다.
hystrix 사용하게 위해서는 세가지 단계가 필요하다.

1) pom.xml 에 의존성 정의해줘서 메이븐이 읽어오게 하기 !

1
2
3
4
	<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
   </dependency>

2) @EnableHystrix 어노테이션 붙여주기

이건 메인 메소드가 있는 위치에서 어노테이션 붙여줘도 되고, 지금은 circuit 같은 넓은 단위 봐야하는 거 안쓰고 fallback 만 해볼거니까 해당 메소드가 있는 서비스에다가만 붙여줘도 정상 동작한다.
나중에 circuit open까지 해볼꺼니가 메인 메소드 있는데에 붙여준다.

1
2
3
4
5
6
7
8
9
 @EnableHystrix   // 여기 이 어노테이션 ! 
@SpringBootApplication
public class SnoopyApplication {

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

}

3) @HystrixCommand(fallbackMethod = “fallback메소드 이름”) 로 fallback 메소드 실행할 위치 정하고, 메소드 내용 정의하기

1
2
3
4
5
6
7
8
  @HystrixCommand(fallbackMethod = "fallback") // fallback 일 경우 fallback이란 이름의 메소드 실행
  public String askIsOver() throws Exception { 
    ...
  }
 
 public String fallback() {
		return  "노선 정보가 없습니다.";
}

이렇게 하면 일부러 url을 잘못 넣었을 때에도 fallback 메소드 바로 실행된다 :)

근데 이렇게 실습을 하나 해보니까 궁금한 점이 있다.

try catch 와 fallback 메소드의 차이점

try catch 를 하는 경우 exception 발생하면 메시지를 찍어보니까 콘솔로그로 왜 에러가 났는지 파악하기가 쉽다.
반면에 fallback 메소드로 빠지는 경우 에러로그가 남지 않기 때문에 무엇때문에 난 에러인지 찾기가 어렵다.
stackvoerflow 를 좀 찾아보니 같은 문제로 고민하는 사람들이 있었다. 링크
링크에서 처럼 throwable 인자를 추가해서 에러 로그 확인해보았다.

😋😋😋 에러 추적을 쉽게하기 위해서는 fallback 메서드에 throwable 인자를 추가하자 ^^ !!

에러로그

1
2
3
4
public String fallback(Throwable e) {
		e.printStackTrace();
		return  "노선 정보가 없습니다.";
}

fallback 실습 끝 !! 다음은 circuit open 실습 해보겠습니다~~

This post is licensed under CC BY 4.0 by the author.

MSA 공부 시작 - 11번가 spring cloud 기반 MSA 로의 전환 정리

실습 with spring boot Netflix OSS 공공api 2 - Hystrix circuit breaker