1월 17일 개발일지

2024. 1. 17. 11:44스파르타/개발일지

 

 

 

Controller 와 DTO 작성

 

 

이제 Controller 와 DTO 를 Card 와 Commet 를 각각 작성한다.

 

 

 

CardResponse

package com.example.todo.domain.card.dto

data class CardResponse(
    val id: Long,
    val title: String,
    val content: String,
    val name: String,
    val createAt: String
)

 

 

CreateCardRequest

package com.example.todo.domain.card.dto

data class CreateCardRequest (
    val title: String,
    val content: String
)

 

 

UpdateCardRequest

package com.example.todo.domain.card.dto

class UpdateCardRequest (
    val title: String,
    val content: String
)

 

 

CardController

package com.example.todo.domain.card.controller

import com.example.todo.domain.card.dto.CardResponse
import com.example.todo.domain.card.dto.CreateCardRequest
import com.example.todo.domain.card.dto.UpdateCardRequest
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RequestMapping("/todos")
@RestController
class CardController {

    @GetMapping
    fun getCardList(): ResponseEntity<List<CardResponse>> {
        TODO()
    }

    @GetMapping("/{todosId}")
    fun getCard(@PathVariable todosId: Long
    ): ResponseEntity<CardResponse> {
        TODO()
    }

    @PostMapping
    fun createCard(
        @RequestBody createCardRequest: CreateCardRequest
    ): ResponseEntity<CardResponse> {
        TODO()
    }

    @PutMapping("/{todosId}")
    fun updateCard(
        @PathVariable todosId: Long,
        @RequestBody updateCardRequest: UpdateCardRequest
    ): ResponseEntity<CardResponse> {
        TODO()
    }

    @DeleteMapping("/{todosId}")
    fun deleteCard(@PathVariable todosId: Long){
        TODO()
    }

}

 

 

 

 

 


 

 

CommentResponse

package com.example.todo.domain.comment.dto

data class CommentResponse (
    val id : Long,
    val content : String
)

 


AddCommentRequest

package com.example.todo.domain.comment.dto

data class AddCommentRequest (
    val content: String
)

 

 

UpdateCommentRequest

package com.example.todo.domain.comment.dto

data class UpdateCommentRequest (
    val content: String
)

 

 

 

 

 

여기까지 Controller 와 DTO를 작성하면서 첫번째 요청을 처리하고, 응답을 주는 것을 구현하였다.


 

 

트랜잭션(Transaction)

트랙잭션은 데이터베이스와 같은 지속적인 데이터 저장소에 수행되는 작업의 논리적인 실행 단위를 나타낸다.

트랜잭션은 여러 단계의 작업을 논리적으로 묶어서 모두 성공할 때만 커밋하고,

하나라도 실패하면 롤백하여 이전 상태로 되돌리는 목적을 가지고 있다.

이는 데이터 일관성을 유지하고 데이터 베이스의 무결성을 보장하기 위한 핵심적인 개념 중 하나이다.

 

 

 

트랜잭션의 특성

트랜잭션은 ACID(Atomicity, Consistency, Isolation, Durability) 의 특성을 갖고 있다.

 

원자성(Atomicity) : 트랜잭션은 원자적(atomic)이어야 한다.

이는 트랜잭션 내에서 수행되는 모든 작업이 일관성 있게 수행되거나 전혀 수행되지 않음을 의미한다.

즉 모든 작업이 성공하면 트랜잭션은 커밋되고, 하나라도 실패하면 트랜잭션은 롤백되어야 한다.

 

일관성(Consistency) : 트랜잭션이 실행되기 전과 실행된 후에는 일관된 상태를 유지해야 한다.

트랜잭션이 성공적으로 완료되면 데이터베이스는 일관된 상태로 유지되어야 한다.

여기서 일관된 상태란, 데이터베이스의 제약이나 규칙을 만족해야 한다는 의미이다,

 

고립성(Isolation) : 트랜잭션은 다르 트랜잭션으로부터 격리되어야 한다.

하나의 트랜잭션이 실행 중일 때, 다른 트랜잭션에서는 해당 트랜잭션의 변경 내용을 볼 수 없어야 한다.

예외적으로, 고립성 수준(Isolation Level)을 설정할 수 있다.

 

지속성(Durability) : 트랜잭션이 성공적으로 완료되면 결과는 영구적으로 저장되어야 한다.

이는 시스템 장애가 발생하더라도 트랜잭션의 결과가 보존되어야 함을 의미한다.

 

 

 

 

 

Spring은 @Transactional 어노테이션을 제공하여 트랜잭션을 관리한다.

