[IntelliJ] Springboot MVC

Darcy Daeseok YU ·2022년 12월 19일
0

Kotlin server를 만들어 본다.

intelliJ로 만든다.

먼저 spring boot initializr로 프로젝트를 생성한다.

경로 : spring boot 사이트에서 projects -> spring boot -> initializr

3.0.0은 사용하지 말자. 에러난다.

다운로드 받고 압축을 풀고 intellij로 프로젝트를 오픈한다.
(최초 구동시 초기설정에 다소 시간이 걸림 기다리자.)


우측 상단에 run 아이콘이 초록색으로 활성화 되면 gradle dependencies 다운로드와 프로젝트가 정상적으로 생성된거다.

테스트 웹 페이지 :html로 간단하게 만들어 보자

경로 : src/main/resources/static/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<h1>축하 첫 스프링 부트 접근</h1>
</body>
</html>

재 실행하고 localhost:8080으로 접속 (기본 포트 : 8080)

프로젝트 스트럭쳐 설정

경로 : file> project structure > project
jdk 버전을 변경할수 있다

MVC 패턴 중 C controller를 만들어본다.

경로 : src/main/kotlin/com/yuds/kotlinjdk11springboot276/controller

(프로젝트 이름에 버전을 표시하려고 만든 이름 :kotlin-jdk11-springboot-2.7.6이지만
패키지명으로 바뀌면서 com.yuds.kotlinjdk11springboot276 로 변환되었다.
보기가 좋지 않다.)

메인 패키지 com.yuds.kotlinjdk11springboot276 아래에 패키지 명 contoller를 추가하고
아래에 HelloController.kt(이프로젝트는 코틀린 언어로 만들었다.) 를 만든다.

package com.yuds.kotlinjdk11springboot276.controller

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


@RestController
@RequestMapping("/")
class HelloController {

    @GetMapping("/greeting") // or @GetMapping("greeting")
    fun helloWorld(): String{
        return "Hello, this is a Rest endpoint"
    }

    @GetMapping("/greeting/darcy") // or @GetMapping("greeting/darcy")
    fun helloDarcy():String= "Hello Darcy, this is a Rest endpoint"

}

@RestController임을 밝히고 @RequestMapping를 사용하여 (ex. "/" "/user")등의 url을 셋팅할것임을 밝힌다.

설정 파일

-. gradle/wrapper/gradle-wrapper.properties : gradle 설정 정보를 가짐
-. /settings.gradle.kts (kts : kotlin script)
-. /build.gradle.
-. src/main/resources/application.properties (ex. server.port=9000)

스프링 부트 어노테이션

@SpringBootApplication 
메인 어플리케이션 클래스라는것을 명시함.(starting point)

@RestController
RestController임을 명시 
@Controller와 @ResponseBody가 결합
컨트롤러 하위 메소드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON등 전송 가능
view를 안거치고 HTTP ResponseBody에 직접 return값을 담아 보냄 

@RequestMapping
(ex. "/" "/user")등의 url을 셋팅할것임을 명시

@Repository
빌드 타임에 빈으로 생성될 것을 명시 
데이터를 호출 / 저장하는 클래스 임을 명시

구현 순서 BOTTOM - TOP

추가 DATA SOURCE LAYER

Data Layer DTO를 만들어 보자 (Data Transfer Ojbect)

경로 : my-package-name/bank/model/BankDTO.kt

getter/setter

Java style => Kotlin style

Java style below

class BankDTO {

    private val accountNum : String
    private val trust: Double
    private var transactionFee: Int



    constructor(accountNum : String , trust:Double, transactionFee: Int){
        this.accountNum = accountNum
        this.trust = trust
        this.transactionFee = transactionFee
    }

    fun getTransactionFee() : Int = transactionFee

    fun setTransactionFee(transactionFee: Int){
        this.transactionFee = transactionFee
    }

}

Kotlin style below

    private val accountNum : String
    private val trust: Double
    private var transactionFee: Int
        get() = field   //redundant  자동으로 생성됨 => 지워도 됨
        set(value) {field = value} //redundant 자동으로 생성됨 => 지워도 됨

생성자 변경

Java style below

class BankDTO {

    private val accountNum : String
    private val trust: Double
    private var transactionFee: Int


  // Secondary constructor
    constructor(accountNum : String , trust:Double, transactionFee: Int){
        this.accountNum = accountNum
        this.trust = trust
        this.transactionFee = transactionFee
    }


...

Kotlin style below

//primary constructor 

class BankDTO(
    private val accountNum: String,
    private val trust: Double,
    private var transactionFee: Int,
) {
//filed variables

}

Kotlin style with data class below
toString()/hashcode()/equals()등을 자동으로 가짐

data class BankDTO(
     val trust: Double,
     val accountNum: String,
     var transactionFee: Int,
)

Data Source layer

경로 : my-package-name/bank/datasouce/BankDataSource.kt(Interface)

interface로 정의

package com.yuds.kotlinjdk11springboot276.bank.datasource

import com.yuds.kotlinjdk11springboot276.bank.modelAsDtoAsDataLayer.BankDTO

interface BankDataSource {

    fun getBanks() :Collection<BankDTO>
}

mock data source class를 만든다

경로 : my-package-name/bank/datasouce/mock/ MockBankDataSource.kt

package com.yuds.kotlinjdk11springboot276.bank.datasource.mock

import com.yuds.kotlinjdk11springboot276.bank.datasource.BankDataSource
import com.yuds.kotlinjdk11springboot276.bank.modelAsDtoAsDataLayer.BankDTO
import org.springframework.stereotype.Repository

@Repository
class MockBankDataSource : BankDataSource{

    override fun getBanks(): Collection<BankDTO> {
        return listOf(BankDTO("accNum1",0.1,3))
    }
}

테스트를 해보자

class명에 커서를 놓고 alt+enter > create Test를 실행해서 테스트 파일을 생성한다.

test/폴더 아래에 동일한 패키지 구조에 테스트파일이 생성된다.

package com.yuds.kotlinjdk11springboot276.bank.datasource.mock


import org.assertj.core.api.Assertions.* // assertj 사용할것
import org.junit.jupiter.api.Test

internal class MockBankDataSourceTest{


    private val mockDataSource = MockBankDataSource()
     
     @Test
     fun `sould provide a collection of banks`() {
         // given
     
     
         // when
        val banks = mockDataSource.getBanks()
     
         // then

         assertThat(banks).isNotEmpty
     }
}
profile
React, React-Native https://darcyu83.netlify.app/

0개의 댓글