SEO 메타 태그를 CMS 데이터베이스로 동적 전환한 방법
목차
이번에는 SEO 메타 태그 관리를 하드코딩된 방식에서 데이터베이스 중심으로 전환하는 작업을 했다. 사이트의 제목, 설명, 오픈그래프 이미지 같은 SEO 관련 메타 정보를 CMS 테이블에서 동적으로 불러와서 사용하도록 개선했다.
왜 이 작업이 필요했나
처음엔 사이트의 SEO 메타 정보가 전부 HTML 템플릿에 하드코딩되어 있었다. 이렇게 되면 마케팅팀이 제목이나 설명을 바꾸고 싶을 때마다 개발팀에 요청해야 하고, 배포 과정을 거쳐야 한다는 문제가 있었다. 특히 검색 최적화 작업은 빠른 실험과 테스트가 중요한데, 매번 개발 사이클을 탈 수 없다는 게 병목이었다.
또 다른 측면은 다국어 지원이나 시즌별 캠페인처럼 컨텍스트에 따라 메타 정보가 달라져야 할 수 있다는 것. 하드코딩 방식으로는 이런 유연성을 갖추기 어렵다.
구현 구조와 계층 분리
이 작업의 핵심은 데이터 계층(DB) → 비즈니스 로직(Service) → 뷰 계층(Template) 순서로 책임을 명확히 한 것이다.
| 계층 | 역할 | 변경 내용 |
|---|---|---|
| Service | DB에서 SEO 데이터 조회 | 새로운 내부 클래스 추가 (cms_site.meta.seo 쿼리) |
| Controller Advice | 요청 전에 공통 처리 | AdsControllerAdvice 수정 (모든 뷰에 SEO 데이터 주입) |
| Template | 메타 정보 렌더링 | fragments/seo.html (재사용 가능한 블록) |
특히 AdsControllerAdvice를 활용한 부분이 중요한데, 이를 통해 모든 요청에서 중복 코드 없이 SEO 정보를 뷰에 전달할 수 있었다.
// 개념적 흐름:
CMS DB (cms_site.meta.seo)
↓
Service 조회
↓
AdsControllerAdvice에서 Model에 추가
↓
Template fragments/seo.html에서 사용
↓
<meta> 태그로 렌더링
템플릿 Fragment 분리의 이점
기존에 SEO 메타 정보가 index.html에 흩어져 있었다면, 이제 fragments/seo.html로 분리했다. 이렇게 하면:
- 재사용성: 여러 페이지에서 같은 SEO 로직을
<th:include>또는<th:replace>로 쉽게 가져다 쓸 수 있다 - 유지보수: SEO 관련 HTML 변경이 한 곳에서만 이루어진다
- 테스트 용이성: Fragment만 따로 테스트하거나 검증하기 쉬워진다
실무에서 이런 식의 Fragment 분리는 복잡한 템플릿을 읽을 때 인지 부하를 줄여주고, 팀원이 코드를 더 빨리 이해할 수 있게 한다.
회고와 배운 점
1. Controller Advice의 올바른 활용
처음에는 각 컨트롤러 메서드마다 SEO 데이터를 로드하려고 생각했다. 하지만 AdsControllerAdvice 같은 전역 인터셉터 패턴을 써서, 모든 요청에서 공통으로 필요한 데이터를 한 곳에서 처리하는 게 훨씬 깔끔했다. 이런 패턴은 로그인 정보, 사이트 공통 설정 같은 거에도 자주 쓰인다.
2. 성능 고려
DB에서 매 요청마다 SEO 정보를 조회하면 부하가 생긴다. 이런 경우 캐싱 레이어를 고려해야 한다. 실제로 SEO 메타는 자주 바뀌지 않는 데이터라서, Redis나 로컬 캐시(Spring Cache)를 적용할 가치가 있다. 하지만 우선은 기능 완성을 먼저 하고, 필요하면 나중에 추가하는 식으로 진행했다.
3. 데이터 모델 설계
cms_site.meta.seo 구조를 봤을 때, CMS 테이블이 이미 SEO 메타 필드를 갖고 있었다는 점이 운이 좋았다. 만약 없었다면 새로운 테이블이나 컬럼을 추가해야 했을 텐데, 이건 데이터 마이그레이션과 운영 단계를 복잡하게 만든다. 처음부터 "관리 가능한 정보는 DB에"라는 원칙을 따르는 게 중요하다.
4. 점진적 전환
모든 페이지를 한 번에 전환하기보다는, index.html부터 시작해서 다른 페이지는 필요할 때마다 적용하는 식으로 접근했다. 이렇게 하면 리스크를 줄이고 피드백을 빠르게 받을 수 있다.
비슷한 상황에서의 확장 방법
이 패턴은 SEO뿐 아니라 다른 동적 컨텐츠에도 쉽게 확대할 수 있다:
- 배너/프로모션 메시지: CMS에서 일정 기간만 표시할 배너 데이터
- 다국어 UI 문자열: 언어별 공통 텍스트를 DB에서 관리
- 마이크로카피: 에러 메시지, 버튼 텍스트 같은 걸 마케팅팀이 수정 가능하게
핵심은 변경 빈도가 높거나, 개발팀이 아닌 다른 팀이 관리해야 할 정보는 DB로라는 원칙이다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.