해시태그 입력 UI 구현 방법 (폼 UX 개선 + jQuery 예제)

해시태그 입력 UI는 게시판, 쇼핑몰, 블로그, CMS 등 다양한 웹 서비스에서 활용되는 기능입니다.
특히 해시태그 입력 UI 구현 방법을 제대로 적용하면 사용자가 태그를 쉽게 등록하고 관리할 수 있어 사용자 경험(UX)이 크게 향상됩니다.
이번 글에서는 실제 운영 중인 소스를 기반으로 해시태그 입력 UI를 구현하는 방법과 개선 팁을 정리해보겠습니다.

원인은 무엇인가

처음에는 일반적인 input 태그 하나만 사용해서 해시태그를 입력받는 경우가 많습니다.

예를 들면: <input type="text" name="hashtags">

하지만 실제 서비스를 운영해보면 여러 문제가 발생합니다.

  • 태그 구분 기준이 애매함
  • 중복 입력 방지 어려움
  • 입력된 태그 확인 불편
  • 삭제 기능 구현 필요
  • 모바일에서 사용성이 떨어짐

사용자는 자신이 입력한 태그가 정상적으로 등록되었는지 즉시 확인하고 싶어 합니다.

그래서 대부분의 서비스는 태그를 입력하면 작은 버튼 형태로 변환되는 UI를 사용합니다.

왜 문제가 되는가

사용자 입장에서 해시태그는 검색이나 분류를 위한 중요한 정보입니다.

그런데 단순 텍스트 입력 방식은 사용자가 실수하기 쉽습니다.

예를 들어 다음과 같이 입력했다고 가정해보겠습니다.

여행,맛집,부산,맛집

이 경우 동일한 태그가 중복 등록될 수 있습니다.

또한 태그를 삭제하려면 문자열 전체를 수정해야 합니다.

제가 쇼핑몰 관리 시스템을 개발할 때도 처음에는 textarea 형태로 태그를 입력받았습니다.

하지만 관리자들이 태그를 잘못 입력하거나 중복 등록하는 경우가 많아 결국 현재와 같은 태그 UI 방식으로 변경했습니다.

변경 후에는 입력 오류가 크게 줄어들었고 사용 만족도도 높아졌습니다.

태그 배열 + 렌더링 구조

핵심 구조는 간단합니다.
입력 → 배열 저장 → UI 렌더링 → hidden 값 동기화

실제 데이터는 배열로 관리하고 화면은 배열 데이터를 기반으로 다시 그리는 방식입니다.

  1. UI 구조 (HTML + CSS)
    • input은 하나만 유지
    • 태그는 span으로 추가
    • flex로 자연스럽게 줄바꿈
<div class="hash-wrap">
	<label for="tagInput" class="hash-label">해시태그</label>

	<div id="tagBox" class="hash-box">
		<input type="text" id="tagInput" class="hash-input" placeholder="해시태그를 입력 후 엔터">
	</div>
</div>
<input type="hidden" id="hashtags" name="hashtags">

2. 입력 처리 (jQuery)

  • Enter / , 입력 시 태그 생성
  • 자동 제거
  • 중복 방지
let tags = [];

$("#tagInput").on("keydown", function(e) {
	if (e.key === "Enter" || e.key === ",") {
		e.preventDefault();

		let val = $(this).val().trim().replace("#", "");

		if (!val || tags.includes(val)) return;

		tags.push(val);
		renderTags();
		$(this).val('');
	}
});

3. 렌더링 함수 (핵심 로직)

  • UI는 항상 tags 배열 기준으로 다시 그림
  • DOM 상태를 믿지 않고 데이터 중심으로 관리
  • hidden input으로 서버 전송
function renderTags() {
	let $box = $("#tagBox");
	let $input = $("#tagInput");

	$box.find(".hash-tag").remove();

	let html = "";
	tags.forEach((tag, i) => {
		html += `
		<span class="hash-tag">
			<span class="hash-tag-text">#${tag}</span>
			<button type="button" class="hash-tag-remove" data-idx="${i}">×</button>
		</span>
		`;
	});

	$input.before(html);

	$("#hashtags").val(tags.join(","));
}

4. 태그 삭제 처리

$(document).on("click", ".hash-tag-remove", function() {
	let idx = $(this).data("idx");
	tags.splice(idx, 1);
	renderTags();
});

실제 사용하면서 느낀 개선 팁

글자 수 제한 추가

  • if (val.length > 20) return;

태그 개수 제한

  • if (tags.length >= 10) return;

blur 시 자동 생성

$("#tagInput").on("blur", function() {
	let val = $(this).val().trim();
	if (val) {
		tags.push(val);
		renderTags();
		$(this).val('');
	}
});

서버에서 배열 처리 (PHP)

$hashtags = explode(',', $_POST['hashtags'] ?? '');

foreach ($hashtags as $tag) {
	$tag = trim($tag);
	if ($tag === '') continue;

	// 저장 처리
}

정리

해시태그 입력 UI 구현 방법의 핵심은 태그를 배열로 관리하고, 배열 데이터를 기준으로 화면을 렌더링하는 것입니다.

이 구조를 사용하면 중복 입력 방지, 태그 삭제, 서버 전송까지 자연스럽게 처리할 수 있습니다.

실제로 게시판, 쇼핑몰, 블로그 관리 시스템 등 다양한 프로젝트에서 활용할 수 있으며 사용자 경험도 크게 향상됩니다.

특히 jQuery 기반 프로젝트라면 별도의 라이브러리 없이도 쉽게 적용할 수 있어 활용도가 높은 UI 컴포넌트입니다.