This commit is contained in:
2025-07-30 07:08:08 +09:00
commit 001141f31e
57 changed files with 3570 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
package org.home.linkkf
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class SampleApplication
fun main(args: Array<String>) {
runApplication<SampleApplication>(*args)
}

View File

@@ -0,0 +1,17 @@
package org.home.linkkf.config.filter
import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.filter.Filter
import ch.qos.logback.core.spi.FilterReply
class LoggingFilter : Filter<ILoggingEvent?>() {
override fun decide(p0: ILoggingEvent?): FilterReply? {
if (p0!!.getMessage().contains("locale")) {
return FilterReply.DENY
} else {
return FilterReply.ACCEPT
}
}
}

View File

@@ -0,0 +1,34 @@
package org.home.linkkf.config.jasypt
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties
import org.jasypt.encryption.StringEncryptor
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
@EnableEncryptableProperties
class JasyptConfigAES {
@Value("\${jasypt.encryptor.key}")
private val key: String? = null
@Bean("jasyptEncryptorAES")
fun stringEncryptor(): StringEncryptor {
val encryptor = PooledPBEStringEncryptor()
val config = SimpleStringPBEConfig()
config.setPassword(key) // 암호화키
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256") // 알고리즘
config.setKeyObtentionIterations("1000") // 반복할 해싱 회수
config.setPoolSize("1") // 인스턴스 pool
config.setProviderName("SunJCE")
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator") // salt 생성 클래스
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator")
config.setStringOutputType("base64") //인코딩 방식
encryptor.setConfig(config)
return encryptor
}
}

View File

@@ -0,0 +1,55 @@
package org.home.linkkf.config.swagger
import io.swagger.v3.oas.models.Components
import io.swagger.v3.oas.models.OpenAPI
import io.swagger.v3.oas.models.info.Info
import io.swagger.v3.oas.models.security.SecurityRequirement
import io.swagger.v3.oas.models.security.SecurityScheme
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class SwaggerConfig {
private val JWTSCHEMENAME = "jwtAuth"
private val securityRequirement: SecurityRequirement? = SecurityRequirement().addList(JWTSCHEMENAME)
@Bean
fun openAPI(): OpenAPI? {
// return new OpenAPI()
// .info(apiInfo())
// .components(new Components().addSecuritySchemes("basicScheme", new SecurityScheme()
// .type(SecurityScheme.Type.HTTP).scheme("basic")));
// }
return OpenAPI()
.info(apiInfo())
.addSecurityItem(securityRequirement)
.components(
Components()
.addSecuritySchemes(
JWTSCHEMENAME, SecurityScheme()
.name(JWTSCHEMENAME)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")
.name("Authentication")
)
.addSecuritySchemes(
"custom-header", SecurityScheme()
.type(SecurityScheme.Type.APIKEY)
.`in`(SecurityScheme.In.HEADER)
.name("sabun")
)
)
.addSecurityItem(SecurityRequirement().addList("custom-header"))
}
private fun apiInfo(): Info? {
return Info()
.title("소액계약거래")
.description("소액계약거래 api")
.version("1.0.0")
}
}

View File

@@ -0,0 +1,21 @@
package org.home.linkkf.controller
import org.home.linkkf.service.UserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api")
class MainController {
@Autowired
lateinit var userService: UserService
@RequestMapping("/")
fun main(): ResponseEntity<Any> {
return ResponseEntity.ok(userService.getUser("bangae1"))
}
fun add(a: Int, b: Int) = a + b
}

View File

@@ -0,0 +1,52 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "adult", schema = "public")
open class Adult {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "duration")
open var duration: Int? = null
@Column(name = "seek")
open var seek: Int? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Size(max = 300)
@Column(name = "title", length = 300)
open var title: String? = null
@Size(max = 255)
@Column(name = "file_type")
open var fileType: String? = null
@Size(max = 255)
@Column(name = "min")
open var min: String? = null
@Size(max = 255)
@Column(name = "platform")
open var platform: String? = null
@Size(max = 255)
@Column(name = "release_date")
open var releaseDate: String? = null
@Size(max = 255)
@Column(name = "thumb")
open var thumb: String? = null
@Column(name = "url", length = Integer.MAX_VALUE)
open var url: String? = null
}

