[JAVA] retrofit API 연동

jijang·2022년 1월 27일
0

개발

목록 보기
4/4

요건

  • csv 파일을 읽은 내용을 외부 post api 호출을 해서 등록한다.

repository

의존성 (retrofit 사용)

dependencies {
    implementation 'com.opencsv:opencsv:5.5.2'

    implementation group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.7.2'
    implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.7.2'

    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.22'

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

코드

  • RetrofitClient.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;

public class RetrofitClient {
    private static final String BASE_URL = "http://localhost:8082";

    public static TestApiService getApiService() {
        return getInstance().create(TestApiService.class);
    }

    private static Retrofit getInstance() {
        Gson gson = new GsonBuilder()
                .setLenient()  // Gson은 JSON에 대해 엄격함. 해당 옵션으로 parser가 허용하는 항목에 대해 자유로움.
                .registerTypeAdapter(LocalDate.class, new LocalDateSerializer()) // 날짜관련된
                .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer())
                .registerTypeAdapter(LocalDate.class, new LocalDateDeserializer())
                .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer())
                .registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeDeserializer())
                .setPrettyPrinting()
                .create();

        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson)).build();
    }
}
  • TestApiService.java
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;

public interface TestApiService {

    @Headers({"Authorization: Bearer 1234"})
    @POST("/test")
    Call<TestDto> createTest(@Body TestParameter parameter);
}
  • TestApi.java
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Response;

import java.io.IOException;
import java.time.LocalDate;
import java.util.Objects;

public class TestApi {
    private final TestApiService apiService;

    public TestApi() {
        this.apiService = RetrofitClient.getApiService();
    }

    public void postTest(String test) {

        TestParameter testParameter = TestParameter.of(test);
        
        Call<TestDto> post = apiService.createTest(testParameter);
        try {
            Response<TestDto> res = post.execute(); // 싱크 호출
            // 성공 처리
            if (res.isSuccessful()) {
                // 성공 처리
                TestDto savedTest = res.body();
                System.out.println("## success " + code + " : " + savedTest);
            } else {
                // 실패 처리
                ResponseBody responseBody = res.errorBody();
                System.out.println("## fail " + code + " : " + Objects.requireNonNull(responseBody).string());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • CsvFileReader.java
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Objects;

public class CsvFileReader {

    private static final String CSV_FILE_PATH = "sample.csv";
    private final TestApi testApi;

    public CsvFileReader() {
        this.testApi = new TestApi();
    }

    public void readFromCsv() throws IOException, CsvValidationException {
        URL resource = CsvFileReader.class.getClassLoader().getResource(CSV_FILE_PATH);

        if (Objects.isNull(resource)) {
            throw new IllegalArgumentException(CSV_FILE_PATH + " file not found ");
        }

        CSVReader reader = new CSVReader(new FileReader(resource.getFile()));
        String[] nextLine;
        while ((nextLine = reader.readNext()) != null) {
            testApi.postTest(nextLine[1]);
        }
    }
}
  • TestRegister.java
import com.opencsv.exceptions.CsvValidationException;
import java.io.IOException;

public class TestRegister {

    private final CsvFileReader csvFileReader;

    public TestRegister() {
        this.csvFileReader = new CsvFileReader();
    }

    public void registerTest() throws CsvValidationException, IOException {
        csvFileReader.readFromCsv();
    }
}
  • TestApplication.java
import com.opencsv.exceptions.CsvValidationException;

import java.io.IOException;

public class TestApplication {

    public static void main(String[] args) throws CsvValidationException, IOException {
        TestRegister register = new TestRegister();
        register.registerTest();
    }
}

0개의 댓글