Kotlin + SpringBoot로 최소 WebAPI 구축

15755 단어 spring-bootKotlin

개요


  • Kotlin + SpringBoot를 다루어 보았으므로 환경 구축 메모입니다.
  • Spring Data JPA로 테이블 액세스 해, JSON 형식으로 브라우저에 반환하는 곳까지를 쓰고 있습니다.

  • Spring 프로젝트 만들기



  • Spring Initializr 을 사용합니다.
  • 설정은 아래와 같이 했습니다.



  • IntelliJ IDEA 다운로드



  • IntelliJ IDEA를 다운로드합니다.
  • Community판(무료)으로 괜찮습니다.

  • 만든 프로젝트 가져오기


  • IntelliJ IDEA에서 [File] -> [Open...]을 선택하여 만든 프로젝트를 가져옵니다.



  • JPA 코멘트 아웃



    build.gradle.kts
    dependencies {
    //  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        compileOnly("org.projectlombok:lombok")
        annotationProcessor("org.projectlombok:lombok")
        testImplementation("org.springframework.boot:spring-boot-starter-test")
    }
    

    컨트롤러 작성


  • Controller 클래스를 작성합니다.
  • 미리 controller 패키지를 작성하십시오.

  • DemoController.kt
    package com.example.demo.controller
    
    import org.springframework.http.MediaType
    import org.springframework.http.ResponseEntity
    import org.springframework.web.bind.annotation.GetMapping
    import org.springframework.web.bind.annotation.RequestMapping
    import org.springframework.web.bind.annotation.RestController
    
    @RestController
    @RequestMapping("/demo")
    class DemoController {
    
        @GetMapping("/getAll")
        fun getAll(): ResponseEntity<String> {
            return ResponseEntity.ok("Demo")
        }
    
    }
    

    프로젝트 시작


  • [View] -> [Tool Windows] -> [Gradle] -> [Tasks] -> [application] -> [bootRun]을 선택하여 프로젝트를 실행합니다.


  • 아래와 같은 로그가 나오면 OK입니다.
  • 18:32:18: Executing task 'bootRun'...
    
    > Task :compileKotlin
    > Task :compileJava NO-SOURCE
    > Task :processResources UP-TO-DATE
    > Task :classes UP-TO-DATE
    > Task :bootRunMainClassName
    
    > Task :bootRun
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.4.3)
    
    2021-03-13 18:32:21.905  INFO 8184 --- [           main] com.example.demo.DemoApplicationKt       : Starting DemoApplicationKt using Java 1.8.0_241 on DESKTOP-I88K5MF with PID 8184 
    2021-03-13 18:32:21.905  INFO 8184 --- [           main] com.example.demo.DemoApplicationKt       : No active profile set, falling back to default profiles: default
    2021-03-13 18:32:23.034  INFO 8184 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    2021-03-13 18:32:23.050  INFO 8184 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2021-03-13 18:32:23.050  INFO 8184 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.43]
    2021-03-13 18:32:23.128  INFO 8184 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2021-03-13 18:32:23.128  INFO 8184 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1155 ms
    2021-03-13 18:32:23.425  INFO 8184 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
    2021-03-13 18:32:23.662  INFO 8184 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
    2021-03-13 18:32:23.677  INFO 8184 --- [           main] com.example.demo.DemoApplicationKt       : Started DemoApplicationKt in 2.308 seconds (JVM running for 2.822)
    2021-03-13 18:32:26.108  INFO 8184 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
    2021-03-13 18:32:26.108  INFO 8184 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
    2021-03-13 18:32:26.116  INFO 8184 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
    
    
  • 브라우저에서 http://localhost:8080/demo/getAll 표시 → Demo가 표시됩니다.

  • JPA로 데이터 액세스를 위해 Mysql 준비


  • 테이블을 만들어 둡니다.
  • create database demo;
    use demo;
    create table demo (
        id int auto_increment,
        name varchar(256),
        PRIMARY KEY (id)
    );
    insert into demo (name) values ("test");
    

    application.properties에 설정 추가



    application.properties
    spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.jpa.database=MYSQL
    spring.jpa.hibernate.ddl-auto=update
    

    참고:
    Java에서 DB (MySQL) 연결을 시도하면 오류가 발생하는 솔루션
    SpringBoot + Spring JPA로 데이터베이스에 연결

    JPA를 주석 처리하고 드라이버 추가



    build.gradle.kts
    
    dependencies {
    +   implementation("org.springframework.boot:spring-boot-starter-data-jpa")
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    +   implementation("mysql:mysql-connector-java:8.0.20")
        compileOnly("org.projectlombok:lombok")
        annotationProcessor("org.projectlombok:lombok")
        testImplementation("org.springframework.boot:spring-boot-starter-test")
    }
    

    엔티티 만들기


  • 미리 entity 패키지를 작성하십시오.
  • Demo.kt를 작성합니다.

  • Demo.kt
    package com.example.demo.entity
    
    import javax.persistence.Entity
    import javax.persistence.GeneratedValue
    import javax.persistence.Id
    
    @Entity
    class Demo (
            var name: String? = null,
            @Id
            @GeneratedValue
            var id: Long? = null)
    

    리포지토리 생성


  • 미리 repository 패키지를 작성하십시오.
  • DemoRepository.kt를 만듭니다.

  • DemoRepository.kt
    package com.example.demo.repository
    
    import com.example.demo.entity.Demo
    import org.springframework.data.repository.CrudRepository
    
    interface DemoRepository : CrudRepository<Demo, Long> {
        fun findAllByOrderById(): Iterable<Demo>
    }
    

    컨트롤러 수정



    DemoController.kt
    
    package com.example.demo.controller
    
    import com.example.demo.entity.Demo
    import com.example.demo.repository.DemoRepository
    import org.springframework.beans.factory.annotation.Autowired
    import org.springframework.http.MediaType
    import org.springframework.http.ResponseEntity
    import org.springframework.web.bind.annotation.GetMapping
    import org.springframework.web.bind.annotation.RequestMapping
    import org.springframework.web.bind.annotation.RestController
    
    @RestController
    @RequestMapping("/demo")
    class DemoController @Autowired constructor(  //修正
            val demoRepository: DemoRepository)   //修正
    {                                             //修正   
    
        @GetMapping("/getAll")
        fun getAll(): ResponseEntity<Iterable<Demo>> {             //修正
            val demos = demoRepository.findAllByOrderById()        //修正  
            return ResponseEntity.ok(demos)                        //修正 
        }
    
    }
    

    브라우저에서 표시


  • 브라우저에서 http://localhost:8080/demo/getAll을 표시합니다
  • 아래와 같이 DB에 등록된 데이터가 반환되었는지 확인합니다.



  • 요약


  • kotlin + Spring Boot에서 JSON을 Get하는 곳까지했습니다. 뭔가 도움이되면 다행입니다.

  • 참고:
    Getting started with Spring Data JPA
    Kotlin with Spring Boot 2.0에서 간단한 Rest API 구현

    좋은 웹페이지 즐겨찾기