View File

@@ -0,0 +1,31 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "adult_duration", schema = "public")
open class AdultDuration {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "adult_id")
open var adultId: Int? = null
@Column(name = "duration")
open var duration: Int? = null
@Column(name = "seek")
open var seek: Int? = null
@Column(name = "view")
open var view: Boolean? = null
@Size(max = 20)
@Column(name = "user_id", length = 20)
open var userId: String? = null
}

View File

@@ -0,0 +1,19 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "adult_play", schema = "public")
open class AdultPlay {
@Id
@Size(max = 30)
@Column(name = "user_id", nullable = false, length = 30)
open var userId: String? = null
@Column(name = "adult_id")
open var adultId: Int? = null
}

View File

@@ -0,0 +1,43 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "anime", schema = "public")
open class Anime {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "content", length = Integer.MAX_VALUE)
open var content: String? = null
@Size(max = 100)
@Column(name = "eng_title", length = 100)
open var engTitle: String? = null
@Column(name = "poster", length = Integer.MAX_VALUE)
open var poster: String? = null
@Size(max = 100)
@Column(name = "release_date", length = 100)
open var releaseDate: String? = null
@Column(name = "server_url", length = Integer.MAX_VALUE)
open var serverUrl: String? = null
@Column(name = "thumb", length = Integer.MAX_VALUE)
open var thumb: String? = null
@Size(max = 100)
@Column(name = "title", length = 100)
open var title: String? = null
@Column(name = "upd_date")
open var updDate: Instant? = null
}

View File

@@ -0,0 +1,38 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_character", schema = "public")
open class AnimeCharacter {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "anime_id")
open var animeId: Int? = null
@Size(max = 50)
@Column(name = "name_en", length = 50)
open var nameEn: String? = null
@Size(max = 50)
@Column(name = "name_jp", length = 50)
open var nameJp: String? = null
@Size(max = 50)
@Column(name = "name_kr", length = 50)
open var nameKr: String? = null
@Size(max = 300)
@Column(name = "image", length = 300)
open var image: String? = null
@Size(max = 300)
@Column(name = "thumb", length = 300)
open var thumb: String? = null
}

View File

@@ -0,0 +1,22 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_company", schema = "public")
open class AnimeCompany {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "anime_id")
open var animeId: Int? = null
@Size(max = 50)
@Column(name = "name", length = 50)
open var name: String? = null
}

View File

@@ -0,0 +1,28 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_duration", schema = "public")
open class AnimeDuration {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "duration")
open var duration: Int? = null
@Column(name = "ep_id")
open var epId: Int? = null
@Column(name = "seek")
open var seek: Int? = null
@Size(max = 50)
@Column(name = "user_id", length = 50)
open var userId: String? = null
}

View File

@@ -0,0 +1,37 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_episode", schema = "public")
open class AnimeEpisode {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Size(max = 50)
@Column(name = "air_date", length = 50)
open var airDate: String? = null
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "anime_id", nullable = false)
open var anime: Anime? = null
@Size(max = 50)
@Column(name = "ep", length = 50)
open var ep: String? = null
@Size(max = 50)
@Column(name = "ins_date", length = 50)
open var insDate: String? = null
@Size(max = 200)
@Column(name = "title", length = 200)
open var title: String? = null
@Column(name = "url", length = Integer.MAX_VALUE)
open var url: String? = null
}

View File

@@ -0,0 +1,22 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_genres", schema = "public")
open class AnimeGenre {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "anime_id")
open var animeId: Int? = null
@Size(max = 50)
@Column(name = "name", length = 50)
open var name: String? = null
}

View File

