Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM adoptopenjdk/openjdk11:latest

ARG HEAP_SIZE
ENV HEAP_SIZE=${HEAP_SIZE:-512M}
ARG NEW_SIZE
ENV NEW_SIZE=${NEW_SIZE:-256M}

ADD . .

RUN ["./gradlew", "clean", "build", "-x","test"]

ENTRYPOINT java -server -Xms${HEAP_SIZE} -Xmx${HEAP_SIZE} -XX:NewSize=${NEW_SIZE} -XX:MaxNewSize=${NEW_SIZE} -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -jar /build/libs/springwebproject-0.0.1-SNAPSHOT.jar
17 changes: 16 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.3.2.RELEASE"
id("io.spring.dependency-management") version "1.0.9.RELEASE"
id("org.jetbrains.kotlin.plugin.allopen") version "1.3.61"
id("org.jetbrains.kotlin.plugin.jpa") version "1.3.61"
id( "org.jetbrains.kotlin.plugin.noarg") version "1.3.61"
kotlin("jvm") version "1.3.72"
kotlin("plugin.spring") version "1.3.72"
}
Expand All @@ -16,17 +19,28 @@ repositories {
}

dependencies {
implementation("com.h2database:h2")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
testImplementation("org.assertj:assertj-core:3.13.2")
}

allOpen {
annotation("javax.persistence.Entity")
annotation("javax.persistence.MappedSuperclass")
annotation("javax.persistence.Embeddable")
}

tasks.withType<Test> {
useJUnitPlatform()
useJUnitPlatform {
includeTags("fast")
}
}

tasks.withType<KotlinCompile> {
Expand All @@ -35,3 +49,4 @@ tasks.withType<KotlinCompile> {
jvmTarget = "11"
}
}

46 changes: 46 additions & 0 deletions deploy/mark.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: mark-app
namespace: mark-space
labels:
app: mark-app
spec:
selector:
matchLabels:
app: mark-app
replicas: 1
template:
metadata:
labels:
app: mark-app
spec:
containers:
- name: mark-app
image: idock.daumkakao.io/mark-d2hub/mark-repository:latest
imagePullPolicy: Always
resources:
limits:
cpu: 1
memory: 300Mi
requests:
cpu: 1
memory: 1Gi
ports:
- containerPort: 8080
env:
- name: application_name
value: mark-app
- name: instance_name
value: "8080"
readinessProbe:
httpGet:
path: /health_check.html
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
lifecycle:
preStop:
exec:
command: ["/bin/sleep","2"]
terminationGracePeriodSeconds: 60
Binary file added kotlinweb/test.mv.db
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.kotlinweb.board.controller
import com.example.kotlinweb.board.model.Post
import com.example.kotlinweb.board.service.BoardService
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*

