1. 이전 포스팅

 

https://growingsaja.tistory.com/984

 

[Kotlin][SpringBoot3] Kopring 서버 기본 실습 12 - api response 데이터 형식을 다수의 data class 활용한 여러 e

1. 이전 포스팅 https://growingsaja.tistory.com/979 [Kotlin][SpringBoot3] Kopring 서버 실습 11 - api의 기능 변경 실습 1. 이전 포스팅 https://growingsaja.tistory.com/976 2. user 관련 api 수정 예정 < 1차 > - login 시도시, 해당

growingsaja.tistory.com

 

 

 

 

 

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. 사용 예시 - 정보 수정

 

 

 

 

 

+ Recent posts