ohjongsung's Dev Story

Ohjongsung's Dev Story

sitemap.xml for SEO

2017년 07월 09일

웹사이트 개발 및 운영에서 SEO(Search Engine Optimization, 검색엔진최적화)가 중요하다. SEO를 하기 위해서는 여러 작업이 있는데, 여기서는 sitemap에 대해서 다루겠다. sitemap.xml은 사이트의 웹페이지를 나열하는 파일로 사이트 콘텐츠의 구성을 Google 및 다른 검색 엔진에 알리는 데 사용한다. Googlebot과 같은 검색 엔진 웹 크롤러는 이 파일을 읽고 사이트를 더 지능적으로 크롤링하게 된다.

왜 Sitemap을 사용할까?

Googlebot 및 기타 웹 크롤러는 한 페이지에서 다른 페이지로 또는 다른 사이트로 연결되는 링크를 따라 이동하여 웹을 크롤링한다. 따라서 일부 페이지가 링크되어 있지 않으면 크롤러가 페이지를 찾지 못할 수 있다. 새로 생긴 사이트의 경우, 해당 웹사이트를 참조하는 링크가 인터넷상에 존재하지 않기 때문에, 크롤링되지 못할 가능성이 크다. 그래서 Sitemap을 통해 검색엔진에게 능동적으로 페이지가 마지막으로 업데이트된 날짜, 페이지 변경 빈도, 사이트의 다른 URL 대비 페이지의 중요성 등을 알려주는 것이다. 물론 사이트맵을 사용하더라도 사이트맵의 모든 항목이 크롤링되고 색인 생성된다고 보장할 수는 없다. 그러나 기본적으로 Sitemap은 웹사이트에 대한 크롤링을 개선하기 때문에 적용하는게 좋다.

Spring에서 Sitemap.xml 만들기

Sitemap의 XML 형식 : sitemap.org

jackson-dataformat-xml dependency 추가

"com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.8"

XmlMapper Bean 등록

   @Bean
    public XmlMapper xmlMapper() {
        return new XmlMapper();
    }

XmlUrl.java

@JacksonXmlRootElement(localName = "url", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
public class XmlUrl {

    private static final String BASE_URL = "http://localhost/";
    private static final SimpleDateFormat SITE_MAP_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    @JacksonXmlProperty(localName = "loc")
    private String loc;

    @JacksonXmlProperty(localName = "lastmod")
    private String lastmod;

    @JacksonXmlProperty(localName = "changefreq")
    private String changefreq = "daily";

    @JacksonXmlProperty(localName = "priority")
    private String priority = "0.5";

    public XmlUrl(String loc, Date lastmod) {
        this.loc = BASE_URL + loc;
        this.lastmod = SITE_MAP_DATE_FORMAT.format(lastmod);
    } 
}

XmlUrlSet.java

@JacksonXmlRootElement(localName = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
public class XmlUrlSet {

    @JacksonXmlProperty(localName = "url", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<XmlUrl> xmlUrls = new ArrayList<>();

    public void addUrl(XmlUrl xmlUrl) {
        xmlUrls.add(xmlUrl);
    }
}

SitemapController.java

@RestController
public class SitemapController {

    private final SitemapService service;

    @Autowired
    public SitemapController(SitemapService service) {
        this.service = service;
    }

    @RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET)
    public XmlUrlSet sitemap() {
        return service.createSitemap();
    }
}

SitemapService.java

@Service
public class SitemapService {

    private final SomethingService service;

    @Autowired
    public SitemapService(SomethingService service) {
        this.service = service;
    }

    // 여기서 loop 돌면서 모든 XmlUrl을 XmlUrlSet에 담는다.
    public XmlUrlSet createSitemap() {
        XmlUrlSet xmlUrlSet = new XmlUrlSet();
        List<Item> items = service.getAllItems();
        for (Item i : items) {
            xmlUrlSet.addUrl(new XmlUrl(i.getUrl(), i.getDate()));
        }

        return xmlUrlSet;
    }
}

이렇게 간단하게 구현해봤다.

Sitemap.xml 제출하기

Sitemap을 제출하는 방법은 다음과 같다.

Reference