@RestController
class BoardController(private val boardService: BoardService) {

@GetMapping(value = ["/board"])
fun findAllPosts(): ResponseEntity<Any> {
return ResponseEntity(boardService.findPosts(), HttpStatus.OK);
}

@PostMapping(value = ["/board"])
fun savePost(@RequestBody post: Post): ResponseEntity<Any> {
println("hello")
return ResponseEntity(boardService.savePost(post), HttpStatus.CREATED);
}

@PutMapping(value = ["/board/{id}"])
fun updatePost(@RequestBody post: Post, @PathVariable id: String): ResponseEntity<Any> {
return ResponseEntity(boardService.updatePost(post), HttpStatus.OK);
}

@DeleteMapping(value = ["/board"])
fun deletePost(@RequestBody post: Post): ResponseEntity<Any> {
Copy link
Member

@kkw01234 kkw01234 Aug 23, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

근데 delete는 body지원 안하지 않나요? (잘 모름..)

return ResponseEntity(boardService.deletePost(post), HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.example.kotlinweb.board.event

import com.example.kotlinweb.board.model.Post
import javax.persistence.*


class PostEntityListener {

@PostLoad
fun postLoad(post: Post?) {
println("post load: $post")
}

@PrePersist
fun prePersist(post: Post?) {
println("pre persist: $post")
}

@PostPersist
fun postPersist(post: Post?) {
println("post persist: $post")
}

@PreUpdate
fun preUpdate(post: Post?) {
println("pre update: $post")
}

@PostUpdate
fun postUpdate(post: Post?) {
println("post update: $post")
}

@PreRemove
fun preRemove(post: Post?) {
println("pre remove: $post")
}

@PostRemove
fun postRemove(post: Post?) {
println("post remove: $post")
}
}
14 changes: 14 additions & 0 deletions src/main/kotlin/com/example/kotlinweb/board/event/PostSaveEvent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.kotlinweb.board.event

data class PostSaveEvent(
private val postId: Long,
private val message: String
) {
fun getPostId(): Long {
return postId
}

fun getMessage(): String {
return message
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.kotlinweb.board.event

import com.example.kotlinweb.board.model.Notify
import com.example.kotlinweb.board.service.NotifyDTO
import com.example.kotlinweb.board.service.NotifyService
import org.springframework.context.event.EventListener
import org.springframework.stereotype.Component
import org.springframework.transaction.event.TransactionPhase
import org.springframework.transaction.event.TransactionalEventListener

@Component
class PostSaveEventHandler(
private val notifyService: NotifyService
) {
// @EventListener
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
fun postSaveEventListener(event: PostSaveEvent) {
println("Event Listen")
notifyService.saveNotify(Notify.of(event.getPostId().toString(), event.getMessage()))
notifyService.sendNotify(NotifyDTO(event.getMessage(), "0"))
}
}
37 changes: 37 additions & 0 deletions src/main/kotlin/com/example/kotlinweb/board/model/Notify.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.example.kotlinweb.board.model

import org.hibernate.annotations.CreationTimestamp
import org.hibernate.annotations.UpdateTimestamp
import java.time.LocalDateTime
import javax.persistence.*


@Entity
class Notify(

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long?,

@Column
var postId: String,

@Column
val message: String

) {
companion object {
fun of(postId: String, message: String): Notify {
return Notify(null, postId, message)
}
}

@Column
@CreationTimestamp
lateinit var createDate: LocalDateTime

@Column
@UpdateTimestamp
lateinit var updateDate: LocalDateTime

}
36 changes: 36 additions & 0 deletions src/main/kotlin/com/example/kotlinweb/board/model/Post.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.example.kotlinweb.board.model

import com.example.kotlinweb.board.event.PostEntityListener
import org.hibernate.annotations.CreationTimestamp
import org.hibernate.annotations.UpdateTimestamp
import java.time.LocalDateTime
import javax.persistence.*

@Entity
@EntityListeners(PostEntityListener::class)
class Post(

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
@Column
var title: String,
@Column
val writer: String,
@Column
var text: String

) {
@Column
var hitCount: Int = 0

@Column
@CreationTimestamp
lateinit var createDate: LocalDateTime

@Column
@UpdateTimestamp
lateinit var updateDate: LocalDateTime

fun increaseHitCount() = hitCount++
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.kotlinweb.board.repository

import com.example.kotlinweb.board.model.Notify
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

@Repository
interface NotifyRepository : JpaRepository<Notify, Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.kotlinweb.board.repository

import com.example.kotlinweb.board.model.Post
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

@Repository
interface PostRepository : JpaRepository<Post, Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.example.kotlinweb.board.service

import com.example.kotlinweb.board.event.PostSaveEvent
import com.example.kotlinweb.board.model.Post
import com.example.kotlinweb.board.repository.PostRepository
import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional


@Service
class BoardService(
private val postRepository: PostRepository,
private val applicationEventPublisher: ApplicationEventPublisher
) {

@Transactional
fun savePost(post: Post) {
postRepository.save(post)
applicationEventPublisher.publishEvent(PostSaveEvent(post.id, "게시글 작성이 완료 되었습니다."))
}

@Transactional(readOnly = true)
fun findPostById(id: Long): Post? {
return postRepository.findByIdOrNull(id)
}

@Transactional(readOnly = true)
fun findPosts(): MutableList<Post> {
return postRepository.findAll()
}

@Transactional
fun updatePost(post: Post) {
print(post.toString())
var foundPost: Post = postRepository.findByIdOrNull(post.id) as Post
foundPost.text = post.text
foundPost.title = post.title
}

@Transactional
fun deletePost(post: Post) {
var foundPost: Post = postRepository.findById(post.id) as Post
foundPost?.let {
postRepository.delete(post)
}
}
}
Loading