728x90
반응형
SMALL

**Grape?**이라는 타입은 Grape 객체를 가리키거나 **null**을 가질 수 있다는 것을 나타낸다. 이러한 nullable 타입의 변수에 접근할 때 Kotlin은 기본적으로 안전을 보장한다.

  • ?. (Safe Call) 연산자는 이 변수가 **null**이 아니라면 해당 속성이나 메소드를 호출하고, **null**이라면 그대로 **null**을 반환한다.
  • !!. (Non-null Assertion) 연산자는 이 변수가 **null**이 아니라고 확신할 때 사용한다. 만약 **null**이라면 Kotlin에서는 **NullPointerException**을 발생시킨다.

그러므로 위 에러 메시지는 Grape? 타입에 대해 접근하려는 시도가 있었으나 안전한 방법(?. 또는 !!.)을 사용하지 않았다는 것을 알려준다.

예를 들어 grape?.name_korean 이라고 쓰면, grape 객체가 **null**이 아닌 경우 **name_korean**에 접근하고, **null**인 경우 **null**을 반환한다. 반면에 **grape!!.name_korean**이라고 쓰면, grape 객체가 **null**이라면 **NullPointerException**이 발생한다.

전에 완성한 코드

package grape.dto

import grape.entity.Grape
import importer.dto.ImporterDto
import org.springframework.data.jpa.domain.AbstractPersistable_.id
import region.dto.RegionDto
import wine.dto.WineDto
import winery.dto.WineryDto

data class GrapeDto(
    val id: Long,
    val name_korean: String,
    val name_english: String,
    val acidity: String,
    val body: String,
    val sweetness: String,
    val tannin: String,
    val region: RegionDto? = null,
) {
    companion object {
        fun fromEntity(grape: Grape?): GrapeDto {
            return GrapeDto(
                id = grape.id,
                name_korean = grape.name_korean,
                name_english = grape.name_english,
                acidity = grape.acidity,
                body = grape.body,
                sweetness = grape.sweetness,
                tannin = grape.tannin,
                region = grape.region?.let { RegionDto.fromEntity(it) },
            )
        }
    }
}

 

수정한 코드

package grape.dto

import grape.entity.Grape
import importer.dto.ImporterDto
import org.springframework.data.jpa.domain.AbstractPersistable_.id
import region.dto.RegionDto
import wine.dto.WineDto
import winery.dto.WineryDto

data class GrapeDto(
    val id: Long,
    val name_korean: String,
    val name_english: String,
    val acidity: String,
    val body: String,
    val sweetness: String,
    val tannin: String,
    val region: RegionDto? = null,
) {
    companion object {
        fun fromEntity(grape: Grape?): GrapeDto {
            return GrapeDto(
                id = grape?.id ?: 0L,
                name_korean = grape?.name_korean ?: "",
                name_english = grape?.name_english ?: "",
                acidity = grape?.acidity.toString() ?: "",
                body = grape?.body.toString() ?: "",
                sweetness = grape?.sweetness.toString() ?: "",
                tannin = grape?.tannin.toString() ?: "",
                region = grape?.region?.let { RegionDto.fromEntity(it) },
            )
        }
    }
}

 

올려야하는데.. 깜빡하고.. 이제 올리 옵니다 ㅠㅠ

728x90
반응형
LIST

'개발 > kotlin' 카테고리의 다른 글

Kotlin - Dto에서 fromEntity 설정 (오답노트)  (0) 2023.06.23
728x90
반응형
SMALL

내가 사용한 코드

package dto

import entity.Wine

data class WineDto(
    val id: Long,
    val type: String,
    val name_korean: String,
    val name_english: String,
    val alcohol: Double,
    val price: Double,
    val style: String,
) {
    companion object
}

fun fromEntity(wine: Wine): WineDto {
    return WineDto(
        id = wine.id,
        type = wine.type,
        name_korean = wine.name_korean,
        name_english = wine.name_english,
        alcohol = wine.alcohol,
        price = wine.price,
        style = wine.style,
    )
}

fromEntity 함수는 WineDto 클래스 바깥에 정의되어 있어서 **WineDto**의 인스턴스 메서드나 동반 객체의 메서드로 사용할 수 없어서 검색을 해보니

companion object안에 넣어줘야하는 걸 알게 되었다.

사실 처음 전체 조회를 만들때, fromEntity를 새로 만들어야된다는 생각에 따로 만들었는데, 이 방법이 틀렸다는 걸 알게 되었다.

클래스 내부에 캡슐화되어 관리하기가 더 편리해진다!!

고친 코드

data class WineDto(
    val id: Long,
    val type: String,
    val name_korean: String,
    val name_english: String,
    val alcohol: Double,
    val price: Double,
    val style: String,
) {
    companion object {
        fun fromEntity(wine: Wine): WineDto {
            return WineDto(
                id = wine.id,
                type = wine.type,
                name_korean = wine.name_korean,
                name_english = wine.name_english,
                alcohol = wine.alcohol,
                price = wine.price,
                style = wine.style,
            )
        }
    }
}
728x90
반응형
LIST

'개발 > kotlin' 카테고리의 다른 글

WineDto에 소속될 grapeDto fromEntity설정  (0) 2023.06.25

+ Recent posts