Vue js Spring 게시판 - Vue js Spring gesipan

nodejs, vue, cli가 설치되어 있다는 가정하에 프로젝트를 생성하기

프로젝트를 생성할 폴더로 이동

Vue js Spring 게시판 - Vue js Spring gesipan

프로젝트 생성

vue create 프로젝트명

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

아래의 프로젝트 구조는 회사나 프로젝트마다 다르기 때문에 그냥 참고로 알아둘 것.

Vue js Spring 게시판 - Vue js Spring gesipan

HelloWorld.vue에 localhost:8080 접속시 나오는 그 내용이 들어있고 그걸 App.vue에서 불러와서 보여줌.

홈페이지 기본 레이아웃 생성하기

Vue js Spring 게시판 - Vue js Spring gesipan

components폴더 밑에 common밑에 Footer.vue, Header.vue생성

-공통으로 생성하는 건 보통 common폴더를 생성해서 많이 모아둔다.

Vue js Spring 게시판 - Vue js Spring gesipan

<template> <header> <h2><a href="#" class="logo"><img alt="Vue logo" src="../../components/static/image/blusky2.png" width="130"></a></h2> <div class="menuWrap"> <ul class="menu"> <li><a href="javascript:;">메뉴1</a></li> <li><a href="javascript:;">메뉴2</a></li> <li><a href="javascript:;">메뉴3</a></li> <li><a href="javascript:;">메뉴4</a></li> </ul> </div> </header> </template> <script> export default { } </script> <style scoped> header{width:100%; text-align:center; position:relative; height:120px; border-bottom:1px solid #35495e} header h2{position:absolute; top:0; left:100px;} header ul.menu:after{display:block; clear:both; content:'';} header ul.menu{position:absolute; top:20px; right:50px;} header ul.menu li{float:left; padding:10px 20px; list-style:none;} a{text-decoration:none; color:coral;} </style>

<template> <footer> <p>copyRight jian.aza.com</p> </footer> </template> <script> export default { } </script> <style scoped> footer{border-top:1px solid #35495e; text-align:center; font-size:16px; color:#41b883; margin:100px 0 0 0;} </style>

<template> <div id="app"> <Header /> <Footer /> </div> </template> <script> <!-- header부분 import하기 --> import Header from './components/common/Header.vue' <!-- footer부분 import하기 --> import Footer from './components/common/Footer.vue' export default { name: 'App', components: { Header, Footer } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>

페이지 이동을 위해 router설치

vue-router설치하기

Vue js Spring 게시판 - Vue js Spring gesipan

$ npm install <module-name> --save

--save 옵션을 추가함으로써 package.json의 dependency 항목에 모듈을 추가합니다.

npm 5부터는 --save하지 않아도 됨

vue-router 란?

쉽게 말해 탭메뉴 생각하면 된다. 페이지를 새롭게 로딩하지 않고 여러 페이지를 불러올때 사용하는 것..

자세한 것은 미래의 내가 이 router에 정리해서 이 바로 아래에 경로를 달 것임.

vue add router 입력

Vue js Spring 게시판 - Vue js Spring gesipan

vue add router를 해주면

자동으로 src밑에 router폴더 생성, 그 밑에 index.js생성됨.

Vue js Spring 게시판 - Vue js Spring gesipan

router 밑에 자동으로 생성된 index.js는 모든 router의 구성환경 (configurations)를 포함한다.

[index.js] - index.js가 자동으로 생성되면서 아래 내용이 채워져 있음 -

import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' const routes = [ //객체 배열 선언, 이 배열은 애플리케이션 경로를 나타냄. { // '/'경로를 가진 route object 는 우리의 기본 URL을 의미 path: '/', //경로 name: 'Home', //name속성은 경로의 이름을 의미 component: Home //component속성은 사용자가 이 경로를 방문할 때 렌더링될 구성 요소를 의미, 이 경로에서 홈페이지를 렌더링 한다. }, { path: '/about', name: 'About', //about은 거의 동일한 논리이나 구성요소를 직접 가져오는 대신 webpack의 코드 분할 기능을 통해 가져옴. // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router

역시 vue add router해주면

src 밑에 자동으로 views생성, About.vue, Home.vue가 아래와 같이 소스코드가 자동으로 채워져서 생성된다.

Vue js Spring 게시판 - Vue js Spring gesipan

<template> <div class="about"> <h2>This is an about page</h2> </div> </template>

<template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"> <HelloWorld msg="Welcome to Your Vue.js App"/> </div> </template> <script> // @ is an alias to /src import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'Home', components: { HelloWorld } } </script>

<template> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </div> <router-view/> </template> <style> </style>

앵커 링크( <a href="">태그) 와 달리 <router-link>는 전체 페이지를 다시 로드하지 않는다.

vue는 단일페이지 애플리케이션이다. 앱에 대한 데이터는 이미 서버에서 다운로드 되었다.

다른 보기로 라우팅 할 때 애플리케이션은 일부 정보를 숨기고 요청된 정보를 표시한다.

router-link태그의 to 는 방문할 페이지를 나타내는 속성이다.

<router-view/>태그는 탐색 링크가 트리거 될 때 올바른 컴퍼넌트를 렌더링 한다.

<참고>

router추가 도중 colon expected css, semi-colon expected에러 발생한다면

>>해결책은 아래 경로로...

이 애플리케이션에 우리가 생성한 route를 추가하고 싶다면

[App.vue]

<template>태그에 profile 라우터 링크를 추가했다.

<template> <div id="nav"> <Header/> <router-link to="/">메인페이지</router-link> | <router-link to="/about">게시판</router-link>| <router-link to="/profile">나의 프로필</router-link> <router-view/> <Footer /> </div> </template>

Vue js Spring 게시판 - Vue js Spring gesipan

src > views > Profile.vue

<template> <div class="home"> Hello! Welcome jian homepage ♡ <table> <tr> <th> 이름 </th> <th> 직업 </th> <th> 성별 </th> <th> 이메일주소 </th> </tr> <tr> <td>박혁거세</td> <td>개발자</td> <td>뇨자</td> <td></td> </tr> </table> </div> </template> <!-- vuejs 컴포넌트에 스타일 적용하는 방법 --> <!-- style에 scoped속성을 부여하면 컴포넌트 내부 스코프에만 적용되므로 다른 컴포넌트가 간섭을 못한다., 이때 style은 element 속성값을 사용해 적용하도록 한다. --> <style scoped> </style>

-- 주의!! 아직 style은 공부 안해서 테이블 정렬을 못시켰습니다. ㅠㅠ --

src > router > index.js로 이동

[index.js]

- profile 컴포넌트와 경로 추가하기

import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' import Profile from '../views/Profile.vue' const routes = [ //객체 배열 선언, 이 배열은 애플리케이션 경로를 나타냄. { // '/'경로를 가진 route object 는 우리의 기본 URL을 의미 path: '/', //경로 name: 'home', //name속성은 경로의 이름을 의미 , 이거 바꿔도 아무 의미 없음. component: Home //component속성은 사용자가 이 경로를 방문할 때 렌더링될 구성 요소를 의미, 이 경로에서 홈페이지를 렌더링 한다. }, { path: '/profile', name: 'profile', component: Profile }, { path: '/about', name: 'About', //about은 거의 동일한 논리이나 구성요소를 직접 가져오는 대신 webpack의 코드 분할 기능을 통해 가져옴. // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router

Vue js Spring 게시판 - Vue js Spring gesipan

src > components > static폴더 > image폴더를 따로 만들어 이미지 넣기.

여기까지 구현된 화면

[메인접속시 첫 화면]

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

[나의 프로필 눌렀을때]

-아직 css적용 전이라 테이블이 왼쪽으로 이동했네유..ㅠㅠ -

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

target="_blank" rel="noopener" 란?

- 미래의 내가 정리할 내용..현재의 나는 좀 쉬자. 'ㅅ'

혹시 라우터 설정중에 export 'default' (imported as 'Vue') was not found in 'vue'

라는 에러가 발생했다면....

본인 vue CLI는 3,4인데 그 이전인 2이하로 라우터를 설정하였을 경우 이런 에러가 발생할 수 있다.

본인이 설정한 버전에 맞게 라우터를 설정하면 됨. 나는 CLI 4 인데 2이하 방식으로 설정하다 아래와 같은 에러가 발생하여서 4에 맞게 라우터 설정을 바꿔줌...

[에러 화면]

Vue js Spring 게시판 - Vue js Spring gesipan

참고

[CLI 4 버전 router 설정 튜토리얼]

https://vueschool.io/articles/vuejs-tutorials/how-to-use-vue-router-a-complete-tutorial/

/////////////////////////////////////////////////////////////////////////////////////////////////////

이 아래는 하다가 에러나서 바꾸기 전꺼라서 안봐도 됨...나중에

이걸 이용해서 다른걸 만들꺼라서 지우지 않고 놔뒀음.

[Maincontent.vue]

<template> <div class="mainbody"> <ul> <li><a href="" target="_blank" rel="noopener">회원가입</a></li> <li><a href=# target="_blank" rel="noopener">게시판 조회</a></li> <li><a href=# target="_blank" rel="noopener">글쓰기</a></li> <li><a href=# target="_blank" rel="noopener">통계</a></li> </ul> </div> </template> <script> </script> <style scoped> </style>

여기까지 만들면 일단 거지꼴이지만 메인화면 생성됨

Vue js Spring 게시판 - Vue js Spring gesipan

Vue js Spring 게시판 - Vue js Spring gesipan

views > board> List.vue 생성

<List.vue>

<template> <div> <h2>게시판 리스트</h2> </div> </template> <script> </script> <style scoped> </style>

헤더파일에 게시판 리스트 이동 및 홈 이동 설정

src/components/common/Header.vue

<router-link to="[path]">이동</router-link> 추가했다. 적용 후 소스보기로 확인하면 a 태그로 변환됨

<template> <header> <h2><router-link to="/"><img alt="Vue logo" src="../../assets/logo.png" width="80"></router-link></h2> <div class="menuWrap"> <ul class="menu"> <li><router-link to="/board/list">게시판</router-link></li> <li><a href="javascript:;">메뉴2</a></li> <li><a href="javascript:;">메뉴3</a></li> <li><a href="javascript:;">메뉴4</a></li> </ul> </div> </header> </template> <script> export default { } </script> <style scoped> header{width:100%; text-align:center; position:relative; height:120px; border-bottom:1px solid #35495e} header h2{position:absolute; top:0; left:100px;} header ul.menu:after{display:block; clear:both; content:'';} header ul.menu{position:absolute; top:20px; right:50px;} header ul.menu li{float:left; padding:10px 20px; list-style:none;} a{text-decoration:none; color:#333;} </style>

(axios를 사용해서 데이터 가져오기)

axios는 javascript http통신 라이브러리 입니다.

게시판 만들기를 진행한다고 하면 backend URL에 접근해서 데이터를 가지고 올 때 사용합니다.

axios설정하기

axios설치하기

Vue js Spring 게시판 - Vue js Spring gesipan

/src/main.js

import axios from 'axios'; //axios 호출 입력

Vue.prototype.$axios = axios; //전역변수로 설정 컴포넌트에서 this.$axios 호출할 수 있음