@@ -0,0 +1,20 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_group", schema = "public")
open class AnimeGroup {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "anime_id")
open var anime: Anime? = null
@Size(max = 50)
@Column(name = "name", length = 50)
open var name: String? = null
}

View File

@@ -0,0 +1,30 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size
@Entity
@Table(name = "anime_play", schema = "public")
open class AnimePlay {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@NotNull
@Column(name = "ep_id", nullable = false)
open var epId: Int? = null
@Size(max = 50)
@Column(name = "ins_date", length = 50)
open var insDate: String? = null
@Column(name = "play_url", length = Integer.MAX_VALUE)
open var playUrl: String? = null
@Column(name = "subtitle_url", length = Integer.MAX_VALUE)
open var subtitleUrl: String? = null
}

View File

@@ -0,0 +1,23 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.Size
import org.hibernate.annotations.OnDelete
import org.hibernate.annotations.OnDeleteAction
@Entity
@Table(name = "anime_produce", schema = "public")
open class AnimeProduce {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "anime_id")
open var anime: Anime? = null
@Size(max = 10)
@Column(name = "year", length = 10)
open var year: String? = null
}

View File

@@ -0,0 +1,23 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.Size
import org.hibernate.annotations.OnDelete
import org.hibernate.annotations.OnDeleteAction
@Entity
@Table(name = "anime_subtitle", schema = "public")
open class AnimeSubtitle {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "ep_id")
open var ep: AnimeEpisode? = null
@Size(max = 300)
@Column(name = "subtitle", length = 300)
open var subtitle: String? = null
}

View File

@@ -0,0 +1,49 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "book", schema = "public")
open class Book {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "complete")
open var complete: Boolean? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Column(name = "overview", length = Integer.MAX_VALUE)
open var overview: String? = null
@Size(max = 30)
@Column(name = "platform", length = 30)
open var platform: String? = null
@Size(max = 10)
@Column(name = "scope", length = 10)
open var scope: String? = null
@Size(max = 300)
@Column(name = "thumb", length = 300)
open var thumb: String? = null
@Size(max = 100)
@Column(name = "title", length = 100)
open var title: String? = null
@Size(max = 400)
@Column(name = "url", length = 400)
open var url: String? = null
@Size(max = 30)
@Column(name = "writer", length = 30)
open var writer: String? = null
}

View File

@@ -0,0 +1,17 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
@Entity
@Table(name = "book_content", schema = "public")
open class BookContent {
@Id
@Column(name = "ep_id", nullable = false)
open var id: Int? = null
@Column(name = "content", length = Integer.MAX_VALUE)
open var content: String? = null
}

View File

@@ -0,0 +1,26 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.EmbeddedId
import jakarta.persistence.Entity
import jakarta.persistence.Table
import java.time.Instant
@Entity
@Table(name = "book_duration", schema = "public")
open class BookDuration {
@EmbeddedId
open var id: BookDurationId? = null
@Column(name = "book_id")
open var bookId: Int? = null
@Column(name = "line")
open var line: Int? = null
@Column(name = "view")
open var view: Boolean? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
}

View File

@@ -0,0 +1,35 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Embeddable
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size
import org.hibernate.Hibernate
import java.io.Serializable
import java.util.*
@Embeddable
open class BookDurationId : Serializable {
@NotNull
@Column(name = "ep_id", nullable = false)
open var epId: Int? = null
@Size(max = 20)
@NotNull
@Column(name = "user_id", nullable = false, length = 20)
open var userId: String? = null
override fun hashCode(): Int = Objects.hash(epId, userId)
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || Hibernate.getClass(this) != Hibernate.getClass(other)) return false
other as BookDurationId
return epId == other.epId &&
userId == other.userId
}
companion object {
private const val serialVersionUID = 0L
}
}

View File

@@ -0,0 +1,29 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "book_episode", schema = "public")
open class BookEpisode {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "book_id")
open var bookId: Int? = null
@Column(name = "ep", length = Integer.MAX_VALUE)
open var ep: String? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Size(max = 1)
@Column(name = "kind", length = 1)
open var kind: String? = null
}

