Spring Boot์์ Supabase๋ฅผ ์ฐ๋ํ ํ ๊ฐ๋จํ ํ์๊ฐ์ ๋ก์ง ๊ตฌํ
Supabase๊ฐ ๋ญ์ง ๋ชจ๋ฅธ๋ค๋ฉด ๋ฐ์ ๊ธ์ ์ฝ์ด๋ณด๊ณ ์ค์
https://hanjungyo.tistory.com/124
Supabase๋? (with ์ด๋ค DB๋ฅผ ์ ํํด์ผํ ๊น?)
Supabase ์ฌ์ฉ๋ฒ์ ๋งํ๊ธฐ์ ์์ ํ์ฌ ๊ฐ๋ฐ์ค์ธ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋จํ๊ฒ ์์ฝํ๋ฉด ๋ณด์ด์คํฉ์ ๊ฑฐ๋ํ๊ณ ๊ตฌ๋งคํ ๋ณด์ด์คํฉ์ ํ๋ซํผ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๊ฒํด์ฃผ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ค. ์ด๋ค DB๋ฅผ
hanjungyo.tistory.com
์ฐ์ ํ์ฌ ํ๋ก์ ํธ๋ ์ด๊ธฐ์ Supabase ๋ฌด๋ฃ ํ๋์ ์ฌ์ฉํ๋ฉฐ ์ ๊ณตํด์ฃผ๋ OAuth๋ ๋น์ฅ์ ํ์๊ฐ ์์
๋ง์ฝ ์ถํ์ ์ํคํ
์ฒ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ DB๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ๋ ์๊ธฐ์ Supabase ์ข
์์ฑ์ ์ค์ฌ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์
(์ผ๋จ์ ๊ผญ ํ์ํ Supabase์ ๊ธฐ๋ฅ๋ง ์ด์ฉํ์๋ ๋ง์ธ๋)
๋ํ, ํ์๊ฐ์
์ด ๋จ์ํ ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ ์ ์ฅ์์ ๋๋๋ ๊ฒ์ด ์๋๋ผ ์ถ๊ฐ์ ์ธ ๋ฐฑ์๋ ๋ก์ง์ด ํ์ํ ์ ์๊ธฐ์ Supabase๊ฐ ์ ๊ณตํด์ฃผ๋ Auth ๊ธฐ๋ฅ ๋ง๊ณ db url๋ง ๊ฐ์ ธ์์ ๋ฐฑ์๋ ์๋ฒ์์ ์ง์ ํ์๊ฐ์
์ ๊ตฌํํ์๋ ๊ฒฐ๋ก ์ ๋๋ฌํจ
=> Supabase๋ก ์ด๊ฑธ ๊ตฌํํ๋ ค๋ฉด ๋ณต์กํจ...
(ํ์ฌ ํฌ์คํ
์์๋ ๋จ์ํ ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ๋ง ์ ์ฅํด๋ณผ ์์ )
1. ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
supabase ํํ์ด์ง ์ ์ ํ Start your project๋ฅผ ํด๋ฆญํ์ฌ ๋ก๊ทธ์ธ ํด์ค
Organization ์์ฑ ํ project ๊น์ง ์์ฑํ ์ ์์
=> project ์์ฑ ๋จ๊ฒ์์ ์ถ๊ฐ ์ต์ ๋ค์ ์ ๋ถ default๋ก ์งํํ์์
2. JDBC ์ฐ๊ฒฐํ๊ธฐ
์ผ์ชฝ ์ฌ์ง์์ ์ค๋ฅธ์ชฝ ์ ๋นจ๊ฐ์ ๋ค๋ชจ์ ์๋ connect ํด๋ฆญ ํ Type์ JDBC๋ก ํ์ฌ project์ ์ฐ๊ฒฐํ๊ธฐ ์ํ url์ ํ์ธํ ์ ์์
(๋ชจ์์ดํฌ ๋ ๋ถ๋ถ์ด url)
์ด ๋ Transaction pooler ๋ชจ๋๋ฅผ ์ฌ์ฉํด์ผํจ
=> Direct Connection์ ์ ๋ฃ ํ๋์ด ํ์ํ๊ณ PostgreSQL๊ณผ ์ง์ ์ฐ๊ฒฐํ๋ ๊ฒ๋ณด๋ค ์ฑ๋ฅ์ด ๋ ์์ ์ ์
(์ปค๋ฅ์
ํ๋ง์ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด ์ฐ๊ฒฐ์ ๋ง๋ค ๋๋ง๋ค DB์ ์ง์ ์ฐ๊ฒฐํ๋๊ฒ ์๋๋ผ PgBouncer๋ผ๋ ์ปค๋ฅ์
ํ๋ฌ๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ์ฌ ๋น์ฉ์ ์ค์ผ ์ ์์ ๊ทธ ๊ฒฐ๊ณผ ์ฑ๋ฅ์ด ํฅ์๋จ!)
ํธ๋์ญ์
๊ธฐ๋ฐ ์ฐ๊ฒฐ์ ์ฅ์๊ฐ ์ ์ง๋๋ ์ฐ๊ฒฐ๋ณด๋ค๋ ์งง์ ํธ๋์ญ์
์ด ์ ํฉ
๋จ, PREPARE๋ฌธ์ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋๋ฐ ์ด๋ SQL ์คํ ๊ณํ์ ๋ฏธ๋ฆฌ ์ค๋นํด๋๊ณ , ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ SQL ๋ฌธ๋ฒ์ผ๋ก ์ฑ๋ฅ ์ต์ ํ์ SQL ์ธ์ ์ ๋ฐฉ์ง๋ฅผ ์ํด ์ฌ์ฉ๋๋ค๊ณ ํจ
application.yaml์์ prepStmtCacheSize = 0 ์ผ๋ก ์ค์ ํ์ฌ Prepared Statement๋ฅผ ๋นํ์ฑํํ๋ฉด ๋๋ค๋๋ฐ
์ด ์ค์ ์์ด๋ ํ ์คํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์ด์ ์ถํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋ฌ๋ธ ์ํ ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์
(JDBC ๋๋ผ์ด๋ฒ๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฅผ ๋นํ์ฑํํ ์ ๋ ์๋ค๊ณ ํจ)
3. ์ฝ๋ ์์ฑ ํ ํ์๊ฐ์
ํ
์คํธ
(dto์ controller๋ฑ ๋ถ๊ฐ์ ์ธ ์ฝ๋๋ค์ ์๋ตํ๊ฒ ์)
@Entity
@Table(name = "users")
data class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
@Column(nullable = false, unique = true)
val email: String,
@Column(nullable = false)
val password: String
)
์ด์ ๊ฐ์ด Entity๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ
@Service
class UserService(
private val userRepository: UserRepository
) {
@Transactional
fun signup(request: UserSignupRequest): Long {
if (userRepository.findByEmail(request.email) != null) {
throw IllegalArgumentException("์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฉ์ผ์
๋๋ค")
}
val user = User(
email = request.email,
password = request.password // ์ค์ ๊ตฌํ์ ์ํธํ ํ์
)
return userRepository.save(user).id
}
}
Service ๋ก์ง์ ์์ฑํด์ค ํ
postman์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ณด๋ฉด DB์ ์ ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์
'๐ซ Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] AWS Lambda์ ํต์ ํ๊ธฐ (0) | 2025.03.30 |
---|---|
NginX๋ฅผ ํตํด Spring Boot ์๋ฒ์ HTTPS ์ ์ฉํ๊ธฐ (0) | 2025.03.24 |
Spring boot ์์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉํ๊ธฐ (Kotlin) (0) | 2025.02.20 |
JPA ํบ์๋ณด๊ธฐ (0) | 2025.02.16 |
[Spring Boot] Docker๋ฅผ ์ด์ฉํด EC2์ ๋ฐฐํฌํด๋ณด๊ธฐ (4) | 2024.08.27 |