간단한 API를 직접 만들어보자 (3)

2024. 5. 17. 17:13TIL

 

🎯 오늘 진행한 내용

 

card의 정보를 저장하기 위해 repository를 작성

package org.example.spartatodolist.domain.card.repository

import org.example.spartatodolist.domain.card.model.Card
import org.springframework.data.jpa.repository.JpaRepository

interface CardRepository: JpaRepository<Card,Long> {
}

 

CardRepositoryJpaRepository를 상속받음으로서 기본적인 CRUD 함수를 자동적으로 사용할 수 있게 된다

JpaRepository Interface는

  • save() : 엔티티 저장
  • findById() : Id기반으로 엔티티 찾기
  • findAll() : 모든 엔티티 반환
  • delete() : 해당 엔티티 삭제

이러한 유용한 함수를 포함하고 있기때문에 JpaRepository를 상속받아서 해당 함수를 사용할 수 있다.

 

이제 repository작성을 했으니 실제 비즈니스 로직을 구현하는 serive layer의 함수를 완성 시키자

@Service
class CardServiceImpl(
    private val cardRepository: CardRepository,
    private val userRepository: UserRepository
):CardService {
    override fun getAllCardList(): List<CardResponse> {
        return cardRepository.findAll().map{ it.toResponse() }
    }

    override fun getCardById(cardId: Long): CardResponse {
        val card=cardRepository.findByIdOrNull(cardId) ?: throw ModelNotFoundException("Card",cardId)
        return card.toResponse()
    }

    @Transactional
    override fun createCard(request: CreateCardRequest): CardResponse {
        return cardRepository.save(
            Card(
                title = request.title,
                description= request.description,
            )
        ).toResponse()
    }

    @Transactional
    override fun updateCard(cardId: Long, request: UpdateCardRequest): CardResponse {
        val card=cardRepository.findByIdOrNull(cardId) ?: throw ModelNotFoundException("Card",cardId)
        val(title,description) = request

        card.title=title
        card.description=description

        return cardRepository.save(card).toResponse()
    }

    @Transactional
    override fun deleteCard(cardId: Long) {
        val card=cardRepository.findByIdOrNull(cardId)?: throw ModelNotFoundException("Card",cardId)
        cardRepository.delete(card)
    }
}

각 함수는 예외처리가 발생할 수 있는 상황에서는 예외처리를 발생시키고 조회하거나 repository로 엔티티를 저장, 수정 그리고 삭제하는 기능을 구현하고 있다. 

 

user service도 마찬가지로

@Service
class UserServiceImpl(private val userRepository: UserRepository) :UserService {

    @Transactional
    override fun signUp(request: SignUpRequest): UserResponse {
        if(userRepository.existsByLoginId(request.loginId)){
            throw IllegalArgumentException("ID is already exists")
        }

        return userRepository.save(
            User(
                loginId=request.loginId,
                loginPassword=request.loginPassword,
                profile= Profile(
                    loginNickname=request.loginNickname
                ),
                role=when(request.role){
                    UserRole.ADMIN.name -> UserRole.ADMIN
                    UserRole.NORMAL.name -> UserRole.NORMAL
                    else -> throw IllegalArgumentException("Invalid role")
                }
            )
        ).toResponse()
    }

    @Transactional
    override fun updateUserProfile(userId: Long, request: UpdateUserProfileRequest): UserResponse {
        val user=userRepository.findByIdOrNull(userId)?: throw ModelNotFoundException("User",userId)
        user.profile=Profile(
            loginNickname = request.loginNickname
        )
        return userRepository.save(user).toResponse()
    }

}

userRepository를 생성자로 받아 JpaRepository의 기능인 save(), findById() 등을 사용하여 기능을 구현한다.

 

 

이제 완성한 API를 Swagger로 테스트해보자

http://localhost:8080/swagger-ui/index.html#/

 

Error: response status is 500 이라는 오류가 나온것을 확인할 수 있다.

아마 DataBase와 연결하는 과정에서 문제가 생긴 듯 하는것으로 보인다

 

 

다음 TIL 작성때에는 이러한 오류를 바로잡는 내용을 작성할 예정이다.

 

 

📓 오늘의 한줄

"Your greatness is limited only by the investments you make in yourself."

- Grant Cardone -