View File

@@ -0,0 +1,23 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.Size
import org.hibernate.annotations.OnDelete
import org.hibernate.annotations.OnDeleteAction
@Entity
@Table(name = "book_genres", schema = "public")
open class BookGenre {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "book_id")
open var book: Book? = null
@Size(max = 20)
@Column(name = "name", length = 20)
open var name: String? = null
}

View File

@@ -0,0 +1,31 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size
import org.hibernate.annotations.OnDelete
import org.hibernate.annotations.OnDeleteAction
@Entity
@Table(name = "book_image", schema = "public")
open class BookImage {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "ep_id", nullable = false)
open var ep: BookEpisode? = null
@Size(max = 20)
@NotNull
@Column(name = "filename", nullable = false, length = 20)
open var filename: String? = null
@Size(max = 150)
@NotNull
@Column(name = "img_path", nullable = false, length = 150)
open var imgPath: String? = null
}

View File

@@ -0,0 +1,19 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "craw", schema = "public")
open class Craw {
@Id
@Size(max = 10)
@Column(name = "name", nullable = false, length = 10)
open var name: String? = null
@Column(name = "yn")
open var yn: Boolean? = null
}

View File

@@ -0,0 +1,40 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "drama", schema = "public")
open class Drama {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "view")
open var view: Boolean? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Column(name = "release_date")
open var releaseDate: Instant? = null
@Size(max = 100)
@Column(name = "cover", length = 100)
open var cover: String? = null
@Size(max = 100)
@Column(name = "title", length = 100)
open var title: String? = null
@Size(max = 100)
@Column(name = "url", length = 100)
open var url: String? = null
@Column(name = "overview", length = Integer.MAX_VALUE)
open var overview: String? = null
}

View File

@@ -0,0 +1,28 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.Size
@Entity
@Table(name = "drama_cast", schema = "public")
open class DramaCast {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "drama_id")
open var drama: Drama? = null
@Size(max = 50)
@Column(name = "name", length = 50)
open var name: String? = null
@Size(max = 50)
@Column(name = "\"real\"", length = 50)
open var real: String? = null
@Size(max = 100)
@Column(name = "thumb", length = 100)
open var thumb: String? = null
}

View File

@@ -0,0 +1,32 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "drama_duration", schema = "public")
open class DramaDuration {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "duration")
open var duration: Int? = null
@Column(name = "ep_id")
open var epId: Int? = null
@Column(name = "seek")
open var seek: Int? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Size(max = 255)
@Column(name = "user_id")
open var userId: String? = null
}

View File

@@ -0,0 +1,32 @@
package org.home.linkkf.model
import jakarta.persistence.*
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "drama_episode", schema = "public")
open class DramaEpisode {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "drama_id")
open var drama: Drama? = null
@Column(name = "release_date")
open var releaseDate: Instant? = null
@Size(max = 100)
@Column(name = "referer", length = 100)
open var referer: String? = null
@Size(max = 100)
@Column(name = "thumb", length = 100)
open var thumb: String? = null
@Size(max = 100)
@Column(name = "title", length = 100)
open var title: String? = null
}

View File

@@ -0,0 +1,30 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "favorite", schema = "public")
open class Favorite {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "favorite_id")
open var favoriteId: Int? = null
@Size(max = 4)
@Column(name = "kind", length = 4)
open var kind: String? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Size(max = 20)
@Column(name = "user_id", length = 20)
open var userId: String? = null
}

View File

