Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d78e0e569d | ||
|
|
dd6e8fad8d | ||
|
|
b7a255d112 | ||
|
|
f1478b722e | ||
|
|
86bb325fd2 | ||
|
|
a75eef8ec9 | ||
|
|
e790713c64 | ||
|
|
bf1b7cf1fe | ||
|
|
da5caa40fc |
35
.github/ISSUE_TEMPLATE/amendment_request.yml
vendored
Normal file
35
.github/ISSUE_TEMPLATE/amendment_request.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: 개발가이드 수정 요청 Requesting changes to the development guide
|
||||
description: 개발가이드 수정 요청하는 템플릿입니다. Template for requesting changes to the dev guide.
|
||||
title: "[Guide]: "
|
||||
labels: ["guide"]
|
||||
assignees:
|
||||
- overpassion
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
시간을 내어 개발가이드 수정 요청을 작성해 주셔서 감사합니다. Thank you for taking the time to fill out a DevGuide correction request. (공유하고 싶은 기술문서나 노하우는 github wiki에 남겨 주세요. If you have any documentation or know-how you'd like to share, please leave it on our github wiki.)
|
||||
- type: input
|
||||
id: url
|
||||
attributes:
|
||||
label: 개발가이드 URL Dev Guide URL
|
||||
description: 수정해야할 개발가이드 URL을 적어 주세요. Please write down the dev guide URL that needs to be modified.
|
||||
placeholder: Example) https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte4.1:fdl:aop:aspectj
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: where-to-amend
|
||||
attributes:
|
||||
label: 수정 대상 내용 What to fix
|
||||
description: 수정해야할 대상 내용을 기입해 주세요. Fill in what you need to fix.
|
||||
placeholder: 수정해야할 대상은 다음과 같습니다. Here's what you'll need to modify
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: amendment
|
||||
attributes:
|
||||
label: 수정 문구 Corrective Wording
|
||||
description: 어떻게 수정되어야 하는지 적어주세요. Please write down how it should be fixed.
|
||||
placeholder: 다음과 같이 수정되어야 합니다. It should be modified as follows
|
||||
validations:
|
||||
required: true
|
||||
74
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
74
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
name: 버그 리포트 Bug report
|
||||
description: 오류 내용을 이슈로 등록하는 템플릿입니다. Template to register an error as an issue.
|
||||
title: "[Bug]: "
|
||||
labels: ["bug", "triage"]
|
||||
assignees:
|
||||
- overpassion
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
시간을 내어 버그 리포트를 작성해 주셔서 감사합니다. Thank you for taking the time to fill out a bug report.
|
||||
- type: input
|
||||
id: contact
|
||||
attributes:
|
||||
label: 연락처 Contact
|
||||
description: 추가 정보 필요 시, 연락할 수 있는 이메일을 적어 주세요. Please include an email where we can reach you if we need more information. (Optional)
|
||||
placeholder: 예) email@example.com
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: 오류 내용 Error Description
|
||||
description: 오류 내용을 기입해 주세요. Please provide a description of the error.
|
||||
placeholder: Tell us what you see!
|
||||
value: "오류를 발견했어요. I found an error."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduce
|
||||
attributes:
|
||||
label: 오류 재현 방법 How to reproduce the error
|
||||
description: 오류 발생을 재현하려면, 어떻게 해야하나요? How can we reproduce the error you reported?
|
||||
placeholder: 오류 재현 방법 How to reproduce the error
|
||||
value: "(다음은 예시이며, 내용을 덮어 써 주세요. The following is an example, please overwrite the content.)\n\n
|
||||
1. 다음 메뉴를 선택한다. Select the following menu '...'\n
|
||||
2. 다음 버튼을 클릭한다. Click the Next button. '....'\n
|
||||
3. 다음 문구까지 스크롤 다운한다. Scroll down to the following phrase '....'\n
|
||||
4. 오류를 확인한다. Check for errors."
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: environment
|
||||
attributes:
|
||||
label: 환경정보 Environmental Information
|
||||
description: 오류가 발생한 환경정보를 작성해 주세요. Please describe the environment in which the error occurred.
|
||||
placeholder: 오류 환경정보 Error Environment Information
|
||||
value: " - OS정보 Operating System: \n
|
||||
- 표준프레임워크 버전 eGovFrame Version: \n
|
||||
- JDK(JRE) 정보: \n
|
||||
- WAS 정보: \n
|
||||
- DB 정보: \n
|
||||
- 기타 환경 정보 Other environmental information:"
|
||||
validations:
|
||||
required: false
|
||||
- type: dropdown
|
||||
id: browsers
|
||||
attributes:
|
||||
label: 어느 브라우저를 사용했나요? Which browser did you use?
|
||||
multiple: true
|
||||
options:
|
||||
- Chrome
|
||||
- Firefox
|
||||
- Microsoft Edge
|
||||
- Opera
|
||||
- Safari
|
||||
- Internet Explorer
|
||||
- Others
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: 에러 로그 Error Logs
|
||||
description: 관련 에러 로그를 복사하여 붙여넣어 주세요. Please copy and paste the relevant error logs.
|
||||
render: shell
|
||||
51
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
51
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: 기능 요구 및 의견 Feature Request
|
||||
description: 기능 요구나 기타 의견을 이슈로 등록하는 템플릿입니다. Suggest an idea for improving eGovFrame.
|
||||
title: "[기능요구(Feature)]: "
|
||||
labels: ["feature"]
|
||||
assignees:
|
||||
- overpassion
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
시간을 내어 의견을 작성해 주셔서 감사합니다. Thank you for taking the time to fill out a request.
|
||||
- type: input
|
||||
id: contact
|
||||
attributes:
|
||||
label: 연락처 Contact
|
||||
description: 추가 정보 필요 시, 연락할 수 있는 이메일을 적어 주세요. Please include an email where we can reach you if we need more information. (Optional)
|
||||
placeholder: 예) email@example.com
|
||||
validations:
|
||||
required: false
|
||||
- type: input
|
||||
id: feature-title
|
||||
attributes:
|
||||
label: 추가 요청 기능명 Feature Name
|
||||
description: 추가를 원하는 기능명칭을 간략히 적어주세요. Write the title of the feature you'd like to add.
|
||||
placeholder: 예) 게시판 첨부기능 추가 Example) Adding a bulletin board attachment
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: feature-request-details
|
||||
attributes:
|
||||
label: 기능 상세 설명 Feature Description
|
||||
description: 추가를 원하는 기능에 대해 상세히 기술해 주세요. Please describe in detail the features you would like to see added.
|
||||
placeholder: 추가를 원하는 기능은 다음과 같습니다. Here are the features I'd like to see added
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: 솔루션 상세 Solution Details
|
||||
description: 위 기능을 구현하는데 도움이 되는 기술내용이 있으면 적어 주세요. If you have any technical details to help us implement the above features, please let us know.
|
||||
placeholder: 위 기능을 구현하는데 도움이 되는 기술내용은 다음과 같습니다. Here are some technical details to help you implement the above features.
|
||||
validations:
|
||||
required: false
|
||||
- type: input
|
||||
id: solution-url
|
||||
attributes:
|
||||
label: 솔루션 관련 URL Solution-related URLs
|
||||
description: 위 기능을 구현하는데 도움이 되는 웹사이트 주소가 있으면 적어 주세요. If you have a website address that can help us implement the above features, please write it down.
|
||||
placeholder: Example) egovframe.go.kr
|
||||
validations:
|
||||
required: false
|
||||
35
.github/pull_request_template.md
vendored
Normal file
35
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
## 수정 사유 Reason for modification
|
||||
|
||||
소스를 수정한 사유가 무엇인지 체크해 주세요. Please check the reason you modified the source. ([X] X는 대문자여야 합니다.)
|
||||
|
||||
- [x] 버그수정 Bug fixes
|
||||
- [ ] 기능개선 Enhancements
|
||||
- [ ] 기능추가 Adding features
|
||||
- [ ] 기타 Others
|
||||
|
||||
## 수정된 소스 내용 Modified source
|
||||
|
||||
검토자를 위해 수정된 소스 내용을 설명해 주세요. Please describe the modified source for reviewers.
|
||||
|
||||
## JUnit 테스트 JUnit tests
|
||||
|
||||
테스트를 완료하셨으면 다음 항목에 [대문자X]로 표시해 주세요. When you're done testing, check the following items.
|
||||
|
||||
- [x] JUnit 테스트 JUnit tests
|
||||
- [x] 수동 테스트 Manual testing
|
||||
|
||||
## 테스트 브라우저 Test Browser
|
||||
|
||||
테스트를 진행한 브라우저를 선택해 주세요. Please select the browser(s) you ran the test on. (다중 선택 가능 you can select multiple) [X] X는 대문자여야 합니다.
|
||||
|
||||
- [ ] Chrome
|
||||
- [ ] Firefox
|
||||
- [ ] Edge
|
||||
- [ ] Safari
|
||||
- [ ] Opera
|
||||
- [ ] Internet Explorer
|
||||
- [ ] 기타 Others
|
||||
|
||||
## 테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video
|
||||
|
||||
테스트 전과 후의 스크린샷 또는 캡처 영상을 이곳에 첨부해 주세요. Please attach screenshots or video captures of your before and after tests here.
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -56,8 +56,10 @@ HELP.md
|
||||
**/out/
|
||||
|
||||
# production
|
||||
**/build
|
||||
!**/build/
|
||||
**/build/*
|
||||
**/dist
|
||||
!backend/module-common/build/libs/
|
||||
|
||||
# misc
|
||||
**.DS_Store
|
||||
|
||||
201
LICENSE
Normal file
201
LICENSE
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
222
README-en.md
Normal file
222
README-en.md
Normal file
@@ -0,0 +1,222 @@
|
||||
# MSA templates (for training)
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
This is the training source code for the Microservices Architecture (MSA) template created as part of the "Supporting the Spread of Cloud-Native Administrative and Public Services (2021)" project.
|
||||
|
||||
## Directory structure
|
||||
|
||||
```
|
||||
├─backend
|
||||
│ ├─apigateway
|
||||
│ ├─board-service
|
||||
│ ├─config
|
||||
│ ├─discovery
|
||||
│ ├─module-common
|
||||
│ ├─portal-service
|
||||
│ ├─reserve-check-service
|
||||
│ ├─reserve-item-service
|
||||
│ ├─reserve-request-service
|
||||
│ └─user-service
|
||||
├─config
|
||||
├─docker-compose
|
||||
│ ├─app
|
||||
│ │ ├─mesh
|
||||
│ │ └─service
|
||||
│ ├─elk
|
||||
│ │ ├─kibana
|
||||
│ │ │ └─config
|
||||
│ │ └─logstash
|
||||
│ │ ├─config
|
||||
│ │ └─pipeline
|
||||
│ ├─mysql
|
||||
│ │ └─init
|
||||
│ └─opensearch
|
||||
│ └─logstash
|
||||
│ ├─config
|
||||
│ └─pipeline
|
||||
├─frontend
|
||||
│ ├─admin
|
||||
│ │ ├─public
|
||||
│ │ │ ├─images
|
||||
│ │ │ └─locales
|
||||
│ │ ├─server
|
||||
│ │ ├─src
|
||||
│ │ │ ├─@types
|
||||
│ │ │ ├─components
|
||||
│ │ │ ├─constants
|
||||
│ │ │ ├─hooks
|
||||
│ │ │ ├─libs
|
||||
│ │ │ ├─pages
|
||||
│ │ │ ├─service
|
||||
│ │ │ ├─stores
|
||||
│ │ │ ├─styles
|
||||
│ │ │ └─utils
|
||||
│ │ └─test
|
||||
│ ├─portal
|
||||
│ │ ├─public
|
||||
│ │ │ ├─locales
|
||||
│ │ │ └─styles
|
||||
│ │ ├─src
|
||||
│ │ │ ├─@types
|
||||
│ │ │ ├─components
|
||||
│ │ │ ├─constants
|
||||
│ │ │ ├─hooks
|
||||
│ │ │ ├─libs
|
||||
│ │ │ │ └─Storage
|
||||
│ │ │ ├─pages
|
||||
│ │ │ ├─service
|
||||
│ │ │ ├─stores
|
||||
│ │ │ ├─styles
|
||||
│ │ │ └─utils
|
||||
│ │ └─test
|
||||
│ └─practice-image
|
||||
└─k8s
|
||||
├─applications
|
||||
│ ├─backend
|
||||
│ │ ├─apigateway
|
||||
│ │ │ └─ingress
|
||||
│ │ ├─board-service
|
||||
│ │ ├─config
|
||||
│ │ ├─discovery
|
||||
│ │ │ └─ingress
|
||||
│ │ ├─portal-service
|
||||
│ │ ├─reserve-check-service
|
||||
│ │ ├─reserve-item-service
|
||||
│ │ ├─reserve-request-service
|
||||
│ │ └─user-service
|
||||
│ └─frontend
|
||||
│ ├─admin
|
||||
│ │ └─ingress
|
||||
│ └─portal
|
||||
│ └─ingress
|
||||
└─environments
|
||||
├─configmaps
|
||||
├─databases
|
||||
│ └─mysql
|
||||
│ └─init
|
||||
├─jenkins
|
||||
├─logging
|
||||
│ └─elk
|
||||
│ ├─elasticsearch
|
||||
│ ├─kibana
|
||||
│ │ └─ingress
|
||||
│ └─logstash
|
||||
├─nfs
|
||||
├─rabbitmq
|
||||
│ └─ingress
|
||||
├─storage
|
||||
├─vagrant
|
||||
└─zipkin
|
||||
└─ingress
|
||||
```
|
||||
|
||||
### Contents
|
||||
|
||||
- `/backend`: Services on the backend based on Spring Boot
|
||||
- `/backend/apigateway`: API management and monitoring service for microservices (service mesh)
|
||||
- `/backend/board-service`: Bulletin Board Service (Manage boards, posts, and attachments)
|
||||
- `/backend/config`: Provide environment-independent services by offering separate, unified configuration management services (service mesh)
|
||||
- `/backend/discovery`: Register and manage microservices and find and invoke them on demand (service mesh)
|
||||
- `/backend/user-service`: User services (login, sign up, forgot password, admin)
|
||||
- `/backend/portal-service`: Portal common services (menu, code, content, permissions, authorizations, banners, attachment management)
|
||||
- `/backend/reserve-check-service`: Reservation Confirmation Service (non-blocking)
|
||||
- `/backend/reserve-item-service`: Reserved Item Service (non-blocking)
|
||||
- `/backend/reserve-request-service`: Reservation Request Service (non-blocking)
|
||||
- `/config`: A folder containing a collection of configuration YAML files used by the CONFIG server in the backend.
|
||||
- `/docker-compose`: YAML configuration files to manage the running of multiple containers in Docker
|
||||
- `/frontend/admin`: Admin Dashboard built with Next.js + Typescript + Material UI.
|
||||
- `/frontend/portal`: React based frontend built with Next.js + Typescript.
|
||||
- `/frontend/practice-image`: Banner images
|
||||
- `/k8s`: Resource template yaml file for deploying to a Kubernetes environment
|
||||
- `/k8s/applications`: K8s Resource template yaml files for the backend and frontend applications
|
||||
- `/k8s/environments/configmaps`: objects stored as key-value pairs as environment variables used by Pods.
|
||||
- `/k8s/environments/databases`: MySQL-related objects
|
||||
- `/k8s/environments/jenkins`: Jenkins-related objects
|
||||
- `/k8s/environments/logging`: ELK-specific objects for Centralized Logging
|
||||
- `/k8s/environments/nfs`: NFS Node Volumes Configuration
|
||||
- `/k8s/environments/rabbitmq`: Message Broker-related objects
|
||||
- `/k8s/environments/storage`: PersistentVolumeClaim objects
|
||||
- `/k8s/environments/vagrant`: Vagrant-specific definitions that make it easy to configure the creation of a virtualized software development environment
|
||||
- `/k8s/environments/zipkin`: Zipkin-specific definitions for distributed transaction tracing
|
||||
|
||||
## How to run backend
|
||||
|
||||
- Run the Eclipse IDE in your development environment.
|
||||
- From the Eclipse IDE menu, click File>Import....
|
||||
- In the Import window that opens, select Gradle>Existing Gradle Project
|
||||
- Click Next when the Import Gradle Project window opens.
|
||||
- Select ${home}/workspace.edu/egovframe-msa-edu/backend/config from the project root directory and click the Finish button.
|
||||
- Repeat the above to import the following projects (1-6 for small, 1-9 for large).
|
||||
|
||||
1. config
|
||||
2. discovery
|
||||
3. apigateway
|
||||
4. user-service
|
||||
5. portal-service
|
||||
6. board-service
|
||||
7. reserve-check-service
|
||||
8. reserve-item-service
|
||||
9. reserve-request-service
|
||||
|
||||
- After importing all the projects and checking the Project Explorer, the board-service, portal-service, and user-service projects show errors. You need to add the classes that are generated by querydsl to the build path.
|
||||
- Click Window>Show View>Other, select Gradle>Gradle Tasks in the opened window, and click the Open button to open the Gradle Tasks tab.
|
||||
- Click the View Menu button in the top right corner of Gradle Tasks and check Show All Tasks.
|
||||
- In Gradle Tasks, double-click portal-service>other>compileQuerydsl or right-click and click Run Gradle Tasks to start the build.
|
||||
- In the Project Explorer, select board-service, portal-service, user-service, and press F5 or right-click and click Refresh to refresh the project.
|
||||
- In Project Explorer, right-click the board-service, portal-service, or user-service, and then click Properties.
|
||||
- In the Properties window that opens, select Java Build Path from the left menu and click the Add Folder... button on the right Source tab.
|
||||
- In the Source Folder Selection window that opens, check build>generated>querydsl and click the OK button.
|
||||
- When you click the Apply and Close button in the Properties window, the window closes and the project rebuilds and the error message disappears.
|
||||
|
||||
(For more information about ELK configuration, Config, OAuth 2.0 setup, API call and JUnit Test, please refer to [02.MSA template backend configuration and practice(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084631/02.MSA._.pdf).)
|
||||
|
||||
## How to run frontend
|
||||
|
||||
```
|
||||
node : 14.8.0
|
||||
npm : 6.14.7
|
||||
Visual Studio Code : latest
|
||||
```
|
||||
|
||||
- Download and install from https://nodejs.org/en/download and check the version.
|
||||
|
||||
```
|
||||
node -v
|
||||
npm -v
|
||||
```
|
||||
|
||||
- In Visual Studio Code, open the frontend/admin folder.
|
||||
- In a terminal, run the following
|
||||
|
||||
```
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
- On the login screen, enter '1@gmail.com' in the email field and 'test1234!' in the password field to log in.
|
||||
|
||||
(For more information, please refer to [03.MSA template frontend configuration and practice(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084632/03.MSA._.pdf).)
|
||||
|
||||
## Screenshots reference
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## Training materials
|
||||
|
||||
Only available in Korean.
|
||||
- [01.MSA template overview and development environment practice(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084628/01.MSA._._.pdf)
|
||||
- [01.MSA Template Overview and Development Environment Theory(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084629/01.MSA._._.pdf)
|
||||
- [02.MSA template backend configuration and practice(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084631/02.MSA._.pdf)
|
||||
- [03.MSA template frontend configuration and practice(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084632/03.MSA._.pdf)
|
||||
- [04.MSA template event stream configuration and practice(KOR).pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084633/04.MSA._.pdf)
|
||||
223
README.md
223
README.md
@@ -1,2 +1,221 @@
|
||||
# egovframe-msa-edu
|
||||
[Egovframe MSA Template] 클라우드 네이티브 기반의 행정,공공기관 서비스 확산 지원 사업, 온라인 교육 소스
|
||||
# MSA 템플릿 (교육용)
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
'클라우드 네이티브 기반 행정·공공 서비스 확산 지원(2021)' 사업의 일환으로 제작된 MSA(Microservices Architecture) 템플릿의 교육 소스코드이다.
|
||||
|
||||
## 디렉토리 구조
|
||||
|
||||
```
|
||||
├─backend
|
||||
│ ├─apigateway
|
||||
│ ├─board-service
|
||||
│ ├─config
|
||||
│ ├─discovery
|
||||
│ ├─module-common
|
||||
│ ├─portal-service
|
||||
│ ├─reserve-check-service
|
||||
│ ├─reserve-item-service
|
||||
│ ├─reserve-request-service
|
||||
│ └─user-service
|
||||
├─config
|
||||
├─docker-compose
|
||||
│ ├─app
|
||||
│ │ ├─mesh
|
||||
│ │ └─service
|
||||
│ ├─elk
|
||||
│ │ ├─kibana
|
||||
│ │ │ └─config
|
||||
│ │ └─logstash
|
||||
│ │ ├─config
|
||||
│ │ └─pipeline
|
||||
│ ├─mysql
|
||||
│ │ └─init
|
||||
│ └─opensearch
|
||||
│ └─logstash
|
||||
│ ├─config
|
||||
│ └─pipeline
|
||||
├─frontend
|
||||
│ ├─admin
|
||||
│ │ ├─public
|
||||
│ │ │ ├─images
|
||||
│ │ │ └─locales
|
||||
│ │ ├─server
|
||||
│ │ ├─src
|
||||
│ │ │ ├─@types
|
||||
│ │ │ ├─components
|
||||
│ │ │ ├─constants
|
||||
│ │ │ ├─hooks
|
||||
│ │ │ ├─libs
|
||||
│ │ │ ├─pages
|
||||
│ │ │ ├─service
|
||||
│ │ │ ├─stores
|
||||
│ │ │ ├─styles
|
||||
│ │ │ └─utils
|
||||
│ │ └─test
|
||||
│ ├─portal
|
||||
│ │ ├─public
|
||||
│ │ │ ├─locales
|
||||
│ │ │ └─styles
|
||||
│ │ ├─src
|
||||
│ │ │ ├─@types
|
||||
│ │ │ ├─components
|
||||
│ │ │ ├─constants
|
||||
│ │ │ ├─hooks
|
||||
│ │ │ ├─libs
|
||||
│ │ │ │ └─Storage
|
||||
│ │ │ ├─pages
|
||||
│ │ │ ├─service
|
||||
│ │ │ ├─stores
|
||||
│ │ │ ├─styles
|
||||
│ │ │ └─utils
|
||||
│ │ └─test
|
||||
│ └─practice-image
|
||||
└─k8s
|
||||
├─applications
|
||||
│ ├─backend
|
||||
│ │ ├─apigateway
|
||||
│ │ │ └─ingress
|
||||
│ │ ├─board-service
|
||||
│ │ ├─config
|
||||
│ │ ├─discovery
|
||||
│ │ │ └─ingress
|
||||
│ │ ├─portal-service
|
||||
│ │ ├─reserve-check-service
|
||||
│ │ ├─reserve-item-service
|
||||
│ │ ├─reserve-request-service
|
||||
│ │ └─user-service
|
||||
│ └─frontend
|
||||
│ ├─admin
|
||||
│ │ └─ingress
|
||||
│ └─portal
|
||||
│ └─ingress
|
||||
└─environments
|
||||
├─configmaps
|
||||
├─databases
|
||||
│ └─mysql
|
||||
│ └─init
|
||||
├─jenkins
|
||||
├─logging
|
||||
│ └─elk
|
||||
│ ├─elasticsearch
|
||||
│ ├─kibana
|
||||
│ │ └─ingress
|
||||
│ └─logstash
|
||||
├─nfs
|
||||
├─rabbitmq
|
||||
│ └─ingress
|
||||
├─storage
|
||||
├─vagrant
|
||||
└─zipkin
|
||||
└─ingress
|
||||
```
|
||||
|
||||
### 디렉토리 설명
|
||||
|
||||
- `/backend`: Spring Boot를 기반으로 백앤드에 올려지는 서비스들
|
||||
- `/backend/apigateway`: Microservice에 대한 API 관리 및 모니터링 서비스
|
||||
- `/backend/board-service`: 게시판 서비스 (게시판, 게시물, 첨부파일 관리)
|
||||
- `/backend/config`: 별도의 통합된 설정 관리 서비스 제공을 통해 환경 독립적 서비스 제공
|
||||
- `/backend/discovery`: 마이크로서비스들을 등록하여 관리하고 요청 시 해당 서비스를 찾아 호출
|
||||
- `/backend/user-service`: 사용자 서비스 (로그인, 회원가입, 비밀번호 찾기, 관리자)
|
||||
- `/backend/portal-service`: 포털 공통 서비스 (메뉴, 코드, 컨텐츠, 권한, 인가, 배너, 첨부파일 관리)
|
||||
- `/backend/reserve-check-service`: 예약 확인 서비스
|
||||
- `/backend/reserve-item-service`: 예약 물품 서비스
|
||||
- `/backend/reserve-request-service`: 예약 신청 서비스
|
||||
- `/config`: backend 의 config 서버에서 사용하는 설정 yaml 파일 모음 폴더
|
||||
- `/docker-compose`: Docker에 여러 컨테이너의 실행을 관리하는 yaml 구성 파일들
|
||||
- `/frontend/admin`: Next.js + Typescript + Material UI 활용한 Admin Dashboard.
|
||||
- `/frontend/portal`: Next.js + Typescript 활용한 React 기반 프론트엔드.
|
||||
- `/frontend/practice-image`: 배너 이미지
|
||||
- `/k8s`: Kubernetes 환경 배포를 위한 Resource 템플릿 yaml 파일
|
||||
- `/k8s/applications`: Backend와 Frontend 애플리케이션의 k8s Resource 템플릿 yaml 파일
|
||||
- `/k8s/environments/configmaps`: Pods에서 사용하는 환경변수로서 Key-Value 쌍의 형태로 저장된 객체 정의
|
||||
- `/k8s/environments/databases`: MySQL 관련 객체 정의
|
||||
- `/k8s/environments/jenkins`: Jenkins 관련 객체 정의
|
||||
- `/k8s/environments/logging`: Centralized Logging을 위한 ELK 관련 객체 정의
|
||||
- `/k8s/environments/nfs`: NFS 노드 볼륨 구성
|
||||
- `/k8s/environments/rabbitmq`: Message Broker 관련 객체 정의
|
||||
- `/k8s/environments/storage`: PersistentVolumeClaim 정의
|
||||
- `/k8s/environments/vagrant`: 가상화 소프트웨어 개발환경의 생성을 쉽게 구성하도록 하는 Vagrant 관련 정의
|
||||
- `/k8s/environments/zipkin`: 분산 트랜잭션 추적을 위한 Zipkin 관련 정의
|
||||
|
||||
## 백앤드 구동 방법
|
||||
|
||||
- 개발환경 Eclipse IDE 를 실행한다.
|
||||
- Eclipse IDE 메뉴에서 File>Import… 를 클릭한다.
|
||||
- Import 창이 열리면 Gradle>Existing Gradle Project 를 선택하고 Next 버튼을 클릭한다.
|
||||
- Import Gradle Project 창이 열리면 Next 버튼을 클릭한다.
|
||||
- Project root directory 에서 ${home}/workspace.edu/egovframe-msa-edu/backend/config를 선택하고 Finish 버튼을 클릭한다.
|
||||
- 위의 과정을 반복하여 아래의 프로젝트를 import 한다. (소규모는 1-6, 대규모는 1-9)
|
||||
|
||||
1. config
|
||||
2. discovery
|
||||
3. apigateway
|
||||
4. user-service
|
||||
5. portal-service
|
||||
6. board-service
|
||||
7. reserve-check-service
|
||||
8. reserve-item-service
|
||||
9. reserve-request-service
|
||||
|
||||
- 모든 프로젝트를 import 하고 Project Explorer 를 확인하면 board-service, portal-service, user-service 프로젝트에 오류 표시가 출력된다. querydsl 로 generate 되는 클래스들을 build path 에 추가해야 한다.
|
||||
- Window>Show View>Other 을 클릭해서 열린 창에서 Gradle>Gradle Tasks 를 선택하고 Open 버튼을 클릭하면 Gradle Tasks 탭이 열린다.
|
||||
- Gradle Tasks 오른쪽 윗부분의 View Menu 버튼을 클릭해서 Show All Tasks 를 체크한다.
|
||||
- Gradle Tasks 에서 portal-service>other>compileQuerydsl 을 더블클릭 또는 우클릭 후 Run Gradle Tasks 를 클릭하면 build 가 시작된다.
|
||||
- Project Explorer 에서 board-service, portal-service, user-service 를 선택하고 F5 또는 우클릭 후 Refresh 를 클릭해서 프로젝트를 새로고침한다.
|
||||
- Project Explorer 에서 board-service, portal-service, user-service 를 우클릭하고 Properties 를 클릭한다.
|
||||
- Properties 창이 열리면 왼쪽 메뉴에서 Java Build Path를 선택하고 오른쪽 Source 탭에서 Add Folder… 버튼을 클릭한다.
|
||||
- Source Folder Selection 창이 열리면 build>generated>querydsl 을 체크하고 OK 버튼을 클릭한다.
|
||||
- Properties 창에서 Apply and Close 버튼을 클릭하면 창이 닫히면서 프로젝트를 다시 빌드하고 오류 표시는 사라진다.
|
||||
|
||||
(ELK 설정, Config 설정, OAuth 2.0 설정, API 호출 및 JUnit 테스트 관련해서는 [02.MSA템플릿 백엔드구성 및 실습.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084631/02.MSA._.pdf) 파일을 참조한다.)
|
||||
|
||||
## 프론트앤드 구동 방법
|
||||
|
||||
```
|
||||
node : 14.8.0
|
||||
npm : 6.14.7
|
||||
Visual Studio Code : latest
|
||||
```
|
||||
|
||||
- https://nodejs.org/en/download 에서 다운로드 후 설치하고 버전을 확인한다.
|
||||
|
||||
```
|
||||
node -v
|
||||
npm -v
|
||||
```
|
||||
|
||||
- Visual Studio Code 에서 frontend/admin 폴더를 연다.
|
||||
- Terminal 에서 다음을 실행한다.
|
||||
|
||||
```
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
- 로그인 화면에서 email 란에 '1@gmail.com', password 란에 'test1234!' 입력 후 로그인한다.
|
||||
|
||||
(기타 상세한 내용은 [03.MSA템플릿 프론트엔드구성 및 실습.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084632/03.MSA._.pdf) 파일을 참조한다.)
|
||||
|
||||
## 참조 화면
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## 교육 교재
|
||||
|
||||
- [01.MSA템플릿 개요 및 개발환경 실습.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084628/01.MSA._._.pdf)
|
||||
- [01.MSA템플릿 개요 및 개발환경 이론.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084629/01.MSA._._.pdf)
|
||||
- [02.MSA템플릿 백엔드구성 및 실습.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084631/02.MSA._.pdf)
|
||||
- [03.MSA템플릿 프론트엔드구성 및 실습.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084632/03.MSA._.pdf)
|
||||
- [04.MSA템플릿 이벤트스트림구성 및 실습.pdf](https://github.com/eGovFramework/egovframe-msa-edu/files/11084633/04.MSA._.pdf)
|
||||
@@ -1,12 +1,12 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id "org.sonarqube" version "3.3"
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'org.sonarqube' version '3.5.0.2730'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
repositories {
|
||||
@@ -14,8 +14,8 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -28,11 +28,11 @@ dependencies {
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap' // config
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp' // bus
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
implementation 'javax.xml.bind:jaxb-api:2.3.1'
|
||||
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.7.0'
|
||||
|
||||
compileOnly 'org.projectlombok:lombok'
|
||||
annotationProcessor 'org.projectlombok:lombok'
|
||||
|
||||
@@ -69,7 +69,7 @@ management:
|
||||
info:
|
||||
app:
|
||||
name: Spring Cloud Gateway
|
||||
description: API <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
description: API 라우팅 및 보안, 모니터링/메트릭 등의 기능을 간단하고 효과적인 방법으로 제공
|
||||
swagger-ui: http://localhost:8000/webjars/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config
|
||||
|
||||
messages:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id "org.sonarqube" version "3.3"
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'org.sonarqube' version '3.5.0.2730'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
// querydsl
|
||||
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
@@ -23,14 +23,14 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// implementation files('../../module-common/build/libs/module-common-0.1.jar') // 공통 모듈, @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:0.1'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
// implementation files('../module-common/build/libs/module-common-4.2.0-plain.jar') // 공통 모듈, @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:4.2.0'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
@@ -48,8 +48,8 @@ dependencies {
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.73'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'mysql:mysql-connector-java'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
// querydsl
|
||||
implementation 'com.querydsl:querydsl-jpa:5.0.0'
|
||||
@@ -62,8 +62,8 @@ dependencies {
|
||||
implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit'
|
||||
|
||||
// openapi docs
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.9'
|
||||
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.7.0'
|
||||
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
|
||||
|
||||
// lombok
|
||||
implementation 'org.projectlombok:lombok'
|
||||
@@ -72,10 +72,11 @@ dependencies {
|
||||
testAnnotationProcessor 'org.projectlombok:lombok'
|
||||
|
||||
testImplementation 'com.h2database:h2'
|
||||
testImplementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' // 테스트시에만 출력
|
||||
testImplementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1' // 테스트시에만 출력
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
|
||||
implementation 'org.javassist:javassist:3.29.0-GA'
|
||||
implementation 'org.javassist:javassist:3.29.2-GA'
|
||||
implementation 'org.webjars:webjars-locator-core:0.53'
|
||||
}
|
||||
|
||||
dependencyManagement {
|
||||
|
||||
@@ -30,4 +30,4 @@ management:
|
||||
info:
|
||||
app:
|
||||
name: Board Service
|
||||
description: <EFBFBD>Խ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>, <20>Խù<D4BD><C3B9><EFBFBD><EFBFBD><EFBFBD>, ÷<><C3B7><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
description: 게시판관리, 게시물관리, 첨부파일관리 기능을 제공
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
repositories {
|
||||
@@ -13,8 +13,8 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -27,7 +27,7 @@ dependencies {
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.73'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
}
|
||||
|
||||
|
||||
38
backend/config/config/application.yml
Normal file
38
backend/config/config/application.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
# 2시간(7,200,000), 1일(86,400,000) jwt token
|
||||
token:
|
||||
expiration_time: 7200000
|
||||
refresh_time: 86400000
|
||||
secret: 'token_secret'
|
||||
|
||||
eureka:
|
||||
instance:
|
||||
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} # random port 사용시 eureka server에 인스턴스가 각각 표시되지 않는다
|
||||
preferIpAddress: true # 서비스간 통신 시 hostname 보다 ip 를 우선
|
||||
client:
|
||||
register-with-eureka: true # eureka 서버에 등록
|
||||
fetch-registry: true # 외부 검색 가능
|
||||
service-url:
|
||||
defaultZone: http://admin:admin@${eureka.instance.hostname:localhost}:8761/eureka
|
||||
|
||||
# file attach location - messages{lang}.properties 도 이 경로에 위치한다.
|
||||
file:
|
||||
directory: ${app.home:${user.home}}/msa-attach-volume # url 사용시에는 사용되지 않는다
|
||||
url: http://${file.hostname:localhost}:8080 # nginx 로 파일 다운로드 처리
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
apigateway:
|
||||
host: http://${apigateway.hostname:localhost}:${server.port}
|
||||
|
||||
# rabbitmq server
|
||||
spring:
|
||||
rabbitmq:
|
||||
host: ${rabbitmq.hostname:localhost}
|
||||
port: 5672
|
||||
username: guest
|
||||
password: guest
|
||||
zipkin:
|
||||
base-url: http://${zipkin.hostname:localhost}:${zipkin.port:9411}
|
||||
|
||||
egov:
|
||||
message: hello
|
||||
46
backend/config/config/board-service-test.yml
Normal file
46
backend/config/config/board-service-test.yml
Normal file
@@ -0,0 +1,46 @@
|
||||
spring:
|
||||
application:
|
||||
name: board-service
|
||||
|
||||
datasource:
|
||||
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
|
||||
username: sa
|
||||
password:
|
||||
driver-class-name: org.h2.Driver
|
||||
jpa:
|
||||
# database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
hibernate:
|
||||
generate-ddl: true
|
||||
ddl-auto: create-drop
|
||||
# dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
default_batch_fetch_size: 1000 # 1:N 관계를 해결하기 위해 필요
|
||||
show-sql: true
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2
|
||||
|
||||
logging.level:
|
||||
org.hibernate.SQL: debug
|
||||
|
||||
file:
|
||||
directory: ${user.home}/msa-attach-volume
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
# jwt token
|
||||
token:
|
||||
secret: egovframe_user_token
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
|
||||
# eureka 가 포함되면 eureka server 도 등록되므로 해제한다.
|
||||
eureka:
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
15
backend/config/config/board-service.yml
Normal file
15
backend/config/config/board-service.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
database:
|
||||
url: jdbc:mysql://${mysql.hostname:localhost}:3306/msaportal
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
cloud:
|
||||
stream:
|
||||
bindings:
|
||||
attachmentEntity-out-0: # 첨부파일 entity 정보 업데이트 하기 위한 이벤트
|
||||
destination: attachment-entity.topic # queue name
|
||||
group: attachment
|
||||
44
backend/config/config/portal-service-test.yml
Normal file
44
backend/config/config/portal-service-test.yml
Normal file
@@ -0,0 +1,44 @@
|
||||
spring:
|
||||
application:
|
||||
name: portal-service
|
||||
|
||||
datasource:
|
||||
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
|
||||
username: sa
|
||||
password:
|
||||
driver-class-name: org.h2.Driver
|
||||
jpa:
|
||||
hibernate:
|
||||
generate-ddl: true
|
||||
ddl-auto: create-drop
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
default_batch_fetch_size: 1000 # 1:N 관계를 해결하기 위해 필요
|
||||
show-sql: true
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2
|
||||
|
||||
logging.level:
|
||||
org.hibernate.SQL: debug
|
||||
|
||||
file:
|
||||
directory: ${user.home}/msa-attach-volume
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
# jwt token
|
||||
token:
|
||||
secret: egovframe_user_token
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
|
||||
# eureka 가 포함되면 eureka server 도 등록되므로 해제한다.
|
||||
eureka:
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
33
backend/config/config/portal-service.yml
Normal file
33
backend/config/config/portal-service.yml
Normal file
@@ -0,0 +1,33 @@
|
||||
database:
|
||||
url: jdbc:mysql://${mysql.hostname:localhost}:3306/msaportal
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
cloud:
|
||||
bus:
|
||||
destination: springCloudBus
|
||||
stream:
|
||||
function:
|
||||
definition: attachmentEntity;busConsumer # 첨부파일 entity 정보 업데이트 하기 위한 이벤트에 대한 consumer function & springcloudbus consumer function
|
||||
bindings:
|
||||
busConsumer-in-0:
|
||||
destination: ${spring.cloud.bus.destination}
|
||||
attachmentEntity-in-0: # 첨부파일 entity 정보 업데이트 하기 위한 이벤트
|
||||
destination: attachment-entity.topic # queue name
|
||||
group: attachment
|
||||
attachmentEntity-out-0: # 첨부파일 entity 정보 업데이트 하기 위한 이벤트
|
||||
destination: attachment-entity.topic # queue name
|
||||
group: attachment
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
hostname: 'ftp_server_hostname'
|
||||
username: 'ftp_server_username'
|
||||
password: 'ftp_server_password'
|
||||
port: 21
|
||||
directory: /mnt
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
46
backend/config/config/reserve-check-service-test.yml
Normal file
46
backend/config/config/reserve-check-service-test.yml
Normal file
@@ -0,0 +1,46 @@
|
||||
spring:
|
||||
application:
|
||||
name: reserve-check-service
|
||||
|
||||
datasource:
|
||||
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
|
||||
username: sa
|
||||
password:
|
||||
driver-class-name: org.h2.Driver
|
||||
jpa:
|
||||
# database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
hibernate:
|
||||
generate-ddl: true
|
||||
ddl-auto: create-drop
|
||||
# dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
default_batch_fetch_size: 1000 # 1:N 관계를 해결하기 위해 필요
|
||||
show-sql: true
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2
|
||||
|
||||
logging.level:
|
||||
org.hibernate.SQL: debug
|
||||
|
||||
file:
|
||||
directory: ${user.home}/msa-attach-volume
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
# jwt token
|
||||
token:
|
||||
secret: egovframe_user_token
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
|
||||
# eureka 가 포함되면 eureka server 도 등록되므로 해제한다.
|
||||
eureka:
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
11
backend/config/config/reserve-check-service.yml
Normal file
11
backend/config/config/reserve-check-service.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
spring:
|
||||
r2dbc:
|
||||
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/reservation?serverTimezone=Asia/Seoul
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
cloud:
|
||||
stream:
|
||||
bindings:
|
||||
attachmentEntity-out-0: # 첨부파일 entity 정보 업데이트 하기 위한 이벤트
|
||||
destination: attachment-entity.topic # queue name
|
||||
group: attachment
|
||||
46
backend/config/config/reserve-item-service-test.yml
Normal file
46
backend/config/config/reserve-item-service-test.yml
Normal file
@@ -0,0 +1,46 @@
|
||||
spring:
|
||||
application:
|
||||
name: reserve-item-service
|
||||
|
||||
datasource:
|
||||
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
|
||||
username: sa
|
||||
password:
|
||||
driver-class-name: org.h2.Driver
|
||||
jpa:
|
||||
# database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
hibernate:
|
||||
generate-ddl: true
|
||||
ddl-auto: create-drop
|
||||
# dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
default_batch_fetch_size: 1000 # 1:N 관계를 해결하기 위해 필요
|
||||
show-sql: true
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2
|
||||
|
||||
logging.level:
|
||||
org.hibernate.SQL: debug
|
||||
|
||||
file:
|
||||
directory: ${user.home}/msa-attach-volume
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
# jwt token
|
||||
token:
|
||||
secret: egovframe_user_token
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
|
||||
# eureka 가 포함되면 eureka server 도 등록되므로 해제한다.
|
||||
eureka:
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
20
backend/config/config/reserve-item-service.yml
Normal file
20
backend/config/config/reserve-item-service.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
spring:
|
||||
r2dbc:
|
||||
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/msaportal?serverTimezone=Asia/Seoul
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
cloud:
|
||||
bus:
|
||||
destination: springCloudBus
|
||||
stream:
|
||||
function:
|
||||
definition: reserveRequest;busConsumer # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer function & springcloudbus consumer function
|
||||
bindings:
|
||||
busConsumer-in-0:
|
||||
destination: ${spring.cloud.bus.destination}
|
||||
reserveRequest-in-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer binding
|
||||
destination: reserve-request.topic # queue name
|
||||
group: reserved
|
||||
inventoryUpdated-out-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 supplier binding
|
||||
destination: inventory-updated.topic # queue name
|
||||
group: reserved
|
||||
46
backend/config/config/reserve-request-service-test.yml
Normal file
46
backend/config/config/reserve-request-service-test.yml
Normal file
@@ -0,0 +1,46 @@
|
||||
spring:
|
||||
application:
|
||||
name: reserve-request-service
|
||||
|
||||
datasource:
|
||||
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
|
||||
username: sa
|
||||
password:
|
||||
driver-class-name: org.h2.Driver
|
||||
jpa:
|
||||
# database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
hibernate:
|
||||
generate-ddl: true
|
||||
ddl-auto: create-drop
|
||||
# dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
default_batch_fetch_size: 1000 # 1:N 관계를 해결하기 위해 필요
|
||||
show-sql: true
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2
|
||||
|
||||
logging.level:
|
||||
org.hibernate.SQL: debug
|
||||
|
||||
file:
|
||||
directory: ${user.home}/msa-attach-volume
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
# jwt token
|
||||
token:
|
||||
secret: egovframe_user_token
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
|
||||
# eureka 가 포함되면 eureka server 도 등록되므로 해제한다.
|
||||
eureka:
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
20
backend/config/config/reserve-request-service.yml
Normal file
20
backend/config/config/reserve-request-service.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
spring:
|
||||
r2dbc:
|
||||
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/reservation?serverTimezone=Asia/Seoul
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
cloud:
|
||||
bus:
|
||||
destination: springCloudBus
|
||||
stream:
|
||||
function:
|
||||
definition: inventoryUpdated;busConsumer # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer function & springcloudbus consumer function
|
||||
bindings:
|
||||
busConsumer-in-0:
|
||||
destination: ${spring.cloud.bus.destination}
|
||||
reserveRequest-out-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 supplier binding
|
||||
destination: reserve-request.topic # queue name
|
||||
group: reserved
|
||||
inventoryUpdated-in-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer binding
|
||||
destination: inventory-updated.topic # queue name
|
||||
group: reserved
|
||||
107
backend/config/config/user-service-test.yml
Normal file
107
backend/config/config/user-service-test.yml
Normal file
@@ -0,0 +1,107 @@
|
||||
spring:
|
||||
application:
|
||||
name: user-service
|
||||
|
||||
datasource:
|
||||
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
|
||||
username: sa
|
||||
password:
|
||||
driver-class-name: org.h2.Driver
|
||||
initialization-mode: always
|
||||
# schema: classpath:h2/schema.sql
|
||||
data: classpath:h2/data.sql
|
||||
jpa:
|
||||
hibernate:
|
||||
generate-ddl: true
|
||||
ddl-auto: create-drop
|
||||
dialect: org.hibernate.dialect.MySQL5Dialect
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
default_batch_fetch_size: 1000 # 1:N 관계를 해결하기 위해 필요
|
||||
show-sql: true
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2
|
||||
cache:
|
||||
jcache:
|
||||
config: classpath:ehcache.xml
|
||||
mail: # 비밀번호 변경 이메일 발송
|
||||
host: smtp.gmail.com # smtp host
|
||||
port: 587 # smtp port
|
||||
username: email_username # 계정
|
||||
password: 'email_password' # 비밀번호 - 구글 보안 2단계 인증 해제, 보안 수준이 낮은 앱의 액세스 허용(https://myaccount.google.com/lesssecureapps)
|
||||
properties:
|
||||
mail:
|
||||
smtp:
|
||||
auth: true
|
||||
starttls:
|
||||
enable: true
|
||||
required: true
|
||||
security:
|
||||
# oauth2 를 사용하려면 아래 google, naver, kakao 의 client-id, client-secret 을 발급받아야 한다.
|
||||
oauth2:
|
||||
client:
|
||||
registration:
|
||||
# /oauth2/authorization/google
|
||||
google:
|
||||
client-id: google_client_id # TODO
|
||||
client-secret: google_client_secret # TODO
|
||||
scope: profile,email
|
||||
# 네이버는 Spring Security를 공식 지원하지 않기 때문에 CommonOAuth2Provider 에서 해주는 값들을 수동으로 입력한다.
|
||||
# /oauth2/authorization/naver
|
||||
naver:
|
||||
client-id: naver_client_id # TODO
|
||||
client-secret: naver_client_secret # TODO
|
||||
redirect_uri: "{baseUrl}/{action}/oauth2/code/{registrationId}"
|
||||
authorization_grant_type: authorization_code
|
||||
scope: name,email,profile_image
|
||||
client-name: Naver
|
||||
# /oauth2/authorization/kakao
|
||||
kakao:
|
||||
client-id: kakao_client_id # TODO
|
||||
client-secret: kakao_client_secret # TODO
|
||||
redirect-uri: "{baseUrl}/{action}/oauth2/code/{registrationId}"
|
||||
client-authentication-method: POST
|
||||
authorization-grant-type: authorization_code
|
||||
scope: profile_nickname, account_email
|
||||
client-name: Kakao
|
||||
provider:
|
||||
naver:
|
||||
authorization_uri: https://nid.naver.com/oauth2.0/authorize
|
||||
token_uri: https://nid.naver.com/oauth2.0/token
|
||||
user-info-uri: https://openapi.naver.com/v1/nid/me
|
||||
# 기준이 되는 user_name 의 이름을 네이버에서는 response로 지정해야한다. (네이버 회원 조회시 반환되는 JSON 형태 때문이다)
|
||||
# response를 user_name으로 지정하고 이후 자바 코드로 response의 id를 user_name으로 지정한다. (스프링 시큐리티에서 하위 필드를 명시할 수 없기 때문)
|
||||
user_name_attribute: response
|
||||
kakao:
|
||||
authorization_uri: https://kauth.kakao.com/oauth/authorize
|
||||
token_uri: https://kauth.kakao.com/oauth/token
|
||||
user-info-uri: https://kapi.kakao.com/v2/user/me
|
||||
user_name_attribute: id
|
||||
|
||||
logging.level:
|
||||
org.hibernate.SQL: debug
|
||||
org.hibernate.type: trace
|
||||
|
||||
file:
|
||||
directory: ${user.home}/msa-attach-volume
|
||||
messages:
|
||||
directory: ${file.directory}/messages
|
||||
|
||||
# jwt token
|
||||
token:
|
||||
expiration_time: 7200000
|
||||
refresh_time: 86400000
|
||||
secret: egovframe_token_secret
|
||||
|
||||
# ftp server
|
||||
ftp:
|
||||
enabled: false # ftp 사용 여부, FTP 서버에 최상위 디렉토리 자동 생성 및 구현체를 결정하게 된다.
|
||||
|
||||
# eureka 가 포함되면 eureka server 도 등록되므로 해제한다.
|
||||
eureka:
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
21
backend/config/config/user-service.yml
Normal file
21
backend/config/config/user-service.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
database:
|
||||
url: jdbc:mysql://${mysql.hostname:localhost}:3306/msaportal
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
mail: # 비밀번호 변경 이메일 발송
|
||||
host: smtp.gmail.com # smtp host
|
||||
port: 587 # smtp port
|
||||
username: email_username # 계정
|
||||
password: 'email_password' # 비밀번호 - 구글 보안 2단계 인증 해제, 보안 수준이 낮은 앱의 액세스 허용(https://myaccount.google.com/lesssecureapps)
|
||||
properties:
|
||||
mail:
|
||||
smtp:
|
||||
auth: true
|
||||
starttls:
|
||||
enable: true
|
||||
required: true
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
repositories {
|
||||
@@ -13,8 +13,8 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
// querydsl
|
||||
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
|
||||
id 'java'
|
||||
id "org.sonarqube" version "2.7"
|
||||
id 'org.sonarqube' version '3.5.0.2730'
|
||||
}
|
||||
|
||||
group 'org.egovframe.cloud'
|
||||
version '4.1.0'
|
||||
version '4.2.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
repositories {
|
||||
@@ -30,13 +30,13 @@ configurations {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// EgovAbstractServiceImpl
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
@@ -44,7 +44,7 @@ dependencies {
|
||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-validation' // LocalValidatorFactoryBean
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
implementation 'javassist:javassist:3.12.1.GA'
|
||||
implementation 'org.javassist:javassist:3.29.2-GA'
|
||||
|
||||
// querydsl
|
||||
implementation 'com.querydsl:querydsl-jpa:5.0.0'
|
||||
@@ -55,8 +55,8 @@ dependencies {
|
||||
//openapi docs
|
||||
implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
|
||||
implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.7.0'
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.7.0'
|
||||
|
||||
//reactive
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
|
||||
|
||||
BIN
backend/module-common/build/libs/module-common-4.1.0-plain.jar
Normal file
BIN
backend/module-common/build/libs/module-common-4.1.0-plain.jar
Normal file
Binary file not shown.
BIN
backend/module-common/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
backend/module-common/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
backend/module-common/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
backend/module-common/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -8,6 +8,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@@ -41,6 +42,7 @@ public class MessageSourceConfig {
|
||||
@Value("${spring.profiles.active:default}")
|
||||
private String profile;
|
||||
|
||||
private static final String FILE_SEPARATOR = File.separator;
|
||||
@Bean
|
||||
public MessageSource messageSource() {
|
||||
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
|
||||
@@ -48,6 +50,9 @@ public class MessageSourceConfig {
|
||||
if ("default".equals(profile)) {
|
||||
Path fileStorageLocation = Paths.get(messagesDirectory).toAbsolutePath().normalize();
|
||||
String dbMessages = StringUtils.cleanPath("file://" + fileStorageLocation + MESSAGES);
|
||||
if(FILE_SEPARATOR.equals("\\")) {//윈도우기반 자바시스템일 때 Could not parse properties file 에러방지
|
||||
dbMessages = StringUtils.cleanPath("file:///" + fileStorageLocation + MESSAGES);
|
||||
}
|
||||
messageSource.setBasenames(dbMessages);
|
||||
} else {
|
||||
messageSource.setBasenames(messagesDirectory + MESSAGES);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id "org.sonarqube" version "3.3"
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'org.sonarqube' version '3.5.0.2730'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
// querydsl
|
||||
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
@@ -23,14 +23,14 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// implementation files('../../module-common/build/libs/module-common-0.1.jar') // 공통 모듈, @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:0.1'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
// implementation files('../module-common/build/libs/module-common-4.2.0-plain.jar') // 공통 모듈, @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:4.2.0'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
@@ -50,9 +50,10 @@ dependencies {
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.73'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'commons-net:commons-net:3.8.0' // FTPClient
|
||||
implementation 'mysql:mysql-connector-java'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
implementation 'commons-io:commons-io:2.13.0'
|
||||
implementation 'commons-net:commons-net:3.9.0' // FTPClient
|
||||
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
|
||||
//messaging
|
||||
@@ -64,7 +65,7 @@ dependencies {
|
||||
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0'
|
||||
|
||||
// openapi docs
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.7.0'
|
||||
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
|
||||
|
||||
// lombok
|
||||
@@ -74,10 +75,11 @@ dependencies {
|
||||
testAnnotationProcessor 'org.projectlombok:lombok'
|
||||
|
||||
testImplementation 'com.h2database:h2'
|
||||
testImplementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' // 테스트시에만 출력
|
||||
testImplementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1' // 테스트시에만 출력
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
|
||||
implementation 'org.javassist:javassist:3.29.0-GA'
|
||||
implementation 'org.javassist:javassist:3.29.2-GA'
|
||||
implementation 'org.webjars:webjars-locator-core:0.53'
|
||||
}
|
||||
|
||||
dependencyManagement {
|
||||
|
||||
@@ -22,6 +22,6 @@ import java.util.List;
|
||||
* 2021/09/07 shinmj 최초 생성
|
||||
* </pre>
|
||||
*/
|
||||
public interface StatisticsRepository extends JpaRepository<Statistics, String>, StatisticsRepositoryCustom {
|
||||
public interface StatisticsRepository extends JpaRepository<Statistics, Long>, StatisticsRepositoryCustom {
|
||||
|
||||
}
|
||||
|
||||
@@ -150,7 +150,12 @@ public class AttachmentService extends AbstractService {
|
||||
*/
|
||||
@Transactional(readOnly = true)
|
||||
public AttachmentImageResponseDto loadImage(String imagename) {
|
||||
return storageUtils.loadImage(imagename.replaceAll(EDITOR_FILE_SEPARATOR, FILE_SEPARATOR));
|
||||
if(FILE_SEPARATOR.equals("\\")) {//윈도우기반 자바시스템일 때 하이픈 character to be escaped is missing 에러방지
|
||||
imagename = imagename.replaceAll(EDITOR_FILE_SEPARATOR, "\\\\"); //getFileSystem().getPath에서 디스크의 경로를 사용할 때
|
||||
} else { //리눅스 또는 맥 기반 자바시스템 경로일 때(아래)
|
||||
imagename = imagename.replaceAll(EDITOR_FILE_SEPARATOR, FILE_SEPARATOR);
|
||||
}
|
||||
return storageUtils.loadImage(imagename);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -51,10 +51,16 @@ public class FileStorageUtils implements StorageUtils {
|
||||
private final Path fileStorageLocation;
|
||||
private final Environment environment;
|
||||
private final MessageUtil messageUtil;
|
||||
private static final String FILE_SEPARATOR = File.separator;
|
||||
|
||||
public FileStorageUtils(Environment environment, MessageUtil messageUtil) {
|
||||
this.environment = environment;
|
||||
this.fileStorageLocation = Paths.get(environment.getProperty("file.directory")).toAbsolutePath().normalize();
|
||||
String envFileDir = "";
|
||||
envFileDir = environment.getProperty("file.directory");
|
||||
if(FILE_SEPARATOR.equals("\\")) {//윈도우기반 자바시스템일 때 경로 에러방지
|
||||
envFileDir = envFileDir.replaceAll("/", "\\\\");
|
||||
}
|
||||
this.fileStorageLocation = Paths.get(envFileDir).toAbsolutePath().normalize();
|
||||
this.messageUtil = messageUtil;
|
||||
}
|
||||
|
||||
@@ -185,8 +191,9 @@ public class FileStorageUtils implements StorageUtils {
|
||||
|
||||
Path path = getStorePath(basePath);
|
||||
Path target = path.resolve(filename);
|
||||
Files.copy(file.getInputStream(), target, StandardCopyOption.REPLACE_EXISTING);
|
||||
|
||||
InputStream inputStream = file.getInputStream();
|
||||
Files.copy(inputStream, target, StandardCopyOption.REPLACE_EXISTING);
|
||||
inputStream.close(); //윈도우 시스템에서도 업로드 시 Temp폴더의 delete file 에러방지코드 추가
|
||||
return filename;
|
||||
} catch (IOException ex) {
|
||||
log.error("Could not stored file", ex);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
@@ -20,14 +20,14 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// implementation files('../../module-common/build/libs/module-common-0.1.jar') // @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:0.1'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
// implementation files('../module-common/build/libs/module-common-4.2.0-plain.jar') // @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:4.2.0'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
|
||||
@@ -41,11 +41,11 @@ dependencies {
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp' // bus
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.1'
|
||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.11'
|
||||
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
|
||||
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
|
||||
//messaging
|
||||
implementation 'org.springframework.cloud:spring-cloud-stream'
|
||||
@@ -54,10 +54,10 @@ dependencies {
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
|
||||
implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'
|
||||
implementation 'mysql:mysql-connector-java'
|
||||
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||
|
||||
// openapi docs
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.7.0'
|
||||
|
||||
//lombok
|
||||
implementation 'org.projectlombok:lombok'
|
||||
@@ -71,6 +71,8 @@ dependencies {
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
testImplementation 'io.projectreactor:reactor-test'
|
||||
testImplementation 'org.springframework.security:spring-security-test'
|
||||
|
||||
implementation 'org.webjars:webjars-locator-core:0.53'
|
||||
}
|
||||
|
||||
test {
|
||||
|
||||
@@ -6,8 +6,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
||||
import reactivefeign.spring.config.EnableReactiveFeignClients;
|
||||
//import reactor.blockhound.BlockHound;
|
||||
|
||||
import java.security.Security;
|
||||
|
||||
@ComponentScan({"org.egovframe.cloud.common", "org.egovframe.cloud.reactive", "org.egovframe.cloud.reservechecksevice"}) // org.egovframe.cloud.common package 포함하기 위해
|
||||
|
||||
@@ -15,4 +15,4 @@ management:
|
||||
info:
|
||||
app:
|
||||
name: Reserve Check Service
|
||||
description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
description: 예약시스템 기능 중 예약확인, 예약승인/취소 기능을 제공
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
@@ -20,14 +20,14 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// implementation files('../../module-common/build/libs/module-common-0.1.jar') // @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:0.1'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
// implementation files('../module-common/build/libs/module-common-4.2.0-plain.jar') // @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:4.2.0'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
|
||||
@@ -41,19 +41,19 @@ dependencies {
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp' // bus
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.1'
|
||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.11'
|
||||
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
|
||||
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
|
||||
implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'
|
||||
implementation 'mysql:mysql-connector-java'
|
||||
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||
|
||||
// openapi docs
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.7.0'
|
||||
|
||||
//messaging
|
||||
implementation 'org.springframework.cloud:spring-cloud-stream'
|
||||
@@ -71,6 +71,8 @@ dependencies {
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
testImplementation 'io.projectreactor:reactor-test'
|
||||
testImplementation 'org.springframework.security:spring-security-test'
|
||||
|
||||
implementation 'org.webjars:webjars-locator-core:0.53'
|
||||
}
|
||||
|
||||
test {
|
||||
|
||||
@@ -15,4 +15,4 @@ management:
|
||||
info:
|
||||
app:
|
||||
name: Reserve Item Service
|
||||
description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>ǰ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
description: 예약시스템 기능 중 예약지역, 예약물품 관리 기능을 제공
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
@@ -20,15 +20,14 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
|
||||
dependencies {
|
||||
// implementation files('../../module-common/build/libs/module-common-0.1.jar') // @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:0.1'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
// implementation files('../module-common/build/libs/module-common-4.2.0-plain.jar') // @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:4.2.0'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
|
||||
@@ -42,11 +41,11 @@ dependencies {
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp' // bus
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.1'
|
||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.11'
|
||||
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
|
||||
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
|
||||
//messaging
|
||||
implementation 'org.springframework.cloud:spring-cloud-stream'
|
||||
@@ -57,10 +56,10 @@ dependencies {
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
|
||||
implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'
|
||||
implementation 'mysql:mysql-connector-java'
|
||||
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||
|
||||
// openapi docs
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.7.0'
|
||||
|
||||
//lombok
|
||||
implementation 'org.projectlombok:lombok'
|
||||
@@ -75,6 +74,8 @@ dependencies {
|
||||
testImplementation 'io.projectreactor:reactor-test'
|
||||
testImplementation 'org.springframework.security:spring-security-test'
|
||||
testImplementation 'org.springframework.amqp:spring-rabbit-test'
|
||||
|
||||
implementation 'org.webjars:webjars-locator-core:0.53'
|
||||
}
|
||||
|
||||
test {
|
||||
|
||||
@@ -15,4 +15,4 @@ management:
|
||||
info:
|
||||
app:
|
||||
name: Reserve Request Service
|
||||
description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
description: 예약시스템 기능 중 예약신청 기능을 제공
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.7.0'
|
||||
id "org.sonarqube" version "2.7"
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.7.12'
|
||||
id 'org.sonarqube' version '3.5.0.2730'
|
||||
id 'io.spring.dependency-management' version '1.1.0'
|
||||
// querydsl
|
||||
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'org.egovframe.cloud'
|
||||
version = '0.1'
|
||||
version = '1.0.0'
|
||||
sourceCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
@@ -23,14 +23,14 @@ repositories {
|
||||
}
|
||||
|
||||
ext {
|
||||
set('springCloudVersion', "2021.0.3")
|
||||
set('log4j2.version', "2.17.2") // log4j 보안 패치
|
||||
set('springCloudVersion', '2021.0.7')
|
||||
set('log4j2.version', '2.20.0') // log4j 보안 패치
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// implementation files('../../module-common/build/libs/module-common-0.1.jar') // 공통 모듈, @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:0.1'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.1.0') {
|
||||
// implementation files('../module-common/build/libs/module-common-4.2.0-plain.jar') // 공통 모듈, @ComponentScan(basePackages={"org.egovframe.cloud"}) 추가해야 적용된다
|
||||
implementation 'org.egovframe.cloud:module-common:4.2.0'
|
||||
implementation('org.egovframe.rte:org.egovframe.rte.fdl.cmmn:4.2.0') {
|
||||
exclude group: 'org.egovframe.rte', module: 'org.egovframe.rte.fdl.logging'
|
||||
}
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
@@ -50,8 +50,8 @@ dependencies {
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.73'
|
||||
implementation 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.73'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.2' // logstash logback
|
||||
implementation 'mysql:mysql-connector-java'
|
||||
implementation 'net.logstash.logback:logstash-logback-encoder:7.4' // logstash logback
|
||||
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||
// querydsl
|
||||
implementation 'com.querydsl:querydsl-jpa:5.0.0'
|
||||
@@ -61,10 +61,10 @@ dependencies {
|
||||
implementation 'org.ehcache:ehcache'
|
||||
implementation 'javax.cache:cache-api' // expiry를 위해 필요
|
||||
|
||||
implementation 'com.google.api-client:google-api-client:1.35.1'
|
||||
implementation 'com.google.api-client:google-api-client:2.2.0'
|
||||
|
||||
// openapi docs
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.9'
|
||||
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.7.0'
|
||||
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
|
||||
|
||||
// lombok
|
||||
@@ -73,11 +73,12 @@ dependencies {
|
||||
testImplementation 'org.projectlombok:lombok'
|
||||
testAnnotationProcessor 'org.projectlombok:lombok'
|
||||
testImplementation 'com.h2database:h2'
|
||||
testImplementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0'
|
||||
testImplementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1'
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
testImplementation 'org.springframework.security:spring-security-test'
|
||||
|
||||
implementation 'org.javassist:javassist:3.29.0-GA'
|
||||
implementation 'org.webjars:webjars-locator-core:0.53'
|
||||
}
|
||||
|
||||
dependencyManagement {
|
||||
|
||||
@@ -2,12 +2,13 @@ package org.egovframe.cloud.userservice.config;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.cloud.userservice.service.user.UserService;
|
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
|
||||
import static org.egovframe.cloud.common.config.GlobalConstant.SECURITY_PERMITALL_ANTPATTERNS;
|
||||
|
||||
@@ -31,11 +32,15 @@ import static org.egovframe.cloud.common.config.GlobalConstant.SECURITY_PERMITAL
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@EnableWebSecurity // Spring Security 설정들을 활성화시켜 준다
|
||||
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
public class SecurityConfig {
|
||||
|
||||
private final TokenProvider tokenProvider;
|
||||
private final UserService userService;
|
||||
private final BCryptPasswordEncoder bCryptPasswordEncoder;
|
||||
|
||||
@Bean
|
||||
AuthenticationManager authenticationManager(AuthenticationConfiguration authConfiguration) throws Exception {
|
||||
return authConfiguration.getAuthenticationManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* 스프링 시큐리티 설정
|
||||
@@ -43,11 +48,21 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
* @param http
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
protected void configure(HttpSecurity http) throws Exception {
|
||||
@Bean
|
||||
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
|
||||
|
||||
AuthenticationManager authenticationManager = authenticationManager(http.getSharedObject(AuthenticationConfiguration.class));
|
||||
|
||||
/**
|
||||
* 로그인 인증정보를 받아 토큰을 발급할 수 있도록 필터를 등록해준다.
|
||||
*
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
AuthenticationFilter authenticationFilter = new AuthenticationFilter(authenticationManager, tokenProvider, userService);
|
||||
|
||||
http
|
||||
.csrf().disable()
|
||||
.headers().frameOptions().disable()
|
||||
.csrf().disable().headers().frameOptions().disable()
|
||||
.and()
|
||||
.sessionManagement()
|
||||
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 토큰 사용하기 때문에 세션은 비활성화
|
||||
@@ -56,32 +71,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
.antMatchers(SECURITY_PERMITALL_ANTPATTERNS).permitAll()
|
||||
.anyRequest().access("@authorizationService.isAuthorization(request, authentication)") // 호출 시 권한 인가 데이터 확인
|
||||
.and()
|
||||
.addFilter(getAuthenticationFilter())
|
||||
.addFilter(authenticationFilter)
|
||||
.logout()
|
||||
.logoutSuccessUrl("/");
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그인 인증정보를 받아 토큰을 발급할 수 있도록 필터를 등록해준다.
|
||||
*
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
private AuthenticationFilter getAuthenticationFilter() throws Exception {
|
||||
return new AuthenticationFilter(authenticationManager(), tokenProvider, userService);
|
||||
}
|
||||
|
||||
/**
|
||||
* 인증 관련 - 로그인 처리
|
||||
* DB 에서 조회하여 일치하는지 체크한다.
|
||||
*
|
||||
* @param auth
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
|
||||
// userService.loadUserByUsername 메소드
|
||||
auth.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder);
|
||||
return http.build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,5 +19,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
||||
* 2021/07/07 jooho 최초 생성
|
||||
* </pre>
|
||||
*/
|
||||
public interface RoleRepository extends JpaRepository<Role, Long>, RoleRepositoryCustom {
|
||||
public interface RoleRepository extends JpaRepository<Role, String>, RoleRepositoryCustom {
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!DOCTYPE xml>
|
||||
<Configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -45,4 +46,4 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -3,7 +3,7 @@ database:
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul&autoReconnect=true&validationQuery=select 1
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
|
||||
@@ -3,7 +3,7 @@ database:
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul&autoReconnect=true&validationQuery=select 1
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
|
||||
@@ -3,7 +3,7 @@ database:
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul
|
||||
url: ${database.url}?serverTimezone=Asia/Seoul&autoReconnect=true&validationQuery=select 1
|
||||
username: msaportal
|
||||
password: msaportal
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
|
||||
11794
frontend/admin/package-lock.json
generated
11794
frontend/admin/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,10 @@
|
||||
"scripts": {
|
||||
"start:dev": "next",
|
||||
"dev": "ts-node --project tsconfig.server.json server/index.ts",
|
||||
"dev:sm": "SITE_ID=4 ts-node --project tsconfig.server.json server/index.ts",
|
||||
"dev:sm": "SITE_ID=4 npm run dev",
|
||||
"dev:lg": "SITE_ID=1 npm run dev",
|
||||
"dev:smWin": "set SITE_ID=4&&npm run dev",
|
||||
"dev:lgWin": "set SITE_ID=1&&npm run dev",
|
||||
"clean:dev": "rimraf .next",
|
||||
"build:server": "tsc --project tsconfig.server.json",
|
||||
"build:next": "next build",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"npm": "6.14.7"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"dev": "ts-node --transpile-only --project tsconfig.server.json server/index.ts",
|
||||
"dev:sm": "SITE_ID=3 npm run dev",
|
||||
"dev:lg": "SITE_ID=2 npm run dev",
|
||||
"dev:smWin": "set SITE_ID=3&&npm run dev",
|
||||
|
||||
@@ -1137,6 +1137,7 @@ footer div > span a {
|
||||
font-size: 32px;
|
||||
line-height: 32px;
|
||||
text-shadow: 10px 10px 10px rgba(0, 0, 0, 0.5);
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
/* overflow: hidden;
|
||||
white-space: break-spaces;
|
||||
word-break: keep-all; */
|
||||
@@ -1147,6 +1148,7 @@ footer div > span a {
|
||||
left: 6vw;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font-size: 1.7vw;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
#main .slideBox a:before {
|
||||
content: '╋';
|
||||
@@ -1185,7 +1187,7 @@ footer div > span a {
|
||||
|
||||
#main .slide .reservBox {
|
||||
position: absolute;
|
||||
top: 600px;
|
||||
top: 650px;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
width: 100%;
|
||||
|
||||
@@ -1140,7 +1140,8 @@ footer div > span a {
|
||||
overflow: hidden;
|
||||
}
|
||||
#main .slide div.slide-title p {
|
||||
height: 12vw;
|
||||
/* height: 12vw; */
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
color: #fff;
|
||||
font-size: 2.7vw;
|
||||
font-weight: 600;
|
||||
@@ -1171,6 +1172,7 @@ footer div > span a {
|
||||
left: 6vw;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font-size: 1.7vw;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
#main .slide a:before {
|
||||
content: '╋';
|
||||
|
||||
30
frontend/portal/server/index.ts
Normal file
30
frontend/portal/server/index.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { loadEnvConfig } from '@next/env'
|
||||
import express, { Request, Response } from 'express'
|
||||
import next from 'next'
|
||||
loadEnvConfig('./', process.env.NODE_ENV !== 'production')
|
||||
|
||||
const port = process.env.PORT || 3000
|
||||
const dev = process.env.NODE_ENV !== 'production'
|
||||
const app = next({ dev })
|
||||
const handle = app.getRequestHandler()
|
||||
|
||||
const startServer = async () => {
|
||||
try {
|
||||
await app.prepare()
|
||||
const server = express()
|
||||
|
||||
server.all('*', (req: Request, res: Response) => {
|
||||
return handle(req, res)
|
||||
})
|
||||
|
||||
server.listen(port, (err?: any) => {
|
||||
if (err) throw err
|
||||
console.log(`> Ready on localhost:${port} - env ${process.env.NODE_ENV}`)
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
startServer()
|
||||
@@ -146,15 +146,18 @@ const BoardEdit = (props: BoardEditProps) => {
|
||||
data = produce(data, draft => {
|
||||
draft.attachmentCode = result
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
save(data)
|
||||
}
|
||||
}
|
||||
})
|
||||
}else{
|
||||
save(data)
|
||||
}
|
||||
})
|
||||
}else{
|
||||
save(data)
|
||||
}
|
||||
}
|
||||
}, [postData, attachList])
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
9
frontend/portal/tsconfig.server.json
Normal file
9
frontend/portal/tsconfig.server.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "./tsconfig.json", // 기본설정을 포함한다
|
||||
"compilerOptions": {
|
||||
"module": "commonjs", // commonJs 사용하도록 override
|
||||
"outDir": "dist", // 빌드 파일 경로 (production mode)
|
||||
"noEmit": false // 서버에 대한 결과 파일을 내보내지 않음 (production mode)
|
||||
},
|
||||
"include": ["server"] // server/ 디렉토리 아래에 있는 파일만 컴파일 (production mode)
|
||||
}
|
||||
BIN
images/admin.png
Normal file
BIN
images/admin.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 132 KiB |
BIN
images/frontend.png
Normal file
BIN
images/frontend.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 159 KiB |
BIN
images/jwt.png
Normal file
BIN
images/jwt.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 122 KiB |
BIN
images/login.png
Normal file
BIN
images/login.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 285 KiB |
BIN
images/msa.png
Normal file
BIN
images/msa.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
77
k8s/README.md
Normal file
77
k8s/README.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# Deploy services on Kubernetes
|
||||
|
||||
In Kubernetes, the service consists of two components,
|
||||
|
||||
1. Environments
|
||||
2. Applications
|
||||
|
||||
And you can choose the storage in the application either NFS or Cinder provided by Openstack(used by [Pasta](http://paas-ta.kr))
|
||||
|
||||
# Prerequisites
|
||||
|
||||
## Install kustomize
|
||||
|
||||
If you are using kubectl 1.14 or later, it embeded kustomize. So please ignore this section.
|
||||
I recommend that you install the latest version of [kubectl](https://kubectl.docs.kubernetes.io/installation/kubectl/) for your cluster instead of installing kustomize.
|
||||
Even so, if you want to use kustomize, refer to [official kustomize doc](https://kustomize.io/).
|
||||
|
||||
# Deploy service
|
||||
|
||||
You must follow deployment order.
|
||||
|
||||
## Deployenvironments
|
||||
|
||||
```sh
|
||||
$ kustomize build k8s/environments | kubectl apply -f -
|
||||
```
|
||||
or if you are using the kubectl only,
|
||||
|
||||
```sh
|
||||
$ kubectl apply -k k8s/environments
|
||||
```
|
||||
|
||||
## Deploy applications
|
||||
|
||||
If you want to use NFS as a main storage,
|
||||
|
||||
```sh
|
||||
$ kustomize build k8s/stoage/nfs | kubectl apply -f -
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```sh
|
||||
$ kubectl apply -k k8s/stoage/nfs
|
||||
```
|
||||
|
||||
In case of using Openstack storage(CINDER) as a main storage,
|
||||
|
||||
```sh
|
||||
$ kustomize build k8s/stoage/openstack | kubectl apply -f -
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```sh
|
||||
$ kubectl apply -k k8s/stoage/openstack
|
||||
```
|
||||
|
||||
# Shutdown service
|
||||
|
||||
Simply apply deployment in reverse order.
|
||||
|
||||
If you are using nfs,
|
||||
|
||||
```sh
|
||||
$ kustomize build k8s/environments | kubectl delete -f -
|
||||
$ kustomize build k8s/stoage/nfs | kubectl delete -f - --wait
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```sh
|
||||
$ kubectl delete -k k8s/environments
|
||||
$ kubectl delete -k k8s/stoage/nfs --wait
|
||||
```
|
||||
|
||||
The case of openstack is similar, so it is omitted.
|
||||
75
k8s/applications/backend/kustomization.yaml
Normal file
75
k8s/applications/backend/kustomization.yaml
Normal file
@@ -0,0 +1,75 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- config/service.yaml
|
||||
- discovery/service.yaml
|
||||
- portal-service/service.yaml
|
||||
- reserve-item-service/service.yaml
|
||||
- user-service/service.yaml
|
||||
- board-service/service.yaml
|
||||
- reserve-request-service/service.yaml
|
||||
- reserve-check-service/service.yaml
|
||||
- discovery/ingress/ingress.yaml
|
||||
- apigateway/ingress/ingress.yaml
|
||||
- config/deployment.yaml
|
||||
- discovery/deployment.yaml
|
||||
- portal-service/deployment.yaml
|
||||
- reserve-item-service/deployment.yaml
|
||||
- user-service/deployment.yaml
|
||||
- board-service/deployment.yaml
|
||||
- apigateway/deployment.yaml
|
||||
- apigateway/service.yaml
|
||||
- reserve-request-service/deployment.yaml
|
||||
- reserve-check-service/deployment.yaml
|
||||
- portal-service/autoscaler.yaml
|
||||
- reserve-item-service/autoscaler.yaml
|
||||
- user-service/autoscaler.yaml
|
||||
- board-service/autoscaler.yaml
|
||||
- apigateway/autoscaler.yaml
|
||||
- reserve-request-service/autoscaler.yaml
|
||||
- reserve-check-service/autoscaler.yaml
|
||||
|
||||
|
||||
images:
|
||||
- name: egovframe/egovframe-msa-edu-backend-apigateway:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-apigateway
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-board-service:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-board-service
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-config:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-config
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-discovery:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-discovery
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-portal-service:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-portal-service
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-reserve-check-service:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-reserve-check-service
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-reserve-item-service:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-reserve-item-service
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-reserve-request-service:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-reserve-request-service
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-backend-user-service:latest
|
||||
# newName: foobar/egovframe-msa-edu-backend-user-service
|
||||
newTag: latest
|
||||
|
||||
|
||||
patches:
|
||||
- target:
|
||||
name: apigateway-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: 백엔드 API 게이트웨이 도메인>"
|
||||
- target:
|
||||
name: discovery-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: 백엔드 유레카 서버 도메인>"
|
||||
35
k8s/applications/frontend/kustomization.yaml
Normal file
35
k8s/applications/frontend/kustomization.yaml
Normal file
@@ -0,0 +1,35 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- portal/service.yaml
|
||||
- admin/service.yaml
|
||||
- portal/ingress/ingress.yaml
|
||||
- admin/ingress/ingress.yaml
|
||||
- portal/deployment.yaml
|
||||
- admin/deployment.yaml
|
||||
- portal/autoscaler.yaml
|
||||
- admin/autoscaler.yaml
|
||||
|
||||
|
||||
images:
|
||||
- name: egovframe/egovframe-msa-edu-frontend-admin:latest
|
||||
# newName: foobar/egovframe-msa-edu-frontend-admin
|
||||
newTag: latest
|
||||
- name: egovframe/egovframe-msa-edu-frontend-portal:latest
|
||||
# newName: foobar/egovframe-msa-edu-frontend-portal
|
||||
newTag: latest
|
||||
|
||||
|
||||
patches:
|
||||
- target:
|
||||
name: frontend-portal-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: 프론트엔드 포털 도메인>"
|
||||
- target:
|
||||
name: frontend-admin-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: 프론트엔드 관리자 도메인>"
|
||||
5
k8s/applications/kustomization.yaml
Normal file
5
k8s/applications/kustomization.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- frontend/
|
||||
- backend/
|
||||
60
k8s/environments/kustomization.yaml
Normal file
60
k8s/environments/kustomization.yaml
Normal file
@@ -0,0 +1,60 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- configmaps/backend-configmap.yaml
|
||||
- configmaps/common-configmap.yaml
|
||||
- nfs/sa.yaml
|
||||
- nfs/sc.yaml
|
||||
- nfs/deployment.yaml
|
||||
- databases/mysql/secret.yaml
|
||||
- databases/mysql/configmap.yaml
|
||||
- databases/mysql/service.yaml
|
||||
- databases/mysql/pvc.yaml
|
||||
- databases/mysql/statefulset.yaml
|
||||
- rabbitmq/service.yaml
|
||||
- rabbitmq/ingress/ingress.yaml
|
||||
- rabbitmq/deployment.yaml
|
||||
- zipkin/service.yaml
|
||||
- zipkin/ingress/ingress.yaml
|
||||
- zipkin/deployment.yaml
|
||||
- jenkins/sa.yaml
|
||||
- jenkins/service.yaml
|
||||
- jenkins/ingress.yaml
|
||||
- jenkins/pvc.yaml
|
||||
- jenkins/statefulset.yaml
|
||||
- logging/elk/kibana/configmap.yaml
|
||||
- logging/elk/kibana/service.yaml
|
||||
- logging/elk/kibana/ingress/ingress.yaml
|
||||
- logging/elk/kibana/deployment.yaml
|
||||
- logging/elk/logstash/service.yaml
|
||||
- logging/elk/logstash/configmap.yaml
|
||||
- logging/elk/logstash/deplyment.yaml
|
||||
- logging/elk/elasticsearch/service.yaml
|
||||
- logging/elk/elasticsearch/deployment.yaml
|
||||
|
||||
|
||||
patches:
|
||||
- target:
|
||||
name: rabbitmq-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: RabbitMQ 도메인>"
|
||||
- target:
|
||||
name: zipkin-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: Zipkin 도메인>"
|
||||
- target:
|
||||
name: jenkins-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: 젠킨스 도메인>"
|
||||
- target:
|
||||
name: kibana-ingress
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /spec/rules/0/host
|
||||
value: "<TODO: ELK Kibana 도메인>"
|
||||
6
k8s/storage/nfs/kustomization.yaml
Normal file
6
k8s/storage/nfs/kustomization.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
bases:
|
||||
- ../../environments
|
||||
resources:
|
||||
- pvc-nfs.yaml
|
||||
16
k8s/storage/nfs/pvc-nfs.yaml
Normal file
16
k8s/storage/nfs/pvc-nfs.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: backend-pvc
|
||||
labels:
|
||||
env: production
|
||||
tier: backend
|
||||
app: pvc
|
||||
name: backend-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
storageClassName: nfs
|
||||
6
k8s/storage/openstack/kustomization.yaml
Normal file
6
k8s/storage/openstack/kustomization.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
bases:
|
||||
- ../../environments
|
||||
resources:
|
||||
- pvc-egovcp.yaml
|
||||
16
k8s/storage/openstack/pvc-egovcp.yaml
Normal file
16
k8s/storage/openstack/pvc-egovcp.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: backend-pvc
|
||||
labels:
|
||||
env: production
|
||||
tier: backend
|
||||
app: pvc
|
||||
name: backend-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
storageClassName: cinder
|
||||
Reference in New Issue
Block a user