- 이번 포스팅에서는 저번 시간에 이어서 작동순서를 계속해서 알아볼예정
- 또한 Vue 구성 뿐만아니라 백엔드에서 설계한 Api에 맞춰 통신하는 방법
- 통신하기위해서 사용하는 Axios 비동기 통신 라이브러리를 알아보겠다
- 이전의 포스팅에서 이어지는 내용.
1.Layout & Router

- App.vue 화면을 통해서 우리는 SPA를 구성할 수 있다는 걸 알 수 있었음
- scriptsetup을 통해서 다른 곳에 있는 구성들을 불러 올 수가 있다.
(기본적으로 웹페이지가 Head / Body / Footer 로 구성되어 있기 때문에 지금 처럼 구성해주는 것)
1-1) layout

- 여기서 Head와 Footer를 구성해준다.
- 이렇게 하면 일련의 다른페이지가 app.vue안에 구성되기 때문에 부분적으로 동작 할 수 있음
- 즉 정적인 부분과 동적인 부분을 한 곳에 구성할 수 있게 된다.
1-2) Router

- Vue의 핵심 장점을 보여주는 가장 핵심적인 부분
- router로 폴더에보면 Footer와 HeadingNavbar와 다르게 index.js 이 있는 것이 보인다.
- import
1-3) index.js

- main.js 을 눌러들어가게 되면 위의 사진처럼 구성하려는 화면으로의 이동을 설정할 수 있다.
- 이것을 이해하려면 vue-router를 이해해야 한다. 이전에 1-2 사진에서 보여줬던 vue-router이라는 모듈을 불러와 RouterView로 플레이스홀더를 지정해주었다.
- 다시 돌아와서 1-3 번에 createRouter 함수를 통해서 Vue.js 애플리케이션의 라우터를 생성할 수 있다.
* createRouter- 이 함수는 라우터에 대한 기본적인 설정을 포함하여, 라우팅의 주요 구성을 정의
- 주로 사용자 정의 라우팅 규칙, 라우트의 정의, 및 다른 옵션들을 설정한다.
- createWebHistorty함수는 웹 애플리케이션에서 사용되는 HTML5 히스토리 모드를 설정한다.
* createWebHistorty- HTML5 히스토리 모드는 브라우저의 'history.pushState' 및 'history.replaseState'를 사용하여 URL을 조작하여 페이지를 다시 로드하지 않고 SPA에서 라우팅을 할 수 있게 해준다.
- 'createRouter' 함수의 'history' 옵션에 이를 적용하고 라우터를 설정한다.

- 이 부분을 통해서 qna-list로 보내는 Redirect를 설정할 수 있다.
- Component를 통해서 해당 component의 위치를 지정해준다.
* 플레이스 홀더(placeholder)란?

2. views

- 그래서 QnA를 1-3의 23번째 줄처럼 views에 QnAView로 들어오게되면 <router-view></router-view>가 표시된 것이 보인다.
- 필자는 여기서 쓰면서 이걸 왜 쓰는거지 라는 생각을 했었다.
=> 모든 화면이 Vue의 컴포넌트로 이루어져 있기 때문
3. components

- 이 폴더에는 우리가 구성하려는 Vue component들이 담기는데 그 안에는 앞서봤던 layout과 여러가지들이 모두 담겨있다.
- 해당 vue안에서도 여러가지 다른 vue들을 불러와서 화면을 구성할 수 있다.
즉 여러가지 vue화면 들을 객체처럼 사용할 수 있게 되는 것 - 또한 vue는 그 밖에도 자바스크립트로 만들어진 객체와 함수를 이용하여 기능들을 적용할 수 있다.

- template를 통해서 우리는 HRML처럼 구설 할 수 있다.
- 오른쪽 처럼 반복문을 통해서 여러가지 객체를 담아 불러 올 수 있고, PageNavigation도 구성할 수 있다.

- CSS와 같이 화면에 Style을 적용시키는 부분은 이곳에서 해주면 된다.
4. common / icons / store / util 등

