본문 바로가기

카테고리 없음

24.02.02 복습4

@RestController
@RequestMapping("/posts")
class PostController(private val postService: PostService) {

@PostMapping
fun createPost(@RequestBody createPostRequest: PostCreateDto, @RequestHeader("Authorization") token: String): ResponseEntity<PostDto> {
    val post = postService.createPost(createPostRequest, token)
    val postDto = PostDto.from(post)
    return ResponseEntity.ok().body(postDto)
}

@GetMapping("/{postId}")
fun getPost(@PathVariable postId: Long): ResponseEntity<PostDto> {
    val post = postService.getPost(postId)
    val postDto = PostDto.from(post)
    return ResponseEntity.ok().body(postDto)
}

@GetMapping
fun getAllPosts(): ResponseEntity<List<PostDto>> {
    val posts = postService.getAllPosts()
    val postDtos = posts.map { PostDto.from(it) }
    return ResponseEntity.ok().body(postDtos)
}

@PutMapping("/{postId}")
fun updatePost(@PathVariable postId: Long, @RequestBody updatePostRequest: PostUpdateDto, @RequestHeader("Authorization") token: String): ResponseEntity<PostDto> {
    val post = postService.updatePost(postId, updatePostRequest, token)
    val postDto = PostDto.from(post)
    return ResponseEntity.ok().body(postDto)
}

@DeleteMapping("/{postId}")
fun deletePost(@PathVariable postId: Long, @RequestHeader("Authorization") token: String): ResponseEntity<Void> {
    postService.deletePost(postId, token)
    return ResponseEntity.noContent().build()
}
}

여기에서 여기에서 from안의 post, it이 빨간줄 타입 불일치로 떠서 알아본 결과

 

서비스 임플에     fun deletePost(id: Long, token: String)를 넣어서 토큰을 인식 시키면 post의 불일치는 사라지고 it은

@GetMapping
fun getAllPosts(): ResponseEntity<List<PostDto>> {
    val postDtos = postService.getAllPosts()
    return ResponseEntity.ok().body(postDtos)
}

이렇게 하면 사라진다. 그 외에도 여러 오류들이 있었는데, override에 빨간줄이 처져있었는데, token을 빼먹어서 그랬다건가, 한쪽에 빨간줄이 그어진걸 해결하자 다른쪽에도 그어지는 무한루프가 발생해서 디버그를 돌린뒤 나온 에러 내용을 검색해서 알아낸다던가 토큰이 있어야하는데 없애라고 뜬다던가 그래서 다시 디버그를 돌린다던가 해서해결한 결과,

 

바뀐 컨트롤러를 보면

package com.example.demo.controller

import com.example.demo.dto.PostCreateDto
import com.example.demo.dto.PostDto
import com.example.demo.dto.PostUpdateDto
import com.example.demo.model.Post
import com.example.demo.service.PostService
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/posts")
class PostController(private val postService: PostService) {

    @PostMapping
    fun createPost(
        @RequestBody createPostRequest: PostCreateDto,
        @RequestHeader("Authorization") token: String
    ): ResponseEntity<Post> {
        val postDto = postService.createPost(createPostRequest, token)
        return ResponseEntity.ok().body(postDto)
    }

    @GetMapping("/{postId}")
    fun getPost(@PathVariable postId: Long): ResponseEntity<PostDto> {
        val postDto = postService.getPost(postId)
        return ResponseEntity.ok().body(postDto)
    }

    @PutMapping("/{postId}")
    fun updatePost(
        @PathVariable postId: Long,
        @RequestBody updatePostRequest: PostUpdateDto,
        @RequestHeader("Authorization") token: String
    ): ResponseEntity<Post> {
        val postDto = postService.updatePost(postId, updatePostRequest, token)
        return ResponseEntity.ok().body(postDto)
    }

    @GetMapping
    fun getAllPosts(): ResponseEntity<List<PostDto>> {
        val postDtos = postService.getAllPosts()
        return ResponseEntity.ok().body(postDtos)
    }


    @DeleteMapping("/{postId}")
    fun deletePost(@PathVariable postId: Long, @RequestHeader("Authorization") token: String): ResponseEntity<Void> {
        postService.deletePost(postId, token)  // token 매개변수를 추가합니다.
        return ResponseEntity.noContent().build()
    }
}