@@ -0,0 +1,77 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "movie", schema = "public")
open class Movie {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Size(max = 300)
@Column(name = "backdrop_path", length = 300)
open var backdropPath: String? = null
@Column(name = "duration")
open var duration: Int? = null
@Size(max = 10)
@Column(name = "fileext", length = 10)
open var fileext: String? = null
@Size(max = 100)
@Column(name = "filename", length = 100)
open var filename: String? = null
@Size(max = 300)
@Column(name = "filepath", length = 300)
open var filepath: String? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
@Size(max = 10)
@Column(name = "original_language", length = 10)
open var originalLanguage: String? = null
@Column(name = "overview", length = Integer.MAX_VALUE)
open var overview: String? = null
@Column(name = "popularity")
open var popularity: Float? = null
@Size(max = 300)
@Column(name = "poster_path", length = 300)
open var posterPath: String? = null
@Size(max = 20)
@Column(name = "release_date", length = 20)
open var releaseDate: String? = null
@Size(max = 10)
@Column(name = "runtime", length = 10)
open var runtime: String? = null
@Column(name = "seek")
open var seek: Int? = null
@Size(max = 300)
@Column(name = "subtitle", length = 300)
open var subtitle: String? = null
@Column(name = "tagline", length = Integer.MAX_VALUE)
open var tagline: String? = null
@Size(max = 100)
@Column(name = "title", length = 100)
open var title: String? = null
@Column(name = "vote_average")
open var voteAverage: Float? = null
}

View File

@@ -0,0 +1,28 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "movie_duration", schema = "public")
open class MovieDuration {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "duration")
open var duration: Int? = null
@Column(name = "movie_id")
open var movieId: Int? = null
@Column(name = "seek")
open var seek: Int? = null
@Size(max = 20)
@Column(name = "user_id", length = 20)
open var userId: String? = null
}

View File

@@ -0,0 +1,22 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "movie_genres", schema = "public")
open class MovieGenre {
@Id
@Column(name = "gen_id", nullable = false)
open var id: Int? = null
@Column(name = "id")
open var id1: Int? = null
@Size(max = 50)
@Column(name = "name", length = 50)
open var name: String? = null
}

View File

@@ -0,0 +1,30 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
import java.time.Instant
@Entity
@Table(name = "recent", schema = "public")
open class Recent {
@Id
@Column(name = "id", nullable = false)
open var id: Int? = null
@Column(name = "recent_id")
open var recentId: Int? = null
@Size(max = 4)
@Column(name = "kind", length = 4)
open var kind: String? = null
@Size(max = 20)
@Column(name = "user_id", length = 20)
open var userId: String? = null
@Column(name = "ins_date")
open var insDate: Instant? = null
}

View File

@@ -0,0 +1,19 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "sequence", schema = "public")
open class Sequence {
@Id
@Size(max = 255)
@Column(name = "sequence_name", nullable = false)
open var sequenceName: String? = null
@Column(name = "next_val")
open var nextVal: Long? = null
}

View File

@@ -0,0 +1,20 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.Size
@Entity
@Table(name = "urls", schema = "public")
open class Url {
@Id
@Size(max = 30)
@Column(name = "name", nullable = false, length = 30)
open var name: String? = null
@Size(max = 100)
@Column(name = "url", length = 100)
open var url: String? = null
}

View File

@@ -0,0 +1,47 @@
package org.home.linkkf.model
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size
@Entity
@Table(name = "users", schema = "public")
open class User {
@Id
@Size(max = 20)
@Column(name = "user_id", nullable = false, length = 20)
open var userId: String? = null
@Size(max = 40)
@NotNull
@Column(name = "email", nullable = false, length = 40)
open var email: String? = null
@Size(max = 50)
@Column(name = "expire_date", length = 50)
open var expireDate: String? = null
@Size(max = 200)
@NotNull
@Column(name = "password", nullable = false, length = 200)
open var password: String? = null
@Column(name = "refresh_token", length = Integer.MAX_VALUE)
open var refreshToken: String? = null
@Size(max = 10)
@NotNull
@Column(name = "role", nullable = false, length = 10)
open var role: String? = null
@Column(name = "token", length = Integer.MAX_VALUE)
open var token: String? = null
@Size(max = 20)
@NotNull
@Column(name = "user_name", nullable = false, length = 20)
open var userName: String? = null
}

View File

@@ -0,0 +1,7 @@
package org.home.linkkf.repository
import org.home.linkkf.model.Anime
import org.springframework.data.jpa.repository.JpaRepository
interface AnimeRepository : JpaRepository<Anime, Int> {
}

