간단한 API를 직접 만들어보자 (3)
2024. 5. 17. 17:13ㆍTIL
🎯 오늘 진행한 내용
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> {
}
CardRepository가 JpaRepository를 상속받음으로서 기본적인 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 -
'TIL' 카테고리의 다른 글
(SQL) 식품 종류별 비싼 식품 정보 조회하기 (0) | 2024.05.19 |
---|---|
(알고리즘) 과일장수 (0) | 2024.05.18 |
간단한 API를 직접 만들어보자(2) (0) | 2024.05.16 |
간단한 API를 직접 만들어보자(1) (0) | 2024.05.15 |
알고리즘(푸드 파이트 대회) (0) | 2024.05.14 |