티스토리 뷰
블로그를 직접 만들어본 기록이다. 티스토리나 워드프레스를 쓰면 될 일이지만, 프레임워크를 제대로 익히는 데는 완결된 서비스를 처음부터 끝까지 만들어보는 것만 한 게 없다.
저장소
https://github.com/yousung/blog
개발 환경
- PHP : 7.1
- Framework : Laravel 5.6
- Cache : Redis 또는 Memcached
- DB : MySQL
지금 기준으로 보면 전부 구버전이다. PHP 7.1은 2019년에 보안 지원이 끝났고 Laravel 5.6도 마찬가지다. 당시 스택 기록으로 남겨둔다.
블로그를 직접 만들면 배우는 것들
블로그는 학습용 프로젝트로 꽤 좋은 주제다. 단순해 보이지만 웹 서비스의 기본 요소가 거의 다 들어간다.
1. 인증과 권한
글 작성은 관리자만, 조회는 누구나. 이 단순한 요구사항 하나로 미들웨어, 게이트, 정책(Policy)을 다 써보게 된다.
// 라우트 미들웨어
Route::middleware(['auth'])->group(function () {
Route::resource('posts', PostController::class)->except(['index', 'show']);
});
// 정책
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
2. 관계 설계
게시글–카테고리는 1:N, 게시글–태그는 N:M이다. 댓글은 대댓글까지 생각하면 자기 참조 관계가 된다. ORM의 관계 정의를 실전에서 써볼 수 있다.
public function tags()
{
return $this->belongsToMany(Tag::class);
}
public function comments()
{
return $this->hasMany(Comment::class)->whereNull('parent_id');
}
public function replies()
{
return $this->hasMany(Comment::class, 'parent_id');
}
3. 캐시 전략
블로그는 읽기가 압도적으로 많고 쓰기는 드물다. 캐시를 적용하기에 이상적인 구조다. Redis나 Memcached를 붙인 이유가 이것이다.
// 인기 글 목록은 1시간 캐시
$popular = Cache::remember('posts.popular', 3600, function () {
return Post::orderByDesc('views')->take(10)->get();
});
// 글이 수정되면 무효화
public function updated(Post $post): void
{
Cache::forget('posts.popular');
Cache::forget("post.{$post->slug}");
}
캐시를 붙이면서 배우는 진짜 어려운 부분은 무효화 시점이다. 언제 지울 것인가, 지우는 걸 깜빡하면 어떤 일이 생기는가. 이건 글로 읽어서는 감이 안 오고 직접 겪어봐야 안다.
4. 조회수 처리
글을 볼 때마다 UPDATE posts SET views = views + 1 을 날리면 트래픽이 늘었을 때 DB가 힘들어진다. 캐시에 누적했다가 배치로 반영하는 방식을 고민하게 된다.
5. SEO와 URL 설계
/posts/1 보다 /posts/laravel-blog-tutorial 이 낫다. 슬러그를 어떻게 만들 것인가, 한글 제목은 어떻게 처리할 것인가, 제목이 바뀌면 URL도 바꿀 것인가 같은 결정이 필요하다.
URL을 바꾸면 기존 링크가 깨지므로, 슬러그는 한 번 정하면 유지하고 제목만 바꾸는 쪽이 일반적이다.
6. 마크다운과 XSS
에디터를 붙이면 사용자 입력을 HTML로 렌더링해야 한다. 여기서 XSS를 막는 방법을 반드시 다루게 된다. 마크다운 파서를 쓰더라도 <script>를 통과시키는 설정이 기본값인 경우가 있으니 확인이 필요하다.
돌아보면
결국 이 블로그는 티스토리로 운영하고 있다. 직접 만든 걸 계속 쓰려면 서버 관리, 백업, 보안 패치, 스팸 댓글 대응까지 전부 직접 해야 하는데, 글 쓰는 시간보다 관리하는 시간이 더 들어가기 때문이다.
그래도 만들어본 경험 자체는 남았다. 캐시 무효화나 N+1 같은 문제를 실무에서 만났을 때, 작게라도 직접 겪어본 것과 아닌 것은 차이가 크다.
학습용 프로젝트를 고민 중이라면 블로그는 여전히 좋은 선택이다. 요구사항이 명확하고, 완성 후에 실제로 써볼 수 있고, 확장할 여지가 무한하다.
정리
- Laravel 5.6 + PHP 7.1 + Redis + MySQL 조합으로 제작 (2018년 기준)
- 블로그는 인증·관계·캐시·SEO를 한 번에 다루는 좋은 학습 주제
- 읽기 위주 서비스라 캐시 무효화를 실전으로 배울 수 있다
- 직접 만든 걸 계속 운영하는 건 별개의 비용이다
- 코드: github.com/yousung/blog
'개발 > Laravel' 카테고리의 다른 글
| Laravel paginate에서 값이 매번 달라진 이유, ORDER BY가 없었다 (0) | 2024.05.13 |
|---|---|
| 프로젝트별로 php version 자동 관리하기 (feat: php monitor) (0) | 2023.03.24 |
| Laravel Socialite로 소셜 로그인 붙이기, 카카오·네이버는 어떻게 하나 (0) | 2022.02.24 |
| Laravel 유효성 검사 실패 시 입력창 테두리 강조하기 (0) | 2018.08.27 |
| Laravel 한글 언어팩 적용하기, 유효성 검사 메시지 한글화 (2) | 2018.08.27 |
