vue.js에서 spring boot 서버로 요청을 보내는 방법은 아래와 같이 여러 방법이 있다.

  • fetch api
  • Axios
  • XMLHttpRequest

이 중에서 나는 Axios를 선택했다. 이유는 라이브러리 크기가 크다는 단점이 있지만 다른 라이브러리들에 비하여 사용이 간단하고 다양한 기능을 지원하기 때문이다. 즉, 장단점을 비교해보았을 때 가장 적합하다고 생각했다.

 

Axios를 사용하기 위해서는 일단 axios를 다운로드 받아야한다. 아래 명령어로 다운받을 수 있다.

npm install axios

Search.vue

<template>
    <div>
        <p>Selected ID: {{ $route.params.id }}</p>
        <p>Response: {{ response }}</p>
    </div>
</template>

<script>
import axios from 'axios';

export default {
    data() {
        return {
            response: null
        };
    },
    mounted() {
        this.fetchData();
    },
    methods: {
        fetchData() {
            const baseURL = 'http://localhost:8000/summoners/kr/';
            const url = `${baseURL}${this.$route.params.id}`; // 동적으로 URL 생성

            axios.get(url)
                .then(response => {
                    this.response = response.data;
                })
                .catch(error => {
                    console.error(error);
                });
        }
    }
};
</script>

<style>
/* ... */
</style>

axios를 사용하여 위와 같은 방식으로 spring boot로 요청을 보내고 응답을 받아올 수 있다. 하지만, 다른 ip를 가진 서버로 api를 날리기 위해서는 cors를 추가해야 한다. Spring Boot에 설정을 추가해주자.

config/CorsConfig

package gg.yj.kim.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:3000") // 허용할 도메인을 설정합니다.
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메서드를 설정합니다.
                .allowedHeaders("*") // 허용할 요청 헤더를 설정합니다.
                .allowCredentials(true); // 인증 정보를 포함할 수 있도록 설정합니다.
    }
}

MainApplication

package gg.yj.kim;

import gg.yj.kim.config.CorsConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import(CorsConfig.class)	// ADD
public class KimApplication {

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

}

 

 

그렇다면 아래와 같이 vue.js에서 Spring Boot으로부터 api 응답을 받아올 수 있다.

받아온 json 값을 class화 하자. Search.vue의 코드를 아래와 같이 변경해주었다.

Search.vue

<template>
    <div>
        <p>Selected ID: {{ $route.params.id }}</p>
        <p>Response: {{ response }}</p>
        <p v-if="myData && myData.accountId">MyData.accoundId: {{ myData.accountId }}</p>
    </div>
</template>

<script>
import axios from 'axios';

export default {
    data() {
        return {
            myData: null,
            response: null
        };
    },
    mounted() {
        this.fetchData().then(() => {
            this.myData = new MyData(this.response);
        }).catch(error => {
            console.error(error);
        });
    },
    methods: {
        fetchData() {
            const baseURL = 'http://localhost:8000/summoners/kr/';
            const url = `${baseURL}${this.$route.params.id}`; // 동적으로 URL 생성

            return axios.get(url)
                .then(response => {
                    this.response = response.data;
                    this.myData = new MyData(response.data); // JSON 데이터를 MyData 클래스로 변환
                })
                .catch(error => {
                    console.error(error);
                });
        }
    }
};


// JSON 데이터를 담을 클래스 정의
export class MyData {
    constructor(data) {
        this['accountId'] = data.accountId;
        this['profileIconId'] = data.profileIconId;
        this['revisionDate'] = data.revisionDate;
        this['name'] = data.name;
        this['puuid'] = data.puuid;
        this['id'] = data.id;
        this['summonerLevel'] = data.summonerLevel;
        // 필요한 다른 속성들도 여기에 추가
    }

    // 클래스의 메서드 정의
    method1() {
        // 메서드 로직
    }

    // 필요한 다른 메서드들도 여기에 추가
}
</script>

<style>
/* ... */

p {
    color: white;
}
</style>

출력물

 

 

 

+ Recent posts