feat: JWT 기반 인증 시스템 및 이메일 가입 구현

[인프라]
- Docker Compose 구성 (DB, Redis, MinIO)
- Spring Boot 3.5.9 + Kotlin + Gradle 설정

[인증/보안]
- Spring Security 및 JWT 필터 설정
- RTR(Refresh Token Rotation) 방식의 토큰 재발급 로직 구현
- Redis를 활용한 Refresh Token 및 이메일 인증 코드 관리

[기능 구현]
- 회원가입 (이메일 인증 포함)
- 로그인/로그아웃/토큰재발급 API 구현
- 공통 응답(ApiResponse) 및 전역 예외 처리(GlobalExceptionHandler) 적용
This commit is contained in:
pwy3282040@msecure.co
2025-12-26 12:58:51 +09:00
parent 02909894db
commit 49d435079f
15 changed files with 549 additions and 6 deletions

View File

@@ -0,0 +1,37 @@
package me.wypark.blogbackend.domain.user
import jakarta.persistence.*
import me.wypark.blogbackend.domain.common.BaseTimeEntity
@Entity
@Table(name = "member")
class Member(
@Column(nullable = false, unique = true)
val email: String,
@Column(nullable = false)
var password: String,
@Column(nullable = false)
var nickname: String,
@Enumerated(EnumType.STRING)
@Column(nullable = false)
val role: Role,
@Column(nullable = false)
var isVerified: Boolean = false
) : BaseTimeEntity() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null
fun verify() {
this.isVerified = true
}
}
enum class Role {
ROLE_USER, ROLE_ADMIN
}

View File

@@ -0,0 +1,10 @@
package me.wypark.blogbackend.domain.user
import org.springframework.data.jpa.repository.JpaRepository
interface MemberRepository : JpaRepository<Member, Long> {
// 로그인 및 중복 가입 방지를 위한 핵심 메소드들입니다.
fun findByEmail(email: String): Member?
fun existsByEmail(email: String): Boolean
fun existsByNickname(nickname: String): Boolean
}