비영속(new/transient)
비영속 상태는 객체를 새로 생성한 상태입니다.
JPA와 전혀 관계없이 객체만 생성한 상태입니다.
영속(managed)
영속성 컨텍스트에 의해서 관리되어지는 상태입니다.
생성한 객체를 em.persist()를 통해 영속성 컨텍스트에 저장하거나,
혹은 em.find()를 통해 DB에서 엔티티를 조회하면 영속성 컨텍스트에 저장되어 관리되어지므로 이때 영속 상태가 됩니다.
준영속 (detached)
영속성 컨텍스트에 저장되었다가 분리된 상태로 현재는 영속 상태가 아닌 상태입니다.
따라서 영속성 컨텍스트가 제공하는 기능을 사용하지 못합니다.
하지만 준영속은 중요하지 않다.
단방향이 다방향보다 잘 쓰인다.
인증인가 쓰는법
implementation("org.springframework.boot:spring-boot-starter-security") implementation("io.jsonwebtoken:jjwt-api:0.12.3") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")
이걸 그래들에 넣고
어플리케이션.yml에 springframework:
security: debug 추가!
spring:
datasource:
url: jdbc:postgresql://db.akenemuwmwbarcaefoup.supabase.co:5432/postgres
username: postgres
password: akehzkal13!
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
highlight_sql: true
logging:
level:
org:
hibernate:
SQL: debug
orm:
jdbc:
bind: trace
springframework: # 추가!
security: debug
이렇세됨
거기에
auth: jwt: issuer: team.sparta.com secret: PO4c8z41Hia5gJG3oeuFJMRYBB4Ws4aZ accessTokenExpirationHour: 168도 추가해서
spring:
datasource:
url: jdbc:postgresql://db.akenemuwmwbarcaefoup.supabase.co:5432/postgres
username: postgres
password: akehzkal13!
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
highlight_sql: true
logging:
level:
org:
hibernate:
SQL: debug
orm:
jdbc:
bind: trace
springframework:
security: debug
auth:
jwt:
issuer: team.sparta.com
secret: PO4c8z41Hia5gJG3oeuFJMRYBB4Ws4aZ
accessTokenExpirationHour: 168
이렇게 만들어야 한다.
그리고 nfra 패키지 하위에 security 패키지를 생성하고, SecurityConfig 클래스를 작성하여 FilterChain을 만든다
package com.teamsparta.todo.infra.security
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.web.SecurityFilterChain
@Configuration
@EnableWebSecurity
class SecurityConfig {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
return http
.httpBasic { it.disable() } // BasicAuthenticationFilter, DefaultLoginPageGeneratingFilter, DefaultLogoutPageGeneratingFilter 제외
.formLogin { it.disable() } // UsernamePassworedAuthenticationFilter, DefaultLoginPageGeneratingFilter, DefaultLogoutPageGeneratingFilter 제외
.csrf { it.disable() } // CsrfFilter 제외
.build()
}
}
그리고 이녀석을 만들어준다.
package com.teamsparta.courseregistration.infra.security.jwt
import io.jsonwebtoken.Claims
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import java.nio.charset.StandardCharsets
import java.time.Duration
import java.time.Instant
import java.util.*
@Component
class JwtPlugin(
@Value("\${auth.jwt.issuer}") private val issuer: String,
@Value("\${auth.jwt.secret}") private val secret: String,
@Value("\${auth.jwt.accessTokenExpirationHour}") private val accessTokenExpirationHour: Long,
) {
fun validateToken(jwt: String): Result<Jws<Claims>> {
return kotlin.runCatching {
val key = Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))
Jwts.parser().verifyWith(key).build().parseSignedClaims(jwt)
}
}
fun generateAccessToken(subject: String, role: String): String {
return generateToken(subject, role, Duration.ofHours(accessTokenExpirationHour))
}
private fun generateToken(subject: String, role: String, expirationPeriod: Duration): String {
val claims: Claims = Jwts.claims().add(mapOf("role" to role)).build()
val now = Instant.now()
val key = Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))
return Jwts.builder()
.subject(subject)
.issuer(issuer)
.issuedAt(Date.from(now))
.expiration(Date.from(now.plus(expirationPeriod)))
.claims(claims)
.signWith(key)
.compact()
}
}
근데왠지 hour에 빨간색이 뜬다. 왜?? 하란대로 했는데???
package com.teamsparta.todo.domain
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import org.springframework.security.crypto.password.PasswordEncoder
@Configuration
class PasswordEncoderConfig {
@Bean
fun passwordEncoder(): PasswordEncoder {
return BCryptPasswordEncoder()
}
}
이건 되는데 왜??? 아마 당분간은 여기에 파붇혀야겠다.