Kotlin @RestController로 HTML 반환하기

길위에 히피·2024년 7월 22일

Spring

목록 보기
4/6

Spring Boot와 Kotlin을 사용하여 웹 애플리케이션을 개발할 때, @RestController는 주로 JSON이나 XML 같은 데이터를 반환하는 데 사용됩니다. 하지만 때로는 HTML을 직접 반환해야 할 경우가 있습니다. 이번 포스트에서는 Kotlin으로 작성된 @RestController에서 HTML을 반환하는 두 가지 방법을 살펴보겠습니다.

1. 문자열로 HTML 직접 반환하기

가장 간단한 방법은 HTML을 문자열로 직접 작성하여 반환하는 것입니다. 다음은 그 예시입니다:

kotlinCopyimport org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class HtmlController {
    @GetMapping("/html", produces = ["text/html"])
    fun getHtml(): String {
        return """
            <!DOCTYPE html>
            <html>
            <head>
                <title>Hello from Kotlin RestController</title>
            </head>
            <body>
                <h1>Hello, World!</h1>
                <p>This is a simple HTML page returned from a Kotlin @RestController.</p>
            </body>
            </html>
        """.trimIndent()
    }
}

이 방법은 간단한 HTML을 반환할 때 유용하지만, 복잡한 HTML 구조를 다룰 때는 관리하기 어려울 수 있습니다.

2. 정적 HTML 파일 반환하기

더 복잡한 HTML이나 이미 작성된 HTML 파일을 반환하고 싶다면, ResourceLoader를 사용하여 파일을 읽고 그 내용을 반환할 수 있습니다. 다음은 index.html 파일을 반환하는 예시입니다:

kotlinCopyimport org.springframework.core.io.ClassPathResource
import org.springframework.util.FileCopyUtils
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
import java.nio.charset.StandardCharsets

@RestController
class HtmlController {

    @GetMapping("/", produces = ["text/html"])
    fun getIndexHtml(): String {
        val resource = ClassPathResource("static/index.html")
        val bytes = FileCopyUtils.copyToByteArray(resource.inputStream)
        return String(bytes, StandardCharsets.UTF_8)
    }
}

이 방법은 다음과 같이 작동합니다:

ClassPathResource를 사용하여 src/main/resources/static/index.html 파일을 찾습니다.
FileCopyUtils.copyToByteArray()를 사용하여 파일의 내용을 byte 배열로 읽습니다.
byte 배열을 UTF-8 인코딩을 사용하여 문자열로 변환합니다.
변환된 문자열(HTML 내용)을 반환합니다.

주의사항

정적 파일 반환 방식을 사용할 때는 index.html 파일이 src/main/resources/static/ 디렉토리에 있어야 합니다. 파일 위치가 다르다면 ClassPathResource의 경로를 적절히 조정해야 합니다.
이 방법은 매 요청마다 파일을 읽기 때문에 성능상 이슈가 있을 수 있습니다. 실제 프로덕션 환경에서는 파일 내용을 캐시하거나, 정적 리소스 제공을 위한 Spring의 기본 설정을 사용하는 것이 좋습니다.
Spring Boot를 사용중이라면, 정적 리소스(HTML 파일 포함)를 src/main/resources/static/ 디렉토리에 넣기만 해도 자동으로 제공됩니다. 이 경우 별도의 컨트롤러 없이도 http://localhost:8080/index.html로 접근할 수 있습니다.

결론

Kotlin과 Spring Boot를 사용하여 @RestController에서 HTML을 반환하는 방법을 알아보았습니다. 상황에 따라 직접 HTML 문자열을 반환하거나 정적 파일을 읽어 반환하는 방법을 선택할 수 있습니다. 각 방법의 장단점을 고려하여 프로젝트에 가장 적합한 방식을 선택하시기 바랍니다.

profile
마음맘은 히피인 일꾼러

0개의 댓글