ZIO로 파일 읽고 쓰기

CHEESE·2023년 9월 19일
0

OSSCA 2023

목록 보기
7/7
post-thumbnail

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: 현재 작업 디렉토리
    • os.pwd / "resources" / "subdirectory" / "..." 의 형태로 응용할 수 있다.
  • os.read: Path(파일 경로)를 인자로 받아 파일을 읽는다.

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 ()
  • os.write: Path와 파일 내용을 인자로 받아 파일을 생성한다.
    • 동일한 파일이 이미 존재하는 경우 FileAlreadyExistsException이 발생한다.
    • 파일이 존재할 때 내용을 덮어쓰고 싶은 경우 os.writeos.write.over로 변경하면 된다.

마무리

기본적인 파일 읽고 쓰기를 살펴봤다.
이를 좀 더 실무적인 코드로 사용하려면 몇 가지 고민이 추가된다.

파일을 읽을 때, 파일이 존재하지 않으면 특정 기본 값을 리턴하고 싶을수도 있고,
일반 텍스트가 아닌 json 파일을 읽어 case class로 파싱하고 싶을수도 있고,
반대로 case class를 json 형태로 변환하여 새로운 파일로 저장하고 싶을수도 있다.

다음 글은 이렇게 파일 입출력을 응용하는 코드를 다뤄보겠다.

0개의 댓글