os-lib
를 활용해서 json 파일 입출력을 해보자.
build.sbt
에 필요한 의존성을 추가한다.
"dev.zio" %% "zio" % "2.0.13",
"com.lihaoyi" %% "os-lib" % "0.9.1"
val path = os.pwd / "files"
def readFile(fileName: String): ZIO[Any, RuntimeException, String] = for {
contents <- ZIO
.attempt(os.read(path / fileName))
.catchAll(cause => ZIO.fail(new RuntimeException(s"File Read Fail: ${cause}")))
} yield contents
os.pwd / "resources" / "subdirectory" / "..."
의 형태로 응용할 수 있다.readFile("newFile.txt")
를 실행하면 /files/newFile.txt를 읽어 내용을 String으로 반환하고, 파일이 없는 경우 NoSuchFileException
이 발생한다.
val path = os.pwd / "files"
def writeJson(fileName: String, contents: String) = for {
_ <- ZIO
.attempt(os.write(path / fileName, contents))
.catchAll(cause => ZIO.fail(new RuntimeException(s"Write Fail: ${cause}")))
} yield ()
FileAlreadyExistsException
이 발생한다.os.write
를 os.write.over
로 변경하면 된다.기본적인 파일 읽고 쓰기를 살펴봤다.
이를 좀 더 실무적인 코드로 사용하려면 몇 가지 고민이 추가된다.
파일을 읽을 때, 파일이 존재하지 않으면 특정 기본 값을 리턴하고 싶을수도 있고,
일반 텍스트가 아닌 json 파일을 읽어 case class로 파싱하고 싶을수도 있고,
반대로 case class를 json 형태로 변환하여 새로운 파일로 저장하고 싶을수도 있다.
다음 글은 이렇게 파일 입출력을 응용하는 코드를 다뤄보겠다.