- common
- "common"폴더는 주로 Vue.js 애플리케이션의 공통 요소 및 모듈을 저장하는 폴더
- 이 폴더에는 여러 컴포넌트, 유틸리티 함수, 믹스인(mixin)함수, 헬퍼 함수 등이 포함될 수 있다.
- 개발 마다 다를 수 있다.
- 컴포넌트(Component):
- 여러 컴포넌트 간에 공유되는 기본적인 UI 컴포넌트나 레이아웃 구성 요소 등을 "common" 폴더에 저장
- 재사용 가능한 컴포넌트들은 여기에서 관리되며, 다양한 부분에서 활용될 수 있다.
- 유틸리티 함수(Utility Functions):
- 애플리케이션 전반에서 사용되는 유틸리티 함수들이 "common" 폴더에 위치할 수 있다
- 이러한 함수들은 일반적으로 어플리케이션 전체에서 공통으로 사용되는 기능들을 구현하며, 여러 컴포넌트에서 호출될 수 있다
- 미들웨어(Middleware) 또는 믹스인(Mixin):
- Vue.js에서 미들웨어나 믹스인은 여러 컴포넌트에서 공유되는 로직을 추상화하는 데 사용
- 미들웨어나 믹스인이 공통적으로 사용되는 경우, 이들을 "common" 폴더에 저장하여 코드 중복을 방지하고 유지보수를 편리하게 할 수 있음
- 상수 및 설정 파일:
- 애플리케이션 전체에서 사용되는 상수 값이나 설정 파일들이 "common" 폴더에 저장
- 예를 들어, API 엔드포인트 URL, 토큰 값, 언어 설정과 같은 상수 값들이 여기에 포함
- 헬퍼 함수(Helper Functions):
- 특정 작업을 수행하는 간단한 헬퍼 함수들이 "common" 폴더에 위치할 수 있다.
- 코드의 가독성을 높이고 재사용성을 강화하기 위해 사용되는 함수들이 여기에 포함될 수 있음
- 스타일 및 CSS 파일:
- 애플리케이션의 전반적인 스타일이나 공통적으로 사용되는 CSS 파일들이 "common" 폴더에 저장
- 컴포넌트(Component):
- Store
- 상태 관리를 위한 중앙 집중식 저장소
- 주로 Vuex라는 상태 관리 라이브러리를 사용하여 구현
- Vuex는 Vue.js 애플리케이션에서 컴포넌트 간에 공유되는 상태를 효율적으로 관리하고, 상태 변경에 따른 예측 가능한 동작을 제공
- 상태(State) 관리:
- Vuex store는 애플리케이션의 전역 상태를 저장합니다. 이 상태는 여러 컴포넌트에서 공유되어 사용
- 여러 컴포넌트 간에 공유해야 하는 데이터(상태)를 중앙에서 효과적으로 관리
- 상태 변경(Mutation):
- 컴포넌트에서 상태를 변경하려면 일반적으로 Vuex store에 정의된 "mutations"을 통해 변경
- Mutation은 동기적으로 상태를 변경하는 역할
(여러 컴포넌트가 동시에 같은 상태를 변경하려는 경우, 이를 조절하고 예측 가능하게 만들어준다.)
- 액션(Actions) 처리:
- 비동기 작업이나 복잡한 로직은 "actions"에서 처리
(액션은 비동기적으로 상태를 변경하거나 여러 뮤테이션을 일으키는 역할) - 예를 들어, API 호출, 비동기 작업, 혹은 조건에 따른 여러 뮤테이션의 실행 등이 여기에 속한다.
- 비동기 작업이나 복잡한 로직은 "actions"에서 처리
- 상태 가져오기(Getters):
- "getters"는 store의 상태에 대한 계산된 속성(computed property)을 정의
(즉, 특정 상태를 기반으로 다른 값을 계산할 때 사용된다.) - 다양한 컴포넌트에서 동일한 계산 로직을 사용하고자 할 때 편리하게 활용
- "getters"는 store의 상태에 대한 계산된 속성(computed property)을 정의
- 상태(State) 관리:
- util
- 주로 유틸리티 함수 및 도우미 함수들이 모여 있는 곳을 가리킨다.
-
- 재사용 가능한 함수:
- 자주 사용되는 기능이나 로직을 유틸리티 함수로 추상화하여 여러 곳에서 재사용
- 예를 들어, 날짜 포맷 변환, 문자열 조작, API 호출과 같은 기능을 유틸리티 함수로 정의하여 여러 컴포넌트에서 활용
- 데이터 변환 및 가공:
- 서버에서 받은 데이터를 원하는 형식으로 가공하거나, 특정 형식으로 데이터를 변환하는 로직
- 데이터 형식이나 구조를 일관성 있게 유지하고, 필요에 따라 변환하는 작업이 여기에 포함될 수 있음
- 인증 및 권한 처리:
- 사용자의 인증 상태를 확인하거나, 특정 권한을 가진 사용자인지를 검증하는 로직을 구현
- 인증 및 권한 처리와 관련된 유틸리티 함수는 애플리케이션 전반에서 일관된 방식으로 사용될 수 있음
- HTTP 요청 처리:
- API 호출이나 HTTP 요청과 관련된 로직을 담당할 수 있다.
(UTF 8 과 같은 설정도 여기서 가능하다.) - 이를 통해 컴포넌트에서 직접적으로 HTTP 요청을 하는 것이 아니라, 유틸리티 함수를 사용하여 관련된 로직을 추상화할 수 있음
- API 호출이나 HTTP 요청과 관련된 로직을 담당할 수 있다.
- 유틸리티 클래스:
- 유틸리티 함수뿐만 아니라, 특정 작업을 수행하는 유틸리티 클래스를 정의
- 클래스를 사용하여 관련 메서드와 속성을 그룹화하고, 필요한 경우 인스턴스를 생성하여 사용할 수 있음
- 헬퍼 함수:
- 코드 작성을 단순화하거나 특정 작업을 쉽게 수행하기 위한 헬퍼 함수를 제공
- 예를 들어, 특정 동작을 수행하는 간단한 헬퍼 함수를 제공하여 코드의 가독성을 높이고 유지보수를 용이하게 할 수 있다.이들은 주로 재사용 가능한 기능을 제공하거나, 코드를 단순화하고 가독성을 높이는 데 사용
- 재사용 가능한 함수:
지금 보는 것과 같이 폴더에서 하는 내용들이 중복될 수 있는 만큼 개발할 때에는 특정 폴더에서 어떤 역할을 처리할지를 상의를 하는것이 좋다. 이러한 폴더안에서 로그인의 따른 상태관리, 조회수나 특정 상황이 상태를 기억하고 그 상황을 여러 컴포넌트에서 작동할 수 있도록 기록하고 매끄럽게 움직일 수 있도록 잘 구성해 주어야 한다.
5. API / Axios