일반적으로 Method에 적용이 되며, 해당 Method 에서는 한 트랜잭션 내에서 실행된다고 선언한다.

Class에 적용한다면 Class 내 Method 전체에 적용이 된다.

 

 

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void performTransactionalOperation() {
        // 트랜잭션 내에서 수행될 작업
    }
}

 

 

 

 

 


 

Service 작성하기

 

 

 

 

 

CardService

package com.example.todo.domain.card.service

import com.example.todo.domain.card.dto.CardResponse
import com.example.todo.domain.card.dto.CreateCardRequest
import com.example.todo.domain.card.dto.UpdateCardRequest

interface CardService {

    fun getlAllCardList(): List<CardResponse>

    fun getCardById (todosId: Long): CardResponse

    fun creatCard (request: CreateCardRequest): CardResponse

    fun updateCard (todosId: Long, request: UpdateCardRequest): CardResponse

    fun deleteCard (todosId: Long)
}

 

 

CardServiceImpl

package com.example.todo.domain.card.service

import com.example.todo.domain.card.dto.CardResponse
import com.example.todo.domain.card.dto.CreateCardRequest
import com.example.todo.domain.card.dto.UpdateCardRequest
import org.springframework.stereotype.Service

@Service
class CardServiceImpl: CardService {
    override fun getlAllCardList(): List<CardResponse> {
        // TODO: DB에서 모든 CARD 목록을 조회하여 CardResponse 목록으로 변환 후 반환
        TODO("Not yet implemented")
    }

    override fun getCardById(todosId: Long): CardResponse {
        // TODO: DB에서 ID 기반으로 CARD 를 가져와서 CardResponse로 변환 후 반환
        TODO("Not yet implemented")
    }

    override fun creatCard(request: CreateCardRequest): CardResponse {
       // TODO: request를 Card로 변환 후 저장
        TODO("Not yet implemented")
    }

    override fun updateCard(todosId: Long, request: UpdateCardRequest): CardResponse {
       // TODO: DB에서 todosId에 해당하는 card를 가져와서 request기반으로 업데이트 후 db에 저장, 결과를 CardResponse로 변환 후 반환
        TODO("Not yet implemented")
    }

    override fun deleteCard(todosId: Long) {
        // TODO: DB에서 todosId에 해당하는 Card를 삭제, 연관된 CardApplication과 Comment도 모두 삭제
        TODO("Not yet implemented")
    }

}

 

 

 

 


CardService 와 CardController 연결하기

 

 

 

 

 

 

CardController

package com.example.todo.domain.card.controller

import com.example.todo.domain.card.dto.CardResponse
import com.example.todo.domain.card.dto.CreateCardRequest
import com.example.todo.domain.card.dto.UpdateCardRequest
import com.example.todo.domain.card.service.CardService
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RequestMapping("/todos")
@RestController
class CardController(
    private val cardService: CardService
) {

    @GetMapping
    fun getCardList(): ResponseEntity<List<CardResponse>> {
        return ResponseEntity
            .status(HttpStatus.OK)
            .body(cardService.getAllCardList())
    }

    @GetMapping("/{todosId}")
    fun getCard(@PathVariable todosId: Long
    ): ResponseEntity<CardResponse> {
        return ResponseEntity.status(HttpStatus.OK)
            .body(cardService.getCardById(todosId))
    }

    @PostMapping
    fun createCard(
        @RequestBody createCardRequest: CreateCardRequest
    ): ResponseEntity<CardResponse> {
        return ResponseEntity
            .status(HttpStatus.OK)
            .body(cardService.createCard(createCardRequest))
    }

    @PutMapping("/{todosId}")
    fun updateCard(
        @PathVariable todosId: Long,
        @RequestBody updateCardRequest: UpdateCardRequest
    ): ResponseEntity<CardResponse> {
        return ResponseEntity
            .status(HttpStatus.OK)
            .body(cardService.updateCard(todosId,updateCardRequest))
    }

    @DeleteMapping("/{todosId}")
    fun deleteCard(@PathVariable todosId: Long): ResponseEntity<Unit> {
        cardService.deleteCard(todosId)
        return ResponseEntity
            .status(HttpStatus.NO_CONTENT)
            .build()
    }

}

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'스파르타 > 개발일지' 카테고리의 다른 글

2월 20일 개발일지  (0) 2024.02.20
1월 29일 개발일지  (0) 2024.01.29
1월 16일 개발일지  (0) 2024.01.16
1월 15일 개발일지  (0) 2024.01.15
1월 12일 개발일지  (0) 2024.01.12