
기능별로 폴더를 만들어 정리하고 있다.
이전 팀 프로젝트에서는 파트별로 폴더를 관리했는데,
차이를 느껴보고 싶어서 이와 같은 방법을 선택했다. (개인 프젝이니까..)

게시물 생성과 모든 게시물 조회, 특정 게시물 조회, 게시물 삭제와 수정
CRUD를 구현했다.

Entity 파일.
게시물의 제목,내용,작성자를 나타낸다. val이 아니라 var로 선언해서 값이 변경될 수 있다.
createdAt으로 생성된 시간을 표기한다.
LocalDateTime.now()를 통해 객체가 생성될 때 현재 시간이 자동 저장된다.
val로 설정해서 이 값은 변경이 당연히 불가능하다.

Service와 Repository 그리고 Dto도 만들어주었다.
게시판 서비스 테스트를 만들었다.
package kotlinProject
import kotlinProject.entity.Post
import kotlinProject.repository.PostRepository
import kotlinProject.service.PostService
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.Mockito.*
import org.mockito.MockitoAnnotations
import java.util.*
class PostServiceTest {
@Mock
private lateinit var postRepository: PostRepository
@InjectMocks
private lateinit var postService: PostService
@BeforeEach
fun setup() {
MockitoAnnotations.openMocks(this)
}
@Test
fun `게시글 생성 테스트`() {
// Given
val title = "테스트 제목"
val content = "테스트 내용"
val author = "테스트 작성자"
val post = Post(id = 1L, title = title, content = content, author = author)
`when`(postRepository.save(any(Post::class.java))).thenReturn(post)
// When
val savedPost = postService.createPost(title, content, author)
// Then
assertNotNull(savedPost)
assertEquals(title, savedPost.title)
assertEquals(content, savedPost.content)
assertEquals(author, savedPost.author)
}
@Test
fun `게시글 단건 조회 테스트`() {
// Given
val post = Post(id = 1L, title = "테스트", content = "테스트 내용", author = "작성자")
`when`(postRepository.findById(1L)).thenReturn(Optional.of(post))
// When
val foundPost = postService.getPostById(1L)
// Then
assertNotNull(foundPost)
assertEquals("테스트", foundPost.title)
}
@Test
fun `게시글 삭제 테스트`() {
// Given
val post = Post(id = 1L, title = "테스트", content = "테스트 내용", author = "작성자")
`when`(postRepository.findById(1L)).thenReturn(Optional.of(post))
doNothing().`when`(postRepository).deleteById(1L) // deleteById()를 모킹
// When
postService.deletePost(1L)
// Then
verify(postRepository, times(1)).deleteById(1L) // deleteById()가 호출되었는지 검증
}
}

회원가입과 로그인 로그아웃 기능을 구현할 것이다.
토큰값을 부여하고, 관리자 계정과 유저 계정을 나눠볼 것이다.
기능 구현도 중요하지만, 이 프로젝트의 주 목적은 학습이다.