본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

콜백헬... CallBack Hell이란?

by 슬기로운 동네 형 2022. 11. 18.
반응형

콜백헬... CallBack Hell이란?


 프론트 개발이든 백엔드 개발이든 통신 기술을 개발자가 익히는 것은 필수 사항이다.

자바 스프링의 경우 RestTemplate, Okhttp3, HttpClient 등 여러가지 라이브러리가 존재한다. 안드로이드에 특화된 레트로핏도 있고~

 

  경험상 RestTemplate, Okhttp3 라이브러리들이 사용하기 편하더라. 쉽고 남들짠 코드만 봐도 대충 알겠고.....RestTemplate 의 경우 스프링의 버전에 따라 약간 사용법이 확장되니 레퍼런스 확인이 필요하다.

 이번 포스팅은 OKhttp3를 이용해서 콜빽헬에 대해 알아보려 한다.

 

 알아두면 유용하게 사용할 수 있는 api를 제공하는 사이트 두개.~

private static final String URL1 = "https://api.github.com/zen";
private static final String URL2 = "https://jsonplaceholder.typicode.com/todos/1";

 

 특정 주소 A를 호출해서 정보를 받고 연이어 B라는 주소를 호출하고 또 그 결과에 따라 C를 호출해야 한다면... 이런 기능을 개발하다보면 Call back hell 을 경험하게 된다.

 

준비물

스프링부트, 메이븐okhttp3, 자바1.8, git hub api 주소

 

pom.xml 에 okhttp3 추가

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.2.0</version>
</dependency>

 


간단한 예제

import okhttp3.*;
import java.io.IOException;

public class CallBackHell {

    private static final String URL1 = "https://api.github.com/zen";
    private static final String URL2 = "https://jsonplaceholder.typicode.com/todos/1";

    private final OkHttpClient client = new OkHttpClient();


    public static void main(String[] args) throws IOException, InterruptedException{

        CallBackHell callBackHell = new CallBackHell();

        Request.Builder builder = new Request.Builder().url(URL1).get();
        Request request = builder.build();

        Response response = callBackHell.client.newCall(request).execute(); //enqueue(); 비동기

        if(response.isSuccessful()){
            System.out.println("첫번째 요청 성공");
            ResponseBody body = response.body();
            System.out.println("Body => " + body.string());

            Request.Builder builder2 = new Request.Builder().url(URL2).get();
            Request request2 = builder2.build();
            Response response2 = callBackHell.client.newCall(request2).execute();
            Thread.sleep(1000);

            if(response2.isSuccessful()){
                System.out.println("두번째 요청 성공");
                ResponseBody body2 = response2.body();
                System.out.println("Body => " + body2.string());
            }
        }else{
            System.err.println("Error Occurred");
        }
    }
}

우선 동기 방식으로 구현해봤다. run까지 돌리면 소스가 길어지니까... 초보수준의 예제지만~ ㅎㅎ

비동기 방식으로 호출할때는 enqueue()를 구현하면 된다.

 

CallBack Hell

비즈니스 시나리오는 아래와 같다.

ur1 을 호출하고 에러가 없다면 url2를 호출한다. 예제는 단순하게 두 api 만 호출했지만, 실제 프로젝트나 솔루션에서는 다양한 케이스를 구현하게 된다.

 

특히 프론트(자바스크립트) 포함, 호출 후 통신 성공, 실패에 따라 후속작업(예외처리포함)을 하다보면 지옥이란 말이 공감 된다.

호출 후 결과가 오면 메일을 보내고, 데이터베이스에서 다음 작업에 필요한 리스트를 가져오거나 그 후에 또 다른 작업을 하는 등등... 상상만 해도 머리가 복잡해진다. 프론트의 경우 Dom을 그리는 순서나 에러처리등 신경 쓸께 한두개가 아니다. 특히 경험이 많고 만들어본 서비스를 구현한다면 문제가 없겠지만 웹 기능에 대해 잘모른다면... 그러니까 분석/설계자 역할을 담당한 사람이 프로그램 경험이 많지 않고 업무만 잘 아는 사람이 기획을 하게 된다면 공수라도 제대로 계획했겠는가?

 이야기가 딴데로 흘러 갔다. 위와 같은 CallBack 지옥에서 벗어나려는 프로그램 패러다임의 변화가 일어나고 있다.

 대표적으로 함수형 프로그래밍... 그래서 java8부터 추가된 기능들을 공부할 필요가 있다.

 

반응형

댓글