Development/Spring Boot3 (Kotlin)
[Kotlin][SpringBoot3] Kopring 서버 기본 실습 13 - 새로운 프로젝트 파서 깔끔한 조회, 저장, 수정 기능 api 구현 소스코드 예제
Tradgineer
2023. 9. 26. 16:35
1. 이전 포스팅
https://growingsaja.tistory.com/984
2. 목표
- 이용자 데이터 조회, 회원가입, 수정 기능 다양한 방법으로 구현
3. 프로젝트 구조
4. api의 response 기본 세팅 entity 소스코드 작성
// vim StatusOfResponse.kt
package com.dev.mims.base.entities
import java.time.LocalDateTime
data class StatusOfResponse(
var code: String,
var message: String,
val timestamp: LocalDateTime = LocalDateTime.now()
)
5. user 관련 entity들 만들기
- 테이블 생성
// vim UserInfo.kt
package com.dev.mims.user.entities
import jakarta.persistence.Entity
import jakarta.persistence.Id
import java.time.LocalDateTime
@Entity
data class UserInfo(
@Id
val id: Int,
var name: String,
val number: String,
val createdAt: LocalDateTime = LocalDateTime.now()
)
- 기본 insert 데이터 설정
// vim UserInfoInitialData.kt
package com.dev.mims.user.entities
import com.dev.mims.user.repositories.UserInfoRepository
import jakarta.annotation.PostConstruct
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
@Component
class UserInfoInitialData @Autowired constructor(private val userInfoRepository: UserInfoRepository) {
@PostConstruct
fun loadData() {
val initialUserInfoData = listOf(
UserInfo(1, "홍길동", "010-2313-1111")
)
userInfoRepository.saveAll(initialUserInfoData)
}
}
- user 관련 api의 response 데이터 entity 설정
// vim UserInfoResponse.kt
package com.dev.mims.user.entities
import com.dev.mims.base.entities.StatusOfResponse
data class UserInfoResponse(
var status: StatusOfResponse,
var result: UserInfo?
)
- user name 변경하기 기능 구현에 필요한 entity 설정
// vim ChangeUsername.kt
package com.dev.mims.user.entities
data class ChangeUsername(
val id: Int,
val name: String
)
6. repository 소스코드 작성
// vim UserInfoRepository.kt
package com.dev.mims.user.repositories
import com.dev.mims.user.entities.UserInfo
import org.springframework.data.jpa.repository.JpaRepository
interface UserInfoRepository: JpaRepository<UserInfo, Int> {
fun findByNumber(number: String): UserInfo?
fun findFirstByOrderByIdDesc(): UserInfo?
}
7. Service 소스코드 작성
// vim UserInfoService.kt
package com.dev.mims.user.services
import com.dev.mims.base.entities.StatusOfResponse
import com.dev.mims.user.entities.UserInfo
import com.dev.mims.user.entities.UserInfoResponse
import com.dev.mims.user.repositories.UserInfoRepository
import org.springframework.stereotype.Service
@Service
class UserInfoService(private val userInfoRepository: UserInfoRepository) {
fun getUserInfoById(id: Int): UserInfoResponse {
val userInfo = userInfoRepository.findById(id).orElse(null)
return if (userInfo != null) {
UserInfoResponse(
StatusOfResponse("000", "exist"),
userInfo
)
} else {
UserInfoResponse(
StatusOfResponse("E001", "not exist"),
userInfo
)
}
}
fun createUserInfo(name: String, number: String): UserInfoResponse {
val alreadyExistUser = userInfoRepository.findByNumber(number)
return if (alreadyExistUser == null) {
val maxId = userInfoRepository.findFirstByOrderByIdDesc()?.id
val createdUser = UserInfo(maxId?.plus(1) ?: 1, name, number)
UserInfoResponse(
StatusOfResponse("000", "success make"),
userInfoRepository.save(createdUser)
)
} else {
// 이미 가입된 유저인 경우
UserInfoResponse(
StatusOfResponse("400", "Already Signed Up Number"),
alreadyExistUser
)
}
}
fun updateUserName(id: Int, name: String): UserInfoResponse {
val existUser = userInfoRepository.findById(id).orElse(null)
return if (existUser != null) {
existUser.name = name
UserInfoResponse(
StatusOfResponse("000", "success update"),
userInfoRepository.save(existUser)
)
} else {
// 이용자가 없는 경우
UserInfoResponse(
StatusOfResponse("400", "not exist user"),
existUser
)
}
}
}
8. 이용자 정보 조회, 생성, 수정 기능 controller 소스코드 작성
- 이용자 정보 수정 기능의 경우, 아래와 같이 다양한 형식의 api로 구현 가능합니다.
본 예제에서는 4가지 방법을 소개합니다.
package com.dev.mims.user.controllers
import com.dev.mims.user.entities.ChangeUsername
import com.dev.mims.user.entities.UserInfoResponse
import com.dev.mims.user.services.UserInfoService
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.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/v1/users")
class UserInfoController(
private val userInfoService: UserInfoService
) {
// 1명의 이용자 정보 조회
@GetMapping("/{id}")
fun getUserInfoById(
@PathVariable id: Int
): UserInfoResponse {
return userInfoService.getUserInfoById(id)
}
// 1명의 이용자 정보 저장 = 회원가입
@PostMapping("/signup")
fun createUserInfo(
@RequestParam name: String,
@RequestParam number: String
): UserInfoResponse {
return userInfoService.createUserInfo(name, number)
}
// 이용자 정보 수정 방법1 - use "PathVariable"
@PostMapping("/update/username/{id}/{name}")
fun updateUsernameById(
@PathVariable id: Int,
@PathVariable name: String
): UserInfoResponse {
return userInfoService.updateUserName(id, name)
}
// 이용자 정보 수정 방법2 - use "RequestParam"
@PostMapping("/update/username/withparm")
fun updateUsernameByIdWithParm(
@RequestParam id: Int,
@RequestParam name: String
): UserInfoResponse {
return userInfoService.updateUserName(id, name)
}
// 이용자 정보 수정 방법3 - use "PathVariable, RequestParam"
@PostMapping("/update/username/{id}")
fun updateUsernameByIdWithMix(
@PathVariable id: Int,
@RequestParam name: String
): UserInfoResponse {
return userInfoService.updateUserName(id, name)
}
// 이용자 정보 수정 방법4 - use "RequestBody"
@PostMapping("/update/username/withbody")
fun updateUsernameByIdWithBody(
@RequestBody changeUsername: ChangeUsername
): UserInfoResponse {
return userInfoService.updateUserName(changeUsername.id, changeUsername.name)
}
}
9. 사용 예시 - 정보 조회 api
10. 사용 예시 - 정보 추가 저장
11. 사용 예시 - 정보 수정