서비스는 이렇게

package com.example.demo.service

import com.example.demo.dto.PostCreateDto
import com.example.demo.dto.PostDto
import com.example.demo.dto.PostUpdateDto
import com.example.demo.model.Post

interface PostService {
    fun createPost(createPostRequest: PostCreateDto, token: String): Post
    fun getPost(id: Long): PostDto
    fun getAllPosts(): List<PostDto>
    fun updatePost(id: Long, updatePostRequest: PostUpdateDto, token: String): Post
    fun deletePost(postId: Long, token: String)
}

 

package com.example.demo.service

import com.example.demo.dto.PostCreateDto
import com.example.demo.dto.PostDto
import com.example.demo.dto.PostUpdateDto
import com.example.demo.jwt.JwtPlugin
import com.example.demo.model.Post
import com.example.demo.repository.MemberRepository
import com.example.demo.repository.PostRepository
import org.springframework.stereotype.Service

@Service
class PostServiceImpl(
    private val postRepository: PostRepository,
    private val jwtPlugin: JwtPlugin,
    private val memberRepository: MemberRepository
): PostService {
    override fun createPost(createPostRequest: PostCreateDto, token: String): Post {
        // 토큰 검사
        val nickName = jwtPlugin.validateToken(token)

        // 토큰에 담긴 닉네임으로 사용자 조회
        val member = memberRepository.findByNickName(nickName.toString())
            ?: throw IllegalArgumentException("유효하지 않은 사용자입니다.")

        // 제목과 내용의 길이 검사
        if (createPostRequest.title.length > 500) {
            throw IllegalArgumentException("제목은 500자를 초과할 수 없습니다.")
        }

        if (createPostRequest.content.length > 5000) {
            throw IllegalArgumentException("내용은 5000자를 초과할 수 없습니다.")
        }

        // 게시글 작성
        val post = Post(
            title = createPostRequest.title,
            nickname = member.nickName,
            content = createPostRequest.content,
        )

        return postRepository.save(post)
    }

    override fun getPost(postId: Long): PostDto {
        val post = postRepository.findById(postId)
            .orElseThrow { IllegalArgumentException("해당 id의 게시글이 존재하지 않습니다.") }

        return PostDto.from(post)
    }

    override fun getAllPosts(): List<PostDto> {
        val posts = postRepository.findAllByOrderByCreatedAtDesc()
        return posts.map { PostDto.from(it) }
    }

    override fun updatePost(postId: Long, updatePostRequest: PostUpdateDto, token: String): Post {
        // 토큰 검사
        val nickName = jwtPlugin.validateToken(token)

        // 토큰에 담긴 닉네임으로 사용자 조회
        val member = memberRepository.findByNickName(nickName.toString())
            ?: throw IllegalArgumentException("유효하지 않은 사용자입니다.")

        // 게시글 조회
        val post = postRepository.findById(postId)
            .orElseThrow { IllegalArgumentException("해당 게시글이 존재하지 않습니다.") }

        // 사용자 검사
        if (post.nickname != member.nickName) {
            throw IllegalArgumentException("본인이 작성한 게시글만 수정할 수 있습니다.")
        }

        // 게시글 수정
        post.title = updatePostRequest.title
        post.content = updatePostRequest.content

        return postRepository.save(post)
    }

    override fun deletePost(postId: Long, token: String) {
        // 토큰 검사
        val nickName = jwtPlugin.validateToken(token)

        // 토큰에 담긴 닉네임으로 사용자 조회
        val member = memberRepository.findByNickName(nickName.toString())
            ?: throw IllegalArgumentException("유효하지 않은 사용자입니다.")

        // 게시글 조회
        val post = postRepository.findById(postId)
            .orElseThrow { IllegalArgumentException("해당 게시글이 존재하지 않습니다.") }

        // 사용자 검사
        if (post.nickname != member.nickName) {
            throw IllegalArgumentException("본인이 작성한 게시글만 삭제할 수 있습니다.")
        }

        // 게시글 삭제
        postRepository.deleteById(postId)
    }
}

 

 

interface PostRepository : JpaRepository<Post, Long> {
    fun findAllByOrderByCreatedAtDesc(): List<Post>
}

리포지터리도 하나로 줄인다.

 

그러면 이제 post는 완성이다. 이제 댓글을 만들면 된다.