diff --git a/src/main/java/kr/iotdoor/boot/config/IotdoorProperties.java b/src/main/java/kr/iotdoor/boot/config/IotdoorProperties.java index 6b6f382..2c89fe6 100644 --- a/src/main/java/kr/iotdoor/boot/config/IotdoorProperties.java +++ b/src/main/java/kr/iotdoor/boot/config/IotdoorProperties.java @@ -23,6 +23,8 @@ public class IotdoorProperties { public static class Site { private String name; + private String url; + private String ogImage; private String adminTitle; private String email; private String phone; @@ -42,6 +44,22 @@ public class IotdoorProperties { this.name = name; } + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getOgImage() { + return ogImage; + } + + public void setOgImage(String ogImage) { + this.ogImage = ogImage; + } + public String getAdminTitle() { return adminTitle; } diff --git a/src/main/java/kr/iotdoor/boot/config/SecurityConfig.java b/src/main/java/kr/iotdoor/boot/config/SecurityConfig.java index 1d8f123..f28fb4b 100644 --- a/src/main/java/kr/iotdoor/boot/config/SecurityConfig.java +++ b/src/main/java/kr/iotdoor/boot/config/SecurityConfig.java @@ -18,6 +18,8 @@ public class SecurityConfig { .requestMatchers( "/", "/index.do", + "/robots.txt", + "/sitemap.xml", "/portfolio.do", "/portfolio/**", "/contact.do", diff --git a/src/main/java/kr/iotdoor/boot/web/GlobalViewModelAdvice.java b/src/main/java/kr/iotdoor/boot/web/GlobalViewModelAdvice.java index 8e1305f..653b4c2 100644 --- a/src/main/java/kr/iotdoor/boot/web/GlobalViewModelAdvice.java +++ b/src/main/java/kr/iotdoor/boot/web/GlobalViewModelAdvice.java @@ -2,6 +2,7 @@ package kr.iotdoor.boot.web; import kr.iotdoor.boot.config.IotdoorProperties; import kr.iotdoor.boot.model.user.AdminUserPrincipal; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; @@ -29,6 +30,11 @@ public class GlobalViewModelAdvice { return List.of(); } + @ModelAttribute("canonicalUrl") + public String canonicalUrl(HttpServletRequest request) { + return request.getRequestURL().toString(); + } + @ModelAttribute("subMainClass") public String subMainClass() { return ""; diff --git a/src/main/java/kr/iotdoor/boot/web/PublicPageController.java b/src/main/java/kr/iotdoor/boot/web/PublicPageController.java index a6781cf..3562a76 100644 --- a/src/main/java/kr/iotdoor/boot/web/PublicPageController.java +++ b/src/main/java/kr/iotdoor/boot/web/PublicPageController.java @@ -28,12 +28,16 @@ public class PublicPageController { } @GetMapping("/contact.do") - public String contact() { + public String contact(Model model) { + model.addAttribute("pageTitle", "문의하기"); + model.addAttribute("pageDescription", "국제오토텍 자동문, 산업용자동문, 내풍압셔터, 오버헤드도어 시공 및 A/S 상담을 접수합니다."); return "kr/iotdoor/cmty/contact/contact"; } @GetMapping("/portfolio.do") public String portfolio(Model model) { + model.addAttribute("pageTitle", "시공 사례"); + model.addAttribute("pageDescription", "국제오토텍의 자동문, 산업용자동문, 내풍압셔터, 오버헤드도어 시공 사례와 제품 포트폴리오를 확인하세요."); model.addAttribute("portfolioItems", portfolioService.getPortfolioItems()); return "kr/iotdoor/cmty/portfolio/portfolio"; } @@ -48,6 +52,8 @@ public class PublicPageController { ); } + model.addAttribute("pageTitle", portfolio.getTitle()); + model.addAttribute("pageDescription", portfolio.getSummary()); model.addAttribute("portfolio", portfolio); model.addAttribute("portfolioCount", portfolioService.count()); return "kr/iotdoor/cmty/portfolio/detail"; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2b79ac5..7b59ffc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -62,6 +62,8 @@ mybatis: iotdoor: site: name: 국제오토텍 + url: https://iotdoor.kr + og-image: https://iotdoor.kr/resources/kr/iotdoor/comn/site/layout/image/template/logo.jpg admin-title: 국제오토텍 관리자 email: iotdoor1749@naver.com phone: 042-585-1749 diff --git a/src/main/resources/static/robots.txt b/src/main/resources/static/robots.txt new file mode 100644 index 0000000..9679f27 --- /dev/null +++ b/src/main/resources/static/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://iotdoor.kr/sitemap.xml diff --git a/src/main/resources/static/sitemap.xml b/src/main/resources/static/sitemap.xml new file mode 100644 index 0000000..c332eb2 --- /dev/null +++ b/src/main/resources/static/sitemap.xml @@ -0,0 +1,18 @@ + + + + https://iotdoor.kr/ + weekly + 1.0 + + + https://iotdoor.kr/portfolio.do + weekly + 0.8 + + + https://iotdoor.kr/contact.do + monthly + 0.7 + + diff --git a/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnHeader.html b/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnHeader.html index 8d27819..84a436f 100644 --- a/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnHeader.html +++ b/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnHeader.html @@ -61,7 +61,6 @@ Portfolio Contact - ADMIN diff --git a/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnSiteLayout.html b/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnSiteLayout.html index a917269..e8ac567 100644 --- a/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnSiteLayout.html +++ b/src/main/resources/templates/kr/iotdoor/comn/site/layout/cmmnSiteLayout.html @@ -7,13 +7,14 @@ - - - - + + + + - - 국제오토텍 + + + 국제오토텍 diff --git a/src/test/java/kr/iotdoor/boot/web/PublicPageControllerTest.java b/src/test/java/kr/iotdoor/boot/web/PublicPageControllerTest.java index 5d107f5..5ca0dee 100644 --- a/src/test/java/kr/iotdoor/boot/web/PublicPageControllerTest.java +++ b/src/test/java/kr/iotdoor/boot/web/PublicPageControllerTest.java @@ -22,7 +22,22 @@ class PublicPageControllerTest { void homePageRendersFully() throws Exception { mockMvc.perform(get("/")) .andExpect(status().isOk()) - .andExpect(content().string(org.hamcrest.Matchers.containsString("Footer Start"))); + .andExpect(content().string(org.hamcrest.Matchers.containsString("Footer Start"))) + .andExpect(content().string(org.hamcrest.Matchers.containsString("name=\"description\""))) + .andExpect(content().string(org.hamcrest.Matchers.containsString("property=\"og:title\""))) + .andExpect(content().string(org.hamcrest.Matchers.containsString("property=\"og:description\""))); + } + + @Test + void searchEngineFilesArePublic() throws Exception { + mockMvc.perform(get("/robots.txt")) + .andExpect(status().isOk()) + .andExpect(content().string(org.hamcrest.Matchers.containsString("User-agent: *"))) + .andExpect(content().string(org.hamcrest.Matchers.containsString("Sitemap: https://iotdoor.kr/sitemap.xml"))); + + mockMvc.perform(get("/sitemap.xml")) + .andExpect(status().isOk()) + .andExpect(content().string(org.hamcrest.Matchers.containsString("https://iotdoor.kr/portfolio.do"))); } @Test