5-1) AXIOS란 무엇인가?
- axios는 JavaScript 및 Node.js 환경에서 사용되는 HTTP 클라이언트 라이브러리
- 주로 웹 애플리케이션에서 서버와의 HTTP 요청을 만들고 응답을 처리하기 위해 사용
- axios는 Promise 기반의 API를 제공하며, 비동기 작업을 처리하고 쉽게 데이터를 주고받을 수 있도록 도와준다.
5-2) AXIOS 호출

- http-commons.js 파일을 보면 서버와 통신하기 위해 axios 함수를 호출해서 URL과 Content-Type을 설정해준다.
- 또한 다른 전역에서 사용할 수 있도록 export 함수로 처리해준다.
5-3) Axios 적용 (프론트엔드와 백엔드를 연결해주는 것)
- Axios의 메서드는 이곳을 참고하면 좋을 것 같다.

- API 폴더안에서 서버와 통신을 할 수 있도록 설계해준다.
- http-common.js에서 불러온 axios를 여기서 사용할 수 있는 것이다.
- 이곳에서는 백에드에서 설정한 주소와 맞아야 하며, 성공여부에 따라 사용자에게 맞는 화면을 제공할 수 있도록 통신을 해야한다.

- 백엔드에서 처럼 qna_comment와 같은 주소를 통해서 통신할 수 있는데 우리는 이를 ' "API"를 설계한다 '라고 할 수 있다.
마무리
- 사용자에게 필요한 정보를 전달하기 위한 백엔드 개발을 원한다면 프론트엔드에 대한 지식이 어느정도 기반이 되어 있어야 된다고 생각을 함
- 실제에서는 협업을 하는 부분이다 보니 상대의 고충을 이해할 수 있음으로 원활한 커뮤니케이션에 도움이 될 것으로 보인다.
- 글을 쓰는데 큰 도움을 주신 @권송아 https://singasongah.tistory.com/님께 무한한 감사의 인사를 표합니다.
🎈 Happy Coding 🎄
D O R A M I
singasongah.tistory.com









