๊ฑด๊ฐ์ ํ๋ชฉ๋ณ ํ๋งค ์น ์ฌ์ดํธ
- ์ ์ ๊ธฐ๊ฐ & ์ฐธ์ฌ ์ธ์
- ์ฌ์ฉ ๊ธฐ์
- ํต์ฌ ERD
- ํต์ฌ ๊ธฐ๋ฅ
- ํต์ฌ ํธ๋ฌ๋ธ ์ํ
- ๊ทธ ์ธ ํธ๋ฌ๋ธ ์ํ
- 2022.2.18 ~ 2022.3.30 (40์ผ)
- ๊ตฌ์ฑ ์ธ์ : Back-end 6๋ช
- Java 8
- Spring Framework
- Spring MVC
- Mybatis
- HTML
- CSS
- JS
- JQuery
- BootStrap
- MySQL 5.7
- AWS - EC2, S3, RDS
- ์ฒซ๋ฒ์งธ ์ฌ์ง์ payment_item_mapping ํ ์ด๋ธ์ payment_item_mapping_item_code(๊ฒฐ์ ์ํ ๊ณ ์ ๋ฒํธ) ์ปฌ๋ผ๊ณผ
- ๋๋ฒ์งธ ์ฌ์ง์ item, subscribe ํ ์ด๋ธ์ ๊ฐ๊ฐ์ Primary key์ธ ๊ณ ์ ๋ฒํธ ์ปฌ๋ผ๋ค์ด ์ธ๋ํค๋ก ๋ฌถ์ฌ์์ง๋ง ํ ์ด๋ฏธ์ง์ ์ ๋ถ ๋ฃ์ ์ ์์ด ๋ถ๊ฐํผํ๊ฒ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ก ๋๋ ๋์์ต๋๋ค.
์ด ์๋น์ค์ ํต์ฌ ๊ธฐ๋ฅ์ '๊ณ ๊ฐ์ ์ํ ์ฃผ๋ฌธ / ๊ฒฐ์ ' ์ '๊ด๋ฆฌ์์ ํต๊ณ ์์คํ ' ์ ๋๋ค.
- (1) ๊ณ ๊ฐ์ ์ํ์ ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์ ๋ฅผ ํ๊ณ , ๊ฒฐ์ ํ ์ํ์ ํํด์ ์ด๋ฏธ์ง ์ฒจ๋ถ๊ฐ ๊ฐ๋ฅํ ๋ฆฌ๋ทฐ๋ฅผ ๋๊ธ ํ์์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
- (2) ๊ด๋ฆฌ์๋ ๋งค์ถ ํต๊ณ ํ์ ๋ฐ ํ์ผ๋ก ๋ค์ด๋ก๋(PDF, Excel) ๊ฐ ๊ฐ๋ฅํ๊ณ , ํ์ ๊ด๋ฆฌ์ ์ฟ ํฐ ๊ด๋ฆฌ ๋ฑ๋ฑ์ด ์์ต๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ ์ค๋ช ์ ํผ์ณ์ ๊ธฐ๋ฅ์ ํ๋ฆ์ ๋ณด๋ฉด, ์๋น์ค๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ์ ์์ต๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ ์ค๋ช ํผ์น๊ธฐ
-
-
์ด๋ฉ์ผ ์ ๊ท์, ์ด๋ฏธ ์กด์ฌํ๋์ง ์ฌ๋ถ ์ฒดํฌ (Controller) ๐ ์ฝ๋ ํ์ธ
- ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ์นด์นด์ค, ๊ตฌ๊ธ, ์๋ฌ๋ง ์ค ์ด๋ค ํ์ ์ผ๋ก ๊ฐ์ ๋์ด์๋์ง ๋ชจ๋ฌ์ฐฝ์ ๋์ ์๋ ค์ค๋๋ค.
-
ํด๋ํฐ ๋ฒํธ ์ธ์ฆ
-
ํด๋ํฐ ๋ฒํธ ์ ๊ท์ ์ฒดํฌ (Controller) ๐ ์ฝ๋ ํ์ธ
-
-
(1) ์ธ์ฆ๋ฒํธ ๋ฌธ์๋ฅผ ๋ณด๋ด๋ ๊ณผ์ (๋ค์ด๋ฒ SMS API) (Controller) ๐ ์ฝ๋ ํ์ธ
- ๋๋ค ์ซ์ 6์๋ฆฌ๋ฅผ ๋ฝ๊ณ ์ธ์ ์ ๋ค์ด๊ฐ์๋ MemberVO์ ์ ์ฅํด์ค๋๋ค.
- ๋ค์ด๋ฒ SMS API ๋ฅผ ์ด์ฉํด ๋๋ค ์ซ์ 6์๋ฆฌ๋ฅผ ํฌํจํ ๋ฌธ์๋ฅผ ๋ณด๋ ๋๋ค.
-
(2) ์ธ์ ์ ์ ์ฅ๋ 6์๋ฆฌ ์ซ์์ ์ฌ์ฉ์๊ฐ ์ ์ ์ซ์๋ฅผ ๋น๊ต (Controller) ๐ ์ฝ๋ ํ์ธ
-
-
-
-
-
์นด์นด์ค ๋ก๊ทธ์ธ API (ํ๋ฉด๋จ : JavaScript) ๐ ์ฝ๋ ํ์ธ
- ์นด์นด์ค ๋ก๊ทธ์ธ ํ์ ์ฐฝ์ ๋์์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ก๊ทธ์ธ ํ์ ์ฒดํฌ ๋ฉ์๋์ ์ ๋ฌ
-
๋ก๊ทธ์ธ ํ์ ์ฒดํฌ (Controller) - ์นด์นด์ค๋ก ๋ก๊ทธ์ธ ์ ๐ ์ฝ๋ ํ์ธ
-
์ด๋ฉ์ผ์ด ๊ตฌ๊ธ์ด๊ฑฐ๋ ์๋ฌ๋ง ์ ์ฉ ์ด๋ฉ์ผ์ด๋ผ๋ฉด ๋ค์ ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ๋๋ ค๋ณด๋ด๋ฉฐ ๊ฒฝ๊ณ ์ฐฝ์ ๋์๋๋ค.
-
์นด์นด์ค ์ด๋ฉ์ผ์ด ๋ง๋ค๋ฉด, ์ธ์ ์ ํ์ ์ ๋ณด๋ฅผ DB์์ ๊ฐ์ ธ์์ ๋ฃ๊ณ ๋ฉ์ธํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
-
-
-
์ฃผ๋ฌธ ํ์ด์ง๋ก ์ด๋ (3๊ฐ์ง ๋ฃจํธ๋ฅผ ์ ๋ถ ๊ฐ์ํ์ฌ ๋ง๋ ๋ฉ์๋) (Controller) ๐ ์ฝ๋ ํ์ธ
-
-
์ฌ๋ฌ๊ฐ๊ฐ ๋์ค๋ ๋ฐ์ดํฐ ์ข ๋ฅ๋ค์ List VO์, ํ๋์ฉ ๋์ค๋ ๋ฐ์ดํฐ๋ ๋จ์ผ ๋ฐ์ดํฐ VO์ ๋ฃ์ด์ ์ปจํธ๋กค๋ฌ์ ์ ๋ฌ (ํ๋ฉด๋จ : Javascript) ๐ ์ฝ๋ ํ์ธ
-
๋ฆฌ์คํธ VO(PaymentSingleListVO), ๋จ์ผ ๋ฐ์ดํฐ VO(PaymentSingleSideInfoVO) ๋ฅผ ํตํด ๊ฒฐ์ ํ์ด์ง์ ๋ฐ์ดํฐ ์ ๋ฌ (Controller) ๐ ์ฝ๋ ํ์ธ
-
๋ฆฌ์คํธ ํ์์ผ๋ก ๋ฐ๋ ํด๋์ค ์ฝ๋ (PaymentSingleListVO) (Java) ๐ ์ฝ๋ ํ์ธ
-
-
-
-
-
๊ฐ๊ฒฉ์ด 0์ ์ด์์ผ ๋ (iamport API ๋ฅผ ์ด์ฉํด์ ๊ฒฐ์ ์งํ ํ ๋ฐ์ดํฐ ๋๊ธฐ๊ธฐ) (ํ๋ฉด๋จ : Javascript) ๐ ์ฝ๋ ํ์ธ
-
ํฌ์ธํธ, ์ฟ ํฐ์ผ๋ก ์ธํด ๊ฐ๊ฒฉ์ด 0์์ผ ๋ (API ๋ ์งํํ์ง ์๊ณ ๋ฐ๋ก ๋ฐ์ดํฐ ๋๊ธฐ๊ธฐ) (ํ๋ฉด๋จ : Javascript) ๐ ์ฝ๋ ํ์ธ
-
-
(2) ๊ฒฐ์ ๋ฐ์ดํฐ ์ ๋ฌ, ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก ๊ฐฑ์ , ์ฟ ํฐ ๊ฐฑ์ , ํฌ์ธํธ ๊ฐฑ์ ์ ์ญํ ์ ๋ด๋นํ๋ ๋ฉ์๋ (Controller) ๐ ์ฝ๋ ํ์ธ
-
-
-
๋ฆฌ๋ทฐ ์ ๋ณด (๋ณ์ , ๋ด์ฉ, ์ด๋ฏธ์ง ํ์ผ ์ ๋ก๋, ํด๋น ์ํ ์ ๋ณด ๋ฑ๋ฑ) ๋ฅผ DB์ ์ ์ฅ ํ, ๋ฆฌ๋ทฐ ์์ฑ ํํ์ธ ํฌ์ธํธ ์ ๋ฆฝํ๋ ๋ฉ์๋ (Controller) ๐ ์ฝ๋ ํ์ธ
-
-
createS3Client() ๋ฉ์๋๋ก AmazonS3 ๊ฐ์ฒด ์์ฑ ํ (Service) ๐ ์ฝ๋ ํ์ธ
-
upload(InputStream is, String key, String contentType, long contentLength) ๋ฉ์๋๋ก S3 ์ ์ด๋ฏธ์ง ํ์ผ ์ ๋ก๋ ์คํ (Service) ๐ ์ฝ๋ ํ์ธ
-
-
-
-
๋จผ์ ์นด์นด์ค ์ฃผ์ ์๋น์ค API ์ iframe ์ ๋ด๊ธฐ ์ํ ๋ชจ๋ฌ์ฐฝ์ ๋์๋๋ค. (ํ๋ฉด๋จ : JavaScript) ๐ ์ฝ๋ ํ์ธ
-
๋์์ง ๋ชจ๋ฌ์ฐฝ ์์ API iframe ์ ๊ปด๋ง์ถฐ ๋ฃ์ด์ ๋์๋๋ค. (ํ๋ฉด๋จ : JavaScript) ๐ ์ฝ๋ ํ์ธ
-
-
์ํ(๋ฐ์ดํฐ) ๋ชฉ๋ก ์์ฒญ (๋๋ถ๋ถ์ Controller < - > Service ๊ณ์ธต์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.)
-
์์ฒญ ํ์ธ (Controller) ๐ ์ฝ๋ ํ์ธ
- ํ๋ฉด๋จ์์ ํ๊ทธ ์ ๋ณด(DetailVO.item_tag_main)์ ๋ชจ๋ฌ์ฐฝ ์ํ ๋ชฉ๋ก ์์ฒญ์ ํจ๊ป ๋ฐ๊ณ , ๊ทธ ์ ๋ณด๋ค์ Service ๋ก ๋๊น๋๋ค.
-
๊ฒฐ๊ณผ ์๋ต (Service) ๐ ์ฝ๋ ํ์ธ
- Service ๊ณ์ธต์์ Controller์์ ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋จํ, ๊ตฌ๋ ์ํ๊ฐ์ ๋ถ๋ฅ๋ฅผ ๊ฑฐ์น๊ณ Repository ๋ก ๋๊ฒจ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค.
-
-
Service ์ ์์ฒญ์ ์ฒ๋ฆฌ (Repository) ๐ ์ฝ๋ ํ์ธ
-
Service๋ก๋ถํฐ ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ SqlSessionTemplate ์ ํตํด Mybatis๋ก ๋๊น๋๋ค.
-
Mybatis์์ ๋ฐํ ๋ ์ํ ๋ฆฌ์คํธ(๋ฐ์ดํฐ) ๋ฅผ ๋ฐ์์ ์์ ์ ํธ์ถํ Service๋ก ์๋ตํฉ๋๋ค.
-
-
-
(1) applicationContext.xml ์์ sqlSessionTemplate ์ bean ๊ฐ์ฒด ์์ฑ (xml ์ค์ ํ์ผ) ๐ ์ฝ๋ ํ์ธ
-
(2) mybatis ํ๊ฒฝ์ค์ ํ์ผ(mybatis-config.xml) ์ SQL ๋งคํผํ์ผ ๋ฑ๋ก (xml ์ค์ ํ์ผ) ๐ ์ฝ๋ ํ์ธ
-
(3) ๋งคํผํ์ผ์์ SQL ๋ฌธ์ ํตํด ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ (xml ๋งคํผ ํ์ผ) ๐ ์ฝ๋ ํ์ธ
-
-
์ํ ๊ฒ์ ์์ฒญ์ ๋ํ ์๋ต SQL๋ฌธ ๐ ์ฝ๋ ํ์ธ
-
- (์ํ ์ด๋ฏธ์ง, ์ด๋ฆ, ๊ฐ๊ฒฉ) + (์ํ์ ๋ฆฌ๋ทฐ ํ๊ท ๋ณ์ , ๋ฆฌ๋ทฐ ์ด ๊ฐ์)
-
- ๊ด๋ฆฌ์ ํ์ด์ง์ ํต๊ณ ๋ฐ์ดํฐ๋ฅผ PDF๋ก ๋ค์ด ๋ฐ์ผ๋ ค ํ ๋, ํด๋ผ์ด์ธํธ ๊ฒฝ๋ก๋ก ๋ค์ด๋ก๋ ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- PDF ๋ค์ด๋ก๋ ๊ฒฝ๋ก๊ฐ "C:\๊ธ์ฃผ ๋งค์ถ.pdf" ๋ก ์กํ์๋๋ฐ, warํ์ผ๋ก ๋ฐฐํฌ ํ warํ์ผ ์์ ํด๋๋ก ๊ฒฝ๋ก๊ฐ ์กํ๋ฒ๋ ธ์ต๋๋ค. (ํด๋ผ์ด์ธํธ๋ก ๋ค์ด์ด ์๋ฐ์์ง)
- ๋๋ฌธ์ ํด๋ผ์ด์ธํธ ๊ฒฝ๋ก๊ฐ ์๋ ์๋ฒ ๊ฒฝ๋ก๋ก ๋ค์ด๋ก๋๊ฐ ๋์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋(ํด๋ฆญ)
@RequestMapping("/pdfDown.mdo")
public void pdfDown(HttpServletRequest request)throws Exception{
try {
Document document = new Document(); // pdf๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\๊ธ์ฃผ ๋งค์ถ.pdf"));
// pdfํ์ผ์ ์ ์ฅ๊ฒฝ๋ก๋ฅผ C๋๋ผ์ด๋ธ์ '๊ธ์ฃผ ๋งค์ถ.pdf'๋ก ์ ์ฅํ๋ค๋ ๋ป
document.open(); // ์นํ์ด์ง์ ์ ๊ทผํ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๋ค
String path =request.getSession().getServletContext().getRealPath("/");
/* ์ค๊ฐ ์ฝ๋ ์๋ต */
document.add(table); // ์น์ ๊ทผ ๊ฐ์ฒด์ table๋ฅผ ์ ์ฅํ๋ค.
document.close(); // ์ ์ฅ์ด ๋๋ฌ์ผ๋ฉด document๊ฐ์ฒด๋ฅผ ๋ซ๋๋ค.
System.out.println("์ฑ๊ณต");
}catch (Exception e) {
System.out.println("์คํจ");
e.printStackTrace();
}
}
- ๋ด์ฉ์ ์ง์ด๋ฃ์ pdf ํ์ผ์ ์์ ์ ํญ์ผ๋ก ๋์์, ํด๋ผ์ด์ธํธ์์ ์ ํญ์ ํตํด ์ธ์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์ ๋ถ ๊ฐ๋ฅํ๋๋ก ๋ณ๊ฒฝํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
- ๋ฌธ์ ํด๊ฒฐ ๊ณผ์
- pom.xml์ itext์ ๋ํ ์์กด์ฑ์ ์ถ๊ฐํ์ต๋๋ค.
- application.xml ์ค์ ํ์ผ์ pdf๋ฅผ ์ถ๋ ฅํ ํด๋์ค๋ฅผ ๋น ๊ฐ์ฒด๋ก ์์ฑํ ๋ค, ํด๋น ๋น ๊ฐ์ฒด๋ฅผ pdf๋ผ๋ ๋ทฐ ์ด๋ฆ์ด ์์ ๋ ๋์ ํ ํด๋์ค๋ก ์ค์ ํฉ๋๋ค.
- ๋ฆฌ์คํธ๋ก pdf์ ์ฐ์ ๊ฐ์ ์ ์ ํด์ pdf ๋ ์ด๋ฆ์ผ๋ก ๋ทฐ ์ด๋ฆ์ ๋ณด๋ ๋๋ค.
- ์ต์ข ์ ์ผ๋ก pdf ๋ด์ฉ์ ๋ง๋ค๊ณ ์ถ๋ ฅํ ๋น ๊ฐ์ฒด๋ฅผ ํตํด, ์๋ฐ ์ฝ๋๋ก ๋ฌธ์์ ์ฐ์ผ ํ๋ฅผ ๋ง๋ค์ด ๊ทธ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ์ ํญ์ PDF๋ฅผ ์ถ๋ ฅํ๋๋ก ๊ตฌํํ์ต๋๋ค.
๊ฐ์ ๋ ์ฝ๋ (ํด๋ฆญ)
// 1๋ฒ
// pom.xml ์ ์์กด์ฑ ์ถ๊ฐ
// PDF ์ถ๋ ฅ์ ์ํ ์์กด์ฑ ์ค์
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
// 2๋ฒ
// application.xml ๋ถ๋ชจ ์ค์ ํ์ผ์ pdf ์ถ๋ ฅํ ํด๋์ค๋ฅผ ๋น๊ฐ์ฒด๋ก ์์ฑ
// ๋น๊ฐ์ฒด ์์ฑ
<context:component-scan base-package="com.pdf.*" />
// Controller์์ 'pdf' ๋ก ๋ทฐ ์ด๋ฆ ์ ์ก ์ ๋ฐ์ com.pdf.web.PdfDownView ํด๋์ค๊ฐ ์ฒ๋ฆฌ ํ ํ๋ฉด์ถ๋ ฅ
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0" />
</bean>
// pdf๋ผ๋ ๋ทฐ ์ด๋ฆ์ด ์์ ๋ ์ถ๋ ฅํ ๋ทฐ๋ฅผ ์ค์
<bean id="pdf" class="com.pdf.web.PdfDownView"/>
// 3๋ฒ
// ์ปจํธ๋กค๋ฌ์์ ๋ฆฌ์คํธ๋ก pdf์ ์ฐ์ ๊ฐ์ ๋๊ธด ํ pdf ๋ ์ด๋ฆ์ผ๋ก ๋ทฐ ์ด๋ฆ ๋ณด๋ด๊ธฐ
@RequestMapping("/pdfDown.mdo")
public String pdfDownload(Model model){
//๋ ์ง์ฉ ๋ฉ์๋
LocalDate now = LocalDate.now();
DecimalFormat df = new DecimalFormat("00");
Calendar currentCalendar = Calendar.getInstance();
// ์ด๋ฒ ๋
๋ --> 2022
int year = now.getYear();
//์ด๋ฒ๋ฌ --> 03
String month = df.format(currentCalendar.get(Calendar.MONTH) + 1);
// ์ด๋ฒ๋ฌ ์์์ผ
String startDay = year+"-"+month+"-"+"01";
// ์ด๋ฒ๋ฌ ๋ง์ง๋ง์ผ
int str = currentCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
String endDay = year+"-"+month+"-"+str;
AdminReportDayVO vo = new AdminReportDayVO();
vo.setDate(startDay);
vo.setImpl(endDay);
List<AdminReportDayVO> list2 = adminReportDayService.reportMonth(vo);
//์ถ๋ ฅํ ๋ทฐ ์ด๋ฆ ๋ฆฌํด
model.addAttribute("list", list2);
return "pdf";
}
// 4๋ฒ
// com.pdf.web.PdfDownView ํด๋์ค์ pdf๋ฅผ ์์ฐฝ์ผ๋ก ๋์์ ์ถ๋ ฅํ๋ ๋ฉ์๋
//์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๊ฐ Controller๊ฐ ๋๊ฒจ์ค ๋ฐ์ดํฐ
//๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ถ๋ ฅํ ๋ฌธ์
@Override
protected void buildPdfDocument(Map<String, Object> model, Document doc, PdfWriter writer, HttpServletRequest request,HttpServletResponse response) throws Exception {
List<String> list = (List<String>)model.get("list");
XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
//ํ
์ด๋ธ์ ์์ฑ
//1์ด list.size()+1 ํ์ผ๋ก ์์ฑ
Table table = new Table(1,list.size()+1);
/* ์ค๊ฐ ์ฝ๋ ์๋ต */
String path =request.getSession().getServletContext().getRealPath("/");
BaseFont baseFont= BaseFont.createFont(path +"/resources/pdfFresh/fresh.ttf".replace('/', File.separatorChar), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(baseFont);
Cell cell = new Cell(new Paragraph("๊ฒฐ์ ์์์ฆ",font));
cell.setHeader(true);
table.addCell(cell);
table.endHeaders();
//๋ฐ์ดํฐ๋ฅผ ํ
์ด๋ธ์ ์
์ ์ถ๋ ฅ
for(String language : list){
Cell imsi = new Cell(new Paragraph(language,font));
table.addCell(imsi);
}
//๋ฌธ์์ ํ
์ด๋ธ ์ถ๊ฐ
doc.add(table);
}
PDF ํ์ผ ๋ค์ด ์์ฐ ์์ (10์ด)
default.mp4
5.2. DB์์ ํ ์ปฌ๋ผ์ ์ฌ๋ฌ๊ฐ์ ์ด๋ฏธ์ง URL์ ํ ๋ฒ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ํด๊ฒฐ
- ๊ฐ ์ํ์ ์๊ฐ๋ฅผ ์ํ ์ด๋ฏธ์ง URL ์ปฌ๋ผ ๊ฐ์๊ฐ ๋๋ฌด ๋ง์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ์ฝ์ง ์์ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
- ๊ฐ ์ํ์ ์๊ฐ ์ด๋ฏธ์ง ๊ฐ์๊ฐ ํ๊ท ์ ์ผ๋ก 10๊ฐ ์ด์์ ๋๋ค.
- ์ํ์ ๊ฐ์๊ฐ ๋ง๊ณ ๊ฐ ์ํ์ ์๊ฐ์์ ์ฐ์ด๋ ์ด๋ฏธ์ง์ ๊ฐ์๊ฐ ์ ๋ถ ๋ค ๋ฌ๋ผ์, ๊ณตํต์ผ๋ก ์ด๋ฏธ์ง URL์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
- URL์์ ์ฐ์ด์ง ์์๋งํ ๊ณ ์ ํ ๊ตฌ๋ถ์๋ฅผ ์ง์ ํฉ๋๋ค.
- ๊ฐ ์ํ์ ์๊ฐ ์ด๋ฏธ์ง URL๋ค์ ํด๋น ๊ตฌ๋ถ์๋ฅผ ์ฌ์ด์ ๋ผ์ ๋ฃ์ด์ ํ๋์ ๋ฌธ์์ด๋ก ๋ถ์ ๋๋ค.
- ๊ทธ ๋ฌธ์์ด์ ํ๋์ ์ปฌ๋ผ์ ์ ์ฅํฉ๋๋ค.
- ๊ฐ ์ํ ์๊ฐ ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋, ๊ทธ ๋ฌธ์์ด์ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋์ด์ List๋ก ๊ฐ์ ธ์ต๋๋ค.
- ๊ทธ ๋ฆฌ์คํธ ์์ ์๋ ๋ชจ๋ ์ด๋ฏธ์ง URL์ ์์ฐจ์ ์ผ๋ก ๋ฝ์๋ ๋๋ค.
- ์ด ํ๋ก์ ํธ๋ฅผ ํ ๋น์์ URL์ ๊ตฌ๋ถ์๋ฅผ ํ์ฉํ์ฌ ํ๋์ ์ปฌ๋ผ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
- ํ์ง๋ง ์ง๊ธ ๋ค์ ์๊ฐํด๋ณด๋ฉด, ์ฐจ๋ผ๋ฆฌ ์ํ ํ ์ด๋ธ๊ณผ 1๋N ๊ด๊ณ์ธ ํ ์ด๋ธ์ ํ๋ ๋ ๋ง๋ค์ด์ ๊ฐ ์ํ๋ง๋ค ์ฌ๋ฌ๊ฐ์ Image URL์ ๋ฃ์ ์ ์๊ฒ ํ์ผ๋ฉด ๋ ์ข์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
- ์ํ ์ ํ ํ, ๋ฐฐ์ก ์์ ์ผ์ ์ ํํ ๋ ๋ฌ๋ ฅ์ ๋์ฐ๊ธฐ ์ํด DatePicker API ๋ฅผ ์ด์ฉํด ๊ฐ์ ธ์์ง๋ง ํด๋น ํ์ด์ง์์ CSS ๊ฐ ๋๋ฌด ์๋๊ฐ๋ ๋๋์ด ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ (CSS ์ ์กฐ์ ์ด ๋ถ๊ฐ๋ฅ)
- ํ์ฌ ๋ฌ๋ ฅ ๋ชจ๋ฌ์ฐฝ์ CSS๋ฅผ ํ์ด์ง์ ๋ง๊ฒ ์์ ํ ๋ฌ๋ ฅ์ ๋ ์ง๊ฐ ๋งค์ผ ๊ฐฑ์ ๋๋๋ก ๋ฌ๋ ฅ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ๊ตฌํ
- ๊ฐ์ ๋ ์ฝ๋ ์ฐธ์กฐ
๊ฐ์ ๋ ์ฝ๋ 1๋ฒ (ํด๋ฆญ)
// 1๋ฒ
// ํ๋ฉด๋จ์์ ์ฐ, ์, ์ผ์ ๋ฐ์์ ์ค๋
, ์์ ๋ถ๋ฅํด์ ๊ทธ์ ๋ง๋ ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ๋ฃ์ต๋๋ค.
// ํ๋ฉด๋จ์์ ๋ฐ์ getDay (ํ์ฌ ๋ ์ง๊ฐ ์ผ์ฃผ์ผ ์ค ๋ช๋ฒ์งธ ์์ผ์ธ์ง) ์ ๋ณด๋ฅผ ๋ฌ๋ ฅ ๋ชจ๋ฌ์ฐฝ์ ๋๊ฒจ์
// ์๋ง๋ค ์ด๋ค ์์ผ๋ถํฐ ์์ํ๋์ง ๊ตฌํํ๋๋ก ํฉ๋๋ค.
@RequestMapping("/orderDateCalendar.do")
public ModelAndView orderDateCalendarDo(ModelAndView mav, String year, String month, String day, String getDay) {
System.out.println(Integer.parseInt(month));
String[] dateNum;
if(Integer.parseInt(month) == 1 || Integer.parseInt(month) == 3 || Integer.parseInt(month) == 5 || Integer.parseInt(month) == 7
|| Integer.parseInt(month) == 8 || Integer.parseInt(month) == 10 || Integer.parseInt(month) == 12) {
dateNum = new String[38];
}else if(Integer.parseInt(month) == 2) {
if(Integer.parseInt(year) % 4 == 0){
if(Integer.parseInt(year) % 400 != 0 && Integer.parseInt(year) % 100 == 0) {
dateNum = new String[35];
}else {
dateNum = new String[36];
}
}else {
dateNum = new String[35];
}
}else {
dateNum = new String[37];
}
int getDayNum = Integer.parseInt(getDay);
String[] getD = new String[getDayNum];
int mon = Integer.parseInt(month);
mav.addObject("remainSu", getDayNum);
mav.addObject("remainCheck", getD);
mav.addObject("year", year);
mav.addObject("check", day);
mav.addObject("month", mon);
mav.addObject("list", dateNum);
mav.setViewName("orderDateCalendar");
return mav;
}
๊ฐ์ ๋ ์ฝ๋ 2๋ฒ (ํด๋ฆญ)
<!-- 2๋ฒ -->
<!-- ์กฐ๊ฑด 4๊ฐ์ง๋ฅผ if๋ฌธ์ผ๋ก ๋๋ ์, ์์น๋ฅผ ์ง์ ํด์ฃผ๋ style์ grid-area ์์ฑ์ ํตํด ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ -->
<!-- 1. ์ ๋ฒ ๋ฌ์ ์ํ ๋ ์ง (๋น์นธ ๋น์๋๋ ์ฉ๋)-->
<!-- 2. ์ด๋ฒ ๋ฌ์ ์ํ์ง๋ง ์ค๋ ๋ ์ง๋ณด๋ค ์ ์ธ ๋ (์ค๋๋ ์ง ํฌํจ) -->
<!-- 3. ์ด๋ฒ ๋ฌ์ ์ํ๋ฉด์ ์ค๋ ๋ ์ง๋ณด๋ค ํ์ ๋ -->
<!-- 4. ๋ฌ๋ ฅ์ 5์ค๋ก ๋ง์ถฐ์ผ ํ๊ธฐ์ 4์ค๋ก ๋๋๋ ๋ฌ์ ๊ณต๋ฐฑ ๋ ์ง ์ผ์ฃผ์ผ์ ๋ ์ถ๊ฐ -->
<!-- span ํ๊ทธ id์์ฑ, text์ ๋ ์ง ์
๋ ฅ -->
<!-- ๋ณด๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด class ์์ฑ์ ์ ๋ถ ์ง์ ์ต๋๋ค. -->
<!-- 1. ์ ๋ฒ ๋ฌ์ ์ํ ๋ ์ง (๋น์นธ ๋น์๋๋ ์ฉ๋)-->
<c:forEach var="remain" items="${remainCheck }" varStatus="i">
<!-- grid-area ์์ฑ์ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ -->
<div data-v-3ca35a05="" style="grid-area: 2/${i.count}/auto/auto;">
<div data-v-2aac4f42="" data-v-4a5f2beb="" attributes="[object Object]" data-v-3ca35a05="">
<div data-v-2aac4f42="">
<span data-v-2aac4f42=""></span>
</div>
</div>
</div>
</c:forEach>
<c:forEach var="list1" items="${list }" varStatus="i">
<c:if test="${fn:length(list) == 38}">
<c:if test="${i.count <= 31}">
<!-- grid-area ์์ฑ์ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ -->
<div data-v-3ca35a05="" style="grid-area: ${(i.count + remainSu - 1) / 7 + 2}/${(i.count + remainSu - 1) % 7 + 1}/auto/auto;">
<div data-v-2aac4f42="" data-v-4a5f2beb="" data-v-3ca35a05="">
<!-- 2. ์ด๋ฒ ๋ฌ์ ์ํ์ง๋ง ์ค๋ ๋ ์ง๋ณด๋ค ์ ์ธ ๋ (์ค๋๋ ์ง ํฌํจ) -->
<c:if test="${i.count <= check }">
<div data-v-2aac4f42="" class="vc-h-full">
<span data-v-2aac4f42="" tabindex="-1" id="${year}/${month}/${i.count}">${i.count }</span>
</div>
</c:if>
<!-- 3. ์ด๋ฒ ๋ฌ์ ์ํ๋ฉด์ ์ค๋ ๋ ์ง๋ณด๋ค ํ์ ๋ -->
<c:if test="${i.count > check }">
<div data-v-2aac4f42="" class="vc-h-full">
<span data-v-2aac4f42="" tabindex="-1" id="${year}/${month}/${i.count}">${i.count }</span>
</div>
</c:if>
</div>
</div>
</c:if>
<!-- 4. ๋ฌ๋ ฅ์ 5์ค๋ก ๋ง์ถฐ์ผ ํ๊ธฐ์ 4์ค๋ก ๋๋๋ ๋ฌ์ ๊ณต๋ฐฑ ๋ ์ง ์ผ์ฃผ์ผ์ ๋ ์ถ๊ฐ -->
<c:if test="${i.count > 31 && remainSu < 5}">
<!-- grid-area ์์ฑ์ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ -->
<div data-v-3ca35a05="" style="grid-area: ${(i.count + remainSu - 1) / 7 + 2}/${(i.count + remainSu - 1) % 7 + 1}/auto/auto;">
<div data-v-2aac4f42="" data-v-4a5f2beb="" data-v-3ca35a05="">
<div data-v-2aac4f42="" >
<span data-v-2aac4f42="" id="${year}/${month}/${i.count}">27</span>
</div>
</div>
</div>
</c:if>
</c:if>
<!-- ์ด ์ดํ๋ก ๋์ด์จ ๋ฐฐ์ด์ ๊ธธ์ด๋ง๋ค ์กฐ๊ฑด๋ง ๋ค๋ฅด๊ฒ ์ฃผ๋ฉด์ ์์ ํ์๊ณผ ๋์ผํ๊ฒ 3๋ฒ ๋ ๋ฐ๋ณตํ๊ธฐ์ ์๋ต -->
<c:if test="${fn:length(list) == 37}">
<c:if test="${i.count <= 30}">
<div data-v-3ca35a05="" style="grid-area: ${(i.count + remainSu - 1) / 7 + 2}/${(i.count + remainSu - 1) % 7 + 1}/auto/auto;">
<!-- ์๋ต -->
</c:if>
</c:forEach>
๋ฌ๋ ฅ ๋ชจ๋ฌ์ฐฝ ์์ฐ ์์ (10์ด)
default.mp4
-
-
(1) AWS ๋ฃจํธ ๊ณ์ ์ํธ์ IAM(Identity and Access Management) ์ฌ์ฉ์์ ์ํธ ๋ณ๊ฒฝ
-
(2) AWS Management ์ฝ์์ ํ์ธํ์ฌ ๋ชจ๋ ์ฌ์ฉ์ด ์น์ธ๋์๋์ง ํ์ธ
-
๊ฐ์ ๋ ์ฝ๋ (ํด๋ฆญ)
// ๊ด๋ฆฌ์์ ์ํ ๋ฑ๋ก ์ฝ๋ ์ค...
// ๋ฉ์ธ์ด๋ฏธ์ง ์
๋ก๋
try {
AwsS3 awsS3 = new AwsS3();
// awsS3Service ์๋น์ค ํด๋์ค๋ฅผ ํตํด DB์์ ํค ๊บผ๋ด์ค๊ธฐ
AwsS3VO avo = awsS3Service.getKey();
awsS3.setAccessKey(avo.getA_key());
awsS3.setSecretKey(avo.getS_key());
// ๋ฐ์์จ ํค๋ฅผ ํตํด AmazonS3 ๊ฐ์ฒด ์์ฑ
awsS3.createS3Client();
String key = "menu/" + uploadFile.getOriginalFilename();
InputStream is = uploadFile.getInputStream();
String contentType = uploadFile.getContentType();
long contentLength = uploadFile.getSize();
// ์ด๋ฏธ์ง ํ์ผ S3์ ์
๋ก๋
awsS3.upload(is, key, contentType, contentLength);
// DB์ S3 ์ด๋ฏธ์ง ํ์ผ URL ์ ์ฅ
vo.setItem_image(url + key);
adminItemService.itemInsert(vo);
} catch (IOException e) {
System.out.println("๋ฉ์ธ์ด๋ฏธ์ง ์
๋ก๋ ์คํจ");
}
2) WAS(tomcat ์๋ฒ)๋ฅผ ํตํด war ํ์ผ๋ก ๋ฐฐํฌ ํ ๊ตฌ๊ธ ๋ก๊ทธ์ธ API๊ฐ "popup_closed_by_user" ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๋ฉด์ ๋ก๊ทธ์ธ์ด ์๋๋ ๋ฌธ์
- ํด๊ฒฐ : ํฌ๋กฌ ์ฐ์ธก ์๋จ ๋๋ณด๊ธฐ -> ๋๊ตฌ ๋๋ณด๊ธฐ -> ์ธํฐ๋ท ์ฌ์ฉ ๊ธฐ๋ก ์ญ์ -> ์บ์๋ ์ด๋ฏธ์ง ๋ฐ ํ์ผ๋ง ์ฒดํฌ -> ์ธํฐ๋ท ์ฌ์ฉ ๊ธฐ๋ก ์ญ์ ๋ฒํผ ํด๋ฆญ
3) ์นด์นด์ค ๋ก๊ทธ์ธ API ํ ์คํธ ์คํ ์ ๋๋ฒ์งธ ๋ก๊ทธ์ธ๋ถํฐ ์ ๋ณด ์ ๊ณต ๋์ ํ๋ฉด์ด ๋์์ง์ง ์๋ ๋ฌธ์
- ํด๊ฒฐ : https://accounts.kakao.com/weblogin/account/info ๋งํฌ(๊ณ์ ๊ด๋ฆฌ ์ฌ์ดํธ)์ ๋ค์ด๊ฐ์ ์๋จ์ ๊ณ์ ์ด์ฉ ํญ -> ์ธ๋ถ ์๋น์ค ์ ์ฒด๋ณด๊ธฐ -> ํด๋น ์๋น์ค(์ฑ) ์ฐ๊ฒฐ ๋๊ธฐ
- ์ด๋ฏธ์ง ์ถ๊ฐ ๋ฒํผ ํด๋ฆญ -> ์ด๋ฏธ์ง ํ์ผ์ ์ ํ ํ, ์ ํํ ์ด๋ฏธ์ง ํ์ผ์ ๋ฒํผ ์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ ์ ์๋๋ก ๊ฐ์
๊ฐ์ ๋ ์ฝ๋ (ํด๋ฆญ)
function readURL1(input) {
// ์ธํ ํ๊ทธ์ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ
if (input.files && input.files[0]) {
// FileReader ์ธ์คํด์ค ์์ฑ
var reader = new FileReader();
// ์ด๋ฏธ์ง๊ฐ ๋ก๋ ๋ ๊ฒฝ์ฐ
reader.onload = function (e) {
// ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋์ฐ๊ธฐ
$(".preview-images1").css({"background":"url(" + e.target.result + ")"});
}
// reader ๊ฐ ์ด๋ฏธ์ง ์ฝ๋๋ก ํ๊ธฐ
reader.readAsDataURL(input.files[0]);
}
$('#image-file-button1').parent().css('display', 'none');
$('#image-file-button2').parent().css('display', '');
}