View File

@@ -0,0 +1,7 @@
package org.home.linkkf.repository
import org.home.linkkf.model.User
import org.springframework.data.jpa.repository.JpaRepository
interface UserRepository : JpaRepository<User, String> {
}

View File

@@ -0,0 +1,7 @@
package org.home.linkkf.service
import org.home.linkkf.model.User
interface UserService {
fun getUser(id: String): User
}

View File

@@ -0,0 +1,17 @@
package org.home.linkkf.service.impl
import org.home.linkkf.model.User
import org.home.linkkf.repository.UserRepository
import org.home.linkkf.service.UserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@Service
class UserServiceImpl : UserService {
@Autowired
private lateinit var userRepository: UserRepository
override fun getUser(id : String): User {
return userRepository.findById(id).get()
}
}

View File

@@ -0,0 +1,43 @@
server:
port: 8080
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
jasypt:
encryptor:
key: 2025!
spring:
application:
name: sample
devtools:
livereload:
enabled: true
remote:
restart:
enabled: false
jpa:
show-sql: false
hibernate:
ddl-auto: validate
naming:
physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
open-in-view: false
generate-ddl: true
mvc:
pathmatch:
matching-strategy: ant_path_matcher
datasource:
hikari:
username: bangae1
password: fpdlwms1
connection-timeout: 20000
maximum-pool-size: 30
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 200
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
url: jdbc:log4jdbc:postgresql://hmsn.ink:35432/linkkf
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy

View File

@@ -0,0 +1,3 @@
spring:
profiles:
active: prod

View File

@@ -0,0 +1,3 @@
log.config.path=./logs/
log.config.filename=api_log
log.level=warn

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
<!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다.-->
<springProfile name="prod">
<property resource="logback-prod.properties"/>
</springProfile>
<springProfile name="dev">
<property resource="logback-dev.properties"/>
</springProfile>
<!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
<!-- <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/> -->
<!-- log level -->
<property name="LOG_LEVEL" value="${log.level}"/>
<!-- log file path -->
<property name="LOG_PATH" value="${log.config.path}"/>
<!-- log file name -->
<property name="LOG_FILE_NAME" value="${log.config.filename}"/>
<!-- err log file name -->
<property name="ERR_LOG_FILE_NAME" value="err_log"/>
<!-- pattern -->
<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
<!-- Console Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="org.home.linkkf.config.filter.LoggingFilter"/>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- File Appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="org.home.linkkf.config.filter.LoggingFilter"/>
<!-- 파일경로 설정 -->
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<!-- 출력패턴 설정-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최고 용량 kb, mb, gb -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>30</maxHistory>
<!--<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>-->
</rollingPolicy>
</appender>
<!-- 에러의 경우 파일에 로그 처리 -->
<appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최고 용량 kb, mb, gb -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>60</maxHistory>
</rollingPolicy>
</appender>
<!-- root레벨 설정 -->
<root level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</root>
<!-- 특정패키지 로깅레벨 설정 -->
<logger name="org.springframework" level="WARN" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<!-- log4jdbc 옵션 설정 -->
<logger name="jdbc" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<!-- sql문만 로깅할지 여부 -->
<logger name="jdbc.sqlonly" level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<!-- 쿼리문 수행시간 로깅 여부 -->
<logger name="jdbc.sqltiming" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<!-- ResultSet외 모든 JDBC 호출 정보 로깅할지 여부 -->
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<!-- ResultSet 포함 모든 JDBC 호출 정보를 로깅 -->
<logger name="jdbc.resultset" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<logger name="jdbc.resultsettable" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<!-- connection open close 로깅 여부 -->
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
<logger name="com.zaxxer.hikari.pool.HikariProxyResultSet" level="OFF" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
</configuration>

View File

@@ -0,0 +1,13 @@
package org.home.linkkf
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest
class SampleApplicationTests {
@Test
fun contextLoads() {
}
}